diff --git a/lnbits/app.py b/lnbits/app.py index c649c77c1..30df3ad9e 100644 --- a/lnbits/app.py +++ b/lnbits/app.py @@ -6,7 +6,7 @@ import shutil import sys from contextlib import asynccontextmanager from pathlib import Path -from typing import Callable, List, Optional +from typing import Callable, Optional from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware @@ -17,12 +17,13 @@ from slowapi.util import get_remote_address from starlette.middleware.sessions import SessionMiddleware from lnbits.core.crud import ( - add_installed_extension, - get_dbversions, + get_db_version, get_installed_extensions, update_installed_extension_state, ) -from lnbits.core.extensions.extension_manager import deactivate_extension +from lnbits.core.extensions.extension_manager import ( + deactivate_extension, +) from lnbits.core.extensions.helpers import version_parse from lnbits.core.helpers import migrate_extension_database from lnbits.core.tasks import ( # watchdog_task @@ -47,7 +48,7 @@ from lnbits.wallets import get_funding_source, set_funding_source from .commands import migrate_databases from .core import init_core_routers from .core.db import core_app_extra -from .core.extensions.models import Extension, InstallableExtension +from .core.extensions.models import Extension, ExtensionMeta, InstallableExtension from .core.services import check_admin_settings, check_webpush_settings from .middleware import ( CustomGZipMiddleware, @@ -252,7 +253,7 @@ async def check_installed_extensions(app: FastAPI): async def build_all_installed_extensions_list( include_deactivated: Optional[bool] = True, -) -> List[InstallableExtension]: +) -> list[InstallableExtension]: """ Returns a list of all the installed extensions plus the extensions that MUST be installed by default (see LNBITS_EXTENSIONS_DEFAULT_INSTALL). @@ -272,8 +273,13 @@ async def build_all_installed_extensions_list( release = next((e for e in ext_releases if e.is_version_compatible), None) if release: + ext_meta = ExtensionMeta(installed_release=release) ext_info = InstallableExtension( - id=ext_id, name=ext_id, installed_release=release, icon=release.icon + id=ext_id, + name=ext_id, + version=release.version, + icon=release.icon, + meta=ext_meta, ) installed_extensions.append(ext_info) @@ -304,14 +310,13 @@ async def check_installed_extension_files(ext: InstallableExtension) -> bool: async def restore_installed_extension(app: FastAPI, ext: InstallableExtension): - await add_installed_extension(ext) await update_installed_extension_state(ext_id=ext.id, active=True) extension = Extension.from_installable_ext(ext) register_ext_routes(app, extension) - current_version = (await get_dbversions()).get(ext.id, 0) - await migrate_extension_database(extension, current_version) + current_version = await get_db_version(ext.id) + await migrate_extension_database(ext, current_version) # mount routes for the new version core_app_extra.register_new_ext_routes(extension) diff --git a/lnbits/commands.py b/lnbits/commands.py index a7ff11018..a286fe37f 100644 --- a/lnbits/commands.py +++ b/lnbits/commands.py @@ -3,7 +3,7 @@ import importlib import time from functools import wraps from pathlib import Path -from typing import List, Optional, Tuple +from typing import Optional import click import httpx @@ -17,12 +17,13 @@ from lnbits.core.crud import ( delete_unused_wallets, delete_wallet_by_id, delete_wallet_payment, - get_dbversions, + get_db_versions, get_installed_extension, get_installed_extensions, + get_payment, get_payments, remove_deleted_wallets, - update_payment_status, + update_payment, ) from lnbits.core.extensions.models import ( CreateExtension, @@ -122,7 +123,7 @@ def database_migrate(): async def db_versions(): """Show current database versions""" async with core_db.connect() as conn: - click.echo(await get_dbversions(conn)) + click.echo(await get_db_versions(conn)) @db.command("cleanup-wallets") @@ -172,9 +173,10 @@ async def database_delete_wallet_payment(wallet: str, checking_id: str): async def database_revert_payment(checking_id: str): """Mark payment as pending""" async with core_db.connect() as conn: - await update_payment_status( - status=PaymentState.PENDING, checking_id=checking_id, conn=conn - ) + payment = await get_payment(checking_id=checking_id, conn=conn) + payment.status = PaymentState.PENDING + await update_payment(payment, conn=conn) + click.echo(f"Payment '{checking_id}' marked as pending.") @db.command("cleanup-accounts") @@ -231,7 +233,7 @@ async def check_invalid_payments( click.echo("Funding source: " + str(funding_source)) # payments that are settled in the DB, but not at the Funding source level - invalid_payments: List[Payment] = [] + invalid_payments: list[Payment] = [] invalid_wallets = {} for db_payment in settled_db_payments: if verbose: @@ -277,8 +279,10 @@ async def extensions_list(): from lnbits.app import build_all_installed_extensions_list for ext in await build_all_installed_extensions_list(): - assert ext.installed_release, f"Extension {ext.id} has no installed_release" - click.echo(f" - {ext.id} ({ext.installed_release.version})") + assert ( + ext.meta and ext.meta.installed_release + ), f"Extension {ext.id} has no installed_release" + click.echo(f" - {ext.id} ({ext.meta.installed_release.version})") @extensions.command("update") @@ -461,7 +465,7 @@ async def install_extension( source_repo: Optional[str] = None, url: Optional[str] = None, admin_user: Optional[str] = None, -) -> Tuple[bool, str]: +) -> tuple[bool, str]: try: release = await _select_release(extension, repo_index, source_repo) if not release: @@ -490,7 +494,7 @@ async def update_extension( source_repo: Optional[str] = None, url: Optional[str] = None, admin_user: Optional[str] = None, -) -> Tuple[bool, str]: +) -> tuple[bool, str]: try: click.echo(f"Updating '{extension}' extension.") installed_ext = await get_installed_extension(extension) @@ -503,7 +507,7 @@ async def update_extension( click.echo(f"Current '{extension}' version: {installed_ext.installed_version}.") assert ( - installed_ext.installed_release + installed_ext.meta and installed_ext.meta.installed_release ), "Cannot find previously installed release. Please uninstall first." release = await _select_release(extension, repo_index, source_repo) @@ -511,7 +515,7 @@ async def update_extension( return False, "No release selected." if ( release.version == installed_ext.installed_version - and release.source_repo == installed_ext.installed_release.source_repo + and release.source_repo == installed_ext.meta.installed_release.source_repo ): click.echo(f"Extension '{extension}' already up to date.") return False, "Already up to date" diff --git a/lnbits/core/crud.py b/lnbits/core/crud.py deleted file mode 100644 index d01e69e00..000000000 --- a/lnbits/core/crud.py +++ /dev/null @@ -1,1358 +0,0 @@ -import json -from time import time -from typing import Literal, Optional -from uuid import uuid4 - -import shortuuid -from passlib.context import CryptContext - -from lnbits.core.db import db -from lnbits.core.extensions.models import ( - InstallableExtension, - PayToEnableInfo, - UserExtension, - UserExtensionInfo, -) -from lnbits.core.models import PaymentState -from lnbits.db import DB_TYPE, SQLITE, Connection, Database, Filters, Page -from lnbits.settings import ( - AdminSettings, - EditableSettings, - SuperSettings, - settings, -) - -from .models import ( - Account, - AccountFilters, - CreatePayment, - Payment, - PaymentFilters, - PaymentHistoryPoint, - TinyURL, - UpdateUserPassword, - UpdateUserPubkey, - User, - UserConfig, - Wallet, - WebPushSubscription, -) - - -async def create_account( - user_id: Optional[str] = None, - username: Optional[str] = None, - pubkey: Optional[str] = None, - email: Optional[str] = None, - password: Optional[str] = None, - user_config: Optional[UserConfig] = None, - conn: Optional[Connection] = None, -) -> User: - user_id = user_id or uuid4().hex - extra = json.dumps(dict(user_config)) if user_config else "{}" - now = int(time()) - now_ph = db.timestamp_placeholder("now") - await (conn or db).execute( - f""" - INSERT INTO accounts - (id, username, pass, email, pubkey, extra, created_at, updated_at) - VALUES - (:user, :username, :password, :email, :pubkey, :extra, {now_ph}, {now_ph}) - """, - { - "user": user_id, - "username": username, - "password": password, - "email": email, - "pubkey": pubkey, - "extra": extra, - "now": now, - }, - ) - - new_account = await get_account(user_id=user_id, conn=conn) - assert new_account, "Newly created account couldn't be retrieved" - - return new_account - - -async def update_account( - user_id: str, - username: Optional[str] = None, - email: Optional[str] = None, - user_config: Optional[UserConfig] = None, -) -> Optional[User]: - user = await get_account(user_id) - assert user, "User not found" - - if email: - assert not user.email or email == user.email, "Cannot change email." - account = await get_account_by_email(email) - assert not account or account.id == user_id, "Email already in use." - - if username: - assert not user.username or username == user.username, "Cannot change username." - account = await get_account_by_username(username) - assert not account or account.id == user_id, "Username already exists." - - username = user.username or username - email = user.email or email - extra = user_config or user.config - - now = int(time()) - now_ph = db.timestamp_placeholder("now") - await db.execute( - f""" - UPDATE accounts SET (username, email, extra, updated_at) = - (:username, :email, :extra, {now_ph}) - WHERE id = :user - """, - { - "username": username, - "email": email, - "extra": json.dumps(dict(extra)) if extra else "{}", - "now": now, - "user": user_id, - }, - ) - - user = await get_user(user_id) - assert user, "Updated account couldn't be retrieved" - return user - - -async def delete_account(user_id: str, conn: Optional[Connection] = None) -> None: - await (conn or db).execute( - "DELETE from accounts WHERE id = :user", - {"user": user_id}, - ) - - -async def get_accounts( - filters: Optional[Filters[AccountFilters]] = None, - conn: Optional[Connection] = None, -) -> Page[Account]: - return await (conn or db).fetch_page( - """ - SELECT - accounts.id, - accounts.username, - accounts.email, - SUM(COALESCE(( - SELECT balance FROM balances WHERE wallet = wallets.id - ), 0)) as balance_msat, - SUM(( - SELECT COUNT(*) FROM apipayments WHERE wallet = wallets.id - )) as transaction_count, - ( - SELECT COUNT(*) FROM wallets WHERE wallets.user = accounts.id - ) as wallet_count, - MAX(( - SELECT time FROM apipayments - WHERE wallet = wallets.id ORDER BY time DESC LIMIT 1 - )) as last_payment - FROM accounts LEFT JOIN wallets ON accounts.id = wallets.user - """, - [], - {}, - filters=filters, - model=Account, - group_by=["accounts.id"], - ) - - -async def get_account( - user_id: str, conn: Optional[Connection] = None -) -> Optional[User]: - row = await (conn or db).fetchone( - """ - SELECT id, email, username, pubkey, created_at, updated_at, extra - FROM accounts WHERE id = :id - """, - {"id": user_id}, - ) - - user = User(**row) if row else None - if user and row["extra"]: - user.config = UserConfig(**json.loads(row["extra"])) - return user - - -async def delete_accounts_no_wallets( - time_delta: int, - conn: Optional[Connection] = None, -) -> None: - delta = int(time()) - time_delta - await (conn or db).execute( - f""" - DELETE FROM accounts - WHERE NOT EXISTS ( - SELECT wallets.id FROM wallets WHERE wallets.user = accounts.id - ) AND ( - (updated_at is null AND created_at < :delta) - OR updated_at < {db.timestamp_placeholder("delta")} - ) - """, - {"delta": delta}, - ) - - -async def get_user_password(user_id: str) -> Optional[str]: - row = await db.fetchone( - "SELECT pass FROM accounts WHERE id = :user", - {"user": user_id}, - ) - return row.get("pass") - - -# TODO: refactor not a crud function -async def verify_user_password(user_id: str, password: str) -> bool: - existing_password = await get_user_password(user_id) - if not existing_password: - return False - - pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") - return pwd_context.verify(password, existing_password) - - -async def update_user_password(data: UpdateUserPassword, last_login_time: int) -> User: - - assert 0 <= time() - last_login_time <= settings.auth_credetials_update_threshold, ( - "You can only update your credentials in the first" - f" {settings.auth_credetials_update_threshold} seconds." - " Please login again or ask a new reset key!" - ) - assert data.password == data.password_repeat, "Passwords do not match." - - pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") - - await db.execute( - f""" - UPDATE accounts - SET pass = :pass, updated_at = {db.timestamp_placeholder("now")} - WHERE id = :user - """, - { - "pass": pwd_context.hash(data.password), - "now": int(time()), - "user": data.user_id, - }, - ) - - user = await get_user(data.user_id) - assert user, "Updated account couldn't be retrieved." - return user - - -async def update_user_pubkey(data: UpdateUserPubkey, last_login_time: int) -> User: - - assert 0 <= time() - last_login_time <= settings.auth_credetials_update_threshold, ( - "You can only update your credentials in the first" - f" {settings.auth_credetials_update_threshold} seconds after login." - " Please login again!" - ) - - user = await get_account_by_pubkey(data.pubkey) - if user: - assert user.id == data.user_id, "Public key already in use." - - await db.execute( - f""" - UPDATE accounts - SET pubkey = :pubkey, updated_at = {db.timestamp_placeholder("now")} - WHERE id = :user - """, - { - "pubkey": data.pubkey, - "now": int(time()), - "user": data.user_id, - }, - ) - - user = await get_user(data.user_id) - assert user, "Updated account couldn't be retrieved" - return user - - -async def get_account_by_username( - username: str, conn: Optional[Connection] = None -) -> Optional[User]: - row = await (conn or db).fetchone( - """ - SELECT id, username, pubkey, email, created_at, updated_at - FROM accounts WHERE username = :username - """, - {"username": username}, - ) - - return User(**row) if row else None - - -async def get_account_by_pubkey( - pubkey: str, conn: Optional[Connection] = None -) -> Optional[User]: - row = await (conn or db).fetchone( - """ - SELECT id, username, pubkey, email, created_at, updated_at - FROM accounts WHERE pubkey = :pubkey - """, - {"pubkey": pubkey}, - ) - - return User(**row) if row else None - - -async def get_account_by_email( - email: str, conn: Optional[Connection] = None -) -> Optional[User]: - row = await (conn or db).fetchone( - """ - SELECT id, username, pubkey, email, created_at, updated_at - FROM accounts WHERE email = :email - """, - {"email": email}, - ) - - return User(**row) if row else None - - -async def get_account_by_username_or_email( - username_or_email: str, conn: Optional[Connection] = None -) -> Optional[User]: - user = await get_account_by_username(username_or_email, conn) - if not user: - user = await get_account_by_email(username_or_email, conn) - return user - - -async def get_user(user_id: str, conn: Optional[Connection] = None) -> Optional[User]: - user = await (conn or db).fetchone( - """ - SELECT id, email, username, pubkey, pass, extra, created_at, updated_at - FROM accounts WHERE id = :id - """, - {"id": user_id}, - ) - - if user: - extensions = await get_user_active_extensions_ids(user_id, conn) - wallets = await (conn or db).fetchall( - """ - SELECT *, COALESCE(( - SELECT balance FROM balances WHERE wallet = wallets.id - ), 0) AS balance_msat - FROM wallets - WHERE "user" = :user and wallets.deleted = false - """, - {"user": user_id}, - ) - else: - return None - - return User( - id=user["id"], - email=user["email"], - username=user["username"], - pubkey=user["pubkey"], - extensions=[ - e for e in extensions if User.is_extension_for_user(e[0], user["id"]) - ], - wallets=[Wallet(**w) for w in wallets], - admin=user["id"] == settings.super_user - or user["id"] in settings.lnbits_admin_users, - super_user=user["id"] == settings.super_user, - has_password=True if user["pass"] else False, - config=UserConfig(**json.loads(user["extra"])) if user["extra"] else None, - ) - - -# extensions -# ------- - - -async def add_installed_extension( - ext: InstallableExtension, - conn: Optional[Connection] = None, -) -> None: - meta = { - "installed_release": ( - dict(ext.installed_release) if ext.installed_release else None - ), - "pay_to_enable": (dict(ext.pay_to_enable) if ext.pay_to_enable else None), - "dependencies": ext.dependencies, - "payments": [dict(p) for p in ext.payments] if ext.payments else None, - } - - version = ext.installed_release.version if ext.installed_release else "" - - await (conn or db).execute( - """ - INSERT INTO installed_extensions - (id, version, name, active, short_description, icon, stars, meta) - VALUES - (:ext, :version, :name, :active, :short_description, :icon, :stars, :meta) - ON CONFLICT (id) DO UPDATE SET - (version, name, active, short_description, icon, stars, meta) = - (:version, :name, :active, :short_description, :icon, :stars, :meta) - """, - { - "ext": ext.id, - "version": version, - "name": ext.name, - "active": ext.active, - "short_description": ext.short_description, - "icon": ext.icon, - "stars": ext.stars, - "meta": json.dumps(meta), - }, - ) - - -async def update_installed_extension_state( - *, ext_id: str, active: bool, conn: Optional[Connection] = None -) -> None: - await (conn or db).execute( - """ - UPDATE installed_extensions SET active = :active WHERE id = :ext - """, - {"ext": ext_id, "active": active}, - ) - - -async def update_extension_pay_to_enable( - ext_id: str, payment_info: PayToEnableInfo, conn: Optional[Connection] = None -) -> None: - ext = await get_installed_extension(ext_id, conn) - if not ext: - return - ext.pay_to_enable = payment_info - - await add_installed_extension(ext, conn) - - -async def delete_installed_extension( - *, ext_id: str, conn: Optional[Connection] = None -) -> None: - await (conn or db).execute( - """ - DELETE from installed_extensions WHERE id = :ext - """, - {"ext": ext_id}, - ) - - -async def drop_extension_db(*, ext_id: str, conn: Optional[Connection] = None) -> None: - db_version = await (conn or db).fetchone( - "SELECT * FROM dbversions WHERE db = :id", - {"id": ext_id}, - ) - # Check that 'ext_id' is a valid extension id and not a malicious string - assert db_version, f"Extension '{ext_id}' db version cannot be found" - - is_file_based_db = await Database.clean_ext_db_files(ext_id) - if is_file_based_db: - return - - # String formatting is required, params are not accepted for 'DROP SCHEMA'. - # The `ext_id` value is verified above. - await (conn or db).execute( - f"DROP SCHEMA IF EXISTS {ext_id} CASCADE", - ) - - -async def get_installed_extension( - ext_id: str, conn: Optional[Connection] = None -) -> Optional[InstallableExtension]: - row = await (conn or db).fetchone( - "SELECT * FROM installed_extensions WHERE id = :id", - {"id": ext_id}, - ) - - return InstallableExtension.from_row(row) if row else None - - -async def get_installed_extensions( - active: Optional[bool] = None, - conn: Optional[Connection] = None, -) -> list[InstallableExtension]: - rows = await (conn or db).fetchall( - "SELECT * FROM installed_extensions", - ) - all_extensions = [InstallableExtension.from_row(row) for row in rows] - if active is None: - return all_extensions - - return [e for e in all_extensions if e.active == active] - - -async def get_user_extension( - user_id: str, extension: str, conn: Optional[Connection] = None -) -> Optional[UserExtension]: - row = await (conn or db).fetchone( - """ - SELECT extension, active, extra as _extra FROM extensions - WHERE "user" = :user AND extension = :ext - """, - {"user": user_id, "ext": extension}, - ) - return UserExtension.from_row(row) if row else None - - -async def get_user_extensions( - user_id: str, conn: Optional[Connection] = None -) -> list[UserExtension]: - rows = await (conn or db).fetchall( - """ - SELECT extension, active, extra as _extra FROM extensions - WHERE "user" = :user - """, - {"user": user_id}, - ) - return [UserExtension.from_row(row) for row in rows] - - -async def update_user_extension( - *, user_id: str, extension: str, active: bool, conn: Optional[Connection] = None -) -> None: - await (conn or db).execute( - """ - INSERT INTO extensions ("user", extension, active) VALUES (:user, :ext, :active) - ON CONFLICT ("user", extension) DO UPDATE SET active = :active - """, - {"user": user_id, "ext": extension, "active": active}, - ) - - -async def get_user_active_extensions_ids( - user_id: str, conn: Optional[Connection] = None -) -> list[str]: - rows = await (conn or db).fetchall( - """ - SELECT extension FROM extensions WHERE "user" = :user AND active - """, - {"user": user_id}, - ) - return [e.get("extension", "") for e in rows] - - -async def update_user_extension_extra( - user_id: str, - extension: str, - extra: UserExtensionInfo, - conn: Optional[Connection] = None, -) -> None: - extra_json = json.dumps(dict(extra)) - await (conn or db).execute( - """ - INSERT INTO extensions ("user", extension, extra) VALUES - (:user, :ext, :extra) - ON CONFLICT ("user", extension) DO UPDATE SET extra = :extra - """, - {"user": user_id, "ext": extension, "extra": extra_json}, - ) - - -# wallets -# ------- - - -async def create_wallet( - *, - user_id: str, - wallet_name: Optional[str] = None, - conn: Optional[Connection] = None, -) -> Wallet: - wallet_id = uuid4().hex - now = int(time()) - now_ph = db.timestamp_placeholder("now") - await (conn or db).execute( - f""" - INSERT INTO wallets (id, name, "user", adminkey, inkey, created_at, updated_at) - VALUES (:wallet, :name, :user, :adminkey, :inkey, {now_ph}, {now_ph}) - """, - { - "wallet": wallet_id, - "name": wallet_name or settings.lnbits_default_wallet_name, - "user": user_id, - "adminkey": uuid4().hex, - "inkey": uuid4().hex, - "now": now, - }, - ) - - new_wallet = await get_wallet(wallet_id=wallet_id, conn=conn) - assert new_wallet, "Newly created wallet couldn't be retrieved" - - return new_wallet - - -async def update_wallet( - wallet_id: str, - name: Optional[str] = None, - currency: Optional[str] = None, - conn: Optional[Connection] = None, -) -> Optional[Wallet]: - set_clause = [] - set_clause.append(f"updated_at = {db.timestamp_placeholder('now')}") - values: dict = { - "wallet": wallet_id, - "now": int(time()), - } - if name: - set_clause.append("name = :name") - values["name"] = name - if currency is not None: - set_clause.append("currency = :currency") - values["currency"] = currency - await (conn or db).execute( - f""" - UPDATE wallets SET {', '.join(set_clause)} WHERE id = :wallet - """, - values, - ) - wallet = await get_wallet(wallet_id=wallet_id, conn=conn) - assert wallet, "updated created wallet couldn't be retrieved" - return wallet - - -async def delete_wallet( - *, - user_id: str, - wallet_id: str, - deleted: bool = True, - conn: Optional[Connection] = None, -) -> None: - now = int(time()) - await (conn or db).execute( - f""" - UPDATE wallets - SET deleted = :deleted, updated_at = {db.timestamp_placeholder('now')} - WHERE id = :wallet AND "user" = :user - """, - {"wallet": wallet_id, "user": user_id, "deleted": deleted, "now": now}, - ) - - -async def force_delete_wallet( - wallet_id: str, conn: Optional[Connection] = None -) -> None: - await (conn or db).execute( - "DELETE FROM wallets WHERE id = :wallet", - {"wallet": wallet_id}, - ) - - -async def delete_wallet_by_id( - *, wallet_id: str, conn: Optional[Connection] = None -) -> Optional[int]: - now = int(time()) - result = await (conn or db).execute( - f""" - UPDATE wallets - SET deleted = true, updated_at = {db.timestamp_placeholder('now')} - WHERE id = :wallet - """, - {"wallet": wallet_id, "now": now}, - ) - return result.rowcount - - -async def remove_deleted_wallets(conn: Optional[Connection] = None) -> None: - await (conn or db).execute("DELETE FROM wallets WHERE deleted = true") - - -async def delete_unused_wallets( - time_delta: int, - conn: Optional[Connection] = None, -) -> None: - delta = int(time()) - time_delta - await (conn or db).execute( - """ - DELETE FROM wallets - WHERE ( - SELECT COUNT(*) FROM apipayments WHERE wallet = wallets.id - ) = 0 AND ( - (updated_at is null AND created_at < :delta) - OR updated_at < :delta - ) - """, - {"delta": delta}, - ) - - -async def get_wallet( - wallet_id: str, conn: Optional[Connection] = None -) -> Optional[Wallet]: - row = await (conn or db).fetchone( - """ - SELECT *, COALESCE((SELECT balance FROM balances WHERE wallet = wallets.id), 0) - AS balance_msat FROM wallets WHERE id = :wallet - """, - {"wallet": wallet_id}, - ) - - return Wallet(**row) if row else None - - -async def get_wallets(user_id: str, conn: Optional[Connection] = None) -> list[Wallet]: - rows = await (conn or db).fetchall( - """ - SELECT *, COALESCE((SELECT balance FROM balances WHERE wallet = wallets.id), 0) - AS balance_msat FROM wallets WHERE "user" = :user - """, - {"user": user_id}, - ) - - return [Wallet(**row) for row in rows] - - -async def get_wallet_for_key( - key: str, - conn: Optional[Connection] = None, -) -> Optional[Wallet]: - row = await (conn or db).fetchone( - """ - SELECT *, COALESCE((SELECT balance FROM balances WHERE wallet = wallets.id), 0) - AS balance_msat FROM wallets - WHERE (adminkey = :key OR inkey = :key) AND deleted = false - """, - {"key": key}, - ) - - if not row: - return None - - return Wallet(**row) - - -async def get_total_balance(conn: Optional[Connection] = None): - row = await (conn or db).fetchone("SELECT SUM(balance) FROM balances") - return row.get("balance", 0) - - -# wallet payments -# --------------- - - -async def get_standalone_payment( - checking_id_or_hash: str, - conn: Optional[Connection] = None, - incoming: Optional[bool] = False, - wallet_id: Optional[str] = None, -) -> Optional[Payment]: - clause: str = "checking_id = :checking_id OR hash = :hash" - values = { - "wallet": wallet_id, - "checking_id": checking_id_or_hash, - "hash": checking_id_or_hash, - } - if incoming: - clause = f"({clause}) AND amount > 0" - - if wallet_id: - clause = f"({clause}) AND wallet = :wallet" - - row = await (conn or db).fetchone( - f""" - SELECT * - FROM apipayments - WHERE {clause} - ORDER BY amount - LIMIT 1 - """, - values, - ) - - return Payment.from_row(row) if row else None - - -async def get_wallet_payment( - wallet_id: str, payment_hash: str, conn: Optional[Connection] = None -) -> Optional[Payment]: - row = await (conn or db).fetchone( - """ - SELECT * - FROM apipayments - WHERE wallet = :wallet AND hash = :hash - """, - {"wallet": wallet_id, "hash": payment_hash}, - ) - - return Payment.from_row(row) if row else None - - -async def get_latest_payments_by_extension(ext_name: str, ext_id: str, limit: int = 5): - rows = await db.fetchall( - f""" - SELECT * FROM apipayments - WHERE status = '{PaymentState.SUCCESS}' - AND extra LIKE :ext_name - AND extra LIKE :ext_id - ORDER BY time DESC LIMIT {limit} - """, - {"ext_name": f"%{ext_name}%", "ext_id": f"%{ext_id}%"}, - ) - - return rows - - -async def get_payments_paginated( - *, - wallet_id: Optional[str] = None, - complete: bool = False, - pending: bool = False, - outgoing: bool = False, - incoming: bool = False, - since: Optional[int] = None, - exclude_uncheckable: bool = False, - filters: Optional[Filters[PaymentFilters]] = None, - conn: Optional[Connection] = None, -) -> Page[Payment]: - """ - Filters payments to be returned by complete | pending | outgoing | incoming. - """ - - values: dict = { - "wallet": wallet_id, - "time": since, - } - clause: list[str] = [] - - if since is not None: - clause.append(f"time > {db.timestamp_placeholder('time')}") - - if wallet_id: - clause.append("wallet = :wallet") - - if complete and pending: - pass - elif complete: - clause.append( - f"((amount > 0 AND status = '{PaymentState.SUCCESS}') OR amount < 0)" - ) - elif pending: - clause.append(f"status = '{PaymentState.PENDING}'") - else: - pass - - if outgoing and incoming: - pass - elif outgoing: - clause.append("amount < 0") - elif incoming: - clause.append("amount > 0") - else: - pass - - if exclude_uncheckable: # checkable means it has a checking_id that isn't internal - clause.append("checking_id NOT LIKE 'temp_%'") - clause.append("checking_id NOT LIKE 'internal_%'") - - return await (conn or db).fetch_page( - "SELECT * FROM apipayments", - clause, - values, - filters=filters, - model=Payment, - ) - - -async def get_payments( - *, - wallet_id: Optional[str] = None, - complete: bool = False, - pending: bool = False, - outgoing: bool = False, - incoming: bool = False, - since: Optional[int] = None, - exclude_uncheckable: bool = False, - filters: Optional[Filters[PaymentFilters]] = None, - conn: Optional[Connection] = None, - limit: Optional[int] = None, - offset: Optional[int] = None, -) -> list[Payment]: - """ - Filters payments to be returned by complete | pending | outgoing | incoming. - """ - - filters = filters or Filters() - - filters.sortby = filters.sortby or "time" - filters.direction = filters.direction or "desc" - filters.limit = limit or filters.limit - filters.offset = offset or filters.offset - - page = await get_payments_paginated( - wallet_id=wallet_id, - complete=complete, - pending=pending, - outgoing=outgoing, - incoming=incoming, - since=since, - exclude_uncheckable=exclude_uncheckable, - filters=filters, - conn=conn, - ) - - return page.data - - -async def delete_expired_invoices( - conn: Optional[Connection] = None, -) -> None: - # first we delete all invoices older than one month - - await (conn or db).execute( - f""" - DELETE FROM apipayments - WHERE status = '{PaymentState.PENDING}' AND amount > 0 - AND time < {db.timestamp_placeholder("delta")} - """, - {"delta": int(time() - 2592000)}, - ) - # then we delete all invoices whose expiry date is in the past - await (conn or db).execute( - f""" - DELETE FROM apipayments - WHERE status = '{PaymentState.PENDING}' AND amount > 0 - AND expiry < {db.timestamp_placeholder("now")} - """, - {"now": int(time())}, - ) - - -# payments -# -------- - - -async def create_payment( - checking_id: str, - data: CreatePayment, - status: PaymentState = PaymentState.PENDING, - conn: Optional[Connection] = None, -) -> Payment: - # we don't allow the creation of the same invoice twice - # note: this can be removed if the db uniqueness constraints are set appropriately - previous_payment = await get_standalone_payment(checking_id, conn=conn) - assert previous_payment is None, "Payment already exists" - - expiry_ph = db.timestamp_placeholder("expiry") - await (conn or db).execute( - f""" - INSERT INTO apipayments - (wallet, checking_id, bolt11, hash, preimage, - amount, status, memo, fee, extra, webhook, expiry, pending) - VALUES (:wallet, :checking_id, :bolt11, :hash, :preimage, - :amount, :status, :memo, :fee, :extra, :webhook, {expiry_ph}, :pending) - """, - { - "wallet": data.wallet_id, - "checking_id": checking_id, - "bolt11": data.payment_request, - "hash": data.payment_hash, - "preimage": data.preimage, - "amount": data.amount, - "status": status.value, - "memo": data.memo, - "fee": data.fee, - "extra": ( - json.dumps(data.extra) - if data.extra and data.extra != {} and isinstance(data.extra, dict) - else None - ), - "webhook": data.webhook, - "expiry": data.expiry if data.expiry else None, - "pending": False, # TODO: remove this in next release - }, - ) - - new_payment = await get_wallet_payment(data.wallet_id, data.payment_hash, conn=conn) - assert new_payment, "Newly created payment couldn't be retrieved" - - return new_payment - - -async def update_payment_status( - checking_id: str, status: PaymentState, conn: Optional[Connection] = None -) -> None: - await (conn or db).execute( - "UPDATE apipayments SET status = :status WHERE checking_id = :checking_id", - {"status": status.value, "checking_id": checking_id}, - ) - - -async def update_payment_details( - checking_id: str, - status: Optional[PaymentState] = None, - fee: Optional[int] = None, - preimage: Optional[str] = None, - new_checking_id: Optional[str] = None, - conn: Optional[Connection] = None, -) -> None: - set_variables: dict = { - "checking_id": checking_id, - "new_checking_id": new_checking_id, - "status": status.value if status else None, - "fee": fee, - "preimage": preimage, - } - - set_clause: list[str] = [] - if new_checking_id is not None: - set_clause.append("checking_id = :new_checking_id") - if status is not None: - set_clause.append("status = :status") - if fee is not None: - set_clause.append("fee = :fee") - if preimage is not None: - set_clause.append("preimage = :preimage") - - await (conn or db).execute( - f""" - UPDATE apipayments SET {', '.join(set_clause)} - WHERE checking_id = :checking_id - """, - set_variables, - ) - - -async def update_payment_extra( - payment_hash: str, - extra: dict, - outgoing: bool = False, - conn: Optional[Connection] = None, -) -> None: - """ - Only update the `extra` field for the payment. - Old values in the `extra` JSON object will be kept - unless the new `extra` overwrites them. - """ - - amount_clause = "AND amount < 0" if outgoing else "AND amount > 0" - - row = await (conn or db).fetchone( - f"SELECT hash, extra from apipayments WHERE hash = :hash {amount_clause}", - {"hash": payment_hash}, - ) - if not row: - return - db_extra = json.loads(row["extra"] if row["extra"] else "{}") - db_extra.update(extra) - - await (conn or db).execute( - f"UPDATE apipayments SET extra = :extra WHERE hash = :hash {amount_clause} ", - {"extra": json.dumps(db_extra), "hash": payment_hash}, - ) - - -DateTrunc = Literal["hour", "day", "month"] -sqlite_formats = { - "hour": "%Y-%m-%d %H:00:00", - "day": "%Y-%m-%d 00:00:00", - "month": "%Y-%m-01 00:00:00", -} - - -async def get_payments_history( - wallet_id: Optional[str] = None, - group: DateTrunc = "day", - filters: Optional[Filters] = None, -) -> list[PaymentHistoryPoint]: - if not filters: - filters = Filters() - - if DB_TYPE == SQLITE and group in sqlite_formats: - date_trunc = f"strftime('{sqlite_formats[group]}', time, 'unixepoch')" - elif group in ("day", "hour", "month"): - date_trunc = f"date_trunc('{group}', time)" - else: - raise ValueError(f"Invalid group value: {group}") - - values = { - "wallet": wallet_id, - } - where = [f"wallet = :wallet AND (status = '{PaymentState.SUCCESS}' OR amount < 0)"] - transactions = await db.fetchall( - f""" - SELECT {date_trunc} date, - SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) income, - SUM(CASE WHEN amount < 0 THEN abs(amount) + abs(fee) ELSE 0 END) spending - FROM apipayments - {filters.where(where)} - GROUP BY date - ORDER BY date DESC - """, - filters.values(values), - ) - if wallet_id: - wallet = await get_wallet(wallet_id) - if wallet: - balance = wallet.balance_msat - else: - raise ValueError("Unknown wallet") - else: - balance = await get_total_balance() - - # since we dont know the balance at the starting point, - # we take the current balance and walk backwards - results: list[PaymentHistoryPoint] = [] - for row in transactions: - results.insert( - 0, - PaymentHistoryPoint( - balance=balance, - date=row.get("date", 0), - income=row.get("income", 0), - spending=row.get("spending", 0), - ), - ) - balance -= row.get("income", 0) - row.get("spending", 0) - return results - - -async def delete_wallet_payment( - checking_id: str, wallet_id: str, conn: Optional[Connection] = None -) -> None: - await (conn or db).execute( - "DELETE FROM apipayments WHERE checking_id = :checking_id AND wallet = :wallet", - {"checking_id": checking_id, "wallet": wallet_id}, - ) - - -async def check_internal( - payment_hash: str, conn: Optional[Connection] = None -) -> Optional[str]: - """ - Returns the checking_id of the internal payment if it exists, - otherwise None - """ - row = await (conn or db).fetchone( - f""" - SELECT checking_id FROM apipayments - WHERE hash = :hash AND status = '{PaymentState.PENDING}' AND amount > 0 - """, - {"hash": payment_hash}, - ) - if not row: - return None - else: - return row["checking_id"] - - -async def check_internal_pending( - payment_hash: str, conn: Optional[Connection] = None -) -> bool: - """ - Returns False if the internal payment is not pending anymore - (and thus paid), otherwise True - """ - row = await (conn or db).fetchone( - """ - SELECT status FROM apipayments - WHERE hash = :hash AND amount > 0 - """, - {"hash": payment_hash}, - ) - if not row: - return True - return row["status"] == PaymentState.PENDING.value - - -async def mark_webhook_sent(payment_hash: str, status: int) -> None: - await db.execute( - """ - UPDATE apipayments SET webhook_status = :status - WHERE hash = :hash - """, - {"status": status, "hash": payment_hash}, - ) - - -# admin -# -------- - - -async def get_super_settings() -> Optional[SuperSettings]: - row = await db.fetchone("SELECT * FROM settings") - if not row: - return None - editable_settings = json.loads(row["editable_settings"]) - return SuperSettings(**{"super_user": row["super_user"], **editable_settings}) - - -async def get_admin_settings(is_super_user: bool = False) -> Optional[AdminSettings]: - sets = await get_super_settings() - if not sets: - return None - row_dict = dict(sets) - row_dict.pop("super_user") - row_dict.pop("auth_all_methods") - - admin_settings = AdminSettings( - is_super_user=is_super_user, - lnbits_allowed_funding_sources=settings.lnbits_allowed_funding_sources, - **row_dict, - ) - return admin_settings - - -async def delete_admin_settings() -> None: - await db.execute("DELETE FROM settings") - - -async def update_admin_settings(data: EditableSettings) -> None: - row = await db.fetchone("SELECT editable_settings FROM settings") - editable_settings = json.loads(row["editable_settings"]) if row else {} - editable_settings.update(data.dict(exclude_unset=True)) - await db.execute( - "UPDATE settings SET editable_settings = :settings", - {"settings": json.dumps(editable_settings)}, - ) - - -async def update_super_user(super_user: str) -> SuperSettings: - await db.execute( - "UPDATE settings SET super_user = :user", - {"user": super_user}, - ) - settings = await get_super_settings() - assert settings, "updated super_user settings could not be retrieved" - return settings - - -async def create_admin_settings(super_user: str, new_settings: dict): - await db.execute( - """ - INSERT INTO settings (super_user, editable_settings) - VALUES (:user, :settings) - """, - {"user": super_user, "settings": json.dumps(new_settings)}, - ) - settings = await get_super_settings() - assert settings, "created admin settings could not be retrieved" - return settings - - -# db versions -# -------------- -async def get_dbversions(conn: Optional[Connection] = None): - rows = await (conn or db).fetchall("SELECT * FROM dbversions") - return {row["db"]: row["version"] for row in rows} - - -async def update_migration_version(conn, db_name, version): - await (conn or db).execute( - """ - INSERT INTO dbversions (db, version) VALUES (:db, :version) - ON CONFLICT (db) DO UPDATE SET version = :version - """, - {"db": db_name, "version": version}, - ) - - -async def delete_dbversion(*, ext_id: str, conn: Optional[Connection] = None) -> None: - await (conn or db).execute( - """ - DELETE FROM dbversions WHERE db = :ext - """, - {"ext": ext_id}, - ) - - -# tinyurl -# ------- - - -async def create_tinyurl(domain: str, endless: bool, wallet: str): - tinyurl_id = shortuuid.uuid()[:8] - await db.execute( - """ - INSERT INTO tiny_url (id, url, endless, wallet) - VALUES (:tinyurl, :domain, :endless, :wallet) - """, - {"tinyurl": tinyurl_id, "domain": domain, "endless": endless, "wallet": wallet}, - ) - return await get_tinyurl(tinyurl_id) - - -async def get_tinyurl(tinyurl_id: str) -> Optional[TinyURL]: - row = await db.fetchone( - "SELECT * FROM tiny_url WHERE id = :tinyurl", - {"tinyurl": tinyurl_id}, - ) - return TinyURL.from_row(row) if row else None - - -async def get_tinyurl_by_url(url: str) -> list[TinyURL]: - rows = await db.fetchall( - "SELECT * FROM tiny_url WHERE url = :url", - {"url": url}, - ) - return [TinyURL.from_row(row) for row in rows] - - -async def delete_tinyurl(tinyurl_id: str): - await db.execute( - "DELETE FROM tiny_url WHERE id = :tinyurl", - {"tinyurl": tinyurl_id}, - ) - - -# push_notification -# ----------------- - - -async def get_webpush_subscription( - endpoint: str, user: str -) -> Optional[WebPushSubscription]: - row = await db.fetchone( - """ - SELECT * FROM webpush_subscriptions - WHERE endpoint = :endpoint AND "user" = :user - """, - {"endpoint": endpoint, "user": user}, - ) - return WebPushSubscription(**dict(row)) if row else None - - -async def get_webpush_subscriptions_for_user( - user: str, -) -> list[WebPushSubscription]: - rows = await db.fetchall( - """SELECT * FROM webpush_subscriptions WHERE "user" = :user""", - {"user": user}, - ) - return [WebPushSubscription(**dict(row)) for row in rows] - - -async def create_webpush_subscription( - endpoint: str, user: str, data: str, host: str -) -> WebPushSubscription: - await db.execute( - """ - INSERT INTO webpush_subscriptions (endpoint, "user", data, host) - VALUES (:endpoint, :user, :data, :host) - """, - {"endpoint": endpoint, "user": user, "data": data, "host": host}, - ) - subscription = await get_webpush_subscription(endpoint, user) - assert subscription, "Newly created webpush subscription couldn't be retrieved" - return subscription - - -async def delete_webpush_subscription(endpoint: str, user: str) -> int: - resp = await db.execute( - """ - DELETE FROM webpush_subscriptions WHERE endpoint = :endpoint AND "user" = :user - """, - {"endpoint": endpoint, "user": user}, - ) - return resp.rowcount - - -async def delete_webpush_subscriptions(endpoint: str) -> int: - resp = await db.execute( - "DELETE FROM webpush_subscriptions WHERE endpoint = :endpoint", - {"endpoint": endpoint}, - ) - return resp.rowcount diff --git a/lnbits/core/crud/__init__.py b/lnbits/core/crud/__init__.py new file mode 100644 index 000000000..07887290d --- /dev/null +++ b/lnbits/core/crud/__init__.py @@ -0,0 +1,162 @@ +from .db_versions import ( + delete_dbversion, + get_db_version, + get_db_versions, + update_migration_version, +) +from .extensions import ( + create_installed_extension, + create_user_extension, + delete_installed_extension, + drop_extension_db, + get_installed_extension, + get_installed_extensions, + get_user_active_extensions_ids, + get_user_extension, + update_installed_extension, + update_installed_extension_state, + update_user_extension, +) +from .payments import ( + DateTrunc, + check_internal, + create_payment, + delete_expired_invoices, + delete_wallet_payment, + get_latest_payments_by_extension, + get_payment, + get_payments, + get_payments_history, + get_payments_paginated, + get_standalone_payment, + get_wallet_payment, + is_internal_status_success, + mark_webhook_sent, + update_payment, + update_payment_checking_id, + update_payment_extra, +) +from .settings import ( + create_admin_settings, + delete_admin_settings, + get_admin_settings, + get_super_settings, + update_admin_settings, + update_super_user, +) +from .tinyurl import create_tinyurl, delete_tinyurl, get_tinyurl, get_tinyurl_by_url +from .users import ( + create_account, + delete_account, + delete_accounts_no_wallets, + get_account, + get_account_by_email, + get_account_by_pubkey, + get_account_by_username, + get_account_by_username_or_email, + get_accounts, + get_user, + get_user_from_account, + update_account, +) +from .wallets import ( + create_wallet, + delete_unused_wallets, + delete_wallet, + delete_wallet_by_id, + force_delete_wallet, + get_total_balance, + get_wallet, + get_wallet_for_key, + get_wallets, + remove_deleted_wallets, + update_wallet, +) +from .webpush import ( + create_webpush_subscription, + delete_webpush_subscription, + delete_webpush_subscriptions, + get_webpush_subscription, + get_webpush_subscriptions_for_user, +) + +__all__ = [ + # db_versions + "get_db_version", + "get_db_versions", + "update_migration_version", + "delete_dbversion", + # extensions + "create_installed_extension", + "create_user_extension", + "delete_installed_extension", + "drop_extension_db", + "get_installed_extension", + "get_installed_extensions", + "get_user_active_extensions_ids", + "get_user_extension", + "update_installed_extension", + "update_installed_extension_state", + "update_user_extension", + # payments + "DateTrunc", + "check_internal", + "create_payment", + "delete_expired_invoices", + "delete_wallet_payment", + "get_latest_payments_by_extension", + "get_payment", + "get_payments", + "get_payments_history", + "get_payments_paginated", + "get_standalone_payment", + "get_wallet_payment", + "is_internal_status_success", + "mark_webhook_sent", + "update_payment", + "update_payment_checking_id", + "update_payment_extra", + # settings + "create_admin_settings", + "delete_admin_settings", + "get_admin_settings", + "get_super_settings", + "update_admin_settings", + "update_super_user", + # tinyurl + "create_tinyurl", + "delete_tinyurl", + "get_tinyurl", + "get_tinyurl_by_url", + # users + "create_account", + "delete_account", + "delete_accounts_no_wallets", + "get_account", + "get_account_by_email", + "get_account_by_pubkey", + "get_account_by_username", + "get_account_by_username_or_email", + "get_accounts", + "get_user", + "get_user_from_account", + "update_account", + # wallets + "create_wallet", + "delete_unused_wallets", + "delete_wallet", + "delete_wallet_by_id", + "force_delete_wallet", + "get_total_balance", + "get_wallet", + "get_wallet_for_key", + "get_wallets", + "remove_deleted_wallets", + "update_wallet", + # webpush + "create_webpush_subscription", + "delete_webpush_subscription", + "delete_webpush_subscriptions", + "get_webpush_subscription", + "get_webpush_subscriptions_for_user", +] diff --git a/lnbits/core/crud/db_versions.py b/lnbits/core/crud/db_versions.py new file mode 100644 index 000000000..8f8ec9b4c --- /dev/null +++ b/lnbits/core/crud/db_versions.py @@ -0,0 +1,39 @@ +from typing import Optional + +from lnbits.core.db import db +from lnbits.db import Connection + +from ..models import DbVersion + + +async def get_db_version( + ext_id: str, conn: Optional[Connection] = None +) -> Optional[DbVersion]: + return await (conn or db).fetchone( + "SELECT * FROM dbversions WHERE db = :ext_id", + {"ext_id": ext_id}, + model=DbVersion, + ) + + +async def get_db_versions(conn: Optional[Connection] = None) -> list[DbVersion]: + return await (conn or db).fetchall("SELECT * FROM dbversions", model=DbVersion) + + +async def update_migration_version(conn, db_name, version): + await (conn or db).execute( + """ + INSERT INTO dbversions (db, version) VALUES (:db, :version) + ON CONFLICT (db) DO UPDATE SET version = :version + """, + {"db": db_name, "version": version}, + ) + + +async def delete_dbversion(*, ext_id: str, conn: Optional[Connection] = None) -> None: + await (conn or db).execute( + """ + DELETE FROM dbversions WHERE db = :ext + """, + {"ext": ext_id}, + ) diff --git a/lnbits/core/crud/extensions.py b/lnbits/core/crud/extensions.py new file mode 100644 index 000000000..da493d305 --- /dev/null +++ b/lnbits/core/crud/extensions.py @@ -0,0 +1,137 @@ +from typing import Optional + +from lnbits.core.db import db +from lnbits.core.extensions.models import ( + InstallableExtension, + UserExtension, +) +from lnbits.db import Connection, Database + + +async def create_installed_extension( + ext: InstallableExtension, + conn: Optional[Connection] = None, +) -> None: + await (conn or db).insert("installed_extensions", ext) + + +async def update_installed_extension( + ext: InstallableExtension, + conn: Optional[Connection] = None, +) -> None: + await (conn or db).update("installed_extensions", ext) + + +async def update_installed_extension_state( + *, ext_id: str, active: bool, conn: Optional[Connection] = None +) -> None: + await (conn or db).execute( + """ + UPDATE installed_extensions SET active = :active WHERE id = :ext + """, + {"ext": ext_id, "active": active}, + ) + + +async def delete_installed_extension( + *, ext_id: str, conn: Optional[Connection] = None +) -> None: + await (conn or db).execute( + """ + DELETE from installed_extensions WHERE id = :ext + """, + {"ext": ext_id}, + ) + + +async def drop_extension_db(ext_id: str, conn: Optional[Connection] = None) -> None: + row: dict = await (conn or db).fetchone( + "SELECT * FROM dbversions WHERE db = :id", + {"id": ext_id}, + ) + # Check that 'ext_id' is a valid extension id and not a malicious string + assert row, f"Extension '{ext_id}' db version cannot be found" + + is_file_based_db = await Database.clean_ext_db_files(ext_id) + if is_file_based_db: + return + + # String formatting is required, params are not accepted for 'DROP SCHEMA'. + # The `ext_id` value is verified above. + await (conn or db).execute( + f"DROP SCHEMA IF EXISTS {ext_id} CASCADE", + ) + + +async def get_installed_extension( + ext_id: str, conn: Optional[Connection] = None +) -> Optional[InstallableExtension]: + extension = await (conn or db).fetchone( + "SELECT * FROM installed_extensions WHERE id = :id", + {"id": ext_id}, + InstallableExtension, + ) + return extension + + +async def get_installed_extensions( + active: Optional[bool] = None, + conn: Optional[Connection] = None, +) -> list[InstallableExtension]: + where = "WHERE active = :active" if active is not None else "" + values = {"active": active} if active is not None else {} + all_extensions = await (conn or db).fetchall( + f"SELECT * FROM installed_extensions {where}", + values, + model=InstallableExtension, + ) + return all_extensions + + +async def get_user_extension( + user_id: str, extension: str, conn: Optional[Connection] = None +) -> Optional[UserExtension]: + return await (conn or db).fetchone( + """ + SELECT * FROM extensions + WHERE "user" = :user AND extension = :ext + """, + {"user": user_id, "ext": extension}, + model=UserExtension, + ) + + +async def get_user_extensions( + user_id: str, conn: Optional[Connection] = None +) -> list[UserExtension]: + return await (conn or db).fetchall( + """SELECT * FROM extensions WHERE "user" = :user""", + {"user": user_id}, + model=UserExtension, + ) + + +async def create_user_extension( + user_extension: UserExtension, conn: Optional[Connection] = None +) -> None: + await (conn or db).insert("extensions", user_extension) + + +async def update_user_extension( + user_extension: UserExtension, conn: Optional[Connection] = None +) -> None: + where = """WHERE extension = :extension AND "user" = :user""" + await (conn or db).update("extensions", user_extension, where) + + +async def get_user_active_extensions_ids( + user_id: str, conn: Optional[Connection] = None +) -> list[str]: + exts = await (conn or db).fetchall( + """ + SELECT * FROM extensions WHERE "user" = :user AND active + """, + {"user": user_id}, + UserExtension, + ) + return [ext.extension for ext in exts] diff --git a/lnbits/core/crud/payments.py b/lnbits/core/crud/payments.py new file mode 100644 index 000000000..979c7b027 --- /dev/null +++ b/lnbits/core/crud/payments.py @@ -0,0 +1,385 @@ +from time import time +from typing import Literal, Optional + +from lnbits.core.crud.wallets import get_total_balance, get_wallet +from lnbits.core.db import db +from lnbits.core.models import PaymentState +from lnbits.db import DB_TYPE, SQLITE, Connection, Filters, Page + +from ..models import ( + CreatePayment, + Payment, + PaymentFilters, + PaymentHistoryPoint, +) + +DateTrunc = Literal["hour", "day", "month"] +sqlite_formats = { + "hour": "%Y-%m-%d %H:00:00", + "day": "%Y-%m-%d 00:00:00", + "month": "%Y-%m-01 00:00:00", +} + + +def update_payment_extra(): + pass + + +async def get_payment(checking_id: str, conn: Optional[Connection] = None) -> Payment: + return await (conn or db).fetchone( + "SELECT * FROM apipayments WHERE checking_id = :checking_id", + {"checking_id": checking_id}, + Payment, + ) + + +async def get_standalone_payment( + checking_id_or_hash: str, + conn: Optional[Connection] = None, + incoming: Optional[bool] = False, + wallet_id: Optional[str] = None, +) -> Optional[Payment]: + clause: str = "checking_id = :checking_id OR payment_hash = :hash" + values = { + "wallet_id": wallet_id, + "checking_id": checking_id_or_hash, + "hash": checking_id_or_hash, + } + if incoming: + clause = f"({clause}) AND amount > 0" + + if wallet_id: + clause = f"({clause}) AND wallet_id = :wallet_id" + + row = await (conn or db).fetchone( + f""" + SELECT * FROM apipayments + WHERE {clause} + ORDER BY amount LIMIT 1 + """, + values, + Payment, + ) + return row + + +async def get_wallet_payment( + wallet_id: str, payment_hash: str, conn: Optional[Connection] = None +) -> Optional[Payment]: + payment = await (conn or db).fetchone( + """ + SELECT * + FROM apipayments + WHERE wallet_id = :wallet AND payment_hash = :hash + """, + {"wallet": wallet_id, "hash": payment_hash}, + Payment, + ) + return payment + + +async def get_latest_payments_by_extension( + ext_name: str, ext_id: str, limit: int = 5 +) -> list[Payment]: + return await db.fetchall( + f""" + SELECT * FROM apipayments + WHERE status = '{PaymentState.SUCCESS}' + AND extra LIKE :ext_name + AND extra LIKE :ext_id + ORDER BY time DESC LIMIT {limit} + """, + {"ext_name": f"%{ext_name}%", "ext_id": f"%{ext_id}%"}, + Payment, + ) + + +async def get_payments_paginated( + *, + wallet_id: Optional[str] = None, + complete: bool = False, + pending: bool = False, + outgoing: bool = False, + incoming: bool = False, + since: Optional[int] = None, + exclude_uncheckable: bool = False, + filters: Optional[Filters[PaymentFilters]] = None, + conn: Optional[Connection] = None, +) -> Page[Payment]: + """ + Filters payments to be returned by complete | pending | outgoing | incoming. + """ + + values: dict = { + "wallet_id": wallet_id, + "time": since, + } + clause: list[str] = [] + + if since is not None: + clause.append(f"time > {db.timestamp_placeholder('time')}") + + if wallet_id: + clause.append("wallet_id = :wallet_id") + + if complete and pending: + pass + elif complete: + clause.append( + f"((amount > 0 AND status = '{PaymentState.SUCCESS}') OR amount < 0)" + ) + elif pending: + clause.append(f"status = '{PaymentState.PENDING}'") + else: + pass + + if outgoing and incoming: + pass + elif outgoing: + clause.append("amount < 0") + elif incoming: + clause.append("amount > 0") + else: + pass + + if exclude_uncheckable: # checkable means it has a checking_id that isn't internal + clause.append("checking_id NOT LIKE 'temp_%'") + clause.append("checking_id NOT LIKE 'internal_%'") + + return await (conn or db).fetch_page( + "SELECT * FROM apipayments", + clause, + values, + filters=filters, + model=Payment, + ) + + +async def get_payments( + *, + wallet_id: Optional[str] = None, + complete: bool = False, + pending: bool = False, + outgoing: bool = False, + incoming: bool = False, + since: Optional[int] = None, + exclude_uncheckable: bool = False, + filters: Optional[Filters[PaymentFilters]] = None, + conn: Optional[Connection] = None, + limit: Optional[int] = None, + offset: Optional[int] = None, +) -> list[Payment]: + """ + Filters payments to be returned by complete | pending | outgoing | incoming. + """ + + filters = filters or Filters() + + filters.sortby = filters.sortby or "time" + filters.direction = filters.direction or "desc" + filters.limit = limit or filters.limit + filters.offset = offset or filters.offset + + page = await get_payments_paginated( + wallet_id=wallet_id, + complete=complete, + pending=pending, + outgoing=outgoing, + incoming=incoming, + since=since, + exclude_uncheckable=exclude_uncheckable, + filters=filters, + conn=conn, + ) + + return page.data + + +async def delete_expired_invoices( + conn: Optional[Connection] = None, +) -> None: + # first we delete all invoices older than one month + + await (conn or db).execute( + f""" + DELETE FROM apipayments + WHERE status = '{PaymentState.PENDING}' AND amount > 0 + AND time < {db.timestamp_placeholder("delta")} + """, + {"delta": int(time() - 2592000)}, + ) + # then we delete all invoices whose expiry date is in the past + await (conn or db).execute( + f""" + DELETE FROM apipayments + WHERE status = '{PaymentState.PENDING}' AND amount > 0 + AND expiry < {db.timestamp_placeholder("now")} + """, + {"now": int(time())}, + ) + + +async def create_payment( + checking_id: str, + data: CreatePayment, + status: PaymentState = PaymentState.PENDING, + conn: Optional[Connection] = None, +) -> Payment: + # we don't allow the creation of the same invoice twice + # note: this can be removed if the db uniqueness constraints are set appropriately + previous_payment = await get_standalone_payment(checking_id, conn=conn) + assert previous_payment is None, "Payment already exists" + + payment = Payment( + checking_id=checking_id, + status=status, + wallet_id=data.wallet_id, + payment_hash=data.payment_hash, + bolt11=data.bolt11, + amount=data.amount_msat, + memo=data.memo, + preimage=data.preimage, + expiry=data.expiry, + webhook=data.webhook, + fee=data.fee, + extra=data.extra or {}, + ) + + await (conn or db).insert("apipayments", payment) + + return payment + + +async def update_payment_checking_id( + checking_id: str, new_checking_id: str, conn: Optional[Connection] = None +) -> None: + await (conn or db).execute( + "UPDATE apipayments SET checking_id = :new_id WHERE checking_id = :old_id", + {"new_id": new_checking_id, "old_id": checking_id}, + ) + + +async def update_payment( + payment: Payment, + new_checking_id: Optional[str] = None, + conn: Optional[Connection] = None, +) -> None: + await (conn or db).update( + "apipayments", payment, "WHERE checking_id = :checking_id" + ) + if new_checking_id and new_checking_id != payment.checking_id: + await update_payment_checking_id(payment.checking_id, new_checking_id, conn) + + +async def get_payments_history( + wallet_id: Optional[str] = None, + group: DateTrunc = "day", + filters: Optional[Filters] = None, +) -> list[PaymentHistoryPoint]: + if not filters: + filters = Filters() + + if DB_TYPE == SQLITE and group in sqlite_formats: + date_trunc = f"strftime('{sqlite_formats[group]}', time, 'unixepoch')" + elif group in ("day", "hour", "month"): + date_trunc = f"date_trunc('{group}', time)" + else: + raise ValueError(f"Invalid group value: {group}") + + values = { + "wallet_id": wallet_id, + } + where = [ + f"wallet_id = :wallet_id AND (status = '{PaymentState.SUCCESS}' OR amount < 0)" + ] + transactions: list[dict] = await db.fetchall( + f""" + SELECT {date_trunc} date, + SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) income, + SUM(CASE WHEN amount < 0 THEN abs(amount) + abs(fee) ELSE 0 END) spending + FROM apipayments + {filters.where(where)} + GROUP BY date + ORDER BY date DESC + """, + filters.values(values), + ) + if wallet_id: + wallet = await get_wallet(wallet_id) + if wallet: + balance = wallet.balance_msat + else: + raise ValueError("Unknown wallet") + else: + balance = await get_total_balance() + + # since we dont know the balance at the starting point, + # we take the current balance and walk backwards + results: list[PaymentHistoryPoint] = [] + for row in transactions: + results.insert( + 0, + PaymentHistoryPoint( + balance=balance, + date=row.get("date", 0), + income=row.get("income", 0), + spending=row.get("spending", 0), + ), + ) + balance -= row.get("income", 0) - row.get("spending", 0) + return results + + +async def delete_wallet_payment( + checking_id: str, wallet_id: str, conn: Optional[Connection] = None +) -> None: + await (conn or db).execute( + "DELETE FROM apipayments WHERE checking_id = :checking_id AND wallet = :wallet", + {"checking_id": checking_id, "wallet": wallet_id}, + ) + + +async def check_internal( + payment_hash: str, conn: Optional[Connection] = None +) -> Optional[Payment]: + """ + Returns the checking_id of the internal payment if it exists, + otherwise None + """ + return await (conn or db).fetchone( + f""" + SELECT * FROM apipayments + WHERE payment_hash = :hash AND status = '{PaymentState.PENDING}' AND amount > 0 + """, + {"hash": payment_hash}, + Payment, + ) + + +async def is_internal_status_success( + payment_hash: str, conn: Optional[Connection] = None +) -> bool: + """ + Returns True if the internal payment was found and is successful, + """ + payment = await (conn or db).fetchone( + """ + SELECT * FROM apipayments + WHERE payment_hash = :payment_hash AND amount > 0 + """, + {"payment_hash": payment_hash}, + Payment, + ) + if not payment: + return False + return payment.status == PaymentState.SUCCESS.value + + +async def mark_webhook_sent(payment_hash: str, status: int) -> None: + await db.execute( + """ + UPDATE apipayments SET webhook_status = :status + WHERE payment_hash = :hash + """, + {"status": status, "hash": payment_hash}, + ) diff --git a/lnbits/core/crud/settings.py b/lnbits/core/crud/settings.py new file mode 100644 index 000000000..0ff388fc4 --- /dev/null +++ b/lnbits/core/crud/settings.py @@ -0,0 +1,71 @@ +import json +from typing import Optional + +from lnbits.core.db import db +from lnbits.settings import ( + AdminSettings, + EditableSettings, + SuperSettings, + settings, +) + + +async def get_super_settings() -> Optional[SuperSettings]: + row: dict = await db.fetchone("SELECT * FROM settings") + if not row: + return None + editable_settings = json.loads(row["editable_settings"]) + return SuperSettings(**{"super_user": row["super_user"], **editable_settings}) + + +async def get_admin_settings(is_super_user: bool = False) -> Optional[AdminSettings]: + sets = await get_super_settings() + if not sets: + return None + row_dict = dict(sets) + row_dict.pop("super_user") + row_dict.pop("auth_all_methods") + + admin_settings = AdminSettings( + is_super_user=is_super_user, + lnbits_allowed_funding_sources=settings.lnbits_allowed_funding_sources, + **row_dict, + ) + return admin_settings + + +async def delete_admin_settings() -> None: + await db.execute("DELETE FROM settings") + + +async def update_admin_settings(data: EditableSettings) -> None: + row: dict = await db.fetchone("SELECT editable_settings FROM settings") + editable_settings = json.loads(row["editable_settings"]) if row else {} + editable_settings.update(data.dict(exclude_unset=True)) + await db.execute( + "UPDATE settings SET editable_settings = :settings", + {"settings": json.dumps(editable_settings)}, + ) + + +async def update_super_user(super_user: str) -> SuperSettings: + await db.execute( + "UPDATE settings SET super_user = :user", + {"user": super_user}, + ) + settings = await get_super_settings() + assert settings, "updated super_user settings could not be retrieved" + return settings + + +async def create_admin_settings(super_user: str, new_settings: dict): + await db.execute( + """ + INSERT INTO settings (super_user, editable_settings) + VALUES (:user, :settings) + """, + {"user": super_user, "settings": json.dumps(new_settings)}, + ) + settings = await get_super_settings() + assert settings, "created admin settings could not be retrieved" + return settings diff --git a/lnbits/core/crud/tinyurl.py b/lnbits/core/crud/tinyurl.py new file mode 100644 index 000000000..9ecc4cd57 --- /dev/null +++ b/lnbits/core/crud/tinyurl.py @@ -0,0 +1,42 @@ +from typing import Optional + +import shortuuid + +from lnbits.core.db import db + +from ..models import TinyURL + + +async def create_tinyurl(domain: str, endless: bool, wallet: str): + tinyurl_id = shortuuid.uuid()[:8] + await db.execute( + """ + INSERT INTO tiny_url (id, url, endless, wallet) + VALUES (:tinyurl, :domain, :endless, :wallet) + """, + {"tinyurl": tinyurl_id, "domain": domain, "endless": endless, "wallet": wallet}, + ) + return await get_tinyurl(tinyurl_id) + + +async def get_tinyurl(tinyurl_id: str) -> Optional[TinyURL]: + return await db.fetchone( + "SELECT * FROM tiny_url WHERE id = :tinyurl", + {"tinyurl": tinyurl_id}, + TinyURL, + ) + + +async def get_tinyurl_by_url(url: str) -> list[TinyURL]: + return await db.fetchall( + "SELECT * FROM tiny_url WHERE url = :url", + {"url": url}, + TinyURL, + ) + + +async def delete_tinyurl(tinyurl_id: str): + await db.execute( + "DELETE FROM tiny_url WHERE id = :tinyurl", + {"tinyurl": tinyurl_id}, + ) diff --git a/lnbits/core/crud/users.py b/lnbits/core/crud/users.py new file mode 100644 index 000000000..e54259158 --- /dev/null +++ b/lnbits/core/crud/users.py @@ -0,0 +1,170 @@ +from datetime import datetime, timezone +from time import time +from typing import Optional +from uuid import uuid4 + +from lnbits.core.crud.extensions import get_user_active_extensions_ids +from lnbits.core.crud.wallets import get_wallets +from lnbits.core.db import db +from lnbits.db import Connection, Filters, Page + +from ..models import ( + Account, + AccountFilters, + AccountOverview, + User, +) + + +async def create_account( + account: Optional[Account] = None, + conn: Optional[Connection] = None, +) -> Account: + if not account: + now = datetime.now(timezone.utc) + account = Account(id=uuid4().hex, created_at=now, updated_at=now) + await (conn or db).insert("accounts", account) + return account + + +async def update_account(account: Account) -> Account: + account.updated_at = datetime.now(timezone.utc) + await db.update("accounts", account) + return account + + +async def delete_account(user_id: str, conn: Optional[Connection] = None) -> None: + await (conn or db).execute( + "DELETE from accounts WHERE id = :user", + {"user": user_id}, + ) + + +async def get_accounts( + filters: Optional[Filters[AccountFilters]] = None, + conn: Optional[Connection] = None, +) -> Page[AccountOverview]: + return await (conn or db).fetch_page( + """ + SELECT + accounts.id, + accounts.username, + accounts.email, + SUM(COALESCE(( + SELECT balance FROM balances WHERE wallet_id = wallets.id + ), 0)) as balance_msat, + SUM(( + SELECT COUNT(*) FROM apipayments WHERE wallet_id = wallets.id + )) as transaction_count, + ( + SELECT COUNT(*) FROM wallets WHERE wallets.user = accounts.id + ) as wallet_count, + MAX(( + SELECT time FROM apipayments + WHERE wallet_id = wallets.id ORDER BY time DESC LIMIT 1 + )) as last_payment + FROM accounts LEFT JOIN wallets ON accounts.id = wallets.user + """, + [], + {}, + filters=filters, + model=AccountOverview, + group_by=["accounts.id"], + ) + + +async def get_account( + user_id: str, conn: Optional[Connection] = None +) -> Optional[Account]: + return await (conn or db).fetchone( + "SELECT * FROM accounts WHERE id = :id", + {"id": user_id}, + Account, + ) + + +async def delete_accounts_no_wallets( + time_delta: int, + conn: Optional[Connection] = None, +) -> None: + delta = int(time()) - time_delta + await (conn or db).execute( + f""" + DELETE FROM accounts + WHERE NOT EXISTS ( + SELECT wallets.id FROM wallets WHERE wallets.user = accounts.id + ) AND ( + (updated_at is null AND created_at < :delta) + OR updated_at < {db.timestamp_placeholder("delta")} + ) + """, + {"delta": delta}, + ) + + +async def get_account_by_username( + username: str, conn: Optional[Connection] = None +) -> Optional[Account]: + return await (conn or db).fetchone( + "SELECT * FROM accounts WHERE username = :username", + {"username": username}, + Account, + ) + + +async def get_account_by_pubkey( + pubkey: str, conn: Optional[Connection] = None +) -> Optional[Account]: + return await (conn or db).fetchone( + "SELECT * FROM accounts WHERE pubkey = :pubkey", + {"pubkey": pubkey}, + Account, + ) + + +async def get_account_by_email( + email: str, conn: Optional[Connection] = None +) -> Optional[Account]: + return await (conn or db).fetchone( + "SELECT * FROM accounts WHERE email = :email", + {"email": email}, + Account, + ) + + +async def get_account_by_username_or_email( + username_or_email: str, conn: Optional[Connection] = None +) -> Optional[Account]: + return await (conn or db).fetchone( + "SELECT * FROM accounts WHERE email = :value or username = :value", + {"value": username_or_email}, + Account, + ) + + +async def get_user(user_id: str, conn: Optional[Connection] = None) -> Optional[User]: + account = await get_account(user_id, conn) + if not account: + return None + return await get_user_from_account(account, conn) + + +async def get_user_from_account( + account: Account, conn: Optional[Connection] = None +) -> Optional[User]: + extensions = await get_user_active_extensions_ids(account.id, conn) + wallets = await get_wallets(account.id, False, conn=conn) + return User( + id=account.id, + email=account.email, + username=account.username, + pubkey=account.pubkey, + extra=account.extra, + created_at=account.created_at, + updated_at=account.updated_at, + extensions=extensions, + wallets=wallets, + admin=account.is_admin, + super_user=account.is_super_user, + has_password=account.password_hash is not None, + ) diff --git a/lnbits/core/crud/wallets.py b/lnbits/core/crud/wallets.py new file mode 100644 index 000000000..f3f3f2039 --- /dev/null +++ b/lnbits/core/crud/wallets.py @@ -0,0 +1,157 @@ +from datetime import datetime, timezone +from time import time +from typing import Optional +from uuid import uuid4 + +from lnbits.core.db import db +from lnbits.db import Connection +from lnbits.settings import settings + +from ..models import Wallet + + +async def create_wallet( + *, + user_id: str, + wallet_name: Optional[str] = None, + conn: Optional[Connection] = None, +) -> Wallet: + wallet_id = uuid4().hex + wallet = Wallet( + id=wallet_id, + name=wallet_name or settings.lnbits_default_wallet_name, + user=user_id, + adminkey=uuid4().hex, + inkey=uuid4().hex, + ) + await (conn or db).insert("wallets", wallet) + return wallet + + +async def update_wallet( + wallet: Wallet, + conn: Optional[Connection] = None, +) -> Optional[Wallet]: + wallet.updated_at = datetime.now(timezone.utc) + await (conn or db).update("wallets", wallet) + return wallet + + +async def delete_wallet( + *, + user_id: str, + wallet_id: str, + deleted: bool = True, + conn: Optional[Connection] = None, +) -> None: + now = int(time()) + await (conn or db).execute( + f""" + UPDATE wallets + SET deleted = :deleted, updated_at = {db.timestamp_placeholder('now')} + WHERE id = :wallet AND "user" = :user + """, + {"wallet": wallet_id, "user": user_id, "deleted": deleted, "now": now}, + ) + + +async def force_delete_wallet( + wallet_id: str, conn: Optional[Connection] = None +) -> None: + await (conn or db).execute( + "DELETE FROM wallets WHERE id = :wallet", + {"wallet": wallet_id}, + ) + + +async def delete_wallet_by_id( + wallet_id: str, conn: Optional[Connection] = None +) -> Optional[int]: + now = int(time()) + result = await (conn or db).execute( + f""" + UPDATE wallets + SET deleted = true, updated_at = {db.timestamp_placeholder('now')} + WHERE id = :wallet + """, + {"wallet": wallet_id, "now": now}, + ) + return result.rowcount + + +async def remove_deleted_wallets(conn: Optional[Connection] = None) -> None: + await (conn or db).execute("DELETE FROM wallets WHERE deleted = true") + + +async def delete_unused_wallets( + time_delta: int, + conn: Optional[Connection] = None, +) -> None: + delta = int(time()) - time_delta + await (conn or db).execute( + """ + DELETE FROM wallets + WHERE ( + SELECT COUNT(*) FROM apipayments WHERE wallet_id = wallets.id + ) = 0 AND ( + (updated_at is null AND created_at < :delta) + OR updated_at < :delta + ) + """, + {"delta": delta}, + ) + + +async def get_wallet( + wallet_id: str, deleted: Optional[bool] = None, conn: Optional[Connection] = None +) -> Optional[Wallet]: + where = "AND deleted = :deleted" if deleted is not None else "" + return await (conn or db).fetchone( + f""" + SELECT *, COALESCE(( + SELECT balance FROM balances WHERE wallet_id = wallets.id + ), 0) AS balance_msat FROM wallets + WHERE id = :wallet {where} + """, + {"wallet": wallet_id, "deleted": deleted}, + Wallet, + ) + + +async def get_wallets( + user_id: str, deleted: Optional[bool] = None, conn: Optional[Connection] = None +) -> list[Wallet]: + where = "AND deleted = :deleted" if deleted is not None else "" + return await (conn or db).fetchall( + f""" + SELECT *, COALESCE(( + SELECT balance FROM balances WHERE wallet_id = wallets.id + ), 0) AS balance_msat FROM wallets + WHERE "user" = :user {where} + """, + {"user": user_id, "deleted": deleted}, + Wallet, + ) + + +async def get_wallet_for_key( + key: str, + conn: Optional[Connection] = None, +) -> Optional[Wallet]: + return await (conn or db).fetchone( + """ + SELECT *, COALESCE(( + SELECT balance FROM balances WHERE wallet_id = wallets.id + ), 0) + AS balance_msat FROM wallets + WHERE (adminkey = :key OR inkey = :key) AND deleted = false + """, + {"key": key}, + Wallet, + ) + + +async def get_total_balance(conn: Optional[Connection] = None): + result = await (conn or db).execute("SELECT SUM(balance) FROM balances") + row = result.mappings().first() + return row.get("balance", 0) diff --git a/lnbits/core/crud/webpush.py b/lnbits/core/crud/webpush.py new file mode 100644 index 000000000..a5fa5b587 --- /dev/null +++ b/lnbits/core/crud/webpush.py @@ -0,0 +1,59 @@ +from typing import Optional + +from lnbits.core.db import db + +from ..models import WebPushSubscription + + +async def get_webpush_subscription( + endpoint: str, user: str +) -> Optional[WebPushSubscription]: + return await db.fetchone( + """ + SELECT * FROM webpush_subscriptions + WHERE endpoint = :endpoint AND "user" = :user + """, + {"endpoint": endpoint, "user": user}, + WebPushSubscription, + ) + + +async def get_webpush_subscriptions_for_user(user: str) -> list[WebPushSubscription]: + return await db.fetchall( + """SELECT * FROM webpush_subscriptions WHERE "user" = :user""", + {"user": user}, + WebPushSubscription, + ) + + +async def create_webpush_subscription( + endpoint: str, user: str, data: str, host: str +) -> WebPushSubscription: + await db.execute( + """ + INSERT INTO webpush_subscriptions (endpoint, "user", data, host) + VALUES (:endpoint, :user, :data, :host) + """, + {"endpoint": endpoint, "user": user, "data": data, "host": host}, + ) + subscription = await get_webpush_subscription(endpoint, user) + assert subscription, "Newly created webpush subscription couldn't be retrieved" + return subscription + + +async def delete_webpush_subscription(endpoint: str, user: str) -> int: + resp = await db.execute( + """ + DELETE FROM webpush_subscriptions WHERE endpoint = :endpoint AND "user" = :user + """, + {"endpoint": endpoint, "user": user}, + ) + return resp.rowcount + + +async def delete_webpush_subscriptions(endpoint: str) -> int: + resp = await db.execute( + "DELETE FROM webpush_subscriptions WHERE endpoint = :endpoint", + {"endpoint": endpoint}, + ) + return resp.rowcount diff --git a/lnbits/core/extensions/extension_manager.py b/lnbits/core/extensions/extension_manager.py index 789433a1a..280efb184 100644 --- a/lnbits/core/extensions/extension_manager.py +++ b/lnbits/core/extensions/extension_manager.py @@ -3,14 +3,14 @@ import importlib from loguru import logger +from lnbits.core import core_app_extra from lnbits.core.crud import ( - add_installed_extension, + create_installed_extension, delete_installed_extension, - get_dbversions, + get_db_version, get_installed_extension, update_installed_extension_state, ) -from lnbits.core.db import core_app_extra from lnbits.core.helpers import migrate_extension_database from lnbits.settings import settings @@ -18,22 +18,27 @@ from .models import Extension, InstallableExtension async def install_extension(ext_info: InstallableExtension) -> Extension: + ext_id = ext_info.id extension = Extension.from_installable_ext(ext_info) - installed_ext = await get_installed_extension(ext_info.id) - ext_info.payments = installed_ext.payments if installed_ext else [] + installed_ext = await get_installed_extension(ext_id) + if installed_ext: + ext_info.meta = installed_ext.meta await ext_info.download_archive() ext_info.extract_archive() - db_version = (await get_dbversions()).get(ext_info.id, 0) - await migrate_extension_database(extension, db_version) + db_version = await get_db_version(ext_id) + await migrate_extension_database(ext_info, db_version) - await add_installed_extension(ext_info) + # if the extensions does not exist in the installed extensions table, create it + # if it does exist, it will be activated later in the code + if not installed_ext: + await create_installed_extension(ext_info) if extension.is_upgrade_extension: # call stop while the old routes are still active - await stop_extension_background_work(ext_info.id) + await stop_extension_background_work(ext_id) return extension diff --git a/lnbits/core/extensions/models.py b/lnbits/core/extensions/models.py index 8273c8deb..5ceec3136 100644 --- a/lnbits/core/extensions/models.py +++ b/lnbits/core/extensions/models.py @@ -109,8 +109,8 @@ class ReleasePaymentInfo(BaseModel): class PayToEnableInfo(BaseModel): - required: Optional[bool] = False - amount: Optional[int] = None + amount: int + required: bool = False wallet: Optional[str] = None @@ -120,6 +120,7 @@ class UserExtensionInfo(BaseModel): class UserExtension(BaseModel): + user: str extension: str active: bool extra: Optional[UserExtensionInfo] = None @@ -372,29 +373,37 @@ class ExtensionRelease(BaseModel): return None +class ExtensionMeta(BaseModel): + installed_release: Optional[ExtensionRelease] = None + latest_release: Optional[ExtensionRelease] = None + pay_to_enable: Optional[PayToEnableInfo] = None + payments: list[ReleasePaymentInfo] = [] + dependencies: list[str] = [] + archive: Optional[str] = None + featured: bool = False + + class InstallableExtension(BaseModel): id: str name: str + version: str active: Optional[bool] = False short_description: Optional[str] = None icon: Optional[str] = None - dependencies: list[str] = [] - is_admin_only: bool = False stars: int = 0 - featured = False - latest_release: Optional[ExtensionRelease] = None - installed_release: Optional[ExtensionRelease] = None - payments: list[ReleasePaymentInfo] = [] - pay_to_enable: Optional[PayToEnableInfo] = None - archive: Optional[str] = None + meta: Optional[ExtensionMeta] = None + + @property + def is_admin_only(self) -> bool: + return self.id in settings.lnbits_admin_extensions @property def hash(self) -> str: - if self.installed_release: - if self.installed_release.hash: - return self.installed_release.hash + if self.meta and self.meta.installed_release: + if self.meta.installed_release.hash: + return self.meta.installed_release.hash m = hashlib.sha256() - m.update(f"{self.installed_release.archive}".encode()) + m.update(f"{self.meta.installed_release.archive}".encode()) return m.hexdigest() return "not-installed" @@ -432,15 +441,15 @@ class InstallableExtension(BaseModel): @property def installed_version(self) -> str: - if self.installed_release: - return self.installed_release.version + if self.meta and self.meta.installed_release: + return self.meta.installed_release.version return "" @property def requires_payment(self) -> bool: - if not self.pay_to_enable: + if not self.meta or not self.meta.pay_to_enable: return False - return self.pay_to_enable.required is True + return self.meta.pay_to_enable.required is True async def download_archive(self): logger.info(f"Downloading extension {self.name} ({self.installed_version}).") @@ -448,12 +457,14 @@ class InstallableExtension(BaseModel): if ext_zip_file.is_file(): os.remove(ext_zip_file) try: - assert self.installed_release, "installed_release is none." + assert ( + self.meta and self.meta.installed_release + ), "installed_release is none." self._restore_payment_info() await asyncio.to_thread( - download_url, self.installed_release.archive_url, ext_zip_file + download_url, self.meta.installed_release.archive_url, ext_zip_file ) self._remember_payment_info() @@ -463,7 +474,11 @@ class InstallableExtension(BaseModel): raise AssertionError("Cannot fetch extension archive file") from exc archive_hash = file_hash(ext_zip_file) - if self.installed_release.hash and self.installed_release.hash != archive_hash: + if ( + self.meta + and self.meta.installed_release.hash + and self.meta.installed_release.hash != archive_hash + ): # remove downloaded archive if ext_zip_file.is_file(): os.remove(ext_zip_file) @@ -497,17 +512,18 @@ class InstallableExtension(BaseModel): self.short_description = config_json.get("short_description") if ( - self.installed_release - and self.installed_release.is_github_release + self.meta + and self.meta.installed_release + and self.meta.installed_release.is_github_release and config_json.get("tile") ): self.icon = icon_to_github_url( - self.installed_release.source_repo, config_json.get("tile") + self.meta.installed_release.source_repo, config_json.get("tile") ) shutil.rmtree(self.ext_dir, True) shutil.copytree(Path(self.ext_upgrade_dir), Path(self.ext_dir)) - logger.success(f"Extension {self.name} ({self.installed_version}) installed.") + logger.info(f"Extension {self.name} ({self.installed_version}) extracted.") def clean_extension_files(self): # remove downloaded archive @@ -522,64 +538,54 @@ class InstallableExtension(BaseModel): def check_latest_version(self, release: Optional[ExtensionRelease]): if not release: return - if not self.latest_release: - self.latest_release = release + if not self.meta or not self.meta.latest_release: + meta = self.meta or ExtensionMeta() + meta.latest_release = release + self.meta = meta return - if version_parse(self.latest_release.version) < version_parse(release.version): - self.latest_release = release + if version_parse(self.meta.latest_release.version) < version_parse( + release.version + ): + self.meta.latest_release = release def find_existing_payment( self, pay_link: Optional[str] ) -> Optional[ReleasePaymentInfo]: - if not pay_link: + if not pay_link or not self.meta or not self.meta.payments: return None return next( - (p for p in self.payments if p.pay_link == pay_link), + (p for p in self.meta.payments if p.pay_link == pay_link), None, ) def _restore_payment_info(self): - if not self.installed_release: + if ( + not self.meta + or not self.meta.installed_release + or not self.meta.installed_release.pay_link + or not self.meta.installed_release.payment_hash + ): return - if not self.installed_release.pay_link: - return - if self.installed_release.payment_hash: - return - payment_info = self.find_existing_payment(self.installed_release.pay_link) + payment_info = self.find_existing_payment(self.meta.installed_release.pay_link) if payment_info: - self.installed_release.payment_hash = payment_info.payment_hash + self.meta.installed_release.payment_hash = payment_info.payment_hash def _remember_payment_info(self): - if not self.installed_release or not self.installed_release.pay_link: + if ( + not self.meta + or not self.meta.installed_release + or not self.meta.installed_release.pay_link + ): return payment_info = ReleasePaymentInfo( - amount=self.installed_release.cost_sats, - pay_link=self.installed_release.pay_link, - payment_hash=self.installed_release.payment_hash, + amount=self.meta.installed_release.cost_sats, + pay_link=self.meta.installed_release.pay_link, + payment_hash=self.meta.installed_release.payment_hash, ) - self.payments = [ - p for p in self.payments if p.pay_link != payment_info.pay_link + self.meta.payments = [ + p for p in self.meta.payments if p.pay_link != payment_info.pay_link ] - self.payments.append(payment_info) - - @classmethod - def from_row(cls, data: dict) -> InstallableExtension: - meta = json.loads(data["meta"]) - ext = InstallableExtension(**data) - if "installed_release" in meta: - ext.installed_release = ExtensionRelease(**meta["installed_release"]) - if meta.get("pay_to_enable"): - ext.pay_to_enable = PayToEnableInfo(**meta["pay_to_enable"]) - if meta.get("payments"): - ext.payments = [ReleasePaymentInfo(**p) for p in meta["payments"]] - - return ext - - @classmethod - def from_rows(cls, rows: Optional[list[Any]] = None) -> list[InstallableExtension]: - if rows is None: - rows = [] - return [InstallableExtension.from_row(row) for row in rows] + self.meta.payments.append(payment_info) @classmethod async def from_github_release( @@ -593,14 +599,17 @@ class InstallableExtension(BaseModel): return InstallableExtension( id=github_release.id, name=config.name, + version=latest_release.tag_name, short_description=config.short_description, stars=int(repo.stargazers_count), icon=icon_to_github_url( source_repo, config.tile, ), - latest_release=ExtensionRelease.from_github_release( - source_repo, latest_release + meta=ExtensionMeta( + latest_release=ExtensionRelease.from_github_release( + source_repo, latest_release + ), ), ) except Exception as e: @@ -609,13 +618,14 @@ class InstallableExtension(BaseModel): @classmethod def from_explicit_release(cls, e: ExplicitRelease) -> InstallableExtension: + meta = ExtensionMeta(archive=e.archive, dependencies=e.dependencies) return InstallableExtension( id=e.id, name=e.name, - archive=e.archive, + version=e.version, short_description=e.short_description, icon=e.icon, - dependencies=e.dependencies, + meta=meta, ) @classmethod @@ -636,11 +646,13 @@ class InstallableExtension(BaseModel): existing_ext = next( (ee for ee in extension_list if ee.id == r.id), None ) - if existing_ext: - existing_ext.check_latest_version(ext.latest_release) + if existing_ext and ext.meta: + existing_ext.check_latest_version(ext.meta.latest_release) continue - ext.featured = ext.id in manifest.featured + meta = ext.meta or ExtensionMeta() + meta.featured = ext.id in manifest.featured + ext.meta = meta extension_list += [ext] extension_id_list += [ext.id] @@ -654,7 +666,9 @@ class InstallableExtension(BaseModel): continue ext = InstallableExtension.from_explicit_release(e) ext.check_latest_version(release) - ext.featured = ext.id in manifest.featured + meta = ext.meta or ExtensionMeta() + meta.featured = ext.id in manifest.featured + ext.meta = meta extension_list += [ext] extension_id_list += [e.id] except Exception as e: diff --git a/lnbits/core/helpers.py b/lnbits/core/helpers.py index 5d2dd286f..af8b38ae4 100644 --- a/lnbits/core/helpers.py +++ b/lnbits/core/helpers.py @@ -1,6 +1,6 @@ import importlib import re -from typing import Any +from typing import Any, Optional from urllib.parse import urlparse from uuid import UUID @@ -8,39 +8,45 @@ from loguru import logger from lnbits.core import migrations as core_migrations from lnbits.core.crud import ( - get_dbversions, + get_db_versions, get_installed_extensions, update_migration_version, ) from lnbits.core.db import db as core_db -from lnbits.core.extensions.models import ( - Extension, -) +from lnbits.core.extensions.models import InstallableExtension +from lnbits.core.models import DbVersion from lnbits.db import COCKROACH, POSTGRES, SQLITE, Connection from lnbits.settings import settings -async def migrate_extension_database(ext: Extension, current_version): +async def migrate_extension_database( + ext: InstallableExtension, current_version: Optional[DbVersion] = None +): + try: ext_migrations = importlib.import_module(f"{ext.module_name}.migrations") ext_db = importlib.import_module(ext.module_name).db except ImportError as exc: logger.error(exc) - raise ImportError(f"Cannot import module for extension '{ext.code}'.") from exc + raise ImportError(f"Cannot import module for extension '{ext.id}'.") from exc async with ext_db.connect() as ext_conn: - await run_migration(ext_conn, ext_migrations, ext.code, current_version) + await run_migration(ext_conn, ext_migrations, ext.id, current_version) async def run_migration( - db: Connection, migrations_module: Any, db_name: str, current_version: int + db: Connection, + migrations_module: Any, + db_name: str, + current_version: Optional[DbVersion] = None, ): matcher = re.compile(r"^m(\d\d\d)_") - for key, migrate in migrations_module.__dict__.items(): + + for key, migrate in list(migrations_module.__dict__.items()): match = matcher.match(key) if match: version = int(match.group(1)) - if version > current_version: + if not current_version or version > current_version.version: logger.debug(f"running migration {db_name}.{version}") print(f"running migration {db_name}.{version}") await migrate(db) @@ -87,21 +93,31 @@ async def migrate_databases(): if not exists: await core_migrations.m000_create_migrations_table(conn) - current_versions = await get_dbversions(conn) - core_version = current_versions.get("core", 0) + current_versions = await get_db_versions(conn) + core_version = next( + (v for v in current_versions if v.db == "core"), + DbVersion(db="core", version=0), + ) await run_migration(conn, core_migrations, "core", core_version) # here is the first place we can be sure that the # `installed_extensions` table has been created await load_disabled_extension_list() - # todo: revisit, use installed extensions - for ext in Extension.get_valid_extensions(False): - current_version = current_versions.get(ext.code, 0) + for ext in await get_installed_extensions(): + current_version = next( + (v for v in current_versions if v.db == ext.id), + DbVersion(db=ext.id, version=0), + ) + if current_version is None: + logger.warning( + f"Extension {ext.id} has no migration version. This should not happen." + ) + continue try: await migrate_extension_database(ext, current_version) except Exception as e: - logger.exception(f"Error migrating extension {ext.code}: {e}") + logger.exception(f"Error migrating extension {ext.id}: {e}") logger.info("✔️ All migrations done.") diff --git a/lnbits/core/migrations.py b/lnbits/core/migrations.py index 24d09056a..352f79041 100644 --- a/lnbits/core/migrations.py +++ b/lnbits/core/migrations.py @@ -1,9 +1,11 @@ +import json from time import time from loguru import logger from sqlalchemy.exc import OperationalError from lnbits import bolt11 +from lnbits.db import Connection async def m000_create_migrations_table(db): @@ -99,9 +101,8 @@ async def m002_add_fields_to_apipayments(db): await db.execute("ALTER TABLE apipayments ADD COLUMN bolt11 TEXT") await db.execute("ALTER TABLE apipayments ADD COLUMN extra TEXT") - import json - - rows = await db.fetchall("SELECT * FROM apipayments") + result = await db.execute("SELECT * FROM apipayments") + rows = result.mappings().all() for row in rows: if not row["memo"] or not row["memo"].startswith("#"): continue @@ -211,7 +212,7 @@ async def m007_set_invoice_expiries(db): Precomputes invoice expiry for existing pending incoming payments. """ try: - rows = await db.fetchall( + result = await db.execute( f""" SELECT bolt11, checking_id FROM apipayments @@ -222,6 +223,7 @@ async def m007_set_invoice_expiries(db): AND time < {db.timestamp_now} """ ) + rows = result.mappings().all() if len(rows): logger.info(f"Migration: Checking expiry of {len(rows)} invoices") for i, ( @@ -339,7 +341,7 @@ async def m014_set_deleted_wallets(db): Sets deleted column to wallets. """ try: - rows = await db.fetchall( + result = await db.execute( """ SELECT * FROM wallets @@ -348,12 +350,13 @@ async def m014_set_deleted_wallets(db): AND inkey LIKE 'del:%' """ ) + rows = result.mappings().all() for row in rows: try: - user = row[2].split(":")[1] - adminkey = row[3].split(":")[1] - inkey = row[4].split(":")[1] + user = row["user"].split(":")[1] + adminkey = row["adminkey"].split(":")[1] + inkey = row["inkey"].split(":")[1] await db.execute( """ UPDATE wallets SET @@ -541,8 +544,6 @@ async def m021_add_success_failed_to_apipayments(db): GROUP BY apipayments.wallet """ ) - # TODO: drop column in next release - # await db.execute("ALTER TABLE apipayments DROP COLUMN pending") async def m022_add_pubkey_to_accounts(db): @@ -553,3 +554,78 @@ async def m022_add_pubkey_to_accounts(db): await db.execute("ALTER TABLE accounts ADD COLUMN pubkey TEXT") except OperationalError: pass + + +async def m023_add_column_column_to_apipayments(db): + """ + renames hash to payment_hash and drops unused index + """ + await db.execute("DROP INDEX by_hash") + await db.execute("ALTER TABLE apipayments RENAME COLUMN hash TO payment_hash") + await db.execute("ALTER TABLE apipayments RENAME COLUMN wallet TO wallet_id") + await db.execute("ALTER TABLE accounts RENAME COLUMN pass TO password_hash") + + await db.execute("CREATE INDEX by_hash ON apipayments (payment_hash)") + + +async def m024_drop_pending(db): + await db.execute("ALTER TABLE apipayments DROP COLUMN pending") + + +async def m025_refresh_view(db): + await db.execute("DROP VIEW balances") + await db.execute( + """ + CREATE VIEW balances AS + SELECT apipayments.wallet_id, + SUM(apipayments.amount - ABS(apipayments.fee)) AS balance + FROM wallets + LEFT JOIN apipayments ON apipayments.wallet_id = wallets.id + WHERE (wallets.deleted = false OR wallets.deleted is NULL) + AND ( + (apipayments.status = 'success' AND apipayments.amount > 0) + OR (apipayments.status IN ('success', 'pending') AND apipayments.amount < 0) + ) + GROUP BY apipayments.wallet_id + """ + ) + + +async def m026_update_payment_table(db): + await db.execute("ALTER TABLE apipayments ADD COLUMN tag TEXT") + await db.execute("ALTER TABLE apipayments ADD COLUMN extension TEXT") + await db.execute("ALTER TABLE apipayments ADD COLUMN created_at TIMESTAMP") + await db.execute("ALTER TABLE apipayments ADD COLUMN updated_at TIMESTAMP") + + +async def m027_update_apipayments_data(db: Connection): + result = None + try: + result = await db.execute("SELECT * FROM apipayments") + except Exception as exc: + logger.warning("Could not select, trying again after cache cleared.") + logger.debug(exc) + await db.execute("COMMIT") + + result = await db.execute("SELECT * FROM apipayments") + + payments = result.mappings().all() + for payment in payments: + tag = None + created_at = payment.get("time") + if payment.get("extra"): + extra = json.loads(payment.get("extra")) + tag = extra.get("tag") + tsph = db.timestamp_placeholder("created_at") + await db.execute( + f""" + UPDATE apipayments + SET tag = :tag, created_at = {tsph}, updated_at = {tsph} + WHERE checking_id = :checking_id + """, + { + "tag": tag, + "created_at": created_at, + "checking_id": payment.get("checking_id"), + }, + ) diff --git a/lnbits/core/models.py b/lnbits/core/models.py index d246aac54..a86620cd3 100644 --- a/lnbits/core/models.py +++ b/lnbits/core/models.py @@ -1,19 +1,18 @@ from __future__ import annotations -import datetime import hashlib import hmac -import json -import time from dataclasses import dataclass +from datetime import datetime, timezone from enum import Enum from typing import Callable, Optional from ecdsa import SECP256k1, SigningKey from fastapi import Query -from pydantic import BaseModel, validator +from passlib.context import CryptContext +from pydantic import BaseModel, Field, validator -from lnbits.db import FilterModel, FromRowModel +from lnbits.db import FilterModel from lnbits.helpers import url_for from lnbits.lnurl import encode as lnurl_encode from lnbits.settings import settings @@ -35,16 +34,21 @@ class BaseWallet(BaseModel): balance_msat: int -class Wallet(BaseWallet): +class Wallet(BaseModel): + id: str user: str - currency: Optional[str] - deleted: bool - created_at: Optional[int] = None - updated_at: Optional[int] = None + name: str + adminkey: str + inkey: str + deleted: bool = False + created_at: datetime = datetime.now(timezone.utc) + updated_at: datetime = datetime.now(timezone.utc) + currency: Optional[str] = None + balance_msat: int = Field(default=0, no_database=True) @property def balance(self) -> int: - return self.balance_msat // 1000 + return int(self.balance_msat // 1000) @property def withdrawable_balance(self) -> int: @@ -68,11 +72,6 @@ class Wallet(BaseWallet): linking_key, curve=SECP256k1, hashfunc=hashlib.sha256 ) - async def get_payment(self, payment_hash: str) -> Optional[Payment]: - from .crud import get_standalone_payment - - return await get_standalone_payment(payment_hash) - class KeyType(Enum): admin = 0 @@ -90,7 +89,7 @@ class WalletTypeInfo: wallet: Wallet -class UserConfig(BaseModel): +class UserExtra(BaseModel): email_verified: Optional[bool] = False first_name: Optional[str] = None last_name: Optional[str] = None @@ -103,16 +102,43 @@ class UserConfig(BaseModel): provider: Optional[str] = "lnbits" # auth provider -class Account(FromRowModel): +class Account(BaseModel): id: str - is_super_user: Optional[bool] = False - is_admin: Optional[bool] = False username: Optional[str] = None + password_hash: Optional[str] = None + pubkey: Optional[str] = None email: Optional[str] = None - balance_msat: Optional[int] = 0 + extra: UserExtra = UserExtra() + created_at: datetime = datetime.now(timezone.utc) + updated_at: datetime = datetime.now(timezone.utc) + + @property + def is_super_user(self) -> bool: + return self.id == settings.super_user + + @property + def is_admin(self) -> bool: + return self.id in settings.lnbits_admin_users or self.is_super_user + + def hash_password(self, password: str) -> str: + """sets and returns the hashed password""" + pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + self.password_hash = pwd_context.hash(password) + return self.password_hash + + def verify_password(self, password: str) -> bool: + """returns True if the password matches the hash""" + if not self.password_hash: + return False + pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + return pwd_context.verify(password, self.password_hash) + + +class AccountOverview(Account): transaction_count: Optional[int] = 0 wallet_count: Optional[int] = 0 - last_payment: Optional[datetime.datetime] = None + balance_msat: Optional[int] = 0 + last_payment: Optional[datetime] = None class AccountFilters(FilterModel): @@ -127,7 +153,7 @@ class AccountFilters(FilterModel): ] id: str - last_payment: Optional[datetime.datetime] = None + last_payment: Optional[datetime] = None transaction_count: Optional[int] = None wallet_count: Optional[int] = None username: Optional[str] = None @@ -136,6 +162,8 @@ class AccountFilters(FilterModel): class User(BaseModel): id: str + created_at: datetime + updated_at: datetime email: Optional[str] = None username: Optional[str] = None pubkey: Optional[str] = None @@ -144,9 +172,7 @@ class User(BaseModel): admin: bool = False super_user: bool = False has_password: bool = False - config: Optional[UserConfig] = None - created_at: Optional[int] = None - updated_at: Optional[int] = None + extra: UserExtra = UserExtra() @property def wallet_ids(self) -> list[str]: @@ -178,7 +204,7 @@ class UpdateUser(BaseModel): user_id: str email: Optional[str] = Query(default=None) username: Optional[str] = Query(default=..., min_length=2, max_length=20) - config: Optional[UserConfig] = None + extra: Optional[UserExtra] = None class UpdateUserPassword(BaseModel): @@ -231,36 +257,55 @@ class PaymentState(str, Enum): return self.value +class PaymentExtra(BaseModel): + comment: Optional[str] = None + success_action: Optional[str] = None + lnurl_response: Optional[str] = None + + +class PayInvoice(BaseModel): + payment_request: str + description: Optional[str] = None + max_sat: Optional[int] = None + extra: Optional[dict] = {} + + class CreatePayment(BaseModel): wallet_id: str - payment_request: str payment_hash: str - amount: int + bolt11: str + amount_msat: int memo: str + extra: Optional[dict] = {} preimage: Optional[str] = None - expiry: Optional[datetime.datetime] = None - extra: Optional[dict] = None + expiry: Optional[datetime] = None webhook: Optional[str] = None fee: int = 0 -class Payment(FromRowModel): - status: str - # TODO should be removed in the future, backward compatibility - pending: bool +class Payment(BaseModel): checking_id: str + payment_hash: str + wallet_id: str amount: int fee: int - memo: Optional[str] - time: int bolt11: str - preimage: str - payment_hash: str - expiry: Optional[float] - extra: Optional[dict] - wallet_id: str - webhook: Optional[str] - webhook_status: Optional[int] + status: str = PaymentState.PENDING + memo: Optional[str] = None + expiry: Optional[datetime] = None + webhook: Optional[str] = None + webhook_status: Optional[int] = None + preimage: Optional[str] = None + tag: Optional[str] = None + extension: Optional[str] = None + time: datetime = datetime.now(timezone.utc) + created_at: datetime = datetime.now(timezone.utc) + updated_at: datetime = datetime.now(timezone.utc) + extra: dict = {} + + @property + def pending(self) -> bool: + return self.status == PaymentState.PENDING.value @property def success(self) -> bool: @@ -270,33 +315,6 @@ class Payment(FromRowModel): def failed(self) -> bool: return self.status == PaymentState.FAILED.value - @classmethod - def from_row(cls, row: dict): - return cls( - checking_id=row["checking_id"], - payment_hash=row["hash"] or "0" * 64, - bolt11=row["bolt11"] or "", - preimage=row["preimage"] or "0" * 64, - extra=json.loads(row["extra"] or "{}"), - status=row["status"], - # TODO should be removed in the future, backward compatibility - pending=row["status"] == PaymentState.PENDING.value, - amount=row["amount"], - fee=row["fee"], - memo=row["memo"], - time=row["time"], - expiry=row["expiry"], - wallet_id=row["wallet"], - webhook=row["webhook"], - webhook_status=row["webhook_status"], - ) - - @property - def tag(self) -> Optional[str]: - if self.extra is None: - return "" - return self.extra.get("tag") - @property def msat(self) -> int: return self.amount @@ -315,7 +333,7 @@ class Payment(FromRowModel): @property def is_expired(self) -> bool: - return self.expiry < time.time() if self.expiry else False + return self.expiry < datetime.now(timezone.utc) if self.expiry else False @property def is_internal(self) -> bool: @@ -343,11 +361,11 @@ class PaymentFilters(FilterModel): amount: int fee: int memo: Optional[str] - time: datetime.datetime + time: datetime bolt11: str preimage: str payment_hash: str - expiry: Optional[datetime.datetime] + expiry: Optional[datetime] extra: dict = {} wallet_id: str webhook: Optional[str] @@ -355,7 +373,7 @@ class PaymentFilters(FilterModel): class PaymentHistoryPoint(BaseModel): - date: datetime.datetime + date: datetime income: int spending: int balance: int @@ -377,10 +395,6 @@ class TinyURL(BaseModel): wallet: str time: float - @classmethod - def from_row(cls, row: dict): - return cls(**dict(row)) - class ConversionData(BaseModel): from_: str = "sat" @@ -425,7 +439,6 @@ class CreateInvoice(BaseModel): def unit_is_from_allowed_currencies(cls, v): if v != "sat" and v not in allowed_currencies(): raise ValueError("The provided unit is not supported") - return v @@ -451,7 +464,7 @@ class WebPushSubscription(BaseModel): user: str data: str host: str - timestamp: str + timestamp: datetime class BalanceDelta(BaseModel): @@ -466,3 +479,8 @@ class BalanceDelta(BaseModel): class SimpleStatus(BaseModel): success: bool message: str + + +class DbVersion(BaseModel): + db: str + version: int diff --git a/lnbits/core/services.py b/lnbits/core/services.py deleted file mode 100644 index 674aa4dc1..000000000 --- a/lnbits/core/services.py +++ /dev/null @@ -1,926 +0,0 @@ -import asyncio -import json -import time -from io import BytesIO -from pathlib import Path -from typing import Optional -from urllib.parse import parse_qs, urlparse -from uuid import UUID, uuid4 - -import httpx -from bolt11 import MilliSatoshi -from bolt11 import decode as bolt11_decode -from cryptography.hazmat.primitives import serialization -from fastapi import Depends, WebSocket -from loguru import logger -from passlib.context import CryptContext -from py_vapid import Vapid -from py_vapid.utils import b64urlencode - -from lnbits.core.db import db -from lnbits.db import Connection -from lnbits.decorators import ( - WalletTypeInfo, - check_user_extension_access, - require_admin_key, -) -from lnbits.exceptions import InvoiceError, PaymentError -from lnbits.helpers import url_for -from lnbits.lnurl import LnurlErrorResponse -from lnbits.lnurl import decode as decode_lnurl -from lnbits.settings import ( - EditableSettings, - SuperSettings, - readonly_variables, - send_admin_user_to_saas, - settings, -) -from lnbits.utils.exchange_rates import fiat_amount_as_satoshis, satoshis_amount_as_fiat -from lnbits.wallets import fake_wallet, get_funding_source, set_funding_source -from lnbits.wallets.base import ( - PaymentPendingStatus, - PaymentResponse, - PaymentStatus, - PaymentSuccessStatus, -) - -from .crud import ( - check_internal, - check_internal_pending, - create_account, - create_admin_settings, - create_payment, - create_wallet, - get_account, - get_account_by_email, - get_account_by_username, - get_payments, - get_standalone_payment, - get_super_settings, - get_total_balance, - get_wallet, - get_wallet_payment, - update_admin_settings, - update_payment_details, - update_payment_status, - update_super_user, - update_user_extension, -) -from .helpers import to_valid_user_id -from .models import ( - BalanceDelta, - CreatePayment, - Payment, - PaymentState, - User, - UserConfig, - Wallet, -) - - -async def calculate_fiat_amounts( - amount: float, - wallet_id: str, - currency: Optional[str] = None, - extra: Optional[dict] = None, - conn: Optional[Connection] = None, -) -> tuple[int, Optional[dict]]: - wallet = await get_wallet(wallet_id, conn=conn) - assert wallet, "invalid wallet_id" - wallet_currency = wallet.currency or settings.lnbits_default_accounting_currency - - if currency and currency != "sat": - amount_sat = await fiat_amount_as_satoshis(amount, currency) - extra = extra or {} - if currency != wallet_currency: - extra["fiat_currency"] = currency - extra["fiat_amount"] = round(amount, ndigits=3) - extra["fiat_rate"] = amount_sat / amount - else: - amount_sat = int(amount) - - if wallet_currency: - if wallet_currency == currency: - fiat_amount = amount - else: - fiat_amount = await satoshis_amount_as_fiat(amount_sat, wallet_currency) - extra = extra or {} - extra["wallet_fiat_currency"] = wallet_currency - extra["wallet_fiat_amount"] = round(fiat_amount, ndigits=3) - extra["wallet_fiat_rate"] = amount_sat / fiat_amount - - logger.debug( - f"Calculated fiat amounts {wallet.id=} {amount=} {currency=}: {extra=}" - ) - - return amount_sat, extra - - -async def create_invoice( - *, - wallet_id: str, - amount: float, - currency: Optional[str] = "sat", - memo: str, - description_hash: Optional[bytes] = None, - unhashed_description: Optional[bytes] = None, - expiry: Optional[int] = None, - extra: Optional[dict] = None, - webhook: Optional[str] = None, - internal: Optional[bool] = False, - conn: Optional[Connection] = None, -) -> tuple[str, str]: - if not amount > 0: - raise InvoiceError("Amountless invoices not supported.", status="failed") - - user_wallet = await get_wallet(wallet_id, conn=conn) - if not user_wallet: - raise InvoiceError(f"Could not fetch wallet '{wallet_id}'.", status="failed") - - invoice_memo = None if description_hash else memo - - # use the fake wallet if the invoice is for internal use only - funding_source = fake_wallet if internal else get_funding_source() - - amount_sat, extra = await calculate_fiat_amounts( - amount, wallet_id, currency=currency, extra=extra, conn=conn - ) - - if settings.is_wallet_max_balance_exceeded( - user_wallet.balance_msat / 1000 + amount_sat - ): - raise InvoiceError( - f"Wallet balance cannot exceed " - f"{settings.lnbits_wallet_limit_max_balance} sats.", - status="failed", - ) - - ( - ok, - checking_id, - payment_request, - error_message, - ) = await funding_source.create_invoice( - amount=amount_sat, - memo=invoice_memo, - description_hash=description_hash, - unhashed_description=unhashed_description, - expiry=expiry or settings.lightning_invoice_expiry, - ) - if not ok or not payment_request or not checking_id: - raise InvoiceError( - error_message or "unexpected backend error.", status="pending" - ) - - invoice = bolt11_decode(payment_request) - - create_payment_model = CreatePayment( - wallet_id=wallet_id, - payment_request=payment_request, - payment_hash=invoice.payment_hash, - amount=amount_sat * 1000, - expiry=invoice.expiry_date, - memo=memo, - extra=extra, - webhook=webhook, - ) - - await create_payment( - checking_id=checking_id, - data=create_payment_model, - conn=conn, - ) - - return invoice.payment_hash, payment_request - - -async def pay_invoice( - *, - wallet_id: str, - payment_request: str, - max_sat: Optional[int] = None, - extra: Optional[dict] = None, - description: str = "", - conn: Optional[Connection] = None, -) -> str: - """ - Pay a Lightning invoice. - First, we create a temporary payment in the database with fees set to the reserve - fee. We then check whether the balance of the payer would go negative. - We then attempt to pay the invoice through the backend. If the payment is - successful, we update the payment in the database with the payment details. - If the payment is unsuccessful, we delete the temporary payment. - If the payment is still in flight, we hope that some other process - will regularly check for the payment. - """ - try: - invoice = bolt11_decode(payment_request) - except Exception as exc: - raise PaymentError("Bolt11 decoding failed.", status="failed") from exc - - if not invoice.amount_msat or not invoice.amount_msat > 0: - raise PaymentError("Amountless invoices not supported.", status="failed") - - if max_sat and invoice.amount_msat > max_sat * 1000: - raise PaymentError("Amount in invoice is too high.", status="failed") - - await check_wallet_limits(wallet_id, conn, invoice.amount_msat) - - async with db.reuse_conn(conn) if conn else db.connect() as conn: - temp_id = invoice.payment_hash - internal_id = f"internal_{invoice.payment_hash}" - - _, extra = await calculate_fiat_amounts( - invoice.amount_msat / 1000, wallet_id, extra=extra, conn=conn - ) - - create_payment_model = CreatePayment( - wallet_id=wallet_id, - payment_request=payment_request, - payment_hash=invoice.payment_hash, - amount=-invoice.amount_msat, - expiry=invoice.expiry_date, - memo=description or invoice.description or "", - extra=extra, - ) - - # we check if an internal invoice exists that has already been paid - # (not pending anymore) - if not await check_internal_pending(invoice.payment_hash, conn=conn): - raise PaymentError("Internal invoice already paid.", status="failed") - - # check_internal() returns the checking_id of the invoice we're waiting for - # (pending only) - internal_checking_id = await check_internal(invoice.payment_hash, conn=conn) - if internal_checking_id: - # perform additional checks on the internal payment - # the payment hash is not enough to make sure that this is the same invoice - internal_invoice = await get_standalone_payment( - internal_checking_id, incoming=True, conn=conn - ) - assert internal_invoice is not None - if ( - internal_invoice.amount != invoice.amount_msat - or internal_invoice.bolt11 != payment_request.lower() - ): - raise PaymentError("Invalid invoice.", status="failed") - - logger.debug(f"creating temporary internal payment with id {internal_id}") - # create a new payment from this wallet - - fee_reserve_total_msat = fee_reserve_total( - invoice.amount_msat, internal=True - ) - create_payment_model.fee = service_fee(invoice.amount_msat, True) - new_payment = await create_payment( - checking_id=internal_id, - data=create_payment_model, - status=PaymentState.SUCCESS, - conn=conn, - ) - else: - new_payment = await _create_external_payment( - temp_id=temp_id, - amount_msat=invoice.amount_msat, - data=create_payment_model, - conn=conn, - ) - - # do the balance check - wallet = await get_wallet(wallet_id, conn=conn) - assert wallet, "Wallet for balancecheck could not be fetched" - fee_reserve_total_msat = fee_reserve_total(invoice.amount_msat, internal=False) - _check_wallet_balance(wallet, fee_reserve_total_msat, internal_checking_id) - - if extra and "tag" in extra: - # check if the payment is made for an extension that the user disabled - status = await check_user_extension_access(wallet.user, extra["tag"]) - if not status.success: - raise PaymentError(status.message) - - if internal_checking_id: - service_fee_msat = service_fee(invoice.amount_msat, internal=True) - logger.debug(f"marking temporary payment as not pending {internal_checking_id}") - # mark the invoice from the other side as not pending anymore - # so the other side only has access to his new money when we are sure - # the payer has enough to deduct from - async with db.connect() as conn: - await update_payment_status( - checking_id=internal_checking_id, - status=PaymentState.SUCCESS, - conn=conn, - ) - await send_payment_notification(wallet, new_payment) - - # notify receiver asynchronously - from lnbits.tasks import internal_invoice_queue - - logger.debug(f"enqueuing internal invoice {internal_checking_id}") - await internal_invoice_queue.put(internal_checking_id) - else: - fee_reserve_msat = fee_reserve(invoice.amount_msat, internal=False) - service_fee_msat = service_fee(invoice.amount_msat, internal=False) - logger.debug(f"backend: sending payment {temp_id}") - # actually pay the external invoice - funding_source = get_funding_source() - payment: PaymentResponse = await funding_source.pay_invoice( - payment_request, fee_reserve_msat - ) - - if payment.checking_id and payment.checking_id != temp_id: - logger.warning( - f"backend sent unexpected checking_id (expected: {temp_id} got:" - f" {payment.checking_id})" - ) - - logger.debug(f"backend: pay_invoice finished {temp_id}, {payment}") - if payment.checking_id and payment.ok is not False: - # payment.ok can be True (paid) or None (pending)! - logger.debug(f"updating payment {temp_id}") - async with db.connect() as conn: - await update_payment_details( - checking_id=temp_id, - status=( - PaymentState.SUCCESS - if payment.ok is True - else PaymentState.PENDING - ), - fee=-( - abs(payment.fee_msat if payment.fee_msat else 0) - + abs(service_fee_msat) - ), - preimage=payment.preimage, - new_checking_id=payment.checking_id, - conn=conn, - ) - wallet = await get_wallet(wallet_id, conn=conn) - updated = await get_wallet_payment( - wallet_id, payment.checking_id, conn=conn - ) - if wallet and updated and updated.success: - await send_payment_notification(wallet, updated) - logger.success(f"payment successful {payment.checking_id}") - elif payment.checking_id is None and payment.ok is False: - # payment failed - logger.debug(f"payment failed {temp_id}, {payment.error_message}") - async with db.connect() as conn: - await update_payment_status( - checking_id=temp_id, - status=PaymentState.FAILED, - conn=conn, - ) - raise PaymentError( - f"Payment failed: {payment.error_message}" - or "Payment failed, but backend didn't give us an error message.", - status="failed", - ) - else: - logger.warning( - "didn't receive checking_id from backend, payment may be stuck in" - f" database: {temp_id}" - ) - - # credit service fee wallet - if settings.lnbits_service_fee_wallet and service_fee_msat: - create_payment_model = CreatePayment( - wallet_id=settings.lnbits_service_fee_wallet, - payment_request=payment_request, - payment_hash=invoice.payment_hash, - amount=abs(service_fee_msat), - memo="Service fee", - ) - new_payment = await create_payment( - checking_id=f"service_fee_{temp_id}", - data=create_payment_model, - status=PaymentState.SUCCESS, - ) - return invoice.payment_hash - - -async def _create_external_payment( - temp_id: str, - amount_msat: MilliSatoshi, - data: CreatePayment, - conn: Optional[Connection], -) -> Payment: - fee_reserve_total_msat = fee_reserve_total(amount_msat, internal=False) - # check if there is already a payment with the same checking_id - old_payment = await get_standalone_payment(temp_id, conn=conn) - if old_payment: - # fail on pending payments - if old_payment.pending: - raise PaymentError("Payment is still pending.", status="pending") - if old_payment.success: - raise PaymentError("Payment already paid.", status="success") - if old_payment.failed: - status = await old_payment.check_status() - if status.success: - # payment was successful on the fundingsource - await update_payment_status( - checking_id=temp_id, status=PaymentState.SUCCESS, conn=conn - ) - raise PaymentError( - "Failed payment was already paid on the fundingsource.", - status="success", - ) - if status.failed: - raise PaymentError( - "Payment is failed node, retrying is not possible.", status="failed" - ) - # status.pending fall through and try again - return old_payment - - logger.debug(f"creating temporary payment with id {temp_id}") - # create a temporary payment here so we can check if - # the balance is enough in the next step - try: - data.fee = -abs(fee_reserve_total_msat) - new_payment = await create_payment( - checking_id=temp_id, - data=data, - conn=conn, - ) - return new_payment - except Exception as exc: - logger.error(f"could not create temporary payment: {exc}") - # happens if the same wallet tries to pay an invoice twice - raise PaymentError("Could not make payment", status="failed") from exc - - -def _check_wallet_balance( - wallet: Wallet, - fee_reserve_total_msat: int, - internal_checking_id: Optional[str] = None, -): - if wallet.balance_msat < 0: - logger.debug("balance is too low, deleting temporary payment") - if not internal_checking_id and wallet.balance_msat > -fee_reserve_total_msat: - raise PaymentError( - f"You must reserve at least ({round(fee_reserve_total_msat/1000)}" - " sat) to cover potential routing fees.", - status="failed", - ) - raise PaymentError("Insufficient balance.", status="failed") - - -async def check_wallet_limits(wallet_id, conn, amount_msat): - await check_time_limit_between_transactions(conn, wallet_id) - await check_wallet_daily_withdraw_limit(conn, wallet_id, amount_msat) - - -async def check_time_limit_between_transactions(conn, wallet_id): - limit = settings.lnbits_wallet_limit_secs_between_trans - if not limit or limit <= 0: - return - - payments = await get_payments( - since=int(time.time()) - limit, - wallet_id=wallet_id, - limit=1, - conn=conn, - ) - - if len(payments) == 0: - return - - raise PaymentError( - status="failed", - message=f"The time limit of {limit} seconds between payments has been reached.", - ) - - -async def check_wallet_daily_withdraw_limit(conn, wallet_id, amount_msat): - limit = settings.lnbits_wallet_limit_daily_max_withdraw - if not limit: - return - if limit < 0: - raise ValueError("It is not allowed to spend funds from this server.") - - payments = await get_payments( - since=int(time.time()) - 60 * 60 * 24, - outgoing=True, - wallet_id=wallet_id, - limit=1, - conn=conn, - ) - if len(payments) == 0: - return - - total = 0 - for pay in payments: - total += pay.amount - total = total - amount_msat - if limit * 1000 + total < 0: - raise ValueError( - "Daily withdrawal limit of " - + str(settings.lnbits_wallet_limit_daily_max_withdraw) - + " sats reached." - ) - - -async def redeem_lnurl_withdraw( - wallet_id: str, - lnurl_request: str, - memo: Optional[str] = None, - extra: Optional[dict] = None, - wait_seconds: int = 0, - conn: Optional[Connection] = None, -) -> None: - if not lnurl_request: - return None - - res = {} - - headers = {"User-Agent": settings.user_agent} - async with httpx.AsyncClient(headers=headers) as client: - lnurl = decode_lnurl(lnurl_request) - r = await client.get(str(lnurl)) - res = r.json() - - try: - _, payment_request = await create_invoice( - wallet_id=wallet_id, - amount=int(res["maxWithdrawable"] / 1000), - memo=memo or res["defaultDescription"] or "", - extra=extra, - conn=conn, - ) - except Exception: - logger.warning( - f"failed to create invoice on redeem_lnurl_withdraw " - f"from {lnurl}. params: {res}" - ) - return None - - if wait_seconds: - await asyncio.sleep(wait_seconds) - - params = {"k1": res["k1"], "pr": payment_request} - - try: - params["balanceNotify"] = url_for( - f"/withdraw/notify/{urlparse(lnurl_request).netloc}", - external=True, - wal=wallet_id, - ) - except Exception: - pass - - headers = {"User-Agent": settings.user_agent} - async with httpx.AsyncClient(headers=headers) as client: - try: - await client.get(res["callback"], params=params) - except Exception: - pass - - -async def perform_lnurlauth( - callback: str, - wallet: WalletTypeInfo = Depends(require_admin_key), -) -> Optional[LnurlErrorResponse]: - cb = urlparse(callback) - - k1 = bytes.fromhex(parse_qs(cb.query)["k1"][0]) - - key = wallet.wallet.lnurlauth_key(cb.netloc) - - def int_to_bytes_suitable_der(x: int) -> bytes: - """for strict DER we need to encode the integer with some quirks""" - b = x.to_bytes((x.bit_length() + 7) // 8, "big") - - if len(b) == 0: - # ensure there's at least one byte when the int is zero - return bytes([0]) - - if b[0] & 0x80 != 0: - # ensure it doesn't start with a 0x80 and so it isn't - # interpreted as a negative number - return bytes([0]) + b - - return b - - def encode_strict_der(r: int, s: int, order: int): - # if s > order/2 verification will fail sometimes - # so we must fix it here see: - # https://github.com/indutny/elliptic/blob/e71b2d9359c5fe9437fbf46f1f05096de447de57/lib/elliptic/ec/index.js#L146-L147 - if s > order // 2: - s = order - s - - # now we do the strict DER encoding copied from - # https://github.com/KiriKiri/bip66 (without any checks) - r_temp = int_to_bytes_suitable_der(r) - s_temp = int_to_bytes_suitable_der(s) - - r_len = len(r_temp) - s_len = len(s_temp) - sign_len = 6 + r_len + s_len - - signature = BytesIO() - signature.write(0x30.to_bytes(1, "big", signed=False)) - signature.write((sign_len - 2).to_bytes(1, "big", signed=False)) - signature.write(0x02.to_bytes(1, "big", signed=False)) - signature.write(r_len.to_bytes(1, "big", signed=False)) - signature.write(r_temp) - signature.write(0x02.to_bytes(1, "big", signed=False)) - signature.write(s_len.to_bytes(1, "big", signed=False)) - signature.write(s_temp) - - return signature.getvalue() - - sig = key.sign_digest_deterministic(k1, sigencode=encode_strict_der) - - headers = {"User-Agent": settings.user_agent} - async with httpx.AsyncClient(headers=headers) as client: - assert key.verifying_key, "LNURLauth verifying_key does not exist" - r = await client.get( - callback, - params={ - "k1": k1.hex(), - "key": key.verifying_key.to_string("compressed").hex(), - "sig": sig.hex(), - }, - ) - try: - resp = json.loads(r.text) - if resp["status"] == "OK": - return None - - return LnurlErrorResponse(reason=resp["reason"]) - except (KeyError, json.decoder.JSONDecodeError): - return LnurlErrorResponse( - reason=r.text[:200] + "..." if len(r.text) > 200 else r.text - ) - - -async def check_transaction_status( - wallet_id: str, payment_hash: str, conn: Optional[Connection] = None -) -> PaymentStatus: - payment: Optional[Payment] = await get_wallet_payment( - wallet_id, payment_hash, conn=conn - ) - if not payment: - return PaymentPendingStatus() - - if payment.status == PaymentState.SUCCESS.value: - return PaymentSuccessStatus(fee_msat=payment.fee) - - return await payment.check_status() - - -# WARN: this same value must be used for balance check and passed to -# funding_source.pay_invoice(), it may cause a vulnerability if the values differ -def fee_reserve(amount_msat: int, internal: bool = False) -> int: - if internal: - return 0 - reserve_min = settings.lnbits_reserve_fee_min - reserve_percent = settings.lnbits_reserve_fee_percent - return max(int(reserve_min), int(amount_msat * reserve_percent / 100.0)) - - -def service_fee(amount_msat: int, internal: bool = False) -> int: - amount_msat = abs(amount_msat) - service_fee_percent = settings.lnbits_service_fee - fee_max = settings.lnbits_service_fee_max * 1000 - if settings.lnbits_service_fee_wallet: - if internal and settings.lnbits_service_fee_ignore_internal: - return 0 - fee_percentage = int(amount_msat / 100 * service_fee_percent) - if fee_max > 0 and fee_percentage > fee_max: - return fee_max - else: - return fee_percentage - else: - return 0 - - -def fee_reserve_total(amount_msat: int, internal: bool = False) -> int: - return fee_reserve(amount_msat, internal) + service_fee(amount_msat, internal) - - -async def send_payment_notification(wallet: Wallet, payment: Payment): - await websocket_updater( - wallet.inkey, - json.dumps( - { - "wallet_balance": wallet.balance, - "payment": payment.dict(), - } - ), - ) - - await websocket_updater( - payment.payment_hash, json.dumps({"pending": payment.pending}) - ) - - -async def update_wallet_balance(wallet_id: str, amount: int): - payment_hash, _ = await create_invoice( - wallet_id=wallet_id, - amount=amount, - memo="Admin top up", - internal=True, - ) - async with db.connect() as conn: - checking_id = await check_internal(payment_hash, conn=conn) - assert checking_id, "newly created checking_id cannot be retrieved" - await update_payment_status( - checking_id=checking_id, status=PaymentState.SUCCESS, conn=conn - ) - # notify receiver asynchronously - from lnbits.tasks import internal_invoice_queue - - await internal_invoice_queue.put(checking_id) - - -async def check_admin_settings(): - if settings.super_user: - settings.super_user = to_valid_user_id(settings.super_user).hex - - if settings.lnbits_admin_ui: - settings_db = await get_super_settings() - if not settings_db: - # create new settings if table is empty - logger.warning("Settings DB empty. Inserting default settings.") - settings_db = await init_admin_settings(settings.super_user) - logger.warning("Initialized settings from environment variables.") - - if settings.super_user and settings.super_user != settings_db.super_user: - # .env super_user overwrites DB super_user - settings_db = await update_super_user(settings.super_user) - - update_cached_settings(settings_db.dict()) - - # saving superuser to {data_dir}/.super_user file - with open(Path(settings.lnbits_data_folder) / ".super_user", "w") as file: - file.write(settings.super_user) - - # callback for saas - if ( - settings.lnbits_saas_callback - and settings.lnbits_saas_secret - and settings.lnbits_saas_instance_id - ): - send_admin_user_to_saas() - - account = await get_account(settings.super_user) - if account and account.config and account.config.provider == "env": - settings.first_install = True - - logger.success( - "✔️ Admin UI is enabled. run `poetry run lnbits-cli superuser` " - "to get the superuser." - ) - - -async def check_webpush_settings(): - if not settings.lnbits_webpush_privkey: - vapid = Vapid() - vapid.generate_keys() - privkey = vapid.private_pem() - assert vapid.public_key, "VAPID public key does not exist" - pubkey = b64urlencode( - vapid.public_key.public_bytes( - serialization.Encoding.X962, - serialization.PublicFormat.UncompressedPoint, - ) - ) - push_settings = { - "lnbits_webpush_privkey": privkey.decode(), - "lnbits_webpush_pubkey": pubkey, - } - update_cached_settings(push_settings) - await update_admin_settings(EditableSettings(**push_settings)) - - logger.info("Initialized webpush settings with generated VAPID key pair.") - logger.info(f"Pubkey: {settings.lnbits_webpush_pubkey}") - - -def update_cached_settings(sets_dict: dict): - for key, value in sets_dict.items(): - if key in readonly_variables: - continue - if key not in settings.dict().keys(): - continue - try: - setattr(settings, key, value) - except Exception: - logger.warning(f"Failed overriding setting: {key}, value: {value}") - if "super_user" in sets_dict: - settings.super_user = sets_dict["super_user"] - - -async def init_admin_settings(super_user: Optional[str] = None) -> SuperSettings: - account = None - if super_user: - account = await get_account(super_user) - if not account: - account = await create_account( - user_id=super_user, user_config=UserConfig(provider="env") - ) - if not account.wallets or len(account.wallets) == 0: - await create_wallet(user_id=account.id) - - editable_settings = EditableSettings.from_dict(settings.dict()) - - return await create_admin_settings(account.id, editable_settings.dict()) - - -async def create_user_account( - user_id: Optional[str] = None, - email: Optional[str] = None, - username: Optional[str] = None, - pubkey: Optional[str] = None, - password: Optional[str] = None, - wallet_name: Optional[str] = None, - user_config: Optional[UserConfig] = None, -) -> User: - if not settings.new_accounts_allowed: - raise ValueError("Account creation is disabled.") - if username and await get_account_by_username(username): - raise ValueError("Username already exists.") - - if email and await get_account_by_email(email): - raise ValueError("Email already exists.") - - if user_id: - user_uuid4 = UUID(hex=user_id, version=4) - assert user_uuid4.hex == user_id, "User ID is not valid UUID4 hex string" - else: - user_id = uuid4().hex - - pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") - password = pwd_context.hash(password) if password else None - - account = await create_account( - user_id, username, pubkey, email, password, user_config - ) - wallet = await create_wallet(user_id=account.id, wallet_name=wallet_name) - account.wallets = [wallet] - - for ext_id in settings.lnbits_user_default_extensions: - await update_user_extension(user_id=account.id, extension=ext_id, active=True) - - return account - - -class WebsocketConnectionManager: - def __init__(self) -> None: - self.active_connections: list[WebSocket] = [] - - async def connect(self, websocket: WebSocket, item_id: str): - logger.debug(f"Websocket connected to {item_id}") - await websocket.accept() - self.active_connections.append(websocket) - - def disconnect(self, websocket: WebSocket): - self.active_connections.remove(websocket) - - async def send_data(self, message: str, item_id: str): - for connection in self.active_connections: - if connection.path_params["item_id"] == item_id: - await connection.send_text(message) - - -websocket_manager = WebsocketConnectionManager() - - -async def websocket_updater(item_id, data): - return await websocket_manager.send_data(f"{data}", item_id) - - -async def switch_to_voidwallet() -> None: - funding_source = get_funding_source() - if funding_source.__class__.__name__ == "VoidWallet": - return - set_funding_source("VoidWallet") - settings.lnbits_backend_wallet_class = "VoidWallet" - - -async def get_balance_delta() -> BalanceDelta: - funding_source = get_funding_source() - status = await funding_source.status() - lnbits_balance = await get_total_balance() - return BalanceDelta( - lnbits_balance_msats=lnbits_balance, - node_balance_msats=status.balance_msat, - ) - - -async def update_pending_payments(wallet_id: str): - pending_payments = await get_payments( - wallet_id=wallet_id, - pending=True, - exclude_uncheckable=True, - ) - for payment in pending_payments: - status = await payment.check_status() - if status.failed: - await update_payment_status( - checking_id=payment.checking_id, - status=PaymentState.FAILED, - ) - elif status.success: - await update_payment_status( - checking_id=payment.checking_id, - status=PaymentState.SUCCESS, - ) diff --git a/lnbits/core/services/__init__.py b/lnbits/core/services/__init__.py new file mode 100644 index 000000000..6b094c2f5 --- /dev/null +++ b/lnbits/core/services/__init__.py @@ -0,0 +1,55 @@ +from .funding_source import ( + get_balance_delta, + switch_to_voidwallet, +) +from .lnurl import perform_lnurlauth, redeem_lnurl_withdraw +from .payments import ( + calculate_fiat_amounts, + check_transaction_status, + check_wallet_limits, + create_invoice, + fee_reserve, + fee_reserve_total, + pay_invoice, + send_payment_notification, + service_fee, + update_pending_payments, + update_wallet_balance, +) +from .settings import ( + check_webpush_settings, + update_cached_settings, +) +from .users import check_admin_settings, create_user_account, init_admin_settings +from .websockets import websocket_manager, websocket_updater + +__all__ = [ + # funding source + "get_balance_delta", + "switch_to_voidwallet", + # lnurl + "redeem_lnurl_withdraw", + "perform_lnurlauth", + # payments + "calculate_fiat_amounts", + "check_transaction_status", + "check_wallet_limits", + "create_invoice", + "fee_reserve", + "fee_reserve_total", + "pay_invoice", + "send_payment_notification", + "service_fee", + "update_pending_payments", + "update_wallet_balance", + # settings + "check_webpush_settings", + "update_cached_settings", + # users + "check_admin_settings", + "create_user_account", + "init_admin_settings", + # websockets + "websocket_manager", + "websocket_updater", +] diff --git a/lnbits/core/services/funding_source.py b/lnbits/core/services/funding_source.py new file mode 100644 index 000000000..baad7aa8a --- /dev/null +++ b/lnbits/core/services/funding_source.py @@ -0,0 +1,23 @@ +from lnbits.settings import settings +from lnbits.wallets import get_funding_source, set_funding_source + +from ..crud import get_total_balance +from ..models import BalanceDelta + + +async def switch_to_voidwallet() -> None: + funding_source = get_funding_source() + if funding_source.__class__.__name__ == "VoidWallet": + return + set_funding_source("VoidWallet") + settings.lnbits_backend_wallet_class = "VoidWallet" + + +async def get_balance_delta() -> BalanceDelta: + funding_source = get_funding_source() + status = await funding_source.status() + lnbits_balance = await get_total_balance() + return BalanceDelta( + lnbits_balance_msats=lnbits_balance, + node_balance_msats=status.balance_msat, + ) diff --git a/lnbits/core/services/lnurl.py b/lnbits/core/services/lnurl.py new file mode 100644 index 000000000..8eb06b498 --- /dev/null +++ b/lnbits/core/services/lnurl.py @@ -0,0 +1,155 @@ +import asyncio +import json +from io import BytesIO +from typing import Optional +from urllib.parse import parse_qs, urlparse + +import httpx +from fastapi import Depends +from loguru import logger + +from lnbits.db import Connection +from lnbits.decorators import ( + WalletTypeInfo, + require_admin_key, +) +from lnbits.helpers import url_for +from lnbits.lnurl import LnurlErrorResponse +from lnbits.lnurl import decode as decode_lnurl +from lnbits.settings import settings + +from .payments import create_invoice + + +async def redeem_lnurl_withdraw( + wallet_id: str, + lnurl_request: str, + memo: Optional[str] = None, + extra: Optional[dict] = None, + wait_seconds: int = 0, + conn: Optional[Connection] = None, +) -> None: + if not lnurl_request: + return None + + res = {} + + headers = {"User-Agent": settings.user_agent} + async with httpx.AsyncClient(headers=headers) as client: + lnurl = decode_lnurl(lnurl_request) + r = await client.get(str(lnurl)) + res = r.json() + + try: + _, payment_request = await create_invoice( + wallet_id=wallet_id, + amount=int(res["maxWithdrawable"] / 1000), + memo=memo or res["defaultDescription"] or "", + extra=extra, + conn=conn, + ) + except Exception: + logger.warning( + f"failed to create invoice on redeem_lnurl_withdraw " + f"from {lnurl}. params: {res}" + ) + return None + + if wait_seconds: + await asyncio.sleep(wait_seconds) + + params = {"k1": res["k1"], "pr": payment_request} + + try: + params["balanceNotify"] = url_for( + f"/withdraw/notify/{urlparse(lnurl_request).netloc}", + external=True, + wal=wallet_id, + ) + except Exception: + pass + + headers = {"User-Agent": settings.user_agent} + async with httpx.AsyncClient(headers=headers) as client: + try: + await client.get(res["callback"], params=params) + except Exception: + pass + + +async def perform_lnurlauth( + callback: str, + wallet: WalletTypeInfo = Depends(require_admin_key), +) -> Optional[LnurlErrorResponse]: + cb = urlparse(callback) + + k1 = bytes.fromhex(parse_qs(cb.query)["k1"][0]) + + key = wallet.wallet.lnurlauth_key(cb.netloc) + + def int_to_bytes_suitable_der(x: int) -> bytes: + """for strict DER we need to encode the integer with some quirks""" + b = x.to_bytes((x.bit_length() + 7) // 8, "big") + + if len(b) == 0: + # ensure there's at least one byte when the int is zero + return bytes([0]) + + if b[0] & 0x80 != 0: + # ensure it doesn't start with a 0x80 and so it isn't + # interpreted as a negative number + return bytes([0]) + b + + return b + + def encode_strict_der(r: int, s: int, order: int): + # if s > order/2 verification will fail sometimes + # so we must fix it here see: + # https://github.com/indutny/elliptic/blob/e71b2d9359c5fe9437fbf46f1f05096de447de57/lib/elliptic/ec/index.js#L146-L147 + if s > order // 2: + s = order - s + + # now we do the strict DER encoding copied from + # https://github.com/KiriKiri/bip66 (without any checks) + r_temp = int_to_bytes_suitable_der(r) + s_temp = int_to_bytes_suitable_der(s) + + r_len = len(r_temp) + s_len = len(s_temp) + sign_len = 6 + r_len + s_len + + signature = BytesIO() + signature.write(0x30.to_bytes(1, "big", signed=False)) + signature.write((sign_len - 2).to_bytes(1, "big", signed=False)) + signature.write(0x02.to_bytes(1, "big", signed=False)) + signature.write(r_len.to_bytes(1, "big", signed=False)) + signature.write(r_temp) + signature.write(0x02.to_bytes(1, "big", signed=False)) + signature.write(s_len.to_bytes(1, "big", signed=False)) + signature.write(s_temp) + + return signature.getvalue() + + sig = key.sign_digest_deterministic(k1, sigencode=encode_strict_der) + + headers = {"User-Agent": settings.user_agent} + async with httpx.AsyncClient(headers=headers) as client: + assert key.verifying_key, "LNURLauth verifying_key does not exist" + r = await client.get( + callback, + params={ + "k1": k1.hex(), + "key": key.verifying_key.to_string("compressed").hex(), + "sig": sig.hex(), + }, + ) + try: + resp = json.loads(r.text) + if resp["status"] == "OK": + return None + + return LnurlErrorResponse(reason=resp["reason"]) + except (KeyError, json.decoder.JSONDecodeError): + return LnurlErrorResponse( + reason=r.text[:200] + "..." if len(r.text) > 200 else r.text + ) diff --git a/lnbits/core/services/payments.py b/lnbits/core/services/payments.py new file mode 100644 index 000000000..f1a5ef090 --- /dev/null +++ b/lnbits/core/services/payments.py @@ -0,0 +1,580 @@ +import json +import time +from typing import Optional + +from bolt11 import decode as bolt11_decode +from bolt11.types import Bolt11 +from loguru import logger + +from lnbits.core.db import db +from lnbits.db import Connection +from lnbits.decorators import check_user_extension_access +from lnbits.exceptions import InvoiceError, PaymentError +from lnbits.settings import settings +from lnbits.utils.exchange_rates import fiat_amount_as_satoshis, satoshis_amount_as_fiat +from lnbits.wallets import fake_wallet, get_funding_source +from lnbits.wallets.base import ( + PaymentPendingStatus, + PaymentResponse, + PaymentStatus, + PaymentSuccessStatus, +) + +from ..crud import ( + check_internal, + create_payment, + get_payments, + get_standalone_payment, + get_wallet, + get_wallet_payment, + is_internal_status_success, + update_payment, +) +from ..models import ( + CreatePayment, + Payment, + PaymentState, + Wallet, +) +from .websockets import websocket_manager + + +async def pay_invoice( + *, + wallet_id: str, + payment_request: str, + max_sat: Optional[int] = None, + extra: Optional[dict] = None, + description: str = "", + tag: str = "", + conn: Optional[Connection] = None, +) -> Payment: + invoice = _validate_payment_request(payment_request, max_sat) + assert invoice.amount_msat + + async with db.reuse_conn(conn) if conn else db.connect() as conn: + amount_msat = invoice.amount_msat + wallet = await _check_wallet_for_payment(wallet_id, tag, amount_msat, conn) + + if await is_internal_status_success(invoice.payment_hash, conn): + raise PaymentError("Internal invoice already paid.", status="failed") + + _, extra = await calculate_fiat_amounts(amount_msat / 1000, wallet, extra=extra) + + create_payment_model = CreatePayment( + wallet_id=wallet_id, + bolt11=payment_request, + payment_hash=invoice.payment_hash, + amount_msat=-amount_msat, + expiry=invoice.expiry_date, + memo=description or invoice.description or "", + extra=extra, + ) + + payment = await _pay_invoice(wallet, create_payment_model, conn) + await _credit_service_fee_wallet(payment, conn) + + return payment + + +async def create_invoice( + *, + wallet_id: str, + amount: float, + currency: Optional[str] = "sat", + memo: str, + description_hash: Optional[bytes] = None, + unhashed_description: Optional[bytes] = None, + expiry: Optional[int] = None, + extra: Optional[dict] = None, + webhook: Optional[str] = None, + internal: Optional[bool] = False, + conn: Optional[Connection] = None, +) -> Payment: + if not amount > 0: + raise InvoiceError("Amountless invoices not supported.", status="failed") + + user_wallet = await get_wallet(wallet_id, conn=conn) + if not user_wallet: + raise InvoiceError(f"Could not fetch wallet '{wallet_id}'.", status="failed") + + invoice_memo = None if description_hash else memo + + # use the fake wallet if the invoice is for internal use only + funding_source = fake_wallet if internal else get_funding_source() + + amount_sat, extra = await calculate_fiat_amounts( + amount, user_wallet, currency, extra + ) + + if settings.is_wallet_max_balance_exceeded( + user_wallet.balance_msat / 1000 + amount_sat + ): + raise InvoiceError( + f"Wallet balance cannot exceed " + f"{settings.lnbits_wallet_limit_max_balance} sats.", + status="failed", + ) + + ( + ok, + checking_id, + payment_request, + error_message, + ) = await funding_source.create_invoice( + amount=amount_sat, + memo=invoice_memo, + description_hash=description_hash, + unhashed_description=unhashed_description, + expiry=expiry or settings.lightning_invoice_expiry, + ) + if not ok or not payment_request or not checking_id: + raise InvoiceError( + error_message or "unexpected backend error.", status="pending" + ) + + invoice = bolt11_decode(payment_request) + + create_payment_model = CreatePayment( + wallet_id=wallet_id, + bolt11=payment_request, + payment_hash=invoice.payment_hash, + amount_msat=amount_sat * 1000, + expiry=invoice.expiry_date, + memo=memo, + extra=extra, + webhook=webhook, + ) + + payment = await create_payment( + checking_id=checking_id, + data=create_payment_model, + conn=conn, + ) + + return payment + + +async def update_pending_payments(wallet_id: str): + pending_payments = await get_payments( + wallet_id=wallet_id, + pending=True, + exclude_uncheckable=True, + ) + for payment in pending_payments: + status = await payment.check_status() + if status.failed: + payment.status = PaymentState.FAILED + await update_payment(payment) + elif status.success: + payment.status = PaymentState.SUCCESS + await update_payment(payment) + + +def fee_reserve_total(amount_msat: int, internal: bool = False) -> int: + return fee_reserve(amount_msat, internal) + service_fee(amount_msat, internal) + + +# WARN: this same value must be used for balance check and passed to +# funding_source.pay_invoice(), it may cause a vulnerability if the values differ +def fee_reserve(amount_msat: int, internal: bool = False) -> int: + if internal: + return 0 + reserve_min = settings.lnbits_reserve_fee_min + reserve_percent = settings.lnbits_reserve_fee_percent + return max(int(reserve_min), int(amount_msat * reserve_percent / 100.0)) + + +def service_fee(amount_msat: int, internal: bool = False) -> int: + amount_msat = abs(amount_msat) + service_fee_percent = settings.lnbits_service_fee + fee_max = settings.lnbits_service_fee_max * 1000 + if settings.lnbits_service_fee_wallet: + if internal and settings.lnbits_service_fee_ignore_internal: + return 0 + fee_percentage = int(amount_msat / 100 * service_fee_percent) + if fee_max > 0 and fee_percentage > fee_max: + return fee_max + else: + return fee_percentage + else: + return 0 + + +async def update_wallet_balance(wallet_id: str, amount: int): + async with db.connect() as conn: + payment = await create_invoice( + wallet_id=wallet_id, + amount=amount, + memo="Admin top up", + internal=True, + conn=conn, + ) + payment.status = PaymentState.SUCCESS + await update_payment(payment, conn=conn) + # notify receiver asynchronously + from lnbits.tasks import internal_invoice_queue + + await internal_invoice_queue.put(payment.checking_id) + + +async def send_payment_notification(wallet: Wallet, payment: Payment): + # TODO: websocket message should be a clean payment model + # await websocket_manager.send_data(payment.json(), wallet.inkey) + # TODO: figure out why we send the balance with the payment here. + # cleaner would be to have a separate message for the balance + # and send it with the id of the wallet so wallets can subscribe to it + await websocket_manager.send_data( + json.dumps( + { + "wallet_balance": wallet.balance, + # use pydantic json serialization to get the correct datetime format + "payment": json.loads(payment.json()), + }, + ), + wallet.inkey, + ) + await websocket_manager.send_data( + json.dumps({"pending": payment.pending}), payment.payment_hash + ) + + +async def check_wallet_limits( + wallet_id: str, amount_msat: int, conn: Optional[Connection] = None +): + await check_time_limit_between_transactions(wallet_id, conn) + await check_wallet_daily_withdraw_limit(wallet_id, amount_msat, conn) + + +async def check_time_limit_between_transactions( + wallet_id: str, conn: Optional[Connection] = None +): + limit = settings.lnbits_wallet_limit_secs_between_trans + if not limit or limit <= 0: + return + payments = await get_payments( + since=int(time.time()) - limit, + wallet_id=wallet_id, + limit=1, + conn=conn, + ) + if len(payments) == 0: + return + raise PaymentError( + status="failed", + message=f"The time limit of {limit} seconds between payments has been reached.", + ) + + +async def check_wallet_daily_withdraw_limit( + wallet_id: str, amount_msat: int, conn: Optional[Connection] = None +): + limit = settings.lnbits_wallet_limit_daily_max_withdraw + if not limit: + return + if limit < 0: + raise ValueError("It is not allowed to spend funds from this server.") + + payments = await get_payments( + since=int(time.time()) - 60 * 60 * 24, + outgoing=True, + wallet_id=wallet_id, + limit=1, + conn=conn, + ) + if len(payments) == 0: + return + + total = 0 + for pay in payments: + total += pay.amount + total = total - amount_msat + if limit * 1000 + total < 0: + raise ValueError( + "Daily withdrawal limit of " + + str(settings.lnbits_wallet_limit_daily_max_withdraw) + + " sats reached." + ) + + +async def calculate_fiat_amounts( + amount: float, + wallet: Wallet, + currency: Optional[str] = None, + extra: Optional[dict] = None, +) -> tuple[int, dict]: + wallet_currency = wallet.currency or settings.lnbits_default_accounting_currency + fiat_amounts: dict = extra or {} + if currency and currency != "sat": + amount_sat = await fiat_amount_as_satoshis(amount, currency) + if currency != wallet_currency: + fiat_amounts["fiat_currency"] = currency + fiat_amounts["fiat_amount"] = round(amount, ndigits=3) + fiat_amounts["fiat_rate"] = amount_sat / amount + else: + amount_sat = int(amount) + + if wallet_currency: + if wallet_currency == currency: + fiat_amount = amount + else: + fiat_amount = await satoshis_amount_as_fiat(amount_sat, wallet_currency) + fiat_amounts["wallet_fiat_currency"] = wallet_currency + fiat_amounts["wallet_fiat_amount"] = round(fiat_amount, ndigits=3) + fiat_amounts["wallet_fiat_rate"] = amount_sat / fiat_amount + + logger.debug( + f"Calculated fiat amounts {wallet.id=} {amount=} {currency=}: {fiat_amounts=}" + ) + + return amount_sat, fiat_amounts + + +async def check_transaction_status( + wallet_id: str, payment_hash: str, conn: Optional[Connection] = None +) -> PaymentStatus: + payment: Optional[Payment] = await get_wallet_payment( + wallet_id, payment_hash, conn=conn + ) + if not payment: + return PaymentPendingStatus() + + if payment.status == PaymentState.SUCCESS.value: + return PaymentSuccessStatus(fee_msat=payment.fee) + + return await payment.check_status() + + +async def _pay_invoice(wallet, create_payment_model, conn): + payment = await _pay_internal_invoice(wallet, create_payment_model, conn) + if not payment: + payment = await _pay_external_invoice(wallet, create_payment_model, conn) + return payment + + +async def _pay_internal_invoice( + wallet: Wallet, + create_payment_model: CreatePayment, + conn: Optional[Connection] = None, +) -> Optional[Payment]: + """ + Pay an internal payment. + returns None if the payment is not internal. + """ + # check_internal() returns the payment of the invoice we're waiting for + # (pending only) + internal_payment = await check_internal( + create_payment_model.payment_hash, conn=conn + ) + if not internal_payment: + return None + + # perform additional checks on the internal payment + # the payment hash is not enough to make sure that this is the same invoice + internal_invoice = await get_standalone_payment( + internal_payment.checking_id, incoming=True, conn=conn + ) + if not internal_invoice: + raise PaymentError("Internal payment not found.", status="failed") + + amount_msat = create_payment_model.amount_msat + if ( + internal_invoice.amount != abs(amount_msat) + or internal_invoice.bolt11 != create_payment_model.bolt11.lower() + ): + raise PaymentError("Invalid invoice. Bolt11 changed.", status="failed") + + fee_reserve_total_msat = fee_reserve_total(abs(amount_msat), internal=True) + create_payment_model.fee = abs(fee_reserve_total_msat) + + if wallet.balance_msat < abs(amount_msat) + fee_reserve_total_msat: + raise PaymentError("Insufficient balance.", status="failed") + + internal_id = f"internal_{create_payment_model.payment_hash}" + logger.debug(f"creating temporary internal payment with id {internal_id}") + payment = await create_payment( + checking_id=internal_id, + data=create_payment_model, + status=PaymentState.SUCCESS, + conn=conn, + ) + + # mark the invoice from the other side as not pending anymore + # so the other side only has access to his new money when we are sure + # the payer has enough to deduct from + internal_payment.status = PaymentState.SUCCESS + await update_payment(internal_payment, conn=conn) + logger.success(f"internal payment successful {internal_payment.checking_id}") + + await send_payment_notification(wallet, payment) + + # notify receiver asynchronously + from lnbits.tasks import internal_invoice_queue + + logger.debug(f"enqueuing internal invoice {internal_payment.checking_id}") + await internal_invoice_queue.put(internal_payment.checking_id) + + return payment + + +async def _pay_external_invoice( + wallet: Wallet, + create_payment_model: CreatePayment, + conn: Optional[Connection] = None, +) -> Payment: + checking_id = create_payment_model.payment_hash + amount_msat = create_payment_model.amount_msat + + fee_reserve_total_msat = fee_reserve_total(amount_msat, internal=False) + + if wallet.balance_msat < abs(amount_msat) + fee_reserve_total_msat: + raise PaymentError( + f"You must reserve at least ({round(fee_reserve_total_msat/1000)}" + " sat) to cover potential routing fees.", + status="failed", + ) + # check if there is already a payment with the same checking_id + old_payment = await get_standalone_payment(checking_id, conn=conn) + if old_payment: + return await _verify_external_payment(old_payment, conn) + + create_payment_model.fee = -abs(fee_reserve_total_msat) + payment = await create_payment( + checking_id=checking_id, + data=create_payment_model, + conn=conn, + ) + + fee_reserve_msat = fee_reserve(amount_msat, internal=False) + service_fee_msat = service_fee(amount_msat, internal=False) + + funding_source = get_funding_source() + + logger.debug(f"fundingsource: sending payment {checking_id}") + payment_response: PaymentResponse = await funding_source.pay_invoice( + create_payment_model.bolt11, fee_reserve_msat + ) + logger.debug(f"backend: pay_invoice finished {checking_id}, {payment_response}") + if payment_response.checking_id and payment_response.checking_id != checking_id: + logger.warning( + f"backend sent unexpected checking_id (expected: {checking_id} got:" + f" {payment_response.checking_id})" + ) + if payment_response.checking_id and payment_response.ok is not False: + # payment.ok can be True (paid) or None (pending)! + logger.debug(f"updating payment {checking_id}") + payment.status = ( + PaymentState.SUCCESS + if payment_response.ok is True + else PaymentState.PENDING + ) + payment.fee = -(abs(payment_response.fee_msat or 0) + abs(service_fee_msat)) + payment.preimage = payment_response.preimage + await update_payment(payment, payment_response.checking_id, conn=conn) + payment.checking_id = payment_response.checking_id + if payment.success: + await send_payment_notification(wallet, payment) + logger.success(f"payment successful {payment_response.checking_id}") + elif payment_response.checking_id is None and payment_response.ok is False: + # payment failed + logger.debug(f"payment failed {checking_id}, {payment_response.error_message}") + payment.status = PaymentState.FAILED + await update_payment(payment, conn=conn) + raise PaymentError( + f"Payment failed: {payment_response.error_message}" + or "Payment failed, but backend didn't give us an error message.", + status="failed", + ) + else: + logger.warning( + "didn't receive checking_id from backend, payment may be stuck in" + f" database: {checking_id}" + ) + return payment + + +async def _verify_external_payment( + payment: Payment, conn: Optional[Connection] = None +) -> Payment: + # fail on pending payments + if payment.pending: + raise PaymentError("Payment is still pending.", status="pending") + if payment.success: + raise PaymentError("Payment already paid.", status="success") + + # payment failed + status = await payment.check_status() + if status.failed: + raise PaymentError( + "Payment is failed node, retrying is not possible.", status="failed" + ) + + if status.success: + # payment was successful on the fundingsource + payment.status = PaymentState.SUCCESS + await update_payment(payment, conn=conn) + raise PaymentError( + "Failed payment was already paid on the fundingsource.", + status="success", + ) + + # status.pending fall through and try again + return payment + + +async def _check_wallet_for_payment( + wallet_id: str, + tag: str, + amount_msat: int, + conn: Optional[Connection], +): + wallet = await get_wallet(wallet_id, conn=conn) + if not wallet: + raise PaymentError(f"Could not fetch wallet '{wallet_id}'.", status="failed") + + # check if the payment is made for an extension that the user disabled + status = await check_user_extension_access(wallet.user, tag) + if not status.success: + raise PaymentError(status.message) + + await check_wallet_limits(wallet_id, amount_msat, conn) + return wallet + + +def _validate_payment_request( + payment_request: str, max_sat: Optional[int] = None +) -> Bolt11: + try: + invoice = bolt11_decode(payment_request) + except Exception as exc: + raise PaymentError("Bolt11 decoding failed.", status="failed") from exc + + if not invoice.amount_msat or not invoice.amount_msat > 0: + raise PaymentError("Amountless invoices not supported.", status="failed") + + if max_sat and invoice.amount_msat > max_sat * 1000: + raise PaymentError("Amount in invoice is too high.", status="failed") + + return invoice + + +async def _credit_service_fee_wallet( + payment: Payment, conn: Optional[Connection] = None +): + service_fee_msat = service_fee(payment.amount, internal=payment.is_internal) + if not settings.lnbits_service_fee_wallet or not service_fee_msat: + return + + create_payment_model = CreatePayment( + wallet_id=settings.lnbits_service_fee_wallet, + bolt11=payment.bolt11, + payment_hash=payment.payment_hash, + amount_msat=abs(service_fee_msat), + memo="Service fee", + ) + await create_payment( + checking_id=f"service_fee_{payment.payment_hash}", + data=create_payment_model, + status=PaymentState.SUCCESS, + conn=conn, + ) diff --git a/lnbits/core/services/settings.py b/lnbits/core/services/settings.py new file mode 100644 index 000000000..bd038d711 --- /dev/null +++ b/lnbits/core/services/settings.py @@ -0,0 +1,49 @@ +from cryptography.hazmat.primitives import serialization +from loguru import logger +from py_vapid import Vapid +from py_vapid.utils import b64urlencode + +from lnbits.settings import ( + EditableSettings, + readonly_variables, + settings, +) + +from ..crud import update_admin_settings + + +async def check_webpush_settings(): + if not settings.lnbits_webpush_privkey: + vapid = Vapid() + vapid.generate_keys() + privkey = vapid.private_pem() + assert vapid.public_key, "VAPID public key does not exist" + pubkey = b64urlencode( + vapid.public_key.public_bytes( + serialization.Encoding.X962, + serialization.PublicFormat.UncompressedPoint, + ) + ) + push_settings = { + "lnbits_webpush_privkey": privkey.decode(), + "lnbits_webpush_pubkey": pubkey, + } + update_cached_settings(push_settings) + await update_admin_settings(EditableSettings(**push_settings)) + + logger.info("Initialized webpush settings with generated VAPID key pair.") + logger.info(f"Pubkey: {settings.lnbits_webpush_pubkey}") + + +def update_cached_settings(sets_dict: dict): + for key, value in sets_dict.items(): + if key in readonly_variables: + continue + if key not in settings.dict().keys(): + continue + try: + setattr(settings, key, value) + except Exception: + logger.warning(f"Failed overriding setting: {key}, value: {value}") + if "super_user" in sets_dict: + settings.super_user = sets_dict["super_user"] diff --git a/lnbits/core/services/users.py b/lnbits/core/services/users.py new file mode 100644 index 000000000..e45a2ef5d --- /dev/null +++ b/lnbits/core/services/users.py @@ -0,0 +1,128 @@ +from pathlib import Path +from typing import Optional +from uuid import UUID, uuid4 + +from loguru import logger + +from lnbits.core.extensions.models import UserExtension +from lnbits.settings import ( + EditableSettings, + SuperSettings, + send_admin_user_to_saas, + settings, +) + +from ..crud import ( + create_account, + create_admin_settings, + create_wallet, + get_account, + get_account_by_email, + get_account_by_pubkey, + get_account_by_username, + get_super_settings, + get_user_from_account, + update_super_user, + update_user_extension, +) +from ..helpers import to_valid_user_id +from ..models import ( + Account, + User, + UserExtra, +) +from .settings import update_cached_settings + + +async def create_user_account( + account: Optional[Account] = None, wallet_name: Optional[str] = None +) -> User: + if not settings.new_accounts_allowed: + raise ValueError("Account creation is disabled.") + if account: + if account.username and await get_account_by_username(account.username): + raise ValueError("Username already exists.") + + if account.email and await get_account_by_email(account.email): + raise ValueError("Email already exists.") + + if account.pubkey and await get_account_by_pubkey(account.pubkey): + raise ValueError("Pubkey already exists.") + + if account.id: + user_uuid4 = UUID(hex=account.id, version=4) + assert user_uuid4.hex == account.id, "User ID is not valid UUID4 hex string" + else: + account.id = uuid4().hex + + account = await create_account(account) + await create_wallet( + user_id=account.id, + wallet_name=wallet_name or settings.lnbits_default_wallet_name, + ) + + for ext_id in settings.lnbits_user_default_extensions: + user_ext = UserExtension(user=account.id, extension=ext_id, active=True) + await update_user_extension(user_ext) + + user = await get_user_from_account(account) + assert user, "Cannot find user for account." + + return user + + +async def check_admin_settings(): + if settings.super_user: + settings.super_user = to_valid_user_id(settings.super_user).hex + + if settings.lnbits_admin_ui: + settings_db = await get_super_settings() + if not settings_db: + # create new settings if table is empty + logger.warning("Settings DB empty. Inserting default settings.") + settings_db = await init_admin_settings(settings.super_user) + logger.warning("Initialized settings from environment variables.") + + if settings.super_user and settings.super_user != settings_db.super_user: + # .env super_user overwrites DB super_user + settings_db = await update_super_user(settings.super_user) + + update_cached_settings(settings_db.dict()) + + # saving superuser to {data_dir}/.super_user file + with open(Path(settings.lnbits_data_folder) / ".super_user", "w") as file: + file.write(settings.super_user) + + # callback for saas + if ( + settings.lnbits_saas_callback + and settings.lnbits_saas_secret + and settings.lnbits_saas_instance_id + ): + send_admin_user_to_saas() + + account = await get_account(settings.super_user) + if account and account.extra and account.extra.provider == "env": + settings.first_install = True + + logger.success( + "✔️ Admin UI is enabled. run `poetry run lnbits-cli superuser` " + "to get the superuser." + ) + + +async def init_admin_settings(super_user: Optional[str] = None) -> SuperSettings: + account = None + if super_user: + account = await get_account(super_user) + if not account: + account_id = super_user or uuid4().hex + account = Account( + id=account_id, + extra=UserExtra(provider="env"), + ) + await create_account(account) + await create_wallet(user_id=account.id) + + editable_settings = EditableSettings.from_dict(settings.dict()) + return await create_admin_settings(account.id, editable_settings.dict()) diff --git a/lnbits/core/services/websockets.py b/lnbits/core/services/websockets.py new file mode 100644 index 000000000..509e060af --- /dev/null +++ b/lnbits/core/services/websockets.py @@ -0,0 +1,27 @@ +from fastapi import WebSocket +from loguru import logger + + +class WebsocketConnectionManager: + def __init__(self) -> None: + self.active_connections: list[WebSocket] = [] + + async def connect(self, websocket: WebSocket, item_id: str): + logger.debug(f"Websocket connected to {item_id}") + await websocket.accept() + self.active_connections.append(websocket) + + def disconnect(self, websocket: WebSocket): + self.active_connections.remove(websocket) + + async def send_data(self, message: str, item_id: str): + for connection in self.active_connections: + if connection.path_params["item_id"] == item_id: + await connection.send_text(message) + + +websocket_manager = WebsocketConnectionManager() + + +async def websocket_updater(item_id: str, data: str): + return await websocket_manager.send_data(data, item_id) diff --git a/lnbits/core/templates/core/_api_docs.html b/lnbits/core/templates/core/_api_docs.html index 20081bf02..6f4cc9405 100644 --- a/lnbits/core/templates/core/_api_docs.html +++ b/lnbits/core/templates/core/_api_docs.html @@ -16,14 +16,14 @@ - Wallet ID: {{ wallet.id }} + Wallet ID: @@ -32,7 +32,7 @@ Admin key: @@ -46,7 +46,7 @@ @@ -55,9 +55,7 @@ Invoice/read key: + > @@ -70,7 +68,7 @@ @@ -87,7 +85,7 @@ GET /api/v1/wallet
Headers
- {"X-Api-Key": "{{ wallet.inkey }}"}
+ {"X-Api-Key": ""}
Returns 200 OK (application/json)
@@ -97,12 +95,13 @@ >
Curl example
curl {{ request.base_url }}api/v1/wallet -H "X-Api-Key: - {{ wallet.inkey }}"curl api/v1/wallet -H "X-Api-Key: + "
+ POST /api/v1/payments
Headers
- {"X-Api-Key": "{{ wallet.inkey }}"}
+ {"X-Api-Key": ""}
Body (application/json)
{"out": false, "amount": <int>, "memo": <string>, @@ -129,9 +128,10 @@ >
Curl example
curl -X POST {{ request.base_url }}api/v1/payments -d '{"out": false, - "amount": <int>, "memo": <string>}' -H "X-Api-Key: - {{ wallet.inkey }}" -H "Content-type: application/json"curl -X POST api/v1/payments -d + '{"out": false, "amount": <int>, "memo": <string>}' -H + "X-Api-Key: " -H "Content-type: + application/json"
@@ -155,9 +155,9 @@ {"payment_hash": <string>}
Curl example
curl -X POST {{ request.base_url }}api/v1/payments -d '{"out": true, - "bolt11": <string>}' -H "X-Api-Key: - {{ wallet.adminkey }}" -H "Content-type: + >curl -X POST api/v1/payments -d + '{"out": true, "bolt11": <string>}' -H "X-Api-Key: + " -H "Content-type: application/json" @@ -183,7 +183,7 @@
Curl example
curl -X POST {{ request.base_url }}api/v1/payments/decode -d + >curl -X POST api/v1/payments/decode -d '{"data": <bolt11/lnurl, string>}' -H "Content-type: application/json" @@ -211,9 +211,10 @@ {"paid": <bool>}
Curl example
curl -X GET {{ request.base_url - }}api/v1/payments/<payment_hash> -H "X-Api-Key: - {{ wallet.inkey }}" -H "Content-type: application/json"curl -X GET + api/v1/payments/<payment_hash> -H + "X-Api-Key: " -H "Content-type: + application/json" diff --git a/lnbits/core/templates/core/account.html b/lnbits/core/templates/core/account.html index c7ce79b11..654513224 100644 --- a/lnbits/core/templates/core/account.html +++ b/lnbits/core/templates/core/account.html @@ -38,9 +38,9 @@
@@ -133,9 +133,9 @@
@@ -236,9 +236,9 @@
- + +
+
+ +
+
+ + + +
+
Notifications
@@ -470,7 +487,7 @@ v-model="reactionChoice" :options="reactionOptions" label="Reactions" - @input="reactionChoiceFunc" + @update:model-value="reactionChoiceFunc" >   - - - +
@@ -1060,7 +1058,7 @@ extension.inProgress = false }) }, - toggleExtension: function (extension) { + toggleExtension(extension) { const action = extension.isActive ? 'activate' : 'deactivate' LNbits.api .request( diff --git a/lnbits/core/templates/core/wallet.html b/lnbits/core/templates/core/wallet.html index 84ad322c4..282064dcf 100644 --- a/lnbits/core/templates/core/wallet.html +++ b/lnbits/core/templates/core/wallet.html @@ -6,7 +6,7 @@ {% endblock %} -{% block title %} {{ wallet.name }} - {{ SITE_TITLE }} {% endblock %} +{% block title %}{{ wallet_name }} - {{ SITE_TITLE }} {% endblock %} {% block page %}
@@ -36,9 +36,8 @@

- {{LNBITS_DENOMINATION}} + {{LNBITS_DENOMINATION}}
{{ SITE_TITLE }} Wallet: - {{wallet.name}} + {{wallet_name}}
@@ -154,17 +153,15 @@

- +
+
@@ -183,7 +180,6 @@ v-model.trim="update.name" label="Name" dense - @update:model-value="(e) => console.log(e)" />

@@ -627,8 +621,8 @@
@@ -651,8 +645,8 @@
@@ -667,22 +661,28 @@
- - - - + + - - + + + - - +
@@ -239,7 +239,7 @@ diff --git a/lnbits/core/templates/node/index.html b/lnbits/core/templates/node/index.html index 879967a99..b6aef6a79 100644 --- a/lnbits/core/templates/node/index.html +++ b/lnbits/core/templates/node/index.html @@ -42,11 +42,7 @@
{% endblock %} {% block scripts %} {{ window_vars(user) }} - - + {% endblock %} diff --git a/lnbits/core/templates/users/_walletDialog.html b/lnbits/core/templates/users/_walletDialog.html index 527285d88..1ff7a7497 100644 --- a/lnbits/core/templates/users/_walletDialog.html +++ b/lnbits/core/templates/users/_walletDialog.html @@ -37,6 +37,7 @@ icon="content_copy" size="sm" color="primary" + class="q-ml-xs" @click="copyText(props.row.id)" > Copy Wallet ID @@ -45,6 +46,7 @@ v-if="!props.row.deleted" :wallet_id="props.row.id" :callback="topupCallback" + class="q-ml-xs" > Copy Admin Key @@ -62,6 +65,7 @@ icon="vpn_key" size="sm" color="secondary" + class="q-ml-xs" @click="copyText(props.row.inkey)" > Copy Invoice Key @@ -72,6 +76,7 @@ icon="toggle_off" size="sm" color="secondary" + class="q-ml-xs" @click="undeleteUserWallet(props.row.user, props.row.id)" > Undelete Wallet @@ -81,6 +86,7 @@ icon="delete" size="sm" color="negative" + class="q-ml-xs" @click="deleteUserWallet(props.row.user, props.row.id, props.row.deleted)" > Delete Wallet diff --git a/lnbits/core/templates/users/index.html b/lnbits/core/templates/users/index.html index d524b2646..ef0239448 100644 --- a/lnbits/core/templates/users/index.html +++ b/lnbits/core/templates/users/index.html @@ -61,6 +61,7 @@ include "users/_createWalletDialog.html" %} icon="content_copy" size="sm" color="primary" + class="q-ml-xs" @click="copyText(props.row.id)" > Copy User ID @@ -71,6 +72,7 @@ include "users/_createWalletDialog.html" %} icon="build" size="sm" :color="props.row.is_admin ? 'primary' : 'grey'" + class="q-ml-xs" @click="toggleAdmin(props.row.id)" > Toggle Admin @@ -81,6 +83,7 @@ include "users/_createWalletDialog.html" %} icon="build" size="sm" color="positive" + class="q-ml-xs" > Super User @@ -98,6 +101,7 @@ include "users/_createWalletDialog.html" %} icon="delete" size="sm" color="negative" + class="q-ml-xs" @click="deleteUser(props.row.id, props)" > Delete User @@ -111,7 +115,10 @@ include "users/_createWalletDialog.html" %} - + diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py index bef3b7319..b96ca5a3f 100644 --- a/lnbits/core/views/api.py +++ b/lnbits/core/views/api.py @@ -3,7 +3,7 @@ import json from http import HTTPStatus from io import BytesIO from time import time -from typing import Any, Dict, List +from typing import Any from urllib.parse import ParseResult, parse_qs, urlencode, urlparse, urlunparse import httpx @@ -13,7 +13,7 @@ from fastapi import ( Depends, ) from fastapi.exceptions import HTTPException -from starlette.responses import StreamingResponse +from fastapi.responses import StreamingResponse from lnbits.core.crud import get_user from lnbits.core.models import ( @@ -43,10 +43,6 @@ from lnbits.wallets.base import StatusResponse from ..services import create_user_account, perform_lnurlauth -# backwards compatibility for extension -# TODO: remove api_payment and pay_invoice imports from extensions -from .payment_api import api_payment, pay_invoice # noqa: F401 - api_router = APIRouter(tags=["Core"]) @@ -87,20 +83,16 @@ async def health_check(wallet: WalletTypeInfo = Depends(require_invoice_key)) -> "/api/v1/wallets", name="Wallets", description="Get basic info for all of user's wallets.", + response_model=list[BaseWallet], ) -async def api_wallets(user: User = Depends(check_user_exists)) -> List[BaseWallet]: - return [BaseWallet(**w.dict()) for w in user.wallets] +async def api_wallets(user: User = Depends(check_user_exists)) -> list[Wallet]: + return user.wallets -@api_router.post("/api/v1/account", response_model=Wallet) +@api_router.post("/api/v1/account") async def api_create_account(data: CreateWallet) -> Wallet: - if not settings.new_accounts_allowed: - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, - detail="Account creation is disabled.", - ) - account = await create_user_account(wallet_name=data.name) - return account.wallets[0] + user = await create_user_account(wallet_name=data.name) + return user.wallets[0] @api_router.get("/api/v1/lnurlscan/{code}") @@ -128,7 +120,7 @@ async def api_lnurlscan( ) from exc # params is what will be returned to the client - params: Dict = {"domain": domain} + params: dict = {"domain": domain} if "tag=login" in url: params.update(kind="auth") @@ -177,7 +169,7 @@ async def api_lnurlscan( # callback with k1 already in it parsed_callback: ParseResult = urlparse(data["callback"]) - qs: Dict = parse_qs(parsed_callback.query) + qs: dict = parse_qs(parsed_callback.query) qs["k1"] = data["k1"] # balanceCheck/balanceNotify @@ -234,13 +226,13 @@ async def api_perform_lnurlauth( @api_router.get("/api/v1/rate/{currency}") -async def api_check_fiat_rate(currency: str) -> Dict[str, float]: +async def api_check_fiat_rate(currency: str) -> dict[str, float]: rate = await get_fiat_rate_satoshis(currency) return {"rate": rate} @api_router.get("/api/v1/currencies") -async def api_list_currencies_available() -> List[str]: +async def api_list_currencies_available() -> list[str]: return allowed_currencies() diff --git a/lnbits/core/views/auth_api.py b/lnbits/core/views/auth_api.py index d64a84ac9..1b9426407 100644 --- a/lnbits/core/views/auth_api.py +++ b/lnbits/core/views/auth_api.py @@ -1,19 +1,15 @@ import base64 import importlib import json +from http import HTTPStatus from time import time from typing import Callable, Optional +from uuid import uuid4 -from fastapi import APIRouter, Depends, HTTPException, Request, status +from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import JSONResponse, RedirectResponse from fastapi_sso.sso.base import OpenID, SSOBase from loguru import logger -from starlette.status import ( - HTTP_400_BAD_REQUEST, - HTTP_401_UNAUTHORIZED, - HTTP_403_FORBIDDEN, - HTTP_500_INTERNAL_SERVER_ERROR, -) from lnbits.core.services import create_user_account from lnbits.decorators import access_token_payload, check_user_exists @@ -31,16 +27,14 @@ from ..crud import ( get_account, get_account_by_email, get_account_by_pubkey, + get_account_by_username, get_account_by_username_or_email, - get_user, - get_user_password, + get_user_from_account, update_account, - update_user_password, - update_user_pubkey, - verify_user_password, ) from ..models import ( AccessTokenPayload, + Account, CreateUser, LoginUsernamePassword, LoginUsr, @@ -50,7 +44,7 @@ from ..models import ( UpdateUserPassword, UpdateUserPubkey, User, - UserConfig, + UserExtra, ) auth_router = APIRouter(prefix="/api/v1/auth", tags=["Auth"]) @@ -65,65 +59,43 @@ async def get_auth_user(user: User = Depends(check_user_exists)) -> User: async def login(data: LoginUsernamePassword) -> JSONResponse: if not settings.is_auth_method_allowed(AuthMethods.username_and_password): raise HTTPException( - HTTP_401_UNAUTHORIZED, "Login by 'Username and Password' not allowed." + HTTPStatus.UNAUTHORIZED, "Login by 'Username and Password' not allowed." ) - - try: - user = await get_account_by_username_or_email(data.username) - - if not user: - raise HTTPException(HTTP_401_UNAUTHORIZED, "Invalid credentials.") - if not await verify_user_password(user.id, data.password): - raise HTTPException(HTTP_401_UNAUTHORIZED, "Invalid credentials.") - - return _auth_success_response(user.username, user.id, user.email) - except HTTPException as exc: - raise exc - except Exception as exc: - logger.debug(exc) - raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, "Cannot login.") from exc + account = await get_account_by_username_or_email(data.username) + if not account or not account.verify_password(data.password): + raise HTTPException(HTTPStatus.UNAUTHORIZED, "Invalid credentials.") + return _auth_success_response(account.username, account.id, account.email) @auth_router.post("/nostr", description="Login via Nostr") async def nostr_login(request: Request) -> JSONResponse: if not settings.is_auth_method_allowed(AuthMethods.nostr_auth_nip98): - raise HTTPException(HTTP_401_UNAUTHORIZED, "Login with Nostr Auth not allowed.") - - try: - event = _nostr_nip98_event(request) - - user = await get_account_by_pubkey(event["pubkey"]) - if not user: - user = await create_user_account( - pubkey=event["pubkey"], user_config=UserConfig(provider="nostr") - ) - - return _auth_success_response(user.username or "", user.id, user.email) - except HTTPException as exc: - raise exc - except AssertionError as exc: - raise HTTPException(HTTP_401_UNAUTHORIZED, str(exc)) from exc - except Exception as exc: - logger.warning(exc) - raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, "Cannot login.") from exc + raise HTTPException( + HTTPStatus.UNAUTHORIZED, "Login with Nostr Auth not allowed." + ) + event = _nostr_nip98_event(request) + account = await get_account_by_pubkey(event["pubkey"]) + if not account: + account = Account( + id=uuid4().hex, + pubkey=event["pubkey"], + extra=UserExtra(provider="nostr"), + ) + await create_user_account(account) + return _auth_success_response(account.username or "", account.id, account.email) @auth_router.post("/usr", description="Login via the User ID") async def login_usr(data: LoginUsr) -> JSONResponse: if not settings.is_auth_method_allowed(AuthMethods.user_id_only): - raise HTTPException(HTTP_401_UNAUTHORIZED, "Login by 'User ID' not allowed.") - - try: - user = await get_user(data.usr) - if not user: - raise HTTPException(HTTP_401_UNAUTHORIZED, "User ID does not exist.") - - return _auth_success_response(user.username or "", user.id, user.email) - except HTTPException as exc: - raise exc - except Exception as exc: - logger.debug(exc) - raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, "Cannot login.") from exc + raise HTTPException( + HTTPStatus.UNAUTHORIZED, + "Login by 'User ID' not allowed.", + ) + account = await get_account(data.usr) + if not account: + raise HTTPException(HTTPStatus.UNAUTHORIZED, "User ID does not exist.") + return _auth_success_response(account.username, account.id, account.email) @auth_router.get("/{provider}", description="SSO Provider") @@ -133,7 +105,8 @@ async def login_with_sso_provider( provider_sso = _new_sso(provider) if not provider_sso: raise HTTPException( - HTTP_401_UNAUTHORIZED, f"Login by '{provider}' not allowed." + HTTPStatus.UNAUTHORIZED, + f"Login by '{provider}' not allowed.", ) provider_sso.redirect_uri = str(request.base_url) + f"api/v1/auth/{provider}/token" @@ -147,31 +120,22 @@ async def handle_oauth_token(request: Request, provider: str) -> RedirectRespons provider_sso = _new_sso(provider) if not provider_sso: raise HTTPException( - HTTP_401_UNAUTHORIZED, f"Login by '{provider}' not allowed." + HTTPStatus.UNAUTHORIZED, + f"Login by '{provider}' not allowed.", ) - try: - with provider_sso: - userinfo = await provider_sso.verify_and_process(request) - assert userinfo is not None - user_id = decrypt_internal_message(provider_sso.state) - request.session.pop("user", None) - return await _handle_sso_login(userinfo, user_id) - except HTTPException as exc: - raise exc - except ValueError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc - except Exception as exc: - logger.debug(exc) - raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, - f"Cannot authenticate user with {provider} Auth.", - ) from exc + with provider_sso: + userinfo = await provider_sso.verify_and_process(request) + if not userinfo: + raise HTTPException(HTTPStatus.UNAUTHORIZED, "Invalid user info.") + user_id = decrypt_internal_message(provider_sso.state) + request.session.pop("user", None) + return await _handle_sso_login(userinfo, user_id) @auth_router.post("/logout") async def logout() -> JSONResponse: - response = JSONResponse({"status": "success"}, status_code=status.HTTP_200_OK) + response = JSONResponse({"status": "success"}, HTTPStatus.OK) response.delete_cookie("cookie_access_token") response.delete_cookie("is_lnbits_user_authorized") response.delete_cookie("is_access_token_expired") @@ -184,62 +148,32 @@ async def logout() -> JSONResponse: async def register(data: CreateUser) -> JSONResponse: if not settings.is_auth_method_allowed(AuthMethods.username_and_password): raise HTTPException( - HTTP_401_UNAUTHORIZED, "Register by 'Username and Password' not allowed." + HTTPStatus.UNAUTHORIZED, + "Register by 'Username and Password' not allowed.", ) if data.password != data.password_repeat: - raise HTTPException(HTTP_400_BAD_REQUEST, "Passwords do not match.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Passwords do not match.") if not data.username: - raise HTTPException(HTTP_400_BAD_REQUEST, "Missing username.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Missing username.") if not is_valid_username(data.username): - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid username.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Invalid username.") + + if await get_account_by_username(data.username): + raise HTTPException(HTTPStatus.BAD_REQUEST, "Username already exists.") if data.email and not is_valid_email_address(data.email): - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid email.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Invalid email.") - try: - user = await create_user_account( - email=data.email, username=data.username, password=data.password - ) - return _auth_success_response(user.username, user.id, user.email) - - except ValueError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc - except Exception as exc: - logger.debug(exc) - raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, "Cannot create user." - ) from exc - - -@auth_router.put("/password") -async def update_password( - data: UpdateUserPassword, - user: User = Depends(check_user_exists), - payload: AccessTokenPayload = Depends(access_token_payload), -) -> Optional[User]: - if data.user_id != user.id: - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid user ID.") - - try: - if data.username and not user.username: - await update_account(user_id=user.id, username=data.username) - - # old accounts do not have a pasword - if await get_user_password(data.user_id): - assert data.password_old, "Missing old password" - old_pwd_ok = await verify_user_password(data.user_id, data.password_old) - assert old_pwd_ok, "Invalid credentials." - - return await update_user_password(data, payload.auth_time or 0) - except AssertionError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc - except Exception as exc: - logger.debug(exc) - raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, "Cannot update user password." - ) from exc + account = Account( + id=uuid4().hex, + email=data.email, + username=data.username, + ) + account.hash_password(data.password) + await create_user_account(account) + return _auth_success_response(account.username, account.id, account.email) @auth_router.put("/pubkey") @@ -249,62 +183,89 @@ async def update_pubkey( payload: AccessTokenPayload = Depends(access_token_payload), ) -> Optional[User]: if data.user_id != user.id: - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid user ID.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Invalid user ID.") - try: - data.pubkey = normalize_public_key(data.pubkey) - return await update_user_pubkey(data, payload.auth_time or 0) + _validate_auth_timeout(payload.auth_time) + if ( + data.pubkey + and data.pubkey != user.pubkey + and await get_account_by_pubkey(data.pubkey) + ): + raise HTTPException(HTTPStatus.BAD_REQUEST, "Public key already in use.") - except AssertionError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc - except Exception as exc: - logger.debug(exc) - raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, "Cannot update user pubkey." - ) from exc + account = await get_account(user.id) + if not account: + raise HTTPException(HTTPStatus.NOT_FOUND, "Account not found.") + + account.pubkey = normalize_public_key(data.pubkey) + await update_account(account) + return await get_user_from_account(account) + + +@auth_router.put("/password") +async def update_password( + data: UpdateUserPassword, + user: User = Depends(check_user_exists), + payload: AccessTokenPayload = Depends(access_token_payload), +) -> Optional[User]: + _validate_auth_timeout(payload.auth_time) + assert data.user_id == user.id, "Invalid user ID." + if ( + data.username + and user.username != data.username + and await get_account_by_username(data.username) + ): + raise HTTPException(HTTPStatus.BAD_REQUEST, "Username already exists.") + + account = await get_account(user.id) + assert account, "Account not found." + + # old accounts do not have a password + if account.password_hash: + assert data.password_old, "Missing old password." + assert account.verify_password(data.password_old), "Invalid old password." + + account.username = data.username + account.hash_password(data.password) + await update_account(account) + _user = await get_user_from_account(account) + if not _user: + raise HTTPException(HTTPStatus.NOT_FOUND, "User not found.") + return _user @auth_router.put("/reset") async def reset_password(data: ResetUserPassword) -> JSONResponse: if not settings.is_auth_method_allowed(AuthMethods.username_and_password): raise HTTPException( - HTTP_401_UNAUTHORIZED, "Auth by 'Username and Password' not allowed." + HTTPStatus.UNAUTHORIZED, "Auth by 'Username and Password' not allowed." ) + assert data.password == data.password_repeat, "Passwords do not match." + assert data.reset_key[:10].startswith("reset_key_"), "This is not a reset key." + try: - assert data.reset_key[:10] == "reset_key_", "This is not a reset key." - - reset_data_json = decrypt_internal_message( - base64.b64decode(data.reset_key[10:]).decode() - ) - assert reset_data_json, "Cannot process reset key." - - action, user_id, request_time = json.loads(reset_data_json) - assert action == "reset", "Expected reset action." - assert user_id is not None, "Missing user ID." - assert request_time is not None, "Missing reset time." - - user = await get_account(user_id) - assert user, "User not found." - - update_pwd = UpdateUserPassword( - user_id=user.id, - username=user.username or "", - password=data.password, - password_repeat=data.password_repeat, - ) - user = await update_user_password(update_pwd, request_time) - - return _auth_success_response( - username=user.username, user_id=user_id, email=user.email - ) - except AssertionError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc + reset_key = base64.b64decode(data.reset_key[10:]).decode() + reset_data_json = decrypt_internal_message(reset_key) except Exception as exc: - logger.warning(exc) - raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, "Cannot reset user password." - ) from exc + raise ValueError("Invalid reset key.") from exc + + assert reset_data_json, "Cannot process reset key." + + action, user_id, request_time = json.loads(reset_data_json) + assert action, "Missing action." + assert user_id, "Missing user ID." + assert request_time, "Missing reset time." + + _validate_auth_timeout(request_time) + + account = await get_account(user_id) + if not account: + raise HTTPException(HTTPStatus.NOT_FOUND, "User not found.") + + account.hash_password(data.password) + await update_account(account) + return _auth_success_response(account.username, user_id, account.email) @auth_router.put("/update") @@ -312,80 +273,83 @@ async def update( data: UpdateUser, user: User = Depends(check_user_exists) ) -> Optional[User]: if data.user_id != user.id: - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid user ID.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Invalid user ID.") if data.username and not is_valid_username(data.username): - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid username.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Invalid username.") if data.email != user.email: - raise HTTPException(HTTP_400_BAD_REQUEST, "Email mismatch.") - - try: - return await update_account(user.id, data.username, None, data.config) - except AssertionError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc - except Exception as exc: - logger.debug(exc) raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, "Cannot update user." - ) from exc + HTTPStatus.BAD_REQUEST, + "Email mismatch.", + ) + if ( + data.username + and user.username != data.username + and await get_account_by_username(data.username) + ): + raise HTTPException(HTTPStatus.BAD_REQUEST, "Username already exists.") + if ( + data.email + and data.email != user.email + and await get_account_by_email(data.email) + ): + raise HTTPException(HTTPStatus.BAD_REQUEST, "Email already exists.") + + account = await get_account(user.id) + if not account: + raise HTTPException(HTTPStatus.NOT_FOUND, "Account not found.") + + if data.username: + account.username = data.username + if data.email: + account.email = data.email + if data.extra: + account.extra = data.extra + + await update_account(account) + return await get_user_from_account(account) @auth_router.put("/first_install") async def first_install(data: UpdateSuperuserPassword) -> JSONResponse: if not settings.first_install: - raise HTTPException(HTTP_401_UNAUTHORIZED, "This is not your first install") - try: - await update_account( - user_id=settings.super_user, - username=data.username, - user_config=UserConfig(provider="lnbits"), - ) - super_user = UpdateUserPassword( - user_id=settings.super_user, - password=data.password, - password_repeat=data.password_repeat, - username=data.username, - ) - user = await update_user_password(super_user, int(time())) - settings.first_install = False - return _auth_success_response(user.username, user.id, user.email) - except AssertionError as exc: - raise HTTPException(HTTP_403_FORBIDDEN, str(exc)) from exc - except Exception as exc: - logger.debug(exc) - raise HTTPException( - HTTP_500_INTERNAL_SERVER_ERROR, "Cannot init user password." - ) from exc + raise HTTPException(HTTPStatus.UNAUTHORIZED, "This is not your first install") + account = await get_account(settings.super_user) + if not account: + raise HTTPException(HTTPStatus.INTERNAL_SERVER_ERROR, "Superuser not found.") + account.username = data.username + account.extra = account.extra or UserExtra() + account.extra.provider = "lnbits" + account.hash_password(data.password) + await update_account(account) + settings.first_install = False + return _auth_success_response(account.username, account.id, account.email) async def _handle_sso_login(userinfo: OpenID, verified_user_id: Optional[str] = None): email = userinfo.email if not email or not is_valid_email_address(email): - raise HTTPException(HTTP_400_BAD_REQUEST, "Invalid email.") + raise HTTPException(HTTPStatus.BAD_REQUEST, "Invalid email.") redirect_path = "/wallet" - user_config = UserConfig(**dict(userinfo)) - user_config.email_verified = True - account = await get_account_by_email(email) if verified_user_id: if account: - raise HTTPException(HTTP_401_UNAUTHORIZED, "Email already used.") + raise HTTPException(HTTPStatus.UNAUTHORIZED, "Email already used.") account = await get_account(verified_user_id) if not account: - raise HTTPException(HTTP_401_UNAUTHORIZED, "Cannot verify user email.") + raise HTTPException(HTTPStatus.UNAUTHORIZED, "Cannot verify user email.") redirect_path = "/account" if account: - user = await update_account(account.id, email=email, user_config=user_config) + account.extra = account.extra or UserExtra() + account.extra.email_verified = True + await update_account(account) else: - if not settings.new_accounts_allowed: - raise HTTPException(HTTP_400_BAD_REQUEST, "Account creation is disabled.") - user = await create_user_account(email=email, user_config=user_config) - - if not user: - raise HTTPException(HTTP_401_UNAUTHORIZED, "User not found.") - + account = Account( + id=uuid4().hex, email=email, extra=UserExtra(email_verified=True) + ) + await create_user_account(account) return _auth_redirect_response(redirect_path, email) @@ -461,23 +425,23 @@ def _find_auth_provider_class(provider: str) -> Callable: def _nostr_nip98_event(request: Request) -> dict: auth_header = request.headers.get("Authorization") - assert auth_header, "Nostr Auth header missing." - + if not auth_header: + raise HTTPException(HTTPStatus.UNAUTHORIZED, "Nostr Auth header missing.") scheme, token = auth_header.split() - assert scheme.lower() == "nostr", "Authorization header is not nostr." - + if scheme.lower() != "nostr": + raise HTTPException(HTTPStatus.UNAUTHORIZED, "Invalid Authorization scheme.") event = None try: event_json = base64.b64decode(token.encode("ascii")) event = json.loads(event_json) except Exception as exc: logger.warning(exc) - assert event, "Nostr login event cannot be parsed." - assert verify_event(event), "Nostr login event is not valid." - + if not verify_event(event): + raise HTTPException(HTTPStatus.BAD_REQUEST, "Nostr login event is not valid.") assert event["kind"] == 27_235, "Invalid event kind." + auth_threshold = settings.auth_credetials_update_threshold assert ( abs(time() - event["created_at"]) < auth_threshold @@ -485,11 +449,22 @@ def _nostr_nip98_event(request: Request) -> dict: method: Optional[str] = next((v for k, v in event["tags"] if k == "method"), None) assert method, "Tag 'method' is missing." - assert method.upper() == "POST", "Incorrect value for tag 'method'." + assert method.upper() == "POST", "Invalid value for tag 'method'." url = next((v for k, v in event["tags"] if k == "u"), None) + assert url, "Tag 'u' for URL is missing." accepted_urls = [f"{u}/nostr" for u in settings.nostr_absolute_request_urls] - assert url in accepted_urls, f"Incorrect value for tag 'u': '{url}'." + assert url in accepted_urls, f"Invalid value for tag 'u': '{url}'." return event + + +def _validate_auth_timeout(auth_time: Optional[int] = 0): + if abs(time() - (auth_time or 0)) > settings.auth_credetials_update_threshold: + raise HTTPException( + HTTPStatus.BAD_REQUEST, + "You can only update your credentials in the first" + f" {settings.auth_credetials_update_threshold} seconds." + " Please login again or ask a new reset key!", + ) diff --git a/lnbits/core/views/extension_api.py b/lnbits/core/views/extension_api.py index 71bd3215f..1c93428aa 100644 --- a/lnbits/core/views/extension_api.py +++ b/lnbits/core/views/extension_api.py @@ -1,7 +1,6 @@ +import sys +import traceback from http import HTTPStatus -from typing import ( - List, -) from bolt11 import decode as bolt11_decode from fastapi import ( @@ -21,10 +20,12 @@ from lnbits.core.extensions.models import ( CreateExtension, Extension, ExtensionConfig, + ExtensionMeta, ExtensionRelease, InstallableExtension, PayToEnableInfo, ReleasePaymentInfo, + UserExtension, UserExtensionInfo, ) from lnbits.core.models import ( @@ -38,15 +39,15 @@ from lnbits.decorators import ( ) from ..crud import ( + create_user_extension, delete_dbversion, drop_extension_db, - get_dbversions, + get_db_version, get_installed_extension, get_installed_extensions, get_user_extension, - update_extension_pay_to_enable, + update_installed_extension, update_user_extension, - update_user_extension_extra, ) extension_router = APIRouter( @@ -71,8 +72,13 @@ async def api_install_extension(data: CreateExtension): ) release.payment_hash = data.payment_hash + ext_meta = ExtensionMeta(installed_release=release) ext_info = InstallableExtension( - id=data.ext_id, name=data.ext_id, installed_release=release, icon=release.icon + id=data.ext_id, + name=data.ext_id, + version=data.version, + meta=ext_meta, + icon=release.icon, ) try: @@ -80,6 +86,8 @@ async def api_install_extension(data: CreateExtension): except Exception as exc: logger.warning(exc) + etype, _, tb = sys.exc_info() + traceback.print_exception(etype, exc, tb) ext_info.clean_extension_files() detail = ( str(exc) @@ -109,33 +117,28 @@ async def api_install_extension(data: CreateExtension): ) from exc -@extension_router.get("/{ext_id}/details", dependencies=[Depends(check_user_exists)]) +@extension_router.get("/{ext_id}/details") async def api_extension_details( ext_id: str, details_link: str, ): + all_releases = await InstallableExtension.get_extension_releases(ext_id) - try: - all_releases = await InstallableExtension.get_extension_releases(ext_id) - - release = next( - (r for r in all_releases if r.details_link == details_link), None - ) - assert release, "Details not found for release" - - release_details = await ExtensionRelease.fetch_release_details(details_link) - assert release_details, "Cannot fetch details for release" - release_details["icon"] = release.icon - release_details["repo"] = release.repo - return release_details - except AssertionError as exc: - raise HTTPException(HTTPStatus.BAD_REQUEST, str(exc)) from exc - except Exception as exc: - logger.warning(exc) + release = next((r for r in all_releases if r.details_link == details_link), None) + if not release: raise HTTPException( - HTTPStatus.INTERNAL_SERVER_ERROR, - f"Failed to get details for extension {ext_id}.", - ) from exc + status_code=HTTPStatus.NOT_FOUND, detail="Release not found" + ) + + release_details = await ExtensionRelease.fetch_release_details(details_link) + if not release_details: + raise HTTPException( + status_code=HTTPStatus.INTERNAL_SERVER_ERROR, + detail="Cannot fetch details for release", + ) + release_details["icon"] = release.icon + release_details["repo"] = release.repo + return release_details @extension_router.put("/{ext_id}/sell") @@ -144,22 +147,21 @@ async def api_update_pay_to_enable( data: PayToEnableInfo, user: User = Depends(check_admin), ) -> SimpleStatus: - try: - assert ( - data.wallet in user.wallet_ids - ), "Wallet does not belong to this admin user." - await update_extension_pay_to_enable(ext_id, data) - return SimpleStatus( - success=True, message=f"Payment info updated for '{ext_id}' extension." - ) - except AssertionError as exc: - raise HTTPException(HTTPStatus.BAD_REQUEST, str(exc)) from exc - except Exception as exc: - logger.warning(exc) + if data.wallet not in user.wallet_ids: raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=(f"Failed to update pay to install data for extension '{ext_id}' "), - ) from exc + HTTPStatus.BAD_REQUEST, "Wallet does not belong to this admin user." + ) + extension = await get_installed_extension(ext_id) + if not extension: + raise HTTPException(HTTPStatus.NOT_FOUND, f"Extension '{ext_id}' not found.") + if extension.meta: + extension.meta.pay_to_enable = data + else: + extension.meta = ExtensionMeta(pay_to_enable=data) + await update_installed_extension(extension) + return SimpleStatus( + success=True, message=f"Payment info updated for '{ext_id}' extension." + ) @extension_router.put("/{ext_id}/enable") @@ -176,28 +178,34 @@ async def api_enable_extension( assert ext, f"Extension '{ext_id}' is not installed." assert ext.active, f"Extension '{ext_id}' is not activated." + user_ext = await get_user_extension(user.id, ext_id) + if not user_ext: + user_ext = UserExtension(user=user.id, extension=ext_id, active=False) + await create_user_extension(user_ext) + if user.admin or not ext.requires_payment: - await update_user_extension(user_id=user.id, extension=ext_id, active=True) + user_ext.active = True + await update_user_extension(user_ext) return SimpleStatus(success=True, message=f"Extension '{ext_id}' enabled.") - user_ext = await get_user_extension(user.id, ext_id) - if not (user_ext and user_ext.extra and user_ext.extra.payment_hash_to_enable): + if not (user_ext.extra and user_ext.extra.payment_hash_to_enable): raise HTTPException( HTTPStatus.PAYMENT_REQUIRED, f"Extension '{ext_id}' requires payment." ) if user_ext.is_paid: - await update_user_extension(user_id=user.id, extension=ext_id, active=True) + user_ext.active = True + await update_user_extension(user_ext) return SimpleStatus( success=True, message=f"Paid extension '{ext_id}' enabled." ) assert ( - ext.pay_to_enable and ext.pay_to_enable.wallet + ext.meta and ext.meta.pay_to_enable and ext.meta.pay_to_enable.wallet ), f"Extension '{ext_id}' is missing payment wallet." payment_status = await check_transaction_status( - wallet_id=ext.pay_to_enable.wallet, + wallet_id=ext.meta.pay_to_enable.wallet, payment_hash=user_ext.extra.payment_hash_to_enable, ) @@ -207,10 +215,9 @@ async def api_enable_extension( f"Invoice generated but not paid for enabeling extension '{ext_id}'.", ) + user_ext.active = True user_ext.extra.paid_to_enable = True - await update_user_extension_extra(user.id, ext_id, user_ext.extra) - - await update_user_extension(user_id=user.id, extension=ext_id, active=True) + await update_user_extension(user_ext) return SimpleStatus(success=True, message=f"Paid extension '{ext_id}' enabled.") except AssertionError as exc: @@ -233,16 +240,15 @@ async def api_disable_extension( raise HTTPException( HTTPStatus.BAD_REQUEST, f"Extension '{ext_id}' doesn't exist." ) - try: - logger.info(f"Disabeling extension: {ext_id}.") - await update_user_extension(user_id=user.id, extension=ext_id, active=False) - return SimpleStatus(success=True, message=f"Extension '{ext_id}' disabled.") - except Exception as exc: - logger.warning(exc) - raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=(f"Failed to disable '{ext_id}'."), - ) from exc + user_ext = await get_user_extension(user.id, ext_id) + if not user_ext or not user_ext.active: + return SimpleStatus( + success=True, message=f"Extension '{ext_id}' already disabled." + ) + logger.info(f"Disabeling extension: {ext_id}.") + user_ext.active = False + await update_user_extension(user_ext) + return SimpleStatus(success=True, message=f"Extension '{ext_id}' disabled.") @extension_router.put("/{ext_id}/activate", dependencies=[Depends(check_admin)]) @@ -298,7 +304,11 @@ async def api_uninstall_extension(ext_id: str) -> SimpleStatus: installed_ext = next( (ext for ext in installed_extensions if ext.id == valid_ext_id), None ) - if installed_ext and ext_id in installed_ext.dependencies: + if ( + installed_ext + and installed_ext.meta + and ext_id in installed_ext.meta.dependencies + ): raise HTTPException( status_code=HTTPStatus.BAD_REQUEST, detail=( @@ -319,9 +329,9 @@ async def api_uninstall_extension(ext_id: str) -> SimpleStatus: @extension_router.get("/{ext_id}/releases", dependencies=[Depends(check_admin)]) -async def get_extension_releases(ext_id: str) -> List[ExtensionRelease]: +async def get_extension_releases(ext_id: str) -> list[ExtensionRelease]: try: - extension_releases: List[ExtensionRelease] = ( + extension_releases: list[ExtensionRelease] = ( await InstallableExtension.get_extension_releases(ext_id) ) @@ -386,45 +396,59 @@ async def get_pay_to_install_invoice( async def get_pay_to_enable_invoice( ext_id: str, data: PayToEnableInfo, user: User = Depends(check_user_exists) ): - try: - assert data.amount and data.amount > 0, "A non-zero amount must be specified." - - ext = await get_installed_extension(ext_id) - assert ext, f"Extension '{ext_id}' not found." - assert ext.pay_to_enable, f"Payment Info not found for extension '{ext_id}'." - assert ( - ext.pay_to_enable.required - ), f"Payment not required for extension '{ext_id}'." - assert ext.pay_to_enable.wallet and ext.pay_to_enable.amount, ( - f"Payment wallet or amount missing for extension '{ext_id}'." - "Please contact the administrator." - ) - assert ( - data.amount >= ext.pay_to_enable.amount - ), f"Minimum amount is {ext.pay_to_enable.amount} sats." - - payment_hash, payment_request = await create_invoice( - wallet_id=ext.pay_to_enable.wallet, - amount=data.amount, - memo=f"Enable '{ext.name}' extension.", - ) - - user_ext = await get_user_extension(user.id, ext_id) - user_ext_info = ( - user_ext.extra if user_ext and user_ext.extra else UserExtensionInfo() - ) - user_ext_info.payment_hash_to_enable = payment_hash - await update_user_extension_extra(user.id, ext_id, user_ext_info) - - return {"payment_hash": payment_hash, "payment_request": payment_request} - - except AssertionError as exc: - raise HTTPException(HTTPStatus.BAD_REQUEST, str(exc)) from exc - except Exception as exc: - logger.warning(exc) + if not data.amount or data.amount <= 0: raise HTTPException( - HTTPStatus.INTERNAL_SERVER_ERROR, "Cannot request invoice." - ) from exc + status_code=HTTPStatus.BAD_REQUEST, detail="Amount must be greater than 0." + ) + + ext = await get_installed_extension(ext_id) + if not ext: + raise HTTPException( + status_code=HTTPStatus.NOT_FOUND, detail=f"Extension '{ext_id}' not found." + ) + + if not ext.meta or not ext.meta.pay_to_enable: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"Payment info not found for extension '{ext_id}'.", + ) + + if not ext.meta.pay_to_enable.required: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"Payment not required for extension '{ext_id}'.", + ) + + if not ext.meta.pay_to_enable.wallet or not ext.meta.pay_to_enable.amount: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"Payment wallet or amount missing for extension '{ext_id}'.", + ) + + if data.amount < ext.meta.pay_to_enable.amount: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=( + f"Amount {data.amount} sats is less than required " + f"{ext.meta.pay_to_enable.amount} sats." + ), + ) + + payment = await create_invoice( + wallet_id=ext.meta.pay_to_enable.wallet, + amount=data.amount, + memo=f"Enable '{ext.name}' extension.", + ) + + user_ext = await get_user_extension(user.id, ext_id) + if not user_ext: + user_ext = UserExtension(user=user.id, extension=ext_id, active=False) + await create_user_extension(user_ext) + user_ext_info = user_ext.extra if user_ext.extra else UserExtensionInfo() + user_ext_info.payment_hash_to_enable = payment.payment_hash + user_ext.extra = user_ext_info + await update_user_extension(user_ext) + return {"payment_hash": payment.payment_hash, "payment_request": payment.bolt11} @extension_router.get( @@ -454,7 +478,7 @@ async def get_extension_release(org: str, repo: str, tag_name: str): ) async def delete_extension_db(ext_id: str): try: - db_version = (await get_dbversions()).get(ext_id, None) + db_version = await get_db_version(ext_id) if not db_version: raise HTTPException( status_code=HTTPStatus.BAD_REQUEST, diff --git a/lnbits/core/views/generic.py b/lnbits/core/views/generic.py index 4b725151c..d2f89b05b 100644 --- a/lnbits/core/views/generic.py +++ b/lnbits/core/views/generic.py @@ -9,13 +9,12 @@ from fastapi.exceptions import HTTPException from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse from fastapi.routing import APIRouter from lnurl import decode as lnurl_decode -from loguru import logger from pydantic.types import UUID4 -from lnbits.core.extensions.models import Extension, InstallableExtension +from lnbits.core.extensions.models import Extension, ExtensionMeta, InstallableExtension from lnbits.core.helpers import to_valid_user_id from lnbits.core.models import User -from lnbits.core.services import create_invoice +from lnbits.core.services import create_invoice, create_user_account from lnbits.decorators import check_admin, check_user_exists from lnbits.helpers import template_renderer from lnbits.settings import settings @@ -23,11 +22,11 @@ from lnbits.wallets import get_funding_source from ...utils.exchange_rates import allowed_currencies, currencies from ..crud import ( - create_account, create_wallet, - get_dbversions, + get_db_versions, get_installed_extensions, get_user, + get_wallet, ) generic_router = APIRouter( @@ -74,83 +73,87 @@ async def robots(): @generic_router.get("/extensions", name="extensions", response_class=HTMLResponse) async def extensions(request: Request, user: User = Depends(check_user_exists)): - try: - installed_exts: List[InstallableExtension] = await get_installed_extensions() - installed_exts_ids = [e.id for e in installed_exts] + installed_exts: List[InstallableExtension] = await get_installed_extensions() + installed_exts_ids = [e.id for e in installed_exts] - installable_exts = await InstallableExtension.get_installable_extensions() - installable_exts_ids = [e.id for e in installable_exts] - installable_exts += [ - e for e in installed_exts if e.id not in installable_exts_ids - ] + installable_exts = await InstallableExtension.get_installable_extensions() + installable_exts_ids = [e.id for e in installable_exts] + installable_exts += [e for e in installed_exts if e.id not in installable_exts_ids] - for e in installable_exts: - installed_ext = next((ie for ie in installed_exts if e.id == ie.id), None) - if installed_ext: - e.installed_release = installed_ext.installed_release - if installed_ext.pay_to_enable and not user.admin: - # not a security leak, but better not to share the wallet id - installed_ext.pay_to_enable.wallet = None - e.pay_to_enable = installed_ext.pay_to_enable + for e in installable_exts: + installed_ext = next((ie for ie in installed_exts if e.id == ie.id), None) + if installed_ext and installed_ext.meta: + installed_release = installed_ext.meta.installed_release + if installed_ext.meta.pay_to_enable and not user.admin: + # not a security leak, but better not to share the wallet id + installed_ext.meta.pay_to_enable.wallet = None + pay_to_enable = installed_ext.meta.pay_to_enable - # use the installed extension values - e.name = installed_ext.name - e.short_description = installed_ext.short_description - e.icon = installed_ext.icon + if e.meta: + e.meta.installed_release = installed_release + e.meta.pay_to_enable = pay_to_enable + else: + e.meta = ExtensionMeta( + installed_release=installed_release, + pay_to_enable=pay_to_enable, + ) + # use the installed extension values + e.name = installed_ext.name + e.short_description = installed_ext.short_description + e.icon = installed_ext.icon - except Exception as ex: - logger.warning(ex) - installable_exts = [] - installed_exts_ids = [] + all_ext_ids = [ext.code for ext in Extension.get_valid_extensions()] + inactive_extensions = [e.id for e in await get_installed_extensions(active=False)] + db_versions = await get_db_versions() - try: - all_ext_ids = [ext.code for ext in Extension.get_valid_extensions()] - inactive_extensions = [ - e.id for e in await get_installed_extensions(active=False) - ] - db_version = await get_dbversions() - extensions = [ - { - "id": ext.id, - "name": ext.name, - "icon": ext.icon, - "shortDescription": ext.short_description, - "stars": ext.stars, - "isFeatured": ext.featured, - "dependencies": ext.dependencies, - "isInstalled": ext.id in installed_exts_ids, - "hasDatabaseTables": ext.id in db_version, - "isAvailable": ext.id in all_ext_ids, - "isAdminOnly": ext.id in settings.lnbits_admin_extensions, - "isActive": ext.id not in inactive_extensions, - "latestRelease": ( - dict(ext.latest_release) if ext.latest_release else None - ), - "installedRelease": ( - dict(ext.installed_release) if ext.installed_release else None - ), - "payToEnable": (dict(ext.pay_to_enable) if ext.pay_to_enable else {}), - "isPaymentRequired": ext.requires_payment, - } - for ext in installable_exts - ] + extensions = [ + { + "id": ext.id, + "name": ext.name, + "icon": ext.icon, + "shortDescription": ext.short_description, + "stars": ext.stars, + "isFeatured": ext.meta.featured if ext.meta else False, + "dependencies": ext.meta.dependencies if ext.meta else "", + "isInstalled": ext.id in installed_exts_ids, + "hasDatabaseTables": next( + (True for version in db_versions if version.db == ext.id), False + ), + "isAvailable": ext.id in all_ext_ids, + "isAdminOnly": ext.id in settings.lnbits_admin_extensions, + "isActive": ext.id not in inactive_extensions, + "latestRelease": ( + dict(ext.meta.latest_release) + if ext.meta and ext.meta.latest_release + else None + ), + "installedRelease": ( + dict(ext.meta.installed_release) + if ext.meta and ext.meta.installed_release + else None + ), + "payToEnable": ( + dict(ext.meta.pay_to_enable) + if ext.meta and ext.meta.pay_to_enable + else {} + ), + "isPaymentRequired": ext.requires_payment, + } + for ext in installable_exts + ] - # refresh user state. Eg: enabled extensions. - user = await get_user(user.id) or user + # refresh user state. Eg: enabled extensions. + # TODO: refactor + # user = await get_user(user.id) or user - return template_renderer().TemplateResponse( - request, - "core/extensions.html", - { - "user": user.dict(), - "extensions": extensions, - }, - ) - except Exception as exc: - logger.warning(exc) - raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(exc) - ) from exc + return template_renderer().TemplateResponse( + request, + "core/extensions.html", + { + "user": user.json(), + "extensions": extensions, + }, + ) @generic_router.get( @@ -165,18 +168,16 @@ async def wallet( wal: Optional[UUID4] = Query(None), ): if wal: - wallet_id = wal.hex + wallet = await get_wallet(wal.hex) elif len(user.wallets) == 0: wallet = await create_wallet(user_id=user.id) - user = await get_user(user_id=user.id) or user - wallet_id = wallet.id + user.wallets.append(wallet) elif lnbits_last_active_wallet and user.get_wallet(lnbits_last_active_wallet): - wallet_id = lnbits_last_active_wallet + wallet = await get_wallet(lnbits_last_active_wallet) else: - wallet_id = user.wallets[0].id + wallet = user.wallets[0] - user_wallet = user.get_wallet(wallet_id) - if not user_wallet or user_wallet.deleted: + if not wallet or wallet.deleted: return template_renderer().TemplateResponse( request, "error.html", {"err": "Wallet not found"}, HTTPStatus.NOT_FOUND ) @@ -185,15 +186,16 @@ async def wallet( request, "core/wallet.html", { - "user": user.dict(), - "wallet": user_wallet.dict(), + "user": user.json(), + "wallet": wallet.json(), + "wallet_name": wallet.name, "currencies": allowed_currencies(), "service_fee": settings.lnbits_service_fee, "service_fee_max": settings.lnbits_service_fee_max, "web_manifest": f"/manifest/{user.id}.webmanifest", }, ) - resp.set_cookie("lnbits_last_active_wallet", wallet_id) + resp.set_cookie("lnbits_last_active_wallet", wallet.id) return resp @@ -209,7 +211,9 @@ async def account( return template_renderer().TemplateResponse( request, "core/account.html", - {"user": user.dict()}, + { + "user": user.json(), + }, ) @@ -228,11 +232,9 @@ async def service_worker(request: Request): @generic_router.get("/manifest/{usr}.webmanifest") async def manifest(request: Request, usr: str): host = urlparse(str(request.url)).netloc - user = await get_user(usr) if not user: raise HTTPException(status_code=HTTPStatus.NOT_FOUND) - return { "short_name": settings.lnbits_site_title, "name": settings.lnbits_site_title + " Wallet", @@ -320,10 +322,10 @@ async def node(request: Request, user: User = Depends(check_admin)): request, "node/index.html", { - "user": user.dict(), + "user": user.json(), "settings": settings.dict(), "balance": balance, - "wallets": user.wallets[0].dict(), + "wallets": user.wallets[0].json(), }, ) @@ -358,7 +360,7 @@ async def admin_index(request: Request, user: User = Depends(check_admin)): request, "admin/index.html", { - "user": user.dict(), + "user": user.json(), "settings": settings.dict(), "balance": balance, "currencies": list(currencies.keys()), @@ -375,7 +377,7 @@ async def users_index(request: Request, user: User = Depends(check_admin)): "users/index.html", { "request": request, - "user": user.dict(), + "user": user.json(), "settings": settings.dict(), "currencies": list(currencies.keys()), }, @@ -424,7 +426,7 @@ async def lnurlwallet(request: Request): status_code=HTTPStatus.BAD_REQUEST, detail="Invalid lnurl. Expected maxWithdrawable", ) - account = await create_account() + account = await create_user_account() wallet = await create_wallet(user_id=account.id) _, payment_request = await create_invoice( wallet_id=wallet.id, diff --git a/lnbits/core/views/payment_api.py b/lnbits/core/views/payment_api.py index 2cb87c842..53d42f6e4 100644 --- a/lnbits/core/views/payment_api.py +++ b/lnbits/core/views/payment_api.py @@ -3,13 +3,12 @@ import json import uuid from http import HTTPStatus from math import ceil -from typing import List, Optional, Union +from typing import List, Optional from urllib.parse import urlparse import httpx from fastapi import ( APIRouter, - Body, Depends, Header, HTTPException, @@ -21,7 +20,6 @@ from loguru import logger from sse_starlette.sse import EventSourceResponse from lnbits import bolt11 -from lnbits.core.db import db from lnbits.core.models import ( CreateInvoice, CreateLnurl, @@ -121,7 +119,7 @@ async def api_payments_paginated( return page -async def api_payments_create_invoice(data: CreateInvoice, wallet: Wallet): +async def _api_payments_create_invoice(data: CreateInvoice, wallet: Wallet): description_hash = b"" unhashed_description = b"" memo = data.memo or settings.lnbits_site_title @@ -145,60 +143,42 @@ async def api_payments_create_invoice(data: CreateInvoice, wallet: Wallet): # do not save memo if description_hash or unhashed_description is set memo = "" - async with db.connect() as conn: - payment_hash, payment_request = await create_invoice( - wallet_id=wallet.id, - amount=data.amount, - memo=memo, - currency=data.unit, - description_hash=description_hash, - unhashed_description=unhashed_description, - expiry=data.expiry, - extra=data.extra, - webhook=data.webhook, - internal=data.internal, - conn=conn, - ) - # NOTE: we get the checking_id with a seperate query because create_invoice - # does not return it and it would be a big hustle to change its return type - # (used across extensions) - payment_db = await get_standalone_payment(payment_hash, conn=conn) - assert payment_db is not None, "payment not found" - checking_id = payment_db.checking_id + payment = await create_invoice( + wallet_id=wallet.id, + amount=data.amount, + memo=memo, + currency=data.unit, + description_hash=description_hash, + unhashed_description=unhashed_description, + expiry=data.expiry, + extra=data.extra, + webhook=data.webhook, + internal=data.internal, + ) - invoice = bolt11.decode(payment_request) - - lnurl_response: Union[None, bool, str] = None + # lnurl_response is not saved in the database if data.lnurl_callback: headers = {"User-Agent": settings.user_agent} async with httpx.AsyncClient(headers=headers) as client: try: r = await client.get( data.lnurl_callback, - params={ - "pr": payment_request, - }, + params={"pr": payment.bolt11}, timeout=10, ) if r.is_error: - lnurl_response = r.text + payment.extra["lnurl_response"] = r.text else: resp = json.loads(r.text) if resp["status"] != "OK": - lnurl_response = resp["reason"] + payment.extra["lnurl_response"] = resp["reason"] else: - lnurl_response = True + payment.extra["lnurl_response"] = True except (httpx.ConnectError, httpx.RequestError) as ex: logger.error(ex) - lnurl_response = False + payment.extra["lnurl_response"] = False - return { - "payment_hash": invoice.payment_hash, - "payment_request": payment_request, - "lnurl_response": lnurl_response, - # maintain backwards compatibility with API clients: - "checking_id": checking_id, - } + return payment @payment_router.post( @@ -220,30 +200,25 @@ async def api_payments_create_invoice(data: CreateInvoice, wallet: Wallet): }, ) async def api_payments_create( + invoice_data: CreateInvoice, wallet: WalletTypeInfo = Depends(require_invoice_key), - invoice_data: CreateInvoice = Body(...), -): +) -> Payment: if invoice_data.out is True and wallet.key_type == KeyType.admin: if not invoice_data.bolt11: raise HTTPException( status_code=HTTPStatus.BAD_REQUEST, - detail="BOLT11 string is invalid or not given", + detail="Missing BOLT11 invoice", ) - - payment_hash = await pay_invoice( + payment = await pay_invoice( wallet_id=wallet.wallet.id, payment_request=invoice_data.bolt11, extra=invoice_data.extra, ) - return { - "payment_hash": payment_hash, - # maintain backwards compatibility with API clients: - "checking_id": payment_hash, - } + return payment elif not invoice_data.out: # invoice key - return await api_payments_create_invoice(invoice_data, wallet.wallet) + return await _api_payments_create_invoice(invoice_data, wallet.wallet) else: raise HTTPException( status_code=HTTPStatus.UNAUTHORIZED, @@ -269,7 +244,7 @@ async def api_payments_fee_reserve(invoice: str = Query("invoice")) -> JSONRespo @payment_router.post("/lnurl") async def api_payments_pay_lnurl( data: CreateLnurl, wallet: WalletTypeInfo = Depends(require_admin_key) -): +) -> Payment: domain = urlparse(data.callback).netloc headers = {"User-Agent": settings.user_agent} @@ -313,15 +288,12 @@ async def api_payments_pay_lnurl( raise HTTPException( status_code=HTTPStatus.BAD_REQUEST, detail=( - ( - f"{domain} returned an invalid invoice. Expected" - f" {amount_msat} msat, got {invoice.amount_msat}." - ), + f"{domain} returned an invalid invoice. Expected" + f" {amount_msat} msat, got {invoice.amount_msat}." ), ) extra = {} - if params.get("successAction"): extra["success_action"] = params["successAction"] if data.comment: @@ -330,19 +302,14 @@ async def api_payments_pay_lnurl( extra["fiat_currency"] = data.unit extra["fiat_amount"] = data.amount / 1000 assert data.description is not None, "description is required" - payment_hash = await pay_invoice( + + payment = await pay_invoice( wallet_id=wallet.wallet.id, payment_request=params["pr"], description=data.description, extra=extra, ) - - return { - "success_action": params.get("successAction"), - "payment_hash": payment_hash, - # maintain backwards compatibility with API clients: - "checking_id": payment_hash, - } + return payment async def subscribe_wallet_invoices(request: Request, wallet: Wallet): diff --git a/lnbits/core/views/user_api.py b/lnbits/core/views/user_api.py index 9318ed76a..b4780ee48 100644 --- a/lnbits/core/views/user_api.py +++ b/lnbits/core/views/user_api.py @@ -5,7 +5,7 @@ from http import HTTPStatus from typing import List from fastapi import APIRouter, Depends -from starlette.exceptions import HTTPException +from fastapi.exceptions import HTTPException from lnbits.core.crud import ( delete_account, @@ -17,8 +17,8 @@ from lnbits.core.crud import ( update_admin_settings, ) from lnbits.core.models import ( - Account, AccountFilters, + AccountOverview, CreateTopup, User, Wallet, @@ -40,42 +40,33 @@ users_router = APIRouter(prefix="/users/api/v1", dependencies=[Depends(check_adm ) async def api_get_users( filters: Filters = Depends(parse_filters(AccountFilters)), -) -> Page[Account]: - try: - filtered = await get_accounts(filters=filters) - for user in filtered.data: - user.is_super_user = user.id == settings.super_user - user.is_admin = user.id in settings.lnbits_admin_users or user.is_super_user - return filtered - except Exception as exc: - raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=f"Could not fetch users. {exc!s}", - ) from exc +) -> Page[AccountOverview]: + return await get_accounts(filters=filters) @users_router.delete("/user/{user_id}", status_code=HTTPStatus.OK) async def api_users_delete_user( user_id: str, user: User = Depends(check_admin) ) -> None: - - try: - wallets = await get_wallets(user_id) - if len(wallets) > 0: - raise Exception("Cannot delete user with wallets.") - if user_id == settings.super_user: - raise Exception("Cannot delete super user.") - - if user_id in settings.lnbits_admin_users and not user.super_user: - raise Exception("Only super_user can delete admin user.") - - await delete_account(user_id) - - except Exception as exc: + wallets = await get_wallets(user_id) + if len(wallets) > 0: raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=f"{exc!s}", - ) from exc + status_code=HTTPStatus.BAD_REQUEST, + detail="Cannot delete user with wallets.", + ) + + if user_id == settings.super_user: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail="Cannot delete super user.", + ) + + if user_id in settings.lnbits_admin_users and not user.super_user: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail="Only super_user can delete admin user.", + ) + await delete_account(user_id) @users_router.put( @@ -98,66 +89,53 @@ async def api_users_reset_password(user_id: str) -> str: @users_router.get("/user/{user_id}/admin", dependencies=[Depends(check_super_user)]) async def api_users_toggle_admin(user_id: str) -> None: - try: - if user_id == settings.super_user: - raise Exception("Cannot change super user.") - if user_id in settings.lnbits_admin_users: - settings.lnbits_admin_users.remove(user_id) - else: - settings.lnbits_admin_users.append(user_id) - update_settings = EditableSettings( - lnbits_admin_users=settings.lnbits_admin_users - ) - await update_admin_settings(update_settings) - except Exception as exc: + if user_id == settings.super_user: raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=f"Could not update admin settings. {exc}", - ) from exc + status_code=HTTPStatus.BAD_REQUEST, + detail="Cannot change super user.", + ) + if user_id in settings.lnbits_admin_users: + settings.lnbits_admin_users.remove(user_id) + else: + settings.lnbits_admin_users.append(user_id) + update_settings = EditableSettings(lnbits_admin_users=settings.lnbits_admin_users) + await update_admin_settings(update_settings) @users_router.get("/user/{user_id}/wallet") async def api_users_get_user_wallet(user_id: str) -> List[Wallet]: - try: - return await get_wallets(user_id) - except Exception as exc: - raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=f"Could not fetch user wallets. {exc}", - ) from exc + return await get_wallets(user_id) @users_router.get("/user/{user_id}/wallet/{wallet}/undelete") async def api_users_undelete_user_wallet(user_id: str, wallet: str) -> None: - try: - wal = await get_wallet(wallet) - if not wal: - raise Exception("Wallet does not exist.") - if user_id != wal.user: - raise Exception("Wallet does not belong to user.") - if wal.deleted: - await delete_wallet(user_id=user_id, wallet_id=wallet, deleted=False) - except Exception as exc: + wal = await get_wallet(wallet) + if not wal: raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=f"{exc!s}", - ) from exc + status_code=HTTPStatus.NOT_FOUND, + detail="Wallet does not exist.", + ) + + if user_id != wal.user: + raise HTTPException( + status_code=HTTPStatus.FORBIDDEN, + detail="Wallet does not belong to user.", + ) + if wal.deleted: + await delete_wallet(user_id=user_id, wallet_id=wallet, deleted=False) @users_router.delete("/user/{user_id}/wallet/{wallet}") async def api_users_delete_user_wallet(user_id: str, wallet: str) -> None: - try: - wal = await get_wallet(wallet) - if not wal: - raise Exception("Wallet does not exist.") - if wal.deleted: - await force_delete_wallet(wallet) - await delete_wallet(user_id=user_id, wallet_id=wallet) - except Exception as exc: + wal = await get_wallet(wallet) + if not wal: raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, - detail=f"{exc!s}", - ) from exc + status_code=HTTPStatus.NOT_FOUND, + detail="Wallet does not exist.", + ) + if wal.deleted: + await force_delete_wallet(wallet) + await delete_wallet(user_id=user_id, wallet_id=wallet) @users_router.put( @@ -167,14 +145,9 @@ async def api_users_delete_user_wallet(user_id: str, wallet: str) -> None: dependencies=[Depends(check_super_user)], ) async def api_topup_balance(data: CreateTopup) -> dict[str, str]: - try: - await get_wallet(data.id) - if settings.lnbits_backend_wallet_class == "VoidWallet": - raise Exception("VoidWallet active") + await get_wallet(data.id) + if settings.lnbits_backend_wallet_class == "VoidWallet": + raise Exception("VoidWallet active") - await update_wallet_balance(wallet_id=data.id, amount=int(data.amount)) - return {"status": "Success"} - except Exception as exc: - raise HTTPException( - status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=f"{exc!s}" - ) from exc + await update_wallet_balance(wallet_id=data.id, amount=int(data.amount)) + return {"status": "Success"} diff --git a/lnbits/core/views/wallet_api.py b/lnbits/core/views/wallet_api.py index f2ffcaab4..e0f663b2c 100644 --- a/lnbits/core/views/wallet_api.py +++ b/lnbits/core/views/wallet_api.py @@ -1,9 +1,11 @@ +from http import HTTPStatus from typing import Optional from fastapi import ( APIRouter, Body, Depends, + HTTPException, ) from lnbits.core.models import ( @@ -20,6 +22,7 @@ from lnbits.decorators import ( from ..crud import ( create_wallet, delete_wallet, + get_wallet, update_wallet, ) @@ -27,35 +30,45 @@ wallet_router = APIRouter(prefix="/api/v1/wallet", tags=["Wallet"]) @wallet_router.get("") -async def api_wallet(wallet: WalletTypeInfo = Depends(require_invoice_key)): +async def api_wallet(key_info: WalletTypeInfo = Depends(require_invoice_key)): res = { - "name": wallet.wallet.name, - "balance": wallet.wallet.balance_msat, + "name": key_info.wallet.name, + "balance": key_info.wallet.balance_msat, } - if wallet.key_type == KeyType.admin: - res["id"] = wallet.wallet.id + if key_info.key_type == KeyType.admin: + res["id"] = key_info.wallet.id return res @wallet_router.put("/{new_name}") async def api_update_wallet_name( - new_name: str, wallet: WalletTypeInfo = Depends(require_admin_key) + new_name: str, key_info: WalletTypeInfo = Depends(require_admin_key) ): - await update_wallet(wallet.wallet.id, new_name) + wallet = await get_wallet(key_info.wallet.id) + if not wallet: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Wallet not found") + wallet.name = new_name + await update_wallet(wallet) return { - "id": wallet.wallet.id, - "name": wallet.wallet.name, - "balance": wallet.wallet.balance_msat, + "id": wallet.id, + "name": wallet.name, + "balance": wallet.balance_msat, } -@wallet_router.patch("", response_model=Wallet) +@wallet_router.patch("") async def api_update_wallet( name: Optional[str] = Body(None), currency: Optional[str] = Body(None), - wallet: WalletTypeInfo = Depends(require_admin_key), -): - return await update_wallet(wallet.wallet.id, name, currency) + key_info: WalletTypeInfo = Depends(require_admin_key), +) -> Wallet: + wallet = await get_wallet(key_info.wallet.id) + if not wallet: + raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail="Wallet not found") + wallet.name = name or wallet.name + wallet.currency = currency if currency is not None else wallet.currency + await update_wallet(wallet) + return wallet @wallet_router.delete("") @@ -68,9 +81,9 @@ async def api_delete_wallet( ) -@wallet_router.post("", response_model=Wallet) +@wallet_router.post("") async def api_create_wallet( data: CreateWallet, - wallet: WalletTypeInfo = Depends(require_admin_key), + key_info: WalletTypeInfo = Depends(require_admin_key), ) -> Wallet: - return await create_wallet(user_id=wallet.wallet.user, wallet_name=data.name) + return await create_wallet(user_id=key_info.wallet.user, wallet_name=data.name) diff --git a/lnbits/db.py b/lnbits/db.py index 687d73cc9..a929f0eb9 100644 --- a/lnbits/db.py +++ b/lnbits/db.py @@ -1,13 +1,14 @@ from __future__ import annotations import asyncio -import datetime +import json import os import re import time from contextlib import asynccontextmanager +from datetime import datetime, timezone from enum import Enum -from typing import Any, Generic, Literal, Optional, TypeVar +from typing import Any, Generic, Literal, Optional, TypeVar, Union from loguru import logger from pydantic import BaseModel, ValidationError, root_validator @@ -50,7 +51,7 @@ def compat_timestamp_placeholder(key: str): def get_placeholder(model: Any, field: str) -> str: type_ = model.__fields__[field].type_ - if type_ == datetime.datetime: + if type_ == datetime: return compat_timestamp_placeholder(field) else: return f":{field}" @@ -67,7 +68,7 @@ class Compat: return f"{seconds}" return "" - def datetime_to_timestamp(self, date: datetime.datetime): + def datetime_to_timestamp(self, date: datetime): if self.type in {POSTGRES, COCKROACH}: return date.strftime("%Y-%m-%d %H:%M:%S") elif self.type == SQLITE: @@ -134,7 +135,7 @@ class Connection(Compat): for key, raw_value in values.items(): if isinstance(raw_value, str): clean_values[key] = re.sub(clean_regex, "", raw_value) - elif isinstance(raw_value, datetime.datetime): + elif isinstance(raw_value, datetime): ts = raw_value.timestamp() if self.type == SQLITE: clean_values[key] = int(ts) @@ -144,29 +145,59 @@ class Connection(Compat): clean_values[key] = raw_value return clean_values - async def fetchall(self, query: str, values: Optional[dict] = None) -> list[dict]: + async def fetchall( + self, + query: str, + values: Optional[dict] = None, + model: Optional[type[TModel]] = None, + ) -> list[TModel]: params = self.rewrite_values(values) if values else {} result = await self.conn.execute(text(self.rewrite_query(query)), params) row = result.mappings().all() result.close() + if not row: + return [] + if model: + return [dict_to_model(r, model) for r in row] return row - async def fetchone(self, query: str, values: Optional[dict] = None) -> dict: + async def fetchone( + self, + query: str, + values: Optional[dict] = None, + model: Optional[type[TModel]] = None, + ) -> TModel: params = self.rewrite_values(values) if values else {} result = await self.conn.execute(text(self.rewrite_query(query)), params) row = result.mappings().first() result.close() + if model and row: + return dict_to_model(row, model) return row + async def update( + self, table_name: str, model: BaseModel, where: str = "WHERE id = :id" + ): + await self.conn.execute( + text(update_query(table_name, model, where)), model_to_dict(model) + ) + await self.conn.commit() + + async def insert(self, table_name: str, model: BaseModel): + await self.conn.execute( + text(insert_query(table_name, model)), model_to_dict(model) + ) + await self.conn.commit() + async def fetch_page( self, query: str, where: Optional[list[str]] = None, values: Optional[dict] = None, filters: Optional[Filters] = None, - model: Optional[type[TRowModel]] = None, + model: Optional[type[TModel]] = None, group_by: Optional[list[str]] = None, - ) -> Page[TRowModel]: + ) -> Page[TModel]: if not filters: filters = Filters() clause = filters.where(where) @@ -190,11 +221,12 @@ class Connection(Compat): {filters.pagination()} """, self.rewrite_values(parsed_values), + model, ) if rows: # no need for extra query if no pagination is specified if filters.offset or filters.limit: - result = await self.fetchone( + result = await self.execute( f""" SELECT COUNT(*) as count FROM ( {query} @@ -204,14 +236,16 @@ class Connection(Compat): """, parsed_values, ) - count = int(result.get("count", 0)) + row = result.mappings().first() + result.close() + count = int(row.get("count", 0)) else: count = len(rows) else: count = 0 return Page( - data=[model.from_row(row) for row in rows] if model else [], + data=rows, total=count, ) @@ -251,21 +285,19 @@ class Database(Compat): @event.listens_for(self.engine.sync_engine, "connect") def register_custom_types(dbapi_connection, *_): - def _parse_timestamp(value): + def _parse_date(value) -> datetime: if value is None: - return None + value = "1970-01-01 00:00:00" f = "%Y-%m-%d %H:%M:%S.%f" if "." not in value: f = "%Y-%m-%d %H:%M:%S" - return int( - time.mktime(datetime.datetime.strptime(value, f).timetuple()) - ) + return datetime.strptime(value, f) dbapi_connection.run_async( lambda connection: connection.set_type_codec( "TIMESTAMP", - encoder=datetime.datetime, - decoder=_parse_timestamp, + encoder=datetime, + decoder=_parse_date, schema="pg_catalog", ) ) @@ -296,13 +328,33 @@ class Database(Compat): finally: self.lock.release() - async def fetchall(self, query: str, values: Optional[dict] = None) -> list[dict]: + async def fetchall( + self, + query: str, + values: Optional[dict] = None, + model: Optional[type[TModel]] = None, + ) -> list[TModel]: async with self.connect() as conn: - return await conn.fetchall(query, values) + return await conn.fetchall(query, values, model) - async def fetchone(self, query: str, values: Optional[dict] = None) -> dict: + async def fetchone( + self, + query: str, + values: Optional[dict] = None, + model: Optional[type[TModel]] = None, + ) -> TModel: async with self.connect() as conn: - return await conn.fetchone(query, values) + return await conn.fetchone(query, values, model) + + async def insert(self, table_name: str, model: BaseModel) -> None: + async with self.connect() as conn: + await conn.insert(table_name, model) + + async def update( + self, table_name: str, model: BaseModel, where: str = "WHERE id = :id" + ) -> None: + async with self.connect() as conn: + await conn.update(table_name, model, where) async def fetch_page( self, @@ -310,9 +362,9 @@ class Database(Compat): where: Optional[list[str]] = None, values: Optional[dict] = None, filters: Optional[Filters] = None, - model: Optional[type[TRowModel]] = None, + model: Optional[type[TModel]] = None, group_by: Optional[list[str]] = None, - ) -> Page[TRowModel]: + ) -> Page[TModel]: async with self.connect() as conn: return await conn.fetch_page(query, where, values, filters, model, group_by) @@ -372,12 +424,6 @@ class Operator(Enum): raise ValueError("Unknown SQL Operator") -class FromRowModel(BaseModel): - @classmethod - def from_row(cls, row: dict): - return cls(**row) - - class FilterModel(BaseModel): __search_fields__: list[str] = [] __sort_fields__: Optional[list[str]] = None @@ -385,7 +431,6 @@ class FilterModel(BaseModel): T = TypeVar("T") TModel = TypeVar("TModel", bound=BaseModel) -TRowModel = TypeVar("TRowModel", bound=FromRowModel) TFilterModel = TypeVar("TFilterModel", bound=FilterModel) @@ -435,10 +480,7 @@ class Filter(BaseModel, Generic[TFilterModel]): stmt = [] for key in self.values.keys() if self.values else []: clean_key = key.split("__")[0] - if ( - self.model - and self.model.__fields__[clean_key].type_ == datetime.datetime - ): + if self.model and self.model.__fields__[clean_key].type_ == datetime: placeholder = compat_timestamp_placeholder(key) else: placeholder = f":{key}" @@ -518,3 +560,111 @@ class Filters(BaseModel, Generic[TFilterModel]): if self.search and self.model: values["search"] = f"%{self.search}%" return values + + +def insert_query(table_name: str, model: BaseModel) -> str: + """ + Generate an insert query with placeholders for a given table and model + :param table_name: Name of the table + :param model: Pydantic model + """ + placeholders = [] + keys = model_to_dict(model).keys() + for field in keys: + placeholders.append(get_placeholder(model, field)) + # add quotes to keys to avoid SQL conflicts (e.g. `user` is a reserved keyword) + fields = ", ".join([f'"{key}"' for key in keys]) + values = ", ".join(placeholders) + return f"INSERT INTO {table_name} ({fields}) VALUES ({values})" + + +def update_query( + table_name: str, model: BaseModel, where: str = "WHERE id = :id" +) -> str: + """ + Generate an update query with placeholders for a given table and model + :param table_name: Name of the table + :param model: Pydantic model + :param where: Where string, default to `WHERE id = :id` + """ + fields = [] + for field in model_to_dict(model).keys(): + placeholder = get_placeholder(model, field) + # add quotes to keys to avoid SQL conflicts (e.g. `user` is a reserved keyword) + fields.append(f'"{field}" = {placeholder}') + query = ", ".join(fields) + return f"UPDATE {table_name} SET {query} {where}" + + +def model_to_dict(model: BaseModel) -> dict: + """ + Convert a Pydantic model to a dictionary with JSON-encoded nested models + private fields starting with _ are ignored + :param model: Pydantic model + """ + _dict: dict = {} + for key, value in model.dict().items(): + type_ = model.__fields__[key].type_ + if model.__fields__[key].field_info.extra.get("no_database", False): + continue + if isinstance(value, datetime): + _dict[key] = value.timestamp() + continue + if type(type_) is type(BaseModel) or type_ is dict: + _dict[key] = json.dumps(value) + continue + _dict[key] = value + + return _dict + + +def dict_to_submodel(model: type[TModel], value: Union[dict, str]) -> Optional[TModel]: + """convert a dictionary or JSON string to a Pydantic model""" + if isinstance(value, str): + if value == "null": + return None + _subdict = json.loads(value) + elif isinstance(value, dict): + _subdict = value + else: + logger.warning(f"Expected str or dict, got {type(value)}") + return None + # recursively convert nested models + return dict_to_model(_subdict, model) + + +def dict_to_model(_row: dict, model: type[TModel]) -> TModel: + """ + Convert a dictionary with JSON-encoded nested models to a Pydantic model + :param _dict: Dictionary from database + :param model: Pydantic model + """ + _dict: dict = {} + for key, value in _row.items(): + if value is None: + continue + if key not in model.__fields__: + logger.warning(f"Converting {key} to model `{model}`.") + continue + type_ = model.__fields__[key].type_ + if issubclass(type_, bool): + _dict[key] = bool(value) + continue + if issubclass(type_, datetime): + if DB_TYPE == SQLITE: + _dict[key] = datetime.fromtimestamp(value, timezone.utc) + else: + _dict[key] = value + continue + if issubclass(type_, BaseModel) and value: + _dict[key] = dict_to_submodel(type_, value) + continue + # TODO: remove this when all sub models are migrated to Pydantic + # NOTE: this is for type dict on BaseModel, (used in Payment class) + if type_ is dict and value: + _dict[key] = json.loads(value) + continue + _dict[key] = value + continue + _model = model.construct(**_dict) + return _model diff --git a/lnbits/decorators.py b/lnbits/decorators.py index 6e9e32911..ba66dc8b1 100644 --- a/lnbits/decorators.py +++ b/lnbits/decorators.py @@ -14,12 +14,13 @@ from lnbits.core.crud import ( get_account, get_account_by_email, get_account_by_username, - get_user, get_user_active_extensions_ids, + get_user_from_account, get_wallet_for_key, ) from lnbits.core.models import ( AccessTokenPayload, + Account, KeyType, SimpleStatus, User, @@ -65,7 +66,7 @@ class KeyChecker(SecurityBase): name="X-API-KEY", description="Wallet API Key - HEADER", ) - self.model: APIKey = openapi_model + self.model: APIKey = openapi_model # type: ignore async def __call__(self, request: Request) -> WalletTypeInfo: @@ -144,14 +145,16 @@ async def check_user_exists( else: raise HTTPException(HTTPStatus.UNAUTHORIZED, "Missing user ID or access token.") - if not account or not settings.is_user_allowed(account.id): + if not account: + raise HTTPException(HTTPStatus.UNAUTHORIZED, "User not found.") + + if not settings.is_user_allowed(account.id): raise HTTPException(HTTPStatus.UNAUTHORIZED, "User not allowed.") - user = await get_user(account.id) - assert user, "User not found for account." - + user = await get_user_from_account(account) + if not user: + raise HTTPException(HTTPStatus.UNAUTHORIZED, "User not found.") await _check_user_extension_access(user.id, r["path"]) - return user @@ -261,7 +264,7 @@ async def _check_user_extension_access(user_id: str, current_path: str): ) -async def _get_account_from_token(access_token) -> Optional[User]: +async def _get_account_from_token(access_token) -> Optional[Account]: try: payload: dict = jwt.decode(access_token, settings.auth_secret_key, ["HS256"]) user = await _get_user_from_jwt_payload(payload) @@ -281,7 +284,7 @@ async def _get_account_from_token(access_token) -> Optional[User]: raise HTTPException(HTTPStatus.UNAUTHORIZED, "Invalid access token.") from exc -async def _get_user_from_jwt_payload(payload) -> Optional[User]: +async def _get_user_from_jwt_payload(payload) -> Optional[Account]: if "sub" in payload and payload.get("sub"): return await get_account_by_username(str(payload.get("sub"))) if "usr" in payload and payload.get("usr"): diff --git a/lnbits/exceptions.py b/lnbits/exceptions.py index c66582a68..48269b39a 100644 --- a/lnbits/exceptions.py +++ b/lnbits/exceptions.py @@ -23,14 +23,6 @@ class InvoiceError(Exception): self.status = status -def register_exception_handlers(app: FastAPI): - register_exception_handler(app) - register_request_validation_exception_handler(app) - register_http_exception_handler(app) - register_payment_error_handler(app) - register_invoice_error_handler(app) - - def render_html_error(request: Request, exc: Exception) -> Optional[Response]: # Only the browser sends "text/html" request # not fail proof, but everything else get's a JSON response @@ -63,7 +55,9 @@ def render_html_error(request: Request, exc: Exception) -> Optional[Response]: return None -def register_exception_handler(app: FastAPI): +def register_exception_handlers(app: FastAPI): + """Register exception handlers for the FastAPI app""" + @app.exception_handler(Exception) async def exception_handler(request: Request, exc: Exception): etype, _, tb = sys.exc_info() @@ -74,8 +68,26 @@ def register_exception_handler(app: FastAPI): content={"detail": str(exc)}, ) + @app.exception_handler(AssertionError) + async def assert_error_handler(request: Request, exc: AssertionError): + etype, _, tb = sys.exc_info() + traceback.print_exception(etype, exc, tb) + logger.warning(f"AssertionError: {exc!s}") + return render_html_error(request, exc) or JSONResponse( + status_code=HTTPStatus.BAD_REQUEST, + content={"detail": str(exc)}, + ) + + @app.exception_handler(ValueError) + async def value_error_handler(request: Request, exc: ValueError): + etype, _, tb = sys.exc_info() + traceback.print_exception(etype, exc, tb) + logger.warning(f"ValueError: {exc!s}") + return render_html_error(request, exc) or JSONResponse( + status_code=HTTPStatus.BAD_REQUEST, + content={"detail": str(exc)}, + ) -def register_request_validation_exception_handler(app: FastAPI): @app.exception_handler(RequestValidationError) async def validation_exception_handler( request: Request, exc: RequestValidationError @@ -86,8 +98,6 @@ def register_request_validation_exception_handler(app: FastAPI): content={"detail": str(exc)}, ) - -def register_http_exception_handler(app: FastAPI): @app.exception_handler(HTTPException) async def http_exception_handler(request: Request, exc: HTTPException): logger.error(f"HTTPException {exc.status_code}: {exc.detail}") @@ -96,8 +106,6 @@ def register_http_exception_handler(app: FastAPI): content={"detail": exc.detail}, ) - -def register_payment_error_handler(app: FastAPI): @app.exception_handler(PaymentError) async def payment_error_handler(request: Request, exc: PaymentError): logger.error(f"{exc.message}, {exc.status}") @@ -106,8 +114,6 @@ def register_payment_error_handler(app: FastAPI): content={"detail": exc.message, "status": exc.status}, ) - -def register_invoice_error_handler(app: FastAPI): @app.exception_handler(InvoiceError) async def invoice_error_handler(request: Request, exc: InvoiceError): logger.error(f"{exc.message}, Status: {exc.status}") diff --git a/lnbits/helpers.py b/lnbits/helpers.py index 2c89261d9..ba755b1c1 100644 --- a/lnbits/helpers.py +++ b/lnbits/helpers.py @@ -1,17 +1,15 @@ import json import re -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Any, List, Optional, Type +from typing import Any, Optional, Type import jinja2 import jwt import shortuuid -from pydantic import BaseModel from pydantic.schema import field_schema from lnbits.core.extensions.models import Extension -from lnbits.db import get_placeholder from lnbits.jinja2_templating import Jinja2Templates from lnbits.nodes import get_node_class from lnbits.requestvars import g @@ -51,7 +49,7 @@ def static_url_for(static: str, path: str) -> str: return f"/{static}/{path}?v={settings.server_startup_time}" -def template_renderer(additional_folders: Optional[List] = None) -> Jinja2Templates: +def template_renderer(additional_folders: Optional[list] = None) -> Jinja2Templates: folders = ["lnbits/templates", "lnbits/core/templates"] if additional_folders: additional_folders += [ @@ -175,37 +173,6 @@ def generate_filter_params_openapi(model: Type[FilterModel], keep_optional=False } -def insert_query(table_name: str, model: BaseModel) -> str: - """ - Generate an insert query with placeholders for a given table and model - :param table_name: Name of the table - :param model: Pydantic model - """ - placeholders = [] - for field in model.dict().keys(): - placeholders.append(get_placeholder(model, field)) - fields = ", ".join(model.dict().keys()) - values = ", ".join(placeholders) - return f"INSERT INTO {table_name} ({fields}) VALUES ({values})" - - -def update_query( - table_name: str, model: BaseModel, where: str = "WHERE id = :id" -) -> str: - """ - Generate an update query with placeholders for a given table and model - :param table_name: Name of the table - :param model: Pydantic model - :param where: Where string, default to `WHERE id = :id` - """ - fields = [] - for field in model.dict().keys(): - placeholder = get_placeholder(model, field) - fields.append(f"{field} = {placeholder}") - query = ", ".join(fields) - return f"UPDATE {table_name} SET {query} {where}" - - def is_valid_email_address(email: str) -> bool: email_regex = r"[A-Za-z0-9\._%+-]+@[A-Za-z0-9\.-]+\.[A-Za-z]{2,63}" return re.fullmatch(email_regex, email) is not None @@ -217,7 +184,9 @@ def is_valid_username(username: str) -> bool: def create_access_token(data: dict): - expire = datetime.utcnow() + timedelta(minutes=settings.auth_token_expire_minutes) + expire = datetime.now(timezone.utc) + timedelta( + minutes=settings.auth_token_expire_minutes + ) to_encode = data.copy() to_encode.update({"exp": expire}) return jwt.encode(to_encode, settings.auth_secret_key, "HS256") diff --git a/lnbits/settings.py b/lnbits/settings.py index f4aeb07cf..34d2e2230 100644 --- a/lnbits/settings.py +++ b/lnbits/settings.py @@ -7,7 +7,6 @@ import json from enum import Enum from hashlib import sha256 from os import path -from sqlite3 import Row from time import time from typing import Any, Optional @@ -635,11 +634,6 @@ class ReadOnlySettings( class Settings(EditableSettings, ReadOnlySettings, TransientSettings, BaseSettings): - @classmethod - def from_row(cls, row: Row) -> Settings: - data = dict(row) - return cls(**data) - class Config: env_file = ".env" env_file_encoding = "utf-8" diff --git a/lnbits/static/bundle-components.min.js b/lnbits/static/bundle-components.min.js index e629a132e..4f082d8a1 100644 --- a/lnbits/static/bundle-components.min.js +++ b/lnbits/static/bundle-components.min.js @@ -1 +1 @@ -function generateChart(t,e){const n=e.reduce(((t,e)=>(t.labels.push(e.date),t.income.push(e.income),t.spending.push(e.spending),t.cumulative.push(e.balance),t)),{labels:[],income:[],spending:[],cumulative:[]});return new Chart(t.getContext("2d"),{type:"bar",data:{labels:n.labels,datasets:[{data:n.cumulative,type:"line",label:"balance",backgroundColor:"#673ab7",borderColor:"#673ab7",borderWidth:4,pointRadius:3,fill:!1},{data:n.income,type:"bar",label:"in",barPercentage:.75,backgroundColor:"rgba(76, 175, 80, 0.5)"},{data:n.spending,type:"bar",label:"out",barPercentage:.75,backgroundColor:"rgba(233, 30, 99, 0.5)"}]},options:{title:{text:"Chart.js Combo Time Scale"},tooltips:{mode:"index",intersect:!1},scales:{xAxes:[{type:"time",display:!0,time:{minUnit:"hour",stepSize:3}}]},animation:{duration:0},elements:{line:{tension:0}}}})}window.app.component("lnbits-funding-sources",{template:"#lnbits-funding-sources",mixins:[window.windowMixin],props:["form-data","allowed-funding-sources"],methods:{getFundingSourceLabel(t){const e=this.rawFundingSources.find((e=>e[0]===t));return e?e[1]:t}},computed:{fundingSources(){let t=[];for(const[e,n,i]of this.rawFundingSources){const n={};if(null!==i)for(let[t,e]of Object.entries(i))n[t]={label:e,value:null};t.push([e,n])}return new Map(t)},sortedAllowedFundingSources(){return this.allowedFundingSources.sort()}},data:()=>({rawFundingSources:[["VoidWallet","Void Wallet",null],["FakeWallet","Fake Wallet",{fake_wallet_secret:"Secret"}],["CoreLightningWallet","Core Lightning",{corelightning_rpc:"Endpoint",corelightning_pay_command:"Custom Pay Command"}],["CoreLightningRestWallet","Core Lightning Rest",{corelightning_rest_url:"Endpoint",corelightning_rest_cert:"Certificate",corelightning_rest_macaroon:"Macaroon"}],["LndRestWallet","Lightning Network Daemon (LND Rest)",{lnd_rest_endpoint:"Endpoint",lnd_rest_cert:"Certificate",lnd_rest_macaroon:"Macaroon",lnd_rest_macaroon_encrypted:"Encrypted Macaroon",lnd_rest_route_hints:"Enable Route Hints"}],["LndWallet","Lightning Network Daemon (LND)",{lnd_grpc_endpoint:"Endpoint",lnd_grpc_cert:"Certificate",lnd_grpc_port:"Port",lnd_grpc_admin_macaroon:"Admin Macaroon",lnd_grpc_macaroon_encrypted:"Encrypted Macaroon"}],["LnTipsWallet","LN.Tips",{lntips_api_endpoint:"Endpoint",lntips_api_key:"API Key"}],["LNPayWallet","LN Pay",{lnpay_api_endpoint:"Endpoint",lnpay_api_key:"API Key",lnpay_wallet_key:"Wallet Key"}],["EclairWallet","Eclair (ACINQ)",{eclair_url:"URL",eclair_pass:"Password"}],["LNbitsWallet","LNbits",{lnbits_endpoint:"Endpoint",lnbits_key:"Admin Key"}],["BlinkWallet","Blink",{blink_api_endpoint:"Endpoint",blink_ws_endpoint:"WebSocket",blink_token:"Key"}],["AlbyWallet","Alby",{alby_api_endpoint:"Endpoint",alby_access_token:"Key"}],["BoltzWallet","Boltz",{boltz_client_endpoint:"Endpoint",boltz_client_macaroon:"Admin Macaroon path or hex",boltz_client_cert:"Certificate path or hex",boltz_client_wallet:"Wallet Name"}],["ZBDWallet","ZBD",{zbd_api_endpoint:"Endpoint",zbd_api_key:"Key"}],["PhoenixdWallet","Phoenixd",{phoenixd_api_endpoint:"Endpoint",phoenixd_api_password:"Key"}],["OpenNodeWallet","OpenNode",{opennode_api_endpoint:"Endpoint",opennode_key:"Key"}],["ClicheWallet","Cliche (NBD)",{cliche_endpoint:"Endpoint"}],["SparkWallet","Spark",{spark_url:"Endpoint",spark_token:"Token"}],["NWCWallet","Nostr Wallet Connect",{nwc_pairing_url:"Pairing URL"}],["BreezSdkWallet","Breez SDK",{breez_api_key:"Breez API Key",breez_greenlight_seed:"Greenlight Seed",breez_greenlight_device_key:"Greenlight Device Key",breez_greenlight_device_cert:"Greenlight Device Cert",breez_greenlight_invite_code:"Greenlight Invite Code"}]]})}),window.app.component("lnbits-extension-settings-form",{name:"lnbits-extension-settings-form",template:"#lnbits-extension-settings-form",props:["options","adminkey","endpoint"],methods:{async updateSettings(){if(!this.settings)return Quasar.Notify.create({message:"No settings to update",type:"negative"});try{const{data:t}=await LNbits.api.request("PUT",this.endpoint,this.adminkey,this.settings);this.settings=t}catch(t){LNbits.utils.notifyApiError(t)}},getSettings:async function(){try{const{data:t}=await LNbits.api.request("GET",this.endpoint,this.adminkey);this.settings=t}catch(t){LNbits.utils.notifyApiError(t)}},resetSettings:async function(){LNbits.utils.confirmDialog("Are you sure you want to reset the settings?").onOk((async()=>{try{await LNbits.api.request("DELETE",this.endpoint,this.adminkey),await this.getSettings()}catch(t){LNbits.utils.notifyApiError(t)}}))}},created:async function(){await this.getSettings()},data:function(){return{settings:void 0}}}),window.app.component("lnbits-extension-settings-btn-dialog",{template:"#lnbits-extension-settings-btn-dialog",name:"lnbits-extension-settings-btn-dialog",props:["options","adminkey","endpoint"],data:function(){return{show:!1}}}),window.app.component("payment-list",{name:"payment-list",template:"#payment-list",props:["update","wallet","mobileSimple","lazy"],mixins:[window.windowMixin],data:function(){return{denomination:LNBITS_DENOMINATION,payments:[],paymentsTable:{columns:[{name:"time",align:"left",label:this.$t("memo")+"/"+this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount")+" ("+LNBITS_DENOMINATION+")",field:"sat",sortable:!0}],pagination:{rowsPerPage:10,page:1,sortBy:"time",descending:!0,rowsNumber:10},search:null,loading:!1},exportTagName:"",exportPaymentTagList:[],paymentsCSV:{columns:[{name:"pending",align:"left",label:"Pending",field:"pending"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"},{name:"time",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount")+" ("+LNBITS_DENOMINATION+")",field:"sat",sortable:!0},{name:"fee",align:"right",label:this.$t("fee")+" (m"+LNBITS_DENOMINATION+")",field:"fee"},{name:"tag",align:"right",label:this.$t("tag"),field:"tag"},{name:"payment_hash",align:"right",label:this.$t("payment_hash"),field:"payment_hash"},{name:"payment_proof",align:"right",label:this.$t("payment_proof"),field:"payment_proof"},{name:"webhook",align:"right",label:this.$t("webhook"),field:"webhook"},{name:"fiat_currency",align:"right",label:"Fiat Currency",field:t=>t.extra.wallet_fiat_currency},{name:"fiat_amount",align:"right",label:"Fiat Amount",field:t=>t.extra.wallet_fiat_amount}],filter:null,loading:!1}}},computed:{filteredPayments:function(){var t=this.paymentsTable.search;return t&&""!==t?LNbits.utils.search(this.payments,t):this.payments},paymentsOmitter(){return this.$q.screen.lt.md&&this.mobileSimple?this.payments.length>0?[this.payments[0]]:[]:this.payments},pendingPaymentsExist:function(){return-1!==this.payments.findIndex((t=>t.pending))}},methods:{fetchPayments:function(t){const e=LNbits.utils.prepareFilterQuery(this.paymentsTable,t);return LNbits.api.getPayments(this.wallet,e).then((t=>{this.paymentsTable.loading=!1,this.paymentsTable.pagination.rowsNumber=t.data.total,this.payments=t.data.data.map((t=>LNbits.map.payment(t)))})).catch((t=>{this.paymentsTable.loading=!1,LNbits.utils.notifyApiError(t)}))},paymentTableRowKey:function(t){return t.payment_hash+t.amount},exportCSV(t=!1){const e=this.paymentsTable.pagination,n={sortby:e.sortBy??"time",direction:e.descending?"desc":"asc"},i=new URLSearchParams(n);LNbits.api.getPayments(this.wallet,i).then((e=>{let n=e.data.data.map(LNbits.map.payment),i=this.paymentsCSV.columns;if(t){this.exportPaymentTagList.length&&(n=n.filter((t=>this.exportPaymentTagList.includes(t.tag))));const t=Object.keys(n.reduce(((t,e)=>({...t,...e.details})),{})).map((t=>({name:t,align:"right",label:t.charAt(0).toUpperCase()+t.slice(1).replace(/([A-Z])/g," $1"),field:e=>e.details[t],format:t=>"object"==typeof t?JSON.stringify(t):t})));i=this.paymentsCSV.columns.concat(t)}LNbits.utils.exportCSV(i,n,this.wallet.name+"-payments")}))},addFilterTag:function(){if(!this.exportTagName)return;const t=this.exportTagName.trim();this.exportPaymentTagList=this.exportPaymentTagList.filter((e=>e!==t)),this.exportPaymentTagList.push(t),this.exportTagName=""},removeExportTag:function(t){this.exportPaymentTagList=this.exportPaymentTagList.filter((e=>e!==t))},formatCurrency:function(t,e){try{return LNbits.utils.formatCurrency(t,e)}catch(e){return console.error(e),`${t} ???`}}},watch:{lazy:function(t){!0===t&&this.fetchPayments()},update:function(){this.fetchPayments()}},created:function(){void 0===this.lazy&&this.fetchPayments()}}),window.app.component("payment-chart",{template:"#payment-chart",name:"payment-chart",props:["wallet"],mixins:[window.windowMixin],data:function(){return{paymentsChart:{show:!1,group:{value:"hour",label:"Hour"},groupOptions:[{value:"hour",label:"Hour"},{value:"day",label:"Day"},{value:"week",label:"Week"},{value:"month",label:"Month"},{value:"year",label:"Year"}],instance:null}}},methods:{showChart:function(){this.paymentsChart.show=!0,LNbits.api.request("GET","/api/v1/payments/history?group="+this.paymentsChart.group.value,this.wallet.adminkey).then((t=>{this.$nextTick((()=>{this.paymentsChart.instance&&this.paymentsChart.instance.destroy(),this.paymentsChart.instance=generateChart(this.$refs.canvas,t.data)}))})).catch((t=>{LNbits.utils.notifyApiError(t),this.paymentsChart.show=!1}))}}}),window.app.component(QrcodeVue),window.app.component("lnbits-extension-rating",{template:"#lnbits-extension-rating",name:"lnbits-extension-rating",props:["rating"]}),window.app.component("lnbits-fsat",{template:"{{ fsat }}",props:{amount:{type:Number,default:0}},computed:{fsat:function(){return LNbits.utils.formatSat(this.amount)}}}),window.app.component("lnbits-wallet-list",{template:"#lnbits-wallet-list",props:["balance"],data:function(){return{user:null,activeWallet:null,balance:0,showForm:!1,walletName:"",LNBITS_DENOMINATION:LNBITS_DENOMINATION}},computed:{wallets:function(){var t=this.balance;return this.user.wallets.map((function(e){return e.live_fsat=t.length&&t[0]===e.id?LNbits.utils.formatSat(t[1]):e.fsat,e}))}},methods:{createWallet:function(){LNbits.api.createWallet(this.user.wallets[0],this.walletName)}},created:function(){window.user&&(this.user=LNbits.map.user(window.user)),window.wallet&&(this.activeWallet=LNbits.map.wallet(window.wallet)),document.addEventListener("updateWalletBalance",this.updateWalletBalance)}}),window.app.component("lnbits-extension-list",{template:"#lnbits-extension-list",data:function(){return{extensions:[],user:null}},computed:{userExtensions:function(){if(!this.user)return[];var t=window.location.pathname,e=this.user.extensions;return this.extensions.filter((function(t){return-1!==e.indexOf(t.code)})).map((function(e){return e.isActive=t.startsWith(e.url),e}))}},created:function(){window.extensions&&(this.extensions=window.extensions.map((function(t){return LNbits.map.extension(t)})).sort((function(t,e){return t.name.localeCompare(e.name)}))),window.user&&(this.user=LNbits.map.user(window.user))}}),window.app.component("lnbits-manage",{template:"#lnbits-manage",props:["showAdmin","showNode","showExtensions","showUsers"],methods:{isActive:function(t){return window.location.pathname===t}},data:()=>({extensions:[],user:null}),created(){window.user&&(this.user=LNbits.map.user(window.user))}}),window.app.component("lnbits-payment-details",{template:"#lnbits-payment-details",props:["payment"],mixins:[window.windowMixin],data:function(){return{LNBITS_DENOMINATION:LNBITS_DENOMINATION}},computed:{hasPreimage(){return this.payment.preimage&&"0000000000000000000000000000000000000000000000000000000000000000"!==this.payment.preimage},hasExpiry(){return!!this.payment.expiry},hasSuccessAction(){return this.hasPreimage&&this.payment.extra&&this.payment.extra.success_action},webhookStatusColor(){return this.payment.webhook_status>=300||this.payment.webhook_status<0?"red-10":this.payment.webhook_status?"green-10":"cyan-7"},webhookStatusText(){return this.payment.webhook_status?this.payment.webhook_status:"not sent yet"},hasTag(){return this.payment.extra&&!!this.payment.extra.tag},extras(){if(!this.payment.extra)return[];let t=_.omit(this.payment.extra,["tag","success_action"]);return Object.keys(t).map((e=>({key:e,value:t[e]})))}}}),window.app.component("lnbits-lnurlpay-success-action",{template:"#lnbits-lnurlpay-success-action",props:["payment","success_action"],data(){return{decryptedValue:this.success_action.ciphertext}},mounted:function(){if("aes"!==this.success_action.tag)return null;decryptLnurlPayAES(this.success_action,this.payment.preimage).then((t=>{this.decryptedValue=t}))}}),window.app.component("lnbits-qrcode",{template:"#lnbits-qrcode",mixins:[window.windowMixin],components:{QrcodeVue:QrcodeVue},props:["value"],data:()=>({logo:LNBITS_QR_LOGO})}),window.app.component("lnbits-notifications-btn",{template:"#lnbits-notifications-btn",mixins:[window.windowMixin],props:["pubkey"],data:()=>({isSupported:!1,isSubscribed:!1,isPermissionGranted:!1,isPermissionDenied:!1}),methods:{urlB64ToUint8Array(t){const e=(t+"=".repeat((4-t.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),n=atob(e),i=new Uint8Array(n.length);for(let t=0;te!==t)),this.$q.localStorage.set("lnbits.webpush.subscribedUsers",JSON.stringify(e))},isUserSubscribed(t){return(JSON.parse(this.$q.localStorage.getItem("lnbits.webpush.subscribedUsers"))||[]).includes(t)},subscribe(){var t=this;this.isSupported&&!this.isPermissionDenied&&(Notification.requestPermission().then((t=>{this.isPermissionGranted="granted"===t,this.isPermissionDenied="denied"===t})).catch((function(t){console.log(t)})),navigator.serviceWorker.ready.then((e=>{navigator.serviceWorker.getRegistration().then((e=>{e.pushManager.getSubscription().then((function(n){if(null===n||!t.isUserSubscribed(t.g.user.id)){const n={applicationServerKey:t.urlB64ToUint8Array(t.pubkey),userVisibleOnly:!0};e.pushManager.subscribe(n).then((function(e){LNbits.api.request("POST","/api/v1/webpush",t.g.user.wallets[0].adminkey,{subscription:JSON.stringify(e)}).then((function(e){t.saveUserSubscribed(e.data.user),t.isSubscribed=!0})).catch((function(t){LNbits.utils.notifyApiError(t)}))}))}})).catch((function(t){console.log(t)}))}))})))},unsubscribe(){var t=this;navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{e&&LNbits.api.request("DELETE","/api/v1/webpush?endpoint="+btoa(e.endpoint),t.g.user.wallets[0].adminkey).then((function(){t.removeUserSubscribed(t.g.user.id),t.isSubscribed=!1})).catch((function(t){LNbits.utils.notifyApiError(t)}))}))})).catch((function(t){console.log(t)}))},checkSupported:function(){let t="https:"===window.location.protocol,e="serviceWorker"in navigator,n="Notification"in window,i="PushManager"in window;return this.isSupported=t&&e&&n&&i,this.isSupported||console.log("Notifications disabled because requirements are not met:",{HTTPS:t,"Service Worker API":e,"Notification API":n,"Push API":i}),this.isSupported},updateSubscriptionStatus:async function(){var t=this;await navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{t.isSubscribed=!!e&&t.isUserSubscribed(t.g.user.id)}))})).catch((function(t){console.log(t)}))}},created:function(){this.isPermissionDenied="denied"===Notification.permission,this.checkSupported()&&this.updateSubscriptionStatus()}}),window.app.component("lnbits-dynamic-fields",{template:"#lnbits-dynamic-fields",mixins:[window.windowMixin],props:["options","value"],data:()=>({formData:null,rules:[t=>!!t||"Field is required"]}),methods:{applyRules(t){return t?this.rules:[]},buildData(t,e={}){return t.reduce(((t,n)=>(n.options?.length?t[n.name]=this.buildData(n.options,e[n.name]):t[n.name]=e[n.name]??n.default,t)),{})},handleValueChanged(){this.$emit("input",this.formData)}},created(){this.formData=this.buildData(this.options,this.value)}}),window.app.component("lnbits-update-balance",{template:"#lnbits-update-balance",mixins:[window.windowMixin],props:["wallet_id","callback"],computed:{denomination:()=>LNBITS_DENOMINATION,admin(){return this.g.user.admin}},data:function(){return{credit:0}},methods:{updateBalance:function(t){LNbits.api.updateBalance(t,this.wallet_id).then((e=>{if("Success"!==e.data.status)throw new Error(e.data);this.callback({success:!0,credit:parseInt(t),wallet_id:this.wallet_id})})).then((e=>(t=parseInt(t),Quasar.Notify.create({type:"positive",message:this.$t("wallet_topup_ok",{amount:t}),icon:null}),t))).catch((function(t){LNbits.utils.notifyApiError(t)}))}}}),window.app.use(VueQrcodeReader),window.app.use(Quasar),window.app.use(window.i18n),window.app.mount("#vue"); +function generateChart(t,e){const i=e.reduce(((t,e)=>(t.labels.push(e.date),t.income.push(e.income),t.spending.push(e.spending),t.cumulative.push(e.balance),t)),{labels:[],income:[],spending:[],cumulative:[]});return new Chart(t.getContext("2d"),{type:"bar",data:{labels:i.labels,datasets:[{data:i.cumulative,type:"line",label:"balance",backgroundColor:"#673ab7",borderColor:"#673ab7",borderWidth:4,pointRadius:3,fill:!1},{data:i.income,type:"bar",label:"in",barPercentage:.75,backgroundColor:"rgba(76, 175, 80, 0.5)"},{data:i.spending,type:"bar",label:"out",barPercentage:.75,backgroundColor:"rgba(233, 30, 99, 0.5)"}]},options:{title:{text:"Chart.js Combo Time Scale"},tooltips:{mode:"index",intersect:!1},scales:{xAxes:[{type:"time",display:!0,time:{minUnit:"hour",stepSize:3}}]},animation:{duration:0},elements:{line:{tension:0}}}})}window.app.component("lnbits-funding-sources",{template:"#lnbits-funding-sources",mixins:[window.windowMixin],props:["form-data","allowed-funding-sources"],methods:{getFundingSourceLabel(t){const e=this.rawFundingSources.find((e=>e[0]===t));return e?e[1]:t}},computed:{fundingSources(){let t=[];for(const[e,i,n]of this.rawFundingSources){const i={};if(null!==n)for(let[t,e]of Object.entries(n))i[t]={label:e,value:null};t.push([e,i])}return new Map(t)},sortedAllowedFundingSources(){return this.allowedFundingSources.sort()}},data:()=>({rawFundingSources:[["VoidWallet","Void Wallet",null],["FakeWallet","Fake Wallet",{fake_wallet_secret:"Secret"}],["CoreLightningWallet","Core Lightning",{corelightning_rpc:"Endpoint",corelightning_pay_command:"Custom Pay Command"}],["CoreLightningRestWallet","Core Lightning Rest",{corelightning_rest_url:"Endpoint",corelightning_rest_cert:"Certificate",corelightning_rest_macaroon:"Macaroon"}],["LndRestWallet","Lightning Network Daemon (LND Rest)",{lnd_rest_endpoint:"Endpoint",lnd_rest_cert:"Certificate",lnd_rest_macaroon:"Macaroon",lnd_rest_macaroon_encrypted:"Encrypted Macaroon",lnd_rest_route_hints:"Enable Route Hints"}],["LndWallet","Lightning Network Daemon (LND)",{lnd_grpc_endpoint:"Endpoint",lnd_grpc_cert:"Certificate",lnd_grpc_port:"Port",lnd_grpc_admin_macaroon:"Admin Macaroon",lnd_grpc_macaroon_encrypted:"Encrypted Macaroon"}],["LnTipsWallet","LN.Tips",{lntips_api_endpoint:"Endpoint",lntips_api_key:"API Key"}],["LNPayWallet","LN Pay",{lnpay_api_endpoint:"Endpoint",lnpay_api_key:"API Key",lnpay_wallet_key:"Wallet Key"}],["EclairWallet","Eclair (ACINQ)",{eclair_url:"URL",eclair_pass:"Password"}],["LNbitsWallet","LNbits",{lnbits_endpoint:"Endpoint",lnbits_key:"Admin Key"}],["BlinkWallet","Blink",{blink_api_endpoint:"Endpoint",blink_ws_endpoint:"WebSocket",blink_token:"Key"}],["AlbyWallet","Alby",{alby_api_endpoint:"Endpoint",alby_access_token:"Key"}],["BoltzWallet","Boltz",{boltz_client_endpoint:"Endpoint",boltz_client_macaroon:"Admin Macaroon path or hex",boltz_client_cert:"Certificate path or hex",boltz_client_wallet:"Wallet Name"}],["ZBDWallet","ZBD",{zbd_api_endpoint:"Endpoint",zbd_api_key:"Key"}],["PhoenixdWallet","Phoenixd",{phoenixd_api_endpoint:"Endpoint",phoenixd_api_password:"Key"}],["OpenNodeWallet","OpenNode",{opennode_api_endpoint:"Endpoint",opennode_key:"Key"}],["ClicheWallet","Cliche (NBD)",{cliche_endpoint:"Endpoint"}],["SparkWallet","Spark",{spark_url:"Endpoint",spark_token:"Token"}],["NWCWallet","Nostr Wallet Connect",{nwc_pairing_url:"Pairing URL"}],["BreezSdkWallet","Breez SDK",{breez_api_key:"Breez API Key",breez_greenlight_seed:"Greenlight Seed",breez_greenlight_device_key:"Greenlight Device Key",breez_greenlight_device_cert:"Greenlight Device Cert",breez_greenlight_invite_code:"Greenlight Invite Code"}]]})}),window.app.component("lnbits-extension-settings-form",{name:"lnbits-extension-settings-form",template:"#lnbits-extension-settings-form",props:["options","adminkey","endpoint"],methods:{async updateSettings(){if(!this.settings)return Quasar.Notify.create({message:"No settings to update",type:"negative"});try{const{data:t}=await LNbits.api.request("PUT",this.endpoint,this.adminkey,this.settings);this.settings=t}catch(t){LNbits.utils.notifyApiError(t)}},getSettings:async function(){try{const{data:t}=await LNbits.api.request("GET",this.endpoint,this.adminkey);this.settings=t}catch(t){LNbits.utils.notifyApiError(t)}},resetSettings:async function(){LNbits.utils.confirmDialog("Are you sure you want to reset the settings?").onOk((async()=>{try{await LNbits.api.request("DELETE",this.endpoint,this.adminkey),await this.getSettings()}catch(t){LNbits.utils.notifyApiError(t)}}))}},created:async function(){await this.getSettings()},data:function(){return{settings:void 0}}}),window.app.component("lnbits-extension-settings-btn-dialog",{template:"#lnbits-extension-settings-btn-dialog",name:"lnbits-extension-settings-btn-dialog",props:["options","adminkey","endpoint"],data:function(){return{show:!1}}}),window.app.component("payment-list",{name:"payment-list",template:"#payment-list",props:["update","wallet","mobileSimple","lazy"],mixins:[window.windowMixin],data:function(){return{denomination:LNBITS_DENOMINATION,payments:[],paymentsTable:{columns:[{name:"time",align:"left",label:this.$t("memo")+"/"+this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount")+" ("+LNBITS_DENOMINATION+")",field:"sat",sortable:!0}],pagination:{rowsPerPage:10,page:1,sortBy:"time",descending:!0,rowsNumber:10},search:null,loading:!1},exportTagName:"",exportPaymentTagList:[],paymentsCSV:{columns:[{name:"pending",align:"left",label:"Pending",field:"pending"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"},{name:"time",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount")+" ("+LNBITS_DENOMINATION+")",field:"sat",sortable:!0},{name:"fee",align:"right",label:this.$t("fee")+" (m"+LNBITS_DENOMINATION+")",field:"fee"},{name:"tag",align:"right",label:this.$t("tag"),field:"tag"},{name:"payment_hash",align:"right",label:this.$t("payment_hash"),field:"payment_hash"},{name:"payment_proof",align:"right",label:this.$t("payment_proof"),field:"payment_proof"},{name:"webhook",align:"right",label:this.$t("webhook"),field:"webhook"},{name:"fiat_currency",align:"right",label:"Fiat Currency",field:t=>t.extra.wallet_fiat_currency},{name:"fiat_amount",align:"right",label:"Fiat Amount",field:t=>t.extra.wallet_fiat_amount}],filter:null,loading:!1}}},computed:{filteredPayments:function(){var t=this.paymentsTable.search;return t&&""!==t?LNbits.utils.search(this.payments,t):this.payments},paymentsOmitter(){return this.$q.screen.lt.md&&this.mobileSimple?this.payments.length>0?[this.payments[0]]:[]:this.payments},pendingPaymentsExist:function(){return-1!==this.payments.findIndex((t=>t.pending))}},methods:{fetchPayments:function(t){const e=LNbits.utils.prepareFilterQuery(this.paymentsTable,t);return LNbits.api.getPayments(this.wallet,e).then((t=>{this.paymentsTable.loading=!1,this.paymentsTable.pagination.rowsNumber=t.data.total,this.payments=t.data.data.map((t=>LNbits.map.payment(t)))})).catch((t=>{this.paymentsTable.loading=!1,LNbits.utils.notifyApiError(t)}))},paymentTableRowKey:function(t){return t.payment_hash+t.amount},exportCSV(t=!1){const e=this.paymentsTable.pagination,i={sortby:e.sortBy??"time",direction:e.descending?"desc":"asc"},n=new URLSearchParams(i);LNbits.api.getPayments(this.wallet,n).then((e=>{let i=e.data.data.map(LNbits.map.payment),n=this.paymentsCSV.columns;if(t){this.exportPaymentTagList.length&&(i=i.filter((t=>this.exportPaymentTagList.includes(t.tag))));const t=Object.keys(i.reduce(((t,e)=>({...t,...e.details})),{})).map((t=>({name:t,align:"right",label:t.charAt(0).toUpperCase()+t.slice(1).replace(/([A-Z])/g," $1"),field:e=>e.details[t],format:t=>"object"==typeof t?JSON.stringify(t):t})));n=this.paymentsCSV.columns.concat(t)}LNbits.utils.exportCSV(n,i,this.wallet.name+"-payments")}))},addFilterTag:function(){if(!this.exportTagName)return;const t=this.exportTagName.trim();this.exportPaymentTagList=this.exportPaymentTagList.filter((e=>e!==t)),this.exportPaymentTagList.push(t),this.exportTagName=""},removeExportTag:function(t){this.exportPaymentTagList=this.exportPaymentTagList.filter((e=>e!==t))},formatCurrency:function(t,e){try{return LNbits.utils.formatCurrency(t,e)}catch(e){return console.error(e),`${t} ???`}}},watch:{lazy:function(t){!0===t&&this.fetchPayments()},update:function(){this.fetchPayments()}},created:function(){void 0===this.lazy&&this.fetchPayments()}}),window.app.component("payment-chart",{template:"#payment-chart",name:"payment-chart",props:["wallet"],mixins:[window.windowMixin],data:function(){return{paymentsChart:{show:!1,group:{value:"hour",label:"Hour"},groupOptions:[{value:"hour",label:"Hour"},{value:"day",label:"Day"},{value:"week",label:"Week"},{value:"month",label:"Month"},{value:"year",label:"Year"}],instance:null}}},methods:{showChart:function(){this.paymentsChart.show=!0,LNbits.api.request("GET","/api/v1/payments/history?group="+this.paymentsChart.group.value,this.wallet.adminkey).then((t=>{this.$nextTick((()=>{this.paymentsChart.instance&&this.paymentsChart.instance.destroy(),this.paymentsChart.instance=generateChart(this.$refs.canvas,t.data)}))})).catch((t=>{LNbits.utils.notifyApiError(t),this.paymentsChart.show=!1}))}}}),window.app.component(QrcodeVue),window.app.component("lnbits-extension-rating",{template:"#lnbits-extension-rating",name:"lnbits-extension-rating",props:["rating"]}),window.app.component("lnbits-fsat",{template:"{{ fsat }}",props:{amount:{type:Number,default:0}},computed:{fsat:function(){return LNbits.utils.formatSat(this.amount)}}}),window.app.component("lnbits-wallet-list",{template:"#lnbits-wallet-list",props:["balance"],data:function(){return{user:null,activeWallet:null,balance:0,showForm:!1,walletName:"",LNBITS_DENOMINATION:LNBITS_DENOMINATION}},computed:{wallets:function(){var t=this.balance;return this.user.wallets.map((function(e){return e.live_fsat=t.length&&t[0]===e.id?LNbits.utils.formatSat(t[1]):e.fsat,e}))}},methods:{createWallet:function(){LNbits.api.createWallet(this.user.wallets[0],this.walletName)}},created:function(){window.user&&(this.user=LNbits.map.user(window.user)),window.wallet&&(this.activeWallet=LNbits.map.wallet(window.wallet)),document.addEventListener("updateWalletBalance",this.updateWalletBalance)}}),window.app.component("lnbits-extension-list",{template:"#lnbits-extension-list",data:function(){return{extensions:[],user:null}},computed:{userExtensions:function(){if(!this.user)return[];var t=window.location.pathname,e=this.user.extensions;return this.extensions.filter((function(t){return-1!==e.indexOf(t.code)})).map((function(e){return e.isActive=t.startsWith(e.url),e}))}},created:function(){window.extensions&&(this.extensions=window.extensions.map((function(t){return LNbits.map.extension(t)})).sort((function(t,e){return t.name.localeCompare(e.name)}))),window.user&&(this.user=LNbits.map.user(window.user))}}),window.app.component("lnbits-manage",{template:"#lnbits-manage",props:["showAdmin","showNode","showExtensions","showUsers"],methods:{isActive:function(t){return window.location.pathname===t}},data:()=>({extensions:[],user:null}),created(){window.user&&(this.user=LNbits.map.user(window.user))}}),window.app.component("lnbits-payment-details",{template:"#lnbits-payment-details",props:["payment"],mixins:[window.windowMixin],data:function(){return{LNBITS_DENOMINATION:LNBITS_DENOMINATION}},computed:{hasPreimage(){return this.payment.preimage&&"0000000000000000000000000000000000000000000000000000000000000000"!==this.payment.preimage},hasExpiry(){return!!this.payment.expiry},hasSuccessAction(){return this.hasPreimage&&this.payment.extra&&this.payment.extra.success_action},webhookStatusColor(){return this.payment.webhook_status>=300||this.payment.webhook_status<0?"red-10":this.payment.webhook_status?"green-10":"cyan-7"},webhookStatusText(){return this.payment.webhook_status?this.payment.webhook_status:"not sent yet"},hasTag(){return this.payment.extra&&!!this.payment.extra.tag},extras(){if(!this.payment.extra)return[];let t=_.omit(this.payment.extra,["tag","success_action"]);return Object.keys(t).map((e=>({key:e,value:t[e]})))}}}),window.app.component("lnbits-lnurlpay-success-action",{template:"#lnbits-lnurlpay-success-action",props:["payment","success_action"],data(){return{decryptedValue:this.success_action.ciphertext}},mounted:function(){if("aes"!==this.success_action.tag)return null;decryptLnurlPayAES(this.success_action,this.payment.preimage).then((t=>{this.decryptedValue=t}))}}),window.app.component("lnbits-qrcode",{template:"#lnbits-qrcode",mixins:[window.windowMixin],components:{QrcodeVue:QrcodeVue},props:{value:{type:String,required:!0},options:Object},data:()=>({custom:{margin:1,width:350,size:350,logo:LNBITS_QR_LOGO}}),created(){this.custom={...this.custom,...this.options}}}),window.app.component("lnbits-notifications-btn",{template:"#lnbits-notifications-btn",mixins:[window.windowMixin],props:["pubkey"],data:()=>({isSupported:!1,isSubscribed:!1,isPermissionGranted:!1,isPermissionDenied:!1}),methods:{urlB64ToUint8Array(t){const e=(t+"=".repeat((4-t.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),i=atob(e),n=new Uint8Array(i.length);for(let t=0;te!==t)),this.$q.localStorage.set("lnbits.webpush.subscribedUsers",JSON.stringify(e))},isUserSubscribed(t){return(JSON.parse(this.$q.localStorage.getItem("lnbits.webpush.subscribedUsers"))||[]).includes(t)},subscribe(){var t=this;this.isSupported&&!this.isPermissionDenied&&(Notification.requestPermission().then((t=>{this.isPermissionGranted="granted"===t,this.isPermissionDenied="denied"===t})).catch((function(t){console.log(t)})),navigator.serviceWorker.ready.then((e=>{navigator.serviceWorker.getRegistration().then((e=>{e.pushManager.getSubscription().then((function(i){if(null===i||!t.isUserSubscribed(t.g.user.id)){const i={applicationServerKey:t.urlB64ToUint8Array(t.pubkey),userVisibleOnly:!0};e.pushManager.subscribe(i).then((function(e){LNbits.api.request("POST","/api/v1/webpush",t.g.user.wallets[0].adminkey,{subscription:JSON.stringify(e)}).then((function(e){t.saveUserSubscribed(e.data.user),t.isSubscribed=!0})).catch((function(t){LNbits.utils.notifyApiError(t)}))}))}})).catch((function(t){console.log(t)}))}))})))},unsubscribe(){var t=this;navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{e&&LNbits.api.request("DELETE","/api/v1/webpush?endpoint="+btoa(e.endpoint),t.g.user.wallets[0].adminkey).then((function(){t.removeUserSubscribed(t.g.user.id),t.isSubscribed=!1})).catch((function(t){LNbits.utils.notifyApiError(t)}))}))})).catch((function(t){console.log(t)}))},checkSupported:function(){let t="https:"===window.location.protocol,e="serviceWorker"in navigator,i="Notification"in window,n="PushManager"in window;return this.isSupported=t&&e&&i&&n,this.isSupported||console.log("Notifications disabled because requirements are not met:",{HTTPS:t,"Service Worker API":e,"Notification API":i,"Push API":n}),this.isSupported},updateSubscriptionStatus:async function(){var t=this;await navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{t.isSubscribed=!!e&&t.isUserSubscribed(t.g.user.id)}))})).catch((function(t){console.log(t)}))}},created:function(){this.isPermissionDenied="denied"===Notification.permission,this.checkSupported()&&this.updateSubscriptionStatus()}}),window.app.component("lnbits-dynamic-fields",{template:"#lnbits-dynamic-fields",mixins:[window.windowMixin],props:["options","modelValue"],data:()=>({formData:null,rules:[t=>!!t||"Field is required"]}),methods:{applyRules(t){return t?this.rules:[]},buildData(t,e={}){return t.reduce(((t,i)=>(i.options?.length?t[i.name]=this.buildData(i.options,e[i.name]):t[i.name]=e[i.name]??i.default,t)),{})},handleValueChanged(){this.$emit("update:model-value",this.formData)}},created(){this.formData=this.buildData(this.options,this.modelValue)}}),window.app.component("lnbits-dynamic-chips",{template:"#lnbits-dynamic-chips",mixins:[window.windowMixin],props:["modelValue"],data:()=>({chip:"",chips:[]}),methods:{addChip(){this.chip&&(this.chips.push(this.chip),this.chip="",this.$emit("update:model-value",this.chips.join(",")))},removeChip(t){this.chips.splice(t,1),this.$emit("update:model-value",this.chips.join(","))}},created(){"string"==typeof this.modelValue?this.chips=this.modelValue.split(","):this.chips=[...this.modelValue]}}),window.app.component("lnbits-update-balance",{template:"#lnbits-update-balance",mixins:[window.windowMixin],props:["wallet_id","callback"],computed:{denomination:()=>LNBITS_DENOMINATION,admin:()=>user.super_user},data:function(){return{credit:0}},methods:{updateBalance:function(t){LNbits.api.updateBalance(t,this.wallet_id).then((e=>{if("Success"!==e.data.status)throw new Error(e.data);this.callback({success:!0,credit:parseInt(t),wallet_id:this.wallet_id})})).then((e=>(t=parseInt(t),Quasar.Notify.create({type:"positive",message:this.$t("wallet_topup_ok",{amount:t}),icon:null}),t))).catch((function(t){LNbits.utils.notifyApiError(t)}))}}}),window.app.use(VueQrcodeReader),window.app.use(Quasar),window.app.use(window.i18n),window.app.mount("#vue"); diff --git a/lnbits/static/bundle.min.css b/lnbits/static/bundle.min.css index 51f67306b..f2977b8f9 100644 --- a/lnbits/static/bundle.min.css +++ b/lnbits/static/bundle.min.css @@ -1 +1 @@ -*,:after,:before{box-sizing:inherit;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent}#q-app,body,html{width:100%;direction:ltr}body.platform-ios.within-iframe,body.platform-ios.within-iframe #q-app{width:100px;min-width:100%}body,html{margin:0;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}img{border-style:none}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;font-family:inherit;margin:0}optgroup{font-weight:700}button,input,select{overflow:visible;text-transform:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button:-moz-focusring,input:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.q-icon{line-height:1;width:1em;height:1em;flex-shrink:0;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;direction:ltr;text-align:center;position:relative;box-sizing:content-box;fill:currentColor}.q-icon:after,.q-icon:before{width:100%;height:100%;display:flex!important;align-items:center;justify-content:center}.q-icon>img,.q-icon>svg{width:100%;height:100%}.q-icon>div{box-sizing:border-box}.material-icons,.material-icons-outlined,.material-icons-round,.material-icons-sharp,.material-symbols-outlined,.material-symbols-rounded,.material-symbols-sharp,.q-icon{-webkit-user-select:none;user-select:none;cursor:inherit;font-size:inherit;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.q-panel{height:100%;width:100%}.q-panel>div{height:100%;width:100%}.q-panel-parent{overflow:hidden;position:relative}.q-loading-bar{position:fixed;z-index:9998;transition:transform .5s cubic-bezier(0, 0, .2, 1),opacity .5s;background:#f44336}.q-loading-bar--top{left:0;right:0;top:0;width:100%}.q-loading-bar--bottom{left:0;right:0;bottom:0;width:100%}.q-loading-bar--right{top:0;bottom:0;right:0;height:100%}.q-loading-bar--left{top:0;bottom:0;left:0;height:100%}.q-avatar{position:relative;vertical-align:middle;display:inline-block;border-radius:50%;font-size:48px;height:1em;width:1em}.q-avatar__content{font-size:.5em;line-height:.5em}.q-avatar img:not(.q-icon):not(.q-img__image),.q-avatar__content{border-radius:inherit;height:inherit;width:inherit}.q-avatar--square{border-radius:0}.q-badge{background-color:var(--q-primary);color:#fff;padding:2px 6px;border-radius:4px;font-size:12px;line-height:1;min-height:12px;font-weight:400;vertical-align:baseline}.q-badge--single-line{white-space:nowrap}.q-badge--multi-line{word-break:break-all;word-wrap:break-word}.q-badge--floating{position:absolute;top:-4px;right:-3px;cursor:inherit}.q-badge--transparent{opacity:.8}.q-badge--outline{background-color:transparent;border:1px solid currentColor}.q-badge--rounded{border-radius:1em}.q-banner{min-height:54px;padding:8px 16px;background:#fff}.q-banner--top-padding{padding-top:14px}.q-banner__avatar{min-width:1px!important}.q-banner__avatar>.q-avatar{font-size:46px}.q-banner__avatar>.q-icon{font-size:40px}.q-banner__avatar:not(:empty)+.q-banner__content{padding-left:16px}.q-banner__actions.col-auto{padding-left:16px}.q-banner__actions.col-all .q-btn-item{margin:4px 0 0 4px}.q-banner--dense{min-height:32px;padding:8px}.q-banner--dense.q-banner--top-padding{padding-top:12px}.q-banner--dense .q-banner__avatar>.q-avatar,.q-banner--dense .q-banner__avatar>.q-icon{font-size:28px}.q-banner--dense .q-banner__avatar:not(:empty)+.q-banner__content{padding-left:8px}.q-banner--dense .q-banner__actions.col-auto{padding-left:8px}.q-bar{background:rgba(0,0,0,.2)}.q-bar>.q-icon{margin-left:2px}.q-bar>div,.q-bar>div+.q-icon{margin-left:8px}.q-bar>.q-btn{margin-left:2px}.q-bar>.q-btn:first-child,.q-bar>.q-icon:first-child,.q-bar>div:first-child{margin-left:0}.q-bar--standard{padding:0 12px;height:32px;font-size:18px}.q-bar--standard>div{font-size:16px}.q-bar--standard .q-btn{font-size:11px}.q-bar--dense{padding:0 8px;height:24px;font-size:14px}.q-bar--dense .q-btn{font-size:8px}.q-bar--dark{background:rgba(255,255,255,.15)}.q-breadcrumbs__el{color:inherit}.q-breadcrumbs__el-icon{font-size:125%}.q-breadcrumbs__el-icon--with-label{margin-right:8px}[dir=rtl] .q-breadcrumbs__separator .q-icon{transform:scaleX(-1)}.q-btn{display:inline-flex;flex-direction:column;align-items:stretch;position:relative;outline:0;border:0;vertical-align:middle;font-size:14px;line-height:1.715em;text-decoration:none;color:inherit;background:0 0;font-weight:500;text-transform:uppercase;text-align:center;width:auto;height:auto;cursor:default;padding:4px 16px;min-height:2.572em}.q-btn .q-icon,.q-btn .q-spinner{font-size:1.715em}.q-btn.disabled{opacity:.7!important}.q-btn:before{content:"";display:block;position:absolute;left:0;right:0;top:0;bottom:0;border-radius:inherit;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-btn--actionable{cursor:pointer}.q-btn--actionable.q-btn--standard:before{transition:box-shadow .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--actionable.q-btn--standard.q-btn--active:before,.q-btn--actionable.q-btn--standard:active:before{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.q-btn--no-uppercase{text-transform:none}.q-btn--rectangle{border-radius:3px}.q-btn--outline{background:0 0!important}.q-btn--outline:before{border:1px solid currentColor}.q-btn--push{border-radius:7px}.q-btn--push:before{border-bottom:3px solid rgba(0,0,0,.15)}.q-btn--push.q-btn--actionable{transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable:before{transition:border-width .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable.q-btn--active,.q-btn--push.q-btn--actionable:active{transform:translateY(2px)}.q-btn--push.q-btn--actionable.q-btn--active:before,.q-btn--push.q-btn--actionable:active:before{border-bottom-width:0}.q-btn--rounded{border-radius:28px}.q-btn--round{border-radius:50%;padding:0;min-width:3em;min-height:3em}.q-btn--square{border-radius:0}.q-btn--flat:before,.q-btn--outline:before,.q-btn--unelevated:before{box-shadow:none}.q-btn--dense{padding:.285em;min-height:2em}.q-btn--dense.q-btn--round{padding:0;min-height:2.4em;min-width:2.4em}.q-btn--dense .on-left{margin-right:6px}.q-btn--dense .on-right{margin-left:6px}.q-btn--fab .q-icon,.q-btn--fab-mini .q-icon{font-size:24px}.q-btn--fab{padding:16px;min-height:56px;min-width:56px}.q-btn--fab .q-icon{margin:auto}.q-btn--fab-mini{padding:8px;min-height:40px;min-width:40px}.q-btn__content{transition:opacity .3s;z-index:0}.q-btn__content--hidden{opacity:0;pointer-events:none}.q-btn__progress{border-radius:inherit;z-index:0}.q-btn__progress-indicator{z-index:-1;transform:translateX(-100%);background:rgba(255,255,255,.25)}.q-btn__progress--dark .q-btn__progress-indicator{background:rgba(0,0,0,.2)}.q-btn--flat .q-btn__progress-indicator,.q-btn--outline .q-btn__progress-indicator{opacity:.2;background:currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container{padding:0 4px}.q-btn-dropdown--split .q-btn-dropdown__arrow-container.q-btn--outline{border-left:1px solid currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container:not(.q-btn--outline){border-left:1px solid rgba(255,255,255,.3)}.q-btn-dropdown--simple *+.q-btn-dropdown__arrow{margin-left:8px}.q-btn-dropdown__arrow{transition:transform .28s}.q-btn-dropdown--current{flex-grow:1}.q-btn-group{border-radius:3px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);vertical-align:middle}.q-btn-group>.q-btn-item{border-radius:inherit;align-self:stretch}.q-btn-group>.q-btn-item:before{box-shadow:none}.q-btn-group>.q-btn-item .q-badge--floating{right:0}.q-btn-group>.q-btn-group{box-shadow:none}.q-btn-group>.q-btn-group:first-child>.q-btn:first-child{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-btn-group>.q-btn-group:last-child>.q-btn:last-child{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-btn-group>.q-btn-group:not(:first-child)>.q-btn:first-child:before{border-left:0}.q-btn-group>.q-btn-group:not(:last-child)>.q-btn:last-child:before{border-right:0}.q-btn-group>.q-btn-item:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.q-btn-group>.q-btn-item:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.q-btn-group>.q-btn-item.q-btn--standard:before{z-index:-1}.q-btn-group--push{border-radius:7px}.q-btn-group--push>.q-btn--push.q-btn--actionable{transform:none}.q-btn-group--push>.q-btn--push.q-btn--actionable .q-btn__content{transition:margin-top .3s cubic-bezier(.25, .8, .5, 1),margin-bottom .3s cubic-bezier(.25, .8, .5, 1)}.q-btn-group--push>.q-btn--push.q-btn--actionable.q-btn--active .q-btn__content,.q-btn-group--push>.q-btn--push.q-btn--actionable:active .q-btn__content{margin-top:2px;margin-bottom:-2px}.q-btn-group--rounded{border-radius:28px}.q-btn-group--square{border-radius:0}.q-btn-group--flat,.q-btn-group--outline,.q-btn-group--unelevated{box-shadow:none}.q-btn-group--outline>.q-separator{display:none}.q-btn-group--outline>.q-btn-item+.q-btn-item:before{border-left:0}.q-btn-group--outline>.q-btn-item:not(:last-child):before{border-right:0}.q-btn-group--stretch{align-self:stretch;border-radius:0}.q-btn-group--glossy>.q-btn-item{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-btn-group--spread>.q-btn-group{display:flex!important}.q-btn-group--spread>.q-btn-group>.q-btn-item:not(.q-btn-dropdown__arrow-container),.q-btn-group--spread>.q-btn-item{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-btn-toggle{position:relative}.q-card{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative}.q-card>div:not(.q--avoid-card-border),.q-card>img:not(.q--avoid-card-border){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.q-card>div:nth-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-child(1of:not(.q--avoid-card-border)){border-top:0;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-card>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-last-child(1of:not(.q--avoid-card-border)){border-bottom:0;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-card>div:not(.q--avoid-card-border){border-left:0;border-right:0;box-shadow:none}.q-card--bordered{border:1px solid rgba(0,0,0,.12)}.q-card--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-card__section{position:relative}.q-card__section--vert{padding:16px}.q-card__section--horiz>div:not(.q--avoid-card-border),.q-card__section--horiz>img:not(.q--avoid-card-border){border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.q-card__section--horiz>div:nth-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-child(1of:not(.q--avoid-card-border)){border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-card__section--horiz>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-last-child(1of:not(.q--avoid-card-border)){border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-card__section--horiz>div:not(.q--avoid-card-border){border-top:0;border-bottom:0;box-shadow:none}.q-card__actions{padding:8px;align-items:center}.q-card__actions .q-btn--rectangle{padding:0 8px}.q-card__actions--horiz>.q-btn-group+.q-btn-item,.q-card__actions--horiz>.q-btn-item+.q-btn-group,.q-card__actions--horiz>.q-btn-item+.q-btn-item{margin-left:8px}.q-card__actions--vert>.q-btn-item.q-btn--round{align-self:center}.q-card__actions--vert>.q-btn-group+.q-btn-item,.q-card__actions--vert>.q-btn-item+.q-btn-group,.q-card__actions--vert>.q-btn-item+.q-btn-item{margin-top:4px}.q-card__actions--vert>.q-btn-group>.q-btn-item{flex-grow:1}.q-card>img{display:block;width:100%;max-width:100%;border:0}.q-carousel{background-color:#fff;height:400px}.q-carousel__slide{min-height:100%;background-size:cover;background-position:50%}.q-carousel .q-carousel--padding,.q-carousel__slide{padding:16px}.q-carousel__slides-container{height:100%}.q-carousel__control{color:#fff}.q-carousel__arrow{pointer-events:none}.q-carousel__arrow .q-icon{font-size:28px}.q-carousel__arrow .q-btn{pointer-events:all}.q-carousel__next-arrow--horizontal,.q-carousel__prev-arrow--horizontal{top:16px;bottom:16px}.q-carousel__prev-arrow--horizontal{left:16px}.q-carousel__next-arrow--horizontal{right:16px}.q-carousel__next-arrow--vertical,.q-carousel__prev-arrow--vertical{left:16px;right:16px}.q-carousel__prev-arrow--vertical{top:16px}.q-carousel__next-arrow--vertical{bottom:16px}.q-carousel__navigation--bottom,.q-carousel__navigation--top{left:16px;right:16px;overflow-x:auto;overflow-y:hidden}.q-carousel__navigation--top{top:16px}.q-carousel__navigation--bottom{bottom:16px}.q-carousel__navigation--left,.q-carousel__navigation--right{top:16px;bottom:16px;overflow-x:hidden;overflow-y:auto}.q-carousel__navigation--left>.q-carousel__navigation-inner,.q-carousel__navigation--right>.q-carousel__navigation-inner{flex-direction:column}.q-carousel__navigation--left{left:16px}.q-carousel__navigation--right{right:16px}.q-carousel__navigation-inner{flex:1 1 auto}.q-carousel__navigation .q-btn{margin:6px 4px;padding:5px}.q-carousel__navigation-icon--inactive{opacity:.7}.q-carousel .q-carousel__thumbnail{margin:2px;height:50px;width:auto;display:inline-block;cursor:pointer;border:1px solid transparent;border-radius:4px;vertical-align:middle;opacity:.7;transition:opacity .3s}.q-carousel .q-carousel__thumbnail--active,.q-carousel .q-carousel__thumbnail:hover{opacity:1}.q-carousel .q-carousel__thumbnail--active{border-color:currentColor;cursor:default}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-top .q-carousel--padding,.q-carousel--navigation-top.q-carousel--with-padding .q-carousel__slide{padding-top:60px}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-bottom .q-carousel--padding,.q-carousel--navigation-bottom.q-carousel--with-padding .q-carousel__slide{padding-bottom:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-left .q-carousel--padding,.q-carousel--navigation-left.q-carousel--with-padding .q-carousel__slide{padding-left:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-right .q-carousel--padding,.q-carousel--navigation-right.q-carousel--with-padding .q-carousel__slide{padding-right:60px}.q-carousel.fullscreen{height:100%}.q-message-name{font-size:small}.q-message-label{margin:24px 0;text-align:center;font-size:small}.q-message-stamp{color:inherit;margin-top:4px;opacity:.6;display:none;font-size:small}.q-message-avatar{border-radius:50%;width:48px;height:48px;min-width:48px}.q-message{margin-bottom:8px}.q-message:first-child .q-message-label{margin-top:0}.q-message-avatar--received{margin-right:8px}.q-message-text--received{color:#81c784;border-radius:4px 4px 4px 0}.q-message-text--received:last-child:before{right:100%;border-right:0 solid transparent;border-left:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--received{color:#000}.q-message-name--sent{text-align:right}.q-message-avatar--sent{margin-left:8px}.q-message-container--sent{flex-direction:row-reverse}.q-message-text--sent{color:#e0e0e0;border-radius:4px 4px 0 4px}.q-message-text--sent:last-child:before{left:100%;border-left:0 solid transparent;border-right:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--sent{color:#000}.q-message-text{background:currentColor;padding:8px;line-height:1.2;word-break:break-word;position:relative}.q-message-text+.q-message-text{margin-top:3px}.q-message-text:last-child{min-height:48px}.q-message-text:last-child .q-message-stamp{display:block}.q-message-text:last-child:before{content:"";position:absolute;bottom:0;width:0;height:0}.q-checkbox{vertical-align:middle}.q-checkbox__native{width:1px;height:1px}.q-checkbox__bg,.q-checkbox__icon-container{-webkit-user-select:none;user-select:none}.q-checkbox__bg{top:25%;left:25%;width:50%;height:50%;border:2px solid currentColor;border-radius:2px;transition:background .22s cubic-bezier(0, 0, .2, 1) 0s;-webkit-print-color-adjust:exact}.q-checkbox__icon{color:currentColor;font-size:.5em}.q-checkbox__svg{color:#fff}.q-checkbox__truthy{stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.78334;stroke-dasharray:29.78334}.q-checkbox__indet{fill:currentColor;transform-origin:50% 50%;transform:rotate(-280deg) scale(0)}.q-checkbox__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-checkbox__inner--indet,.q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox__inner--indet .q-checkbox__bg,.q-checkbox__inner--truthy .q-checkbox__bg{background:currentColor}.q-checkbox__inner--truthy path{stroke-dashoffset:0;transition:stroke-dashoffset .18s cubic-bezier(.4, 0, .6, 1) 0s}.q-checkbox__inner--indet .q-checkbox__indet{transform:rotate(0) scale(1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-checkbox.disabled{opacity:.75!important}.q-checkbox--dark .q-checkbox__inner{color:rgba(255,255,255,.7)}.q-checkbox--dark .q-checkbox__inner:before{opacity:.32!important}.q-checkbox--dark .q-checkbox__inner--indet,.q-checkbox--dark .q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox--dense .q-checkbox__inner{width:.5em;min-width:.5em;height:.5em}.q-checkbox--dense .q-checkbox__bg{left:5%;top:5%;width:90%;height:90%}.q-checkbox--dense .q-checkbox__label{padding-left:.5em}.q-checkbox--dense.reverse .q-checkbox__label{padding-left:0;padding-right:.5em}body.desktop .q-checkbox:not(.disabled) .q-checkbox__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-checkbox:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1,1,1)}body.desktop .q-checkbox--dense:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox--dense:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1.4,1.4,1)}.q-chip{vertical-align:middle;border-radius:16px;outline:0;position:relative;height:2em;max-width:100%;margin:4px;background:#e0e0e0;color:rgba(0,0,0,.87);font-size:14px;padding:.5em .9em}.q-chip--colored .q-chip__icon,.q-chip--dark .q-chip__icon{color:inherit}.q-chip--outline{background:0 0!important;border:1px solid currentColor}.q-chip .q-avatar{font-size:2em;margin-left:-.45em;margin-right:.2em;border-radius:16px}.q-chip--selected .q-avatar{display:none}.q-chip__icon{color:rgba(0,0,0,.54);font-size:1.5em;margin:-.2em}.q-chip__icon--left{margin-right:.2em}.q-chip__icon--right{margin-left:.2em}.q-chip__icon--remove{margin-left:.1em;margin-right:-.5em;opacity:.6;outline:0}.q-chip__icon--remove:focus,.q-chip__icon--remove:hover{opacity:1}.q-chip__content{white-space:nowrap}.q-chip--dense{border-radius:12px;padding:0 .4em;height:1.5em}.q-chip--dense .q-avatar{font-size:1.5em;margin-left:-.27em;margin-right:.1em;border-radius:12px}.q-chip--dense .q-chip__icon{font-size:1.25em}.q-chip--dense .q-chip__icon--left{margin-right:.195em}.q-chip--dense .q-chip__icon--remove{margin-right:-.25em}.q-chip--square{border-radius:4px}.q-chip--square .q-avatar{border-radius:3px 0 0 3px}body.desktop .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}body.desktop.body--dark .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}.q-circular-progress{display:inline-block;position:relative;vertical-align:middle;width:1em;height:1em;line-height:1}.q-circular-progress.q-focusable{border-radius:50%}.q-circular-progress__svg{width:100%;height:100%}.q-circular-progress__text{font-size:.25em}.q-circular-progress--indeterminate .q-circular-progress__svg{transform-origin:50% 50%;animation:q-spin 2s linear infinite}.q-circular-progress--indeterminate .q-circular-progress__circle{stroke-dasharray:1 400;stroke-dashoffset:0;animation:q-circular-progress-circle 1.5s ease-in-out infinite}@keyframes q-circular-progress-circle{0%{stroke-dasharray:1,400;stroke-dashoffset:0}50%{stroke-dasharray:400,400;stroke-dashoffset:-100}100%{stroke-dasharray:400,400;stroke-dashoffset:-300}}.q-color-picker{overflow:hidden;background:#fff;max-width:350px;vertical-align:top;min-width:180px;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-color-picker .q-tab{padding:0!important}.q-color-picker--bordered{border:1px solid rgba(0,0,0,.12)}.q-color-picker__header-tabs{height:32px}.q-color-picker__header-banner{height:36px}.q-color-picker__header input{line-height:24px;border:0}.q-color-picker__header .q-tab{min-height:32px!important;height:32px!important}.q-color-picker__header .q-tab--inactive{background:linear-gradient(to top,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__error-icon{bottom:2px;right:2px;font-size:24px;opacity:0;transition:opacity .3s ease-in}.q-color-picker__header-content{position:relative;background:#fff}.q-color-picker__header-content--light{color:#000}.q-color-picker__header-content--dark{color:#fff}.q-color-picker__header-content--dark .q-tab--inactive:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(255,255,255,.2)}.q-color-picker__header-banner{height:36px}.q-color-picker__header-bg{background:#fff;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==")!important}.q-color-picker__footer{height:36px}.q-color-picker__footer .q-tab{min-height:36px!important;height:36px!important}.q-color-picker__footer .q-tab--inactive{background:linear-gradient(to bottom,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__spectrum{width:100%;height:100%}.q-color-picker__spectrum-tab{padding:0!important}.q-color-picker__spectrum-white{background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.q-color-picker__spectrum-black{background:linear-gradient(to top,#000,rgba(0,0,0,0))}.q-color-picker__spectrum-circle{width:10px;height:10px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;transform:translate(-5px,-5px)}.q-color-picker__hue .q-slider__track{background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)!important;opacity:1}.q-color-picker__alpha .q-slider__track-container{padding-top:0}.q-color-picker__alpha .q-slider__track:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;background:linear-gradient(90deg,rgba(255,255,255,0),#757575)}.q-color-picker__sliders{padding:0 16px}.q-color-picker__sliders .q-slider__thumb{color:#424242}.q-color-picker__sliders .q-slider__thumb path{stroke-width:2px;fill:transparent}.q-color-picker__sliders .q-slider--active path{stroke-width:3px}.q-color-picker__tune-tab .q-slider{margin-left:18px;margin-right:18px}.q-color-picker__tune-tab input{font-size:11px;border:1px solid #e0e0e0;border-radius:4px;width:3.5em}.q-color-picker__palette-tab{padding:0!important}.q-color-picker__palette-rows--editable .q-color-picker__cube{cursor:pointer}.q-color-picker__cube{padding-bottom:10%;width:10%!important}.q-color-picker input{color:inherit;background:0 0;outline:0;text-align:center}.q-color-picker .q-tabs{overflow:hidden}.q-color-picker .q-tab--active{box-shadow:0 0 14px 3px rgba(0,0,0,.2)}.q-color-picker .q-tab--active .q-focus-helper{display:none}.q-color-picker .q-tab__indicator{display:none}.q-color-picker .q-tab-panels{background:inherit}.q-color-picker--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-color-picker--dark .q-color-picker__tune-tab input{border:1px solid rgba(255,255,255,.3)}.q-color-picker--dark .q-slider__thumb{color:#fafafa}.q-date{display:inline-flex;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;width:290px;min-width:290px;max-width:100%}.q-date--bordered{border:1px solid rgba(0,0,0,.12)}.q-date__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px}.q-date__actions{padding:0 16px 16px}.q-date__content,.q-date__main{outline:0}.q-date__content .q-btn{font-weight:400}.q-date__header-link{opacity:.64;outline:0;transition:opacity .3s ease-out}.q-date__header-link--active,.q-date__header-link:focus,.q-date__header-link:hover{opacity:1}.q-date__header-subtitle{font-size:14px;line-height:1.75;letter-spacing:.00938em}.q-date__header-title-label{font-size:24px;line-height:1.2;letter-spacing:.00735em}.q-date__view{height:100%;width:100%;min-height:290px;padding:16px}.q-date__navigation{height:12.5%}.q-date__navigation>div:first-child{width:8%;min-width:24px;justify-content:flex-end}.q-date__navigation>div:last-child{width:8%;min-width:24px;justify-content:flex-start}.q-date__calendar-weekdays{height:12.5%}.q-date__calendar-weekdays>div{opacity:.38;font-size:12px}.q-date__calendar-item{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:14.285%!important;height:12.5%!important;position:relative;padding:1px}.q-date__calendar-item:after{content:"";position:absolute;pointer-events:none;top:1px;right:0;bottom:1px;left:0;border-style:dashed;border-color:transparent;border-width:1px}.q-date__calendar-item button,.q-date__calendar-item>div{width:30px;height:30px;border-radius:50%}.q-date__calendar-item>div{line-height:30px;text-align:center}.q-date__calendar-item>button{line-height:22px}.q-date__calendar-item--out{opacity:.18}.q-date__calendar-item--fill{visibility:hidden}.q-date__range-from:before,.q-date__range-to:before,.q-date__range:before{content:"";background-color:currentColor;position:absolute;top:1px;bottom:1px;left:0;right:0;opacity:.3}.q-date__range-from:nth-child(7n-6):before,.q-date__range-to:nth-child(7n-6):before,.q-date__range:nth-child(7n-6):before{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__range-from:nth-child(7n):before,.q-date__range-to:nth-child(7n):before,.q-date__range:nth-child(7n):before{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__range-from:before{left:50%}.q-date__range-to:before{right:50%}.q-date__edit-range:after{border-color:currentColor transparent}.q-date__edit-range:nth-child(7n-6):after{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__edit-range:nth-child(7n):after{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__edit-range-from-to:after,.q-date__edit-range-from:after{left:4px;border-left-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-left-radius:28px;border-bottom-left-radius:28px}.q-date__edit-range-from-to:after,.q-date__edit-range-to:after{right:4px;border-right-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-right-radius:28px;border-bottom-right-radius:28px}.q-date__calendar-days-container{height:75%;min-height:192px}.q-date__calendar-days>div{height:16.66%!important}.q-date__event{position:absolute;bottom:2px;left:50%;height:5px;width:8px;border-radius:5px;background-color:var(--q-secondary);transform:translate3d(-50%,0,0)}.q-date__today{box-shadow:0 0 1px 0 currentColor}.q-date__years-content{padding:0 8px}.q-date__months-item,.q-date__years-item{flex:0 0 33.3333%}.q-date--readonly .q-date__content,.q-date--readonly .q-date__header,.q-date.disabled .q-date__content,.q-date.disabled .q-date__header{pointer-events:none}.q-date--readonly .q-date__navigation{display:none}.q-date--portrait{flex-direction:column}.q-date--portrait-standard .q-date__content{height:calc(100% - 86px)}.q-date--portrait-standard .q-date__header{border-top-right-radius:inherit;height:86px}.q-date--portrait-standard .q-date__header-title{align-items:center;height:30px}.q-date--portrait-minimal .q-date__content{height:100%}.q-date--landscape{flex-direction:row;align-items:stretch;min-width:420px}.q-date--landscape>div{display:flex;flex-direction:column}.q-date--landscape .q-date__content{height:100%}.q-date--landscape-standard{min-width:420px}.q-date--landscape-standard .q-date__header{border-bottom-left-radius:inherit;min-width:110px;width:110px}.q-date--landscape-standard .q-date__header-title{flex-direction:column}.q-date--landscape-standard .q-date__header-today{margin-top:12px;margin-left:-8px}.q-date--landscape-minimal{width:310px}.q-date--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12);border-color:rgba(255,255,255,.28)}.q-dialog__title{font-size:1.25rem;font-weight:500;line-height:1.6;letter-spacing:.0125em}.q-dialog__progress{font-size:4rem}.q-dialog__inner{outline:0}.q-dialog__inner>div{pointer-events:all;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position;border-radius:4px}.q-dialog__inner--square>div{border-radius:0!important}.q-dialog__inner>.q-card>.q-card__actions .q-btn--rectangle{min-width:64px}.q-dialog__inner--minimized{padding:24px}.q-dialog__inner--minimized>div{max-height:calc(100vh - 48px)}.q-dialog__inner--maximized>div{height:100%;width:100%;max-height:100vh;max-width:100vw;border-radius:0!important;top:0!important;left:0!important}.q-dialog__inner--bottom,.q-dialog__inner--top{padding-top:0!important;padding-bottom:0!important}.q-dialog__inner--left,.q-dialog__inner--right{padding-right:0!important;padding-left:0!important}.q-dialog__inner--left:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-left-radius:0}.q-dialog__inner--right:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-right-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--left:not(.q-dialog__inner--animating)>div{border-bottom-left-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--right:not(.q-dialog__inner--animating)>div{border-bottom-right-radius:0}.q-dialog__inner--fullwidth>div{width:100%!important;max-width:100%!important}.q-dialog__inner--fullheight>div{height:100%!important;max-height:100%!important}.q-dialog__backdrop{z-index:-1;pointer-events:all;outline:0;background:rgba(0,0,0,.4)}body.platform-android:not(.native-mobile) .q-dialog__inner--minimized>div,body.platform-ios .q-dialog__inner--minimized>div{max-height:calc(100vh - 108px)}body.q-ios-padding .q-dialog__inner{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}body.q-ios-padding .q-dialog__inner>div{max-height:calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom))!important}@media (max-width:599.98px){.q-dialog__inner--bottom,.q-dialog__inner--top{padding-left:0;padding-right:0}.q-dialog__inner--bottom>div,.q-dialog__inner--top>div{width:100%!important}}@media (min-width:600px){.q-dialog__inner--minimized>div{max-width:560px}}.q-body--dialog{overflow:hidden}.q-editor{border:1px solid rgba(0,0,0,.12);border-radius:4px;background-color:#fff}.q-editor.disabled{border-style:dashed}.q-editor>div:first-child,.q-editor__toolbars-container,.q-editor__toolbars-container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-editor__content{outline:0;padding:10px;min-height:10em;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;overflow:auto;max-width:100%}.q-editor__content pre{white-space:pre-wrap}.q-editor__content hr{border:0;outline:0;margin:1px;height:1px;background:rgba(0,0,0,.12)}.q-editor__content:empty:not(:focus):before{content:attr(placeholder);opacity:.7}.q-editor__toolbar{border-bottom:1px solid rgba(0,0,0,.12);min-height:32px}.q-editor__toolbars-container{max-width:100%}.q-editor .q-btn{margin:4px}.q-editor__toolbar-group{position:relative;margin:0 4px}.q-editor__toolbar-group+.q-editor__toolbar-group:before{content:"";position:absolute;left:-4px;top:4px;bottom:4px;width:1px;background:rgba(0,0,0,.12)}.q-editor__link-input{color:inherit;text-decoration:none;text-transform:none;border:none;border-radius:0;background:0 0;outline:0}.q-editor--flat,.q-editor--flat .q-editor__toolbar{border:0}.q-editor--dense .q-editor__toolbar-group{display:flex;align-items:center;flex-wrap:nowrap}.q-editor--dark{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__content hr{background:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar-group+.q-editor__toolbar-group:before{background:rgba(255,255,255,.28)}.q-expansion-item__border{opacity:0}.q-expansion-item__toggle-icon{position:relative;transition:transform .3s}.q-expansion-item__toggle-icon--rotated{transform:rotate(180deg)}.q-expansion-item__toggle-focus{width:1em!important;height:1em!important;position:relative!important}.q-expansion-item__toggle-focus+.q-expansion-item__toggle-icon{margin-top:-1em}.q-expansion-item--standard.q-expansion-item--expanded>div>.q-expansion-item__border{opacity:1}.q-expansion-item--popup{transition:padding .5s}.q-expansion-item--popup>.q-expansion-item__container{border:1px solid rgba(0,0,0,.12)}.q-expansion-item--popup>.q-expansion-item__container>.q-separator{display:none}.q-expansion-item--popup.q-expansion-item--collapsed{padding:0 15px}.q-expansion-item--popup.q-expansion-item--expanded{padding:15px 0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--expanded{padding-top:0}.q-expansion-item--popup.q-expansion-item--collapsed:not(:first-child)>.q-expansion-item__container{border-top-width:0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--collapsed>.q-expansion-item__container{border-top-width:1px}.q-expansion-item__content>.q-card{box-shadow:none;border-radius:0}.q-expansion-item:first-child>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item:last-child>div>.q-expansion-item__border--bottom{opacity:0}.q-expansion-item--expanded+.q-expansion-item--expanded>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item--expanded .q-textarea--autogrow textarea{animation:q-expansion-done 0s}@keyframes q-expansion-done{0%{--q-exp-done:1}}.z-fab{z-index:990}.q-fab{position:relative;vertical-align:middle}.q-fab>.q-btn{width:100%}.q-fab--form-rounded{border-radius:28px}.q-fab--form-square{border-radius:4px}.q-fab__active-icon,.q-fab__icon{transition:opacity .4s,transform .4s}.q-fab__icon{opacity:1;transform:rotate(0)}.q-fab__active-icon{opacity:0;transform:rotate(-180deg)}.q-fab__label--external{position:absolute;padding:0 8px;transition:opacity .18s cubic-bezier(.65, .815, .735, .395)}.q-fab__label--external-hidden{opacity:0;pointer-events:none}.q-fab__label--external-left{top:50%;left:-12px;transform:translate(-100%,-50%)}.q-fab__label--external-right{top:50%;right:-12px;transform:translate(100%,-50%)}.q-fab__label--external-bottom{bottom:-12px;left:50%;transform:translate(-50%,100%)}.q-fab__label--external-top{top:-12px;left:50%;transform:translate(-50%,-100%)}.q-fab__label--internal{padding:0;transition:font-size .12s cubic-bezier(.65, .815, .735, .395),max-height .12s cubic-bezier(.65, .815, .735, .395),opacity 70ms cubic-bezier(.65, .815, .735, .395);max-height:30px}.q-fab__label--internal-hidden{font-size:0;opacity:0}.q-fab__label--internal-top{padding-bottom:.12em}.q-fab__label--internal-bottom{padding-top:.12em}.q-fab__label--internal-bottom.q-fab__label--internal-hidden,.q-fab__label--internal-top.q-fab__label--internal-hidden{max-height:0}.q-fab__label--internal-left{padding-left:.285em;padding-right:.571em}.q-fab__label--internal-right{padding-right:.285em;padding-left:.571em}.q-fab__icon-holder{min-width:24px;min-height:24px;position:relative}.q-fab__icon-holder--opened .q-fab__icon{transform:rotate(180deg);opacity:0}.q-fab__icon-holder--opened .q-fab__active-icon{transform:rotate(0);opacity:1}.q-fab__actions{position:absolute;opacity:0;transition:transform .18s ease-in,opacity .18s ease-in;pointer-events:none;align-items:center;justify-content:center;align-self:center;padding:3px}.q-fab__actions .q-btn{margin:5px}.q-fab__actions--right{transform-origin:0 50%;transform:scale(.4) translateX(-62px);height:56px;left:100%;margin-left:9px}.q-fab__actions--left{transform-origin:100% 50%;transform:scale(.4) translateX(62px);height:56px;right:100%;margin-right:9px;flex-direction:row-reverse}.q-fab__actions--up{transform-origin:50% 100%;transform:scale(.4) translateY(62px);width:56px;bottom:100%;margin-bottom:9px;flex-direction:column-reverse}.q-fab__actions--down{transform-origin:50% 0;transform:scale(.4) translateY(-62px);width:56px;top:100%;margin-top:9px;flex-direction:column}.q-fab__actions--down,.q-fab__actions--up{left:50%;margin-left:-28px}.q-fab__actions--opened{opacity:1;transform:scale(1) translate(.1px,0);pointer-events:all}.q-fab--align-left>.q-fab__actions--down,.q-fab--align-left>.q-fab__actions--up{align-items:flex-start;left:28px}.q-fab--align-right>.q-fab__actions--down,.q-fab--align-right>.q-fab__actions--up{align-items:flex-end;left:auto;right:0}.q-field{font-size:14px}.q-field ::-ms-clear,.q-field ::-ms-reveal{display:none}.q-field--with-bottom{padding-bottom:20px}.q-field__marginal{height:56px;color:rgba(0,0,0,.54);font-size:24px}.q-field__marginal>*+*{margin-left:2px}.q-field__marginal .q-avatar{font-size:32px}.q-field__before,.q-field__prepend{padding-right:12px}.q-field__after,.q-field__append{padding-left:12px}.q-field__after:empty,.q-field__append:empty{display:none}.q-field__append+.q-field__append{padding-left:2px}.q-field__inner{text-align:left}.q-field__bottom{font-size:12px;min-height:20px;line-height:1;color:rgba(0,0,0,.54);padding:8px 12px 0;backface-visibility:hidden}.q-field__bottom--animated{transform:translateY(100%);position:absolute;left:0;right:0;bottom:0}.q-field__messages{line-height:1}.q-field__messages>div{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.q-field__messages>div+div{margin-top:4px}.q-field__counter{padding-left:8px;line-height:1}.q-field--item-aligned{padding:8px 16px}.q-field--item-aligned .q-field__before{min-width:56px}.q-field__control-container{height:inherit}.q-field__control{color:var(--q-primary);height:56px;max-width:100%;outline:0}.q-field__control:after,.q-field__control:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.q-field__control:before{border-radius:inherit}.q-field__shadow{top:8px;opacity:0;overflow:hidden;white-space:pre-wrap;transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native::placeholder{transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native:focus::placeholder{opacity:0}.q-field__input,.q-field__native,.q-field__prefix,.q-field__suffix{font-weight:400;line-height:28px;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;border:none;border-radius:0;background:0 0;color:rgba(0,0,0,.87);outline:0;padding:6px 0}.q-field__input,.q-field__native{width:100%;min-width:0;outline:0!important;-webkit-user-select:auto;user-select:auto}.q-field__input:-webkit-autofill,.q-field__native:-webkit-autofill{-webkit-animation-name:q-autofill;-webkit-animation-fill-mode:both}.q-field__input:-webkit-autofill+.q-field__label,.q-field__native:-webkit-autofill+.q-field__label{transform:translateY(-40%) scale(.75)}.q-field__input[type=color]+.q-field__label,.q-field__input[type=date]+.q-field__label,.q-field__input[type=datetime-local]+.q-field__label,.q-field__input[type=month]+.q-field__label,.q-field__input[type=time]+.q-field__label,.q-field__input[type=week]+.q-field__label,.q-field__native[type=color]+.q-field__label,.q-field__native[type=date]+.q-field__label,.q-field__native[type=datetime-local]+.q-field__label,.q-field__native[type=month]+.q-field__label,.q-field__native[type=time]+.q-field__label,.q-field__native[type=week]+.q-field__label{transform:translateY(-40%) scale(.75)}.q-field__input:invalid,.q-field__native:invalid{box-shadow:none}.q-field__native[type=file]{line-height:1em}.q-field__input{padding:0;height:0;min-height:24px;line-height:24px}.q-field__prefix,.q-field__suffix{transition:opacity .36s cubic-bezier(.4, 0, .2, 1);white-space:nowrap}.q-field__prefix{padding-right:4px}.q-field__suffix{padding-left:4px}.q-field--disabled .q-placeholder,.q-field--readonly .q-placeholder{opacity:1!important}.q-field--readonly.q-field--labeled .q-field__input,.q-field--readonly.q-field--labeled .q-field__native{cursor:default}.q-field--readonly.q-field--float .q-field__input,.q-field--readonly.q-field--float .q-field__native{cursor:text}.q-field--disabled .q-field__inner{cursor:not-allowed}.q-field--disabled .q-field__control{pointer-events:none}.q-field--disabled .q-field__control>div{opacity:.6!important}.q-field--disabled .q-field__control>div,.q-field--disabled .q-field__control>div *{outline:0!important}.q-field__label{left:0;top:18px;max-width:100%;color:rgba(0,0,0,.6);font-size:16px;line-height:1.25;font-weight:400;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;transform-origin:left top;transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 324ms cubic-bezier(.4, 0, .2, 1);backface-visibility:hidden}.q-field--float .q-field__label{max-width:133%;transform:translateY(-40%) scale(.75);transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 396ms cubic-bezier(.4, 0, .2, 1)}.q-field--highlighted .q-field__label{color:currentColor}.q-field--highlighted .q-field__shadow{opacity:.5}.q-field--filled .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px 4px 0 0}.q-field--filled .q-field__control:before{background:rgba(0,0,0,.05);border-bottom:1px solid rgba(0,0,0,.42);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled .q-field__control:hover:before{opacity:1}.q-field--filled .q-field__control:after{height:2px;top:auto;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled.q-field--rounded .q-field__control{border-radius:28px 28px 0 0}.q-field--filled.q-field--highlighted .q-field__control:before{opacity:1;background:rgba(0,0,0,.12)}.q-field--filled.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--filled.q-field--dark .q-field__control,.q-field--filled.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--filled.q-field--dark.q-field--highlighted .q-field__control:before{background:rgba(255,255,255,.1)}.q-field--filled.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border-bottom-style:dashed}.q-field--outlined .q-field__control{border-radius:4px;padding:0 12px}.q-field--outlined .q-field__control:before{border:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__control:hover:before{border-color:#000}.q-field--outlined .q-field__control:after{height:inherit;border-radius:inherit;border:2px solid transparent;transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__input:-webkit-autofill,.q-field--outlined .q-field__native:-webkit-autofill{margin-top:1px;margin-bottom:1px}.q-field--outlined.q-field--rounded .q-field__control{border-radius:28px}.q-field--outlined.q-field--highlighted .q-field__control:hover:before{border-color:transparent}.q-field--outlined.q-field--highlighted .q-field__control:after{border-color:currentColor;border-width:2px;transform:scale3d(1,1,1)}.q-field--outlined.q-field--readonly .q-field__control:before{border-style:dashed}.q-field--standard .q-field__control:before{border-bottom:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard .q-field__control:hover:before{border-color:#000}.q-field--standard .q-field__control:after{height:2px;top:auto;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--standard.q-field--readonly .q-field__control:before{border-bottom-style:dashed}.q-field--dark .q-field__control:before{border-color:rgba(255,255,255,.6)}.q-field--dark .q-field__control:hover:before{border-color:#fff}.q-field--dark .q-field__input,.q-field--dark .q-field__native,.q-field--dark .q-field__prefix,.q-field--dark .q-field__suffix{color:#fff}.q-field--dark .q-field__bottom,.q-field--dark .q-field__marginal,.q-field--dark:not(.q-field--highlighted) .q-field__label{color:rgba(255,255,255,.7)}.q-field--standout .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px;transition:box-shadow .36s cubic-bezier(.4, 0, .2, 1),background-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:before{background:rgba(0,0,0,.07);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:hover:before{opacity:1}.q-field--standout.q-field--rounded .q-field__control{border-radius:28px}.q-field--standout.q-field--highlighted .q-field__control{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#000}.q-field--standout.q-field--highlighted .q-field__append,.q-field--standout.q-field--highlighted .q-field__input,.q-field--standout.q-field--highlighted .q-field__native,.q-field--standout.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--highlighted .q-field__suffix{color:#fff}.q-field--standout.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border:1px dashed rgba(0,0,0,.24)}.q-field--standout.q-field--dark .q-field__control{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark.q-field--highlighted .q-field__control{background:#fff}.q-field--standout.q-field--dark.q-field--highlighted .q-field__append,.q-field--standout.q-field--dark.q-field--highlighted .q-field__input,.q-field--standout.q-field--dark.q-field--highlighted .q-field__native,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--dark.q-field--highlighted .q-field__suffix{color:#000}.q-field--standout.q-field--dark.q-field--readonly .q-field__control:before{border-color:rgba(255,255,255,.24)}.q-field--labeled .q-field__native,.q-field--labeled .q-field__prefix,.q-field--labeled .q-field__suffix{line-height:24px;padding-top:24px;padding-bottom:8px}.q-field--labeled .q-field__shadow{top:0}.q-field--labeled:not(.q-field--float) .q-field__prefix,.q-field--labeled:not(.q-field--float) .q-field__suffix{opacity:0}.q-field--labeled:not(.q-field--float) .q-field__input::placeholder,.q-field--labeled:not(.q-field--float) .q-field__native::placeholder{color:transparent}.q-field--labeled.q-field--dense .q-field__native,.q-field--labeled.q-field--dense .q-field__prefix,.q-field--labeled.q-field--dense .q-field__suffix{padding-top:14px;padding-bottom:2px}.q-field--dense .q-field--with-bottom{padding-bottom:19px}.q-field--dense .q-field__shadow{top:0}.q-field--dense .q-field__control,.q-field--dense .q-field__marginal{height:40px}.q-field--dense .q-field__bottom{font-size:11px}.q-field--dense .q-field__label{font-size:14px;top:10px}.q-field--dense .q-field__before,.q-field--dense .q-field__prepend{padding-right:6px}.q-field--dense .q-field__after,.q-field--dense .q-field__append{padding-left:6px}.q-field--dense .q-field__append+.q-field__append{padding-left:2px}.q-field--dense .q-field__marginal .q-avatar{font-size:24px}.q-field--dense.q-field--float .q-field__label{transform:translateY(-30%) scale(.75)}.q-field--dense .q-field__input:-webkit-autofill+.q-field__label,.q-field--dense .q-field__native:-webkit-autofill+.q-field__label{transform:translateY(-30%) scale(.75)}.q-field--dense .q-field__input[type=color]+.q-field__label,.q-field--dense .q-field__input[type=date]+.q-field__label,.q-field--dense .q-field__input[type=datetime-local]+.q-field__label,.q-field--dense .q-field__input[type=month]+.q-field__label,.q-field--dense .q-field__input[type=time]+.q-field__label,.q-field--dense .q-field__input[type=week]+.q-field__label,.q-field--dense .q-field__native[type=color]+.q-field__label,.q-field--dense .q-field__native[type=date]+.q-field__label,.q-field--dense .q-field__native[type=datetime-local]+.q-field__label,.q-field--dense .q-field__native[type=month]+.q-field__label,.q-field--dense .q-field__native[type=time]+.q-field__label,.q-field--dense .q-field__native[type=week]+.q-field__label{transform:translateY(-30%) scale(.75)}.q-field--borderless .q-field__bottom,.q-field--borderless.q-field--dense .q-field__control,.q-field--standard .q-field__bottom,.q-field--standard.q-field--dense .q-field__control{padding-left:0;padding-right:0}.q-field--error .q-field__label{animation:q-field-label .36s}.q-field--error .q-field__bottom{color:var(--q-negative)}.q-field__focusable-action{opacity:.6;cursor:pointer;outline:0!important;border:0;color:inherit;background:0 0;padding:0}.q-field__focusable-action:focus,.q-field__focusable-action:hover{opacity:1}.q-field--auto-height .q-field__control{height:auto}.q-field--auto-height .q-field__control,.q-field--auto-height .q-field__native{min-height:56px}.q-field--auto-height .q-field__native{align-items:center}.q-field--auto-height .q-field__control-container{padding-top:0}.q-field--auto-height .q-field__native,.q-field--auto-height .q-field__prefix,.q-field--auto-height .q-field__suffix{line-height:18px}.q-field--auto-height.q-field--labeled .q-field__control-container{padding-top:24px}.q-field--auto-height.q-field--labeled .q-field__shadow{top:24px}.q-field--auto-height.q-field--labeled .q-field__native,.q-field--auto-height.q-field--labeled .q-field__prefix,.q-field--auto-height.q-field--labeled .q-field__suffix{padding-top:0}.q-field--auto-height.q-field--labeled .q-field__native{min-height:24px}.q-field--auto-height.q-field--dense .q-field__control,.q-field--auto-height.q-field--dense .q-field__native{min-height:40px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__native{min-height:24px}.q-field--square .q-field__control{border-radius:0!important}.q-transition--field-message-enter-active,.q-transition--field-message-leave-active{transition:transform .6s cubic-bezier(.86, 0, .07, 1),opacity .6s cubic-bezier(.86, 0, .07, 1)}.q-transition--field-message-enter-from,.q-transition--field-message-leave-to{opacity:0;transform:translateY(-10px)}.q-transition--field-message-leave-active,.q-transition--field-message-leave-from{position:absolute}@keyframes q-field-label{40%{margin-left:2px}60%,80%{margin-left:-2px}70%,90%{margin-left:2px}}@keyframes q-autofill{to{background:0 0;color:inherit}}.q-file .q-field__native{word-break:break-all;overflow:hidden}.q-file .q-field__input{opacity:0!important}.q-file .q-field__input::-webkit-file-upload-button{cursor:pointer}.q-file__filler{visibility:hidden;width:100%;border:none;padding:0}.q-file__dnd{outline:1px dashed currentColor;outline-offset:-4px}.q-form{position:relative}.q-img{position:relative;width:100%;display:inline-block;vertical-align:middle;overflow:hidden}.q-img__loading .q-spinner{font-size:50px}.q-img__container{border-radius:inherit;font-size:0}.q-img__image{border-radius:inherit;width:100%;height:100%;opacity:0}.q-img__image--with-transition{transition:opacity .28s ease-in}.q-img__image--loaded{opacity:1}.q-img__content{border-radius:inherit;pointer-events:none}.q-img__content>div{pointer-events:all;position:absolute;padding:16px;color:#fff;background:rgba(0,0,0,.47)}.q-img--no-menu .q-img__image,.q-img--no-menu .q-img__placeholder{pointer-events:none}.q-inner-loading{background:rgba(255,255,255,.6);border-radius:inherit}.q-inner-loading--dark{background:rgba(0,0,0,.4)}.q-inner-loading__label{margin-top:8px}.q-textarea .q-field__control{min-height:56px;height:auto}.q-textarea .q-field__control-container{padding-top:2px;padding-bottom:2px}.q-textarea .q-field__shadow{top:2px;bottom:2px}.q-textarea .q-field__native,.q-textarea .q-field__prefix,.q-textarea .q-field__suffix{line-height:18px}.q-textarea .q-field__native{resize:vertical;padding-top:17px;min-height:52px}.q-textarea.q-field--labeled .q-field__control-container{padding-top:26px}.q-textarea.q-field--labeled .q-field__shadow{top:26px}.q-textarea.q-field--labeled .q-field__native,.q-textarea.q-field--labeled .q-field__prefix,.q-textarea.q-field--labeled .q-field__suffix{padding-top:0}.q-textarea.q-field--labeled .q-field__native{min-height:26px;padding-top:1px}.q-textarea--autogrow .q-field__native{resize:none}.q-textarea.q-field--dense .q-field__control,.q-textarea.q-field--dense .q-field__native{min-height:36px}.q-textarea.q-field--dense .q-field__native{padding-top:9px}.q-textarea.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__native{min-height:24px;padding-top:3px}.q-textarea.q-field--dense.q-field--labeled .q-field__prefix,.q-textarea.q-field--dense.q-field--labeled .q-field__suffix{padding-top:2px}.q-textarea.disabled .q-field__native,body.mobile .q-textarea .q-field__native{resize:none}.q-intersection{position:relative}.q-item{min-height:48px;padding:8px 16px;color:inherit;transition:color .3s,background-color .3s}.q-item__section--side{color:#757575;align-items:flex-start;padding-right:16px;width:auto;min-width:0;max-width:100%}.q-item__section--side>.q-icon{font-size:24px}.q-item__section--side>.q-avatar{font-size:40px}.q-item__section--avatar{color:inherit;min-width:56px}.q-item__section--thumbnail img{width:100px;height:56px}.q-item__section--nowrap{white-space:nowrap}.q-item>.q-focus-helper+.q-item__section--thumbnail,.q-item>.q-item__section--thumbnail:first-child{margin-left:-16px}.q-item>.q-item__section--thumbnail:last-of-type{margin-right:-16px}.q-item__label{line-height:1.2em!important;max-width:100%}.q-item__label--overline{color:rgba(0,0,0,.7)}.q-item__label--caption{color:rgba(0,0,0,.54)}.q-item__label--header{color:#757575;padding:16px;font-size:.875rem;line-height:1.25rem;letter-spacing:.01786em}.q-list--padding .q-item__label--header,.q-separator--spaced+.q-item__label--header{padding-top:8px}.q-item__label+.q-item__label{margin-top:4px}.q-item__section--main{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-item__section--main+.q-item__section--main{margin-left:8px}.q-item__section--main~.q-item__section--side{align-items:flex-end;padding-right:0;padding-left:16px}.q-item__section--main.q-item__section--thumbnail{margin-left:0;margin-right:-16px}.q-list--bordered{border:1px solid rgba(0,0,0,.12)}.q-list--separator>.q-item-type+.q-item-type,.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top:1px solid rgba(0,0,0,.12)}.q-list--padding{padding:8px 0}.q-item--dense,.q-list--dense>.q-item{min-height:32px;padding:2px 16px}.q-list--dark.q-list--separator>.q-item-type+.q-item-type,.q-list--dark.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top-color:rgba(255,255,255,.28)}.q-item--dark,.q-list--dark{color:#fff;border-color:rgba(255,255,255,.28)}.q-item--dark .q-item__section--side:not(.q-item__section--avatar),.q-list--dark .q-item__section--side:not(.q-item__section--avatar){color:rgba(255,255,255,.7)}.q-item--dark .q-item__label--header,.q-list--dark .q-item__label--header{color:rgba(255,255,255,.64)}.q-item--dark .q-item__label--caption,.q-item--dark .q-item__label--overline,.q-list--dark .q-item__label--caption,.q-list--dark .q-item__label--overline{color:rgba(255,255,255,.8)}.q-item{position:relative}.q-item--active,.q-item.q-router-link--active{color:var(--q-primary)}.q-knob{font-size:48px}.q-knob--editable{cursor:pointer;outline:0}.q-knob--editable:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;box-shadow:none;transition:box-shadow .24s ease-in-out}.q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}body.body--dark .q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-layout{width:100%;outline:0}.q-layout-container{position:relative;width:100%;height:100%}.q-layout-container .q-layout{min-height:100%}.q-layout-container>div{transform:translate3d(0,0,0)}.q-layout-container>div>div{min-height:0;max-height:100%}.q-layout__shadow{width:100%}.q-layout__shadow:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 0 10px 2px rgba(0,0,0,.2),0 0 10px rgba(0,0,0,.24)}.q-layout__section--marginal{background-color:var(--q-primary);color:#fff}.q-header--hidden{transform:translateY(-110%)}.q-header--bordered{border-bottom:1px solid rgba(0,0,0,.12)}.q-header .q-layout__shadow{bottom:-10px}.q-header .q-layout__shadow:after{bottom:10px}.q-footer--hidden{transform:translateY(110%)}.q-footer--bordered{border-top:1px solid rgba(0,0,0,.12)}.q-footer .q-layout__shadow{top:-10px}.q-footer .q-layout__shadow:after{top:10px}.q-footer,.q-header{z-index:2000}.q-drawer{position:absolute;top:0;bottom:0;background:#fff;z-index:1000}.q-drawer--on-top{z-index:3000}.q-drawer--left{left:0;transform:translateX(-100%)}.q-drawer--left.q-drawer--bordered{border-right:1px solid rgba(0,0,0,.12)}.q-drawer--left .q-layout__shadow{left:10px;right:-10px}.q-drawer--left .q-layout__shadow:after{right:10px}.q-drawer--right{right:0;transform:translateX(100%)}.q-drawer--right.q-drawer--bordered{border-left:1px solid rgba(0,0,0,.12)}.q-drawer--right .q-layout__shadow{left:-10px}.q-drawer--right .q-layout__shadow:after{left:10px}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini{padding:0!important}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section{text-align:center;justify-content:center;padding-left:0;padding-right:0;min-width:0}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__label,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--main,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--side~.q-item__section--side{display:none}.q-drawer--mini .q-expansion-item__content,.q-drawer--mini .q-mini-drawer-hide{display:none}.q-drawer--mini-animate .q-drawer__content{overflow-x:hidden!important;white-space:nowrap}.q-drawer--standard .q-mini-drawer-only{display:none}.q-drawer--mobile .q-mini-drawer-hide,.q-drawer--mobile .q-mini-drawer-only{display:none}.q-drawer__backdrop{z-index:2999!important;will-change:background-color}.q-drawer__opener{z-index:2001;height:100%;width:15px;-webkit-user-select:none;user-select:none}.q-footer,.q-header,.q-layout,.q-page{position:relative}.q-page-sticky--shrink{pointer-events:none}.q-page-sticky--shrink>div{display:inline-block;pointer-events:auto}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-header>.q-tabs:first-child .q-tabs__content,body.q-ios-padding .q-layout--standard .q-header>.q-toolbar:first-child{padding-top:20px;min-height:70px;padding-top:env(safe-area-inset-top);min-height:calc(env(safe-area-inset-top) + 50px)}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-footer>.q-tabs:nth-last-child(1of:not(.q-layout__shadow)) .q-tabs__content,body.q-ios-padding .q-layout--standard .q-footer>.q-toolbar:last-child{padding-bottom:env(safe-area-inset-bottom);min-height:calc(env(safe-area-inset-bottom) + 50px)}.q-body--layout-animate .q-drawer__backdrop{transition:background-color .12s!important}.q-body--layout-animate .q-drawer{transition:transform .12s,width .12s,top .12s,bottom .12s!important}.q-body--layout-animate .q-layout__section--marginal{transition:transform .12s,left .12s,right .12s!important}.q-body--layout-animate .q-page-container{transition:padding-top .12s,padding-right .12s,padding-bottom .12s,padding-left .12s!important}.q-body--layout-animate .q-page-sticky{transition:transform .12s,left .12s,right .12s,top .12s,bottom .12s!important}body:not(.q-body--layout-animate) .q-layout--prevent-focus{visibility:hidden}.q-body--drawer-toggle{overflow-x:hidden!important}@media (max-width:599.98px){.q-layout-padding{padding:8px}}@media (min-width:600px) and (max-width:1439.98px){.q-layout-padding{padding:16px}}@media (min-width:1440px){.q-layout-padding{padding:24px}}body.body--dark .q-drawer,body.body--dark .q-footer,body.body--dark .q-header{border-color:rgba(255,255,255,.28)}body.body--dark .q-layout__shadow:after{box-shadow:0 0 10px 2px rgba(255,255,255,.2),0 0 10px rgba(255,255,255,.24)}body.platform-ios .q-layout--containerized{position:unset!important}.q-linear-progress{--q-linear-progress-speed:.3s;position:relative;width:100%;overflow:hidden;font-size:4px;height:1em;color:var(--q-primary);transform:scale3d(1,1,1)}.q-linear-progress__model,.q-linear-progress__track{transform-origin:0 0}.q-linear-progress__model--with-transition,.q-linear-progress__track--with-transition{transition:transform var(--q-linear-progress-speed)}.q-linear-progress--reverse .q-linear-progress__model,.q-linear-progress--reverse .q-linear-progress__track{transform-origin:0 100%}.q-linear-progress__model--determinate{background:currentColor}.q-linear-progress__model--indeterminate,.q-linear-progress__model--query{transition:none}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:after,.q-linear-progress__model--query:before{background:currentColor;content:"";position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0}.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:before{animation:q-linear-progress--indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--query:after{transform:translate3d(-101%,0,0) scale3d(1,1,1);animation:q-linear-progress--indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation-delay:1.15s}.q-linear-progress__track{opacity:.4}.q-linear-progress__track--light{background:rgba(0,0,0,.26)}.q-linear-progress__track--dark{background:rgba(255,255,255,.6)}.q-linear-progress__stripe{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,rgba(255,255,255,0) 25%,rgba(255,255,255,0) 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,rgba(255,255,255,0) 75%,rgba(255,255,255,0))!important;background-size:40px 40px!important}.q-linear-progress__stripe--with-transition{transition:width var(--q-linear-progress-speed)}@keyframes q-linear-progress--indeterminate{0%{transform:translate3d(-35%,0,0) scale3d(.35,1,1)}60%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}100%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}}@keyframes q-linear-progress--indeterminate-short{0%{transform:translate3d(-101%,0,0) scale3d(1,1,1)}60%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}100%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}}.q-menu{position:fixed!important;display:inline-block;max-width:95vw;max-height:65vh;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#fff;border-radius:4px;overflow-y:auto;overflow-x:hidden;outline:0;z-index:6000}.q-menu--square{border-radius:0}.q-menu--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-option-group--inline>div{display:inline-block}.q-pagination input{text-align:center;-moz-appearance:textfield}.q-pagination input::-webkit-inner-spin-button,.q-pagination input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-pagination__content{--q-pagination-gutter-parent:-2px;--q-pagination-gutter-child:2px;margin-top:var(--q-pagination-gutter-parent);margin-left:var(--q-pagination-gutter-parent)}.q-pagination__content>.q-btn,.q-pagination__content>.q-input,.q-pagination__middle>.q-btn{margin-top:var(--q-pagination-gutter-child);margin-left:var(--q-pagination-gutter-child)}.q-parallax{position:relative;width:100%;overflow:hidden;border-radius:inherit}.q-parallax__media>img,.q-parallax__media>video{position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;will-change:transform;display:none}.q-popup-edit{padding:8px 16px}.q-popup-edit__buttons{margin-top:8px}.q-popup-edit__buttons .q-btn+.q-btn{margin-left:8px}.q-pull-to-refresh{position:relative}.q-pull-to-refresh__puller{border-radius:50%;width:40px;height:40px;color:var(--q-primary);background:#fff;box-shadow:0 0 4px 0 rgba(0,0,0,.3)}.q-pull-to-refresh__puller--animating{transition:transform .3s,opacity .3s}.q-radio{vertical-align:middle}.q-radio__native{width:1px;height:1px}.q-radio__bg,.q-radio__icon-container{-webkit-user-select:none;user-select:none}.q-radio__bg{top:25%;left:25%;width:50%;height:50%;-webkit-print-color-adjust:exact}.q-radio__bg path{fill:currentColor}.q-radio__icon{color:currentColor;font-size:.5em}.q-radio__check{transform-origin:50% 50%;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-radio__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-radio__inner--truthy{color:var(--q-primary)}.q-radio__inner--truthy .q-radio__check{transform:scale3d(1,1,1)}.q-radio.disabled{opacity:.75!important}.q-radio--dark .q-radio__inner{color:rgba(255,255,255,.7)}.q-radio--dark .q-radio__inner:before{opacity:.32!important}.q-radio--dark .q-radio__inner--truthy{color:var(--q-primary)}.q-radio--dense .q-radio__inner{width:.5em;min-width:.5em;height:.5em}.q-radio--dense .q-radio__bg{left:0;top:0;width:100%;height:100%}.q-radio--dense .q-radio__label{padding-left:.5em}.q-radio--dense.reverse .q-radio__label{padding-left:0;padding-right:.5em}body.desktop .q-radio:not(.disabled) .q-radio__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}body.desktop .q-radio:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1,1,1)}body.desktop .q-radio--dense:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio--dense:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1.5,1.5,1)}.q-rating{color:#ffeb3b;vertical-align:middle}.q-rating__icon-container{height:1em;outline:0}.q-rating__icon-container+.q-rating__icon-container{margin-left:2px}.q-rating__icon{color:currentColor;text-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);position:relative;opacity:.4;transition:transform .2s ease-in,opacity .2s ease-in}.q-rating__icon--hovered{transform:scale(1.3)}.q-rating__icon--active{opacity:1}.q-rating__icon--exselected{opacity:.7}.q-rating--no-dimming .q-rating__icon{opacity:1}.q-rating--editable .q-rating__icon-container{cursor:pointer}.q-responsive{position:relative;max-width:100%;max-height:100%}.q-responsive__filler{width:inherit;max-width:inherit;height:inherit;max-height:inherit}.q-responsive__content{border-radius:inherit}.q-responsive__content>*{width:100%!important;height:100%!important;max-height:100%!important;max-width:100%!important}.q-scrollarea{position:relative;contain:strict}.q-scrollarea__bar,.q-scrollarea__thumb{opacity:.2;transition:opacity .3s;will-change:opacity;cursor:grab}.q-scrollarea__bar--v,.q-scrollarea__thumb--v{right:0;width:10px}.q-scrollarea__bar--h,.q-scrollarea__thumb--h{bottom:0;height:10px}.q-scrollarea__bar--invisible,.q-scrollarea__thumb--invisible{opacity:0!important;pointer-events:none}.q-scrollarea__thumb{background:#000;border-radius:3px}.q-scrollarea__thumb:hover{opacity:.3}.q-scrollarea__thumb:active{opacity:.5}.q-scrollarea__content{min-height:100%;min-width:100%}.q-scrollarea--dark .q-scrollarea__thumb{background:#fff}.q-select--without-input .q-field__control{cursor:pointer}.q-select--with-input .q-field__control{cursor:text}.q-select .q-field__input{min-width:50px!important;cursor:text}.q-select .q-field__input--padding{padding-left:4px}.q-select__autocomplete-input,.q-select__focus-target{position:absolute;outline:0!important;width:1px;height:1px;padding:0;border:0;opacity:0}.q-select__dropdown-icon{cursor:pointer;transition:transform .28s}.q-select.q-field--readonly .q-field__control,.q-select.q-field--readonly .q-select__dropdown-icon{cursor:default}.q-select__dialog{width:90vw!important;max-width:90vw!important;max-height:calc(100vh - 70px)!important;background:#fff;display:flex;flex-direction:column}.q-select__dialog>.scroll{position:relative;background:inherit}body.mobile:not(.native-mobile) .q-select__dialog{max-height:calc(100vh - 108px)!important}body.platform-android.native-mobile .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 24px)!important}body.platform-android:not(.native-mobile) .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 80px)!important}body.platform-ios.native-mobile .q-dialog__inner--top>div{border-radius:4px}body.platform-ios.native-mobile .q-dialog__inner--top .q-select__dialog--focused{max-height:47vh!important}body.platform-ios:not(.native-mobile) .q-dialog__inner--top .q-select__dialog--focused{max-height:50vh!important}.q-separator{border:0;background:rgba(0,0,0,.12);margin:0;transition:background .3s,opacity .3s;flex-shrink:0}.q-separator--dark{background:rgba(255,255,255,.28)}.q-separator--horizontal{display:block;height:1px}.q-separator--horizontal-inset{margin-left:16px;margin-right:16px}.q-separator--horizontal-item-inset{margin-left:72px;margin-right:0}.q-separator--horizontal-item-thumbnail-inset{margin-left:116px;margin-right:0}.q-separator--vertical{width:1px;height:auto;align-self:stretch}.q-separator--vertical-inset{margin-top:8px;margin-bottom:8px}.q-skeleton{--q-skeleton-speed:1500ms;background:rgba(0,0,0,.12);border-radius:4px;box-sizing:border-box}.q-skeleton--anim{cursor:wait}.q-skeleton:before{content:" "}.q-skeleton--type-text{transform:scale(1,.5)}.q-skeleton--type-QAvatar,.q-skeleton--type-circle{height:48px;width:48px;border-radius:50%}.q-skeleton--type-QBtn{width:90px;height:36px}.q-skeleton--type-QBadge{width:70px;height:16px}.q-skeleton--type-QChip{width:90px;height:28px;border-radius:16px}.q-skeleton--type-QToolbar{height:50px}.q-skeleton--type-QCheckbox,.q-skeleton--type-QRadio{width:40px;height:40px;border-radius:50%}.q-skeleton--type-QToggle{width:56px;height:40px;border-radius:7px}.q-skeleton--type-QRange,.q-skeleton--type-QSlider{height:40px}.q-skeleton--type-QInput{height:56px}.q-skeleton--bordered{border:1px solid rgba(0,0,0,.05)}.q-skeleton--square{border-radius:0}.q-skeleton--anim-fade{animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-pulse{animation:q-skeleton--pulse var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-x{animation:q-skeleton--pulse-x var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-y{animation:q-skeleton--pulse-y var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-blink,.q-skeleton--anim-pop,.q-skeleton--anim-wave{position:relative;overflow:hidden;z-index:1}.q-skeleton--anim-blink:after,.q-skeleton--anim-pop:after,.q-skeleton--anim-wave:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0}.q-skeleton--anim-blink:after{background:rgba(255,255,255,.7);animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.5),rgba(255,255,255,0));animation:q-skeleton--wave var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--dark{background:rgba(255,255,255,.05)}.q-skeleton--dark.q-skeleton--bordered{border:1px solid rgba(255,255,255,.25)}.q-skeleton--dark.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.1),rgba(255,255,255,0))}.q-skeleton--dark.q-skeleton--anim-blink:after{background:rgba(255,255,255,.2)}@keyframes q-skeleton--fade{0%{opacity:1}50%{opacity:.4}100%{opacity:1}}@keyframes q-skeleton--pulse{0%{transform:scale(1)}50%{transform:scale(.85)}100%{transform:scale(1)}}@keyframes q-skeleton--pulse-x{0%{transform:scaleX(1)}50%{transform:scaleX(.75)}100%{transform:scaleX(1)}}@keyframes q-skeleton--pulse-y{0%{transform:scaleY(1)}50%{transform:scaleY(.75)}100%{transform:scaleY(1)}}@keyframes q-skeleton--wave{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}.q-slide-item{position:relative;background:#fff}.q-slide-item__bottom,.q-slide-item__left,.q-slide-item__right,.q-slide-item__top{visibility:hidden;font-size:14px;color:#fff}.q-slide-item__bottom .q-icon,.q-slide-item__left .q-icon,.q-slide-item__right .q-icon,.q-slide-item__top .q-icon{font-size:1.714em}.q-slide-item__left{background:#4caf50;padding:8px 16px}.q-slide-item__left>div{transform-origin:left center}.q-slide-item__right{background:#ff9800;padding:8px 16px}.q-slide-item__right>div{transform-origin:right center}.q-slide-item__top{background:#2196f3;padding:16px 8px}.q-slide-item__top>div{transform-origin:top center}.q-slide-item__bottom{background:#9c27b0;padding:16px 8px}.q-slide-item__bottom>div{transform-origin:bottom center}.q-slide-item__content{background:inherit;transition:transform .2s ease-in;-webkit-user-select:none;user-select:none;cursor:pointer}.q-slider{position:relative}.q-slider--h{width:100%}.q-slider--v{height:200px}.q-slider--editable .q-slider__track-container{cursor:grab}.q-slider__track-container{outline:0}.q-slider__track-container--h{width:100%;padding:12px 0}.q-slider__track-container--h .q-slider__selection{will-change:width,left}.q-slider__track-container--v{height:100%;padding:0 12px}.q-slider__track-container--v .q-slider__selection{will-change:height,top}.q-slider__track{color:var(--q-primary);background:rgba(0,0,0,.1);border-radius:4px;width:inherit;height:inherit}.q-slider__inner{background:rgba(0,0,0,.1);border-radius:inherit;width:100%;height:100%}.q-slider__selection{background:currentColor;border-radius:inherit;width:100%;height:100%}.q-slider__markers{color:rgba(0,0,0,.3);border-radius:inherit;width:100%;height:100%}.q-slider__markers:after{content:"";position:absolute;background:currentColor}.q-slider__markers--h{background-image:repeating-linear-gradient(to right,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--h:after{height:100%;width:2px;top:0;right:0}.q-slider__markers--v{background-image:repeating-linear-gradient(to bottom,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--v:after{width:100%;height:2px;left:0;bottom:0}.q-slider__marker-labels-container{position:relative;width:100%;height:100%;min-height:24px;min-width:24px}.q-slider__marker-labels{position:absolute}.q-slider__marker-labels--h-standard{top:0}.q-slider__marker-labels--h-switched{bottom:0}.q-slider__marker-labels--h-ltr{transform:translateX(-50%)}.q-slider__marker-labels--h-rtl{transform:translateX(50%)}.q-slider__marker-labels--v-standard{left:4px}.q-slider__marker-labels--v-switched{right:4px}.q-slider__marker-labels--v-ltr{transform:translateY(-50%)}.q-slider__marker-labels--v-rtl{transform:translateY(50%)}.q-slider__thumb{z-index:1;outline:0;color:var(--q-primary);transition:transform .18s ease-out,fill .18s ease-out,stroke .18s ease-out}.q-slider__thumb.q-slider--focus{opacity:1!important}.q-slider__thumb--h{top:50%;will-change:left}.q-slider__thumb--h-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--h-rtl{transform:scale(1) translate(50%,-50%)}.q-slider__thumb--v{left:50%;will-change:top}.q-slider__thumb--v-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--v-rtl{transform:scale(1) translate(-50%,50%)}.q-slider__thumb-shape{top:0;left:0;stroke-width:3.5;stroke:currentColor;transition:transform .28s}.q-slider__thumb-shape path{stroke:currentColor;fill:currentColor}.q-slider__focus-ring{border-radius:50%;opacity:0;transition:transform .266s ease-out,opacity .266s ease-out,background-color .266s ease-out;transition-delay:0.14s}.q-slider__pin{opacity:0;white-space:nowrap;transition:opacity .28s ease-out;transition-delay:0.14s}.q-slider__pin:before{content:"";width:0;height:0;position:absolute}.q-slider__pin--h:before{border-left:6px solid transparent;border-right:6px solid transparent;left:50%;transform:translateX(-50%)}.q-slider__pin--h-standard{bottom:100%}.q-slider__pin--h-standard:before{bottom:2px;border-top:6px solid currentColor}.q-slider__pin--h-switched{top:100%}.q-slider__pin--h-switched:before{top:2px;border-bottom:6px solid currentColor}.q-slider__pin--v{top:0}.q-slider__pin--v:before{top:50%;transform:translateY(-50%);border-top:6px solid transparent;border-bottom:6px solid transparent}.q-slider__pin--v-standard{left:100%}.q-slider__pin--v-standard:before{left:2px;border-right:6px solid currentColor}.q-slider__pin--v-switched{right:100%}.q-slider__pin--v-switched:before{right:2px;border-left:6px solid currentColor}.q-slider__label{z-index:1;white-space:nowrap;position:absolute}.q-slider__label--h{left:50%;transform:translateX(-50%)}.q-slider__label--h-standard{bottom:7px}.q-slider__label--h-switched{top:7px}.q-slider__label--v{top:50%;transform:translateY(-50%)}.q-slider__label--v-standard{left:7px}.q-slider__label--v-switched{right:7px}.q-slider__text-container{min-height:25px;padding:2px 8px;border-radius:4px;background:currentColor;position:relative;text-align:center}.q-slider__text{color:#fff;font-size:12px}.q-slider--no-value .q-slider__inner,.q-slider--no-value .q-slider__selection,.q-slider--no-value .q-slider__thumb{opacity:0}.q-slider--focus .q-slider__focus-ring,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__focus-ring{background:currentColor;transform:scale3d(1.55,1.55,1);opacity:.25}.q-slider--focus .q-slider__inner,.q-slider--focus .q-slider__selection,.q-slider--focus .q-slider__thumb,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__inner,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__selection,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__thumb{opacity:1}.q-slider--inactive .q-slider__thumb--h{transition:left .28s,right .28s}.q-slider--inactive .q-slider__thumb--v{transition:top .28s,bottom .28s}.q-slider--inactive .q-slider__selection{transition:width .28s,left .28s,right .28s,height .28s,top .28s,bottom .28s}.q-slider--inactive .q-slider__text-container{transition:transform .28s}.q-slider--active{cursor:grabbing}.q-slider--active .q-slider__thumb-shape{transform:scale(1.5)}.q-slider--active .q-slider__focus-ring,.q-slider--active.q-slider--label .q-slider__thumb-shape{transform:scale(0)!important}body.desktop .q-slider.q-slider--enabled .q-slider__track-container:hover .q-slider__pin{opacity:1}.q-slider--label .q-slider--focus .q-slider__pin,.q-slider--label.q-slider--active .q-slider__pin,.q-slider--label.q-slider--label-always .q-slider__pin{opacity:1}.q-slider--dark .q-slider__track{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__inner{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__markers{color:rgba(255,255,255,.3)}.q-slider--dense .q-slider__track-container--h{padding:6px 0}.q-slider--dense .q-slider__track-container--v{padding:0 6px}.q-space{flex-grow:1!important}.q-spinner{vertical-align:middle}.q-spinner-mat{animation:q-spin 2s linear infinite;transform-origin:center center}.q-spinner-mat .path{stroke-dasharray:1,200;stroke-dashoffset:0;animation:q-mat-dash 1.5s ease-in-out infinite}@keyframes q-spin{0%{transform:rotate3d(0,0,1,0deg)}25%{transform:rotate3d(0,0,1,90deg)}50%{transform:rotate3d(0,0,1,180deg)}75%{transform:rotate3d(0,0,1,270deg)}100%{transform:rotate3d(0,0,1,359deg)}}@keyframes q-mat-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}.q-splitter__panel{position:relative;z-index:0}.q-splitter__panel>.q-splitter{width:100%;height:100%}.q-splitter__separator{background-color:rgba(0,0,0,.12);-webkit-user-select:none;user-select:none;position:relative;z-index:1}.q-splitter__separator-area>*{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.q-splitter--dark .q-splitter__separator{background-color:rgba(255,255,255,.28)}.q-splitter--vertical>.q-splitter__panel{height:100%}.q-splitter--vertical.q-splitter--active{cursor:col-resize}.q-splitter--vertical>.q-splitter__separator{width:1px}.q-splitter--vertical>.q-splitter__separator>div{left:-6px;right:-6px}.q-splitter--vertical.q-splitter--workable>.q-splitter__separator{cursor:col-resize}.q-splitter--horizontal>.q-splitter__panel{width:100%}.q-splitter--horizontal.q-splitter--active{cursor:row-resize}.q-splitter--horizontal>.q-splitter__separator{height:1px}.q-splitter--horizontal>.q-splitter__separator>div{top:-6px;bottom:-6px}.q-splitter--horizontal.q-splitter--workable>.q-splitter__separator{cursor:row-resize}.q-splitter__after,.q-splitter__before{overflow:auto}.q-stepper{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff}.q-stepper__title{font-size:14px;line-height:1.285714;letter-spacing:.1px}.q-stepper__caption{font-size:12px;line-height:1.16667}.q-stepper__dot{contain:layout;margin-right:8px;font-size:14px;width:24px;min-width:24px;height:24px;border-radius:50%;background:currentColor}.q-stepper__dot span{color:#fff}.q-stepper__tab{padding:8px 24px;font-size:14px;color:#9e9e9e;flex-direction:row}.q-stepper--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-stepper--dark .q-stepper__dot span{color:#000}.q-stepper__tab--navigation{-webkit-user-select:none;user-select:none;cursor:pointer}.q-stepper__tab--active,.q-stepper__tab--done{color:var(--q-primary)}.q-stepper__tab--active .q-stepper__dot,.q-stepper__tab--active .q-stepper__label,.q-stepper__tab--done .q-stepper__dot,.q-stepper__tab--done .q-stepper__label{text-shadow:0 0 0 currentColor}.q-stepper__tab--disabled .q-stepper__dot{background:rgba(0,0,0,.22)}.q-stepper__tab--disabled .q-stepper__label{color:rgba(0,0,0,.32)}.q-stepper__tab--error{color:var(--q-negative)}.q-stepper__tab--error-with-icon .q-stepper__dot{background:0 0!important}.q-stepper__tab--error-with-icon .q-stepper__dot span{color:currentColor;font-size:24px}.q-stepper__header{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-stepper__header--border{border-bottom:1px solid rgba(0,0,0,.12)}.q-stepper__header--standard-labels .q-stepper__tab{min-height:72px;justify-content:center}.q-stepper__header--standard-labels .q-stepper__tab:first-child{justify-content:flex-start}.q-stepper__header--standard-labels .q-stepper__tab:last-child{justify-content:flex-end}.q-stepper__header--standard-labels .q-stepper__tab:only-child{justify-content:center}.q-stepper__header--standard-labels .q-stepper__dot:after{display:none}.q-stepper__header--alternative-labels .q-stepper__tab{min-height:104px;padding:24px 32px;flex-direction:column;justify-content:flex-start}.q-stepper__header--alternative-labels .q-stepper__dot{margin-right:0}.q-stepper__header--alternative-labels .q-stepper__label{margin-top:8px;text-align:center}.q-stepper__header--alternative-labels .q-stepper__label:after,.q-stepper__header--alternative-labels .q-stepper__label:before{display:none}.q-stepper__header--contracted{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:first-child{align-items:flex-start}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:last-child{align-items:flex-end}.q-stepper__header--contracted .q-stepper__tab{padding:24px 0}.q-stepper__header--contracted .q-stepper__tab:first-child .q-stepper__dot{transform:translateX(24px)}.q-stepper__header--contracted .q-stepper__tab:last-child .q-stepper__dot{transform:translateX(-24px)}.q-stepper__header--contracted .q-stepper__tab:not(:last-child) .q-stepper__dot:after{display:block!important}.q-stepper__header--contracted .q-stepper__dot{margin:0}.q-stepper__header--contracted .q-stepper__label{display:none}.q-stepper__nav{padding-top:24px}.q-stepper--flat{box-shadow:none}.q-stepper--bordered{border:1px solid rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__step-inner{padding:24px}.q-stepper--horizontal .q-stepper__tab:first-child{border-top-left-radius:inherit}.q-stepper--horizontal .q-stepper__tab:last-child{border-top-right-radius:inherit}.q-stepper--horizontal .q-stepper__tab:first-child .q-stepper__dot:before,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__label:after{display:none}.q-stepper--horizontal .q-stepper__tab{overflow:hidden}.q-stepper--horizontal .q-stepper__line{contain:layout}.q-stepper--horizontal .q-stepper__line:after,.q-stepper--horizontal .q-stepper__line:before{position:absolute;top:50%;height:1px;width:100vw;background:rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__label:after{content:"";left:100%;margin-left:8px}.q-stepper--horizontal .q-stepper__dot:before{content:"";right:100%;margin-right:8px}.q-stepper--horizontal>.q-stepper__nav{padding:0 24px 24px}.q-stepper--vertical{padding:16px 0}.q-stepper--vertical .q-stepper__tab{padding:12px 24px}.q-stepper--vertical .q-stepper__title{line-height:18px}.q-stepper--vertical .q-stepper__step-inner{padding:0 24px 32px 60px}.q-stepper--vertical>.q-stepper__nav{padding:24px 24px 0}.q-stepper--vertical .q-stepper__step{overflow:hidden}.q-stepper--vertical .q-stepper__dot{margin-right:12px}.q-stepper--vertical .q-stepper__dot:after,.q-stepper--vertical .q-stepper__dot:before{content:"";position:absolute;left:50%;width:1px;height:99999px;background:rgba(0,0,0,.12)}.q-stepper--vertical .q-stepper__dot:before{bottom:100%;margin-bottom:8px}.q-stepper--vertical .q-stepper__dot:after{top:100%;margin-top:8px}.q-stepper--vertical .q-stepper__step:first-child .q-stepper__dot:before,.q-stepper--vertical .q-stepper__step:last-child .q-stepper__dot:after{display:none}.q-stepper--vertical .q-stepper__step:last-child .q-stepper__step-inner{padding-bottom:8px}.q-stepper--dark .q-stepper__header--border,.q-stepper--dark.q-stepper--bordered{border-color:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--horizontal .q-stepper__line:after,.q-stepper--dark.q-stepper--horizontal .q-stepper__line:before{background:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--vertical .q-stepper__dot:after,.q-stepper--dark.q-stepper--vertical .q-stepper__dot:before{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled{color:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__dot{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__label{color:rgba(255,255,255,.54)}.q-tab-panels{background:#fff}.q-tab-panel{padding:16px}.q-markup-table{overflow:auto;background:#fff}.q-table{width:100%;max-width:100%;border-collapse:separate;border-spacing:0}.q-table tbody td,.q-table thead tr{height:48px}.q-table th{font-weight:500;font-size:12px;-webkit-user-select:none;user-select:none}.q-table th.sortable{cursor:pointer}.q-table th.sortable:hover .q-table__sort-icon{opacity:.64}.q-table th.sorted .q-table__sort-icon{opacity:.86!important}.q-table th.sort-desc .q-table__sort-icon{transform:rotate(180deg)}.q-table td,.q-table th{padding:7px 16px;background-color:inherit}.q-table td,.q-table th,.q-table thead{border-style:solid;border-width:0}.q-table tbody td{font-size:13px}.q-table__card{color:#000;background-color:#fff;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-table__card .q-table__middle{flex:1 1 auto}.q-table__card .q-table__bottom,.q-table__card .q-table__top{flex:0 0 auto}.q-table__container{position:relative}.q-table__container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-table__container>div:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-table__container>.q-inner-loading{border-radius:inherit!important}.q-table__top{padding:12px 16px}.q-table__top .q-table__control{flex-wrap:wrap}.q-table__title{font-size:20px;letter-spacing:.005em;font-weight:400}.q-table__separator{min-width:8px!important}.q-table__progress{height:0!important}.q-table__progress th{padding:0!important;border:0!important}.q-table__progress .q-linear-progress{position:absolute;bottom:0}.q-table__middle{max-width:100%}.q-table__bottom{min-height:50px;padding:4px 14px 4px 16px;font-size:12px}.q-table__bottom .q-table__control{min-height:24px}.q-table__bottom-nodata-icon{font-size:200%;margin-right:8px}.q-table__bottom-item{margin-right:16px}.q-table__control{display:flex;align-items:center}.q-table__sort-icon{transition:transform .3s cubic-bezier(.25, .8, .5, 1);opacity:0;font-size:120%}.q-table__sort-icon--center,.q-table__sort-icon--left{margin-left:4px}.q-table__sort-icon--right{margin-right:4px}.q-table--col-auto-width{width:1px}.q-table--dark,.q-table__card--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-table--flat{box-shadow:none}.q-table--bordered{border:1px solid rgba(0,0,0,.12)}.q-table--square{border-radius:0}.q-table__linear-progress{height:2px}.q-table--no-wrap td,.q-table--no-wrap th{white-space:nowrap}.q-table--grid{box-shadow:none;border-radius:4px}.q-table--grid .q-table__top{padding-bottom:4px}.q-table--grid .q-table__middle{min-height:2px;margin-bottom:4px}.q-table--grid .q-table__middle thead,.q-table--grid .q-table__middle thead th{border:0!important}.q-table--grid .q-table__linear-progress{bottom:0}.q-table--grid .q-table__bottom{border-top:0}.q-table--grid .q-table__grid-content{flex:1 1 auto}.q-table--grid.fullscreen{background:inherit}.q-table__grid-item-card{vertical-align:top;padding:12px}.q-table__grid-item-card .q-separator{margin:12px 0}.q-table__grid-item-row+.q-table__grid-item-row{margin-top:8px}.q-table__grid-item-title{opacity:.54;font-weight:500;font-size:12px}.q-table__grid-item-value{font-size:13px}.q-table__grid-item{padding:4px;transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-table__grid-item--selected{transform:scale(.95)}.q-table--cell-separator tbody tr:not(:last-child)>td,.q-table--cell-separator thead th,.q-table--horizontal-separator tbody tr:not(:last-child)>td,.q-table--horizontal-separator thead th{border-bottom-width:1px}.q-table--cell-separator td,.q-table--cell-separator th,.q-table--vertical-separator td,.q-table--vertical-separator th{border-left-width:1px}.q-table--cell-separator thead tr:last-child th,.q-table--cell-separator.q-table--loading tr:nth-last-child(2) th,.q-table--vertical-separator thead tr:last-child th,.q-table--vertical-separator.q-table--loading tr:nth-last-child(2) th{border-bottom-width:1px}.q-table--cell-separator td:first-child,.q-table--cell-separator th:first-child,.q-table--vertical-separator td:first-child,.q-table--vertical-separator th:first-child{border-left:0}.q-table--cell-separator .q-table__top,.q-table--vertical-separator .q-table__top{border-bottom:1px solid rgba(0,0,0,.12)}.q-table--dense .q-table__top{padding:6px 16px}.q-table--dense .q-table__bottom{min-height:33px}.q-table--dense .q-table__sort-icon{font-size:110%}.q-table--dense .q-table td,.q-table--dense .q-table th{padding:4px 8px}.q-table--dense .q-table tbody td,.q-table--dense .q-table tbody tr,.q-table--dense .q-table thead tr{height:28px}.q-table--dense .q-table td:first-child,.q-table--dense .q-table th:first-child{padding-left:16px}.q-table--dense .q-table td:last-child,.q-table--dense .q-table th:last-child{padding-right:16px}.q-table--dense .q-table__bottom-item{margin-right:8px}.q-table--dense .q-table__select .q-field__control,.q-table--dense .q-table__select .q-field__native{min-height:24px;padding:0}.q-table--dense .q-table__select .q-field__marginal{height:24px}.q-table__bottom{border-top:1px solid rgba(0,0,0,.12)}.q-table td,.q-table th,.q-table thead,.q-table tr{border-color:rgba(0,0,0,.12)}.q-table tbody td{position:relative}.q-table tbody td:after,.q-table tbody td:before{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none}.q-table tbody td:before{background:rgba(0,0,0,.03)}.q-table tbody td:after{background:rgba(0,0,0,.06)}.q-table tbody tr.selected td:after{content:""}body.desktop .q-table>tbody>tr:not(.q-tr--no-hover):hover>td:not(.q-td--no-hover):before{content:""}.q-table--dark,.q-table__card--dark{border-color:rgba(255,255,255,.28)}.q-table--dark .q-table__bottom,.q-table--dark td,.q-table--dark th,.q-table--dark thead,.q-table--dark tr{border-color:rgba(255,255,255,.28)}.q-table--dark tbody td:before{background:rgba(255,255,255,.07)}.q-table--dark tbody td:after{background:rgba(255,255,255,.1)}.q-table--dark.q-table--cell-separator .q-table__top,.q-table--dark.q-table--vertical-separator .q-table__top{border-color:rgba(255,255,255,.28)}.q-tab{padding:0 16px;min-height:48px;transition:color .3s,background-color .3s;text-transform:uppercase;white-space:nowrap;color:inherit;text-decoration:none}.q-tab--full{min-height:72px}.q-tab--no-caps{text-transform:none}.q-tab__content{height:inherit;padding:4px 0;min-width:40px}.q-tab__content--inline .q-tab__icon+.q-tab__label{padding-left:8px}.q-tab__content .q-chip--floating{top:0;right:-16px}.q-tab__icon{width:24px;height:24px;font-size:24px}.q-tab__label{font-size:14px;line-height:1.715em;font-weight:500}.q-tab .q-badge{top:3px;right:-12px}.q-tab__alert,.q-tab__alert-icon{position:absolute}.q-tab__alert{top:7px;right:-9px;height:10px;width:10px;border-radius:50%;background:currentColor}.q-tab__alert-icon{top:2px;right:-12px;font-size:18px}.q-tab__indicator{opacity:0;height:2px;background:currentColor}.q-tab--active .q-tab__indicator{opacity:1;transform-origin:left}.q-tab--inactive{opacity:.85}.q-tabs{position:relative;transition:color .3s,background-color .3s}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--horizontal{padding-left:36px;padding-right:36px}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--vertical{padding-top:36px;padding-bottom:36px}.q-tabs--scrollable.q-tabs__arrows--outside .q-tabs__arrow--faded{opacity:.3;pointer-events:none}.q-tabs--scrollable.q-tabs__arrows--inside .q-tabs__arrow--faded{display:none}.q-tabs--not-scrollable.q-tabs__arrows--outside,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows.q-tabs__arrows--outside{padding-left:0;padding-right:0}.q-tabs--not-scrollable .q-tabs__arrow,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__arrow{display:none}.q-tabs--not-scrollable .q-tabs__content,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__content{border-radius:inherit}.q-tabs__arrow{cursor:pointer;font-size:32px;min-width:36px;text-shadow:0 0 3px #fff,0 0 1px #fff,0 0 1px #000;transition:opacity .3s}.q-tabs__content{overflow:hidden;flex:1 1 auto}.q-tabs__content--align-center{justify-content:center}.q-tabs__content--align-right{justify-content:flex-end}.q-tabs__content--align-justify .q-tab{flex:1 1 auto}.q-tabs__offset{display:none}.q-tabs--horizontal .q-tabs__arrow{height:100%}.q-tabs--horizontal .q-tabs__arrow--left{top:0;left:0;bottom:0}.q-tabs--horizontal .q-tabs__arrow--right{top:0;right:0;bottom:0}.q-tabs--vertical{display:block!important;height:100%}.q-tabs--vertical .q-tabs__content{display:block!important;height:100%}.q-tabs--vertical .q-tabs__arrow{width:100%;height:36px;text-align:center}.q-tabs--vertical .q-tabs__arrow--left{top:0;left:0;right:0}.q-tabs--vertical .q-tabs__arrow--right{left:0;right:0;bottom:0}.q-tabs--vertical .q-tab{padding:0 8px}.q-tabs--vertical .q-tab__indicator{height:unset;width:2px}.q-tabs--vertical.q-tabs--not-scrollable .q-tabs__content{height:100%}.q-tabs--vertical.q-tabs--dense .q-tab__content{min-width:24px}.q-tabs--dense .q-tab{min-height:36px}.q-tabs--dense .q-tab--full{min-height:52px}.q-time{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;outline:0;width:290px;min-width:290px;max-width:100%}.q-time--bordered{border:1px solid rgba(0,0,0,.12)}.q-time__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px;font-weight:300}.q-time__actions{padding:0 16px 16px}.q-time__header-label{font-size:28px;line-height:1;letter-spacing:-.00833em}.q-time__header-label>div+div{margin-left:4px}.q-time__link{opacity:.56;outline:0;transition:opacity .3s ease-out}.q-time__link--active,.q-time__link:focus,.q-time__link:hover{opacity:1}.q-time__header-ampm{font-size:16px;letter-spacing:.1em}.q-time__content{padding:16px}.q-time__content:before{content:"";display:block;padding-bottom:100%}.q-time__container-parent{padding:16px}.q-time__container-child{border-radius:50%;background:rgba(0,0,0,.12)}.q-time__clock{padding:24px;width:100%;height:100%;max-width:100%;max-height:100%;font-size:14px}.q-time__clock-circle{position:relative}.q-time__clock-center{height:6px;width:6px;margin:auto;border-radius:50%;min-height:0;background:currentColor}.q-time__clock-pointer{width:2px;height:50%;transform-origin:0 0;min-height:0;position:absolute;left:50%;right:0;bottom:0;color:var(--q-primary);background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:after,.q-time__clock-pointer:before{content:"";position:absolute;left:50%;border-radius:50%;background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:before{bottom:-4px;width:8px;height:8px}.q-time__clock-pointer:after{top:-3px;height:6px;width:6px}.q-time__clock-position{position:absolute;min-height:32px;width:32px;height:32px;font-size:12px;line-height:32px;margin:0;padding:0;transform:translate(-50%,-50%);border-radius:50%}.q-time__clock-position--disable{opacity:.4}.q-time__clock-position--active{background-color:var(--q-primary);color:#fff}.q-time__clock-pos-0{top:0;left:50%}.q-time__clock-pos-1{top:6.7%;left:75%}.q-time__clock-pos-2{top:25%;left:93.3%}.q-time__clock-pos-3{top:50%;left:100%}.q-time__clock-pos-4{top:75%;left:93.3%}.q-time__clock-pos-5{top:93.3%;left:75%}.q-time__clock-pos-6{top:100%;left:50%}.q-time__clock-pos-7{top:93.3%;left:25%}.q-time__clock-pos-8{top:75%;left:6.7%}.q-time__clock-pos-9{top:50%;left:0}.q-time__clock-pos-10{top:25%;left:6.7%}.q-time__clock-pos-11{top:6.7%;left:25%}.q-time__clock-pos-12{top:15%;left:50%}.q-time__clock-pos-13{top:19.69%;left:67.5%}.q-time__clock-pos-14{top:32.5%;left:80.31%}.q-time__clock-pos-15{top:50%;left:85%}.q-time__clock-pos-16{top:67.5%;left:80.31%}.q-time__clock-pos-17{top:80.31%;left:67.5%}.q-time__clock-pos-18{top:85%;left:50%}.q-time__clock-pos-19{top:80.31%;left:32.5%}.q-time__clock-pos-20{top:67.5%;left:19.69%}.q-time__clock-pos-21{top:50%;left:15%}.q-time__clock-pos-22{top:32.5%;left:19.69%}.q-time__clock-pos-23{top:19.69%;left:32.5%}.q-time__now-button{background-color:var(--q-primary);color:#fff;top:12px;right:12px}.q-time--readonly .q-time__content,.q-time--readonly .q-time__header-ampm,.q-time.disabled .q-time__content,.q-time.disabled .q-time__header-ampm{pointer-events:none}.q-time--portrait{display:inline-flex;flex-direction:column}.q-time--portrait .q-time__header{border-top-right-radius:inherit;min-height:86px}.q-time--portrait .q-time__header-ampm{margin-left:12px}.q-time--portrait.q-time--bordered .q-time__content{margin:1px 0}.q-time--landscape{display:inline-flex;align-items:stretch;min-width:420px}.q-time--landscape>div{display:flex;flex-direction:column;justify-content:center}.q-time--landscape .q-time__header{border-bottom-left-radius:inherit;min-width:156px}.q-time--landscape .q-time__header-ampm{margin-top:12px}.q-time--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-timeline{padding:0;width:100%;list-style:none}.q-timeline h6{line-height:inherit}.q-timeline--dark{color:#fff}.q-timeline--dark .q-timeline__subtitle{opacity:.7}.q-timeline__content{padding-bottom:24px}.q-timeline__title{margin-top:0;margin-bottom:16px}.q-timeline__subtitle{font-size:12px;margin-bottom:8px;opacity:.6;text-transform:uppercase;letter-spacing:1px;font-weight:700}.q-timeline__dot{position:absolute;top:0;bottom:0;width:15px}.q-timeline__dot:after,.q-timeline__dot:before{content:"";background:currentColor;display:block;position:absolute}.q-timeline__dot:before{border:3px solid transparent;border-radius:100%;height:15px;width:15px;top:4px;left:0;transition:background .3s ease-in-out,border .3s ease-in-out}.q-timeline__dot:after{width:3px;opacity:.4;top:24px;bottom:0;left:6px}.q-timeline__dot .q-icon{position:absolute;top:0;left:0;right:0;font-size:16px;height:38px;line-height:38px;width:100%;color:#fff}.q-timeline__dot .q-icon>img,.q-timeline__dot .q-icon>svg{width:1em;height:1em}.q-timeline__dot-img{position:absolute;top:4px;left:0;right:0;height:31px;width:31px;background:currentColor;border-radius:50%}.q-timeline__heading{position:relative}.q-timeline__heading:first-child .q-timeline__heading-title{padding-top:0}.q-timeline__heading:last-child .q-timeline__heading-title{padding-bottom:0}.q-timeline__heading-title{padding:32px 0;margin:0}.q-timeline__entry{position:relative;line-height:22px}.q-timeline__entry:last-child{padding-bottom:0!important}.q-timeline__entry:last-child .q-timeline__dot:after{content:none}.q-timeline__entry--icon .q-timeline__dot{width:31px}.q-timeline__entry--icon .q-timeline__dot:before{height:31px;width:31px}.q-timeline__entry--icon .q-timeline__dot:after{top:41px;left:14px}.q-timeline__entry--icon .q-timeline__subtitle{padding-top:8px}.q-timeline--dense--right .q-timeline__entry{padding-left:40px}.q-timeline--dense--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--dense--right .q-timeline__dot{left:0}.q-timeline--dense--left .q-timeline__heading{text-align:right}.q-timeline--dense--left .q-timeline__entry{padding-right:40px}.q-timeline--dense--left .q-timeline__entry--icon .q-timeline__dot{right:-8px}.q-timeline--dense--left .q-timeline__content,.q-timeline--dense--left .q-timeline__subtitle,.q-timeline--dense--left .q-timeline__title{text-align:right}.q-timeline--dense--left .q-timeline__dot{right:0}.q-timeline--comfortable{display:table}.q-timeline--comfortable .q-timeline__heading{display:table-row;font-size:200%}.q-timeline--comfortable .q-timeline__heading>div{display:table-cell}.q-timeline--comfortable .q-timeline__entry{display:table-row;padding:0}.q-timeline--comfortable .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--comfortable .q-timeline__content,.q-timeline--comfortable .q-timeline__dot,.q-timeline--comfortable .q-timeline__subtitle{display:table-cell;vertical-align:top}.q-timeline--comfortable .q-timeline__subtitle{width:35%}.q-timeline--comfortable .q-timeline__dot{position:relative;min-width:31px}.q-timeline--comfortable--right .q-timeline__heading .q-timeline__heading-title{margin-left:-50px}.q-timeline--comfortable--right .q-timeline__subtitle{text-align:right;padding-right:30px}.q-timeline--comfortable--right .q-timeline__content{padding-left:30px}.q-timeline--comfortable--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--comfortable--left .q-timeline__heading{text-align:right}.q-timeline--comfortable--left .q-timeline__heading .q-timeline__heading-title{margin-right:-50px}.q-timeline--comfortable--left .q-timeline__subtitle{padding-left:30px}.q-timeline--comfortable--left .q-timeline__content{padding-right:30px}.q-timeline--comfortable--left .q-timeline__content,.q-timeline--comfortable--left .q-timeline__title{text-align:right}.q-timeline--comfortable--left .q-timeline__entry--icon .q-timeline__dot{right:0}.q-timeline--comfortable--left .q-timeline__dot{right:-8px}.q-timeline--loose .q-timeline__heading-title{text-align:center;margin-left:0}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__dot,.q-timeline--loose .q-timeline__entry,.q-timeline--loose .q-timeline__subtitle{display:block;margin:0;padding:0}.q-timeline--loose .q-timeline__dot{position:absolute;left:50%;margin-left:-7.15px}.q-timeline--loose .q-timeline__entry{padding-bottom:24px;overflow:hidden}.q-timeline--loose .q-timeline__entry--icon .q-timeline__dot{margin-left:-15px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__subtitle{line-height:38px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--loose .q-timeline__entry--left .q-timeline__content,.q-timeline--loose .q-timeline__entry--right .q-timeline__subtitle{float:left;padding-right:30px;text-align:right}.q-timeline--loose .q-timeline__entry--left .q-timeline__subtitle,.q-timeline--loose .q-timeline__entry--right .q-timeline__content{float:right;text-align:left;padding-left:30px}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__subtitle{width:50%}.q-toggle{vertical-align:middle}.q-toggle__native{width:1px;height:1px}.q-toggle__track{height:.35em;border-radius:.175em;opacity:.38;background:currentColor}.q-toggle__thumb{top:.25em;left:.25em;width:.5em;height:.5em;transition:left .22s cubic-bezier(.4, 0, .2, 1);-webkit-user-select:none;user-select:none;z-index:0}.q-toggle__thumb:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:#fff;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.q-toggle__thumb .q-icon{font-size:.3em;min-width:1em;color:#000;opacity:.54;z-index:1}.q-toggle__inner{font-size:40px;width:1.4em;min-width:1.4em;height:1em;padding:.325em .3em;-webkit-print-color-adjust:exact}.q-toggle__inner--indet .q-toggle__thumb{left:.45em}.q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle__inner--truthy .q-toggle__track{opacity:.54}.q-toggle__inner--truthy .q-toggle__thumb{left:.65em}.q-toggle__inner--truthy .q-toggle__thumb:after{background-color:currentColor}.q-toggle__inner--truthy .q-toggle__thumb .q-icon{color:#fff;opacity:1}.q-toggle.disabled{opacity:.75!important}.q-toggle--dark .q-toggle__inner{color:#fff}.q-toggle--dark .q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle--dark .q-toggle__thumb:after{box-shadow:none}.q-toggle--dark .q-toggle__thumb:before{opacity:.32!important}.q-toggle--dense .q-toggle__inner{width:.8em;min-width:.8em;height:.5em;padding:.07625em 0}.q-toggle--dense .q-toggle__thumb{top:0;left:0}.q-toggle--dense .q-toggle__inner--indet .q-toggle__thumb{left:.15em}.q-toggle--dense .q-toggle__inner--truthy .q-toggle__thumb{left:.3em}.q-toggle--dense .q-toggle__label{padding-left:.5em}.q-toggle--dense.reverse .q-toggle__label{padding-left:0;padding-right:.5em}body.desktop .q-toggle:not(.disabled) .q-toggle__thumb:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-toggle:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(2,2,1)}body.desktop .q-toggle--dense:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle--dense:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(1.5,1.5,1)}.q-toolbar{position:relative;padding:0 12px;min-height:50px;width:100%}.q-toolbar--inset{padding-left:58px}.q-toolbar .q-avatar{font-size:38px}.q-toolbar__title{flex:1 1 0%;min-width:1px;max-width:100%;font-size:21px;font-weight:400;letter-spacing:.01em;padding:0 12px}.q-toolbar__title:first-child{padding-left:0}.q-toolbar__title:last-child{padding-right:0}.q-tooltip--style{font-size:10px;color:#fafafa;background:#757575;border-radius:4px;text-transform:none;font-weight:400}.q-tooltip{z-index:9000;position:fixed!important;overflow-y:auto;overflow-x:hidden;padding:6px 10px;max-width:95vw;max-height:65vh}@media (max-width:599.98px){.q-tooltip{font-size:14px;padding:8px 16px}}.q-tree{position:relative;color:#9e9e9e}.q-tree__node{padding:0 0 3px 22px}.q-tree__node:after{content:"";position:absolute;top:-3px;bottom:0;width:2px;right:auto;left:-13px;border-left:1px solid currentColor}.q-tree__node:last-child:after{display:none}.q-tree__node--disabled{pointer-events:none}.q-tree__node--disabled .disabled{opacity:1!important}.q-tree__node--disabled>.disabled,.q-tree__node--disabled>div,.q-tree__node--disabled>i{opacity:.6!important}.q-tree__node--disabled>.disabled .q-tree__node--disabled>.disabled,.q-tree__node--disabled>.disabled .q-tree__node--disabled>div,.q-tree__node--disabled>.disabled .q-tree__node--disabled>i,.q-tree__node--disabled>div .q-tree__node--disabled>.disabled,.q-tree__node--disabled>div .q-tree__node--disabled>div,.q-tree__node--disabled>div .q-tree__node--disabled>i,.q-tree__node--disabled>i .q-tree__node--disabled>.disabled,.q-tree__node--disabled>i .q-tree__node--disabled>div,.q-tree__node--disabled>i .q-tree__node--disabled>i{opacity:1!important}.q-tree__node-header:before{content:"";position:absolute;top:-3px;bottom:50%;width:31px;left:-35px;border-left:1px solid currentColor;border-bottom:1px solid currentColor}.q-tree__children{padding-left:25px}.q-tree__node-body{padding:5px 0 8px 5px}.q-tree__node--parent{padding-left:2px}.q-tree__node--parent>.q-tree__node-header:before{width:15px;left:-15px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:5px 0 8px 27px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{content:"";position:absolute;top:0;width:2px;height:100%;right:auto;left:12px;border-left:1px solid currentColor;bottom:50px}.q-tree__node--link{cursor:pointer}.q-tree__node-header{padding:4px;margin-top:3px;border-radius:4px;outline:0}.q-tree__node-header-content{color:#000;transition:color .3s}.q-tree__node--selected .q-tree__node-header-content{color:#9e9e9e}.q-tree__icon,.q-tree__node-header-content .q-icon{font-size:21px}.q-tree__img{height:42px;border-radius:2px}.q-tree__avatar,.q-tree__node-header-content .q-avatar{font-size:28px;border-radius:50%;width:28px;height:28px}.q-tree__arrow,.q-tree__spinner{font-size:16px;margin-right:4px}.q-tree__arrow{transition:transform .3s}.q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-tree__tickbox{margin-right:4px}.q-tree>.q-tree__node{padding:0}.q-tree>.q-tree__node:after,.q-tree>.q-tree__node>.q-tree__node-header:before{display:none}.q-tree>.q-tree__node--child>.q-tree__node-header{padding-left:24px}.q-tree--dark .q-tree__node-header-content{color:#fff}.q-tree--no-connectors .q-tree__node-body:after,.q-tree--no-connectors .q-tree__node-header:before,.q-tree--no-connectors .q-tree__node:after{display:none!important}.q-tree--dense>.q-tree__node--child>.q-tree__node-header{padding-left:1px}.q-tree--dense .q-tree__arrow,.q-tree--dense .q-tree__spinner{margin-right:1px}.q-tree--dense .q-tree__img{height:32px}.q-tree--dense .q-tree__tickbox{margin-right:3px}.q-tree--dense .q-tree__node{padding:0}.q-tree--dense .q-tree__node:after{top:0;left:-8px}.q-tree--dense .q-tree__node-header{margin-top:0;padding:1px}.q-tree--dense .q-tree__node-header:before{top:0;left:-8px;width:8px}.q-tree--dense .q-tree__node--child{padding-left:17px}.q-tree--dense .q-tree__node--child>.q-tree__node-header:before{left:-25px;width:21px}.q-tree--dense .q-tree__node-body{padding:0 0 2px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:0 0 2px 20px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{left:8px}.q-tree--dense .q-tree__children{padding-left:16px}[dir=rtl] .q-tree__arrow{transform:rotate3d(0,0,1,180deg)}[dir=rtl] .q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-uploader{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative;width:320px;max-height:320px}.q-uploader--bordered{border:1px solid rgba(0,0,0,.12)}.q-uploader__input{opacity:0;width:100%;height:100%;cursor:pointer!important;z-index:1}.q-uploader__input::-webkit-file-upload-button{cursor:pointer}.q-uploader__file:before{content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:currentColor;opacity:.04}.q-uploader__header{position:relative;border-top-left-radius:inherit;border-top-right-radius:inherit;background-color:var(--q-primary);color:#fff;width:100%}.q-uploader__spinner{font-size:24px;margin-right:4px}.q-uploader__header-content{padding:8px}.q-uploader__dnd{outline:1px dashed currentColor;outline-offset:-4px;background:rgba(255,255,255,.6)}.q-uploader__overlay{font-size:36px;color:#000;background-color:rgba(255,255,255,.6)}.q-uploader__list{position:relative;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding:8px;min-height:60px;flex:1 1 auto}.q-uploader__file{border-radius:4px 4px 0 0;border:1px solid rgba(0,0,0,.12)}.q-uploader__file .q-circular-progress{font-size:24px}.q-uploader__file--img{color:#fff;height:200px;min-width:200px;background-position:50% 50%;background-repeat:no-repeat}.q-uploader__file--img:before{content:none}.q-uploader__file--img .q-circular-progress{color:#fff}.q-uploader__file--img .q-uploader__file-header{padding-bottom:24px;background:linear-gradient(to bottom,rgba(0,0,0,.7) 20%,rgba(255,255,255,0))}.q-uploader__file+.q-uploader__file{margin-top:8px}.q-uploader__file-header{position:relative;padding:4px 8px;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-uploader__file-header-content{padding-right:8px}.q-uploader__file-status{font-size:24px;margin-right:4px}.q-uploader__title{font-size:14px;font-weight:700;line-height:1.285714;word-break:break-word}.q-uploader__subtitle{font-size:12px;line-height:1.5}.q-uploader--disable .q-uploader__header,.q-uploader--disable .q-uploader__list{pointer-events:none}.q-uploader--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-uploader--dark .q-uploader__file{border-color:rgba(255,255,255,.28)}.q-uploader--dark .q-uploader__dnd,.q-uploader--dark .q-uploader__overlay{background:rgba(255,255,255,.3)}.q-uploader--dark .q-uploader__overlay{color:#fff}img.responsive{max-width:100%;height:auto}.q-video{position:relative;overflow:hidden;border-radius:inherit}.q-video embed,.q-video iframe,.q-video object{width:100%;height:100%}.q-video--responsive{height:0}.q-video--responsive embed,.q-video--responsive iframe,.q-video--responsive object{position:absolute;top:0;left:0}.q-virtual-scroll:focus{outline:0}.q-virtual-scroll__content{outline:0;contain:content}.q-virtual-scroll__content>*{overflow-anchor:none}.q-virtual-scroll__content>[data-q-vs-anchor]{overflow-anchor:auto}.q-virtual-scroll__padding{background:linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,100%) var(--q-virtual-scroll-item-height,50px)}.q-table .q-virtual-scroll__padding tr{height:0!important}.q-table .q-virtual-scroll__padding td{padding:0!important}.q-virtual-scroll--horizontal{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch}.q-virtual-scroll--horizontal .q-virtual-scroll__content{display:flex;flex-direction:row;flex-wrap:nowrap}.q-virtual-scroll--horizontal .q-virtual-scroll__content,.q-virtual-scroll--horizontal .q-virtual-scroll__content>*,.q-virtual-scroll--horizontal .q-virtual-scroll__padding{flex:0 0 auto}.q-virtual-scroll--horizontal .q-virtual-scroll__padding{background:linear-gradient(to left,rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,50px) var(--q-virtual-scroll-item-height,100%)}.q-ripple{position:absolute;top:0;left:0;width:100%;height:100%;color:inherit;border-radius:inherit;z-index:0;pointer-events:none;overflow:hidden;contain:strict}.q-ripple__inner{position:absolute;top:0;left:0;opacity:0;color:inherit;border-radius:50%;background:currentColor;pointer-events:none;will-change:transform,opacity}.q-ripple__inner--enter{transition:transform 225ms cubic-bezier(.4, 0, .2, 1),opacity .1s cubic-bezier(.4, 0, .2, 1)}.q-ripple__inner--leave{transition:opacity .25s cubic-bezier(.4, 0, .2, 1)}.q-morph--internal,.q-morph--invisible{opacity:0!important;pointer-events:none!important;position:fixed!important;right:200vw!important;bottom:200vh!important}.q-bottom-sheet{padding-bottom:8px}.q-bottom-sheet__avatar{border-radius:50%}.q-bottom-sheet--list{width:400px}.q-bottom-sheet--list .q-icon,.q-bottom-sheet--list img{font-size:24px;width:24px;height:24px}.q-bottom-sheet--grid{width:700px}.q-bottom-sheet--grid .q-bottom-sheet__item{padding:8px;text-align:center;min-width:100px}.q-bottom-sheet--grid .q-bottom-sheet__empty-icon,.q-bottom-sheet--grid .q-icon,.q-bottom-sheet--grid img{font-size:48px;width:48px;height:48px;margin-bottom:8px}.q-bottom-sheet--grid .q-separator{margin:12px 0}.q-bottom-sheet__item{flex:0 0 33.3333%}@media (min-width:600px){.q-bottom-sheet__item{flex:0 0 25%}}.q-dialog-plugin{width:400px}.q-dialog-plugin__form{max-height:50vh}.q-dialog-plugin .q-card__section+.q-card__section{padding-top:0}.q-dialog-plugin--progress{text-align:center}.q-loading{color:#000;position:fixed!important}.q-loading__backdrop{position:fixed;top:0;right:0;bottom:0;left:0;opacity:.5;z-index:-1;background-color:#000;transition:background-color .28s}.q-loading__box{border-radius:4px;padding:18px;color:#fff;max-width:450px}.q-loading__message{margin:40px 20px 0;text-align:center}.q-notifications__list{z-index:9500;pointer-events:none;left:0;right:0;margin-bottom:10px;position:relative}.q-notifications__list--center{top:0;bottom:0}.q-notifications__list--top{top:0}.q-notifications__list--bottom{bottom:0}body.q-ios-padding .q-notifications__list--center,body.q-ios-padding .q-notifications__list--top{top:20px;top:env(safe-area-inset-top)}body.q-ios-padding .q-notifications__list--bottom,body.q-ios-padding .q-notifications__list--center{bottom:env(safe-area-inset-bottom)}.q-notification{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;pointer-events:all;display:inline-flex;margin:10px 10px 0;transition:transform 1s,opacity 1s;z-index:9500;flex-shrink:0;max-width:95vw;background:#323232;color:#fff;font-size:14px}.q-notification__icon{font-size:24px;flex:0 0 1em}.q-notification__icon--additional{margin-right:16px}.q-notification__avatar{font-size:32px}.q-notification__avatar--additional{margin-right:8px}.q-notification__spinner{font-size:32px}.q-notification__spinner--additional{margin-right:8px}.q-notification__message{padding:8px 0}.q-notification__caption{font-size:.9em;opacity:.7}.q-notification__actions{color:var(--q-primary)}.q-notification__badge{animation:q-notif-badge .42s;padding:4px 8px;position:absolute;box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12);background-color:var(--q-negative);color:#fff;border-radius:4px;font-size:12px;line-height:12px}.q-notification__badge--top-left,.q-notification__badge--top-right{top:-6px}.q-notification__badge--bottom-left,.q-notification__badge--bottom-right{bottom:-6px}.q-notification__badge--bottom-left,.q-notification__badge--top-left{left:-22px}.q-notification__badge--bottom-right,.q-notification__badge--top-right{right:-22px}.q-notification__progress{z-index:-1;position:absolute;height:3px;bottom:0;left:-10px;right:-10px;animation:q-notif-progress linear;background:currentColor;opacity:.3;border-radius:4px 4px 0 0;transform-origin:0 50%;transform:scaleX(0)}.q-notification--standard{padding:0 16px;min-height:48px}.q-notification--standard .q-notification__actions{padding:6px 0 6px 8px;margin-right:-8px}.q-notification--multi-line{min-height:68px;padding:8px 16px}.q-notification--multi-line .q-notification__badge--top-left,.q-notification--multi-line .q-notification__badge--top-right{top:-15px}.q-notification--multi-line .q-notification__badge--bottom-left,.q-notification--multi-line .q-notification__badge--bottom-right{bottom:-15px}.q-notification--multi-line .q-notification__progress{bottom:-8px}.q-notification--multi-line .q-notification__actions{padding:0}.q-notification--multi-line .q-notification__actions--with-media{padding-left:25px}.q-notification--top-enter-from,.q-notification--top-leave-to,.q-notification--top-left-enter-from,.q-notification--top-left-leave-to,.q-notification--top-right-enter-from,.q-notification--top-right-leave-to{opacity:0;transform:translateY(-50px);z-index:9499}.q-notification--center-enter-from,.q-notification--center-leave-to,.q-notification--left-enter-from,.q-notification--left-leave-to,.q-notification--right-enter-from,.q-notification--right-leave-to{opacity:0;transform:rotateX(90deg);z-index:9499}.q-notification--bottom-enter-from,.q-notification--bottom-leave-to,.q-notification--bottom-left-enter-from,.q-notification--bottom-left-leave-to,.q-notification--bottom-right-enter-from,.q-notification--bottom-right-leave-to{opacity:0;transform:translateY(50px);z-index:9499}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active,.q-notification--center-leave-active,.q-notification--left-leave-active,.q-notification--right-leave-active,.q-notification--top-leave-active,.q-notification--top-left-leave-active,.q-notification--top-right-leave-active{position:absolute;z-index:9499;margin-left:0;margin-right:0}.q-notification--center-leave-active,.q-notification--top-leave-active{top:0}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active{bottom:0}@media (min-width:600px){.q-notification{max-width:65vw}}@keyframes q-notif-badge{15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}}@keyframes q-notif-progress{0%{transform:scaleX(1)}100%{transform:scaleX(0)}}:root{--animate-duration:0.3s;--animate-delay:0.3s;--animate-repeat:1}.animated{animation-duration:var(--animate-duration);animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.repeat-1{animation-iteration-count:var(--animate-repeat)}.animated.repeat-2{animation-iteration-count:calc(var(--animate-repeat) * 2)}.animated.repeat-3{animation-iteration-count:calc(var(--animate-repeat) * 3)}.animated.delay-1s{animation-delay:var(--animate-delay)}.animated.delay-2s{animation-delay:calc(var(--animate-delay) * 2)}.animated.delay-3s{animation-delay:calc(var(--animate-delay) * 3)}.animated.delay-4s{animation-delay:calc(var(--animate-delay) * 4)}.animated.delay-5s{animation-delay:calc(var(--animate-delay) * 5)}.animated.faster{animation-duration:calc(var(--animate-duration) / 2)}.animated.fast{animation-duration:calc(var(--animate-duration) * .8)}.animated.slow{animation-duration:calc(var(--animate-duration) * 2)}.animated.slower{animation-duration:calc(var(--animate-duration) * 3)}@media print,(prefers-reduced-motion:reduce){.animated{animation-duration:1ms!important;transition-duration:1ms!important;animation-iteration-count:1!important}.animated[class*=Out]{opacity:0}}.q-animate--scale{animation:q-scale .15s;animation-timing-function:cubic-bezier(0.25,0.8,0.25,1)}@keyframes q-scale{0%{transform:scale(1)}50%{transform:scale(1.04)}100%{transform:scale(1)}}.q-animate--fade{animation:q-fade .2s}@keyframes q-fade{0%{opacity:0}100%{opacity:1}}:root{--q-primary:#1976D2;--q-secondary:#26A69A;--q-accent:#9C27B0;--q-positive:#21BA45;--q-negative:#C10015;--q-info:#31CCEC;--q-warning:#F2C037;--q-dark:#1d1d1d;--q-dark-page:#121212}.text-dark{color:var(--q-dark)!important}.bg-dark{background:var(--q-dark)!important}.text-primary{color:var(--q-primary)!important}.bg-primary{background:var(--q-primary)!important}.text-secondary{color:var(--q-secondary)!important}.bg-secondary{background:var(--q-secondary)!important}.text-accent{color:var(--q-accent)!important}.bg-accent{background:var(--q-accent)!important}.text-positive{color:var(--q-positive)!important}.bg-positive{background:var(--q-positive)!important}.text-negative{color:var(--q-negative)!important}.bg-negative{background:var(--q-negative)!important}.text-info{color:var(--q-info)!important}.bg-info{background:var(--q-info)!important}.text-warning{color:var(--q-warning)!important}.bg-warning{background:var(--q-warning)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.text-transparent{color:transparent!important}.bg-transparent{background:0 0!important}.text-separator{color:rgba(0,0,0,.12)!important}.bg-separator{background:rgba(0,0,0,.12)!important}.text-dark-separator{color:rgba(255,255,255,.28)!important}.bg-dark-separator{background:rgba(255,255,255,.28)!important}.text-red{color:#f44336!important}.text-red-1{color:#ffebee!important}.text-red-2{color:#ffcdd2!important}.text-red-3{color:#ef9a9a!important}.text-red-4{color:#e57373!important}.text-red-5{color:#ef5350!important}.text-red-6{color:#f44336!important}.text-red-7{color:#e53935!important}.text-red-8{color:#d32f2f!important}.text-red-9{color:#c62828!important}.text-red-10{color:#b71c1c!important}.text-red-11{color:#ff8a80!important}.text-red-12{color:#ff5252!important}.text-red-13{color:#ff1744!important}.text-red-14{color:#d50000!important}.text-pink{color:#e91e63!important}.text-pink-1{color:#fce4ec!important}.text-pink-2{color:#f8bbd0!important}.text-pink-3{color:#f48fb1!important}.text-pink-4{color:#f06292!important}.text-pink-5{color:#ec407a!important}.text-pink-6{color:#e91e63!important}.text-pink-7{color:#d81b60!important}.text-pink-8{color:#c2185b!important}.text-pink-9{color:#ad1457!important}.text-pink-10{color:#880e4f!important}.text-pink-11{color:#ff80ab!important}.text-pink-12{color:#ff4081!important}.text-pink-13{color:#f50057!important}.text-pink-14{color:#c51162!important}.text-purple{color:#9c27b0!important}.text-purple-1{color:#f3e5f5!important}.text-purple-2{color:#e1bee7!important}.text-purple-3{color:#ce93d8!important}.text-purple-4{color:#ba68c8!important}.text-purple-5{color:#ab47bc!important}.text-purple-6{color:#9c27b0!important}.text-purple-7{color:#8e24aa!important}.text-purple-8{color:#7b1fa2!important}.text-purple-9{color:#6a1b9a!important}.text-purple-10{color:#4a148c!important}.text-purple-11{color:#ea80fc!important}.text-purple-12{color:#e040fb!important}.text-purple-13{color:#d500f9!important}.text-purple-14{color:#a0f!important}.text-deep-purple{color:#673ab7!important}.text-deep-purple-1{color:#ede7f6!important}.text-deep-purple-2{color:#d1c4e9!important}.text-deep-purple-3{color:#b39ddb!important}.text-deep-purple-4{color:#9575cd!important}.text-deep-purple-5{color:#7e57c2!important}.text-deep-purple-6{color:#673ab7!important}.text-deep-purple-7{color:#5e35b1!important}.text-deep-purple-8{color:#512da8!important}.text-deep-purple-9{color:#4527a0!important}.text-deep-purple-10{color:#311b92!important}.text-deep-purple-11{color:#b388ff!important}.text-deep-purple-12{color:#7c4dff!important}.text-deep-purple-13{color:#651fff!important}.text-deep-purple-14{color:#6200ea!important}.text-indigo{color:#3f51b5!important}.text-indigo-1{color:#e8eaf6!important}.text-indigo-2{color:#c5cae9!important}.text-indigo-3{color:#9fa8da!important}.text-indigo-4{color:#7986cb!important}.text-indigo-5{color:#5c6bc0!important}.text-indigo-6{color:#3f51b5!important}.text-indigo-7{color:#3949ab!important}.text-indigo-8{color:#303f9f!important}.text-indigo-9{color:#283593!important}.text-indigo-10{color:#1a237e!important}.text-indigo-11{color:#8c9eff!important}.text-indigo-12{color:#536dfe!important}.text-indigo-13{color:#3d5afe!important}.text-indigo-14{color:#304ffe!important}.text-blue{color:#2196f3!important}.text-blue-1{color:#e3f2fd!important}.text-blue-2{color:#bbdefb!important}.text-blue-3{color:#90caf9!important}.text-blue-4{color:#64b5f6!important}.text-blue-5{color:#42a5f5!important}.text-blue-6{color:#2196f3!important}.text-blue-7{color:#1e88e5!important}.text-blue-8{color:#1976d2!important}.text-blue-9{color:#1565c0!important}.text-blue-10{color:#0d47a1!important}.text-blue-11{color:#82b1ff!important}.text-blue-12{color:#448aff!important}.text-blue-13{color:#2979ff!important}.text-blue-14{color:#2962ff!important}.text-light-blue{color:#03a9f4!important}.text-light-blue-1{color:#e1f5fe!important}.text-light-blue-2{color:#b3e5fc!important}.text-light-blue-3{color:#81d4fa!important}.text-light-blue-4{color:#4fc3f7!important}.text-light-blue-5{color:#29b6f6!important}.text-light-blue-6{color:#03a9f4!important}.text-light-blue-7{color:#039be5!important}.text-light-blue-8{color:#0288d1!important}.text-light-blue-9{color:#0277bd!important}.text-light-blue-10{color:#01579b!important}.text-light-blue-11{color:#80d8ff!important}.text-light-blue-12{color:#40c4ff!important}.text-light-blue-13{color:#00b0ff!important}.text-light-blue-14{color:#0091ea!important}.text-cyan{color:#00bcd4!important}.text-cyan-1{color:#e0f7fa!important}.text-cyan-2{color:#b2ebf2!important}.text-cyan-3{color:#80deea!important}.text-cyan-4{color:#4dd0e1!important}.text-cyan-5{color:#26c6da!important}.text-cyan-6{color:#00bcd4!important}.text-cyan-7{color:#00acc1!important}.text-cyan-8{color:#0097a7!important}.text-cyan-9{color:#00838f!important}.text-cyan-10{color:#006064!important}.text-cyan-11{color:#84ffff!important}.text-cyan-12{color:#18ffff!important}.text-cyan-13{color:#00e5ff!important}.text-cyan-14{color:#00b8d4!important}.text-teal{color:#009688!important}.text-teal-1{color:#e0f2f1!important}.text-teal-2{color:#b2dfdb!important}.text-teal-3{color:#80cbc4!important}.text-teal-4{color:#4db6ac!important}.text-teal-5{color:#26a69a!important}.text-teal-6{color:#009688!important}.text-teal-7{color:#00897b!important}.text-teal-8{color:#00796b!important}.text-teal-9{color:#00695c!important}.text-teal-10{color:#004d40!important}.text-teal-11{color:#a7ffeb!important}.text-teal-12{color:#64ffda!important}.text-teal-13{color:#1de9b6!important}.text-teal-14{color:#00bfa5!important}.text-green{color:#4caf50!important}.text-green-1{color:#e8f5e9!important}.text-green-2{color:#c8e6c9!important}.text-green-3{color:#a5d6a7!important}.text-green-4{color:#81c784!important}.text-green-5{color:#66bb6a!important}.text-green-6{color:#4caf50!important}.text-green-7{color:#43a047!important}.text-green-8{color:#388e3c!important}.text-green-9{color:#2e7d32!important}.text-green-10{color:#1b5e20!important}.text-green-11{color:#b9f6ca!important}.text-green-12{color:#69f0ae!important}.text-green-13{color:#00e676!important}.text-green-14{color:#00c853!important}.text-light-green{color:#8bc34a!important}.text-light-green-1{color:#f1f8e9!important}.text-light-green-2{color:#dcedc8!important}.text-light-green-3{color:#c5e1a5!important}.text-light-green-4{color:#aed581!important}.text-light-green-5{color:#9ccc65!important}.text-light-green-6{color:#8bc34a!important}.text-light-green-7{color:#7cb342!important}.text-light-green-8{color:#689f38!important}.text-light-green-9{color:#558b2f!important}.text-light-green-10{color:#33691e!important}.text-light-green-11{color:#ccff90!important}.text-light-green-12{color:#b2ff59!important}.text-light-green-13{color:#76ff03!important}.text-light-green-14{color:#64dd17!important}.text-lime{color:#cddc39!important}.text-lime-1{color:#f9fbe7!important}.text-lime-2{color:#f0f4c3!important}.text-lime-3{color:#e6ee9c!important}.text-lime-4{color:#dce775!important}.text-lime-5{color:#d4e157!important}.text-lime-6{color:#cddc39!important}.text-lime-7{color:#c0ca33!important}.text-lime-8{color:#afb42b!important}.text-lime-9{color:#9e9d24!important}.text-lime-10{color:#827717!important}.text-lime-11{color:#f4ff81!important}.text-lime-12{color:#eeff41!important}.text-lime-13{color:#c6ff00!important}.text-lime-14{color:#aeea00!important}.text-yellow{color:#ffeb3b!important}.text-yellow-1{color:#fffde7!important}.text-yellow-2{color:#fff9c4!important}.text-yellow-3{color:#fff59d!important}.text-yellow-4{color:#fff176!important}.text-yellow-5{color:#ffee58!important}.text-yellow-6{color:#ffeb3b!important}.text-yellow-7{color:#fdd835!important}.text-yellow-8{color:#fbc02d!important}.text-yellow-9{color:#f9a825!important}.text-yellow-10{color:#f57f17!important}.text-yellow-11{color:#ffff8d!important}.text-yellow-12{color:#ff0!important}.text-yellow-13{color:#ffea00!important}.text-yellow-14{color:#ffd600!important}.text-amber{color:#ffc107!important}.text-amber-1{color:#fff8e1!important}.text-amber-2{color:#ffecb3!important}.text-amber-3{color:#ffe082!important}.text-amber-4{color:#ffd54f!important}.text-amber-5{color:#ffca28!important}.text-amber-6{color:#ffc107!important}.text-amber-7{color:#ffb300!important}.text-amber-8{color:#ffa000!important}.text-amber-9{color:#ff8f00!important}.text-amber-10{color:#ff6f00!important}.text-amber-11{color:#ffe57f!important}.text-amber-12{color:#ffd740!important}.text-amber-13{color:#ffc400!important}.text-amber-14{color:#ffab00!important}.text-orange{color:#ff9800!important}.text-orange-1{color:#fff3e0!important}.text-orange-2{color:#ffe0b2!important}.text-orange-3{color:#ffcc80!important}.text-orange-4{color:#ffb74d!important}.text-orange-5{color:#ffa726!important}.text-orange-6{color:#ff9800!important}.text-orange-7{color:#fb8c00!important}.text-orange-8{color:#f57c00!important}.text-orange-9{color:#ef6c00!important}.text-orange-10{color:#e65100!important}.text-orange-11{color:#ffd180!important}.text-orange-12{color:#ffab40!important}.text-orange-13{color:#ff9100!important}.text-orange-14{color:#ff6d00!important}.text-deep-orange{color:#ff5722!important}.text-deep-orange-1{color:#fbe9e7!important}.text-deep-orange-2{color:#ffccbc!important}.text-deep-orange-3{color:#ffab91!important}.text-deep-orange-4{color:#ff8a65!important}.text-deep-orange-5{color:#ff7043!important}.text-deep-orange-6{color:#ff5722!important}.text-deep-orange-7{color:#f4511e!important}.text-deep-orange-8{color:#e64a19!important}.text-deep-orange-9{color:#d84315!important}.text-deep-orange-10{color:#bf360c!important}.text-deep-orange-11{color:#ff9e80!important}.text-deep-orange-12{color:#ff6e40!important}.text-deep-orange-13{color:#ff3d00!important}.text-deep-orange-14{color:#dd2c00!important}.text-brown{color:#795548!important}.text-brown-1{color:#efebe9!important}.text-brown-2{color:#d7ccc8!important}.text-brown-3{color:#bcaaa4!important}.text-brown-4{color:#a1887f!important}.text-brown-5{color:#8d6e63!important}.text-brown-6{color:#795548!important}.text-brown-7{color:#6d4c41!important}.text-brown-8{color:#5d4037!important}.text-brown-9{color:#4e342e!important}.text-brown-10{color:#3e2723!important}.text-brown-11{color:#d7ccc8!important}.text-brown-12{color:#bcaaa4!important}.text-brown-13{color:#8d6e63!important}.text-brown-14{color:#5d4037!important}.text-grey{color:#9e9e9e!important}.text-grey-1{color:#fafafa!important}.text-grey-2{color:#f5f5f5!important}.text-grey-3{color:#eee!important}.text-grey-4{color:#e0e0e0!important}.text-grey-5{color:#bdbdbd!important}.text-grey-6{color:#9e9e9e!important}.text-grey-7{color:#757575!important}.text-grey-8{color:#616161!important}.text-grey-9{color:#424242!important}.text-grey-10{color:#212121!important}.text-grey-11{color:#f5f5f5!important}.text-grey-12{color:#eee!important}.text-grey-13{color:#bdbdbd!important}.text-grey-14{color:#616161!important}.text-blue-grey{color:#607d8b!important}.text-blue-grey-1{color:#eceff1!important}.text-blue-grey-2{color:#cfd8dc!important}.text-blue-grey-3{color:#b0bec5!important}.text-blue-grey-4{color:#90a4ae!important}.text-blue-grey-5{color:#78909c!important}.text-blue-grey-6{color:#607d8b!important}.text-blue-grey-7{color:#546e7a!important}.text-blue-grey-8{color:#455a64!important}.text-blue-grey-9{color:#37474f!important}.text-blue-grey-10{color:#263238!important}.text-blue-grey-11{color:#cfd8dc!important}.text-blue-grey-12{color:#b0bec5!important}.text-blue-grey-13{color:#78909c!important}.text-blue-grey-14{color:#455a64!important}.bg-red{background:#f44336!important}.bg-red-1{background:#ffebee!important}.bg-red-2{background:#ffcdd2!important}.bg-red-3{background:#ef9a9a!important}.bg-red-4{background:#e57373!important}.bg-red-5{background:#ef5350!important}.bg-red-6{background:#f44336!important}.bg-red-7{background:#e53935!important}.bg-red-8{background:#d32f2f!important}.bg-red-9{background:#c62828!important}.bg-red-10{background:#b71c1c!important}.bg-red-11{background:#ff8a80!important}.bg-red-12{background:#ff5252!important}.bg-red-13{background:#ff1744!important}.bg-red-14{background:#d50000!important}.bg-pink{background:#e91e63!important}.bg-pink-1{background:#fce4ec!important}.bg-pink-2{background:#f8bbd0!important}.bg-pink-3{background:#f48fb1!important}.bg-pink-4{background:#f06292!important}.bg-pink-5{background:#ec407a!important}.bg-pink-6{background:#e91e63!important}.bg-pink-7{background:#d81b60!important}.bg-pink-8{background:#c2185b!important}.bg-pink-9{background:#ad1457!important}.bg-pink-10{background:#880e4f!important}.bg-pink-11{background:#ff80ab!important}.bg-pink-12{background:#ff4081!important}.bg-pink-13{background:#f50057!important}.bg-pink-14{background:#c51162!important}.bg-purple{background:#9c27b0!important}.bg-purple-1{background:#f3e5f5!important}.bg-purple-2{background:#e1bee7!important}.bg-purple-3{background:#ce93d8!important}.bg-purple-4{background:#ba68c8!important}.bg-purple-5{background:#ab47bc!important}.bg-purple-6{background:#9c27b0!important}.bg-purple-7{background:#8e24aa!important}.bg-purple-8{background:#7b1fa2!important}.bg-purple-9{background:#6a1b9a!important}.bg-purple-10{background:#4a148c!important}.bg-purple-11{background:#ea80fc!important}.bg-purple-12{background:#e040fb!important}.bg-purple-13{background:#d500f9!important}.bg-purple-14{background:#a0f!important}.bg-deep-purple{background:#673ab7!important}.bg-deep-purple-1{background:#ede7f6!important}.bg-deep-purple-2{background:#d1c4e9!important}.bg-deep-purple-3{background:#b39ddb!important}.bg-deep-purple-4{background:#9575cd!important}.bg-deep-purple-5{background:#7e57c2!important}.bg-deep-purple-6{background:#673ab7!important}.bg-deep-purple-7{background:#5e35b1!important}.bg-deep-purple-8{background:#512da8!important}.bg-deep-purple-9{background:#4527a0!important}.bg-deep-purple-10{background:#311b92!important}.bg-deep-purple-11{background:#b388ff!important}.bg-deep-purple-12{background:#7c4dff!important}.bg-deep-purple-13{background:#651fff!important}.bg-deep-purple-14{background:#6200ea!important}.bg-indigo{background:#3f51b5!important}.bg-indigo-1{background:#e8eaf6!important}.bg-indigo-2{background:#c5cae9!important}.bg-indigo-3{background:#9fa8da!important}.bg-indigo-4{background:#7986cb!important}.bg-indigo-5{background:#5c6bc0!important}.bg-indigo-6{background:#3f51b5!important}.bg-indigo-7{background:#3949ab!important}.bg-indigo-8{background:#303f9f!important}.bg-indigo-9{background:#283593!important}.bg-indigo-10{background:#1a237e!important}.bg-indigo-11{background:#8c9eff!important}.bg-indigo-12{background:#536dfe!important}.bg-indigo-13{background:#3d5afe!important}.bg-indigo-14{background:#304ffe!important}.bg-blue{background:#2196f3!important}.bg-blue-1{background:#e3f2fd!important}.bg-blue-2{background:#bbdefb!important}.bg-blue-3{background:#90caf9!important}.bg-blue-4{background:#64b5f6!important}.bg-blue-5{background:#42a5f5!important}.bg-blue-6{background:#2196f3!important}.bg-blue-7{background:#1e88e5!important}.bg-blue-8{background:#1976d2!important}.bg-blue-9{background:#1565c0!important}.bg-blue-10{background:#0d47a1!important}.bg-blue-11{background:#82b1ff!important}.bg-blue-12{background:#448aff!important}.bg-blue-13{background:#2979ff!important}.bg-blue-14{background:#2962ff!important}.bg-light-blue{background:#03a9f4!important}.bg-light-blue-1{background:#e1f5fe!important}.bg-light-blue-2{background:#b3e5fc!important}.bg-light-blue-3{background:#81d4fa!important}.bg-light-blue-4{background:#4fc3f7!important}.bg-light-blue-5{background:#29b6f6!important}.bg-light-blue-6{background:#03a9f4!important}.bg-light-blue-7{background:#039be5!important}.bg-light-blue-8{background:#0288d1!important}.bg-light-blue-9{background:#0277bd!important}.bg-light-blue-10{background:#01579b!important}.bg-light-blue-11{background:#80d8ff!important}.bg-light-blue-12{background:#40c4ff!important}.bg-light-blue-13{background:#00b0ff!important}.bg-light-blue-14{background:#0091ea!important}.bg-cyan{background:#00bcd4!important}.bg-cyan-1{background:#e0f7fa!important}.bg-cyan-2{background:#b2ebf2!important}.bg-cyan-3{background:#80deea!important}.bg-cyan-4{background:#4dd0e1!important}.bg-cyan-5{background:#26c6da!important}.bg-cyan-6{background:#00bcd4!important}.bg-cyan-7{background:#00acc1!important}.bg-cyan-8{background:#0097a7!important}.bg-cyan-9{background:#00838f!important}.bg-cyan-10{background:#006064!important}.bg-cyan-11{background:#84ffff!important}.bg-cyan-12{background:#18ffff!important}.bg-cyan-13{background:#00e5ff!important}.bg-cyan-14{background:#00b8d4!important}.bg-teal{background:#009688!important}.bg-teal-1{background:#e0f2f1!important}.bg-teal-2{background:#b2dfdb!important}.bg-teal-3{background:#80cbc4!important}.bg-teal-4{background:#4db6ac!important}.bg-teal-5{background:#26a69a!important}.bg-teal-6{background:#009688!important}.bg-teal-7{background:#00897b!important}.bg-teal-8{background:#00796b!important}.bg-teal-9{background:#00695c!important}.bg-teal-10{background:#004d40!important}.bg-teal-11{background:#a7ffeb!important}.bg-teal-12{background:#64ffda!important}.bg-teal-13{background:#1de9b6!important}.bg-teal-14{background:#00bfa5!important}.bg-green{background:#4caf50!important}.bg-green-1{background:#e8f5e9!important}.bg-green-2{background:#c8e6c9!important}.bg-green-3{background:#a5d6a7!important}.bg-green-4{background:#81c784!important}.bg-green-5{background:#66bb6a!important}.bg-green-6{background:#4caf50!important}.bg-green-7{background:#43a047!important}.bg-green-8{background:#388e3c!important}.bg-green-9{background:#2e7d32!important}.bg-green-10{background:#1b5e20!important}.bg-green-11{background:#b9f6ca!important}.bg-green-12{background:#69f0ae!important}.bg-green-13{background:#00e676!important}.bg-green-14{background:#00c853!important}.bg-light-green{background:#8bc34a!important}.bg-light-green-1{background:#f1f8e9!important}.bg-light-green-2{background:#dcedc8!important}.bg-light-green-3{background:#c5e1a5!important}.bg-light-green-4{background:#aed581!important}.bg-light-green-5{background:#9ccc65!important}.bg-light-green-6{background:#8bc34a!important}.bg-light-green-7{background:#7cb342!important}.bg-light-green-8{background:#689f38!important}.bg-light-green-9{background:#558b2f!important}.bg-light-green-10{background:#33691e!important}.bg-light-green-11{background:#ccff90!important}.bg-light-green-12{background:#b2ff59!important}.bg-light-green-13{background:#76ff03!important}.bg-light-green-14{background:#64dd17!important}.bg-lime{background:#cddc39!important}.bg-lime-1{background:#f9fbe7!important}.bg-lime-2{background:#f0f4c3!important}.bg-lime-3{background:#e6ee9c!important}.bg-lime-4{background:#dce775!important}.bg-lime-5{background:#d4e157!important}.bg-lime-6{background:#cddc39!important}.bg-lime-7{background:#c0ca33!important}.bg-lime-8{background:#afb42b!important}.bg-lime-9{background:#9e9d24!important}.bg-lime-10{background:#827717!important}.bg-lime-11{background:#f4ff81!important}.bg-lime-12{background:#eeff41!important}.bg-lime-13{background:#c6ff00!important}.bg-lime-14{background:#aeea00!important}.bg-yellow{background:#ffeb3b!important}.bg-yellow-1{background:#fffde7!important}.bg-yellow-2{background:#fff9c4!important}.bg-yellow-3{background:#fff59d!important}.bg-yellow-4{background:#fff176!important}.bg-yellow-5{background:#ffee58!important}.bg-yellow-6{background:#ffeb3b!important}.bg-yellow-7{background:#fdd835!important}.bg-yellow-8{background:#fbc02d!important}.bg-yellow-9{background:#f9a825!important}.bg-yellow-10{background:#f57f17!important}.bg-yellow-11{background:#ffff8d!important}.bg-yellow-12{background:#ff0!important}.bg-yellow-13{background:#ffea00!important}.bg-yellow-14{background:#ffd600!important}.bg-amber{background:#ffc107!important}.bg-amber-1{background:#fff8e1!important}.bg-amber-2{background:#ffecb3!important}.bg-amber-3{background:#ffe082!important}.bg-amber-4{background:#ffd54f!important}.bg-amber-5{background:#ffca28!important}.bg-amber-6{background:#ffc107!important}.bg-amber-7{background:#ffb300!important}.bg-amber-8{background:#ffa000!important}.bg-amber-9{background:#ff8f00!important}.bg-amber-10{background:#ff6f00!important}.bg-amber-11{background:#ffe57f!important}.bg-amber-12{background:#ffd740!important}.bg-amber-13{background:#ffc400!important}.bg-amber-14{background:#ffab00!important}.bg-orange{background:#ff9800!important}.bg-orange-1{background:#fff3e0!important}.bg-orange-2{background:#ffe0b2!important}.bg-orange-3{background:#ffcc80!important}.bg-orange-4{background:#ffb74d!important}.bg-orange-5{background:#ffa726!important}.bg-orange-6{background:#ff9800!important}.bg-orange-7{background:#fb8c00!important}.bg-orange-8{background:#f57c00!important}.bg-orange-9{background:#ef6c00!important}.bg-orange-10{background:#e65100!important}.bg-orange-11{background:#ffd180!important}.bg-orange-12{background:#ffab40!important}.bg-orange-13{background:#ff9100!important}.bg-orange-14{background:#ff6d00!important}.bg-deep-orange{background:#ff5722!important}.bg-deep-orange-1{background:#fbe9e7!important}.bg-deep-orange-2{background:#ffccbc!important}.bg-deep-orange-3{background:#ffab91!important}.bg-deep-orange-4{background:#ff8a65!important}.bg-deep-orange-5{background:#ff7043!important}.bg-deep-orange-6{background:#ff5722!important}.bg-deep-orange-7{background:#f4511e!important}.bg-deep-orange-8{background:#e64a19!important}.bg-deep-orange-9{background:#d84315!important}.bg-deep-orange-10{background:#bf360c!important}.bg-deep-orange-11{background:#ff9e80!important}.bg-deep-orange-12{background:#ff6e40!important}.bg-deep-orange-13{background:#ff3d00!important}.bg-deep-orange-14{background:#dd2c00!important}.bg-brown{background:#795548!important}.bg-brown-1{background:#efebe9!important}.bg-brown-2{background:#d7ccc8!important}.bg-brown-3{background:#bcaaa4!important}.bg-brown-4{background:#a1887f!important}.bg-brown-5{background:#8d6e63!important}.bg-brown-6{background:#795548!important}.bg-brown-7{background:#6d4c41!important}.bg-brown-8{background:#5d4037!important}.bg-brown-9{background:#4e342e!important}.bg-brown-10{background:#3e2723!important}.bg-brown-11{background:#d7ccc8!important}.bg-brown-12{background:#bcaaa4!important}.bg-brown-13{background:#8d6e63!important}.bg-brown-14{background:#5d4037!important}.bg-grey{background:#9e9e9e!important}.bg-grey-1{background:#fafafa!important}.bg-grey-2{background:#f5f5f5!important}.bg-grey-3{background:#eee!important}.bg-grey-4{background:#e0e0e0!important}.bg-grey-5{background:#bdbdbd!important}.bg-grey-6{background:#9e9e9e!important}.bg-grey-7{background:#757575!important}.bg-grey-8{background:#616161!important}.bg-grey-9{background:#424242!important}.bg-grey-10{background:#212121!important}.bg-grey-11{background:#f5f5f5!important}.bg-grey-12{background:#eee!important}.bg-grey-13{background:#bdbdbd!important}.bg-grey-14{background:#616161!important}.bg-blue-grey{background:#607d8b!important}.bg-blue-grey-1{background:#eceff1!important}.bg-blue-grey-2{background:#cfd8dc!important}.bg-blue-grey-3{background:#b0bec5!important}.bg-blue-grey-4{background:#90a4ae!important}.bg-blue-grey-5{background:#78909c!important}.bg-blue-grey-6{background:#607d8b!important}.bg-blue-grey-7{background:#546e7a!important}.bg-blue-grey-8{background:#455a64!important}.bg-blue-grey-9{background:#37474f!important}.bg-blue-grey-10{background:#263238!important}.bg-blue-grey-11{background:#cfd8dc!important}.bg-blue-grey-12{background:#b0bec5!important}.bg-blue-grey-13{background:#78909c!important}.bg-blue-grey-14{background:#455a64!important}.shadow-transition{transition:box-shadow .28s cubic-bezier(.4, 0, .2, 1)!important}.shadow-1{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}.shadow-up-1{box-shadow:0 -1px 3px rgba(0,0,0,.2),0 -1px 1px rgba(0,0,0,.14),0 -2px 1px -1px rgba(0,0,0,.12)}.shadow-2{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.shadow-up-2{box-shadow:0 -1px 5px rgba(0,0,0,.2),0 -2px 2px rgba(0,0,0,.14),0 -3px 1px -2px rgba(0,0,0,.12)}.shadow-3{box-shadow:0 1px 8px rgba(0,0,0,.2),0 3px 4px rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.12)}.shadow-up-3{box-shadow:0 -1px 8px rgba(0,0,0,.2),0 -3px 4px rgba(0,0,0,.14),0 -3px 3px -2px rgba(0,0,0,.12)}.shadow-4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.shadow-up-4{box-shadow:0 -2px 4px -1px rgba(0,0,0,.2),0 -4px 5px rgba(0,0,0,.14),0 -1px 10px rgba(0,0,0,.12)}.shadow-5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.shadow-up-5{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -5px 8px rgba(0,0,0,.14),0 -1px 14px rgba(0,0,0,.12)}.shadow-6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px rgba(0,0,0,.14),0 1px 18px rgba(0,0,0,.12)}.shadow-up-6{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -6px 10px rgba(0,0,0,.14),0 -1px 18px rgba(0,0,0,.12)}.shadow-7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.shadow-up-7{box-shadow:0 -4px 5px -2px rgba(0,0,0,.2),0 -7px 10px 1px rgba(0,0,0,.14),0 -2px 16px 1px rgba(0,0,0,.12)}.shadow-8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.shadow-up-8{box-shadow:0 -5px 5px -3px rgba(0,0,0,.2),0 -8px 10px 1px rgba(0,0,0,.14),0 -3px 14px 2px rgba(0,0,0,.12)}.shadow-9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.shadow-up-9{box-shadow:0 -5px 6px -3px rgba(0,0,0,.2),0 -9px 12px 1px rgba(0,0,0,.14),0 -3px 16px 2px rgba(0,0,0,.12)}.shadow-10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.shadow-up-10{box-shadow:0 -6px 6px -3px rgba(0,0,0,.2),0 -10px 14px 1px rgba(0,0,0,.14),0 -4px 18px 3px rgba(0,0,0,.12)}.shadow-11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.shadow-up-11{box-shadow:0 -6px 7px -4px rgba(0,0,0,.2),0 -11px 15px 1px rgba(0,0,0,.14),0 -4px 20px 3px rgba(0,0,0,.12)}.shadow-12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.shadow-up-12{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -12px 17px 2px rgba(0,0,0,.14),0 -5px 22px 4px rgba(0,0,0,.12)}.shadow-13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.shadow-up-13{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -13px 19px 2px rgba(0,0,0,.14),0 -5px 24px 4px rgba(0,0,0,.12)}.shadow-14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.shadow-up-14{box-shadow:0 -7px 9px -4px rgba(0,0,0,.2),0 -14px 21px 2px rgba(0,0,0,.14),0 -5px 26px 4px rgba(0,0,0,.12)}.shadow-15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.shadow-up-15{box-shadow:0 -8px 9px -5px rgba(0,0,0,.2),0 -15px 22px 2px rgba(0,0,0,.14),0 -6px 28px 5px rgba(0,0,0,.12)}.shadow-16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.shadow-up-16{box-shadow:0 -8px 10px -5px rgba(0,0,0,.2),0 -16px 24px 2px rgba(0,0,0,.14),0 -6px 30px 5px rgba(0,0,0,.12)}.shadow-17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.shadow-up-17{box-shadow:0 -8px 11px -5px rgba(0,0,0,.2),0 -17px 26px 2px rgba(0,0,0,.14),0 -6px 32px 5px rgba(0,0,0,.12)}.shadow-18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.shadow-up-18{box-shadow:0 -9px 11px -5px rgba(0,0,0,.2),0 -18px 28px 2px rgba(0,0,0,.14),0 -7px 34px 6px rgba(0,0,0,.12)}.shadow-19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.shadow-up-19{box-shadow:0 -9px 12px -6px rgba(0,0,0,.2),0 -19px 29px 2px rgba(0,0,0,.14),0 -7px 36px 6px rgba(0,0,0,.12)}.shadow-20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.shadow-up-20{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -20px 31px 3px rgba(0,0,0,.14),0 -8px 38px 7px rgba(0,0,0,.12)}.shadow-21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.shadow-up-21{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -21px 33px 3px rgba(0,0,0,.14),0 -8px 40px 7px rgba(0,0,0,.12)}.shadow-22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.shadow-up-22{box-shadow:0 -10px 14px -6px rgba(0,0,0,.2),0 -22px 35px 3px rgba(0,0,0,.14),0 -8px 42px 7px rgba(0,0,0,.12)}.shadow-23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.shadow-up-23{box-shadow:0 -11px 14px -7px rgba(0,0,0,.2),0 -23px 36px 3px rgba(0,0,0,.14),0 -9px 44px 8px rgba(0,0,0,.12)}.shadow-24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.shadow-up-24{box-shadow:0 -11px 15px -7px rgba(0,0,0,.2),0 -24px 38px 3px rgba(0,0,0,.14),0 -9px 46px 8px rgba(0,0,0,.12)}.inset-shadow{box-shadow:0 7px 9px -7px rgba(0,0,0,.7) inset}.inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(0,0,0,.7) inset}body.body--dark .shadow-1{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-up-1{box-shadow:0 -1px 3px rgba(255,255,255,.2),0 -1px 1px rgba(255,255,255,.14),0 -2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-2{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-2{box-shadow:0 -1px 5px rgba(255,255,255,.2),0 -2px 2px rgba(255,255,255,.14),0 -3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-3{box-shadow:0 1px 8px rgba(255,255,255,.2),0 3px 4px rgba(255,255,255,.14),0 3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-3{box-shadow:0 -1px 8px rgba(255,255,255,.2),0 -3px 4px rgba(255,255,255,.14),0 -3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-4{box-shadow:0 2px 4px -1px rgba(255,255,255,.2),0 4px 5px rgba(255,255,255,.14),0 1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-up-4{box-shadow:0 -2px 4px -1px rgba(255,255,255,.2),0 -4px 5px rgba(255,255,255,.14),0 -1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-5{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 5px 8px rgba(255,255,255,.14),0 1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-up-5{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -5px 8px rgba(255,255,255,.14),0 -1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-6{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 6px 10px rgba(255,255,255,.14),0 1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-up-6{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -6px 10px rgba(255,255,255,.14),0 -1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-7{box-shadow:0 4px 5px -2px rgba(255,255,255,.2),0 7px 10px 1px rgba(255,255,255,.14),0 2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-up-7{box-shadow:0 -4px 5px -2px rgba(255,255,255,.2),0 -7px 10px 1px rgba(255,255,255,.14),0 -2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-8{box-shadow:0 5px 5px -3px rgba(255,255,255,.2),0 8px 10px 1px rgba(255,255,255,.14),0 3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-8{box-shadow:0 -5px 5px -3px rgba(255,255,255,.2),0 -8px 10px 1px rgba(255,255,255,.14),0 -3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-9{box-shadow:0 5px 6px -3px rgba(255,255,255,.2),0 9px 12px 1px rgba(255,255,255,.14),0 3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-9{box-shadow:0 -5px 6px -3px rgba(255,255,255,.2),0 -9px 12px 1px rgba(255,255,255,.14),0 -3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-10{box-shadow:0 6px 6px -3px rgba(255,255,255,.2),0 10px 14px 1px rgba(255,255,255,.14),0 4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-10{box-shadow:0 -6px 6px -3px rgba(255,255,255,.2),0 -10px 14px 1px rgba(255,255,255,.14),0 -4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-11{box-shadow:0 6px 7px -4px rgba(255,255,255,.2),0 11px 15px 1px rgba(255,255,255,.14),0 4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-11{box-shadow:0 -6px 7px -4px rgba(255,255,255,.2),0 -11px 15px 1px rgba(255,255,255,.14),0 -4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-12{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 12px 17px 2px rgba(255,255,255,.14),0 5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-12{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -12px 17px 2px rgba(255,255,255,.14),0 -5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-13{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 13px 19px 2px rgba(255,255,255,.14),0 5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-13{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -13px 19px 2px rgba(255,255,255,.14),0 -5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-14{box-shadow:0 7px 9px -4px rgba(255,255,255,.2),0 14px 21px 2px rgba(255,255,255,.14),0 5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-14{box-shadow:0 -7px 9px -4px rgba(255,255,255,.2),0 -14px 21px 2px rgba(255,255,255,.14),0 -5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-15{box-shadow:0 8px 9px -5px rgba(255,255,255,.2),0 15px 22px 2px rgba(255,255,255,.14),0 6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-15{box-shadow:0 -8px 9px -5px rgba(255,255,255,.2),0 -15px 22px 2px rgba(255,255,255,.14),0 -6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-16{box-shadow:0 8px 10px -5px rgba(255,255,255,.2),0 16px 24px 2px rgba(255,255,255,.14),0 6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-16{box-shadow:0 -8px 10px -5px rgba(255,255,255,.2),0 -16px 24px 2px rgba(255,255,255,.14),0 -6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-17{box-shadow:0 8px 11px -5px rgba(255,255,255,.2),0 17px 26px 2px rgba(255,255,255,.14),0 6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-17{box-shadow:0 -8px 11px -5px rgba(255,255,255,.2),0 -17px 26px 2px rgba(255,255,255,.14),0 -6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-18{box-shadow:0 9px 11px -5px rgba(255,255,255,.2),0 18px 28px 2px rgba(255,255,255,.14),0 7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-18{box-shadow:0 -9px 11px -5px rgba(255,255,255,.2),0 -18px 28px 2px rgba(255,255,255,.14),0 -7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-19{box-shadow:0 9px 12px -6px rgba(255,255,255,.2),0 19px 29px 2px rgba(255,255,255,.14),0 7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-19{box-shadow:0 -9px 12px -6px rgba(255,255,255,.2),0 -19px 29px 2px rgba(255,255,255,.14),0 -7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-20{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 20px 31px 3px rgba(255,255,255,.14),0 8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-20{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -20px 31px 3px rgba(255,255,255,.14),0 -8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-21{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 21px 33px 3px rgba(255,255,255,.14),0 8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-21{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -21px 33px 3px rgba(255,255,255,.14),0 -8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-22{box-shadow:0 10px 14px -6px rgba(255,255,255,.2),0 22px 35px 3px rgba(255,255,255,.14),0 8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-22{box-shadow:0 -10px 14px -6px rgba(255,255,255,.2),0 -22px 35px 3px rgba(255,255,255,.14),0 -8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-23{box-shadow:0 11px 14px -7px rgba(255,255,255,.2),0 23px 36px 3px rgba(255,255,255,.14),0 9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-23{box-shadow:0 -11px 14px -7px rgba(255,255,255,.2),0 -23px 36px 3px rgba(255,255,255,.14),0 -9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-24{box-shadow:0 11px 15px -7px rgba(255,255,255,.2),0 24px 38px 3px rgba(255,255,255,.14),0 9px 46px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-24{box-shadow:0 -11px 15px -7px rgba(255,255,255,.2),0 -24px 38px 3px rgba(255,255,255,.14),0 -9px 46px 8px rgba(255,255,255,.12)}body.body--dark .inset-shadow{box-shadow:0 7px 9px -7px rgba(255,255,255,.7) inset}body.body--dark .inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(255,255,255,.7) inset}.no-shadow,.shadow-0{box-shadow:none!important}.z-marginals{z-index:2000}.z-notify{z-index:9500}.z-fullscreen{z-index:6000}.z-inherit{z-index:inherit!important}.column,.flex,.row{display:flex;flex-wrap:wrap}.column.inline,.flex.inline,.row.inline{display:inline-flex}.row.reverse{flex-direction:row-reverse}.column{flex-direction:column}.column.reverse{flex-direction:column-reverse}.wrap{flex-wrap:wrap}.no-wrap{flex-wrap:nowrap}.reverse-wrap{flex-wrap:wrap-reverse}.order-first{order:-10000}.order-last{order:10000}.order-none{order:0}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.flex-center,.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.flex-center,.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-center{align-content:center}.content-stretch{align-content:stretch}.content-between{align-content:space-between}.content-around{align-content:space-around}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-baseline{align-self:baseline}.self-stretch{align-self:stretch}.q-gutter-none,.q-gutter-x-none{margin-left:0}.q-gutter-none>*,.q-gutter-x-none>*{margin-left:0}.q-gutter-none,.q-gutter-y-none{margin-top:0}.q-gutter-none>*,.q-gutter-y-none>*{margin-top:0}.q-col-gutter-none,.q-col-gutter-x-none{margin-left:0}.q-col-gutter-none>*,.q-col-gutter-x-none>*{padding-left:0}.q-col-gutter-none,.q-col-gutter-y-none{margin-top:0}.q-col-gutter-none>*,.q-col-gutter-y-none>*{padding-top:0}.q-gutter-x-xs,.q-gutter-xs{margin-left:-4px}.q-gutter-x-xs>*,.q-gutter-xs>*{margin-left:4px}.q-gutter-xs,.q-gutter-y-xs{margin-top:-4px}.q-gutter-xs>*,.q-gutter-y-xs>*{margin-top:4px}.q-col-gutter-x-xs,.q-col-gutter-xs{margin-left:-4px}.q-col-gutter-x-xs>*,.q-col-gutter-xs>*{padding-left:4px}.q-col-gutter-xs,.q-col-gutter-y-xs{margin-top:-4px}.q-col-gutter-xs>*,.q-col-gutter-y-xs>*{padding-top:4px}.q-gutter-sm,.q-gutter-x-sm{margin-left:-8px}.q-gutter-sm>*,.q-gutter-x-sm>*{margin-left:8px}.q-gutter-sm,.q-gutter-y-sm{margin-top:-8px}.q-gutter-sm>*,.q-gutter-y-sm>*{margin-top:8px}.q-col-gutter-sm,.q-col-gutter-x-sm{margin-left:-8px}.q-col-gutter-sm>*,.q-col-gutter-x-sm>*{padding-left:8px}.q-col-gutter-sm,.q-col-gutter-y-sm{margin-top:-8px}.q-col-gutter-sm>*,.q-col-gutter-y-sm>*{padding-top:8px}.q-gutter-md,.q-gutter-x-md{margin-left:-16px}.q-gutter-md>*,.q-gutter-x-md>*{margin-left:16px}.q-gutter-md,.q-gutter-y-md{margin-top:-16px}.q-gutter-md>*,.q-gutter-y-md>*{margin-top:16px}.q-col-gutter-md,.q-col-gutter-x-md{margin-left:-16px}.q-col-gutter-md>*,.q-col-gutter-x-md>*{padding-left:16px}.q-col-gutter-md,.q-col-gutter-y-md{margin-top:-16px}.q-col-gutter-md>*,.q-col-gutter-y-md>*{padding-top:16px}.q-gutter-lg,.q-gutter-x-lg{margin-left:-24px}.q-gutter-lg>*,.q-gutter-x-lg>*{margin-left:24px}.q-gutter-lg,.q-gutter-y-lg{margin-top:-24px}.q-gutter-lg>*,.q-gutter-y-lg>*{margin-top:24px}.q-col-gutter-lg,.q-col-gutter-x-lg{margin-left:-24px}.q-col-gutter-lg>*,.q-col-gutter-x-lg>*{padding-left:24px}.q-col-gutter-lg,.q-col-gutter-y-lg{margin-top:-24px}.q-col-gutter-lg>*,.q-col-gutter-y-lg>*{padding-top:24px}.q-gutter-x-xl,.q-gutter-xl{margin-left:-48px}.q-gutter-x-xl>*,.q-gutter-xl>*{margin-left:48px}.q-gutter-xl,.q-gutter-y-xl{margin-top:-48px}.q-gutter-xl>*,.q-gutter-y-xl>*{margin-top:48px}.q-col-gutter-x-xl,.q-col-gutter-xl{margin-left:-48px}.q-col-gutter-x-xl>*,.q-col-gutter-xl>*{padding-left:48px}.q-col-gutter-xl,.q-col-gutter-y-xl{margin-top:-48px}.q-col-gutter-xl>*,.q-col-gutter-y-xl>*{padding-top:48px}@media (min-width:0){.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink,.row>.col,.row>.col-0,.row>.col-1,.row>.col-10,.row>.col-11,.row>.col-12,.row>.col-2,.row>.col-3,.row>.col-4,.row>.col-5,.row>.col-6,.row>.col-7,.row>.col-8,.row>.col-9,.row>.col-auto,.row>.col-grow,.row>.col-shrink,.row>.col-xs,.row>.col-xs-0,.row>.col-xs-1,.row>.col-xs-10,.row>.col-xs-11,.row>.col-xs-12,.row>.col-xs-2,.row>.col-xs-3,.row>.col-xs-4,.row>.col-xs-5,.row>.col-xs-6,.row>.col-xs-7,.row>.col-xs-8,.row>.col-xs-9,.row>.col-xs-auto,.row>.col-xs-grow,.row>.col-xs-shrink{width:auto;min-width:0;max-width:100%}.column>.col,.column>.col-0,.column>.col-1,.column>.col-10,.column>.col-11,.column>.col-12,.column>.col-2,.column>.col-3,.column>.col-4,.column>.col-5,.column>.col-6,.column>.col-7,.column>.col-8,.column>.col-9,.column>.col-auto,.column>.col-grow,.column>.col-shrink,.column>.col-xs,.column>.col-xs-0,.column>.col-xs-1,.column>.col-xs-10,.column>.col-xs-11,.column>.col-xs-12,.column>.col-xs-2,.column>.col-xs-3,.column>.col-xs-4,.column>.col-xs-5,.column>.col-xs-6,.column>.col-xs-7,.column>.col-xs-8,.column>.col-xs-9,.column>.col-xs-auto,.column>.col-xs-grow,.column>.col-xs-shrink,.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink{height:auto;min-height:0;max-height:100%}.col,.col-xs{flex:10000 1 0%}.col-0,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-xs-0,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-auto{flex:0 0 auto}.col-grow,.col-xs-grow{flex:1 0 auto}.col-shrink,.col-xs-shrink{flex:0 1 auto}.row>.col-0,.row>.col-xs-0{height:auto;width:0%}.row>.offset-0,.row>.offset-xs-0{margin-left:0}.column>.col-0,.column>.col-xs-0{height:0%;width:auto}.row>.col-1,.row>.col-xs-1{height:auto;width:8.3333%}.row>.offset-1,.row>.offset-xs-1{margin-left:8.3333%}.column>.col-1,.column>.col-xs-1{height:8.3333%;width:auto}.row>.col-2,.row>.col-xs-2{height:auto;width:16.6667%}.row>.offset-2,.row>.offset-xs-2{margin-left:16.6667%}.column>.col-2,.column>.col-xs-2{height:16.6667%;width:auto}.row>.col-3,.row>.col-xs-3{height:auto;width:25%}.row>.offset-3,.row>.offset-xs-3{margin-left:25%}.column>.col-3,.column>.col-xs-3{height:25%;width:auto}.row>.col-4,.row>.col-xs-4{height:auto;width:33.3333%}.row>.offset-4,.row>.offset-xs-4{margin-left:33.3333%}.column>.col-4,.column>.col-xs-4{height:33.3333%;width:auto}.row>.col-5,.row>.col-xs-5{height:auto;width:41.6667%}.row>.offset-5,.row>.offset-xs-5{margin-left:41.6667%}.column>.col-5,.column>.col-xs-5{height:41.6667%;width:auto}.row>.col-6,.row>.col-xs-6{height:auto;width:50%}.row>.offset-6,.row>.offset-xs-6{margin-left:50%}.column>.col-6,.column>.col-xs-6{height:50%;width:auto}.row>.col-7,.row>.col-xs-7{height:auto;width:58.3333%}.row>.offset-7,.row>.offset-xs-7{margin-left:58.3333%}.column>.col-7,.column>.col-xs-7{height:58.3333%;width:auto}.row>.col-8,.row>.col-xs-8{height:auto;width:66.6667%}.row>.offset-8,.row>.offset-xs-8{margin-left:66.6667%}.column>.col-8,.column>.col-xs-8{height:66.6667%;width:auto}.row>.col-9,.row>.col-xs-9{height:auto;width:75%}.row>.offset-9,.row>.offset-xs-9{margin-left:75%}.column>.col-9,.column>.col-xs-9{height:75%;width:auto}.row>.col-10,.row>.col-xs-10{height:auto;width:83.3333%}.row>.offset-10,.row>.offset-xs-10{margin-left:83.3333%}.column>.col-10,.column>.col-xs-10{height:83.3333%;width:auto}.row>.col-11,.row>.col-xs-11{height:auto;width:91.6667%}.row>.offset-11,.row>.offset-xs-11{margin-left:91.6667%}.column>.col-11,.column>.col-xs-11{height:91.6667%;width:auto}.row>.col-12,.row>.col-xs-12{height:auto;width:100%}.row>.offset-12,.row>.offset-xs-12{margin-left:100%}.column>.col-12,.column>.col-xs-12{height:100%;width:auto}.row>.col-all{height:auto;flex:0 0 100%}}@media (min-width:600px){.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink,.row>.col-sm,.row>.col-sm-0,.row>.col-sm-1,.row>.col-sm-10,.row>.col-sm-11,.row>.col-sm-12,.row>.col-sm-2,.row>.col-sm-3,.row>.col-sm-4,.row>.col-sm-5,.row>.col-sm-6,.row>.col-sm-7,.row>.col-sm-8,.row>.col-sm-9,.row>.col-sm-auto,.row>.col-sm-grow,.row>.col-sm-shrink{width:auto;min-width:0;max-width:100%}.column>.col-sm,.column>.col-sm-0,.column>.col-sm-1,.column>.col-sm-10,.column>.col-sm-11,.column>.col-sm-12,.column>.col-sm-2,.column>.col-sm-3,.column>.col-sm-4,.column>.col-sm-5,.column>.col-sm-6,.column>.col-sm-7,.column>.col-sm-8,.column>.col-sm-9,.column>.col-sm-auto,.column>.col-sm-grow,.column>.col-sm-shrink,.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink{height:auto;min-height:0;max-height:100%}.col-sm{flex:10000 1 0%}.col-sm-0,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto{flex:0 0 auto}.col-sm-grow{flex:1 0 auto}.col-sm-shrink{flex:0 1 auto}.row>.col-sm-0{height:auto;width:0%}.row>.offset-sm-0{margin-left:0}.column>.col-sm-0{height:0%;width:auto}.row>.col-sm-1{height:auto;width:8.3333%}.row>.offset-sm-1{margin-left:8.3333%}.column>.col-sm-1{height:8.3333%;width:auto}.row>.col-sm-2{height:auto;width:16.6667%}.row>.offset-sm-2{margin-left:16.6667%}.column>.col-sm-2{height:16.6667%;width:auto}.row>.col-sm-3{height:auto;width:25%}.row>.offset-sm-3{margin-left:25%}.column>.col-sm-3{height:25%;width:auto}.row>.col-sm-4{height:auto;width:33.3333%}.row>.offset-sm-4{margin-left:33.3333%}.column>.col-sm-4{height:33.3333%;width:auto}.row>.col-sm-5{height:auto;width:41.6667%}.row>.offset-sm-5{margin-left:41.6667%}.column>.col-sm-5{height:41.6667%;width:auto}.row>.col-sm-6{height:auto;width:50%}.row>.offset-sm-6{margin-left:50%}.column>.col-sm-6{height:50%;width:auto}.row>.col-sm-7{height:auto;width:58.3333%}.row>.offset-sm-7{margin-left:58.3333%}.column>.col-sm-7{height:58.3333%;width:auto}.row>.col-sm-8{height:auto;width:66.6667%}.row>.offset-sm-8{margin-left:66.6667%}.column>.col-sm-8{height:66.6667%;width:auto}.row>.col-sm-9{height:auto;width:75%}.row>.offset-sm-9{margin-left:75%}.column>.col-sm-9{height:75%;width:auto}.row>.col-sm-10{height:auto;width:83.3333%}.row>.offset-sm-10{margin-left:83.3333%}.column>.col-sm-10{height:83.3333%;width:auto}.row>.col-sm-11{height:auto;width:91.6667%}.row>.offset-sm-11{margin-left:91.6667%}.column>.col-sm-11{height:91.6667%;width:auto}.row>.col-sm-12{height:auto;width:100%}.row>.offset-sm-12{margin-left:100%}.column>.col-sm-12{height:100%;width:auto}}@media (min-width:1024px){.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink,.row>.col-md,.row>.col-md-0,.row>.col-md-1,.row>.col-md-10,.row>.col-md-11,.row>.col-md-12,.row>.col-md-2,.row>.col-md-3,.row>.col-md-4,.row>.col-md-5,.row>.col-md-6,.row>.col-md-7,.row>.col-md-8,.row>.col-md-9,.row>.col-md-auto,.row>.col-md-grow,.row>.col-md-shrink{width:auto;min-width:0;max-width:100%}.column>.col-md,.column>.col-md-0,.column>.col-md-1,.column>.col-md-10,.column>.col-md-11,.column>.col-md-12,.column>.col-md-2,.column>.col-md-3,.column>.col-md-4,.column>.col-md-5,.column>.col-md-6,.column>.col-md-7,.column>.col-md-8,.column>.col-md-9,.column>.col-md-auto,.column>.col-md-grow,.column>.col-md-shrink,.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink{height:auto;min-height:0;max-height:100%}.col-md{flex:10000 1 0%}.col-md-0,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto{flex:0 0 auto}.col-md-grow{flex:1 0 auto}.col-md-shrink{flex:0 1 auto}.row>.col-md-0{height:auto;width:0%}.row>.offset-md-0{margin-left:0}.column>.col-md-0{height:0%;width:auto}.row>.col-md-1{height:auto;width:8.3333%}.row>.offset-md-1{margin-left:8.3333%}.column>.col-md-1{height:8.3333%;width:auto}.row>.col-md-2{height:auto;width:16.6667%}.row>.offset-md-2{margin-left:16.6667%}.column>.col-md-2{height:16.6667%;width:auto}.row>.col-md-3{height:auto;width:25%}.row>.offset-md-3{margin-left:25%}.column>.col-md-3{height:25%;width:auto}.row>.col-md-4{height:auto;width:33.3333%}.row>.offset-md-4{margin-left:33.3333%}.column>.col-md-4{height:33.3333%;width:auto}.row>.col-md-5{height:auto;width:41.6667%}.row>.offset-md-5{margin-left:41.6667%}.column>.col-md-5{height:41.6667%;width:auto}.row>.col-md-6{height:auto;width:50%}.row>.offset-md-6{margin-left:50%}.column>.col-md-6{height:50%;width:auto}.row>.col-md-7{height:auto;width:58.3333%}.row>.offset-md-7{margin-left:58.3333%}.column>.col-md-7{height:58.3333%;width:auto}.row>.col-md-8{height:auto;width:66.6667%}.row>.offset-md-8{margin-left:66.6667%}.column>.col-md-8{height:66.6667%;width:auto}.row>.col-md-9{height:auto;width:75%}.row>.offset-md-9{margin-left:75%}.column>.col-md-9{height:75%;width:auto}.row>.col-md-10{height:auto;width:83.3333%}.row>.offset-md-10{margin-left:83.3333%}.column>.col-md-10{height:83.3333%;width:auto}.row>.col-md-11{height:auto;width:91.6667%}.row>.offset-md-11{margin-left:91.6667%}.column>.col-md-11{height:91.6667%;width:auto}.row>.col-md-12{height:auto;width:100%}.row>.offset-md-12{margin-left:100%}.column>.col-md-12{height:100%;width:auto}}@media (min-width:1440px){.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink,.row>.col-lg,.row>.col-lg-0,.row>.col-lg-1,.row>.col-lg-10,.row>.col-lg-11,.row>.col-lg-12,.row>.col-lg-2,.row>.col-lg-3,.row>.col-lg-4,.row>.col-lg-5,.row>.col-lg-6,.row>.col-lg-7,.row>.col-lg-8,.row>.col-lg-9,.row>.col-lg-auto,.row>.col-lg-grow,.row>.col-lg-shrink{width:auto;min-width:0;max-width:100%}.column>.col-lg,.column>.col-lg-0,.column>.col-lg-1,.column>.col-lg-10,.column>.col-lg-11,.column>.col-lg-12,.column>.col-lg-2,.column>.col-lg-3,.column>.col-lg-4,.column>.col-lg-5,.column>.col-lg-6,.column>.col-lg-7,.column>.col-lg-8,.column>.col-lg-9,.column>.col-lg-auto,.column>.col-lg-grow,.column>.col-lg-shrink,.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink{height:auto;min-height:0;max-height:100%}.col-lg{flex:10000 1 0%}.col-lg-0,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto{flex:0 0 auto}.col-lg-grow{flex:1 0 auto}.col-lg-shrink{flex:0 1 auto}.row>.col-lg-0{height:auto;width:0%}.row>.offset-lg-0{margin-left:0}.column>.col-lg-0{height:0%;width:auto}.row>.col-lg-1{height:auto;width:8.3333%}.row>.offset-lg-1{margin-left:8.3333%}.column>.col-lg-1{height:8.3333%;width:auto}.row>.col-lg-2{height:auto;width:16.6667%}.row>.offset-lg-2{margin-left:16.6667%}.column>.col-lg-2{height:16.6667%;width:auto}.row>.col-lg-3{height:auto;width:25%}.row>.offset-lg-3{margin-left:25%}.column>.col-lg-3{height:25%;width:auto}.row>.col-lg-4{height:auto;width:33.3333%}.row>.offset-lg-4{margin-left:33.3333%}.column>.col-lg-4{height:33.3333%;width:auto}.row>.col-lg-5{height:auto;width:41.6667%}.row>.offset-lg-5{margin-left:41.6667%}.column>.col-lg-5{height:41.6667%;width:auto}.row>.col-lg-6{height:auto;width:50%}.row>.offset-lg-6{margin-left:50%}.column>.col-lg-6{height:50%;width:auto}.row>.col-lg-7{height:auto;width:58.3333%}.row>.offset-lg-7{margin-left:58.3333%}.column>.col-lg-7{height:58.3333%;width:auto}.row>.col-lg-8{height:auto;width:66.6667%}.row>.offset-lg-8{margin-left:66.6667%}.column>.col-lg-8{height:66.6667%;width:auto}.row>.col-lg-9{height:auto;width:75%}.row>.offset-lg-9{margin-left:75%}.column>.col-lg-9{height:75%;width:auto}.row>.col-lg-10{height:auto;width:83.3333%}.row>.offset-lg-10{margin-left:83.3333%}.column>.col-lg-10{height:83.3333%;width:auto}.row>.col-lg-11{height:auto;width:91.6667%}.row>.offset-lg-11{margin-left:91.6667%}.column>.col-lg-11{height:91.6667%;width:auto}.row>.col-lg-12{height:auto;width:100%}.row>.offset-lg-12{margin-left:100%}.column>.col-lg-12{height:100%;width:auto}}@media (min-width:1920px){.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink,.row>.col-xl,.row>.col-xl-0,.row>.col-xl-1,.row>.col-xl-10,.row>.col-xl-11,.row>.col-xl-12,.row>.col-xl-2,.row>.col-xl-3,.row>.col-xl-4,.row>.col-xl-5,.row>.col-xl-6,.row>.col-xl-7,.row>.col-xl-8,.row>.col-xl-9,.row>.col-xl-auto,.row>.col-xl-grow,.row>.col-xl-shrink{width:auto;min-width:0;max-width:100%}.column>.col-xl,.column>.col-xl-0,.column>.col-xl-1,.column>.col-xl-10,.column>.col-xl-11,.column>.col-xl-12,.column>.col-xl-2,.column>.col-xl-3,.column>.col-xl-4,.column>.col-xl-5,.column>.col-xl-6,.column>.col-xl-7,.column>.col-xl-8,.column>.col-xl-9,.column>.col-xl-auto,.column>.col-xl-grow,.column>.col-xl-shrink,.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink{height:auto;min-height:0;max-height:100%}.col-xl{flex:10000 1 0%}.col-xl-0,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{flex:0 0 auto}.col-xl-grow{flex:1 0 auto}.col-xl-shrink{flex:0 1 auto}.row>.col-xl-0{height:auto;width:0%}.row>.offset-xl-0{margin-left:0}.column>.col-xl-0{height:0%;width:auto}.row>.col-xl-1{height:auto;width:8.3333%}.row>.offset-xl-1{margin-left:8.3333%}.column>.col-xl-1{height:8.3333%;width:auto}.row>.col-xl-2{height:auto;width:16.6667%}.row>.offset-xl-2{margin-left:16.6667%}.column>.col-xl-2{height:16.6667%;width:auto}.row>.col-xl-3{height:auto;width:25%}.row>.offset-xl-3{margin-left:25%}.column>.col-xl-3{height:25%;width:auto}.row>.col-xl-4{height:auto;width:33.3333%}.row>.offset-xl-4{margin-left:33.3333%}.column>.col-xl-4{height:33.3333%;width:auto}.row>.col-xl-5{height:auto;width:41.6667%}.row>.offset-xl-5{margin-left:41.6667%}.column>.col-xl-5{height:41.6667%;width:auto}.row>.col-xl-6{height:auto;width:50%}.row>.offset-xl-6{margin-left:50%}.column>.col-xl-6{height:50%;width:auto}.row>.col-xl-7{height:auto;width:58.3333%}.row>.offset-xl-7{margin-left:58.3333%}.column>.col-xl-7{height:58.3333%;width:auto}.row>.col-xl-8{height:auto;width:66.6667%}.row>.offset-xl-8{margin-left:66.6667%}.column>.col-xl-8{height:66.6667%;width:auto}.row>.col-xl-9{height:auto;width:75%}.row>.offset-xl-9{margin-left:75%}.column>.col-xl-9{height:75%;width:auto}.row>.col-xl-10{height:auto;width:83.3333%}.row>.offset-xl-10{margin-left:83.3333%}.column>.col-xl-10{height:83.3333%;width:auto}.row>.col-xl-11{height:auto;width:91.6667%}.row>.offset-xl-11{margin-left:91.6667%}.column>.col-xl-11{height:91.6667%;width:auto}.row>.col-xl-12{height:auto;width:100%}.row>.offset-xl-12{margin-left:100%}.column>.col-xl-12{height:100%;width:auto}}.rounded-borders{border-radius:4px}.border-radius-inherit{border-radius:inherit}.no-transition{transition:none!important}.transition-0{transition:0s!important}.glossy{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-placeholder::placeholder{color:inherit;opacity:.7}.q-body--fullscreen-mixin,.q-body--prevent-scroll{position:fixed!important}.q-body--force-scrollbar-x{overflow-x:scroll}.q-body--force-scrollbar-y{overflow-y:scroll}.q-no-input-spinner{-moz-appearance:textfield!important}.q-no-input-spinner::-webkit-inner-spin-button,.q-no-input-spinner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-link{outline:0;text-decoration:none}.q-link--focusable:focus-visible{-webkit-text-decoration:underline dashed currentColor 1px;text-decoration:underline dashed currentColor 1px}body.electron .q-electron-drag{-webkit-user-select:none;-webkit-app-region:drag}body.electron .q-electron-drag .q-btn-item,body.electron .q-electron-drag--exception{-webkit-app-region:no-drag}img.responsive{max-width:100%;height:auto}.non-selectable{-webkit-user-select:none!important;user-select:none!important}.scroll,body.mobile .scroll--mobile{overflow:auto}.scroll,.scroll-x,.scroll-y{-webkit-overflow-scrolling:touch;will-change:scroll-position}.scroll-x{overflow-x:auto}.scroll-y{overflow-y:auto}.no-scroll{overflow:hidden!important}.no-pointer-events,.no-pointer-events--children,.no-pointer-events--children *{pointer-events:none!important}.all-pointer-events{pointer-events:all!important}.cursor-pointer{cursor:pointer!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-inherit{cursor:inherit!important}.cursor-none{cursor:none!important}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.rotate-45{transform:rotate(45deg)}.rotate-90{transform:rotate(90deg)}.rotate-135{transform:rotate(135deg)}.rotate-180{transform:rotate(180deg)}.rotate-225{transform:rotate(225deg)}.rotate-270{transform:rotate(270deg)}.rotate-315{transform:rotate(315deg)}.flip-horizontal{transform:scaleX(-1)}.flip-vertical{transform:scaleY(-1)}.float-left{float:left}.float-right{float:right}.relative-position{position:relative}.fixed,.fixed-bottom,.fixed-bottom-left,.fixed-bottom-right,.fixed-center,.fixed-full,.fixed-left,.fixed-right,.fixed-top,.fixed-top-left,.fixed-top-right,.fullscreen{position:fixed}.absolute,.absolute-bottom,.absolute-bottom-left,.absolute-bottom-right,.absolute-center,.absolute-full,.absolute-left,.absolute-right,.absolute-top,.absolute-top-left,.absolute-top-right{position:absolute}.absolute-top,.fixed-top{top:0;left:0;right:0}.absolute-right,.fixed-right{top:0;right:0;bottom:0}.absolute-bottom,.fixed-bottom{right:0;bottom:0;left:0}.absolute-left,.fixed-left{top:0;bottom:0;left:0}.absolute-top-left,.fixed-top-left{top:0;left:0}.absolute-top-right,.fixed-top-right{top:0;right:0}.absolute-bottom-left,.fixed-bottom-left{bottom:0;left:0}.absolute-bottom-right,.fixed-bottom-right{bottom:0;right:0}.fullscreen{z-index:6000;border-radius:0!important;max-width:100vw;max-height:100vh}body.q-ios-padding .fullscreen{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}.absolute-full,.fixed-full,.fullscreen{top:0;right:0;bottom:0;left:0}.absolute-center,.fixed-center{top:50%;left:50%;transform:translate(-50%,-50%)}.vertical-top{vertical-align:top!important}.vertical-middle{vertical-align:middle!important}.vertical-bottom{vertical-align:bottom!important}.on-left{margin-right:12px}.on-right{margin-left:12px}.q-position-engine{margin-top:var(--q-pe-top,0)!important;margin-left:var(--q-pe-left,0)!important;will-change:auto;visibility:collapse}:root{--q-size-xs:0;--q-size-sm:600px;--q-size-md:1024px;--q-size-lg:1440px;--q-size-xl:1920px}.fit{width:100%!important;height:100%!important}.full-height{height:100%!important}.full-width{width:100%!important;margin-left:0!important;margin-right:0!important}.window-height{margin-top:0!important;margin-bottom:0!important;height:100vh!important}.window-width{margin-left:0!important;margin-right:0!important;width:100vw!important}.block{display:block!important}.inline-block{display:inline-block!important}.q-pa-none{padding:0 0}.q-pl-none{padding-left:0}.q-pr-none{padding-right:0}.q-pt-none{padding-top:0}.q-pb-none{padding-bottom:0}.q-px-none{padding-left:0;padding-right:0}.q-py-none{padding-top:0;padding-bottom:0}.q-ma-none{margin:0 0}.q-ml-none{margin-left:0}.q-mr-none{margin-right:0}.q-mt-none{margin-top:0}.q-mb-none{margin-bottom:0}.q-mx-none{margin-left:0;margin-right:0}.q-my-none{margin-top:0;margin-bottom:0}.q-pa-xs{padding:4px 4px}.q-pl-xs{padding-left:4px}.q-pr-xs{padding-right:4px}.q-pt-xs{padding-top:4px}.q-pb-xs{padding-bottom:4px}.q-px-xs{padding-left:4px;padding-right:4px}.q-py-xs{padding-top:4px;padding-bottom:4px}.q-ma-xs{margin:4px 4px}.q-ml-xs{margin-left:4px}.q-mr-xs{margin-right:4px}.q-mt-xs{margin-top:4px}.q-mb-xs{margin-bottom:4px}.q-mx-xs{margin-left:4px;margin-right:4px}.q-my-xs{margin-top:4px;margin-bottom:4px}.q-pa-sm{padding:8px 8px}.q-pl-sm{padding-left:8px}.q-pr-sm{padding-right:8px}.q-pt-sm{padding-top:8px}.q-pb-sm{padding-bottom:8px}.q-px-sm{padding-left:8px;padding-right:8px}.q-py-sm{padding-top:8px;padding-bottom:8px}.q-ma-sm{margin:8px 8px}.q-ml-sm{margin-left:8px}.q-mr-sm{margin-right:8px}.q-mt-sm{margin-top:8px}.q-mb-sm{margin-bottom:8px}.q-mx-sm{margin-left:8px;margin-right:8px}.q-my-sm{margin-top:8px;margin-bottom:8px}.q-pa-md{padding:16px 16px}.q-pl-md{padding-left:16px}.q-pr-md{padding-right:16px}.q-pt-md{padding-top:16px}.q-pb-md{padding-bottom:16px}.q-px-md{padding-left:16px;padding-right:16px}.q-py-md{padding-top:16px;padding-bottom:16px}.q-ma-md{margin:16px 16px}.q-ml-md{margin-left:16px}.q-mr-md{margin-right:16px}.q-mt-md{margin-top:16px}.q-mb-md{margin-bottom:16px}.q-mx-md{margin-left:16px;margin-right:16px}.q-my-md{margin-top:16px;margin-bottom:16px}.q-pa-lg{padding:24px 24px}.q-pl-lg{padding-left:24px}.q-pr-lg{padding-right:24px}.q-pt-lg{padding-top:24px}.q-pb-lg{padding-bottom:24px}.q-px-lg{padding-left:24px;padding-right:24px}.q-py-lg{padding-top:24px;padding-bottom:24px}.q-ma-lg{margin:24px 24px}.q-ml-lg{margin-left:24px}.q-mr-lg{margin-right:24px}.q-mt-lg{margin-top:24px}.q-mb-lg{margin-bottom:24px}.q-mx-lg{margin-left:24px;margin-right:24px}.q-my-lg{margin-top:24px;margin-bottom:24px}.q-pa-xl{padding:48px 48px}.q-pl-xl{padding-left:48px}.q-pr-xl{padding-right:48px}.q-pt-xl{padding-top:48px}.q-pb-xl{padding-bottom:48px}.q-px-xl{padding-left:48px;padding-right:48px}.q-py-xl{padding-top:48px;padding-bottom:48px}.q-ma-xl{margin:48px 48px}.q-ml-xl{margin-left:48px}.q-mr-xl{margin-right:48px}.q-mt-xl{margin-top:48px}.q-mb-xl{margin-bottom:48px}.q-mx-xl{margin-left:48px;margin-right:48px}.q-my-xl{margin-top:48px;margin-bottom:48px}.q-mt-auto,.q-my-auto{margin-top:auto}.q-ml-auto{margin-left:auto}.q-mb-auto,.q-my-auto{margin-bottom:auto}.q-mr-auto{margin-right:auto}.q-mx-auto{margin-left:auto;margin-right:auto}.q-touch{-webkit-user-select:none;user-select:none;user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none}.q-touch-x{touch-action:pan-x}.q-touch-y{touch-action:pan-y}:root{--q-transition-duration:.3s}.q-transition--fade-enter-active,.q-transition--fade-leave-active,.q-transition--flip-enter-active,.q-transition--flip-leave-active,.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active,.q-transition--rotate-enter-active,.q-transition--rotate-leave-active,.q-transition--scale-enter-active,.q-transition--scale-leave-active,.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{--q-transition-duration:.3s;--q-transition-easing:cubic-bezier(0.215,0.61,0.355,1)}.q-transition--fade-leave-active,.q-transition--flip-leave-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-leave-active,.q-transition--rotate-leave-active,.q-transition--scale-leave-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-leave-active{position:absolute}.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{transition:transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--slide-right-enter-from{transform:translate3d(-100%,0,0)}.q-transition--slide-right-leave-to{transform:translate3d(100%,0,0)}.q-transition--slide-left-enter-from{transform:translate3d(100%,0,0)}.q-transition--slide-left-leave-to{transform:translate3d(-100%,0,0)}.q-transition--slide-up-enter-from{transform:translate3d(0,100%,0)}.q-transition--slide-up-leave-to{transform:translate3d(0,-100%,0)}.q-transition--slide-down-enter-from{transform:translate3d(0,-100%,0)}.q-transition--slide-down-leave-to{transform:translate3d(0,100%,0)}.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration)}.q-transition--jump-down-enter-from,.q-transition--jump-down-leave-to,.q-transition--jump-left-enter-from,.q-transition--jump-left-leave-to,.q-transition--jump-right-enter-from,.q-transition--jump-right-leave-to,.q-transition--jump-up-enter-from,.q-transition--jump-up-leave-to{opacity:0}.q-transition--jump-right-enter-from{transform:translate3d(-15px,0,0)}.q-transition--jump-right-leave-to{transform:translate3d(15px,0,0)}.q-transition--jump-left-enter-from{transform:translate3d(15px,0,0)}.q-transition--jump-left-leave-to{transform:translateX(-15px)}.q-transition--jump-up-enter-from{transform:translate3d(0,15px,0)}.q-transition--jump-up-leave-to{transform:translate3d(0,-15px,0)}.q-transition--jump-down-enter-from{transform:translate3d(0,-15px,0)}.q-transition--jump-down-leave-to{transform:translate3d(0,15px,0)}.q-transition--fade-enter-active,.q-transition--fade-leave-active{transition:opacity var(--q-transition-duration) ease-out}.q-transition--fade-enter-from,.q-transition--fade-leave-to{opacity:0}.q-transition--scale-enter-active,.q-transition--scale-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--scale-enter-from,.q-transition--scale-leave-to{opacity:0;transform:scale3d(0,0,1)}.q-transition--rotate-enter-active,.q-transition--rotate-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing);transform-style:preserve-3d}.q-transition--rotate-enter-from,.q-transition--rotate-leave-to{opacity:0;transform:scale3d(0,0,1) rotate3d(0,0,1,90deg)}.q-transition--flip-down-enter-active,.q-transition--flip-down-leave-active,.q-transition--flip-left-enter-active,.q-transition--flip-left-leave-active,.q-transition--flip-right-enter-active,.q-transition--flip-right-leave-active,.q-transition--flip-up-enter-active,.q-transition--flip-up-leave-active{transition:transform var(--q-transition-duration);backface-visibility:hidden}.q-transition--flip-down-enter-to,.q-transition--flip-down-leave-from,.q-transition--flip-left-enter-to,.q-transition--flip-left-leave-from,.q-transition--flip-right-enter-to,.q-transition--flip-right-leave-from,.q-transition--flip-up-enter-to,.q-transition--flip-up-leave-from{transform:perspective(400px) rotate3d(1,1,0,0deg)}.q-transition--flip-right-enter-from{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-right-leave-to{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-enter-from{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-leave-to{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-up-enter-from{transform:perspective(400px) rotate3d(1,0,0,-180deg)}.q-transition--flip-up-leave-to{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-enter-from{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-leave-to{transform:perspective(400px) rotate3d(1,0,0,-180deg)}body{min-width:100px;min-height:100%;font-family:Roboto,"-apple-system","Helvetica Neue",Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;line-height:1.5;font-size:14px}h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}p{margin:0 0 16px}.text-h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}.text-h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}.text-h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}.text-h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}.text-h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}.text-h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}.text-subtitle1{font-size:1rem;font-weight:400;line-height:1.75rem;letter-spacing:.00937em}.text-subtitle2{font-size:.875rem;font-weight:500;line-height:1.375rem;letter-spacing:.00714em}.text-body1{font-size:1rem;font-weight:400;line-height:1.5rem;letter-spacing:.03125em}.text-body2{font-size:.875rem;font-weight:400;line-height:1.25rem;letter-spacing:.01786em}.text-overline{font-size:.75rem;font-weight:500;line-height:2rem;letter-spacing:.16667em}.text-caption{font-size:.75rem;font-weight:400;line-height:1.25rem;letter-spacing:.03333em}.text-uppercase{text-transform:uppercase}.text-lowercase{text-transform:lowercase}.text-capitalize{text-transform:capitalize}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-justify{text-align:justify;-webkit-hyphens:auto;hyphens:auto}.text-italic{font-style:italic}.text-bold{font-weight:700}.text-no-wrap{white-space:nowrap}.text-strike{text-decoration:line-through}.text-weight-thin{font-weight:100}.text-weight-light{font-weight:300}.text-weight-regular{font-weight:400}.text-weight-medium{font-weight:500}.text-weight-bold{font-weight:700}.text-weight-bolder{font-weight:900}small{font-size:80%}big{font-size:170%}sub{bottom:-.25em}sup{top:-.5em}.no-margin{margin:0!important}.no-padding{padding:0!important}.no-border{border:0!important}.no-border-radius{border-radius:0!important}.no-box-shadow{box-shadow:none!important}.no-outline{outline:0!important}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ellipsis-2-lines,.ellipsis-3-lines{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.ellipsis-2-lines{-webkit-line-clamp:2}.ellipsis-3-lines{-webkit-line-clamp:3}.readonly{cursor:default!important}.disabled,.disabled *,[disabled],[disabled] *{outline:0!important;cursor:not-allowed!important}.disabled,[disabled]{opacity:.6!important}.hidden{display:none!important}.invisible,.invisible *{visibility:hidden!important;transition:none!important;animation:none!important}.transparent{background:0 0!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-hidden-y{overflow-y:hidden!important}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{width:0;height:0;display:none}.dimmed:after,.light-dimmed:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.dimmed:after{background:rgba(0,0,0,.4)!important}.light-dimmed:after{background:rgba(255,255,255,.6)!important}.z-top{z-index:7000!important}.z-max{z-index:9998!important}body.desktop .desktop-hide,body:not(.desktop) .desktop-only{display:none!important}body.mobile .mobile-hide,body:not(.mobile) .mobile-only{display:none!important}body.native-mobile .native-mobile-hide,body:not(.native-mobile) .native-mobile-only{display:none!important}body.cordova .cordova-hide,body:not(.cordova) .cordova-only{display:none!important}body.capacitor .capacitor-hide,body:not(.capacitor) .capacitor-only{display:none!important}body.electron .electron-hide,body:not(.electron) .electron-only{display:none!important}body.touch .touch-hide,body:not(.touch) .touch-only{display:none!important}body.within-iframe .within-iframe-hide,body:not(.within-iframe) .within-iframe-only{display:none!important}body.platform-ios .platform-ios-hide,body:not(.platform-ios) .platform-ios-only{display:none!important}body.platform-android .platform-android-hide,body:not(.platform-android) .platform-android-only{display:none!important}@media all and (orientation:portrait){.orientation-landscape{display:none!important}}@media all and (orientation:landscape){.orientation-portrait{display:none!important}}@media screen{.print-only{display:none!important}}@media print{.print-hide{display:none!important}}@media (max-width:599.98px){.gt-lg,.gt-md,.gt-sm,.gt-xs,.lg,.md,.sm,.xl,.xs-hide{display:none!important}}@media (min-width:600px) and (max-width:1023.98px){.gt-lg,.gt-md,.gt-sm,.lg,.lt-sm,.md,.sm-hide,.xl,.xs{display:none!important}}@media (min-width:1024px) and (max-width:1439.98px){.gt-lg,.gt-md,.lg,.lt-md,.lt-sm,.md-hide,.sm,.xl,.xs{display:none!important}}@media (min-width:1440px) and (max-width:1919.98px){.gt-lg,.lg-hide,.lt-lg,.lt-md,.lt-sm,.md,.sm,.xl,.xs{display:none!important}}@media (min-width:1920px){.lg,.lt-lg,.lt-md,.lt-sm,.lt-xl,.md,.sm,.xl-hide,.xs{display:none!important}}.q-focus-helper,.q-focusable,.q-hoverable,.q-manual-focusable{outline:0}body.desktop .q-focus-helper{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;border-radius:inherit;opacity:0;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .4s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:after,body.desktop .q-focus-helper:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;border-radius:inherit;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .6s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:before{background:#000}body.desktop .q-focus-helper:after{background:#fff}body.desktop .q-focus-helper--rounded{border-radius:4px}body.desktop .q-focus-helper--round{border-radius:50%}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-hoverable:hover>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{background:currentColor;opacity:.15}body.desktop .q-focusable:focus>.q-focus-helper:before,body.desktop .q-hoverable:hover>.q-focus-helper:before,body.desktop .q-manual-focusable--focused>.q-focus-helper:before{opacity:.1}body.desktop .q-focusable:focus>.q-focus-helper:after,body.desktop .q-hoverable:hover>.q-focus-helper:after,body.desktop .q-manual-focusable--focused>.q-focus-helper:after{opacity:.4}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{opacity:.22}body.body--dark{color:#fff;background:var(--q-dark-page)}.q-dark{color:#fff;background:var(--q-dark)}[data-theme=classic] .q-drawer--dark,[data-theme=classic] .q-menu--dark,body[data-theme=classic].body--dark{background:#1f2234!important}[data-theme=classic] .q-card--dark,[data-theme=classic] .q-stepper--dark{background:#333646!important}[data-theme=classic] .bg-primary{background:#673ab7!important}[data-theme=classic] .text-primary{color:#673ab7!important}[data-theme=classic] .bg-secondary{background:#9c27b0!important}[data-theme=classic] .text-secondary{color:#9c27b0!important}[data-theme=classic] .bg-dark{background:#1f2234!important}[data-theme=classic] .text-dark{color:#1f2234!important}[data-theme=classic] .bg-info{background:#333646!important}[data-theme=classic] .text-info{color:#333646!important}[data-theme=classic] .bg-marginal-bg{background:#1f2234!important}[data-theme=classic] .text-marginal-bg{color:#1f2234!important}[data-theme=classic] .bg-marginal-text{background:#fff!important}[data-theme=classic] .text-marginal-text{color:#fff!important}[data-theme=bitcoin] .q-drawer--dark,[data-theme=bitcoin] .q-menu--dark,body[data-theme=bitcoin].body--dark{background:#2d293b!important}[data-theme=bitcoin] .q-card--dark,[data-theme=bitcoin] .q-stepper--dark{background:#333646!important}[data-theme=bitcoin] .bg-primary{background:#ff9853!important}[data-theme=bitcoin] .text-primary{color:#ff9853!important}[data-theme=bitcoin] .bg-secondary{background:#ff7353!important}[data-theme=bitcoin] .text-secondary{color:#ff7353!important}[data-theme=bitcoin] .bg-dark{background:#2d293b!important}[data-theme=bitcoin] .text-dark{color:#2d293b!important}[data-theme=bitcoin] .bg-info{background:#333646!important}[data-theme=bitcoin] .text-info{color:#333646!important}[data-theme=bitcoin] .bg-marginal-bg{background:#2d293b!important}[data-theme=bitcoin] .text-marginal-bg{color:#2d293b!important}[data-theme=bitcoin] .bg-marginal-text{background:#fff!important}[data-theme=bitcoin] .text-marginal-text{color:#fff!important}[data-theme=freedom] .q-drawer--dark,[data-theme=freedom] .q-menu--dark,body[data-theme=freedom].body--dark{background:#0a0a0a!important}[data-theme=freedom] .q-card--dark,[data-theme=freedom] .q-stepper--dark{background:#1b1b1b!important}[data-theme=freedom] .bg-primary{background:#e22156!important}[data-theme=freedom] .text-primary{color:#e22156!important}[data-theme=freedom] .bg-secondary{background:#b91a45!important}[data-theme=freedom] .text-secondary{color:#b91a45!important}[data-theme=freedom] .bg-dark{background:#0a0a0a!important}[data-theme=freedom] .text-dark{color:#0a0a0a!important}[data-theme=freedom] .bg-info{background:#1b1b1b!important}[data-theme=freedom] .text-info{color:#1b1b1b!important}[data-theme=freedom] .bg-marginal-bg{background:#2d293b!important}[data-theme=freedom] .text-marginal-bg{color:#2d293b!important}[data-theme=freedom] .bg-marginal-text{background:#fff!important}[data-theme=freedom] .text-marginal-text{color:#fff!important}[data-theme=cyber] .q-drawer--dark,[data-theme=cyber] .q-menu--dark,body[data-theme=cyber].body--dark{background:#0a0a0a!important}[data-theme=cyber] .q-card--dark,[data-theme=cyber] .q-stepper--dark{background:#1b1b1b!important}[data-theme=cyber] .bg-primary{background:#7cb342!important}[data-theme=cyber] .text-primary{color:#7cb342!important}[data-theme=cyber] .bg-secondary{background:#558b2f!important}[data-theme=cyber] .text-secondary{color:#558b2f!important}[data-theme=cyber] .bg-dark{background:#0a0a0a!important}[data-theme=cyber] .text-dark{color:#0a0a0a!important}[data-theme=cyber] .bg-info{background:#1b1b1b!important}[data-theme=cyber] .text-info{color:#1b1b1b!important}[data-theme=cyber] .bg-marginal-bg{background:#2d293b!important}[data-theme=cyber] .text-marginal-bg{color:#2d293b!important}[data-theme=cyber] .bg-marginal-text{background:#fff!important}[data-theme=cyber] .text-marginal-text{color:#fff!important}[data-theme=mint] .q-drawer--dark,[data-theme=mint] .q-menu--dark,body[data-theme=mint].body--dark{background:#1f342b!important}[data-theme=mint] .q-card--dark,[data-theme=mint] .q-stepper--dark{background:#334642!important}[data-theme=mint] .bg-primary{background:#3ab77d!important}[data-theme=mint] .text-primary{color:#3ab77d!important}[data-theme=mint] .bg-secondary{background:#27b065!important}[data-theme=mint] .text-secondary{color:#27b065!important}[data-theme=mint] .bg-dark{background:#1f342b!important}[data-theme=mint] .text-dark{color:#1f342b!important}[data-theme=mint] .bg-info{background:#334642!important}[data-theme=mint] .text-info{color:#334642!important}[data-theme=mint] .bg-marginal-bg{background:#1f342b!important}[data-theme=mint] .text-marginal-bg{color:#1f342b!important}[data-theme=mint] .bg-marginal-text{background:#fff!important}[data-theme=mint] .text-marginal-text{color:#fff!important}[data-theme=autumn] .q-drawer--dark,[data-theme=autumn] .q-menu--dark,body[data-theme=autumn].body--dark{background:#34291f!important}[data-theme=autumn] .q-card--dark,[data-theme=autumn] .q-stepper--dark{background:#463f33!important}[data-theme=autumn] .bg-primary{background:#b7763a!important}[data-theme=autumn] .text-primary{color:#b7763a!important}[data-theme=autumn] .bg-secondary{background:#b07927!important}[data-theme=autumn] .text-secondary{color:#b07927!important}[data-theme=autumn] .bg-dark{background:#34291f!important}[data-theme=autumn] .text-dark{color:#34291f!important}[data-theme=autumn] .bg-info{background:#463f33!important}[data-theme=autumn] .text-info{color:#463f33!important}[data-theme=autumn] .bg-marginal-bg{background:#342a1f!important}[data-theme=autumn] .text-marginal-bg{color:#342a1f!important}[data-theme=autumn] .bg-marginal-text{background:#fff!important}[data-theme=autumn] .text-marginal-text{color:#fff!important}[data-theme=flamingo] .q-drawer--dark,[data-theme=flamingo] .q-menu--dark,body[data-theme=flamingo].body--dark{background:#2f032f!important}[data-theme=flamingo] .q-card--dark,[data-theme=flamingo] .q-stepper--dark{background:#bc23bc!important}[data-theme=flamingo] .bg-primary{background:#f0f!important}[data-theme=flamingo] .text-primary{color:#f0f!important}[data-theme=flamingo] .bg-secondary{background:#fda3fd!important}[data-theme=flamingo] .text-secondary{color:#fda3fd!important}[data-theme=flamingo] .bg-dark{background:#2f032f!important}[data-theme=flamingo] .text-dark{color:#2f032f!important}[data-theme=flamingo] .bg-info{background:#bc23bc!important}[data-theme=flamingo] .text-info{color:#bc23bc!important}[data-theme=flamingo] .bg-marginal-bg{background:#311231!important}[data-theme=flamingo] .text-marginal-bg{color:#311231!important}[data-theme=flamingo] .bg-marginal-text{background:#fff!important}[data-theme=flamingo] .text-marginal-text{color:#fff!important}[data-theme=monochrome] .q-drawer--dark,[data-theme=monochrome] .q-menu--dark,body[data-theme=monochrome].body--dark{background:#000!important}[data-theme=monochrome] .q-card--dark,[data-theme=monochrome] .q-stepper--dark{background:#272727!important}[data-theme=monochrome] .bg-primary{background:#494949!important}[data-theme=monochrome] .text-primary{color:#494949!important}[data-theme=monochrome] .bg-secondary{background:#6b6b6b!important}[data-theme=monochrome] .text-secondary{color:#6b6b6b!important}[data-theme=monochrome] .bg-dark{background:#000!important}[data-theme=monochrome] .text-dark{color:#000!important}[data-theme=monochrome] .bg-info{background:#272727!important}[data-theme=monochrome] .text-info{color:#272727!important}[data-theme=monochrome] .bg-marginal-bg{background:#000!important}[data-theme=monochrome] .text-marginal-bg{color:#000!important}[data-theme=monochrome] .bg-marginal-text{background:#fff!important}[data-theme=monochrome] .text-marginal-text{color:#fff!important}[data-theme=freedom] .q-drawer--dark{background:#0a0a0a!important}[data-theme=freedom] .q-header{background:#0a0a0a!important}[data-theme=cyber] .q-drawer--dark{background:#0a0a0a!important}[data-theme=cyber] .q-header{background:#0a0a0a!important}[data-theme=salvador] .q-drawer--dark{background:#242424!important}[data-theme=salvador] .q-header{background:#0f47af!important}[v-cloak]{display:none}body.body--dark .q-table--dark{background:0 0}body.body--dark .q-field--error .q-field__messages,body.body--dark .q-field--error .text-negative{color:#ff0!important}.lnbits-drawer__q-list .q-item{padding-top:5px!important;padding-bottom:5px!important;border-top-right-radius:3px;border-bottom-right-radius:3px}.lnbits-drawer__q-list .q-item.q-item--active{color:inherit;font-weight:700}.lnbits__dialog-card{width:500px}.q-table--dense .q-table__bottom,.q-table--dense td:first-child,.q-table--dense th:first-child{padding-left:6px!important}.q-table--dense .q-table__bottom,.q-table--dense td:last-child,.q-table--dense th:last-child{padding-right:6px!important}a.inherit{color:inherit;text-decoration:none}video{border-radius:3px}.material-icons{font-family:"Material Icons";font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale}.q-rating__icon{font-size:1em}.text-wrap{word-break:break-word}.q-card code{overflow-wrap:break-word}.qrcode__wrapper canvas{position:relative;width:100%!important;max-width:100%;max-height:100%}.qrcode__image{width:15%;height:15%;overflow:hidden;background:#fff;left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);padding:.2rem;border-radius:.2rem}.whitespace-pre-line{white-space:pre-line}.q-carousel__slide{background-size:contain;background-repeat:no-repeat}.q-dialog__inner--minimized{padding:12px} +*,:after,:before{box-sizing:inherit;-webkit-tap-highlight-color:transparent;-moz-tap-highlight-color:transparent}#q-app,body,html{width:100%;direction:ltr}body.platform-ios.within-iframe,body.platform-ios.within-iframe #q-app{width:100px;min-width:100%}body,html{margin:0;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}img{border-style:none}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;font-family:inherit;margin:0}optgroup{font-weight:700}button,input,select{overflow:visible;text-transform:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button:-moz-focusring,input:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.q-icon{line-height:1;width:1em;height:1em;flex-shrink:0;letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;direction:ltr;text-align:center;position:relative;box-sizing:content-box;fill:currentColor}.q-icon:after,.q-icon:before{width:100%;height:100%;display:flex!important;align-items:center;justify-content:center}.q-icon>img,.q-icon>svg{width:100%;height:100%}.q-icon>div{box-sizing:border-box}.material-icons,.material-icons-outlined,.material-icons-round,.material-icons-sharp,.material-symbols-outlined,.material-symbols-rounded,.material-symbols-sharp,.q-icon{-webkit-user-select:none;user-select:none;cursor:inherit;font-size:inherit;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.q-panel{height:100%;width:100%}.q-panel>div{height:100%;width:100%}.q-panel-parent{overflow:hidden;position:relative}.q-loading-bar{position:fixed;z-index:9998;transition:transform .5s cubic-bezier(0, 0, .2, 1),opacity .5s;background:#f44336}.q-loading-bar--top{left:0;right:0;top:0;width:100%}.q-loading-bar--bottom{left:0;right:0;bottom:0;width:100%}.q-loading-bar--right{top:0;bottom:0;right:0;height:100%}.q-loading-bar--left{top:0;bottom:0;left:0;height:100%}.q-avatar{position:relative;vertical-align:middle;display:inline-block;border-radius:50%;font-size:48px;height:1em;width:1em}.q-avatar__content{font-size:.5em;line-height:.5em}.q-avatar img:not(.q-icon):not(.q-img__image),.q-avatar__content{border-radius:inherit;height:inherit;width:inherit}.q-avatar--square{border-radius:0}.q-badge{background-color:var(--q-primary);color:#fff;padding:2px 6px;border-radius:4px;font-size:12px;line-height:1;min-height:12px;font-weight:400;vertical-align:baseline}.q-badge--single-line{white-space:nowrap}.q-badge--multi-line{word-break:break-all;word-wrap:break-word}.q-badge--floating{position:absolute;top:-4px;right:-3px;cursor:inherit}.q-badge--transparent{opacity:.8}.q-badge--outline{background-color:transparent;border:1px solid currentColor}.q-badge--rounded{border-radius:1em}.q-banner{min-height:54px;padding:8px 16px;background:#fff}.q-banner--top-padding{padding-top:14px}.q-banner__avatar{min-width:1px!important}.q-banner__avatar>.q-avatar{font-size:46px}.q-banner__avatar>.q-icon{font-size:40px}.q-banner__avatar:not(:empty)+.q-banner__content{padding-left:16px}.q-banner__actions.col-auto{padding-left:16px}.q-banner__actions.col-all .q-btn-item{margin:4px 0 0 4px}.q-banner--dense{min-height:32px;padding:8px}.q-banner--dense.q-banner--top-padding{padding-top:12px}.q-banner--dense .q-banner__avatar>.q-avatar,.q-banner--dense .q-banner__avatar>.q-icon{font-size:28px}.q-banner--dense .q-banner__avatar:not(:empty)+.q-banner__content{padding-left:8px}.q-banner--dense .q-banner__actions.col-auto{padding-left:8px}.q-bar{background:rgba(0,0,0,.2)}.q-bar>.q-icon{margin-left:2px}.q-bar>div,.q-bar>div+.q-icon{margin-left:8px}.q-bar>.q-btn{margin-left:2px}.q-bar>.q-btn:first-child,.q-bar>.q-icon:first-child,.q-bar>div:first-child{margin-left:0}.q-bar--standard{padding:0 12px;height:32px;font-size:18px}.q-bar--standard>div{font-size:16px}.q-bar--standard .q-btn{font-size:11px}.q-bar--dense{padding:0 8px;height:24px;font-size:14px}.q-bar--dense .q-btn{font-size:8px}.q-bar--dark{background:rgba(255,255,255,.15)}.q-breadcrumbs__el{color:inherit}.q-breadcrumbs__el-icon{font-size:125%}.q-breadcrumbs__el-icon--with-label{margin-right:8px}[dir=rtl] .q-breadcrumbs__separator .q-icon{transform:scaleX(-1)}.q-btn{display:inline-flex;flex-direction:column;align-items:stretch;position:relative;outline:0;border:0;vertical-align:middle;font-size:14px;line-height:1.715em;text-decoration:none;color:inherit;background:0 0;font-weight:500;text-transform:uppercase;text-align:center;width:auto;height:auto;cursor:default;padding:4px 16px;min-height:2.572em}.q-btn .q-icon,.q-btn .q-spinner{font-size:1.715em}.q-btn.disabled{opacity:.7!important}.q-btn:before{content:"";display:block;position:absolute;left:0;right:0;top:0;bottom:0;border-radius:inherit;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-btn--actionable{cursor:pointer}.q-btn--actionable.q-btn--standard:before{transition:box-shadow .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--actionable.q-btn--standard.q-btn--active:before,.q-btn--actionable.q-btn--standard:active:before{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.q-btn--no-uppercase{text-transform:none}.q-btn--rectangle{border-radius:3px}.q-btn--outline{background:0 0!important}.q-btn--outline:before{border:1px solid currentColor}.q-btn--push{border-radius:7px}.q-btn--push:before{border-bottom:3px solid rgba(0,0,0,.15)}.q-btn--push.q-btn--actionable{transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable:before{transition:border-width .3s cubic-bezier(.25, .8, .5, 1)}.q-btn--push.q-btn--actionable.q-btn--active,.q-btn--push.q-btn--actionable:active{transform:translateY(2px)}.q-btn--push.q-btn--actionable.q-btn--active:before,.q-btn--push.q-btn--actionable:active:before{border-bottom-width:0}.q-btn--rounded{border-radius:28px}.q-btn--round{border-radius:50%;padding:0;min-width:3em;min-height:3em}.q-btn--square{border-radius:0}.q-btn--flat:before,.q-btn--outline:before,.q-btn--unelevated:before{box-shadow:none}.q-btn--dense{padding:.285em;min-height:2em}.q-btn--dense.q-btn--round{padding:0;min-height:2.4em;min-width:2.4em}.q-btn--dense .on-left{margin-right:6px}.q-btn--dense .on-right{margin-left:6px}.q-btn--fab .q-icon,.q-btn--fab-mini .q-icon{font-size:24px}.q-btn--fab{padding:16px;min-height:56px;min-width:56px}.q-btn--fab .q-icon{margin:auto}.q-btn--fab-mini{padding:8px;min-height:40px;min-width:40px}.q-btn__content{transition:opacity .3s;z-index:0}.q-btn__content--hidden{opacity:0;pointer-events:none}.q-btn__progress{border-radius:inherit;z-index:0}.q-btn__progress-indicator{z-index:-1;transform:translateX(-100%);background:rgba(255,255,255,.25)}.q-btn__progress--dark .q-btn__progress-indicator{background:rgba(0,0,0,.2)}.q-btn--flat .q-btn__progress-indicator,.q-btn--outline .q-btn__progress-indicator{opacity:.2;background:currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container{padding:0 4px}.q-btn-dropdown--split .q-btn-dropdown__arrow-container.q-btn--outline{border-left:1px solid currentColor}.q-btn-dropdown--split .q-btn-dropdown__arrow-container:not(.q-btn--outline){border-left:1px solid rgba(255,255,255,.3)}.q-btn-dropdown--simple *+.q-btn-dropdown__arrow{margin-left:8px}.q-btn-dropdown__arrow{transition:transform .28s}.q-btn-dropdown--current{flex-grow:1}.q-btn-group{border-radius:3px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);vertical-align:middle}.q-btn-group>.q-btn-item{border-radius:inherit;align-self:stretch}.q-btn-group>.q-btn-item:before{box-shadow:none}.q-btn-group>.q-btn-item .q-badge--floating{right:0}.q-btn-group>.q-btn-group{box-shadow:none}.q-btn-group>.q-btn-group:first-child>.q-btn:first-child{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-btn-group>.q-btn-group:last-child>.q-btn:last-child{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-btn-group>.q-btn-group:not(:first-child)>.q-btn:first-child:before{border-left:0}.q-btn-group>.q-btn-group:not(:last-child)>.q-btn:last-child:before{border-right:0}.q-btn-group>.q-btn-item:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.q-btn-group>.q-btn-item:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.q-btn-group>.q-btn-item.q-btn--standard:before{z-index:-1}.q-btn-group--push{border-radius:7px}.q-btn-group--push>.q-btn--push.q-btn--actionable{transform:none}.q-btn-group--push>.q-btn--push.q-btn--actionable .q-btn__content{transition:margin-top .3s cubic-bezier(.25, .8, .5, 1),margin-bottom .3s cubic-bezier(.25, .8, .5, 1)}.q-btn-group--push>.q-btn--push.q-btn--actionable.q-btn--active .q-btn__content,.q-btn-group--push>.q-btn--push.q-btn--actionable:active .q-btn__content{margin-top:2px;margin-bottom:-2px}.q-btn-group--rounded{border-radius:28px}.q-btn-group--square{border-radius:0}.q-btn-group--flat,.q-btn-group--outline,.q-btn-group--unelevated{box-shadow:none}.q-btn-group--outline>.q-separator{display:none}.q-btn-group--outline>.q-btn-item+.q-btn-item:before{border-left:0}.q-btn-group--outline>.q-btn-item:not(:last-child):before{border-right:0}.q-btn-group--stretch{align-self:stretch;border-radius:0}.q-btn-group--glossy>.q-btn-item{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-btn-group--spread>.q-btn-group{display:flex!important}.q-btn-group--spread>.q-btn-group>.q-btn-item:not(.q-btn-dropdown__arrow-container),.q-btn-group--spread>.q-btn-item{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-btn-toggle{position:relative}.q-card{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative}.q-card>div:not(.q--avoid-card-border),.q-card>img:not(.q--avoid-card-border){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.q-card>div:nth-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-child(1of:not(.q--avoid-card-border)){border-top:0;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-card>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card>img:nth-last-child(1of:not(.q--avoid-card-border)){border-bottom:0;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-card>div:not(.q--avoid-card-border){border-left:0;border-right:0;box-shadow:none}.q-card--bordered{border:1px solid rgba(0,0,0,.12)}.q-card--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-card__section{position:relative}.q-card__section--vert{padding:16px}.q-card__section--horiz>div:not(.q--avoid-card-border),.q-card__section--horiz>img:not(.q--avoid-card-border){border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0}.q-card__section--horiz>div:nth-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-child(1of:not(.q--avoid-card-border)){border-top-left-radius:inherit;border-bottom-left-radius:inherit}.q-card__section--horiz>div:nth-last-child(1of:not(.q--avoid-card-border)),.q-card__section--horiz>img:nth-last-child(1of:not(.q--avoid-card-border)){border-top-right-radius:inherit;border-bottom-right-radius:inherit}.q-card__section--horiz>div:not(.q--avoid-card-border){border-top:0;border-bottom:0;box-shadow:none}.q-card__actions{padding:8px;align-items:center}.q-card__actions .q-btn--rectangle{padding:0 8px}.q-card__actions--horiz>.q-btn-group+.q-btn-item,.q-card__actions--horiz>.q-btn-item+.q-btn-group,.q-card__actions--horiz>.q-btn-item+.q-btn-item{margin-left:8px}.q-card__actions--vert>.q-btn-item.q-btn--round{align-self:center}.q-card__actions--vert>.q-btn-group+.q-btn-item,.q-card__actions--vert>.q-btn-item+.q-btn-group,.q-card__actions--vert>.q-btn-item+.q-btn-item{margin-top:4px}.q-card__actions--vert>.q-btn-group>.q-btn-item{flex-grow:1}.q-card>img{display:block;width:100%;max-width:100%;border:0}.q-carousel{background-color:#fff;height:400px}.q-carousel__slide{min-height:100%;background-size:cover;background-position:50%}.q-carousel .q-carousel--padding,.q-carousel__slide{padding:16px}.q-carousel__slides-container{height:100%}.q-carousel__control{color:#fff}.q-carousel__arrow{pointer-events:none}.q-carousel__arrow .q-icon{font-size:28px}.q-carousel__arrow .q-btn{pointer-events:all}.q-carousel__next-arrow--horizontal,.q-carousel__prev-arrow--horizontal{top:16px;bottom:16px}.q-carousel__prev-arrow--horizontal{left:16px}.q-carousel__next-arrow--horizontal{right:16px}.q-carousel__next-arrow--vertical,.q-carousel__prev-arrow--vertical{left:16px;right:16px}.q-carousel__prev-arrow--vertical{top:16px}.q-carousel__next-arrow--vertical{bottom:16px}.q-carousel__navigation--bottom,.q-carousel__navigation--top{left:16px;right:16px;overflow-x:auto;overflow-y:hidden}.q-carousel__navigation--top{top:16px}.q-carousel__navigation--bottom{bottom:16px}.q-carousel__navigation--left,.q-carousel__navigation--right{top:16px;bottom:16px;overflow-x:hidden;overflow-y:auto}.q-carousel__navigation--left>.q-carousel__navigation-inner,.q-carousel__navigation--right>.q-carousel__navigation-inner{flex-direction:column}.q-carousel__navigation--left{left:16px}.q-carousel__navigation--right{right:16px}.q-carousel__navigation-inner{flex:1 1 auto}.q-carousel__navigation .q-btn{margin:6px 4px;padding:5px}.q-carousel__navigation-icon--inactive{opacity:.7}.q-carousel .q-carousel__thumbnail{margin:2px;height:50px;width:auto;display:inline-block;cursor:pointer;border:1px solid transparent;border-radius:4px;vertical-align:middle;opacity:.7;transition:opacity .3s}.q-carousel .q-carousel__thumbnail--active,.q-carousel .q-carousel__thumbnail:hover{opacity:1}.q-carousel .q-carousel__thumbnail--active{border-color:currentColor;cursor:default}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-top .q-carousel--padding,.q-carousel--navigation-top.q-carousel--with-padding .q-carousel__slide{padding-top:60px}.q-carousel--arrows-vertical .q-carousel--padding,.q-carousel--arrows-vertical.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-bottom .q-carousel--padding,.q-carousel--navigation-bottom.q-carousel--with-padding .q-carousel__slide{padding-bottom:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-left .q-carousel--padding,.q-carousel--navigation-left.q-carousel--with-padding .q-carousel__slide{padding-left:60px}.q-carousel--arrows-horizontal .q-carousel--padding,.q-carousel--arrows-horizontal.q-carousel--with-padding .q-carousel__slide,.q-carousel--navigation-right .q-carousel--padding,.q-carousel--navigation-right.q-carousel--with-padding .q-carousel__slide{padding-right:60px}.q-carousel.fullscreen{height:100%}.q-message-name{font-size:small}.q-message-label{margin:24px 0;text-align:center;font-size:small}.q-message-stamp{color:inherit;margin-top:4px;opacity:.6;display:none;font-size:small}.q-message-avatar{border-radius:50%;width:48px;height:48px;min-width:48px}.q-message{margin-bottom:8px}.q-message:first-child .q-message-label{margin-top:0}.q-message-avatar--received{margin-right:8px}.q-message-text--received{color:#81c784;border-radius:4px 4px 4px 0}.q-message-text--received:last-child:before{right:100%;border-right:0 solid transparent;border-left:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--received{color:#000}.q-message-name--sent{text-align:right}.q-message-avatar--sent{margin-left:8px}.q-message-container--sent{flex-direction:row-reverse}.q-message-text--sent{color:#e0e0e0;border-radius:4px 4px 0 4px}.q-message-text--sent:last-child:before{left:100%;border-left:0 solid transparent;border-right:8px solid transparent;border-bottom:8px solid currentColor}.q-message-text-content--sent{color:#000}.q-message-text{background:currentColor;padding:8px;line-height:1.2;word-break:break-word;position:relative}.q-message-text+.q-message-text{margin-top:3px}.q-message-text:last-child{min-height:48px}.q-message-text:last-child .q-message-stamp{display:block}.q-message-text:last-child:before{content:"";position:absolute;bottom:0;width:0;height:0}.q-checkbox{vertical-align:middle}.q-checkbox__native{width:1px;height:1px}.q-checkbox__bg,.q-checkbox__icon-container{-webkit-user-select:none;user-select:none}.q-checkbox__bg{top:25%;left:25%;width:50%;height:50%;border:2px solid currentColor;border-radius:2px;transition:background .22s cubic-bezier(0, 0, .2, 1) 0s;-webkit-print-color-adjust:exact}.q-checkbox__icon{color:currentColor;font-size:.5em}.q-checkbox__svg{color:#fff}.q-checkbox__truthy{stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.78334;stroke-dasharray:29.78334}.q-checkbox__indet{fill:currentColor;transform-origin:50% 50%;transform:rotate(-280deg) scale(0)}.q-checkbox__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-checkbox__inner--indet,.q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox__inner--indet .q-checkbox__bg,.q-checkbox__inner--truthy .q-checkbox__bg{background:currentColor}.q-checkbox__inner--truthy path{stroke-dashoffset:0;transition:stroke-dashoffset .18s cubic-bezier(.4, 0, .6, 1) 0s}.q-checkbox__inner--indet .q-checkbox__indet{transform:rotate(0) scale(1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-checkbox.disabled{opacity:.75!important}.q-checkbox--dark .q-checkbox__inner{color:rgba(255,255,255,.7)}.q-checkbox--dark .q-checkbox__inner:before{opacity:.32!important}.q-checkbox--dark .q-checkbox__inner--indet,.q-checkbox--dark .q-checkbox__inner--truthy{color:var(--q-primary)}.q-checkbox--dense .q-checkbox__inner{width:.5em;min-width:.5em;height:.5em}.q-checkbox--dense .q-checkbox__bg{left:5%;top:5%;width:90%;height:90%}.q-checkbox--dense .q-checkbox__label{padding-left:.5em}.q-checkbox--dense.reverse .q-checkbox__label{padding-left:0;padding-right:.5em}body.desktop .q-checkbox:not(.disabled) .q-checkbox__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-checkbox:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1,1,1)}body.desktop .q-checkbox--dense:not(.disabled):focus .q-checkbox__inner:before,body.desktop .q-checkbox--dense:not(.disabled):hover .q-checkbox__inner:before{transform:scale3d(1.4,1.4,1)}.q-chip{vertical-align:middle;border-radius:16px;outline:0;position:relative;height:2em;max-width:100%;margin:4px;background:#e0e0e0;color:rgba(0,0,0,.87);font-size:14px;padding:.5em .9em}.q-chip--colored .q-chip__icon,.q-chip--dark .q-chip__icon{color:inherit}.q-chip--outline{background:0 0!important;border:1px solid currentColor}.q-chip .q-avatar{font-size:2em;margin-left:-.45em;margin-right:.2em;border-radius:16px}.q-chip--selected .q-avatar{display:none}.q-chip__icon{color:rgba(0,0,0,.54);font-size:1.5em;margin:-.2em}.q-chip__icon--left{margin-right:.2em}.q-chip__icon--right{margin-left:.2em}.q-chip__icon--remove{margin-left:.1em;margin-right:-.5em;opacity:.6;outline:0}.q-chip__icon--remove:focus,.q-chip__icon--remove:hover{opacity:1}.q-chip__content{white-space:nowrap}.q-chip--dense{border-radius:12px;padding:0 .4em;height:1.5em}.q-chip--dense .q-avatar{font-size:1.5em;margin-left:-.27em;margin-right:.1em;border-radius:12px}.q-chip--dense .q-chip__icon{font-size:1.25em}.q-chip--dense .q-chip__icon--left{margin-right:.195em}.q-chip--dense .q-chip__icon--remove{margin-right:-.25em}.q-chip--square{border-radius:4px}.q-chip--square .q-avatar{border-radius:3px 0 0 3px}body.desktop .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}body.desktop.body--dark .q-chip--clickable:focus{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}.q-circular-progress{display:inline-block;position:relative;vertical-align:middle;width:1em;height:1em;line-height:1}.q-circular-progress.q-focusable{border-radius:50%}.q-circular-progress__svg{width:100%;height:100%}.q-circular-progress__text{font-size:.25em}.q-circular-progress--indeterminate .q-circular-progress__svg{transform-origin:50% 50%;animation:q-spin 2s linear infinite}.q-circular-progress--indeterminate .q-circular-progress__circle{stroke-dasharray:1 400;stroke-dashoffset:0;animation:q-circular-progress-circle 1.5s ease-in-out infinite}@keyframes q-circular-progress-circle{0%{stroke-dasharray:1,400;stroke-dashoffset:0}50%{stroke-dasharray:400,400;stroke-dashoffset:-100}100%{stroke-dasharray:400,400;stroke-dashoffset:-300}}.q-color-picker{overflow:hidden;background:#fff;max-width:350px;vertical-align:top;min-width:180px;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-color-picker .q-tab{padding:0!important}.q-color-picker--bordered{border:1px solid rgba(0,0,0,.12)}.q-color-picker__header-tabs{height:32px}.q-color-picker__header-banner{height:36px}.q-color-picker__header input{line-height:24px;border:0}.q-color-picker__header .q-tab{min-height:32px!important;height:32px!important}.q-color-picker__header .q-tab--inactive{background:linear-gradient(to top,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__error-icon{bottom:2px;right:2px;font-size:24px;opacity:0;transition:opacity .3s ease-in}.q-color-picker__header-content{position:relative;background:#fff}.q-color-picker__header-content--light{color:#000}.q-color-picker__header-content--dark{color:#fff}.q-color-picker__header-content--dark .q-tab--inactive:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:rgba(255,255,255,.2)}.q-color-picker__header-banner{height:36px}.q-color-picker__header-bg{background:#fff;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAH0lEQVQoU2NkYGAwZkAFZ5G5jPRRgOYEVDeB3EBjBQBOZwTVugIGyAAAAABJRU5ErkJggg==")!important}.q-color-picker__footer{height:36px}.q-color-picker__footer .q-tab{min-height:36px!important;height:36px!important}.q-color-picker__footer .q-tab--inactive{background:linear-gradient(to bottom,rgba(0,0,0,.3) 0,rgba(0,0,0,.15) 25%,rgba(0,0,0,.1))}.q-color-picker__spectrum{width:100%;height:100%}.q-color-picker__spectrum-tab{padding:0!important}.q-color-picker__spectrum-white{background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.q-color-picker__spectrum-black{background:linear-gradient(to top,#000,rgba(0,0,0,0))}.q-color-picker__spectrum-circle{width:10px;height:10px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px rgba(0,0,0,.3),0 0 1px 2px rgba(0,0,0,.4);border-radius:50%;transform:translate(-5px,-5px)}.q-color-picker__hue .q-slider__track{background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)!important;opacity:1}.q-color-picker__alpha .q-slider__track-container{padding-top:0}.q-color-picker__alpha .q-slider__track:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;background:linear-gradient(90deg,rgba(255,255,255,0),#757575)}.q-color-picker__sliders{padding:0 16px}.q-color-picker__sliders .q-slider__thumb{color:#424242}.q-color-picker__sliders .q-slider__thumb path{stroke-width:2px;fill:transparent}.q-color-picker__sliders .q-slider--active path{stroke-width:3px}.q-color-picker__tune-tab .q-slider{margin-left:18px;margin-right:18px}.q-color-picker__tune-tab input{font-size:11px;border:1px solid #e0e0e0;border-radius:4px;width:3.5em}.q-color-picker__palette-tab{padding:0!important}.q-color-picker__palette-rows--editable .q-color-picker__cube{cursor:pointer}.q-color-picker__cube{padding-bottom:10%;width:10%!important}.q-color-picker input{color:inherit;background:0 0;outline:0;text-align:center}.q-color-picker .q-tabs{overflow:hidden}.q-color-picker .q-tab--active{box-shadow:0 0 14px 3px rgba(0,0,0,.2)}.q-color-picker .q-tab--active .q-focus-helper{display:none}.q-color-picker .q-tab__indicator{display:none}.q-color-picker .q-tab-panels{background:inherit}.q-color-picker--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-color-picker--dark .q-color-picker__tune-tab input{border:1px solid rgba(255,255,255,.3)}.q-color-picker--dark .q-slider__thumb{color:#fafafa}.q-date{display:inline-flex;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;width:290px;min-width:290px;max-width:100%}.q-date--bordered{border:1px solid rgba(0,0,0,.12)}.q-date__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px}.q-date__actions{padding:0 16px 16px}.q-date__content,.q-date__main{outline:0}.q-date__content .q-btn{font-weight:400}.q-date__header-link{opacity:.64;outline:0;transition:opacity .3s ease-out}.q-date__header-link--active,.q-date__header-link:focus,.q-date__header-link:hover{opacity:1}.q-date__header-subtitle{font-size:14px;line-height:1.75;letter-spacing:.00938em}.q-date__header-title-label{font-size:24px;line-height:1.2;letter-spacing:.00735em}.q-date__view{height:100%;width:100%;min-height:290px;padding:16px}.q-date__navigation{height:12.5%}.q-date__navigation>div:first-child{width:8%;min-width:24px;justify-content:flex-end}.q-date__navigation>div:last-child{width:8%;min-width:24px;justify-content:flex-start}.q-date__calendar-weekdays{height:12.5%}.q-date__calendar-weekdays>div{opacity:.38;font-size:12px}.q-date__calendar-item{display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;width:14.285%!important;height:12.5%!important;position:relative;padding:1px}.q-date__calendar-item:after{content:"";position:absolute;pointer-events:none;top:1px;right:0;bottom:1px;left:0;border-style:dashed;border-color:transparent;border-width:1px}.q-date__calendar-item button,.q-date__calendar-item>div{width:30px;height:30px;border-radius:50%}.q-date__calendar-item>div{line-height:30px;text-align:center}.q-date__calendar-item>button{line-height:22px}.q-date__calendar-item--out{opacity:.18}.q-date__calendar-item--fill{visibility:hidden}.q-date__range-from:before,.q-date__range-to:before,.q-date__range:before{content:"";background-color:currentColor;position:absolute;top:1px;bottom:1px;left:0;right:0;opacity:.3}.q-date__range-from:nth-child(7n-6):before,.q-date__range-to:nth-child(7n-6):before,.q-date__range:nth-child(7n-6):before{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__range-from:nth-child(7n):before,.q-date__range-to:nth-child(7n):before,.q-date__range:nth-child(7n):before{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__range-from:before{left:50%}.q-date__range-to:before{right:50%}.q-date__edit-range:after{border-color:currentColor transparent}.q-date__edit-range:nth-child(7n-6):after{border-top-left-radius:0;border-bottom-left-radius:0}.q-date__edit-range:nth-child(7n):after{border-top-right-radius:0;border-bottom-right-radius:0}.q-date__edit-range-from-to:after,.q-date__edit-range-from:after{left:4px;border-left-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-left-radius:28px;border-bottom-left-radius:28px}.q-date__edit-range-from-to:after,.q-date__edit-range-to:after{right:4px;border-right-color:currentColor;border-top-color:currentColor;border-bottom-color:currentColor;border-top-right-radius:28px;border-bottom-right-radius:28px}.q-date__calendar-days-container{height:75%;min-height:192px}.q-date__calendar-days>div{height:16.66%!important}.q-date__event{position:absolute;bottom:2px;left:50%;height:5px;width:8px;border-radius:5px;background-color:var(--q-secondary);transform:translate3d(-50%,0,0)}.q-date__today{box-shadow:0 0 1px 0 currentColor}.q-date__years-content{padding:0 8px}.q-date__months-item,.q-date__years-item{flex:0 0 33.3333%}.q-date--readonly .q-date__content,.q-date--readonly .q-date__header,.q-date.disabled .q-date__content,.q-date.disabled .q-date__header{pointer-events:none}.q-date--readonly .q-date__navigation{display:none}.q-date--portrait{flex-direction:column}.q-date--portrait-standard .q-date__content{height:calc(100% - 86px)}.q-date--portrait-standard .q-date__header{border-top-right-radius:inherit;height:86px}.q-date--portrait-standard .q-date__header-title{align-items:center;height:30px}.q-date--portrait-minimal .q-date__content{height:100%}.q-date--landscape{flex-direction:row;align-items:stretch;min-width:420px}.q-date--landscape>div{display:flex;flex-direction:column}.q-date--landscape .q-date__content{height:100%}.q-date--landscape-standard{min-width:420px}.q-date--landscape-standard .q-date__header{border-bottom-left-radius:inherit;min-width:110px;width:110px}.q-date--landscape-standard .q-date__header-title{flex-direction:column}.q-date--landscape-standard .q-date__header-today{margin-top:12px;margin-left:-8px}.q-date--landscape-minimal{width:310px}.q-date--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12);border-color:rgba(255,255,255,.28)}.q-dialog__title{font-size:1.25rem;font-weight:500;line-height:1.6;letter-spacing:.0125em}.q-dialog__progress{font-size:4rem}.q-dialog__inner{outline:0}.q-dialog__inner>div{pointer-events:all;overflow:auto;-webkit-overflow-scrolling:touch;will-change:scroll-position;border-radius:4px}.q-dialog__inner--square>div{border-radius:0!important}.q-dialog__inner>.q-card>.q-card__actions .q-btn--rectangle{min-width:64px}.q-dialog__inner--minimized{padding:24px}.q-dialog__inner--minimized>div{max-height:calc(100vh - 48px)}.q-dialog__inner--maximized>div{height:100%;width:100%;max-height:100vh;max-width:100vw;border-radius:0!important;top:0!important;left:0!important}.q-dialog__inner--bottom,.q-dialog__inner--top{padding-top:0!important;padding-bottom:0!important}.q-dialog__inner--left,.q-dialog__inner--right{padding-right:0!important;padding-left:0!important}.q-dialog__inner--left:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-left-radius:0}.q-dialog__inner--right:not(.q-dialog__inner--animating)>div,.q-dialog__inner--top:not(.q-dialog__inner--animating)>div{border-top-right-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--left:not(.q-dialog__inner--animating)>div{border-bottom-left-radius:0}.q-dialog__inner--bottom:not(.q-dialog__inner--animating)>div,.q-dialog__inner--right:not(.q-dialog__inner--animating)>div{border-bottom-right-radius:0}.q-dialog__inner--fullwidth>div{width:100%!important;max-width:100%!important}.q-dialog__inner--fullheight>div{height:100%!important;max-height:100%!important}.q-dialog__backdrop{z-index:-1;pointer-events:all;outline:0;background:rgba(0,0,0,.4)}body.platform-android:not(.native-mobile) .q-dialog__inner--minimized>div,body.platform-ios .q-dialog__inner--minimized>div{max-height:calc(100vh - 108px)}body.q-ios-padding .q-dialog__inner{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}body.q-ios-padding .q-dialog__inner>div{max-height:calc(100vh - env(safe-area-inset-top) - env(safe-area-inset-bottom))!important}@media (max-width:599.98px){.q-dialog__inner--bottom,.q-dialog__inner--top{padding-left:0;padding-right:0}.q-dialog__inner--bottom>div,.q-dialog__inner--top>div{width:100%!important}}@media (min-width:600px){.q-dialog__inner--minimized>div{max-width:560px}}.q-body--dialog{overflow:hidden}.q-editor{border:1px solid rgba(0,0,0,.12);border-radius:4px;background-color:#fff}.q-editor.disabled{border-style:dashed}.q-editor>div:first-child,.q-editor__toolbars-container,.q-editor__toolbars-container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-editor__content{outline:0;padding:10px;min-height:10em;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;overflow:auto;max-width:100%}.q-editor__content pre{white-space:pre-wrap}.q-editor__content hr{border:0;outline:0;margin:1px;height:1px;background:rgba(0,0,0,.12)}.q-editor__content:empty:not(:focus):before{content:attr(placeholder);opacity:.7}.q-editor__toolbar{border-bottom:1px solid rgba(0,0,0,.12);min-height:32px}.q-editor__toolbars-container{max-width:100%}.q-editor .q-btn{margin:4px}.q-editor__toolbar-group{position:relative;margin:0 4px}.q-editor__toolbar-group+.q-editor__toolbar-group:before{content:"";position:absolute;left:-4px;top:4px;bottom:4px;width:1px;background:rgba(0,0,0,.12)}.q-editor__link-input{color:inherit;text-decoration:none;text-transform:none;border:none;border-radius:0;background:0 0;outline:0}.q-editor--flat,.q-editor--flat .q-editor__toolbar{border:0}.q-editor--dense .q-editor__toolbar-group{display:flex;align-items:center;flex-wrap:nowrap}.q-editor--dark{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__content hr{background:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar{border-color:rgba(255,255,255,.28)}.q-editor--dark .q-editor__toolbar-group+.q-editor__toolbar-group:before{background:rgba(255,255,255,.28)}.q-expansion-item__border{opacity:0}.q-expansion-item__toggle-icon{position:relative;transition:transform .3s}.q-expansion-item__toggle-icon--rotated{transform:rotate(180deg)}.q-expansion-item__toggle-focus{width:1em!important;height:1em!important;position:relative!important}.q-expansion-item__toggle-focus+.q-expansion-item__toggle-icon{margin-top:-1em}.q-expansion-item--standard.q-expansion-item--expanded>div>.q-expansion-item__border{opacity:1}.q-expansion-item--popup{transition:padding .5s}.q-expansion-item--popup>.q-expansion-item__container{border:1px solid rgba(0,0,0,.12)}.q-expansion-item--popup>.q-expansion-item__container>.q-separator{display:none}.q-expansion-item--popup.q-expansion-item--collapsed{padding:0 15px}.q-expansion-item--popup.q-expansion-item--expanded{padding:15px 0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--expanded{padding-top:0}.q-expansion-item--popup.q-expansion-item--collapsed:not(:first-child)>.q-expansion-item__container{border-top-width:0}.q-expansion-item--popup.q-expansion-item--expanded+.q-expansion-item--popup.q-expansion-item--collapsed>.q-expansion-item__container{border-top-width:1px}.q-expansion-item__content>.q-card{box-shadow:none;border-radius:0}.q-expansion-item:first-child>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item:last-child>div>.q-expansion-item__border--bottom{opacity:0}.q-expansion-item--expanded+.q-expansion-item--expanded>div>.q-expansion-item__border--top{opacity:0}.q-expansion-item--expanded .q-textarea--autogrow textarea{animation:q-expansion-done 0s}@keyframes q-expansion-done{0%{--q-exp-done:1}}.z-fab{z-index:990}.q-fab{position:relative;vertical-align:middle}.q-fab>.q-btn{width:100%}.q-fab--form-rounded{border-radius:28px}.q-fab--form-square{border-radius:4px}.q-fab__active-icon,.q-fab__icon{transition:opacity .4s,transform .4s}.q-fab__icon{opacity:1;transform:rotate(0)}.q-fab__active-icon{opacity:0;transform:rotate(-180deg)}.q-fab__label--external{position:absolute;padding:0 8px;transition:opacity .18s cubic-bezier(.65, .815, .735, .395)}.q-fab__label--external-hidden{opacity:0;pointer-events:none}.q-fab__label--external-left{top:50%;left:-12px;transform:translate(-100%,-50%)}.q-fab__label--external-right{top:50%;right:-12px;transform:translate(100%,-50%)}.q-fab__label--external-bottom{bottom:-12px;left:50%;transform:translate(-50%,100%)}.q-fab__label--external-top{top:-12px;left:50%;transform:translate(-50%,-100%)}.q-fab__label--internal{padding:0;transition:font-size .12s cubic-bezier(.65, .815, .735, .395),max-height .12s cubic-bezier(.65, .815, .735, .395),opacity 70ms cubic-bezier(.65, .815, .735, .395);max-height:30px}.q-fab__label--internal-hidden{font-size:0;opacity:0}.q-fab__label--internal-top{padding-bottom:.12em}.q-fab__label--internal-bottom{padding-top:.12em}.q-fab__label--internal-bottom.q-fab__label--internal-hidden,.q-fab__label--internal-top.q-fab__label--internal-hidden{max-height:0}.q-fab__label--internal-left{padding-left:.285em;padding-right:.571em}.q-fab__label--internal-right{padding-right:.285em;padding-left:.571em}.q-fab__icon-holder{min-width:24px;min-height:24px;position:relative}.q-fab__icon-holder--opened .q-fab__icon{transform:rotate(180deg);opacity:0}.q-fab__icon-holder--opened .q-fab__active-icon{transform:rotate(0);opacity:1}.q-fab__actions{position:absolute;opacity:0;transition:transform .18s ease-in,opacity .18s ease-in;pointer-events:none;align-items:center;justify-content:center;align-self:center;padding:3px}.q-fab__actions .q-btn{margin:5px}.q-fab__actions--right{transform-origin:0 50%;transform:scale(.4) translateX(-62px);height:56px;left:100%;margin-left:9px}.q-fab__actions--left{transform-origin:100% 50%;transform:scale(.4) translateX(62px);height:56px;right:100%;margin-right:9px;flex-direction:row-reverse}.q-fab__actions--up{transform-origin:50% 100%;transform:scale(.4) translateY(62px);width:56px;bottom:100%;margin-bottom:9px;flex-direction:column-reverse}.q-fab__actions--down{transform-origin:50% 0;transform:scale(.4) translateY(-62px);width:56px;top:100%;margin-top:9px;flex-direction:column}.q-fab__actions--down,.q-fab__actions--up{left:50%;margin-left:-28px}.q-fab__actions--opened{opacity:1;transform:scale(1) translate(.1px,0);pointer-events:all}.q-fab--align-left>.q-fab__actions--down,.q-fab--align-left>.q-fab__actions--up{align-items:flex-start;left:28px}.q-fab--align-right>.q-fab__actions--down,.q-fab--align-right>.q-fab__actions--up{align-items:flex-end;left:auto;right:0}.q-field{font-size:14px}.q-field ::-ms-clear,.q-field ::-ms-reveal{display:none}.q-field--with-bottom{padding-bottom:20px}.q-field__marginal{height:56px;color:rgba(0,0,0,.54);font-size:24px}.q-field__marginal>*+*{margin-left:2px}.q-field__marginal .q-avatar{font-size:32px}.q-field__before,.q-field__prepend{padding-right:12px}.q-field__after,.q-field__append{padding-left:12px}.q-field__after:empty,.q-field__append:empty{display:none}.q-field__append+.q-field__append{padding-left:2px}.q-field__inner{text-align:left}.q-field__bottom{font-size:12px;min-height:20px;line-height:1;color:rgba(0,0,0,.54);padding:8px 12px 0;backface-visibility:hidden}.q-field__bottom--animated{transform:translateY(100%);position:absolute;left:0;right:0;bottom:0}.q-field__messages{line-height:1}.q-field__messages>div{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.q-field__messages>div+div{margin-top:4px}.q-field__counter{padding-left:8px;line-height:1}.q-field--item-aligned{padding:8px 16px}.q-field--item-aligned .q-field__before{min-width:56px}.q-field__control-container{height:inherit}.q-field__control{color:var(--q-primary);height:56px;max-width:100%;outline:0}.q-field__control:after,.q-field__control:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.q-field__control:before{border-radius:inherit}.q-field__shadow{top:8px;opacity:0;overflow:hidden;white-space:pre-wrap;transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native::placeholder{transition:opacity .36s cubic-bezier(.4, 0, .2, 1)}.q-field__shadow+.q-field__native:focus::placeholder{opacity:0}.q-field__input,.q-field__native,.q-field__prefix,.q-field__suffix{font-weight:400;line-height:28px;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;border:none;border-radius:0;background:0 0;color:rgba(0,0,0,.87);outline:0;padding:6px 0}.q-field__input,.q-field__native{width:100%;min-width:0;outline:0!important;-webkit-user-select:auto;user-select:auto}.q-field__input:-webkit-autofill,.q-field__native:-webkit-autofill{-webkit-animation-name:q-autofill;-webkit-animation-fill-mode:both}.q-field__input:-webkit-autofill+.q-field__label,.q-field__native:-webkit-autofill+.q-field__label{transform:translateY(-40%) scale(.75)}.q-field__input[type=color]+.q-field__label,.q-field__input[type=date]+.q-field__label,.q-field__input[type=datetime-local]+.q-field__label,.q-field__input[type=month]+.q-field__label,.q-field__input[type=time]+.q-field__label,.q-field__input[type=week]+.q-field__label,.q-field__native[type=color]+.q-field__label,.q-field__native[type=date]+.q-field__label,.q-field__native[type=datetime-local]+.q-field__label,.q-field__native[type=month]+.q-field__label,.q-field__native[type=time]+.q-field__label,.q-field__native[type=week]+.q-field__label{transform:translateY(-40%) scale(.75)}.q-field__input:invalid,.q-field__native:invalid{box-shadow:none}.q-field__native[type=file]{line-height:1em}.q-field__input{padding:0;height:0;min-height:24px;line-height:24px}.q-field__prefix,.q-field__suffix{transition:opacity .36s cubic-bezier(.4, 0, .2, 1);white-space:nowrap}.q-field__prefix{padding-right:4px}.q-field__suffix{padding-left:4px}.q-field--disabled .q-placeholder,.q-field--readonly .q-placeholder{opacity:1!important}.q-field--readonly.q-field--labeled .q-field__input,.q-field--readonly.q-field--labeled .q-field__native{cursor:default}.q-field--readonly.q-field--float .q-field__input,.q-field--readonly.q-field--float .q-field__native{cursor:text}.q-field--disabled .q-field__inner{cursor:not-allowed}.q-field--disabled .q-field__control{pointer-events:none}.q-field--disabled .q-field__control>div{opacity:.6!important}.q-field--disabled .q-field__control>div,.q-field--disabled .q-field__control>div *{outline:0!important}.q-field__label{left:0;top:18px;max-width:100%;color:rgba(0,0,0,.6);font-size:16px;line-height:1.25;font-weight:400;letter-spacing:.00937em;text-decoration:inherit;text-transform:inherit;transform-origin:left top;transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 324ms cubic-bezier(.4, 0, .2, 1);backface-visibility:hidden}.q-field--float .q-field__label{max-width:133%;transform:translateY(-40%) scale(.75);transition:transform .36s cubic-bezier(.4, 0, .2, 1),max-width 396ms cubic-bezier(.4, 0, .2, 1)}.q-field--highlighted .q-field__label{color:currentColor}.q-field--highlighted .q-field__shadow{opacity:.5}.q-field--filled .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px 4px 0 0}.q-field--filled .q-field__control:before{background:rgba(0,0,0,.05);border-bottom:1px solid rgba(0,0,0,.42);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled .q-field__control:hover:before{opacity:1}.q-field--filled .q-field__control:after{height:2px;top:auto;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--filled.q-field--rounded .q-field__control{border-radius:28px 28px 0 0}.q-field--filled.q-field--highlighted .q-field__control:before{opacity:1;background:rgba(0,0,0,.12)}.q-field--filled.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--filled.q-field--dark .q-field__control,.q-field--filled.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--filled.q-field--dark.q-field--highlighted .q-field__control:before{background:rgba(255,255,255,.1)}.q-field--filled.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border-bottom-style:dashed}.q-field--outlined .q-field__control{border-radius:4px;padding:0 12px}.q-field--outlined .q-field__control:before{border:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__control:hover:before{border-color:#000}.q-field--outlined .q-field__control:after{height:inherit;border-radius:inherit;border:2px solid transparent;transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--outlined .q-field__input:-webkit-autofill,.q-field--outlined .q-field__native:-webkit-autofill{margin-top:1px;margin-bottom:1px}.q-field--outlined.q-field--rounded .q-field__control{border-radius:28px}.q-field--outlined.q-field--highlighted .q-field__control:hover:before{border-color:transparent}.q-field--outlined.q-field--highlighted .q-field__control:after{border-color:currentColor;border-width:2px;transform:scale3d(1,1,1)}.q-field--outlined.q-field--readonly .q-field__control:before{border-style:dashed}.q-field--standard .q-field__control:before{border-bottom:1px solid rgba(0,0,0,.24);transition:border-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard .q-field__control:hover:before{border-color:#000}.q-field--standard .q-field__control:after{height:2px;top:auto;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;transform-origin:center bottom;transform:scale3d(0,1,1);background:currentColor;transition:transform .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standard.q-field--highlighted .q-field__control:after{transform:scale3d(1,1,1)}.q-field--standard.q-field--readonly .q-field__control:before{border-bottom-style:dashed}.q-field--dark .q-field__control:before{border-color:rgba(255,255,255,.6)}.q-field--dark .q-field__control:hover:before{border-color:#fff}.q-field--dark .q-field__input,.q-field--dark .q-field__native,.q-field--dark .q-field__prefix,.q-field--dark .q-field__suffix{color:#fff}.q-field--dark .q-field__bottom,.q-field--dark .q-field__marginal,.q-field--dark:not(.q-field--highlighted) .q-field__label{color:rgba(255,255,255,.7)}.q-field--standout .q-field__control{padding:0 12px;background:rgba(0,0,0,.05);border-radius:4px;transition:box-shadow .36s cubic-bezier(.4, 0, .2, 1),background-color .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:before{background:rgba(0,0,0,.07);opacity:0;transition:opacity .36s cubic-bezier(.4, 0, .2, 1),background .36s cubic-bezier(.4, 0, .2, 1)}.q-field--standout .q-field__control:hover:before{opacity:1}.q-field--standout.q-field--rounded .q-field__control{border-radius:28px}.q-field--standout.q-field--highlighted .q-field__control{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#000}.q-field--standout.q-field--highlighted .q-field__append,.q-field--standout.q-field--highlighted .q-field__input,.q-field--standout.q-field--highlighted .q-field__native,.q-field--standout.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--highlighted .q-field__suffix{color:#fff}.q-field--standout.q-field--readonly .q-field__control:before{opacity:1;background:0 0;border:1px dashed rgba(0,0,0,.24)}.q-field--standout.q-field--dark .q-field__control{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark .q-field__control:before{background:rgba(255,255,255,.07)}.q-field--standout.q-field--dark.q-field--highlighted .q-field__control{background:#fff}.q-field--standout.q-field--dark.q-field--highlighted .q-field__append,.q-field--standout.q-field--dark.q-field--highlighted .q-field__input,.q-field--standout.q-field--dark.q-field--highlighted .q-field__native,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prefix,.q-field--standout.q-field--dark.q-field--highlighted .q-field__prepend,.q-field--standout.q-field--dark.q-field--highlighted .q-field__suffix{color:#000}.q-field--standout.q-field--dark.q-field--readonly .q-field__control:before{border-color:rgba(255,255,255,.24)}.q-field--labeled .q-field__native,.q-field--labeled .q-field__prefix,.q-field--labeled .q-field__suffix{line-height:24px;padding-top:24px;padding-bottom:8px}.q-field--labeled .q-field__shadow{top:0}.q-field--labeled:not(.q-field--float) .q-field__prefix,.q-field--labeled:not(.q-field--float) .q-field__suffix{opacity:0}.q-field--labeled:not(.q-field--float) .q-field__input::placeholder,.q-field--labeled:not(.q-field--float) .q-field__native::placeholder{color:transparent}.q-field--labeled.q-field--dense .q-field__native,.q-field--labeled.q-field--dense .q-field__prefix,.q-field--labeled.q-field--dense .q-field__suffix{padding-top:14px;padding-bottom:2px}.q-field--dense .q-field--with-bottom{padding-bottom:19px}.q-field--dense .q-field__shadow{top:0}.q-field--dense .q-field__control,.q-field--dense .q-field__marginal{height:40px}.q-field--dense .q-field__bottom{font-size:11px}.q-field--dense .q-field__label{font-size:14px;top:10px}.q-field--dense .q-field__before,.q-field--dense .q-field__prepend{padding-right:6px}.q-field--dense .q-field__after,.q-field--dense .q-field__append{padding-left:6px}.q-field--dense .q-field__append+.q-field__append{padding-left:2px}.q-field--dense .q-field__marginal .q-avatar{font-size:24px}.q-field--dense.q-field--float .q-field__label{transform:translateY(-30%) scale(.75)}.q-field--dense .q-field__input:-webkit-autofill+.q-field__label,.q-field--dense .q-field__native:-webkit-autofill+.q-field__label{transform:translateY(-30%) scale(.75)}.q-field--dense .q-field__input[type=color]+.q-field__label,.q-field--dense .q-field__input[type=date]+.q-field__label,.q-field--dense .q-field__input[type=datetime-local]+.q-field__label,.q-field--dense .q-field__input[type=month]+.q-field__label,.q-field--dense .q-field__input[type=time]+.q-field__label,.q-field--dense .q-field__input[type=week]+.q-field__label,.q-field--dense .q-field__native[type=color]+.q-field__label,.q-field--dense .q-field__native[type=date]+.q-field__label,.q-field--dense .q-field__native[type=datetime-local]+.q-field__label,.q-field--dense .q-field__native[type=month]+.q-field__label,.q-field--dense .q-field__native[type=time]+.q-field__label,.q-field--dense .q-field__native[type=week]+.q-field__label{transform:translateY(-30%) scale(.75)}.q-field--borderless .q-field__bottom,.q-field--borderless.q-field--dense .q-field__control,.q-field--standard .q-field__bottom,.q-field--standard.q-field--dense .q-field__control{padding-left:0;padding-right:0}.q-field--error .q-field__label{animation:q-field-label .36s}.q-field--error .q-field__bottom{color:var(--q-negative)}.q-field__focusable-action{opacity:.6;cursor:pointer;outline:0!important;border:0;color:inherit;background:0 0;padding:0}.q-field__focusable-action:focus,.q-field__focusable-action:hover{opacity:1}.q-field--auto-height .q-field__control{height:auto}.q-field--auto-height .q-field__control,.q-field--auto-height .q-field__native{min-height:56px}.q-field--auto-height .q-field__native{align-items:center}.q-field--auto-height .q-field__control-container{padding-top:0}.q-field--auto-height .q-field__native,.q-field--auto-height .q-field__prefix,.q-field--auto-height .q-field__suffix{line-height:18px}.q-field--auto-height.q-field--labeled .q-field__control-container{padding-top:24px}.q-field--auto-height.q-field--labeled .q-field__shadow{top:24px}.q-field--auto-height.q-field--labeled .q-field__native,.q-field--auto-height.q-field--labeled .q-field__prefix,.q-field--auto-height.q-field--labeled .q-field__suffix{padding-top:0}.q-field--auto-height.q-field--labeled .q-field__native{min-height:24px}.q-field--auto-height.q-field--dense .q-field__control,.q-field--auto-height.q-field--dense .q-field__native{min-height:40px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-field--auto-height.q-field--dense.q-field--labeled .q-field__native{min-height:24px}.q-field--square .q-field__control{border-radius:0!important}.q-transition--field-message-enter-active,.q-transition--field-message-leave-active{transition:transform .6s cubic-bezier(.86, 0, .07, 1),opacity .6s cubic-bezier(.86, 0, .07, 1)}.q-transition--field-message-enter-from,.q-transition--field-message-leave-to{opacity:0;transform:translateY(-10px)}.q-transition--field-message-leave-active,.q-transition--field-message-leave-from{position:absolute}@keyframes q-field-label{40%{margin-left:2px}60%,80%{margin-left:-2px}70%,90%{margin-left:2px}}@keyframes q-autofill{to{background:0 0;color:inherit}}.q-file .q-field__native{word-break:break-all;overflow:hidden}.q-file .q-field__input{opacity:0!important}.q-file .q-field__input::-webkit-file-upload-button{cursor:pointer}.q-file__filler{visibility:hidden;width:100%;border:none;padding:0}.q-file__dnd{outline:1px dashed currentColor;outline-offset:-4px}.q-form{position:relative}.q-img{position:relative;width:100%;display:inline-block;vertical-align:middle;overflow:hidden}.q-img__loading .q-spinner{font-size:50px}.q-img__container{border-radius:inherit;font-size:0}.q-img__image{border-radius:inherit;width:100%;height:100%;opacity:0}.q-img__image--with-transition{transition:opacity .28s ease-in}.q-img__image--loaded{opacity:1}.q-img__content{border-radius:inherit;pointer-events:none}.q-img__content>div{pointer-events:all;position:absolute;padding:16px;color:#fff;background:rgba(0,0,0,.47)}.q-img--no-menu .q-img__image,.q-img--no-menu .q-img__placeholder{pointer-events:none}.q-inner-loading{background:rgba(255,255,255,.6);border-radius:inherit}.q-inner-loading--dark{background:rgba(0,0,0,.4)}.q-inner-loading__label{margin-top:8px}.q-textarea .q-field__control{min-height:56px;height:auto}.q-textarea .q-field__control-container{padding-top:2px;padding-bottom:2px}.q-textarea .q-field__shadow{top:2px;bottom:2px}.q-textarea .q-field__native,.q-textarea .q-field__prefix,.q-textarea .q-field__suffix{line-height:18px}.q-textarea .q-field__native{resize:vertical;padding-top:17px;min-height:52px}.q-textarea.q-field--labeled .q-field__control-container{padding-top:26px}.q-textarea.q-field--labeled .q-field__shadow{top:26px}.q-textarea.q-field--labeled .q-field__native,.q-textarea.q-field--labeled .q-field__prefix,.q-textarea.q-field--labeled .q-field__suffix{padding-top:0}.q-textarea.q-field--labeled .q-field__native{min-height:26px;padding-top:1px}.q-textarea--autogrow .q-field__native{resize:none}.q-textarea.q-field--dense .q-field__control,.q-textarea.q-field--dense .q-field__native{min-height:36px}.q-textarea.q-field--dense .q-field__native{padding-top:9px}.q-textarea.q-field--dense.q-field--labeled .q-field__control-container{padding-top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__shadow{top:14px}.q-textarea.q-field--dense.q-field--labeled .q-field__native{min-height:24px;padding-top:3px}.q-textarea.q-field--dense.q-field--labeled .q-field__prefix,.q-textarea.q-field--dense.q-field--labeled .q-field__suffix{padding-top:2px}.q-textarea.disabled .q-field__native,body.mobile .q-textarea .q-field__native{resize:none}.q-intersection{position:relative}.q-item{min-height:48px;padding:8px 16px;color:inherit;transition:color .3s,background-color .3s}.q-item__section--side{color:#757575;align-items:flex-start;padding-right:16px;width:auto;min-width:0;max-width:100%}.q-item__section--side>.q-icon{font-size:24px}.q-item__section--side>.q-avatar{font-size:40px}.q-item__section--avatar{color:inherit;min-width:56px}.q-item__section--thumbnail img{width:100px;height:56px}.q-item__section--nowrap{white-space:nowrap}.q-item>.q-focus-helper+.q-item__section--thumbnail,.q-item>.q-item__section--thumbnail:first-child{margin-left:-16px}.q-item>.q-item__section--thumbnail:last-of-type{margin-right:-16px}.q-item__label{line-height:1.2em!important;max-width:100%}.q-item__label--overline{color:rgba(0,0,0,.7)}.q-item__label--caption{color:rgba(0,0,0,.54)}.q-item__label--header{color:#757575;padding:16px;font-size:.875rem;line-height:1.25rem;letter-spacing:.01786em}.q-list--padding .q-item__label--header,.q-separator--spaced+.q-item__label--header{padding-top:8px}.q-item__label+.q-item__label{margin-top:4px}.q-item__section--main{width:auto;min-width:0;max-width:100%;flex:10000 1 0%}.q-item__section--main+.q-item__section--main{margin-left:8px}.q-item__section--main~.q-item__section--side{align-items:flex-end;padding-right:0;padding-left:16px}.q-item__section--main.q-item__section--thumbnail{margin-left:0;margin-right:-16px}.q-list--bordered{border:1px solid rgba(0,0,0,.12)}.q-list--separator>.q-item-type+.q-item-type,.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top:1px solid rgba(0,0,0,.12)}.q-list--padding{padding:8px 0}.q-item--dense,.q-list--dense>.q-item{min-height:32px;padding:2px 16px}.q-list--dark.q-list--separator>.q-item-type+.q-item-type,.q-list--dark.q-list--separator>.q-virtual-scroll__content>.q-item-type+.q-item-type{border-top-color:rgba(255,255,255,.28)}.q-item--dark,.q-list--dark{color:#fff;border-color:rgba(255,255,255,.28)}.q-item--dark .q-item__section--side:not(.q-item__section--avatar),.q-list--dark .q-item__section--side:not(.q-item__section--avatar){color:rgba(255,255,255,.7)}.q-item--dark .q-item__label--header,.q-list--dark .q-item__label--header{color:rgba(255,255,255,.64)}.q-item--dark .q-item__label--caption,.q-item--dark .q-item__label--overline,.q-list--dark .q-item__label--caption,.q-list--dark .q-item__label--overline{color:rgba(255,255,255,.8)}.q-item{position:relative}.q-item--active,.q-item.q-router-link--active{color:var(--q-primary)}.q-knob{font-size:48px}.q-knob--editable{cursor:pointer;outline:0}.q-knob--editable:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;box-shadow:none;transition:box-shadow .24s ease-in-out}.q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}body.body--dark .q-knob--editable:focus:before{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-layout{width:100%;outline:0}.q-layout-container{position:relative;width:100%;height:100%}.q-layout-container .q-layout{min-height:100%}.q-layout-container>div{transform:translate3d(0,0,0)}.q-layout-container>div>div{min-height:0;max-height:100%}.q-layout__shadow{width:100%}.q-layout__shadow:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 0 10px 2px rgba(0,0,0,.2),0 0 10px rgba(0,0,0,.24)}.q-layout__section--marginal{background-color:var(--q-primary);color:#fff}.q-header--hidden{transform:translateY(-110%)}.q-header--bordered{border-bottom:1px solid rgba(0,0,0,.12)}.q-header .q-layout__shadow{bottom:-10px}.q-header .q-layout__shadow:after{bottom:10px}.q-footer--hidden{transform:translateY(110%)}.q-footer--bordered{border-top:1px solid rgba(0,0,0,.12)}.q-footer .q-layout__shadow{top:-10px}.q-footer .q-layout__shadow:after{top:10px}.q-footer,.q-header{z-index:2000}.q-drawer{position:absolute;top:0;bottom:0;background:#fff;z-index:1000}.q-drawer--on-top{z-index:3000}.q-drawer--left{left:0;transform:translateX(-100%)}.q-drawer--left.q-drawer--bordered{border-right:1px solid rgba(0,0,0,.12)}.q-drawer--left .q-layout__shadow{left:10px;right:-10px}.q-drawer--left .q-layout__shadow:after{right:10px}.q-drawer--right{right:0;transform:translateX(100%)}.q-drawer--right.q-drawer--bordered{border-left:1px solid rgba(0,0,0,.12)}.q-drawer--right .q-layout__shadow{left:-10px}.q-drawer--right .q-layout__shadow:after{left:10px}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini{padding:0!important}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section{text-align:center;justify-content:center;padding-left:0;padding-right:0;min-width:0}.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__label,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--main,.q-drawer-container:not(.q-drawer--mini-animate) .q-drawer--mini .q-item__section--side~.q-item__section--side{display:none}.q-drawer--mini .q-expansion-item__content,.q-drawer--mini .q-mini-drawer-hide{display:none}.q-drawer--mini-animate .q-drawer__content{overflow-x:hidden!important;white-space:nowrap}.q-drawer--standard .q-mini-drawer-only{display:none}.q-drawer--mobile .q-mini-drawer-hide,.q-drawer--mobile .q-mini-drawer-only{display:none}.q-drawer__backdrop{z-index:2999!important;will-change:background-color}.q-drawer__opener{z-index:2001;height:100%;width:15px;-webkit-user-select:none;user-select:none}.q-footer,.q-header,.q-layout,.q-page{position:relative}.q-page-sticky--shrink{pointer-events:none}.q-page-sticky--shrink>div{display:inline-block;pointer-events:auto}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-header>.q-tabs:first-child .q-tabs__content,body.q-ios-padding .q-layout--standard .q-header>.q-toolbar:first-child{padding-top:20px;min-height:70px;padding-top:env(safe-area-inset-top);min-height:calc(env(safe-area-inset-top) + 50px)}body.q-ios-padding .q-layout--standard .q-drawer--top-padding .q-drawer__content,body.q-ios-padding .q-layout--standard .q-footer>.q-tabs:nth-last-child(1of:not(.q-layout__shadow)) .q-tabs__content,body.q-ios-padding .q-layout--standard .q-footer>.q-toolbar:last-child{padding-bottom:env(safe-area-inset-bottom);min-height:calc(env(safe-area-inset-bottom) + 50px)}.q-body--layout-animate .q-drawer__backdrop{transition:background-color .12s!important}.q-body--layout-animate .q-drawer{transition:transform .12s,width .12s,top .12s,bottom .12s!important}.q-body--layout-animate .q-layout__section--marginal{transition:transform .12s,left .12s,right .12s!important}.q-body--layout-animate .q-page-container{transition:padding-top .12s,padding-right .12s,padding-bottom .12s,padding-left .12s!important}.q-body--layout-animate .q-page-sticky{transition:transform .12s,left .12s,right .12s,top .12s,bottom .12s!important}body:not(.q-body--layout-animate) .q-layout--prevent-focus{visibility:hidden}.q-body--drawer-toggle{overflow-x:hidden!important}@media (max-width:599.98px){.q-layout-padding{padding:8px}}@media (min-width:600px) and (max-width:1439.98px){.q-layout-padding{padding:16px}}@media (min-width:1440px){.q-layout-padding{padding:24px}}body.body--dark .q-drawer,body.body--dark .q-footer,body.body--dark .q-header{border-color:rgba(255,255,255,.28)}body.body--dark .q-layout__shadow:after{box-shadow:0 0 10px 2px rgba(255,255,255,.2),0 0 10px rgba(255,255,255,.24)}body.platform-ios .q-layout--containerized{position:unset!important}.q-linear-progress{--q-linear-progress-speed:.3s;position:relative;width:100%;overflow:hidden;font-size:4px;height:1em;color:var(--q-primary);transform:scale3d(1,1,1)}.q-linear-progress__model,.q-linear-progress__track{transform-origin:0 0}.q-linear-progress__model--with-transition,.q-linear-progress__track--with-transition{transition:transform var(--q-linear-progress-speed)}.q-linear-progress--reverse .q-linear-progress__model,.q-linear-progress--reverse .q-linear-progress__track{transform-origin:0 100%}.q-linear-progress__model--determinate{background:currentColor}.q-linear-progress__model--indeterminate,.q-linear-progress__model--query{transition:none}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:after,.q-linear-progress__model--query:before{background:currentColor;content:"";position:absolute;top:0;right:0;bottom:0;left:0;transform-origin:0 0}.q-linear-progress__model--indeterminate:before,.q-linear-progress__model--query:before{animation:q-linear-progress--indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.q-linear-progress__model--indeterminate:after,.q-linear-progress__model--query:after{transform:translate3d(-101%,0,0) scale3d(1,1,1);animation:q-linear-progress--indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation-delay:1.15s}.q-linear-progress__track{opacity:.4}.q-linear-progress__track--light{background:rgba(0,0,0,.26)}.q-linear-progress__track--dark{background:rgba(255,255,255,.6)}.q-linear-progress__stripe{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,rgba(255,255,255,0) 25%,rgba(255,255,255,0) 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,rgba(255,255,255,0) 75%,rgba(255,255,255,0))!important;background-size:40px 40px!important}.q-linear-progress__stripe--with-transition{transition:width var(--q-linear-progress-speed)}@keyframes q-linear-progress--indeterminate{0%{transform:translate3d(-35%,0,0) scale3d(.35,1,1)}60%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}100%{transform:translate3d(100%,0,0) scale3d(.9,1,1)}}@keyframes q-linear-progress--indeterminate-short{0%{transform:translate3d(-101%,0,0) scale3d(1,1,1)}60%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}100%{transform:translate3d(107%,0,0) scale3d(.01,1,1)}}.q-menu{position:fixed!important;display:inline-block;max-width:95vw;max-height:65vh;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);background:#fff;border-radius:4px;overflow-y:auto;overflow-x:hidden;outline:0;z-index:6000}.q-menu--square{border-radius:0}.q-menu--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-option-group--inline>div{display:inline-block}.q-pagination input{text-align:center;-moz-appearance:textfield}.q-pagination input::-webkit-inner-spin-button,.q-pagination input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-pagination__content{--q-pagination-gutter-parent:-2px;--q-pagination-gutter-child:2px;margin-top:var(--q-pagination-gutter-parent);margin-left:var(--q-pagination-gutter-parent)}.q-pagination__content>.q-btn,.q-pagination__content>.q-input,.q-pagination__middle>.q-btn{margin-top:var(--q-pagination-gutter-child);margin-left:var(--q-pagination-gutter-child)}.q-parallax{position:relative;width:100%;overflow:hidden;border-radius:inherit}.q-parallax__media>img,.q-parallax__media>video{position:absolute;left:50%;bottom:0;min-width:100%;min-height:100%;will-change:transform;display:none}.q-popup-edit{padding:8px 16px}.q-popup-edit__buttons{margin-top:8px}.q-popup-edit__buttons .q-btn+.q-btn{margin-left:8px}.q-pull-to-refresh{position:relative}.q-pull-to-refresh__puller{border-radius:50%;width:40px;height:40px;color:var(--q-primary);background:#fff;box-shadow:0 0 4px 0 rgba(0,0,0,.3)}.q-pull-to-refresh__puller--animating{transition:transform .3s,opacity .3s}.q-radio{vertical-align:middle}.q-radio__native{width:1px;height:1px}.q-radio__bg,.q-radio__icon-container{-webkit-user-select:none;user-select:none}.q-radio__bg{top:25%;left:25%;width:50%;height:50%;-webkit-print-color-adjust:exact}.q-radio__bg path{fill:currentColor}.q-radio__icon{color:currentColor;font-size:.5em}.q-radio__check{transform-origin:50% 50%;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}.q-radio__inner{font-size:40px;width:1em;min-width:1em;height:1em;outline:0;border-radius:50%;color:rgba(0,0,0,.54)}.q-radio__inner--truthy{color:var(--q-primary)}.q-radio__inner--truthy .q-radio__check{transform:scale3d(1,1,1)}.q-radio.disabled{opacity:.75!important}.q-radio--dark .q-radio__inner{color:rgba(255,255,255,.7)}.q-radio--dark .q-radio__inner:before{opacity:.32!important}.q-radio--dark .q-radio__inner--truthy{color:var(--q-primary)}.q-radio--dense .q-radio__inner{width:.5em;min-width:.5em;height:.5em}.q-radio--dense .q-radio__bg{left:0;top:0;width:100%;height:100%}.q-radio--dense .q-radio__label{padding-left:.5em}.q-radio--dense.reverse .q-radio__label{padding-left:0;padding-right:.5em}body.desktop .q-radio:not(.disabled) .q-radio__inner:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1) 0s}body.desktop .q-radio:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1,1,1)}body.desktop .q-radio--dense:not(.disabled):focus .q-radio__inner:before,body.desktop .q-radio--dense:not(.disabled):hover .q-radio__inner:before{transform:scale3d(1.5,1.5,1)}.q-rating{color:#ffeb3b;vertical-align:middle}.q-rating__icon-container{height:1em;outline:0}.q-rating__icon-container+.q-rating__icon-container{margin-left:2px}.q-rating__icon{color:currentColor;text-shadow:0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24);position:relative;opacity:.4;transition:transform .2s ease-in,opacity .2s ease-in}.q-rating__icon--hovered{transform:scale(1.3)}.q-rating__icon--active{opacity:1}.q-rating__icon--exselected{opacity:.7}.q-rating--no-dimming .q-rating__icon{opacity:1}.q-rating--editable .q-rating__icon-container{cursor:pointer}.q-responsive{position:relative;max-width:100%;max-height:100%}.q-responsive__filler{width:inherit;max-width:inherit;height:inherit;max-height:inherit}.q-responsive__content{border-radius:inherit}.q-responsive__content>*{width:100%!important;height:100%!important;max-height:100%!important;max-width:100%!important}.q-scrollarea{position:relative;contain:strict}.q-scrollarea__bar,.q-scrollarea__thumb{opacity:.2;transition:opacity .3s;will-change:opacity;cursor:grab}.q-scrollarea__bar--v,.q-scrollarea__thumb--v{right:0;width:10px}.q-scrollarea__bar--h,.q-scrollarea__thumb--h{bottom:0;height:10px}.q-scrollarea__bar--invisible,.q-scrollarea__thumb--invisible{opacity:0!important;pointer-events:none}.q-scrollarea__thumb{background:#000;border-radius:3px}.q-scrollarea__thumb:hover{opacity:.3}.q-scrollarea__thumb:active{opacity:.5}.q-scrollarea__content{min-height:100%;min-width:100%}.q-scrollarea--dark .q-scrollarea__thumb{background:#fff}.q-select--without-input .q-field__control{cursor:pointer}.q-select--with-input .q-field__control{cursor:text}.q-select .q-field__input{min-width:50px!important;cursor:text}.q-select .q-field__input--padding{padding-left:4px}.q-select__autocomplete-input,.q-select__focus-target{position:absolute;outline:0!important;width:1px;height:1px;padding:0;border:0;opacity:0}.q-select__dropdown-icon{cursor:pointer;transition:transform .28s}.q-select.q-field--readonly .q-field__control,.q-select.q-field--readonly .q-select__dropdown-icon{cursor:default}.q-select__dialog{width:90vw!important;max-width:90vw!important;max-height:calc(100vh - 70px)!important;background:#fff;display:flex;flex-direction:column}.q-select__dialog>.scroll{position:relative;background:inherit}body.mobile:not(.native-mobile) .q-select__dialog{max-height:calc(100vh - 108px)!important}body.platform-android.native-mobile .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 24px)!important}body.platform-android:not(.native-mobile) .q-dialog__inner--top .q-select__dialog{max-height:calc(100vh - 80px)!important}body.platform-ios.native-mobile .q-dialog__inner--top>div{border-radius:4px}body.platform-ios.native-mobile .q-dialog__inner--top .q-select__dialog--focused{max-height:47vh!important}body.platform-ios:not(.native-mobile) .q-dialog__inner--top .q-select__dialog--focused{max-height:50vh!important}.q-separator{border:0;background:rgba(0,0,0,.12);margin:0;transition:background .3s,opacity .3s;flex-shrink:0}.q-separator--dark{background:rgba(255,255,255,.28)}.q-separator--horizontal{display:block;height:1px}.q-separator--horizontal-inset{margin-left:16px;margin-right:16px}.q-separator--horizontal-item-inset{margin-left:72px;margin-right:0}.q-separator--horizontal-item-thumbnail-inset{margin-left:116px;margin-right:0}.q-separator--vertical{width:1px;height:auto;align-self:stretch}.q-separator--vertical-inset{margin-top:8px;margin-bottom:8px}.q-skeleton{--q-skeleton-speed:1500ms;background:rgba(0,0,0,.12);border-radius:4px;box-sizing:border-box}.q-skeleton--anim{cursor:wait}.q-skeleton:before{content:" "}.q-skeleton--type-text{transform:scale(1,.5)}.q-skeleton--type-QAvatar,.q-skeleton--type-circle{height:48px;width:48px;border-radius:50%}.q-skeleton--type-QBtn{width:90px;height:36px}.q-skeleton--type-QBadge{width:70px;height:16px}.q-skeleton--type-QChip{width:90px;height:28px;border-radius:16px}.q-skeleton--type-QToolbar{height:50px}.q-skeleton--type-QCheckbox,.q-skeleton--type-QRadio{width:40px;height:40px;border-radius:50%}.q-skeleton--type-QToggle{width:56px;height:40px;border-radius:7px}.q-skeleton--type-QRange,.q-skeleton--type-QSlider{height:40px}.q-skeleton--type-QInput{height:56px}.q-skeleton--bordered{border:1px solid rgba(0,0,0,.05)}.q-skeleton--square{border-radius:0}.q-skeleton--anim-fade{animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-pulse{animation:q-skeleton--pulse var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-x{animation:q-skeleton--pulse-x var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-pulse-y{animation:q-skeleton--pulse-y var(--q-skeleton-speed) ease-in-out .5s infinite}.q-skeleton--anim-blink,.q-skeleton--anim-pop,.q-skeleton--anim-wave{position:relative;overflow:hidden;z-index:1}.q-skeleton--anim-blink:after,.q-skeleton--anim-pop:after,.q-skeleton--anim-wave:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0}.q-skeleton--anim-blink:after{background:rgba(255,255,255,.7);animation:q-skeleton--fade var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.5),rgba(255,255,255,0));animation:q-skeleton--wave var(--q-skeleton-speed) linear .5s infinite}.q-skeleton--dark{background:rgba(255,255,255,.05)}.q-skeleton--dark.q-skeleton--bordered{border:1px solid rgba(255,255,255,.25)}.q-skeleton--dark.q-skeleton--anim-wave:after{background:linear-gradient(90deg,rgba(255,255,255,0),rgba(255,255,255,.1),rgba(255,255,255,0))}.q-skeleton--dark.q-skeleton--anim-blink:after{background:rgba(255,255,255,.2)}@keyframes q-skeleton--fade{0%{opacity:1}50%{opacity:.4}100%{opacity:1}}@keyframes q-skeleton--pulse{0%{transform:scale(1)}50%{transform:scale(.85)}100%{transform:scale(1)}}@keyframes q-skeleton--pulse-x{0%{transform:scaleX(1)}50%{transform:scaleX(.75)}100%{transform:scaleX(1)}}@keyframes q-skeleton--pulse-y{0%{transform:scaleY(1)}50%{transform:scaleY(.75)}100%{transform:scaleY(1)}}@keyframes q-skeleton--wave{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}.q-slide-item{position:relative;background:#fff}.q-slide-item__bottom,.q-slide-item__left,.q-slide-item__right,.q-slide-item__top{visibility:hidden;font-size:14px;color:#fff}.q-slide-item__bottom .q-icon,.q-slide-item__left .q-icon,.q-slide-item__right .q-icon,.q-slide-item__top .q-icon{font-size:1.714em}.q-slide-item__left{background:#4caf50;padding:8px 16px}.q-slide-item__left>div{transform-origin:left center}.q-slide-item__right{background:#ff9800;padding:8px 16px}.q-slide-item__right>div{transform-origin:right center}.q-slide-item__top{background:#2196f3;padding:16px 8px}.q-slide-item__top>div{transform-origin:top center}.q-slide-item__bottom{background:#9c27b0;padding:16px 8px}.q-slide-item__bottom>div{transform-origin:bottom center}.q-slide-item__content{background:inherit;transition:transform .2s ease-in;-webkit-user-select:none;user-select:none;cursor:pointer}.q-slider{position:relative}.q-slider--h{width:100%}.q-slider--v{height:200px}.q-slider--editable .q-slider__track-container{cursor:grab}.q-slider__track-container{outline:0}.q-slider__track-container--h{width:100%;padding:12px 0}.q-slider__track-container--h .q-slider__selection{will-change:width,left}.q-slider__track-container--v{height:100%;padding:0 12px}.q-slider__track-container--v .q-slider__selection{will-change:height,top}.q-slider__track{color:var(--q-primary);background:rgba(0,0,0,.1);border-radius:4px;width:inherit;height:inherit}.q-slider__inner{background:rgba(0,0,0,.1);border-radius:inherit;width:100%;height:100%}.q-slider__selection{background:currentColor;border-radius:inherit;width:100%;height:100%}.q-slider__markers{color:rgba(0,0,0,.3);border-radius:inherit;width:100%;height:100%}.q-slider__markers:after{content:"";position:absolute;background:currentColor}.q-slider__markers--h{background-image:repeating-linear-gradient(to right,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--h:after{height:100%;width:2px;top:0;right:0}.q-slider__markers--v{background-image:repeating-linear-gradient(to bottom,currentColor,currentColor 2px,rgba(255,255,255,0) 0,rgba(255,255,255,0))}.q-slider__markers--v:after{width:100%;height:2px;left:0;bottom:0}.q-slider__marker-labels-container{position:relative;width:100%;height:100%;min-height:24px;min-width:24px}.q-slider__marker-labels{position:absolute}.q-slider__marker-labels--h-standard{top:0}.q-slider__marker-labels--h-switched{bottom:0}.q-slider__marker-labels--h-ltr{transform:translateX(-50%)}.q-slider__marker-labels--h-rtl{transform:translateX(50%)}.q-slider__marker-labels--v-standard{left:4px}.q-slider__marker-labels--v-switched{right:4px}.q-slider__marker-labels--v-ltr{transform:translateY(-50%)}.q-slider__marker-labels--v-rtl{transform:translateY(50%)}.q-slider__thumb{z-index:1;outline:0;color:var(--q-primary);transition:transform .18s ease-out,fill .18s ease-out,stroke .18s ease-out}.q-slider__thumb.q-slider--focus{opacity:1!important}.q-slider__thumb--h{top:50%;will-change:left}.q-slider__thumb--h-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--h-rtl{transform:scale(1) translate(50%,-50%)}.q-slider__thumb--v{left:50%;will-change:top}.q-slider__thumb--v-ltr{transform:scale(1) translate(-50%,-50%)}.q-slider__thumb--v-rtl{transform:scale(1) translate(-50%,50%)}.q-slider__thumb-shape{top:0;left:0;stroke-width:3.5;stroke:currentColor;transition:transform .28s}.q-slider__thumb-shape path{stroke:currentColor;fill:currentColor}.q-slider__focus-ring{border-radius:50%;opacity:0;transition:transform .266s ease-out,opacity .266s ease-out,background-color .266s ease-out;transition-delay:0.14s}.q-slider__pin{opacity:0;white-space:nowrap;transition:opacity .28s ease-out;transition-delay:0.14s}.q-slider__pin:before{content:"";width:0;height:0;position:absolute}.q-slider__pin--h:before{border-left:6px solid transparent;border-right:6px solid transparent;left:50%;transform:translateX(-50%)}.q-slider__pin--h-standard{bottom:100%}.q-slider__pin--h-standard:before{bottom:2px;border-top:6px solid currentColor}.q-slider__pin--h-switched{top:100%}.q-slider__pin--h-switched:before{top:2px;border-bottom:6px solid currentColor}.q-slider__pin--v{top:0}.q-slider__pin--v:before{top:50%;transform:translateY(-50%);border-top:6px solid transparent;border-bottom:6px solid transparent}.q-slider__pin--v-standard{left:100%}.q-slider__pin--v-standard:before{left:2px;border-right:6px solid currentColor}.q-slider__pin--v-switched{right:100%}.q-slider__pin--v-switched:before{right:2px;border-left:6px solid currentColor}.q-slider__label{z-index:1;white-space:nowrap;position:absolute}.q-slider__label--h{left:50%;transform:translateX(-50%)}.q-slider__label--h-standard{bottom:7px}.q-slider__label--h-switched{top:7px}.q-slider__label--v{top:50%;transform:translateY(-50%)}.q-slider__label--v-standard{left:7px}.q-slider__label--v-switched{right:7px}.q-slider__text-container{min-height:25px;padding:2px 8px;border-radius:4px;background:currentColor;position:relative;text-align:center}.q-slider__text{color:#fff;font-size:12px}.q-slider--no-value .q-slider__inner,.q-slider--no-value .q-slider__selection,.q-slider--no-value .q-slider__thumb{opacity:0}.q-slider--focus .q-slider__focus-ring,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__focus-ring{background:currentColor;transform:scale3d(1.55,1.55,1);opacity:.25}.q-slider--focus .q-slider__inner,.q-slider--focus .q-slider__selection,.q-slider--focus .q-slider__thumb,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__inner,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__selection,body.desktop .q-slider.q-slider--editable .q-slider__track-container:hover .q-slider__thumb{opacity:1}.q-slider--inactive .q-slider__thumb--h{transition:left .28s,right .28s}.q-slider--inactive .q-slider__thumb--v{transition:top .28s,bottom .28s}.q-slider--inactive .q-slider__selection{transition:width .28s,left .28s,right .28s,height .28s,top .28s,bottom .28s}.q-slider--inactive .q-slider__text-container{transition:transform .28s}.q-slider--active{cursor:grabbing}.q-slider--active .q-slider__thumb-shape{transform:scale(1.5)}.q-slider--active .q-slider__focus-ring,.q-slider--active.q-slider--label .q-slider__thumb-shape{transform:scale(0)!important}body.desktop .q-slider.q-slider--enabled .q-slider__track-container:hover .q-slider__pin{opacity:1}.q-slider--label .q-slider--focus .q-slider__pin,.q-slider--label.q-slider--active .q-slider__pin,.q-slider--label.q-slider--label-always .q-slider__pin{opacity:1}.q-slider--dark .q-slider__track{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__inner{background:rgba(255,255,255,.1)}.q-slider--dark .q-slider__markers{color:rgba(255,255,255,.3)}.q-slider--dense .q-slider__track-container--h{padding:6px 0}.q-slider--dense .q-slider__track-container--v{padding:0 6px}.q-space{flex-grow:1!important}.q-spinner{vertical-align:middle}.q-spinner-mat{animation:q-spin 2s linear infinite;transform-origin:center center}.q-spinner-mat .path{stroke-dasharray:1,200;stroke-dashoffset:0;animation:q-mat-dash 1.5s ease-in-out infinite}@keyframes q-spin{0%{transform:rotate3d(0,0,1,0deg)}25%{transform:rotate3d(0,0,1,90deg)}50%{transform:rotate3d(0,0,1,180deg)}75%{transform:rotate3d(0,0,1,270deg)}100%{transform:rotate3d(0,0,1,359deg)}}@keyframes q-mat-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}.q-splitter__panel{position:relative;z-index:0}.q-splitter__panel>.q-splitter{width:100%;height:100%}.q-splitter__separator{background-color:rgba(0,0,0,.12);-webkit-user-select:none;user-select:none;position:relative;z-index:1}.q-splitter__separator-area>*{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.q-splitter--dark .q-splitter__separator{background-color:rgba(255,255,255,.28)}.q-splitter--vertical>.q-splitter__panel{height:100%}.q-splitter--vertical.q-splitter--active{cursor:col-resize}.q-splitter--vertical>.q-splitter__separator{width:1px}.q-splitter--vertical>.q-splitter__separator>div{left:-6px;right:-6px}.q-splitter--vertical.q-splitter--workable>.q-splitter__separator{cursor:col-resize}.q-splitter--horizontal>.q-splitter__panel{width:100%}.q-splitter--horizontal.q-splitter--active{cursor:row-resize}.q-splitter--horizontal>.q-splitter__separator{height:1px}.q-splitter--horizontal>.q-splitter__separator>div{top:-6px;bottom:-6px}.q-splitter--horizontal.q-splitter--workable>.q-splitter__separator{cursor:row-resize}.q-splitter__after,.q-splitter__before{overflow:auto}.q-stepper{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff}.q-stepper__title{font-size:14px;line-height:1.285714;letter-spacing:.1px}.q-stepper__caption{font-size:12px;line-height:1.16667}.q-stepper__dot{contain:layout;margin-right:8px;font-size:14px;width:24px;min-width:24px;height:24px;border-radius:50%;background:currentColor}.q-stepper__dot span{color:#fff}.q-stepper__tab{padding:8px 24px;font-size:14px;color:#9e9e9e;flex-direction:row}.q-stepper--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-stepper--dark .q-stepper__dot span{color:#000}.q-stepper__tab--navigation{-webkit-user-select:none;user-select:none;cursor:pointer}.q-stepper__tab--active,.q-stepper__tab--done{color:var(--q-primary)}.q-stepper__tab--active .q-stepper__dot,.q-stepper__tab--active .q-stepper__label,.q-stepper__tab--done .q-stepper__dot,.q-stepper__tab--done .q-stepper__label{text-shadow:0 0 0 currentColor}.q-stepper__tab--disabled .q-stepper__dot{background:rgba(0,0,0,.22)}.q-stepper__tab--disabled .q-stepper__label{color:rgba(0,0,0,.32)}.q-stepper__tab--error{color:var(--q-negative)}.q-stepper__tab--error-with-icon .q-stepper__dot{background:0 0!important}.q-stepper__tab--error-with-icon .q-stepper__dot span{color:currentColor;font-size:24px}.q-stepper__header{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-stepper__header--border{border-bottom:1px solid rgba(0,0,0,.12)}.q-stepper__header--standard-labels .q-stepper__tab{min-height:72px;justify-content:center}.q-stepper__header--standard-labels .q-stepper__tab:first-child{justify-content:flex-start}.q-stepper__header--standard-labels .q-stepper__tab:last-child{justify-content:flex-end}.q-stepper__header--standard-labels .q-stepper__tab:only-child{justify-content:center}.q-stepper__header--standard-labels .q-stepper__dot:after{display:none}.q-stepper__header--alternative-labels .q-stepper__tab{min-height:104px;padding:24px 32px;flex-direction:column;justify-content:flex-start}.q-stepper__header--alternative-labels .q-stepper__dot{margin-right:0}.q-stepper__header--alternative-labels .q-stepper__label{margin-top:8px;text-align:center}.q-stepper__header--alternative-labels .q-stepper__label:after,.q-stepper__header--alternative-labels .q-stepper__label:before{display:none}.q-stepper__header--contracted{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab{min-height:72px}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:first-child{align-items:flex-start}.q-stepper__header--contracted.q-stepper__header--alternative-labels .q-stepper__tab:last-child{align-items:flex-end}.q-stepper__header--contracted .q-stepper__tab{padding:24px 0}.q-stepper__header--contracted .q-stepper__tab:first-child .q-stepper__dot{transform:translateX(24px)}.q-stepper__header--contracted .q-stepper__tab:last-child .q-stepper__dot{transform:translateX(-24px)}.q-stepper__header--contracted .q-stepper__tab:not(:last-child) .q-stepper__dot:after{display:block!important}.q-stepper__header--contracted .q-stepper__dot{margin:0}.q-stepper__header--contracted .q-stepper__label{display:none}.q-stepper__nav{padding-top:24px}.q-stepper--flat{box-shadow:none}.q-stepper--bordered{border:1px solid rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__step-inner{padding:24px}.q-stepper--horizontal .q-stepper__tab:first-child{border-top-left-radius:inherit}.q-stepper--horizontal .q-stepper__tab:last-child{border-top-right-radius:inherit}.q-stepper--horizontal .q-stepper__tab:first-child .q-stepper__dot:before,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__tab:last-child .q-stepper__label:after{display:none}.q-stepper--horizontal .q-stepper__tab{overflow:hidden}.q-stepper--horizontal .q-stepper__line{contain:layout}.q-stepper--horizontal .q-stepper__line:after,.q-stepper--horizontal .q-stepper__line:before{position:absolute;top:50%;height:1px;width:100vw;background:rgba(0,0,0,.12)}.q-stepper--horizontal .q-stepper__dot:after,.q-stepper--horizontal .q-stepper__label:after{content:"";left:100%;margin-left:8px}.q-stepper--horizontal .q-stepper__dot:before{content:"";right:100%;margin-right:8px}.q-stepper--horizontal>.q-stepper__nav{padding:0 24px 24px}.q-stepper--vertical{padding:16px 0}.q-stepper--vertical .q-stepper__tab{padding:12px 24px}.q-stepper--vertical .q-stepper__title{line-height:18px}.q-stepper--vertical .q-stepper__step-inner{padding:0 24px 32px 60px}.q-stepper--vertical>.q-stepper__nav{padding:24px 24px 0}.q-stepper--vertical .q-stepper__step{overflow:hidden}.q-stepper--vertical .q-stepper__dot{margin-right:12px}.q-stepper--vertical .q-stepper__dot:after,.q-stepper--vertical .q-stepper__dot:before{content:"";position:absolute;left:50%;width:1px;height:99999px;background:rgba(0,0,0,.12)}.q-stepper--vertical .q-stepper__dot:before{bottom:100%;margin-bottom:8px}.q-stepper--vertical .q-stepper__dot:after{top:100%;margin-top:8px}.q-stepper--vertical .q-stepper__step:first-child .q-stepper__dot:before,.q-stepper--vertical .q-stepper__step:last-child .q-stepper__dot:after{display:none}.q-stepper--vertical .q-stepper__step:last-child .q-stepper__step-inner{padding-bottom:8px}.q-stepper--dark .q-stepper__header--border,.q-stepper--dark.q-stepper--bordered{border-color:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--horizontal .q-stepper__line:after,.q-stepper--dark.q-stepper--horizontal .q-stepper__line:before{background:rgba(255,255,255,.28)}.q-stepper--dark.q-stepper--vertical .q-stepper__dot:after,.q-stepper--dark.q-stepper--vertical .q-stepper__dot:before{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled{color:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__dot{background:rgba(255,255,255,.28)}.q-stepper--dark .q-stepper__tab--disabled .q-stepper__label{color:rgba(255,255,255,.54)}.q-tab-panels{background:#fff}.q-tab-panel{padding:16px}.q-markup-table{overflow:auto;background:#fff}.q-table{width:100%;max-width:100%;border-collapse:separate;border-spacing:0}.q-table tbody td,.q-table thead tr{height:48px}.q-table th{font-weight:500;font-size:12px;-webkit-user-select:none;user-select:none}.q-table th.sortable{cursor:pointer}.q-table th.sortable:hover .q-table__sort-icon{opacity:.64}.q-table th.sorted .q-table__sort-icon{opacity:.86!important}.q-table th.sort-desc .q-table__sort-icon{transform:rotate(180deg)}.q-table td,.q-table th{padding:7px 16px;background-color:inherit}.q-table td,.q-table th,.q-table thead{border-style:solid;border-width:0}.q-table tbody td{font-size:13px}.q-table__card{color:#000;background-color:#fff;border-radius:4px;box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.q-table__card .q-table__middle{flex:1 1 auto}.q-table__card .q-table__bottom,.q-table__card .q-table__top{flex:0 0 auto}.q-table__container{position:relative}.q-table__container>div:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.q-table__container>div:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.q-table__container>.q-inner-loading{border-radius:inherit!important}.q-table__top{padding:12px 16px}.q-table__top .q-table__control{flex-wrap:wrap}.q-table__title{font-size:20px;letter-spacing:.005em;font-weight:400}.q-table__separator{min-width:8px!important}.q-table__progress{height:0!important}.q-table__progress th{padding:0!important;border:0!important}.q-table__progress .q-linear-progress{position:absolute;bottom:0}.q-table__middle{max-width:100%}.q-table__bottom{min-height:50px;padding:4px 14px 4px 16px;font-size:12px}.q-table__bottom .q-table__control{min-height:24px}.q-table__bottom-nodata-icon{font-size:200%;margin-right:8px}.q-table__bottom-item{margin-right:16px}.q-table__control{display:flex;align-items:center}.q-table__sort-icon{transition:transform .3s cubic-bezier(.25, .8, .5, 1);opacity:0;font-size:120%}.q-table__sort-icon--center,.q-table__sort-icon--left{margin-left:4px}.q-table__sort-icon--right{margin-right:4px}.q-table--col-auto-width{width:1px}.q-table--dark,.q-table__card--dark{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-table--flat{box-shadow:none}.q-table--bordered{border:1px solid rgba(0,0,0,.12)}.q-table--square{border-radius:0}.q-table__linear-progress{height:2px}.q-table--no-wrap td,.q-table--no-wrap th{white-space:nowrap}.q-table--grid{box-shadow:none;border-radius:4px}.q-table--grid .q-table__top{padding-bottom:4px}.q-table--grid .q-table__middle{min-height:2px;margin-bottom:4px}.q-table--grid .q-table__middle thead,.q-table--grid .q-table__middle thead th{border:0!important}.q-table--grid .q-table__linear-progress{bottom:0}.q-table--grid .q-table__bottom{border-top:0}.q-table--grid .q-table__grid-content{flex:1 1 auto}.q-table--grid.fullscreen{background:inherit}.q-table__grid-item-card{vertical-align:top;padding:12px}.q-table__grid-item-card .q-separator{margin:12px 0}.q-table__grid-item-row+.q-table__grid-item-row{margin-top:8px}.q-table__grid-item-title{opacity:.54;font-weight:500;font-size:12px}.q-table__grid-item-value{font-size:13px}.q-table__grid-item{padding:4px;transition:transform .3s cubic-bezier(.25, .8, .5, 1)}.q-table__grid-item--selected{transform:scale(.95)}.q-table--cell-separator tbody tr:not(:last-child)>td,.q-table--cell-separator thead th,.q-table--horizontal-separator tbody tr:not(:last-child)>td,.q-table--horizontal-separator thead th{border-bottom-width:1px}.q-table--cell-separator td,.q-table--cell-separator th,.q-table--vertical-separator td,.q-table--vertical-separator th{border-left-width:1px}.q-table--cell-separator thead tr:last-child th,.q-table--cell-separator.q-table--loading tr:nth-last-child(2) th,.q-table--vertical-separator thead tr:last-child th,.q-table--vertical-separator.q-table--loading tr:nth-last-child(2) th{border-bottom-width:1px}.q-table--cell-separator td:first-child,.q-table--cell-separator th:first-child,.q-table--vertical-separator td:first-child,.q-table--vertical-separator th:first-child{border-left:0}.q-table--cell-separator .q-table__top,.q-table--vertical-separator .q-table__top{border-bottom:1px solid rgba(0,0,0,.12)}.q-table--dense .q-table__top{padding:6px 16px}.q-table--dense .q-table__bottom{min-height:33px}.q-table--dense .q-table__sort-icon{font-size:110%}.q-table--dense .q-table td,.q-table--dense .q-table th{padding:4px 8px}.q-table--dense .q-table tbody td,.q-table--dense .q-table tbody tr,.q-table--dense .q-table thead tr{height:28px}.q-table--dense .q-table td:first-child,.q-table--dense .q-table th:first-child{padding-left:16px}.q-table--dense .q-table td:last-child,.q-table--dense .q-table th:last-child{padding-right:16px}.q-table--dense .q-table__bottom-item{margin-right:8px}.q-table--dense .q-table__select .q-field__control,.q-table--dense .q-table__select .q-field__native{min-height:24px;padding:0}.q-table--dense .q-table__select .q-field__marginal{height:24px}.q-table__bottom{border-top:1px solid rgba(0,0,0,.12)}.q-table td,.q-table th,.q-table thead,.q-table tr{border-color:rgba(0,0,0,.12)}.q-table tbody td{position:relative}.q-table tbody td:after,.q-table tbody td:before{position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none}.q-table tbody td:before{background:rgba(0,0,0,.03)}.q-table tbody td:after{background:rgba(0,0,0,.06)}.q-table tbody tr.selected td:after{content:""}body.desktop .q-table>tbody>tr:not(.q-tr--no-hover):hover>td:not(.q-td--no-hover):before{content:""}.q-table--dark,.q-table__card--dark{border-color:rgba(255,255,255,.28)}.q-table--dark .q-table__bottom,.q-table--dark td,.q-table--dark th,.q-table--dark thead,.q-table--dark tr{border-color:rgba(255,255,255,.28)}.q-table--dark tbody td:before{background:rgba(255,255,255,.07)}.q-table--dark tbody td:after{background:rgba(255,255,255,.1)}.q-table--dark.q-table--cell-separator .q-table__top,.q-table--dark.q-table--vertical-separator .q-table__top{border-color:rgba(255,255,255,.28)}.q-tab{padding:0 16px;min-height:48px;transition:color .3s,background-color .3s;text-transform:uppercase;white-space:nowrap;color:inherit;text-decoration:none}.q-tab--full{min-height:72px}.q-tab--no-caps{text-transform:none}.q-tab__content{height:inherit;padding:4px 0;min-width:40px}.q-tab__content--inline .q-tab__icon+.q-tab__label{padding-left:8px}.q-tab__content .q-chip--floating{top:0;right:-16px}.q-tab__icon{width:24px;height:24px;font-size:24px}.q-tab__label{font-size:14px;line-height:1.715em;font-weight:500}.q-tab .q-badge{top:3px;right:-12px}.q-tab__alert,.q-tab__alert-icon{position:absolute}.q-tab__alert{top:7px;right:-9px;height:10px;width:10px;border-radius:50%;background:currentColor}.q-tab__alert-icon{top:2px;right:-12px;font-size:18px}.q-tab__indicator{opacity:0;height:2px;background:currentColor}.q-tab--active .q-tab__indicator{opacity:1;transform-origin:left}.q-tab--inactive{opacity:.85}.q-tabs{position:relative;transition:color .3s,background-color .3s}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--horizontal{padding-left:36px;padding-right:36px}.q-tabs--scrollable.q-tabs__arrows--outside.q-tabs--vertical{padding-top:36px;padding-bottom:36px}.q-tabs--scrollable.q-tabs__arrows--outside .q-tabs__arrow--faded{opacity:.3;pointer-events:none}.q-tabs--scrollable.q-tabs__arrows--inside .q-tabs__arrow--faded{display:none}.q-tabs--not-scrollable.q-tabs__arrows--outside,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows.q-tabs__arrows--outside{padding-left:0;padding-right:0}.q-tabs--not-scrollable .q-tabs__arrow,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__arrow{display:none}.q-tabs--not-scrollable .q-tabs__content,body.mobile .q-tabs--scrollable.q-tabs--mobile-without-arrows .q-tabs__content{border-radius:inherit}.q-tabs__arrow{cursor:pointer;font-size:32px;min-width:36px;text-shadow:0 0 3px #fff,0 0 1px #fff,0 0 1px #000;transition:opacity .3s}.q-tabs__content{overflow:hidden;flex:1 1 auto}.q-tabs__content--align-center{justify-content:center}.q-tabs__content--align-right{justify-content:flex-end}.q-tabs__content--align-justify .q-tab{flex:1 1 auto}.q-tabs__offset{display:none}.q-tabs--horizontal .q-tabs__arrow{height:100%}.q-tabs--horizontal .q-tabs__arrow--left{top:0;left:0;bottom:0}.q-tabs--horizontal .q-tabs__arrow--right{top:0;right:0;bottom:0}.q-tabs--vertical{display:block!important;height:100%}.q-tabs--vertical .q-tabs__content{display:block!important;height:100%}.q-tabs--vertical .q-tabs__arrow{width:100%;height:36px;text-align:center}.q-tabs--vertical .q-tabs__arrow--left{top:0;left:0;right:0}.q-tabs--vertical .q-tabs__arrow--right{left:0;right:0;bottom:0}.q-tabs--vertical .q-tab{padding:0 8px}.q-tabs--vertical .q-tab__indicator{height:unset;width:2px}.q-tabs--vertical.q-tabs--not-scrollable .q-tabs__content{height:100%}.q-tabs--vertical.q-tabs--dense .q-tab__content{min-width:24px}.q-tabs--dense .q-tab{min-height:36px}.q-tabs--dense .q-tab--full{min-height:52px}.q-time{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;background:#fff;outline:0;width:290px;min-width:290px;max-width:100%}.q-time--bordered{border:1px solid rgba(0,0,0,.12)}.q-time__header{border-top-left-radius:inherit;color:#fff;background-color:var(--q-primary);padding:16px;font-weight:300}.q-time__actions{padding:0 16px 16px}.q-time__header-label{font-size:28px;line-height:1;letter-spacing:-.00833em}.q-time__header-label>div+div{margin-left:4px}.q-time__link{opacity:.56;outline:0;transition:opacity .3s ease-out}.q-time__link--active,.q-time__link:focus,.q-time__link:hover{opacity:1}.q-time__header-ampm{font-size:16px;letter-spacing:.1em}.q-time__content{padding:16px}.q-time__content:before{content:"";display:block;padding-bottom:100%}.q-time__container-parent{padding:16px}.q-time__container-child{border-radius:50%;background:rgba(0,0,0,.12)}.q-time__clock{padding:24px;width:100%;height:100%;max-width:100%;max-height:100%;font-size:14px}.q-time__clock-circle{position:relative}.q-time__clock-center{height:6px;width:6px;margin:auto;border-radius:50%;min-height:0;background:currentColor}.q-time__clock-pointer{width:2px;height:50%;transform-origin:0 0;min-height:0;position:absolute;left:50%;right:0;bottom:0;color:var(--q-primary);background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:after,.q-time__clock-pointer:before{content:"";position:absolute;left:50%;border-radius:50%;background:currentColor;transform:translateX(-50%)}.q-time__clock-pointer:before{bottom:-4px;width:8px;height:8px}.q-time__clock-pointer:after{top:-3px;height:6px;width:6px}.q-time__clock-position{position:absolute;min-height:32px;width:32px;height:32px;font-size:12px;line-height:32px;margin:0;padding:0;transform:translate(-50%,-50%);border-radius:50%}.q-time__clock-position--disable{opacity:.4}.q-time__clock-position--active{background-color:var(--q-primary);color:#fff}.q-time__clock-pos-0{top:0;left:50%}.q-time__clock-pos-1{top:6.7%;left:75%}.q-time__clock-pos-2{top:25%;left:93.3%}.q-time__clock-pos-3{top:50%;left:100%}.q-time__clock-pos-4{top:75%;left:93.3%}.q-time__clock-pos-5{top:93.3%;left:75%}.q-time__clock-pos-6{top:100%;left:50%}.q-time__clock-pos-7{top:93.3%;left:25%}.q-time__clock-pos-8{top:75%;left:6.7%}.q-time__clock-pos-9{top:50%;left:0}.q-time__clock-pos-10{top:25%;left:6.7%}.q-time__clock-pos-11{top:6.7%;left:25%}.q-time__clock-pos-12{top:15%;left:50%}.q-time__clock-pos-13{top:19.69%;left:67.5%}.q-time__clock-pos-14{top:32.5%;left:80.31%}.q-time__clock-pos-15{top:50%;left:85%}.q-time__clock-pos-16{top:67.5%;left:80.31%}.q-time__clock-pos-17{top:80.31%;left:67.5%}.q-time__clock-pos-18{top:85%;left:50%}.q-time__clock-pos-19{top:80.31%;left:32.5%}.q-time__clock-pos-20{top:67.5%;left:19.69%}.q-time__clock-pos-21{top:50%;left:15%}.q-time__clock-pos-22{top:32.5%;left:19.69%}.q-time__clock-pos-23{top:19.69%;left:32.5%}.q-time__now-button{background-color:var(--q-primary);color:#fff;top:12px;right:12px}.q-time--readonly .q-time__content,.q-time--readonly .q-time__header-ampm,.q-time.disabled .q-time__content,.q-time.disabled .q-time__header-ampm{pointer-events:none}.q-time--portrait{display:inline-flex;flex-direction:column}.q-time--portrait .q-time__header{border-top-right-radius:inherit;min-height:86px}.q-time--portrait .q-time__header-ampm{margin-left:12px}.q-time--portrait.q-time--bordered .q-time__content{margin:1px 0}.q-time--landscape{display:inline-flex;align-items:stretch;min-width:420px}.q-time--landscape>div{display:flex;flex-direction:column;justify-content:center}.q-time--landscape .q-time__header{border-bottom-left-radius:inherit;min-width:156px}.q-time--landscape .q-time__header-ampm{margin-top:12px}.q-time--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-timeline{padding:0;width:100%;list-style:none}.q-timeline h6{line-height:inherit}.q-timeline--dark{color:#fff}.q-timeline--dark .q-timeline__subtitle{opacity:.7}.q-timeline__content{padding-bottom:24px}.q-timeline__title{margin-top:0;margin-bottom:16px}.q-timeline__subtitle{font-size:12px;margin-bottom:8px;opacity:.6;text-transform:uppercase;letter-spacing:1px;font-weight:700}.q-timeline__dot{position:absolute;top:0;bottom:0;width:15px}.q-timeline__dot:after,.q-timeline__dot:before{content:"";background:currentColor;display:block;position:absolute}.q-timeline__dot:before{border:3px solid transparent;border-radius:100%;height:15px;width:15px;top:4px;left:0;transition:background .3s ease-in-out,border .3s ease-in-out}.q-timeline__dot:after{width:3px;opacity:.4;top:24px;bottom:0;left:6px}.q-timeline__dot .q-icon{position:absolute;top:0;left:0;right:0;font-size:16px;height:38px;line-height:38px;width:100%;color:#fff}.q-timeline__dot .q-icon>img,.q-timeline__dot .q-icon>svg{width:1em;height:1em}.q-timeline__dot-img{position:absolute;top:4px;left:0;right:0;height:31px;width:31px;background:currentColor;border-radius:50%}.q-timeline__heading{position:relative}.q-timeline__heading:first-child .q-timeline__heading-title{padding-top:0}.q-timeline__heading:last-child .q-timeline__heading-title{padding-bottom:0}.q-timeline__heading-title{padding:32px 0;margin:0}.q-timeline__entry{position:relative;line-height:22px}.q-timeline__entry:last-child{padding-bottom:0!important}.q-timeline__entry:last-child .q-timeline__dot:after{content:none}.q-timeline__entry--icon .q-timeline__dot{width:31px}.q-timeline__entry--icon .q-timeline__dot:before{height:31px;width:31px}.q-timeline__entry--icon .q-timeline__dot:after{top:41px;left:14px}.q-timeline__entry--icon .q-timeline__subtitle{padding-top:8px}.q-timeline--dense--right .q-timeline__entry{padding-left:40px}.q-timeline--dense--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--dense--right .q-timeline__dot{left:0}.q-timeline--dense--left .q-timeline__heading{text-align:right}.q-timeline--dense--left .q-timeline__entry{padding-right:40px}.q-timeline--dense--left .q-timeline__entry--icon .q-timeline__dot{right:-8px}.q-timeline--dense--left .q-timeline__content,.q-timeline--dense--left .q-timeline__subtitle,.q-timeline--dense--left .q-timeline__title{text-align:right}.q-timeline--dense--left .q-timeline__dot{right:0}.q-timeline--comfortable{display:table}.q-timeline--comfortable .q-timeline__heading{display:table-row;font-size:200%}.q-timeline--comfortable .q-timeline__heading>div{display:table-cell}.q-timeline--comfortable .q-timeline__entry{display:table-row;padding:0}.q-timeline--comfortable .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--comfortable .q-timeline__content,.q-timeline--comfortable .q-timeline__dot,.q-timeline--comfortable .q-timeline__subtitle{display:table-cell;vertical-align:top}.q-timeline--comfortable .q-timeline__subtitle{width:35%}.q-timeline--comfortable .q-timeline__dot{position:relative;min-width:31px}.q-timeline--comfortable--right .q-timeline__heading .q-timeline__heading-title{margin-left:-50px}.q-timeline--comfortable--right .q-timeline__subtitle{text-align:right;padding-right:30px}.q-timeline--comfortable--right .q-timeline__content{padding-left:30px}.q-timeline--comfortable--right .q-timeline__entry--icon .q-timeline__dot{left:-8px}.q-timeline--comfortable--left .q-timeline__heading{text-align:right}.q-timeline--comfortable--left .q-timeline__heading .q-timeline__heading-title{margin-right:-50px}.q-timeline--comfortable--left .q-timeline__subtitle{padding-left:30px}.q-timeline--comfortable--left .q-timeline__content{padding-right:30px}.q-timeline--comfortable--left .q-timeline__content,.q-timeline--comfortable--left .q-timeline__title{text-align:right}.q-timeline--comfortable--left .q-timeline__entry--icon .q-timeline__dot{right:0}.q-timeline--comfortable--left .q-timeline__dot{right:-8px}.q-timeline--loose .q-timeline__heading-title{text-align:center;margin-left:0}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__dot,.q-timeline--loose .q-timeline__entry,.q-timeline--loose .q-timeline__subtitle{display:block;margin:0;padding:0}.q-timeline--loose .q-timeline__dot{position:absolute;left:50%;margin-left:-7.15px}.q-timeline--loose .q-timeline__entry{padding-bottom:24px;overflow:hidden}.q-timeline--loose .q-timeline__entry--icon .q-timeline__dot{margin-left:-15px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__subtitle{line-height:38px}.q-timeline--loose .q-timeline__entry--icon .q-timeline__content{padding-top:8px}.q-timeline--loose .q-timeline__entry--left .q-timeline__content,.q-timeline--loose .q-timeline__entry--right .q-timeline__subtitle{float:left;padding-right:30px;text-align:right}.q-timeline--loose .q-timeline__entry--left .q-timeline__subtitle,.q-timeline--loose .q-timeline__entry--right .q-timeline__content{float:right;text-align:left;padding-left:30px}.q-timeline--loose .q-timeline__content,.q-timeline--loose .q-timeline__subtitle{width:50%}.q-toggle{vertical-align:middle}.q-toggle__native{width:1px;height:1px}.q-toggle__track{height:.35em;border-radius:.175em;opacity:.38;background:currentColor}.q-toggle__thumb{top:.25em;left:.25em;width:.5em;height:.5em;transition:left .22s cubic-bezier(.4, 0, .2, 1);-webkit-user-select:none;user-select:none;z-index:0}.q-toggle__thumb:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:#fff;box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.q-toggle__thumb .q-icon{font-size:.3em;min-width:1em;color:#000;opacity:.54;z-index:1}.q-toggle__inner{font-size:40px;width:1.4em;min-width:1.4em;height:1em;padding:.325em .3em;-webkit-print-color-adjust:exact}.q-toggle__inner--indet .q-toggle__thumb{left:.45em}.q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle__inner--truthy .q-toggle__track{opacity:.54}.q-toggle__inner--truthy .q-toggle__thumb{left:.65em}.q-toggle__inner--truthy .q-toggle__thumb:after{background-color:currentColor}.q-toggle__inner--truthy .q-toggle__thumb .q-icon{color:#fff;opacity:1}.q-toggle.disabled{opacity:.75!important}.q-toggle--dark .q-toggle__inner{color:#fff}.q-toggle--dark .q-toggle__inner--truthy{color:var(--q-primary)}.q-toggle--dark .q-toggle__thumb:after{box-shadow:none}.q-toggle--dark .q-toggle__thumb:before{opacity:.32!important}.q-toggle--dense .q-toggle__inner{width:.8em;min-width:.8em;height:.5em;padding:.07625em 0}.q-toggle--dense .q-toggle__thumb{top:0;left:0}.q-toggle--dense .q-toggle__inner--indet .q-toggle__thumb{left:.15em}.q-toggle--dense .q-toggle__inner--truthy .q-toggle__thumb{left:.3em}.q-toggle--dense .q-toggle__label{padding-left:.5em}.q-toggle--dense.reverse .q-toggle__label{padding-left:0;padding-right:.5em}body.desktop .q-toggle:not(.disabled) .q-toggle__thumb:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;background:currentColor;opacity:.12;transform:scale3d(0,0,1);transition:transform .22s cubic-bezier(0, 0, .2, 1)}body.desktop .q-toggle:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(2,2,1)}body.desktop .q-toggle--dense:not(.disabled):focus .q-toggle__thumb:before,body.desktop .q-toggle--dense:not(.disabled):hover .q-toggle__thumb:before{transform:scale3d(1.5,1.5,1)}.q-toolbar{position:relative;padding:0 12px;min-height:50px;width:100%}.q-toolbar--inset{padding-left:58px}.q-toolbar .q-avatar{font-size:38px}.q-toolbar__title{flex:1 1 0%;min-width:1px;max-width:100%;font-size:21px;font-weight:400;letter-spacing:.01em;padding:0 12px}.q-toolbar__title:first-child{padding-left:0}.q-toolbar__title:last-child{padding-right:0}.q-tooltip--style{font-size:10px;color:#fafafa;background:#757575;border-radius:4px;text-transform:none;font-weight:400}.q-tooltip{z-index:9000;position:fixed!important;overflow-y:auto;overflow-x:hidden;padding:6px 10px;max-width:95vw;max-height:65vh}@media (max-width:599.98px){.q-tooltip{font-size:14px;padding:8px 16px}}.q-tree{position:relative;color:#9e9e9e}.q-tree__node{padding:0 0 3px 22px}.q-tree__node:after{content:"";position:absolute;top:-3px;bottom:0;width:2px;right:auto;left:-13px;border-left:1px solid currentColor}.q-tree__node:last-child:after{display:none}.q-tree__node--disabled{pointer-events:none}.q-tree__node--disabled .disabled{opacity:1!important}.q-tree__node--disabled>.disabled,.q-tree__node--disabled>div,.q-tree__node--disabled>i{opacity:.6!important}.q-tree__node--disabled>.disabled .q-tree__node--disabled>.disabled,.q-tree__node--disabled>.disabled .q-tree__node--disabled>div,.q-tree__node--disabled>.disabled .q-tree__node--disabled>i,.q-tree__node--disabled>div .q-tree__node--disabled>.disabled,.q-tree__node--disabled>div .q-tree__node--disabled>div,.q-tree__node--disabled>div .q-tree__node--disabled>i,.q-tree__node--disabled>i .q-tree__node--disabled>.disabled,.q-tree__node--disabled>i .q-tree__node--disabled>div,.q-tree__node--disabled>i .q-tree__node--disabled>i{opacity:1!important}.q-tree__node-header:before{content:"";position:absolute;top:-3px;bottom:50%;width:31px;left:-35px;border-left:1px solid currentColor;border-bottom:1px solid currentColor}.q-tree__children{padding-left:25px}.q-tree__node-body{padding:5px 0 8px 5px}.q-tree__node--parent{padding-left:2px}.q-tree__node--parent>.q-tree__node-header:before{width:15px;left:-15px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:5px 0 8px 27px}.q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{content:"";position:absolute;top:0;width:2px;height:100%;right:auto;left:12px;border-left:1px solid currentColor;bottom:50px}.q-tree__node--link{cursor:pointer}.q-tree__node-header{padding:4px;margin-top:3px;border-radius:4px;outline:0}.q-tree__node-header-content{color:#000;transition:color .3s}.q-tree__node--selected .q-tree__node-header-content{color:#9e9e9e}.q-tree__icon,.q-tree__node-header-content .q-icon{font-size:21px}.q-tree__img{height:42px;border-radius:2px}.q-tree__avatar,.q-tree__node-header-content .q-avatar{font-size:28px;border-radius:50%;width:28px;height:28px}.q-tree__arrow,.q-tree__spinner{font-size:16px;margin-right:4px}.q-tree__arrow{transition:transform .3s}.q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-tree__tickbox{margin-right:4px}.q-tree>.q-tree__node{padding:0}.q-tree>.q-tree__node:after,.q-tree>.q-tree__node>.q-tree__node-header:before{display:none}.q-tree>.q-tree__node--child>.q-tree__node-header{padding-left:24px}.q-tree--dark .q-tree__node-header-content{color:#fff}.q-tree--no-connectors .q-tree__node-body:after,.q-tree--no-connectors .q-tree__node-header:before,.q-tree--no-connectors .q-tree__node:after{display:none!important}.q-tree--dense>.q-tree__node--child>.q-tree__node-header{padding-left:1px}.q-tree--dense .q-tree__arrow,.q-tree--dense .q-tree__spinner{margin-right:1px}.q-tree--dense .q-tree__img{height:32px}.q-tree--dense .q-tree__tickbox{margin-right:3px}.q-tree--dense .q-tree__node{padding:0}.q-tree--dense .q-tree__node:after{top:0;left:-8px}.q-tree--dense .q-tree__node-header{margin-top:0;padding:1px}.q-tree--dense .q-tree__node-header:before{top:0;left:-8px;width:8px}.q-tree--dense .q-tree__node--child{padding-left:17px}.q-tree--dense .q-tree__node--child>.q-tree__node-header:before{left:-25px;width:21px}.q-tree--dense .q-tree__node-body{padding:0 0 2px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body{padding:0 0 2px 20px}.q-tree--dense .q-tree__node--parent>.q-tree__node-collapsible>.q-tree__node-body:after{left:8px}.q-tree--dense .q-tree__children{padding-left:16px}[dir=rtl] .q-tree__arrow{transform:rotate3d(0,0,1,180deg)}[dir=rtl] .q-tree__arrow--rotate{transform:rotate3d(0,0,1,90deg)}.q-uploader{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;vertical-align:top;background:#fff;position:relative;width:320px;max-height:320px}.q-uploader--bordered{border:1px solid rgba(0,0,0,.12)}.q-uploader__input{opacity:0;width:100%;height:100%;cursor:pointer!important;z-index:1}.q-uploader__input::-webkit-file-upload-button{cursor:pointer}.q-uploader__file:before{content:"";border-top-left-radius:inherit;border-top-right-radius:inherit;position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:currentColor;opacity:.04}.q-uploader__header{position:relative;border-top-left-radius:inherit;border-top-right-radius:inherit;background-color:var(--q-primary);color:#fff;width:100%}.q-uploader__spinner{font-size:24px;margin-right:4px}.q-uploader__header-content{padding:8px}.q-uploader__dnd{outline:1px dashed currentColor;outline-offset:-4px;background:rgba(255,255,255,.6)}.q-uploader__overlay{font-size:36px;color:#000;background-color:rgba(255,255,255,.6)}.q-uploader__list{position:relative;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding:8px;min-height:60px;flex:1 1 auto}.q-uploader__file{border-radius:4px 4px 0 0;border:1px solid rgba(0,0,0,.12)}.q-uploader__file .q-circular-progress{font-size:24px}.q-uploader__file--img{color:#fff;height:200px;min-width:200px;background-position:50% 50%;background-repeat:no-repeat}.q-uploader__file--img:before{content:none}.q-uploader__file--img .q-circular-progress{color:#fff}.q-uploader__file--img .q-uploader__file-header{padding-bottom:24px;background:linear-gradient(to bottom,rgba(0,0,0,.7) 20%,rgba(255,255,255,0))}.q-uploader__file+.q-uploader__file{margin-top:8px}.q-uploader__file-header{position:relative;padding:4px 8px;border-top-left-radius:inherit;border-top-right-radius:inherit}.q-uploader__file-header-content{padding-right:8px}.q-uploader__file-status{font-size:24px;margin-right:4px}.q-uploader__title{font-size:14px;font-weight:700;line-height:1.285714;word-break:break-word}.q-uploader__subtitle{font-size:12px;line-height:1.5}.q-uploader--disable .q-uploader__header,.q-uploader--disable .q-uploader__list{pointer-events:none}.q-uploader--dark{border-color:rgba(255,255,255,.28);box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}.q-uploader--dark .q-uploader__file{border-color:rgba(255,255,255,.28)}.q-uploader--dark .q-uploader__dnd,.q-uploader--dark .q-uploader__overlay{background:rgba(255,255,255,.3)}.q-uploader--dark .q-uploader__overlay{color:#fff}img.responsive{max-width:100%;height:auto}.q-video{position:relative;overflow:hidden;border-radius:inherit}.q-video embed,.q-video iframe,.q-video object{width:100%;height:100%}.q-video--responsive{height:0}.q-video--responsive embed,.q-video--responsive iframe,.q-video--responsive object{position:absolute;top:0;left:0}.q-virtual-scroll:focus{outline:0}.q-virtual-scroll__content{outline:0;contain:content}.q-virtual-scroll__content>*{overflow-anchor:none}.q-virtual-scroll__content>[data-q-vs-anchor]{overflow-anchor:auto}.q-virtual-scroll__padding{background:linear-gradient(rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,100%) var(--q-virtual-scroll-item-height,50px)}.q-table .q-virtual-scroll__padding tr{height:0!important}.q-table .q-virtual-scroll__padding td{padding:0!important}.q-virtual-scroll--horizontal{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:stretch}.q-virtual-scroll--horizontal .q-virtual-scroll__content{display:flex;flex-direction:row;flex-wrap:nowrap}.q-virtual-scroll--horizontal .q-virtual-scroll__content,.q-virtual-scroll--horizontal .q-virtual-scroll__content>*,.q-virtual-scroll--horizontal .q-virtual-scroll__padding{flex:0 0 auto}.q-virtual-scroll--horizontal .q-virtual-scroll__padding{background:linear-gradient(to left,rgba(255,255,255,0),rgba(255,255,255,0) 20%,rgba(128,128,128,.03) 20%,rgba(128,128,128,.08) 50%,rgba(128,128,128,.03) 80%,rgba(255,255,255,0) 80%,rgba(255,255,255,0));background-size:var(--q-virtual-scroll-item-width,50px) var(--q-virtual-scroll-item-height,100%)}.q-ripple{position:absolute;top:0;left:0;width:100%;height:100%;color:inherit;border-radius:inherit;z-index:0;pointer-events:none;overflow:hidden;contain:strict}.q-ripple__inner{position:absolute;top:0;left:0;opacity:0;color:inherit;border-radius:50%;background:currentColor;pointer-events:none;will-change:transform,opacity}.q-ripple__inner--enter{transition:transform 225ms cubic-bezier(.4, 0, .2, 1),opacity .1s cubic-bezier(.4, 0, .2, 1)}.q-ripple__inner--leave{transition:opacity .25s cubic-bezier(.4, 0, .2, 1)}.q-morph--internal,.q-morph--invisible{opacity:0!important;pointer-events:none!important;position:fixed!important;right:200vw!important;bottom:200vh!important}.q-bottom-sheet{padding-bottom:8px}.q-bottom-sheet__avatar{border-radius:50%}.q-bottom-sheet--list{width:400px}.q-bottom-sheet--list .q-icon,.q-bottom-sheet--list img{font-size:24px;width:24px;height:24px}.q-bottom-sheet--grid{width:700px}.q-bottom-sheet--grid .q-bottom-sheet__item{padding:8px;text-align:center;min-width:100px}.q-bottom-sheet--grid .q-bottom-sheet__empty-icon,.q-bottom-sheet--grid .q-icon,.q-bottom-sheet--grid img{font-size:48px;width:48px;height:48px;margin-bottom:8px}.q-bottom-sheet--grid .q-separator{margin:12px 0}.q-bottom-sheet__item{flex:0 0 33.3333%}@media (min-width:600px){.q-bottom-sheet__item{flex:0 0 25%}}.q-dialog-plugin{width:400px}.q-dialog-plugin__form{max-height:50vh}.q-dialog-plugin .q-card__section+.q-card__section{padding-top:0}.q-dialog-plugin--progress{text-align:center}.q-loading{color:#000;position:fixed!important}.q-loading__backdrop{position:fixed;top:0;right:0;bottom:0;left:0;opacity:.5;z-index:-1;background-color:#000;transition:background-color .28s}.q-loading__box{border-radius:4px;padding:18px;color:#fff;max-width:450px}.q-loading__message{margin:40px 20px 0;text-align:center}.q-notifications__list{z-index:9500;pointer-events:none;left:0;right:0;margin-bottom:10px;position:relative}.q-notifications__list--center{top:0;bottom:0}.q-notifications__list--top{top:0}.q-notifications__list--bottom{bottom:0}body.q-ios-padding .q-notifications__list--center,body.q-ios-padding .q-notifications__list--top{top:20px;top:env(safe-area-inset-top)}body.q-ios-padding .q-notifications__list--bottom,body.q-ios-padding .q-notifications__list--center{bottom:env(safe-area-inset-bottom)}.q-notification{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12);border-radius:4px;pointer-events:all;display:inline-flex;margin:10px 10px 0;transition:transform 1s,opacity 1s;z-index:9500;flex-shrink:0;max-width:95vw;background:#323232;color:#fff;font-size:14px}.q-notification__icon{font-size:24px;flex:0 0 1em}.q-notification__icon--additional{margin-right:16px}.q-notification__avatar{font-size:32px}.q-notification__avatar--additional{margin-right:8px}.q-notification__spinner{font-size:32px}.q-notification__spinner--additional{margin-right:8px}.q-notification__message{padding:8px 0}.q-notification__caption{font-size:.9em;opacity:.7}.q-notification__actions{color:var(--q-primary)}.q-notification__badge{animation:q-notif-badge .42s;padding:4px 8px;position:absolute;box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12);background-color:var(--q-negative);color:#fff;border-radius:4px;font-size:12px;line-height:12px}.q-notification__badge--top-left,.q-notification__badge--top-right{top:-6px}.q-notification__badge--bottom-left,.q-notification__badge--bottom-right{bottom:-6px}.q-notification__badge--bottom-left,.q-notification__badge--top-left{left:-22px}.q-notification__badge--bottom-right,.q-notification__badge--top-right{right:-22px}.q-notification__progress{z-index:-1;position:absolute;height:3px;bottom:0;left:-10px;right:-10px;animation:q-notif-progress linear;background:currentColor;opacity:.3;border-radius:4px 4px 0 0;transform-origin:0 50%;transform:scaleX(0)}.q-notification--standard{padding:0 16px;min-height:48px}.q-notification--standard .q-notification__actions{padding:6px 0 6px 8px;margin-right:-8px}.q-notification--multi-line{min-height:68px;padding:8px 16px}.q-notification--multi-line .q-notification__badge--top-left,.q-notification--multi-line .q-notification__badge--top-right{top:-15px}.q-notification--multi-line .q-notification__badge--bottom-left,.q-notification--multi-line .q-notification__badge--bottom-right{bottom:-15px}.q-notification--multi-line .q-notification__progress{bottom:-8px}.q-notification--multi-line .q-notification__actions{padding:0}.q-notification--multi-line .q-notification__actions--with-media{padding-left:25px}.q-notification--top-enter-from,.q-notification--top-leave-to,.q-notification--top-left-enter-from,.q-notification--top-left-leave-to,.q-notification--top-right-enter-from,.q-notification--top-right-leave-to{opacity:0;transform:translateY(-50px);z-index:9499}.q-notification--center-enter-from,.q-notification--center-leave-to,.q-notification--left-enter-from,.q-notification--left-leave-to,.q-notification--right-enter-from,.q-notification--right-leave-to{opacity:0;transform:rotateX(90deg);z-index:9499}.q-notification--bottom-enter-from,.q-notification--bottom-leave-to,.q-notification--bottom-left-enter-from,.q-notification--bottom-left-leave-to,.q-notification--bottom-right-enter-from,.q-notification--bottom-right-leave-to{opacity:0;transform:translateY(50px);z-index:9499}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active,.q-notification--center-leave-active,.q-notification--left-leave-active,.q-notification--right-leave-active,.q-notification--top-leave-active,.q-notification--top-left-leave-active,.q-notification--top-right-leave-active{position:absolute;z-index:9499;margin-left:0;margin-right:0}.q-notification--center-leave-active,.q-notification--top-leave-active{top:0}.q-notification--bottom-leave-active,.q-notification--bottom-left-leave-active,.q-notification--bottom-right-leave-active{bottom:0}@media (min-width:600px){.q-notification{max-width:65vw}}@keyframes q-notif-badge{15%{transform:translate3d(-25%,0,0) rotate3d(0,0,1,-5deg)}30%{transform:translate3d(20%,0,0) rotate3d(0,0,1,3deg)}45%{transform:translate3d(-15%,0,0) rotate3d(0,0,1,-3deg)}60%{transform:translate3d(10%,0,0) rotate3d(0,0,1,2deg)}75%{transform:translate3d(-5%,0,0) rotate3d(0,0,1,-1deg)}}@keyframes q-notif-progress{0%{transform:scaleX(1)}100%{transform:scaleX(0)}}:root{--animate-duration:0.3s;--animate-delay:0.3s;--animate-repeat:1}.animated{animation-duration:var(--animate-duration);animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.repeat-1{animation-iteration-count:var(--animate-repeat)}.animated.repeat-2{animation-iteration-count:calc(var(--animate-repeat) * 2)}.animated.repeat-3{animation-iteration-count:calc(var(--animate-repeat) * 3)}.animated.delay-1s{animation-delay:var(--animate-delay)}.animated.delay-2s{animation-delay:calc(var(--animate-delay) * 2)}.animated.delay-3s{animation-delay:calc(var(--animate-delay) * 3)}.animated.delay-4s{animation-delay:calc(var(--animate-delay) * 4)}.animated.delay-5s{animation-delay:calc(var(--animate-delay) * 5)}.animated.faster{animation-duration:calc(var(--animate-duration) / 2)}.animated.fast{animation-duration:calc(var(--animate-duration) * .8)}.animated.slow{animation-duration:calc(var(--animate-duration) * 2)}.animated.slower{animation-duration:calc(var(--animate-duration) * 3)}@media print,(prefers-reduced-motion:reduce){.animated{animation-duration:1ms!important;transition-duration:1ms!important;animation-iteration-count:1!important}.animated[class*=Out]{opacity:0}}.q-animate--scale{animation:q-scale .15s;animation-timing-function:cubic-bezier(0.25,0.8,0.25,1)}@keyframes q-scale{0%{transform:scale(1)}50%{transform:scale(1.04)}100%{transform:scale(1)}}.q-animate--fade{animation:q-fade .2s}@keyframes q-fade{0%{opacity:0}100%{opacity:1}}:root{--q-primary:#1976D2;--q-secondary:#26A69A;--q-accent:#9C27B0;--q-positive:#21BA45;--q-negative:#C10015;--q-info:#31CCEC;--q-warning:#F2C037;--q-dark:#1d1d1d;--q-dark-page:#121212}.text-dark{color:var(--q-dark)!important}.bg-dark{background:var(--q-dark)!important}.text-primary{color:var(--q-primary)!important}.bg-primary{background:var(--q-primary)!important}.text-secondary{color:var(--q-secondary)!important}.bg-secondary{background:var(--q-secondary)!important}.text-accent{color:var(--q-accent)!important}.bg-accent{background:var(--q-accent)!important}.text-positive{color:var(--q-positive)!important}.bg-positive{background:var(--q-positive)!important}.text-negative{color:var(--q-negative)!important}.bg-negative{background:var(--q-negative)!important}.text-info{color:var(--q-info)!important}.bg-info{background:var(--q-info)!important}.text-warning{color:var(--q-warning)!important}.bg-warning{background:var(--q-warning)!important}.text-white{color:#fff!important}.bg-white{background:#fff!important}.text-black{color:#000!important}.bg-black{background:#000!important}.text-transparent{color:transparent!important}.bg-transparent{background:0 0!important}.text-separator{color:rgba(0,0,0,.12)!important}.bg-separator{background:rgba(0,0,0,.12)!important}.text-dark-separator{color:rgba(255,255,255,.28)!important}.bg-dark-separator{background:rgba(255,255,255,.28)!important}.text-red{color:#f44336!important}.text-red-1{color:#ffebee!important}.text-red-2{color:#ffcdd2!important}.text-red-3{color:#ef9a9a!important}.text-red-4{color:#e57373!important}.text-red-5{color:#ef5350!important}.text-red-6{color:#f44336!important}.text-red-7{color:#e53935!important}.text-red-8{color:#d32f2f!important}.text-red-9{color:#c62828!important}.text-red-10{color:#b71c1c!important}.text-red-11{color:#ff8a80!important}.text-red-12{color:#ff5252!important}.text-red-13{color:#ff1744!important}.text-red-14{color:#d50000!important}.text-pink{color:#e91e63!important}.text-pink-1{color:#fce4ec!important}.text-pink-2{color:#f8bbd0!important}.text-pink-3{color:#f48fb1!important}.text-pink-4{color:#f06292!important}.text-pink-5{color:#ec407a!important}.text-pink-6{color:#e91e63!important}.text-pink-7{color:#d81b60!important}.text-pink-8{color:#c2185b!important}.text-pink-9{color:#ad1457!important}.text-pink-10{color:#880e4f!important}.text-pink-11{color:#ff80ab!important}.text-pink-12{color:#ff4081!important}.text-pink-13{color:#f50057!important}.text-pink-14{color:#c51162!important}.text-purple{color:#9c27b0!important}.text-purple-1{color:#f3e5f5!important}.text-purple-2{color:#e1bee7!important}.text-purple-3{color:#ce93d8!important}.text-purple-4{color:#ba68c8!important}.text-purple-5{color:#ab47bc!important}.text-purple-6{color:#9c27b0!important}.text-purple-7{color:#8e24aa!important}.text-purple-8{color:#7b1fa2!important}.text-purple-9{color:#6a1b9a!important}.text-purple-10{color:#4a148c!important}.text-purple-11{color:#ea80fc!important}.text-purple-12{color:#e040fb!important}.text-purple-13{color:#d500f9!important}.text-purple-14{color:#a0f!important}.text-deep-purple{color:#673ab7!important}.text-deep-purple-1{color:#ede7f6!important}.text-deep-purple-2{color:#d1c4e9!important}.text-deep-purple-3{color:#b39ddb!important}.text-deep-purple-4{color:#9575cd!important}.text-deep-purple-5{color:#7e57c2!important}.text-deep-purple-6{color:#673ab7!important}.text-deep-purple-7{color:#5e35b1!important}.text-deep-purple-8{color:#512da8!important}.text-deep-purple-9{color:#4527a0!important}.text-deep-purple-10{color:#311b92!important}.text-deep-purple-11{color:#b388ff!important}.text-deep-purple-12{color:#7c4dff!important}.text-deep-purple-13{color:#651fff!important}.text-deep-purple-14{color:#6200ea!important}.text-indigo{color:#3f51b5!important}.text-indigo-1{color:#e8eaf6!important}.text-indigo-2{color:#c5cae9!important}.text-indigo-3{color:#9fa8da!important}.text-indigo-4{color:#7986cb!important}.text-indigo-5{color:#5c6bc0!important}.text-indigo-6{color:#3f51b5!important}.text-indigo-7{color:#3949ab!important}.text-indigo-8{color:#303f9f!important}.text-indigo-9{color:#283593!important}.text-indigo-10{color:#1a237e!important}.text-indigo-11{color:#8c9eff!important}.text-indigo-12{color:#536dfe!important}.text-indigo-13{color:#3d5afe!important}.text-indigo-14{color:#304ffe!important}.text-blue{color:#2196f3!important}.text-blue-1{color:#e3f2fd!important}.text-blue-2{color:#bbdefb!important}.text-blue-3{color:#90caf9!important}.text-blue-4{color:#64b5f6!important}.text-blue-5{color:#42a5f5!important}.text-blue-6{color:#2196f3!important}.text-blue-7{color:#1e88e5!important}.text-blue-8{color:#1976d2!important}.text-blue-9{color:#1565c0!important}.text-blue-10{color:#0d47a1!important}.text-blue-11{color:#82b1ff!important}.text-blue-12{color:#448aff!important}.text-blue-13{color:#2979ff!important}.text-blue-14{color:#2962ff!important}.text-light-blue{color:#03a9f4!important}.text-light-blue-1{color:#e1f5fe!important}.text-light-blue-2{color:#b3e5fc!important}.text-light-blue-3{color:#81d4fa!important}.text-light-blue-4{color:#4fc3f7!important}.text-light-blue-5{color:#29b6f6!important}.text-light-blue-6{color:#03a9f4!important}.text-light-blue-7{color:#039be5!important}.text-light-blue-8{color:#0288d1!important}.text-light-blue-9{color:#0277bd!important}.text-light-blue-10{color:#01579b!important}.text-light-blue-11{color:#80d8ff!important}.text-light-blue-12{color:#40c4ff!important}.text-light-blue-13{color:#00b0ff!important}.text-light-blue-14{color:#0091ea!important}.text-cyan{color:#00bcd4!important}.text-cyan-1{color:#e0f7fa!important}.text-cyan-2{color:#b2ebf2!important}.text-cyan-3{color:#80deea!important}.text-cyan-4{color:#4dd0e1!important}.text-cyan-5{color:#26c6da!important}.text-cyan-6{color:#00bcd4!important}.text-cyan-7{color:#00acc1!important}.text-cyan-8{color:#0097a7!important}.text-cyan-9{color:#00838f!important}.text-cyan-10{color:#006064!important}.text-cyan-11{color:#84ffff!important}.text-cyan-12{color:#18ffff!important}.text-cyan-13{color:#00e5ff!important}.text-cyan-14{color:#00b8d4!important}.text-teal{color:#009688!important}.text-teal-1{color:#e0f2f1!important}.text-teal-2{color:#b2dfdb!important}.text-teal-3{color:#80cbc4!important}.text-teal-4{color:#4db6ac!important}.text-teal-5{color:#26a69a!important}.text-teal-6{color:#009688!important}.text-teal-7{color:#00897b!important}.text-teal-8{color:#00796b!important}.text-teal-9{color:#00695c!important}.text-teal-10{color:#004d40!important}.text-teal-11{color:#a7ffeb!important}.text-teal-12{color:#64ffda!important}.text-teal-13{color:#1de9b6!important}.text-teal-14{color:#00bfa5!important}.text-green{color:#4caf50!important}.text-green-1{color:#e8f5e9!important}.text-green-2{color:#c8e6c9!important}.text-green-3{color:#a5d6a7!important}.text-green-4{color:#81c784!important}.text-green-5{color:#66bb6a!important}.text-green-6{color:#4caf50!important}.text-green-7{color:#43a047!important}.text-green-8{color:#388e3c!important}.text-green-9{color:#2e7d32!important}.text-green-10{color:#1b5e20!important}.text-green-11{color:#b9f6ca!important}.text-green-12{color:#69f0ae!important}.text-green-13{color:#00e676!important}.text-green-14{color:#00c853!important}.text-light-green{color:#8bc34a!important}.text-light-green-1{color:#f1f8e9!important}.text-light-green-2{color:#dcedc8!important}.text-light-green-3{color:#c5e1a5!important}.text-light-green-4{color:#aed581!important}.text-light-green-5{color:#9ccc65!important}.text-light-green-6{color:#8bc34a!important}.text-light-green-7{color:#7cb342!important}.text-light-green-8{color:#689f38!important}.text-light-green-9{color:#558b2f!important}.text-light-green-10{color:#33691e!important}.text-light-green-11{color:#ccff90!important}.text-light-green-12{color:#b2ff59!important}.text-light-green-13{color:#76ff03!important}.text-light-green-14{color:#64dd17!important}.text-lime{color:#cddc39!important}.text-lime-1{color:#f9fbe7!important}.text-lime-2{color:#f0f4c3!important}.text-lime-3{color:#e6ee9c!important}.text-lime-4{color:#dce775!important}.text-lime-5{color:#d4e157!important}.text-lime-6{color:#cddc39!important}.text-lime-7{color:#c0ca33!important}.text-lime-8{color:#afb42b!important}.text-lime-9{color:#9e9d24!important}.text-lime-10{color:#827717!important}.text-lime-11{color:#f4ff81!important}.text-lime-12{color:#eeff41!important}.text-lime-13{color:#c6ff00!important}.text-lime-14{color:#aeea00!important}.text-yellow{color:#ffeb3b!important}.text-yellow-1{color:#fffde7!important}.text-yellow-2{color:#fff9c4!important}.text-yellow-3{color:#fff59d!important}.text-yellow-4{color:#fff176!important}.text-yellow-5{color:#ffee58!important}.text-yellow-6{color:#ffeb3b!important}.text-yellow-7{color:#fdd835!important}.text-yellow-8{color:#fbc02d!important}.text-yellow-9{color:#f9a825!important}.text-yellow-10{color:#f57f17!important}.text-yellow-11{color:#ffff8d!important}.text-yellow-12{color:#ff0!important}.text-yellow-13{color:#ffea00!important}.text-yellow-14{color:#ffd600!important}.text-amber{color:#ffc107!important}.text-amber-1{color:#fff8e1!important}.text-amber-2{color:#ffecb3!important}.text-amber-3{color:#ffe082!important}.text-amber-4{color:#ffd54f!important}.text-amber-5{color:#ffca28!important}.text-amber-6{color:#ffc107!important}.text-amber-7{color:#ffb300!important}.text-amber-8{color:#ffa000!important}.text-amber-9{color:#ff8f00!important}.text-amber-10{color:#ff6f00!important}.text-amber-11{color:#ffe57f!important}.text-amber-12{color:#ffd740!important}.text-amber-13{color:#ffc400!important}.text-amber-14{color:#ffab00!important}.text-orange{color:#ff9800!important}.text-orange-1{color:#fff3e0!important}.text-orange-2{color:#ffe0b2!important}.text-orange-3{color:#ffcc80!important}.text-orange-4{color:#ffb74d!important}.text-orange-5{color:#ffa726!important}.text-orange-6{color:#ff9800!important}.text-orange-7{color:#fb8c00!important}.text-orange-8{color:#f57c00!important}.text-orange-9{color:#ef6c00!important}.text-orange-10{color:#e65100!important}.text-orange-11{color:#ffd180!important}.text-orange-12{color:#ffab40!important}.text-orange-13{color:#ff9100!important}.text-orange-14{color:#ff6d00!important}.text-deep-orange{color:#ff5722!important}.text-deep-orange-1{color:#fbe9e7!important}.text-deep-orange-2{color:#ffccbc!important}.text-deep-orange-3{color:#ffab91!important}.text-deep-orange-4{color:#ff8a65!important}.text-deep-orange-5{color:#ff7043!important}.text-deep-orange-6{color:#ff5722!important}.text-deep-orange-7{color:#f4511e!important}.text-deep-orange-8{color:#e64a19!important}.text-deep-orange-9{color:#d84315!important}.text-deep-orange-10{color:#bf360c!important}.text-deep-orange-11{color:#ff9e80!important}.text-deep-orange-12{color:#ff6e40!important}.text-deep-orange-13{color:#ff3d00!important}.text-deep-orange-14{color:#dd2c00!important}.text-brown{color:#795548!important}.text-brown-1{color:#efebe9!important}.text-brown-2{color:#d7ccc8!important}.text-brown-3{color:#bcaaa4!important}.text-brown-4{color:#a1887f!important}.text-brown-5{color:#8d6e63!important}.text-brown-6{color:#795548!important}.text-brown-7{color:#6d4c41!important}.text-brown-8{color:#5d4037!important}.text-brown-9{color:#4e342e!important}.text-brown-10{color:#3e2723!important}.text-brown-11{color:#d7ccc8!important}.text-brown-12{color:#bcaaa4!important}.text-brown-13{color:#8d6e63!important}.text-brown-14{color:#5d4037!important}.text-grey{color:#9e9e9e!important}.text-grey-1{color:#fafafa!important}.text-grey-2{color:#f5f5f5!important}.text-grey-3{color:#eee!important}.text-grey-4{color:#e0e0e0!important}.text-grey-5{color:#bdbdbd!important}.text-grey-6{color:#9e9e9e!important}.text-grey-7{color:#757575!important}.text-grey-8{color:#616161!important}.text-grey-9{color:#424242!important}.text-grey-10{color:#212121!important}.text-grey-11{color:#f5f5f5!important}.text-grey-12{color:#eee!important}.text-grey-13{color:#bdbdbd!important}.text-grey-14{color:#616161!important}.text-blue-grey{color:#607d8b!important}.text-blue-grey-1{color:#eceff1!important}.text-blue-grey-2{color:#cfd8dc!important}.text-blue-grey-3{color:#b0bec5!important}.text-blue-grey-4{color:#90a4ae!important}.text-blue-grey-5{color:#78909c!important}.text-blue-grey-6{color:#607d8b!important}.text-blue-grey-7{color:#546e7a!important}.text-blue-grey-8{color:#455a64!important}.text-blue-grey-9{color:#37474f!important}.text-blue-grey-10{color:#263238!important}.text-blue-grey-11{color:#cfd8dc!important}.text-blue-grey-12{color:#b0bec5!important}.text-blue-grey-13{color:#78909c!important}.text-blue-grey-14{color:#455a64!important}.bg-red{background:#f44336!important}.bg-red-1{background:#ffebee!important}.bg-red-2{background:#ffcdd2!important}.bg-red-3{background:#ef9a9a!important}.bg-red-4{background:#e57373!important}.bg-red-5{background:#ef5350!important}.bg-red-6{background:#f44336!important}.bg-red-7{background:#e53935!important}.bg-red-8{background:#d32f2f!important}.bg-red-9{background:#c62828!important}.bg-red-10{background:#b71c1c!important}.bg-red-11{background:#ff8a80!important}.bg-red-12{background:#ff5252!important}.bg-red-13{background:#ff1744!important}.bg-red-14{background:#d50000!important}.bg-pink{background:#e91e63!important}.bg-pink-1{background:#fce4ec!important}.bg-pink-2{background:#f8bbd0!important}.bg-pink-3{background:#f48fb1!important}.bg-pink-4{background:#f06292!important}.bg-pink-5{background:#ec407a!important}.bg-pink-6{background:#e91e63!important}.bg-pink-7{background:#d81b60!important}.bg-pink-8{background:#c2185b!important}.bg-pink-9{background:#ad1457!important}.bg-pink-10{background:#880e4f!important}.bg-pink-11{background:#ff80ab!important}.bg-pink-12{background:#ff4081!important}.bg-pink-13{background:#f50057!important}.bg-pink-14{background:#c51162!important}.bg-purple{background:#9c27b0!important}.bg-purple-1{background:#f3e5f5!important}.bg-purple-2{background:#e1bee7!important}.bg-purple-3{background:#ce93d8!important}.bg-purple-4{background:#ba68c8!important}.bg-purple-5{background:#ab47bc!important}.bg-purple-6{background:#9c27b0!important}.bg-purple-7{background:#8e24aa!important}.bg-purple-8{background:#7b1fa2!important}.bg-purple-9{background:#6a1b9a!important}.bg-purple-10{background:#4a148c!important}.bg-purple-11{background:#ea80fc!important}.bg-purple-12{background:#e040fb!important}.bg-purple-13{background:#d500f9!important}.bg-purple-14{background:#a0f!important}.bg-deep-purple{background:#673ab7!important}.bg-deep-purple-1{background:#ede7f6!important}.bg-deep-purple-2{background:#d1c4e9!important}.bg-deep-purple-3{background:#b39ddb!important}.bg-deep-purple-4{background:#9575cd!important}.bg-deep-purple-5{background:#7e57c2!important}.bg-deep-purple-6{background:#673ab7!important}.bg-deep-purple-7{background:#5e35b1!important}.bg-deep-purple-8{background:#512da8!important}.bg-deep-purple-9{background:#4527a0!important}.bg-deep-purple-10{background:#311b92!important}.bg-deep-purple-11{background:#b388ff!important}.bg-deep-purple-12{background:#7c4dff!important}.bg-deep-purple-13{background:#651fff!important}.bg-deep-purple-14{background:#6200ea!important}.bg-indigo{background:#3f51b5!important}.bg-indigo-1{background:#e8eaf6!important}.bg-indigo-2{background:#c5cae9!important}.bg-indigo-3{background:#9fa8da!important}.bg-indigo-4{background:#7986cb!important}.bg-indigo-5{background:#5c6bc0!important}.bg-indigo-6{background:#3f51b5!important}.bg-indigo-7{background:#3949ab!important}.bg-indigo-8{background:#303f9f!important}.bg-indigo-9{background:#283593!important}.bg-indigo-10{background:#1a237e!important}.bg-indigo-11{background:#8c9eff!important}.bg-indigo-12{background:#536dfe!important}.bg-indigo-13{background:#3d5afe!important}.bg-indigo-14{background:#304ffe!important}.bg-blue{background:#2196f3!important}.bg-blue-1{background:#e3f2fd!important}.bg-blue-2{background:#bbdefb!important}.bg-blue-3{background:#90caf9!important}.bg-blue-4{background:#64b5f6!important}.bg-blue-5{background:#42a5f5!important}.bg-blue-6{background:#2196f3!important}.bg-blue-7{background:#1e88e5!important}.bg-blue-8{background:#1976d2!important}.bg-blue-9{background:#1565c0!important}.bg-blue-10{background:#0d47a1!important}.bg-blue-11{background:#82b1ff!important}.bg-blue-12{background:#448aff!important}.bg-blue-13{background:#2979ff!important}.bg-blue-14{background:#2962ff!important}.bg-light-blue{background:#03a9f4!important}.bg-light-blue-1{background:#e1f5fe!important}.bg-light-blue-2{background:#b3e5fc!important}.bg-light-blue-3{background:#81d4fa!important}.bg-light-blue-4{background:#4fc3f7!important}.bg-light-blue-5{background:#29b6f6!important}.bg-light-blue-6{background:#03a9f4!important}.bg-light-blue-7{background:#039be5!important}.bg-light-blue-8{background:#0288d1!important}.bg-light-blue-9{background:#0277bd!important}.bg-light-blue-10{background:#01579b!important}.bg-light-blue-11{background:#80d8ff!important}.bg-light-blue-12{background:#40c4ff!important}.bg-light-blue-13{background:#00b0ff!important}.bg-light-blue-14{background:#0091ea!important}.bg-cyan{background:#00bcd4!important}.bg-cyan-1{background:#e0f7fa!important}.bg-cyan-2{background:#b2ebf2!important}.bg-cyan-3{background:#80deea!important}.bg-cyan-4{background:#4dd0e1!important}.bg-cyan-5{background:#26c6da!important}.bg-cyan-6{background:#00bcd4!important}.bg-cyan-7{background:#00acc1!important}.bg-cyan-8{background:#0097a7!important}.bg-cyan-9{background:#00838f!important}.bg-cyan-10{background:#006064!important}.bg-cyan-11{background:#84ffff!important}.bg-cyan-12{background:#18ffff!important}.bg-cyan-13{background:#00e5ff!important}.bg-cyan-14{background:#00b8d4!important}.bg-teal{background:#009688!important}.bg-teal-1{background:#e0f2f1!important}.bg-teal-2{background:#b2dfdb!important}.bg-teal-3{background:#80cbc4!important}.bg-teal-4{background:#4db6ac!important}.bg-teal-5{background:#26a69a!important}.bg-teal-6{background:#009688!important}.bg-teal-7{background:#00897b!important}.bg-teal-8{background:#00796b!important}.bg-teal-9{background:#00695c!important}.bg-teal-10{background:#004d40!important}.bg-teal-11{background:#a7ffeb!important}.bg-teal-12{background:#64ffda!important}.bg-teal-13{background:#1de9b6!important}.bg-teal-14{background:#00bfa5!important}.bg-green{background:#4caf50!important}.bg-green-1{background:#e8f5e9!important}.bg-green-2{background:#c8e6c9!important}.bg-green-3{background:#a5d6a7!important}.bg-green-4{background:#81c784!important}.bg-green-5{background:#66bb6a!important}.bg-green-6{background:#4caf50!important}.bg-green-7{background:#43a047!important}.bg-green-8{background:#388e3c!important}.bg-green-9{background:#2e7d32!important}.bg-green-10{background:#1b5e20!important}.bg-green-11{background:#b9f6ca!important}.bg-green-12{background:#69f0ae!important}.bg-green-13{background:#00e676!important}.bg-green-14{background:#00c853!important}.bg-light-green{background:#8bc34a!important}.bg-light-green-1{background:#f1f8e9!important}.bg-light-green-2{background:#dcedc8!important}.bg-light-green-3{background:#c5e1a5!important}.bg-light-green-4{background:#aed581!important}.bg-light-green-5{background:#9ccc65!important}.bg-light-green-6{background:#8bc34a!important}.bg-light-green-7{background:#7cb342!important}.bg-light-green-8{background:#689f38!important}.bg-light-green-9{background:#558b2f!important}.bg-light-green-10{background:#33691e!important}.bg-light-green-11{background:#ccff90!important}.bg-light-green-12{background:#b2ff59!important}.bg-light-green-13{background:#76ff03!important}.bg-light-green-14{background:#64dd17!important}.bg-lime{background:#cddc39!important}.bg-lime-1{background:#f9fbe7!important}.bg-lime-2{background:#f0f4c3!important}.bg-lime-3{background:#e6ee9c!important}.bg-lime-4{background:#dce775!important}.bg-lime-5{background:#d4e157!important}.bg-lime-6{background:#cddc39!important}.bg-lime-7{background:#c0ca33!important}.bg-lime-8{background:#afb42b!important}.bg-lime-9{background:#9e9d24!important}.bg-lime-10{background:#827717!important}.bg-lime-11{background:#f4ff81!important}.bg-lime-12{background:#eeff41!important}.bg-lime-13{background:#c6ff00!important}.bg-lime-14{background:#aeea00!important}.bg-yellow{background:#ffeb3b!important}.bg-yellow-1{background:#fffde7!important}.bg-yellow-2{background:#fff9c4!important}.bg-yellow-3{background:#fff59d!important}.bg-yellow-4{background:#fff176!important}.bg-yellow-5{background:#ffee58!important}.bg-yellow-6{background:#ffeb3b!important}.bg-yellow-7{background:#fdd835!important}.bg-yellow-8{background:#fbc02d!important}.bg-yellow-9{background:#f9a825!important}.bg-yellow-10{background:#f57f17!important}.bg-yellow-11{background:#ffff8d!important}.bg-yellow-12{background:#ff0!important}.bg-yellow-13{background:#ffea00!important}.bg-yellow-14{background:#ffd600!important}.bg-amber{background:#ffc107!important}.bg-amber-1{background:#fff8e1!important}.bg-amber-2{background:#ffecb3!important}.bg-amber-3{background:#ffe082!important}.bg-amber-4{background:#ffd54f!important}.bg-amber-5{background:#ffca28!important}.bg-amber-6{background:#ffc107!important}.bg-amber-7{background:#ffb300!important}.bg-amber-8{background:#ffa000!important}.bg-amber-9{background:#ff8f00!important}.bg-amber-10{background:#ff6f00!important}.bg-amber-11{background:#ffe57f!important}.bg-amber-12{background:#ffd740!important}.bg-amber-13{background:#ffc400!important}.bg-amber-14{background:#ffab00!important}.bg-orange{background:#ff9800!important}.bg-orange-1{background:#fff3e0!important}.bg-orange-2{background:#ffe0b2!important}.bg-orange-3{background:#ffcc80!important}.bg-orange-4{background:#ffb74d!important}.bg-orange-5{background:#ffa726!important}.bg-orange-6{background:#ff9800!important}.bg-orange-7{background:#fb8c00!important}.bg-orange-8{background:#f57c00!important}.bg-orange-9{background:#ef6c00!important}.bg-orange-10{background:#e65100!important}.bg-orange-11{background:#ffd180!important}.bg-orange-12{background:#ffab40!important}.bg-orange-13{background:#ff9100!important}.bg-orange-14{background:#ff6d00!important}.bg-deep-orange{background:#ff5722!important}.bg-deep-orange-1{background:#fbe9e7!important}.bg-deep-orange-2{background:#ffccbc!important}.bg-deep-orange-3{background:#ffab91!important}.bg-deep-orange-4{background:#ff8a65!important}.bg-deep-orange-5{background:#ff7043!important}.bg-deep-orange-6{background:#ff5722!important}.bg-deep-orange-7{background:#f4511e!important}.bg-deep-orange-8{background:#e64a19!important}.bg-deep-orange-9{background:#d84315!important}.bg-deep-orange-10{background:#bf360c!important}.bg-deep-orange-11{background:#ff9e80!important}.bg-deep-orange-12{background:#ff6e40!important}.bg-deep-orange-13{background:#ff3d00!important}.bg-deep-orange-14{background:#dd2c00!important}.bg-brown{background:#795548!important}.bg-brown-1{background:#efebe9!important}.bg-brown-2{background:#d7ccc8!important}.bg-brown-3{background:#bcaaa4!important}.bg-brown-4{background:#a1887f!important}.bg-brown-5{background:#8d6e63!important}.bg-brown-6{background:#795548!important}.bg-brown-7{background:#6d4c41!important}.bg-brown-8{background:#5d4037!important}.bg-brown-9{background:#4e342e!important}.bg-brown-10{background:#3e2723!important}.bg-brown-11{background:#d7ccc8!important}.bg-brown-12{background:#bcaaa4!important}.bg-brown-13{background:#8d6e63!important}.bg-brown-14{background:#5d4037!important}.bg-grey{background:#9e9e9e!important}.bg-grey-1{background:#fafafa!important}.bg-grey-2{background:#f5f5f5!important}.bg-grey-3{background:#eee!important}.bg-grey-4{background:#e0e0e0!important}.bg-grey-5{background:#bdbdbd!important}.bg-grey-6{background:#9e9e9e!important}.bg-grey-7{background:#757575!important}.bg-grey-8{background:#616161!important}.bg-grey-9{background:#424242!important}.bg-grey-10{background:#212121!important}.bg-grey-11{background:#f5f5f5!important}.bg-grey-12{background:#eee!important}.bg-grey-13{background:#bdbdbd!important}.bg-grey-14{background:#616161!important}.bg-blue-grey{background:#607d8b!important}.bg-blue-grey-1{background:#eceff1!important}.bg-blue-grey-2{background:#cfd8dc!important}.bg-blue-grey-3{background:#b0bec5!important}.bg-blue-grey-4{background:#90a4ae!important}.bg-blue-grey-5{background:#78909c!important}.bg-blue-grey-6{background:#607d8b!important}.bg-blue-grey-7{background:#546e7a!important}.bg-blue-grey-8{background:#455a64!important}.bg-blue-grey-9{background:#37474f!important}.bg-blue-grey-10{background:#263238!important}.bg-blue-grey-11{background:#cfd8dc!important}.bg-blue-grey-12{background:#b0bec5!important}.bg-blue-grey-13{background:#78909c!important}.bg-blue-grey-14{background:#455a64!important}.shadow-transition{transition:box-shadow .28s cubic-bezier(.4, 0, .2, 1)!important}.shadow-1{box-shadow:0 1px 3px rgba(0,0,0,.2),0 1px 1px rgba(0,0,0,.14),0 2px 1px -1px rgba(0,0,0,.12)}.shadow-up-1{box-shadow:0 -1px 3px rgba(0,0,0,.2),0 -1px 1px rgba(0,0,0,.14),0 -2px 1px -1px rgba(0,0,0,.12)}.shadow-2{box-shadow:0 1px 5px rgba(0,0,0,.2),0 2px 2px rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12)}.shadow-up-2{box-shadow:0 -1px 5px rgba(0,0,0,.2),0 -2px 2px rgba(0,0,0,.14),0 -3px 1px -2px rgba(0,0,0,.12)}.shadow-3{box-shadow:0 1px 8px rgba(0,0,0,.2),0 3px 4px rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.12)}.shadow-up-3{box-shadow:0 -1px 8px rgba(0,0,0,.2),0 -3px 4px rgba(0,0,0,.14),0 -3px 3px -2px rgba(0,0,0,.12)}.shadow-4{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px rgba(0,0,0,.14),0 1px 10px rgba(0,0,0,.12)}.shadow-up-4{box-shadow:0 -2px 4px -1px rgba(0,0,0,.2),0 -4px 5px rgba(0,0,0,.14),0 -1px 10px rgba(0,0,0,.12)}.shadow-5{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 5px 8px rgba(0,0,0,.14),0 1px 14px rgba(0,0,0,.12)}.shadow-up-5{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -5px 8px rgba(0,0,0,.14),0 -1px 14px rgba(0,0,0,.12)}.shadow-6{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px rgba(0,0,0,.14),0 1px 18px rgba(0,0,0,.12)}.shadow-up-6{box-shadow:0 -3px 5px -1px rgba(0,0,0,.2),0 -6px 10px rgba(0,0,0,.14),0 -1px 18px rgba(0,0,0,.12)}.shadow-7{box-shadow:0 4px 5px -2px rgba(0,0,0,.2),0 7px 10px 1px rgba(0,0,0,.14),0 2px 16px 1px rgba(0,0,0,.12)}.shadow-up-7{box-shadow:0 -4px 5px -2px rgba(0,0,0,.2),0 -7px 10px 1px rgba(0,0,0,.14),0 -2px 16px 1px rgba(0,0,0,.12)}.shadow-8{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.shadow-up-8{box-shadow:0 -5px 5px -3px rgba(0,0,0,.2),0 -8px 10px 1px rgba(0,0,0,.14),0 -3px 14px 2px rgba(0,0,0,.12)}.shadow-9{box-shadow:0 5px 6px -3px rgba(0,0,0,.2),0 9px 12px 1px rgba(0,0,0,.14),0 3px 16px 2px rgba(0,0,0,.12)}.shadow-up-9{box-shadow:0 -5px 6px -3px rgba(0,0,0,.2),0 -9px 12px 1px rgba(0,0,0,.14),0 -3px 16px 2px rgba(0,0,0,.12)}.shadow-10{box-shadow:0 6px 6px -3px rgba(0,0,0,.2),0 10px 14px 1px rgba(0,0,0,.14),0 4px 18px 3px rgba(0,0,0,.12)}.shadow-up-10{box-shadow:0 -6px 6px -3px rgba(0,0,0,.2),0 -10px 14px 1px rgba(0,0,0,.14),0 -4px 18px 3px rgba(0,0,0,.12)}.shadow-11{box-shadow:0 6px 7px -4px rgba(0,0,0,.2),0 11px 15px 1px rgba(0,0,0,.14),0 4px 20px 3px rgba(0,0,0,.12)}.shadow-up-11{box-shadow:0 -6px 7px -4px rgba(0,0,0,.2),0 -11px 15px 1px rgba(0,0,0,.14),0 -4px 20px 3px rgba(0,0,0,.12)}.shadow-12{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.shadow-up-12{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -12px 17px 2px rgba(0,0,0,.14),0 -5px 22px 4px rgba(0,0,0,.12)}.shadow-13{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 13px 19px 2px rgba(0,0,0,.14),0 5px 24px 4px rgba(0,0,0,.12)}.shadow-up-13{box-shadow:0 -7px 8px -4px rgba(0,0,0,.2),0 -13px 19px 2px rgba(0,0,0,.14),0 -5px 24px 4px rgba(0,0,0,.12)}.shadow-14{box-shadow:0 7px 9px -4px rgba(0,0,0,.2),0 14px 21px 2px rgba(0,0,0,.14),0 5px 26px 4px rgba(0,0,0,.12)}.shadow-up-14{box-shadow:0 -7px 9px -4px rgba(0,0,0,.2),0 -14px 21px 2px rgba(0,0,0,.14),0 -5px 26px 4px rgba(0,0,0,.12)}.shadow-15{box-shadow:0 8px 9px -5px rgba(0,0,0,.2),0 15px 22px 2px rgba(0,0,0,.14),0 6px 28px 5px rgba(0,0,0,.12)}.shadow-up-15{box-shadow:0 -8px 9px -5px rgba(0,0,0,.2),0 -15px 22px 2px rgba(0,0,0,.14),0 -6px 28px 5px rgba(0,0,0,.12)}.shadow-16{box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12)}.shadow-up-16{box-shadow:0 -8px 10px -5px rgba(0,0,0,.2),0 -16px 24px 2px rgba(0,0,0,.14),0 -6px 30px 5px rgba(0,0,0,.12)}.shadow-17{box-shadow:0 8px 11px -5px rgba(0,0,0,.2),0 17px 26px 2px rgba(0,0,0,.14),0 6px 32px 5px rgba(0,0,0,.12)}.shadow-up-17{box-shadow:0 -8px 11px -5px rgba(0,0,0,.2),0 -17px 26px 2px rgba(0,0,0,.14),0 -6px 32px 5px rgba(0,0,0,.12)}.shadow-18{box-shadow:0 9px 11px -5px rgba(0,0,0,.2),0 18px 28px 2px rgba(0,0,0,.14),0 7px 34px 6px rgba(0,0,0,.12)}.shadow-up-18{box-shadow:0 -9px 11px -5px rgba(0,0,0,.2),0 -18px 28px 2px rgba(0,0,0,.14),0 -7px 34px 6px rgba(0,0,0,.12)}.shadow-19{box-shadow:0 9px 12px -6px rgba(0,0,0,.2),0 19px 29px 2px rgba(0,0,0,.14),0 7px 36px 6px rgba(0,0,0,.12)}.shadow-up-19{box-shadow:0 -9px 12px -6px rgba(0,0,0,.2),0 -19px 29px 2px rgba(0,0,0,.14),0 -7px 36px 6px rgba(0,0,0,.12)}.shadow-20{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 20px 31px 3px rgba(0,0,0,.14),0 8px 38px 7px rgba(0,0,0,.12)}.shadow-up-20{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -20px 31px 3px rgba(0,0,0,.14),0 -8px 38px 7px rgba(0,0,0,.12)}.shadow-21{box-shadow:0 10px 13px -6px rgba(0,0,0,.2),0 21px 33px 3px rgba(0,0,0,.14),0 8px 40px 7px rgba(0,0,0,.12)}.shadow-up-21{box-shadow:0 -10px 13px -6px rgba(0,0,0,.2),0 -21px 33px 3px rgba(0,0,0,.14),0 -8px 40px 7px rgba(0,0,0,.12)}.shadow-22{box-shadow:0 10px 14px -6px rgba(0,0,0,.2),0 22px 35px 3px rgba(0,0,0,.14),0 8px 42px 7px rgba(0,0,0,.12)}.shadow-up-22{box-shadow:0 -10px 14px -6px rgba(0,0,0,.2),0 -22px 35px 3px rgba(0,0,0,.14),0 -8px 42px 7px rgba(0,0,0,.12)}.shadow-23{box-shadow:0 11px 14px -7px rgba(0,0,0,.2),0 23px 36px 3px rgba(0,0,0,.14),0 9px 44px 8px rgba(0,0,0,.12)}.shadow-up-23{box-shadow:0 -11px 14px -7px rgba(0,0,0,.2),0 -23px 36px 3px rgba(0,0,0,.14),0 -9px 44px 8px rgba(0,0,0,.12)}.shadow-24{box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12)}.shadow-up-24{box-shadow:0 -11px 15px -7px rgba(0,0,0,.2),0 -24px 38px 3px rgba(0,0,0,.14),0 -9px 46px 8px rgba(0,0,0,.12)}.inset-shadow{box-shadow:0 7px 9px -7px rgba(0,0,0,.7) inset}.inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(0,0,0,.7) inset}body.body--dark .shadow-1{box-shadow:0 1px 3px rgba(255,255,255,.2),0 1px 1px rgba(255,255,255,.14),0 2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-up-1{box-shadow:0 -1px 3px rgba(255,255,255,.2),0 -1px 1px rgba(255,255,255,.14),0 -2px 1px -1px rgba(255,255,255,.12)}body.body--dark .shadow-2{box-shadow:0 1px 5px rgba(255,255,255,.2),0 2px 2px rgba(255,255,255,.14),0 3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-2{box-shadow:0 -1px 5px rgba(255,255,255,.2),0 -2px 2px rgba(255,255,255,.14),0 -3px 1px -2px rgba(255,255,255,.12)}body.body--dark .shadow-3{box-shadow:0 1px 8px rgba(255,255,255,.2),0 3px 4px rgba(255,255,255,.14),0 3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-up-3{box-shadow:0 -1px 8px rgba(255,255,255,.2),0 -3px 4px rgba(255,255,255,.14),0 -3px 3px -2px rgba(255,255,255,.12)}body.body--dark .shadow-4{box-shadow:0 2px 4px -1px rgba(255,255,255,.2),0 4px 5px rgba(255,255,255,.14),0 1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-up-4{box-shadow:0 -2px 4px -1px rgba(255,255,255,.2),0 -4px 5px rgba(255,255,255,.14),0 -1px 10px rgba(255,255,255,.12)}body.body--dark .shadow-5{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 5px 8px rgba(255,255,255,.14),0 1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-up-5{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -5px 8px rgba(255,255,255,.14),0 -1px 14px rgba(255,255,255,.12)}body.body--dark .shadow-6{box-shadow:0 3px 5px -1px rgba(255,255,255,.2),0 6px 10px rgba(255,255,255,.14),0 1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-up-6{box-shadow:0 -3px 5px -1px rgba(255,255,255,.2),0 -6px 10px rgba(255,255,255,.14),0 -1px 18px rgba(255,255,255,.12)}body.body--dark .shadow-7{box-shadow:0 4px 5px -2px rgba(255,255,255,.2),0 7px 10px 1px rgba(255,255,255,.14),0 2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-up-7{box-shadow:0 -4px 5px -2px rgba(255,255,255,.2),0 -7px 10px 1px rgba(255,255,255,.14),0 -2px 16px 1px rgba(255,255,255,.12)}body.body--dark .shadow-8{box-shadow:0 5px 5px -3px rgba(255,255,255,.2),0 8px 10px 1px rgba(255,255,255,.14),0 3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-8{box-shadow:0 -5px 5px -3px rgba(255,255,255,.2),0 -8px 10px 1px rgba(255,255,255,.14),0 -3px 14px 2px rgba(255,255,255,.12)}body.body--dark .shadow-9{box-shadow:0 5px 6px -3px rgba(255,255,255,.2),0 9px 12px 1px rgba(255,255,255,.14),0 3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-up-9{box-shadow:0 -5px 6px -3px rgba(255,255,255,.2),0 -9px 12px 1px rgba(255,255,255,.14),0 -3px 16px 2px rgba(255,255,255,.12)}body.body--dark .shadow-10{box-shadow:0 6px 6px -3px rgba(255,255,255,.2),0 10px 14px 1px rgba(255,255,255,.14),0 4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-10{box-shadow:0 -6px 6px -3px rgba(255,255,255,.2),0 -10px 14px 1px rgba(255,255,255,.14),0 -4px 18px 3px rgba(255,255,255,.12)}body.body--dark .shadow-11{box-shadow:0 6px 7px -4px rgba(255,255,255,.2),0 11px 15px 1px rgba(255,255,255,.14),0 4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-up-11{box-shadow:0 -6px 7px -4px rgba(255,255,255,.2),0 -11px 15px 1px rgba(255,255,255,.14),0 -4px 20px 3px rgba(255,255,255,.12)}body.body--dark .shadow-12{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 12px 17px 2px rgba(255,255,255,.14),0 5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-12{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -12px 17px 2px rgba(255,255,255,.14),0 -5px 22px 4px rgba(255,255,255,.12)}body.body--dark .shadow-13{box-shadow:0 7px 8px -4px rgba(255,255,255,.2),0 13px 19px 2px rgba(255,255,255,.14),0 5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-13{box-shadow:0 -7px 8px -4px rgba(255,255,255,.2),0 -13px 19px 2px rgba(255,255,255,.14),0 -5px 24px 4px rgba(255,255,255,.12)}body.body--dark .shadow-14{box-shadow:0 7px 9px -4px rgba(255,255,255,.2),0 14px 21px 2px rgba(255,255,255,.14),0 5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-up-14{box-shadow:0 -7px 9px -4px rgba(255,255,255,.2),0 -14px 21px 2px rgba(255,255,255,.14),0 -5px 26px 4px rgba(255,255,255,.12)}body.body--dark .shadow-15{box-shadow:0 8px 9px -5px rgba(255,255,255,.2),0 15px 22px 2px rgba(255,255,255,.14),0 6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-15{box-shadow:0 -8px 9px -5px rgba(255,255,255,.2),0 -15px 22px 2px rgba(255,255,255,.14),0 -6px 28px 5px rgba(255,255,255,.12)}body.body--dark .shadow-16{box-shadow:0 8px 10px -5px rgba(255,255,255,.2),0 16px 24px 2px rgba(255,255,255,.14),0 6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-16{box-shadow:0 -8px 10px -5px rgba(255,255,255,.2),0 -16px 24px 2px rgba(255,255,255,.14),0 -6px 30px 5px rgba(255,255,255,.12)}body.body--dark .shadow-17{box-shadow:0 8px 11px -5px rgba(255,255,255,.2),0 17px 26px 2px rgba(255,255,255,.14),0 6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-up-17{box-shadow:0 -8px 11px -5px rgba(255,255,255,.2),0 -17px 26px 2px rgba(255,255,255,.14),0 -6px 32px 5px rgba(255,255,255,.12)}body.body--dark .shadow-18{box-shadow:0 9px 11px -5px rgba(255,255,255,.2),0 18px 28px 2px rgba(255,255,255,.14),0 7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-18{box-shadow:0 -9px 11px -5px rgba(255,255,255,.2),0 -18px 28px 2px rgba(255,255,255,.14),0 -7px 34px 6px rgba(255,255,255,.12)}body.body--dark .shadow-19{box-shadow:0 9px 12px -6px rgba(255,255,255,.2),0 19px 29px 2px rgba(255,255,255,.14),0 7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-up-19{box-shadow:0 -9px 12px -6px rgba(255,255,255,.2),0 -19px 29px 2px rgba(255,255,255,.14),0 -7px 36px 6px rgba(255,255,255,.12)}body.body--dark .shadow-20{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 20px 31px 3px rgba(255,255,255,.14),0 8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-20{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -20px 31px 3px rgba(255,255,255,.14),0 -8px 38px 7px rgba(255,255,255,.12)}body.body--dark .shadow-21{box-shadow:0 10px 13px -6px rgba(255,255,255,.2),0 21px 33px 3px rgba(255,255,255,.14),0 8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-21{box-shadow:0 -10px 13px -6px rgba(255,255,255,.2),0 -21px 33px 3px rgba(255,255,255,.14),0 -8px 40px 7px rgba(255,255,255,.12)}body.body--dark .shadow-22{box-shadow:0 10px 14px -6px rgba(255,255,255,.2),0 22px 35px 3px rgba(255,255,255,.14),0 8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-up-22{box-shadow:0 -10px 14px -6px rgba(255,255,255,.2),0 -22px 35px 3px rgba(255,255,255,.14),0 -8px 42px 7px rgba(255,255,255,.12)}body.body--dark .shadow-23{box-shadow:0 11px 14px -7px rgba(255,255,255,.2),0 23px 36px 3px rgba(255,255,255,.14),0 9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-23{box-shadow:0 -11px 14px -7px rgba(255,255,255,.2),0 -23px 36px 3px rgba(255,255,255,.14),0 -9px 44px 8px rgba(255,255,255,.12)}body.body--dark .shadow-24{box-shadow:0 11px 15px -7px rgba(255,255,255,.2),0 24px 38px 3px rgba(255,255,255,.14),0 9px 46px 8px rgba(255,255,255,.12)}body.body--dark .shadow-up-24{box-shadow:0 -11px 15px -7px rgba(255,255,255,.2),0 -24px 38px 3px rgba(255,255,255,.14),0 -9px 46px 8px rgba(255,255,255,.12)}body.body--dark .inset-shadow{box-shadow:0 7px 9px -7px rgba(255,255,255,.7) inset}body.body--dark .inset-shadow-down{box-shadow:0 -7px 9px -7px rgba(255,255,255,.7) inset}.no-shadow,.shadow-0{box-shadow:none!important}.z-marginals{z-index:2000}.z-notify{z-index:9500}.z-fullscreen{z-index:6000}.z-inherit{z-index:inherit!important}.column,.flex,.row{display:flex;flex-wrap:wrap}.column.inline,.flex.inline,.row.inline{display:inline-flex}.row.reverse{flex-direction:row-reverse}.column{flex-direction:column}.column.reverse{flex-direction:column-reverse}.wrap{flex-wrap:wrap}.no-wrap{flex-wrap:nowrap}.reverse-wrap{flex-wrap:wrap-reverse}.order-first{order:-10000}.order-last{order:10000}.order-none{order:0}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.flex-center,.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.flex-center,.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-center{align-content:center}.content-stretch{align-content:stretch}.content-between{align-content:space-between}.content-around{align-content:space-around}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-baseline{align-self:baseline}.self-stretch{align-self:stretch}.q-gutter-none,.q-gutter-x-none{margin-left:0}.q-gutter-none>*,.q-gutter-x-none>*{margin-left:0}.q-gutter-none,.q-gutter-y-none{margin-top:0}.q-gutter-none>*,.q-gutter-y-none>*{margin-top:0}.q-col-gutter-none,.q-col-gutter-x-none{margin-left:0}.q-col-gutter-none>*,.q-col-gutter-x-none>*{padding-left:0}.q-col-gutter-none,.q-col-gutter-y-none{margin-top:0}.q-col-gutter-none>*,.q-col-gutter-y-none>*{padding-top:0}.q-gutter-x-xs,.q-gutter-xs{margin-left:-4px}.q-gutter-x-xs>*,.q-gutter-xs>*{margin-left:4px}.q-gutter-xs,.q-gutter-y-xs{margin-top:-4px}.q-gutter-xs>*,.q-gutter-y-xs>*{margin-top:4px}.q-col-gutter-x-xs,.q-col-gutter-xs{margin-left:-4px}.q-col-gutter-x-xs>*,.q-col-gutter-xs>*{padding-left:4px}.q-col-gutter-xs,.q-col-gutter-y-xs{margin-top:-4px}.q-col-gutter-xs>*,.q-col-gutter-y-xs>*{padding-top:4px}.q-gutter-sm,.q-gutter-x-sm{margin-left:-8px}.q-gutter-sm>*,.q-gutter-x-sm>*{margin-left:8px}.q-gutter-sm,.q-gutter-y-sm{margin-top:-8px}.q-gutter-sm>*,.q-gutter-y-sm>*{margin-top:8px}.q-col-gutter-sm,.q-col-gutter-x-sm{margin-left:-8px}.q-col-gutter-sm>*,.q-col-gutter-x-sm>*{padding-left:8px}.q-col-gutter-sm,.q-col-gutter-y-sm{margin-top:-8px}.q-col-gutter-sm>*,.q-col-gutter-y-sm>*{padding-top:8px}.q-gutter-md,.q-gutter-x-md{margin-left:-16px}.q-gutter-md>*,.q-gutter-x-md>*{margin-left:16px}.q-gutter-md,.q-gutter-y-md{margin-top:-16px}.q-gutter-md>*,.q-gutter-y-md>*{margin-top:16px}.q-col-gutter-md,.q-col-gutter-x-md{margin-left:-16px}.q-col-gutter-md>*,.q-col-gutter-x-md>*{padding-left:16px}.q-col-gutter-md,.q-col-gutter-y-md{margin-top:-16px}.q-col-gutter-md>*,.q-col-gutter-y-md>*{padding-top:16px}.q-gutter-lg,.q-gutter-x-lg{margin-left:-24px}.q-gutter-lg>*,.q-gutter-x-lg>*{margin-left:24px}.q-gutter-lg,.q-gutter-y-lg{margin-top:-24px}.q-gutter-lg>*,.q-gutter-y-lg>*{margin-top:24px}.q-col-gutter-lg,.q-col-gutter-x-lg{margin-left:-24px}.q-col-gutter-lg>*,.q-col-gutter-x-lg>*{padding-left:24px}.q-col-gutter-lg,.q-col-gutter-y-lg{margin-top:-24px}.q-col-gutter-lg>*,.q-col-gutter-y-lg>*{padding-top:24px}.q-gutter-x-xl,.q-gutter-xl{margin-left:-48px}.q-gutter-x-xl>*,.q-gutter-xl>*{margin-left:48px}.q-gutter-xl,.q-gutter-y-xl{margin-top:-48px}.q-gutter-xl>*,.q-gutter-y-xl>*{margin-top:48px}.q-col-gutter-x-xl,.q-col-gutter-xl{margin-left:-48px}.q-col-gutter-x-xl>*,.q-col-gutter-xl>*{padding-left:48px}.q-col-gutter-xl,.q-col-gutter-y-xl{margin-top:-48px}.q-col-gutter-xl>*,.q-col-gutter-y-xl>*{padding-top:48px}@media (min-width:0){.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink,.row>.col,.row>.col-0,.row>.col-1,.row>.col-10,.row>.col-11,.row>.col-12,.row>.col-2,.row>.col-3,.row>.col-4,.row>.col-5,.row>.col-6,.row>.col-7,.row>.col-8,.row>.col-9,.row>.col-auto,.row>.col-grow,.row>.col-shrink,.row>.col-xs,.row>.col-xs-0,.row>.col-xs-1,.row>.col-xs-10,.row>.col-xs-11,.row>.col-xs-12,.row>.col-xs-2,.row>.col-xs-3,.row>.col-xs-4,.row>.col-xs-5,.row>.col-xs-6,.row>.col-xs-7,.row>.col-xs-8,.row>.col-xs-9,.row>.col-xs-auto,.row>.col-xs-grow,.row>.col-xs-shrink{width:auto;min-width:0;max-width:100%}.column>.col,.column>.col-0,.column>.col-1,.column>.col-10,.column>.col-11,.column>.col-12,.column>.col-2,.column>.col-3,.column>.col-4,.column>.col-5,.column>.col-6,.column>.col-7,.column>.col-8,.column>.col-9,.column>.col-auto,.column>.col-grow,.column>.col-shrink,.column>.col-xs,.column>.col-xs-0,.column>.col-xs-1,.column>.col-xs-10,.column>.col-xs-11,.column>.col-xs-12,.column>.col-xs-2,.column>.col-xs-3,.column>.col-xs-4,.column>.col-xs-5,.column>.col-xs-6,.column>.col-xs-7,.column>.col-xs-8,.column>.col-xs-9,.column>.col-xs-auto,.column>.col-xs-grow,.column>.col-xs-shrink,.flex>.col,.flex>.col-0,.flex>.col-1,.flex>.col-10,.flex>.col-11,.flex>.col-12,.flex>.col-2,.flex>.col-3,.flex>.col-4,.flex>.col-5,.flex>.col-6,.flex>.col-7,.flex>.col-8,.flex>.col-9,.flex>.col-auto,.flex>.col-grow,.flex>.col-shrink,.flex>.col-xs,.flex>.col-xs-0,.flex>.col-xs-1,.flex>.col-xs-10,.flex>.col-xs-11,.flex>.col-xs-12,.flex>.col-xs-2,.flex>.col-xs-3,.flex>.col-xs-4,.flex>.col-xs-5,.flex>.col-xs-6,.flex>.col-xs-7,.flex>.col-xs-8,.flex>.col-xs-9,.flex>.col-xs-auto,.flex>.col-xs-grow,.flex>.col-xs-shrink{height:auto;min-height:0;max-height:100%}.col,.col-xs{flex:10000 1 0%}.col-0,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-xs-0,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-auto{flex:0 0 auto}.col-grow,.col-xs-grow{flex:1 0 auto}.col-shrink,.col-xs-shrink{flex:0 1 auto}.row>.col-0,.row>.col-xs-0{height:auto;width:0%}.row>.offset-0,.row>.offset-xs-0{margin-left:0}.column>.col-0,.column>.col-xs-0{height:0%;width:auto}.row>.col-1,.row>.col-xs-1{height:auto;width:8.3333%}.row>.offset-1,.row>.offset-xs-1{margin-left:8.3333%}.column>.col-1,.column>.col-xs-1{height:8.3333%;width:auto}.row>.col-2,.row>.col-xs-2{height:auto;width:16.6667%}.row>.offset-2,.row>.offset-xs-2{margin-left:16.6667%}.column>.col-2,.column>.col-xs-2{height:16.6667%;width:auto}.row>.col-3,.row>.col-xs-3{height:auto;width:25%}.row>.offset-3,.row>.offset-xs-3{margin-left:25%}.column>.col-3,.column>.col-xs-3{height:25%;width:auto}.row>.col-4,.row>.col-xs-4{height:auto;width:33.3333%}.row>.offset-4,.row>.offset-xs-4{margin-left:33.3333%}.column>.col-4,.column>.col-xs-4{height:33.3333%;width:auto}.row>.col-5,.row>.col-xs-5{height:auto;width:41.6667%}.row>.offset-5,.row>.offset-xs-5{margin-left:41.6667%}.column>.col-5,.column>.col-xs-5{height:41.6667%;width:auto}.row>.col-6,.row>.col-xs-6{height:auto;width:50%}.row>.offset-6,.row>.offset-xs-6{margin-left:50%}.column>.col-6,.column>.col-xs-6{height:50%;width:auto}.row>.col-7,.row>.col-xs-7{height:auto;width:58.3333%}.row>.offset-7,.row>.offset-xs-7{margin-left:58.3333%}.column>.col-7,.column>.col-xs-7{height:58.3333%;width:auto}.row>.col-8,.row>.col-xs-8{height:auto;width:66.6667%}.row>.offset-8,.row>.offset-xs-8{margin-left:66.6667%}.column>.col-8,.column>.col-xs-8{height:66.6667%;width:auto}.row>.col-9,.row>.col-xs-9{height:auto;width:75%}.row>.offset-9,.row>.offset-xs-9{margin-left:75%}.column>.col-9,.column>.col-xs-9{height:75%;width:auto}.row>.col-10,.row>.col-xs-10{height:auto;width:83.3333%}.row>.offset-10,.row>.offset-xs-10{margin-left:83.3333%}.column>.col-10,.column>.col-xs-10{height:83.3333%;width:auto}.row>.col-11,.row>.col-xs-11{height:auto;width:91.6667%}.row>.offset-11,.row>.offset-xs-11{margin-left:91.6667%}.column>.col-11,.column>.col-xs-11{height:91.6667%;width:auto}.row>.col-12,.row>.col-xs-12{height:auto;width:100%}.row>.offset-12,.row>.offset-xs-12{margin-left:100%}.column>.col-12,.column>.col-xs-12{height:100%;width:auto}.row>.col-all{height:auto;flex:0 0 100%}}@media (min-width:600px){.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink,.row>.col-sm,.row>.col-sm-0,.row>.col-sm-1,.row>.col-sm-10,.row>.col-sm-11,.row>.col-sm-12,.row>.col-sm-2,.row>.col-sm-3,.row>.col-sm-4,.row>.col-sm-5,.row>.col-sm-6,.row>.col-sm-7,.row>.col-sm-8,.row>.col-sm-9,.row>.col-sm-auto,.row>.col-sm-grow,.row>.col-sm-shrink{width:auto;min-width:0;max-width:100%}.column>.col-sm,.column>.col-sm-0,.column>.col-sm-1,.column>.col-sm-10,.column>.col-sm-11,.column>.col-sm-12,.column>.col-sm-2,.column>.col-sm-3,.column>.col-sm-4,.column>.col-sm-5,.column>.col-sm-6,.column>.col-sm-7,.column>.col-sm-8,.column>.col-sm-9,.column>.col-sm-auto,.column>.col-sm-grow,.column>.col-sm-shrink,.flex>.col-sm,.flex>.col-sm-0,.flex>.col-sm-1,.flex>.col-sm-10,.flex>.col-sm-11,.flex>.col-sm-12,.flex>.col-sm-2,.flex>.col-sm-3,.flex>.col-sm-4,.flex>.col-sm-5,.flex>.col-sm-6,.flex>.col-sm-7,.flex>.col-sm-8,.flex>.col-sm-9,.flex>.col-sm-auto,.flex>.col-sm-grow,.flex>.col-sm-shrink{height:auto;min-height:0;max-height:100%}.col-sm{flex:10000 1 0%}.col-sm-0,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto{flex:0 0 auto}.col-sm-grow{flex:1 0 auto}.col-sm-shrink{flex:0 1 auto}.row>.col-sm-0{height:auto;width:0%}.row>.offset-sm-0{margin-left:0}.column>.col-sm-0{height:0%;width:auto}.row>.col-sm-1{height:auto;width:8.3333%}.row>.offset-sm-1{margin-left:8.3333%}.column>.col-sm-1{height:8.3333%;width:auto}.row>.col-sm-2{height:auto;width:16.6667%}.row>.offset-sm-2{margin-left:16.6667%}.column>.col-sm-2{height:16.6667%;width:auto}.row>.col-sm-3{height:auto;width:25%}.row>.offset-sm-3{margin-left:25%}.column>.col-sm-3{height:25%;width:auto}.row>.col-sm-4{height:auto;width:33.3333%}.row>.offset-sm-4{margin-left:33.3333%}.column>.col-sm-4{height:33.3333%;width:auto}.row>.col-sm-5{height:auto;width:41.6667%}.row>.offset-sm-5{margin-left:41.6667%}.column>.col-sm-5{height:41.6667%;width:auto}.row>.col-sm-6{height:auto;width:50%}.row>.offset-sm-6{margin-left:50%}.column>.col-sm-6{height:50%;width:auto}.row>.col-sm-7{height:auto;width:58.3333%}.row>.offset-sm-7{margin-left:58.3333%}.column>.col-sm-7{height:58.3333%;width:auto}.row>.col-sm-8{height:auto;width:66.6667%}.row>.offset-sm-8{margin-left:66.6667%}.column>.col-sm-8{height:66.6667%;width:auto}.row>.col-sm-9{height:auto;width:75%}.row>.offset-sm-9{margin-left:75%}.column>.col-sm-9{height:75%;width:auto}.row>.col-sm-10{height:auto;width:83.3333%}.row>.offset-sm-10{margin-left:83.3333%}.column>.col-sm-10{height:83.3333%;width:auto}.row>.col-sm-11{height:auto;width:91.6667%}.row>.offset-sm-11{margin-left:91.6667%}.column>.col-sm-11{height:91.6667%;width:auto}.row>.col-sm-12{height:auto;width:100%}.row>.offset-sm-12{margin-left:100%}.column>.col-sm-12{height:100%;width:auto}}@media (min-width:1024px){.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink,.row>.col-md,.row>.col-md-0,.row>.col-md-1,.row>.col-md-10,.row>.col-md-11,.row>.col-md-12,.row>.col-md-2,.row>.col-md-3,.row>.col-md-4,.row>.col-md-5,.row>.col-md-6,.row>.col-md-7,.row>.col-md-8,.row>.col-md-9,.row>.col-md-auto,.row>.col-md-grow,.row>.col-md-shrink{width:auto;min-width:0;max-width:100%}.column>.col-md,.column>.col-md-0,.column>.col-md-1,.column>.col-md-10,.column>.col-md-11,.column>.col-md-12,.column>.col-md-2,.column>.col-md-3,.column>.col-md-4,.column>.col-md-5,.column>.col-md-6,.column>.col-md-7,.column>.col-md-8,.column>.col-md-9,.column>.col-md-auto,.column>.col-md-grow,.column>.col-md-shrink,.flex>.col-md,.flex>.col-md-0,.flex>.col-md-1,.flex>.col-md-10,.flex>.col-md-11,.flex>.col-md-12,.flex>.col-md-2,.flex>.col-md-3,.flex>.col-md-4,.flex>.col-md-5,.flex>.col-md-6,.flex>.col-md-7,.flex>.col-md-8,.flex>.col-md-9,.flex>.col-md-auto,.flex>.col-md-grow,.flex>.col-md-shrink{height:auto;min-height:0;max-height:100%}.col-md{flex:10000 1 0%}.col-md-0,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto{flex:0 0 auto}.col-md-grow{flex:1 0 auto}.col-md-shrink{flex:0 1 auto}.row>.col-md-0{height:auto;width:0%}.row>.offset-md-0{margin-left:0}.column>.col-md-0{height:0%;width:auto}.row>.col-md-1{height:auto;width:8.3333%}.row>.offset-md-1{margin-left:8.3333%}.column>.col-md-1{height:8.3333%;width:auto}.row>.col-md-2{height:auto;width:16.6667%}.row>.offset-md-2{margin-left:16.6667%}.column>.col-md-2{height:16.6667%;width:auto}.row>.col-md-3{height:auto;width:25%}.row>.offset-md-3{margin-left:25%}.column>.col-md-3{height:25%;width:auto}.row>.col-md-4{height:auto;width:33.3333%}.row>.offset-md-4{margin-left:33.3333%}.column>.col-md-4{height:33.3333%;width:auto}.row>.col-md-5{height:auto;width:41.6667%}.row>.offset-md-5{margin-left:41.6667%}.column>.col-md-5{height:41.6667%;width:auto}.row>.col-md-6{height:auto;width:50%}.row>.offset-md-6{margin-left:50%}.column>.col-md-6{height:50%;width:auto}.row>.col-md-7{height:auto;width:58.3333%}.row>.offset-md-7{margin-left:58.3333%}.column>.col-md-7{height:58.3333%;width:auto}.row>.col-md-8{height:auto;width:66.6667%}.row>.offset-md-8{margin-left:66.6667%}.column>.col-md-8{height:66.6667%;width:auto}.row>.col-md-9{height:auto;width:75%}.row>.offset-md-9{margin-left:75%}.column>.col-md-9{height:75%;width:auto}.row>.col-md-10{height:auto;width:83.3333%}.row>.offset-md-10{margin-left:83.3333%}.column>.col-md-10{height:83.3333%;width:auto}.row>.col-md-11{height:auto;width:91.6667%}.row>.offset-md-11{margin-left:91.6667%}.column>.col-md-11{height:91.6667%;width:auto}.row>.col-md-12{height:auto;width:100%}.row>.offset-md-12{margin-left:100%}.column>.col-md-12{height:100%;width:auto}}@media (min-width:1440px){.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink,.row>.col-lg,.row>.col-lg-0,.row>.col-lg-1,.row>.col-lg-10,.row>.col-lg-11,.row>.col-lg-12,.row>.col-lg-2,.row>.col-lg-3,.row>.col-lg-4,.row>.col-lg-5,.row>.col-lg-6,.row>.col-lg-7,.row>.col-lg-8,.row>.col-lg-9,.row>.col-lg-auto,.row>.col-lg-grow,.row>.col-lg-shrink{width:auto;min-width:0;max-width:100%}.column>.col-lg,.column>.col-lg-0,.column>.col-lg-1,.column>.col-lg-10,.column>.col-lg-11,.column>.col-lg-12,.column>.col-lg-2,.column>.col-lg-3,.column>.col-lg-4,.column>.col-lg-5,.column>.col-lg-6,.column>.col-lg-7,.column>.col-lg-8,.column>.col-lg-9,.column>.col-lg-auto,.column>.col-lg-grow,.column>.col-lg-shrink,.flex>.col-lg,.flex>.col-lg-0,.flex>.col-lg-1,.flex>.col-lg-10,.flex>.col-lg-11,.flex>.col-lg-12,.flex>.col-lg-2,.flex>.col-lg-3,.flex>.col-lg-4,.flex>.col-lg-5,.flex>.col-lg-6,.flex>.col-lg-7,.flex>.col-lg-8,.flex>.col-lg-9,.flex>.col-lg-auto,.flex>.col-lg-grow,.flex>.col-lg-shrink{height:auto;min-height:0;max-height:100%}.col-lg{flex:10000 1 0%}.col-lg-0,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto{flex:0 0 auto}.col-lg-grow{flex:1 0 auto}.col-lg-shrink{flex:0 1 auto}.row>.col-lg-0{height:auto;width:0%}.row>.offset-lg-0{margin-left:0}.column>.col-lg-0{height:0%;width:auto}.row>.col-lg-1{height:auto;width:8.3333%}.row>.offset-lg-1{margin-left:8.3333%}.column>.col-lg-1{height:8.3333%;width:auto}.row>.col-lg-2{height:auto;width:16.6667%}.row>.offset-lg-2{margin-left:16.6667%}.column>.col-lg-2{height:16.6667%;width:auto}.row>.col-lg-3{height:auto;width:25%}.row>.offset-lg-3{margin-left:25%}.column>.col-lg-3{height:25%;width:auto}.row>.col-lg-4{height:auto;width:33.3333%}.row>.offset-lg-4{margin-left:33.3333%}.column>.col-lg-4{height:33.3333%;width:auto}.row>.col-lg-5{height:auto;width:41.6667%}.row>.offset-lg-5{margin-left:41.6667%}.column>.col-lg-5{height:41.6667%;width:auto}.row>.col-lg-6{height:auto;width:50%}.row>.offset-lg-6{margin-left:50%}.column>.col-lg-6{height:50%;width:auto}.row>.col-lg-7{height:auto;width:58.3333%}.row>.offset-lg-7{margin-left:58.3333%}.column>.col-lg-7{height:58.3333%;width:auto}.row>.col-lg-8{height:auto;width:66.6667%}.row>.offset-lg-8{margin-left:66.6667%}.column>.col-lg-8{height:66.6667%;width:auto}.row>.col-lg-9{height:auto;width:75%}.row>.offset-lg-9{margin-left:75%}.column>.col-lg-9{height:75%;width:auto}.row>.col-lg-10{height:auto;width:83.3333%}.row>.offset-lg-10{margin-left:83.3333%}.column>.col-lg-10{height:83.3333%;width:auto}.row>.col-lg-11{height:auto;width:91.6667%}.row>.offset-lg-11{margin-left:91.6667%}.column>.col-lg-11{height:91.6667%;width:auto}.row>.col-lg-12{height:auto;width:100%}.row>.offset-lg-12{margin-left:100%}.column>.col-lg-12{height:100%;width:auto}}@media (min-width:1920px){.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink,.row>.col-xl,.row>.col-xl-0,.row>.col-xl-1,.row>.col-xl-10,.row>.col-xl-11,.row>.col-xl-12,.row>.col-xl-2,.row>.col-xl-3,.row>.col-xl-4,.row>.col-xl-5,.row>.col-xl-6,.row>.col-xl-7,.row>.col-xl-8,.row>.col-xl-9,.row>.col-xl-auto,.row>.col-xl-grow,.row>.col-xl-shrink{width:auto;min-width:0;max-width:100%}.column>.col-xl,.column>.col-xl-0,.column>.col-xl-1,.column>.col-xl-10,.column>.col-xl-11,.column>.col-xl-12,.column>.col-xl-2,.column>.col-xl-3,.column>.col-xl-4,.column>.col-xl-5,.column>.col-xl-6,.column>.col-xl-7,.column>.col-xl-8,.column>.col-xl-9,.column>.col-xl-auto,.column>.col-xl-grow,.column>.col-xl-shrink,.flex>.col-xl,.flex>.col-xl-0,.flex>.col-xl-1,.flex>.col-xl-10,.flex>.col-xl-11,.flex>.col-xl-12,.flex>.col-xl-2,.flex>.col-xl-3,.flex>.col-xl-4,.flex>.col-xl-5,.flex>.col-xl-6,.flex>.col-xl-7,.flex>.col-xl-8,.flex>.col-xl-9,.flex>.col-xl-auto,.flex>.col-xl-grow,.flex>.col-xl-shrink{height:auto;min-height:0;max-height:100%}.col-xl{flex:10000 1 0%}.col-xl-0,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{flex:0 0 auto}.col-xl-grow{flex:1 0 auto}.col-xl-shrink{flex:0 1 auto}.row>.col-xl-0{height:auto;width:0%}.row>.offset-xl-0{margin-left:0}.column>.col-xl-0{height:0%;width:auto}.row>.col-xl-1{height:auto;width:8.3333%}.row>.offset-xl-1{margin-left:8.3333%}.column>.col-xl-1{height:8.3333%;width:auto}.row>.col-xl-2{height:auto;width:16.6667%}.row>.offset-xl-2{margin-left:16.6667%}.column>.col-xl-2{height:16.6667%;width:auto}.row>.col-xl-3{height:auto;width:25%}.row>.offset-xl-3{margin-left:25%}.column>.col-xl-3{height:25%;width:auto}.row>.col-xl-4{height:auto;width:33.3333%}.row>.offset-xl-4{margin-left:33.3333%}.column>.col-xl-4{height:33.3333%;width:auto}.row>.col-xl-5{height:auto;width:41.6667%}.row>.offset-xl-5{margin-left:41.6667%}.column>.col-xl-5{height:41.6667%;width:auto}.row>.col-xl-6{height:auto;width:50%}.row>.offset-xl-6{margin-left:50%}.column>.col-xl-6{height:50%;width:auto}.row>.col-xl-7{height:auto;width:58.3333%}.row>.offset-xl-7{margin-left:58.3333%}.column>.col-xl-7{height:58.3333%;width:auto}.row>.col-xl-8{height:auto;width:66.6667%}.row>.offset-xl-8{margin-left:66.6667%}.column>.col-xl-8{height:66.6667%;width:auto}.row>.col-xl-9{height:auto;width:75%}.row>.offset-xl-9{margin-left:75%}.column>.col-xl-9{height:75%;width:auto}.row>.col-xl-10{height:auto;width:83.3333%}.row>.offset-xl-10{margin-left:83.3333%}.column>.col-xl-10{height:83.3333%;width:auto}.row>.col-xl-11{height:auto;width:91.6667%}.row>.offset-xl-11{margin-left:91.6667%}.column>.col-xl-11{height:91.6667%;width:auto}.row>.col-xl-12{height:auto;width:100%}.row>.offset-xl-12{margin-left:100%}.column>.col-xl-12{height:100%;width:auto}}.rounded-borders{border-radius:4px}.border-radius-inherit{border-radius:inherit}.no-transition{transition:none!important}.transition-0{transition:0s!important}.glossy{background-image:linear-gradient(to bottom,rgba(255,255,255,.3),rgba(255,255,255,0) 50%,rgba(0,0,0,.12) 51%,rgba(0,0,0,.04))!important}.q-placeholder::placeholder{color:inherit;opacity:.7}.q-body--fullscreen-mixin,.q-body--prevent-scroll{position:fixed!important}.q-body--force-scrollbar-x{overflow-x:scroll}.q-body--force-scrollbar-y{overflow-y:scroll}.q-no-input-spinner{-moz-appearance:textfield!important}.q-no-input-spinner::-webkit-inner-spin-button,.q-no-input-spinner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.q-link{outline:0;text-decoration:none}.q-link--focusable:focus-visible{-webkit-text-decoration:underline dashed currentColor 1px;text-decoration:underline dashed currentColor 1px}body.electron .q-electron-drag{-webkit-user-select:none;-webkit-app-region:drag}body.electron .q-electron-drag .q-btn-item,body.electron .q-electron-drag--exception{-webkit-app-region:no-drag}img.responsive{max-width:100%;height:auto}.non-selectable{-webkit-user-select:none!important;user-select:none!important}.scroll,body.mobile .scroll--mobile{overflow:auto}.scroll,.scroll-x,.scroll-y{-webkit-overflow-scrolling:touch;will-change:scroll-position}.scroll-x{overflow-x:auto}.scroll-y{overflow-y:auto}.no-scroll{overflow:hidden!important}.no-pointer-events,.no-pointer-events--children,.no-pointer-events--children *{pointer-events:none!important}.all-pointer-events{pointer-events:all!important}.cursor-pointer{cursor:pointer!important}.cursor-not-allowed{cursor:not-allowed!important}.cursor-inherit{cursor:inherit!important}.cursor-none{cursor:none!important}[aria-busy=true]{cursor:progress}[aria-controls]{cursor:pointer}[aria-disabled=true]{cursor:default}.rotate-45{transform:rotate(45deg)}.rotate-90{transform:rotate(90deg)}.rotate-135{transform:rotate(135deg)}.rotate-180{transform:rotate(180deg)}.rotate-225{transform:rotate(225deg)}.rotate-270{transform:rotate(270deg)}.rotate-315{transform:rotate(315deg)}.flip-horizontal{transform:scaleX(-1)}.flip-vertical{transform:scaleY(-1)}.float-left{float:left}.float-right{float:right}.relative-position{position:relative}.fixed,.fixed-bottom,.fixed-bottom-left,.fixed-bottom-right,.fixed-center,.fixed-full,.fixed-left,.fixed-right,.fixed-top,.fixed-top-left,.fixed-top-right,.fullscreen{position:fixed}.absolute,.absolute-bottom,.absolute-bottom-left,.absolute-bottom-right,.absolute-center,.absolute-full,.absolute-left,.absolute-right,.absolute-top,.absolute-top-left,.absolute-top-right{position:absolute}.absolute-top,.fixed-top{top:0;left:0;right:0}.absolute-right,.fixed-right{top:0;right:0;bottom:0}.absolute-bottom,.fixed-bottom{right:0;bottom:0;left:0}.absolute-left,.fixed-left{top:0;bottom:0;left:0}.absolute-top-left,.fixed-top-left{top:0;left:0}.absolute-top-right,.fixed-top-right{top:0;right:0}.absolute-bottom-left,.fixed-bottom-left{bottom:0;left:0}.absolute-bottom-right,.fixed-bottom-right{bottom:0;right:0}.fullscreen{z-index:6000;border-radius:0!important;max-width:100vw;max-height:100vh}body.q-ios-padding .fullscreen{padding-top:20px!important;padding-top:env(safe-area-inset-top)!important;padding-bottom:env(safe-area-inset-bottom)!important}.absolute-full,.fixed-full,.fullscreen{top:0;right:0;bottom:0;left:0}.absolute-center,.fixed-center{top:50%;left:50%;transform:translate(-50%,-50%)}.vertical-top{vertical-align:top!important}.vertical-middle{vertical-align:middle!important}.vertical-bottom{vertical-align:bottom!important}.on-left{margin-right:12px}.on-right{margin-left:12px}.q-position-engine{margin-top:var(--q-pe-top,0)!important;margin-left:var(--q-pe-left,0)!important;will-change:auto;visibility:collapse}:root{--q-size-xs:0;--q-size-sm:600px;--q-size-md:1024px;--q-size-lg:1440px;--q-size-xl:1920px}.fit{width:100%!important;height:100%!important}.full-height{height:100%!important}.full-width{width:100%!important;margin-left:0!important;margin-right:0!important}.window-height{margin-top:0!important;margin-bottom:0!important;height:100vh!important}.window-width{margin-left:0!important;margin-right:0!important;width:100vw!important}.block{display:block!important}.inline-block{display:inline-block!important}.q-pa-none{padding:0 0}.q-pl-none{padding-left:0}.q-pr-none{padding-right:0}.q-pt-none{padding-top:0}.q-pb-none{padding-bottom:0}.q-px-none{padding-left:0;padding-right:0}.q-py-none{padding-top:0;padding-bottom:0}.q-ma-none{margin:0 0}.q-ml-none{margin-left:0}.q-mr-none{margin-right:0}.q-mt-none{margin-top:0}.q-mb-none{margin-bottom:0}.q-mx-none{margin-left:0;margin-right:0}.q-my-none{margin-top:0;margin-bottom:0}.q-pa-xs{padding:4px 4px}.q-pl-xs{padding-left:4px}.q-pr-xs{padding-right:4px}.q-pt-xs{padding-top:4px}.q-pb-xs{padding-bottom:4px}.q-px-xs{padding-left:4px;padding-right:4px}.q-py-xs{padding-top:4px;padding-bottom:4px}.q-ma-xs{margin:4px 4px}.q-ml-xs{margin-left:4px}.q-mr-xs{margin-right:4px}.q-mt-xs{margin-top:4px}.q-mb-xs{margin-bottom:4px}.q-mx-xs{margin-left:4px;margin-right:4px}.q-my-xs{margin-top:4px;margin-bottom:4px}.q-pa-sm{padding:8px 8px}.q-pl-sm{padding-left:8px}.q-pr-sm{padding-right:8px}.q-pt-sm{padding-top:8px}.q-pb-sm{padding-bottom:8px}.q-px-sm{padding-left:8px;padding-right:8px}.q-py-sm{padding-top:8px;padding-bottom:8px}.q-ma-sm{margin:8px 8px}.q-ml-sm{margin-left:8px}.q-mr-sm{margin-right:8px}.q-mt-sm{margin-top:8px}.q-mb-sm{margin-bottom:8px}.q-mx-sm{margin-left:8px;margin-right:8px}.q-my-sm{margin-top:8px;margin-bottom:8px}.q-pa-md{padding:16px 16px}.q-pl-md{padding-left:16px}.q-pr-md{padding-right:16px}.q-pt-md{padding-top:16px}.q-pb-md{padding-bottom:16px}.q-px-md{padding-left:16px;padding-right:16px}.q-py-md{padding-top:16px;padding-bottom:16px}.q-ma-md{margin:16px 16px}.q-ml-md{margin-left:16px}.q-mr-md{margin-right:16px}.q-mt-md{margin-top:16px}.q-mb-md{margin-bottom:16px}.q-mx-md{margin-left:16px;margin-right:16px}.q-my-md{margin-top:16px;margin-bottom:16px}.q-pa-lg{padding:24px 24px}.q-pl-lg{padding-left:24px}.q-pr-lg{padding-right:24px}.q-pt-lg{padding-top:24px}.q-pb-lg{padding-bottom:24px}.q-px-lg{padding-left:24px;padding-right:24px}.q-py-lg{padding-top:24px;padding-bottom:24px}.q-ma-lg{margin:24px 24px}.q-ml-lg{margin-left:24px}.q-mr-lg{margin-right:24px}.q-mt-lg{margin-top:24px}.q-mb-lg{margin-bottom:24px}.q-mx-lg{margin-left:24px;margin-right:24px}.q-my-lg{margin-top:24px;margin-bottom:24px}.q-pa-xl{padding:48px 48px}.q-pl-xl{padding-left:48px}.q-pr-xl{padding-right:48px}.q-pt-xl{padding-top:48px}.q-pb-xl{padding-bottom:48px}.q-px-xl{padding-left:48px;padding-right:48px}.q-py-xl{padding-top:48px;padding-bottom:48px}.q-ma-xl{margin:48px 48px}.q-ml-xl{margin-left:48px}.q-mr-xl{margin-right:48px}.q-mt-xl{margin-top:48px}.q-mb-xl{margin-bottom:48px}.q-mx-xl{margin-left:48px;margin-right:48px}.q-my-xl{margin-top:48px;margin-bottom:48px}.q-mt-auto,.q-my-auto{margin-top:auto}.q-ml-auto{margin-left:auto}.q-mb-auto,.q-my-auto{margin-bottom:auto}.q-mr-auto{margin-right:auto}.q-mx-auto{margin-left:auto;margin-right:auto}.q-touch{-webkit-user-select:none;user-select:none;user-drag:none;-khtml-user-drag:none;-webkit-user-drag:none}.q-touch-x{touch-action:pan-x}.q-touch-y{touch-action:pan-y}:root{--q-transition-duration:.3s}.q-transition--fade-enter-active,.q-transition--fade-leave-active,.q-transition--flip-enter-active,.q-transition--flip-leave-active,.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active,.q-transition--rotate-enter-active,.q-transition--rotate-leave-active,.q-transition--scale-enter-active,.q-transition--scale-leave-active,.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{--q-transition-duration:.3s;--q-transition-easing:cubic-bezier(0.215,0.61,0.355,1)}.q-transition--fade-leave-active,.q-transition--flip-leave-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-leave-active,.q-transition--rotate-leave-active,.q-transition--scale-leave-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-leave-active{position:absolute}.q-transition--slide-down-enter-active,.q-transition--slide-down-leave-active,.q-transition--slide-left-enter-active,.q-transition--slide-left-leave-active,.q-transition--slide-right-enter-active,.q-transition--slide-right-leave-active,.q-transition--slide-up-enter-active,.q-transition--slide-up-leave-active{transition:transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--slide-right-enter-from{transform:translate3d(-100%,0,0)}.q-transition--slide-right-leave-to{transform:translate3d(100%,0,0)}.q-transition--slide-left-enter-from{transform:translate3d(100%,0,0)}.q-transition--slide-left-leave-to{transform:translate3d(-100%,0,0)}.q-transition--slide-up-enter-from{transform:translate3d(0,100%,0)}.q-transition--slide-up-leave-to{transform:translate3d(0,-100%,0)}.q-transition--slide-down-enter-from{transform:translate3d(0,-100%,0)}.q-transition--slide-down-leave-to{transform:translate3d(0,100%,0)}.q-transition--jump-down-enter-active,.q-transition--jump-down-leave-active,.q-transition--jump-left-enter-active,.q-transition--jump-left-leave-active,.q-transition--jump-right-enter-active,.q-transition--jump-right-leave-active,.q-transition--jump-up-enter-active,.q-transition--jump-up-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration)}.q-transition--jump-down-enter-from,.q-transition--jump-down-leave-to,.q-transition--jump-left-enter-from,.q-transition--jump-left-leave-to,.q-transition--jump-right-enter-from,.q-transition--jump-right-leave-to,.q-transition--jump-up-enter-from,.q-transition--jump-up-leave-to{opacity:0}.q-transition--jump-right-enter-from{transform:translate3d(-15px,0,0)}.q-transition--jump-right-leave-to{transform:translate3d(15px,0,0)}.q-transition--jump-left-enter-from{transform:translate3d(15px,0,0)}.q-transition--jump-left-leave-to{transform:translateX(-15px)}.q-transition--jump-up-enter-from{transform:translate3d(0,15px,0)}.q-transition--jump-up-leave-to{transform:translate3d(0,-15px,0)}.q-transition--jump-down-enter-from{transform:translate3d(0,-15px,0)}.q-transition--jump-down-leave-to{transform:translate3d(0,15px,0)}.q-transition--fade-enter-active,.q-transition--fade-leave-active{transition:opacity var(--q-transition-duration) ease-out}.q-transition--fade-enter-from,.q-transition--fade-leave-to{opacity:0}.q-transition--scale-enter-active,.q-transition--scale-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing)}.q-transition--scale-enter-from,.q-transition--scale-leave-to{opacity:0;transform:scale3d(0,0,1)}.q-transition--rotate-enter-active,.q-transition--rotate-leave-active{transition:opacity var(--q-transition-duration),transform var(--q-transition-duration) var(--q-transition-easing);transform-style:preserve-3d}.q-transition--rotate-enter-from,.q-transition--rotate-leave-to{opacity:0;transform:scale3d(0,0,1) rotate3d(0,0,1,90deg)}.q-transition--flip-down-enter-active,.q-transition--flip-down-leave-active,.q-transition--flip-left-enter-active,.q-transition--flip-left-leave-active,.q-transition--flip-right-enter-active,.q-transition--flip-right-leave-active,.q-transition--flip-up-enter-active,.q-transition--flip-up-leave-active{transition:transform var(--q-transition-duration);backface-visibility:hidden}.q-transition--flip-down-enter-to,.q-transition--flip-down-leave-from,.q-transition--flip-left-enter-to,.q-transition--flip-left-leave-from,.q-transition--flip-right-enter-to,.q-transition--flip-right-leave-from,.q-transition--flip-up-enter-to,.q-transition--flip-up-leave-from{transform:perspective(400px) rotate3d(1,1,0,0deg)}.q-transition--flip-right-enter-from{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-right-leave-to{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-enter-from{transform:perspective(400px) rotate3d(0,1,0,180deg)}.q-transition--flip-left-leave-to{transform:perspective(400px) rotate3d(0,1,0,-180deg)}.q-transition--flip-up-enter-from{transform:perspective(400px) rotate3d(1,0,0,-180deg)}.q-transition--flip-up-leave-to{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-enter-from{transform:perspective(400px) rotate3d(1,0,0,180deg)}.q-transition--flip-down-leave-to{transform:perspective(400px) rotate3d(1,0,0,-180deg)}body{min-width:100px;min-height:100%;font-family:Roboto,"-apple-system","Helvetica Neue",Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:antialiased;line-height:1.5;font-size:14px}h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}p{margin:0 0 16px}.text-h1{font-size:6rem;font-weight:300;line-height:6rem;letter-spacing:-.01562em}.text-h2{font-size:3.75rem;font-weight:300;line-height:3.75rem;letter-spacing:-.00833em}.text-h3{font-size:3rem;font-weight:400;line-height:3.125rem;letter-spacing:normal}.text-h4{font-size:2.125rem;font-weight:400;line-height:2.5rem;letter-spacing:.00735em}.text-h5{font-size:1.5rem;font-weight:400;line-height:2rem;letter-spacing:normal}.text-h6{font-size:1.25rem;font-weight:500;line-height:2rem;letter-spacing:.0125em}.text-subtitle1{font-size:1rem;font-weight:400;line-height:1.75rem;letter-spacing:.00937em}.text-subtitle2{font-size:.875rem;font-weight:500;line-height:1.375rem;letter-spacing:.00714em}.text-body1{font-size:1rem;font-weight:400;line-height:1.5rem;letter-spacing:.03125em}.text-body2{font-size:.875rem;font-weight:400;line-height:1.25rem;letter-spacing:.01786em}.text-overline{font-size:.75rem;font-weight:500;line-height:2rem;letter-spacing:.16667em}.text-caption{font-size:.75rem;font-weight:400;line-height:1.25rem;letter-spacing:.03333em}.text-uppercase{text-transform:uppercase}.text-lowercase{text-transform:lowercase}.text-capitalize{text-transform:capitalize}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-justify{text-align:justify;-webkit-hyphens:auto;hyphens:auto}.text-italic{font-style:italic}.text-bold{font-weight:700}.text-no-wrap{white-space:nowrap}.text-strike{text-decoration:line-through}.text-weight-thin{font-weight:100}.text-weight-light{font-weight:300}.text-weight-regular{font-weight:400}.text-weight-medium{font-weight:500}.text-weight-bold{font-weight:700}.text-weight-bolder{font-weight:900}small{font-size:80%}big{font-size:170%}sub{bottom:-.25em}sup{top:-.5em}.no-margin{margin:0!important}.no-padding{padding:0!important}.no-border{border:0!important}.no-border-radius{border-radius:0!important}.no-box-shadow{box-shadow:none!important}.no-outline{outline:0!important}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ellipsis-2-lines,.ellipsis-3-lines{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.ellipsis-2-lines{-webkit-line-clamp:2}.ellipsis-3-lines{-webkit-line-clamp:3}.readonly{cursor:default!important}.disabled,.disabled *,[disabled],[disabled] *{outline:0!important;cursor:not-allowed!important}.disabled,[disabled]{opacity:.6!important}.hidden{display:none!important}.invisible,.invisible *{visibility:hidden!important;transition:none!important;animation:none!important}.transparent{background:0 0!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-hidden-y{overflow-y:hidden!important}.hide-scrollbar{scrollbar-width:none;-ms-overflow-style:none}.hide-scrollbar::-webkit-scrollbar{width:0;height:0;display:none}.dimmed:after,.light-dimmed:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.dimmed:after{background:rgba(0,0,0,.4)!important}.light-dimmed:after{background:rgba(255,255,255,.6)!important}.z-top{z-index:7000!important}.z-max{z-index:9998!important}body.desktop .desktop-hide,body:not(.desktop) .desktop-only{display:none!important}body.mobile .mobile-hide,body:not(.mobile) .mobile-only{display:none!important}body.native-mobile .native-mobile-hide,body:not(.native-mobile) .native-mobile-only{display:none!important}body.cordova .cordova-hide,body:not(.cordova) .cordova-only{display:none!important}body.capacitor .capacitor-hide,body:not(.capacitor) .capacitor-only{display:none!important}body.electron .electron-hide,body:not(.electron) .electron-only{display:none!important}body.touch .touch-hide,body:not(.touch) .touch-only{display:none!important}body.within-iframe .within-iframe-hide,body:not(.within-iframe) .within-iframe-only{display:none!important}body.platform-ios .platform-ios-hide,body:not(.platform-ios) .platform-ios-only{display:none!important}body.platform-android .platform-android-hide,body:not(.platform-android) .platform-android-only{display:none!important}@media all and (orientation:portrait){.orientation-landscape{display:none!important}}@media all and (orientation:landscape){.orientation-portrait{display:none!important}}@media screen{.print-only{display:none!important}}@media print{.print-hide{display:none!important}}@media (max-width:599.98px){.gt-lg,.gt-md,.gt-sm,.gt-xs,.lg,.md,.sm,.xl,.xs-hide{display:none!important}}@media (min-width:600px) and (max-width:1023.98px){.gt-lg,.gt-md,.gt-sm,.lg,.lt-sm,.md,.sm-hide,.xl,.xs{display:none!important}}@media (min-width:1024px) and (max-width:1439.98px){.gt-lg,.gt-md,.lg,.lt-md,.lt-sm,.md-hide,.sm,.xl,.xs{display:none!important}}@media (min-width:1440px) and (max-width:1919.98px){.gt-lg,.lg-hide,.lt-lg,.lt-md,.lt-sm,.md,.sm,.xl,.xs{display:none!important}}@media (min-width:1920px){.lg,.lt-lg,.lt-md,.lt-sm,.lt-xl,.md,.sm,.xl-hide,.xs{display:none!important}}.q-focus-helper,.q-focusable,.q-hoverable,.q-manual-focusable{outline:0}body.desktop .q-focus-helper{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;border-radius:inherit;opacity:0;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .4s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:after,body.desktop .q-focus-helper:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;border-radius:inherit;transition:background-color .3s cubic-bezier(.25, .8, .5, 1),opacity .6s cubic-bezier(.25, .8, .5, 1)}body.desktop .q-focus-helper:before{background:#000}body.desktop .q-focus-helper:after{background:#fff}body.desktop .q-focus-helper--rounded{border-radius:4px}body.desktop .q-focus-helper--round{border-radius:50%}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-hoverable:hover>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{background:currentColor;opacity:.15}body.desktop .q-focusable:focus>.q-focus-helper:before,body.desktop .q-hoverable:hover>.q-focus-helper:before,body.desktop .q-manual-focusable--focused>.q-focus-helper:before{opacity:.1}body.desktop .q-focusable:focus>.q-focus-helper:after,body.desktop .q-hoverable:hover>.q-focus-helper:after,body.desktop .q-manual-focusable--focused>.q-focus-helper:after{opacity:.4}body.desktop .q-focusable:focus>.q-focus-helper,body.desktop .q-manual-focusable--focused>.q-focus-helper{opacity:.22}body.body--dark{color:#fff;background:var(--q-dark-page)}.q-dark{color:#fff;background:var(--q-dark)}[data-theme=classic] .q-drawer--dark,[data-theme=classic] .q-menu--dark,body[data-theme=classic].body--dark{background:#1f2234!important}[data-theme=classic] .q-card--dark,[data-theme=classic] .q-stepper--dark{background:#333646!important}[data-theme=classic] .bg-primary{background:#673ab7!important}[data-theme=classic] .text-primary{color:#673ab7!important}[data-theme=classic] .bg-secondary{background:#9c27b0!important}[data-theme=classic] .text-secondary{color:#9c27b0!important}[data-theme=classic] .bg-dark{background:#1f2234!important}[data-theme=classic] .text-dark{color:#1f2234!important}[data-theme=classic] .bg-info{background:#333646!important}[data-theme=classic] .text-info{color:#333646!important}[data-theme=classic] .bg-marginal-bg{background:#1f2234!important}[data-theme=classic] .text-marginal-bg{color:#1f2234!important}[data-theme=classic] .bg-marginal-text{background:#fff!important}[data-theme=classic] .text-marginal-text{color:#fff!important}[data-theme=bitcoin] .q-drawer--dark,[data-theme=bitcoin] .q-menu--dark,body[data-theme=bitcoin].body--dark{background:#2d293b!important}[data-theme=bitcoin] .q-card--dark,[data-theme=bitcoin] .q-stepper--dark{background:#333646!important}[data-theme=bitcoin] .bg-primary{background:#ff9853!important}[data-theme=bitcoin] .text-primary{color:#ff9853!important}[data-theme=bitcoin] .bg-secondary{background:#ff7353!important}[data-theme=bitcoin] .text-secondary{color:#ff7353!important}[data-theme=bitcoin] .bg-dark{background:#2d293b!important}[data-theme=bitcoin] .text-dark{color:#2d293b!important}[data-theme=bitcoin] .bg-info{background:#333646!important}[data-theme=bitcoin] .text-info{color:#333646!important}[data-theme=bitcoin] .bg-marginal-bg{background:#2d293b!important}[data-theme=bitcoin] .text-marginal-bg{color:#2d293b!important}[data-theme=bitcoin] .bg-marginal-text{background:#fff!important}[data-theme=bitcoin] .text-marginal-text{color:#fff!important}[data-theme=freedom] .q-drawer--dark,[data-theme=freedom] .q-menu--dark,body[data-theme=freedom].body--dark{background:#0a0a0a!important}[data-theme=freedom] .q-card--dark,[data-theme=freedom] .q-stepper--dark{background:#1b1b1b!important}[data-theme=freedom] .bg-primary{background:#e22156!important}[data-theme=freedom] .text-primary{color:#e22156!important}[data-theme=freedom] .bg-secondary{background:#b91a45!important}[data-theme=freedom] .text-secondary{color:#b91a45!important}[data-theme=freedom] .bg-dark{background:#0a0a0a!important}[data-theme=freedom] .text-dark{color:#0a0a0a!important}[data-theme=freedom] .bg-info{background:#1b1b1b!important}[data-theme=freedom] .text-info{color:#1b1b1b!important}[data-theme=freedom] .bg-marginal-bg{background:#2d293b!important}[data-theme=freedom] .text-marginal-bg{color:#2d293b!important}[data-theme=freedom] .bg-marginal-text{background:#fff!important}[data-theme=freedom] .text-marginal-text{color:#fff!important}[data-theme=cyber] .q-drawer--dark,[data-theme=cyber] .q-menu--dark,body[data-theme=cyber].body--dark{background:#0a0a0a!important}[data-theme=cyber] .q-card--dark,[data-theme=cyber] .q-stepper--dark{background:#1b1b1b!important}[data-theme=cyber] .bg-primary{background:#7cb342!important}[data-theme=cyber] .text-primary{color:#7cb342!important}[data-theme=cyber] .bg-secondary{background:#558b2f!important}[data-theme=cyber] .text-secondary{color:#558b2f!important}[data-theme=cyber] .bg-dark{background:#0a0a0a!important}[data-theme=cyber] .text-dark{color:#0a0a0a!important}[data-theme=cyber] .bg-info{background:#1b1b1b!important}[data-theme=cyber] .text-info{color:#1b1b1b!important}[data-theme=cyber] .bg-marginal-bg{background:#2d293b!important}[data-theme=cyber] .text-marginal-bg{color:#2d293b!important}[data-theme=cyber] .bg-marginal-text{background:#fff!important}[data-theme=cyber] .text-marginal-text{color:#fff!important}[data-theme=mint] .q-drawer--dark,[data-theme=mint] .q-menu--dark,body[data-theme=mint].body--dark{background:#1f342b!important}[data-theme=mint] .q-card--dark,[data-theme=mint] .q-stepper--dark{background:#334642!important}[data-theme=mint] .bg-primary{background:#3ab77d!important}[data-theme=mint] .text-primary{color:#3ab77d!important}[data-theme=mint] .bg-secondary{background:#27b065!important}[data-theme=mint] .text-secondary{color:#27b065!important}[data-theme=mint] .bg-dark{background:#1f342b!important}[data-theme=mint] .text-dark{color:#1f342b!important}[data-theme=mint] .bg-info{background:#334642!important}[data-theme=mint] .text-info{color:#334642!important}[data-theme=mint] .bg-marginal-bg{background:#1f342b!important}[data-theme=mint] .text-marginal-bg{color:#1f342b!important}[data-theme=mint] .bg-marginal-text{background:#fff!important}[data-theme=mint] .text-marginal-text{color:#fff!important}[data-theme=autumn] .q-drawer--dark,[data-theme=autumn] .q-menu--dark,body[data-theme=autumn].body--dark{background:#34291f!important}[data-theme=autumn] .q-card--dark,[data-theme=autumn] .q-stepper--dark{background:#463f33!important}[data-theme=autumn] .bg-primary{background:#b7763a!important}[data-theme=autumn] .text-primary{color:#b7763a!important}[data-theme=autumn] .bg-secondary{background:#b07927!important}[data-theme=autumn] .text-secondary{color:#b07927!important}[data-theme=autumn] .bg-dark{background:#34291f!important}[data-theme=autumn] .text-dark{color:#34291f!important}[data-theme=autumn] .bg-info{background:#463f33!important}[data-theme=autumn] .text-info{color:#463f33!important}[data-theme=autumn] .bg-marginal-bg{background:#342a1f!important}[data-theme=autumn] .text-marginal-bg{color:#342a1f!important}[data-theme=autumn] .bg-marginal-text{background:#fff!important}[data-theme=autumn] .text-marginal-text{color:#fff!important}[data-theme=flamingo] .q-drawer--dark,[data-theme=flamingo] .q-menu--dark,body[data-theme=flamingo].body--dark{background:#2f032f!important}[data-theme=flamingo] .q-card--dark,[data-theme=flamingo] .q-stepper--dark{background:#bc23bc!important}[data-theme=flamingo] .bg-primary{background:#f0f!important}[data-theme=flamingo] .text-primary{color:#f0f!important}[data-theme=flamingo] .bg-secondary{background:#fda3fd!important}[data-theme=flamingo] .text-secondary{color:#fda3fd!important}[data-theme=flamingo] .bg-dark{background:#2f032f!important}[data-theme=flamingo] .text-dark{color:#2f032f!important}[data-theme=flamingo] .bg-info{background:#bc23bc!important}[data-theme=flamingo] .text-info{color:#bc23bc!important}[data-theme=flamingo] .bg-marginal-bg{background:#311231!important}[data-theme=flamingo] .text-marginal-bg{color:#311231!important}[data-theme=flamingo] .bg-marginal-text{background:#fff!important}[data-theme=flamingo] .text-marginal-text{color:#fff!important}[data-theme=monochrome] .q-drawer--dark,[data-theme=monochrome] .q-menu--dark,body[data-theme=monochrome].body--dark{background:#000!important}[data-theme=monochrome] .q-card--dark,[data-theme=monochrome] .q-stepper--dark{background:#272727!important}[data-theme=monochrome] .bg-primary{background:#494949!important}[data-theme=monochrome] .text-primary{color:#494949!important}[data-theme=monochrome] .bg-secondary{background:#6b6b6b!important}[data-theme=monochrome] .text-secondary{color:#6b6b6b!important}[data-theme=monochrome] .bg-dark{background:#000!important}[data-theme=monochrome] .text-dark{color:#000!important}[data-theme=monochrome] .bg-info{background:#272727!important}[data-theme=monochrome] .text-info{color:#272727!important}[data-theme=monochrome] .bg-marginal-bg{background:#000!important}[data-theme=monochrome] .text-marginal-bg{color:#000!important}[data-theme=monochrome] .bg-marginal-text{background:#fff!important}[data-theme=monochrome] .text-marginal-text{color:#fff!important}[data-theme=freedom] .q-drawer--dark{background:#0a0a0a!important}[data-theme=freedom] .q-header{background:#0a0a0a!important}[data-theme=cyber] .q-drawer--dark{background:#0a0a0a!important}[data-theme=cyber] .q-header{background:#0a0a0a!important}[data-theme=salvador] .q-drawer--dark{background:#242424!important}[data-theme=salvador] .q-header{background:#0f47af!important}[v-cloak]{display:none}body.body--dark .q-table--dark{background:0 0}body.body--dark .q-field--error .q-field__messages,body.body--dark .q-field--error .text-negative{color:#ff0!important}.lnbits-drawer__q-list .q-item{padding-top:5px!important;padding-bottom:5px!important;border-top-right-radius:3px;border-bottom-right-radius:3px}.lnbits-drawer__q-list .q-item.q-item--active{color:inherit;font-weight:700}.lnbits__dialog-card{width:500px}.q-table--dense .q-table__bottom,.q-table--dense td:first-child,.q-table--dense th:first-child{padding-left:6px!important}.q-table--dense .q-table__bottom,.q-table--dense td:last-child,.q-table--dense th:last-child{padding-right:6px!important}a.inherit{color:inherit;text-decoration:none}video{border-radius:3px}.material-icons{font-family:"Material Icons";font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-moz-font-feature-settings:"liga";-moz-osx-font-smoothing:grayscale}.q-rating__icon{font-size:1em}.text-wrap{word-break:break-word}.q-card code{overflow-wrap:break-word}.qrcode__wrapper{position:relative;display:flex;align-items:center;justify-content:center}.qrcode__wrapper canvas{width:100%!important;height:100%!important;max-width:350px}.qrcode__image{position:absolute;max-width:52px;width:15%;overflow:hidden;background:#fff;overflow:hidden;padding:.2rem;border-radius:.2rem}.whitespace-pre-line{white-space:pre-line}.q-carousel__slide{background-size:contain;background-repeat:no-repeat}.q-dialog__inner--minimized{padding:12px} diff --git a/lnbits/static/bundle.min.js b/lnbits/static/bundle.min.js index 1eb2b273b..f273b3d47 100644 --- a/lnbits/static/bundle.min.js +++ b/lnbits/static/bundle.min.js @@ -27,7 +27,7 @@ var Vuex=function(e){"use strict";var t="store";function n(){return"undefined"!= * vue-i18n v10.0.3 * (c) 2024 kazuya kawaguchi * Released under the MIT License. - */!function(e,t){"object"==typeof exports&&typeof module<"u"?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e=typeof globalThis<"u"?globalThis:e||self).VueQrcodeReader={},e.Vue)}(this,(function(e,t){"use strict";var n=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},a=(e,t,a)=>(n(e,t,"read from private field"),a?a.call(e):t.get(e));const i=[["aztec","Aztec"],["code_128","Code128"],["code_39","Code39"],["code_93","Code93"],["codabar","Codabar"],["databar","DataBar"],["databar_expanded","DataBarExpanded"],["data_matrix","DataMatrix"],["dx_film_edge","DXFilmEdge"],["ean_13","EAN-13"],["ean_8","EAN-8"],["itf","ITF"],["maxi_code","MaxiCode"],["micro_qr_code","MicroQRCode"],["pdf417","PDF417"],["qr_code","QRCode"],["rm_qr_code","rMQRCode"],["upc_a","UPC-A"],["upc_e","UPC-E"],["linear_codes","Linear-Codes"],["matrix_codes","Matrix-Codes"]],r=[...i,["unknown"]].map((e=>e[0])),o=new Map(i);function s(e){for(const[t,n]of o)if(e===n)return t;return"unknown"}function l(e){try{return e instanceof HTMLImageElement}catch(e){return!1}}function u(e){try{return e instanceof SVGImageElement}catch(e){return!1}}function c(e){try{return e instanceof HTMLVideoElement}catch(e){return!1}}function d(e){try{return e instanceof HTMLCanvasElement}catch(e){return!1}}function h(e){try{return e instanceof ImageBitmap}catch(e){return!1}}function p(e){try{return e instanceof OffscreenCanvas}catch(e){return!1}}function f(e){try{return e instanceof VideoFrame}catch(e){return!1}}function m(e){try{return e instanceof Blob}catch(e){return!1}}async function g(e){if(l(e)&&!await async function(e){try{return await e.decode(),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode HTMLImageElement.","InvalidStateError");if(u(e)&&!await async function(e){var t;try{return await(null==(t=e.decode)?void 0:t.call(e)),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode SVGImageElement.","InvalidStateError");if(f(e)&&function(e){return null===e.format}(e))throw new DOMException("VideoFrame is closed.","InvalidStateError");if(c(e)&&(0===e.readyState||1===e.readyState))throw new DOMException("Invalid element or state.","InvalidStateError");if(h(e)&&function(e){return 0===e.width&&0===e.height}(e))throw new DOMException("The image source is detached.","InvalidStateError");const{width:t,height:n}=function(e){if(l(e))return{width:e.naturalWidth,height:e.naturalHeight};if(u(e))return{width:e.width.baseVal.value,height:e.height.baseVal.value};if(c(e))return{width:e.videoWidth,height:e.videoHeight};if(h(e))return{width:e.width,height:e.height};if(f(e))return{width:e.displayWidth,height:e.displayHeight};if(d(e))return{width:e.width,height:e.height};if(p(e))return{width:e.width,height:e.height};throw new TypeError("The provided value is not of type '(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)'.")}(e);if(0===t||0===n)return null;const a=function(e,t){try{const n=new OffscreenCanvas(e,t);if(n.getContext("2d")instanceof OffscreenCanvasRenderingContext2D)return n;throw void 0}catch(n){const a=document.createElement("canvas");return a.width=e,a.height=t,a}}(t,n).getContext("2d");a.drawImage(e,0,0);try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}async function v(e){if(m(e))return await async function(e){let t;try{if(globalThis.createImageBitmap)t=await createImageBitmap(e);else{if(!globalThis.Image)return e;{t=new Image;let n="";try{n=URL.createObjectURL(e),t.src=n,await t.decode()}finally{URL.revokeObjectURL(n)}}}}catch(e){throw new DOMException("Failed to load or decode Blob.","InvalidStateError")}return await g(t)}(e);if(function(e){try{return e instanceof ImageData}catch(e){return!1}}(e)){if(function(e){return 0===e.data.buffer.byteLength}(e))throw new DOMException("The image data has been detached.","InvalidStateError");return e}return d(e)||p(e)?function(e){const{width:t,height:n}=e;if(0===t||0===n)return null;const a=e.getContext("2d");try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}(e):await g(e)}function b(e,t){return e instanceof DOMException?new DOMException(`${t}: ${e.message}`,e.name):e instanceof Error?new e.constructor(`${t}: ${e.message}`):new Error(`${t}: ${e}`)}const _=["Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","DXFilmEdge","EAN-13","EAN-8","ITF","Linear-Codes","Matrix-Codes","MaxiCode","MicroQRCode","None","PDF417","QRCode","rMQRCode","UPC-A","UPC-E"];function y(e){return e.join("|")}function w(e){const t=k(e);let n=0,a=_.length-1;for(;n<=a;){const e=Math.floor((n+a)/2),i=_[e],r=k(i);if(r===t)return i;r{const n=e.match(/_(.+?)\.wasm$/);return n?`https://fastly.jsdelivr.net/npm/zxing-wasm@1.1.3/dist/${n[1]}/${e}`:t+e}};let N=new WeakMap;function R(e,t){var n;const a=N.get(e);if(null!=a&&a.modulePromise&&void 0===t)return a.modulePromise;const i=null!=(n=null==a?void 0:a.moduleOverrides)?n:O,r=e({...i});return N.set(e,{moduleOverrides:i,modulePromise:r}),r}M.formats;var I,z,q=(I=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0,function(e={}){var t,n,a=e;a.ready=new Promise(((e,a)=>{t=e,n=a}));var i=Object.assign({},a),r="./this.program",o="object"==typeof window,s="function"==typeof importScripts;"object"==typeof process&&"object"==typeof process.versions&&process.versions.node;var l,u="";(o||s)&&(s?u=self.location.href:typeof document<"u"&&document.currentScript&&(u=document.currentScript.src),I&&(u=I),u=0!==u.indexOf("blob:")?u.substr(0,u.replace(/[?#].*/,"").lastIndexOf("/")+1):"",s&&(l=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)})),a.print||console.log.bind(console);var c,d=a.printErr||console.error.bind(console);Object.assign(a,i),i=null,a.arguments&&a.arguments,a.thisProgram&&(r=a.thisProgram),a.quit&&a.quit,a.wasmBinary&&(c=a.wasmBinary),"object"!=typeof WebAssembly&&A("no native wasm support detected");var h,p,f,m,g,v,b,_,y,w=!1;function k(){var e=h.buffer;a.HEAP8=p=new Int8Array(e),a.HEAP16=m=new Int16Array(e),a.HEAPU8=f=new Uint8Array(e),a.HEAPU16=g=new Uint16Array(e),a.HEAP32=v=new Int32Array(e),a.HEAPU32=b=new Uint32Array(e),a.HEAPF32=_=new Float32Array(e),a.HEAPF64=y=new Float64Array(e)}var x=[],S=[],C=[],E=0,T=null;function A(e){var t;null===(t=a.onAbort)||void 0===t||t.call(a,e),d(e="Aborted("+e+")"),w=!0,e+=". Build with -sASSERTIONS for more info.";var i=new WebAssembly.RuntimeError(e);throw n(i),i}var M,P,L=e=>e.startsWith("data:application/octet-stream;base64,");function O(e){if(e==M&&c)return new Uint8Array(c);if(l)return l(e);throw"both async and sync fetching of the wasm failed"}function N(e,t,n){return function(e){return c||!o&&!s||"function"!=typeof fetch?Promise.resolve().then((()=>O(e))):fetch(e,{credentials:"same-origin"}).then((t=>{if(!t.ok)throw"failed to load wasm binary file at '"+e+"'";return t.arrayBuffer()})).catch((()=>O(e)))}(e).then((e=>WebAssembly.instantiate(e,t))).then((e=>e)).then(n,(e=>{d(`failed to asynchronously prepare wasm: ${e}`),A(e)}))}L(M="zxing_reader.wasm")||(P=M,M=a.locateFile?a.locateFile(P,u):u+P);var R=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var z=[],q=0,D=0;function j(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(e){b[this.ptr+4>>2]=e},this.get_type=function(){return b[this.ptr+4>>2]},this.set_destructor=function(e){b[this.ptr+8>>2]=e},this.get_destructor=function(){return b[this.ptr+8>>2]},this.set_caught=function(e){e=e?1:0,p[this.ptr+12|0]=e},this.get_caught=function(){return 0!=p[this.ptr+12|0]},this.set_rethrown=function(e){e=e?1:0,p[this.ptr+13|0]=e},this.get_rethrown=function(){return 0!=p[this.ptr+13|0]},this.init=function(e,t){this.set_adjusted_ptr(0),this.set_type(e),this.set_destructor(t)},this.set_adjusted_ptr=function(e){b[this.ptr+16>>2]=e},this.get_adjusted_ptr=function(){return b[this.ptr+16>>2]},this.get_exception_ptr=function(){if(Nt(this.get_type()))return b[this.excPtr>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.excPtr}}var $=e=>{var t=D;if(!t)return Tt(0),0;var n=new j(t);n.set_adjusted_ptr(t);var a=n.get_type();if(!a)return Tt(0),t;for(var i in e){var r=e[i];if(0===r||r===a)break;var o=n.ptr+16;if(Ot(r,a,o))return Tt(r),t}return Tt(a),t},B={},F=e=>{for(;e.length;){var t=e.pop();e.pop()(t)}};function V(e){return this.fromWireType(v[e>>2])}var U,H,W,Y={},Q={},K={},G=e=>{throw new U(e)},Z=(e,t,n)=>{function a(t){var a=n(t);a.length!==e.length&&G("Mismatched type converter count");for(var i=0;i{Q.hasOwnProperty(e)?i[t]=Q[e]:(r.push(e),Y.hasOwnProperty(e)||(Y[e]=[]),Y[e].push((()=>{i[t]=Q[e],++o===r.length&&a(i)})))})),0===r.length&&a(i)},J=e=>{for(var t="",n=e;f[n];)t+=H[f[n++]];return t},X=e=>{throw new W(e)};function ee(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};var a=t.name;if(e||X(`type "${a}" must have a positive integer typeid pointer`),Q.hasOwnProperty(e)){if(n.ignoreDuplicateRegistrations)return;X(`Cannot register type '${a}' twice`)}if(Q[e]=t,delete K[e],Y.hasOwnProperty(e)){var i=Y[e];delete Y[e],i.forEach((e=>e()))}}(e,t,n)}var te,ne=8,ae=e=>({count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType}),ie=e=>{X(e.$$.ptrType.registeredClass.name+" instance already deleted")},re=!1,oe=e=>{},se=e=>{e.count.value-=1,0===e.count.value&&(e=>{e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)})(e)},le=(e,t,n)=>{if(t===n)return e;if(void 0===n.baseClass)return null;var a=le(e,t,n.baseClass);return null===a?null:n.downcast(a)},ue={},ce=()=>Object.keys(me).length,de=()=>{var e=[];for(var t in me)me.hasOwnProperty(t)&&e.push(me[t]);return e},he=[],pe=()=>{for(;he.length;){var e=he.pop();e.$$.deleteScheduled=!1,e.delete()}},fe=e=>{te=e,he.length&&te&&te(pe)},me={},ge=(e,t)=>(t=((e,t)=>{for(void 0===t&&X("ptr should not be undefined");e.baseClass;)t=e.upcast(t),e=e.baseClass;return t})(e,t),me[t]),ve=(e,t)=>((!t.ptrType||!t.ptr)&&G("makeClassHandle requires ptr and ptrType"),!!t.smartPtrType!=!!t.smartPtr&&G("Both smartPtrType and smartPtr must be specified"),t.count={value:1},_e(Object.create(e,{$$:{value:t,writable:!0}})));function be(e){var t=this.getPointee(e);if(!t)return this.destructor(e),null;var n=ge(this.registeredClass,t);if(void 0!==n){if(0===n.$$.count.value)return n.$$.ptr=t,n.$$.smartPtr=e,n.clone();var a=n.clone();return this.destructor(e),a}function i(){return this.isSmartPointer?ve(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:e}):ve(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var r,o=this.registeredClass.getActualType(t),s=ue[o];if(!s)return i.call(this);r=this.isConst?s.constPointerType:s.pointerType;var l=le(t,this.registeredClass,r.registeredClass);return null===l?i.call(this):this.isSmartPointer?ve(r.registeredClass.instancePrototype,{ptrType:r,ptr:l,smartPtrType:this,smartPtr:e}):ve(r.registeredClass.instancePrototype,{ptrType:r,ptr:l})}var _e=e=>typeof FinalizationRegistry>"u"?(_e=e=>e,e):(re=new FinalizationRegistry((e=>{se(e.$$)})),oe=e=>re.unregister(e),(_e=e=>{var t=e.$$;if(t.smartPtr){var n={$$:t};re.register(e,n,e)}return e})(e));function ye(){}var we=(e,t)=>Object.defineProperty(t,"name",{value:e}),ke=(e,t,n)=>{if(void 0===e[t].overloadTable){var a=e[t];e[t]=function(){return e[t].overloadTable.hasOwnProperty(arguments.length)||X(`Function '${n}' called with an invalid number of arguments (${arguments.length}) - expects one of (${e[t].overloadTable})!`),e[t].overloadTable[arguments.length].apply(this,arguments)},e[t].overloadTable=[],e[t].overloadTable[a.argCount]=a}},xe=(e,t,n)=>{a.hasOwnProperty(e)?((void 0===n||void 0!==a[e].overloadTable&&void 0!==a[e].overloadTable[n])&&X(`Cannot register public name '${e}' twice`),ke(a,e,e),a.hasOwnProperty(n)&&X(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),a[e].overloadTable[n]=t):(a[e]=t,void 0!==n&&(a[e].numArguments=n))};function Se(e,t,n,a,i,r,o,s){this.name=e,this.constructor=t,this.instancePrototype=n,this.rawDestructor=a,this.baseClass=i,this.getActualType=r,this.upcast=o,this.downcast=s,this.pureVirtualFunctions=[]}var Ce=(e,t,n)=>{for(;t!==n;)t.upcast||X(`Expected null or instance of ${n.name}, got an instance of ${t.name}`),e=t.upcast(e),t=t.baseClass;return e};function Ee(e,t){if(null===t)return this.isReference&&X(`null is not a valid ${this.name}`),0;t.$$||X(`Cannot pass "${Ge(t)}" as a ${this.name}`),t.$$.ptr||X(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Ce(t.$$.ptr,n,this.registeredClass)}function Te(e,t){var n;if(null===t)return this.isReference&&X(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),null!==e&&e.push(this.rawDestructor,n),n):0;(!t||!t.$$)&&X(`Cannot pass "${Ge(t)}" as a ${this.name}`),t.$$.ptr||X(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&X(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var a=t.$$.ptrType.registeredClass;if(n=Ce(t.$$.ptr,a,this.registeredClass),this.isSmartPointer)switch(void 0===t.$$.smartPtr&&X("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?n=t.$$.smartPtr:X(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)n=t.$$.smartPtr;else{var i=t.clone();n=this.rawShare(n,Ye.toHandle((()=>i.delete()))),null!==e&&e.push(this.rawDestructor,n)}break;default:X("Unsupporting sharing policy")}return n}function Ae(e,t){if(null===t)return this.isReference&&X(`null is not a valid ${this.name}`),0;t.$$||X(`Cannot pass "${Ge(t)}" as a ${this.name}`),t.$$.ptr||X(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&X(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Ce(t.$$.ptr,n,this.registeredClass)}function Me(e){return this.fromWireType(b[e>>2])}function Pe(e,t,n,a,i,r,o,s,l,u,c){this.name=e,this.registeredClass=t,this.isReference=n,this.isConst=a,this.isSmartPointer=i,this.pointeeType=r,this.sharingPolicy=o,this.rawGetPointee=s,this.rawConstructor=l,this.rawShare=u,this.rawDestructor=c,i||void 0!==t.baseClass?this.toWireType=Te:a?(this.toWireType=Ee,this.destructorFunction=null):(this.toWireType=Ae,this.destructorFunction=null)}var Le,Oe,Ne=(e,t,n)=>{a.hasOwnProperty(e)||G("Replacing nonexistant public symbol"),void 0!==a[e].overloadTable&&void 0!==n?a[e].overloadTable[n]=t:(a[e]=t,a[e].argCount=n)},Re=[],Ie=e=>{var t=Re[e];return t||(e>=Re.length&&(Re.length=e+1),Re[e]=t=Le.get(e)),t},ze=(e,t,n)=>e.includes("j")?((e,t,n)=>{var i=a["dynCall_"+e];return n&&n.length?i.apply(null,[t].concat(n)):i.call(null,t)})(e,t,n):Ie(t).apply(null,n),qe=(e,t)=>{var n=(e=J(e)).includes("j")?((e,t)=>{var n=[];return function(){return n.length=0,Object.assign(n,arguments),ze(e,t,n)}})(e,t):Ie(t);return"function"!=typeof n&&X(`unknown function pointer with signature ${e}: ${t}`),n},De=e=>{var t=Ct(e),n=J(t);return xt(t),n},je=(e,t)=>{var n=[],a={};throw t.forEach((function e(t){if(!a[t]&&!Q[t]){if(K[t])return void K[t].forEach(e);n.push(t),a[t]=!0}})),new Oe(`${e}: `+n.map(De).join([", "]))},$e=(e,t)=>{for(var n=[],a=0;a>2]);return n};function Be(e,t,n,a,i,r){var o=t.length;o<2&&X("argTypes array size mismatch! Must at least get return value and 'this' types!");var s=null!==t[1]&&null!==n,l=function(e){for(var t=1;t{const t=(e=e.trim()).indexOf("(");return-1!==t?e.substr(0,t):e};function Ve(){this.allocated=[void 0],this.freelist=[]}var Ue=new Ve,He=e=>{e>=Ue.reserved&&0==--Ue.get(e).refcount&&Ue.free(e)},We=()=>{for(var e=0,t=Ue.reserved;t(e||X("Cannot use deleted val. handle = "+e),Ue.get(e).value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return Ue.allocate({refcount:1,value:e})}}},Qe=(e,t,n)=>{switch(t){case 1:return n?function(e){return this.fromWireType(p[0|e])}:function(e){return this.fromWireType(f[0|e])};case 2:return n?function(e){return this.fromWireType(m[e>>1])}:function(e){return this.fromWireType(g[e>>1])};case 4:return n?function(e){return this.fromWireType(v[e>>2])}:function(e){return this.fromWireType(b[e>>2])};default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},Ke=(e,t)=>{var n=Q[e];return void 0===n&&X(t+" has unknown type "+De(e)),n},Ge=e=>{if(null===e)return"null";var t=typeof e;return"object"===t||"array"===t||"function"===t?e.toString():""+e},Ze=(e,t)=>{switch(t){case 4:return function(e){return this.fromWireType(_[e>>2])};case 8:return function(e){return this.fromWireType(y[e>>3])};default:throw new TypeError(`invalid float width (${t}): ${e}`)}},Je=(e,t,n)=>{switch(t){case 1:return n?e=>p[0|e]:e=>f[0|e];case 2:return n?e=>m[e>>1]:e=>g[e>>1];case 4:return n?e=>v[e>>2]:e=>b[e>>2];default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},Xe=(e,t,n,a)=>{if(!(a>0))return 0;for(var i=n,r=n+a-1,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),s<=127){if(n>=r)break;t[n++]=s}else if(s<=2047){if(n+1>=r)break;t[n++]=192|s>>6,t[n++]=128|63&s}else if(s<=65535){if(n+2>=r)break;t[n++]=224|s>>12,t[n++]=128|s>>6&63,t[n++]=128|63&s}else{if(n+3>=r)break;t[n++]=240|s>>18,t[n++]=128|s>>12&63,t[n++]=128|s>>6&63,t[n++]=128|63&s}}return t[n]=0,n-i},et=e=>{for(var t=0,n=0;n=55296&&a<=57343?(t+=4,++n):t+=3}return t},tt=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,nt=(e,t)=>e?((e,t,n)=>{for(var a=t+n,i=t;e[i]&&!(i>=a);)++i;if(i-t>16&&e.buffer&&tt)return tt.decode(e.subarray(t,i));for(var r="";t>10,56320|1023&u)}}else r+=String.fromCharCode((31&o)<<6|s)}else r+=String.fromCharCode(o)}return r})(f,e,t):"",at=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,it=(e,t)=>{for(var n=e,a=n>>1,i=a+t/2;!(a>=i)&&g[a];)++a;if((n=a<<1)-e>32&&at)return at.decode(f.subarray(e,n));for(var r="",o=0;!(o>=t/2);++o){var s=m[e+2*o>>1];if(0==s)break;r+=String.fromCharCode(s)}return r},rt=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<2)return 0;for(var i=t,r=(n-=2)<2*e.length?n/2:e.length,o=0;o>1]=s,t+=2}return m[t>>1]=0,t-i},ot=e=>2*e.length,st=(e,t)=>{for(var n=0,a="";!(n>=t/4);){var i=v[e+4*n>>2];if(0==i)break;if(++n,i>=65536){var r=i-65536;a+=String.fromCharCode(55296|r>>10,56320|1023&r)}else a+=String.fromCharCode(i)}return a},lt=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<4)return 0;for(var i=t,r=i+n-4,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),v[t>>2]=s,(t+=4)+4>r)break}return v[t>>2]=0,t-i},ut=e=>{for(var t=0,n=0;n=55296&&a<=57343&&++n,t+=4}return t},ct=[],dt={},ht=()=>{if("object"==typeof globalThis)return globalThis;function e(e){e.$$$embind_global$$$=e;var t="object"==typeof $$$embind_global$$$&&e.$$$embind_global$$$==e;return t||delete e.$$$embind_global$$$,t}if("object"==typeof $$$embind_global$$$||("object"==typeof global&&e(global)?$$$embind_global$$$=global:"object"==typeof self&&e(self)&&($$$embind_global$$$=self),"object"==typeof $$$embind_global$$$))return $$$embind_global$$$;throw Error("unable to get global object.")},pt=Reflect.construct,ft=e=>{var t=(e-h.buffer.byteLength+65535)/65536;try{return h.grow(t),k(),1}catch(e){}},mt={},gt=()=>{if(!gt.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:r||"./this.program"};for(var t in mt)void 0===mt[t]?delete e[t]:e[t]=mt[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);gt.strings=n}return gt.strings},vt=e=>e%4==0&&(e%100!=0||e%400==0),bt=[31,29,31,30,31,30,31,31,30,31,30,31],_t=[31,28,31,30,31,30,31,31,30,31,30,31],yt=(e,t,n,a)=>{var i=b[a+40>>2],r={tm_sec:v[a>>2],tm_min:v[a+4>>2],tm_hour:v[a+8>>2],tm_mday:v[a+12>>2],tm_mon:v[a+16>>2],tm_year:v[a+20>>2],tm_wday:v[a+24>>2],tm_yday:v[a+28>>2],tm_isdst:v[a+32>>2],tm_gmtoff:v[a+36>>2],tm_zone:i?nt(i):""},o=nt(n),s={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var l in s)o=o.replace(new RegExp(l,"g"),s[l]);var u=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=["January","February","March","April","May","June","July","August","September","October","November","December"];function d(e,t,n){for(var a="number"==typeof e?e.toString():e||"";a.length0?1:0}var a;return 0===(a=n(e.getFullYear()-t.getFullYear()))&&0===(a=n(e.getMonth()-t.getMonth()))&&(a=n(e.getDate()-t.getDate())),a}function m(e){switch(e.getDay()){case 0:return new Date(e.getFullYear()-1,11,29);case 1:return e;case 2:return new Date(e.getFullYear(),0,3);case 3:return new Date(e.getFullYear(),0,2);case 4:return new Date(e.getFullYear(),0,1);case 5:return new Date(e.getFullYear()-1,11,31);case 6:return new Date(e.getFullYear()-1,11,30)}}function g(e){var t=((e,t)=>{for(var n=new Date(e.getTime());t>0;){var a=vt(n.getFullYear()),i=n.getMonth(),r=(a?bt:_t)[i];if(!(t>r-n.getDate()))return n.setDate(n.getDate()+t),n;t-=r-n.getDate()+1,n.setDate(1),i<11?n.setMonth(i+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1))}return n})(new Date(e.tm_year+1900,0,1),e.tm_yday),n=new Date(t.getFullYear(),0,4),a=new Date(t.getFullYear()+1,0,4),i=m(n),r=m(a);return f(i,t)<=0?f(r,t)<=0?t.getFullYear()+1:t.getFullYear():t.getFullYear()-1}var _={"%a":e=>u[e.tm_wday].substring(0,3),"%A":e=>u[e.tm_wday],"%b":e=>c[e.tm_mon].substring(0,3),"%B":e=>c[e.tm_mon],"%C":e=>h((e.tm_year+1900)/100|0,2),"%d":e=>h(e.tm_mday,2),"%e":e=>d(e.tm_mday,2," "),"%g":e=>g(e).toString().substring(2),"%G":e=>g(e),"%H":e=>h(e.tm_hour,2),"%I":e=>{var t=e.tm_hour;return 0==t?t=12:t>12&&(t-=12),h(t,2)},"%j":e=>h(e.tm_mday+((e,t)=>{for(var n=0,a=0;a<=t;n+=e[a++]);return n})(vt(e.tm_year+1900)?bt:_t,e.tm_mon-1),3),"%m":e=>h(e.tm_mon+1,2),"%M":e=>h(e.tm_min,2),"%n":()=>"\n","%p":e=>e.tm_hour>=0&&e.tm_hour<12?"AM":"PM","%S":e=>h(e.tm_sec,2),"%t":()=>"\t","%u":e=>e.tm_wday||7,"%U":e=>{var t=e.tm_yday+7-e.tm_wday;return h(Math.floor(t/7),2)},"%V":e=>{var t=Math.floor((e.tm_yday+7-(e.tm_wday+6)%7)/7);if((e.tm_wday+371-e.tm_yday-2)%7<=2&&t++,t){if(53==t){var n=(e.tm_wday+371-e.tm_yday)%7;4!=n&&(3!=n||!vt(e.tm_year))&&(t=1)}}else{t=52;var a=(e.tm_wday+7-e.tm_yday-1)%7;(4==a||5==a&&vt(e.tm_year%400-1))&&t++}return h(t,2)},"%w":e=>e.tm_wday,"%W":e=>{var t=e.tm_yday+7-(e.tm_wday+6)%7;return h(Math.floor(t/7),2)},"%y":e=>(e.tm_year+1900).toString().substring(2),"%Y":e=>e.tm_year+1900,"%z":e=>{var t=e.tm_gmtoff;return(t>=0?"+":"-")+("0000"+(t=(t=Math.abs(t)/60)/60*100+t%60)).slice(-4)},"%Z":e=>e.tm_zone,"%%":()=>"%"};for(var l in o=o.replace(/%%/g,"\0\0"),_)o.includes(l)&&(o=o.replace(new RegExp(l,"g"),_[l](r)));var y=function(e){var t=et(e)+1,n=new Array(t);return Xe(e,n,0,n.length),n}(o=o.replace(/\0\0/g,"%"));return y.length>t?0:(((e,t)=>{p.set(e,t)})(y,e),y.length-1)};U=a.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},(()=>{for(var e=new Array(256),t=0;t<256;++t)e[t]=String.fromCharCode(t);H=e})(),W=a.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},Object.assign(ye.prototype,{isAliasOf(e){if(!(this instanceof ye&&e instanceof ye))return!1;var t=this.$$.ptrType.registeredClass,n=this.$$.ptr;e.$$=e.$$;for(var a=e.$$.ptrType.registeredClass,i=e.$$.ptr;t.baseClass;)n=t.upcast(n),t=t.baseClass;for(;a.baseClass;)i=a.upcast(i),a=a.baseClass;return t===a&&n===i},clone(){if(this.$$.ptr||ie(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e=_e(Object.create(Object.getPrototypeOf(this),{$$:{value:ae(this.$$)}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e},delete(){this.$$.ptr||ie(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&X("Object already scheduled for deletion"),oe(this),se(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||ie(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&X("Object already scheduled for deletion"),he.push(this),1===he.length&&te&&te(pe),this.$$.deleteScheduled=!0,this}}),a.getInheritedInstanceCount=ce,a.getLiveInheritedInstances=de,a.flushPendingDeletes=pe,a.setDelayFunction=fe,Object.assign(Pe.prototype,{getPointee(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e},destructor(e){var t;null===(t=this.rawDestructor)||void 0===t||t.call(this,e)},argPackAdvance:ne,readValueFromPointer:Me,deleteObject(e){null!==e&&e.delete()},fromWireType:be}),Oe=a.UnboundTypeError=((e,t)=>{var n=we(t,(function(e){this.name=t,this.message=e;var n=new Error(e).stack;void 0!==n&&(this.stack=this.toString()+"\n"+n.replace(/^Error(:[^\n]*)?\n/,""))}));return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`},n})(Error,"UnboundTypeError"),Object.assign(Ve.prototype,{get(e){return this.allocated[e]},has(e){return void 0!==this.allocated[e]},allocate(e){var t=this.freelist.pop()||this.allocated.length;return this.allocated[t]=e,t},free(e){this.allocated[e]=void 0,this.freelist.push(e)}}),Ue.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),Ue.reserved=Ue.allocated.length,a.count_emval_handles=We;var wt={s:e=>{var t=new j(e);return t.get_caught()||(t.set_caught(!0),q--),t.set_rethrown(!1),z.push(t),Lt(t.excPtr),t.get_exception_ptr()},u:()=>{Et(0,0);var e=z.pop();Pt(e.excPtr),D=0},b:()=>$([]),g:e=>$([e]),q:(e,t)=>$([e,t]),J:()=>{var e=z.pop();e||A("no exception to throw");var t=e.excPtr;throw e.get_rethrown()||(z.push(e),e.set_rethrown(!0),e.set_caught(!1),q++),D=t},f:(e,t,n)=>{throw new j(e).init(t,n),q++,D=e},V:()=>q,d:e=>{throw D||(D=e),D},da:e=>{var t=B[e];delete B[e];var n=t.rawConstructor,a=t.rawDestructor,i=t.fields,r=i.map((e=>e.getterReturnType)).concat(i.map((e=>e.setterArgumentType)));Z([e],r,(e=>{var r={};return i.forEach(((t,n)=>{var a=t.fieldName,o=e[n],s=t.getter,l=t.getterContext,u=e[n+i.length],c=t.setter,d=t.setterContext;r[a]={read:e=>o.fromWireType(s(l,e)),write:(e,t)=>{var n=[];c(d,e,u.toWireType(n,t)),F(n)}}})),[{name:t.name,fromWireType:e=>{var t={};for(var n in r)t[n]=r[n].read(e);return a(e),t},toWireType:(e,t)=>{for(var i in r)if(!(i in t))throw new TypeError(`Missing field: "${i}"`);var o=n();for(i in r)r[i].write(o,t[i]);return null!==e&&e.push(a,o),o},argPackAdvance:ne,readValueFromPointer:V,destructorFunction:a}]}))},Q:(e,t,n,a,i)=>{},_:(e,t,n,a)=>{ee(e,{name:t=J(t),fromWireType:function(e){return!!e},toWireType:function(e,t){return t?n:a},argPackAdvance:ne,readValueFromPointer:function(e){return this.fromWireType(f[e])},destructorFunction:null})},ca:(e,t,n,a,i,r,o,s,l,u,c,d,h)=>{c=J(c),r=qe(i,r),s&&(s=qe(o,s)),u&&(u=qe(l,u)),h=qe(d,h);var p=(e=>{if(void 0===e)return"_unknown";var t=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return t>=48&&t<=57?`_${e}`:e})(c);xe(p,(function(){je(`Cannot construct ${c} due to unbound types`,[a])})),Z([e,t,n],a?[a]:[],(function(t){var n,i;t=t[0],i=a?(n=t.registeredClass).instancePrototype:ye.prototype;var o=we(c,(function(){if(Object.getPrototypeOf(this)!==l)throw new W("Use 'new' to construct "+c);if(void 0===m.constructor_body)throw new W(c+" has no accessible constructor");var e=m.constructor_body[arguments.length];if(void 0===e)throw new W(`Tried to invoke ctor of ${c} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(m.constructor_body).toString()}) parameters instead!`);return e.apply(this,arguments)})),l=Object.create(i,{constructor:{value:o}});o.prototype=l;var d,f,m=new Se(c,o,l,h,n,r,s,u);m.baseClass&&(null!==(f=(d=m.baseClass).__derivedClasses)&&void 0!==f||(d.__derivedClasses=[]),m.baseClass.__derivedClasses.push(m));var g=new Pe(c,m,!0,!1,!1),v=new Pe(c+"*",m,!1,!1,!1),b=new Pe(c+" const*",m,!1,!0,!1);return ue[e]={pointerType:v,constPointerType:b},Ne(p,o),[g,v,b]}))},ba:(e,t,n,a,i,r)=>{var o=$e(t,n);i=qe(a,i),Z([],[e],(function(e){var n=`constructor ${(e=e[0]).name}`;if(void 0===e.registeredClass.constructor_body&&(e.registeredClass.constructor_body=[]),void 0!==e.registeredClass.constructor_body[t-1])throw new W(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${e.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return e.registeredClass.constructor_body[t-1]=()=>{je(`Cannot construct ${e.name} due to unbound types`,o)},Z([],o,(a=>(a.splice(1,0,null),e.registeredClass.constructor_body[t-1]=Be(n,a,null,i,r),[]))),[]}))},w:(e,t,n,a,i,r,o,s,l)=>{var u=$e(n,a);t=J(t),t=Fe(t),r=qe(i,r),Z([],[e],(function(e){var a=`${(e=e[0]).name}.${t}`;function i(){je(`Cannot call ${a} due to unbound types`,u)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]),s&&e.registeredClass.pureVirtualFunctions.push(t);var l=e.registeredClass.instancePrototype,c=l[t];return void 0===c||void 0===c.overloadTable&&c.className!==e.name&&c.argCount===n-2?(i.argCount=n-2,i.className=e.name,l[t]=i):(ke(l,t,a),l[t].overloadTable[n-2]=i),Z([],u,(function(i){var s=Be(a,i,e,r,o);return void 0===l[t].overloadTable?(s.argCount=n-2,l[t]=s):l[t].overloadTable[n-2]=s,[]})),[]}))},Y:(e,t)=>{ee(e,{name:t=J(t),fromWireType:e=>{var t=Ye.toValue(e);return He(e),t},toWireType:(e,t)=>Ye.toHandle(t),argPackAdvance:ne,readValueFromPointer:V,destructorFunction:null})},x:(e,t,n,a)=>{function i(){}t=J(t),i.values={},ee(e,{name:t,constructor:i,fromWireType:function(e){return this.constructor.values[e]},toWireType:(e,t)=>t.value,argPackAdvance:ne,readValueFromPointer:Qe(t,n,a),destructorFunction:null}),xe(t,i)},h:(e,t,n)=>{var a=Ke(e,"enum");t=J(t);var i=a.constructor,r=Object.create(a.constructor.prototype,{value:{value:n},constructor:{value:we(`${a.name}_${t}`,(function(){}))}});i.values[n]=r,i[t]=r},L:(e,t,n)=>{ee(e,{name:t=J(t),fromWireType:e=>e,toWireType:(e,t)=>t,argPackAdvance:ne,readValueFromPointer:Ze(t,n),destructorFunction:null})},M:(e,t,n,a,i,r,o)=>{var s=$e(t,n);e=J(e),e=Fe(e),i=qe(a,i),xe(e,(function(){je(`Cannot call ${e} due to unbound types`,s)}),t-1),Z([],s,(function(n){var a=[n[0],null].concat(n.slice(1));return Ne(e,Be(e,a,null,i,r),t-1),[]}))},t:(e,t,n,a,i)=>{t=J(t);var r=e=>e;if(0===a){var o=32-8*n;r=e=>e<>>o}var s=t.includes("unsigned");ee(e,{name:t,fromWireType:r,toWireType:s?function(e,t){return this.name,t>>>0}:function(e,t){return this.name,t},argPackAdvance:ne,readValueFromPointer:Je(t,n,0!==a),destructorFunction:null})},o:(e,t,n)=>{var a=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];function i(e){var t=b[e>>2],n=b[e+4>>2];return new a(p.buffer,n,t)}ee(e,{name:n=J(n),fromWireType:i,argPackAdvance:ne,readValueFromPointer:i},{ignoreDuplicateRegistrations:!0})},K:(e,t)=>{var n="std::string"===(t=J(t));ee(e,{name:t,fromWireType(e){var t,a=b[e>>2],i=e+4;if(n)for(var r=i,o=0;o<=a;++o){var s=i+o;if(o==a||0==f[s]){var l=nt(r,s-r);void 0===t?t=l:(t+="\0",t+=l),r=s+1}}else{var u=new Array(a);for(o=0;o>2]=a,n&&i)((e,t,n)=>{Xe(e,f,t,n)})(t,o,a+1);else if(i)for(var s=0;s255&&(xt(o),X("String has UTF-16 code units that do not fit in 8 bits")),f[o+s]=l}else for(s=0;s{var a,i,r,o,s;n=J(n),2===t?(a=it,i=rt,o=ot,r=()=>g,s=1):4===t&&(a=st,i=lt,o=ut,r=()=>b,s=2),ee(e,{name:n,fromWireType:e=>{for(var n,i=b[e>>2],o=r(),l=e+4,u=0;u<=i;++u){var c=e+4+u*t;if(u==i||0==o[c>>s]){var d=a(l,c-l);void 0===n?n=d:(n+="\0",n+=d),l=c+t}}return xt(e),n},toWireType:(e,a)=>{"string"!=typeof a&&X(`Cannot pass non-string to C++ string type ${n}`);var r=o(a),l=St(4+r+t);return b[l>>2]=r>>s,i(a,l+4,r+t),null!==e&&e.push(xt,l),l},argPackAdvance:ne,readValueFromPointer:V,destructorFunction(e){xt(e)}})},A:(e,t,n,a,i,r)=>{B[e]={name:J(t),rawConstructor:qe(n,a),rawDestructor:qe(i,r),fields:[]}},ea:(e,t,n,a,i,r,o,s,l,u)=>{B[e].fields.push({fieldName:J(t),getterReturnType:n,getter:qe(a,i),getterContext:r,setterArgumentType:o,setter:qe(s,l),setterContext:u})},$:(e,t)=>{ee(e,{isVoid:!0,name:t=J(t),argPackAdvance:0,fromWireType:()=>{},toWireType:(e,t)=>{}})},R:(e,t,n,a)=>(e=ct[e])(null,t=Ye.toValue(t),n,a),ha:He,fa:e=>0===e?Ye.toHandle(ht()):(e=(e=>{var t=dt[e];return void 0===t?J(e):t})(e),Ye.toHandle(ht()[e])),Z:(e,t,n)=>{var a=((e,t)=>{for(var n=new Array(e),a=0;a>2],"parameter "+a);return n})(e,t),i=a.shift();e--;var r=new Array(e),o=`methodCaller<(${a.map((e=>e.name)).join(", ")}) => ${i.name}>`;return(e=>{var t=ct.length;return ct.push(e),t})(we(o,((t,o,s,l)=>{for(var u=0,c=0;c{var a=[],i=e.toWireType(a,n);return a.length&&(b[t>>2]=Ye.toHandle(a)),i})(i,s,d)})))},N:e=>{e>4&&(Ue.get(e).refcount+=1)},O:e=>{var t=Ye.toValue(e);F(t),He(e)},aa:(e,t)=>{var n=(e=Ke(e,"_emval_take_value")).readValueFromPointer(t);return Ye.toHandle(n)},B:()=>{A("")},X:(e,t,n)=>f.copyWithin(e,t,t+n),W:e=>{var t,n,a=f.length,i=2147483648;if((e>>>=0)>i)return!1;for(var r=1;r<=4;r*=2){var o=a*(1+.2/r);o=Math.min(o,e+100663296);var s=Math.min(i,(t=Math.max(e,o))+((n=65536)-t%n)%n);if(ft(s))return!0}return!1},T:(e,t)=>{var n=0;return gt().forEach(((a,i)=>{var r=t+n;b[e+4*i>>2]=r,((e,t)=>{for(var n=0;n{var n=gt();b[e>>2]=n.length;var a=0;return n.forEach((e=>a+=e.length+1)),b[t>>2]=a,0},E:function(e,t,n,a){var i=At();try{return Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},D:function(e,t,n,a,i){var r=At();try{return Ie(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},F:function(e,t,n,a){var i=At();try{return Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},n:function(e){var t=At();try{return Ie(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},a:function(e,t){var n=At();try{return Ie(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},e:function(e,t,n){var a=At();try{return Ie(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},m:function(e,t,n,a){var i=At();try{return Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},k:function(e,t,n,a,i){var r=At();try{return Ie(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},H:function(e,t,n,a,i,r){var o=At();try{return Ie(e)(t,n,a,i,r)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},v:function(e,t,n,a,i,r,o){var s=At();try{return Ie(e)(t,n,a,i,r,o)}catch(e){if(Mt(s),e!==e+0)throw e;Et(1,0)}},G:function(e,t,n,a,i,r,o,s){var l=At();try{return Ie(e)(t,n,a,i,r,o,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},z:function(e,t,n,a,i,r,o,s,l,u,c,d){var h=At();try{return Ie(e)(t,n,a,i,r,o,s,l,u,c,d)}catch(e){if(Mt(h),e!==e+0)throw e;Et(1,0)}},P:function(e,t,n,a,i){var r=At();try{return It(e,t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},l:function(e){var t=At();try{Ie(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},j:function(e,t){var n=At();try{Ie(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},c:function(e,t,n){var a=At();try{Ie(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},p:function(e,t,n,a){var i=At();try{Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},I:function(e,t,n,a,i){var r=At();try{Ie(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},r:function(e,t,n,a,i,r,o,s){var l=At();try{Ie(e)(t,n,a,i,r,o,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},i:function(e,t,n,a,i,r,o,s,l,u,c){var d=At();try{Ie(e)(t,n,a,i,r,o,s,l,u,c)}catch(e){if(Mt(d),e!==e+0)throw e;Et(1,0)}},y:function(e,t,n,a,i,r,o,s,l,u,c,d,h,p,f,m){var g=At();try{Ie(e)(t,n,a,i,r,o,s,l,u,c,d,h,p,f,m)}catch(e){if(Mt(g),e!==e+0)throw e;Et(1,0)}},ga:e=>e,S:(e,t,n,a,i)=>yt(e,t,n,a)},kt=function(){var e={a:wt};function t(e,t){return kt=e.exports,h=kt.ia,k(),Le=kt.ma,function(e){S.unshift(e)}(kt.ja),function(){var e;if(E--,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E),0==E&&T){var t=T;T=null,t()}}(),kt}if(function(){var e;E++,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E)}(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){d(`Module.instantiateWasm callback failed with error: ${e}`),n(e)}return function(e,t,n,a){return e||"function"!=typeof WebAssembly.instantiateStreaming||L(t)||"function"!=typeof fetch?N(t,n,a):fetch(t,{credentials:"same-origin"}).then((e=>WebAssembly.instantiateStreaming(e,n).then(a,(function(e){return d(`wasm streaming compile failed: ${e}`),d("falling back to ArrayBuffer instantiation"),N(t,n,a)}))))}(c,M,e,(function(e){t(e.instance)})).catch(n),{}}(),xt=a._free=e=>(xt=a._free=kt.ka)(e),St=a._malloc=e=>(St=a._malloc=kt.la)(e),Ct=e=>(Ct=kt.na)(e),Et=(e,t)=>(Et=kt.oa)(e,t),Tt=e=>(Tt=kt.pa)(e),At=()=>(At=kt.qa)(),Mt=e=>(Mt=kt.ra)(e),Pt=e=>(Pt=kt.sa)(e),Lt=e=>(Lt=kt.ta)(e),Ot=(e,t,n)=>(Ot=kt.ua)(e,t,n),Nt=e=>(Nt=kt.va)(e);a.dynCall_viijii=(e,t,n,i,r,o,s)=>(a.dynCall_viijii=kt.wa)(e,t,n,i,r,o,s);var Rt,It=a.dynCall_jiiii=(e,t,n,i,r)=>(It=a.dynCall_jiiii=kt.xa)(e,t,n,i,r);function zt(){function e(){Rt||(Rt=!0,a.calledRun=!0,!w&&(R(S),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),function(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)e=a.postRun.shift(),C.unshift(e);var e;R(C)}()))}E>0||(function(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)e=a.preRun.shift(),x.unshift(e);var e;R(x)}(),E>0)||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),e()}),1)):e())}if(a.dynCall_iiiiij=(e,t,n,i,r,o,s)=>(a.dynCall_iiiiij=kt.ya)(e,t,n,i,r,o,s),a.dynCall_iiiiijj=(e,t,n,i,r,o,s,l,u)=>(a.dynCall_iiiiijj=kt.za)(e,t,n,i,r,o,s,l,u),a.dynCall_iiiiiijj=(e,t,n,i,r,o,s,l,u,c)=>(a.dynCall_iiiiiijj=kt.Aa)(e,t,n,i,r,o,s,l,u,c),T=function e(){Rt||zt(),Rt||(T=e)},a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return zt(),e.ready});async function D(e,t){return async function(e,t,n=M){const a={...M,...n},i=await R(e),{size:r}=t,o=new Uint8Array(await t.arrayBuffer()),s=i._malloc(r);i.HEAPU8.set(o,s);const l=i.readBarcodesFromImage(s,r,P(i,a));i._free(s);const u=[];for(let e=0;e{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)})(this,z,void 0);try{const a=null==(t=null==e?void 0:e.formats)?void 0:t.filter((e=>"unknown"!==e));if(0===(null==a?void 0:a.length))throw new TypeError("Hint option provided, but is empty.");null==a||a.forEach((e=>{if(!o.has(e))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${e}' is not a valid enum value of type BarcodeFormat.`)})),((e,t,a)=>{n(e,t,"write to private field"),t.set(e,a)})(this,z,null!=a?a:[]),function(e){return R(q,e)}().then((e=>{this.dispatchEvent(new CustomEvent("load",{detail:e}))})).catch((e=>{this.dispatchEvent(new CustomEvent("error",{detail:e}))}))}catch(e){throw b(e,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return r.filter((e=>"unknown"!==e))}async detect(e){try{const t=await v(e);if(null===t)return[];let n;try{n=m(t)?await D(t,{tryHarder:!0,formats:a(this,z).map((e=>o.get(e)))}):await j(t,{tryHarder:!0,formats:a(this,z).map((e=>o.get(e)))})}catch(e){throw console.error(e),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return n.map((e=>{const{topLeft:{x:t,y:n},topRight:{x:a,y:i},bottomLeft:{x:r,y:o},bottomRight:{x:l,y:u}}=e.position,c=Math.min(t,a,r,l),d=Math.min(n,i,o,u),h=Math.max(t,a,r,l),p=Math.max(n,i,o,u);return{boundingBox:new DOMRectReadOnly(c,d,h-c,p-d),rawValue:e.text,format:s(e.format),cornerPoints:[{x:t,y:n},{x:a,y:i},{x:l,y:u},{x:r,y:o}]}}))}catch(e){throw b(e,"Failed to execute 'detect' on 'BarcodeDetector'")}}}z=new WeakMap;const B=(e,t,n="error")=>{let a,i;const r=new Promise(((r,o)=>{a=r,i=o,e.addEventListener(t,a),e.addEventListener(n,i)}));return r.finally((()=>{e.removeEventListener(t,a),e.removeEventListener(n,i)})),r},F=e=>new Promise((t=>setTimeout(t,e)));class V extends Error{constructor(){super("can't process cross-origin image"),this.name="DropImageFetchError"}}class U extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class H extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class W extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let Y;async function Q(e){Y=await async function(e){if(void 0===window.BarcodeDetector)return console.debug("[vue-qrcode-reader] Native BarcodeDetector not supported. Will use polyfill."),new $({formats:e});const t=await window.BarcodeDetector.getSupportedFormats(),n=e.filter((e=>!t.includes(e)));return n.length>0?(console.debug(`[vue-qrcode-reader] Native BarcodeDetector does not support formats ${JSON.stringify(n)}. Will use polyfill.`),new $({formats:e})):(console.debug("[vue-qrcode-reader] Will use native BarcodeDetector."),new window.BarcodeDetector({formats:e}))}(e)}const K=async(e,t=["qr_code"])=>await new $({formats:t}).detect(e),G=async(e,t=["qr_code"])=>{const n=new $({formats:t}),a=await(async e=>{if(e.startsWith("http")&&!1===e.includes(location.host))throw new V;const t=document.createElement("img");return t.src=e,await B(t,"load"),t})(e);return await n.detect(a)};var Z={},J={};Object.defineProperty(J,"__esModule",{value:!0}),J.compactObject=function e(t){return ie(t)?Object.keys(t).reduce((function(n,a){var i=ie(t[a]),r=i?e(t[a]):t[a],o=i&&!Object.keys(r).length;return void 0===r||o?n:Object.assign(n,function(e,t,n){return t=function(e){var t=function(e,t){if("object"!==ee(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||"default");if("object"!==ee(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ee(t)?t:String(t)}(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},a,r))}),{}):t},J.deprecated=function(e,t){ne&&console.warn(e+" is deprecated, please use "+t+" instead.")};var X=J.detectBrowser=function(e){var t={browser:null,version:null};if(typeof e>"u"||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;var n=e.navigator;if(n.mozGetUserMedia)t.browser="firefox",t.version=ae(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=ae(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=ae(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t};function ee(e){return(ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}J.disableLog=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(te=e,e?"adapter.js logging disabled":"adapter.js logging enabled")},J.disableWarnings=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(ne=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))},J.extractVersion=ae,J.filterStats=function(e,t,n){var a=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;var r=[];return e.forEach((function(e){"track"===e.type&&e.trackIdentifier===t.id&&r.push(e)})),r.forEach((function(t){e.forEach((function(n){n.type===a&&n.trackId===t.id&&re(e,n,i)}))})),i},J.log=function(){if("object"===(typeof window>"u"?"undefined":ee(window))){if(te)return;typeof console<"u"&&"function"==typeof console.log&&console.log.apply(console,arguments)}},J.walkStats=re,J.wrapPeerConnectionEvent=function(e,t,n){if(e.RTCPeerConnection){var a=e.RTCPeerConnection.prototype,i=a.addEventListener;a.addEventListener=function(e,a){if(e!==t)return i.apply(this,arguments);var r=function(e){var t=n(e);t&&(a.handleEvent?a.handleEvent(t):a(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(a,r),i.apply(this,[e,r])};var r=a.removeEventListener;a.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return r.apply(this,arguments);if(!this._eventMap[t].has(n))return r.apply(this,arguments);var a=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,r.apply(this,[e,a])},Object.defineProperty(a,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}};var te=!0,ne=!0;function ae(e,t,n){var a=e.match(t);return a&&a.length>=n&&parseInt(a[n],10)}function ie(e){return"[object Object]"===Object.prototype.toString.call(e)}function re(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach((function(a){a.endsWith("Id")?re(e,e.get(t[a]),n):a.endsWith("Ids")&&t[a].forEach((function(t){re(e,e.get(t),n)}))})))}Object.defineProperty(Z,"__esModule",{value:!0});var oe=Z.shimGetUserMedia=function(e,t){var n=e&&e.navigator;if(n.mediaDevices){var a=function(e){if("object"!==ue(e)||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach((function(n){if("require"!==n&&"advanced"!==n&&"mediaSource"!==n){var a="object"===ue(e[n])?e[n]:{ideal:e[n]};void 0!==a.exact&&"number"==typeof a.exact&&(a.min=a.max=a.exact);var i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==a.ideal){t.optional=t.optional||[];var r={};"number"==typeof a.ideal?(r[i("min",n)]=a.ideal,t.optional.push(r),(r={})[i("max",n)]=a.ideal,t.optional.push(r)):(r[i("",n)]=a.ideal,t.optional.push(r))}void 0!==a.exact&&"number"!=typeof a.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=a.exact):["min","max"].forEach((function(e){void 0!==a[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=a[e])}))}})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===ue(e.audio)){var r=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};r((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),r(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=a(e.audio)}if(e&&"object"===ue(e.video)){var o=e.video.facingMode;o=o&&("object"===ue(o)?o:{ideal:o});var s,l=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||l))if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?s=["back","rear"]:("user"===o.exact||"user"===o.ideal)&&(s=["front"]),s)return n.mediaDevices.enumerateDevices().then((function(t){var n=(t=t.filter((function(e){return"videoinput"===e.kind}))).find((function(e){return s.some((function(t){return e.label.toLowerCase().includes(t)}))}));return!n&&t.length&&s.includes("back")&&(n=t[t.length-1]),n&&(e.video.deviceId=o.exact?{exact:n.deviceId}:{ideal:n.deviceId}),e.video=a(e.video),ce("chrome: "+JSON.stringify(e)),i(e)}));e.video=a(e.video)}return ce("chrome: "+JSON.stringify(e)),i(e)},r=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,a){i(e,(function(e){n.webkitGetUserMedia(e,t,(function(e){a&&a(r(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){var o=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(e){return i(e,(function(e){return o(e).then((function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length)throw t.getTracks().forEach((function(e){e.stop()})),new DOMException("","NotFoundError");return t}),(function(e){return Promise.reject(r(e))}))}))}}}},se=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ue(e)&&"function"!=typeof e)return{default:e};var n=le(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function le(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(le=function(e){return e?n:t})(e)}function ue(e){return(ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var ce=se.log;var de={};Object.defineProperty(de,"__esModule",{value:!0});var he=de.shimGetUserMedia=function(e,t){var n=e&&e.navigator,a=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,a){pe.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,a)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){var i=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},r=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(e){return"object"===me(e)&&"object"===me(e.audio)&&(e=JSON.parse(JSON.stringify(e)),i(e.audio,"autoGainControl","mozAutoGainControl"),i(e.audio,"noiseSuppression","mozNoiseSuppression")),r(e)},a&&a.prototype.getSettings){var o=a.prototype.getSettings;a.prototype.getSettings=function(){var e=o.apply(this,arguments);return i(e,"mozAutoGainControl","autoGainControl"),i(e,"mozNoiseSuppression","noiseSuppression"),e}}if(a&&a.prototype.applyConstraints){var s=a.prototype.applyConstraints;a.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===me(e)&&(e=JSON.parse(JSON.stringify(e)),i(e,"autoGainControl","mozAutoGainControl"),i(e,"noiseSuppression","mozNoiseSuppression")),s.apply(this,[e])}}}},pe=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==me(e)&&"function"!=typeof e)return{default:e};var n=fe(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function fe(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(fe=function(e){return e?n:t})(e)}function me(e){return(me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var ge={};Object.defineProperty(ge,"__esModule",{value:!0}),ge.shimAudioContext=function(e){"object"!==ye(e)||e.AudioContext||(e.AudioContext=e.webkitAudioContext)},ge.shimCallbacksAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype,n=t.createOffer,a=t.createAnswer,i=t.setLocalDescription,r=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){var a=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[a]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){var n=arguments.length>=2?arguments[2]:arguments[0],i=a.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};var s=function(e,t,n){var a=i.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a};t.setLocalDescription=s,s=function(e,t,n){var a=r.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.setRemoteDescription=s,s=function(e,t,n){var a=o.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.addIceCandidate=s}},ge.shimConstraints=we,ge.shimCreateOfferLegacy=function(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){typeof e.offerToReceiveAudio<"u"&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);var n=this.getTransceivers().find((function(e){return"audio"===e.receiver.track.kind}));!1===e.offerToReceiveAudio&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0===e.offerToReceiveAudio&&!n&&this.addTransceiver("audio",{direction:"recvonly"}),typeof e.offerToReceiveVideo<"u"&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);var a=this.getTransceivers().find((function(e){return"video"===e.receiver.track.kind}));!1===e.offerToReceiveVideo&&a?"sendrecv"===a.direction?a.setDirection?a.setDirection("sendonly"):a.direction="sendonly":"recvonly"===a.direction&&(a.setDirection?a.setDirection("inactive"):a.direction="inactive"):!0===e.offerToReceiveVideo&&!a&&this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}};var ve=ge.shimGetUserMedia=function(e){var t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){var n=t.mediaDevices,a=n.getUserMedia.bind(n);t.mediaDevices.getUserMedia=function(e){return a(we(e))}}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,a){t.mediaDevices.getUserMedia(e).then(n,a)}.bind(t))};ge.shimLocalStreamsAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((function(a){return t.call(n,a,e)})),e.getVideoTracks().forEach((function(a){return t.call(n,a,e)}))},e.RTCPeerConnection.prototype.addTrack=function(e){for(var n=this,a=arguments.length,i=new Array(a>1?a-1:0),r=1;r=0)){e._remoteStreams.push(t);var n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}}))}),t.apply(e,arguments)}}},ge.shimTrackEventTransceiver=function(e){"object"===ye(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})};var be=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ye(e)&&"function"!=typeof e)return{default:e};var n=_e(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function _e(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(_e=function(e){return e?n:t})(e)}function ye(e){return(ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function we(e){return e&&void 0!==e.video?Object.assign({},e,{video:be.compactObject(e.video)}):e}function ke(e,t){if(!1===e)throw new Error(null!=t?t:"assertion failure")}function xe(e){throw new Error("this code should be unreachable")}const Se=(e=>{let t,n=!1;return(...a)=>(n||(t=e(a),n=!0),t)})((()=>{const e=X(window);switch(e.browser){case"chrome":oe(window,e);break;case"firefox":he(window,e);break;case"safari":ve(window,e);break;default:throw new U}}));let Ce=Promise.resolve({type:"stop",data:{}});async function Ee(e,t,n){var a,i,r;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(t)),!0!==window.isSecureContext)throw new H;if(void 0===(null==(a=null==navigator?void 0:navigator.mediaDevices)?void 0:a.getUserMedia))throw new U;Se(),console.debug("[vue-qrcode-reader] calling getUserMedia");const o=await navigator.mediaDevices.getUserMedia({audio:!1,video:t});void 0!==e.srcObject?e.srcObject=o:void 0!==e.mozSrcObject?e.mozSrcObject=o:window.URL.createObjectURL?e.src=window.URL.createObjectURL(o):window.webkitURL?e.src=window.webkitURL.createObjectURL(o):e.src=o.id,e.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([B(e,"loadeddata"),F(6e3).then((()=>{throw new W}))]),console.debug("[vue-qrcode-reader] video element loaded"),await F(500);const[s]=o.getVideoTracks(),l=null!=(r=null==(i=null==s?void 0:s.getCapabilities)?void 0:i.call(s))?r:{};let u=!1;return n&&l.torch&&(await s.applyConstraints({advanced:[{torch:!0}]}),u=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:e,stream:o,capabilities:l,constraints:t,isTorchOn:u}}}async function Te(e,t,n){console.debug("[vue-qrcode-reader] stopping camera"),e.src="",e.srcObject=null,e.load(),await B(e,"error");for(const e of t.getTracks())null!=n||await e.applyConstraints({advanced:[{torch:!1}]}),t.removeTrack(e),e.stop();return{type:"stop",data:{}}}async function Ae(){if(Ce=Ce.then((e=>{if("stop"===e.type||"failed"===e.type)return e;const{data:{videoEl:t,stream:n,isTorchOn:a}}=e;return Te(t,n,a)})),"start"===(await Ce).type)throw new Error("Something went wrong with the camera task queue (stop task).")}const Me=t.defineComponent({__name:"QrcodeStream",props:{constraints:{type:Object,default:()=>({facingMode:"environment"})},formats:{type:Array,default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function}},emits:["detect","camera-on","camera-off","error"],setup(e,{emit:n}){const a=e,i=n,r=t.ref(a.constraints),o=t.ref(a.formats);t.watch((()=>a.constraints),((e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(r.value=e)}),{deep:!0}),t.watch((()=>a.formats),((e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(o.value=e)}),{deep:!0});const s=t.ref(),l=t.ref(),u=t.ref(),c=t.ref(!1),d=t.ref(!1);t.onMounted((()=>{d.value=!0})),t.onUnmounted((()=>{Ae()}));const h=t.computed((()=>({torch:a.torch,constraints:r.value,shouldStream:d.value&&!a.paused})));t.watch(h,(async e=>{const t=u.value;ke(void 0!==t,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const n=s.value;ke(void 0!==n,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const a=n.getContext("2d");if(ke(null!==a,"if cavnas is defined, canvas 2d context should also be non-null"),e.shouldStream){Ae(),c.value=!1;try{const n=await async function(e,{constraints:t,torch:n,restart:a=!1}){Ce=Ce.then((i=>{if("start"===i.type){const{data:{videoEl:r,stream:o,constraints:s,isTorchOn:l}}=i;return a||e!==r||t!==s||n!==l?Te(r,o,l).then((()=>Ee(e,t,n))):i}if("stop"===i.type||"failed"===i.type)return Ee(e,t,n);xe()})).catch((e=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${e}"`),{type:"failed",error:e})));const i=await Ce;if("stop"===i.type)throw new Error("Something went wrong with the camera task queue (start task).");if("failed"===i.type)throw i.error;if("start"===i.type)return i.data.capabilities;xe()}(t,e);d.value?(c.value=!0,i("camera-on",n)):await Ae()}catch(e){i("error",e)}}else n.width=t.videoWidth,n.height=t.videoHeight,a.drawImage(t,0,0,t.videoWidth,t.videoHeight),Ae(),c.value=!1,i("camera-off")}),{deep:!0}),t.watch(o,(async e=>{d.value&&await Q(e)}));const p=t.computed((()=>h.value.shouldStream&&c.value));t.watch(p,(e=>{if(e){ke(void 0!==s.value,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),f(s.value),ke(void 0!==l.value,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),f(l.value);const e=()=>void 0===a.track?500:40;ke(void 0!==u.value,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),(async(e,{detectHandler:t,locateHandler:n,minDelay:a,formats:i})=>{console.debug("[vue-qrcode-reader] start scanning"),await Q(i);const r=i=>async o=>{if(0===e.readyState)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:s,contentBefore:l,lastScanHadContent:u}=i;if(o-s!l.includes(e.rawValue)));i&&t(a);const s=a.length>0;s&&n(a),!s&&u&&n(a);const c={lastScanned:o,lastScanHadContent:s,contentBefore:i?a.map((e=>e.rawValue)):l};window.requestAnimationFrame(r(c))}}};r({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())})(u.value,{detectHandler:e=>i("detect",e),formats:o.value,locateHandler:m,minDelay:e()})}}));const f=e=>{const t=e.getContext("2d");ke(null!==t,"canvas 2d context should always be non-null"),t.clearRect(0,0,e.width,e.height)},m=e=>{const t=l.value;ke(void 0!==t,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const n=u.value;if(ke(void 0!==n,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),0===e.length||void 0===a.track)f(t);else{const i=n.offsetWidth,r=n.offsetHeight,o=n.videoWidth,s=n.videoHeight,l=Math.max(i/o,r/s),u=o*l,c=s*l,d=u/o,h=c/s,p=(i-u)/2,f=(r-c)/2,m=({x:e,y:t})=>({x:Math.floor(e*d),y:Math.floor(t*h)}),g=({x:e,y:t})=>({x:Math.floor(e+p),y:Math.floor(t+f)}),v=e.map((e=>{const{boundingBox:t,cornerPoints:n}=e,{x:a,y:i}=g(m({x:t.x,y:t.y})),{x:r,y:o}=m({x:t.width,y:t.height});return{...e,cornerPoints:n.map((e=>g(m(e)))),boundingBox:DOMRectReadOnly.fromRect({x:a,y:i,width:r,height:o})}}));t.width=n.offsetWidth,t.height=n.offsetHeight;const b=t.getContext("2d");a.track(v,b)}},g={width:"100%",height:"100%",position:"relative","z-index":"0"},v={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},b={width:"100%",height:"100%","object-fit":"cover"},_=t.computed((()=>p.value?b:{...b,visibility:"hidden",position:"absolute"}));return(e,n)=>(t.openBlock(),t.createElementBlock("div",{style:g},[t.createElementVNode("video",{ref_key:"videoRef",ref:u,style:t.normalizeStyle(_.value),autoplay:"",muted:"",playsinline:""},null,4),t.withDirectives(t.createElementVNode("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:s,style:b},null,512),[[t.vShow,!p.value]]),t.createElementVNode("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:l,style:v},null,512),t.createElementVNode("div",{style:v},[t.renderSlot(e.$slots,"default")])]))}}),Pe=t.defineComponent({__name:"QrcodeCapture",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect"],setup(e,{emit:n}){const a=e,i=n,r=e=>{if(e.target instanceof HTMLInputElement&&e.target.files)for(const t of Array.from(e.target.files))K(t,a.formats).then((e=>{i("detect",e)}))};return(e,n)=>(t.openBlock(),t.createElementBlock("input",{onChange:r,type:"file",name:"image",accept:"image/*",capture:"environment",multiple:""},null,32))}}),Le=t.defineComponent({__name:"QrcodeDropZone",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect","dragover","error"],setup(e,{emit:n}){const a=e,i=n,r=async e=>{try{const t=await e;i("detect",t)}catch(e){i("error",e)}},o=e=>{i("dragover",e)},s=({dataTransfer:e})=>{if(!e)return;o(!1);const t=[...Array.from(e.files)],n=e.getData("text/uri-list");t.forEach((e=>{r(K(e))})),""!==n&&r(G(n,a.formats))};return(e,n)=>(t.openBlock(),t.createElementBlock("div",{onDrop:t.withModifiers(s,["prevent","stop"]),onDragenter:n[0]||(n[0]=t.withModifiers((e=>o(!0)),["prevent","stop"])),onDragleave:n[1]||(n[1]=t.withModifiers((e=>o(!1)),["prevent","stop"])),onDragover:n[2]||(n[2]=t.withModifiers((()=>{}),["prevent","stop"]))},[t.renderSlot(e.$slots,"default")],32))}});function Oe(e){e.component("qrcode-stream",Me),e.component("qrcode-capture",Pe),e.component("qrcode-drop-zone",Le)}const Ne={install:Oe};e.QrcodeCapture=Pe,e.QrcodeDropZone=Le,e.QrcodeStream=Me,e.VueQrcodeReader=Ne,e.install=Oe,e.setZXingModuleOverrides=function(e){return function(e,t){N.set(e,{moduleOverrides:t})}(q,e)},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})})), + */!function(e,t){"object"==typeof exports&&typeof module<"u"?t(exports,require("vue")):"function"==typeof define&&define.amd?define(["exports","vue"],t):t((e=typeof globalThis<"u"?globalThis:e||self).VueQrcodeReader={},e.Vue)}(this,(function(e,t){"use strict";var n=(e,t,n)=>{if(!t.has(e))throw TypeError("Cannot "+n)},a=(e,t,a)=>(n(e,t,"read from private field"),a?a.call(e):t.get(e));const i=[["aztec","Aztec"],["code_128","Code128"],["code_39","Code39"],["code_93","Code93"],["codabar","Codabar"],["databar","DataBar"],["databar_expanded","DataBarExpanded"],["data_matrix","DataMatrix"],["dx_film_edge","DXFilmEdge"],["ean_13","EAN-13"],["ean_8","EAN-8"],["itf","ITF"],["maxi_code","MaxiCode"],["micro_qr_code","MicroQRCode"],["pdf417","PDF417"],["qr_code","QRCode"],["rm_qr_code","rMQRCode"],["upc_a","UPC-A"],["upc_e","UPC-E"],["linear_codes","Linear-Codes"],["matrix_codes","Matrix-Codes"]],r=[...i,["unknown"]].map((e=>e[0])),o=new Map(i);function s(e){for(const[t,n]of o)if(e===n)return t;return"unknown"}function l(e){try{return e instanceof HTMLImageElement}catch(e){return!1}}function u(e){try{return e instanceof SVGImageElement}catch(e){return!1}}function c(e){try{return e instanceof HTMLVideoElement}catch(e){return!1}}function d(e){try{return e instanceof HTMLCanvasElement}catch(e){return!1}}function h(e){try{return e instanceof ImageBitmap}catch(e){return!1}}function p(e){try{return e instanceof OffscreenCanvas}catch(e){return!1}}function f(e){try{return e instanceof VideoFrame}catch(e){return!1}}function m(e){try{return e instanceof Blob}catch(e){return!1}}async function g(e){if(l(e)&&!await async function(e){try{return await e.decode(),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode HTMLImageElement.","InvalidStateError");if(u(e)&&!await async function(e){var t;try{return await(null==(t=e.decode)?void 0:t.call(e)),!0}catch(e){return!1}}(e))throw new DOMException("Failed to load or decode SVGImageElement.","InvalidStateError");if(f(e)&&function(e){return null===e.format}(e))throw new DOMException("VideoFrame is closed.","InvalidStateError");if(c(e)&&(0===e.readyState||1===e.readyState))throw new DOMException("Invalid element or state.","InvalidStateError");if(h(e)&&function(e){return 0===e.width&&0===e.height}(e))throw new DOMException("The image source is detached.","InvalidStateError");const{width:t,height:n}=function(e){if(l(e))return{width:e.naturalWidth,height:e.naturalHeight};if(u(e))return{width:e.width.baseVal.value,height:e.height.baseVal.value};if(c(e))return{width:e.videoWidth,height:e.videoHeight};if(h(e))return{width:e.width,height:e.height};if(f(e))return{width:e.displayWidth,height:e.displayHeight};if(d(e))return{width:e.width,height:e.height};if(p(e))return{width:e.width,height:e.height};throw new TypeError("The provided value is not of type '(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)'.")}(e);if(0===t||0===n)return null;const a=function(e,t){try{const n=new OffscreenCanvas(e,t);if(n.getContext("2d")instanceof OffscreenCanvasRenderingContext2D)return n;throw void 0}catch(n){const a=document.createElement("canvas");return a.width=e,a.height=t,a}}(t,n).getContext("2d");a.drawImage(e,0,0);try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}async function v(e){if(m(e))return await async function(e){let t;try{if(globalThis.createImageBitmap)t=await createImageBitmap(e);else{if(!globalThis.Image)return e;{t=new Image;let n="";try{n=URL.createObjectURL(e),t.src=n,await t.decode()}finally{URL.revokeObjectURL(n)}}}}catch(e){throw new DOMException("Failed to load or decode Blob.","InvalidStateError")}return await g(t)}(e);if(function(e){try{return e instanceof ImageData}catch(e){return!1}}(e)){if(function(e){return 0===e.data.buffer.byteLength}(e))throw new DOMException("The image data has been detached.","InvalidStateError");return e}return d(e)||p(e)?function(e){const{width:t,height:n}=e;if(0===t||0===n)return null;const a=e.getContext("2d");try{return a.getImageData(0,0,t,n)}catch(e){throw new DOMException("Source would taint origin.","SecurityError")}}(e):await g(e)}function b(e,t){return e instanceof DOMException?new DOMException(`${t}: ${e.message}`,e.name):e instanceof Error?new e.constructor(`${t}: ${e.message}`):new Error(`${t}: ${e}`)}const _=["Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","DXFilmEdge","EAN-13","EAN-8","ITF","Linear-Codes","Matrix-Codes","MaxiCode","MicroQRCode","None","PDF417","QRCode","rMQRCode","UPC-A","UPC-E"];function y(e){return e.join("|")}function w(e){const t=k(e);let n=0,a=_.length-1;for(;n<=a;){const e=Math.floor((n+a)/2),i=_[e],r=k(i);if(r===t)return i;r{const n=e.match(/_(.+?)\.wasm$/);return n?`https://fastly.jsdelivr.net/npm/zxing-wasm@1.1.3/dist/${n[1]}/${e}`:t+e}};let N=new WeakMap;function R(e,t){var n;const a=N.get(e);if(null!=a&&a.modulePromise&&void 0===t)return a.modulePromise;const i=null!=(n=null==a?void 0:a.moduleOverrides)?n:O,r=e({...i});return N.set(e,{moduleOverrides:i,modulePromise:r}),r}M.formats;var I,z,q=(I=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0,function(e={}){var t,n,a=e;a.ready=new Promise(((e,a)=>{t=e,n=a}));var i=Object.assign({},a),r="./this.program",o="object"==typeof window,s="function"==typeof importScripts;"object"==typeof process&&"object"==typeof process.versions&&process.versions.node;var l,u="";(o||s)&&(s?u=self.location.href:typeof document<"u"&&document.currentScript&&(u=document.currentScript.src),I&&(u=I),u=0!==u.indexOf("blob:")?u.substr(0,u.replace(/[?#].*/,"").lastIndexOf("/")+1):"",s&&(l=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)})),a.print||console.log.bind(console);var c,d=a.printErr||console.error.bind(console);Object.assign(a,i),i=null,a.arguments&&a.arguments,a.thisProgram&&(r=a.thisProgram),a.quit&&a.quit,a.wasmBinary&&(c=a.wasmBinary),"object"!=typeof WebAssembly&&A("no native wasm support detected");var h,p,f,m,g,v,b,_,y,w=!1;function k(){var e=h.buffer;a.HEAP8=p=new Int8Array(e),a.HEAP16=m=new Int16Array(e),a.HEAPU8=f=new Uint8Array(e),a.HEAPU16=g=new Uint16Array(e),a.HEAP32=v=new Int32Array(e),a.HEAPU32=b=new Uint32Array(e),a.HEAPF32=_=new Float32Array(e),a.HEAPF64=y=new Float64Array(e)}var x=[],S=[],C=[],E=0,T=null;function A(e){var t;null===(t=a.onAbort)||void 0===t||t.call(a,e),d(e="Aborted("+e+")"),w=!0,e+=". Build with -sASSERTIONS for more info.";var i=new WebAssembly.RuntimeError(e);throw n(i),i}var M,P,L=e=>e.startsWith("data:application/octet-stream;base64,");function O(e){if(e==M&&c)return new Uint8Array(c);if(l)return l(e);throw"both async and sync fetching of the wasm failed"}function N(e,t,n){return function(e){return c||!o&&!s||"function"!=typeof fetch?Promise.resolve().then((()=>O(e))):fetch(e,{credentials:"same-origin"}).then((t=>{if(!t.ok)throw"failed to load wasm binary file at '"+e+"'";return t.arrayBuffer()})).catch((()=>O(e)))}(e).then((e=>WebAssembly.instantiate(e,t))).then((e=>e)).then(n,(e=>{d(`failed to asynchronously prepare wasm: ${e}`),A(e)}))}L(M="zxing_reader.wasm")||(P=M,M=a.locateFile?a.locateFile(P,u):u+P);var R=e=>{for(;e.length>0;)e.shift()(a)};a.noExitRuntime;var z=[],q=0,D=0;function j(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(e){b[this.ptr+4>>2]=e},this.get_type=function(){return b[this.ptr+4>>2]},this.set_destructor=function(e){b[this.ptr+8>>2]=e},this.get_destructor=function(){return b[this.ptr+8>>2]},this.set_caught=function(e){e=e?1:0,p[this.ptr+12|0]=e},this.get_caught=function(){return 0!=p[this.ptr+12|0]},this.set_rethrown=function(e){e=e?1:0,p[this.ptr+13|0]=e},this.get_rethrown=function(){return 0!=p[this.ptr+13|0]},this.init=function(e,t){this.set_adjusted_ptr(0),this.set_type(e),this.set_destructor(t)},this.set_adjusted_ptr=function(e){b[this.ptr+16>>2]=e},this.get_adjusted_ptr=function(){return b[this.ptr+16>>2]},this.get_exception_ptr=function(){if(Nt(this.get_type()))return b[this.excPtr>>2];var e=this.get_adjusted_ptr();return 0!==e?e:this.excPtr}}var $=e=>{var t=D;if(!t)return Tt(0),0;var n=new j(t);n.set_adjusted_ptr(t);var a=n.get_type();if(!a)return Tt(0),t;for(var i in e){var r=e[i];if(0===r||r===a)break;var o=n.ptr+16;if(Ot(r,a,o))return Tt(r),t}return Tt(a),t},B={},F=e=>{for(;e.length;){var t=e.pop();e.pop()(t)}};function V(e){return this.fromWireType(v[e>>2])}var U,H,W,Y={},Q={},K={},G=e=>{throw new U(e)},Z=(e,t,n)=>{function a(t){var a=n(t);a.length!==e.length&&G("Mismatched type converter count");for(var i=0;i{Q.hasOwnProperty(e)?i[t]=Q[e]:(r.push(e),Y.hasOwnProperty(e)||(Y[e]=[]),Y[e].push((()=>{i[t]=Q[e],++o===r.length&&a(i)})))})),0===r.length&&a(i)},J=e=>{for(var t="",n=e;f[n];)t+=H[f[n++]];return t},X=e=>{throw new W(e)};function ee(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");return function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};var a=t.name;if(e||X(`type "${a}" must have a positive integer typeid pointer`),Q.hasOwnProperty(e)){if(n.ignoreDuplicateRegistrations)return;X(`Cannot register type '${a}' twice`)}if(Q[e]=t,delete K[e],Y.hasOwnProperty(e)){var i=Y[e];delete Y[e],i.forEach((e=>e()))}}(e,t,n)}var te,ne=8,ae=e=>({count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType}),ie=e=>{X(e.$$.ptrType.registeredClass.name+" instance already deleted")},re=!1,oe=e=>{},se=e=>{e.count.value-=1,0===e.count.value&&(e=>{e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)})(e)},le=(e,t,n)=>{if(t===n)return e;if(void 0===n.baseClass)return null;var a=le(e,t,n.baseClass);return null===a?null:n.downcast(a)},ue={},ce=()=>Object.keys(me).length,de=()=>{var e=[];for(var t in me)me.hasOwnProperty(t)&&e.push(me[t]);return e},he=[],pe=()=>{for(;he.length;){var e=he.pop();e.$$.deleteScheduled=!1,e.delete()}},fe=e=>{te=e,he.length&&te&&te(pe)},me={},ge=(e,t)=>(t=((e,t)=>{for(void 0===t&&X("ptr should not be undefined");e.baseClass;)t=e.upcast(t),e=e.baseClass;return t})(e,t),me[t]),ve=(e,t)=>((!t.ptrType||!t.ptr)&&G("makeClassHandle requires ptr and ptrType"),!!t.smartPtrType!=!!t.smartPtr&&G("Both smartPtrType and smartPtr must be specified"),t.count={value:1},_e(Object.create(e,{$$:{value:t,writable:!0}})));function be(e){var t=this.getPointee(e);if(!t)return this.destructor(e),null;var n=ge(this.registeredClass,t);if(void 0!==n){if(0===n.$$.count.value)return n.$$.ptr=t,n.$$.smartPtr=e,n.clone();var a=n.clone();return this.destructor(e),a}function i(){return this.isSmartPointer?ve(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:e}):ve(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var r,o=this.registeredClass.getActualType(t),s=ue[o];if(!s)return i.call(this);r=this.isConst?s.constPointerType:s.pointerType;var l=le(t,this.registeredClass,r.registeredClass);return null===l?i.call(this):this.isSmartPointer?ve(r.registeredClass.instancePrototype,{ptrType:r,ptr:l,smartPtrType:this,smartPtr:e}):ve(r.registeredClass.instancePrototype,{ptrType:r,ptr:l})}var _e=e=>typeof FinalizationRegistry>"u"?(_e=e=>e,e):(re=new FinalizationRegistry((e=>{se(e.$$)})),oe=e=>re.unregister(e),(_e=e=>{var t=e.$$;if(t.smartPtr){var n={$$:t};re.register(e,n,e)}return e})(e));function ye(){}var we=(e,t)=>Object.defineProperty(t,"name",{value:e}),ke=(e,t,n)=>{if(void 0===e[t].overloadTable){var a=e[t];e[t]=function(){return e[t].overloadTable.hasOwnProperty(arguments.length)||X(`Function '${n}' called with an invalid number of arguments (${arguments.length}) - expects one of (${e[t].overloadTable})!`),e[t].overloadTable[arguments.length].apply(this,arguments)},e[t].overloadTable=[],e[t].overloadTable[a.argCount]=a}},xe=(e,t,n)=>{a.hasOwnProperty(e)?((void 0===n||void 0!==a[e].overloadTable&&void 0!==a[e].overloadTable[n])&&X(`Cannot register public name '${e}' twice`),ke(a,e,e),a.hasOwnProperty(n)&&X(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),a[e].overloadTable[n]=t):(a[e]=t,void 0!==n&&(a[e].numArguments=n))};function Se(e,t,n,a,i,r,o,s){this.name=e,this.constructor=t,this.instancePrototype=n,this.rawDestructor=a,this.baseClass=i,this.getActualType=r,this.upcast=o,this.downcast=s,this.pureVirtualFunctions=[]}var Ce=(e,t,n)=>{for(;t!==n;)t.upcast||X(`Expected null or instance of ${n.name}, got an instance of ${t.name}`),e=t.upcast(e),t=t.baseClass;return e};function Ee(e,t){if(null===t)return this.isReference&&X(`null is not a valid ${this.name}`),0;t.$$||X(`Cannot pass "${Ge(t)}" as a ${this.name}`),t.$$.ptr||X(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Ce(t.$$.ptr,n,this.registeredClass)}function Te(e,t){var n;if(null===t)return this.isReference&&X(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),null!==e&&e.push(this.rawDestructor,n),n):0;(!t||!t.$$)&&X(`Cannot pass "${Ge(t)}" as a ${this.name}`),t.$$.ptr||X(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&X(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var a=t.$$.ptrType.registeredClass;if(n=Ce(t.$$.ptr,a,this.registeredClass),this.isSmartPointer)switch(void 0===t.$$.smartPtr&&X("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?n=t.$$.smartPtr:X(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)n=t.$$.smartPtr;else{var i=t.clone();n=this.rawShare(n,Ye.toHandle((()=>i.delete()))),null!==e&&e.push(this.rawDestructor,n)}break;default:X("Unsupporting sharing policy")}return n}function Ae(e,t){if(null===t)return this.isReference&&X(`null is not a valid ${this.name}`),0;t.$$||X(`Cannot pass "${Ge(t)}" as a ${this.name}`),t.$$.ptr||X(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&X(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var n=t.$$.ptrType.registeredClass;return Ce(t.$$.ptr,n,this.registeredClass)}function Me(e){return this.fromWireType(b[e>>2])}function Pe(e,t,n,a,i,r,o,s,l,u,c){this.name=e,this.registeredClass=t,this.isReference=n,this.isConst=a,this.isSmartPointer=i,this.pointeeType=r,this.sharingPolicy=o,this.rawGetPointee=s,this.rawConstructor=l,this.rawShare=u,this.rawDestructor=c,i||void 0!==t.baseClass?this.toWireType=Te:a?(this.toWireType=Ee,this.destructorFunction=null):(this.toWireType=Ae,this.destructorFunction=null)}var Le,Oe,Ne=(e,t,n)=>{a.hasOwnProperty(e)||G("Replacing nonexistant public symbol"),void 0!==a[e].overloadTable&&void 0!==n?a[e].overloadTable[n]=t:(a[e]=t,a[e].argCount=n)},Re=[],Ie=e=>{var t=Re[e];return t||(e>=Re.length&&(Re.length=e+1),Re[e]=t=Le.get(e)),t},ze=(e,t,n)=>e.includes("j")?((e,t,n)=>{var i=a["dynCall_"+e];return n&&n.length?i.apply(null,[t].concat(n)):i.call(null,t)})(e,t,n):Ie(t).apply(null,n),qe=(e,t)=>{var n=(e=J(e)).includes("j")?((e,t)=>{var n=[];return function(){return n.length=0,Object.assign(n,arguments),ze(e,t,n)}})(e,t):Ie(t);return"function"!=typeof n&&X(`unknown function pointer with signature ${e}: ${t}`),n},De=e=>{var t=Ct(e),n=J(t);return xt(t),n},je=(e,t)=>{var n=[],a={};throw t.forEach((function e(t){if(!a[t]&&!Q[t]){if(K[t])return void K[t].forEach(e);n.push(t),a[t]=!0}})),new Oe(`${e}: `+n.map(De).join([", "]))},$e=(e,t)=>{for(var n=[],a=0;a>2]);return n};function Be(e,t,n,a,i,r){var o=t.length;o<2&&X("argTypes array size mismatch! Must at least get return value and 'this' types!");var s=null!==t[1]&&null!==n,l=function(e){for(var t=1;t{const t=(e=e.trim()).indexOf("(");return-1!==t?e.substr(0,t):e};function Ve(){this.allocated=[void 0],this.freelist=[]}var Ue=new Ve,He=e=>{e>=Ue.reserved&&0==--Ue.get(e).refcount&&Ue.free(e)},We=()=>{for(var e=0,t=Ue.reserved;t(e||X("Cannot use deleted val. handle = "+e),Ue.get(e).value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return Ue.allocate({refcount:1,value:e})}}},Qe=(e,t,n)=>{switch(t){case 1:return n?function(e){return this.fromWireType(p[0|e])}:function(e){return this.fromWireType(f[0|e])};case 2:return n?function(e){return this.fromWireType(m[e>>1])}:function(e){return this.fromWireType(g[e>>1])};case 4:return n?function(e){return this.fromWireType(v[e>>2])}:function(e){return this.fromWireType(b[e>>2])};default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},Ke=(e,t)=>{var n=Q[e];return void 0===n&&X(t+" has unknown type "+De(e)),n},Ge=e=>{if(null===e)return"null";var t=typeof e;return"object"===t||"array"===t||"function"===t?e.toString():""+e},Ze=(e,t)=>{switch(t){case 4:return function(e){return this.fromWireType(_[e>>2])};case 8:return function(e){return this.fromWireType(y[e>>3])};default:throw new TypeError(`invalid float width (${t}): ${e}`)}},Je=(e,t,n)=>{switch(t){case 1:return n?e=>p[0|e]:e=>f[0|e];case 2:return n?e=>m[e>>1]:e=>g[e>>1];case 4:return n?e=>v[e>>2]:e=>b[e>>2];default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},Xe=(e,t,n,a)=>{if(!(a>0))return 0;for(var i=n,r=n+a-1,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),s<=127){if(n>=r)break;t[n++]=s}else if(s<=2047){if(n+1>=r)break;t[n++]=192|s>>6,t[n++]=128|63&s}else if(s<=65535){if(n+2>=r)break;t[n++]=224|s>>12,t[n++]=128|s>>6&63,t[n++]=128|63&s}else{if(n+3>=r)break;t[n++]=240|s>>18,t[n++]=128|s>>12&63,t[n++]=128|s>>6&63,t[n++]=128|63&s}}return t[n]=0,n-i},et=e=>{for(var t=0,n=0;n=55296&&a<=57343?(t+=4,++n):t+=3}return t},tt=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,nt=(e,t)=>e?((e,t,n)=>{for(var a=t+n,i=t;e[i]&&!(i>=a);)++i;if(i-t>16&&e.buffer&&tt)return tt.decode(e.subarray(t,i));for(var r="";t>10,56320|1023&u)}}else r+=String.fromCharCode((31&o)<<6|s)}else r+=String.fromCharCode(o)}return r})(f,e,t):"",at=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,it=(e,t)=>{for(var n=e,a=n>>1,i=a+t/2;!(a>=i)&&g[a];)++a;if((n=a<<1)-e>32&&at)return at.decode(f.subarray(e,n));for(var r="",o=0;!(o>=t/2);++o){var s=m[e+2*o>>1];if(0==s)break;r+=String.fromCharCode(s)}return r},rt=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<2)return 0;for(var i=t,r=(n-=2)<2*e.length?n/2:e.length,o=0;o>1]=s,t+=2}return m[t>>1]=0,t-i},ot=e=>2*e.length,st=(e,t)=>{for(var n=0,a="";!(n>=t/4);){var i=v[e+4*n>>2];if(0==i)break;if(++n,i>=65536){var r=i-65536;a+=String.fromCharCode(55296|r>>10,56320|1023&r)}else a+=String.fromCharCode(i)}return a},lt=(e,t,n)=>{var a;if(null!==(a=n)&&void 0!==a||(n=2147483647),n<4)return 0;for(var i=t,r=i+n-4,o=0;o=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++o)),v[t>>2]=s,(t+=4)+4>r)break}return v[t>>2]=0,t-i},ut=e=>{for(var t=0,n=0;n=55296&&a<=57343&&++n,t+=4}return t},ct=[],dt={},ht=()=>{if("object"==typeof globalThis)return globalThis;function e(e){e.$$$embind_global$$$=e;var t="object"==typeof $$$embind_global$$$&&e.$$$embind_global$$$==e;return t||delete e.$$$embind_global$$$,t}if("object"==typeof $$$embind_global$$$||("object"==typeof global&&e(global)?$$$embind_global$$$=global:"object"==typeof self&&e(self)&&($$$embind_global$$$=self),"object"==typeof $$$embind_global$$$))return $$$embind_global$$$;throw Error("unable to get global object.")},pt=Reflect.construct,ft=e=>{var t=(e-h.buffer.byteLength+65535)/65536;try{return h.grow(t),k(),1}catch(e){}},mt={},gt=()=>{if(!gt.strings){var e={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:r||"./this.program"};for(var t in mt)void 0===mt[t]?delete e[t]:e[t]=mt[t];var n=[];for(var t in e)n.push(`${t}=${e[t]}`);gt.strings=n}return gt.strings},vt=e=>e%4==0&&(e%100!=0||e%400==0),bt=[31,29,31,30,31,30,31,31,30,31,30,31],_t=[31,28,31,30,31,30,31,31,30,31,30,31],yt=(e,t,n,a)=>{var i=b[a+40>>2],r={tm_sec:v[a>>2],tm_min:v[a+4>>2],tm_hour:v[a+8>>2],tm_mday:v[a+12>>2],tm_mon:v[a+16>>2],tm_year:v[a+20>>2],tm_wday:v[a+24>>2],tm_yday:v[a+28>>2],tm_isdst:v[a+32>>2],tm_gmtoff:v[a+36>>2],tm_zone:i?nt(i):""},o=nt(n),s={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var l in s)o=o.replace(new RegExp(l,"g"),s[l]);var u=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=["January","February","March","April","May","June","July","August","September","October","November","December"];function d(e,t,n){for(var a="number"==typeof e?e.toString():e||"";a.length0?1:0}var a;return 0===(a=n(e.getFullYear()-t.getFullYear()))&&0===(a=n(e.getMonth()-t.getMonth()))&&(a=n(e.getDate()-t.getDate())),a}function m(e){switch(e.getDay()){case 0:return new Date(e.getFullYear()-1,11,29);case 1:return e;case 2:return new Date(e.getFullYear(),0,3);case 3:return new Date(e.getFullYear(),0,2);case 4:return new Date(e.getFullYear(),0,1);case 5:return new Date(e.getFullYear()-1,11,31);case 6:return new Date(e.getFullYear()-1,11,30)}}function g(e){var t=((e,t)=>{for(var n=new Date(e.getTime());t>0;){var a=vt(n.getFullYear()),i=n.getMonth(),r=(a?bt:_t)[i];if(!(t>r-n.getDate()))return n.setDate(n.getDate()+t),n;t-=r-n.getDate()+1,n.setDate(1),i<11?n.setMonth(i+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1))}return n})(new Date(e.tm_year+1900,0,1),e.tm_yday),n=new Date(t.getFullYear(),0,4),a=new Date(t.getFullYear()+1,0,4),i=m(n),r=m(a);return f(i,t)<=0?f(r,t)<=0?t.getFullYear()+1:t.getFullYear():t.getFullYear()-1}var _={"%a":e=>u[e.tm_wday].substring(0,3),"%A":e=>u[e.tm_wday],"%b":e=>c[e.tm_mon].substring(0,3),"%B":e=>c[e.tm_mon],"%C":e=>h((e.tm_year+1900)/100|0,2),"%d":e=>h(e.tm_mday,2),"%e":e=>d(e.tm_mday,2," "),"%g":e=>g(e).toString().substring(2),"%G":e=>g(e),"%H":e=>h(e.tm_hour,2),"%I":e=>{var t=e.tm_hour;return 0==t?t=12:t>12&&(t-=12),h(t,2)},"%j":e=>h(e.tm_mday+((e,t)=>{for(var n=0,a=0;a<=t;n+=e[a++]);return n})(vt(e.tm_year+1900)?bt:_t,e.tm_mon-1),3),"%m":e=>h(e.tm_mon+1,2),"%M":e=>h(e.tm_min,2),"%n":()=>"\n","%p":e=>e.tm_hour>=0&&e.tm_hour<12?"AM":"PM","%S":e=>h(e.tm_sec,2),"%t":()=>"\t","%u":e=>e.tm_wday||7,"%U":e=>{var t=e.tm_yday+7-e.tm_wday;return h(Math.floor(t/7),2)},"%V":e=>{var t=Math.floor((e.tm_yday+7-(e.tm_wday+6)%7)/7);if((e.tm_wday+371-e.tm_yday-2)%7<=2&&t++,t){if(53==t){var n=(e.tm_wday+371-e.tm_yday)%7;4!=n&&(3!=n||!vt(e.tm_year))&&(t=1)}}else{t=52;var a=(e.tm_wday+7-e.tm_yday-1)%7;(4==a||5==a&&vt(e.tm_year%400-1))&&t++}return h(t,2)},"%w":e=>e.tm_wday,"%W":e=>{var t=e.tm_yday+7-(e.tm_wday+6)%7;return h(Math.floor(t/7),2)},"%y":e=>(e.tm_year+1900).toString().substring(2),"%Y":e=>e.tm_year+1900,"%z":e=>{var t=e.tm_gmtoff;return(t>=0?"+":"-")+("0000"+(t=(t=Math.abs(t)/60)/60*100+t%60)).slice(-4)},"%Z":e=>e.tm_zone,"%%":()=>"%"};for(var l in o=o.replace(/%%/g,"\0\0"),_)o.includes(l)&&(o=o.replace(new RegExp(l,"g"),_[l](r)));var y=function(e){var t=et(e)+1,n=new Array(t);return Xe(e,n,0,n.length),n}(o=o.replace(/\0\0/g,"%"));return y.length>t?0:(((e,t)=>{p.set(e,t)})(y,e),y.length-1)};U=a.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},(()=>{for(var e=new Array(256),t=0;t<256;++t)e[t]=String.fromCharCode(t);H=e})(),W=a.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},Object.assign(ye.prototype,{isAliasOf(e){if(!(this instanceof ye&&e instanceof ye))return!1;var t=this.$$.ptrType.registeredClass,n=this.$$.ptr;e.$$=e.$$;for(var a=e.$$.ptrType.registeredClass,i=e.$$.ptr;t.baseClass;)n=t.upcast(n),t=t.baseClass;for(;a.baseClass;)i=a.upcast(i),a=a.baseClass;return t===a&&n===i},clone(){if(this.$$.ptr||ie(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e=_e(Object.create(Object.getPrototypeOf(this),{$$:{value:ae(this.$$)}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e},delete(){this.$$.ptr||ie(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&X("Object already scheduled for deletion"),oe(this),se(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||ie(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&X("Object already scheduled for deletion"),he.push(this),1===he.length&&te&&te(pe),this.$$.deleteScheduled=!0,this}}),a.getInheritedInstanceCount=ce,a.getLiveInheritedInstances=de,a.flushPendingDeletes=pe,a.setDelayFunction=fe,Object.assign(Pe.prototype,{getPointee(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e},destructor(e){var t;null===(t=this.rawDestructor)||void 0===t||t.call(this,e)},argPackAdvance:ne,readValueFromPointer:Me,deleteObject(e){null!==e&&e.delete()},fromWireType:be}),Oe=a.UnboundTypeError=((e,t)=>{var n=we(t,(function(e){this.name=t,this.message=e;var n=new Error(e).stack;void 0!==n&&(this.stack=this.toString()+"\n"+n.replace(/^Error(:[^\n]*)?\n/,""))}));return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.toString=function(){return void 0===this.message?this.name:`${this.name}: ${this.message}`},n})(Error,"UnboundTypeError"),Object.assign(Ve.prototype,{get(e){return this.allocated[e]},has(e){return void 0!==this.allocated[e]},allocate(e){var t=this.freelist.pop()||this.allocated.length;return this.allocated[t]=e,t},free(e){this.allocated[e]=void 0,this.freelist.push(e)}}),Ue.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),Ue.reserved=Ue.allocated.length,a.count_emval_handles=We;var wt={s:e=>{var t=new j(e);return t.get_caught()||(t.set_caught(!0),q--),t.set_rethrown(!1),z.push(t),Lt(t.excPtr),t.get_exception_ptr()},u:()=>{Et(0,0);var e=z.pop();Pt(e.excPtr),D=0},b:()=>$([]),g:e=>$([e]),q:(e,t)=>$([e,t]),J:()=>{var e=z.pop();e||A("no exception to throw");var t=e.excPtr;throw e.get_rethrown()||(z.push(e),e.set_rethrown(!0),e.set_caught(!1),q++),D=t},f:(e,t,n)=>{throw new j(e).init(t,n),q++,D=e},V:()=>q,d:e=>{throw D||(D=e),D},da:e=>{var t=B[e];delete B[e];var n=t.rawConstructor,a=t.rawDestructor,i=t.fields,r=i.map((e=>e.getterReturnType)).concat(i.map((e=>e.setterArgumentType)));Z([e],r,(e=>{var r={};return i.forEach(((t,n)=>{var a=t.fieldName,o=e[n],s=t.getter,l=t.getterContext,u=e[n+i.length],c=t.setter,d=t.setterContext;r[a]={read:e=>o.fromWireType(s(l,e)),write:(e,t)=>{var n=[];c(d,e,u.toWireType(n,t)),F(n)}}})),[{name:t.name,fromWireType:e=>{var t={};for(var n in r)t[n]=r[n].read(e);return a(e),t},toWireType:(e,t)=>{for(var i in r)if(!(i in t))throw new TypeError(`Missing field: "${i}"`);var o=n();for(i in r)r[i].write(o,t[i]);return null!==e&&e.push(a,o),o},argPackAdvance:ne,readValueFromPointer:V,destructorFunction:a}]}))},Q:(e,t,n,a,i)=>{},_:(e,t,n,a)=>{ee(e,{name:t=J(t),fromWireType:function(e){return!!e},toWireType:function(e,t){return t?n:a},argPackAdvance:ne,readValueFromPointer:function(e){return this.fromWireType(f[e])},destructorFunction:null})},ca:(e,t,n,a,i,r,o,s,l,u,c,d,h)=>{c=J(c),r=qe(i,r),s&&(s=qe(o,s)),u&&(u=qe(l,u)),h=qe(d,h);var p=(e=>{if(void 0===e)return"_unknown";var t=(e=e.replace(/[^a-zA-Z0-9_]/g,"$")).charCodeAt(0);return t>=48&&t<=57?`_${e}`:e})(c);xe(p,(function(){je(`Cannot construct ${c} due to unbound types`,[a])})),Z([e,t,n],a?[a]:[],(function(t){var n,i;t=t[0],i=a?(n=t.registeredClass).instancePrototype:ye.prototype;var o=we(c,(function(){if(Object.getPrototypeOf(this)!==l)throw new W("Use 'new' to construct "+c);if(void 0===m.constructor_body)throw new W(c+" has no accessible constructor");var e=m.constructor_body[arguments.length];if(void 0===e)throw new W(`Tried to invoke ctor of ${c} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(m.constructor_body).toString()}) parameters instead!`);return e.apply(this,arguments)})),l=Object.create(i,{constructor:{value:o}});o.prototype=l;var d,f,m=new Se(c,o,l,h,n,r,s,u);m.baseClass&&(null!==(f=(d=m.baseClass).__derivedClasses)&&void 0!==f||(d.__derivedClasses=[]),m.baseClass.__derivedClasses.push(m));var g=new Pe(c,m,!0,!1,!1),v=new Pe(c+"*",m,!1,!1,!1),b=new Pe(c+" const*",m,!1,!0,!1);return ue[e]={pointerType:v,constPointerType:b},Ne(p,o),[g,v,b]}))},ba:(e,t,n,a,i,r)=>{var o=$e(t,n);i=qe(a,i),Z([],[e],(function(e){var n=`constructor ${(e=e[0]).name}`;if(void 0===e.registeredClass.constructor_body&&(e.registeredClass.constructor_body=[]),void 0!==e.registeredClass.constructor_body[t-1])throw new W(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${e.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return e.registeredClass.constructor_body[t-1]=()=>{je(`Cannot construct ${e.name} due to unbound types`,o)},Z([],o,(a=>(a.splice(1,0,null),e.registeredClass.constructor_body[t-1]=Be(n,a,null,i,r),[]))),[]}))},w:(e,t,n,a,i,r,o,s,l)=>{var u=$e(n,a);t=J(t),t=Fe(t),r=qe(i,r),Z([],[e],(function(e){var a=`${(e=e[0]).name}.${t}`;function i(){je(`Cannot call ${a} due to unbound types`,u)}t.startsWith("@@")&&(t=Symbol[t.substring(2)]),s&&e.registeredClass.pureVirtualFunctions.push(t);var l=e.registeredClass.instancePrototype,c=l[t];return void 0===c||void 0===c.overloadTable&&c.className!==e.name&&c.argCount===n-2?(i.argCount=n-2,i.className=e.name,l[t]=i):(ke(l,t,a),l[t].overloadTable[n-2]=i),Z([],u,(function(i){var s=Be(a,i,e,r,o);return void 0===l[t].overloadTable?(s.argCount=n-2,l[t]=s):l[t].overloadTable[n-2]=s,[]})),[]}))},Y:(e,t)=>{ee(e,{name:t=J(t),fromWireType:e=>{var t=Ye.toValue(e);return He(e),t},toWireType:(e,t)=>Ye.toHandle(t),argPackAdvance:ne,readValueFromPointer:V,destructorFunction:null})},x:(e,t,n,a)=>{function i(){}t=J(t),i.values={},ee(e,{name:t,constructor:i,fromWireType:function(e){return this.constructor.values[e]},toWireType:(e,t)=>t.value,argPackAdvance:ne,readValueFromPointer:Qe(t,n,a),destructorFunction:null}),xe(t,i)},h:(e,t,n)=>{var a=Ke(e,"enum");t=J(t);var i=a.constructor,r=Object.create(a.constructor.prototype,{value:{value:n},constructor:{value:we(`${a.name}_${t}`,(function(){}))}});i.values[n]=r,i[t]=r},L:(e,t,n)=>{ee(e,{name:t=J(t),fromWireType:e=>e,toWireType:(e,t)=>t,argPackAdvance:ne,readValueFromPointer:Ze(t,n),destructorFunction:null})},M:(e,t,n,a,i,r,o)=>{var s=$e(t,n);e=J(e),e=Fe(e),i=qe(a,i),xe(e,(function(){je(`Cannot call ${e} due to unbound types`,s)}),t-1),Z([],s,(function(n){var a=[n[0],null].concat(n.slice(1));return Ne(e,Be(e,a,null,i,r),t-1),[]}))},t:(e,t,n,a,i)=>{t=J(t);var r=e=>e;if(0===a){var o=32-8*n;r=e=>e<>>o}var s=t.includes("unsigned");ee(e,{name:t,fromWireType:r,toWireType:s?function(e,t){return this.name,t>>>0}:function(e,t){return this.name,t},argPackAdvance:ne,readValueFromPointer:Je(t,n,0!==a),destructorFunction:null})},o:(e,t,n)=>{var a=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array][t];function i(e){var t=b[e>>2],n=b[e+4>>2];return new a(p.buffer,n,t)}ee(e,{name:n=J(n),fromWireType:i,argPackAdvance:ne,readValueFromPointer:i},{ignoreDuplicateRegistrations:!0})},K:(e,t)=>{var n="std::string"===(t=J(t));ee(e,{name:t,fromWireType(e){var t,a=b[e>>2],i=e+4;if(n)for(var r=i,o=0;o<=a;++o){var s=i+o;if(o==a||0==f[s]){var l=nt(r,s-r);void 0===t?t=l:(t+="\0",t+=l),r=s+1}}else{var u=new Array(a);for(o=0;o>2]=a,n&&i)((e,t,n)=>{Xe(e,f,t,n)})(t,o,a+1);else if(i)for(var s=0;s255&&(xt(o),X("String has UTF-16 code units that do not fit in 8 bits")),f[o+s]=l}else for(s=0;s{var a,i,r,o,s;n=J(n),2===t?(a=it,i=rt,o=ot,r=()=>g,s=1):4===t&&(a=st,i=lt,o=ut,r=()=>b,s=2),ee(e,{name:n,fromWireType:e=>{for(var n,i=b[e>>2],o=r(),l=e+4,u=0;u<=i;++u){var c=e+4+u*t;if(u==i||0==o[c>>s]){var d=a(l,c-l);void 0===n?n=d:(n+="\0",n+=d),l=c+t}}return xt(e),n},toWireType:(e,a)=>{"string"!=typeof a&&X(`Cannot pass non-string to C++ string type ${n}`);var r=o(a),l=St(4+r+t);return b[l>>2]=r>>s,i(a,l+4,r+t),null!==e&&e.push(xt,l),l},argPackAdvance:ne,readValueFromPointer:V,destructorFunction(e){xt(e)}})},A:(e,t,n,a,i,r)=>{B[e]={name:J(t),rawConstructor:qe(n,a),rawDestructor:qe(i,r),fields:[]}},ea:(e,t,n,a,i,r,o,s,l,u)=>{B[e].fields.push({fieldName:J(t),getterReturnType:n,getter:qe(a,i),getterContext:r,setterArgumentType:o,setter:qe(s,l),setterContext:u})},$:(e,t)=>{ee(e,{isVoid:!0,name:t=J(t),argPackAdvance:0,fromWireType:()=>{},toWireType:(e,t)=>{}})},R:(e,t,n,a)=>(e=ct[e])(null,t=Ye.toValue(t),n,a),ha:He,fa:e=>0===e?Ye.toHandle(ht()):(e=(e=>{var t=dt[e];return void 0===t?J(e):t})(e),Ye.toHandle(ht()[e])),Z:(e,t,n)=>{var a=((e,t)=>{for(var n=new Array(e),a=0;a>2],"parameter "+a);return n})(e,t),i=a.shift();e--;var r=new Array(e),o=`methodCaller<(${a.map((e=>e.name)).join(", ")}) => ${i.name}>`;return(e=>{var t=ct.length;return ct.push(e),t})(we(o,((t,o,s,l)=>{for(var u=0,c=0;c{var a=[],i=e.toWireType(a,n);return a.length&&(b[t>>2]=Ye.toHandle(a)),i})(i,s,d)})))},N:e=>{e>4&&(Ue.get(e).refcount+=1)},O:e=>{var t=Ye.toValue(e);F(t),He(e)},aa:(e,t)=>{var n=(e=Ke(e,"_emval_take_value")).readValueFromPointer(t);return Ye.toHandle(n)},B:()=>{A("")},X:(e,t,n)=>f.copyWithin(e,t,t+n),W:e=>{var t,n,a=f.length,i=2147483648;if((e>>>=0)>i)return!1;for(var r=1;r<=4;r*=2){var o=a*(1+.2/r);o=Math.min(o,e+100663296);var s=Math.min(i,(t=Math.max(e,o))+((n=65536)-t%n)%n);if(ft(s))return!0}return!1},T:(e,t)=>{var n=0;return gt().forEach(((a,i)=>{var r=t+n;b[e+4*i>>2]=r,((e,t)=>{for(var n=0;n{var n=gt();b[e>>2]=n.length;var a=0;return n.forEach((e=>a+=e.length+1)),b[t>>2]=a,0},E:function(e,t,n,a){var i=At();try{return Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},D:function(e,t,n,a,i){var r=At();try{return Ie(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},F:function(e,t,n,a){var i=At();try{return Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},n:function(e){var t=At();try{return Ie(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},a:function(e,t){var n=At();try{return Ie(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},e:function(e,t,n){var a=At();try{return Ie(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},m:function(e,t,n,a){var i=At();try{return Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},k:function(e,t,n,a,i){var r=At();try{return Ie(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},H:function(e,t,n,a,i,r){var o=At();try{return Ie(e)(t,n,a,i,r)}catch(e){if(Mt(o),e!==e+0)throw e;Et(1,0)}},v:function(e,t,n,a,i,r,o){var s=At();try{return Ie(e)(t,n,a,i,r,o)}catch(e){if(Mt(s),e!==e+0)throw e;Et(1,0)}},G:function(e,t,n,a,i,r,o,s){var l=At();try{return Ie(e)(t,n,a,i,r,o,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},z:function(e,t,n,a,i,r,o,s,l,u,c,d){var h=At();try{return Ie(e)(t,n,a,i,r,o,s,l,u,c,d)}catch(e){if(Mt(h),e!==e+0)throw e;Et(1,0)}},P:function(e,t,n,a,i){var r=At();try{return It(e,t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},l:function(e){var t=At();try{Ie(e)()}catch(e){if(Mt(t),e!==e+0)throw e;Et(1,0)}},j:function(e,t){var n=At();try{Ie(e)(t)}catch(e){if(Mt(n),e!==e+0)throw e;Et(1,0)}},c:function(e,t,n){var a=At();try{Ie(e)(t,n)}catch(e){if(Mt(a),e!==e+0)throw e;Et(1,0)}},p:function(e,t,n,a){var i=At();try{Ie(e)(t,n,a)}catch(e){if(Mt(i),e!==e+0)throw e;Et(1,0)}},I:function(e,t,n,a,i){var r=At();try{Ie(e)(t,n,a,i)}catch(e){if(Mt(r),e!==e+0)throw e;Et(1,0)}},r:function(e,t,n,a,i,r,o,s){var l=At();try{Ie(e)(t,n,a,i,r,o,s)}catch(e){if(Mt(l),e!==e+0)throw e;Et(1,0)}},i:function(e,t,n,a,i,r,o,s,l,u,c){var d=At();try{Ie(e)(t,n,a,i,r,o,s,l,u,c)}catch(e){if(Mt(d),e!==e+0)throw e;Et(1,0)}},y:function(e,t,n,a,i,r,o,s,l,u,c,d,h,p,f,m){var g=At();try{Ie(e)(t,n,a,i,r,o,s,l,u,c,d,h,p,f,m)}catch(e){if(Mt(g),e!==e+0)throw e;Et(1,0)}},ga:e=>e,S:(e,t,n,a,i)=>yt(e,t,n,a)},kt=function(){var e={a:wt};function t(e,t){return kt=e.exports,h=kt.ia,k(),Le=kt.ma,function(e){S.unshift(e)}(kt.ja),function(){var e;if(E--,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E),0==E&&T){var t=T;T=null,t()}}(),kt}if(function(){var e;E++,null===(e=a.monitorRunDependencies)||void 0===e||e.call(a,E)}(),a.instantiateWasm)try{return a.instantiateWasm(e,t)}catch(e){d(`Module.instantiateWasm callback failed with error: ${e}`),n(e)}return function(e,t,n,a){return e||"function"!=typeof WebAssembly.instantiateStreaming||L(t)||"function"!=typeof fetch?N(t,n,a):fetch(t,{credentials:"same-origin"}).then((e=>WebAssembly.instantiateStreaming(e,n).then(a,(function(e){return d(`wasm streaming compile failed: ${e}`),d("falling back to ArrayBuffer instantiation"),N(t,n,a)}))))}(c,M,e,(function(e){t(e.instance)})).catch(n),{}}(),xt=a._free=e=>(xt=a._free=kt.ka)(e),St=a._malloc=e=>(St=a._malloc=kt.la)(e),Ct=e=>(Ct=kt.na)(e),Et=(e,t)=>(Et=kt.oa)(e,t),Tt=e=>(Tt=kt.pa)(e),At=()=>(At=kt.qa)(),Mt=e=>(Mt=kt.ra)(e),Pt=e=>(Pt=kt.sa)(e),Lt=e=>(Lt=kt.ta)(e),Ot=(e,t,n)=>(Ot=kt.ua)(e,t,n),Nt=e=>(Nt=kt.va)(e);a.dynCall_viijii=(e,t,n,i,r,o,s)=>(a.dynCall_viijii=kt.wa)(e,t,n,i,r,o,s);var Rt,It=a.dynCall_jiiii=(e,t,n,i,r)=>(It=a.dynCall_jiiii=kt.xa)(e,t,n,i,r);function zt(){function e(){Rt||(Rt=!0,a.calledRun=!0,!w&&(R(S),t(a),a.onRuntimeInitialized&&a.onRuntimeInitialized(),function(){if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)e=a.postRun.shift(),C.unshift(e);var e;R(C)}()))}E>0||(function(){if(a.preRun)for("function"==typeof a.preRun&&(a.preRun=[a.preRun]);a.preRun.length;)e=a.preRun.shift(),x.unshift(e);var e;R(x)}(),E>0)||(a.setStatus?(a.setStatus("Running..."),setTimeout((function(){setTimeout((function(){a.setStatus("")}),1),e()}),1)):e())}if(a.dynCall_iiiiij=(e,t,n,i,r,o,s)=>(a.dynCall_iiiiij=kt.ya)(e,t,n,i,r,o,s),a.dynCall_iiiiijj=(e,t,n,i,r,o,s,l,u)=>(a.dynCall_iiiiijj=kt.za)(e,t,n,i,r,o,s,l,u),a.dynCall_iiiiiijj=(e,t,n,i,r,o,s,l,u,c)=>(a.dynCall_iiiiiijj=kt.Aa)(e,t,n,i,r,o,s,l,u,c),T=function e(){Rt||zt(),Rt||(T=e)},a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);a.preInit.length>0;)a.preInit.pop()();return zt(),e.ready});async function D(e,t){return async function(e,t,n=M){const a={...M,...n},i=await R(e),{size:r}=t,o=new Uint8Array(await t.arrayBuffer()),s=i._malloc(r);i.HEAPU8.set(o,s);const l=i.readBarcodesFromImage(s,r,P(i,a));i._free(s);const u=[];for(let e=0;e{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,n)})(this,z,void 0);try{const a=null==(t=null==e?void 0:e.formats)?void 0:t.filter((e=>"unknown"!==e));if(0===(null==a?void 0:a.length))throw new TypeError("Hint option provided, but is empty.");null==a||a.forEach((e=>{if(!o.has(e))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${e}' is not a valid enum value of type BarcodeFormat.`)})),((e,t,a)=>{n(e,t,"write to private field"),t.set(e,a)})(this,z,null!=a?a:[]),function(e){return R(q,e)}().then((e=>{this.dispatchEvent(new CustomEvent("load",{detail:e}))})).catch((e=>{this.dispatchEvent(new CustomEvent("error",{detail:e}))}))}catch(e){throw b(e,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return r.filter((e=>"unknown"!==e))}async detect(e){try{const t=await v(e);if(null===t)return[];let n;try{n=m(t)?await D(t,{tryHarder:!0,formats:a(this,z).map((e=>o.get(e)))}):await j(t,{tryHarder:!0,formats:a(this,z).map((e=>o.get(e)))})}catch(e){throw console.error(e),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return n.map((e=>{const{topLeft:{x:t,y:n},topRight:{x:a,y:i},bottomLeft:{x:r,y:o},bottomRight:{x:l,y:u}}=e.position,c=Math.min(t,a,r,l),d=Math.min(n,i,o,u),h=Math.max(t,a,r,l),p=Math.max(n,i,o,u);return{boundingBox:new DOMRectReadOnly(c,d,h-c,p-d),rawValue:e.text,format:s(e.format),cornerPoints:[{x:t,y:n},{x:a,y:i},{x:l,y:u},{x:r,y:o}]}}))}catch(e){throw b(e,"Failed to execute 'detect' on 'BarcodeDetector'")}}}z=new WeakMap;const B=(e,t,n="error")=>{let a,i;const r=new Promise(((r,o)=>{a=r,i=o,e.addEventListener(t,a),e.addEventListener(n,i)}));return r.finally((()=>{e.removeEventListener(t,a),e.removeEventListener(n,i)})),r},F=e=>new Promise((t=>setTimeout(t,e)));class V extends Error{constructor(){super("can't process cross-origin image"),this.name="DropImageFetchError"}}class U extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class H extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class W extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let Y;async function Q(e){Y=await async function(e){if(void 0===window.BarcodeDetector)return console.debug("[vue-qrcode-reader] Native BarcodeDetector not supported. Will use polyfill."),new $({formats:e});const t=await window.BarcodeDetector.getSupportedFormats(),n=e.filter((e=>!t.includes(e)));return n.length>0?(console.debug(`[vue-qrcode-reader] Native BarcodeDetector does not support formats ${JSON.stringify(n)}. Will use polyfill.`),new $({formats:e})):(console.debug("[vue-qrcode-reader] Will use native BarcodeDetector."),new window.BarcodeDetector({formats:e}))}(e)}const K=async(e,t=["qr_code"])=>await new $({formats:t}).detect(e),G=async(e,t=["qr_code"])=>{const n=new $({formats:t}),a=await(async e=>{if(e.startsWith("http")&&!1===e.includes(location.host))throw new V;const t=document.createElement("img");return t.src=e,await B(t,"load"),t})(e);return await n.detect(a)};var Z={},J={};Object.defineProperty(J,"__esModule",{value:!0}),J.compactObject=function e(t){return ie(t)?Object.keys(t).reduce((function(n,a){var i=ie(t[a]),r=i?e(t[a]):t[a],o=i&&!Object.keys(r).length;return void 0===r||o?n:Object.assign(n,function(e,t,n){return t=function(e){var t=function(e,t){if("object"!==ee(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||"default");if("object"!==ee(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===ee(t)?t:String(t)}(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},a,r))}),{}):t},J.deprecated=function(e,t){ne&&console.warn(e+" is deprecated, please use "+t+" instead.")};var X=J.detectBrowser=function(e){var t={browser:null,version:null};if(typeof e>"u"||!e.navigator||!e.navigator.userAgent)return t.browser="Not a browser.",t;var n=e.navigator;if(n.mozGetUserMedia)t.browser="firefox",t.version=ae(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection)t.browser="chrome",t.version=ae(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=ae(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t};function ee(e){return(ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}J.disableLog=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(te=e,e?"adapter.js logging disabled":"adapter.js logging enabled")},J.disableWarnings=function(e){return"boolean"!=typeof e?new Error("Argument type: "+ee(e)+". Please use a boolean."):(ne=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))},J.extractVersion=ae,J.filterStats=function(e,t,n){var a=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;var r=[];return e.forEach((function(e){"track"===e.type&&e.trackIdentifier===t.id&&r.push(e)})),r.forEach((function(t){e.forEach((function(n){n.type===a&&n.trackId===t.id&&re(e,n,i)}))})),i},J.log=function(){if("object"===(typeof window>"u"?"undefined":ee(window))){if(te)return;typeof console<"u"&&"function"==typeof console.log&&console.log.apply(console,arguments)}},J.walkStats=re,J.wrapPeerConnectionEvent=function(e,t,n){if(e.RTCPeerConnection){var a=e.RTCPeerConnection.prototype,i=a.addEventListener;a.addEventListener=function(e,a){if(e!==t)return i.apply(this,arguments);var r=function(e){var t=n(e);t&&(a.handleEvent?a.handleEvent(t):a(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(a,r),i.apply(this,[e,r])};var r=a.removeEventListener;a.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return r.apply(this,arguments);if(!this._eventMap[t].has(n))return r.apply(this,arguments);var a=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,r.apply(this,[e,a])},Object.defineProperty(a,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}};var te=!0,ne=!0;function ae(e,t,n){var a=e.match(t);return a&&a.length>=n&&parseInt(a[n],10)}function ie(e){return"[object Object]"===Object.prototype.toString.call(e)}function re(e,t,n){!t||n.has(t.id)||(n.set(t.id,t),Object.keys(t).forEach((function(a){a.endsWith("Id")?re(e,e.get(t[a]),n):a.endsWith("Ids")&&t[a].forEach((function(t){re(e,e.get(t),n)}))})))}Object.defineProperty(Z,"__esModule",{value:!0});var oe=Z.shimGetUserMedia=function(e,t){var n=e&&e.navigator;if(n.mediaDevices){var a=function(e){if("object"!==ue(e)||e.mandatory||e.optional)return e;var t={};return Object.keys(e).forEach((function(n){if("require"!==n&&"advanced"!==n&&"mediaSource"!==n){var a="object"===ue(e[n])?e[n]:{ideal:e[n]};void 0!==a.exact&&"number"==typeof a.exact&&(a.min=a.max=a.exact);var i=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==a.ideal){t.optional=t.optional||[];var r={};"number"==typeof a.ideal?(r[i("min",n)]=a.ideal,t.optional.push(r),(r={})[i("max",n)]=a.ideal,t.optional.push(r)):(r[i("",n)]=a.ideal,t.optional.push(r))}void 0!==a.exact&&"number"!=typeof a.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=a.exact):["min","max"].forEach((function(e){void 0!==a[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=a[e])}))}})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===ue(e.audio)){var r=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])};r((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),r(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=a(e.audio)}if(e&&"object"===ue(e.video)){var o=e.video.facingMode;o=o&&("object"===ue(o)?o:{ideal:o});var s,l=t.version<66;if(o&&("user"===o.exact||"environment"===o.exact||"user"===o.ideal||"environment"===o.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.mediaDevices.getSupportedConstraints().facingMode||l))if(delete e.video.facingMode,"environment"===o.exact||"environment"===o.ideal?s=["back","rear"]:("user"===o.exact||"user"===o.ideal)&&(s=["front"]),s)return n.mediaDevices.enumerateDevices().then((function(t){var n=(t=t.filter((function(e){return"videoinput"===e.kind}))).find((function(e){return s.some((function(t){return e.label.toLowerCase().includes(t)}))}));return!n&&t.length&&s.includes("back")&&(n=t[t.length-1]),n&&(e.video.deviceId=o.exact?{exact:n.deviceId}:{ideal:n.deviceId}),e.video=a(e.video),ce("chrome: "+JSON.stringify(e)),i(e)}));e.video=a(e.video)}return ce("chrome: "+JSON.stringify(e)),i(e)},r=function(e){return t.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(n.getUserMedia=function(e,t,a){i(e,(function(e){n.webkitGetUserMedia(e,t,(function(e){a&&a(r(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){var o=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(e){return i(e,(function(e){return o(e).then((function(t){if(e.audio&&!t.getAudioTracks().length||e.video&&!t.getVideoTracks().length)throw t.getTracks().forEach((function(e){e.stop()})),new DOMException("","NotFoundError");return t}),(function(e){return Promise.reject(r(e))}))}))}}}},se=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ue(e)&&"function"!=typeof e)return{default:e};var n=le(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function le(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(le=function(e){return e?n:t})(e)}function ue(e){return(ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var ce=se.log;var de={};Object.defineProperty(de,"__esModule",{value:!0});var he=de.shimGetUserMedia=function(e,t){var n=e&&e.navigator,a=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,a){pe.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,a)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){var i=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},r=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(e){return"object"===me(e)&&"object"===me(e.audio)&&(e=JSON.parse(JSON.stringify(e)),i(e.audio,"autoGainControl","mozAutoGainControl"),i(e.audio,"noiseSuppression","mozNoiseSuppression")),r(e)},a&&a.prototype.getSettings){var o=a.prototype.getSettings;a.prototype.getSettings=function(){var e=o.apply(this,arguments);return i(e,"mozAutoGainControl","autoGainControl"),i(e,"mozNoiseSuppression","noiseSuppression"),e}}if(a&&a.prototype.applyConstraints){var s=a.prototype.applyConstraints;a.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===me(e)&&(e=JSON.parse(JSON.stringify(e)),i(e,"autoGainControl","mozAutoGainControl"),i(e,"noiseSuppression","mozNoiseSuppression")),s.apply(this,[e])}}}},pe=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==me(e)&&"function"!=typeof e)return{default:e};var n=fe(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function fe(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(fe=function(e){return e?n:t})(e)}function me(e){return(me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var ge={};Object.defineProperty(ge,"__esModule",{value:!0}),ge.shimAudioContext=function(e){"object"!==ye(e)||e.AudioContext||(e.AudioContext=e.webkitAudioContext)},ge.shimCallbacksAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype,n=t.createOffer,a=t.createAnswer,i=t.setLocalDescription,r=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){var a=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[a]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){var n=arguments.length>=2?arguments[2]:arguments[0],i=a.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};var s=function(e,t,n){var a=i.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a};t.setLocalDescription=s,s=function(e,t,n){var a=r.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.setRemoteDescription=s,s=function(e,t,n){var a=o.apply(this,[e]);return n?(a.then(t,n),Promise.resolve()):a},t.addIceCandidate=s}},ge.shimConstraints=we,ge.shimCreateOfferLegacy=function(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){typeof e.offerToReceiveAudio<"u"&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);var n=this.getTransceivers().find((function(e){return"audio"===e.receiver.track.kind}));!1===e.offerToReceiveAudio&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0===e.offerToReceiveAudio&&!n&&this.addTransceiver("audio",{direction:"recvonly"}),typeof e.offerToReceiveVideo<"u"&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);var a=this.getTransceivers().find((function(e){return"video"===e.receiver.track.kind}));!1===e.offerToReceiveVideo&&a?"sendrecv"===a.direction?a.setDirection?a.setDirection("sendonly"):a.direction="sendonly":"recvonly"===a.direction&&(a.setDirection?a.setDirection("inactive"):a.direction="inactive"):!0===e.offerToReceiveVideo&&!a&&this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}};var ve=ge.shimGetUserMedia=function(e){var t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){var n=t.mediaDevices,a=n.getUserMedia.bind(n);t.mediaDevices.getUserMedia=function(e){return a(we(e))}}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,a){t.mediaDevices.getUserMedia(e).then(n,a)}.bind(t))};ge.shimLocalStreamsAPI=function(e){if("object"===ye(e)&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){var n=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach((function(a){return t.call(n,a,e)})),e.getVideoTracks().forEach((function(a){return t.call(n,a,e)}))},e.RTCPeerConnection.prototype.addTrack=function(e){for(var n=this,a=arguments.length,i=new Array(a>1?a-1:0),r=1;r=0)){e._remoteStreams.push(t);var n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}}))}),t.apply(e,arguments)}}},ge.shimTrackEventTransceiver=function(e){"object"===ye(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})};var be=function(e,t){if(e&&e.__esModule)return e;if(null===e||"object"!==ye(e)&&"function"!=typeof e)return{default:e};var n=_e(t);if(n&&n.has(e))return n.get(e);var a={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var r in e)if("default"!==r&&Object.prototype.hasOwnProperty.call(e,r)){var o=i?Object.getOwnPropertyDescriptor(e,r):null;o&&(o.get||o.set)?Object.defineProperty(a,r,o):a[r]=e[r]}return a.default=e,n&&n.set(e,a),a}(J);function _e(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(_e=function(e){return e?n:t})(e)}function ye(e){return(ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function we(e){return e&&void 0!==e.video?Object.assign({},e,{video:be.compactObject(e.video)}):e}function ke(e,t){if(!1===e)throw new Error(null!=t?t:"assertion failure")}function xe(e){throw new Error("this code should be unreachable")}const Se=(e=>{let t,n=!1;return(...a)=>(n||(t=e(a),n=!0),t)})((()=>{const e=X(window);switch(e.browser){case"chrome":oe(window,e);break;case"firefox":he(window,e);break;case"safari":ve(window,e);break;default:throw new U}}));let Ce=Promise.resolve({type:"stop",data:{}});async function Ee(e,t,n){var a,i,r;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(t)),!0!==window.isSecureContext)throw new H;if(void 0===(null==(a=null==navigator?void 0:navigator.mediaDevices)?void 0:a.getUserMedia))throw new U;Se(),console.debug("[vue-qrcode-reader] calling getUserMedia");const o=await navigator.mediaDevices.getUserMedia({audio:!1,video:t});void 0!==e.srcObject?e.srcObject=o:void 0!==e.mozSrcObject?e.mozSrcObject=o:window.URL.createObjectURL?e.src=window.URL.createObjectURL(o):window.webkitURL?e.src=window.webkitURL.createObjectURL(o):e.src=o.id,e.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([B(e,"loadeddata"),F(6e3).then((()=>{throw new W}))]),console.debug("[vue-qrcode-reader] video element loaded"),await F(500);const[s]=o.getVideoTracks(),l=null!=(r=null==(i=null==s?void 0:s.getCapabilities)?void 0:i.call(s))?r:{};let u=!1;return n&&l.torch&&(await s.applyConstraints({advanced:[{torch:!0}]}),u=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:e,stream:o,capabilities:l,constraints:t,isTorchOn:u}}}async function Te(e,t,n){console.debug("[vue-qrcode-reader] stopping camera"),e.src="",e.srcObject=null,e.load(),await B(e,"error");for(const e of t.getTracks())null!=n||await e.applyConstraints({advanced:[{torch:!1}]}),t.removeTrack(e),e.stop();return{type:"stop",data:{}}}async function Ae(){if(Ce=Ce.then((e=>{if("stop"===e.type||"failed"===e.type)return e;const{data:{videoEl:t,stream:n,isTorchOn:a}}=e;return Te(t,n,a)})),"start"===(await Ce).type)throw new Error("Something went wrong with the camera task queue (stop task).")}const Me=t.defineComponent({__name:"QrcodeStream",props:{constraints:{type:Object,default:()=>({facingMode:"environment"})},formats:{type:Array,default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function}},emits:["detect","camera-on","camera-off","error"],setup(e,{emit:n}){const a=e,i=n,r=t.ref(a.constraints),o=t.ref(a.formats);t.watch((()=>a.constraints),((e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(r.value=e)}),{deep:!0}),t.watch((()=>a.formats),((e,t)=>{JSON.stringify(e)!==JSON.stringify(t)&&(o.value=e)}),{deep:!0});const s=t.ref(),l=t.ref(),u=t.ref(),c=t.ref(!1),d=t.ref(!1);t.onMounted((()=>{d.value=!0})),t.onUnmounted((()=>{Ae()}));const h=t.computed((()=>({torch:a.torch,constraints:r.value,shouldStream:d.value&&!a.paused})));t.watch(h,(async e=>{const t=u.value;ke(void 0!==t,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const n=s.value;ke(void 0!==n,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const a=n.getContext("2d");if(ke(null!==a,"if cavnas is defined, canvas 2d context should also be non-null"),e.shouldStream){Ae(),c.value=!1;try{const n=await async function(e,{constraints:t,torch:n,restart:a=!1}){Ce=Ce.then((i=>{if("start"===i.type){const{data:{videoEl:r,stream:o,constraints:s,isTorchOn:l}}=i;return a||e!==r||t!==s||n!==l?Te(r,o,l).then((()=>Ee(e,t,n))):i}if("stop"===i.type||"failed"===i.type)return Ee(e,t,n);xe()})).catch((e=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${e}"`),{type:"failed",error:e})));const i=await Ce;if("stop"===i.type)throw new Error("Something went wrong with the camera task queue (start task).");if("failed"===i.type)throw i.error;if("start"===i.type)return i.data.capabilities;xe()}(t,e);d.value?(c.value=!0,i("camera-on",n)):await Ae()}catch(e){i("error",e)}}else n.width=t.videoWidth,n.height=t.videoHeight,a.drawImage(t,0,0,t.videoWidth,t.videoHeight),Ae(),c.value=!1,i("camera-off")}),{deep:!0}),t.watch(o,(async e=>{d.value&&await Q(e)}));const p=t.computed((()=>h.value.shouldStream&&c.value));t.watch(p,(e=>{if(e){ke(void 0!==s.value,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),f(s.value),ke(void 0!==l.value,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),f(l.value);const e=()=>void 0===a.track?500:40;ke(void 0!==u.value,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),(async(e,{detectHandler:t,locateHandler:n,minDelay:a,formats:i})=>{console.debug("[vue-qrcode-reader] start scanning"),await Q(i);const r=i=>async o=>{if(0===e.readyState)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:s,contentBefore:l,lastScanHadContent:u}=i;if(o-s!l.includes(e.rawValue)));i&&t(a);const s=a.length>0;s&&n(a),!s&&u&&n(a);const c={lastScanned:o,lastScanHadContent:s,contentBefore:i?a.map((e=>e.rawValue)):l};window.requestAnimationFrame(r(c))}}};r({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())})(u.value,{detectHandler:e=>i("detect",e),formats:o.value,locateHandler:m,minDelay:e()})}}));const f=e=>{const t=e.getContext("2d");ke(null!==t,"canvas 2d context should always be non-null"),t.clearRect(0,0,e.width,e.height)},m=e=>{const t=l.value;ke(void 0!==t,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const n=u.value;if(ke(void 0!==n,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),0===e.length||void 0===a.track)f(t);else{const i=n.offsetWidth,r=n.offsetHeight,o=n.videoWidth,s=n.videoHeight,l=Math.max(i/o,r/s),u=o*l,c=s*l,d=u/o,h=c/s,p=(i-u)/2,f=(r-c)/2,m=({x:e,y:t})=>({x:Math.floor(e*d),y:Math.floor(t*h)}),g=({x:e,y:t})=>({x:Math.floor(e+p),y:Math.floor(t+f)}),v=e.map((e=>{const{boundingBox:t,cornerPoints:n}=e,{x:a,y:i}=g(m({x:t.x,y:t.y})),{x:r,y:o}=m({x:t.width,y:t.height});return{...e,cornerPoints:n.map((e=>g(m(e)))),boundingBox:DOMRectReadOnly.fromRect({x:a,y:i,width:r,height:o})}}));t.width=n.offsetWidth,t.height=n.offsetHeight;const b=t.getContext("2d");a.track(v,b)}},g={width:"100%",height:"100%",position:"relative","z-index":"0"},v={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},b={width:"100%",height:"100%","object-fit":"cover"},_=t.computed((()=>p.value?b:{...b,visibility:"hidden",position:"absolute"}));return(e,n)=>(t.openBlock(),t.createElementBlock("div",{style:g},[t.createElementVNode("video",{ref_key:"videoRef",ref:u,style:t.normalizeStyle(_.value),autoplay:"",muted:"",playsinline:""},null,4),t.withDirectives(t.createElementVNode("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:s,style:b},null,512),[[t.vShow,!p.value]]),t.createElementVNode("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:l,style:v},null,512),t.createElementVNode("div",{style:v},[t.renderSlot(e.$slots,"default")])]))}}),Pe=t.defineComponent({__name:"QrcodeCapture",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect"],setup(e,{emit:n}){const a=e,i=n,r=e=>{if(e.target instanceof HTMLInputElement&&e.target.files)for(const t of Array.from(e.target.files))K(t,a.formats).then((e=>{i("detect",e)}))};return(e,n)=>(t.openBlock(),t.createElementBlock("input",{onChange:r,type:"file",name:"image",accept:"image/*",capture:"environment",multiple:""},null,32))}}),Le=t.defineComponent({__name:"QrcodeDropZone",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect","dragover","error"],setup(e,{emit:n}){const a=e,i=n,r=async e=>{try{const t=await e;i("detect",t)}catch(e){i("error",e)}},o=e=>{i("dragover",e)},s=({dataTransfer:e})=>{if(!e)return;o(!1);const t=[...Array.from(e.files)],n=e.getData("text/uri-list");t.forEach((e=>{r(K(e,a.formats))})),""!==n&&r(G(n,a.formats))};return(e,n)=>(t.openBlock(),t.createElementBlock("div",{onDrop:t.withModifiers(s,["prevent","stop"]),onDragenter:n[0]||(n[0]=t.withModifiers((e=>o(!0)),["prevent","stop"])),onDragleave:n[1]||(n[1]=t.withModifiers((e=>o(!1)),["prevent","stop"])),onDragover:n[2]||(n[2]=t.withModifiers((()=>{}),["prevent","stop"]))},[t.renderSlot(e.$slots,"default")],32))}});function Oe(e){e.component("qrcode-stream",Me),e.component("qrcode-capture",Pe),e.component("qrcode-drop-zone",Le)}const Ne={install:Oe};e.QrcodeCapture=Pe,e.QrcodeDropZone=Le,e.QrcodeStream=Me,e.VueQrcodeReader=Ne,e.install=Oe,e.setZXingModuleOverrides=function(e){return function(e,t){N.set(e,{moduleOverrides:t})}(q,e)},Object.defineProperty(e,Symbol.toStringTag,{value:"Module"})})), /*! * qrcode.vue v3.4.1 * A Vue.js component to generate QRCode. @@ -41,4 +41,4 @@ function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.export * (c) 2023 Jukka Kurkela * Released under the MIT License */function be(e){return e+.5|0}const _e=(e,t,n)=>Math.max(Math.min(e,n),t);function ye(e){return _e(be(2.55*e),0,255)}function we(e){return _e(be(255*e),0,255)}function ke(e){return _e(be(e/2.55)/100,0,1)}function xe(e){return _e(be(100*e),0,100)}const Se={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ce=[..."0123456789ABCDEF"],Ee=e=>Ce[15&e],Te=e=>Ce[(240&e)>>4]+Ce[15&e],Ae=e=>(240&e)>>4==(15&e);const Me=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Pe(e,t,n){const a=t*Math.min(n,1-n),i=(t,i=(t+e/30)%12)=>n-a*Math.max(Math.min(i-3,9-i,1),-1);return[i(0),i(8),i(4)]}function Le(e,t,n){const a=(a,i=(a+e/60)%6)=>n-n*t*Math.max(Math.min(i,4-i,1),0);return[a(5),a(3),a(1)]}function Oe(e,t,n){const a=Pe(e,1,.5);let i;for(t+n>1&&(i=1/(t+n),t*=i,n*=i),i=0;i<3;i++)a[i]*=1-t-n,a[i]+=t;return a}function Ne(e){const t=e.r/255,n=e.g/255,a=e.b/255,i=Math.max(t,n,a),r=Math.min(t,n,a),o=(i+r)/2;let s,l,u;return i!==r&&(u=i-r,l=o>.5?u/(2-i-r):u/(i+r),s=function(e,t,n,a,i){return e===i?(t-n)/a+(te<=.0031308?12.92*e:1.055*Math.pow(e,1/2.4)-.055,Fe=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);function Ve(e,t,n){if(e){let a=Ne(e);a[t]=Math.max(0,Math.min(a[t]+a[t]*n,0===t?360:1)),a=Ie(a),e.r=a[0],e.g=a[1],e.b=a[2]}}function Ue(e,t){return e?Object.assign(t||{},e):e}function He(e){var t={r:0,g:0,b:0,a:255};return Array.isArray(e)?e.length>=3&&(t={r:e[0],g:e[1],b:e[2],a:255},e.length>3&&(t.a=we(e[3]))):(t=Ue(e,{r:0,g:0,b:0,a:1})).a=we(t.a),t}function We(e){return"r"===e.charAt(0)?function(e){const t=$e.exec(e);let n,a,i,r=255;if(t){if(t[7]!==n){const e=+t[7];r=t[8]?ye(e):_e(255*e,0,255)}return n=+t[1],a=+t[3],i=+t[5],n=255&(t[2]?ye(n):_e(n,0,255)),a=255&(t[4]?ye(a):_e(a,0,255)),i=255&(t[6]?ye(i):_e(i,0,255)),{r:n,g:a,b:i,a:r}}}(e):function(e){const t=Me.exec(e);let n,a=255;if(!t)return;t[5]!==n&&(a=t[6]?ye(+t[5]):we(+t[5]));const i=ze(+t[2]),r=+t[3]/100,o=+t[4]/100;return n="hwb"===t[1]?function(e,t,n){return Re(Oe,e,t,n)}(i,r,o):"hsv"===t[1]?function(e,t,n){return Re(Le,e,t,n)}(i,r,o):Ie(i,r,o),{r:n[0],g:n[1],b:n[2],a:a}}(e)}class Ye{constructor(e){if(e instanceof Ye)return e;const t=typeof e;let n;var a,i,r;"object"===t?n=He(e):"string"===t&&(r=(a=e).length,"#"===a[0]&&(4===r||5===r?i={r:255&17*Se[a[1]],g:255&17*Se[a[2]],b:255&17*Se[a[3]],a:5===r?17*Se[a[4]]:255}:7!==r&&9!==r||(i={r:Se[a[1]]<<4|Se[a[2]],g:Se[a[3]]<<4|Se[a[4]],b:Se[a[5]]<<4|Se[a[6]],a:9===r?Se[a[7]]<<4|Se[a[8]]:255})),n=i||function(e){je||(je=function(){const e={},t=Object.keys(De),n=Object.keys(qe);let a,i,r,o,s;for(a=0;a>16&255,r>>8&255,255&r]}return e}(),je.transparent=[0,0,0,0]);const t=je[e.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:4===t.length?t[3]:255}}(e)||We(e)),this._rgb=n,this._valid=!!n}get valid(){return this._valid}get rgb(){var e=Ue(this._rgb);return e&&(e.a=ke(e.a)),e}set rgb(e){this._rgb=He(e)}rgbString(){return this._valid?(e=this._rgb)&&(e.a<255?`rgba(${e.r}, ${e.g}, ${e.b}, ${ke(e.a)})`:`rgb(${e.r}, ${e.g}, ${e.b})`):void 0;var e}hexString(){return this._valid?function(e){var t=(e=>Ae(e.r)&&Ae(e.g)&&Ae(e.b)&&Ae(e.a))(e)?Ee:Te;return e?"#"+t(e.r)+t(e.g)+t(e.b)+((e,t)=>e<255?t(e):"")(e.a,t):void 0}(this._rgb):void 0}hslString(){return this._valid?function(e){if(!e)return;const t=Ne(e),n=t[0],a=xe(t[1]),i=xe(t[2]);return e.a<255?`hsla(${n}, ${a}%, ${i}%, ${ke(e.a)})`:`hsl(${n}, ${a}%, ${i}%)`}(this._rgb):void 0}mix(e,t){if(e){const n=this.rgb,a=e.rgb;let i;const r=t===i?.5:t,o=2*r-1,s=n.a-a.a,l=((o*s==-1?o:(o+s)/(1+o*s))+1)/2;i=1-l,n.r=255&l*n.r+i*a.r+.5,n.g=255&l*n.g+i*a.g+.5,n.b=255&l*n.b+i*a.b+.5,n.a=r*n.a+(1-r)*a.a,this.rgb=n}return this}interpolate(e,t){return e&&(this._rgb=function(e,t,n){const a=Fe(ke(e.r)),i=Fe(ke(e.g)),r=Fe(ke(e.b));return{r:we(Be(a+n*(Fe(ke(t.r))-a))),g:we(Be(i+n*(Fe(ke(t.g))-i))),b:we(Be(r+n*(Fe(ke(t.b))-r))),a:e.a+n*(t.a-e.a)}}(this._rgb,e._rgb,t)),this}clone(){return new Ye(this.rgb)}alpha(e){return this._rgb.a=we(e),this}clearer(e){return this._rgb.a*=1-e,this}greyscale(){const e=this._rgb,t=be(.3*e.r+.59*e.g+.11*e.b);return e.r=e.g=e.b=t,this}opaquer(e){return this._rgb.a*=1+e,this}negate(){const e=this._rgb;return e.r=255-e.r,e.g=255-e.g,e.b=255-e.b,this}lighten(e){return Ve(this._rgb,2,e),this}darken(e){return Ve(this._rgb,2,-e),this}saturate(e){return Ve(this._rgb,1,e),this}desaturate(e){return Ve(this._rgb,1,-e),this}rotate(e){return function(e,t){var n=Ne(e);n[0]=ze(n[0]+t),n=Ie(n),e.r=n[0],e.g=n[1],e.b=n[2]}(this._rgb,e),this}}function Qe(e){if(e&&"object"==typeof e){const t=e.toString();return"[object CanvasPattern]"===t||"[object CanvasGradient]"===t}return!1}function Ke(e){return Qe(e)?e:new Ye(e)}function Ge(e){return Qe(e)?e:new Ye(e).saturate(.5).darken(.1).hexString()}const Ze=["x","y","borderWidth","radius","tension"],Je=["color","borderColor","backgroundColor"],Xe=new Map;function et(e,t,n){return function(e,t){t=t||{};const n=e+JSON.stringify(t);let a=Xe.get(n);return a||(a=new Intl.NumberFormat(e,t),Xe.set(n,a)),a}(t,n).format(e)}const tt={values:e=>i(e)?e:""+e,numeric(e,t,n){if(0===e)return"0";const a=this.chart.options.locale;let i,r=e;if(n.length>1){const t=Math.max(Math.abs(n[0].value),Math.abs(n[n.length-1].value));(t<1e-4||t>1e15)&&(i="scientific"),r=function(e,t){let n=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(n)>=1&&e!==Math.floor(e)&&(n=e-Math.floor(e)),n}(e,n)}const o=z(Math.abs(r)),s=isNaN(o)?1:Math.max(Math.min(-1*Math.floor(o),20),0),l={notation:i,minimumFractionDigits:s,maximumFractionDigits:s};return Object.assign(l,this.options.ticks.format),et(e,a,l)},logarithmic(e,t,n){if(0===e)return"0";const a=n[t].significand||e/Math.pow(10,Math.floor(z(e)));return[1,2,3,5,10,15].includes(a)||t>.8*n.length?tt.numeric.call(this,e,t,n):""}};var nt={formatters:tt};const at=Object.create(null),it=Object.create(null);function rt(e,t){if(!t)return e;const n=t.split(".");for(let t=0,a=n.length;te.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(e,t)=>Ge(t.backgroundColor),this.hoverBorderColor=(e,t)=>Ge(t.borderColor),this.hoverColor=(e,t)=>Ge(t.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(e),this.apply(t)}set(e,t){return ot(this,e,t)}get(e){return rt(this,e)}describe(e,t){return ot(it,e,t)}override(e,t){return ot(at,e,t)}route(e,t,n,a){const i=rt(this,e),o=rt(this,n),s="_"+t;Object.defineProperties(i,{[s]:{value:i[t],writable:!0},[t]:{enumerable:!0,get(){const e=this[s],t=o[a];return r(e)?Object.assign({},t,e):l(e,t)},set(e){this[s]=e}}})}apply(e){e.forEach((e=>e(this)))}}({_scriptable:e=>!e.startsWith("on"),_indexable:e=>"events"!==e,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(e){e.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),e.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:e=>"onProgress"!==e&&"onComplete"!==e&&"fn"!==e}),e.set("animations",{colors:{type:"color",properties:Je},numbers:{type:"number",properties:Ze}}),e.describe("animations",{_fallback:"animation"}),e.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:e=>0|e}}}})},function(e){e.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(e){e.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(e,t)=>t.lineWidth,tickColor:(e,t)=>t.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:nt.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),e.route("scale.ticks","color","","color"),e.route("scale.grid","color","","borderColor"),e.route("scale.border","color","","borderColor"),e.route("scale.title","color","","color"),e.describe("scale",{_fallback:!1,_scriptable:e=>!e.startsWith("before")&&!e.startsWith("after")&&"callback"!==e&&"parser"!==e,_indexable:e=>"borderDash"!==e&&"tickBorderDash"!==e&&"dash"!==e}),e.describe("scales",{_fallback:"scale"}),e.describe("scale.ticks",{_scriptable:e=>"backdropPadding"!==e&&"callback"!==e,_indexable:e=>"backdropPadding"!==e})}]);function lt(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ut(e){let t=e.parentNode;return t&&"[object ShadowRoot]"===t.toString()&&(t=t.host),t}function ct(e,t,n){let a;return"string"==typeof e?(a=parseInt(e,10),-1!==e.indexOf("%")&&(a=a/100*t.parentNode[n])):a=e,a}const dt=e=>e.ownerDocument.defaultView.getComputedStyle(e,null);function ht(e,t){return dt(e).getPropertyValue(t)}const pt=["top","right","bottom","left"];function ft(e,t,n){const a={};n=n?"-"+n:"";for(let i=0;i<4;i++){const r=pt[i];a[r]=parseFloat(e[t+"-"+r+n])||0}return a.width=a.left+a.right,a.height=a.top+a.bottom,a}const mt=(e,t,n)=>(e>0||t>0)&&(!n||!n.shadowRoot);function gt(e,t){if("native"in e)return e;const{canvas:n,currentDevicePixelRatio:a}=t,i=dt(n),r="border-box"===i.boxSizing,o=ft(i,"padding"),s=ft(i,"border","width"),{x:l,y:u,box:c}=function(e,t){const n=e.touches,a=n&&n.length?n[0]:e,{offsetX:i,offsetY:r}=a;let o,s,l=!1;if(mt(i,r,e.target))o=i,s=r;else{const e=t.getBoundingClientRect();o=a.clientX-e.left,s=a.clientY-e.top,l=!0}return{x:o,y:s,box:l}}(e,n),d=o.left+(c&&s.left),h=o.top+(c&&s.top);let{width:p,height:f}=t;return r&&(p-=o.width+s.width,f-=o.height+s.height),{x:Math.round((l-d)/p*n.width/a),y:Math.round((u-h)/f*n.height/a)}}const vt=e=>Math.round(10*e)/10;function bt(e,t,n,a){const i=dt(e),r=ft(i,"margin"),o=ct(i.maxWidth,e,"clientWidth")||L,s=ct(i.maxHeight,e,"clientHeight")||L,l=function(e,t,n){let a,i;if(void 0===t||void 0===n){const r=e&&ut(e);if(r){const e=r.getBoundingClientRect(),o=dt(r),s=ft(o,"border","width"),l=ft(o,"padding");t=e.width-l.width-s.width,n=e.height-l.height-s.height,a=ct(o.maxWidth,r,"clientWidth"),i=ct(o.maxHeight,r,"clientHeight")}else t=e.clientWidth,n=e.clientHeight}return{width:t,height:n,maxWidth:a||L,maxHeight:i||L}}(e,t,n);let{width:u,height:c}=l;if("content-box"===i.boxSizing){const e=ft(i,"border","width"),t=ft(i,"padding");u-=t.width+e.width,c-=t.height+e.height}return u=Math.max(0,u-r.width),c=Math.max(0,a?u/a:c-r.height),u=vt(Math.min(u,o,l.maxWidth)),c=vt(Math.min(c,s,l.maxHeight)),u&&!c&&(c=vt(u/2)),(void 0!==t||void 0!==n)&&a&&l.height&&c>l.height&&(c=l.height,u=vt(Math.floor(c*a))),{width:u,height:c}}function _t(e,t,n){const a=t||1,i=Math.floor(e.height*a),r=Math.floor(e.width*a);e.height=Math.floor(e.height),e.width=Math.floor(e.width);const o=e.canvas;return o.style&&(n||!o.style.height&&!o.style.width)&&(o.style.height=`${e.height}px`,o.style.width=`${e.width}px`),(e.currentDevicePixelRatio!==a||o.height!==i||o.width!==r)&&(e.currentDevicePixelRatio=a,o.height=i,o.width=r,e.ctx.setTransform(a,0,0,a,0,0),!0)}const yt=function(){let e=!1;try{const t={get passive(){return e=!0,!1}};lt()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch(e){}return e}();function wt(e,t){const n=ht(e,t),a=n&&n.match(/^(\d+)(\.\d+)?px$/);return a?+a[1]:void 0}function kt(e){return!e||a(e.size)||a(e.family)?null:(e.style?e.style+" ":"")+(e.weight?e.weight+" ":"")+e.size+"px "+e.family}function xt(e,t,n,a,i){let r=t[i];return r||(r=t[i]=e.measureText(i).width,n.push(i)),r>a&&(a=r),a}function St(e,t,n,a){let r=(a=a||{}).data=a.data||{},o=a.garbageCollect=a.garbageCollect||[];a.font!==t&&(r=a.data={},o=a.garbageCollect=[],a.font=t),e.save(),e.font=t;let s=0;const l=n.length;let u,c,d,h,p;for(u=0;un.length){for(u=0;u0&&e.stroke()}}function Mt(e,t,n){return n=n||.5,!t||e&&e.x>t.left-n&&e.xt.top-n&&e.y0&&""!==s.strokeColor;let c,d;for(e.save(),e.font=o.string,function(e,t){t.translation&&e.translate(t.translation[0],t.translation[1]),a(t.rotation)||e.rotate(t.rotation),t.color&&(e.fillStyle=t.color),t.textAlign&&(e.textAlign=t.textAlign),t.textBaseline&&(e.textBaseline=t.textBaseline)}(e,s),c=0;ce[0]){const r=n||e;void 0===a&&(a=Kt("_fallback",e));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:e,_rootScopes:r,_fallback:a,_getTarget:i,override:n=>Dt([n,...e],t,r,a)};return new Proxy(o,{deleteProperty:(t,n)=>(delete t[n],delete t._keys,delete e[0][n],!0),get:(n,a)=>Vt(n,a,(()=>function(e,t,n,a){let i;for(const r of t)if(i=Kt(Bt(r,e),n),void 0!==i)return Ft(e,i)?Yt(n,a,e,i):i}(a,t,e,n))),getOwnPropertyDescriptor:(e,t)=>Reflect.getOwnPropertyDescriptor(e._scopes[0],t),getPrototypeOf:()=>Reflect.getPrototypeOf(e[0]),has:(e,t)=>Gt(e).includes(t),ownKeys:e=>Gt(e),set(e,t,n){const a=e._storage||(e._storage=i());return e[t]=a[t]=n,delete e._keys,!0}})}function jt(e,t,n,a){const o={_cacheable:!1,_proxy:e,_context:t,_subProxy:n,_stack:new Set,_descriptors:$t(e,a),setContext:t=>jt(e,t,n,a),override:i=>jt(e.override(i),t,n,a)};return new Proxy(o,{deleteProperty:(t,n)=>(delete t[n],delete e[n],!0),get:(e,t,n)=>Vt(e,t,(()=>function(e,t,n){const{_proxy:a,_context:o,_subProxy:s,_descriptors:l}=e;let u=a[t];return C(u)&&l.isScriptable(t)&&(u=function(e,t,n,a){const{_proxy:i,_context:r,_subProxy:o,_stack:s}=n;if(s.has(e))throw new Error("Recursion detected: "+Array.from(s).join("->")+"->"+e);s.add(e);let l=t(r,o||a);return s.delete(e),Ft(e,l)&&(l=Yt(i._scopes,i,e,l)),l}(t,u,e,n)),i(u)&&u.length&&(u=function(e,t,n,a){const{_proxy:i,_context:o,_subProxy:s,_descriptors:l}=n;if(void 0!==o.index&&a(e))return t[o.index%t.length];if(r(t[0])){const n=t,a=i._scopes.filter((e=>e!==n));t=[];for(const r of n){const n=Yt(a,i,e,r);t.push(jt(n,o,s&&s[e],l))}}return t}(t,u,e,l.isIndexable)),Ft(t,u)&&(u=jt(u,o,s&&s[t],l)),u}(e,t,n))),getOwnPropertyDescriptor:(t,n)=>t._descriptors.allKeys?Reflect.has(e,n)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(e,n),getPrototypeOf:()=>Reflect.getPrototypeOf(e),has:(t,n)=>Reflect.has(e,n),ownKeys:()=>Reflect.ownKeys(e),set:(t,n,a)=>(e[n]=a,delete t[n],!0)})}function $t(e,t={scriptable:!0,indexable:!0}){const{_scriptable:n=t.scriptable,_indexable:a=t.indexable,_allKeys:i=t.allKeys}=e;return{allKeys:i,scriptable:n,indexable:a,isScriptable:C(n)?n:()=>n,isIndexable:C(a)?a:()=>a}}const Bt=(e,t)=>e?e+x(t):t,Ft=(e,t)=>r(t)&&"adapters"!==e&&(null===Object.getPrototypeOf(t)||t.constructor===Object);function Vt(e,t,n){if(Object.prototype.hasOwnProperty.call(e,t)||"constructor"===t)return e[t];const a=n();return e[t]=a,a}function Ut(e,t,n){return C(e)?e(t,n):e}const Ht=(e,t)=>!0===e?t:"string"==typeof e?k(t,e):void 0;function Wt(e,t,n,a,i){for(const r of t){const t=Ht(n,r);if(t){e.add(t);const r=Ut(t._fallback,n,i);if(void 0!==r&&r!==n&&r!==a)return r}else if(!1===t&&void 0!==a&&n!==a)return null}return!1}function Yt(e,t,n,a){const o=t._rootScopes,s=Ut(t._fallback,n,a),l=[...e,...o],u=new Set;u.add(a);let c=Qt(u,l,n,s||n,a);return null!==c&&(void 0===s||s===n||(c=Qt(u,l,s,c,a),null!==c))&&Dt(Array.from(u),[""],o,s,(()=>function(e,t,n){const a=e._getTarget();t in a||(a[t]={});const o=a[t];return i(o)&&r(n)?n:o||{}}(t,n,a)))}function Qt(e,t,n,a,i){for(;n;)n=Wt(e,t,n,a,i);return n}function Kt(e,t){for(const n of t){if(!n)continue;const t=n[e];if(void 0!==t)return t}}function Gt(e){let t=e._keys;return t||(t=e._keys=function(e){const t=new Set;for(const n of e)for(const e of Object.keys(n).filter((e=>!e.startsWith("_"))))t.add(e);return Array.from(t)}(e._scopes)),t}function Zt(e,t,n,a){const{iScale:i}=e,{key:r="r"}=this._parsing,o=new Array(a);let s,l,u,c;for(s=0,l=a;st"x"===e?"y":"x";function tn(e,t,n,a){const i=e.skip?t:e,r=t,o=n.skip?t:n,s=Q(r,i),l=Q(o,r);let u=s/(s+l),c=l/(s+l);u=isNaN(u)?0:u,c=isNaN(c)?0:c;const d=a*u,h=a*c;return{previous:{x:r.x-d*(o.x-i.x),y:r.y-d*(o.y-i.y)},next:{x:r.x+h*(o.x-i.x),y:r.y+h*(o.y-i.y)}}}function nn(e,t="x"){const n=en(t),a=e.length,i=Array(a).fill(0),r=Array(a);let o,s,l,u=Xt(e,0);for(o=0;o!e.skip))),"monotone"===t.cubicInterpolationMode)nn(e,i);else{let n=a?e[e.length-1]:e[0];for(r=0,o=e.length;r0===e||1===e,sn=(e,t,n)=>-Math.pow(2,10*(e-=1))*Math.sin((e-t)*M/n),ln=(e,t,n)=>Math.pow(2,-10*e)*Math.sin((e-t)*M/n)+1,un={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>-e*(e-2),easeInOutQuad:e=>(e/=.5)<1?.5*e*e:-.5*(--e*(e-2)-1),easeInCubic:e=>e*e*e,easeOutCubic:e=>(e-=1)*e*e+1,easeInOutCubic:e=>(e/=.5)<1?.5*e*e*e:.5*((e-=2)*e*e+2),easeInQuart:e=>e*e*e*e,easeOutQuart:e=>-((e-=1)*e*e*e-1),easeInOutQuart:e=>(e/=.5)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2),easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>(e-=1)*e*e*e*e+1,easeInOutQuint:e=>(e/=.5)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2),easeInSine:e=>1-Math.cos(e*N),easeOutSine:e=>Math.sin(e*N),easeInOutSine:e=>-.5*(Math.cos(A*e)-1),easeInExpo:e=>0===e?0:Math.pow(2,10*(e-1)),easeOutExpo:e=>1===e?1:1-Math.pow(2,-10*e),easeInOutExpo:e=>on(e)?e:e<.5?.5*Math.pow(2,10*(2*e-1)):.5*(2-Math.pow(2,-10*(2*e-1))),easeInCirc:e=>e>=1?e:-(Math.sqrt(1-e*e)-1),easeOutCirc:e=>Math.sqrt(1-(e-=1)*e),easeInOutCirc:e=>(e/=.5)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1),easeInElastic:e=>on(e)?e:sn(e,.075,.3),easeOutElastic:e=>on(e)?e:ln(e,.075,.3),easeInOutElastic(e){const t=.1125;return on(e)?e:e<.5?.5*sn(2*e,t,.45):.5+.5*ln(2*e-1,t,.45)},easeInBack(e){const t=1.70158;return e*e*((t+1)*e-t)},easeOutBack(e){const t=1.70158;return(e-=1)*e*((t+1)*e+t)+1},easeInOutBack(e){let t=1.70158;return(e/=.5)<1?e*e*((1+(t*=1.525))*e-t)*.5:.5*((e-=2)*e*((1+(t*=1.525))*e+t)+2)},easeInBounce:e=>1-un.easeOutBounce(1-e),easeOutBounce(e){const t=7.5625,n=2.75;return e<1/n?t*e*e:e<2/n?t*(e-=1.5/n)*e+.75:e<2.5/n?t*(e-=2.25/n)*e+.9375:t*(e-=2.625/n)*e+.984375},easeInOutBounce:e=>e<.5?.5*un.easeInBounce(2*e):.5*un.easeOutBounce(2*e-1)+.5};function cn(e,t,n,a){return{x:e.x+n*(t.x-e.x),y:e.y+n*(t.y-e.y)}}function dn(e,t,n,a){return{x:e.x+n*(t.x-e.x),y:"middle"===a?n<.5?e.y:t.y:"after"===a?n<1?e.y:t.y:n>0?t.y:e.y}}function hn(e,t,n,a){const i={x:e.cp2x,y:e.cp2y},r={x:t.cp1x,y:t.cp1y},o=cn(e,i,n),s=cn(i,r,n),l=cn(r,t,n),u=cn(o,s,n),c=cn(s,l,n);return cn(u,c,n)}const pn=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,fn=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function mn(e,t){const n=(""+e).match(pn);if(!n||"normal"===n[1])return 1.2*t;switch(e=+n[2],n[3]){case"px":return e;case"%":e/=100}return t*e}const gn=e=>+e||0;function vn(e,t){const n={},a=r(t),i=a?Object.keys(t):t,o=r(e)?a?n=>l(e[n],e[t[n]]):t=>e[t]:()=>e;for(const e of i)n[e]=gn(o(e));return n}function bn(e){return vn(e,{top:"y",right:"x",bottom:"y",left:"x"})}function _n(e){return vn(e,["topLeft","topRight","bottomLeft","bottomRight"])}function yn(e){const t=bn(e);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function wn(e,t){e=e||{},t=t||st.font;let n=l(e.size,t.size);"string"==typeof n&&(n=parseInt(n,10));let a=l(e.style,t.style);a&&!(""+a).match(fn)&&(console.warn('Invalid font style specified: "'+a+'"'),a=void 0);const i={family:l(e.family,t.family),lineHeight:mn(l(e.lineHeight,t.lineHeight),n),size:n,style:a,weight:l(e.weight,t.weight),string:""};return i.string=kt(i),i}function kn(e,t,n,a){let r,o,s,l=!0;for(r=0,o=e.length;rn&&0===e?0:e+t;return{min:o(a,-Math.abs(r)),max:o(i,r)}}function Sn(e,t){return Object.assign(Object.create(e),t)}function Cn(e,t,n){return e?function(e,t){return{x:n=>e+e+t-n,setWidth(e){t=e},textAlign:e=>"center"===e?e:"right"===e?"left":"right",xPlus:(e,t)=>e-t,leftForLtr:(e,t)=>e-t}}(t,n):{x:e=>e,setWidth(e){},textAlign:e=>e,xPlus:(e,t)=>e+t,leftForLtr:(e,t)=>e}}function En(e,t){let n,a;"ltr"!==t&&"rtl"!==t||(n=e.canvas.style,a=[n.getPropertyValue("direction"),n.getPropertyPriority("direction")],n.setProperty("direction",t,"important"),e.prevTextDirection=a)}function Tn(e,t){void 0!==t&&(delete e.prevTextDirection,e.canvas.style.setProperty("direction",t[0],t[1]))}function An(e){return"angle"===e?{between:Z,compare:K,normalize:G}:{between:ee,compare:(e,t)=>e-t,normalize:e=>e}}function Mn({start:e,end:t,count:n,loop:a,style:i}){return{start:e%n,end:t%n,loop:a&&(t-e+1)%n==0,style:i}}function Pn(e,t,n){if(!n)return[e];const{property:a,start:i,end:r}=n,o=t.length,{compare:s,between:l,normalize:u}=An(a),{start:c,end:d,loop:h,style:p}=function(e,t,n){const{property:a,start:i,end:r}=n,{between:o,normalize:s}=An(a),l=t.length;let u,c,{start:d,end:h,loop:p}=e;if(p){for(d+=l,h+=l,u=0,c=l;ui&&e[r%t].skip;)r--;return r%=t,{start:i,end:r}}(n,i,r,a);return Nn(e,!0===a?[{start:o,end:s,loop:r}]:function(e,t,n,a){const i=e.length,r=[];let o,s=t,l=e[t];for(o=t+1;o<=n;++o){const n=e[o%i];n.skip||n.stop?l.skip||(a=!1,r.push({start:t%i,end:(o-1)%i,loop:a}),t=s=n.stop?o:null):(s=o,l.skip&&(t=o)),l=n}return null!==s&&r.push({start:t%i,end:s%i,loop:a}),r}(n,o,s{e[o]&&e[o](t[n],i)&&(r.push({element:e,datasetIndex:a,index:l}),s=s||e.inRange(t.x,t.y,i))})),a&&!s?[]:r}var Fn={evaluateInteractionItems:Dn,modes:{index(e,t,n,a){const i=gt(t,e),r=n.axis||"x",o=n.includeInvisible||!1,s=n.intersect?jn(e,i,r,a,o):$n(e,i,r,!1,a,o),l=[];return s.length?(e.getSortedVisibleDatasetMetas().forEach((e=>{const t=s[0].index,n=e.data[t];n&&!n.skip&&l.push({element:n,datasetIndex:e.index,index:t})})),l):[]},dataset(e,t,n,a){const i=gt(t,e),r=n.axis||"xy",o=n.includeInvisible||!1;let s=n.intersect?jn(e,i,r,a,o):$n(e,i,r,!1,a,o);if(s.length>0){const t=s[0].datasetIndex,n=e.getDatasetMeta(t).data;s=[];for(let e=0;ejn(e,gt(t,e),n.axis||"xy",a,n.includeInvisible||!1),nearest(e,t,n,a){const i=gt(t,e),r=n.axis||"xy",o=n.includeInvisible||!1;return $n(e,i,r,n.intersect,a,o)},x:(e,t,n,a)=>Bn(e,gt(t,e),"x",n.intersect,a),y:(e,t,n,a)=>Bn(e,gt(t,e),"y",n.intersect,a)}};const Vn=["left","top","right","bottom"];function Un(e,t){return e.filter((e=>e.pos===t))}function Hn(e,t){return e.filter((e=>-1===Vn.indexOf(e.pos)&&e.box.axis===t))}function Wn(e,t){return e.sort(((e,n)=>{const a=t?n:e,i=t?e:n;return a.weight===i.weight?a.index-i.index:a.weight-i.weight}))}function Yn(e,t,n,a){return Math.max(e[n],t[n])+Math.max(e[a],t[a])}function Qn(e,t){e.top=Math.max(e.top,t.top),e.left=Math.max(e.left,t.left),e.bottom=Math.max(e.bottom,t.bottom),e.right=Math.max(e.right,t.right)}function Kn(e,t,n,a){const{pos:i,box:o}=n,s=e.maxPadding;if(!r(i)){n.size&&(e[i]-=n.size);const t=a[n.stack]||{size:0,count:1};t.size=Math.max(t.size,n.horizontal?o.height:o.width),n.size=t.size/t.count,e[i]+=n.size}o.getPadding&&Qn(s,o.getPadding());const l=Math.max(0,t.outerWidth-Yn(s,e,"left","right")),u=Math.max(0,t.outerHeight-Yn(s,e,"top","bottom")),c=l!==e.w,d=u!==e.h;return e.w=l,e.h=u,n.horizontal?{same:c,other:d}:{same:d,other:c}}function Gn(e,t){const n=t.maxPadding;return function(e){const a={left:0,top:0,right:0,bottom:0};return e.forEach((e=>{a[e]=Math.max(t[e],n[e])})),a}(e?["left","right"]:["top","bottom"])}function Zn(e,t,n,a){const i=[];let r,o,s,l,u,c;for(r=0,o=e.length,u=0;re.box.fullSize)),!0),a=Wn(Un(t,"left"),!0),i=Wn(Un(t,"right")),r=Wn(Un(t,"top"),!0),o=Wn(Un(t,"bottom")),s=Hn(t,"x"),l=Hn(t,"y");return{fullSize:n,leftAndTop:a.concat(r),rightAndBottom:i.concat(l).concat(o).concat(s),chartArea:Un(t,"chartArea"),vertical:a.concat(i).concat(l),horizontal:r.concat(o).concat(s)}}(e.boxes),l=s.vertical,u=s.horizontal;h(e.boxes,(e=>{"function"==typeof e.beforeLayout&&e.beforeLayout()}));const c=l.reduce(((e,t)=>t.box.options&&!1===t.box.options.display?e:e+1),0)||1,d=Object.freeze({outerWidth:t,outerHeight:n,padding:i,availableWidth:r,availableHeight:o,vBoxMaxWidth:r/2/c,hBoxMaxHeight:o/2}),p=Object.assign({},i);Qn(p,yn(a));const f=Object.assign({maxPadding:p,w:r,h:o,x:i.left,y:i.top},i),m=function(e,t){const n=function(e){const t={};for(const n of e){const{stack:e,pos:a,stackWeight:i}=n;if(!e||!Vn.includes(a))continue;const r=t[e]||(t[e]={count:0,placed:0,weight:0,size:0});r.count++,r.weight+=i}return t}(e),{vBoxMaxWidth:a,hBoxMaxHeight:i}=t;let r,o,s;for(r=0,o=e.length;r{const n=t.box;Object.assign(n,e.chartArea),n.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})}))}};class ta{acquireContext(e,t){}releaseContext(e){return!1}addEventListener(e,t,n){}removeEventListener(e,t,n){}getDevicePixelRatio(){return 1}getMaximumSize(e,t,n,a){return t=Math.max(0,t||e.width),n=n||e.height,{width:t,height:Math.max(0,a?Math.floor(t/a):n)}}isAttached(e){return!0}updateConfig(e){}}class na extends ta{acquireContext(e){return e&&e.getContext&&e.getContext("2d")||null}updateConfig(e){e.options.animation=!1}}const aa="$chartjs",ia={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ra=e=>null===e||""===e,oa=!!yt&&{passive:!0};function sa(e,t,n){e&&e.canvas&&e.canvas.removeEventListener(t,n,oa)}function la(e,t){for(const n of e)if(n===t||n.contains(t))return!0}function ua(e,t,n){const a=e.canvas,i=new MutationObserver((e=>{let t=!1;for(const n of e)t=t||la(n.addedNodes,a),t=t&&!la(n.removedNodes,a);t&&n()}));return i.observe(document,{childList:!0,subtree:!0}),i}function ca(e,t,n){const a=e.canvas,i=new MutationObserver((e=>{let t=!1;for(const n of e)t=t||la(n.removedNodes,a),t=t&&!la(n.addedNodes,a);t&&n()}));return i.observe(document,{childList:!0,subtree:!0}),i}const da=new Map;let ha=0;function pa(){const e=window.devicePixelRatio;e!==ha&&(ha=e,da.forEach(((t,n)=>{n.currentDevicePixelRatio!==e&&t()})))}function fa(e,t,n){const a=e.canvas,i=a&&ut(a);if(!i)return;const r=ce(((e,t)=>{const a=i.clientWidth;n(e,t),a{const t=e[0],n=t.contentRect.width,a=t.contentRect.height;0===n&&0===a||r(n,a)}));return o.observe(i),function(e,t){da.size||window.addEventListener("resize",pa),da.set(e,t)}(e,r),o}function ma(e,t,n){n&&n.disconnect(),"resize"===t&&function(e){da.delete(e),da.size||window.removeEventListener("resize",pa)}(e)}function ga(e,t,n){const a=e.canvas,i=ce((t=>{null!==e.ctx&&n(function(e,t){const n=ia[e.type]||e.type,{x:a,y:i}=gt(e,t);return{type:n,chart:t,native:e,x:void 0!==a?a:null,y:void 0!==i?i:null}}(t,e))}),e);return function(e,t,n){e&&e.addEventListener(t,n,oa)}(a,t,i),i}class va extends ta{acquireContext(e,t){const n=e&&e.getContext&&e.getContext("2d");return n&&n.canvas===e?(function(e,t){const n=e.style,a=e.getAttribute("height"),i=e.getAttribute("width");if(e[aa]={initial:{height:a,width:i,style:{display:n.display,height:n.height,width:n.width}}},n.display=n.display||"block",n.boxSizing=n.boxSizing||"border-box",ra(i)){const t=wt(e,"width");void 0!==t&&(e.width=t)}if(ra(a))if(""===e.style.height)e.height=e.width/(t||2);else{const t=wt(e,"height");void 0!==t&&(e.height=t)}}(e,t),n):null}releaseContext(e){const t=e.canvas;if(!t[aa])return!1;const n=t[aa].initial;["height","width"].forEach((e=>{const i=n[e];a(i)?t.removeAttribute(e):t.setAttribute(e,i)}));const i=n.style||{};return Object.keys(i).forEach((e=>{t.style[e]=i[e]})),t.width=t.width,delete t[aa],!0}addEventListener(e,t,n){this.removeEventListener(e,t);const a=e.$proxies||(e.$proxies={}),i={attach:ua,detach:ca,resize:fa}[t]||ga;a[t]=i(e,t,n)}removeEventListener(e,t){const n=e.$proxies||(e.$proxies={}),a=n[t];a&&(({attach:ma,detach:ma,resize:ma}[t]||sa)(e,t,a),n[t]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(e,t,n,a){return bt(e,t,n,a)}isAttached(e){const t=e&&ut(e);return!(!t||!t.isConnected)}}function ba(e){return!lt()||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?na:va}var _a=Object.freeze({__proto__:null,BasePlatform:ta,BasicPlatform:na,DomPlatform:va,_detectPlatform:ba});const ya="transparent",wa={boolean:(e,t,n)=>n>.5?t:e,color(e,t,n){const a=Ke(e||ya),i=a.valid&&Ke(t||ya);return i&&i.valid?i.mix(a,n).hexString():t},number:(e,t,n)=>e+(t-e)*n};class ka{constructor(e,t,n,a){const i=t[n];a=kn([e.to,a,i,e.from]);const r=kn([e.from,i,a]);this._active=!0,this._fn=e.fn||wa[e.type||typeof r],this._easing=un[e.easing]||un.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=t,this._prop=n,this._from=r,this._to=a,this._promises=void 0}active(){return this._active}update(e,t,n){if(this._active){this._notify(!1);const a=this._target[this._prop],i=n-this._start,r=this._duration-i;this._start=n,this._duration=Math.floor(Math.max(r,e.duration)),this._total+=i,this._loop=!!e.loop,this._to=kn([e.to,t,a,e.from]),this._from=kn([e.from,a,t])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(e){const t=e-this._start,n=this._duration,a=this._prop,i=this._from,r=this._loop,o=this._to;let s;if(this._active=i!==o&&(r||t1?2-s:s,s=this._easing(Math.min(1,Math.max(0,s))),this._target[a]=this._fn(i,o,s))}wait(){const e=this._promises||(this._promises=[]);return new Promise(((t,n)=>{e.push({res:t,rej:n})}))}_notify(e){const t=e?"res":"rej",n=this._promises||[];for(let e=0;e{const o=e[a];if(!r(o))return;const s={};for(const e of t)s[e]=o[e];(i(o.properties)&&o.properties||[a]).forEach((e=>{e!==a&&n.has(e)||n.set(e,s)}))}))}_animateOptions(e,t){const n=t.options,a=function(e,t){if(!t)return;let n=e.options;if(n)return n.$shared&&(e.options=n=Object.assign({},n,{$shared:!1,$animations:{}})),n;e.options=t}(e,n);if(!a)return[];const i=this._createAnimations(a,n);return n.$shared&&function(e,t){const n=[],a=Object.keys(t);for(let t=0;t{e.options=n}),(()=>{})),i}_createAnimations(e,t){const n=this._properties,a=[],i=e.$animations||(e.$animations={}),r=Object.keys(t),o=Date.now();let s;for(s=r.length-1;s>=0;--s){const l=r[s];if("$"===l.charAt(0))continue;if("options"===l){a.push(...this._animateOptions(e,t));continue}const u=t[l];let c=i[l];const d=n.get(l);if(c){if(d&&c.active()){c.update(d,u,o);continue}c.cancel()}d&&d.duration?(i[l]=c=new ka(d,e,l,u),a.push(c)):e[l]=u}return a}update(e,t){if(0===this._properties.size)return void Object.assign(e,t);const n=this._createAnimations(e,t);return n.length?(ve.add(this._chart,n),!0):void 0}}function Sa(e,t){const n=e&&e.options||{},a=n.reverse,i=void 0===n.min?t:0,r=void 0===n.max?t:0;return{start:a?r:i,end:a?i:r}}function Ca(e,t){const n=[],a=e._getSortedDatasetMetas(t);let i,r;for(i=0,r=a.length;i0||!n&&t<0)return i.index}return null}function Pa(e,t){const{chart:n,_cachedMeta:a}=e,i=n._stacks||(n._stacks={}),{iScale:r,vScale:o,index:s}=a,l=r.axis,u=o.axis,c=function(e,t,n){return`${e.id}.${t.id}.${n.stack||n.type}`}(r,o,a),d=t.length;let h;for(let e=0;en[e].axis===t)).shift()}function Oa(e,t){const n=e.controller.index,a=e.vScale&&e.vScale.axis;if(a){t=t||e._parsed;for(const e of t){const t=e._stacks;if(!t||void 0===t[a]||void 0===t[a][n])return;delete t[a][n],void 0!==t[a]._visualValues&&void 0!==t[a]._visualValues[n]&&delete t[a]._visualValues[n]}}}const Na=e=>"reset"===e||"none"===e,Ra=(e,t)=>t?e:Object.assign({},e);class Ia{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(e,t){this.chart=e,this._ctx=e.ctx,this.index=t,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const e=this._cachedMeta;this.configure(),this.linkScales(),e._stacked=Ta(e.vScale,e),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(e){this.index!==e&&Oa(this._cachedMeta),this.index=e}linkScales(){const e=this.chart,t=this._cachedMeta,n=this.getDataset(),a=(e,t,n,a)=>"x"===e?t:"r"===e?a:n,i=t.xAxisID=l(n.xAxisID,La(e,"x")),r=t.yAxisID=l(n.yAxisID,La(e,"y")),o=t.rAxisID=l(n.rAxisID,La(e,"r")),s=t.indexAxis,u=t.iAxisID=a(s,i,r,o),c=t.vAxisID=a(s,r,i,o);t.xScale=this.getScaleForId(i),t.yScale=this.getScaleForId(r),t.rScale=this.getScaleForId(o),t.iScale=this.getScaleForId(u),t.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(e){return this.chart.scales[e]}_getOtherScale(e){const t=this._cachedMeta;return e===t.iScale?t.vScale:t.iScale}reset(){this._update("reset")}_destroy(){const e=this._cachedMeta;this._data&&se(this._data,this),e._stacked&&Oa(e)}_dataCheck(){const e=this.getDataset(),t=e.data||(e.data=[]),n=this._data;if(r(t)){const e=this._cachedMeta;this._data=function(e,t){const{iScale:n,vScale:a}=t,i="x"===n.axis?"x":"y",r="x"===a.axis?"x":"y",o=Object.keys(e),s=new Array(o.length);let l,u,c;for(l=0,u=o.length;l0&&n._parsed[e-1];if(!1===this._parsing)n._parsed=a,n._sorted=!0,d=a;else{d=i(a[e])?this.parseArrayData(n,a,e,t):r(a[e])?this.parseObjectData(n,a,e,t):this.parsePrimitiveData(n,a,e,t);const o=()=>null===c[l]||p&&c[l]e&&!t.hidden&&t._stacked&&{keys:Ca(n,!0),values:null})(t,n,this.chart),u={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(e){const{min:t,max:n,minDefined:a,maxDefined:i}=e.getUserBounds();return{min:a?t:Number.NEGATIVE_INFINITY,max:i?n:Number.POSITIVE_INFINITY}}(s);let h,p;function f(){p=a[h];const t=p[s.axis];return!o(p[e.axis])||c>t||d=0;--h)if(!f()){this.updateRangeFromParsed(u,e,p,l);break}return u}getAllParsedValues(e){const t=this._cachedMeta._parsed,n=[];let a,i,r;for(a=0,i=t.length;a=0&&ethis.getContext(n,a,t)),c);return p.$shared&&(p.$shared=s,i[r]=Object.freeze(Ra(p,s))),p}_resolveAnimations(e,t,n){const a=this.chart,i=this._cachedDataOpts,r=`animation-${t}`,o=i[r];if(o)return o;let s;if(!1!==a.options.animation){const a=this.chart.config,i=a.datasetAnimationScopeKeys(this._type,t),r=a.getOptionScopes(this.getDataset(),i);s=a.createResolver(r,this.getContext(e,n,t))}const l=new xa(a,s&&s.animations);return s&&s._cacheable&&(i[r]=Object.freeze(l)),l}getSharedOptions(e){if(e.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},e))}includeOptions(e,t){return!t||Na(e)||this.chart._animationsDisabled}_getSharedOptions(e,t){const n=this.resolveDataElementOptions(e,t),a=this._sharedOptions,i=this.getSharedOptions(n),r=this.includeOptions(t,i)||i!==a;return this.updateSharedOptions(i,t,n),{sharedOptions:i,includeOptions:r}}updateElement(e,t,n,a){Na(a)?Object.assign(e,n):this._resolveAnimations(t,a).update(e,n)}updateSharedOptions(e,t,n){e&&!Na(t)&&this._resolveAnimations(void 0,t).update(e,n)}_setStyle(e,t,n,a){e.active=a;const i=this.getStyle(t,a);this._resolveAnimations(t,n,a).update(e,{options:!a&&this.getSharedOptions(i)||i})}removeHoverStyle(e,t,n){this._setStyle(e,n,"active",!1)}setHoverStyle(e,t,n){this._setStyle(e,n,"active",!0)}_removeDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!1)}_setDatasetHoverStyle(){const e=this._cachedMeta.dataset;e&&this._setStyle(e,void 0,"active",!0)}_resyncElements(e){const t=this._data,n=this._cachedMeta.data;for(const[e,t,n]of this._syncList)this[e](t,n);this._syncList=[];const a=n.length,i=t.length,r=Math.min(i,a);r&&this.parse(0,r),i>a?this._insertElements(a,i-a,e):i{for(e.length+=t,o=e.length-1;o>=r;o--)e[o]=e[o-t]};for(s(i),o=e;o{a[e]=n[e]&&n[e].active()?n[e]._to:this[e]})),a}}function qa(e,t){const n=e.options.ticks,i=function(e){const t=e.options.offset,n=e._tickSize(),a=e._length/n+(t?0:1),i=e._maxLength/n;return Math.floor(Math.min(a,i))}(e),r=Math.min(n.maxTicksLimit||i,i),o=n.major.enabled?function(e){const t=[];let n,a;for(n=0,a=e.length;nr)return function(e,t,n,a){let i,r=0,o=n[0];for(a=Math.ceil(a),i=0;ii)return t}return Math.max(i,1)}(o,t,r);if(s>0){let e,n;const i=s>1?Math.round((u-l)/(s-1)):null;for(Da(t,c,d,a(i)?0:l-i,l),e=0,n=s-1;e"top"===t||"left"===t?e[t]+n:e[t]-n,$a=(e,t)=>Math.min(t||e,e);function Ba(e,t){const n=[],a=e.length/t,i=e.length;let r=0;for(;ro+s)))return u}function Va(e){return e.drawTicks?e.tickLength:0}function Ua(e,t){if(!e.display)return 0;const n=wn(e.font,t),a=yn(e.padding);return(i(e.text)?e.text.length:1)*n.lineHeight+a.height}function Ha(e,t,n){let a=he(e);return(n&&"right"!==t||!n&&"right"===t)&&(a=(e=>"left"===e?"right":"right"===e?"left":e)(a)),a}class Wa extends za{constructor(e){super(),this.id=e.id,this.type=e.type,this.options=void 0,this.ctx=e.ctx,this.chart=e.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(e){this.options=e.setContext(this.getContext()),this.axis=e.axis,this._userMin=this.parse(e.min),this._userMax=this.parse(e.max),this._suggestedMin=this.parse(e.suggestedMin),this._suggestedMax=this.parse(e.suggestedMax)}parse(e,t){return e}getUserBounds(){let{_userMin:e,_userMax:t,_suggestedMin:n,_suggestedMax:a}=this;return e=s(e,Number.POSITIVE_INFINITY),t=s(t,Number.NEGATIVE_INFINITY),n=s(n,Number.POSITIVE_INFINITY),a=s(a,Number.NEGATIVE_INFINITY),{min:s(e,n),max:s(t,a),minDefined:o(e),maxDefined:o(t)}}getMinMax(e){let t,{min:n,max:a,minDefined:i,maxDefined:r}=this.getUserBounds();if(i&&r)return{min:n,max:a};const o=this.getMatchingVisibleMetas();for(let s=0,l=o.length;sa?a:n,a=i&&n>a?n:a,{min:s(n,s(a,n)),max:s(a,s(n,a))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const e=this.chart.data;return this.options.labels||(this.isHorizontal()?e.xLabels:e.yLabels)||e.labels||[]}getLabelItems(e=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(e))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(e,t,n){const{beginAtZero:a,grace:i,ticks:r}=this.options,o=r.sampleSize;this.beforeUpdate(),this.maxWidth=e,this.maxHeight=t,this._margins=n=Object.assign({left:0,right:0,top:0,bottom:0},n),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+n.left+n.right:this.height+n.top+n.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=xn(this,i,a),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const s=o=i||n<=1||!this.isHorizontal())return void(this.labelRotation=a);const u=this._getLabelSizes(),c=u.widest.width,d=u.highest.height,h=J(this.chart.width-c,0,this.maxWidth);r=e.offset?this.maxWidth/n:h/(n-1),c+6>r&&(r=h/(n-(e.offset?.5:1)),o=this.maxHeight-Va(e.grid)-t.padding-Ua(e.title,this.chart.options.font),s=Math.sqrt(c*c+d*d),l=H(Math.min(Math.asin(J((u.highest.height+6)/r,-1,1)),Math.asin(J(o/s,-1,1))-Math.asin(J(d/s,-1,1)))),l=Math.max(a,Math.min(i,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const e={width:0,height:0},{chart:t,options:{ticks:n,title:a,grid:i}}=this,r=this._isVisible(),o=this.isHorizontal();if(r){const r=Ua(a,t.options.font);if(o?(e.width=this.maxWidth,e.height=Va(i)+r):(e.height=this.maxHeight,e.width=Va(i)+r),n.display&&this.ticks.length){const{first:t,last:a,widest:i,highest:r}=this._getLabelSizes(),s=2*n.padding,l=U(this.labelRotation),u=Math.cos(l),c=Math.sin(l);if(o){const t=n.mirror?0:c*i.width+u*r.height;e.height=Math.min(this.maxHeight,e.height+t+s)}else{const t=n.mirror?0:u*i.width+c*r.height;e.width=Math.min(this.maxWidth,e.width+t+s)}this._calculatePadding(t,a,c,u)}}this._handleMargins(),o?(this.width=this._length=t.width-this._margins.left-this._margins.right,this.height=e.height):(this.width=e.width,this.height=this._length=t.height-this._margins.top-this._margins.bottom)}_calculatePadding(e,t,n,a){const{ticks:{align:i,padding:r},position:o}=this.options,s=0!==this.labelRotation,l="top"!==o&&"x"===this.axis;if(this.isHorizontal()){const o=this.getPixelForTick(0)-this.left,u=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;s?l?(c=a*e.width,d=n*t.height):(c=n*e.height,d=a*t.width):"start"===i?d=t.width:"end"===i?c=e.width:"inner"!==i&&(c=e.width/2,d=t.width/2),this.paddingLeft=Math.max((c-o+r)*this.width/(this.width-o),0),this.paddingRight=Math.max((d-u+r)*this.width/(this.width-u),0)}else{let n=t.height/2,a=e.height/2;"start"===i?(n=0,a=e.height):"end"===i&&(n=t.height,a=0),this.paddingTop=n+r,this.paddingBottom=a+r}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:e,position:t}=this.options;return"top"===t||"bottom"===t||"x"===e}isFullSize(){return this.options.fullSize}_convertTicksToLabels(e){let t,n;for(this.beforeTickToLabelConversion(),this.generateTickLabels(e),t=0,n=e.length;t{const n=e.gc,a=n.length/2;let i;if(a>t){for(i=0;i({width:s[e]||0,height:l[e]||0});return{first:E(0),last:E(t-1),widest:E(S),highest:E(C),widths:s,heights:l}}getLabelForValue(e){return e}getPixelForValue(e,t){return NaN}getValueForPixel(e){}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getPixelForDecimal(e){this._reversePixels&&(e=1-e);const t=this._startPixel+e*this._length;return X(this._alignToPixels?Ct(this.chart,t,0):t)}getDecimalForPixel(e){const t=(e-this._startPixel)/this._length;return this._reversePixels?1-t:t}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:e,max:t}=this;return e<0&&t<0?t:e>0&&t>0?e:0}getContext(e){const t=this.ticks||[];if(e>=0&&eo*a?o/n:s/a:s*a0}_computeGridLineItems(e){const t=this.axis,n=this.chart,a=this.options,{grid:i,position:o,border:s}=a,u=i.offset,c=this.isHorizontal(),d=this.ticks.length+(u?1:0),h=Va(i),p=[],f=s.setContext(this.getContext()),m=f.display?f.width:0,g=m/2,v=function(e){return Ct(n,e,m)};let b,_,y,w,k,x,S,C,E,T,A,M;if("top"===o)b=v(this.bottom),x=this.bottom-h,C=b-g,T=v(e.top)+g,M=e.bottom;else if("bottom"===o)b=v(this.top),T=e.top,M=v(e.bottom)-g,x=b+g,C=this.top+h;else if("left"===o)b=v(this.right),k=this.right-h,S=b-g,E=v(e.left)+g,A=e.right;else if("right"===o)b=v(this.left),E=e.left,A=v(e.right)-g,k=b+g,S=this.left+h;else if("x"===t){if("center"===o)b=v((e.top+e.bottom)/2+.5);else if(r(o)){const e=Object.keys(o)[0],t=o[e];b=v(this.chart.scales[e].getPixelForValue(t))}T=e.top,M=e.bottom,x=b+g,C=x+h}else if("y"===t){if("center"===o)b=v((e.left+e.right)/2);else if(r(o)){const e=Object.keys(o)[0],t=o[e];b=v(this.chart.scales[e].getPixelForValue(t))}k=b-g,S=k-h,E=e.left,A=e.right}const P=l(a.ticks.maxTicksLimit,d),L=Math.max(1,Math.ceil(d/P));for(_=0;_0&&(r-=a/2)}d={left:r,top:i,width:a+t.width,height:n+t.height,color:e.backdropColor}}v.push({label:w,font:E,textOffset:M,options:{rotation:g,color:n,strokeColor:r,strokeWidth:u,textAlign:p,textBaseline:P,translation:[k,x],backdrop:d}})}return v}_getXAxisLabelAlignment(){const{position:e,ticks:t}=this.options;if(-U(this.labelRotation))return"top"===e?"left":"right";let n="center";return"start"===t.align?n="left":"end"===t.align?n="right":"inner"===t.align&&(n="inner"),n}_getYAxisLabelAlignment(e){const{position:t,ticks:{crossAlign:n,mirror:a,padding:i}}=this.options,r=e+i,o=this._getLabelSizes().widest.width;let s,l;return"left"===t?a?(l=this.right+i,"near"===n?s="left":"center"===n?(s="center",l+=o/2):(s="right",l+=o)):(l=this.right-r,"near"===n?s="right":"center"===n?(s="center",l-=o/2):(s="left",l=this.left)):"right"===t?a?(l=this.left+i,"near"===n?s="right":"center"===n?(s="center",l-=o/2):(s="left",l-=o)):(l=this.left+r,"near"===n?s="left":"center"===n?(s="center",l+=o/2):(s="right",l=this.right)):s="right",{textAlign:s,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const e=this.chart,t=this.options.position;return"left"===t||"right"===t?{top:0,left:this.left,bottom:e.height,right:this.right}:"top"===t||"bottom"===t?{top:this.top,left:0,bottom:this.bottom,right:e.width}:void 0}drawBackground(){const{ctx:e,options:{backgroundColor:t},left:n,top:a,width:i,height:r}=this;t&&(e.save(),e.fillStyle=t,e.fillRect(n,a,i,r),e.restore())}getLineWidthForValue(e){const t=this.options.grid;if(!this._isVisible()||!t.display)return 0;const n=this.ticks.findIndex((t=>t.value===e));return n>=0?t.setContext(this.getContext(n)).lineWidth:0}drawGrid(e){const t=this.options.grid,n=this.ctx,a=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(e));let i,r;const o=(e,t,a)=>{a.width&&a.color&&(n.save(),n.lineWidth=a.width,n.strokeStyle=a.color,n.setLineDash(a.borderDash||[]),n.lineDashOffset=a.borderDashOffset,n.beginPath(),n.moveTo(e.x,e.y),n.lineTo(t.x,t.y),n.stroke(),n.restore())};if(t.display)for(i=0,r=a.length;i{this.drawBackground(),this.drawGrid(e),this.drawTitle()}},{z:a,draw:()=>{this.drawBorder()}},{z:t,draw:e=>{this.drawLabels(e)}}]:[{z:t,draw:e=>{this.draw(e)}}]}getMatchingVisibleMetas(e){const t=this.chart.getSortedVisibleDatasetMetas(),n=this.axis+"AxisID",a=[];let i,r;for(i=0,r=t.length;i{const a=n.split("."),i=a.pop(),r=[e].concat(a).join("."),o=t[n].split("."),s=o.pop(),l=o.join(".");st.route(r,i,l,s)}))}(t,e.defaultRoutes),e.descriptors&&st.describe(t,e.descriptors)}(e,r,n),this.override&&st.override(e.id,e.overrides)),r}get(e){return this.items[e]}unregister(e){const t=this.items,n=e.id,a=this.scope;n in t&&delete t[n],a&&n in st[a]&&(delete st[a][n],this.override&&delete at[n])}}var Qa=new class{constructor(){this.controllers=new Ya(Ia,"datasets",!0),this.elements=new Ya(za,"elements"),this.plugins=new Ya(Object,"plugins"),this.scales=new Ya(Wa,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...e){this._each("register",e)}remove(...e){this._each("unregister",e)}addControllers(...e){this._each("register",e,this.controllers)}addElements(...e){this._each("register",e,this.elements)}addPlugins(...e){this._each("register",e,this.plugins)}addScales(...e){this._each("register",e,this.scales)}getController(e){return this._get(e,this.controllers,"controller")}getElement(e){return this._get(e,this.elements,"element")}getPlugin(e){return this._get(e,this.plugins,"plugin")}getScale(e){return this._get(e,this.scales,"scale")}removeControllers(...e){this._each("unregister",e,this.controllers)}removeElements(...e){this._each("unregister",e,this.elements)}removePlugins(...e){this._each("unregister",e,this.plugins)}removeScales(...e){this._each("unregister",e,this.scales)}_each(e,t,n){[...t].forEach((t=>{const a=n||this._getRegistryForType(t);n||a.isForType(t)||a===this.plugins&&t.id?this._exec(e,a,t):h(t,(t=>{const a=n||this._getRegistryForType(t);this._exec(e,a,t)}))}))}_exec(e,t,n){const a=x(e);d(n["before"+a],[],n),t[e](n),d(n["after"+a],[],n)}_getRegistryForType(e){for(let t=0;te.filter((e=>!t.some((t=>e.plugin.id===t.plugin.id))));this._notify(a(t,n),e,"stop"),this._notify(a(n,t),e,"start")}}function Ga(e,t){return t||!1!==e?!0===e?{}:e:null}function Za(e,{plugin:t,local:n},a,i){const r=e.pluginScopeKeys(t),o=e.getOptionScopes(a,r);return n&&t.defaults&&o.push(t.defaults),e.createResolver(o,i,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function Ja(e,t){const n=st.datasets[e]||{};return((t.datasets||{})[e]||{}).indexAxis||t.indexAxis||n.indexAxis||"x"}function Xa(e){if("x"===e||"y"===e||"r"===e)return e}function ei(e,...t){if(Xa(e))return e;for(const a of t){const t=a.axis||("top"===(n=a.position)||"bottom"===n?"x":"left"===n||"right"===n?"y":void 0)||e.length>1&&Xa(e[0].toLowerCase());if(t)return t}var n;throw new Error(`Cannot determine type of '${e}' axis. Please provide 'axis' or 'position' option.`)}function ti(e,t,n){if(n[t+"AxisID"]===e)return{axis:t}}function ni(e){const t=e.options||(e.options={});t.plugins=l(t.plugins,{}),t.scales=function(e,t){const n=at[e.type]||{scales:{}},a=t.scales||{},i=Ja(e.type,t),o=Object.create(null);return Object.keys(a).forEach((t=>{const s=a[t];if(!r(s))return console.error(`Invalid scale configuration for scale: ${t}`);if(s._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const l=ei(t,s,function(e,t){if(t.data&&t.data.datasets){const n=t.data.datasets.filter((t=>t.xAxisID===e||t.yAxisID===e));if(n.length)return ti(e,"x",n[0])||ti(e,"y",n[0])}return{}}(t,e),st.scales[s.type]),u=function(e,t){return e===t?"_index_":"_value_"}(l,i),c=n.scales||{};o[t]=b(Object.create(null),[{axis:l},s,c[l],c[u]])})),e.data.datasets.forEach((n=>{const i=n.type||e.type,r=n.indexAxis||Ja(i,t),s=(at[i]||{}).scales||{};Object.keys(s).forEach((e=>{const t=function(e,t){let n=e;return"_index_"===e?n=t:"_value_"===e&&(n="x"===t?"y":"x"),n}(e,r),i=n[t+"AxisID"]||t;o[i]=o[i]||Object.create(null),b(o[i],[{axis:t},a[i],s[e]])}))})),Object.keys(o).forEach((e=>{const t=o[e];b(t,[st.scales[t.type],st.scale])})),o}(e,t)}function ai(e){return(e=e||{}).datasets=e.datasets||[],e.labels=e.labels||[],e}const ii=new Map,ri=new Set;function oi(e,t){let n=ii.get(e);return n||(n=t(),ii.set(e,n),ri.add(n)),n}const si=(e,t,n)=>{const a=k(t,n);void 0!==a&&e.add(a)};class li{constructor(e){this._config=function(e){return(e=e||{}).data=ai(e.data),ni(e),e}(e),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(e){this._config.type=e}get data(){return this._config.data}set data(e){this._config.data=ai(e)}get options(){return this._config.options}set options(e){this._config.options=e}get plugins(){return this._config.plugins}update(){const e=this._config;this.clearCache(),ni(e)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(e){return oi(e,(()=>[[`datasets.${e}`,""]]))}datasetAnimationScopeKeys(e,t){return oi(`${e}.transition.${t}`,(()=>[[`datasets.${e}.transitions.${t}`,`transitions.${t}`],[`datasets.${e}`,""]]))}datasetElementScopeKeys(e,t){return oi(`${e}-${t}`,(()=>[[`datasets.${e}.elements.${t}`,`datasets.${e}`,`elements.${t}`,""]]))}pluginScopeKeys(e){const t=e.id;return oi(`${this.type}-plugin-${t}`,(()=>[[`plugins.${t}`,...e.additionalOptionScopes||[]]]))}_cachedScopes(e,t){const n=this._scopeCache;let a=n.get(e);return a&&!t||(a=new Map,n.set(e,a)),a}getOptionScopes(e,t,n){const{options:a,type:i}=this,r=this._cachedScopes(e,n),o=r.get(t);if(o)return o;const s=new Set;t.forEach((t=>{e&&(s.add(e),t.forEach((t=>si(s,e,t)))),t.forEach((e=>si(s,a,e))),t.forEach((e=>si(s,at[i]||{},e))),t.forEach((e=>si(s,st,e))),t.forEach((e=>si(s,it,e)))}));const l=Array.from(s);return 0===l.length&&l.push(Object.create(null)),ri.has(t)&&r.set(t,l),l}chartOptionScopes(){const{options:e,type:t}=this;return[e,at[t]||{},st.datasets[t]||{},{type:t},st,it]}resolveNamedOptions(e,t,n,a=[""]){const r={$shared:!0},{resolver:o,subPrefixes:s}=ui(this._resolverCache,e,a);let l=o;(function(e,t){const{isScriptable:n,isIndexable:a}=$t(e);for(const r of t){const t=n(r),o=a(r),s=(o||t)&&e[r];if(t&&(C(s)||ci(s))||o&&i(s))return!0}return!1})(o,t)&&(r.$shared=!1,l=jt(o,n=C(n)?n():n,this.createResolver(e,n,s)));for(const e of t)r[e]=l[e];return r}createResolver(e,t,n=[""],a){const{resolver:i}=ui(this._resolverCache,e,n);return r(t)?jt(i,t,void 0,a):i}}function ui(e,t,n){let a=e.get(t);a||(a=new Map,e.set(t,a));const i=n.join();let r=a.get(i);return r||(r={resolver:Dt(t,n),subPrefixes:n.filter((e=>!e.toLowerCase().includes("hover")))},a.set(i,r)),r}const ci=e=>r(e)&&Object.getOwnPropertyNames(e).some((t=>C(e[t]))),di=["top","bottom","left","right","chartArea"];function hi(e,t){return"top"===e||"bottom"===e||-1===di.indexOf(e)&&"x"===t}function pi(e,t){return function(n,a){return n[e]===a[e]?n[t]-a[t]:n[e]-a[e]}}function fi(e){const t=e.chart,n=t.options.animation;t.notifyPlugins("afterRender"),d(n&&n.onComplete,[e],t)}function mi(e){const t=e.chart,n=t.options.animation;d(n&&n.onProgress,[e],t)}function gi(e){return lt()&&"string"==typeof e?e=document.getElementById(e):e&&e.length&&(e=e[0]),e&&e.canvas&&(e=e.canvas),e}const vi={},bi=e=>{const t=gi(e);return Object.values(vi).filter((e=>e.canvas===t)).pop()};function _i(e,t,n){const a=Object.keys(e);for(const i of a){const a=+i;if(a>=t){const r=e[i];delete e[i],(n>0||a>t)&&(e[a+n]=r)}}}function yi(e,t,n){return e.options.clip?e[n]:t[n]}class wi{static defaults=st;static instances=vi;static overrides=at;static registry=Qa;static version="4.4.4";static getChart=bi;static register(...e){Qa.add(...e),ki()}static unregister(...e){Qa.remove(...e),ki()}constructor(e,t){const a=this.config=new li(t),i=gi(e),r=bi(i);if(r)throw new Error("Canvas is already in use. Chart with ID '"+r.id+"' must be destroyed before the canvas with ID '"+r.canvas.id+"' can be reused.");const o=a.createResolver(a.chartOptionScopes(),this.getContext());this.platform=new(a.platform||ba(i)),this.platform.updateConfig(a);const s=this.platform.acquireContext(i,o.aspectRatio),l=s&&s.canvas,u=l&&l.height,c=l&&l.width;this.id=n(),this.ctx=s,this.canvas=l,this.width=c,this.height=u,this._options=o,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ka,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=de((e=>this.update(e)),o.resizeDelay||0),this._dataChanges=[],vi[this.id]=this,s&&l?(ve.listen(this,"complete",fi),ve.listen(this,"progress",mi),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:e,maintainAspectRatio:t},width:n,height:i,_aspectRatio:r}=this;return a(e)?t&&r?r:i?n/i:null:e}get data(){return this.config.data}set data(e){this.config.data=e}get options(){return this._options}set options(e){this.config.options=e}get registry(){return Qa}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():_t(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Et(this.canvas,this.ctx),this}stop(){return ve.stop(this),this}resize(e,t){ve.running(this)?this._resizeBeforeDraw={width:e,height:t}:this._resize(e,t)}_resize(e,t){const n=this.options,a=this.canvas,i=n.maintainAspectRatio&&this.aspectRatio,r=this.platform.getMaximumSize(a,e,t,i),o=n.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?"resize":"attach";this.width=r.width,this.height=r.height,this._aspectRatio=this.aspectRatio,_t(this,o,!0)&&(this.notifyPlugins("resize",{size:r}),d(n.onResize,[this,r],this),this.attached&&this._doResize(s)&&this.render())}ensureScalesHaveIDs(){h(this.options.scales||{},((e,t)=>{e.id=t}))}buildOrUpdateScales(){const e=this.options,t=e.scales,n=this.scales,a=Object.keys(n).reduce(((e,t)=>(e[t]=!1,e)),{});let i=[];t&&(i=i.concat(Object.keys(t).map((e=>{const n=t[e],a=ei(e,n),i="r"===a,r="x"===a;return{options:n,dposition:i?"chartArea":r?"bottom":"left",dtype:i?"radialLinear":r?"category":"linear"}})))),h(i,(t=>{const i=t.options,r=i.id,o=ei(r,i),s=l(i.type,t.dtype);void 0!==i.position&&hi(i.position,o)===hi(t.dposition)||(i.position=t.dposition),a[r]=!0;let u=null;r in n&&n[r].type===s?u=n[r]:(u=new(Qa.getScale(s))({id:r,type:s,ctx:this.ctx,chart:this}),n[u.id]=u),u.init(i,e)})),h(a,((e,t)=>{e||delete n[t]})),h(n,(e=>{ea.configure(this,e,e.options),ea.addBox(this,e)}))}_updateMetasets(){const e=this._metasets,t=this.data.datasets.length,n=e.length;if(e.sort(((e,t)=>e.index-t.index)),n>t){for(let e=t;et.length&&delete this._stacks,e.forEach(((e,n)=>{0===t.filter((t=>t===e._dataset)).length&&this._destroyDatasetMeta(n)}))}buildOrUpdateControllers(){const e=[],t=this.data.datasets;let n,a;for(this._removeUnreferencedMetasets(),n=0,a=t.length;n{this.getDatasetMeta(t).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(e){const t=this.config;t.update();const n=this._options=t.createResolver(t.chartOptionScopes(),this.getContext()),a=this._animationsDisabled=!n.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:e,cancelable:!0}))return;const i=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let r=0;for(let e=0,t=this.data.datasets.length;e{e.reset()})),this._updateDatasets(e),this.notifyPlugins("afterUpdate",{mode:e}),this._layers.sort(pi("z","_idx"));const{_active:o,_lastEvent:s}=this;s?this._eventHandler(s,!0):o.length&&this._updateHoverStyles(o,o,!0),this.render()}_updateScales(){h(this.scales,(e=>{ea.removeBox(this,e)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const e=this.options,t=new Set(Object.keys(this._listeners)),n=new Set(e.events);E(t,n)&&!!this._responsiveListeners===e.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:e}=this,t=this._getUniformDataChanges()||[];for(const{method:n,start:a,count:i}of t)_i(e,a,"_removeElements"===n?-i:i)}_getUniformDataChanges(){const e=this._dataChanges;if(!e||!e.length)return;this._dataChanges=[];const t=this.data.datasets.length,n=t=>new Set(e.filter((e=>e[0]===t)).map(((e,t)=>t+","+e.splice(1).join(",")))),a=n(0);for(let e=1;ee.split(","))).map((e=>({method:e[1],start:+e[2],count:+e[3]})))}_updateLayout(e){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ea.update(this,this.width,this.height,e);const t=this.chartArea,n=t.width<=0||t.height<=0;this._layers=[],h(this.boxes,(e=>{n&&"chartArea"===e.position||(e.configure&&e.configure(),this._layers.push(...e._layers()))}),this),this._layers.forEach(((e,t)=>{e._idx=t})),this.notifyPlugins("afterLayout")}_updateDatasets(e){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:e,cancelable:!0})){for(let e=0,t=this.data.datasets.length;e=0;--t)this._drawDataset(e[t]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(e){const t=this.ctx,n=e._clip,a=!n.disabled,i=function(e,t){const{xScale:n,yScale:a}=e;return n&&a?{left:yi(n,t,"left"),right:yi(n,t,"right"),top:yi(a,t,"top"),bottom:yi(a,t,"bottom")}:t}(e,this.chartArea),r={meta:e,index:e.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",r)&&(a&&Pt(t,{left:!1===n.left?0:i.left-n.left,right:!1===n.right?this.width:i.right+n.right,top:!1===n.top?0:i.top-n.top,bottom:!1===n.bottom?this.height:i.bottom+n.bottom}),e.controller.draw(),a&&Lt(t),r.cancelable=!1,this.notifyPlugins("afterDatasetDraw",r))}isPointInArea(e){return Mt(e,this.chartArea,this._minPadding)}getElementsAtEventForMode(e,t,n,a){const i=Fn.modes[t];return"function"==typeof i?i(this,e,n,a):[]}getDatasetMeta(e){const t=this.data.datasets[e],n=this._metasets;let a=n.filter((e=>e&&e._dataset===t)).pop();return a||(a={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:t&&t.order||0,index:e,_dataset:t,_parsed:[],_sorted:!1},n.push(a)),a}getContext(){return this.$context||(this.$context=Sn(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(e){const t=this.data.datasets[e];if(!t)return!1;const n=this.getDatasetMeta(e);return"boolean"==typeof n.hidden?!n.hidden:!t.hidden}setDatasetVisibility(e,t){this.getDatasetMeta(e).hidden=!t}toggleDataVisibility(e){this._hiddenIndices[e]=!this._hiddenIndices[e]}getDataVisibility(e){return!this._hiddenIndices[e]}_updateVisibility(e,t,n){const a=n?"show":"hide",i=this.getDatasetMeta(e),r=i.controller._resolveAnimations(void 0,a);S(t)?(i.data[t].hidden=!n,this.update()):(this.setDatasetVisibility(e,n),r.update(i,{visible:n}),this.update((t=>t.datasetIndex===e?a:void 0)))}hide(e,t){this._updateVisibility(e,t,!1)}show(e,t){this._updateVisibility(e,t,!0)}_destroyDatasetMeta(e){const t=this._metasets[e];t&&t.controller&&t.controller._destroy(),delete this._metasets[e]}_stop(){let e,t;for(this.stop(),ve.remove(this),e=0,t=this.data.datasets.length;e{t.addEventListener(this,n,a),e[n]=a},a=(e,t,n)=>{e.offsetX=t,e.offsetY=n,this._eventHandler(e)};h(this.options.events,(e=>n(e,a)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const e=this._responsiveListeners,t=this.platform,n=(n,a)=>{t.addEventListener(this,n,a),e[n]=a},a=(n,a)=>{e[n]&&(t.removeEventListener(this,n,a),delete e[n])},i=(e,t)=>{this.canvas&&this.resize(e,t)};let r;const o=()=>{a("attach",o),this.attached=!0,this.resize(),n("resize",i),n("detach",r)};r=()=>{this.attached=!1,a("resize",i),this._stop(),this._resize(0,0),n("attach",o)},t.isAttached(this.canvas)?o():r()}unbindEvents(){h(this._listeners,((e,t)=>{this.platform.removeEventListener(this,t,e)})),this._listeners={},h(this._responsiveListeners,((e,t)=>{this.platform.removeEventListener(this,t,e)})),this._responsiveListeners=void 0}updateHoverStyle(e,t,n){const a=n?"set":"remove";let i,r,o,s;for("dataset"===t&&(i=this.getDatasetMeta(e[0].datasetIndex),i.controller["_"+a+"DatasetHoverStyle"]()),o=0,s=e.length;o{const n=this.getDatasetMeta(e);if(!n)throw new Error("No dataset found at index "+e);return{datasetIndex:e,element:n.data[t],index:t}}));!p(n,t)&&(this._active=n,this._lastEvent=null,this._updateHoverStyles(n,t))}notifyPlugins(e,t,n){return this._plugins.notify(this,e,t,n)}isPluginEnabled(e){return 1===this._plugins._cache.filter((t=>t.plugin.id===e)).length}_updateHoverStyles(e,t,n){const a=this.options.hover,i=(e,t)=>e.filter((e=>!t.some((t=>e.datasetIndex===t.datasetIndex&&e.index===t.index)))),r=i(t,e),o=n?e:i(e,t);r.length&&this.updateHoverStyle(r,a.mode,!1),o.length&&a.mode&&this.updateHoverStyle(o,a.mode,!0)}_eventHandler(e,t){const n={event:e,replay:t,cancelable:!0,inChartArea:this.isPointInArea(e)},a=t=>(t.options.events||this.options.events).includes(e.native.type);if(!1===this.notifyPlugins("beforeEvent",n,a))return;const i=this._handleEvent(e,t,n.inChartArea);return n.cancelable=!1,this.notifyPlugins("afterEvent",n,a),(i||n.changed)&&this.render(),this}_handleEvent(e,t,n){const{_active:a=[],options:i}=this,r=t,o=this._getActiveElements(e,a,n,r),s=T(e),l=function(e,t,n,a){return n&&"mouseout"!==e.type?a?t:e:null}(e,this._lastEvent,n,s);n&&(this._lastEvent=null,d(i.onHover,[e,o,this],this),s&&d(i.onClick,[e,o,this],this));const u=!p(o,a);return(u||t)&&(this._active=o,this._updateHoverStyles(o,a,t)),this._lastEvent=l,u}_getActiveElements(e,t,n,a){if("mouseout"===e.type)return[];if(!n)return t;const i=this.options.hover;return this.getElementsAtEventForMode(e,i.mode,i,a)}}function ki(){return h(wi.instances,(e=>e._plugins.invalidate()))}function xi(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Si{static override(e){Object.assign(Si.prototype,e)}options;constructor(e){this.options=e||{}}init(){}formats(){return xi()}parse(){return xi()}format(){return xi()}add(){return xi()}diff(){return xi()}startOf(){return xi()}endOf(){return xi()}}var Ci={_date:Si};function Ei(e){const t=e.iScale,n=function(e,t){if(!e._cache.$bar){const n=e.getMatchingVisibleMetas(t);let a=[];for(let t=0,i=n.length;te-t)))}return e._cache.$bar}(t,e.type);let a,i,r,o,s=t._length;const l=()=>{32767!==r&&-32768!==r&&(S(o)&&(s=Math.min(s,Math.abs(r-o)||s)),o=r)};for(a=0,i=n.length;aMath.abs(s)&&(l=s,u=o),t[n.axis]=u,t._custom={barStart:l,barEnd:u,start:i,end:r,min:o,max:s}}(e,t,n,a):t[n.axis]=n.parse(e,a),t}function Ai(e,t,n,a){const i=e.iScale,r=e.vScale,o=i.getLabels(),s=i===r,l=[];let u,c,d,h;for(u=n,c=n+a;ue.x,n="left",a="right"):(t=e.base"spacing"!==e,_indexable:e=>"spacing"!==e&&!e.startsWith("borderDash")&&!e.startsWith("hoverBorderDash")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(e){const t=e.data;if(t.labels.length&&t.datasets.length){const{labels:{pointStyle:n,color:a}}=e.legend.options;return t.labels.map(((t,i)=>{const r=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,fontColor:a,lineWidth:r.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}}))}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}}};constructor(e,t){super(e,t),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(e,t){const n=this.getDataset().data,a=this._cachedMeta;if(!1===this._parsing)a._parsed=n;else{let i,o,s=e=>+n[e];if(r(n[e])){const{key:e="value"}=this._parsing;s=t=>+k(n[t],e)}for(i=e,o=e+t;iZ(e,s,l,!0)?1:Math.max(t,t*n,a,a*n),f=(e,t,a)=>Z(e,s,l,!0)?-1:Math.min(t,t*n,a,a*n),m=p(0,u,d),g=p(N,c,h),v=f(A,u,d),b=f(A+N,c,h);a=(m-v)/2,i=(g-b)/2,r=-(m+v)/2,o=-(g+b)/2}return{ratioX:a,ratioY:i,offsetX:r,offsetY:o}}(h,d,s),v=(n.width-r)/p,b=(n.height-r)/f,_=Math.max(Math.min(v,b)/2,0),y=c(this.options.radius,_),w=(y-Math.max(y*s,0))/this._getVisibleDatasetWeightTotal();this.offsetX=m*y,this.offsetY=g*y,a.total=this.calculateTotal(),this.outerRadius=y-w*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-w*l,0),this.updateElements(i,0,i.length,e)}_circumference(e,t){const n=this.options,a=this._cachedMeta,i=this._getCircumference();return t&&n.animation.animateRotate||!this.chart.getDataVisibility(e)||null===a._parsed[e]||a.data[e].hidden?0:this.calculateCircumference(a._parsed[e]*i/M)}updateElements(e,t,n,a){const i="reset"===a,r=this.chart,o=r.chartArea,s=r.options.animation,l=(o.left+o.right)/2,u=(o.top+o.bottom)/2,c=i&&s.animateScale,d=c?0:this.innerRadius,h=c?0:this.outerRadius,{sharedOptions:p,includeOptions:f}=this._getSharedOptions(t,a);let m,g=this._getRotation();for(m=0;m0&&!isNaN(e)?M*(Math.abs(e)/t):0}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart,a=n.data.labels||[],i=et(t._parsed[e],n.options.locale);return{label:a[e]||"",value:i}}getMaxBorderWidth(e){let t=0;const n=this.chart;let a,i,r,o,s;if(!e)for(a=0,i=n.data.datasets.length;a{const r=e.getDatasetMeta(0).controller.getStyle(i);return{text:t,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,fontColor:a,lineWidth:r.borderWidth,pointStyle:n,hidden:!e.getDataVisibility(i),index:i}}))}return[]}},onClick(e,t,n){n.chart.toggleDataVisibility(t.index),n.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(e,t){super(e,t),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart,a=n.data.labels||[],i=et(t._parsed[e].r,n.options.locale);return{label:a[e]||"",value:i}}parseObjectData(e,t,n,a){return Zt.bind(this)(e,t,n,a)}update(e){const t=this._cachedMeta.data;this._updateRadius(),this.updateElements(t,0,t.length,e)}getMinMax(){const e=this._cachedMeta,t={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return e.data.forEach(((e,n)=>{const a=this.getParsed(n).r;!isNaN(a)&&this.chart.getDataVisibility(n)&&(at.max&&(t.max=a))})),t}_updateRadius(){const e=this.chart,t=e.chartArea,n=e.options,a=Math.min(t.right-t.left,t.bottom-t.top),i=Math.max(a/2,0),r=(i-Math.max(n.cutoutPercentage?i/100*n.cutoutPercentage:1,0))/e.getVisibleDatasetCount();this.outerRadius=i-r*this.index,this.innerRadius=this.outerRadius-r}updateElements(e,t,n,a){const i="reset"===a,r=this.chart,o=r.options.animation,s=this._cachedMeta.rScale,l=s.xCenter,u=s.yCenter,c=s.getIndexAngle(0)-.5*A;let d,h=c;const p=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&t++})),t}_computeAngle(e,t,n){return this.chart.getDataVisibility(e)?U(this.resolveDataElementOptions(e,t).angle||n):0}}var zi=Object.freeze({__proto__:null,BarController:class extends Ia{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(e,t,n,a){return Ai(e,t,n,a)}parseArrayData(e,t,n,a){return Ai(e,t,n,a)}parseObjectData(e,t,n,a){const{iScale:i,vScale:r}=e,{xAxisKey:o="x",yAxisKey:s="y"}=this._parsing,l="x"===i.axis?o:s,u="x"===r.axis?o:s,c=[];let d,h,p,f;for(d=n,h=n+a;de.controller.options.grouped)),r=n.options.stacked,o=[],s=this._cachedMeta.controller.getParsed(t),l=s&&s[n.axis],u=e=>{const t=e._parsed.find((e=>e[n.axis]===l)),i=t&&t[e.vScale.axis];if(a(i)||isNaN(i))return!0};for(const n of i)if((void 0===t||!u(n))&&((!1===r||-1===o.indexOf(n.stack)||void 0===r&&void 0===n.stack)&&o.push(n.stack),n.index===e))break;return o.length||o.push(void 0),o}_getStackCount(e){return this._getStacks(void 0,e).length}_getStackIndex(e,t,n){const a=this._getStacks(e,n),i=void 0!==t?a.indexOf(t):-1;return-1===i?a.length-1:i}_getRuler(){const e=this.options,t=this._cachedMeta,n=t.iScale,a=[];let i,r;for(i=0,r=t.data.length;i=n?1:-1)}(h,t,s)*o,p===s&&(v-=h/2);const e=t.getPixelForDecimal(0),a=t.getPixelForDecimal(1),r=Math.min(e,a),u=Math.max(e,a);v=Math.max(Math.min(v,u),r),d=v+h,n&&!c&&(l._stacks[t.axis]._visualValues[i]=t.getValueForPixel(d)-t.getValueForPixel(v))}if(v===t.getPixelForValue(s)){const e=q(h)*t.getLineWidthForValue(s)/2;v+=e,h-=e}return{size:h,base:v,head:d,center:d+h/2}}_calculateBarIndexPixels(e,t){const n=t.scale,i=this.options,r=i.skipNull,o=l(i.maxBarThickness,1/0);let s,u;if(t.grouped){const n=r?this._getStackCount(e):t.stackCount,l="flex"===i.barThickness?function(e,t,n,a){const i=t.pixels,r=i[e];let o=e>0?i[e-1]:null,s=e=0;--n)t=Math.max(t,e[n].size(this.resolveDataElementOptions(n))/2);return t>0&&t}getLabelAndValue(e){const t=this._cachedMeta,n=this.chart.data.labels||[],{xScale:a,yScale:i}=t,r=this.getParsed(e),o=a.getLabelForValue(r.x),s=i.getLabelForValue(r.y),l=r._custom;return{label:n[e]||"",value:"("+o+", "+s+(l?", "+l:"")+")"}}update(e){const t=this._cachedMeta.data;this.updateElements(t,0,t.length,e)}updateElements(e,t,n,a){const i="reset"===a,{iScale:r,vScale:o}=this._cachedMeta,{sharedOptions:s,includeOptions:l}=this._getSharedOptions(t,a),u=r.axis,c=o.axis;for(let d=t;d0&&this.getParsed(t-1);for(let n=0;n<_;++n){const f=e[n],_=v?f:{};if(n=b){_.skip=!0;continue}const w=this.getParsed(n),k=a(w[p]),x=_[h]=o.getPixelForValue(w[h],n),S=_[p]=r||k?s.getBasePixel():s.getPixelForValue(l?this.applyStack(s,w,l):w[p],n);_.skip=isNaN(x)||isNaN(S)||k,_.stop=n>0&&Math.abs(w[h]-y[h])>g,m&&(_.parsed=w,_.raw=u.data[n]),d&&(_.options=c||this.resolveDataElementOptions(n,f.active?"active":i)),v||this.updateElement(f,n,_,i),y=w}}getMaxOverflow(){const e=this._cachedMeta,t=e.dataset,n=t.options&&t.options.borderWidth||0,a=e.data||[];if(!a.length)return n;const i=a[0].size(this.resolveDataElementOptions(0)),r=a[a.length-1].size(this.resolveDataElementOptions(a.length-1));return Math.max(n,i,r)/2}draw(){const e=this._cachedMeta;e.dataset.updateControlPoints(this.chart.chartArea,e.iScale.axis),super.draw()}},PieController:class extends Ri{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},PolarAreaController:Ii,RadarController:class extends Ia{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(e){const t=this._cachedMeta.vScale,n=this.getParsed(e);return{label:t.getLabels()[e],value:""+t.getLabelForValue(n[t.axis])}}parseObjectData(e,t,n,a){return Zt.bind(this)(e,t,n,a)}update(e){const t=this._cachedMeta,n=t.dataset,a=t.data||[],i=t.iScale.getLabels();if(n.points=a,"resize"!==e){const t=this.resolveDatasetElementOptions(e);this.options.showLine||(t.borderWidth=0);const r={_loop:!0,_fullLoop:i.length===a.length,options:t};this.updateElement(n,void 0,r,e)}this.updateElements(a,0,a.length,e)}updateElements(e,t,n,a){const i=this._cachedMeta.rScale,r="reset"===a;for(let o=t;o0&&this.getParsed(t-1);for(let c=t;c0&&Math.abs(n[p]-_[p])>v,g&&(m.parsed=n,m.raw=u.data[c]),h&&(m.options=d||this.resolveDataElementOptions(c,t.active?"active":i)),b||this.updateElement(t,c,m,i),_=n}this.updateSharedOptions(d,i,c)}getMaxOverflow(){const e=this._cachedMeta,t=e.data||[];if(!this.options.showLine){let e=0;for(let n=t.length-1;n>=0;--n)e=Math.max(e,t[n].size(this.resolveDataElementOptions(n))/2);return e>0&&e}const n=e.dataset,a=n.options&&n.options.borderWidth||0;if(!t.length)return a;const i=t[0].size(this.resolveDataElementOptions(0)),r=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(a,i,r)/2}}});function qi(e,t,n,a){return{x:n+e*Math.cos(t),y:a+e*Math.sin(t)}}function Di(e,t,n,a,i,r){const{x:o,y:s,startAngle:l,pixelMargin:u,innerRadius:c}=t,d=Math.max(t.outerRadius+a+n-u,0),h=c>0?c+a+n+u:0;let p=0;const f=i-l;if(a){const e=((c>0?c-a:0)+(d>0?d-a:0))/2;p=(f-(0!==e?f*e/(e+a):f))/2}const m=(f-Math.max(.001,f*d-n/A)/d)/2,g=l+m+p,v=i-m-p,{outerStart:b,outerEnd:_,innerStart:y,innerEnd:w}=function(e,t,n,a){const i=vn(e.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]),r=(n-t)/2,o=Math.min(r,a*t/2),s=e=>{const t=(n-Math.min(r,e))*a/2;return J(e,0,Math.min(r,t))};return{outerStart:s(i.outerStart),outerEnd:s(i.outerEnd),innerStart:J(i.innerStart,0,o),innerEnd:J(i.innerEnd,0,o)}}(t,h,d,v-g),k=d-b,x=d-_,S=g+b/k,C=v-_/x,E=h+y,T=h+w,M=g+y/E,P=v-w/T;if(e.beginPath(),r){const t=(S+C)/2;if(e.arc(o,s,d,S,t),e.arc(o,s,d,t,C),_>0){const t=qi(x,C,o,s);e.arc(t.x,t.y,_,C,v+N)}const n=qi(T,v,o,s);if(e.lineTo(n.x,n.y),w>0){const t=qi(T,P,o,s);e.arc(t.x,t.y,w,v+N,P+Math.PI)}const a=(v-w/h+(g+y/h))/2;if(e.arc(o,s,h,v-w/h,a,!0),e.arc(o,s,h,a,g+y/h,!0),y>0){const t=qi(E,M,o,s);e.arc(t.x,t.y,y,M+Math.PI,g-N)}const i=qi(k,g,o,s);if(e.lineTo(i.x,i.y),b>0){const t=qi(k,S,o,s);e.arc(t.x,t.y,b,g-N,S)}}else{e.moveTo(o,s);const t=Math.cos(S)*d+o,n=Math.sin(S)*d+s;e.lineTo(t,n);const a=Math.cos(C)*d+o,i=Math.sin(C)*d+s;e.lineTo(a,i)}e.closePath()}function ji(e,t,n=t){e.lineCap=l(n.borderCapStyle,t.borderCapStyle),e.setLineDash(l(n.borderDash,t.borderDash)),e.lineDashOffset=l(n.borderDashOffset,t.borderDashOffset),e.lineJoin=l(n.borderJoinStyle,t.borderJoinStyle),e.lineWidth=l(n.borderWidth,t.borderWidth),e.strokeStyle=l(n.borderColor,t.borderColor)}function $i(e,t,n){e.lineTo(n.x,n.y)}function Bi(e,t,n={}){const a=e.length,{start:i=0,end:r=a-1}=n,{start:o,end:s}=t,l=Math.max(i,o),u=Math.min(r,s),c=is&&r>s;return{count:a,start:l,loop:t.loop,ilen:u(o+(u?s-e:e))%r,_=()=>{p!==f&&(e.lineTo(g,f),e.lineTo(g,p),e.lineTo(g,m))};for(l&&(d=i[b(0)],e.moveTo(d.x,d.y)),c=0;c<=s;++c){if(d=i[b(c)],d.skip)continue;const t=d.x,n=d.y,a=0|t;a===h?(nf&&(f=n),g=(v*g+t)/++v):(_(),e.lineTo(t,n),h=a,v=0,p=f=n),m=n}_()}function Ui(e){const t=e.options,n=t.borderDash&&t.borderDash.length;return e._decimated||e._loop||t.tension||"monotone"===t.cubicInterpolationMode||t.stepped||n?Fi:Vi}const Hi="function"==typeof Path2D;class Wi extends za{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:e=>"borderDash"!==e&&"fill"!==e};constructor(e){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,e&&Object.assign(this,e)}updateControlPoints(e,t){const n=this.options;if((n.tension||"monotone"===n.cubicInterpolationMode)&&!n.stepped&&!this._pointsUpdated){const a=n.spanGaps?this._loop:this._fullLoop;rn(this._points,n,e,a,t),this._pointsUpdated=!0}}set points(e){this._points=e,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=On(this,this.options.segment))}first(){const e=this.segments,t=this.points;return e.length&&t[e[0].start]}last(){const e=this.segments,t=this.points,n=e.length;return n&&t[e[n-1].end]}interpolate(e,t){const n=this.options,a=e[t],i=this.points,r=Ln(this,{property:t,start:a,end:a});if(!r.length)return;const o=[],s=function(e){return e.stepped?dn:e.tension||"monotone"===e.cubicInterpolationMode?hn:cn}(n);let l,u;for(l=0,u=r.length;l"borderDash"!==e};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(e){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,t,n){const a=this.getProps(["x","y"],n),{angle:i,distance:r}=Y(a,{x:e,y:t}),{startAngle:o,endAngle:s,innerRadius:u,outerRadius:c,circumference:d}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),h=(this.options.spacing+this.options.borderWidth)/2,p=l(d,s-o),f=Z(i,o,s)&&o!==s,m=p>=M||f,g=ee(r,u+h,c+h);return m&&g}getCenterPoint(e){const{x:t,y:n,startAngle:a,endAngle:i,innerRadius:r,outerRadius:o}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:s,spacing:l}=this.options,u=(a+i)/2,c=(r+o+l+s)/2;return{x:t+Math.cos(u)*c,y:n+Math.sin(u)*c}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){const{options:t,circumference:n}=this,a=(t.offset||0)/4,i=(t.spacing||0)/2,r=t.circular;if(this.pixelMargin="inner"===t.borderAlign?.33:0,this.fullCircles=n>M?Math.floor(n/M):0,0===n||this.innerRadius<0||this.outerRadius<0)return;e.save();const o=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(o)*a,Math.sin(o)*a);const s=a*(1-Math.sin(Math.min(A,n||0)));e.fillStyle=t.backgroundColor,e.strokeStyle=t.borderColor,function(e,t,n,a,i){const{fullCircles:r,startAngle:o,circumference:s}=t;let l=t.endAngle;if(r){Di(e,t,n,a,l,i);for(let t=0;ti?(u=i/l,e.arc(r,o,l,n+u,a-u,!0)):e.arc(r,o,i,n+N,a-N),e.closePath(),e.clip()}(e,t,f),r||(Di(e,t,n,a,f,i),e.stroke())}(e,this,s,i,r),e.restore()}},BarElement:class extends za{static id="bar";static defaults={borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(e){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,e&&Object.assign(this,e)}draw(e){const{inflateAmount:t,options:{borderColor:n,backgroundColor:a}}=this,{inner:i,outer:r}=Gi(this),o=(s=r.radius).topLeft||s.topRight||s.bottomLeft||s.bottomRight?qt:Ji;var s;e.save(),r.w===i.w&&r.h===i.h||(e.beginPath(),o(e,Xi(r,t,i)),e.clip(),o(e,Xi(i,-t,r)),e.fillStyle=n,e.fill("evenodd")),e.beginPath(),o(e,Xi(i,t)),e.fillStyle=a,e.fill(),e.restore()}inRange(e,t,n){return Zi(this,e,t,n)}inXRange(e,t){return Zi(this,e,null,t)}inYRange(e,t){return Zi(this,null,e,t)}getCenterPoint(e){const{x:t,y:n,base:a,horizontal:i}=this.getProps(["x","y","base","horizontal"],e);return{x:i?(t+a)/2:t,y:i?n:(n+a)/2}}getRange(e){return"x"===e?this.width/2:this.height/2}},LineElement:Wi,PointElement:class extends za{static id="point";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};constructor(e){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,e&&Object.assign(this,e)}inRange(e,t,n){const a=this.options,{x:i,y:r}=this.getProps(["x","y"],n);return Math.pow(e-i,2)+Math.pow(t-r,2)=0&&ea=t?a:e,o=e=>i=n?i:e;if(e){const e=q(a),t=q(i);e<0&&t<0?o(0):e>0&&t>0&&r(0)}if(a===i){let t=0===i?1:Math.abs(.05*i);o(i+t),e||r(a-t)}this.min=a,this.max=i}getTickLimit(){const e=this.options.ticks;let t,{maxTicksLimit:n,stepSize:a}=e;return a?(t=Math.ceil(this.max/a)-Math.floor(this.min/a)+1,t>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${a} would result generating up to ${t} ticks. Limiting to 1000.`),t=1e3)):(t=this.computeTickLimit(),n=n||11),n&&(t=Math.min(n,t)),t}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const e=this.options,t=e.ticks;let n=this.getTickLimit();n=Math.max(2,n);const i=function(e,t){const n=[],{bounds:i,step:r,min:o,max:s,precision:l,count:u,maxTicks:c,maxDigits:d,includeBounds:h}=e,p=r||1,f=c-1,{min:m,max:g}=t,v=!a(o),b=!a(s),_=!a(u),y=(g-m)/(d+1);let w,k,x,S,C=j((g-m)/f/p)*p;if(C<1e-14&&!v&&!b)return[{value:m},{value:g}];S=Math.ceil(g/C)-Math.floor(m/C),S>f&&(C=j(S*C/f/p)*p),a(l)||(w=Math.pow(10,l),C=Math.ceil(C*w)/w),"ticks"===i?(k=Math.floor(m/C)*C,x=Math.ceil(g/C)*C):(k=m,x=g),v&&b&&r&&F((s-o)/r,C/1e3)?(S=Math.round(Math.min((s-o)/C,c)),C=(s-o)/S,k=o,x=s):_?(k=v?o:k,x=b?s:x,S=u-1,C=(x-k)/S):(S=(x-k)/C,S=D(S,Math.round(S),C/1e3)?Math.round(S):Math.ceil(S));const E=Math.max(W(C),W(k));w=Math.pow(10,a(l)?E:l),k=Math.round(k*w)/w,x=Math.round(x*w)/w;let T=0;for(v&&(h&&k!==o?(n.push({value:o}),ks)break;n.push({value:e})}return b&&h&&x!==s?n.length&&D(n[n.length-1].value,s,nr(s,y,e))?n[n.length-1].value=s:n.push({value:s}):b&&x!==s||n.push({value:x}),n}({maxTicks:n,bounds:e.bounds,min:e.min,max:e.max,precision:t.precision,step:t.stepSize,count:t.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:t.minRotation||0,includeBounds:!1!==t.includeBounds},this._range||this);return"ticks"===e.bounds&&V(i,this,"value"),e.reverse?(i.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),i}configure(){const e=this.ticks;let t=this.min,n=this.max;if(super.configure(),this.options.offset&&e.length){const a=(n-t)/Math.max(e.length-1,1)/2;t-=a,n+=a}this._startValue=t,this._endValue=n,this._valueRange=n-t}getLabelForValue(e){return et(e,this.chart.options.locale,this.options.ticks.format)}}class ir extends ar{static id="linear";static defaults={ticks:{callback:nt.formatters.numeric}};determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=o(e)?e:0,this.max=o(t)?t:1,this.handleTickRangeOptions()}computeTickLimit(){const e=this.isHorizontal(),t=e?this.width:this.height,n=U(this.options.ticks.minRotation),a=(e?Math.sin(n):Math.cos(n))||.001,i=this._resolveTickFontOptions(0);return Math.ceil(t/Math.min(40,i.lineHeight/a))}getPixelForValue(e){return null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getValueForPixel(e){return this._startValue+this.getDecimalForPixel(e)*this._valueRange}}const rr=e=>Math.floor(z(e)),or=(e,t)=>Math.pow(10,rr(e)+t);function sr(e){return 1==e/Math.pow(10,rr(e))}function lr(e,t,n){const a=Math.pow(10,n),i=Math.floor(e/a);return Math.ceil(t/a)-i}class ur extends Wa{static id="logarithmic";static defaults={ticks:{callback:nt.formatters.logarithmic,major:{enabled:!0}}};constructor(e){super(e),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(e,t){const n=ar.prototype.parse.apply(this,[e,t]);if(0!==n)return o(n)&&n>0?n:null;this._zero=!0}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!0);this.min=o(e)?Math.max(0,e):null,this.max=o(t)?Math.max(0,t):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!o(this._userMin)&&(this.min=e===or(this.min,0)?or(this.min,-1):or(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let n=this.min,a=this.max;const i=t=>n=e?n:t,r=e=>a=t?a:e;n===a&&(n<=0?(i(1),r(10)):(i(or(n,-1)),r(or(a,1)))),n<=0&&i(or(a,-1)),a<=0&&r(or(n,1)),this.min=n,this.max=a}buildTicks(){const e=this.options,t=function(e,{min:t,max:n}){t=s(e.min,t);const a=[],i=rr(t);let r=function(e,t){let n=rr(t-e);for(;lr(e,t,n)>10;)n++;for(;lr(e,t,n)<10;)n--;return Math.min(n,rr(e))}(t,n),o=r<0?Math.pow(10,Math.abs(r)):1;const l=Math.pow(10,r),u=i>r?Math.pow(10,i):0,c=Math.round((t-u)*o)/o,d=Math.floor((t-u)/l/10)*l*10;let h=Math.floor((c-d)/Math.pow(10,r)),p=s(e.min,Math.round((u+d+h*Math.pow(10,r))*o)/o);for(;p=10?h=h<15?15:20:h++,h>=20&&(r++,h=2,o=r>=0?1:o),p=Math.round((u+d+h*Math.pow(10,r))*o)/o;const f=s(e.max,p);return a.push({value:f,major:sr(f),significand:h}),a}({min:this._userMin,max:this._userMax},this);return"ticks"===e.bounds&&V(t,this,"value"),e.reverse?(t.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),t}getLabelForValue(e){return void 0===e?"0":et(e,this.chart.options.locale,this.options.ticks.format)}configure(){const e=this.min;super.configure(),this._startValue=z(e),this._valueRange=z(this.max)-z(e)}getPixelForValue(e){return void 0!==e&&0!==e||(e=this.min),null===e||isNaN(e)?NaN:this.getPixelForDecimal(e===this.min?0:(z(e)-this._startValue)/this._valueRange)}getValueForPixel(e){const t=this.getDecimalForPixel(e);return Math.pow(10,this._startValue+t*this._valueRange)}}function cr(e){const t=e.ticks;if(t.display&&e.display){const e=yn(t.backdropPadding);return l(t.font&&t.font.size,st.font.size)+e.height}return 0}function dr(e,t,n,a,i){return e===a||e===i?{start:t-n/2,end:t+n/2}:ei?{start:t-n,end:t}:{start:t,end:t+n}}function hr(e,t,n,a,i){const r=Math.abs(Math.sin(n)),o=Math.abs(Math.cos(n));let s=0,l=0;a.startt.r&&(s=(a.end-t.r)/r,e.r=Math.max(e.r,t.r+s)),i.startt.b&&(l=(i.end-t.b)/o,e.b=Math.max(e.b,t.b+l))}function pr(e,t,n){const a=e.drawingArea,{extra:i,additionalAngle:r,padding:o,size:s}=n,l=e.getPointPosition(t,a+i+o,r),u=Math.round(H(G(l.angle+N))),c=function(e,t,n){return 90===n||270===n?e-=t/2:(n>270||n<90)&&(e-=t),e}(l.y,s.h,u),d=function(e){return 0===e||180===e?"center":e<180?"left":"right"}(u),h=function(e,t,n){return"right"===n?e-=t:"center"===n&&(e-=t/2),e}(l.x,s.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:h,top:c,right:h+s.w,bottom:c+s.h}}function fr(e,t){if(!t)return!0;const{left:n,top:a,right:i,bottom:r}=e;return!(Mt({x:n,y:a},t)||Mt({x:n,y:r},t)||Mt({x:i,y:a},t)||Mt({x:i,y:r},t))}function mr(e,t,n){const{left:i,top:r,right:o,bottom:s}=n,{backdropColor:l}=t;if(!a(l)){const n=_n(t.borderRadius),a=yn(t.backdropPadding);e.fillStyle=l;const u=i-a.left,c=r-a.top,d=o-i+a.width,h=s-r+a.height;Object.values(n).some((e=>0!==e))?(e.beginPath(),qt(e,{x:u,y:c,w:d,h:h,radius:n}),e.fill()):e.fillRect(u,c,d,h)}}function gr(e,t,n,a){const{ctx:i}=e;if(n)i.arc(e.xCenter,e.yCenter,t,0,M);else{let n=e.getPointPosition(0,t);i.moveTo(n.x,n.y);for(let r=1;re,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(e){super(e),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const e=this._padding=yn(cr(this.options)/2),t=this.width=this.maxWidth-e.width,n=this.height=this.maxHeight-e.height;this.xCenter=Math.floor(this.left+t/2+e.left),this.yCenter=Math.floor(this.top+n/2+e.top),this.drawingArea=Math.floor(Math.min(t,n)/2)}determineDataLimits(){const{min:e,max:t}=this.getMinMax(!1);this.min=o(e)&&!isNaN(e)?e:0,this.max=o(t)&&!isNaN(t)?t:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/cr(this.options))}generateTickLabels(e){ar.prototype.generateTickLabels.call(this,e),this._pointLabels=this.getLabels().map(((e,t)=>{const n=d(this.options.pointLabels.callback,[e,t],this);return n||0===n?n:""})).filter(((e,t)=>this.chart.getDataVisibility(t)))}fit(){const e=this.options;e.display&&e.pointLabels.display?function(e){const t={l:e.left+e._padding.left,r:e.right-e._padding.right,t:e.top+e._padding.top,b:e.bottom-e._padding.bottom},n=Object.assign({},t),a=[],r=[],o=e._pointLabels.length,s=e.options.pointLabels,l=s.centerPointLabels?A/o:0;for(let h=0;h=0&&e=0;i--){const t=e._pointLabelItems[i];if(!t.visible)continue;const r=a.setContext(e.getPointLabelContext(i));mr(n,r,t);const o=wn(r.font),{x:s,y:l,textAlign:u}=t;zt(n,e._pointLabels[i],s,l+o.lineHeight/2,o,{color:r.color,textAlign:u,textBaseline:"middle"})}}(this,r),a.display&&this.ticks.forEach(((e,t)=>{if(0!==t||0===t&&this.min<0){s=this.getDistanceFromCenterForValue(e.value);const n=this.getContext(t),o=a.setContext(n),l=i.setContext(n);!function(e,t,n,a,i){const r=e.ctx,o=t.circular,{color:s,lineWidth:l}=t;!o&&!a||!s||!l||n<0||(r.save(),r.strokeStyle=s,r.lineWidth=l,r.setLineDash(i.dash),r.lineDashOffset=i.dashOffset,r.beginPath(),gr(e,n,o,a),r.closePath(),r.stroke(),r.restore())}(this,o,s,r,l)}})),n.display){for(e.save(),o=r-1;o>=0;o--){const a=n.setContext(this.getPointLabelContext(o)),{color:i,lineWidth:r}=a;r&&i&&(e.lineWidth=r,e.strokeStyle=i,e.setLineDash(a.borderDash),e.lineDashOffset=a.borderDashOffset,s=this.getDistanceFromCenterForValue(t.reverse?this.min:this.max),l=this.getPointPosition(o,s),e.beginPath(),e.moveTo(this.xCenter,this.yCenter),e.lineTo(l.x,l.y),e.stroke())}e.restore()}}drawBorder(){}drawLabels(){const e=this.ctx,t=this.options,n=t.ticks;if(!n.display)return;const a=this.getIndexAngle(0);let i,r;e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(a),e.textAlign="center",e.textBaseline="middle",this.ticks.forEach(((a,o)=>{if(0===o&&this.min>=0&&!t.reverse)return;const s=n.setContext(this.getContext(o)),l=wn(s.font);if(i=this.getDistanceFromCenterForValue(this.ticks[o].value),s.showLabelBackdrop){e.font=l.string,r=e.measureText(a.label).width,e.fillStyle=s.backdropColor;const t=yn(s.backdropPadding);e.fillRect(-r/2-t.left,-i-l.size/2-t.top,r+t.width,l.size+t.height)}zt(e,a.label,0,-i,l,{color:s.color,strokeColor:s.textStrokeColor,strokeWidth:s.textStrokeWidth})})),e.restore()}drawTitle(){}}const br={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},_r=Object.keys(br);function yr(e,t){return e-t}function wr(e,t){if(a(t))return null;const n=e._adapter,{parser:i,round:r,isoWeekday:s}=e._parseOpts;let l=t;return"function"==typeof i&&(l=i(l)),o(l)||(l="string"==typeof i?n.parse(l,i):n.parse(l)),null===l?null:(r&&(l="week"!==r||!B(s)&&!0!==s?n.startOf(l,r):n.startOf(l,"isoWeek",s)),+l)}function kr(e,t,n,a){const i=_r.length;for(let r=_r.indexOf(e);r=t?n[a]:n[i]]=!0}}else e[t]=!0}function Sr(e,t,n){const a=[],i={},r=t.length;let o,s;for(o=0;o=0&&(t[l].major=!0);return t}(e,a,i,n):a}class Cr extends Wa{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(e){super(e),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(e,t={}){const n=e.time||(e.time={}),a=this._adapter=new Ci._date(e.adapters.date);a.init(t),b(n.displayFormats,a.formats()),this._parseOpts={parser:n.parser,round:n.round,isoWeekday:n.isoWeekday},super.init(e),this._normalized=t.normalized}parse(e,t){return void 0===e?null:wr(this,e)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const e=this.options,t=this._adapter,n=e.time.unit||"day";let{min:a,max:i,minDefined:r,maxDefined:s}=this.getUserBounds();function l(e){r||isNaN(e.min)||(a=Math.min(a,e.min)),s||isNaN(e.max)||(i=Math.max(i,e.max))}r&&s||(l(this._getLabelBounds()),"ticks"===e.bounds&&"labels"===e.ticks.source||l(this.getMinMax(!1))),a=o(a)&&!isNaN(a)?a:+t.startOf(Date.now(),n),i=o(i)&&!isNaN(i)?i:+t.endOf(Date.now(),n)+1,this.min=Math.min(a,i-1),this.max=Math.max(a+1,i)}_getLabelBounds(){const e=this.getLabelTimestamps();let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;return e.length&&(t=e[0],n=e[e.length-1]),{min:t,max:n}}buildTicks(){const e=this.options,t=e.time,n=e.ticks,a="labels"===n.source?this.getLabelTimestamps():this._generate();"ticks"===e.bounds&&a.length&&(this.min=this._userMin||a[0],this.max=this._userMax||a[a.length-1]);const i=this.min,r=ie(a,i,this.max);return this._unit=t.unit||(n.autoSkip?kr(t.minUnit,this.min,this.max,this._getLabelCapacity(i)):function(e,t,n,a,i){for(let r=_r.length-1;r>=_r.indexOf(n);r--){const n=_r[r];if(br[n].common&&e._adapter.diff(i,a,n)>=t-1)return n}return _r[n?_r.indexOf(n):0]}(this,r.length,t.minUnit,this.min,this.max)),this._majorUnit=n.major.enabled&&"year"!==this._unit?function(e){for(let t=_r.indexOf(e)+1,n=_r.length;t+e.value)))}initOffsets(e=[]){let t,n,a=0,i=0;this.options.offset&&e.length&&(t=this.getDecimalForValue(e[0]),a=1===e.length?1-t:(this.getDecimalForValue(e[1])-t)/2,n=this.getDecimalForValue(e[e.length-1]),i=1===e.length?n:(n-this.getDecimalForValue(e[e.length-2]))/2);const r=e.length<3?.5:.25;a=J(a,0,r),i=J(i,0,r),this._offsets={start:a,end:i,factor:1/(a+1+i)}}_generate(){const e=this._adapter,t=this.min,n=this.max,a=this.options,i=a.time,r=i.unit||kr(i.minUnit,t,n,this._getLabelCapacity(t)),o=l(a.ticks.stepSize,1),s="week"===r&&i.isoWeekday,u=B(s)||!0===s,c={};let d,h,p=t;if(u&&(p=+e.startOf(p,"isoWeek",s)),p=+e.startOf(p,u?"day":r),e.diff(n,t,r)>1e5*o)throw new Error(t+" and "+n+" are too far apart with stepSize of "+o+" "+r);const f="data"===a.ticks.source&&this.getDataTimestamps();for(d=p,h=0;d+e))}getLabelForValue(e){const t=this._adapter,n=this.options.time;return n.tooltipFormat?t.format(e,n.tooltipFormat):t.format(e,n.displayFormats.datetime)}format(e,t){const n=this.options.time.displayFormats,a=this._unit,i=t||n[a];return this._adapter.format(e,i)}_tickFormatFunction(e,t,n,a){const i=this.options,r=i.ticks.callback;if(r)return d(r,[e,t,n],this);const o=i.time.displayFormats,s=this._unit,l=this._majorUnit,u=s&&o[s],c=l&&o[l],h=n[t],p=l&&c&&h&&h.major;return this._adapter.format(e,a||(p?c:u))}generateTickLabels(e){let t,n,a;for(t=0,n=e.length;t0?o:1}getDataTimestamps(){let e,t,n=this._cache.data||[];if(n.length)return n;const a=this.getMatchingVisibleMetas();if(this._normalized&&a.length)return this._cache.data=a[0].controller.getAllParsedValues(this);for(e=0,t=a.length;e=e[s].pos&&t<=e[l].pos&&({lo:s,hi:l}=ne(e,"pos",t)),({pos:a,time:r}=e[s]),({pos:i,time:o}=e[l])):(t>=e[s].time&&t<=e[l].time&&({lo:s,hi:l}=ne(e,"time",t)),({time:a,pos:r}=e[s]),({time:i,pos:o}=e[l]));const u=i-a;return u?r+(o-r)*(t-a)/u:r}var Tr=Object.freeze({__proto__:null,CategoryScale:class extends Wa{static id="category";static defaults={ticks:{callback:tr}};constructor(e){super(e),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(e){const t=this._addedLabels;if(t.length){const e=this.getLabels();for(const{index:n,label:a}of t)e[n]===a&&e.splice(n,1);this._addedLabels=[]}super.init(e)}parse(e,t){if(a(e))return null;const n=this.getLabels();return((e,t)=>null===e?null:J(Math.round(e),0,t))(t=isFinite(t)&&n[t]===e?t:function(e,t,n,a){const i=e.indexOf(t);return-1===i?((e,t,n,a)=>("string"==typeof t?(n=e.push(t)-1,a.unshift({index:n,label:t})):isNaN(t)&&(n=null),n))(e,t,n,a):i!==e.lastIndexOf(t)?n:i}(n,e,l(t,e),this._addedLabels),n.length-1)}determineDataLimits(){const{minDefined:e,maxDefined:t}=this.getUserBounds();let{min:n,max:a}=this.getMinMax(!0);"ticks"===this.options.bounds&&(e||(n=0),t||(a=this.getLabels().length-1)),this.min=n,this.max=a}buildTicks(){const e=this.min,t=this.max,n=this.options.offset,a=[];let i=this.getLabels();i=0===e&&t===i.length-1?i:i.slice(e,t+1),this._valueRange=Math.max(i.length-(n?0:1),1),this._startValue=this.min-(n?.5:0);for(let n=e;n<=t;n++)a.push({value:n});return a}getLabelForValue(e){return tr.call(this,e)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(e){return"number"!=typeof e&&(e=this.parse(e)),null===e?NaN:this.getPixelForDecimal((e-this._startValue)/this._valueRange)}getPixelForTick(e){const t=this.ticks;return e<0||e>t.length-1?null:this.getPixelForValue(t[e].value)}getValueForPixel(e){return Math.round(this._startValue+this.getDecimalForPixel(e)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:ir,LogarithmicScale:ur,RadialLinearScale:vr,TimeScale:Cr,TimeSeriesScale:class extends Cr{static id="timeseries";static defaults=Cr.defaults;constructor(e){super(e),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const e=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(e);this._minPos=Er(t,this.min),this._tableRange=Er(t,this.max)-this._minPos,super.initOffsets(e)}buildLookupTable(e){const{min:t,max:n}=this,a=[],i=[];let r,o,s,l,u;for(r=0,o=e.length;r=t&&l<=n&&a.push(l);if(a.length<2)return[{time:t,pos:0},{time:n,pos:1}];for(r=0,o=a.length;re-t))}_getTimestampsForTable(){let e=this._cache.all||[];if(e.length)return e;const t=this.getDataTimestamps(),n=this.getLabelTimestamps();return e=t.length&&n.length?this.normalize(t.concat(n)):t.length?t:n,e=this._cache.all=e,e}getDecimalForValue(e){return(Er(this._table,e)-this._minPos)/this._tableRange}getValueForPixel(e){const t=this._offsets,n=this.getDecimalForPixel(e)/t.factor-t.end;return Er(this._table,n*this._tableRange+this._minPos,!0)}}});const Ar=["rgb(54, 162, 235)","rgb(255, 99, 132)","rgb(255, 159, 64)","rgb(255, 205, 86)","rgb(75, 192, 192)","rgb(153, 102, 255)","rgb(201, 203, 207)"],Mr=Ar.map((e=>e.replace("rgb(","rgba(").replace(")",", 0.5)")));function Pr(e){return Ar[e%Ar.length]}function Lr(e){return Mr[e%Mr.length]}function Or(e){let t;for(t in e)if(e[t].borderColor||e[t].backgroundColor)return!0;return!1}var Nr={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(e,t,n){if(!n.enabled)return;const{data:{datasets:a},options:i}=e.config,{elements:r}=i;if(!n.forceOverride&&(Or(a)||(o=i)&&(o.borderColor||o.backgroundColor)||r&&Or(r)))return;var o;const s=function(e){let t=0;return(n,a)=>{const i=e.getDatasetMeta(a).controller;i instanceof Ri?t=function(e,t){return e.backgroundColor=e.data.map((()=>Pr(t++))),t}(n,t):i instanceof Ii?t=function(e,t){return e.backgroundColor=e.data.map((()=>Lr(t++))),t}(n,t):i&&(t=function(e,t){return e.borderColor=Pr(t),e.backgroundColor=Lr(t),++t}(n,t))}}(e);a.forEach(s)}};function Rr(e){if(e._decimated){const t=e._data;delete e._decimated,delete e._data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function Ir(e){e.data.datasets.forEach((e=>{Rr(e)}))}var zr={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(e,t,n)=>{if(!n.enabled)return void Ir(e);const i=e.width;e.data.datasets.forEach(((t,r)=>{const{_data:o,indexAxis:s}=t,l=e.getDatasetMeta(r),u=o||t.data;if("y"===kn([s,e.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=e.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(e.options.parsing)return;let d,{start:h,count:p}=function(e,t){const n=t.length;let a,i=0;const{iScale:r}=e,{min:o,max:s,minDefined:l,maxDefined:u}=r.getUserBounds();return l&&(i=J(ne(t,r.axis,o).lo,0,n-1)),a=u?J(ne(t,r.axis,s).hi+1,i,n)-i:n-i,{start:i,count:a}}(l,u);if(p<=(n.threshold||4*i))Rr(t);else{switch(a(o)&&(t._data=u,delete t.data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(e){this._data=e}})),n.algorithm){case"lttb":d=function(e,t,n,a,i){const r=i.samples||a;if(r>=n)return e.slice(t,t+n);const o=[],s=(n-2)/(r-2);let l=0;const u=t+n-1;let c,d,h,p,f,m=t;for(o[l++]=e[m],c=0;ch&&(h=p,d=e[a],f=a);o[l++]=d,m=f}return o[l++]=e[u],o}(u,h,p,i,n);break;case"min-max":d=function(e,t,n,i){let r,o,s,l,u,c,d,h,p,f,m=0,g=0;const v=[],b=t+n-1,_=e[t].x,y=e[b].x-_;for(r=t;rf&&(f=l,d=r),m=(g*m+o.x)/++g;else{const n=r-1;if(!a(c)&&!a(d)){const t=Math.min(c,d),a=Math.max(c,d);t!==h&&t!==n&&v.push({...e[t],x:m}),a!==h&&a!==n&&v.push({...e[a],x:m})}r>0&&n!==h&&v.push(e[n]),v.push(o),u=t,g=0,p=f=l,c=d=h=r}}return v}(u,h,p,i);break;default:throw new Error(`Unsupported decimation algorithm '${n.algorithm}'`)}t._decimated=d}}))},destroy(e){Ir(e)}};function qr(e,t,n,a){if(a)return;let i=t[e],r=n[e];return"angle"===e&&(i=G(i),r=G(r)),{property:e,start:i,end:r}}function Dr(e,t,n){for(;t>e;t--){const e=n[t];if(!isNaN(e.x)&&!isNaN(e.y))break}return t}function jr(e,t,n,a){return e&&t?a(e[n],t[n]):e?e[n]:t?t[n]:0}function $r(e,t){let n=[],a=!1;return i(e)?(a=!0,n=e):n=function(e,t){const{x:n=null,y:a=null}=e||{},i=t.points,r=[];return t.segments.forEach((({start:e,end:t})=>{t=Dr(e,t,i);const o=i[e],s=i[t];null!==a?(r.push({x:o.x,y:a}),r.push({x:s.x,y:a})):null!==n&&(r.push({x:n,y:o.y}),r.push({x:n,y:s.y}))})),r}(e,t),n.length?new Wi({points:n,options:{tension:0},_loop:a,_fullLoop:a}):null}function Br(e){return e&&!1!==e.fill}function Fr(e,t,n){let a=e[t].fill;const i=[t];let r;if(!n)return a;for(;!1!==a&&-1===i.indexOf(a);){if(!o(a))return a;if(r=e[a],!r)return!1;if(r.visible)return a;i.push(a),a=r.fill}return!1}function Vr(e,t,n){const a=function(e){const t=e.options,n=t.fill;let a=l(n&&n.target,n);return void 0===a&&(a=!!t.backgroundColor),!1!==a&&null!==a&&(!0===a?"origin":a)}(e);if(r(a))return!isNaN(a.value)&&a;let i=parseFloat(a);return o(i)&&Math.floor(i)===i?function(e,t,n,a){return"-"!==e&&"+"!==e||(n=t+n),!(n===t||n<0||n>=a)&&n}(a[0],t,i,n):["origin","start","end","stack","shape"].indexOf(a)>=0&&a}function Ur(e,t,n){const a=[];for(let i=0;i=0;--t){const n=i[t].$filler;n&&(n.line.updateControlPoints(r,n.axis),a&&n.fill&&Qr(e.ctx,n,r))}},beforeDatasetsDraw(e,t,n){if("beforeDatasetsDraw"!==n.drawTime)return;const a=e.getSortedVisibleDatasetMetas();for(let t=a.length-1;t>=0;--t){const n=a[t].$filler;Br(n)&&Qr(e.ctx,n,e.chartArea)}},beforeDatasetDraw(e,t,n){const a=t.meta.$filler;Br(a)&&"beforeDatasetDraw"===n.drawTime&&Qr(e.ctx,a,e.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const eo=(e,t)=>{let{boxHeight:n=t,boxWidth:a=t}=e;return e.usePointStyle&&(n=Math.min(n,t),a=e.pointStyleWidth||Math.min(a,t)),{boxWidth:a,boxHeight:n,itemHeight:Math.max(t,n)}};class to extends za{constructor(e){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t,n){this.maxWidth=e,this.maxHeight=t,this._margins=n,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const e=this.options.labels||{};let t=d(e.generateLabels,[this.chart],this)||[];e.filter&&(t=t.filter((t=>e.filter(t,this.chart.data)))),e.sort&&(t=t.sort(((t,n)=>e.sort(t,n,this.chart.data)))),this.options.reverse&&t.reverse(),this.legendItems=t}fit(){const{options:e,ctx:t}=this;if(!e.display)return void(this.width=this.height=0);const n=e.labels,a=wn(n.font),i=a.size,r=this._computeTitleHeight(),{boxWidth:o,itemHeight:s}=eo(n,i);let l,u;t.font=a.string,this.isHorizontal()?(l=this.maxWidth,u=this._fitRows(r,i,o,s)+10):(u=this.maxHeight,l=this._fitCols(r,a,o,s)+10),this.width=Math.min(l,e.maxWidth||this.maxWidth),this.height=Math.min(u,e.maxHeight||this.maxHeight)}_fitRows(e,t,n,a){const{ctx:i,maxWidth:r,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],l=this.lineWidths=[0],u=a+o;let c=e;i.textAlign="left",i.textBaseline="middle";let d=-1,h=-u;return this.legendItems.forEach(((e,p)=>{const f=n+t/2+i.measureText(e.text).width;(0===p||l[l.length-1]+f+2*o>r)&&(c+=u,l[l.length-(p>0?0:1)]=0,h+=u,d++),s[p]={left:0,top:h,row:d,width:f,height:a},l[l.length-1]+=f+o})),c}_fitCols(e,t,n,a){const{ctx:i,maxHeight:r,options:{labels:{padding:o}}}=this,s=this.legendHitBoxes=[],l=this.columnSizes=[],u=r-e;let c=o,d=0,h=0,p=0,f=0;return this.legendItems.forEach(((e,r)=>{const{itemWidth:m,itemHeight:g}=function(e,t,n,a,i){const r=function(e,t,n,a){let i=e.text;return i&&"string"!=typeof i&&(i=i.reduce(((e,t)=>e.length>t.length?e:t))),t+n.size/2+a.measureText(i).width}(a,e,t,n),o=function(e,t,n){let a=e;return"string"!=typeof t.text&&(a=no(t,n)),a}(i,a,t.lineHeight);return{itemWidth:r,itemHeight:o}}(n,t,i,e,a);r>0&&h+g+2*o>u&&(c+=d+o,l.push({width:d,height:h}),p+=d+o,f++,d=h=0),s[r]={left:p,top:h,col:f,width:m,height:g},d=Math.max(d,m),h+=g+o})),c+=d,l.push({width:d,height:h}),c}adjustHitBoxes(){if(!this.options.display)return;const e=this._computeTitleHeight(),{legendHitBoxes:t,options:{align:n,labels:{padding:a},rtl:i}}=this,r=Cn(i,this.left,this.width);if(this.isHorizontal()){let i=0,o=pe(n,this.left+a,this.right-this.lineWidths[i]);for(const s of t)i!==s.row&&(i=s.row,o=pe(n,this.left+a,this.right-this.lineWidths[i])),s.top+=this.top+e+a,s.left=r.leftForLtr(r.x(o),s.width),o+=s.width+a}else{let i=0,o=pe(n,this.top+e+a,this.bottom-this.columnSizes[i].height);for(const s of t)s.col!==i&&(i=s.col,o=pe(n,this.top+e+a,this.bottom-this.columnSizes[i].height)),s.top=o,s.left+=this.left+a,s.left=r.leftForLtr(r.x(s.left),s.width),o+=s.height+a}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const e=this.ctx;Pt(e,this),this._draw(),Lt(e)}}_draw(){const{options:e,columnSizes:t,lineWidths:n,ctx:a}=this,{align:i,labels:r}=e,o=st.color,s=Cn(e.rtl,this.left,this.width),u=wn(r.font),{padding:c}=r,d=u.size,h=d/2;let p;this.drawTitle(),a.textAlign=s.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=u.string;const{boxWidth:f,boxHeight:m,itemHeight:g}=eo(r,d),v=this.isHorizontal(),b=this._computeTitleHeight();p=v?{x:pe(i,this.left+c,this.right-n[0]),y:this.top+c+b,line:0}:{x:this.left+c,y:pe(i,this.top+b+c,this.bottom-t[0].height),line:0},En(this.ctx,e.textDirection);const _=g+c;this.legendItems.forEach(((y,w)=>{a.strokeStyle=y.fontColor,a.fillStyle=y.fontColor;const k=a.measureText(y.text).width,x=s.textAlign(y.textAlign||(y.textAlign=r.textAlign)),S=f+h+k;let C=p.x,E=p.y;if(s.setWidth(this.width),v?w>0&&C+S+c>this.right&&(E=p.y+=_,p.line++,C=p.x=pe(i,this.left+c,this.right-n[p.line])):w>0&&E+_>this.bottom&&(C=p.x=C+t[p.line].width+c,p.line++,E=p.y=pe(i,this.top+b+c,this.bottom-t[p.line].height)),function(e,t,n){if(isNaN(f)||f<=0||isNaN(m)||m<0)return;a.save();const i=l(n.lineWidth,1);if(a.fillStyle=l(n.fillStyle,o),a.lineCap=l(n.lineCap,"butt"),a.lineDashOffset=l(n.lineDashOffset,0),a.lineJoin=l(n.lineJoin,"miter"),a.lineWidth=i,a.strokeStyle=l(n.strokeStyle,o),a.setLineDash(l(n.lineDash,[])),r.usePointStyle){const o={radius:m*Math.SQRT2/2,pointStyle:n.pointStyle,rotation:n.rotation,borderWidth:i},l=s.xPlus(e,f/2);At(a,o,l,t+h,r.pointStyleWidth&&f)}else{const r=t+Math.max((d-m)/2,0),o=s.leftForLtr(e,f),l=_n(n.borderRadius);a.beginPath(),Object.values(l).some((e=>0!==e))?qt(a,{x:o,y:r,w:f,h:m,radius:l}):a.rect(o,r,f,m),a.fill(),0!==i&&a.stroke()}a.restore()}(s.x(C),E,y),C=fe(x,C+f+h,v?C+S:this.right,e.rtl),function(e,t,n){zt(a,n.text,e,t+g/2,u,{strikethrough:n.hidden,textAlign:s.textAlign(n.textAlign)})}(s.x(C),E,y),v)p.x+=S+c;else if("string"!=typeof y.text){const e=u.lineHeight;p.y+=no(y,e)+c}else p.y+=_})),Tn(this.ctx,e.textDirection)}drawTitle(){const e=this.options,t=e.title,n=wn(t.font),a=yn(t.padding);if(!t.display)return;const i=Cn(e.rtl,this.left,this.width),r=this.ctx,o=t.position,s=n.size/2,l=a.top+s;let u,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),u=this.top+l,c=pe(e.align,c,this.right-d);else{const t=this.columnSizes.reduce(((e,t)=>Math.max(e,t.height)),0);u=l+pe(e.align,this.top,this.bottom-t-e.labels.padding-this._computeTitleHeight())}const h=pe(o,c,c+d);r.textAlign=i.textAlign(he(o)),r.textBaseline="middle",r.strokeStyle=t.color,r.fillStyle=t.color,r.font=n.string,zt(r,t.text,h,u,n)}_computeTitleHeight(){const e=this.options.title,t=wn(e.font),n=yn(e.padding);return e.display?t.lineHeight+n.height:0}_getLegendItemAt(e,t){let n,a,i;if(ee(e,this.left,this.right)&&ee(t,this.top,this.bottom))for(i=this.legendHitBoxes,n=0;ne.chart.options.color,boxWidth:40,padding:10,generateLabels(e){const t=e.data.datasets,{labels:{usePointStyle:n,pointStyle:a,textAlign:i,color:r,useBorderRadius:o,borderRadius:s}}=e.legend.options;return e._getSortedDatasetMetas().map((e=>{const l=e.controller.getStyle(n?0:void 0),u=yn(l.borderWidth);return{text:t[e.index].label,fillStyle:l.backgroundColor,fontColor:r,hidden:!e.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(u.width+u.height)/4,strokeStyle:l.borderColor,pointStyle:a||l.pointStyle,rotation:l.rotation,textAlign:i||l.textAlign,borderRadius:o&&(s||l.borderRadius),datasetIndex:e.index}}),this)}},title:{color:e=>e.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:e=>!e.startsWith("on"),labels:{_scriptable:e=>!["generateLabels","filter","sort"].includes(e)}}};class io extends za{constructor(e){super(),this.chart=e.chart,this.options=e.options,this.ctx=e.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(e,t){const n=this.options;if(this.left=0,this.top=0,!n.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=e,this.height=this.bottom=t;const a=i(n.text)?n.text.length:1;this._padding=yn(n.padding);const r=a*wn(n.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=r:this.width=r}isHorizontal(){const e=this.options.position;return"top"===e||"bottom"===e}_drawArgs(e){const{top:t,left:n,bottom:a,right:i,options:r}=this,o=r.align;let s,l,u,c=0;return this.isHorizontal()?(l=pe(o,n,i),u=t+e,s=i-n):("left"===r.position?(l=n+e,u=pe(o,a,t),c=-.5*A):(l=i-e,u=pe(o,t,a),c=.5*A),s=a-t),{titleX:l,titleY:u,maxWidth:s,rotation:c}}draw(){const e=this.ctx,t=this.options;if(!t.display)return;const n=wn(t.font),a=n.lineHeight/2+this._padding.top,{titleX:i,titleY:r,maxWidth:o,rotation:s}=this._drawArgs(a);zt(e,t.text,0,0,n,{color:t.color,maxWidth:o,rotation:s,textAlign:he(t.align),textBaseline:"middle",translation:[i,r]})}}var ro={id:"title",_element:io,start(e,t,n){!function(e,t){const n=new io({ctx:e.ctx,options:t,chart:e});ea.configure(e,n,t),ea.addBox(e,n),e.titleBlock=n}(e,n)},stop(e){const t=e.titleBlock;ea.removeBox(e,t),delete e.titleBlock},beforeUpdate(e,t,n){const a=e.titleBlock;ea.configure(e,a,n),a.options=n},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const oo=new WeakMap;var so={id:"subtitle",start(e,t,n){const a=new io({ctx:e.ctx,options:n,chart:e});ea.configure(e,a,n),ea.addBox(e,a),oo.set(e,a)},stop(e){ea.removeBox(e,oo.get(e)),oo.delete(e)},beforeUpdate(e,t,n){const a=oo.get(e);ea.configure(e,a,n),a.options=n},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const lo={average(e){if(!e.length)return!1;let t,n,a=new Set,i=0,r=0;for(t=0,n=e.length;te+t))/a.size,y:i/r}},nearest(e,t){if(!e.length)return!1;let n,a,i,r=t.x,o=t.y,s=Number.POSITIVE_INFINITY;for(n=0,a=e.length;n-1?e.split("\n"):e}function ho(e,t){const{element:n,datasetIndex:a,index:i}=t,r=e.getDatasetMeta(a).controller,{label:o,value:s}=r.getLabelAndValue(i);return{chart:e,label:o,parsed:r.getParsed(i),raw:e.data.datasets[a].data[i],formattedValue:s,dataset:r.getDataset(),dataIndex:i,datasetIndex:a,element:n}}function po(e,t){const n=e.chart.ctx,{body:a,footer:i,title:r}=e,{boxWidth:o,boxHeight:s}=t,l=wn(t.bodyFont),u=wn(t.titleFont),c=wn(t.footerFont),d=r.length,p=i.length,f=a.length,m=yn(t.padding);let g=m.height,v=0,b=a.reduce(((e,t)=>e+t.before.length+t.lines.length+t.after.length),0);b+=e.beforeBody.length+e.afterBody.length,d&&(g+=d*u.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),b&&(g+=f*(t.displayColors?Math.max(s,l.lineHeight):l.lineHeight)+(b-f)*l.lineHeight+(b-1)*t.bodySpacing),p&&(g+=t.footerMarginTop+p*c.lineHeight+(p-1)*t.footerSpacing);let _=0;const y=function(e){v=Math.max(v,n.measureText(e).width+_)};return n.save(),n.font=u.string,h(e.title,y),n.font=l.string,h(e.beforeBody.concat(e.afterBody),y),_=t.displayColors?o+2+t.boxPadding:0,h(a,(e=>{h(e.before,y),h(e.lines,y),h(e.after,y)})),_=0,n.font=c.string,h(e.footer,y),n.restore(),v+=m.width,{width:v,height:g}}function fo(e,t,n,a){const{x:i,width:r}=n,{width:o,chartArea:{left:s,right:l}}=e;let u="center";return"center"===a?u=i<=(s+l)/2?"left":"right":i<=r/2?u="left":i>=o-r/2&&(u="right"),function(e,t,n,a){const{x:i,width:r}=a,o=n.caretSize+n.caretPadding;return"left"===e&&i+r+o>t.width||"right"===e&&i-r-o<0||void 0}(u,e,t,n)&&(u="center"),u}function mo(e,t,n){const a=n.yAlign||t.yAlign||function(e,t){const{y:n,height:a}=t;return ne.height-a/2?"bottom":"center"}(e,n);return{xAlign:n.xAlign||t.xAlign||fo(e,t,n,a),yAlign:a}}function go(e,t,n,a){const{caretSize:i,caretPadding:r,cornerRadius:o}=e,{xAlign:s,yAlign:l}=n,u=i+r,{topLeft:c,topRight:d,bottomLeft:h,bottomRight:p}=_n(o);let f=function(e,t){let{x:n,width:a}=e;return"right"===t?n-=a:"center"===t&&(n-=a/2),n}(t,s);const m=function(e,t,n){let{y:a,height:i}=e;return"top"===t?a+=n:a-="bottom"===t?i+n:i/2,a}(t,l,u);return"center"===l?"left"===s?f+=u:"right"===s&&(f-=u):"left"===s?f-=Math.max(c,h)+i:"right"===s&&(f+=Math.max(d,p)+i),{x:J(f,0,a.width-t.width),y:J(m,0,a.height-t.height)}}function vo(e,t,n){const a=yn(n.padding);return"center"===t?e.x+e.width/2:"right"===t?e.x+e.width-a.right:e.x+a.left}function bo(e){return uo([],co(e))}function _o(e,t){const n=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return n?e.override(n):e}const yo={beforeTitle:t,title(e){if(e.length>0){const t=e[0],n=t.chart.data.labels,a=n?n.length:0;if(this&&this.options&&"dataset"===this.options.mode)return t.dataset.label||"";if(t.label)return t.label;if(a>0&&t.dataIndex{const t={before:[],lines:[],after:[]},i=_o(n,e);uo(t.before,co(wo(i,"beforeLabel",this,e))),uo(t.lines,wo(i,"label",this,e)),uo(t.after,co(wo(i,"afterLabel",this,e))),a.push(t)})),a}getAfterBody(e,t){return bo(wo(t.callbacks,"afterBody",this,e))}getFooter(e,t){const{callbacks:n}=t,a=wo(n,"beforeFooter",this,e),i=wo(n,"footer",this,e),r=wo(n,"afterFooter",this,e);let o=[];return o=uo(o,co(a)),o=uo(o,co(i)),o=uo(o,co(r)),o}_createItems(e){const t=this._active,n=this.chart.data,a=[],i=[],r=[];let o,s,l=[];for(o=0,s=t.length;oe.filter(t,a,i,n)))),e.itemSort&&(l=l.sort(((t,a)=>e.itemSort(t,a,n)))),h(l,(t=>{const n=_o(e.callbacks,t);a.push(wo(n,"labelColor",this,t)),i.push(wo(n,"labelPointStyle",this,t)),r.push(wo(n,"labelTextColor",this,t))})),this.labelColors=a,this.labelPointStyles=i,this.labelTextColors=r,this.dataPoints=l,l}update(e,t){const n=this.options.setContext(this.getContext()),a=this._active;let i,r=[];if(a.length){const e=lo[n.position].call(this,a,this._eventPosition);r=this._createItems(n),this.title=this.getTitle(r,n),this.beforeBody=this.getBeforeBody(r,n),this.body=this.getBody(r,n),this.afterBody=this.getAfterBody(r,n),this.footer=this.getFooter(r,n);const t=this._size=po(this,n),o=Object.assign({},e,t),s=mo(this.chart,n,o),l=go(n,o,s,this.chart);this.xAlign=s.xAlign,this.yAlign=s.yAlign,i={opacity:1,x:l.x,y:l.y,width:t.width,height:t.height,caretX:e.x,caretY:e.y}}else 0!==this.opacity&&(i={opacity:0});this._tooltipItems=r,this.$context=void 0,i&&this._resolveAnimations().update(this,i),e&&n.external&&n.external.call(this,{chart:this.chart,tooltip:this,replay:t})}drawCaret(e,t,n,a){const i=this.getCaretPosition(e,n,a);t.lineTo(i.x1,i.y1),t.lineTo(i.x2,i.y2),t.lineTo(i.x3,i.y3)}getCaretPosition(e,t,n){const{xAlign:a,yAlign:i}=this,{caretSize:r,cornerRadius:o}=n,{topLeft:s,topRight:l,bottomLeft:u,bottomRight:c}=_n(o),{x:d,y:h}=e,{width:p,height:f}=t;let m,g,v,b,_,y;return"center"===i?(_=h+f/2,"left"===a?(m=d,g=m-r,b=_+r,y=_-r):(m=d+p,g=m+r,b=_-r,y=_+r),v=m):(g="left"===a?d+Math.max(s,u)+r:"right"===a?d+p-Math.max(l,c)-r:this.caretX,"top"===i?(b=h,_=b-r,m=g-r,v=g+r):(b=h+f,_=b+r,m=g+r,v=g-r),y=b),{x1:m,x2:g,x3:v,y1:b,y2:_,y3:y}}drawTitle(e,t,n){const a=this.title,i=a.length;let r,o,s;if(i){const l=Cn(n.rtl,this.x,this.width);for(e.x=vo(this,n.titleAlign,n),t.textAlign=l.textAlign(n.titleAlign),t.textBaseline="middle",r=wn(n.titleFont),o=n.titleSpacing,t.fillStyle=n.titleColor,t.font=r.string,s=0;s0!==e))?(e.beginPath(),e.fillStyle=i.multiKeyBackground,qt(e,{x:t,y:f,w:u,h:l,radius:s}),e.fill(),e.stroke(),e.fillStyle=o.backgroundColor,e.beginPath(),qt(e,{x:n,y:f+1,w:u-2,h:l-2,radius:s}),e.fill()):(e.fillStyle=i.multiKeyBackground,e.fillRect(t,f,u,l),e.strokeRect(t,f,u,l),e.fillStyle=o.backgroundColor,e.fillRect(n,f+1,u-2,l-2))}e.fillStyle=this.labelTextColors[n]}drawBody(e,t,n){const{body:a}=this,{bodySpacing:i,bodyAlign:r,displayColors:o,boxHeight:s,boxWidth:l,boxPadding:u}=n,c=wn(n.bodyFont);let d=c.lineHeight,p=0;const f=Cn(n.rtl,this.x,this.width),m=function(n){t.fillText(n,f.x(e.x+p),e.y+d/2),e.y+=d+i},g=f.textAlign(r);let v,b,_,y,w,k,x;for(t.textAlign=r,t.textBaseline="middle",t.font=c.string,e.x=vo(this,g,n),t.fillStyle=n.bodyColor,h(this.beforeBody,m),p=o&&"right"!==g?"center"===r?l/2+u:l+2+u:0,y=0,k=a.length;y0&&t.stroke()}_updateAnimationTarget(e){const t=this.chart,n=this.$animations,a=n&&n.x,i=n&&n.y;if(a||i){const n=lo[e.position].call(this,this._active,this._eventPosition);if(!n)return;const r=this._size=po(this,e),o=Object.assign({},n,this._size),s=mo(t,e,o),l=go(e,o,s,t);a._to===l.x&&i._to===l.y||(this.xAlign=s.xAlign,this.yAlign=s.yAlign,this.width=r.width,this.height=r.height,this.caretX=n.x,this.caretY=n.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(e){const t=this.options.setContext(this.getContext());let n=this.opacity;if(!n)return;this._updateAnimationTarget(t);const a={width:this.width,height:this.height},i={x:this.x,y:this.y};n=Math.abs(n)<.001?0:n;const r=yn(t.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;t.enabled&&o&&(e.save(),e.globalAlpha=n,this.drawBackground(i,e,a,t),En(e,t.textDirection),i.y+=r.top,this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),Tn(e,t.textDirection),e.restore())}getActiveElements(){return this._active||[]}setActiveElements(e,t){const n=this._active,a=e.map((({datasetIndex:e,index:t})=>{const n=this.chart.getDatasetMeta(e);if(!n)throw new Error("Cannot find a dataset at index "+e);return{datasetIndex:e,element:n.data[t],index:t}})),i=!p(n,a),r=this._positionChanged(a,t);(i||r)&&(this._active=a,this._eventPosition=t,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(e,t,n=!0){if(t&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const a=this.options,i=this._active||[],r=this._getActiveElements(e,i,t,n),o=this._positionChanged(r,e),s=t||!p(r,i)||o;return s&&(this._active=r,(a.enabled||a.external)&&(this._eventPosition={x:e.x,y:e.y},this.update(!0,t))),s}_getActiveElements(e,t,n,a){const i=this.options;if("mouseout"===e.type)return[];if(!a)return t.filter((e=>this.chart.data.datasets[e.datasetIndex]&&void 0!==this.chart.getDatasetMeta(e.datasetIndex).controller.getParsed(e.index)));const r=this.chart.getElementsAtEventForMode(e,i.mode,i,n);return i.reverse&&r.reverse(),r}_positionChanged(e,t){const{caretX:n,caretY:a,options:i}=this,r=lo[i.position].call(this,e,t);return!1!==r&&(n!==r.x||a!==r.y)}}var xo={id:"tooltip",_element:ko,positioners:lo,afterInit(e,t,n){n&&(e.tooltip=new ko({chart:e,options:n}))},beforeUpdate(e,t,n){e.tooltip&&e.tooltip.initialize(n)},reset(e,t,n){e.tooltip&&e.tooltip.initialize(n)},afterDraw(e){const t=e.tooltip;if(t&&t._willRender()){const n={tooltip:t};if(!1===e.notifyPlugins("beforeTooltipDraw",{...n,cancelable:!0}))return;t.draw(e.ctx),e.notifyPlugins("afterTooltipDraw",n)}},afterEvent(e,t){if(e.tooltip){const n=t.replay;e.tooltip.handleEvent(t.event,n,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(e,t)=>t.bodyFont.size,boxWidth:(e,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:yo},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:e=>"filter"!==e&&"itemSort"!==e&&"external"!==e,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return wi.register(zi,Tr,er,e),wi.helpers={...zn},wi._adapters=Ci,wi.Animation=ka,wi.Animations=xa,wi.animator=ve,wi.controllers=Qa.controllers.items,wi.DatasetController=Ia,wi.Element=za,wi.elements=er,wi.Interaction=Fn,wi.layouts=ea,wi.platforms=_a,wi.Scale=Wa,wi.Ticks=nt,Object.assign(wi,zi,Tr,er,e,_a),wi.Chart=wi,"undefined"!=typeof window&&(window.Chart=wi),wi})),/*! showdown v 2.1.0 - 21-04-2022 */ -function(){function e(e){"use strict";var t={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,describe:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,describe:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,describe:"Parses simple line breaks as
(GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,describe:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,describe:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",describe:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,describe:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,describe:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,describe:"Support for HTML Tag escaping. ex:
foo
",type:"boolean"},emoji:{defaultValue:!1,describe:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,describe:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``",type:"boolean"},ellipsis:{defaultValue:!0,describe:"Replaces three dots with the ellipsis unicode character",type:"boolean"},completeHTMLDocument:{defaultValue:!1,describe:"Outputs a complete html document, including ``, `` and `` tags",type:"boolean"},metadata:{defaultValue:!1,describe:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,describe:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(t));var n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=t[a].defaultValue);return n}var t={},n={},a={},i=e(!0),r="vanilla",o={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:e(!0),allOn:function(){"use strict";var t=e(!0),n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=!0);return n}()};function s(e,n){"use strict";var a=n?"Error in "+n+" extension->":"Error in unnamed extension",i={valid:!0,error:""};t.helper.isArray(e)||(e=[e]);for(var r=0;r").replace(/&/g,"&")};var u=function(e,t,n,a){"use strict";var i,r,o,s,l,u=a||"",c=u.indexOf("g")>-1,d=new RegExp(t+"|"+n,"g"+u.replace(/g/g,"")),h=new RegExp(t,u.replace(/g/g,"")),p=[];do{for(i=0;o=d.exec(e);)if(h.test(o[0]))i++||(s=(r=d.lastIndex)-o[0].length);else if(i&&! --i){l=o.index+o[0].length;var f={left:{start:s,end:r},match:{start:r,end:o.index},right:{start:o.index,end:l},wholeMatch:{start:s,end:l}};if(p.push(f),!c)return p}}while(i&&(d.lastIndex=r));return p};t.helper.matchRecursiveRegExp=function(e,t,n,a){"use strict";for(var i=u(e,t,n,a),r=[],o=0;o0){var d=[];0!==s[0].wholeMatch.start&&d.push(e.slice(0,s[0].wholeMatch.start));for(var h=0;h=0?i+(a||0):i},t.helper.splitAtIndex=function(e,n){"use strict";if(!t.helper.isString(e))throw"InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string";return[e.substring(0,n),e.substring(n)]},t.helper.encodeEmailAddress=function(e){"use strict";var t=[function(e){return"&#"+e.charCodeAt(0)+";"},function(e){return"&#x"+e.charCodeAt(0).toString(16)+";"},function(e){return e}];return e=e.replace(/./g,(function(e){if("@"===e)e=t[Math.floor(2*Math.random())](e);else{var n=Math.random();e=n>.9?t[2](e):n>.45?t[1](e):t[0](e)}return e}))},t.helper.padEnd=function(e,t,n){"use strict";return t|=0,n=String(n||" "),e.length>t?String(e):((t-=e.length)>n.length&&(n+=n.repeat(t/n.length)),String(e)+n.slice(0,t))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),t.helper.regexes={asteriskDashAndColon:/([*_:~])/g},t.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:':octocat:',showdown:"S"},t.Converter=function(e){"use strict";var n={},l=[],u=[],c={},d=r,h={parsed:{},raw:"",format:""};function p(e,n){if(n=n||null,t.helper.isString(e)){if(n=e=t.helper.stdExtName(e),t.extensions[e])return console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"),void function(e,n){"function"==typeof e&&(e=e(new t.Converter));t.helper.isArray(e)||(e=[e]);var a=s(e,n);if(!a.valid)throw Error(a.error);for(var i=0;i[ \t]+¨NBSP;<"),!n){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");n=window.document}var a=n.createElement("div");a.innerHTML=e;var i={preList:function(e){for(var n=e.querySelectorAll("pre"),a=[],i=0;i'}else a.push(n[i].innerHTML),n[i].innerHTML="",n[i].setAttribute("prenum",i.toString());return a}(a)};!function e(t){for(var n=0;n? ?(['"].*['"])?\)$/m)>-1)o="";else if(!o){if(r||(r=i.toLowerCase().replace(/ ?\n/g," ")),o="#"+r,t.helper.isUndefined(a.gUrls[r]))return e;o=a.gUrls[r],t.helper.isUndefined(a.gTitles[r])||(u=a.gTitles[r])}var c='
"};return e=(e=(e=(e=(e=a.converter._dispatch("anchors.before",e,n,a)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[([^\[\]]+)]()()()()()/g,i),n.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,(function(e,a,i,r,o){if("\\"===i)return a+r;if(!t.helper.isString(n.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");var s=n.ghMentionsLink.replace(/\{u}/g,o),l="";return n.openLinksInNewWindow&&(l=' rel="noopener noreferrer" target="¨E95Eblank"'),a+'"+r+""}))),e=a.converter._dispatch("anchors.after",e,n,a)}));var c=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,d=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,h=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,p=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,f=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,m=function(e){"use strict";return function(n,a,i,r,o,s,l){var u=i=i.replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback),c="",d="",h=a||"",p=l||"";return/^www\./i.test(i)&&(i=i.replace(/^www\./i,"http://www.")),e.excludeTrailingPunctuationFromURLs&&s&&(c=s),e.openLinksInNewWindow&&(d=' rel="noopener noreferrer" target="¨E95Eblank"'),h+'"+u+""+c+p}},g=function(e,n){"use strict";return function(a,i,r){var o="mailto:";return i=i||"",r=t.subParser("unescapeSpecialChars")(r,e,n),e.encodeEmails?(o=t.helper.encodeEmailAddress(o+r),r=t.helper.encodeEmailAddress(r)):o+=r,i+''+r+""}};t.subParser("autoLinks",(function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("autoLinks.before",e,t,n)).replace(h,m(t))).replace(f,g(t,n)),e=n.converter._dispatch("autoLinks.after",e,t,n)})),t.subParser("simplifiedAutoLinks",(function(e,t,n){"use strict";return t.simplifiedAutoLink?(e=n.converter._dispatch("simplifiedAutoLinks.before",e,t,n),e=(e=t.excludeTrailingPunctuationFromURLs?e.replace(d,m(t)):e.replace(c,m(t))).replace(p,g(t,n)),e=n.converter._dispatch("simplifiedAutoLinks.after",e,t,n)):e})),t.subParser("blockGamut",(function(e,n,a){"use strict";return e=a.converter._dispatch("blockGamut.before",e,n,a),e=t.subParser("blockQuotes")(e,n,a),e=t.subParser("headers")(e,n,a),e=t.subParser("horizontalRule")(e,n,a),e=t.subParser("lists")(e,n,a),e=t.subParser("codeBlocks")(e,n,a),e=t.subParser("tables")(e,n,a),e=t.subParser("hashHTMLBlocks")(e,n,a),e=t.subParser("paragraphs")(e,n,a),e=a.converter._dispatch("blockGamut.after",e,n,a)})),t.subParser("blockQuotes",(function(e,n,a){"use strict";e=a.converter._dispatch("blockQuotes.before",e,n,a),e+="\n\n";var i=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return n.splitAdjacentBlockquotes&&(i=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=e.replace(i,(function(e){return e=(e=(e=e.replace(/^[ \t]*>[ \t]?/gm,"")).replace(/¨0/g,"")).replace(/^[ \t]+$/gm,""),e=t.subParser("githubCodeBlocks")(e,n,a),e=(e=(e=t.subParser("blockGamut")(e,n,a)).replace(/(^|\n)/g,"$1 ")).replace(/(\s*
[^\r]+?<\/pre>)/gm,(function(e,t){var n=t;return n=(n=n.replace(/^  /gm,"¨0")).replace(/¨0/g,"")})),t.subParser("hashBlock")("
\n"+e+"\n
",n,a)})),e=a.converter._dispatch("blockQuotes.after",e,n,a)})),t.subParser("codeBlocks",(function(e,n,a){"use strict";e=a.converter._dispatch("codeBlocks.before",e,n,a);return e=(e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,(function(e,i,r){var o=i,s=r,l="\n";return o=t.subParser("outdent")(o,n,a),o=t.subParser("encodeCode")(o,n,a),o=(o=(o=t.subParser("detab")(o,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""),n.omitExtraWLInCodeBlocks&&(l=""),o="
"+o+l+"
",t.subParser("hashBlock")(o,n,a)+s}))).replace(/¨0/,""),e=a.converter._dispatch("codeBlocks.after",e,n,a)})),t.subParser("codeSpans",(function(e,n,a){"use strict";return void 0===(e=a.converter._dispatch("codeSpans.before",e,n,a))&&(e=""),e=e.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,(function(e,i,r,o){var s=o;return s=(s=s.replace(/^([ \t]*)/g,"")).replace(/[ \t]*$/g,""),s=i+""+(s=t.subParser("encodeCode")(s,n,a))+"",s=t.subParser("hashHTMLSpans")(s,n,a)})),e=a.converter._dispatch("codeSpans.after",e,n,a)})),t.subParser("completeHTMLDocument",(function(e,t,n){"use strict";if(!t.completeHTMLDocument)return e;e=n.converter._dispatch("completeHTMLDocument.before",e,t,n);var a="html",i="\n",r="",o='\n',s="",l="";for(var u in void 0!==n.metadata.parsed.doctype&&(i="\n","html"!==(a=n.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==a||(o='')),n.metadata.parsed)if(n.metadata.parsed.hasOwnProperty(u))switch(u.toLowerCase()){case"doctype":break;case"title":r=""+n.metadata.parsed.title+"\n";break;case"charset":o="html"===a||"html5"===a?'\n':'\n';break;case"language":case"lang":s=' lang="'+n.metadata.parsed[u]+'"',l+='\n';break;default:l+='\n'}return e=i+"\n\n"+r+o+l+"\n\n"+e.trim()+"\n\n",e=n.converter._dispatch("completeHTMLDocument.after",e,t,n)})),t.subParser("detab",(function(e,t,n){"use strict";return e=(e=(e=(e=(e=(e=n.converter._dispatch("detab.before",e,t,n)).replace(/\t(?=\t)/g," ")).replace(/\t/g,"¨A¨B")).replace(/¨B(.+?)¨A/g,(function(e,t){for(var n=t,a=4-n.length%4,i=0;i/g,">"),e=n.converter._dispatch("encodeAmpsAndAngles.after",e,t,n)})),t.subParser("encodeBackslashEscapes",(function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("encodeBackslashEscapes.before",e,n,a)).replace(/\\(\\)/g,t.helper.escapeCharactersCallback)).replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeBackslashEscapes.after",e,n,a)})),t.subParser("encodeCode",(function(e,n,a){"use strict";return e=(e=a.converter._dispatch("encodeCode.before",e,n,a)).replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeCode.after",e,n,a)})),t.subParser("escapeSpecialCharsWithinTagAttributes",(function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,n,a)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,(function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)}))).replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,(function(e){return e.replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)})),e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,n,a)})),t.subParser("githubCodeBlocks",(function(e,n,a){"use strict";return n.ghCodeBlocks?(e=a.converter._dispatch("githubCodeBlocks.before",e,n,a),e=(e=(e+="¨0").replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,(function(e,i,r,o){var s=n.omitExtraWLInCodeBlocks?"":"\n";return o=t.subParser("encodeCode")(o,n,a),o="
"+(o=(o=(o=t.subParser("detab")(o,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+s+"
",o=t.subParser("hashBlock")(o,n,a),"\n\n¨G"+(a.ghCodeBlocks.push({text:e,codeblock:o})-1)+"G\n\n"}))).replace(/¨0/,""),a.converter._dispatch("githubCodeBlocks.after",e,n,a)):e})),t.subParser("hashBlock",(function(e,t,n){"use strict";return e=(e=n.converter._dispatch("hashBlock.before",e,t,n)).replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n",e=n.converter._dispatch("hashBlock.after",e,t,n)})),t.subParser("hashCodeTags",(function(e,n,a){"use strict";e=a.converter._dispatch("hashCodeTags.before",e,n,a);return e=t.helper.replaceRecursiveRegExp(e,(function(e,i,r,o){var s=r+t.subParser("encodeCode")(i,n,a)+o;return"¨C"+(a.gHtmlSpans.push(s)-1)+"C"}),"]*>","","gim"),e=a.converter._dispatch("hashCodeTags.after",e,n,a)})),t.subParser("hashElement",(function(e,t,n){"use strict";return function(e,t){var a=t;return a=(a=(a=a.replace(/\n\n/g,"\n")).replace(/^\n/,"")).replace(/\n+$/g,""),a="\n\n¨K"+(n.gHtmlBlocks.push(a)-1)+"K\n\n"}})),t.subParser("hashHTMLBlocks",(function(e,n,a){"use strict";e=a.converter._dispatch("hashHTMLBlocks.before",e,n,a);var i=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],r=function(e,t,n,i){var r=e;return-1!==n.search(/\bmarkdown\b/)&&(r=n+a.converter.makeHtml(t)+i),"\n\n¨K"+(a.gHtmlBlocks.push(r)-1)+"K\n\n"};n.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,(function(e,t){return"<"+t+">"})));for(var o=0;o]*>)","im"),u="<"+i[o]+"\\b[^>]*>",c="";-1!==(s=t.helper.regexIndexOf(e,l));){var d=t.helper.splitAtIndex(e,s),h=t.helper.replaceRecursiveRegExp(d[1],r,u,c,"im");if(h===d[1])break;e=d[0].concat(h)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=(e=t.helper.replaceRecursiveRegExp(e,(function(e){return"\n\n¨K"+(a.gHtmlBlocks.push(e)-1)+"K\n\n"}),"^ {0,3}\x3c!--","--\x3e","gm")).replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=a.converter._dispatch("hashHTMLBlocks.after",e,n,a)})),t.subParser("hashHTMLSpans",(function(e,t,n){"use strict";function a(e){return"¨C"+(n.gHtmlSpans.push(e)-1)+"C"}return e=(e=(e=(e=(e=n.converter._dispatch("hashHTMLSpans.before",e,t,n)).replace(/<[^>]+?\/>/gi,(function(e){return a(e)}))).replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,(function(e){return a(e)}))).replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,(function(e){return a(e)}))).replace(/<[^>]+?>/gi,(function(e){return a(e)})),e=n.converter._dispatch("hashHTMLSpans.after",e,t,n)})),t.subParser("unhashHTMLSpans",(function(e,t,n){"use strict";e=n.converter._dispatch("unhashHTMLSpans.before",e,t,n);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*
","gim"),e=a.converter._dispatch("hashPreCodeTags.after",e,n,a)})),t.subParser("headers",(function(e,n,a){"use strict";e=a.converter._dispatch("headers.before",e,n,a);var i=isNaN(parseInt(n.headerLevelStart))?1:parseInt(n.headerLevelStart),r=n.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,o=n.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;e=(e=e.replace(r,(function(e,r){var o=t.subParser("spanGamut")(r,n,a),s=n.noHeaderId?"":' id="'+l(r)+'"',u=""+o+"";return t.subParser("hashBlock")(u,n,a)}))).replace(o,(function(e,r){var o=t.subParser("spanGamut")(r,n,a),s=n.noHeaderId?"":' id="'+l(r)+'"',u=i+1,c=""+o+"";return t.subParser("hashBlock")(c,n,a)}));var s=n.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;function l(e){var i,r;if(n.customizedHeaderId){var o=e.match(/\{([^{]+?)}\s*$/);o&&o[1]&&(e=o[1])}return i=e,r=t.helper.isString(n.prefixHeaderId)?n.prefixHeaderId:!0===n.prefixHeaderId?"section-":"",n.rawPrefixHeaderId||(i=r+i),i=n.ghCompatibleHeaderId?i.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,"").toLowerCase():n.rawHeaderId?i.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-").toLowerCase():i.replace(/[^\w]/g,"").toLowerCase(),n.rawPrefixHeaderId&&(i=r+i),a.hashLinkCounts[i]?i=i+"-"+a.hashLinkCounts[i]++:a.hashLinkCounts[i]=1,i}return e=e.replace(s,(function(e,r,o){var s=o;n.customizedHeaderId&&(s=o.replace(/\s?\{([^{]+?)}\s*$/,""));var u=t.subParser("spanGamut")(s,n,a),c=n.noHeaderId?"":' id="'+l(o)+'"',d=i-1+r.length,h=""+u+"";return t.subParser("hashBlock")(h,n,a)})),e=a.converter._dispatch("headers.after",e,n,a)})),t.subParser("horizontalRule",(function(e,n,a){"use strict";e=a.converter._dispatch("horizontalRule.before",e,n,a);var i=t.subParser("hashBlock")("
",n,a);return e=(e=(e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,i),e=a.converter._dispatch("horizontalRule.after",e,n,a)})),t.subParser("images",(function(e,n,a){"use strict";function i(e,n,i,r,o,s,l,u){var c=a.gUrls,d=a.gTitles,h=a.gDimensions;if(i=i.toLowerCase(),u||(u=""),e.search(/\(? ?(['"].*['"])?\)$/m)>-1)r="";else if(""===r||null===r){if(""!==i&&null!==i||(i=n.toLowerCase().replace(/ ?\n/g," ")),r="#"+i,t.helper.isUndefined(c[i]))return e;r=c[i],t.helper.isUndefined(d[i])||(u=d[i]),t.helper.isUndefined(h[i])||(o=h[i].width,s=h[i].height)}n=n.replace(/"/g,""").replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback);var p=''+n+'"}return e=(e=(e=(e=(e=(e=a.converter._dispatch("images.before",e,n,a)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,(function(e,t,n,a,r,o,s,l){return i(e,t,n,a=a.replace(/\s/g,""),r,o,s,l)}))).replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,i)).replace(/!\[([^\[\]]+)]()()()()()/g,i),e=a.converter._dispatch("images.after",e,n,a)})),t.subParser("italicsAndBold",(function(e,t,n){"use strict";function a(e,t,n){return t+e+n}return e=n.converter._dispatch("italicsAndBold.before",e,t,n),e=t.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,(function(e,t){return a(t,"","")}))).replace(/\b__(\S[\s\S]*?)__\b/g,(function(e,t){return a(t,"","")}))).replace(/\b_(\S[\s\S]*?)_\b/g,(function(e,t){return a(t,"","")})):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/__(\S[\s\S]*?)__/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/_([^\s_][\s\S]*?)_/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e})),e=t.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,(function(e,t,n){return a(n,t+"","")}))).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,(function(e,t,n){return a(n,t+"","")}))).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,(function(e,t,n){return a(n,t+"","")})):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/\*\*(\S[\s\S]*?)\*\*/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/\*([^\s*][\s\S]*?)\*/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e})),e=n.converter._dispatch("italicsAndBold.after",e,t,n)})),t.subParser("lists",(function(e,n,a){"use strict";function i(e,i){a.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var r=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,o=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return n.disableForced4SpacesIndentedSublists&&(r=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=(e=e.replace(r,(function(e,i,r,s,l,u,c){c=c&&""!==c.trim();var d=t.subParser("outdent")(l,n,a),h="";return u&&n.tasklists&&(h=' class="task-list-item" style="list-style-type: none;"',d=d.replace(/^[ \t]*\[(x|X| )?]/m,(function(){var e='-1?(d=t.subParser("githubCodeBlocks")(d,n,a),d=t.subParser("blockGamut")(d,n,a)):(d=(d=t.subParser("lists")(d,n,a)).replace(/\n$/,""),d=(d=t.subParser("hashHTMLBlocks")(d,n,a)).replace(/\n\n+/g,"\n\n"),d=o?t.subParser("paragraphs")(d,n,a):t.subParser("spanGamut")(d,n,a)),d=""+(d=d.replace("¨A",""))+"\n"}))).replace(/¨0/g,""),a.gListLevel--,i&&(e=e.replace(/\s+$/,"")),e}function r(e,t){if("ol"===t){var n=e.match(/^ *(\d+)\./);if(n&&"1"!==n[1])return' start="'+n[1]+'"'}return""}function o(e,t,a){var o=n.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,s=n.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,l="ul"===t?o:s,u="";if(-1!==e.search(l))!function n(c){var d=c.search(l),h=r(e,t);-1!==d?(u+="\n\n<"+t+h+">\n"+i(c.slice(0,d),!!a)+"\n",l="ul"===(t="ul"===t?"ol":"ul")?o:s,n(c.slice(d))):u+="\n\n<"+t+h+">\n"+i(c,!!a)+"\n"}(e);else{var c=r(e,t);u="\n\n<"+t+c+">\n"+i(e,!!a)+"\n"}return u}return e=a.converter._dispatch("lists.before",e,n,a),e+="¨0",e=(e=a.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,(function(e,t,n){return o(t,n.search(/[*+-]/g)>-1?"ul":"ol",!0)})):e.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,(function(e,t,n,a){return o(n,a.search(/[*+-]/g)>-1?"ul":"ol",!1)}))).replace(/¨0/,""),e=a.converter._dispatch("lists.after",e,n,a)})),t.subParser("metadata",(function(e,t,n){"use strict";if(!t.metadata)return e;function a(e){n.metadata.raw=e,(e=(e=e.replace(/&/g,"&").replace(/"/g,""")).replace(/\n {4}/g," ")).replace(/^([\S ]+): +([\s\S]+?)$/gm,(function(e,t,a){return n.metadata.parsed[t]=a,""}))}return e=(e=(e=(e=n.converter._dispatch("metadata.before",e,t,n)).replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/,(function(e,t,n){return a(n),"¨M"}))).replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/,(function(e,t,i){return t&&(n.metadata.format=t),a(i),"¨M"}))).replace(/¨M/g,""),e=n.converter._dispatch("metadata.after",e,t,n)})),t.subParser("outdent",(function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("outdent.before",e,t,n)).replace(/^(\t|[ ]{1,4})/gm,"¨0")).replace(/¨0/g,""),e=n.converter._dispatch("outdent.after",e,t,n)})),t.subParser("paragraphs",(function(e,n,a){"use strict";for(var i=(e=(e=(e=a.converter._dispatch("paragraphs.before",e,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,"")).split(/\n{2,}/g),r=[],o=i.length,s=0;s=0?r.push(l):l.search(/\S/)>=0&&(l=(l=t.subParser("spanGamut")(l,n,a)).replace(/^([ \t]*)/g,"

"),l+="

",r.push(l))}for(o=r.length,s=0;s]*>\s*]*>/.test(c)&&(d=!0)}r[s]=c}return e=(e=(e=r.join("\n")).replace(/^\n+/g,"")).replace(/\n+$/g,""),a.converter._dispatch("paragraphs.after",e,n,a)})),t.subParser("runExtension",(function(e,t,n,a){"use strict";if(e.filter)t=e.filter(t,a.converter,n);else if(e.regex){var i=e.regex;i instanceof RegExp||(i=new RegExp(i,"g")),t=t.replace(i,e.replace)}return t})),t.subParser("spanGamut",(function(e,n,a){"use strict";return e=a.converter._dispatch("spanGamut.before",e,n,a),e=t.subParser("codeSpans")(e,n,a),e=t.subParser("escapeSpecialCharsWithinTagAttributes")(e,n,a),e=t.subParser("encodeBackslashEscapes")(e,n,a),e=t.subParser("images")(e,n,a),e=t.subParser("anchors")(e,n,a),e=t.subParser("autoLinks")(e,n,a),e=t.subParser("simplifiedAutoLinks")(e,n,a),e=t.subParser("emoji")(e,n,a),e=t.subParser("underline")(e,n,a),e=t.subParser("italicsAndBold")(e,n,a),e=t.subParser("strikethrough")(e,n,a),e=t.subParser("ellipsis")(e,n,a),e=t.subParser("hashHTMLSpans")(e,n,a),e=t.subParser("encodeAmpsAndAngles")(e,n,a),n.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
\n")):e=e.replace(/ +\n/g,"
\n"),e=a.converter._dispatch("spanGamut.after",e,n,a)})),t.subParser("strikethrough",(function(e,n,a){"use strict";return n.strikethrough&&(e=(e=a.converter._dispatch("strikethrough.before",e,n,a)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,(function(e,i){return function(e){return n.simplifiedAutoLink&&(e=t.subParser("simplifiedAutoLinks")(e,n,a)),""+e+""}(i)})),e=a.converter._dispatch("strikethrough.after",e,n,a)),e})),t.subParser("stripLinkDefinitions",(function(e,n,a){"use strict";var i=function(i,r,o,s,l,u,c){return r=r.toLowerCase(),e.toLowerCase().split(r).length-1<2?i:(o.match(/^data:.+?\/.+?;base64,/)?a.gUrls[r]=o.replace(/\s/g,""):a.gUrls[r]=t.subParser("encodeAmpsAndAngles")(o,n,a),u?u+c:(c&&(a.gTitles[r]=c.replace(/"|'/g,""")),n.parseImgDimensions&&s&&l&&(a.gDimensions[r]={width:s,height:l}),""))};return e=(e=(e=(e+="¨0").replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,i)).replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,i)).replace(/¨0/,"")})),t.subParser("tables",(function(e,n,a){"use strict";if(!n.tables)return e;function i(e,i){return""+t.subParser("spanGamut")(e,n,a)+"\n"}function r(e){var r,o=e.split("\n");for(r=0;r"+(l=t.subParser("spanGamut")(l,n,a))+"\n"));for(r=0;r\n\n\n",i=0;i\n";for(var r=0;r\n"}return n+"\n\n"}(f,g)}return e=(e=(e=(e=a.converter._dispatch("tables.before",e,n,a)).replace(/\\(\|)/g,t.helper.escapeCharactersCallback)).replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,r)).replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,r),e=a.converter._dispatch("tables.after",e,n,a)})),t.subParser("underline",(function(e,n,a){"use strict";return n.underline?(e=a.converter._dispatch("underline.before",e,n,a),e=(e=n.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,(function(e,t){return""+t+""}))).replace(/\b__(\S[\s\S]*?)__\b/g,(function(e,t){return""+t+""})):(e=e.replace(/___(\S[\s\S]*?)___/g,(function(e,t){return/\S$/.test(t)?""+t+"":e}))).replace(/__(\S[\s\S]*?)__/g,(function(e,t){return/\S$/.test(t)?""+t+"":e}))).replace(/(_)/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("underline.after",e,n,a)):e})),t.subParser("unescapeSpecialChars",(function(e,t,n){"use strict";return e=(e=n.converter._dispatch("unescapeSpecialChars.before",e,t,n)).replace(/¨E(\d+)E/g,(function(e,t){var n=parseInt(t);return String.fromCharCode(n)})),e=n.converter._dispatch("unescapeSpecialChars.after",e,t,n)})),t.subParser("makeMarkdown.blockquote",(function(e,n){"use strict";var a="";if(e.hasChildNodes())for(var i=e.childNodes,r=i.length,o=0;o ")})),t.subParser("makeMarkdown.codeBlock",(function(e,t){"use strict";var n=e.getAttribute("language"),a=e.getAttribute("precodenum");return"```"+n+"\n"+t.preList[a]+"\n```"})),t.subParser("makeMarkdown.codeSpan",(function(e){"use strict";return"`"+e.innerHTML+"`"})),t.subParser("makeMarkdown.emphasis",(function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="*";for(var i=e.childNodes,r=i.length,o=0;o",e.hasAttribute("width")&&e.hasAttribute("height")&&(t+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"),t})),t.subParser("makeMarkdown.links",(function(e,n){"use strict";var a="";if(e.hasChildNodes()&&e.hasAttribute("href")){var i=e.childNodes,r=i.length;a="[";for(var o=0;o",e.hasAttribute("title")&&(a+=' "'+e.getAttribute("title")+'"'),a+=")"}return a})),t.subParser("makeMarkdown.list",(function(e,n,a){"use strict";var i="";if(!e.hasChildNodes())return"";for(var r=e.childNodes,o=r.length,s=e.getAttribute("start")||1,l=0;l"+t.preList[n]+""})),t.subParser("makeMarkdown.strikethrough",(function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="~~";for(var i=e.childNodes,r=i.length,o=0;otr>th"),l=e.querySelectorAll("tbody>tr");for(a=0;af&&(f=m)}for(a=0;a/g,"\\$1>")).replace(/^#/gm,"\\#")).replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3")).replace(/^( {0,3}\d+)\./gm,"$1\\.")).replace(/^( {0,3})([+-])/gm,"$1\\$2")).replace(/]([\s]*)\(/g,"\\]$1\\(")).replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")}));"function"==typeof define&&define.amd?define((function(){"use strict";return t})):"undefined"!=typeof module&&module.exports?module.exports=t:this.showdown=t}.call(this);var NostrTools=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i=(t,n)=>{for(var a in n)e(t,a,{get:n[a],enumerable:!0})},r={};function o(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function s(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function l(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}i(r,{Relay:()=>Ia,SimplePool:()=>qa,finalizeEvent:()=>Bt,fj:()=>ya,generateSecretKey:()=>jt,getEventHash:()=>qt,getFilterLimit:()=>_a,getPublicKey:()=>$t,kinds:()=>Vt,matchFilter:()=>ga,matchFilters:()=>va,mergeFilters:()=>ba,nip04:()=>Ai,nip05:()=>Mr,nip10:()=>zr,nip11:()=>Dr,nip13:()=>Br,nip18:()=>Ur,nip19:()=>Da,nip21:()=>Qr,nip25:()=>Jr,nip27:()=>to,nip28:()=>ro,nip30:()=>ho,nip39:()=>bo,nip42:()=>Ta,nip44:()=>wo,nip47:()=>is,nip57:()=>ls,nip98:()=>fs,parseReferences:()=>Ti,serializeEvent:()=>zt,sortEvents:()=>mt,utils:()=>Tt,validateEvent:()=>ft,verifiedSymbol:()=>ht,verifyEvent:()=>Ft});var u="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,c=e=>e instanceof Uint8Array,d=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),h=(e,t)=>e<<32-t|e>>>t;if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function p(e){if("string"==typeof e&&(e=function(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}(e)),!c(e))throw new Error("expected Uint8Array, got "+typeof e);return e}var f=class{clone(){return this._cloneInto()}};function m(e){const t=t=>e().update(p(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function g(e=32){if(u&&"function"==typeof u.getRandomValues)return u.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}var v=class extends f{constructor(e,t,n,a){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=a,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=d(this.buffer)}update(e){l(this);const{view:t,buffer:n,blockLen:a}=this,i=(e=p(e)).length;for(let r=0;ra-r&&(this.process(n,0),r=0);for(let e=r;e>i&r),s=Number(n&r),l=a?4:0,u=a?0:4;e.setUint32(t+l,o,a),e.setUint32(t+u,s,a)}(n,a-8,BigInt(8*this.length),i),this.process(n,0);const o=d(e),u=this.outputLen;if(u%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const c=u/4,h=this.get();if(c>h.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^e&n^t&n,_=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),y=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),w=new Uint32Array(64),k=class extends v{constructor(){super(64,32,8,!1),this.A=0|y[0],this.B=0|y[1],this.C=0|y[2],this.D=0|y[3],this.E=0|y[4],this.F=0|y[5],this.G=0|y[6],this.H=0|y[7]}get(){const{A:e,B:t,C:n,D:a,E:i,F:r,G:o,H:s}=this;return[e,t,n,a,i,r,o,s]}set(e,t,n,a,i,r,o,s){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|a,this.E=0|i,this.F=0|r,this.G=0|o,this.H=0|s}process(e,t){for(let n=0;n<16;n++,t+=4)w[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=w[e-15],n=w[e-2],a=h(t,7)^h(t,18)^t>>>3,i=h(n,17)^h(n,19)^n>>>10;w[e]=i+w[e-7]+a+w[e-16]|0}let{A:n,B:a,C:i,D:r,E:o,F:s,G:l,H:u}=this;for(let e=0;e<64;e++){const t=u+(h(o,6)^h(o,11)^h(o,25))+((c=o)&s^~c&l)+_[e]+w[e]|0,d=(h(n,2)^h(n,13)^h(n,22))+b(n,a,i)|0;u=l,l=s,s=o,o=r+t|0,r=i,i=a,a=n,n=t+d|0}var c;n=n+this.A|0,a=a+this.B|0,i=i+this.C|0,r=r+this.D|0,o=o+this.E|0,s=s+this.F|0,l=l+this.G|0,u=u+this.H|0,this.set(n,a,i,r,o,s,l,u)}roundClean(){w.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}},x=m((()=>new k)),S={};i(S,{bitGet:()=>U,bitLen:()=>V,bitMask:()=>W,bitSet:()=>H,bytesToHex:()=>P,bytesToNumberBE:()=>R,bytesToNumberLE:()=>I,concatBytes:()=>$,createHmacDrbg:()=>K,ensureBytes:()=>j,equalBytes:()=>B,hexToBytes:()=>N,hexToNumber:()=>O,numberToBytesBE:()=>z,numberToBytesLE:()=>q,numberToHexUnpadded:()=>L,numberToVarBytesBE:()=>D,utf8ToBytes:()=>F,validateObject:()=>Z});var C=BigInt(0),E=BigInt(1),T=BigInt(2),A=e=>e instanceof Uint8Array,M=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function P(e){if(!A(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length),0));let n=0;return e.forEach((e=>{if(!A(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}function B(e,t){if(e.length!==t.length)return!1;for(let n=0;nC;e>>=E,t+=1);return t}function U(e,t){return e>>BigInt(t)&E}var H=(e,t,n)=>e|(n?E:C)<(T<new Uint8Array(e),Q=e=>Uint8Array.from(e);function K(e,t,n){if("number"!=typeof e||e<2)throw new Error("hashLen must be a number");if("number"!=typeof t||t<2)throw new Error("qByteLen must be a number");if("function"!=typeof n)throw new Error("hmacFn must be a function");let a=Y(e),i=Y(e),r=0;const o=()=>{a.fill(1),i.fill(0),r=0},s=(...e)=>n(i,a,...e),l=(e=Y())=>{i=s(Q([0]),e),a=s(),0!==e.length&&(i=s(Q([1]),e),a=s())},u=()=>{if(r++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e{let n;for(o(),l(e);!(n=t(u()));)l();return o(),n}}var G={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||e instanceof Uint8Array,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function Z(e,t,n={}){const a=(t,n,a)=>{const i=G[n];if("function"!=typeof i)throw new Error(`Invalid validator "${n}", expected function`);const r=e[t];if(!(a&&void 0===r||i(r,e)))throw new Error(`Invalid param ${String(t)}=${r} (${typeof r}), expected ${n}`)};for(const[e,n]of Object.entries(t))a(e,n,!1);for(const[e,t]of Object.entries(n))a(e,t,!0);return e}var J=BigInt(0),X=BigInt(1),ee=BigInt(2),te=BigInt(3),ne=BigInt(4),ae=BigInt(5),ie=BigInt(8);BigInt(9),BigInt(16);function re(e,t){const n=e%t;return n>=J?n:t+n}function oe(e,t,n){if(n<=J||t 0");if(n===X)return J;let a=X;for(;t>J;)t&X&&(a=a*e%n),e=e*e%n,t>>=X;return a}function se(e,t,n){let a=e;for(;t-- >J;)a*=a,a%=n;return a}function le(e,t){if(e===J||t<=J)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=re(e,t),a=t,i=J,r=X,o=X,s=J;for(;n!==J;){const e=a/n,t=a%n,l=i-o*e,u=r-s*e;a=n,n=t,i=o,r=s,o=l,s=u}if(a!==X)throw new Error("invert: does not exist");return re(i,t)}function ue(e){if(e%ne===te){const t=(e+X)/ne;return function(e,n){const a=e.pow(n,t);if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}if(e%ie===ae){const t=(e-ae)/ie;return function(e,n){const a=e.mul(n,ee),i=e.pow(a,t),r=e.mul(n,i),o=e.mul(e.mul(r,ee),i),s=e.mul(r,e.sub(o,e.ONE));if(!e.eql(e.sqr(s),n))throw new Error("Cannot find square root");return s}}return function(e){const t=(e-X)/ee;let n,a,i;for(n=e-X,a=0;n%ee===J;n/=ee,a++);for(i=ee;i(e[t]="function",e)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"})),Z(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...de(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}var{bytesToNumberBE:ve,hexToBytes:be}=S,_e={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=_e;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],a=e.subarray(2,n+2);if(!n||a.length!==n)throw new t("Invalid signature integer: wrong length");if(128&a[0])throw new t("Invalid signature integer: negative");if(0===a[0]&&!(128&a[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:ve(a),l:e.subarray(n+2)}},toSig(e){const{Err:t}=_e,n="string"==typeof e?be(e):e;if(!(n instanceof Uint8Array))throw new Error("ui8a expected");let a=n.length;if(a<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==a-2)throw new t("Invalid signature: incorrect length");const{d:i,l:r}=_e._parseInt(n.subarray(2)),{d:o,l:s}=_e._parseInt(r);if(s.length)throw new t("Invalid signature: left bytes after parsing");return{r:i,s:o}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},a=t(n(e.s)),i=t(n(e.r)),r=a.length/2,o=i.length/2,s=n(r),l=n(o);return`30${n(o+r+4)}02${l}${i}02${s}${a}`}},ye=BigInt(0),we=BigInt(1),ke=(BigInt(2),BigInt(3));BigInt(4);function xe(e){const t=function(e){const t=ge(e);Z(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:a,a:i}=t;if(n){if(!a.eql(i,a.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,a=t.toBytes||((e,t,a)=>{const i=t.toAffine();return $(Uint8Array.from([4]),n.toBytes(i.x),n.toBytes(i.y))}),i=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function r(e){const{a:a,b:i}=t,r=n.sqr(e),o=n.mul(r,e);return n.add(n.add(o,n.mul(e,a)),i)}if(!n.eql(n.sqr(t.Gy),r(t.Gx)))throw new Error("bad generator point: equation left != right");function o(e){return"bigint"==typeof e&&yen.eql(e,n.ZERO);return i(t)&&i(a)?d.ZERO:new d(t,a,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(d.fromAffine)}static fromHex(e){const t=d.fromAffine(i(j("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return d.BASE.multiply(l(e))}_setWindowSize(e){this._WINDOW_SIZE=e,u.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:a}=this.toAffine();if(!n.isValid(e)||!n.isValid(a))throw new Error("bad point: x or y not FE");const i=n.sqr(a),o=r(e);if(!n.eql(i,o))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){c(e);const{px:t,py:a,pz:i}=this,{px:r,py:o,pz:s}=e,l=n.eql(n.mul(t,s),n.mul(r,i)),u=n.eql(n.mul(a,s),n.mul(o,i));return l&&u}negate(){return new d(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:a}=t,i=n.mul(a,ke),{px:r,py:o,pz:s}=this;let l=n.ZERO,u=n.ZERO,c=n.ZERO,h=n.mul(r,r),p=n.mul(o,o),f=n.mul(s,s),m=n.mul(r,o);return m=n.add(m,m),c=n.mul(r,s),c=n.add(c,c),l=n.mul(e,c),u=n.mul(i,f),u=n.add(l,u),l=n.sub(p,u),u=n.add(p,u),u=n.mul(l,u),l=n.mul(m,l),c=n.mul(i,c),f=n.mul(e,f),m=n.sub(h,f),m=n.mul(e,m),m=n.add(m,c),c=n.add(h,h),h=n.add(c,h),h=n.add(h,f),h=n.mul(h,m),u=n.add(u,h),f=n.mul(o,s),f=n.add(f,f),h=n.mul(f,m),l=n.sub(l,h),c=n.mul(f,p),c=n.add(c,c),c=n.add(c,c),new d(l,u,c)}add(e){c(e);const{px:a,py:i,pz:r}=this,{px:o,py:s,pz:l}=e;let u=n.ZERO,h=n.ZERO,p=n.ZERO;const f=t.a,m=n.mul(t.b,ke);let g=n.mul(a,o),v=n.mul(i,s),b=n.mul(r,l),_=n.add(a,i),y=n.add(o,s);_=n.mul(_,y),y=n.add(g,v),_=n.sub(_,y),y=n.add(a,r);let w=n.add(o,l);return y=n.mul(y,w),w=n.add(g,b),y=n.sub(y,w),w=n.add(i,r),u=n.add(s,l),w=n.mul(w,u),u=n.add(v,b),w=n.sub(w,u),p=n.mul(f,y),u=n.mul(m,b),p=n.add(u,p),u=n.sub(v,p),p=n.add(v,p),h=n.mul(u,p),v=n.add(g,g),v=n.add(v,g),b=n.mul(f,b),y=n.mul(m,y),v=n.add(v,b),b=n.sub(g,b),b=n.mul(f,b),y=n.add(y,b),g=n.mul(v,y),h=n.add(h,g),g=n.mul(w,y),u=n.mul(_,u),u=n.sub(u,g),g=n.mul(_,v),p=n.mul(w,p),p=n.add(p,g),new d(u,h,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(d.ZERO)}wNAF(e){return p.wNAFCached(this,u,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(d.fromAffine)}))}multiplyUnsafe(e){const a=d.ZERO;if(e===ye)return a;if(s(e),e===we)return this;const{endo:i}=t;if(!i)return p.unsafeLadder(this,e);let{k1neg:r,k1:o,k2neg:l,k2:u}=i.splitScalar(e),c=a,h=a,f=this;for(;o>ye||u>ye;)o&we&&(c=c.add(f)),u&we&&(h=h.add(f)),f=f.double(),o>>=we,u>>=we;return r&&(c=c.negate()),l&&(h=h.negate()),h=new d(n.mul(h.px,i.beta),h.py,h.pz),c.add(h)}multiply(e){s(e);let a,i,r=e;const{endo:o}=t;if(o){const{k1neg:e,k1:t,k2neg:s,k2:l}=o.splitScalar(r);let{p:u,f:c}=this.wNAF(t),{p:h,f:f}=this.wNAF(l);u=p.constTimeNegate(e,u),h=p.constTimeNegate(s,h),h=new d(n.mul(h.px,o.beta),h.py,h.pz),a=u.add(h),i=c.add(f)}else{const{p:e,f:t}=this.wNAF(r);a=e,i=t}return d.normalizeZ([a,i])[0]}multiplyAndAddUnsafe(e,t,n){const a=d.BASE,i=(e,t)=>t!==ye&&t!==we&&e.equals(a)?e.multiply(t):e.multiplyUnsafe(t),r=i(this,t).add(i(e,n));return r.is0()?void 0:r}toAffine(e){const{px:t,py:a,pz:i}=this,r=this.is0();null==e&&(e=r?n.ONE:n.inv(i));const o=n.mul(t,e),s=n.mul(a,e),l=n.mul(i,e);if(r)return{x:n.ZERO,y:n.ZERO};if(!n.eql(l,n.ONE))throw new Error("invZ was invalid");return{x:o,y:s}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===we)return!0;if(n)return n(d,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===we?this:n?n(d,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),a(d,this,e)}toHex(e=!0){return P(this.toRawBytes(e))}}d.BASE=new d(t.Gx,t.Gy,n.ONE),d.ZERO=new d(n.ZERO,n.ONE,n.ZERO);const h=t.nBitLength,p=function(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},a=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let a=e.ZERO,i=t;for(;n>fe;)n&me&&(a=a.add(i)),i=i.double(),n>>=me;return a},precomputeWindow(e,t){const{windows:n,windowSize:i}=a(t),r=[];let o=e,s=o;for(let e=0;e>=h,a>s&&(a-=d,r+=me);const o=t,p=t+Math.abs(a)-1,f=e%2!=0,m=a<0;0===a?u=u.add(n(f,i[o])):l=l.add(n(m,i[p]))}return{p:l,f:u}},wNAFCached(e,t,n,a){const i=e._WINDOW_SIZE||1;let r=t.get(e);return r||(r=this.precomputeWindow(e,i),1!==i&&t.set(e,a(r))),this.wNAF(i,r,n)}}}(d,t.endo?Math.ceil(h/2):h);return{CURVE:t,ProjectivePoint:d,normPrivateKeyToScalar:l,weierstrassEquation:r,isWithinCurveOrder:o}}function Se(e){const t=function(e){const t=ge(e);return Z(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:a}=t,i=n.BYTES+1,r=2*n.BYTES+1;function o(e){return re(e,a)}function s(e){return le(e,a)}const{ProjectivePoint:l,normPrivateKeyToScalar:u,weierstrassEquation:c,isWithinCurveOrder:d}=xe({...t,toBytes(e,t,a){const i=t.toAffine(),r=n.toBytes(i.x),o=$;return a?o(Uint8Array.from([t.hasEvenY()?2:3]),r):o(Uint8Array.from([4]),r,n.toBytes(i.y))},fromBytes(e){const t=e.length,a=e[0],o=e.subarray(1);if(t!==i||2!==a&&3!==a){if(t===r&&4===a){return{x:n.fromBytes(o.subarray(0,n.BYTES)),y:n.fromBytes(o.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${i} compressed bytes or ${r} uncompressed bytes`)}{const e=R(o);if(!(ye<(s=e)&&sP(z(e,t.nByteLength));function p(e){return e>a>>we}const f=(e,t,n)=>R(e.slice(t,n));class m{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=j("compactSignature",e,2*n),new m(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=_e.toSig(j("DER",e));return new m(t,n)}assertValidity(){if(!d(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!d(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new m(this.r,this.s,e)}recoverPublicKey(e){const{r:a,s:i,recovery:r}=this,u=_(j("msgHash",e));if(null==r||![0,1,2,3].includes(r))throw new Error("recovery id invalid");const c=2===r||3===r?a+t.n:a;if(c>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const d=1&r?"03":"02",p=l.fromHex(d+h(c)),f=s(c),m=o(-u*f),g=o(i*f),v=l.BASE.multiplyAndAddUnsafe(p,m,g);if(!v)throw new Error("point at infinify");return v.assertValidity(),v}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new m(this.r,o(-this.s),this.recovery):this}toDERRawBytes(){return N(this.toDERHex())}toDERHex(){return _e.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return N(this.toCompactHex())}toCompactHex(){return h(this.r)+h(this.s)}}const g={isValidPrivateKey(e){try{return u(e),!0}catch(e){return!1}},normPrivateKeyToScalar:u,randomPrivateKey:()=>{const e=pe(t.n);return function(e,t,n=!1){const a=e.length,i=he(t),r=pe(t);if(a<16||a1024)throw new Error(`expected ${r}-1024 bytes of input, got ${a}`);const o=re(n?R(e):I(e),t-X)+X;return n?q(o,i):z(o,i)}(t.randomBytes(e),t.n)},precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function v(e){const t=e instanceof Uint8Array,n="string"==typeof e,a=(t||n)&&e.length;return t?a===i||a===r:n?a===2*i||a===2*r:e instanceof l}const b=t.bits2int||function(e){const n=R(e),a=8*e.length-t.nBitLength;return a>0?n>>BigInt(a):n},_=t.bits2int_modN||function(e){return o(b(e))},y=W(t.nBitLength);function w(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(ye<=e&&ee in i)))throw new Error("sign() legacy options not supported");const{hash:r,randomBytes:c}=t;let{lowS:h,prehash:f,extraEntropy:g}=i;null==h&&(h=!0),e=j("msgHash",e),f&&(e=j("prehashed msgHash",r(e)));const v=_(e),y=u(a),k=[w(y),w(v)];if(null!=g){const e=!0===g?c(n.BYTES):g;k.push(j("extraEntropy",e))}const S=$(...k),C=v;return{seed:S,k2sig:function(e){const t=b(e);if(!d(t))return;const n=s(t),a=l.BASE.multiply(t).toAffine(),i=o(a.x);if(i===ye)return;const r=o(n*o(C+i*y));if(r===ye)return;let u=(a.x===i?0:2)|Number(a.y&we),c=r;return h&&p(r)&&(c=function(e){return p(e)?o(-e):e}(r),u^=1),new m(i,c,u)}}}const x={lowS:t.lowS,prehash:!1},S={lowS:t.lowS,prehash:!1};return l.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return l.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(v(e))throw new Error("first arg must be private key");if(!v(t))throw new Error("second arg must be public key");return l.fromHex(t).multiply(u(e)).toRawBytes(n)},sign:function(e,n,a=x){const{seed:i,k2sig:r}=k(e,n,a),o=t;return K(o.hash.outputLen,o.nByteLength,o.hmac)(i,r)},verify:function(e,n,a,i=S){const r=e;if(n=j("msgHash",n),a=j("publicKey",a),"strict"in i)throw new Error("options.strict was renamed to lowS");const{lowS:u,prehash:c}=i;let d,h;try{if("string"==typeof r||r instanceof Uint8Array)try{d=m.fromDER(r)}catch(e){if(!(e instanceof _e.Err))throw e;d=m.fromCompact(r)}else{if("object"!=typeof r||"bigint"!=typeof r.r||"bigint"!=typeof r.s)throw new Error("PARSE");{const{r:e,s:t}=r;d=new m(e,t)}}h=l.fromHex(a)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(u&&d.hasHighS())return!1;c&&(n=t.hash(n));const{r:p,s:f}=d,g=_(n),v=s(f),b=o(g*v),y=o(p*v),w=l.BASE.multiplyAndAddUnsafe(h,b,y)?.toAffine();return!!w&&o(w.x)===p},ProjectivePoint:l,Signature:m,utils:g}}var Ce=class extends f{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");o(e.outputLen),o(e.blockLen)}(e);const n=p(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const a=this.blockLen,i=new Uint8Array(a);i.set(n.length>a?e.create().update(n).digest():n);for(let e=0;enew Ce(e,t).update(n).digest();function Te(e){return{hash:e,hmac:(t,...n)=>Ee(e,t,function(...e){const t=new Uint8Array(e.reduce(((e,t)=>e+t.length),0));let n=0;return e.forEach((e=>{if(!c(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}(...n)),randomBytes:g}}Ee.create=(e,t)=>new Ce(e,t);var Ae=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Me=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Pe=BigInt(1),Le=BigInt(2),Oe=(e,t)=>(e+t/Le)/t;function Ne(e){const t=Ae,n=BigInt(3),a=BigInt(6),i=BigInt(11),r=BigInt(22),o=BigInt(23),s=BigInt(44),l=BigInt(88),u=e*e*e%t,c=u*u*e%t,d=se(c,n,t)*c%t,h=se(d,n,t)*c%t,p=se(h,Le,t)*u%t,f=se(p,i,t)*p%t,m=se(f,r,t)*f%t,g=se(m,s,t)*m%t,v=se(g,l,t)*g%t,b=se(v,s,t)*m%t,_=se(b,n,t)*c%t,y=se(_,o,t)*f%t,w=se(y,a,t)*u%t,k=se(w,Le,t);if(!Re.eql(Re.sqr(k),e))throw new Error("Cannot find square root");return k}var Re=function(e,t,n=!1,a={}){if(e<=J)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:i,nByteLength:r}=de(e,t);if(r>2048)throw new Error("Field lengths over 2048 bytes are not supported");const o=ue(e),s=Object.freeze({ORDER:e,BITS:i,BYTES:r,MASK:W(i),ZERO:J,ONE:X,create:t=>re(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return J<=t&&te===J,isOdd:e=>(e&X)===X,neg:t=>re(-t,e),eql:(e,t)=>e===t,sqr:t=>re(t*t,e),add:(t,n)=>re(t+n,e),sub:(t,n)=>re(t-n,e),mul:(t,n)=>re(t*n,e),pow:(e,t)=>function(e,t,n){if(n 0");if(n===J)return e.ONE;if(n===X)return t;let a=e.ONE,i=t;for(;n>J;)n&X&&(a=e.mul(a,i)),i=e.sqr(i),n>>=X;return a}(s,e,t),div:(t,n)=>re(t*le(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>le(t,e),sqrt:a.sqrt||(e=>o(s,e)),invertBatch:e=>function(e,t){const n=new Array(t.length),a=t.reduce(((t,a,i)=>e.is0(a)?t:(n[i]=t,e.mul(t,a))),e.ONE),i=e.inv(a);return t.reduceRight(((t,a,i)=>e.is0(a)?t:(n[i]=e.mul(t,n[i]),e.mul(t,a))),i),n}(s,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?q(e,r):z(e,r),fromBytes:e=>{if(e.length!==r)throw new Error(`Fp.fromBytes: expected ${r}, got ${e.length}`);return n?I(e):R(e)}});return Object.freeze(s)}(Ae,void 0,void 0,{sqrt:Ne}),Ie=function(e,t){const n=t=>Se({...e,...Te(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Re,n:Me,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Me,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),a=-Pe*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),i=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),r=n,o=BigInt("0x100000000000000000000000000000000"),s=Oe(r*e,t),l=Oe(-a*e,t);let u=re(e-s*n-l*i,t),c=re(-s*a-l*r,t);const d=u>o,h=c>o;if(d&&(u=t-u),h&&(c=t-c),u>o||c>o)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:d,k1:u,k2neg:h,k2:c}}}},x),ze=BigInt(0),qe=e=>"bigint"==typeof e&&ze"bigint"==typeof e&&zee.charCodeAt(0))));n=$(t,t),je[e]=n}return x($(n,...t))}var Be=e=>e.toRawBytes(!0).slice(1),Fe=e=>z(e,32),Ve=e=>re(e,Ae),Ue=e=>re(e,Me),He=Ie.ProjectivePoint,We=(e,t,n)=>He.BASE.multiplyAndAddUnsafe(e,t,n);function Ye(e){let t=Ie.utils.normPrivateKeyToScalar(e),n=He.fromPrivateKey(t);return{scalar:n.hasEvenY()?t:Ue(-t),bytes:Be(n)}}function Qe(e){if(!qe(e))throw new Error("bad x: need 0 < x < p");const t=Ve(e*e);let n=Ne(Ve(t*e+BigInt(7)));n%Le!==ze&&(n=Ve(-n));const a=new He(e,n,Pe);return a.assertValidity(),a}function Ke(...e){return Ue(R($e("BIP0340/challenge",...e)))}function Ge(e){return Ye(e).bytes}function Ze(e,t,n=g(32)){const a=j("message",e),{bytes:i,scalar:r}=Ye(t),o=j("auxRand",n,32),s=Fe(r^R($e("BIP0340/aux",o))),l=$e("BIP0340/nonce",s,i,a),u=Ue(R(l));if(u===ze)throw new Error("sign failed: k is zero");const{bytes:c,scalar:d}=Ye(u),h=Ke(c,i,a),p=new Uint8Array(64);if(p.set(c,0),p.set(Fe(Ue(d+h*r)),32),!Je(p,a,i))throw new Error("sign: Invalid signature produced");return p}function Je(e,t,n){const a=j("signature",e,64),i=j("message",t),r=j("publicKey",n,32);try{const e=Qe(R(r)),t=R(a.subarray(0,32));if(!qe(t))return!1;const n=R(a.subarray(32,64));if(!De(n))return!1;const o=Ke(Fe(t),Be(e),i),s=We(e,n,Ue(-o));return!(!s||!s.hasEvenY()||s.toAffine().x!==t)}catch(e){return!1}}var Xe=(()=>({getPublicKey:Ge,sign:Ze,verify:Je,utils:{randomPrivateKey:Ie.utils.randomPrivateKey,lift_x:Qe,pointToBytes:Be,numberToBytesBE:z,bytesToNumberBE:R,taggedHash:$e,mod:re}}))(),et="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,tt=e=>e instanceof Uint8Array,nt=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),at=(e,t)=>e<<32-t|e>>>t;if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");var it=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function rt(e){if(!tt(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length),0));let n=0;return e.forEach((e=>{if(!tt(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}var ut=class{clone(){return this._cloneInto()}};function ct(e){const t=t=>e().update(st(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function dt(e=32){if(et&&"function"==typeof et.getRandomValues)return et.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}var ht=Symbol("verified"),pt=e=>e instanceof Object;function ft(e){if(!pt(e))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;te.created_at!==t.created_at?t.created_at-e.created_at:e.id.localeCompare(t.id)))}function gt(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function vt(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}var bt={number:gt,bool:function(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)},bytes:vt,hash:function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");gt(e.outputLen),gt(e.blockLen)},exists:function(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")},output:function(e,t){vt(e);const n=t.outputLen;if(e.lengtha-r&&(this.process(n,0),r=0);for(let e=r;e>i&r),s=Number(n&r),l=a?4:0,u=a?0:4;e.setUint32(t+l,o,a),e.setUint32(t+u,s,a)}(n,a-8,BigInt(8*this.length),i),this.process(n,0);const o=nt(e),s=this.outputLen;if(s%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=s/4,u=this.get();if(l>u.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^e&n^t&n,wt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),kt=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),xt=new Uint32Array(64),St=class extends _t{constructor(){super(64,32,8,!1),this.A=0|kt[0],this.B=0|kt[1],this.C=0|kt[2],this.D=0|kt[3],this.E=0|kt[4],this.F=0|kt[5],this.G=0|kt[6],this.H=0|kt[7]}get(){const{A:e,B:t,C:n,D:a,E:i,F:r,G:o,H:s}=this;return[e,t,n,a,i,r,o,s]}set(e,t,n,a,i,r,o,s){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|a,this.E=0|i,this.F=0|r,this.G=0|o,this.H=0|s}process(e,t){for(let n=0;n<16;n++,t+=4)xt[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=xt[e-15],n=xt[e-2],a=at(t,7)^at(t,18)^t>>>3,i=at(n,17)^at(n,19)^n>>>10;xt[e]=i+xt[e-7]+a+xt[e-16]|0}let{A:n,B:a,C:i,D:r,E:o,F:s,G:l,H:u}=this;for(let e=0;e<64;e++){const t=u+(at(o,6)^at(o,11)^at(o,25))+((c=o)&s^~c&l)+wt[e]+xt[e]|0,d=(at(n,2)^at(n,13)^at(n,22))+yt(n,a,i)|0;u=l,l=s,s=o,o=r+t|0,r=i,i=a,a=n,n=t+d|0}var c;n=n+this.A|0,a=a+this.B|0,i=i+this.C|0,r=r+this.D|0,o=o+this.E|0,s=s+this.F|0,l=l+this.G|0,u=u+this.H|0,this.set(n,a,i,r,o,s,l,u)}roundClean(){xt.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}},Ct=class extends St{constructor(){super(),this.A=-1056596264,this.B=914150663,this.C=812702999,this.D=-150054599,this.E=-4191439,this.F=1750603025,this.G=1694076839,this.H=-1090891868,this.outputLen=28}},Et=ct((()=>new St)),Tt=(ct((()=>new Ct)),{});i(Tt,{Queue:()=>It,QueueNode:()=>Rt,binarySearch:()=>Nt,insertEventIntoAscendingList:()=>Ot,insertEventIntoDescendingList:()=>Lt,normalizeURL:()=>Pt,utf8Decoder:()=>At,utf8Encoder:()=>Mt});var At=new TextDecoder("utf-8"),Mt=new TextEncoder;function Pt(e){-1===e.indexOf("://")&&(e="wss://"+e);let t=new URL(e);return t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}function Lt(e,t){const[n,a]=Nt(e,(e=>t.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at));return a||e.splice(n,0,t),e}function Ot(e,t){const[n,a]=Nt(e,(e=>t.id===e.id?0:t.created_at===e.created_at?-1:t.created_at-e.created_at));return a||e.splice(n,0,t),e}function Nt(e,t){let n=0,a=e.length-1;for(;n<=a;){const i=Math.floor((n+a)/2),r=t(e[i]);if(0===r)return[i,!0];r<0?a=i-1:n=i+1}return[n,!1]}var Rt=class{value;next=null;prev=null;constructor(e){this.value=e}},It=class{first;last;constructor(){this.first=null,this.last=null}enqueue(e){const t=new Rt(e);return this.last?this.last===this.first?(this.last=t,this.last.prev=this.first,this.first.next=t):(t.prev=this.last,this.last.next=t,this.last=t):(this.first=t,this.last=t),!0}dequeue(){if(!this.first)return null;if(this.first===this.last){const e=this.first;return this.first=null,this.last=null,e.value}const e=this.first;return this.first=e.next,e.value}};function zt(e){if(!ft(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function qt(e){return rt(Et(Mt.encode(zt(e))))}var Dt=new class{generateSecretKey(){return Xe.utils.randomPrivateKey()}getPublicKey(e){return rt(Xe.getPublicKey(e))}finalizeEvent(e,t){const n=e;return n.pubkey=rt(Xe.getPublicKey(t)),n.id=qt(n),n.sig=rt(Xe.sign(qt(n),t)),n[ht]=!0,n}verifyEvent(e){if("boolean"==typeof e[ht])return e[ht];const t=qt(e);if(t!==e.id)return e[ht]=!1,!1;try{const n=Xe.verify(e.sig,t,e.pubkey);return e[ht]=n,n}catch(t){return e[ht]=!1,!1}}},jt=Dt.generateSecretKey,$t=Dt.getPublicKey,Bt=Dt.finalizeEvent,Ft=Dt.verifyEvent,Vt={};function Ut(e){return 1e3<=e&&e<1e4||[1,2,4,5,6,7,8,16,40,41,42,43,44].includes(e)}function Ht(e){return[0,3].includes(e)||1e4<=e&&e<2e4}function Wt(e){return 2e4<=e&&e<3e4}function Yt(e){return 3e4<=e&&e<4e4}function Qt(e){return Ut(e)?"regular":Ht(e)?"replaceable":Wt(e)?"ephemeral":Yt(e)?"parameterized":"unknown"}i(Vt,{Application:()=>ia,BadgeAward:()=>rn,BadgeDefinition:()=>Zn,BlockedRelaysList:()=>Nn,BookmarkList:()=>Pn,Bookmarksets:()=>Qn,Calendar:()=>da,CalendarEventRSVP:()=>ha,ChannelCreation:()=>sn,ChannelHideMessage:()=>cn,ChannelMessage:()=>un,ChannelMetadata:()=>ln,ChannelMuteUser:()=>dn,ClassifiedListing:()=>sa,ClientAuth:()=>$n,CommunitiesList:()=>Ln,CommunityDefinition:()=>ma,CommunityPostApproval:()=>_n,Contacts:()=>Jt,CreateOrUpdateProduct:()=>ea,CreateOrUpdateStall:()=>Xn,Curationsets:()=>Kn,Date:()=>ua,DraftClassifiedListing:()=>la,DraftLong:()=>na,Emojisets:()=>aa,EncryptedDirectMessage:()=>Xt,EncryptedDirectMessages:()=>en,EventDeletion:()=>tn,FileMetadata:()=>pn,FileServerPreference:()=>qn,Followsets:()=>Hn,GenericRepost:()=>on,Genericlists:()=>Wn,HTTPAuth:()=>Un,Handlerinformation:()=>fa,Handlerrecommendation:()=>pa,Highlights:()=>En,InterestsList:()=>In,Interestsets:()=>Jn,JobFeedback:()=>kn,JobRequest:()=>yn,JobResult:()=>wn,Label:()=>bn,LightningPubRPC:()=>jn,LiveChatMessage:()=>fn,LiveEvent:()=>ra,LongFormArticle:()=>ta,Metadata:()=>Kt,Mutelist:()=>Tn,NWCWalletInfo:()=>Dn,NWCWalletRequest:()=>Bn,NWCWalletResponse:()=>Fn,NostrConnect:()=>Vn,OpenTimestamps:()=>hn,Pinlist:()=>An,ProblemTracker:()=>mn,ProfileBadges:()=>Gn,PublicChatsList:()=>On,Reaction:()=>an,RecommendRelay:()=>Zt,RelayList:()=>Mn,Relaysets:()=>Yn,Report:()=>gn,Reporting:()=>vn,Repost:()=>nn,SearchRelaysList:()=>Rn,ShortTextNote:()=>Gt,Time:()=>ca,UserEmojiList:()=>zn,UserStatuses:()=>oa,Zap:()=>Cn,ZapGoal:()=>xn,ZapRequest:()=>Sn,classifyKind:()=>Qt,isEphemeralKind:()=>Wt,isParameterizedReplaceableKind:()=>Yt,isRegularKind:()=>Ut,isReplaceableKind:()=>Ht});var Kt=0,Gt=1,Zt=2,Jt=3,Xt=4,en=4,tn=5,nn=6,an=7,rn=8,on=16,sn=40,ln=41,un=42,cn=43,dn=44,hn=1040,pn=1063,fn=1311,mn=1971,gn=1984,vn=1984,bn=1985,_n=4550,yn=5999,wn=6999,kn=7e3,xn=9041,Sn=9734,Cn=9735,En=9802,Tn=1e4,An=10001,Mn=10002,Pn=10003,Ln=10004,On=10005,Nn=10006,Rn=10007,In=10015,zn=10030,qn=10096,Dn=13194,jn=21e3,$n=22242,Bn=23194,Fn=23195,Vn=24133,Un=27235,Hn=3e4,Wn=30001,Yn=30002,Qn=30003,Kn=30004,Gn=30008,Zn=30009,Jn=30015,Xn=30017,ea=30018,ta=30023,na=30024,aa=30030,ia=30078,ra=30311,oa=30315,sa=30402,la=30403,ua=31922,ca=31923,da=31924,ha=31925,pa=31989,fa=31990,ma=34550;function ga(e,t){if(e.ids&&-1===e.ids.indexOf(t.id))return!1;if(e.kinds&&-1===e.kinds.indexOf(t.kind))return!1;if(e.authors&&-1===e.authors.indexOf(t.pubkey))return!1;for(let n in e)if("#"===n[0]){let a=e[`#${n.slice(1)}`];if(a&&!t.tags.find((([e,t])=>e===n.slice(1)&&-1!==a.indexOf(t))))return!1}return!(e.since&&t.created_ate.until)}function va(e,t){for(let n=0;n{if("kinds"===e||"ids"===e||"authors"===e||"#"===e[0]){t[e]=t[e]||[];for(let a=0;at.limit)&&(t.limit=a.limit),a.until&&(!t.until||a.until>t.until)&&(t.until=a.until),a.since&&(!t.since||a.sinceHt(e)))?e.authors.length*e.kinds.length:1/0,e.authors?.length&&e.kinds?.every((e=>Yt(e)))&&e["#d"]?.length?e.authors.length*e.kinds.length*e["#d"].length:1/0)}var ya={};function wa(e,t){let n=t.length+3,a=e.indexOf(`"${t}":`)+n,i=e.slice(a).indexOf('"')+a+1;return e.slice(i,i+64)}function ka(e,t){let n=t.length,a=e.indexOf(`"${t}":`)+n+3,i=e.slice(a),r=Math.min(i.indexOf(","),i.indexOf("}"));return parseInt(i.slice(0,r),10)}function xa(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let a=t+7+1+n,i=e.slice(a+1,80).indexOf('"');if(-1===i)return null;let r=a+1+i;return e.slice(a+1,r)}function Sa(e,t){return t===wa(e,"id")}function Ca(e,t){return t===wa(e,"pubkey")}function Ea(e,t){return t===ka(e,"kind")}i(ya,{getHex64:()=>wa,getInt:()=>ka,getSubscriptionId:()=>xa,matchEventId:()=>Sa,matchEventKind:()=>Ea,matchEventPubkey:()=>Ca});var Ta={};function Aa(e,t){return{kind:$n,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}async function Ma(){return new Promise((e=>{const t=new MessageChannel,n=()=>{t.port1.removeEventListener("message",n),e()};t.port1.addEventListener("message",n),t.port2.postMessage(0),t.port1.start()}))}i(Ta,{makeAuthEvent:()=>Aa});var Pa,La=e=>(e[ht]=!0,!0),Oa=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);_onauth=null;baseEoseTimeout=4400;connectionTimeout=4400;openSubs=new Map;connectionTimeoutHandle;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;incomingMessageQueue=new It;queueRunning=!1;challenge;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=Pt(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket}static async connect(e,t){const n=new Oa(e,t);return await n.connect(),n}closeAllSubscriptions(e){for(let[t,n]of this.openSubs)n.close(e);this.openSubs.clear();for(let[t,n]of this.openEventPublishes)n.reject(new Error(e));this.openEventPublishes.clear();for(let[t,n]of this.openCountRequests)n.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async connect(){return this.connectionPromise||(this.challenge=void 0,this.connectionPromise=new Promise(((e,t)=>{this.connectionTimeoutHandle=setTimeout((()=>{t("connection timed out"),this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection timed out")}),this.connectionTimeout);try{this.ws=new this._WebSocket(this.url)}catch(e){return void t(e)}this.ws.onopen=()=>{clearTimeout(this.connectionTimeoutHandle),this._connected=!0,e()},this.ws.onerror=e=>{t(e.message||"websocket error"),this._connected&&(this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection errored"))},this.ws.onclose=async()=>{this._connected&&(this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection closed"))},this.ws.onmessage=this._onmessage.bind(this)}))),this.connectionPromise}async runQueue(){for(this.queueRunning=!0;!1!==this.handleNext();)await Ma();this.queueRunning=!1}handleNext(){const e=this.incomingMessageQueue.dequeue();if(!e)return!1;const t=xa(e);if(t){const n=this.openSubs.get(t);if(!n)return;const a=wa(e,"id"),i=n.alreadyHaveEvent?.(a);if(n.receivedEvent?.(this,a),i)return}try{let t=JSON.parse(e);switch(t[0]){case"EVENT":{const e=this.openSubs.get(t[1]),n=t[2];return void(this.verifyEvent(n)&&va(e.filters,n)&&e.onevent(n))}case"COUNT":{const e=t[1],n=t[2],a=this.openCountRequests.get(e);return void(a&&(a.resolve(n.count),this.openCountRequests.delete(e)))}case"EOSE":{const e=this.openSubs.get(t[1]);if(!e)return;return void e.receivedEose()}case"OK":{const e=t[1],n=t[2],a=t[3],i=this.openEventPublishes.get(e);return n?i.resolve(a):i.reject(new Error(a)),void this.openEventPublishes.delete(e)}case"CLOSED":{const e=t[1],n=this.openSubs.get(e);if(!n)return;return n.closed=!0,void n.close(t[2])}case"NOTICE":return void this.onnotice(t[1]);case"AUTH":return this.challenge=t[1],void this._onauth?.(t[1])}}catch(e){return}}async send(e){if(!this.connectionPromise)throw new Error("sending on closed connection");this.connectionPromise.then((()=>{this.ws?.send(e)}))}async auth(e){if(!this.challenge)throw new Error("can't perform auth, no challenge was received");const t=await e(Aa(this.url,this.challenge)),n=new Promise(((e,n)=>{this.openEventPublishes.set(t.id,{resolve:e,reject:n})}));return this.send('["AUTH",'+JSON.stringify(t)+"]"),n}async publish(e){const t=new Promise(((t,n)=>{this.openEventPublishes.set(e.id,{resolve:t,reject:n})}));return this.send('["EVENT",'+JSON.stringify(e)+"]"),t}async count(e,t){this.serial++;const n=t?.id||"count:"+this.serial,a=new Promise(((e,t)=>{this.openCountRequests.set(n,{resolve:e,reject:t})}));return this.send('["COUNT","'+n+'",'+JSON.stringify(e).substring(1)),a}subscribe(e,t){const n=this.prepareSubscription(e,t);return n.fire(),n}prepareSubscription(e,t){this.serial++;const n=t.id||"sub:"+this.serial,a=new Na(this,n,e,t);return this.openSubs.set(n,a),a}close(){this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.ws?.close()}_onmessage(e){this.incomingMessageQueue.enqueue(e.data),this.queueRunning||this.runQueue()}},Na=class{relay;id;closed=!1;eosed=!1;filters;alreadyHaveEvent;receivedEvent;onevent;oneose;onclose;eoseTimeout;eoseTimeoutHandle;constructor(e,t,n,a){this.relay=e,this.filters=n,this.id=t,this.alreadyHaveEvent=a.alreadyHaveEvent,this.receivedEvent=a.receivedEvent,this.eoseTimeout=a.eoseTimeout||e.baseEoseTimeout,this.oneose=a.oneose,this.onclose=a.onclose,this.onevent=a.onevent||(e=>{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,e)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){!this.closed&&this.relay.connected&&(this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]"),this.closed=!0),this.relay.openSubs.delete(this.id),this.onclose?.(e)}};try{Pa=WebSocket}catch{}var Ra,Ia=class extends Oa{constructor(e){super(e,{verifyEvent:Ft,websocketImplementation:Pa})}static async connect(e){const t=new Ia(e);return await t.connect(),t}},za=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;trustedRelayURLs=new Set;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation}async ensureRelay(e,t){e=Pt(e);let n=this.relays.get(e);return n||(n=new Oa(e,{verifyEvent:this.trustedRelayURLs.has(e)?La:this.verifyEvent,websocketImplementation:this._WebSocket}),t?.connectionTimeout&&(n.connectionTimeout=t.connectionTimeout),this.relays.set(e,n)),await n.connect(),n}close(e){e.map(Pt).forEach((e=>{this.relays.get(e)?.close()}))}subscribeMany(e,t,n){return this.subscribeManyMap(Object.fromEntries(e.map((e=>[e,t]))),n)}subscribeManyMap(e,t){this.trackRelays&&(t.receivedEvent=(e,t)=>{let n=this.seenOn.get(t);n||(n=new Set,this.seenOn.set(t,n)),n.add(e)});const n=new Set,a=[],i=Object.keys(e).length,r=[];let o=e=>{r[e]=!0,r.filter((e=>e)).length===i&&(t.oneose?.(),o=()=>{})};const s=[];let l=(e,n)=>{o(e),s[e]=n,s.filter((e=>e)).length===i&&(t.onclose?.(s),l=()=>{})};const u=e=>{if(t.alreadyHaveEvent?.(e))return!0;const a=n.has(e);return n.add(e),a},c=Promise.all(Object.entries(e).map((async(e,n,i)=>{if(i.indexOf(e)!==n)return void l(n,"duplicate url");let r,[s,c]=e;s=Pt(s);try{r=await this.ensureRelay(s,{connectionTimeout:t.maxWait?Math.max(.8*t.maxWait,t.maxWait-1e3):void 0})}catch(e){return void l(n,e?.message||String(e))}let d=r.subscribe(c,{...t,oneose:()=>o(n),onclose:e=>l(n,e),alreadyHaveEvent:u,eoseTimeout:t.maxWait});a.push(d)})));return{async close(){await c,a.forEach((e=>{e.close()}))}}}subscribeManyEose(e,t,n){const a=this.subscribeMany(e,t,{...n,oneose(){a.close()}});return a}async querySync(e,t,n){return new Promise((async a=>{const i=[];this.subscribeManyEose(e,[t],{...n,onevent(e){i.push(e)},onclose(e){a(i)}})}))}async get(e,t,n){t.limit=1;const a=await this.querySync(e,t,n);return a.sort(((e,t)=>t.created_at-e.created_at)),a[0]||null}publish(e,t){return e.map(Pt).map((async(e,n,a)=>{if(a.indexOf(e)!==n)return Promise.reject("duplicate url");return(await this.ensureRelay(e)).publish(t)}))}listConnectionStatus(){const e=new Map;return this.relays.forEach(((t,n)=>e.set(n,t.connected))),e}destroy(){this.relays.forEach((e=>e.close())),this.relays=new Map}};try{Ra=WebSocket}catch{}var qa=class extends za{constructor(){super({verifyEvent:Ft,websocketImplementation:Ra})}},Da={};function ja(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function $a(...e){const t=(e,t)=>n=>e(t(n));return{encode:Array.from(e).reverse().reduce(((e,n)=>e?t(e,n.encode):n.encode),void 0),decode:e.reduce(((e,n)=>e?t(e,n.decode):n.decode),void 0)}}function Ba(e){return{encode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("alphabet.encode input should be an array of numbers");return t.map((t=>{if(ja(t),t<0||t>=e.length)throw new Error(`Digit index outside alphabet: ${t} (alphabet: ${e.length})`);return e[t]}))},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map((t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}}function Fa(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function Va(e,t="="){if(ja(e),"string"!=typeof t)throw new Error("padding chr should be string");return{encode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;n.length*e%8;)n.push(t);return n},decode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let a=n.length;if(a*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;a>0&&n[a-1]===t;a--)if(!((a-1)*e%8))throw new Error("Invalid padding: string has too much padding");return n.slice(0,a)}}}function Ua(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function Ha(e,t,n){if(t<2)throw new Error(`convertRadix: wrong from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: wrong to=${n}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let a=0;const i=[],r=Array.from(e);for(r.forEach((e=>{if(ja(e),e<0||e>=t)throw new Error(`Wrong integer: ${e}`)}));;){let e=0,o=!0;for(let i=a;ipi,Bech32MaxSize:()=>hi,decode:()=>fi,encodeBytes:()=>yi,naddrEncode:()=>xi,neventEncode:()=>ki,noteEncode:()=>bi,nprofileEncode:()=>wi,npubEncode:()=>vi,nrelayEncode:()=>Si,nsecEncode:()=>gi});var Wa=(e,t)=>t?Wa(t,e%t):e,Ya=(e,t)=>e+(t-Wa(e,t));function Qa(e,t,n,a){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(Ya(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${Ya(t,n)}`);let i=0,r=0;const o=2**n-1,s=[];for(const a of e){if(ja(a),a>=2**t)throw new Error(`convertRadix2: invalid data word=${a} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${r} from=${t}`);for(r+=t;r>=n;r-=n)s.push((i>>r-n&o)>>>0);i&=2**r-1}if(i=i<=t)throw new Error("Excess padding");if(!a&&i)throw new Error(`Non-zero padding: ${i}`);return a&&r>0&&s.push(i>>>0),s}function Ka(e,t=!1){if(ja(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(Ya(8,e)>32||Ya(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!(n instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return Qa(Array.from(n),8,e,!t)},decode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(Qa(n,e,8,t))}}}function Ga(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}var Za=$a(Ka(4),Ba("0123456789ABCDEF"),Fa("")),Ja=$a(Ka(5),Ba("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),Va(5),Fa("")),Xa=($a(Ka(5),Ba("0123456789ABCDEFGHIJKLMNOPQRSTUV"),Va(5),Fa("")),$a(Ka(5),Ba("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),Fa(""),Ua((e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1")))),$a(Ka(6),Ba("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),Va(6),Fa(""))),ei=$a(Ka(6),Ba("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),Va(6),Fa("")),ti=e=>{return $a((ja(t=58),{encode:e=>{if(!(e instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return Ha(Array.from(e),256,t)},decode:e=>{if(!Array.isArray(e)||e.length&&"number"!=typeof e[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(Ha(e,t,256))}}),Ba(e),Fa(""));var t},ni=ti("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),ai=(ti("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),ti("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"),[0,2,3,5,6,7,9,10,11]),ii={encode(e){let t="";for(let n=0;n>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=oi[e]);return n}function li(e,t,n=1){const a=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=si(i)^n>>5}i=si(i);for(let t=0;tn)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const a=e.toLowerCase();if(e!==a&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const i=(e=a).lastIndexOf("1");if(0===i||-1===i)throw new Error('Letter "1" must be present between prefix and data only');const r=e.slice(0,i),o=e.slice(i+1);if(o.length<6)throw new Error("Data must be at least 6 characters long");const s=ri.decode(o).slice(0,-6),l=li(r,s,t);if(!o.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:r,words:s}}return{encode:function(e,n,a=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const i=e.length+7+n.length;if(!1!==a&&i>a)throw new TypeError(`Length ${i} exceeds limit ${a}`);return`${e=e.toLowerCase()}1${ri.encode(n)}${li(e,n,t)}`},decode:o,decodeToBytes:function(e){const{prefix:t,words:n}=o(e,!1);return{prefix:t,words:n,bytes:a(n)}},decodeUnsafe:Ga(o),fromWords:a,fromWordsUnsafe:r,toWords:i}}var ci=ui("bech32"),di=(ui("bech32m"),{utf8:{encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},hex:$a(Ka(4),Ba("0123456789abcdef"),Fa(""),Ua((e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()}))),base16:Za,base32:Ja,base64:Xa,base64url:ei,base58:ni,base58xmr:ii}),hi=(Object.keys(di).join(", "),5e3),pi=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function fi(e){let{prefix:t,words:n}=ci.decode(e,hi),a=new Uint8Array(ci.fromWords(n));switch(t){case"nprofile":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:rt(e[0][0]),relays:e[1]?e[1].map((e=>At.decode(e))):[]}}}case"nevent":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:rt(e[0][0]),relays:e[1]?e[1].map((e=>At.decode(e))):[],author:e[2]?.[0]?rt(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(rt(e[3][0]),16):void 0}}}case"naddr":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:At.decode(e[0][0]),pubkey:rt(e[2][0]),kind:parseInt(rt(e[3][0]),16),relays:e[1]?e[1].map((e=>At.decode(e))):[]}}}case"nrelay":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nrelay");return{type:"nrelay",data:At.decode(e[0][0])}}case"nsec":return{type:t,data:a};case"npub":case"note":return{type:t,data:rt(a)};default:throw new Error(`unknown prefix ${t}`)}}function mi(e){let t={},n=e;for(;n.length>0;){let e=n[0],a=n[1],i=n.slice(2,2+a);if(n=n.slice(2+a),i.lengthMt.encode(e)))}))}function ki(e){let t;return void 0!==e.kind&&(t=function(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}(e.kind)),_i("nevent",Ci({0:[ot(e.id)],1:(e.relays||[]).map((e=>Mt.encode(e))),2:e.author?[ot(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function xi(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),_i("naddr",Ci({0:[Mt.encode(e.identifier)],1:(e.relays||[]).map((e=>Mt.encode(e))),2:[ot(e.pubkey)],3:[new Uint8Array(t)]}))}function Si(e){return _i("nrelay",Ci({0:[Mt.encode(e)]}))}function Ci(e){let t=[];return Object.entries(e).reverse().forEach((([e,n])=>{n.forEach((n=>{let a=new Uint8Array(n.length+2);a.set([parseInt(e)],0),a.set([n.length],1),a.set(n,2),t.push(a)}))})),lt(...t)}var Ei=/\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g;function Ti(e){let t=[];for(let n of e.content.matchAll(Ei))if(n[2])try{let{type:e,data:a}=fi(n[1]);switch(e){case"npub":t.push({text:n[0],profile:{pubkey:a,relays:[]}});break;case"nprofile":t.push({text:n[0],profile:a});break;case"note":t.push({text:n[0],event:{id:a,relays:[]}});break;case"nevent":t.push({text:n[0],event:a});break;case"naddr":t.push({text:n[0],address:a})}}catch(e){}else if(n[3]){let a=parseInt(n[3],10),i=e.tags[a];if(!i)continue;switch(i[0]){case"p":t.push({text:n[0],profile:{pubkey:i[1],relays:i[2]?[i[2]]:[]}});break;case"e":t.push({text:n[0],event:{id:i[1],relays:i[2]?[i[2]]:[]}});break;case"a":try{let[e,a,r]=i[1].split(":");t.push({text:n[0],address:{identifier:r,pubkey:a,kind:parseInt(e,10),relays:i[2]?[i[2]]:[]}})}catch(e){}}}return t}var Ai={};function Mi(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Pi(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Li(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function Oi(e,...t){if(!Li(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Ni(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Ri(e,t){Oi(e);const n=t.outputLen;if(e.lengthTr,encrypt:()=>Er});var Ii=e=>new Uint8Array(e.buffer,e.byteOffset,e.byteLength),zi=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4)),qi=e=>new DataView(e.buffer,e.byteOffset,e.byteLength);if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function Di(e){if("string"!=typeof e)throw new Error("string expected, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function ji(e){if("string"==typeof e)e=Di(e);else{if(!Li(e))throw new Error("Uint8Array expected, got "+typeof e);e=e.slice()}return e}function $i(e,t){if(e.length!==t.length)return!1;let n=0;for(let a=0;a(Object.assign(t,e),t);function Fi(e,t,n,a){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,a);const i=BigInt(32),r=BigInt(4294967295),o=Number(n>>i&r),s=Number(n&r),l=a?4:0,u=a?0:4;e.setUint32(t+l,o,a),e.setUint32(t+u,s,a)}var Vi=16,Ui=new Uint8Array(16),Hi=zi(Ui),Wi=e=>(e>>>0&255)<<24|(e>>>8&255)<<16|(e>>>16&255)<<8|e>>>24&255;var Yi=class{constructor(e,t){this.blockLen=Vi,this.outputLen=Vi,this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.finished=!1,Oi(e=ji(e),16);const n=qi(e);let a=n.getUint32(0,!1),i=n.getUint32(4,!1),r=n.getUint32(8,!1),o=n.getUint32(12,!1);const s=[];for(let e=0;e<128;e++)s.push({s0:Wi(a),s1:Wi(i),s2:Wi(r),s3:Wi(o)}),({s0:a,s1:i,s2:r,s3:o}={s3:(c=r)<<31|(d=o)>>>1,s2:(u=i)<<31|c>>>1,s1:(l=a)<<31|u>>>1,s0:l>>>1^225<<24&-(1&d)});var l,u,c,d;const h=(p=t||1024)>65536?8:p>1024?4:2;var p;if(![1,2,4,8].includes(h))throw new Error(`ghash: wrong window size=${h}, should be 2, 4 or 8`);this.W=h;const f=128/h,m=this.windowSize=2**h,g=[];for(let e=0;e>>h-o-1&1))continue;const{s0:l,s1:u,s2:c,s3:d}=s[h*e+o];n^=l,a^=u,i^=c,r^=d}g.push({s0:n,s1:a,s2:i,s3:r})}this.t=g}_updateBlock(e,t,n,a){e^=this.s0,t^=this.s1,n^=this.s2,a^=this.s3;const{W:i,t:r,windowSize:o}=this;let s=0,l=0,u=0,c=0;const d=(1<>>8*e&255;for(let e=8/i-1;e>=0;e--){const n=t>>>i*e&d,{s0:a,s1:p,s2:f,s3:m}=r[h*o+n];s^=a,l^=p,u^=f,c^=m,h+=1}}this.s0=s,this.s1=l,this.s2=u,this.s3=c}update(e){e=ji(e),Ni(this);const t=zi(e),n=Math.floor(e.length/Vi),a=e.length%Vi;for(let e=0;e>>1|n,n=(1&a)<<7}return e[0]^=225&-t,e}((e=ji(e)).slice());super(n,t),n.fill(0)}update(e){e=ji(e),Ni(this);const t=zi(e),n=e.length%Vi,a=Math.floor(e.length/Vi);for(let e=0;ee(n,t.length).update(ji(t)).digest(),n=e(new Uint8Array(16),0);return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=(t,n)=>e(t,n),t}var Gi=Ki(((e,t)=>new Yi(e,t))),Zi=Ki(((e,t)=>new Qi(e,t))),Ji=16,Xi=new Uint8Array(Ji),er=283;function tr(e){return e<<1^er&-(e>>7)}function nr(e,t){let n=0;for(;t>0;t>>=1)n^=e&-(1&t),e=tr(e);return n}var ar=(()=>{let e=new Uint8Array(256);for(let t=0,n=1;t<256;t++,n^=tr(n))e[t]=n;const t=new Uint8Array(256);t[0]=99;for(let n=0;n<255;n++){let a=e[255-n];a|=a<<8,t[e[n]]=255&(a^a>>4^a>>5^a>>6^a>>7^99)}return t})(),ir=ar.map(((e,t)=>ar.indexOf(t))),rr=e=>e<<24|e>>>8,or=e=>e<<8|e>>>24;function sr(e,t){if(256!==e.length)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map(((n,a)=>t(e[a]))),a=n.map(or),i=a.map(or),r=i.map(or),o=new Uint32Array(65536),s=new Uint32Array(65536),l=new Uint16Array(65536);for(let t=0;t<256;t++)for(let u=0;u<256;u++){const c=256*t+u;o[c]=n[t]^a[u],s[c]=i[t]^r[u],l[c]=e[t]<<8|e[u]}return{sbox:e,sbox2:l,T0:n,T1:a,T2:i,T3:r,T01:o,T23:s}}var lr=sr(ar,(e=>nr(e,3)<<24|e<<16|e<<8|nr(e,2))),ur=sr(ir,(e=>nr(e,11)<<24|nr(e,13)<<16|nr(e,9)<<8|nr(e,14))),cr=(()=>{const e=new Uint8Array(16);for(let t=0,n=1;t<16;t++,n=tr(n))e[t]=n;return e})();function dr(e){Oi(e);const t=e.length;if(![16,24,32].includes(t))throw new Error(`aes: wrong key size: should be 16, 24 or 32, got: ${t}`);const{sbox2:n}=lr,a=zi(e),i=a.length,r=e=>fr(n,e,e,e,e),o=new Uint32Array(t+28);o.set(a);for(let e=i;e6&&e%i==4&&(t=r(t)),o[e]=o[e-i]^t}return o}function hr(e){const t=dr(e),n=t.slice(),a=t.length,{sbox2:i}=lr,{T0:r,T1:o,T2:s,T3:l}=ur;for(let e=0;e>>8&255]^s[a>>>16&255]^l[a>>>24]}return n}function pr(e,t,n,a,i,r){return e[n<<8&65280|a>>>8&255]^t[i>>>8&65280|r>>>24&255]}function fr(e,t,n,a,i){return e[255&t|65280&n]|e[a>>>16&255|i>>>16&65280]<<16}function mr(e,t,n,a,i){const{sbox2:r,T01:o,T23:s}=lr;let l=0;t^=e[l++],n^=e[l++],a^=e[l++],i^=e[l++];const u=e.length/4-2;for(let r=0;r>>0,s.setUint32(c,h,t),({s0:p,s1:f,s2:m,s3:g}=mr(e,o[0],o[1],o[2],o[3]));const v=Ji*Math.floor(l.length/4);if(v=0;e--)n=n+(255&r[e])|0,r[e]=255&n,n>>>=8;({s0:s,s1:l,s2:u,s3:c}=mr(e,o[0],o[1],o[2],o[3]))}const p=Ji*Math.floor(d.length/4);if(pn(e,t),decrypt:(e,t)=>n(e,t)}}));function _r(e){if(Oi(e),e.length%Ji!=0)throw new Error("aes/(cbc-ecb).decrypt ciphertext should consist of blocks with size 16")}function yr(e,t,n){let a=e.length;const i=a%Ji;if(!t&&0!==i)throw new Error("aec/(cbc-ecb): unpadded plaintext with disabled padding");const r=zi(e);if(t){let e=Ji-i;e||(e=Ji),a+=e}const o=vr(a,n);return{b:r,o:zi(o),out:o}}function wr(e,t){if(!t)return e;const n=e.length;if(!n)throw new Error("aes/pcks5: empty ciphertext not allowed");const a=e[n-1];if(a<=0||a>16)throw new Error(`aes/pcks5: wrong padding byte: ${a}`);const i=e.subarray(0,-a);for(let t=0;t{Oi(t);const{b:i,o:r,out:o}=yr(t,n,a),s=dr(e);let l=0;for(;l+4<=i.length;){const{s0:e,s1:t,s2:n,s3:a}=mr(s,i[l+0],i[l+1],i[l+2],i[l+3]);r[l++]=e,r[l++]=t,r[l++]=n,r[l++]=a}if(n){const e=kr(t.subarray(4*l)),{s0:n,s1:a,s2:i,s3:o}=mr(s,e[0],e[1],e[2],e[3]);r[l++]=n,r[l++]=a,r[l++]=i,r[l++]=o}return s.fill(0),o},decrypt:(t,a)=>{_r(t);const i=hr(e),r=vr(t.length,a),o=zi(t),s=zi(r);for(let e=0;e+4<=o.length;){const{s0:t,s1:n,s2:a,s3:r}=gr(i,o[e+0],o[e+1],o[e+2],o[e+3]);s[e++]=t,s[e++]=n,s[e++]=a,s[e++]=r}return i.fill(0),wr(r,n)}}}));var xr=Bi({blockSize:16,nonceLength:16},(function(e,t,n={}){Oi(e),Oi(t,16);const a=!n.disablePadding;return{encrypt:(n,i)=>{const r=dr(e),{b:o,o:s,out:l}=yr(n,a,i),u=zi(t);let c=u[0],d=u[1],h=u[2],p=u[3],f=0;for(;f+4<=o.length;)c^=o[f+0],d^=o[f+1],h^=o[f+2],p^=o[f+3],({s0:c,s1:d,s2:h,s3:p}=mr(r,c,d,h,p)),s[f++]=c,s[f++]=d,s[f++]=h,s[f++]=p;if(a){const e=kr(n.subarray(4*f));c^=e[0],d^=e[1],h^=e[2],p^=e[3],({s0:c,s1:d,s2:h,s3:p}=mr(r,c,d,h,p)),s[f++]=c,s[f++]=d,s[f++]=h,s[f++]=p}return r.fill(0),l},decrypt:(n,i)=>{_r(n);const r=hr(e),o=zi(t),s=vr(n.length,i),l=zi(n),u=zi(s);let c=o[0],d=o[1],h=o[2],p=o[3];for(let e=0;e+4<=l.length;){const t=c,n=d,a=h,i=p;c=l[e+0],d=l[e+1],h=l[e+2],p=l[e+3];const{s0:o,s1:s,s2:f,s3:m}=gr(r,c,d,h,p);u[e++]=o^t,u[e++]=s^n,u[e++]=f^a,u[e++]=m^i}return r.fill(0),wr(s,a)}}}));function Sr(e,t,n,a,i){const r=e.create(n,a.length+(i?.length||0));i&&r.update(i),r.update(a);const o=new Uint8Array(16),s=qi(o);return i&&Fi(s,0,BigInt(8*i.length),t),Fi(s,8,BigInt(8*a.length),t),r.update(o),r.digest()}Bi({blockSize:16,nonceLength:12,tagLength:16},(function(e,t,n){if(Oi(t),0===t.length)throw new Error("aes/gcm: empty nonce");const a=16;function i(e,t,a){const i=Sr(Gi,!1,e,a,n);for(let e=0;e{Oi(e);const{xk:t,authKey:n,counter:o,tagMask:s}=r(),l=new Uint8Array(e.length+a);br(t,!1,o,e,l);const u=i(n,s,l.subarray(0,l.length-a));return l.set(u,e.length),t.fill(0),l},decrypt:e=>{if(Oi(e),e.lengtha=>{if(!Number.isSafeInteger(a)||t>a||a>n)throw new Error(`${e}: invalid value=${a}, must be [${t}..${n}]`)};Bi({blockSize:16,nonceLength:12,tagLength:16},(function(e,t,n){const a=Cr("AAD",0,2**36),i=Cr("plaintext",0,2**36),r=Cr("nonce",12,12),o=Cr("ciphertext",16,2**36+16);function s(){const n=e.length;if(16!==n&&24!==n&&32!==n)throw new Error(`key length must be 16, 24 or 32 bytes, got: ${n} bytes`);const a=dr(e),i=new Uint8Array(n),r=new Uint8Array(16),o=zi(t);let s=0,l=o[0],u=o[1],c=o[2],d=0;for(const e of[r,i].map(zi)){const t=zi(e);for(let e=0;e{Oi(e),i(e.length);const{encKey:t,authKey:n}=s(),a=l(t,n,e),r=new Uint8Array(e.length+16);return r.set(a,e.length),r.set(u(t,a,e)),t.fill(0),n.fill(0),r},decrypt:e=>{Oi(e),o(e.length);const t=e.subarray(-16),{encKey:n,authKey:a}=s(),i=u(n,t,e.subarray(0,-16)),r=l(n,a,i);if(n.fill(0),a.fill(0),!$i(t,r))throw new Error("invalid polyval tag");return i}}}));async function Er(e,t,n){const a=e instanceof Uint8Array?rt(e):e,i=Ar(Ie.getSharedSecret(a,"02"+t));let r=Uint8Array.from(dt(16)),o=Mt.encode(n),s=xr(i,r).encrypt(o);return`${Xa.encode(new Uint8Array(s))}?iv=${Xa.encode(new Uint8Array(r.buffer))}`}async function Tr(e,t,n){const a=e instanceof Uint8Array?rt(e):e;let[i,r]=n.split("?iv="),o=Ar(Ie.getSharedSecret(a,"02"+t)),s=Xa.decode(r),l=Xa.decode(i),u=xr(o,s).decrypt(l);return At.decode(u)}function Ar(e){return e.slice(1,33)}var Mr={};i(Mr,{NIP05_REGEX:()=>Lr,isValid:()=>Ir,queryProfile:()=>Rr,searchDomain:()=>Nr,useFetchImplementation:()=>Or});var Pr,Lr=/^(?:([\w.+-]+)@)?([\w_-]+(\.[\w_-]+)+)$/;try{Pr=fetch}catch{}function Or(e){Pr=e}async function Nr(e,t=""){try{const n=`https://${e}/.well-known/nostr.json?name=${t}`,a=await Pr(n,{redirect:"error"});return(await a.json()).names}catch(e){return{}}}async function Rr(e){const t=e.match(Lr);if(!t)return null;const[n,a="_",i]=t;try{const e=`https://${i}/.well-known/nostr.json?name=${a}`,t=await(await Pr(e,{redirect:"error"})).json();let n=t.names[a];return n?{pubkey:n,relays:t.relays?.[n]}:null}catch(e){return null}}async function Ir(e,t){let n=await Rr(t);return!!n&&n.pubkey===e}var zr={};function qr(e){const t={reply:void 0,root:void 0,mentions:[],profiles:[]},n=[];for(const a of e.tags)"e"===a[0]&&a[1]&&n.push(a),"p"===a[0]&&a[1]&&t.profiles.push({pubkey:a[1],relays:a[2]?[a[2]]:[]});for(let e=0;eqr});var Dr={};i(Dr,{fetchRelayInformation:()=>$r,useFetchImplementation:()=>jr});try{fetch}catch{}function jr(e){e}async function $r(e){return await(await fetch(e.replace("ws://","http://").replace("wss://","https://"),{headers:{Accept:"application/nostr+json"}})).json()}var Br={};function Fr(e){let t=0;for(let n=0;n=t)break}return a}i(Br,{getPow:()=>Fr,minePow:()=>Vr});var Ur={};function Hr(e,t,n,a){return Bt({kind:nn,tags:[...e.tags??[],["e",t.id,n],["p",t.pubkey]],content:""===e.content?"":JSON.stringify(t),created_at:e.created_at},a)}function Wr(e){if(e.kind!==nn)return;let t,n;for(let a=e.tags.length-1;a>=0&&(void 0===t||void 0===n);a--){const i=e.tags[a];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t?{id:t[1],relays:[t[2],n?.[2]].filter((e=>"string"==typeof e)),author:n?.[1]}:void 0}function Yr(e,{skipVerification:t}={}){const n=Wr(e);if(void 0===n||""===e.content)return;let a;try{a=JSON.parse(e.content)}catch(e){return}return a.id===n.id&&(t||Ft(a))?a:void 0}i(Ur,{finishRepostEvent:()=>Hr,getRepostedEvent:()=>Yr,getRepostedEventPointer:()=>Wr});var Qr={};i(Qr,{NOSTR_URI_REGEX:()=>Kr,parse:()=>Zr,test:()=>Gr});var Kr=new RegExp(`nostr:(${pi.source})`);function Gr(e){return"string"==typeof e&&new RegExp(`^${Kr.source}$`).test(e)}function Zr(e){const t=e.match(new RegExp(`^${Kr.source}$`));if(!t)throw new Error(`Invalid Nostr URI: ${e}`);return{uri:t[0],value:t[1],decoded:fi(t[1])}}var Jr={};function Xr(e,t,n){const a=t.tags.filter((e=>e.length>=2&&("e"===e[0]||"p"===e[0])));return Bt({...e,kind:an,tags:[...e.tags??[],...a,["e",t.id],["p",t.pubkey]],content:e.content??"+"},n)}function eo(e){if(e.kind!==an)return;let t,n;for(let a=e.tags.length-1;a>=0&&(void 0===t||void 0===n);a--){const i=e.tags[a];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t&&void 0!==n?{id:t[1],relays:[t[2],n[2]].filter((e=>void 0!==e)),author:n[1]}:void 0}i(Jr,{finishReactionEvent:()=>Xr,getReactedEventPointer:()=>eo});var to={};i(to,{matchAll:()=>ao,regex:()=>no,replaceAll:()=>io});var no=()=>new RegExp(`\\b${Kr.source}\\b`,"g");function*ao(e){const t=e.matchAll(no());for(const e of t)try{const[t,n]=e;yield{uri:t,value:n,decoded:fi(n),start:e.index,end:e.index+t.length}}catch(e){}}function io(e,t){return e.replaceAll(no(),((e,n)=>t({uri:e,value:n,decoded:fi(n)})))}var ro={};i(ro,{channelCreateEvent:()=>oo,channelHideMessageEvent:()=>uo,channelMessageEvent:()=>lo,channelMetadataEvent:()=>so,channelMuteUserEvent:()=>co});var oo=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:sn,tags:[...e.tags??[]],content:n,created_at:e.created_at},t)},so=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:ln,tags:[["e",e.channel_create_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},lo=(e,t)=>{const n=[["e",e.channel_create_event_id,e.relay_url,"root"]];return e.reply_to_channel_message_event_id&&n.push(["e",e.reply_to_channel_message_event_id,e.relay_url,"reply"]),Bt({kind:un,tags:[...n,...e.tags??[]],content:e.content,created_at:e.created_at},t)},uo=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:cn,tags:[["e",e.channel_message_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},co=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:dn,tags:[["p",e.pubkey_to_mute],...e.tags??[]],content:n,created_at:e.created_at},t)},ho={};i(ho,{EMOJI_SHORTCODE_REGEX:()=>po,matchAll:()=>mo,regex:()=>fo,replaceAll:()=>go});var po=/:(\w+):/,fo=()=>new RegExp(`\\B${po.source}\\B`,"g");function*mo(e){const t=e.matchAll(fo());for(const e of t)try{const[t,n]=e;yield{shortcode:t,name:n,start:e.index,end:e.index+t.length}}catch(e){}}function go(e,t){return e.replaceAll(fo(),((e,n)=>t({shortcode:e,name:n})))}var vo,bo={};i(bo,{useFetchImplementation:()=>_o,validateGithub:()=>yo});try{vo=fetch}catch{}function _o(e){vo=e}async function yo(e,t,n){try{return await(await vo(`https://gist.github.com/${t}/${n}/raw`)).text()===`Verifying that I control the following Nostr public key: ${e}`}catch(e){return!1}}var wo={};i(wo,{decrypt:()=>ns,encrypt:()=>ts,getConversationKey:()=>Go,v2:()=>as});var ko=(e,t)=>255&e[t++]|(255&e[t++])<<8,xo=class{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,Oi(e=ji(e),32);const t=ko(e,0),n=ko(e,2),a=ko(e,4),i=ko(e,6),r=ko(e,8),o=ko(e,10),s=ko(e,12),l=ko(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|a<<6),this.r[3]=8191&(a>>>7|i<<9),this.r[4]=255&(i>>>4|r<<12),this.r[5]=r>>>1&8190,this.r[6]=8191&(r>>>14|o<<2),this.r[7]=8065&(o>>>11|s<<5),this.r[8]=8191&(s>>>8|l<<8),this.r[9]=l>>>5&127;for(let t=0;t<8;t++)this.pad[t]=ko(e,16+2*t)}process(e,t,n=!1){const a=n?0:2048,{h:i,r:r}=this,o=r[0],s=r[1],l=r[2],u=r[3],c=r[4],d=r[5],h=r[6],p=r[7],f=r[8],m=r[9],g=ko(e,t+0),v=ko(e,t+2),b=ko(e,t+4),_=ko(e,t+6),y=ko(e,t+8),w=ko(e,t+10),k=ko(e,t+12),x=ko(e,t+14);let S=i[0]+(8191&g),C=i[1]+(8191&(g>>>13|v<<3)),E=i[2]+(8191&(v>>>10|b<<6)),T=i[3]+(8191&(b>>>7|_<<9)),A=i[4]+(8191&(_>>>4|y<<12)),M=i[5]+(y>>>1&8191),P=i[6]+(8191&(y>>>14|w<<2)),L=i[7]+(8191&(w>>>11|k<<5)),O=i[8]+(8191&(k>>>8|x<<8)),N=i[9]+(x>>>5|a),R=0,I=R+S*o+C*(5*m)+E*(5*f)+T*(5*p)+A*(5*h);R=I>>>13,I&=8191,I+=M*(5*d)+P*(5*c)+L*(5*u)+O*(5*l)+N*(5*s),R+=I>>>13,I&=8191;let z=R+S*s+C*o+E*(5*m)+T*(5*f)+A*(5*p);R=z>>>13,z&=8191,z+=M*(5*h)+P*(5*d)+L*(5*c)+O*(5*u)+N*(5*l),R+=z>>>13,z&=8191;let q=R+S*l+C*s+E*o+T*(5*m)+A*(5*f);R=q>>>13,q&=8191,q+=M*(5*p)+P*(5*h)+L*(5*d)+O*(5*c)+N*(5*u),R+=q>>>13,q&=8191;let D=R+S*u+C*l+E*s+T*o+A*(5*m);R=D>>>13,D&=8191,D+=M*(5*f)+P*(5*p)+L*(5*h)+O*(5*d)+N*(5*c),R+=D>>>13,D&=8191;let j=R+S*c+C*u+E*l+T*s+A*o;R=j>>>13,j&=8191,j+=M*(5*m)+P*(5*f)+L*(5*p)+O*(5*h)+N*(5*d),R+=j>>>13,j&=8191;let $=R+S*d+C*c+E*u+T*l+A*s;R=$>>>13,$&=8191,$+=M*o+P*(5*m)+L*(5*f)+O*(5*p)+N*(5*h),R+=$>>>13,$&=8191;let B=R+S*h+C*d+E*c+T*u+A*l;R=B>>>13,B&=8191,B+=M*s+P*o+L*(5*m)+O*(5*f)+N*(5*p),R+=B>>>13,B&=8191;let F=R+S*p+C*h+E*d+T*c+A*u;R=F>>>13,F&=8191,F+=M*l+P*s+L*o+O*(5*m)+N*(5*f),R+=F>>>13,F&=8191;let V=R+S*f+C*p+E*h+T*d+A*c;R=V>>>13,V&=8191,V+=M*u+P*l+L*s+O*o+N*(5*m),R+=V>>>13,V&=8191;let U=R+S*m+C*f+E*p+T*h+A*d;R=U>>>13,U&=8191,U+=M*c+P*u+L*l+O*s+N*o,R+=U>>>13,U&=8191,R=(R<<2)+R|0,R=R+I|0,I=8191&R,R>>>=13,z+=R,i[0]=I,i[1]=z,i[2]=q,i[3]=D,i[4]=j,i[5]=$,i[6]=B,i[7]=F,i[8]=V,i[9]=U}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let a=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=a,a=e[t]>>>13,e[t]&=8191;e[0]+=5*a,a=e[0]>>>13,e[0]&=8191,e[1]+=a,a=e[1]>>>13,e[1]&=8191,e[2]+=a,n[0]=e[0]+5,a=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+a,a=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(1^a)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let r=e[0]+t[0];e[0]=65535&r;for(let n=1;n<8;n++)r=(e[n]+t[n]|0)+(r>>>16)|0,e[n]=65535&r}update(e){Ni(this);const{buffer:t,blockLen:n}=this,a=(e=ji(e)).length;for(let i=0;i>>0,e[i++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}};var So=function(e){const t=(t,n)=>e(n).update(ji(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new xo(e))),Co=Di("expand 16-byte k"),Eo=Di("expand 32-byte k"),To=zi(Co),Ao=zi(Eo);function Mo(e,t){return e<>>32-t}function Po(e){return e.byteOffset%4==0}var Lo=64,Oo=16,No=2**32-1,Ro=new Uint32Array;function Io(e,t){const{allowShortKeys:n,extendNonceFn:a,counterLength:i,counterRight:r,rounds:o}=function(e,t){if(null==t||"object"!=typeof t)throw new Error("options must be defined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return Mi(i),Mi(o),Pi(r),Pi(n),(t,s,l,u,c=0)=>{Oi(t),Oi(s),Oi(l);const d=l.length;if(u||(u=new Uint8Array(d)),Oi(u),Mi(c),c<0||c>=No)throw new Error("arx: counter overflow");if(u.length=No)throw new Error("arx: counter overflow");const m=Math.min(Lo,l-f);if(d&&m===Lo){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n0;)h.pop().fill(0);return u}}function zo(e,t,n,a,i,r=20){let o=e[0],s=e[1],l=e[2],u=e[3],c=t[0],d=t[1],h=t[2],p=t[3],f=t[4],m=t[5],g=t[6],v=t[7],b=i,_=n[0],y=n[1],w=n[2],k=o,x=s,S=l,C=u,E=c,T=d,A=h,M=p,P=f,L=m,O=g,N=v,R=b,I=_,z=y,q=w;for(let e=0;e{e.update(t);const n=t.length%16;n&&e.update(jo.subarray(n))},Bo=new Uint8Array(32);function Fo(e,t,n,a,i){const r=e(t,n,Bo),o=So.create(r);i&&$o(o,i),$o(o,a);const s=new Uint8Array(16),l=qi(s);Fi(l,0,BigInt(i?i.length:0),!0),Fi(l,8,BigInt(a.length),!0),o.update(s);const u=o.digest();return r.fill(0),u}var Vo=e=>(t,n,a)=>{const i=16;return Oi(t,32),Oi(n),{encrypt:(r,o)=>{const s=r.length,l=s+i;o?Oi(o,l):o=new Uint8Array(l),e(t,n,r,o,1);const u=Fo(e,t,n,o.subarray(0,-16),a);return o.set(u,s),o},decrypt:(r,o)=>{const s=r.length,l=s-i;if(sa?e.create().update(n).digest():n);for(let e=0;enew Uo(e,t).update(n).digest();Ho.create=(e,t)=>new Uo(e,t);var Wo=new Uint8Array([0]),Yo=new Uint8Array;var Qo=1,Ko=65535;function Go(e,t){const n=Ie.getSharedSecret(e,"02"+t).subarray(1,33);return a=Et,i=n,r="nip44-v2",bt.hash(a),void 0===r&&(r=new Uint8Array(a.outputLen)),Ho(a,st(r),st(i));var a,i,r}function Zo(e,t){const n=function(e,t,n,a=32){if(bt.hash(e),bt.number(a),a>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const i=Math.ceil(a/e.outputLen);void 0===n&&(n=Yo);const r=new Uint8Array(i*e.outputLen),o=Ho.create(e,t),s=o._cloneInto(),l=new Uint8Array(o.outputLen);for(let t=0;tKo)throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");const t=new Uint8Array(2);return new DataView(t.buffer).setUint16(0,e,!1),t}(n),t,new Uint8Array(Jo(n)-n))}function es(e,t,n){if(32!==n.length)throw new Error("AAD associated data must be 32 bytes");const a=lt(n,t);return Ho(Et,e,a)}function ts(e,t,n=dt(32)){const{chacha_key:a,chacha_nonce:i,hmac_key:r}=Zo(t,n),o=Xo(e),s=qo(a,i,o),l=es(r,s,n);return Xa.encode(lt(new Uint8Array([2]),n,s,l))}function ns(e,t){const{nonce:n,ciphertext:a,mac:i}=function(e){if("string"!=typeof e)throw new Error("payload must be a valid string");const t=e.length;if(t<132||t>87472)throw new Error("invalid payload length: "+t);if("#"===e[0])throw new Error("unknown encryption version");let n;try{n=Xa.decode(e)}catch(e){throw new Error("invalid base64: "+e.message)}const a=n.length;if(a<99||a>65603)throw new Error("invalid data length: "+a);const i=n[0];if(2!==i)throw new Error("unknown encryption version "+i);return{nonce:n.subarray(1,33),ciphertext:n.subarray(33,-32),mac:n.subarray(-32)}}(e),{chacha_key:r,chacha_nonce:o,hmac_key:s}=Zo(t,n);if(!$i(es(s,a,n),i))throw new Error("invalid MAC");return function(e){const t=new DataView(e.buffer).getUint16(0),n=e.subarray(2,2+t);if(tKo||n.length!==t||e.length!==2+Jo(t))throw new Error("invalid padding");return At.decode(n)}(qo(r,o,a))}var as={utils:{getConversationKey:Go,calcPaddedLen:Jo},encrypt:ts,decrypt:ns},is={};function rs(e){const{pathname:t,searchParams:n}=new URL(e),a=t,i=n.get("relay"),r=n.get("secret");if(!a||!i||!r)throw new Error("invalid connection string");return{pubkey:a,relay:i,secret:r}}async function os(e,t,n){const a={method:"pay_invoice",params:{invoice:n}},i=await Er(t,e,JSON.stringify(a)),r={kind:Bn,created_at:Math.round(Date.now()/1e3),content:i,tags:[["p",e]]};return Bt(r,t)}i(is,{makeNwcRequestEvent:()=>os,parseConnectionString:()=>rs});var ss,ls={};i(ls,{getZapEndpoint:()=>cs,makeZapReceipt:()=>ps,makeZapRequest:()=>ds,useFetchImplementation:()=>us,validateZapRequest:()=>hs});try{ss=fetch}catch{}function us(e){ss=e}async function cs(e){try{let t="",{lud06:n,lud16:a}=JSON.parse(e.content);if(n){let{words:e}=ci.decode(n,1e3),a=ci.fromWords(e);t=At.decode(a)}else{if(!a)return null;{let[e,n]=a.split("@");t=new URL(`/.well-known/lnurlp/${e}`,`https://${n}`).toString()}}let i=await ss(t),r=await i.json();if(r.allowsNostr&&r.nostrPubkey)return r.callback}catch(e){}return null}function ds({profile:e,event:t,amount:n,relays:a,comment:i=""}){if(!n)throw new Error("amount not given");if(!e)throw new Error("profile not given");let r={kind:9734,created_at:Math.round(Date.now()/1e3),content:i,tags:[["p",e],["amount",n.toString()],["relays",...a]]};return t&&r.tags.push(["e",t]),r}function hs(e){let t;try{t=JSON.parse(e)}catch(e){return"Invalid zap request JSON."}if(!ft(t))return"Zap request is not a valid Nostr event.";if(!Ft(t))return"Invalid signature on zap request.";let n=t.tags.find((([e,t])=>"p"===e&&t));if(!n)return"Zap request doesn't have a 'p' tag.";if(!n[1].match(/^[a-f0-9]{64}$/))return"Zap request 'p' tag is not valid hex.";let a=t.tags.find((([e,t])=>"e"===e&&t));return a&&!a[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find((([e,t])=>"relays"===e&&t))?null:"Zap request doesn't have a 'relays' tag."}function ps({zapRequest:e,preimage:t,bolt11:n,paidAt:a}){let i=JSON.parse(e),r=i.tags.filter((([e])=>"e"===e||"p"===e||"a"===e)),o={kind:9735,created_at:Math.round(a.getTime()/1e3),content:"",tags:[...r,["P",i.pubkey],["bolt11",n],["description",e]]};return t&&o.tags.push(["preimage",t]),o}var fs={};i(fs,{getToken:()=>vs,hashPayload:()=>Ss,unpackEventFromToken:()=>_s,validateEvent:()=>Es,validateEventKind:()=>ws,validateEventMethodTag:()=>xs,validateEventPayloadTag:()=>Cs,validateEventTimestamp:()=>ys,validateEventUrlTag:()=>ks,validateToken:()=>bs});var ms,gs="Nostr ";async function vs(e,t,n,a=!1,i){const r={kind:Un,tags:[["u",e],["method",t]],created_at:Math.round((new Date).getTime()/1e3),content:""};i&&r.tags.push(["payload",Ss(i)]);const o=await n(r);return(a?gs:"")+Xa.encode(Mt.encode(JSON.stringify(o)))}async function bs(e,t,n){const a=await _s(e).catch((e=>{throw e}));return await Es(a,t,n).catch((e=>{throw e}))}async function _s(e){if(!e)throw new Error("Missing token");e=e.replace(gs,"");const t=At.decode(Xa.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}function ys(e){return!!e.created_at&&Math.round((new Date).getTime()/1e3)-e.created_at<60}function ws(e){return e.kind===Un}function ks(e,t){const n=e.tags.find((e=>"u"===e[0]));return!!n&&(n.length>0&&n[1]===t)}function xs(e,t){const n=e.tags.find((e=>"method"===e[0]));return!!n&&(n.length>0&&n[1].toLowerCase()===t.toLowerCase())}function Ss(e){return rt(Et(Mt.encode(JSON.stringify(e))))}function Cs(e,t){const n=e.tags.find((e=>"payload"===e[0]));if(!n)return!1;const a=Ss(t);return n.length>0&&n[1]===a}async function Es(e,t,n,a){if(!Ft(e))throw new Error("Invalid nostr event, signature invalid");if(!ws(e))throw new Error("Invalid nostr event, kind invalid");if(!ys(e))throw new Error("Invalid nostr event, created_at timestamp invalid");if(!ks(e,t))throw new Error("Invalid nostr event, url tag invalid");if(!xs(e,n))throw new Error("Invalid nostr event, method tag invalid");if(Boolean(a)&&"object"==typeof a&&Object.keys(a).length>0&&!Cs(e,a))throw new Error("Invalid nostr event, payload tag does not match request body hash");return!0}return ms=r,((i,r,o,s)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let l of n(r))a.call(i,l)||l===o||e(i,l,{get:()=>r[l],enumerable:!(s=t(r,l))||s.enumerable});return i})(e({},"__esModule",{value:!0}),ms)})();function eventReactionWebocket(e){localUrl="",reaction=localStorage.getItem("lnbits.reactions"),reaction&&"None"!==reaction&&("http:"!==location.protocol?localUrl="wss://"+location.host+"/api/v1/ws/"+e:localUrl="ws://"+location.host+"/api/v1/ws/"+e,connection=new WebSocket(localUrl),connection.onmessage=function(e){try{if(JSON.parse(e.data).payment.amount<0)return;reaction=localStorage.getItem("lnbits.reactions"),reaction&&window[reaction.split("|")[1]]()}catch(e){console.log(e)}})}function confettiBothSides(){document.getElementById("vue").disabled=!0;var e=Date.now()+2e3,t=["#FFD700","#ffffff"];!function n(){confetti({particleCount:2,angle:60,spread:55,origin:{x:0},colors:t,zIndex:999999}),confetti({particleCount:2,angle:120,spread:55,origin:{x:1},colors:t,zIndex:999999}),Date.now(){e.substring(0,n.length)===n&&(t=n)})),null==t)throw"Malformed request: unknown prefix";let n=decodeAmount(e.substring(t.length,e.length));return{prefix:t,amount:n}}function decodeData(e,t){let n=e.substring(0,7),a=bech32ToInt(n),i=e.substring(e.length-104,e.length),r=e.substring(7,e.length-104),o=decodeTags(r),s=bech32ToFiveBitArray(n+r);return s=fiveBitArrayTo8BitArray(s,!0),s=textToHexString(t).concat(byteArrayToHexString(s)),{time_stamp:a,tags:o,signature:decodeSignature(i),signing_data:s}}function decodeSignature(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n=t[t.length-1];return{r:byteArrayToHexString(t.slice(0,32)),s:byteArrayToHexString(t.slice(32,t.length-1)),recovery_flag:n}}function decodeAmount(e){let t=e.charAt(e.length-1),n=e.substring(0,e.length-1);if("0"===n.substring(0,1))throw"Malformed request: amount cannot contain leading zeros";if(n=Number(n),n<0||!Number.isInteger(n))throw"Malformed request: amount must be a positive decimal integer";switch(t){case"":return"Any amount";case"p":return n/10;case"n":return 100*n;case"u":return 1e5*n;case"m":return 1e8*n;default:throw"Malformed request: undefined amount multiplier"}}function decodeTags(e){let t=extractTags(e),n=[];return t.forEach((e=>n.push(decodeTag(e.type,e.length,e.data)))),n}function extractTags(e){let t=[];for(;e.length>0;){let n=e.charAt(0),a=bech32ToInt(e.substring(1,3)),i=e.substring(3,a+3);t.push({type:n,length:a,data:i}),e=e.substring(3+a,e.length)}return t}function decodeTag(e,t,n){switch(e){case"p":if(52!==t)break;return{type:e,length:t,description:"payment_hash",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"d":return{type:e,length:t,description:"description",value:bech32ToUTF8String(n)};case"n":if(53!==t)break;return{type:e,length:t,description:"payee_public_key",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"h":if(52!==t)break;return{type:e,length:t,description:"description_hash",value:n};case"x":return{type:e,length:t,description:"expiry",value:bech32ToInt(n)};case"c":return{type:e,length:t,description:"min_final_cltv_expiry",value:bech32ToInt(n)};case"f":let a=bech32ToFiveBitArray(n.charAt(0))[0];if(a<0||a>18)break;return{type:e,length:t,description:"fallback_address",value:{version:a,fallback_address:n=n.substring(1,n.length)}};case"r":let i=(n=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n))).slice(0,33),r=n.slice(33,41),o=n.slice(41,45),s=n.slice(45,49),l=n.slice(49,51);return{type:e,length:t,description:"routing_information",value:{public_key:byteArrayToHexString(i),short_channel_id:byteArrayToHexString(r),fee_base_msat:byteArrayToInt(o),fee_proportional_millionths:byteArrayToInt(s),cltv_expiry_delta:byteArrayToInt(l)}}}}function polymod(e){let t=[996825010,642813549,513874426,1027748829,705979059],n=1;return e.forEach((e=>{let a=n>>25;n=(33554431&n)<<5^e;for(let e=0;e<5;e++)n^=1==(a>>e&1)?t[e]:0})),n}function expand(e){let t=[];for(let n=0;n>5);t.push(0);for(let n=0;n delta]",status:"Status",notification_source:"Benachrichtigungsquelle",notification_source_label:"Quell-URL (verwenden Sie nur die offizielle LNbits-Statusquelle und Quellen, denen Sie vertrauen können)",more:"mehr",less:"weniger",releases:"Veröffentlichungen",killswitch:"Killswitch",watchdog:"Wachhund",server_logs:"Serverprotokolle",ip_blocker:"IP-Sperre",security:"Sicherheit",security_tools:"Sicherheitstools",block_access_hint:"Zugriff per IP sperren",allow_access_hint:"Zugriff durch IP erlauben (überschreibt blockierte IPs)",enter_ip:"Geben Sie die IP ein und drücken Sie die Eingabetaste",rate_limiter:"Ratenbegrenzer",wallet_limiter:"Geldbeutel-Limiter",wallet_limit_max_withdraw_per_day:"Maximales tägliches Wallet-Auszahlungslimit in Sats (0 zum Deaktivieren)",wallet_max_ballance:"Maximales Guthaben der Wallet in Sats (0 zum Deaktivieren)",wallet_limit_secs_between_trans:"Mindestsekunden zwischen Transaktionen pro Wallet (0 zum Deaktivieren)",number_of_requests:"Anzahl der Anfragen",time_unit:"Zeiteinheit",minute:"Minute",second:"Sekunde",hour:"Stunde",disable_server_log:"Server-Log deaktivieren",enable_server_log:"Serverprotokollierung aktivieren",coming_soon:"Funktion demnächst verfügbar",session_has_expired:"Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",instant_access_question:"Möchten Sie sofortigen Zugang?",login_with_user_id:"Mit Benutzer-ID anmelden",or:"oder",create_new_wallet:"Neue Geldbörse erstellen",login_to_account:"Melden Sie sich bei Ihrem Konto an",create_account:"Konto erstellen",account_settings:"Kontoeinstellungen",signin_with_google:"Mit Google anmelden",signin_with_github:"Anmelden mit GitHub",signin_with_keycloak:"Mit Keycloak anmelden",username_or_email:"Benutzername oder E-Mail",password:"Passwort",password_config:"Passwortkonfiguration",password_repeat:"Passwortwiederholung",change_password:"Passwort ändern",set_password:"Passwort festlegen",invalid_password:"Das Passwort muss mindestens 8 Zeichen haben.",login:"Anmelden",register:"Registrieren",username:"Benutzername",user_id:"Benutzer-ID",email:"E-Mail",first_name:"Vorname",last_name:"Nachname",picture:"Bild",verify_email:"E-Mail verifizieren mit",account:"Konto",update_account:"Konto aktualisieren",invalid_username:"Ungültiger Benutzername",auth_provider:"Anbieter für Authentifizierung",my_account:"Mein Konto",back:"Zurück",logout:"Abmelden",look_and_feel:"Aussehen und Verhalten",language:"Sprache",color_scheme:"Farbschema",extension_cost:"Diese Version erfordert eine Zahlung von mindestens {cost} Sats.",extension_paid_sats:"Sie haben bereits {paid_sats} Sats bezahlt.",release_details_error:"Kann die Details zur Veröffentlichung nicht abrufen.",pay_from_wallet:"Zahlen aus dem Geldbeutel",show_qr:"QR anzeigen",retry_install:"Installieren erneut versuchen",new_payment:"Neue Zahlung vornehmen",hide_empty_wallets:"Leere Geldbörsen verbergen"},window.localisation.en={confirm:"Yes",server:"Server",theme:"Theme",funding:"Funding",users:"Users",apps:"Apps",channels:"Channels",transactions:"Transactions",dashboard:"Dashboard",node:"Node",export_users:"Export Users",no_users:"No users found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Biggest Channel Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Number of Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",open_channel:"Open Channel",open:"Open",close_channel:"Close Channel",close:"Close",restart:"Restart server",save:"Save",save_tooltip:"Save your changes",topup:"Topup",topup_wallet:"Topup a wallet",topup_hint:"Use the wallet ID to topup any wallet",restart_tooltip:"Restart the server for changes to take effect",add_funds_tooltip:"Add funds to a wallet.",reset_defaults:"Reset to defaults",reset_defaults_tooltip:"Delete all settings and reset to defaults.",download_backup:"Download database backup",name_your_wallet:"Name your {name} wallet",wallet_topup_ok:"Success creating virtual funds ({amount} sats). Payments depend on actual funds on funding source.",paste_invoice_label:"Paste an invoice, payment request or lnurl code *",lnbits_description:"Easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! You can run LNbits for yourself, or easily offer a custodian solution for others. Each wallet has its own API keys and there is no limit to the number of wallets you can make. Being able to partition funds makes LNbits a useful tool for money management and as a development tool. Extensions add extra functionality to LNbits so you can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage people to develop and submit their own.",export_to_phone:"Export to Phone with QR Code",export_to_phone_desc:"This QR code contains your wallet URL with full access. You can scan it from your phone to open your wallet from there.",wallets:"Wallets",add_wallet:"Add a new wallet",delete_wallet:"Delete wallet",delete_wallet_desc:"This whole wallet will be deleted, the funds will be UNRECOVERABLE.",rename_wallet:"Rename wallet",update_name:"Update name",fiat_tracking:"Fiat tracking",currency:"Currency",update_currency:"Update currency",press_to_claim:"Press to claim bitcoin",donate:"Donate",view_github:"View on GitHub",voidwallet_active:"VoidWallet is active! Payments disabled",use_with_caution:"USE WITH CAUTION - {name} wallet is still in BETA",service_fee:"Service fee: {amount} % per transaction",service_fee_max:"Service fee: {amount} % per transaction (max {max} sats)",service_fee_tooltip:"Service fee charged by the LNbits server admin per outgoing transaction",toggle_darkmode:"Toggle Dark Mode",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs",api_docs:"API docs",api_keys_api_docs:"Node URL, API keys and API docs",lnbits_version:"LNbits version",runs_on:"Runs on",credit_hint:"Press Enter to credit account",credit_label:"{denomination} to credit",paste:"Paste",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request",create_invoice:"Create Invoice",camera_tooltip:"Use camera to scan an invoice/QR",export_csv:"Export to CSV",chart_tooltip:"Show chart",pending:"Pending",copy_invoice:"Copy invoice",withdraw_from:"Withdraw from",cancel:"Cancel",scan:"Scan",read:"Read",pay:"Pay",memo:"Memo",date:"Date",processing_payment:"Processing payment...",not_enough_funds:"Not enough funds!",search_by_tag_memo_amount:"Search by tag, memo, amount",invoice_waiting:"Invoice waiting to be paid",payment_received:"Payment Received",payment_sent:"Payment Sent",receive:"receive",send:"send",outgoing_payment_pending:"Outgoing payment pending",drain_funds:"Drain Funds",drain_funds_desc:"This is an LNURL-withdraw QR code for slurping everything from this wallet. Do not share with anyone. It is compatible with balanceCheck and balanceNotify so your wallet may keep pulling the funds continuously from here after the first withdraw.",i_understand:"I understand",copy_wallet_url:"Copy wallet URL",disclaimer_dialog_title:"Important!",disclaimer_dialog:"You *must* save your login credentials to be able to access your wallet again. If you lose them, you will lose access to your wallet and funds.\n\nFind your login credentials on your account settings page.\n\nThis service is in BETA. LNbits holds no responsibility for loss of access to funds.",no_transactions:"No transactions made yet",manage:"Manage",extensions:"Extensions",no_extensions:"You don't have any extensions installed :(",created:"Created",search_extensions:"Search extensions",warning:"Warning",repository:"Repository",confirm_continue:"Are you sure you want to continue?",manage_extension_details:"Install/uninstall extension",install:"Install",uninstall:"Uninstall",drop_db:"Remove Data",enable:"Enable",pay_to_enable:"Pay To Enable",enable_extension_details:"Enable extension for current user",disable:"Disable",installed:"Installed",activated:"Activated",deactivated:"Deactivated",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable for users",featured:"Featured",all:"All",only_admins_can_install:"(Only admin accounts can install extensions)",admin_only:"Admin Only",new_version:"New Version",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings coming soon",extension_installed_version:"Installed version",extension_uninstall_warning:"You are about to remove the extension for all users.",uninstall_confirm:"Yes, Uninstall",extension_db_drop_info:"All data for the extension will be permanently deleted. There is no way to undo this operation!",extension_db_drop_warning:"You are about to remove all data for the extension. Please type the extension name to continue:",extension_min_lnbits_version:"This release requires at least LNbits version",payment_hash:"Payment Hash",fee:"Fee",amount:"Amount",amount_sats:"Amount (sats)",tag:"Tag",unit:"Unit",description:"Description",expiry:"Expiry",webhook:"Webhook",payment_proof:"Payment Proof",update_available:"Update {version} available!",latest_update:"You are on the latest version {version}.",notifications:"Notifications",no_notifications:"No notifications",notifications_disabled:"LNbits status notifications are disabled.",enable_notifications:"Enable Notifications",enable_notifications_desc:"If enabled it will fetch the latest LNbits Status updates, like security incidents and updates.",enable_killswitch:"Enable Killswitch",enable_killswitch_desc:"If enabled it will change your funding source to VoidWallet automatically if LNbits sends out a killswitch signal. You will need to enable manually after an update.",killswitch_interval:"Killswitch Interval",killswitch_interval_desc:"How often the background task should check for the LNbits killswitch signal from the status source (in minutes).",enable_watchdog:"Enable Watchdog",enable_watchdog_desc:"If enabled it will change your funding source to VoidWallet automatically if your balance is lower than the LNbits balance. You will need to enable manually after an update.",watchdog_interval:"Watchdog Interval",watchdog_interval_desc:"How often the background task should check for a killswitch signal in the watchdog delta [node_balance - lnbits_balance] (in minutes).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Limit before killswitch changes funding source to VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use the official LNbits status source, and sources you can trust)",more:"more",less:"less",releases:"Releases",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Server Logs",ip_blocker:"IP Blocker",security:"Security",security_tools:"Security tools",block_access_hint:"Block access by IP",allow_access_hint:"Allow access by IP (will override blocked IPs)",enter_ip:"Enter IP and hit enter",rate_limiter:"Rate Limiter",wallet_limiter:"Wallet Limiter",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Wallet max balance in sats (0 to disable)",wallet_limit_secs_between_trans:"Min secs between transactions per wallet (0 to disable)",number_of_requests:"Number of requests",time_unit:"Time unit",minute:"minute",second:"second",hour:"hour",disable_server_log:"Disable Server Log",enable_server_log:"Enable Server Log",coming_soon:"Feature coming soon",session_has_expired:"Your session has expired. Please login again.",instant_access_question:"Want instant access?",login_with_user_id:"Login with user ID",or:"or",create_new_wallet:"Create New Wallet",login_to_account:"Login to your account",create_account:"Create account",account_settings:"Account Settings",signin_with_nostr:"Continue with Nostr",signin_with_google:"Sign in with Google",signin_with_github:"Sign in with GitHub",signin_with_keycloak:"Sign in with Keycloak",username_or_email:"Username or Email",password:"Password",password_config:"Password Config",password_repeat:"Password repeat",change_password:"Change Password",update_credentials:"Update Credentials",update_pubkey:"Update Public Key",set_password:"Set Password",invalid_password:"Password must have at least 8 characters",login:"Login",register:"Register",username:"Username",pubkey:"Public Key",user_id:"User ID",email:"Email",first_name:"First Name",last_name:"Last Name",picture:"Picture",verify_email:"Verify email with",account:"Account",update_account:"Update Account",invalid_username:"Invalid Username",auth_provider:"Auth Provider",my_account:"My Account",back:"Back",logout:"Logout",look_and_feel:"Look and Feel",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",language:"Language",color_scheme:"Color Scheme",extension_cost:"This release requires a payment of minimum {cost} sats.",extension_paid_sats:"You have already paid {paid_sats} sats.",release_details_error:"Cannot get the release details.",pay_from_wallet:"Pay from Wallet",wallet_required:"Wallet *",show_qr:"Show QR",retry_install:"Retry Install",new_payment:"Make New Payment",update_payment:"Update Payment",already_paid_question:"Have you already paid?",sell:"Sell",sell_require:"Ask payment to enable extension",sell_info:"The {name} extension requires a payment of minimum {amount} sats to enable.",hide_empty_wallets:"Hide empty wallets",recheck:"Recheck",contributors:"Contributors",license:"License",reset_key:"Reset Key",reset_password:"Reset Password"},window.localisation.es={confirm:"Sí",server:"Servidor",theme:"Tema",funding:"Financiación",users:"Usuarios",apps:"Aplicaciones",channels:"Canales",transactions:"Transacciones",dashboard:"Tablero de instrumentos",node:"Nodo",export_users:"Exportar Usuarios",no_users:"No se encontraron usuarios",total_capacity:"Capacidad Total",avg_channel_size:"Tamaño Medio del Canal",biggest_channel_size:"Tamaño del Canal Más Grande",smallest_channel_size:"Tamaño de canal más pequeño",number_of_channels:"Número de canales",active_channels:"Canales activos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Abierto",open:"Abrir",close_channel:"Cerrar canal",close:"Cerrar",restart:"Reiniciar el servidor",save:"Guardar",save_tooltip:"Guardar cambios",topup:"Recargar",topup_wallet:"Recargar billetera",topup_hint:"Utilice el ID de billetera para recargar cualquier billetera",restart_tooltip:"Reinicie el servidor para aplicar los cambios",add_funds_tooltip:"Agregue fondos a una billetera.",reset_defaults:"Restablecer",reset_defaults_tooltip:"Borrar todas las configuraciones y restablecer a los valores predeterminados.",download_backup:"Descargar copia de seguridad de la base de datos",name_your_wallet:"Nombre de su billetera {name}",wallet_topup_ok:"Éxito creando fondos virtuales ({amount} sats). Los pagos dependen de los fondos reales en la fuente de financiación.",paste_invoice_label:"Pegue la factura aquí",lnbits_description:"Fácil de instalar y liviano, LNbits puede ejecutarse en cualquier fuente de financiación de la red Lightning y hasta LNbits mismo! Puede ejecutar LNbits para usted mismo o ofrecer una solución competente a otros. Cada billetera tiene su propia clave API y no hay límite para la cantidad de billeteras que puede crear. La capacidad de particionar fondos hace de LNbits una herramienta útil para la administración de fondos y como herramienta de desarrollo. Las extensiones agregan funcionalidad adicional a LNbits, por lo que puede experimentar con una variedad de tecnologías de vanguardia en la red Lightning. Lo hemos hecho lo más simple posible para desarrollar extensiones y, como un proyecto gratuito y de código abierto, animamos a las personas a que se desarrollen a sí mismas y envíen sus propios contribuciones.",export_to_phone:"Exportar a teléfono con código QR",export_to_phone_desc:"Este código QR contiene su URL de billetera con acceso completo. Puede escanearlo desde su teléfono para abrir su billetera allí.",wallets:"Billeteras",add_wallet:"Agregar nueva billetera",delete_wallet:"Eliminar billetera",delete_wallet_desc:"Esta billetera completa se eliminará, los fondos son IRREVERSIBLES.",rename_wallet:"Cambiar el nombre de la billetera",update_name:"Actualizar nombre",fiat_tracking:"Seguimiento Fiat",currency:"Moneda",update_currency:"Actualizar moneda",press_to_claim:"Presione para reclamar Bitcoin",donate:"Donar",view_github:"Ver en GitHub",voidwallet_active:"¡VoidWallet está activo! Pagos desactivados",use_with_caution:"USAR CON CUIDADO - {name} Wallet aún está en BETA",service_fee:"Tarifa de servicio: {amount} % por transacción",service_fee_max:"Tarifa de servicio: {amount} % por transacción (máx {max} sats)",service_fee_tooltip:"Comisión de servicio cobrada por el administrador del servidor LNbits por cada transacción saliente",toggle_darkmode:"Cambiar modo oscuro",payment_reactions:"Reacciones de Pago",view_swagger_docs:"Ver documentación de API de LNbits Swagger",api_docs:"Documentación de API",api_keys_api_docs:"URL del nodo, claves de API y documentación de API",lnbits_version:"Versión de LNbits",runs_on:"Corre en",credit_hint:"Presione Enter para cargar la cuenta",credit_label:"Cargar {denomination}",paste:"Pegar",paste_from_clipboard:"Pegar desde el portapapeles",paste_request:"Pegar solicitud",create_invoice:"Crear factura",camera_tooltip:"Utilice la cámara para escanear una factura / código QR",export_csv:"Exportar a CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendiente",copy_invoice:"Copiar factura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Leer",pay:"Pagar",memo:"Memo",date:"Fecha",processing_payment:"Procesando pago ...",not_enough_funds:"¡No hay suficientes fondos!",search_by_tag_memo_amount:"Buscar por etiqueta, memo, cantidad",invoice_waiting:"Factura esperando pago",payment_received:"Pago recibido",payment_sent:"Pago enviado",receive:"recibir",send:"enviar",outgoing_payment_pending:"Pago saliente pendiente",drain_funds:"Drenar fondos",drain_funds_desc:"Este es un código QR LNURL-withdraw para drenar todos los fondos de esta billetera. No lo comparta con nadie. Es compatible con balanceCheck y balanceNotify, por lo que su billetera puede continuar drenando los fondos de aquí después del primer drenaje.",i_understand:"Lo entiendo",copy_wallet_url:"Copiar URL de billetera",disclaimer_dialog_title:"¡Importante!",disclaimer_dialog:"La funcionalidad de inicio de sesión se lanzará en una actualización futura, por ahora, asegúrese de guardar esta página como marcador para acceder a su billetera en el futuro. Este servicio está en BETA y no asumimos ninguna responsabilidad por personas que pierdan el acceso a sus fondos.",no_transactions:"No hay transacciones todavía",manage:"Administrar",extensions:"Extensiones",no_extensions:"No tienes extensiones instaladas :(",created:"Creado",search_extensions:"Extensiones de búsqueda",warning:"Advertencia",repository:"Repositorio",confirm_continue:"¿Está seguro de que desea continuar?",manage_extension_details:"Instalar/desinstalar extensión",install:"Instalar",uninstall:"Desinstalar",drop_db:"Eliminar datos",enable:"Habilitar",enable_extension_details:"Habilitar extensión para el usuario actual",disable:"Deshabilitar",installed:"Instalado",activated:"Activado",deactivated:"Desactivado",release_notes:"Notas de la versión",activate_extension_details:"Hacer que la extensión esté disponible/no disponible para los usuarios",featured:"Destacado",all:"Todos",only_admins_can_install:"(Solo las cuentas de administrador pueden instalar extensiones)",admin_only:"Solo administradores",new_version:"Nueva Versión",extension_depends_on:"Depende de:",extension_rating_soon:"Calificaciones próximamente",extension_installed_version:"Versión instalada",extension_uninstall_warning:"Está a punto de eliminar la extensión para todos los usuarios.",uninstall_confirm:"Sí, desinstalar",extension_db_drop_info:"Todos los datos para la extensión se eliminarán permanentemente. ¡No hay manera de deshacer esta operación!",extension_db_drop_warning:"Está a punto de eliminar todos los datos para la extensión. Por favor, escriba el nombre de la extensión para continuar:",extension_min_lnbits_version:"Esta versión requiere al menos una versión de LNbits",payment_hash:"Hash de pago",fee:"Cuota",amount:"Cantidad",tag:"Etiqueta",unit:"Unidad",description:"Descripción",expiry:"Expiración",webhook:"Webhook",payment_proof:"Prueba de pago",update_available:"¡Actualización {version} disponible!",latest_update:"Usted está en la última versión {version}.",notifications:"Notificaciones",no_notifications:"No hay notificaciones",notifications_disabled:"Las notificaciones de estado de LNbits están desactivadas.",enable_notifications:"Activar notificaciones",enable_notifications_desc:"Si está activado, buscará las últimas actualizaciones del estado de LNbits, como incidentes de seguridad y actualizaciones.",enable_killswitch:"Activar Killswitch",enable_killswitch_desc:"Si está activado, cambiará automáticamente su fuente de financiamiento a VoidWallet si LNbits envía una señal de parada de emergencia. Necesitará activarlo manualmente después de una actualización.",killswitch_interval:"Intervalo de Killswitch",killswitch_interval_desc:"Con qué frecuencia la tarea en segundo plano debe verificar la señal de interruptor de emergencia de LNbits desde la fuente de estado (en minutos).",enable_watchdog:"Activar Watchdog",enable_watchdog_desc:"Si está activado, cambiará automáticamente su fuente de financiamiento a VoidWallet si su saldo es inferior al saldo de LNbits. Tendrá que activarlo manualmente después de una actualización.",watchdog_interval:"Intervalo de vigilancia",watchdog_interval_desc:"Con qué frecuencia la tarea de fondo debe verificar la señal de killswitch en el delta del watchdog [node_balance - lnbits_balance] (en minutos).",watchdog_delta:"Vigilante Delta",watchdog_delta_desc:"Límite antes de que el interruptor de apagado cambie la fuente de financiamiento a VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fuente de notificación",notification_source_label:"URL de origen (solo use la fuente oficial de estado de LNbits y fuentes en las que confíe)",more:"más",less:"menos",releases:"Lanzamientos",killswitch:"Interruptor de apagado",watchdog:"Perro guardián",server_logs:"Registros del Servidor",ip_blocker:"Bloqueador de IP",security:"Seguridad",security_tools:"Herramientas de seguridad",block_access_hint:"Bloquear acceso por IP",allow_access_hint:"Permitir acceso por IP (anulará las IPs bloqueadas)",enter_ip:"Ingrese la IP y presione enter",rate_limiter:"Limitador de tasa",wallet_limiter:"Limitador de Cartera",wallet_limit_max_withdraw_per_day:"Límite diario de retiro de la cartera en sats (0 para deshabilitar)",wallet_max_ballance:"Saldo máximo de la billetera en sats (0 para desactivar)",wallet_limit_secs_between_trans:"Mín. segs entre transacciones por cartera (0 para desactivar)",number_of_requests:"Número de solicitudes",time_unit:"Unidad de tiempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desactivar registro del servidor",enable_server_log:"Activar registro del servidor",coming_soon:"Función próximamente disponible",session_has_expired:"Tu sesión ha expirado. Por favor, inicia sesión de nuevo.",instant_access_question:"¿Quieres acceso instantáneo?",login_with_user_id:"Iniciar sesión con ID de usuario",or:"o",create_new_wallet:"Crear Nueva Cartera",login_to_account:"Inicie sesión en su cuenta",create_account:"Crear cuenta",account_settings:"Configuración de la cuenta",signin_with_google:"Inicia sesión con Google",signin_with_github:"Inicia sesión con GitHub",signin_with_keycloak:"Iniciar sesión con Keycloak",username_or_email:"Nombre de usuario o correo electrónico",password:"Contraseña",password_config:"Configuración de Contraseña",password_repeat:"Repetición de contraseña",change_password:"Cambiar contraseña",set_password:"Establecer contraseña",invalid_password:"La contraseña debe tener al menos 8 caracteres.",login:"Iniciar sesión",register:"Registrarse",username:"Nombre de usuario",user_id:"Identificación de usuario",email:"Correo electrónico",first_name:"Nombre de pila",last_name:"Apellido",picture:"Imagen",verify_email:"Verifique el correo electrónico con",account:"Cuenta",update_account:"Actualizar cuenta",invalid_username:"Nombre de usuario inválido",auth_provider:"Proveedor de Autenticación",my_account:"Mi cuenta",back:"Atrás",logout:"Cerrar sesión",look_and_feel:"Apariencia",language:"Idioma",color_scheme:"Esquema de colores",extension_cost:"Esta versión requiere un pago mínimo de {cost} sats.",extension_paid_sats:"Ya has pagado {paid_sats} sats.",release_details_error:"No se pueden obtener los detalles de la versión.",pay_from_wallet:"Pagar desde la billetera",show_qr:"Mostrar QR",retry_install:"Reintentar Instalación",new_payment:"Realizar nuevo pago",hide_empty_wallets:"Ocultar billeteras vacías"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",funding:"Financement",users:"Utilisateurs",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",topup:"Renflouer",topup_wallet:"Reflouer un portefeuille",topup_hint:"Utilisez l'ID du portefeuille pour recharger n'importe quel portefeuille",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",wallet_topup_ok:"Succès de la création de fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",processing_payment:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_min_lnbits_version:"Cette version nécessite au moins LNbits version",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_killswitch:"Activer le Killswitch",enable_killswitch_desc:"Si activé, il changera automatiquement votre source de financement en VoidWallet si LNbits envoie un signal de coupure. Vous devrez activer manuellement après une mise à jour.",killswitch_interval:"Intervalle du Killswitch",killswitch_interval_desc:"À quelle fréquence la tâche de fond doit-elle vérifier le signal d'arrêt d'urgence LNbits provenant de la source de statut (en minutes).",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",killswitch:"Interrupteur d'arrêt",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",language:"Langue",color_scheme:"Schéma de couleurs",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",hide_empty_wallets:"Masquer les portefeuilles vides"},window.localisation.it={confirm:"Sì",server:"Server",theme:"Tema",funding:"Funding",users:"Utenti",apps:"Applicazioni",channels:"Canali",transactions:"Transazioni",dashboard:"Pannello di controllo",node:"Interruttore",export_users:"Esporta utenti",no_users:"Nessun utente trovato",total_capacity:"Capacità Totale",avg_channel_size:"Dimensione media del canale",biggest_channel_size:"Dimensione del canale più grande",smallest_channel_size:"Dimensione Più Piccola del Canale",number_of_channels:"Numero di Canali",active_channels:"Canali Attivi",connect_peer:"Connetti Peer",connect:"Connetti",open_channel:"Canale aperto",open:"Apri",close_channel:"Chiudi Canale",close:"Chiudi",restart:"Riavvia il server",save:"Salva",save_tooltip:"Salva le modifiche",topup:"Ricarica",topup_wallet:"Ricarica un portafoglio",topup_hint:"Usa l'ID del portafoglio per ricaricare qualsiasi portafoglio",restart_tooltip:"Riavvia il server affinché le modifiche abbiano effetto",add_funds_tooltip:"Aggiungere fondi a un portafoglio",reset_defaults:"Ripristina le impostazioni predefinite",reset_defaults_tooltip:"Cancella tutte le impostazioni e ripristina i valori predefiniti",download_backup:"Scarica il backup del database",name_your_wallet:"Dai un nome al tuo portafoglio {name}",wallet_topup_ok:"Operazione riuscita nella creazione di fondi virtuali ({amount} sats). I pagamenti dipendono dai fondi effettivi sulla fonte di finanziamento.",paste_invoice_label:"Incolla una fattura, una richiesta di pagamento o un codice lnurl *",lnbits_description:"Leggero e facile da configurare, LNbits può funzionare su qualsiasi fonte di finanziamento Lightning Network e persino LNbits stesso! Potete gestire LNbits per conto vostro o offrire facilmente una soluzione di custodia per altri. Ogni portafoglio ha le proprie chiavi API e non c'è limite al numero di portafogli che si possono creare. La possibilità di suddividere i fondi rende LNbits uno strumento utile per la gestione del denaro e come strumento di sviluppo. Le estensioni aggiungono ulteriori funzionalità a LNbits, consentendo di sperimentare una serie di tecnologie all'avanguardia sulla rete Lightning. Abbiamo reso lo sviluppo delle estensioni il più semplice possibile e, in quanto progetto libero e open-source, incoraggiamo le persone a sviluppare e inviare le proprie",export_to_phone:"Esportazione su telefono con codice QR",export_to_phone_desc:"Questo codice QR contiene l'URL del portafoglio con accesso da amministratore. È possibile scansionarlo dal telefono per aprire il portafoglio da lì.",wallets:"Portafogli",add_wallet:"Aggiungi un nuovo portafoglio",delete_wallet:"Elimina il portafoglio",delete_wallet_desc:"L'intero portafoglio sarà cancellato, i fondi saranno irrecuperabili",rename_wallet:"Rinomina il portafoglio",update_name:"Aggiorna il nome",fiat_tracking:"Tracciamento Fiat",currency:"Valuta",update_currency:"Aggiorna valuta",press_to_claim:"Premi per richiedere bitcoin",donate:"Donazioni",view_github:"Visualizza su GitHub",voidwallet_active:"VoidWallet è attivo! Pagamenti disabilitati",use_with_caution:"USARE CON CAUTELA - {name} portafoglio è ancora in BETA",service_fee:"Commissione di servizio: {amount} % per transazione",service_fee_max:"Commissione di servizio: {amount} % per transazione (max {max} sats)",service_fee_tooltip:"Commissione di servizio addebitata dall'amministratore del server LNbits per ogni transazione in uscita",toggle_darkmode:"Attiva la modalità notturna",payment_reactions:"Reazioni al Pagamento",view_swagger_docs:"Visualizza i documentazione dell'API Swagger di LNbits",api_docs:"Documentazione dell'API",api_keys_api_docs:"URL del nodo, chiavi API e documentazione API",lnbits_version:"Versione di LNbits",runs_on:"Esegue su",credit_hint:"Premere Invio per accreditare i fondi",credit_label:"{denomination} da accreditare",paste:"Incolla",paste_from_clipboard:"Incolla dagli appunti",paste_request:"Richiesta di pagamento",create_invoice:"Crea fattura",camera_tooltip:"Usa la fotocamera per scansionare la fattura/QR",export_csv:"Esporta CSV",chart_tooltip:"Mostra grafico",pending:"In attesa",copy_invoice:"Copia fattura",withdraw_from:"Prelevare da",cancel:"Annulla",scan:"Scansiona",read:"Leggi",pay:"Paga",memo:"Memo",date:"Dati",processing_payment:"Elaborazione pagamento...",not_enough_funds:"Non ci sono abbastanza fondi!",search_by_tag_memo_amount:"Cerca per tag, memo, importo...",invoice_waiting:"Fattura in attesa di pagamento",payment_received:"Pagamento ricevuto",payment_sent:"Pagamento inviato",receive:"ricevere",send:"inviare",outgoing_payment_pending:"Pagamento in uscita in attesa",drain_funds:"Fondi di drenaggio",drain_funds_desc:"Questo è un codice QR LNURL-withdraw per prelevare tutti i fondi da questo portafoglio. Non condividerlo con nessuno. È compatibile con balanceCheck e balanceNotify, di conseguenza il vostro portafoglio può continuare a prelevare continuamente i fondi da qui dopo il primo prelievo",i_understand:"Ho capito",copy_wallet_url:"Copia URL portafoglio",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"La funzionalità di login sarà rilasciata in un futuro aggiornamento; per ora, assicuratevi di salvare tra i preferiti questa pagina per accedere nuovamente in futuro a questo portafoglio! Questo servizio è in fase BETA e non ci assumiamo alcuna responsabilità per la perdita all'accesso dei fondi",no_transactions:"Nessuna transazione effettuata",manage:"Gestisci",extensions:"Estensioni",no_extensions:"Non ci sono estensioni installate :(",created:"Creato",search_extensions:"Estensioni di ricerca",warning:"Attenzione",repository:"Deposito",confirm_continue:"Sei sicuro di voler continuare?",manage_extension_details:"Installa/disinstalla estensione",install:"Installare",uninstall:"Disinstalla",drop_db:"Rimuovi Dati",enable:"Abilita",enable_extension_details:"Attiva l'estensione per l'utente corrente",disable:"Disabilita",installed:"Installato",activated:"Attivato",deactivated:"Disattivato",release_notes:"Note di Rilascio",activate_extension_details:"Rendi l'estensione disponibile/non disponibile per gli utenti",featured:"In primo piano",all:"Tutto",only_admins_can_install:"Solo gli account amministratore possono installare estensioni.",admin_only:"Solo amministratore",new_version:"Nuova Versione",extension_depends_on:"Dipende da:",extension_rating_soon:"Valutazioni in arrivo",extension_installed_version:"Versione installata",extension_uninstall_warning:"Stai per rimuovere l'estensione per tutti gli utenti.",uninstall_confirm:"Sì, Disinstalla",extension_db_drop_info:"Tutti i dati relativi all'estensione saranno cancellati permanentemente. Non c'è modo di annullare questa operazione!",extension_db_drop_warning:"Stai per rimuovere tutti i dati per l'estensione. Digita il nome dell'estensione per continuare:",extension_min_lnbits_version:"Questa versione richiede almeno la versione LNbits",payment_hash:"Hash del pagamento",fee:"Tariffa",amount:"Importo",tag:"Etichetta",unit:"Unità",description:"Descrizione",expiry:"Scadenza",webhook:"Webhook",payment_proof:"Prova di pagamento",update_available:"Aggiornamento {version} disponibile!",latest_update:"Sei sulla versione più recente {version}.",notifications:"Notifiche",no_notifications:"Nessuna notifica",notifications_disabled:"Le notifiche di stato di LNbits sono disattivate.",enable_notifications:"Attiva le notifiche",enable_notifications_desc:"Se attivato, recupererà gli ultimi aggiornamenti sullo stato di LNbits, come incidenti di sicurezza e aggiornamenti.",enable_killswitch:"Attiva Killswitch",enable_killswitch_desc:"Se attivato, cambierà automaticamente la tua fonte di finanziamento in VoidWallet se LNbits invia un segnale di killswitch. Dovrai attivare manualmente dopo un aggiornamento.",killswitch_interval:"Intervallo Killswitch",killswitch_interval_desc:"Quanto spesso il compito in background dovrebbe controllare il segnale di killswitch LNbits dalla fonte di stato (in minuti).",enable_watchdog:"Attiva Watchdog",enable_watchdog_desc:"Se abilitato, cambierà automaticamente la tua fonte di finanziamento in VoidWallet se il tuo saldo è inferiore al saldo LNbits. Dovrai abilitarlo manualmente dopo un aggiornamento.",watchdog_interval:"Intervallo Watchdog",watchdog_interval_desc:"Quanto spesso il task in background dovrebbe controllare un segnale di killswitch nel delta del watchdog [node_balance - lnbits_balance] (in minuti).",watchdog_delta:"Guardiano Delta",watchdog_delta_desc:"Limite prima che l'interruttore di sicurezza modifichi la fonte di finanziamento in VoidWallet [lnbits_balance - node_balance > delta]",status:"Stato",notification_source:"Sorgente di notifica",notification_source_label:"URL sorgente (utilizzare solo la fonte ufficiale di stato LNbits e fonti di cui ti puoi fidare)",more:"più",less:"meno",releases:"Pubblicazioni",killswitch:"Interruttore di spegnimento",watchdog:"Cane da guardia",server_logs:"Registri del server",ip_blocker:"Blocco IP",security:"Sicurezza",security_tools:"Strumenti di sicurezza",block_access_hint:"Blocca l'accesso per IP",allow_access_hint:"Consenti l'accesso per IP (sovrascriverà gli IP bloccati)",enter_ip:"Inserisci l'IP e premi invio",rate_limiter:"Limitatore di frequenza",wallet_limiter:"Limitatore del Portafoglio",wallet_limit_max_withdraw_per_day:"Prelievo massimo giornaliero dal portafoglio in sats (0 per disabilitare)",wallet_max_ballance:"Saldo massimo del portafoglio in sats (0 per disabilitare)",wallet_limit_secs_between_trans:"Minuti e secondi tra transazioni per portafoglio (0 per disabilitare)",number_of_requests:"Numero di richieste",time_unit:"Unità di tempo",minute:"minuto",second:"secondo",hour:"ora",disable_server_log:"Disabilita Registro Server",enable_server_log:"Attiva Registro Server",coming_soon:"Caratteristica in arrivo prossimamente",session_has_expired:"La tua sessione è scaduta. Per favore, effettua nuovamente il login.",instant_access_question:"Vuoi accesso immediato?",login_with_user_id:"Accedi con ID utente",or:"oppure",create_new_wallet:"Crea nuovo portafoglio",login_to_account:"Accedi al tuo account",create_account:"Crea un account",account_settings:"Impostazioni dell'account",signin_with_google:"Accedi con Google",signin_with_github:"Accedi con GitHub",signin_with_keycloak:"Accedi con Keycloak",username_or_email:"Nome utente o Email",password:"Password",password_config:"Configurazione della password",password_repeat:"Ripeti la password",change_password:"Cambia Password",set_password:"Imposta password",invalid_password:"La password deve contenere almeno 8 caratteri",login:"Accesso",register:"Registrati",username:"Nome utente",user_id:"ID utente",email:"Email",first_name:"Nome",last_name:"Cognome",picture:"Immagine",verify_email:"Verifica email con",account:"Conto",update_account:"Aggiorna Account",invalid_username:"Nome utente non valido",auth_provider:"Provider di Autenticazione",my_account:"Il mio account",back:"Indietro",logout:"Esci",look_and_feel:"Aspetto e Comportamento",language:"Lingua",color_scheme:"Schema dei colori",extension_cost:"Questa versione richiede un pagamento minimo di {cost} satoshi.",extension_paid_sats:"Hai già pagato {paid_sats} sats.",release_details_error:"Impossibile ottenere i dettagli della versione.",pay_from_wallet:"Paga dal Portafoglio",show_qr:"Mostra QR",retry_install:"Riprova Installazione",new_payment:"Effettua Nuovo Pagamento",hide_empty_wallets:"Nascondi portafogli vuoti"},window.localisation.jp={confirm:"はい",server:"サーバー",theme:"テーマ",funding:"資金調達",users:"ユーザー",apps:"アプリ",channels:"チャンネル",transactions:"トランザクション",dashboard:"ダッシュボード",node:"ノード",export_users:"ユーザーのエクスポート",no_users:"ユーザーが見つかりません",total_capacity:"合計容量",avg_channel_size:"平均チャンネルサイズ",biggest_channel_size:"最大チャネルサイズ",smallest_channel_size:"最小チャンネルサイズ",number_of_channels:"チャンネル数",active_channels:"アクティブチャンネル",connect_peer:"ピアを接続",connect:"接続",open_channel:"オープンチャンネル",open:"開く",close_channel:"チャンネルを閉じる",close:"閉じる",restart:"サーバーを再起動する",save:"保存",save_tooltip:"変更を保存する",topup:"トップアップ",topup_wallet:"ウォレットをトップアップする",topup_hint:"ウォレットIDを使用して、任意のウォレットをトップアップできます",restart_tooltip:"サーバーを再起動して変更を適用します",add_funds_tooltip:"ウォレットに資金を追加します。",reset_defaults:"リセット",reset_defaults_tooltip:"すべての設定を削除してデフォルトに戻します。",download_backup:"データベースのバックアップをダウンロードする",name_your_wallet:"あなたのウォレットの名前 {name}",wallet_topup_ok:"仮想資金の作成に成功しました({amount} sats)。支払いは資金ソースの実際の資金に依存します。",paste_invoice_label:"請求書を貼り付けてください",lnbits_description:"簡単にインストールでき、軽量なLNbitsは、あらゆるライトニングネットワークの資金源と、LNbits自身でさえも実行できます!LNbitsを個人で実行することも、他人に対してカストディアンソリューションをで実行できます! LNbitsを自分で実行することも、他の人に優れたソリューションを提供することもできます。各ウォレットには独自のAPIキーがあり、作成できるウォレットの数に制限はありません。資金を分割する機能は、LNbitsを資金管理ツールとして使用したり、開発ツールとして使用したりするための便利なツールです。拡張機能は、LNbitsに追加の機能を追加します。そのため、LNbitsは最先端の技術をネットワークLightningで試すことができます。拡張機能を開発するのは簡単で、無料でオープンソースのプロジェクトであるため、人々が自分で開発し、自分の貢献を送信することを奨励しています。",export_to_phone:"電話にエクスポート",export_to_phone_desc:"ウォレットを電話にエクスポートすると、ウォレットを削除する前にウォレットを復元できます。ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",wallets:"ウォレット",add_wallet:"ウォレットを追加",delete_wallet:"ウォレットを削除",delete_wallet_desc:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",rename_wallet:"ウォレットの名前を変更",update_name:"名前を更新",fiat_tracking:"フィアット追跡",currency:"通貨",update_currency:"通貨を更新する",press_to_claim:"クレームするには押してください",donate:"寄付",view_github:"GitHubで表示",voidwallet_active:"Voidwalletアクティブ",use_with_caution:"注意して使用してください - {name} ウォレットはまだベータ版です",service_fee:"取引ごとのサービス手数料: {amount} %",service_fee_max:"取引手数料:{amount}%(最大{max}サトシ)",service_fee_tooltip:"LNbitsサーバー管理者が発生する送金ごとの手数料",toggle_darkmode:"ダークモードを切り替える",payment_reactions:"支払いの反応",view_swagger_docs:"Swaggerドキュメントを表示",api_docs:"APIドキュメント",api_keys_api_docs:"ノードURL、APIキー、APIドキュメント",lnbits_version:"LNbits バージョン",runs_on:"で実行",credit_hint:"クレジットカードを使用して資金を追加するには、LNbitsを使用してください。",credit_label:"{denomination} をクレジットに",paste:"貼り付け",paste_from_clipboard:"クリップボードから貼り付け",paste_request:"リクエストを貼り付ける",create_invoice:"請求書を作成する",camera_tooltip:"QRコードを読み取る",export_csv:"CSVでエクスポート",chart_tooltip:"チャートを表示するには、グラフの上にカーソルを合わせます",pending:"保留中",copy_invoice:"請求書をコピー",withdraw_from:"出金",cancel:"キャンセル",scan:"スキャン",read:"読む",pay:"支払う",memo:"メモ",date:"日付",processing_payment:"支払い処理中",not_enough_funds:"資金が不足しています",search_by_tag_memo_amount:"タグ、メモ、金額で検索",invoice_waiting:"請求書を待っています",payment_received:"お支払いありがとうございます",payment_sent:"支払いが完了しました",receive:"受け取る",send:"送信",outgoing_payment_pending:"支払い保留中",drain_funds:"資金を排出する",drain_funds_desc:"ウォレットの残高をすべて他のウォレットに送金します",i_understand:"理解した",copy_wallet_url:"ウォレットURLをコピー",disclaimer_dialog_title:"重要!",disclaimer_dialog:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。ウォレットを削除する前に、ウォレットをエクスポートしてください。",no_transactions:"トランザクションはありません",manage:"管理",extensions:"拡張機能",no_extensions:"拡張機能はありません",created:"作成済み",search_extensions:"検索拡張機能",warning:"警告",repository:"リポジトリ",confirm_continue:"続行してもよろしいですか?",manage_extension_details:"拡張機能のインストール/アンインストール",install:"インストール",uninstall:"アンインストール",drop_db:"データを削除",enable:"有効",enable_extension_details:"現在のユーザーの拡張機能を有効にする",disable:"無効",installed:"インストール済み",activated:"有効化",deactivated:"無効化",release_notes:"リリースノート",activate_extension_details:"拡張機能をユーザーが利用できるようにする/利用できないようにする",featured:"特集",all:"すべて",only_admins_can_install:"(管理者アカウントのみが拡張機能をインストールできます)",admin_only:"管理者のみ",new_version:"新しいバージョン",extension_depends_on:"依存先:",extension_rating_soon:"評価は近日公開",extension_installed_version:"インストール済みバージョン",extension_uninstall_warning:"すべてのユーザーの拡張機能を削除しようとしています.",uninstall_confirm:"はい、アンインストールします",extension_db_drop_info:"エクステンションのすべてのデータが完全に削除されます。この操作を元に戻す方法はありません!",extension_db_drop_warning:"エクステンションのすべてのデータを削除しようとしています。続行するには、エクステンションの名前を入力してください:",extension_min_lnbits_version:"このリリースには少なくとも LNbits バージョンが必要です",payment_hash:"支払いハッシュ",fee:"料金",amount:"量",tag:"タグ",unit:"単位",description:"説明",expiry:"有効期限",webhook:"ウェブフック",payment_proof:"支払い証明",update_available:"アップデート{version}が利用可能です!",latest_update:"あなたは最新バージョン{version}を使用しています。",notifications:"通知",no_notifications:"通知はありません",notifications_disabled:"LNbitsステータス通知は無効です。",enable_notifications:"通知を有効にする",enable_notifications_desc:"有効にすると、セキュリティインシデントやアップデートのような最新のLNbitsステータス更新を取得します。",enable_killswitch:"キルスイッチを有効にする",enable_killswitch_desc:"有効にすると、LNbitsからキルスイッチ信号が送信された場合に自動的に資金源をVoidWalletに切り替えます。更新後には手動で有効にする必要があります。",killswitch_interval:"キルスイッチ間隔",killswitch_interval_desc:"バックグラウンドタスクがステータスソースからLNbitsキルスイッチ信号を確認する頻度(分単位)。",enable_watchdog:"ウォッチドッグを有効にする",enable_watchdog_desc:"有効にすると、残高がLNbitsの残高より少ない場合に、資金源を自動的にVoidWalletに変更します。アップデート後は手動で有効にする必要があります。",watchdog_interval:"ウォッチドッグ・インターバル",watchdog_interval_desc:"バックグラウンドタスクがウォッチドッグデルタ[node_balance - lnbits_balance]でキルスイッチシグナルを確認する頻度(分単位)。",watchdog_delta:"ウォッチドッグデルタ",watchdog_delta_desc:"キルスイッチが資金源をVoidWalletに変更する前の限界 [lnbits_balance - node_balance > delta]",status:"ステータス",notification_source:"通知ソース",notification_source_label:"ソースURL(公式のLNbitsステータスソースのみを使用し、信頼できるソースのみを利用してください)",more:"より多くの",less:"少ない",releases:"リリース",killswitch:"キルスイッチ",watchdog:"ウォッチドッグ",server_logs:"サーバーログ",ip_blocker:"IPブロッカー",security:"セキュリティ",security_tools:"セキュリティツール",block_access_hint:"IPによるアクセスをブロック",allow_access_hint:"IPによるアクセスを許可する(ブロックされたIPを上書きします)",enter_ip:"IPを入力してエンターキーを押してください",rate_limiter:"レートリミッター",wallet_limiter:"ウォレットリミッター",wallet_limit_max_withdraw_per_day:"1日あたりの最大ウォレット出金額をsatsで入力してください(0 で無効)。",wallet_max_ballance:"ウォレットの最大残高(sats)(0は無効)",wallet_limit_secs_between_trans:"トランザクション間の最小秒数(ウォレットごと)(0は無効)",number_of_requests:"リクエストの数",time_unit:"時間単位",minute:"分",second:"秒",hour:"時間",disable_server_log:"サーバーログを無効にする",enable_server_log:"サーバーログを有効にする",coming_soon:"機能は間もなく登場します",session_has_expired:"あなたのセッションは期限切れです。もう一度ログインしてください。",instant_access_question:"即時アクセスをご希望ですか?",login_with_user_id:"ユーザーIDでログイン",or:"または",create_new_wallet:"新しいウォレットを作成",login_to_account:"アカウントにログインしてください",create_account:"アカウントを作成",account_settings:"アカウント設定",signin_with_google:"Googleでサインイン",signin_with_github:"GitHubでサインイン",signin_with_keycloak:"Keycloakでサインイン",username_or_email:"ユーザー名またはメールアドレス",password:"パスワード",password_config:"パスワード設定",password_repeat:"パスワードの再入力",change_password:"パスワードを変更",set_password:"パスワードを設定",invalid_password:"パスワードは少なくとも8文字必要です",login:"ログイン",register:"登録",username:"ユーザー名",user_id:"ユーザーID",email:"メール",first_name:"名",last_name:"姓",picture:"写真",verify_email:"メールアドレスの確認を行ってください",account:"アカウント",update_account:"アカウントを更新",invalid_username:"無効なユーザー名",auth_provider:"認証プロバイダ",my_account:"マイアカウント",back:"戻る",logout:"ログアウト",look_and_feel:"ルック・アンド・フィール",language:"言語",color_scheme:"カラースキーム",extension_cost:"このリリースには最低 {cost} サトシの支払いが必要です。",extension_paid_sats:"すでに{paid_sats} satsを支払いました。",release_details_error:"リリースの詳細を取得できません。",pay_from_wallet:"ウォレットから支払う",show_qr:"QRを表示",retry_install:"再試行インストール",new_payment:"新しい支払いを作成する",hide_empty_wallets:"空のウォレットを非表示にする"},window.localisation.cn={confirm:"确定",server:"服务器",theme:"主题",funding:"资金",users:"用户",apps:"应用程序",channels:"频道",transactions:"交易记录",dashboard:"控制面板",node:"节点",export_users:"导出用户",no_users:"未找到用户",total_capacity:"总容量",avg_channel_size:"平均频道大小",biggest_channel_size:"最大通道大小",smallest_channel_size:"最小频道尺寸",number_of_channels:"频道数量",active_channels:"活跃频道",connect_peer:"连接对等",connect:"连接",open_channel:"打开频道",open:"打开",close_channel:"关闭频道",close:"关闭",restart:"重新启动服务器",save:"保存",save_tooltip:"保存更改",topup:"充值",topup_wallet:"给钱包充值",topup_hint:"使用钱包ID为任何钱包充值",restart_tooltip:"重新启动服务器以使更改生效",add_funds_tooltip:"为钱包添加资金",reset_defaults:"重置为默认设置",reset_defaults_tooltip:"删除所有设置并重置为默认设置",download_backup:"下载数据库备份",name_your_wallet:"给你的 {name}钱包起个名字",wallet_topup_ok:"成功创建虚拟资金({amount} sats)。付款取决于资金来源的实际资金。",paste_invoice_label:"粘贴发票,付款请求或lnurl*",lnbits_description:"LNbits 设置简单、轻量级,可以在任何闪电网络的资金来源上运行,甚至可以在LNbits自身上运行!您可以为自己运行LNbits,或者轻松为他人提供托管解决方案。每个钱包都有自己的 API 密钥,你可以创建的钱包数量没有限制。能够把资金分开管理使 LNbits 成为一款有用的资金管理和开发工具。扩展程序增加了 LNbits 的额外功能,所以你可以在闪电网络上尝试各种尖端技术。我们已经尽可能简化了开发扩展程序的过程,作为一个免费和开源的项目,我们鼓励人们开发并提交自己的扩展程序。",export_to_phone:"通过二维码导出到手机",export_to_phone_desc:"这个二维码包含您钱包的URL。您可以使用手机扫描的方式打开您的钱包。",wallets:"钱包",add_wallet:"添加新钱包",delete_wallet:"删除钱包",delete_wallet_desc:"整个钱包将被删除,资金将无法恢复",rename_wallet:"重命名钱包",update_name:"更新名称",fiat_tracking:"菲亚特追踪",currency:"货币",update_currency:"更新货币",press_to_claim:"点击领取比特币",donate:"捐献",view_github:"在GitHub上查看",voidwallet_active:"VoidWallet 已激活!付款功能已禁用。",use_with_caution:"请谨慎使用 - {name}钱包还处于测试版阶段",service_fee:"服务费:{amount}% 每笔交易",service_fee_max:"服务费:{amount}% 每笔交易(最高 {max} sats)",service_fee_tooltip:"LNbits服务器管理员每笔外发交易收取的服务费",toggle_darkmode:"切换暗黑模式",payment_reactions:"支付反应",view_swagger_docs:"查看 LNbits Swagger API 文档",api_docs:"API文档",api_keys_api_docs:"节点URL、API密钥和API文档",lnbits_version:"LNbits版本",runs_on:"可运行在",credit_hint:"按 Enter 键充值账户",credit_label:"{denomination} 充值",paste:"粘贴",paste_from_clipboard:"从剪贴板粘贴",paste_request:"粘贴请求",create_invoice:"创建发票",camera_tooltip:"用相机扫描发票/二维码",export_csv:"导出为CSV",chart_tooltip:"显示图表",pending:"待处理",copy_invoice:"复制发票",withdraw_from:"从",cancel:"取消",scan:"扫描",read:"读取",pay:"付款",memo:"备注",date:"日期",processing_payment:"正在处理支付...",not_enough_funds:"资金不足!",search_by_tag_memo_amount:"按标签、备注、金额搜索",invoice_waiting:"待支付的发票",payment_received:"收到付款",payment_sent:"付款已发送",receive:"收款",send:"付款",outgoing_payment_pending:"付款正在等待处理",drain_funds:"清空资金",drain_funds_desc:"这是一个 LNURL-取款的二维码,用于从该钱包中提取全部资金。请不要与他人分享。它与 balanceCheck 和 balanceNotify 兼容,因此在第一次取款后,您的钱包还可能会持续从这里提取资金",i_understand:"我明白",copy_wallet_url:"复制钱包URL",disclaimer_dialog_title:"重要!",disclaimer_dialog:"登录功能将在以后的更新中发布,请将此页面加为书签,以便将来访问您的钱包!此服务处于测试阶段,我们不对资金的丢失承担任何责任。",no_transactions:"尚未进行任何交易",manage:"管理",extensions:"扩展程序",no_extensions:"你没有安装任何扩展程序 :(",created:"已创建",search_extensions:"搜索扩展程序",warning:"警告",repository:"代码库",confirm_continue:"你确定要继续吗?",manage_extension_details:"安装/卸载扩展程序",install:"安装",uninstall:"卸载",drop_db:"删除数据",enable:"启用",enable_extension_details:"为当前用户启用扩展程序",disable:"禁用",installed:"已安装",activated:"已激活",deactivated:"已停用",release_notes:"发布说明",activate_extension_details:"对用户开放或禁用扩展程序",featured:"精选",all:"全部",only_admins_can_install:"(只有管理员账户可以安装扩展)",admin_only:"仅限管理员",new_version:"新版本",extension_depends_on:"依赖于:",extension_rating_soon:"即将推出评分",extension_installed_version:"已安装的版本",extension_uninstall_warning:"您即将对所有用户删除该扩展程序。",uninstall_confirm:"是的,卸载",extension_db_drop_info:"该扩展程序的所有数据将被永久删除。此操作无法撤销!",extension_db_drop_warning:"您即将删除该扩展的所有数据。请继续输入扩展程序名称以确认操作:",extension_min_lnbits_version:"此版本要求最低的 LNbits 版本为",payment_hash:"付款哈希",fee:"费",amount:"金额",tag:"标签",unit:"单位",description:"详情",expiry:"过期时间",webhook:"Webhook",payment_proof:"付款证明",update_available:"更新{version}可用!",latest_update:"您当前使用的是最新版本{version}。",notifications:"通知",no_notifications:"没有通知",notifications_disabled:"LNbits状态通知已禁用。",enable_notifications:"启用通知",enable_notifications_desc:"如果启用,它将获取最新的LNbits状态更新,如安全事件和更新。",enable_killswitch:"启用紧急停止开关",enable_killswitch_desc:"如果启用,当LNbits发送终止信号时,系统将自动将您的资金来源更改为VoidWallet。更新后,您将需要手动启用。",killswitch_interval:"Killswitch 间隔",killswitch_interval_desc:"后台任务应该多久检查一次来自状态源的LNbits断路信号(以分钟为单位)。",enable_watchdog:"启用看门狗",enable_watchdog_desc:"如果启用,当您的余额低于LNbits余额时,系统将自动将您的资金来源更改为VoidWallet。更新后您将需要手动启用。",watchdog_interval:"看门狗间隔",watchdog_interval_desc:"后台任务应该多久检查一次看门狗增量中的 killswitch 信号 [node_balance - lnbits_balance](以分钟计)。",watchdog_delta:"看门狗德尔塔",watchdog_delta_desc:"在触发紧急停止前切换资金来源至VoidWallet的限制 [lnbits_balance - node_balance > delta]",status:"状态",notification_source:"通知来源",notification_source_label:"来源 URL(仅使用官方LNbits状态源和您信任的源)",more:"更多",less:"少",releases:"版本",killswitch:"杀手锏",watchdog:"监控程序",server_logs:"服务器日志",ip_blocker:"IP 阻止器",security:"安全",security_tools:"安全工具",block_access_hint:"屏蔽IP访问",allow_access_hint:"允许通过IP访问(将覆盖被屏蔽的IP)",enter_ip:"输入IP地址并按回车键",rate_limiter:"速率限制器",wallet_limiter:"钱包限制器",wallet_limit_max_withdraw_per_day:"每日钱包最大提现额度(单位:sats)(设为0则禁用)",wallet_max_ballance:"钱包最大余额(以sats计)(设为0则禁用)",wallet_limit_secs_between_trans:"每个钱包交易间最少秒数(设为0则禁用)",number_of_requests:"请求次数",time_unit:"时间单位",minute:"分钟",second:"秒",hour:"小时",disable_server_log:"禁用服务器日志",enable_server_log:"启用服务器日志",coming_soon:"功能即将推出",session_has_expired:"您的会话已过期。请重新登录。",instant_access_question:"想要即时访问吗?",login_with_user_id:"使用用户ID登录",or:"或",create_new_wallet:"创建新钱包",login_to_account:"登录您的账户",create_account:"创建账户",account_settings:"账户设置",signin_with_google:"使用谷歌账号登录",signin_with_github:"使用GitHub登录",signin_with_keycloak:"使用Keycloak登录",username_or_email:"用户名或电子邮箱",password:"密码",password_config:"密码配置",password_repeat:"密码重复",change_password:"修改密码",set_password:"设置密码",invalid_password:"密码至少需要有8个字符",login:"登录",register:"注册",username:"用户名",user_id:"用户ID",email:"电子邮件",first_name:"名字",last_name:"姓氏",picture:"图片",verify_email:"验证电子邮件与",account:"账户",update_account:"更新帐户",invalid_username:"无效用户名",auth_provider:"认证提供者",my_account:"我的账户",back:"返回",logout:"注销",look_and_feel:"外观和感觉",language:"语言",color_scheme:"配色方案",extension_cost:"此版本需要支付最低 {cost} sats。",extension_paid_sats:"您已经支付了{paid_sats} sats。",release_details_error:"无法获取发布详情。",pay_from_wallet:"从钱包支付",show_qr:"显示QR码",retry_install:"重试安装",new_payment:"创建新支付",hide_empty_wallets:"隐藏空钱包"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",funding:"Financiering",users:"Gebruikers",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",topup:"Bijvullen",topup_wallet:"Een portemonnee bijvullen",topup_hint:"Gebruik de portemonnee-ID om elke portemonnee bij te vullen",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",wallet_topup_ok:"Succes met het aanmaken van virtuele fondsen ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",lnbits_version:"LNbits-versie",runs_on:"Draait op",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",processing_payment:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_min_lnbits_version:"Deze release vereist ten minste LNbits-versie",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_killswitch:"Activeer Killswitch",enable_killswitch_desc:"Indien ingeschakeld, zal het uw financieringsbron automatisch wijzigen naar VoidWallet als LNbits een killswitch-signaal verzendt. U zult het na een update handmatig moeten inschakelen.",killswitch_interval:"Uitschakelschakelaar-interval",killswitch_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op het LNbits killswitch signaal van de statusbron (in minuten).",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",killswitch:"Killswitch",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",language:"Taal",color_scheme:"Kleurenschema",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",hide_empty_wallets:"Verberg lege portemonnees"},window.localisation.pi={confirm:"Aye",server:"Cap`n",theme:"Theme",funding:"Funding",users:"Buccaneers",apps:"Arrrrplications",channels:"Channels",transactions:"Pirate Transactions and loot",dashboard:"Arrr-board",node:"Node",export_users:"Export Mateys",no_users:"No swabbies found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Largest Bilge Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Nummer o' Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",open_channel:"Open Channel",open:"Open yer hatches",close_channel:"Shut Yer Gob Channel",close:"Batten down the hatches, we be closin",restart:"Arr, restart Cap`n",save:"Bury Treasure",save_tooltip:"Bury yer changes, matey",topup:"Top up the Chest",topup_wallet:"Add more doubloons to the chest",topup_hint:"Use the chest ID to top up any chest",restart_tooltip:"Restart the Cap`n for changes to take effect, arr!",add_funds_tooltip:"Add doubloons to a chest and make it heavier",reset_defaults:"Reset to Davy Jones Locker",reset_defaults_tooltip:"Scuttle all settings and reset to Davy Jones Locker. Aye, start anew!",download_backup:"Download database booty",name_your_wallet:"Name yer {name} treasure chest",wallet_topup_ok:"Success creatin' virtual funds ({amount} sats). Payments depend on actual funds on funding source.",paste_invoice_label:"Paste a booty, payment request or lnurl code, matey!",lnbits_description:"Arr, easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! Ye can run LNbits for yourself, or easily offer a custodian solution for others. Each chest has its own API keys and there be no limit to the number of chests ye can make. Being able to partition booty makes LNbits a useful tool for money management and as a development tool. Arr, extensions add extra functionality to LNbits so ye can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage scallywags to develop and submit their own.",export_to_phone:"Export to Phone with QR Code, me hearties",export_to_phone_desc:"This QR code contains yer chest URL with full access. Ye can scan it from yer phone to open yer chest from there, arr!",wallets:"Treasure Chests",add_wallet:"Add a new chest and fill it with doubloons!",delete_wallet:"Scuttle the Chest",delete_wallet_desc:"This whole chest will be scuttled, the booty will be UNRECOVERABLE. Aye, be warned!",rename_wallet:"Rename the Chest, me hearty",update_name:"Update name like a captain",fiat_tracking:"Trackin' o' the treasure",currency:"Curr'nsey",update_currency:"Update doubloons",press_to_claim:"Press to claim gold doubloons, matey!",donate:"Donate like a true pirate!",view_github:"View on GitHub and find treasures",voidwallet_active:"VoidWallet be active! Payments disabled",use_with_caution:"USE WITH CAUTION - {name} chest be still in BETA. Aye, be careful!",service_fee:"Service fee: {amount} % per transaction",service_fee_max:"Service fee: {amount} % per transaction (max {max} sats)",service_fee_tooltip:"Service fee charged by the LNbits server admin per goin' transaction",toggle_darkmode:"Toggle Dark Mode, arr!",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs and learn the secrets",api_docs:"API docs for the scallywags",api_keys_api_docs:"Node URL, API keys and API docs",lnbits_version:"LNbits version, arr!",runs_on:"Runs on, matey",credit_hint:"Press Enter to credit account and make it richer",credit_label:"{denomination} to credit, arr!",paste:"Stow",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request and find treasures",create_invoice:"Create Booty Request and get rich, me hearties!",camera_tooltip:"Use spyglass to scan a booty/QR, arr!",export_csv:"Export to CSV and keep track of the booty",chart_tooltip:"Show ye chart, me hearty",pending:"Pendin like a ship at anchor",copy_invoice:"Copy booty request, arrr",withdraw_from:"Withdraw from",cancel:"Abandon ship! We be retreatin",scan:"Avast! Scan me beauty, arrr",read:"Read it, if ye dare",pay:"Pay up or walk the plank, ye scallywag",memo:"Message in a bottle, argh",date:"Date of the map, me matey",processing_payment:"Processing yer payment... don´t make me say it again",not_enough_funds:"Arrr, ye don´t have enough doubloons! Walk the plank!",search_by_tag_memo_amount:"Search by tag, message, or booty amount, savvy",invoice_waiting:"Invoice waiting to be plundered, arrr",payment_received:"Payment Received like a treasure, argh",payment_sent:"Payment Sent, hoist the colors! We´ve got some doubloons!",receive:"booty",send:"hoist",outgoing_payment_pending:"Outgoing payment pending in the port, ye scurvy dog",drain_funds:"Plunder all the doubloons, ye buccaneer",drain_funds_desc:"This be an LNURL-withdraw QR code for slurpin everything from this wallet. Don`t share with anyone. It be compatible with balanceCheck and balanceNotify so yer wallet may keep pullin` the funds continuously from here after the first withdraw.",i_understand:"I understand, yo ho ho and a bottle of rum!",copy_wallet_url:"Copy wallet URL like a map, savvy",disclaimer_dialog_title:"Avast!",disclaimer_dialog:"Login functionality to be released in a future update, for now, make sure ye bookmark this page for future access to your booty! This service be in BETA, and we hold no responsibility for people losing access to doubloons.",no_transactions:"No transactions made yet, me hearties. Belay that!",manage:"Manage, me hearty",extensions:"Yer Extensions, ye scurvy dog",no_extensions:"Ye don't have any extensions installed, ye scallywag :(. Where be yer loot?",created:"Created like a legend, savvy",search_extensions:"Search fer extensions",warning:"Avast",repository:"Repository",confirm_continue:"Be ye sure ye want t' proceed?",manage_extension_details:"Install/uninstall extension",install:"Set sail",uninstall:"Avaast",drop_db:"Scuttle Data",enable:"Enable",enable_extension_details:"Enable extension fer th' current user",disable:"Disablin'",installed:"Installed",activated:"Activated",deactivated:"Deactivated",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable fer users",featured:"Featured",all:"Arr",only_admins_can_install:"(Only admin accounts can install extensions)",admin_only:"Cap'n Only",new_version:"New Version",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings a'comin' soon",extension_installed_version:"Installed version",extension_uninstall_warning:"Ye be about t' remove th' extension fer all hands.",uninstall_confirm:"Aye, Uninstall",extension_db_drop_info:"All data fer th' extension will be permanently deleted. There be no way to undo this operation!",extension_db_drop_warning:"Ye be about to scuttle all data fer th' extension. Please scribble th' extension name to continue:",extension_min_lnbits_version:"This release be needin' at least LNbits version",payment_hash:"Payment Hash like a treasure map, arrr",fee:"Fee like a toll to cross a strait, matey",amount:"Amount of doubloons, arrr",tag:"Tag",unit:"Unit of measurement like a fathom, ye buccaneer",description:"Description like a tale of adventure, arrr",expiry:"Expiry like the food on a ship, ye landlubber",webhook:"Webhook like a fishing line, arrr",payment_proof:"Payment Proof like a seal of authenticity, argh",update_available:"Update {version} available, me matey!",latest_update:"Ye be on th' latest version {version}.",notifications:"Notificashuns",no_notifications:"No noticin's",notifications_disabled:"LNbits status notifications be disabled, arr!",enable_notifications:"Enable Notifications",enable_notifications_desc:"If ye be allowin' it, it'll be fetchin' the latest LNbits Status updates, like security incidents and updates.",enable_killswitch:"Enabl' th' Killswitch",enable_killswitch_desc:"If enabled it'll be changin' yer fundin' source to VoidWallet automatically if LNbits sends out a killswitch signal, ye will. Ye'll be needin' t' enable manually after an update, arr.",killswitch_interval:"Killswitch Interval",killswitch_interval_desc:"How oft th' background task should be checkin' fer th' LNbits killswitch signal from th' status source (in minutes).",enable_watchdog:"Enable Seadog",enable_watchdog_desc:"If enabled, it will swap yer treasure source t' VoidWallet on its own if yer balance be lower than th' LNbits balance. Ye'll need t' enable by hand after an update.",watchdog_interval:"Seadog Interval",watchdog_interval_desc:"How oft th' background task should be checkin' fer a killswitch signal in th' seadog delta [node_balance - lnbits_balance] (in minutes), arr.",watchdog_delta:"Seadog Delta",watchdog_delta_desc:"Limit afore killswitch changes fundin' source to VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use th' official LNbits status source, and sources ye can trust)",more:"Arr, 'tis more.",less:"Arr, 'tis more fewer.",releases:"Releases",killswitch:"Killswitch",watchdog:"Seadog",server_logs:"Server Logs",ip_blocker:"IP Blockar",security:"Securrrity",security_tools:"Securrrity tools",block_access_hint:"Block access by IP",allow_access_hint:"Grant permission by IP (will override barred IPs)",enter_ip:"Enter IP and hit enter",rate_limiter:"Rate Limiter",wallet_limiter:"Pouch Limitar",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Purse max heaviness in sats (0 fer scuttle)",wallet_limit_secs_between_trans:"Min secs 'tween transactions per wallet (0 to disable)",number_of_requests:"Number o' requests",time_unit:"time bein'",minute:"minnit",second:"second",hour:"hour",disable_server_log:"Disabl' {Server} Log",enable_server_log:"Enable Server Log",coming_soon:"Feature comin' soon",session_has_expired:"Yer session has expired. Please login again.",instant_access_question:"Be wantin' quick entry, aye?",login_with_user_id:"Login with user ID",or:"arr",create_new_wallet:"Create New Wallet",login_to_account:"Log in to yer account",create_account:"Create account",account_settings:"Account Settin's",signin_with_google:"Sign in wit' Google",signin_with_github:"Sign in wit' GitHub",signin_with_keycloak:"Sign in wit' Keycloak",username_or_email:"Usarrrname or Email",password:"Passwarrd",password_config:"Passwarrd Config",password_repeat:"Passwarrd repeat",change_password:"Change Passwarrd",set_password:"Set yer Secret Code",invalid_password:"Passwarrd must be havin' at leest 8 charrracters",login:"Log in",register:"Sign on",username:"Username",user_id:"User ID",email:"Email",first_name:"Firrrst Name",last_name:"Surname",picture:"pictur'",verify_email:"Verify email with",account:"Arrrccount",update_account:"Updatin' Arrrccount",invalid_username:"Username be not valid, matey!",auth_provider:"Auth Provider becometh Auth Provider, ye see?",my_account:"Me Arrrccount",back:"Return",logout:"Log out yer session",look_and_feel:"Look and Feel",language:"Langwidge",color_scheme:"Colour Scheme",extension_cost:"This release be needin' a payment o' minimum {cost} sats, arr.",extension_paid_sats:"Ye have already paid {paid_sats} sats.",release_details_error:"Cannot get th' release details.",pay_from_wallet:"Pay from ye Wallet",show_qr:"Show QR",retry_install:"Try 'nstallin' Again",new_payment:"Make New Payment",hide_empty_wallets:"Stow empty wallets"},window.localisation.pl={confirm:"Tak",server:"Serwer",theme:"Motyw",funding:"Finansowanie",users:"Użytkownicy",apps:"Aplikacje",channels:"Kanały",transactions:"Transakcje",dashboard:"Panel kontrolny",node:"Węzeł",export_users:"Eksportuj użytkowników",no_users:"Nie znaleziono użytkowników",total_capacity:"Całkowita Pojemność",avg_channel_size:"Średni rozmiar kanału",biggest_channel_size:"Największy Rozmiar Kanału",smallest_channel_size:"Najmniejszy Rozmiar Kanału",number_of_channels:"Ilość kanałów",active_channels:"Aktywne kanały",connect_peer:"Połącz z węzłem równorzędnym",connect:"Połącz",open_channel:"Otwarty Kanał",open:"Otwórz",close_channel:"Zamknij kanał",close:"Zamknij",restart:"Restart serwera",save:"Zapisz",save_tooltip:"Zapisz zmiany",topup:"Doładowanie",topup_wallet:"Doładuj portfel",topup_hint:"Użyj ID portfela aby go doładować",restart_tooltip:"Zrestartuj serwer aby aktywować zmiany",add_funds_tooltip:"Dodaj środki do portfela.",reset_defaults:"Powrót do ustawień domyślnych",reset_defaults_tooltip:"Wymaż wszystkie ustawienia i ustaw domyślne.",download_backup:"Pobierz kopię zapasową bazy danych",name_your_wallet:"Nazwij swój portfel {name}",wallet_topup_ok:"Sukces w tworzeniu wirtualnych środków ({amount} sats). Płatności zależą od rzeczywistych środków na źródle finansowania.",paste_invoice_label:"Wklej fakturę, żądanie zapłaty lub kod lnurl *",lnbits_description:"Łatwy i lekki w konfiguracji, LNbits może działać w oparciu o dowolne źródło finansowania w sieci lightning czy nawet inną instancję LNbits! Możesz uruchomić instancję LNbits dla siebie lub dla innych. Każdy portfel ma swoje klucze API i nie ma ograniczeń jeśli chodzi o ilość portfeli. LNbits umożliwia dzielenie środków w celu zarządzania nimi, jest również dobrym narzędziem deweloperskim. Rozszerzenia zwiększają funkcjonalność LNbits co umożliwia eksperymentowanie z nowym technologiami w sieci lightning. Tworzenie rozszerzeń jest proste dlatego zachęcamy innych deweloperów do tworzenia dodatkowych funkcjonalności i wysyłanie do nas PR",export_to_phone:"Eksport kodu QR na telefon",export_to_phone_desc:"Ten kod QR zawiera adres URL Twojego portfela z pełnym dostępem do niego. Możesz go zeskanować na swoim telefonie aby otworzyć na nim ten portfel.",wallets:"Portfele",add_wallet:"Dodaj portfel",delete_wallet:"Usuń portfel",delete_wallet_desc:"Ten portfel zostanie usunięty, środków na nim zgromadzonych NIE BĘDZIE MOŻNA ODZYSKAĆ.",rename_wallet:"Zmień nazwę portfela",update_name:"Zaktualizuj nazwę",fiat_tracking:"Śledzenie Fiata",currency:"Waluta",update_currency:"Aktualizuj walutę",press_to_claim:"Naciśnij aby odebrać Bitcoiny",donate:"Podaruj",view_github:"Otwórz GitHub",voidwallet_active:"VoidWallet jest aktywny! Płatności są niemożliwe",use_with_caution:"KORZYSTAJ Z ROZWAGĄ - portfel {name} jest w wersji BETA",service_fee:"Opłata serwisowa: {amount} % za transakcję",service_fee_max:"Opłata serwisowa: {amount} % za transakcję (maks {max} sat)",service_fee_tooltip:"Opłata serwisowa pobierana przez administratora serwera LNbits za każdą wychodzącą transakcję",toggle_darkmode:"Tryb nocny",payment_reactions:"Reakcje na płatność",view_swagger_docs:"Dokumentacja Swagger API",api_docs:"Dokumentacja API",api_keys_api_docs:"Adres URL węzła, klucze API i dokumentacja API",lnbits_version:"Wersja LNbits",runs_on:"Działa na",credit_hint:"Naciśnij Enter aby doładować konto",credit_label:"{denomination} doładowanie",paste:"Wklej",paste_from_clipboard:"Wklej ze schowka",paste_request:"Wklej żądanie",create_invoice:"Utwórz fakturę",camera_tooltip:"Użyj kamery aby zeskanować fakturę lub kod QR",export_csv:"Eksport do CSV",chart_tooltip:"Wykres",pending:"W toku",copy_invoice:"Skopiuj fakturę",withdraw_from:"Wypłać z",cancel:"Anuluj",scan:"Skanuj",read:"Odczytaj",pay:"Zapłać",memo:"Memo",date:"Data",processing_payment:"Przetwarzam płatność...",not_enough_funds:"Brak wystarczających środków!",search_by_tag_memo_amount:"Szukaj po tagu, memo czy wartości",invoice_waiting:"Faktura oczekuje na zapłatę",payment_received:"Otrzymano płatność",payment_sent:"Wysłano płatność",receive:"odbierać",send:"wysłać",outgoing_payment_pending:"Płatność wychodząca w toku",drain_funds:"Opróżnij środki",drain_funds_desc:"To jest kod QR służący do opróżnienia portfela (LNURL-withdraw). Nie udostępniaj go nikomu. Ten kod jest kompatybilny z funkcjami, które umożliwiają wielokrotne żądania aż do zupełnego opróżnienia portfela.",i_understand:"Rozumiem",copy_wallet_url:"Skopiuj URL portfela",disclaimer_dialog_title:"Ważne!",disclaimer_dialog:"Funkcja logowania zostanie uruchomiona w przyszłości. Póki co upewnij się, że zapisałeś adres URL tej strony aby mieć dostęp do tego portfela. Nie udostępniaj adresu tej strony nikomu, kto nie ma mieć do tego portfela dostępu! Ta usługa działa w wersji BETA, nie odpowiadamy za utratę dostępu do środków przez osoby używające LNbits.",no_transactions:"Brak transakcji",manage:"Zarządzaj",extensions:"Rozszerzenia",no_extensions:"Nie masz zainstalowanych żadnych rozszerzeń :(",created:"Utworzono",search_extensions:"Szukaj rozszerzeń",warning:"Ostrzeżenie",repository:"Repozytorium",confirm_continue:"Czy na pewno chcesz kontynuować?",manage_extension_details:"Instaluj/odinstaluj rozszerzenie",install:"Zainstaluj",uninstall:"Odinstaluj",drop_db:"Usuń dane",enable:"Włącz",enable_extension_details:"Włącz rozszerzenie dla aktualnego użytkownika",disable:"Wyłącz",installed:"Zainstalowano",activated:"Aktywowany",deactivated:"Dezaktywowany",release_notes:"Informacje o wydaniu",activate_extension_details:"Udostępnij/nie udostępniaj rozszerzenia użytkownikom",featured:"Polecane",all:"Wszystko",only_admins_can_install:"Tylko konta administratorów mogą instalować rozszerzenia",admin_only:"Tylko dla administratora",new_version:"Nowa wersja",extension_depends_on:"Zależy od:",extension_rating_soon:"Oceny będą dostępne wkrótce",extension_installed_version:"Zainstalowana wersja",extension_uninstall_warning:"Za chwilę usuniesz rozszerzenie dla wszystkich użytkowników.",uninstall_confirm:"Tak, Odinstaluj",extension_db_drop_info:"Wszystkie dane dla rozszerzenia zostaną trwale usunięte. Nie ma sposobu, aby cofnąć tę operację!",extension_db_drop_warning:"Za chwilę usuniesz wszystkie dane dla rozszerzenia. Proszę wpisz nazwę rozszerzenia, aby kontynuować:",extension_min_lnbits_version:"To wymaga przynajmniej wersji LNbits",payment_hash:"Hash Płatności",fee:"Opłata",amount:"Wartość",tag:"Etykieta",unit:"Jednostka",description:"Opis",expiry:"Wygasa",webhook:"Webhook",payment_proof:"Potwierdzenie płatności",update_available:"Aktualizacja {version} dostępna!",latest_update:"Korzystasz z najnowszej wersji {version}.",notifications:"Powiadomienia",no_notifications:"Brak powiadomień",notifications_disabled:"Powiadomienia o statusie LNbits są wyłączone.",enable_notifications:"Włącz powiadomienia",enable_notifications_desc:"Jeśli ta opcja zostanie włączona, będzie pobierać najnowsze informacje o statusie LNbits, takie jak incydenty bezpieczeństwa i aktualizacje.",enable_killswitch:"Włącz Killswitch",enable_killswitch_desc:"Jeśli zostanie włączone, automatycznie zmieni źródło finansowania na VoidWallet, jeśli LNbits wyśle sygnał wyłączający. Po aktualizacji będziesz musiał włączyć to ręcznie.",killswitch_interval:"Interwał wyłącznika awaryjnego",killswitch_interval_desc:"Jak często zadanie w tle powinno sprawdzać sygnał wyłącznika awaryjnego LNbits ze źródła statusu (w minutach).",enable_watchdog:"Włącz Watchdog",enable_watchdog_desc:"Jeśli zostanie włączone, automatycznie zmieni źródło finansowania na VoidWallet, jeśli saldo jest niższe niż saldo LNbits. Po aktualizacji trzeba będzie włączyć ręcznie.",watchdog_interval:"Interwał Watchdog",watchdog_interval_desc:"Jak często zadanie w tle powinno sprawdzać sygnał wyłącznika awaryjnego w delcie strażnika [node_balance - lnbits_balance] (w minutach).",watchdog_delta:"Strażnik Delta",watchdog_delta_desc:"Limit przed aktywacją wyłącznika zmienia źródło finansowania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stan",notification_source:"Źródło powiadomień",notification_source_label:"Adres URL źródła (używaj tylko oficjalnego źródła statusu LNbits oraz źródeł, którym możesz zaufać)",more:"więcej",less:"mniej",releases:"Wydania",killswitch:"Killswitch",watchdog:"Pies gończy",server_logs:"Dzienniki serwera",ip_blocker:"Blokada IP",security:"Bezpieczeństwo",security_tools:"Narzędzia bezpieczeństwa",block_access_hint:"Zablokuj dostęp przez IP",allow_access_hint:"Zezwól na dostęp przez IP (zignoruje zablokowane adresy IP)",enter_ip:"Wpisz adres IP i naciśnij enter",rate_limiter:"Ogranicznik Częstotliwości",wallet_limiter:"Ogranicznik Portfela",wallet_limit_max_withdraw_per_day:"Maksymalna dzienna wypłata z portfela w satoshi (0 aby wyłączyć)",wallet_max_ballance:"Maksymalny stan portfela w satoshi (0 aby wyłączyć)",wallet_limit_secs_between_trans:"Min sekund pomiędzy transakcjami na portfel (0 aby wyłączyć)",number_of_requests:"Liczba żądań",time_unit:"Jednostka czasu",minute:"minuta",second:"sekunda",hour:"godzina",disable_server_log:"Wyłącz log serwera",enable_server_log:"Włącz dziennik serwera",coming_soon:"Funkcja wkrótce będzie dostępna",session_has_expired:"Twoja sesja wygasła. Proszę zaloguj się ponownie.",instant_access_question:"Chcesz mieć natychmiastowy dostęp?",login_with_user_id:"Zaloguj się za pomocą identyfikatora użytkownika",or:"lub",create_new_wallet:"Utwórz nowy portfel",login_to_account:"Zaloguj się do swojego konta",create_account:"Załóż konto",account_settings:"Ustawienia konta",signin_with_google:"Zaloguj się przez Google",signin_with_github:"Zaloguj się przez GitHub",signin_with_keycloak:"Zaloguj się przez Keycloak",username_or_email:"Nazwa użytkownika lub Email",password:"Hasło",password_config:"Konfiguracja Hasła",password_repeat:"Powtórz hasło",change_password:"Zmień hasło",set_password:"Ustaw hasło",invalid_password:"Hasło musi zawierać co najmniej 8 znaków",login:"Logowanie",register:"Zarejestruj",username:"Nazwa użytkownika",user_id:"Identyfikator użytkownika",email:"Email",first_name:"Imię",last_name:"Nazwisko",picture:"Zdjęcie",verify_email:"Zweryfikuj email za pomocą",account:"Konto",update_account:"Aktualizuj konto",invalid_username:"Nieprawidłowa nazwa użytkownika",auth_provider:"Dostawca uwierzytelniania",my_account:"Moje Konto",back:"Wstecz",logout:"Wyloguj",look_and_feel:"Wygląd i zachowanie",language:"Język",color_scheme:"Schemat kolorów",extension_cost:"To niniejsze wydanie wymaga zapłaty minimalnej {cost} satów.",extension_paid_sats:"Już zapłaciłeś {paid_sats} satów.",release_details_error:"Nie można uzyskać szczegółów wydania.",pay_from_wallet:"Zapłać z portfela",show_qr:"Pokaż kod QR",retry_install:"Ponów instalację",new_payment:"Dokonaj nowej płatności",hide_empty_wallets:"Ukryj puste portfele"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",funding:"Financement",users:"Utilisateurs",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",topup:"Renflouer",topup_wallet:"Reflouer un portefeuille",topup_hint:"Utilisez l'ID du portefeuille pour recharger n'importe quel portefeuille",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",wallet_topup_ok:"Succès de la création de fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",processing_payment:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_min_lnbits_version:"Cette version nécessite au moins LNbits version",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_killswitch:"Activer le Killswitch",enable_killswitch_desc:"Si activé, il changera automatiquement votre source de financement en VoidWallet si LNbits envoie un signal de coupure. Vous devrez activer manuellement après une mise à jour.",killswitch_interval:"Intervalle du Killswitch",killswitch_interval_desc:"À quelle fréquence la tâche de fond doit-elle vérifier le signal d'arrêt d'urgence LNbits provenant de la source de statut (en minutes).",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",killswitch:"Interrupteur d'arrêt",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",language:"Langue",color_scheme:"Schéma de couleurs",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",hide_empty_wallets:"Masquer les portefeuilles vides"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",funding:"Financiering",users:"Gebruikers",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",topup:"Bijvullen",topup_wallet:"Een portemonnee bijvullen",topup_hint:"Gebruik de portemonnee-ID om elke portemonnee bij te vullen",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",wallet_topup_ok:"Succes met het aanmaken van virtuele fondsen ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",lnbits_version:"LNbits-versie",runs_on:"Draait op",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",processing_payment:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_min_lnbits_version:"Deze release vereist ten minste LNbits-versie",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_killswitch:"Activeer Killswitch",enable_killswitch_desc:"Indien ingeschakeld, zal het uw financieringsbron automatisch wijzigen naar VoidWallet als LNbits een killswitch-signaal verzendt. U zult het na een update handmatig moeten inschakelen.",killswitch_interval:"Uitschakelschakelaar-interval",killswitch_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op het LNbits killswitch signaal van de statusbron (in minuten).",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",killswitch:"Killswitch",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",language:"Taal",color_scheme:"Kleurenschema",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",hide_empty_wallets:"Verberg lege portemonnees"},window.localisation.we={confirm:"Ydw",server:"Gweinydd",theme:"Thema",funding:"Arian fyndio",users:"Defnyddwyr",apps:"Apiau",channels:"Sianelau",transactions:"Trafodion",dashboard:"Panel Gweinyddol",node:"Nod",export_users:"Allfor Defnyddwyr",no_users:"Heb ganfod defnyddwyr",total_capacity:"Capasiti Cyfanswm",avg_channel_size:"Maint Sianel Cyf.",biggest_channel_size:"Maint Sianel Fwyaf",smallest_channel_size:"Maint Sianel Lleiaf",number_of_channels:"Nifer y Sianeli",active_channels:"Sianeli Gweithredol",connect_peer:"Cysylltu â Chymar",connect:"Cysylltu",open_channel:"Sianel Agored",open:"Agor",close_channel:"Cau Sianel",close:"cau",restart:"Ailgychwyn gweinydd",save:"Save",save_tooltip:"cadw eich newidiadau",topup:"Topup",topup_wallet:"Atodi waled",topup_hint:"Defnyddiwch ID y waled i ychwanegu at unrhyw waled",restart_tooltip:"Ailgychwyn y gweinydd er mwyn i newidiadau ddod i rym",add_funds_tooltip:"Ychwanegu arian at waled.",reset_defaults:"Ailosod i`r rhagosodiadau",reset_defaults_tooltip:"Dileu pob gosodiad ac ailosod i`r rhagosodiadau.",download_backup:"Lawrlwytho copi wrth gefn cronfa ddata",name_your_wallet:"Enwch eich waled {name}",wallet_topup_ok:"Llwyddiant wrth greu cronfeydd rhithwir ({amount} sats). Mae taliadau'n dibynnu ar gronfeydd gwirioneddol ar y ffynhonnell cyllido.",paste_invoice_label:"Gludwch anfoneb, cais am daliad neu god lnurl *",lnbits_description:"Yn hawdd iw sefydlu ac yn ysgafn, gall LNbits redeg ar unrhyw ffynhonnell ariannu rhwydwaith mellt a hyd yn oed LNbits ei hun! Gallwch redeg LNbits i chi`ch hun, neu gynnig datrysiad ceidwad i eraill yn hawdd. Mae gan bob waled ei allweddi API ei hun ac nid oes cyfyngiad ar nifer y waledi y gallwch eu gwneud. Mae gallu rhannu cronfeydd yn gwneud LNbits yn arf defnyddiol ar gyfer rheoli arian ac fel offeryn datblygu. Mae estyniadau yn ychwanegu ymarferoldeb ychwanegol at LNbits fel y gallwch arbrofi gydag ystod o dechnolegau blaengar ar y rhwydwaith mellt. Rydym wedi gwneud datblygu estyniadau mor hawdd â phosibl, ac fel prosiect ffynhonnell agored am ddim, rydym yn annog pobl i ddatblygu a chyflwyno eu rhai eu hunain.",export_to_phone:"Allforio i Ffôn gyda chod QR",export_to_phone_desc:"Mae`r cod QR hwn yn cynnwys URL eich waled gyda mynediad llawn. Gallwch ei sganio o`ch ffôn i agor eich waled oddi yno.",wallets:"Waledi",add_wallet:"Ychwanegu waled newydd",delete_wallet:"Dileu waled",delete_wallet_desc:"Bydd y waled gyfan hon yn cael ei dileu, ni fydd modd adennill yr arian.",rename_wallet:"Ailenwi waled",update_name:"Diweddaru enw",fiat_tracking:"Olrhain Fiat",currency:"Arian Cyfred",update_currency:"Diweddaru arian cyfred",press_to_claim:"Pwyswch i hawlio bitcoin",donate:"Rhoi",view_github:"Gweld ar GitHub",voidwallet_active:" Mae VoidWallet yn weithredol! Taliadau wedi`u hanalluogi",use_with_caution:"DEFNYDDIO GYDA GOFAL - mae waled {name} yn dal yn BETA",service_fee:"Ffi gwasanaeth: {amount} % y trafodiad",service_fee_max:"Ffi gwasanaeth: {amount} % y trafodiad (uchafswm {max} sats)",service_fee_tooltip:"Ffi gwasanaeth a godir gan weinyddwr gweinydd LNbits ym mhob trafodiad sy'n mynd allan",toggle_darkmode:"Toglo Modd Tywyll",payment_reactions:"Adweithiau Talu",view_swagger_docs:"Gweld dogfennau API LNbits Swagger",api_docs:"Dogfennau API",api_keys_api_docs:"URL y nod, allweddi API a dogfennau API",lnbits_version:"Fersiwn LNbits",runs_on:"Yn rhedeg ymlaen",credit_hint:"Pwyswch Enter i gyfrif credyd",credit_label:"{denomination} i gredyd",paste:"Gludo",paste_from_clipboard:"Gludo o'r clipfwrdd",paste_request:"Gludo Cais",create_invoice:"Creu Anfoneb",camera_tooltip:"Defnyddio camera i sganio anfoneb/QR",export_csv:"Allforio i CSV",chart_tooltip:"Dangos siart",pending:"yn yr arfaeth",copy_invoice:"Copi anfoneb",withdraw_from:"Tynnu oddi ar",cancel:"Canslo",scan:"Sgan",read:"Darllen",pay:"Talu",memo:"Memo",date:"Dyddiad",processing_payment:"Prosesu taliad...",not_enough_funds:"Dim digon o arian!",search_by_tag_memo_amount:"Chwilio yn ôl tag, memo, swm",invoice_waiting:"Anfoneb yn aros i gael ei thalu",payment_received:"Taliad a Dderbyniwyd",payment_sent:"Taliad a Anfonwyd",receive:"derbyn",send:"anfon",outgoing_payment_pending:"Taliad sy`n aros yn yr arfaeth",drain_funds:"Cronfeydd Draenio",drain_funds_desc:"Cod QR Tynnu`n ôl LNURL yw hwn ar gyfer slurpio popeth o`r waled hon. Peidiwch â rhannu gyda neb. Mae`n gydnaws â balanceCheck a balanceNotify felly efallai y bydd eich waled yn tynnu`r arian yn barhaus o`r fan hon ar ôl y codiad cyntaf.",i_understand:"Rwy`n deall",copy_wallet_url:"Copi URL waled",disclaimer_dialog_title:"Pwysig!",disclaimer_dialog:"Swyddogaeth mewngofnodi i`w ryddhau mewn diweddariad yn y dyfodol, am y tro, gwnewch yn siŵr eich bod yn rhoi nod tudalen ar y dudalen hon ar gyfer mynediad i`ch waled yn y dyfodol! Mae`r gwasanaeth hwn yn BETA, ac nid ydym yn gyfrifol am bobl sy`n colli mynediad at arian.",no_transactions:"Dim trafodion wedi`u gwneud eto",manage:"Rheoli",extensions:"Estyniadau",no_extensions:"Nid oes gennych unrhyw estyniadau wedi'u gosod :(",created:"Crëwyd",search_extensions:"Chwilio estyniadau",warning:"Rhybudd",repository:"Ystorfa",confirm_continue:"Ydych chi'n siŵr eich bod chi eisiau parhau?",manage_extension_details:"Gosod/dadosod estyniad",install:"Gosod",uninstall:"Dadgymhwyso",drop_db:"Dileu Data",enable:"Galluogi",enable_extension_details:"Galluogi estyniad ar gyfer y defnyddiwr presennol",disable:"Analluogi",installed:"Gosodwyd",activated:"Wedi'i actifadu",deactivated:"Anweithredol",release_notes:"Nodiadau Rhyddhau",activate_extension_details:"Gwneud estyniad ar gael/anar gael i ddefnyddwyr",featured:"Nodweddwyd",all:"Pob",only_admins_can_install:"Dim ond cyfrifon gweinyddwr all osod estyniadau",admin_only:"Dim ond Gweinyddwr",new_version:"Fersiwn Newydd",extension_depends_on:"Dibynnu ar:",extension_rating_soon:"Sgôr yn dod yn fuan",extension_installed_version:"Fersiwn wedi'i gosod",extension_uninstall_warning:"Rydych chi ar fin dileu'r estyniad ar gyfer pob defnyddiwr.",uninstall_confirm:"Ie, Dad-osod",extension_db_drop_info:"Bydd yr holl ddata ar gyfer yr estyniad yn cael ei ddileu'n barhaol. Does dim ffordd o dadwneud y weithrediad hwn!",extension_db_drop_warning:"Rydych chi ar fin dileu'r holl ddata ar gyfer yr estyniad. Teipiwch enw'r estyniad i barhau:",extension_min_lnbits_version:"Mae'r rhyddhau hwn yn gofyn o leiaf am fersiwn LNbits",payment_hash:"Hais Taliad",fee:"Fee",amount:"swm",tag:"Tag",unit:"Uned",description:"Disgrifiad",expiry:"dod i ben",webhook:"bachyn we",payment_proof:"prawf taliad",update_available:"Diweddariad {version} ar gael!",latest_update:"Rydych chi ar y fersiwn diweddaraf {version}.",notifications:"Hysbysiadau",no_notifications:"Dim hysbysiadau",notifications_disabled:"Hysbysiadau statws LNbits wedi'u analluogi.",enable_notifications:"Galluogi Hysbysiadau",enable_notifications_desc:"Os bydd wedi'i alluogi bydd yn nôl y diweddariadau Statws LNbits diweddaraf, fel digwyddiadau diogelwch a diweddariadau.",enable_killswitch:"Galluogi Killswitch",enable_killswitch_desc:"Os bydd yn galluogi, bydd yn newid eich ffynhonnell arian i VoidWallet yn awtomatig os bydd LNbits yn anfon arwydd killswitch. Bydd angen i chi alluogi â llaw ar ôl diweddariad.",killswitch_interval:"Amlder Cyllell Dorri",killswitch_interval_desc:"Pa mor aml y dylai'r dasg gefndir wirio am signal killswitch LNbits o'r ffynhonnell statws (mewn munudau).",enable_watchdog:"Galluogi Watchdog",enable_watchdog_desc:"Os bydd yn cael ei alluogi bydd yn newid eich ffynhonnell ariannu i VoidWallet yn awtomatig os bydd eich balans yn is na balans LNbits. Bydd angen i chi alluogi â llaw ar ôl diweddariad.",watchdog_interval:"Amserlennu Gwylio",watchdog_interval_desc:"Pa mor aml y dylai'r dasg gefndir wirio am signal torri yn y gwarchodfa delta [node_balance - lnbits_balance] (mewn munudau).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Terfyn cyn i'r switshladd newid ffynhonnell ariannu i VoidWallet [lnbits_balance - node_balance > delta]",status:"Statws",notification_source:"Ffynhonnell Hysbysiad",notification_source_label:"URL Ffynhonnell (defnyddiwch yn unig ffynhonnell statws swyddogol LNbits, a ffynonellau y gallwch ymddiried ynddynt)",more:"mwy",less:"llai",releases:"Rhyddhau",killswitch:"Killswitch",watchdog:"Gwyliwr",server_logs:"Logiau Gweinydd",ip_blocker:"Rheolydd IP",security:"Diogelwch",security_tools:"Offer teclynnau diogelwch",block_access_hint:"Atal mynediad gan IP",allow_access_hint:"Caniatáu mynediad gan IP (bydd yn diystyru IPs sydd wedi'u blocio)",enter_ip:"Rhowch IP a gwasgwch enter",rate_limiter:"Cyfyngydd Cyfradd",wallet_limiter:"Cyfyngwr Waled",wallet_limit_max_withdraw_per_day:"Uchafswm tynnu’n ôl waled dyddiol mewn sats (0 i analluogi)",wallet_max_ballance:"Uchafswm balans y waled mewn sats (0 i analluogi)",wallet_limit_secs_between_trans:"Eiliadau lleiaf rhwng trafodion fesul waled (0 i analluogi)",number_of_requests:"Nifer y ceisiadau",time_unit:"Uned amser",minute:"munud",second:"ail",hour:"awr",disable_server_log:"Analluogi Log Gweinydd",enable_server_log:"Galluogi Log Gweinydd",coming_soon:"Nodwedd yn dod yn fuan",session_has_expired:"Mae eich sesiwn wedi dod i ben. Mewngofnodwch eto.",instant_access_question:"Eisiau mynediad ar unwaith?",login_with_user_id:"Mewngofnodi gyda ID y defnyddiwr",or:"neu",create_new_wallet:"Creu Waled Newydd",login_to_account:"Mewngofnodwch i'ch cyfrif",create_account:"Creu cyfrif",account_settings:"Gosodiadau Cyfrif",signin_with_google:"Mewngofnodi gyda Google",signin_with_github:"Mewngofnodi gyda GitHub",signin_with_keycloak:"Mewngofnodi gyda Keycloak",username_or_email:"Defnyddiwr neu E-bost",password:"Cyfrinair",password_config:"Ffurfweddiad Cyfrinair",password_repeat:"Ailadrodd cyfrinair",change_password:"Newid Cyfrinair",set_password:"Gosod Cyfrinair",invalid_password:"Rhaid i'r cyfrinair gynnwys o leiaf 8 nod.",login:"Mewngofnodi",register:"Cofrestru",username:"Enw defnyddiwr",user_id:"ID Defnyddiwr",email:"E-bost",first_name:"Enw Cyntaf",last_name:"Cyfenw",picture:"Llun",verify_email:"Gwirio e-bost gyda",account:"Cyfrif",update_account:"Diweddaru Cyfrif",invalid_username:"Enw Defnyddiwr Annilys",auth_provider:"Darparwr Dilysiad",my_account:"Fy Nghyfrif",back:"Yn ôl",logout:"Allgofnodi",look_and_feel:"Edrych a Theimlo",language:"Iaith",color_scheme:"Cynllun Lliw",extension_cost:"Mae'r rhyddhad hwn yn gofyn am daliad o leiaf {cost} sats.",extension_paid_sats:"Rydych chi eisoes wedi talu {paid_sats} sats.",release_details_error:"Methu cael manylion y rhyddhau.",pay_from_wallet:"Talu o'r Waled",show_qr:"Dangos QR",retry_install:"Ailgeisio Gosod",new_payment:"Gwneud Taliad Newydd",hide_empty_wallets:"Cuddio waledau gwag"},window.localisation.pt={confirm:"Sim",server:"Servidor",theme:"Tema",funding:"Financiamento",users:"Usuários",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho Médio do Canal",biggest_channel_size:"Maior Tamanho do Canal",smallest_channel_size:"Menor Tamanho de Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Aberto",open:"Abrir",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",save:"Gravar",save_tooltip:"Gravar as alterações",topup:"Reforçar conta",topup_wallet:"Recarregar uma carteira",topup_hint:"Use o ID da carteira para recarregar qualquer carteira",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup da base de dados",name_your_wallet:"Nomeie sua carteira {name}",wallet_topup_ok:"Sucesso ao criar fundos virtuais ({amount} sats). Os pagamentos dependem dos fundos reais na fonte de financiamento.",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",wallets:"Carteiras",add_wallet:"Adicionar nova carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",use_with_caution:"USE COM CAUTELA - a carteira {name} ainda está em BETA",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_max:"Taxa de serviço: {amount} % por transação (máximo de {max} sats)",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Nó, chaves de API e documentação de API",lnbits_version:"Versão do LNbits",runs_on:"Executa em",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",paste:"Colar",paste_from_clipboard:"Colar da área de transferência",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",pay:"Pagar",memo:"Memo",date:"Data",processing_payment:"Processando pagamento...",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento de saída pendente",drain_funds:"Esvasiar carteira",drain_funds_desc:"Este é um código QR de saque LNURL para sacar tudo desta carteira. Não o partilhe com ninguém. É compatível com balanceCheck e balanceNotify para que a sua carteira possa continuar levantando os fundos continuamente daqui após o primeiro saque.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada numa atualização futura, por enquanto, certifique-se que marca esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerir",extensions:"Extensões",no_extensions:"Não há nenhuma extensão instalada :(",created:"Criado",search_extensions:"Pesquisar extensões",warning:"Aviso",repository:"Repositório",confirm_continue:"Tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",release_notes:"Notas de Lançamento",activate_extension_details:"Torne a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Todos",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",admin_only:"Apenas para administradores",new_version:"Nova Versão",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_min_lnbits_version:"Esta versão requer pelo menos a versão LNbits",payment_hash:"Hash de pagamento",fee:"Taxa",amount:"Quantidade",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",payment_proof:"Comprovativo de pagamento",update_available:"Atualização {version} disponível!",latest_update:"Você está na última versão {version}.",notifications:"Notificações",no_notifications:"Sem notificações",notifications_disabled:"As notificações de status do LNbits estão desativadas.",enable_notifications:"Ativar Notificações",enable_notifications_desc:"Se ativado, ele buscará as últimas atualizações de status do LNbits, como incidentes de segurança e atualizações.",enable_killswitch:"Ativar Killswitch",enable_killswitch_desc:"Se ativado, ele mudará sua fonte de financiamento para VoidWallet automaticamente se o LNbits enviar um sinal de desativação. Você precisará ativar manualmente após uma atualização.",killswitch_interval:"Intervalo do Killswitch",killswitch_interval_desc:"Com que frequência a tarefa de fundo deve verificar o sinal de desativação do LNbits proveniente da fonte de status (em minutos).",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, mudará automaticamente a sua fonte de financiamento para VoidWallet caso o seu saldo seja inferior ao saldo LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de desligamento no delta do watchdog [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes que o killswitch altere a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de Origem (use apenas a fonte oficial de status do LNbits e fontes em que confia)",more:"mais",less:"menos",releases:"Lançamentos",killswitch:"Interruptor de desativação",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá IPs bloqueados)",enter_ip:"Digite o IP e pressione enter.",rate_limiter:"Limitador de Taxa",wallet_limiter:"Limitador de Carteira",wallet_limit_max_withdraw_per_day:"Limite diário máximo de saque da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos seg. entre transações por carteira (0 para desativar)",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Log do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Entrar com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com o GitHub",signin_with_keycloak:"Entrar com o Keycloak",username_or_email:"Nome de usuário ou Email",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",change_password:"Alterar Senha",set_password:"Definir Senha",invalid_password:"A senha deve ter pelo menos 8 caracteres",login:"Entrar",register:"Registrar",username:"Nome de usuário",user_id:"ID do Usuário",email:"E-mail",first_name:"Nome próprio",last_name:"Sobrenome",picture:"Foto",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",my_account:"Minha Conta",back:"Voltar",logout:"Sair",look_and_feel:"Aparência e Sensação",language:"Idioma",color_scheme:"Esquema de Cores",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pague da Carteira",show_qr:"Exibir QR",retry_install:"Reinstalar Tente Novamente",new_payment:"Realizar Novo Pagamento",hide_empty_wallets:"Ocultar carteiras vazias"},window.localisation.br={confirm:"Sim",server:"Servidor",theme:"Tema",funding:"Financiamento",users:"Usuários",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho médio do canal",biggest_channel_size:"Maior Tamanho de Canal",smallest_channel_size:"Tamanho Mínimo do Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Aberto",open:"Abrir",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",save:"Salvar",save_tooltip:"Salvar suas alterações",topup:"Recarregar",topup_wallet:"Recarregar uma carteira",topup_hint:"Use o ID da carteira para recarregar qualquer carteira",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup do banco de dados",name_your_wallet:"Nomeie sua carteira {name}",wallet_topup_ok:"Sucesso ao criar fundos virtuais ({amount} sats). Pagamentos dependem dos fundos reais na fonte de financiamento.",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",wallets:"Carteiras",add_wallet:"Adicionar nova carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",use_with_caution:"USE COM CAUTELA - a carteira {name} ainda está em BETA",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_max:"Taxa de serviço: {amount} % por transação (máx {max} sats)",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Node, chaves da API e documentação da API",lnbits_version:"Versão do LNbits",runs_on:"Executa em",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",paste:"Colar",paste_from_clipboard:"Cole do clipboard",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Sacar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",pay:"Pagar",memo:"Memo",date:"Data",processing_payment:"Processando pagamento...",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento pendente de saída",drain_funds:"Drenar Fundos",drain_funds_desc:"Este é um código QR de retirada do LNURL para sugar tudo desta carteira. Não compartilhe com ninguém. É compatível com balanceCheck e balanceNotify para que sua carteira possa continuar retirando os fundos continuamente daqui após a primeira retirada.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada em uma atualização futura, por enquanto, certifique-se de marcar esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerenciar",extensions:"Extensões",no_extensions:"Você não possui nenhuma extensão instalada :(",created:"Criado",search_extensions:"Extensões de pesquisa",warning:"Aviso",repository:"Repositório",confirm_continue:"Você tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",release_notes:"Notas de Lançamento",activate_extension_details:"Tornar a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Tudo",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",admin_only:"Apenas para Administração",new_version:"Nova Versão",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações estarão disponíveis em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_min_lnbits_version:"Esta versão requer no mínimo a versão do LNbits",payment_hash:"Hash de pagamento",fee:"Taxa",amount:"Quantidade",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",payment_proof:"Comprovante de pagamento",update_available:"Atualização {version} disponível!",latest_update:"Você está na versão mais recente {version}.",notifications:"Notificações",no_notifications:"Sem notificações",notifications_disabled:"As notificações de status do LNbits estão desativadas.",enable_notifications:"Ativar notificações",enable_notifications_desc:"Se ativado, ele buscará as últimas atualizações de status do LNbits, como incidentes de segurança e atualizações.",enable_killswitch:"Ativar Killswitch",enable_killswitch_desc:"Se ativado, mudará sua fonte de fundos para VoidWallet automaticamente se o LNbits enviar um sinal de desativação. Você precisará ativar manualmente após uma atualização.",killswitch_interval:"Intervalo do Killswitch",killswitch_interval_desc:"Com que frequência a tarefa de fundo deve verificar o sinal de desativação do LNbits proveniente da fonte de status (em minutos).",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, ele mudará automaticamente sua fonte de financiamento para VoidWallet se o seu saldo for inferior ao saldo do LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de interrupção no delta do monitor [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes da mudança do mecanismo de segurança alterar a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de origem (use apenas a fonte de status oficial do LNbits e fontes de confiança)",more:"mais",less:"menos",releases:"Lançamentos",killswitch:"Dispositivo de desativação",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá os IPs bloqueados)",enter_ip:"Digite o IP e pressione enter",rate_limiter:"Limitador de Taxa",wallet_limiter:"Limitador de Carteira",wallet_limit_max_withdraw_per_day:"Retirada máxima diária da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos e segundos entre transações por carteira (0 para desativar)",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Registro do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Faça login com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com GitHub",signin_with_keycloak:"Entrar com Keycloak",username_or_email:"Nome de usuário ou E-mail",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",change_password:"Alterar Senha",set_password:"Definir Senha",invalid_password:"A senha deve ter pelo menos 8 caracteres",login:"Entrar",register:"Registrar",username:"Nome de usuário",user_id:"ID do Usuário",email:"E-mail",first_name:"Primeiro Nome",last_name:"Sobrenome",picture:"Foto",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",my_account:"Minha Conta",back:"Voltar",logout:"Sair",look_and_feel:"Aparência",language:"Idioma",color_scheme:"Esquema de Cores",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pagar com a Carteira",show_qr:"Exibir QR",retry_install:"Repetir Instalação",new_payment:"Efetuar Novo Pagamento",hide_empty_wallets:"Ocultar carteiras vazias"},window.localisation.cs={confirm:"Ano",server:"Server",theme:"Téma",funding:"Financování",users:"Uživatelé",apps:"Aplikace",channels:"Kanály",transactions:"Transakce",dashboard:"Přehled",node:"Uzel",export_users:"Exportovat uživatele",no_users:"Nebyli nalezeni žádní uživatelé",total_capacity:"Celková kapacita",avg_channel_size:"Průmerná velikost kanálu",biggest_channel_size:"Největší velikost kanálu",smallest_channel_size:"Nejmenší velikost kanálu",number_of_channels:"Počet kanálů",active_channels:"Aktivní kanály",connect_peer:"Připojit peer",connect:"Připojit",open_channel:"Otevřít kanál",open:"Otevřít",close_channel:"Zavřít kanál",close:"Zavřít",restart:"Restartovat server",save:"Uložit",save_tooltip:"Uložit změny",topup:"Dobít",topup_wallet:"Dobít peněženku",topup_hint:"Použijte ID peněženky pro dobíjení jakékoliv peněženky",restart_tooltip:"Restartujte server pro aplikaci změn",add_funds_tooltip:"Přidat prostředky do peněženky.",reset_defaults:"Obnovit výchozí",reset_defaults_tooltip:"Smazat všechna nastavení a obnovit výchozí.",download_backup:"Stáhnout zálohu databáze",name_your_wallet:"Pojmenujte svou {name} peněženku",wallet_topup_ok:"Úspěšně vytvořeny virtuální prostředky ({amount} sats). Platby závisí na skutečných prostředcích na zdrojovém účtu.",paste_invoice_label:"Vložte fakturu, platební požadavek nebo lnurl kód *",lnbits_description:"Snadno nastavitelný a lehkotonážní, LNbits může běžet na jakémkoliv zdroji financování Lightning Network a dokonce LNbits samotné! LNbits můžete provozovat pro sebe, nebo snadno nabízet správu peněženek pro ostatní. Každá peněženka má své vlastní API klíče a není omezen počet peněženek, které můžete vytvořit. Možnost rozdělení prostředků dělá z LNbits užitečný nástroj pro správu peněz a jako vývojový nástroj. Rozšíření přidávají extra funkčnost k LNbits, takže můžete experimentovat s řadou špičkových technologií na lightning network. Vývoj rozšíření jsme učinili co nejjednodušší a jako svobodný a open-source projekt podporujeme lidi ve vývoji a zasílání vlastních rozšíření.",export_to_phone:"Exportovat do telefonu pomocí QR kódu",export_to_phone_desc:"Tento QR kód obsahuje URL vaší peněženky s plným přístupem. Můžete jej naskenovat z telefonu a otevřít peněženku odtamtud.",wallets:"Peněženky",add_wallet:"Přidat novou peněženku",delete_wallet:"Smazat peněženku",delete_wallet_desc:"Celá peněženka bude smazána, prostředky budou NEOBNOVITELNÉ.",rename_wallet:"Přejmenovat peněženku",update_name:"Aktualizovat název",fiat_tracking:"Sledování fiatu",currency:"Měna",update_currency:"Aktualizovat měnu",press_to_claim:"Stiskněte pro nárokování bitcoinu",donate:"Darovat",view_github:"Zobrazit na GitHubu",voidwallet_active:"VoidWallet je aktivní! Platby zakázány",use_with_caution:"POUŽÍVEJTE S OBEZŘETNOSTÍ - {name} peněženka je stále v BETĚ",service_fee:"Servisný poplatek: {amount} % za transakci",service_fee_max:"Servisný poplatek: {amount} % za transakci (max {max} satoshi)",service_fee_tooltip:"Servisní poplatek účtovaný správcem LNbits serveru za odchozí transakci",toggle_darkmode:"Přepnout tmavý režim",payment_reactions:"Reakce na platby",view_swagger_docs:"Zobrazit LNbits Swagger API dokumentaci",api_docs:"API dokumentace",api_keys_api_docs:"Adresa uzlu, API klíče a API dokumentace",lnbits_version:"Verze LNbits",runs_on:"Běží na",credit_hint:"Stiskněte Enter pro připsání na účet",credit_label:"{denomination} k připsání",paste:"Vložit",paste_from_clipboard:"Vložit ze schránky",paste_request:"Vložit požadavek",create_invoice:"Vytvořit fakturu",camera_tooltip:"Použijte kameru pro skenování faktury/QR",export_csv:"Exportovat do CSV",chart_tooltip:"Zobrazit graf",pending:"Čeká na vyřízení",copy_invoice:"Kopírovat fakturu",withdraw_from:"Vybrat z",cancel:"Zrušit",scan:"Skenovat",read:"Číst",pay:"Platit",memo:"Poznámka",date:"Datum",processing_payment:"Zpracování platby...",not_enough_funds:"Nedostatek prostředků!",search_by_tag_memo_amount:"Hledat podle tagu, poznámky, částky",invoice_waiting:"Faktura čeká na platbu",payment_received:"Platba přijata",payment_sent:"Platba odeslána",receive:"přijmout",send:"odeslat",outgoing_payment_pending:"Odchozí platba čeká na vyřízení",drain_funds:"Vyčerpat prostředky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pro vyčerpání všeho z této peněženky. Nesdílejte s nikým. Je kompatibilní s balanceCheck a balanceNotify, takže vaše peněženka může kontinuálně čerpat prostředky odsud po prvním výběru.",i_understand:"Rozumím",copy_wallet_url:"Kopírovat URL peněženky",disclaimer_dialog_title:"Důležité!",disclaimer_dialog:"Funkcionalita přihlášení bude vydána v budoucí aktualizaci, zatím si ujistěte, že jste si tuto stránku uložili do záložek pro budoucí přístup k vaší peněžence! Tato služba je v BETA verzi a nepřebíráme žádnou zodpovědnost za ztrátu přístupu k prostředkům.",no_transactions:"Zatím žádné transakce",manage:"Spravovat",extensions:"Rozšíření",no_extensions:"Nemáte nainstalováno žádné rozšíření :(",created:"Vytvořeno",search_extensions:"Hledat rozšíření",warning:"Varování",repository:"Repositář",confirm_continue:"Jste si jistí, že chcete pokračovat?",manage_extension_details:"Instalovat/odinstalovat rozšíření",install:"Instalovat",uninstall:"Odinstalovat",drop_db:"Odstranit data",enable:"Povolit",enable_extension_details:"Povolit rozšíření pro aktuálního uživatele",disable:"Zakázat",installed:"Nainstalováno",activated:"Aktivováno",deactivated:"Deaktivováno",release_notes:"Poznámky k vydání",activate_extension_details:"Zpřístupnit/zakázat rozšíření pro uživatele",featured:"Doporučené",all:"Vše",only_admins_can_install:"(Pouze administrátorské účty mohou instalovat rozšíření)",admin_only:"Pouze pro adminy",new_version:"Nová verze",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnocení brzy dostupné",extension_installed_version:"Nainstalovaná verze",extension_uninstall_warning:"Chystáte se odstranit rozšíření pro všechny uživatele.",uninstall_confirm:"Ano, odinstalovat",extension_db_drop_info:"Všechna data pro rozšíření budou trvale odstraněna. Tuto operaci nelze vrátit zpět!",extension_db_drop_warning:"Chystáte se odstranit všechna data pro rozšíření. Prosím, pokračujte zadáním názvu rozšíření:",extension_min_lnbits_version:"Toto vydání vyžaduje alespoň verzi LNbits",payment_hash:"Hash platby",fee:"Poplatek",amount:"Částka",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirace",webhook:"Webhook",payment_proof:"Důkaz platby",update_available:"Dostupná aktualizace {version}!",latest_update:"Máte nejnovější verzi {version}.",notifications:"Notifikace",no_notifications:"Žádné notifikace",notifications_disabled:"Notifikace stavu LNbits jsou zakázány.",enable_notifications:"Povolit notifikace",enable_notifications_desc:"Pokud je povoleno, bude stahovat nejnovější aktualizace stavu LNbits, jako jsou bezpečnostní incidenty a aktualizace.",enable_killswitch:"Povolit Killswitch",enable_killswitch_desc:"Pokud je povoleno, automaticky změní zdroj financování na VoidWallet pokud LNbits odešle signál killswitch. Po aktualizaci budete muset povolit ručně.",killswitch_interval:"Interval Killswitch",killswitch_interval_desc:"Jak často by měl úkol na pozadí kontrolovat signál killswitch od LNbits ze zdroje stavu (v minutách).",enable_watchdog:"Povolit Watchdog",enable_watchdog_desc:"Pokud je povoleno, automaticky změní zdroj financování na VoidWallet pokud je váš zůstatek nižší než zůstatek LNbits. Po aktualizaci budete muset povolit ručně.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Jak často by měl úkol na pozadí kontrolovat signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minutách).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit předtím, než killswitch změní zdroj financování na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikací",notification_source_label:"URL zdroje (používejte pouze oficiální zdroj stavu LNbits a zdroje, kterým můžete věřit)",more:"více",less:"méně",releases:"Vydání",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Logy serveru",ip_blocker:"Blokování IP",security:"Bezpečnost",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovat přístup podle IP",allow_access_hint:"Povolit přístup podle IP (přepíše blokované IP)",enter_ip:"Zadejte IP a stiskněte enter",rate_limiter:"Omezovač počtu požadavků",wallet_limiter:"Omezení peněženky",wallet_limit_max_withdraw_per_day:"Maximální denní limit pro výběr z peněženky v sats (0 pro deaktivaci)",wallet_max_ballance:"Maximální zůstatek v peněžence v sats (0 pro zakázání)",wallet_limit_secs_between_trans:"Minimální počet sekund mezi transakcemi na peněženku (0 pro vypnutí)",number_of_requests:"Počet požadavků",time_unit:"Časová jednotka",minute:"minuta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázat log serveru",enable_server_log:"Povolit log serveru",coming_soon:"Funkce brzy dostupná",session_has_expired:"Vaše relace vypršela. Prosím, přihlašte se znovu.",instant_access_question:"Chcete okamžitý přístup?",login_with_user_id:"Přihlásit se s uživatelským ID",or:"nebo",create_new_wallet:"Vytvořit novou peněženku",login_to_account:"Přihlaste se ke svému účtu",create_account:"Vytvořit účet",account_settings:"Nastavení účtu",signin_with_google:"Přihlásit se přes Google",signin_with_github:"Přihlásit se přes GitHub",signin_with_keycloak:"Přihlásit se přes Keycloak",username_or_email:"Uživatelské jméno nebo Email",password:"Heslo",password_config:"Konfigurace hesla",password_repeat:"Opakujte heslo",change_password:"Změnit heslo",set_password:"Nastavit heslo",invalid_password:"Heslo musí mít alespoň 8 znaků",login:"Přihlášení",register:"Registrovat",username:"Uživatelské jméno",user_id:"ID uživatele",email:"Email",first_name:"Křestní jméno",last_name:"Příjmení",picture:"Obrázek",verify_email:"Ověřte e-mail s",account:"Účet",update_account:"Aktualizovat účet",invalid_username:"Neplatné uživatelské jméno",auth_provider:"Poskytovatel ověření",my_account:"Můj účet",back:"Zpět",logout:"Odhlásit se",look_and_feel:"Vzhled a chování",language:"Jazyk",color_scheme:"Barevné schéma",extension_cost:"Toto vydání vyžaduje minimální platbu {cost} satoshi.",extension_paid_sats:"Již jste zaplatili {paid_sats} sats.",release_details_error:"Nelze získat podrobnosti o vydání.",pay_from_wallet:"Platit z peněženky",show_qr:"Zobrazit QR",retry_install:"Zkusit znovu nainstalovat",new_payment:"Vytvořit novou platbu",hide_empty_wallets:"Skrýt prázdné peněženky"},window.localisation.sk={confirm:"Áno",server:"Server",theme:"Téma",funding:"Financovanie",users:"Používatelia",apps:"Aplikácie",channels:"Kanály",transactions:"Transakcie",dashboard:"Prehľad",node:"Uzol",export_users:"Exportovať používateľov",no_users:"Nenašli sa žiadni používatelia",total_capacity:"Celková kapacita",avg_channel_size:"Priemerná veľkosť kanálu",biggest_channel_size:"Najväčší kanál",smallest_channel_size:"Najmenší kanál",number_of_channels:"Počet kanálov",active_channels:"Aktívne kanály",connect_peer:"Pripojiť peer",connect:"Pripojiť",open_channel:"Otvoriť kanál",open:"Otvoriť",close_channel:"Zatvoriť kanál",close:"Zatvoriť",restart:"Reštartovať server",save:"Uložiť",save_tooltip:"Uložiť vaše zmeny",topup:"Doplniť",topup_wallet:"Doplniť peňaženku",topup_hint:"Použite ID peňaženky na doplnenie ľubovoľnej peňaženky",restart_tooltip:"Pre prejavenie zmien reštartujte server",add_funds_tooltip:"Pridať prostriedky do peňaženky.",reset_defaults:"Obnoviť predvolené",reset_defaults_tooltip:"Odstrániť všetky nastavenia a obnoviť predvolené.",download_backup:"Stiahnuť zálohu databázy",name_your_wallet:"Pomenujte vašu {name} peňaženku",wallet_topup_ok:"Úspešne vytvorené virtuálne prostriedky ({amount} sats). Platby závisia od skutočných prostriedkov v zdroji financovania.",paste_invoice_label:"Vložte faktúru, platobnú požiadavku alebo lnurl kód *",lnbits_description:"Ľahko nastaviteľný a ľahkotonážny, LNbits môže bežať na akomkoľvek zdroji financovania Lightning Network a dokonca LNbits samotný! LNbits môžete používať pre seba, alebo ľahko ponúknuť správcovské riešenie pre iných. Každá peňaženka má svoje vlastné API kľúče a nie je limit na počet peňaženiek, ktoré môžete vytvoriť. Schopnosť rozdeľovať finančné prostriedky robí z LNbits užitočný nástroj pre správu peňazí a ako vývojový nástroj. Rozšírenia pridávajú extra funkčnosť do LNbits, takže môžete experimentovať s radou najnovších technológií na lightning sieti. Vývoj rozšírení sme urobili čo najjednoduchší a ako voľný a open-source projekt, podporujeme ľudí vývoj a odovzdávanie vlastných rozšírení.",export_to_phone:"Exportovať do telefónu s QR kódom",export_to_phone_desc:"Tento QR kód obsahuje URL vašej peňaženky s plným prístupom. Môžete ho naskenovať z vášho telefónu a otvoriť vašu peňaženku odtiaľ.",wallets:"Peňaženky",add_wallet:"Pridať novú peňaženku",delete_wallet:"Zmazať peňaženku",delete_wallet_desc:"Celá peňaženka bude zmazaná, prostriedky budú NEOBNOVITEĽNÉ.",rename_wallet:"Premenovať peňaženku",update_name:"Aktualizovať meno",fiat_tracking:"Sledovanie fiat",currency:"Mena",update_currency:"Aktualizovať menu",press_to_claim:"Stlačte pre nárok na bitcoin",donate:"Prispieť",view_github:"Zobraziť na GitHube",voidwallet_active:"VoidWallet je aktívny! Platby zakázané",use_with_caution:"POUŽÍVAJTE OPATRNE - {name} peňaženka je stále v BETE",service_fee:"Servisný poplatok: {amount} % za transakciu",service_fee_max:"Servisný poplatok: {amount} % za transakciu (max {max} satoshi)",service_fee_tooltip:"Servisný poplatok účtovaný správcom LNbits servera za odchádzajúcu transakciu",toggle_darkmode:"Prepnúť Tmavý režim",payment_reactions:"Reakcie na platbu",view_swagger_docs:"Zobraziť LNbits Swagger API dokumentáciu",api_docs:"API dokumentácia",api_keys_api_docs:"Adresa uzla, API kľúče a API dokumentácia",lnbits_version:"Verzia LNbits",runs_on:"Beží na",credit_hint:"Stlačte Enter pre pripísanie na účet",credit_label:"{denomination} na pripísanie",paste:"Vložiť",paste_from_clipboard:"Vložiť zo schránky",paste_request:"Vložiť požiadavku",create_invoice:"Vytvoriť faktúru",camera_tooltip:"Použite kameru na naskenovanie faktúry/QR",export_csv:"Exportovať do CSV",chart_tooltip:"Zobraziť graf",pending:"Čakajúce",copy_invoice:"Kopírovať faktúru",withdraw_from:"Vybrať z",cancel:"Zrušiť",scan:"Skenovať",read:"Čítať",pay:"Platiť",memo:"Poznámka",date:"Dátum",processing_payment:"Spracovávanie platby...",not_enough_funds:"Nedostatok prostriedkov!",search_by_tag_memo_amount:"Vyhľadať podľa značky, poznámky, sumy",invoice_waiting:"Faktúra čakajúca na zaplatenie",payment_received:"Platba prijatá",payment_sent:"Platba odoslaná",receive:"prijímať",send:"posielať",outgoing_payment_pending:"Odchádzajúca platba čaká",drain_funds:"Vyprázdniť prostriedky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pre vyprázdnienie všetkého z tejto peňaženky. S nikým ho nezdieľajte. Je kompatibilný s balanceCheck a balanceNotify, takže vaša peňaženka môže naďalej kontinuálne vyťahovať prostriedky odtiaľto po prvom výbere.",i_understand:"Rozumiem",copy_wallet_url:"Kopírovať URL peňaženky",disclaimer_dialog_title:"Dôležité!",disclaimer_dialog:"Funkcionalita prihlásenia bude vydaná v budúcej aktualizácii, zatiaľ si uistite, že ste si túto stránku pridali medzi záložky pre budúci prístup k vašej peňaženke! Táto služba je v BETA verzii a nenesieme zodpovednosť za stratu prístupu k prostriedkom.",no_transactions:"Zatiaľ žiadne transakcie",manage:"Spravovať",extensions:"Rozšírenia",no_extensions:"Nemáte nainštalované žiadne rozšírenia :(",created:"Vytvorené",search_extensions:"Hľadať rozšírenia",warning:"Upozornenie",repository:"Repozitár",confirm_continue:"Ste si istí, že chcete pokračovať?",manage_extension_details:"Inštalovať/odinštalovať rozšírenie",install:"Inštalovať",uninstall:"Odinštalovať",drop_db:"Odstrániť údaje",enable:"Povoliť",enable_extension_details:"Povoliť rozšírenie pre aktuálneho používateľa",disable:"Zakázať",installed:"Nainštalované",activated:"Aktivované",deactivated:"Deaktivované",release_notes:"Poznámky k vydaniu",activate_extension_details:"Sprístupniť/neprístupniť rozšírenie pre používateľov",featured:"Odporúčané",all:"Všetky",only_admins_can_install:"(Iba administrátorské účty môžu inštalovať rozšírenia)",admin_only:"Iba pre administrátorov",new_version:"Nová verzia",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnotenia budú čoskoro dostupné",extension_installed_version:"Nainštalovaná verzia",extension_uninstall_warning:"Chystáte sa odstrániť rozšírenie pre všetkých používateľov.",uninstall_confirm:"Áno, Odinštalovať",extension_db_drop_info:"Všetky údaje pre rozšírenie budú trvalo vymazané. Túto operáciu nie je možné vrátiť!",extension_db_drop_warning:"Chystáte sa odstrániť všetky údaje pre rozšírenie. Pre pokračovanie prosím napíšte názov rozšírenia:",extension_min_lnbits_version:"Toto vydanie vyžaduje aspoň verziu LNbits",payment_hash:"Hash platby",fee:"Poplatok",amount:"Suma",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirácia",webhook:"Webhook",payment_proof:"Dôkaz platby",update_available:"Dostupná aktualizácia {version}!",latest_update:"Máte najnovšiu verziu {version}.",notifications:"Notifikácie",no_notifications:"Žiadne notifikácie",notifications_disabled:"Notifikácie stavu LNbits sú zakázané.",enable_notifications:"Povoliť Notifikácie",enable_notifications_desc:"Ak povolené, budú sa načítavať najnovšie aktualizácie stavu LNbits, ako sú bezpečnostné incidenty a aktualizácie.",enable_killswitch:"Povoliť Killswitch",enable_killswitch_desc:"Ak povolené, vaš zdroj financovania sa automaticky zmení na VoidWallet, ak LNbits vysielajú signál killswitch. Po aktualizácii bude treba povoliť manuálne.",killswitch_interval:"Interval Killswitch",killswitch_interval_desc:"Ako často by malo pozadie kontrolovať signál killswitch od LNbits zo zdroja stavu (v minútach).",enable_watchdog:"Povoliť Watchdog",enable_watchdog_desc:"Ak povolené, vaš zdroj financovania sa automaticky zmení na VoidWallet, ak je váš zostatok nižší ako zostatok LNbits. Po aktualizácii bude treba povoliť manuálne.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Ako často by malo pozadie kontrolovať signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minútach).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit pred zmenou zdroja financovania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikácií",notification_source_label:"URL zdroja (používajte len oficiálny LNbits zdroj stavu a zdroje, ktorým môžete dôverovať)",more:"viac",less:"menej",releases:"Vydania",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Logy servera",ip_blocker:"Blokovanie IP",security:"Bezpečnosť",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovať prístup podľa IP",allow_access_hint:"Povoliť prístup podľa IP (prebije blokované IP)",enter_ip:"Zadajte IP a stlačte enter",rate_limiter:"Obmedzovač počtu požiadaviek",wallet_limiter:"Obmedzovač peňaženky",wallet_limit_max_withdraw_per_day:"Maximálny denný výber z peňaženky v satošiach (0 pre zrušenie)",wallet_max_ballance:"Maximálny zostatok v peňaženke v satošiach (0 pre deaktiváciu)",wallet_limit_secs_between_trans:"Minimálny počet sekúnd medzi transakciami na peňaženku (0 na deaktiváciu)",number_of_requests:"Počet požiadaviek",time_unit:"Časová jednotka",minute:"minúta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázať Log servera",enable_server_log:"Povoliť Log servera",coming_soon:"Funkcia bude čoskoro dostupná",session_has_expired:"Vaša relácia vypršala. Prosím, prihláste sa znova.",instant_access_question:"Chcete okamžitý prístup?",login_with_user_id:"Prihlásiť sa s používateľským ID",or:"alebo",create_new_wallet:"Vytvoriť novú peňaženku",login_to_account:"Prihláste sa do vášho účtu",create_account:"Vytvoriť účet",account_settings:"Nastavenia účtu",signin_with_google:"Prihlásiť sa pomocou Google",signin_with_github:"Prihlásiť sa pomocou GitHub",signin_with_keycloak:"Prihlásiť sa pomocou Keycloak",username_or_email:"Používateľské meno alebo email",password:"Heslo",password_config:"Konfigurácia hesla",password_repeat:"Opakovanie hesla",change_password:"Zmeniť heslo",set_password:"Nastaviť heslo",invalid_password:"Heslo musí mať aspoň 8 znakov",login:"Prihlásenie",register:"Registrovať",username:"Používateľské meno",user_id:"ID používateľa",email:"Email",first_name:"Meno",last_name:"Priezvisko",picture:"Obrázok",verify_email:"Overiť e-mail s",account:"Účet",update_account:"Aktualizovať účet",invalid_username:"Neplatné užívateľské meno",auth_provider:"Poskytovateľ autentifikácie",my_account:"Môj účet",back:"Späť",logout:"Odhlásiť sa",look_and_feel:"Vzhľad a dojem",language:"Jazyk",color_scheme:"Farebná schéma",extension_cost:"Táto verzia vyžaduje minimálnu platbu {cost} satoshi.",extension_paid_sats:"Už ste zaplatili {paid_sats} sats.",release_details_error:"Nepodarilo sa získať podrobnosti o vydaní.",pay_from_wallet:"Zaplatiť z peňaženky",show_qr:"Zobraziť QR",retry_install:"Skúste inštaláciu znova",new_payment:"Vytvoriť novú platbu",hide_empty_wallets:"Skryť prázdne peňaženky"},window.localisation.kr={confirm:"확인",server:"서버",theme:"테마",funding:"자금",users:"사용자",apps:"앱",channels:"채널",transactions:"거래 내역",dashboard:"현황판",node:"노드",export_users:"사용자 내보내기",no_users:"사용자가 없습니다",total_capacity:"총 용량",avg_channel_size:"평균 채널 용량",biggest_channel_size:"가장 큰 채널 용량",smallest_channel_size:"가장 작은 채널 용량",number_of_channels:"채널 수",active_channels:"활성화된 채널",connect_peer:"피어 연결하기",connect:"연결하기",open_channel:"채널 개설하기",open:"개설",close_channel:"채널 폐쇄하기",close:"폐쇄",restart:"서버 재시작",save:"저장",save_tooltip:"변경 사항 저장",topup:"자금 추가",topup_wallet:"지갑에 자금 추가",topup_hint:"자금을 추가할 지갑의 ID를 넣어주세요",restart_tooltip:"변경 사항을 적용하려면 서버를 재시작해야 합니다.",add_funds_tooltip:"지갑에 자금을 추가합니다.",reset_defaults:"기본 설정으로 돌아가기",reset_defaults_tooltip:"설정했던 내용들을 모두 지우고, 기본 설정으로 돌아갑니다.",download_backup:"데이터베이스 백업 다운로드",name_your_wallet:"사용할 {name}지갑의 이름을 정하세요",wallet_topup_ok:"성공적으로 가상 자금을 생성했습니다 ({amount} sats). 지급은 자금 원천의 실제 자금에 따라 달라집니다.",paste_invoice_label:"인보이스, 결제 요청, 혹은 lnurl 코드를 붙여넣으세요 *",lnbits_description:"설정이 쉽고 가벼운 LNbits는 어떤 라이트닝 네트워크의 예산 자원 위에서든 돌아갈 수 있습니다, 그리고 다른 LNbits 지갑들입니다. 스스로 사용하기 위해, 또는 다른 사람들에게 수탁형 솔루션을 제공하기 위해 LNbits를 운영할 수 있습니다. 각 지갑들은 자신만의 API key를 가지며, 생성 가능한 지갑의 수에는 제한이 없습니다. 자금을 분할할 수 있는 기능으로 인해, LNbits는 자금 운영 도구로써뿐만 아니라 개발 도구로써도 유용합니다. 확장 기능들은 LNbits에 여러분들이 라이트닝 네트워크의 다양한 최신 기술들을 수행해볼 수 있게 하는 추가 기능을 제공합니다. LNbits 개발진들은 확장 기능들의 개발 또한 가능한 쉽게 만들었으며, 무료 오픈 소스 프로젝트답게 사람들이 자신만의 확장 기능들을 개발하고 제출하기를 응원합니다.",export_to_phone:"QR 코드를 이용해 모바일 기기로 내보내기",export_to_phone_desc:"이 QR 코드는 선택된 지갑의 최대 접근 권한을 가진 전체 URL을 담고 있습니다. 스캔 후, 모바일 기기에서 지갑을 열 수 있습니다.",wallets:"지갑",add_wallet:"새로운 지갑을 추가합니다",delete_wallet:"지갑을 삭제합니다",delete_wallet_desc:"이 지갑은 삭제될 것이며, 삭제 시 지갑 내 자금은 복구가 불가능합니다.",rename_wallet:"지갑 이름 변경",update_name:"이름 변경하기",fiat_tracking:"법정통화 가격 표시",currency:"통화",update_currency:"통화 수정하기",press_to_claim:"비트코인을 수령하려면 눌러주세요",donate:"기부",view_github:"GitHub 페이지 보기",voidwallet_active:"VoidWallet이 활성화되었습니다! 결제가 불가능합니다.",use_with_caution:"주의하세요 - {name} 지갑은 아직 BETA 단계입니다.",service_fee:"서비스 수수료: 거래액의 {amount} %",service_fee_max:"서비스 수수료: 거래액의 {amount} % (최대 {max} sats)",service_fee_tooltip:"지불 결제 시마다 LNbits 서버 관리자에게 납부되는 서비스 수수료",toggle_darkmode:"다크 모드 전환",payment_reactions:"결제 반응",view_swagger_docs:"LNbits Swagger API 문서를 봅니다",api_docs:"API 문서",api_keys_api_docs:"노드 URL, API 키와 API 문서",lnbits_version:"LNbits 버전",runs_on:"Runs on",credit_hint:"계정에 자금을 넣으려면 Enter를 눌러주세요",credit_label:"{denomination} 단위로 충전하기",paste:"붙여넣기",paste_from_clipboard:"클립보드에서 붙여넣기",paste_request:"지불 요청 붙여넣기",create_invoice:"인보이스 생성하기",camera_tooltip:"카메라를 이용해서 인보이스/QR을 스캔하세요",export_csv:"CSV 형태로 내보내기",chart_tooltip:"그래프로 보여주기",pending:"대기 중",copy_invoice:"인보이스 복사하기",withdraw_from:"출금",cancel:"취소",scan:"스캔",read:"분석하기",pay:"지불하기",memo:"Memo",date:"일시",processing_payment:"결제 처리 중...",not_enough_funds:"자금이 부족합니다!",search_by_tag_memo_amount:"태그, memo, 수량으로 검색하기",invoice_waiting:"결제를 기다리는 인보이스",payment_received:"받은 결제액",payment_sent:"보낸 결제액",receive:"받기",send:"보내기",outgoing_payment_pending:"지불 대기 중",drain_funds:"자금 비우기",drain_funds_desc:"이는 선택된 지갑으로부터 모든 자금을 인출하는 LNURL-withdraw QR 코드입니다. 그 누구와도 공유하지 마세요. balanceCheck 및 balanceNotify 기능과 호환되며, 당신의 지갑은 첫 출금 이후로도 계속 자금을 끌어당기고 있을 수 있습니다.",i_understand:"이해하였습니다",copy_wallet_url:"지갑 URL 복사하기",disclaimer_dialog_title:"중요!",disclaimer_dialog:"로그인 기능은 향후 업데이트를 통해 지원될 계획이지만, 현재로써는 이 페이지에 향후 다시 접속하기 위해 북마크 설정하는 것을 잊지 마세요! 이 서비스는 아직 BETA 과정에 있고, LNbits 개발자들은 자금 손실에 대해 전혀 책임을 지지 않습니다.",no_transactions:"아직 아무런 거래도 이루어지지 않았습니다",manage:"관리",extensions:"확장 기능",no_extensions:"아직 설치된 확장 기능들이 없네요 :(",created:"생성됨",search_extensions:"확장 기능 검색하기",warning:"주의",repository:"저장소",confirm_continue:"정말로 계속할까요?",manage_extension_details:"확장 기능 설치/삭제하기",install:"설치",uninstall:"삭제",drop_db:"데이터 삭제",enable:"활성화",enable_extension_details:"현재 사용자 계정에 해당 확장 기능을 활성화합니다",disable:"비활성화",installed:"설치됨",activated:"작동됨",deactivated:"작동 중지",release_notes:"배포 노트",activate_extension_details:"사용자들의 확장 기능 사용 가능 여부를 결정합니다",featured:"추천",all:"전체",only_admins_can_install:"(관리자 계정만이 확장 기능을 설치할 수 있습니다)",admin_only:"관리자 전용",new_version:"새로운 버전",extension_depends_on:"의존성 존재:",extension_rating_soon:"평점 기능도 곧 구현됩니다",extension_installed_version:"설치된 버전",extension_uninstall_warning:"모든 사용자들로부터 이 확장 기능을 제거한다는 점에 유의하세요.",uninstall_confirm:"네, 삭제합니다",extension_db_drop_info:"해당 확장 기능의 모든 데이터가 영구적으로 삭제됩니다. 작업 수행 후에는 되돌릴 수 없습니다!",extension_db_drop_warning:"해당 확장 기능의 모든 데이터가 영구적으로 삭제될 겁니다. 계속하려면 확장 기능의 이름을 입력해주세요:",extension_min_lnbits_version:"이 배포 버전은 더 높은 버전의 lnbits가 설치되어 있어야 합니다.",payment_hash:"결제 해쉬값",fee:"수수료",amount:"액수",tag:"태그",unit:"단위",description:"상세",expiry:"만료",webhook:"Webhook",payment_proof:"Payment 증거",update_available:"{version}으로 업데이트가 가능합니다.",latest_update:"이미 {version} 버전으로 업데이트되었습니다.",notifications:"알림",no_notifications:"알림 없음",notifications_disabled:"LNbits 상태 알림이 비활성화되었습니다.",enable_notifications:"알림 활성화",enable_notifications_desc:"활성화 시, 가장 최신의 보안 사고나 소프트웨어 업데이트 등의 LNbits 상황 업데이트를 불러옵니다.",enable_killswitch:"비상 정지 활성화",enable_killswitch_desc:"활성화 시, LNbits 메인 서버에서 비상 정지 신호를 보내면 자동으로 자금의 원천을 VoidWallet으로 변경합니다. 업데이트 이후 수동으로 활성화해 주어야 합니다.",killswitch_interval:"비상 정지 시간 간격",killswitch_interval_desc:"LNbits 메인 서버에서 나오는 비상 정지 신호를 백그라운드 작업으로 얼마나 자주 확인할 것인지를 결정합니다. (분 단위)",enable_watchdog:"와치독 활성화",enable_watchdog_desc:"활성화 시, LNbits 잔금보다 당신의 잔금이 지정한 수준보다 더 낮아질 경우 자동으로 자금의 원천을 VoidWallet으로 변경합니다. 업데이트 이후 수동으로 활성화해 주어야 합니다.",watchdog_interval:"와치독 시간 간격",watchdog_interval_desc:"와치독 델타 값을 기반으로 하여 당신의 LNbits 서버에서 나오는 비상 정지 신호를 백그라운드 작업으로 얼마나 자주 확인할 것인지를 결정합니다. (분 단위)",watchdog_delta:"와치독 델타",watchdog_delta_desc:"당신의 자금 원천을 VoidWallet으로 변경하기까지의 기준 값 [LNbits 잔액 - 노드 잔액 > 델타 값]",status:"상황",notification_source:"알림 메세지 출처",notification_source_label:"알림 메세지를 가져올 URL (공식 LNbits 상황판 출처나, 당신이 신뢰할 수 있는 출처만을 사용하세요)",more:"더 알아보기",less:"적게",releases:"배포 버전들",killswitch:"비상 정지",watchdog:"와치독",server_logs:"서버 로그",ip_blocker:"IP 기반 차단기",security:"보안",security_tools:"보안 도구들",block_access_hint:"IP 기준으로 접속 차단하기",allow_access_hint:"IP 기준으로 접속 허용하기 (차단한 IP들을 무시합니다)",enter_ip:"IP 주소를 입력하고 Enter를 눌러주세요",rate_limiter:"횟수로 제한하기",wallet_limiter:"지갑 제한기",wallet_limit_max_withdraw_per_day:"일일 최대 지갑 출금액(sats) (0은 비활성화)",wallet_max_ballance:"지갑 최대 잔액(sats) (0은 비활성화)",wallet_limit_secs_between_trans:"지갑 당 거래 사이 최소 초 (0은 비활성화)",number_of_requests:"요청 횟수",time_unit:"시간 단위",minute:"분",second:"초",hour:"시간",disable_server_log:"서버 로깅 중단하기",enable_server_log:"서버 로깅 활성화하기",coming_soon:"곧 구현될 기능들입니다",session_has_expired:"세션 유효 기간이 만료되었습니다. 다시 로그인해 주세요.",instant_access_question:"즉시 액세스하시겠습니까?",login_with_user_id:"사용자 ID로 로그인",or:"또는",create_new_wallet:"새 지갑 만들기",login_to_account:"계정에 로그인하세요.",create_account:"계정 생성",account_settings:"계정 설정",signin_with_google:"Google으로 로그인",signin_with_github:"GitHub으로 로그인",signin_with_keycloak:"Keycloak으로 로그인",username_or_email:"사용자 이름 또는 이메일",password:"비밀번호",password_config:"비밀번호 설정",password_repeat:"비밀번호 재입력",change_password:"비밀번호 변경",set_password:"비밀번호 설정",invalid_password:"비밀번호는 최소 8자 이상이어야 합니다",login:"로그인",register:"등록",username:"사용자 이름",user_id:"사용자 ID",email:"이메일",first_name:"성명",last_name:"성",picture:"사진",verify_email:"이메일을 인증하려면",account:"계정",update_account:"계정 업데이트",invalid_username:"잘못된 사용자 이름",auth_provider:"인증 제공자",my_account:"내 계정",back:"뒤로",logout:"로그아웃",look_and_feel:"외관과 느낌",language:"언어",color_scheme:"색상 구성",extension_cost:"이 버전은 최소 {cost} sats의 지불이 필요합니다.",extension_paid_sats:"당신은 이미 {paid_sats} sats를 지불했습니다.",release_details_error:"릴리스 세부 정보를 가져올 수 없습니다.",pay_from_wallet:"지갑에서 결제하다",show_qr:"QR 보기",retry_install:"다시 설치하세요",new_payment:"새로운 결제하기",hide_empty_wallets:"빈 지갑 숨기기"},window.localisation.fi={confirm:"Kyllä",server:"Palvelin",theme:"Teema",funding:"Rahoitus",users:"Käyttäjät",apps:"Sovellukset",channels:"Kanavat",transactions:"Tapahtumat",dashboard:"Ohjauspaneeli",node:"Solmu",export_users:"Vie käyttäjät",no_users:"Käyttäjiä ei löytynyt",total_capacity:"Kokonaiskapasiteetti",avg_channel_size:"Keskimääräisen kanavan kapasiteetti",biggest_channel_size:"Suurimman kanavan kapasiteetti",smallest_channel_size:"Pienimmän kanavan kapasiteetti",number_of_channels:"Kanavien lukumäärä",active_channels:"Aktiivisia kanavia",connect_peer:"Yhdistä naapuriin",connect:"Yhdistä",open_channel:"Avaa kanava",open:"Avaa",close_channel:"Sulje kanava",close:"Sulje",restart:"Palvelimen uudelleen käynnistys",save:"Tallenna",save_tooltip:"Tallenna muutokset",topup:"Topup",topup_wallet:"Lisää varoja lompakkoon",topup_hint:"Lisää varoja lompakkoon sen ID:n perusteella",restart_tooltip:"Uudelleenkäynnistä palvelu muutosten käyttöönottamiseksi",add_funds_tooltip:"Lisää varoja lompakkoon",reset_defaults:"Peruuta muutokset",reset_defaults_tooltip:"Poista kaikki asetusten muutokset ja palauta järjestelmän oletusasetukset.",download_backup:"Lataa tietokannan varmuuskopio",name_your_wallet:"Anna {name}-lompakollesi nimi",wallet_topup_ok:"Virtuaalisten varojen luominen onnistui ({amount} sats). Maksut riippuvat rahoituslähteen todellisista varoista.",paste_invoice_label:"Liitä lasku, maksupyyntö, lnurl-koodi tai Lightning Address *",lnbits_description:"Kevyt ja helppokäyttöinen LNbits voi käyttää rahoituslähteinään erilaisia palveluita, ja jopa LNbits itseään! Voit käyttää sitä itsenäisesti ja helposti tarjota erilaisia Lightning-palveluita. Pystyt luomaan sillä salamaverkkolompakoita eikä niiden määrää ole rajoitettu. Jokaiselle lompakolle saat yksilölliset API-avaimet. Varojen osittaminen tekee siitä erittäin kätevän varojen hallinnassa sekä myös ohjelmistokehityksen työkalun. Laajennukset lisäävät LNbits:in toiminnallisuuksia. Näinpä voit helposti testailla useita erilaisia ja viimeisimpiä salamaverkon teknologioita. Laajennuksien kehittämisen olemme pyrkineet tekemään mahdollisimman helpoksi pitämällä LNbits:in ilmaisena OpenSource-projektina. Kannustamme kaikkia kehittämään ja jakelemaan omia laajennuksia!",export_to_phone:"Käytä puhelimessa lukemalla QR-koodi",export_to_phone_desc:"Tämä QR-koodi sisältää URL-osoitteen, jolla saa lompakkoosi täydet valtuudet. Voi lukea sen puhelimellasi ja avata sillä lompakkosi. Voit myös lisätä lompakkosi selaimella käytettäväksi PWA-sovellukseksi puhelimen aloitusruudulle. ",wallets:"Lompakot",add_wallet:"Lisää lompakko",delete_wallet:"Poista lompakko",delete_wallet_desc:"Lompakko poistetaan pysyvästi. Siirrä lompakosta varat ennalta muualle, sillä tämä toiminto on PERUUTTAMATON!",rename_wallet:"Nimeä lompakko uudelleen",update_name:"Tallenna",fiat_tracking:"Käytettävä valuutta",currency:"Valuutta",update_currency:"Tallenna",press_to_claim:"Lunasta varat painamalla tästä",donate:"Lahjoita",view_github:"Näytä GitHub:ssa",voidwallet_active:"Maksutapahtumat ovat poissa käytöstä, koska VoidWallet on aktiivinen!",use_with_caution:"KÄYTÄ VAROEN - BETA-ohjelmisto on käytössä palvelussa: {name}",service_fee:"Palvelumaksu: {amount} % tapahtumasta",service_fee_max:"Palvelumaksu: {amount} % tapahtumasta (enintään {max} sat)",service_fee_tooltip:"LNbits palvelimen ylläpitäjä veloittaa lähtevästä maksusta palvelumaksun.",toggle_darkmode:"Tumma näkymä",payment_reactions:"Maksureaktiot",view_swagger_docs:"Näytä LNbits Swagger API-dokumentit",api_docs:"API-dokumentaatio",api_keys_api_docs:"Solmun URL, API-avaimet ja -dokumentaatio",lnbits_version:"LNbits versio",runs_on:"Mukana menossa",credit_hint:"Hyväksy painamalla Enter",credit_label:"Lisää tilille varoja {denomination}",paste:"Liitä",paste_from_clipboard:"Liitä leikepöydältä",paste_request:"Liitä pyyntö",create_invoice:"Laskuta",camera_tooltip:"Kuvaa lasku tai QR-koodi",export_csv:"Vie CSV-tiedostoon",chart_tooltip:"Näytä kaaviokuva",pending:"Odottaa",copy_invoice:"Kopioi lasku",withdraw_from:"Nosta kohteesta",cancel:"Peruuta",scan:"Scannaa",read:"Lue",pay:"Maksa",memo:"Kuvaus",date:"Päiväys",processing_payment:"Maksua käsitellään...",not_enough_funds:"Varat eivät riitä!",search_by_tag_memo_amount:"Etsi tunnisteella, muistiolla tai määrällä",invoice_waiting:"Lasku osottaa maksamista",payment_received:"Maksu vastaanotettu",payment_sent:"Maksu lähetetty",receive:"vastaanota",send:"lähetä",outgoing_payment_pending:"Lähtevä maksu odottaa",drain_funds:"Tyhjennä varat",drain_funds_desc:"Tämä LNURL-withdraw -tyyppinen QR-koodi on tarkoitettu kaikkien varojen imurointiin lompakosta. ÄLÄ JAA SITÄ KENELLEKÄÄN! Se on balanceCheck- ja balanceNotify-toimintojen kanssa yhteensopiva, joten sitä voi käyttää lompakon tyhjentämiseen ensimmäisen käytön jälleen jatkuvasti.",i_understand:"Vakuutan ymmärtäväni",copy_wallet_url:"Kopioi lompakon URL",disclaimer_dialog_title:"Tärkeää!",disclaimer_dialog:"Muistathan tallettaa kirjautumistietosi turvallisesta ja helposti saataville, jotta pääset jatkossakin kirjautumaan lompakkoosi! Tutustu myös Tilin asetukset -sivuun. Tämä palvelu on kokeiluvaiheessa (eli BETA), ja niinpä kukaan ei ota mitään vastuuta varojen säilymisestä tai niiden käytettävyyden takaamisesta.",no_transactions:"Lompakossa ei ole yhtään tapahtumaa",manage:"Hallinnointi",extensions:"Laajennukset",no_extensions:"Laajennuksia ei ole asennettu :(",created:"Luotu",search_extensions:"Etsi laajennuksia",warning:"Varoitus",repository:"Laajennuksien lähde",confirm_continue:"Haluatko varmasti jatkaa?",manage_extension_details:"Asenna/Poista laajennus",install:"Asenna",uninstall:"Poista",drop_db:"Poista tiedot",enable:"Ota käyttöön",enable_extension_details:"Ota laajennus käyttöön tälle käyttäjälle",disable:"Poista käytöstä",installed:"Asennettu",activated:"Käytössä",deactivated:"Poissa käytöstä",release_notes:"Julkaisutiedot",activate_extension_details:"Aseta/Poista laajennus käyttäjien saatavilta",featured:"Esittelyssä",all:"Kaikki",only_admins_can_install:"(Vain pääkäyttäjät voivat asentaa laajennuksia)",admin_only:"Pääkäyttäjille",new_version:"Uusi versio",extension_depends_on:"Edellyttää:",extension_rating_soon:"Arvostelut on tulossa pian",extension_installed_version:"Nykyinen versio",extension_uninstall_warning:"Olet poistamassa laajennuksen kaikilta käyttäjiltä.",uninstall_confirm:"Kyllä, poista asennus",extension_db_drop_info:"Kaikki laajennuksen tallettama tieto poistetaan pysyvästi. Poistoa ei voi jälkikäteen peruuttaa!",extension_db_drop_warning:"Olet tuhoamassa laajennuksen tallettamat tiedot. Vahvista poisto kirjoittamalla viivalle seuraavassa näkyvä laajennuksen nimi:",extension_min_lnbits_version:"Tämä julkaisu vaatii vähintään LNbits-version",payment_hash:"Maksun tiiviste",fee:"Kulu",amount:"Määrä",tag:"Tunniste",unit:"Yksikkö",description:"Kuvaus",expiry:"Vanheneminen",webhook:"Webhook",payment_proof:"Maksun varmenne",update_available:"Saatavilla on päivitys versioon {version}!",latest_update:"Käytössä oleva versio {version}, on viimeisin saatavilla oleva.",notifications:"Tiedotteet",no_notifications:"Ei tiedotteita",notifications_disabled:"LNbits-tilatiedotteet on poistettu käytöstä.",enable_notifications:"Ota tiedotteet käyttöön",enable_notifications_desc:"Tämän ollessa valittuna, noudetaan LNbits-tilatiedotteet. Niitä ovat esimerkiksi turvallisuuteen liittyvät tapahtumatiedotteet ja tiedot tämän ohjelmiston päivityksistä.",enable_killswitch:"Ota Killswitch käyttöön",enable_killswitch_desc:"Jos LNbits antaa killswitch-komennon, niin rahoituslähteeksi valitaan automaattisesti heti VoidWallet. Päivityksen jälkeen tämä asetus pitää tarkastaa uudelleen.",killswitch_interval:"Killswitch-aikaväli",killswitch_interval_desc:"Tällä määritetään kuinka usein taustatoiminto tarkistaa killswitch-signaalin tilatiedotteiden lähteestä. Hakujen väli ilmoitetaan minuutteina.",enable_watchdog:"Ota Watchdog käyttöön",enable_watchdog_desc:"Tämän ollessa käytössä, ja solmun varojen laskiessa alle LNbits-varojen määrän, otetaan automaattisesti käyttöön VoidWallet. Päivityksen jälkeen tämä asetus pitää tarkastaa uudelleen.",watchdog_interval:"Watchdog-aikaväli",watchdog_interval_desc:"Tällä määritetään kuinka usein taustatoiminto tarkistaa varojen Delta-muutokset [node_balance - lnbits_balance] killswitch-signaalille. Hakujen väli ilmoitetaan minuutteina.",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Saldomuutoksen raja-arvo jolloin killswitch-muuttaa rahoituslähteeksi VoidWallet:in [lnbits_balance - node_balance > delta]",status:"Tilanne",notification_source:"Tiedotteiden lähde",notification_source_label:"Lähde-URL (käytä ainoastaan LNbits:iä tai muuta luotettavaa lähdettä)",more:"enemmän",less:"vähemmän",releases:"Julkaisut",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Palvelimen lokit",ip_blocker:"IP-suodatin",security:"Turvallisuus",security_tools:"Turvallisuus työkalut",block_access_hint:"Estä pääsy IP-osoitteen perusteella",allow_access_hint:"Salli pääsy IP-osoitteen perusteella (ohittaa estot)",enter_ip:"Anna IP ja paina +",rate_limiter:"Toiston rajoitin",wallet_limiter:"Lompakon Rajoitin",wallet_limit_max_withdraw_per_day:"Maksimi päivittäinen lompakon nosto sateissa (0 poistaa käytöstä)",wallet_max_ballance:"Lompakon maksimisaldo satosheina (0 poistaa käytöstä)",wallet_limit_secs_between_trans:"Min sekuntia transaktioiden välillä lompakkoa kohden (0 poistaa käytöstä)",number_of_requests:"Pyyntöjen lukumäärä",time_unit:"aikayksikkö",minute:"minuutti",second:"sekunti",hour:"tunti",disable_server_log:"Poista palvelimen loki käytöstä",enable_server_log:"Ota palvelimen loki käyttöön",coming_soon:"Ominaisuus on tulossa pian",session_has_expired:"Käyttämätön sessio on vanhentunut. Kirjaudu uudelleen.",instant_access_question:"Kirjaudu aikaisemmin luodulla tiedolla",login_with_user_id:"Kirjaudu käyttäjä-ID:llä",or:"tai",create_new_wallet:"Avaa uusi lompakko",login_to_account:"Kirjaudu käyttäjänimellä",create_account:"Luo tili",account_settings:"Tilin asetukset",signin_with_google:"Kirjaudu Google-tunnuksella",signin_with_github:"Kirjaudu GitHub-tunnuksella",signin_with_keycloak:"Kirjaudu Keycloak-tunnuksella",username_or_email:"Käyttäjänimi tai sähköposti",password:"Anna uusi salasana",password_config:"Salasanan määritys",password_repeat:"Toista uusi salasana",change_password:"Vaihda salasana",set_password:"Aseta salasana",invalid_password:"Salasanassa tulee olla vähintään kahdeksan merkkiä",login:"Kirjaudu",register:"Rekisteröidy",username:"Käyttäjänimi",user_id:"Käyttäjä ID",email:"Sähköposti",first_name:"Etunimi",last_name:"Sukunimi",picture:"Kuva",verify_email:"Vahvista sähköposti",account:"Tili",update_account:"Päivitä tiliä",invalid_username:"Virheellinen käyttäjänimi",auth_provider:"Tunnistamisen toimittaja",my_account:"Tilini",back:"Takaisin",logout:"Poistu",look_and_feel:"Kieli ja värit",language:"Kieli",color_scheme:"Väriteema",extension_cost:"Tämä julkaisu edellyttää vähintään {cost} satsin maksua.",extension_paid_sats:"Olet jo maksanut {paid_sats} satsia.",release_details_error:"Ei voi hakea julkaisun tietoja.",pay_from_wallet:"Maksa lompakosta",show_qr:"Näytä QR",retry_install:"Yritä asennusta uudelleen",new_payment:"Tee uusi maksu",hide_empty_wallets:"Piilota tyhjät lompakot"},window.LOCALE="en",window.i18n=new VueI18n.createI18n({locale:window.LOCALE,fallbackLocale:window.LOCALE,messages:window.localisation}),window.LNbits={api:{request:function(e,t,n,a){return axios({method:e,url:t,headers:{"X-Api-Key":n},data:a})},getServerHealth:function(){return this.request("get","/api/v1/health")},createInvoice:async function(e,t,n,a="sat",i=null){return this.request("post","/api/v1/payments",e.inkey,{out:!1,amount:t,memo:n,lnurl_callback:i,unit:a})},payInvoice:function(e,t){return this.request("post","/api/v1/payments",e.adminkey,{out:!0,bolt11:t})},payLnurl:function(e,t,n,a,i="",r="",o=""){return this.request("post","/api/v1/payments/lnurl",e.adminkey,{callback:t,description_hash:n,amount:a,comment:r,description:i,unit:o})},authLnurl:function(e,t){return this.request("post","/api/v1/lnurlauth",e.adminkey,{callback:t})},createAccount:function(e){return this.request("post","/api/v1/account",null,{name:e})},register:function(e,t,n,a){return axios({method:"POST",url:"/api/v1/auth/register",data:{username:e,email:t,password:n,password_repeat:a}})},reset:function(e,t,n){return axios({method:"PUT",url:"/api/v1/auth/reset",data:{reset_key:e,password:t,password_repeat:n}})},login:function(e,t){return axios({method:"POST",url:"/api/v1/auth",data:{username:e,password:t}})},loginByProvider:function(e,t,n){return axios({method:"POST",url:`/api/v1/auth/${e}`,headers:t,data:n})},loginUsr:function(e){return axios({method:"POST",url:"/api/v1/auth/usr",data:{usr:e}})},logout:function(){return axios({method:"POST",url:"/api/v1/auth/logout"})},getAuthenticatedUser:function(){return this.request("get","/api/v1/auth")},getWallet:function(e){return this.request("get","/api/v1/wallet",e.inkey)},createWallet:function(e,t){return this.request("post","/api/v1/wallet",e.adminkey,{name:t}).then((e=>{window.location="/wallet?wal="+e.data.id}))},updateWallet:function(e,t){return this.request("patch","/api/v1/wallet",t.adminkey,{name:e})},deleteWallet:function(e){return this.request("delete","/api/v1/wallet",e.adminkey).then((e=>{let t=new URL(window.location.href);t.searchParams.delete("wal"),window.location=t}))},getPayments:function(e,t){return this.request("get","/api/v1/payments/paginated?"+t,e.inkey)},getPayment:function(e,t){return this.request("get","/api/v1/payments/"+t,e.inkey)},updateBalance:function(e,t){return this.request("PUT","/users/api/v1/topup",null,{amount:e,id:t})},getCurrencies(){return this.request("GET","/api/v1/currencies").then((e=>["sats",...e.data]))}},events:{onInvoicePaid:function(e,t){let n=e=>{t(JSON.parse(e.data))};return this.listenersCount=this.listenersCount||{[e.inkey]:0},this.listenersCount[e.inkey]++,this.listeners=this.listeners||{},e.inkey in this.listeners||(this.listeners[e.inkey]=new EventSource("/api/v1/payments/sse?api-key="+e.inkey)),this.listeners[e.inkey].addEventListener("payment-received",n),()=>{this.listeners[e.inkey].removeEventListener("payment-received",n),this.listenersCount[e.inkey]--,this.listenersCount[e.inkey]<=0&&(this.listeners[e.inkey].close(),delete this.listeners[e.inkey])}}},map:{extension:function(e){const t=_.object(["code","isValid","isAdminOnly","name","shortDescription","tile","contributors","hidden"],e);return t.url=["/",t.code,"/"].join(""),t},user:function(e){const t={id:e.id,admin:e.admin,email:e.email,extensions:e.extensions,wallets:e.wallets,admin:e.admin},n=this.wallet;return t.wallets=t.wallets.map((function(e){return n(e)})).sort((function(e,t){return e.name.localeCompare(t.name)})),t.walletOptions=t.wallets.map((function(e){return{label:[e.name," - ",e.id].join(""),value:e.id}})),t},wallet:function(e){return newWallet={id:e.id,name:e.name,adminkey:e.adminkey,inkey:e.inkey,currency:e.currency},newWallet.msat=e.balance_msat,newWallet.sat=Math.floor(e.balance_msat/1e3),newWallet.fsat=new Intl.NumberFormat(window.LOCALE).format(newWallet.sat),newWallet.url=`/wallet?&wal=${e.id}`,newWallet},payment:function(e){obj={checking_id:e.checking_id,status:e.status,amount:e.amount,fee:e.fee,memo:e.memo,time:e.time,bolt11:e.bolt11,preimage:e.preimage,payment_hash:e.payment_hash,expiry:e.expiry,extra:e.extra,wallet_id:e.wallet_id,webhook:e.webhook,webhook_status:e.webhook_status,fiat_amount:e.fiat_amount,fiat_currency:e.fiat_currency},obj.date=Quasar.date.formatDate(new Date(1e3*obj.time),"YYYY-MM-DD HH:mm"),obj.dateFrom=moment(obj.date).fromNow(),obj.expirydate=Quasar.date.formatDate(new Date(1e3*obj.expiry),"YYYY-MM-DD HH:mm"),obj.expirydateFrom=moment(obj.expirydate).fromNow(),obj.msat=obj.amount,obj.sat=obj.msat/1e3,obj.tag=obj.extra?.tag,obj.fsat=new Intl.NumberFormat(window.LOCALE).format(obj.sat),obj.isIn=obj.amount>0,obj.isOut=obj.amount<0,obj.isPending="pending"===obj.status,obj.isPaid="success"===obj.status,obj.isFailed="failed"===obj.status,obj._q=[obj.memo,obj.sat].join(" ").toLowerCase();try{obj.details=JSON.parse(e.extra?.details||"{}")}catch{obj.details={extraDetails:e.extra?.details}}return obj}},utils:{confirmDialog:function(e){return Quasar.Dialog.create({message:e,ok:{flat:!0,color:"orange"},cancel:{flat:!0,color:"grey"}})},digestMessage:async function(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map((e=>e.toString(16).padStart(2,"0"))).join("")},formatCurrency:function(e,t){return new Intl.NumberFormat(window.LOCALE,{style:"currency",currency:t}).format(e)},formatSat:function(e){return new Intl.NumberFormat(window.LOCALE).format(e)},formatMsat:function(e){return this.formatSat(e/1e3)},notifyApiError:function(e){if(!e.response)return console.error(e);Quasar.Notify.create({timeout:5e3,type:{400:"warning",401:"warning",500:"negative"}[e.response.status]||"warning",message:e.response.data.message||e.response.data.detail||null,caption:[e.response.status," ",e.response.statusText].join("").toUpperCase()||null,icon:null})},search:function(e,t,n,a){try{const i=t.toLowerCase().split(a||" ");return e.filter((function(e){let t=0;return _.each(i,(function(a){-1!==e[n].indexOf(a)&&t++})),t===i.length}))}catch(t){return e}},prepareFilterQuery(e,t){t&&(e.pagination=t.pagination);let n=e.pagination;e.loading=!0;const a={limit:n.rowsPerPage,offset:(n.page-1)*n.rowsPerPage,sortby:n.sortBy??"",direction:n.descending?"desc":"asc",...e.filter};return e.search&&(a.search=e.search),new URLSearchParams(a)},exportCSV:function(e,t,n){const a=function(e,t){let n=void 0!==t?t(e):e;return n=null==n?"":String(n),n=n.split('"').join('""'),`"${n}"`},i=[e.map((function(e){return a(e.label)}))].concat(t.map((function(t){return e.map((function(e){return a("function"==typeof e.field?e.field(t):t[void 0===e.field?e.name:e.field],e.format)})).join(",")}))).join("\r\n");!0!==Quasar.exportFile(`${n||"table-export"}.csv`,i,"text/csv")&&Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null})},convertMarkdown(e){const t=new showdown.Converter;return t.setFlavor("github"),t.setOption("simpleLineBreaks",!0),t.makeHtml(e)},hexToRgb:function(e){return Quasar.colors.hexToRgb(e)},hexDarken:function(e,t){return Quasar.colors.lighten(e,t)},hexAlpha:function(e,t){return Quasar.colors.changeAlpha(e,t)},getPaletteColor:function(e){return Quasar.colors.getPaletteColor(e)}}},window.windowMixin={i18n:window.i18n,data:function(){return{toggleSubs:!0,reactionChoice:"confettiBothSides",gradientChoice:this.$q.localStorage.getItem("lnbits.gradientBg")||!1,isUserAuthorized:!1,g:{offline:!navigator.onLine,visibleDrawer:!1,extensions:[],user:null,wallet:null,payments:[],allowedThemes:null,langs:[]}}},methods:{changeColor:function(e){document.body.setAttribute("data-theme",e),this.$q.localStorage.set("lnbits.theme",e)},applyGradient:function(){if(this.$q.localStorage.getItem("lnbits.gradientBg")){this.setColors(),darkBgColor=this.$q.localStorage.getItem("lnbits.darkBgColor"),primaryColor=this.$q.localStorage.getItem("lnbits.primaryColor");const e=`linear-gradient(to bottom right, ${LNbits.utils.hexDarken(String(primaryColor),-70)}, #0a0a0a)`;document.body.style.setProperty("background-image",e,"important");const t=`background-color: ${LNbits.utils.hexAlpha(String(darkBgColor),.4)} !important`,n=document.createElement("style");n.innerHTML=`body[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"] .q-card:not(.q-dialog .q-card, .lnbits__dialog-card, .q-dialog-plugin--dark), body.body${this.$q.dark.isActive?"--dark":""} .q-header, body.body${this.$q.dark.isActive?"--dark":""} .q-drawer { ${t} }body[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"].body--dark{background: ${LNbits.utils.hexDarken(String(primaryColor),-88)} !important; }[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"] .q-card--dark{background: ${String(darkBgColor)} !important;} }`,document.head.appendChild(n)}},setColors:function(){this.$q.localStorage.set("lnbits.primaryColor",LNbits.utils.getPaletteColor("primary")),this.$q.localStorage.set("lnbits.secondaryColor",LNbits.utils.getPaletteColor("secondary")),this.$q.localStorage.set("lnbits.darkBgColor",LNbits.utils.getPaletteColor("dark"))},copyText:function(e,t,n){Quasar.copyToClipboard(e).then((function(){Quasar.Notify.create({message:t||"Copied to clipboard!",position:n||"bottom"})}))},checkUsrInUrl:async function(){try{const e=new URLSearchParams(window.location.search),t=e.get("usr");if(!t)return;this.isUserAuthorized||await LNbits.api.loginUsr(t),e.delete("usr");const n=e.size?`?${e.toString()}`:"";window.history.replaceState({},document.title,window.location.pathname+n)}finally{this.isUserAuthorized=!!this.$q.cookies.get("is_lnbits_user_authorized")}},logout:async function(){LNbits.utils.confirmDialog('Do you really want to logout? Please visit "My Account" page to check your credentials!').onOk((async()=>{try{await LNbits.api.logout(),window.location="/"}catch(e){LNbits.utils.notifyApiError(e)}}))},themeParams(){const e=new URL(window.location.href),t=new URLSearchParams(window.location.search),n=["theme","dark","gradient"],a=e=>"true"===e.trim().toLowerCase()||"1"===e;if(n.some((e=>t.has(e)))){const i=t.get("theme"),r=t.get("dark"),o=t.get("gradient");if(i&&this.g.allowedThemes.includes(i.trim().toLowerCase())){const e=i.trim().toLowerCase();document.body.setAttribute("data-theme",e),this.$q.localStorage.set("lnbits.theme",e)}if(r){const e=a(r);this.$q.localStorage.set("lnbits.darkMode",e),e||this.$q.localStorage.set("lnbits.gradientBg",!1)}if(o){const e=a(o);this.$q.localStorage.set("lnbits.gradientBg",e),e&&this.$q.localStorage.set("lnbits.darkMode",!0)}n.forEach((e=>t.delete(e))),window.history.replaceState(null,null,e.pathname)}this.setColors()}},created:async function(){1==this.$q.localStorage.getItem("lnbits.darkMode")||0==this.$q.localStorage.getItem("lnbits.darkMode")?this.$q.dark.set(this.$q.localStorage.getItem("lnbits.darkMode")):this.$q.dark.set(!0),this.reactionChoice=this.$q.localStorage.getItem("lnbits.reactions")||"confettiBothSides",this.g.allowedThemes=window.allowedThemes??["bitcoin"];let e=this.$q.localStorage.getItem("lnbits.lang");if(e&&(window.LOCALE=e,window.i18n.global.locale=e),this.g.langs=window.langs??[],addEventListener("offline",(e=>{this.g.offline=!0})),addEventListener("online",(e=>{this.g.offline=!1})),this.$q.localStorage.getItem("lnbits.theme")||this.changeColor(this.g.allowedThemes[0]),this.$q.localStorage.getItem("lnbits.theme")&&!this.g.allowedThemes.includes(this.$q.localStorage.getItem("lnbits.theme"))&&this.changeColor(this.g.allowedThemes[0]),this.$q.localStorage.getItem("lnbits.theme")&&document.body.setAttribute("data-theme",this.$q.localStorage.getItem("lnbits.theme")),this.applyGradient(),window.user&&(this.g.user=Object.freeze(window.LNbits.map.user(window.user))),window.wallet&&(this.g.wallet=Object.freeze(window.LNbits.map.wallet(window.wallet))),window.extensions){const e=this.g.user,t=Object.freeze(window.extensions.map((function(e){return window.LNbits.map.extension(e)})).filter((function(e){return!e.hidden})).filter((function(e){return window.user?.admin?e:!e.isAdminOnly})).map((function(t){return t.isEnabled=!!e&&-1!==e.extensions.indexOf(t.code),t})).sort((function(e,t){const n=e.name.toUpperCase(),a=t.name.toUpperCase();return na?1:0})));this.g.extensions=t}await this.checkUsrInUrl(),this.themeParams()}},window.decryptLnurlPayAES=function(e,t){let n=new Uint8Array(t.match(/[\da-f]{2}/gi).map((e=>parseInt(e,16))));return crypto.subtle.importKey("raw",n,{name:"AES-CBC",length:256},!1,["decrypt"]).then((t=>{let n=Uint8Array.from(window.atob(e.iv),(e=>e.charCodeAt(0))),a=Uint8Array.from(window.atob(e.ciphertext),(e=>e.charCodeAt(0)));return crypto.subtle.decrypt({name:"AES-CBC",iv:n},t,a)})).then((e=>new TextDecoder("utf-8").decode(e)))},function(e,t){!function e(t,n,a,i){var r=!!(t.Worker&&t.Blob&&t.Promise&&t.OffscreenCanvas&&t.OffscreenCanvasRenderingContext2D&&t.HTMLCanvasElement&&t.HTMLCanvasElement.prototype.transferControlToOffscreen&&t.URL&&t.URL.createObjectURL);function o(){}function s(e){var a=n.exports.Promise,i=void 0!==a?a:t.Promise;return"function"==typeof i?new i(e):(e(o,o),null)}var l,u,c,d,h,p,f,m,g=(c=Math.floor(1e3/60),d={},h=0,"function"==typeof requestAnimationFrame&&"function"==typeof cancelAnimationFrame?(l=function(e){var t=Math.random();return d[t]=requestAnimationFrame((function n(a){h===a||h+c-1{a=(a<<5)+e,n+=5,n>=8&&(i.push(a>>n-8&255),n-=8)})),t&&n>0&&i.push(a<<8-n&255),i}function bech32ToUTF8String(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n="";for(let e=0;e20&&(t-=20,e/=Math.pow(10,t),e+=new Array(t+1).join("0"));return e} +function(){function e(e){"use strict";var t={omitExtraWLInCodeBlocks:{defaultValue:!1,describe:"Omit the default extra whiteline added to code blocks",type:"boolean"},noHeaderId:{defaultValue:!1,describe:"Turn on/off generated header id",type:"boolean"},prefixHeaderId:{defaultValue:!1,describe:"Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic 'section-' prefix",type:"string"},rawPrefixHeaderId:{defaultValue:!1,describe:'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the " char is used in the prefix)',type:"boolean"},ghCompatibleHeaderId:{defaultValue:!1,describe:"Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)",type:"boolean"},rawHeaderId:{defaultValue:!1,describe:"Remove only spaces, ' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids",type:"boolean"},headerLevelStart:{defaultValue:!1,describe:"The header blocks level start",type:"integer"},parseImgDimensions:{defaultValue:!1,describe:"Turn on/off image dimension parsing",type:"boolean"},simplifiedAutoLink:{defaultValue:!1,describe:"Turn on/off GFM autolink style",type:"boolean"},excludeTrailingPunctuationFromURLs:{defaultValue:!1,describe:"Excludes trailing punctuation from links generated with autoLinking",type:"boolean"},literalMidWordUnderscores:{defaultValue:!1,describe:"Parse midword underscores as literal underscores",type:"boolean"},literalMidWordAsterisks:{defaultValue:!1,describe:"Parse midword asterisks as literal asterisks",type:"boolean"},strikethrough:{defaultValue:!1,describe:"Turn on/off strikethrough support",type:"boolean"},tables:{defaultValue:!1,describe:"Turn on/off tables support",type:"boolean"},tablesHeaderId:{defaultValue:!1,describe:"Add an id to table headers",type:"boolean"},ghCodeBlocks:{defaultValue:!0,describe:"Turn on/off GFM fenced code blocks support",type:"boolean"},tasklists:{defaultValue:!1,describe:"Turn on/off GFM tasklist support",type:"boolean"},smoothLivePreview:{defaultValue:!1,describe:"Prevents weird effects in live previews due to incomplete input",type:"boolean"},smartIndentationFix:{defaultValue:!1,describe:"Tries to smartly fix indentation in es6 strings",type:"boolean"},disableForced4SpacesIndentedSublists:{defaultValue:!1,describe:"Disables the requirement of indenting nested sublists by 4 spaces",type:"boolean"},simpleLineBreaks:{defaultValue:!1,describe:"Parses simple line breaks as
(GFM Style)",type:"boolean"},requireSpaceBeforeHeadingText:{defaultValue:!1,describe:"Makes adding a space between `#` and the header text mandatory (GFM Style)",type:"boolean"},ghMentions:{defaultValue:!1,describe:"Enables github @mentions",type:"boolean"},ghMentionsLink:{defaultValue:"https://github.com/{u}",describe:"Changes the link generated by @mentions. Only applies if ghMentions option is enabled.",type:"string"},encodeEmails:{defaultValue:!0,describe:"Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities",type:"boolean"},openLinksInNewWindow:{defaultValue:!1,describe:"Open all links in new windows",type:"boolean"},backslashEscapesHTMLTags:{defaultValue:!1,describe:"Support for HTML Tag escaping. ex:
foo
",type:"boolean"},emoji:{defaultValue:!1,describe:"Enable emoji support. Ex: `this is a :smile: emoji`",type:"boolean"},underline:{defaultValue:!1,describe:"Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``",type:"boolean"},ellipsis:{defaultValue:!0,describe:"Replaces three dots with the ellipsis unicode character",type:"boolean"},completeHTMLDocument:{defaultValue:!1,describe:"Outputs a complete html document, including ``, `` and `` tags",type:"boolean"},metadata:{defaultValue:!1,describe:"Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).",type:"boolean"},splitAdjacentBlockquotes:{defaultValue:!1,describe:"Split adjacent blockquote blocks",type:"boolean"}};if(!1===e)return JSON.parse(JSON.stringify(t));var n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=t[a].defaultValue);return n}var t={},n={},a={},i=e(!0),r="vanilla",o={github:{omitExtraWLInCodeBlocks:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,disableForced4SpacesIndentedSublists:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghCompatibleHeaderId:!0,ghMentions:!0,backslashEscapesHTMLTags:!0,emoji:!0,splitAdjacentBlockquotes:!0},original:{noHeaderId:!0,ghCodeBlocks:!1},ghost:{omitExtraWLInCodeBlocks:!0,parseImgDimensions:!0,simplifiedAutoLink:!0,excludeTrailingPunctuationFromURLs:!0,literalMidWordUnderscores:!0,strikethrough:!0,tables:!0,tablesHeaderId:!0,ghCodeBlocks:!0,tasklists:!0,smoothLivePreview:!0,simpleLineBreaks:!0,requireSpaceBeforeHeadingText:!0,ghMentions:!1,encodeEmails:!0},vanilla:e(!0),allOn:function(){"use strict";var t=e(!0),n={};for(var a in t)t.hasOwnProperty(a)&&(n[a]=!0);return n}()};function s(e,n){"use strict";var a=n?"Error in "+n+" extension->":"Error in unnamed extension",i={valid:!0,error:""};t.helper.isArray(e)||(e=[e]);for(var r=0;r").replace(/&/g,"&")};var u=function(e,t,n,a){"use strict";var i,r,o,s,l,u=a||"",c=u.indexOf("g")>-1,d=new RegExp(t+"|"+n,"g"+u.replace(/g/g,"")),h=new RegExp(t,u.replace(/g/g,"")),p=[];do{for(i=0;o=d.exec(e);)if(h.test(o[0]))i++||(s=(r=d.lastIndex)-o[0].length);else if(i&&! --i){l=o.index+o[0].length;var f={left:{start:s,end:r},match:{start:r,end:o.index},right:{start:o.index,end:l},wholeMatch:{start:s,end:l}};if(p.push(f),!c)return p}}while(i&&(d.lastIndex=r));return p};t.helper.matchRecursiveRegExp=function(e,t,n,a){"use strict";for(var i=u(e,t,n,a),r=[],o=0;o0){var d=[];0!==s[0].wholeMatch.start&&d.push(e.slice(0,s[0].wholeMatch.start));for(var h=0;h=0?i+(a||0):i},t.helper.splitAtIndex=function(e,n){"use strict";if(!t.helper.isString(e))throw"InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string";return[e.substring(0,n),e.substring(n)]},t.helper.encodeEmailAddress=function(e){"use strict";var t=[function(e){return"&#"+e.charCodeAt(0)+";"},function(e){return"&#x"+e.charCodeAt(0).toString(16)+";"},function(e){return e}];return e=e.replace(/./g,(function(e){if("@"===e)e=t[Math.floor(2*Math.random())](e);else{var n=Math.random();e=n>.9?t[2](e):n>.45?t[1](e):t[0](e)}return e}))},t.helper.padEnd=function(e,t,n){"use strict";return t|=0,n=String(n||" "),e.length>t?String(e):((t-=e.length)>n.length&&(n+=n.repeat(t/n.length)),String(e)+n.slice(0,t))},"undefined"==typeof console&&(console={warn:function(e){"use strict";alert(e)},log:function(e){"use strict";alert(e)},error:function(e){"use strict";throw e}}),t.helper.regexes={asteriskDashAndColon:/([*_:~])/g},t.helper.emojis={"+1":"👍","-1":"👎",100:"💯",1234:"🔢","1st_place_medal":"🥇","2nd_place_medal":"🥈","3rd_place_medal":"🥉","8ball":"🎱",a:"🅰️",ab:"🆎",abc:"🔤",abcd:"🔡",accept:"🉑",aerial_tramway:"🚡",airplane:"✈️",alarm_clock:"⏰",alembic:"⚗️",alien:"👽",ambulance:"🚑",amphora:"🏺",anchor:"⚓️",angel:"👼",anger:"💢",angry:"😠",anguished:"😧",ant:"🐜",apple:"🍎",aquarius:"♒️",aries:"♈️",arrow_backward:"◀️",arrow_double_down:"⏬",arrow_double_up:"⏫",arrow_down:"⬇️",arrow_down_small:"🔽",arrow_forward:"▶️",arrow_heading_down:"⤵️",arrow_heading_up:"⤴️",arrow_left:"⬅️",arrow_lower_left:"↙️",arrow_lower_right:"↘️",arrow_right:"➡️",arrow_right_hook:"↪️",arrow_up:"⬆️",arrow_up_down:"↕️",arrow_up_small:"🔼",arrow_upper_left:"↖️",arrow_upper_right:"↗️",arrows_clockwise:"🔃",arrows_counterclockwise:"🔄",art:"🎨",articulated_lorry:"🚛",artificial_satellite:"🛰",astonished:"😲",athletic_shoe:"👟",atm:"🏧",atom_symbol:"⚛️",avocado:"🥑",b:"🅱️",baby:"👶",baby_bottle:"🍼",baby_chick:"🐤",baby_symbol:"🚼",back:"🔙",bacon:"🥓",badminton:"🏸",baggage_claim:"🛄",baguette_bread:"🥖",balance_scale:"⚖️",balloon:"🎈",ballot_box:"🗳",ballot_box_with_check:"☑️",bamboo:"🎍",banana:"🍌",bangbang:"‼️",bank:"🏦",bar_chart:"📊",barber:"💈",baseball:"⚾️",basketball:"🏀",basketball_man:"⛹️",basketball_woman:"⛹️‍♀️",bat:"🦇",bath:"🛀",bathtub:"🛁",battery:"🔋",beach_umbrella:"🏖",bear:"🐻",bed:"🛏",bee:"🐝",beer:"🍺",beers:"🍻",beetle:"🐞",beginner:"🔰",bell:"🔔",bellhop_bell:"🛎",bento:"🍱",biking_man:"🚴",bike:"🚲",biking_woman:"🚴‍♀️",bikini:"👙",biohazard:"☣️",bird:"🐦",birthday:"🎂",black_circle:"⚫️",black_flag:"🏴",black_heart:"🖤",black_joker:"🃏",black_large_square:"⬛️",black_medium_small_square:"◾️",black_medium_square:"◼️",black_nib:"✒️",black_small_square:"▪️",black_square_button:"🔲",blonde_man:"👱",blonde_woman:"👱‍♀️",blossom:"🌼",blowfish:"🐡",blue_book:"📘",blue_car:"🚙",blue_heart:"💙",blush:"😊",boar:"🐗",boat:"⛵️",bomb:"💣",book:"📖",bookmark:"🔖",bookmark_tabs:"📑",books:"📚",boom:"💥",boot:"👢",bouquet:"💐",bowing_man:"🙇",bow_and_arrow:"🏹",bowing_woman:"🙇‍♀️",bowling:"🎳",boxing_glove:"🥊",boy:"👦",bread:"🍞",bride_with_veil:"👰",bridge_at_night:"🌉",briefcase:"💼",broken_heart:"💔",bug:"🐛",building_construction:"🏗",bulb:"💡",bullettrain_front:"🚅",bullettrain_side:"🚄",burrito:"🌯",bus:"🚌",business_suit_levitating:"🕴",busstop:"🚏",bust_in_silhouette:"👤",busts_in_silhouette:"👥",butterfly:"🦋",cactus:"🌵",cake:"🍰",calendar:"📆",call_me_hand:"🤙",calling:"📲",camel:"🐫",camera:"📷",camera_flash:"📸",camping:"🏕",cancer:"♋️",candle:"🕯",candy:"🍬",canoe:"🛶",capital_abcd:"🔠",capricorn:"♑️",car:"🚗",card_file_box:"🗃",card_index:"📇",card_index_dividers:"🗂",carousel_horse:"🎠",carrot:"🥕",cat:"🐱",cat2:"🐈",cd:"💿",chains:"⛓",champagne:"🍾",chart:"💹",chart_with_downwards_trend:"📉",chart_with_upwards_trend:"📈",checkered_flag:"🏁",cheese:"🧀",cherries:"🍒",cherry_blossom:"🌸",chestnut:"🌰",chicken:"🐔",children_crossing:"🚸",chipmunk:"🐿",chocolate_bar:"🍫",christmas_tree:"🎄",church:"⛪️",cinema:"🎦",circus_tent:"🎪",city_sunrise:"🌇",city_sunset:"🌆",cityscape:"🏙",cl:"🆑",clamp:"🗜",clap:"👏",clapper:"🎬",classical_building:"🏛",clinking_glasses:"🥂",clipboard:"📋",clock1:"🕐",clock10:"🕙",clock1030:"🕥",clock11:"🕚",clock1130:"🕦",clock12:"🕛",clock1230:"🕧",clock130:"🕜",clock2:"🕑",clock230:"🕝",clock3:"🕒",clock330:"🕞",clock4:"🕓",clock430:"🕟",clock5:"🕔",clock530:"🕠",clock6:"🕕",clock630:"🕡",clock7:"🕖",clock730:"🕢",clock8:"🕗",clock830:"🕣",clock9:"🕘",clock930:"🕤",closed_book:"📕",closed_lock_with_key:"🔐",closed_umbrella:"🌂",cloud:"☁️",cloud_with_lightning:"🌩",cloud_with_lightning_and_rain:"⛈",cloud_with_rain:"🌧",cloud_with_snow:"🌨",clown_face:"🤡",clubs:"♣️",cocktail:"🍸",coffee:"☕️",coffin:"⚰️",cold_sweat:"😰",comet:"☄️",computer:"💻",computer_mouse:"🖱",confetti_ball:"🎊",confounded:"😖",confused:"😕",congratulations:"㊗️",construction:"🚧",construction_worker_man:"👷",construction_worker_woman:"👷‍♀️",control_knobs:"🎛",convenience_store:"🏪",cookie:"🍪",cool:"🆒",policeman:"👮",copyright:"©️",corn:"🌽",couch_and_lamp:"🛋",couple:"👫",couple_with_heart_woman_man:"💑",couple_with_heart_man_man:"👨‍❤️‍👨",couple_with_heart_woman_woman:"👩‍❤️‍👩",couplekiss_man_man:"👨‍❤️‍💋‍👨",couplekiss_man_woman:"💏",couplekiss_woman_woman:"👩‍❤️‍💋‍👩",cow:"🐮",cow2:"🐄",cowboy_hat_face:"🤠",crab:"🦀",crayon:"🖍",credit_card:"💳",crescent_moon:"🌙",cricket:"🏏",crocodile:"🐊",croissant:"🥐",crossed_fingers:"🤞",crossed_flags:"🎌",crossed_swords:"⚔️",crown:"👑",cry:"😢",crying_cat_face:"😿",crystal_ball:"🔮",cucumber:"🥒",cupid:"💘",curly_loop:"➰",currency_exchange:"💱",curry:"🍛",custard:"🍮",customs:"🛃",cyclone:"🌀",dagger:"🗡",dancer:"💃",dancing_women:"👯",dancing_men:"👯‍♂️",dango:"🍡",dark_sunglasses:"🕶",dart:"🎯",dash:"💨",date:"📅",deciduous_tree:"🌳",deer:"🦌",department_store:"🏬",derelict_house:"🏚",desert:"🏜",desert_island:"🏝",desktop_computer:"🖥",male_detective:"🕵️",diamond_shape_with_a_dot_inside:"💠",diamonds:"♦️",disappointed:"😞",disappointed_relieved:"😥",dizzy:"💫",dizzy_face:"😵",do_not_litter:"🚯",dog:"🐶",dog2:"🐕",dollar:"💵",dolls:"🎎",dolphin:"🐬",door:"🚪",doughnut:"🍩",dove:"🕊",dragon:"🐉",dragon_face:"🐲",dress:"👗",dromedary_camel:"🐪",drooling_face:"🤤",droplet:"💧",drum:"🥁",duck:"🦆",dvd:"📀","e-mail":"📧",eagle:"🦅",ear:"👂",ear_of_rice:"🌾",earth_africa:"🌍",earth_americas:"🌎",earth_asia:"🌏",egg:"🥚",eggplant:"🍆",eight_pointed_black_star:"✴️",eight_spoked_asterisk:"✳️",electric_plug:"🔌",elephant:"🐘",email:"✉️",end:"🔚",envelope_with_arrow:"📩",euro:"💶",european_castle:"🏰",european_post_office:"🏤",evergreen_tree:"🌲",exclamation:"❗️",expressionless:"😑",eye:"👁",eye_speech_bubble:"👁‍🗨",eyeglasses:"👓",eyes:"👀",face_with_head_bandage:"🤕",face_with_thermometer:"🤒",fist_oncoming:"👊",factory:"🏭",fallen_leaf:"🍂",family_man_woman_boy:"👪",family_man_boy:"👨‍👦",family_man_boy_boy:"👨‍👦‍👦",family_man_girl:"👨‍👧",family_man_girl_boy:"👨‍👧‍👦",family_man_girl_girl:"👨‍👧‍👧",family_man_man_boy:"👨‍👨‍👦",family_man_man_boy_boy:"👨‍👨‍👦‍👦",family_man_man_girl:"👨‍👨‍👧",family_man_man_girl_boy:"👨‍👨‍👧‍👦",family_man_man_girl_girl:"👨‍👨‍👧‍👧",family_man_woman_boy_boy:"👨‍👩‍👦‍👦",family_man_woman_girl:"👨‍👩‍👧",family_man_woman_girl_boy:"👨‍👩‍👧‍👦",family_man_woman_girl_girl:"👨‍👩‍👧‍👧",family_woman_boy:"👩‍👦",family_woman_boy_boy:"👩‍👦‍👦",family_woman_girl:"👩‍👧",family_woman_girl_boy:"👩‍👧‍👦",family_woman_girl_girl:"👩‍👧‍👧",family_woman_woman_boy:"👩‍👩‍👦",family_woman_woman_boy_boy:"👩‍👩‍👦‍👦",family_woman_woman_girl:"👩‍👩‍👧",family_woman_woman_girl_boy:"👩‍👩‍👧‍👦",family_woman_woman_girl_girl:"👩‍👩‍👧‍👧",fast_forward:"⏩",fax:"📠",fearful:"😨",feet:"🐾",female_detective:"🕵️‍♀️",ferris_wheel:"🎡",ferry:"⛴",field_hockey:"🏑",file_cabinet:"🗄",file_folder:"📁",film_projector:"📽",film_strip:"🎞",fire:"🔥",fire_engine:"🚒",fireworks:"🎆",first_quarter_moon:"🌓",first_quarter_moon_with_face:"🌛",fish:"🐟",fish_cake:"🍥",fishing_pole_and_fish:"🎣",fist_raised:"✊",fist_left:"🤛",fist_right:"🤜",flags:"🎏",flashlight:"🔦",fleur_de_lis:"⚜️",flight_arrival:"🛬",flight_departure:"🛫",floppy_disk:"💾",flower_playing_cards:"🎴",flushed:"😳",fog:"🌫",foggy:"🌁",football:"🏈",footprints:"👣",fork_and_knife:"🍴",fountain:"⛲️",fountain_pen:"🖋",four_leaf_clover:"🍀",fox_face:"🦊",framed_picture:"🖼",free:"🆓",fried_egg:"🍳",fried_shrimp:"🍤",fries:"🍟",frog:"🐸",frowning:"😦",frowning_face:"☹️",frowning_man:"🙍‍♂️",frowning_woman:"🙍",middle_finger:"🖕",fuelpump:"⛽️",full_moon:"🌕",full_moon_with_face:"🌝",funeral_urn:"⚱️",game_die:"🎲",gear:"⚙️",gem:"💎",gemini:"♊️",ghost:"👻",gift:"🎁",gift_heart:"💝",girl:"👧",globe_with_meridians:"🌐",goal_net:"🥅",goat:"🐐",golf:"⛳️",golfing_man:"🏌️",golfing_woman:"🏌️‍♀️",gorilla:"🦍",grapes:"🍇",green_apple:"🍏",green_book:"📗",green_heart:"💚",green_salad:"🥗",grey_exclamation:"❕",grey_question:"❔",grimacing:"😬",grin:"😁",grinning:"😀",guardsman:"💂",guardswoman:"💂‍♀️",guitar:"🎸",gun:"🔫",haircut_woman:"💇",haircut_man:"💇‍♂️",hamburger:"🍔",hammer:"🔨",hammer_and_pick:"⚒",hammer_and_wrench:"🛠",hamster:"🐹",hand:"✋",handbag:"👜",handshake:"🤝",hankey:"💩",hatched_chick:"🐥",hatching_chick:"🐣",headphones:"🎧",hear_no_evil:"🙉",heart:"❤️",heart_decoration:"💟",heart_eyes:"😍",heart_eyes_cat:"😻",heartbeat:"💓",heartpulse:"💗",hearts:"♥️",heavy_check_mark:"✔️",heavy_division_sign:"➗",heavy_dollar_sign:"💲",heavy_heart_exclamation:"❣️",heavy_minus_sign:"➖",heavy_multiplication_x:"✖️",heavy_plus_sign:"➕",helicopter:"🚁",herb:"🌿",hibiscus:"🌺",high_brightness:"🔆",high_heel:"👠",hocho:"🔪",hole:"🕳",honey_pot:"🍯",horse:"🐴",horse_racing:"🏇",hospital:"🏥",hot_pepper:"🌶",hotdog:"🌭",hotel:"🏨",hotsprings:"♨️",hourglass:"⌛️",hourglass_flowing_sand:"⏳",house:"🏠",house_with_garden:"🏡",houses:"🏘",hugs:"🤗",hushed:"😯",ice_cream:"🍨",ice_hockey:"🏒",ice_skate:"⛸",icecream:"🍦",id:"🆔",ideograph_advantage:"🉐",imp:"👿",inbox_tray:"📥",incoming_envelope:"📨",tipping_hand_woman:"💁",information_source:"ℹ️",innocent:"😇",interrobang:"⁉️",iphone:"📱",izakaya_lantern:"🏮",jack_o_lantern:"🎃",japan:"🗾",japanese_castle:"🏯",japanese_goblin:"👺",japanese_ogre:"👹",jeans:"👖",joy:"😂",joy_cat:"😹",joystick:"🕹",kaaba:"🕋",key:"🔑",keyboard:"⌨️",keycap_ten:"🔟",kick_scooter:"🛴",kimono:"👘",kiss:"💋",kissing:"😗",kissing_cat:"😽",kissing_closed_eyes:"😚",kissing_heart:"😘",kissing_smiling_eyes:"😙",kiwi_fruit:"🥝",koala:"🐨",koko:"🈁",label:"🏷",large_blue_circle:"🔵",large_blue_diamond:"🔷",large_orange_diamond:"🔶",last_quarter_moon:"🌗",last_quarter_moon_with_face:"🌜",latin_cross:"✝️",laughing:"😆",leaves:"🍃",ledger:"📒",left_luggage:"🛅",left_right_arrow:"↔️",leftwards_arrow_with_hook:"↩️",lemon:"🍋",leo:"♌️",leopard:"🐆",level_slider:"🎚",libra:"♎️",light_rail:"🚈",link:"🔗",lion:"🦁",lips:"👄",lipstick:"💄",lizard:"🦎",lock:"🔒",lock_with_ink_pen:"🔏",lollipop:"🍭",loop:"➿",loud_sound:"🔊",loudspeaker:"📢",love_hotel:"🏩",love_letter:"💌",low_brightness:"🔅",lying_face:"🤥",m:"Ⓜ️",mag:"🔍",mag_right:"🔎",mahjong:"🀄️",mailbox:"📫",mailbox_closed:"📪",mailbox_with_mail:"📬",mailbox_with_no_mail:"📭",man:"👨",man_artist:"👨‍🎨",man_astronaut:"👨‍🚀",man_cartwheeling:"🤸‍♂️",man_cook:"👨‍🍳",man_dancing:"🕺",man_facepalming:"🤦‍♂️",man_factory_worker:"👨‍🏭",man_farmer:"👨‍🌾",man_firefighter:"👨‍🚒",man_health_worker:"👨‍⚕️",man_in_tuxedo:"🤵",man_judge:"👨‍⚖️",man_juggling:"🤹‍♂️",man_mechanic:"👨‍🔧",man_office_worker:"👨‍💼",man_pilot:"👨‍✈️",man_playing_handball:"🤾‍♂️",man_playing_water_polo:"🤽‍♂️",man_scientist:"👨‍🔬",man_shrugging:"🤷‍♂️",man_singer:"👨‍🎤",man_student:"👨‍🎓",man_teacher:"👨‍🏫",man_technologist:"👨‍💻",man_with_gua_pi_mao:"👲",man_with_turban:"👳",tangerine:"🍊",mans_shoe:"👞",mantelpiece_clock:"🕰",maple_leaf:"🍁",martial_arts_uniform:"🥋",mask:"😷",massage_woman:"💆",massage_man:"💆‍♂️",meat_on_bone:"🍖",medal_military:"🎖",medal_sports:"🏅",mega:"📣",melon:"🍈",memo:"📝",men_wrestling:"🤼‍♂️",menorah:"🕎",mens:"🚹",metal:"🤘",metro:"🚇",microphone:"🎤",microscope:"🔬",milk_glass:"🥛",milky_way:"🌌",minibus:"🚐",minidisc:"💽",mobile_phone_off:"📴",money_mouth_face:"🤑",money_with_wings:"💸",moneybag:"💰",monkey:"🐒",monkey_face:"🐵",monorail:"🚝",moon:"🌔",mortar_board:"🎓",mosque:"🕌",motor_boat:"🛥",motor_scooter:"🛵",motorcycle:"🏍",motorway:"🛣",mount_fuji:"🗻",mountain:"⛰",mountain_biking_man:"🚵",mountain_biking_woman:"🚵‍♀️",mountain_cableway:"🚠",mountain_railway:"🚞",mountain_snow:"🏔",mouse:"🐭",mouse2:"🐁",movie_camera:"🎥",moyai:"🗿",mrs_claus:"🤶",muscle:"💪",mushroom:"🍄",musical_keyboard:"🎹",musical_note:"🎵",musical_score:"🎼",mute:"🔇",nail_care:"💅",name_badge:"📛",national_park:"🏞",nauseated_face:"🤢",necktie:"👔",negative_squared_cross_mark:"❎",nerd_face:"🤓",neutral_face:"😐",new:"🆕",new_moon:"🌑",new_moon_with_face:"🌚",newspaper:"📰",newspaper_roll:"🗞",next_track_button:"⏭",ng:"🆖",no_good_man:"🙅‍♂️",no_good_woman:"🙅",night_with_stars:"🌃",no_bell:"🔕",no_bicycles:"🚳",no_entry:"⛔️",no_entry_sign:"🚫",no_mobile_phones:"📵",no_mouth:"😶",no_pedestrians:"🚷",no_smoking:"🚭","non-potable_water":"🚱",nose:"👃",notebook:"📓",notebook_with_decorative_cover:"📔",notes:"🎶",nut_and_bolt:"🔩",o:"⭕️",o2:"🅾️",ocean:"🌊",octopus:"🐙",oden:"🍢",office:"🏢",oil_drum:"🛢",ok:"🆗",ok_hand:"👌",ok_man:"🙆‍♂️",ok_woman:"🙆",old_key:"🗝",older_man:"👴",older_woman:"👵",om:"🕉",on:"🔛",oncoming_automobile:"🚘",oncoming_bus:"🚍",oncoming_police_car:"🚔",oncoming_taxi:"🚖",open_file_folder:"📂",open_hands:"👐",open_mouth:"😮",open_umbrella:"☂️",ophiuchus:"⛎",orange_book:"📙",orthodox_cross:"☦️",outbox_tray:"📤",owl:"🦉",ox:"🐂",package:"📦",page_facing_up:"📄",page_with_curl:"📃",pager:"📟",paintbrush:"🖌",palm_tree:"🌴",pancakes:"🥞",panda_face:"🐼",paperclip:"📎",paperclips:"🖇",parasol_on_ground:"⛱",parking:"🅿️",part_alternation_mark:"〽️",partly_sunny:"⛅️",passenger_ship:"🛳",passport_control:"🛂",pause_button:"⏸",peace_symbol:"☮️",peach:"🍑",peanuts:"🥜",pear:"🍐",pen:"🖊",pencil2:"✏️",penguin:"🐧",pensive:"😔",performing_arts:"🎭",persevere:"😣",person_fencing:"🤺",pouting_woman:"🙎",phone:"☎️",pick:"⛏",pig:"🐷",pig2:"🐖",pig_nose:"🐽",pill:"💊",pineapple:"🍍",ping_pong:"🏓",pisces:"♓️",pizza:"🍕",place_of_worship:"🛐",plate_with_cutlery:"🍽",play_or_pause_button:"⏯",point_down:"👇",point_left:"👈",point_right:"👉",point_up:"☝️",point_up_2:"👆",police_car:"🚓",policewoman:"👮‍♀️",poodle:"🐩",popcorn:"🍿",post_office:"🏣",postal_horn:"📯",postbox:"📮",potable_water:"🚰",potato:"🥔",pouch:"👝",poultry_leg:"🍗",pound:"💷",rage:"😡",pouting_cat:"😾",pouting_man:"🙎‍♂️",pray:"🙏",prayer_beads:"📿",pregnant_woman:"🤰",previous_track_button:"⏮",prince:"🤴",princess:"👸",printer:"🖨",purple_heart:"💜",purse:"👛",pushpin:"📌",put_litter_in_its_place:"🚮",question:"❓",rabbit:"🐰",rabbit2:"🐇",racehorse:"🐎",racing_car:"🏎",radio:"📻",radio_button:"🔘",radioactive:"☢️",railway_car:"🚃",railway_track:"🛤",rainbow:"🌈",rainbow_flag:"🏳️‍🌈",raised_back_of_hand:"🤚",raised_hand_with_fingers_splayed:"🖐",raised_hands:"🙌",raising_hand_woman:"🙋",raising_hand_man:"🙋‍♂️",ram:"🐏",ramen:"🍜",rat:"🐀",record_button:"⏺",recycle:"♻️",red_circle:"🔴",registered:"®️",relaxed:"☺️",relieved:"😌",reminder_ribbon:"🎗",repeat:"🔁",repeat_one:"🔂",rescue_worker_helmet:"⛑",restroom:"🚻",revolving_hearts:"💞",rewind:"⏪",rhinoceros:"🦏",ribbon:"🎀",rice:"🍚",rice_ball:"🍙",rice_cracker:"🍘",rice_scene:"🎑",right_anger_bubble:"🗯",ring:"💍",robot:"🤖",rocket:"🚀",rofl:"🤣",roll_eyes:"🙄",roller_coaster:"🎢",rooster:"🐓",rose:"🌹",rosette:"🏵",rotating_light:"🚨",round_pushpin:"📍",rowing_man:"🚣",rowing_woman:"🚣‍♀️",rugby_football:"🏉",running_man:"🏃",running_shirt_with_sash:"🎽",running_woman:"🏃‍♀️",sa:"🈂️",sagittarius:"♐️",sake:"🍶",sandal:"👡",santa:"🎅",satellite:"📡",saxophone:"🎷",school:"🏫",school_satchel:"🎒",scissors:"✂️",scorpion:"🦂",scorpius:"♏️",scream:"😱",scream_cat:"🙀",scroll:"📜",seat:"💺",secret:"㊙️",see_no_evil:"🙈",seedling:"🌱",selfie:"🤳",shallow_pan_of_food:"🥘",shamrock:"☘️",shark:"🦈",shaved_ice:"🍧",sheep:"🐑",shell:"🐚",shield:"🛡",shinto_shrine:"⛩",ship:"🚢",shirt:"👕",shopping:"🛍",shopping_cart:"🛒",shower:"🚿",shrimp:"🦐",signal_strength:"📶",six_pointed_star:"🔯",ski:"🎿",skier:"⛷",skull:"💀",skull_and_crossbones:"☠️",sleeping:"😴",sleeping_bed:"🛌",sleepy:"😪",slightly_frowning_face:"🙁",slightly_smiling_face:"🙂",slot_machine:"🎰",small_airplane:"🛩",small_blue_diamond:"🔹",small_orange_diamond:"🔸",small_red_triangle:"🔺",small_red_triangle_down:"🔻",smile:"😄",smile_cat:"😸",smiley:"😃",smiley_cat:"😺",smiling_imp:"😈",smirk:"😏",smirk_cat:"😼",smoking:"🚬",snail:"🐌",snake:"🐍",sneezing_face:"🤧",snowboarder:"🏂",snowflake:"❄️",snowman:"⛄️",snowman_with_snow:"☃️",sob:"😭",soccer:"⚽️",soon:"🔜",sos:"🆘",sound:"🔉",space_invader:"👾",spades:"♠️",spaghetti:"🍝",sparkle:"❇️",sparkler:"🎇",sparkles:"✨",sparkling_heart:"💖",speak_no_evil:"🙊",speaker:"🔈",speaking_head:"🗣",speech_balloon:"💬",speedboat:"🚤",spider:"🕷",spider_web:"🕸",spiral_calendar:"🗓",spiral_notepad:"🗒",spoon:"🥄",squid:"🦑",stadium:"🏟",star:"⭐️",star2:"🌟",star_and_crescent:"☪️",star_of_david:"✡️",stars:"🌠",station:"🚉",statue_of_liberty:"🗽",steam_locomotive:"🚂",stew:"🍲",stop_button:"⏹",stop_sign:"🛑",stopwatch:"⏱",straight_ruler:"📏",strawberry:"🍓",stuck_out_tongue:"😛",stuck_out_tongue_closed_eyes:"😝",stuck_out_tongue_winking_eye:"😜",studio_microphone:"🎙",stuffed_flatbread:"🥙",sun_behind_large_cloud:"🌥",sun_behind_rain_cloud:"🌦",sun_behind_small_cloud:"🌤",sun_with_face:"🌞",sunflower:"🌻",sunglasses:"😎",sunny:"☀️",sunrise:"🌅",sunrise_over_mountains:"🌄",surfing_man:"🏄",surfing_woman:"🏄‍♀️",sushi:"🍣",suspension_railway:"🚟",sweat:"😓",sweat_drops:"💦",sweat_smile:"😅",sweet_potato:"🍠",swimming_man:"🏊",swimming_woman:"🏊‍♀️",symbols:"🔣",synagogue:"🕍",syringe:"💉",taco:"🌮",tada:"🎉",tanabata_tree:"🎋",taurus:"♉️",taxi:"🚕",tea:"🍵",telephone_receiver:"📞",telescope:"🔭",tennis:"🎾",tent:"⛺️",thermometer:"🌡",thinking:"🤔",thought_balloon:"💭",ticket:"🎫",tickets:"🎟",tiger:"🐯",tiger2:"🐅",timer_clock:"⏲",tipping_hand_man:"💁‍♂️",tired_face:"😫",tm:"™️",toilet:"🚽",tokyo_tower:"🗼",tomato:"🍅",tongue:"👅",top:"🔝",tophat:"🎩",tornado:"🌪",trackball:"🖲",tractor:"🚜",traffic_light:"🚥",train:"🚋",train2:"🚆",tram:"🚊",triangular_flag_on_post:"🚩",triangular_ruler:"📐",trident:"🔱",triumph:"😤",trolleybus:"🚎",trophy:"🏆",tropical_drink:"🍹",tropical_fish:"🐠",truck:"🚚",trumpet:"🎺",tulip:"🌷",tumbler_glass:"🥃",turkey:"🦃",turtle:"🐢",tv:"📺",twisted_rightwards_arrows:"🔀",two_hearts:"💕",two_men_holding_hands:"👬",two_women_holding_hands:"👭",u5272:"🈹",u5408:"🈴",u55b6:"🈺",u6307:"🈯️",u6708:"🈷️",u6709:"🈶",u6e80:"🈵",u7121:"🈚️",u7533:"🈸",u7981:"🈲",u7a7a:"🈳",umbrella:"☔️",unamused:"😒",underage:"🔞",unicorn:"🦄",unlock:"🔓",up:"🆙",upside_down_face:"🙃",v:"✌️",vertical_traffic_light:"🚦",vhs:"📼",vibration_mode:"📳",video_camera:"📹",video_game:"🎮",violin:"🎻",virgo:"♍️",volcano:"🌋",volleyball:"🏐",vs:"🆚",vulcan_salute:"🖖",walking_man:"🚶",walking_woman:"🚶‍♀️",waning_crescent_moon:"🌘",waning_gibbous_moon:"🌖",warning:"⚠️",wastebasket:"🗑",watch:"⌚️",water_buffalo:"🐃",watermelon:"🍉",wave:"👋",wavy_dash:"〰️",waxing_crescent_moon:"🌒",wc:"🚾",weary:"😩",wedding:"💒",weight_lifting_man:"🏋️",weight_lifting_woman:"🏋️‍♀️",whale:"🐳",whale2:"🐋",wheel_of_dharma:"☸️",wheelchair:"♿️",white_check_mark:"✅",white_circle:"⚪️",white_flag:"🏳️",white_flower:"💮",white_large_square:"⬜️",white_medium_small_square:"◽️",white_medium_square:"◻️",white_small_square:"▫️",white_square_button:"🔳",wilted_flower:"🥀",wind_chime:"🎐",wind_face:"🌬",wine_glass:"🍷",wink:"😉",wolf:"🐺",woman:"👩",woman_artist:"👩‍🎨",woman_astronaut:"👩‍🚀",woman_cartwheeling:"🤸‍♀️",woman_cook:"👩‍🍳",woman_facepalming:"🤦‍♀️",woman_factory_worker:"👩‍🏭",woman_farmer:"👩‍🌾",woman_firefighter:"👩‍🚒",woman_health_worker:"👩‍⚕️",woman_judge:"👩‍⚖️",woman_juggling:"🤹‍♀️",woman_mechanic:"👩‍🔧",woman_office_worker:"👩‍💼",woman_pilot:"👩‍✈️",woman_playing_handball:"🤾‍♀️",woman_playing_water_polo:"🤽‍♀️",woman_scientist:"👩‍🔬",woman_shrugging:"🤷‍♀️",woman_singer:"👩‍🎤",woman_student:"👩‍🎓",woman_teacher:"👩‍🏫",woman_technologist:"👩‍💻",woman_with_turban:"👳‍♀️",womans_clothes:"👚",womans_hat:"👒",women_wrestling:"🤼‍♀️",womens:"🚺",world_map:"🗺",worried:"😟",wrench:"🔧",writing_hand:"✍️",x:"❌",yellow_heart:"💛",yen:"💴",yin_yang:"☯️",yum:"😋",zap:"⚡️",zipper_mouth_face:"🤐",zzz:"💤",octocat:':octocat:',showdown:"S"},t.Converter=function(e){"use strict";var n={},l=[],u=[],c={},d=r,h={parsed:{},raw:"",format:""};function p(e,n){if(n=n||null,t.helper.isString(e)){if(n=e=t.helper.stdExtName(e),t.extensions[e])return console.warn("DEPRECATION WARNING: "+e+" is an old extension that uses a deprecated loading method.Please inform the developer that the extension should be updated!"),void function(e,n){"function"==typeof e&&(e=e(new t.Converter));t.helper.isArray(e)||(e=[e]);var a=s(e,n);if(!a.valid)throw Error(a.error);for(var i=0;i[ \t]+¨NBSP;<"),!n){if(!window||!window.document)throw new Error("HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM");n=window.document}var a=n.createElement("div");a.innerHTML=e;var i={preList:function(e){for(var n=e.querySelectorAll("pre"),a=[],i=0;i'}else a.push(n[i].innerHTML),n[i].innerHTML="",n[i].setAttribute("prenum",i.toString());return a}(a)};!function e(t){for(var n=0;n? ?(['"].*['"])?\)$/m)>-1)o="";else if(!o){if(r||(r=i.toLowerCase().replace(/ ?\n/g," ")),o="#"+r,t.helper.isUndefined(a.gUrls[r]))return e;o=a.gUrls[r],t.helper.isUndefined(a.gTitles[r])||(u=a.gTitles[r])}var c='"};return e=(e=(e=(e=(e=a.converter._dispatch("anchors.before",e,n,a)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)] ?(?:\n *)?\[(.*?)]()()()()/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]?<([^>]*)>(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[((?:\[[^\]]*]|[^\[\]])*)]()[ \t]*\([ \t]??(?:[ \t]*((["'])([^"]*?)\5))?[ \t]?\)/g,i)).replace(/\[([^\[\]]+)]()()()()()/g,i),n.ghMentions&&(e=e.replace(/(^|\s)(\\)?(@([a-z\d]+(?:[a-z\d.-]+?[a-z\d]+)*))/gim,(function(e,a,i,r,o){if("\\"===i)return a+r;if(!t.helper.isString(n.ghMentionsLink))throw new Error("ghMentionsLink option must be a string");var s=n.ghMentionsLink.replace(/\{u}/g,o),l="";return n.openLinksInNewWindow&&(l=' rel="noopener noreferrer" target="¨E95Eblank"'),a+'"+r+""}))),e=a.converter._dispatch("anchors.after",e,n,a)}));var c=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+?\.[^'">\s]+?)()(\1)?(?=\s|$)(?!["<>])/gi,d=/([*~_]+|\b)(((https?|ftp|dict):\/\/|www\.)[^'">\s]+\.[^'">\s]+?)([.!?,()\[\]])?(\1)?(?=\s|$)(?!["<>])/gi,h=/()<(((https?|ftp|dict):\/\/|www\.)[^'">\s]+)()>()/gi,p=/(^|\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)(?=$|\s)/gim,f=/<()(?:mailto:)?([-.\w]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,m=function(e){"use strict";return function(n,a,i,r,o,s,l){var u=i=i.replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback),c="",d="",h=a||"",p=l||"";return/^www\./i.test(i)&&(i=i.replace(/^www\./i,"http://www.")),e.excludeTrailingPunctuationFromURLs&&s&&(c=s),e.openLinksInNewWindow&&(d=' rel="noopener noreferrer" target="¨E95Eblank"'),h+'"+u+""+c+p}},g=function(e,n){"use strict";return function(a,i,r){var o="mailto:";return i=i||"",r=t.subParser("unescapeSpecialChars")(r,e,n),e.encodeEmails?(o=t.helper.encodeEmailAddress(o+r),r=t.helper.encodeEmailAddress(r)):o+=r,i+''+r+""}};t.subParser("autoLinks",(function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("autoLinks.before",e,t,n)).replace(h,m(t))).replace(f,g(t,n)),e=n.converter._dispatch("autoLinks.after",e,t,n)})),t.subParser("simplifiedAutoLinks",(function(e,t,n){"use strict";return t.simplifiedAutoLink?(e=n.converter._dispatch("simplifiedAutoLinks.before",e,t,n),e=(e=t.excludeTrailingPunctuationFromURLs?e.replace(d,m(t)):e.replace(c,m(t))).replace(p,g(t,n)),e=n.converter._dispatch("simplifiedAutoLinks.after",e,t,n)):e})),t.subParser("blockGamut",(function(e,n,a){"use strict";return e=a.converter._dispatch("blockGamut.before",e,n,a),e=t.subParser("blockQuotes")(e,n,a),e=t.subParser("headers")(e,n,a),e=t.subParser("horizontalRule")(e,n,a),e=t.subParser("lists")(e,n,a),e=t.subParser("codeBlocks")(e,n,a),e=t.subParser("tables")(e,n,a),e=t.subParser("hashHTMLBlocks")(e,n,a),e=t.subParser("paragraphs")(e,n,a),e=a.converter._dispatch("blockGamut.after",e,n,a)})),t.subParser("blockQuotes",(function(e,n,a){"use strict";e=a.converter._dispatch("blockQuotes.before",e,n,a),e+="\n\n";var i=/(^ {0,3}>[ \t]?.+\n(.+\n)*\n*)+/gm;return n.splitAdjacentBlockquotes&&(i=/^ {0,3}>[\s\S]*?(?:\n\n)/gm),e=e.replace(i,(function(e){return e=(e=(e=e.replace(/^[ \t]*>[ \t]?/gm,"")).replace(/¨0/g,"")).replace(/^[ \t]+$/gm,""),e=t.subParser("githubCodeBlocks")(e,n,a),e=(e=(e=t.subParser("blockGamut")(e,n,a)).replace(/(^|\n)/g,"$1 ")).replace(/(\s*
[^\r]+?<\/pre>)/gm,(function(e,t){var n=t;return n=(n=n.replace(/^  /gm,"¨0")).replace(/¨0/g,"")})),t.subParser("hashBlock")("
\n"+e+"\n
",n,a)})),e=a.converter._dispatch("blockQuotes.after",e,n,a)})),t.subParser("codeBlocks",(function(e,n,a){"use strict";e=a.converter._dispatch("codeBlocks.before",e,n,a);return e=(e=(e+="¨0").replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=¨0))/g,(function(e,i,r){var o=i,s=r,l="\n";return o=t.subParser("outdent")(o,n,a),o=t.subParser("encodeCode")(o,n,a),o=(o=(o=t.subParser("detab")(o,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""),n.omitExtraWLInCodeBlocks&&(l=""),o="
"+o+l+"
",t.subParser("hashBlock")(o,n,a)+s}))).replace(/¨0/,""),e=a.converter._dispatch("codeBlocks.after",e,n,a)})),t.subParser("codeSpans",(function(e,n,a){"use strict";return void 0===(e=a.converter._dispatch("codeSpans.before",e,n,a))&&(e=""),e=e.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,(function(e,i,r,o){var s=o;return s=(s=s.replace(/^([ \t]*)/g,"")).replace(/[ \t]*$/g,""),s=i+""+(s=t.subParser("encodeCode")(s,n,a))+"",s=t.subParser("hashHTMLSpans")(s,n,a)})),e=a.converter._dispatch("codeSpans.after",e,n,a)})),t.subParser("completeHTMLDocument",(function(e,t,n){"use strict";if(!t.completeHTMLDocument)return e;e=n.converter._dispatch("completeHTMLDocument.before",e,t,n);var a="html",i="\n",r="",o='\n',s="",l="";for(var u in void 0!==n.metadata.parsed.doctype&&(i="\n","html"!==(a=n.metadata.parsed.doctype.toString().toLowerCase())&&"html5"!==a||(o='')),n.metadata.parsed)if(n.metadata.parsed.hasOwnProperty(u))switch(u.toLowerCase()){case"doctype":break;case"title":r=""+n.metadata.parsed.title+"\n";break;case"charset":o="html"===a||"html5"===a?'\n':'\n';break;case"language":case"lang":s=' lang="'+n.metadata.parsed[u]+'"',l+='\n';break;default:l+='\n'}return e=i+"\n\n"+r+o+l+"\n\n"+e.trim()+"\n\n",e=n.converter._dispatch("completeHTMLDocument.after",e,t,n)})),t.subParser("detab",(function(e,t,n){"use strict";return e=(e=(e=(e=(e=(e=n.converter._dispatch("detab.before",e,t,n)).replace(/\t(?=\t)/g," ")).replace(/\t/g,"¨A¨B")).replace(/¨B(.+?)¨A/g,(function(e,t){for(var n=t,a=4-n.length%4,i=0;i/g,">"),e=n.converter._dispatch("encodeAmpsAndAngles.after",e,t,n)})),t.subParser("encodeBackslashEscapes",(function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("encodeBackslashEscapes.before",e,n,a)).replace(/\\(\\)/g,t.helper.escapeCharactersCallback)).replace(/\\([`*_{}\[\]()>#+.!~=|:-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeBackslashEscapes.after",e,n,a)})),t.subParser("encodeCode",(function(e,n,a){"use strict";return e=(e=a.converter._dispatch("encodeCode.before",e,n,a)).replace(/&/g,"&").replace(//g,">").replace(/([*_{}\[\]\\=~-])/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("encodeCode.after",e,n,a)})),t.subParser("escapeSpecialCharsWithinTagAttributes",(function(e,n,a){"use strict";return e=(e=(e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.before",e,n,a)).replace(/<\/?[a-z\d_:-]+(?:[\s]+[\s\S]+?)?>/gi,(function(e){return e.replace(/(.)<\/?code>(?=.)/g,"$1`").replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)}))).replace(/-]|-[^>])(?:[^-]|-[^-])*)--)>/gi,(function(e){return e.replace(/([\\`*_~=|])/g,t.helper.escapeCharactersCallback)})),e=a.converter._dispatch("escapeSpecialCharsWithinTagAttributes.after",e,n,a)})),t.subParser("githubCodeBlocks",(function(e,n,a){"use strict";return n.ghCodeBlocks?(e=a.converter._dispatch("githubCodeBlocks.before",e,n,a),e=(e=(e+="¨0").replace(/(?:^|\n)(?: {0,3})(```+|~~~+)(?: *)([^\s`~]*)\n([\s\S]*?)\n(?: {0,3})\1/g,(function(e,i,r,o){var s=n.omitExtraWLInCodeBlocks?"":"\n";return o=t.subParser("encodeCode")(o,n,a),o="
"+(o=(o=(o=t.subParser("detab")(o,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,""))+s+"
",o=t.subParser("hashBlock")(o,n,a),"\n\n¨G"+(a.ghCodeBlocks.push({text:e,codeblock:o})-1)+"G\n\n"}))).replace(/¨0/,""),a.converter._dispatch("githubCodeBlocks.after",e,n,a)):e})),t.subParser("hashBlock",(function(e,t,n){"use strict";return e=(e=n.converter._dispatch("hashBlock.before",e,t,n)).replace(/(^\n+|\n+$)/g,""),e="\n\n¨K"+(n.gHtmlBlocks.push(e)-1)+"K\n\n",e=n.converter._dispatch("hashBlock.after",e,t,n)})),t.subParser("hashCodeTags",(function(e,n,a){"use strict";e=a.converter._dispatch("hashCodeTags.before",e,n,a);return e=t.helper.replaceRecursiveRegExp(e,(function(e,i,r,o){var s=r+t.subParser("encodeCode")(i,n,a)+o;return"¨C"+(a.gHtmlSpans.push(s)-1)+"C"}),"]*>","","gim"),e=a.converter._dispatch("hashCodeTags.after",e,n,a)})),t.subParser("hashElement",(function(e,t,n){"use strict";return function(e,t){var a=t;return a=(a=(a=a.replace(/\n\n/g,"\n")).replace(/^\n/,"")).replace(/\n+$/g,""),a="\n\n¨K"+(n.gHtmlBlocks.push(a)-1)+"K\n\n"}})),t.subParser("hashHTMLBlocks",(function(e,n,a){"use strict";e=a.converter._dispatch("hashHTMLBlocks.before",e,n,a);var i=["pre","div","h1","h2","h3","h4","h5","h6","blockquote","table","dl","ol","ul","script","noscript","form","fieldset","iframe","math","style","section","header","footer","nav","article","aside","address","audio","canvas","figure","hgroup","output","video","p"],r=function(e,t,n,i){var r=e;return-1!==n.search(/\bmarkdown\b/)&&(r=n+a.converter.makeHtml(t)+i),"\n\n¨K"+(a.gHtmlBlocks.push(r)-1)+"K\n\n"};n.backslashEscapesHTMLTags&&(e=e.replace(/\\<(\/?[^>]+?)>/g,(function(e,t){return"<"+t+">"})));for(var o=0;o]*>)","im"),u="<"+i[o]+"\\b[^>]*>",c="";-1!==(s=t.helper.regexIndexOf(e,l));){var d=t.helper.splitAtIndex(e,s),h=t.helper.replaceRecursiveRegExp(d[1],r,u,c,"im");if(h===d[1])break;e=d[0].concat(h)}return e=e.replace(/(\n {0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=(e=t.helper.replaceRecursiveRegExp(e,(function(e){return"\n\n¨K"+(a.gHtmlBlocks.push(e)-1)+"K\n\n"}),"^ {0,3}\x3c!--","--\x3e","gm")).replace(/(?:\n\n)( {0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g,t.subParser("hashElement")(e,n,a)),e=a.converter._dispatch("hashHTMLBlocks.after",e,n,a)})),t.subParser("hashHTMLSpans",(function(e,t,n){"use strict";function a(e){return"¨C"+(n.gHtmlSpans.push(e)-1)+"C"}return e=(e=(e=(e=(e=n.converter._dispatch("hashHTMLSpans.before",e,t,n)).replace(/<[^>]+?\/>/gi,(function(e){return a(e)}))).replace(/<([^>]+?)>[\s\S]*?<\/\1>/g,(function(e){return a(e)}))).replace(/<([^>]+?)\s[^>]+?>[\s\S]*?<\/\1>/g,(function(e){return a(e)}))).replace(/<[^>]+?>/gi,(function(e){return a(e)})),e=n.converter._dispatch("hashHTMLSpans.after",e,t,n)})),t.subParser("unhashHTMLSpans",(function(e,t,n){"use strict";e=n.converter._dispatch("unhashHTMLSpans.before",e,t,n);for(var a=0;a]*>\\s*]*>","^ {0,3}\\s*
","gim"),e=a.converter._dispatch("hashPreCodeTags.after",e,n,a)})),t.subParser("headers",(function(e,n,a){"use strict";e=a.converter._dispatch("headers.before",e,n,a);var i=isNaN(parseInt(n.headerLevelStart))?1:parseInt(n.headerLevelStart),r=n.smoothLivePreview?/^(.+)[ \t]*\n={2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n=+[ \t]*\n+/gm,o=n.smoothLivePreview?/^(.+)[ \t]*\n-{2,}[ \t]*\n+/gm:/^(.+)[ \t]*\n-+[ \t]*\n+/gm;e=(e=e.replace(r,(function(e,r){var o=t.subParser("spanGamut")(r,n,a),s=n.noHeaderId?"":' id="'+l(r)+'"',u=""+o+"";return t.subParser("hashBlock")(u,n,a)}))).replace(o,(function(e,r){var o=t.subParser("spanGamut")(r,n,a),s=n.noHeaderId?"":' id="'+l(r)+'"',u=i+1,c=""+o+"";return t.subParser("hashBlock")(c,n,a)}));var s=n.requireSpaceBeforeHeadingText?/^(#{1,6})[ \t]+(.+?)[ \t]*#*\n+/gm:/^(#{1,6})[ \t]*(.+?)[ \t]*#*\n+/gm;function l(e){var i,r;if(n.customizedHeaderId){var o=e.match(/\{([^{]+?)}\s*$/);o&&o[1]&&(e=o[1])}return i=e,r=t.helper.isString(n.prefixHeaderId)?n.prefixHeaderId:!0===n.prefixHeaderId?"section-":"",n.rawPrefixHeaderId||(i=r+i),i=n.ghCompatibleHeaderId?i.replace(/ /g,"-").replace(/&/g,"").replace(/¨T/g,"").replace(/¨D/g,"").replace(/[&+$,\/:;=?@"#{}|^¨~\[\]`\\*)(%.!'<>]/g,"").toLowerCase():n.rawHeaderId?i.replace(/ /g,"-").replace(/&/g,"&").replace(/¨T/g,"¨").replace(/¨D/g,"$").replace(/["']/g,"-").toLowerCase():i.replace(/[^\w]/g,"").toLowerCase(),n.rawPrefixHeaderId&&(i=r+i),a.hashLinkCounts[i]?i=i+"-"+a.hashLinkCounts[i]++:a.hashLinkCounts[i]=1,i}return e=e.replace(s,(function(e,r,o){var s=o;n.customizedHeaderId&&(s=o.replace(/\s?\{([^{]+?)}\s*$/,""));var u=t.subParser("spanGamut")(s,n,a),c=n.noHeaderId?"":' id="'+l(o)+'"',d=i-1+r.length,h=""+u+"";return t.subParser("hashBlock")(h,n,a)})),e=a.converter._dispatch("headers.after",e,n,a)})),t.subParser("horizontalRule",(function(e,n,a){"use strict";e=a.converter._dispatch("horizontalRule.before",e,n,a);var i=t.subParser("hashBlock")("
",n,a);return e=(e=(e=e.replace(/^ {0,2}( ?-){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?\*){3,}[ \t]*$/gm,i)).replace(/^ {0,2}( ?_){3,}[ \t]*$/gm,i),e=a.converter._dispatch("horizontalRule.after",e,n,a)})),t.subParser("images",(function(e,n,a){"use strict";function i(e,n,i,r,o,s,l,u){var c=a.gUrls,d=a.gTitles,h=a.gDimensions;if(i=i.toLowerCase(),u||(u=""),e.search(/\(? ?(['"].*['"])?\)$/m)>-1)r="";else if(""===r||null===r){if(""!==i&&null!==i||(i=n.toLowerCase().replace(/ ?\n/g," ")),r="#"+i,t.helper.isUndefined(c[i]))return e;r=c[i],t.helper.isUndefined(d[i])||(u=d[i]),t.helper.isUndefined(h[i])||(o=h[i].width,s=h[i].height)}n=n.replace(/"/g,""").replace(t.helper.regexes.asteriskDashAndColon,t.helper.escapeCharactersCallback);var p=''+n+'"}return e=(e=(e=(e=(e=(e=a.converter._dispatch("images.before",e,n,a)).replace(/!\[([^\]]*?)] ?(?:\n *)?\[([\s\S]*?)]()()()()()/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,(function(e,t,n,a,r,o,s,l){return i(e,t,n,a=a.replace(/\s/g,""),r,o,s,l)}))).replace(/!\[([^\]]*?)][ \t]*()\([ \t]?<([^>]*)>(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(?:(["'])([^"]*?)\6))?[ \t]?\)/g,i)).replace(/!\[([^\]]*?)][ \t]*()\([ \t]??(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*(?:(["'])([^"]*?)\6)?[ \t]?\)/g,i)).replace(/!\[([^\[\]]+)]()()()()()/g,i),e=a.converter._dispatch("images.after",e,n,a)})),t.subParser("italicsAndBold",(function(e,t,n){"use strict";function a(e,t,n){return t+e+n}return e=n.converter._dispatch("italicsAndBold.before",e,t,n),e=t.literalMidWordUnderscores?(e=(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,(function(e,t){return a(t,"","")}))).replace(/\b__(\S[\s\S]*?)__\b/g,(function(e,t){return a(t,"","")}))).replace(/\b_(\S[\s\S]*?)_\b/g,(function(e,t){return a(t,"","")})):(e=(e=e.replace(/___(\S[\s\S]*?)___/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/__(\S[\s\S]*?)__/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/_([^\s_][\s\S]*?)_/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e})),e=t.literalMidWordAsterisks?(e=(e=e.replace(/([^*]|^)\B\*\*\*(\S[\s\S]*?)\*\*\*\B(?!\*)/g,(function(e,t,n){return a(n,t+"","")}))).replace(/([^*]|^)\B\*\*(\S[\s\S]*?)\*\*\B(?!\*)/g,(function(e,t,n){return a(n,t+"","")}))).replace(/([^*]|^)\B\*(\S[\s\S]*?)\*\B(?!\*)/g,(function(e,t,n){return a(n,t+"","")})):(e=(e=e.replace(/\*\*\*(\S[\s\S]*?)\*\*\*/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/\*\*(\S[\s\S]*?)\*\*/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e}))).replace(/\*([^\s*][\s\S]*?)\*/g,(function(e,t){return/\S$/.test(t)?a(t,"",""):e})),e=n.converter._dispatch("italicsAndBold.after",e,t,n)})),t.subParser("lists",(function(e,n,a){"use strict";function i(e,i){a.gListLevel++,e=e.replace(/\n{2,}$/,"\n");var r=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0| {0,3}([*+-]|\d+[.])[ \t]+))/gm,o=/\n[ \t]*\n(?!¨0)/.test(e+="¨0");return n.disableForced4SpacesIndentedSublists&&(r=/(\n)?(^ {0,3})([*+-]|\d+[.])[ \t]+((\[(x|X| )?])?[ \t]*[^\r]+?(\n{1,2}))(?=\n*(¨0|\2([*+-]|\d+[.])[ \t]+))/gm),e=(e=e.replace(r,(function(e,i,r,s,l,u,c){c=c&&""!==c.trim();var d=t.subParser("outdent")(l,n,a),h="";return u&&n.tasklists&&(h=' class="task-list-item" style="list-style-type: none;"',d=d.replace(/^[ \t]*\[(x|X| )?]/m,(function(){var e='-1?(d=t.subParser("githubCodeBlocks")(d,n,a),d=t.subParser("blockGamut")(d,n,a)):(d=(d=t.subParser("lists")(d,n,a)).replace(/\n$/,""),d=(d=t.subParser("hashHTMLBlocks")(d,n,a)).replace(/\n\n+/g,"\n\n"),d=o?t.subParser("paragraphs")(d,n,a):t.subParser("spanGamut")(d,n,a)),d=""+(d=d.replace("¨A",""))+"\n"}))).replace(/¨0/g,""),a.gListLevel--,i&&(e=e.replace(/\s+$/,"")),e}function r(e,t){if("ol"===t){var n=e.match(/^ *(\d+)\./);if(n&&"1"!==n[1])return' start="'+n[1]+'"'}return""}function o(e,t,a){var o=n.disableForced4SpacesIndentedSublists?/^ ?\d+\.[ \t]/gm:/^ {0,3}\d+\.[ \t]/gm,s=n.disableForced4SpacesIndentedSublists?/^ ?[*+-][ \t]/gm:/^ {0,3}[*+-][ \t]/gm,l="ul"===t?o:s,u="";if(-1!==e.search(l))!function n(c){var d=c.search(l),h=r(e,t);-1!==d?(u+="\n\n<"+t+h+">\n"+i(c.slice(0,d),!!a)+"\n",l="ul"===(t="ul"===t?"ol":"ul")?o:s,n(c.slice(d))):u+="\n\n<"+t+h+">\n"+i(c,!!a)+"\n"}(e);else{var c=r(e,t);u="\n\n<"+t+c+">\n"+i(e,!!a)+"\n"}return u}return e=a.converter._dispatch("lists.before",e,n,a),e+="¨0",e=(e=a.gListLevel?e.replace(/^(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,(function(e,t,n){return o(t,n.search(/[*+-]/g)>-1?"ul":"ol",!0)})):e.replace(/(\n\n|^\n?)(( {0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(¨0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm,(function(e,t,n,a){return o(n,a.search(/[*+-]/g)>-1?"ul":"ol",!1)}))).replace(/¨0/,""),e=a.converter._dispatch("lists.after",e,n,a)})),t.subParser("metadata",(function(e,t,n){"use strict";if(!t.metadata)return e;function a(e){n.metadata.raw=e,(e=(e=e.replace(/&/g,"&").replace(/"/g,""")).replace(/\n {4}/g," ")).replace(/^([\S ]+): +([\s\S]+?)$/gm,(function(e,t,a){return n.metadata.parsed[t]=a,""}))}return e=(e=(e=(e=n.converter._dispatch("metadata.before",e,t,n)).replace(/^\s*«««+(\S*?)\n([\s\S]+?)\n»»»+\n/,(function(e,t,n){return a(n),"¨M"}))).replace(/^\s*---+(\S*?)\n([\s\S]+?)\n---+\n/,(function(e,t,i){return t&&(n.metadata.format=t),a(i),"¨M"}))).replace(/¨M/g,""),e=n.converter._dispatch("metadata.after",e,t,n)})),t.subParser("outdent",(function(e,t,n){"use strict";return e=(e=(e=n.converter._dispatch("outdent.before",e,t,n)).replace(/^(\t|[ ]{1,4})/gm,"¨0")).replace(/¨0/g,""),e=n.converter._dispatch("outdent.after",e,t,n)})),t.subParser("paragraphs",(function(e,n,a){"use strict";for(var i=(e=(e=(e=a.converter._dispatch("paragraphs.before",e,n,a)).replace(/^\n+/g,"")).replace(/\n+$/g,"")).split(/\n{2,}/g),r=[],o=i.length,s=0;s=0?r.push(l):l.search(/\S/)>=0&&(l=(l=t.subParser("spanGamut")(l,n,a)).replace(/^([ \t]*)/g,"

"),l+="

",r.push(l))}for(o=r.length,s=0;s]*>\s*]*>/.test(c)&&(d=!0)}r[s]=c}return e=(e=(e=r.join("\n")).replace(/^\n+/g,"")).replace(/\n+$/g,""),a.converter._dispatch("paragraphs.after",e,n,a)})),t.subParser("runExtension",(function(e,t,n,a){"use strict";if(e.filter)t=e.filter(t,a.converter,n);else if(e.regex){var i=e.regex;i instanceof RegExp||(i=new RegExp(i,"g")),t=t.replace(i,e.replace)}return t})),t.subParser("spanGamut",(function(e,n,a){"use strict";return e=a.converter._dispatch("spanGamut.before",e,n,a),e=t.subParser("codeSpans")(e,n,a),e=t.subParser("escapeSpecialCharsWithinTagAttributes")(e,n,a),e=t.subParser("encodeBackslashEscapes")(e,n,a),e=t.subParser("images")(e,n,a),e=t.subParser("anchors")(e,n,a),e=t.subParser("autoLinks")(e,n,a),e=t.subParser("simplifiedAutoLinks")(e,n,a),e=t.subParser("emoji")(e,n,a),e=t.subParser("underline")(e,n,a),e=t.subParser("italicsAndBold")(e,n,a),e=t.subParser("strikethrough")(e,n,a),e=t.subParser("ellipsis")(e,n,a),e=t.subParser("hashHTMLSpans")(e,n,a),e=t.subParser("encodeAmpsAndAngles")(e,n,a),n.simpleLineBreaks?/\n\n¨K/.test(e)||(e=e.replace(/\n+/g,"
\n")):e=e.replace(/ +\n/g,"
\n"),e=a.converter._dispatch("spanGamut.after",e,n,a)})),t.subParser("strikethrough",(function(e,n,a){"use strict";return n.strikethrough&&(e=(e=a.converter._dispatch("strikethrough.before",e,n,a)).replace(/(?:~){2}([\s\S]+?)(?:~){2}/g,(function(e,i){return function(e){return n.simplifiedAutoLink&&(e=t.subParser("simplifiedAutoLinks")(e,n,a)),""+e+""}(i)})),e=a.converter._dispatch("strikethrough.after",e,n,a)),e})),t.subParser("stripLinkDefinitions",(function(e,n,a){"use strict";var i=function(i,r,o,s,l,u,c){return r=r.toLowerCase(),e.toLowerCase().split(r).length-1<2?i:(o.match(/^data:.+?\/.+?;base64,/)?a.gUrls[r]=o.replace(/\s/g,""):a.gUrls[r]=t.subParser("encodeAmpsAndAngles")(o,n,a),u?u+c:(c&&(a.gTitles[r]=c.replace(/"|'/g,""")),n.parseImgDimensions&&s&&l&&(a.gDimensions[r]={width:s,height:l}),""))};return e=(e=(e=(e+="¨0").replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n\n|(?=¨0)|(?=\n\[))/gm,i)).replace(/^ {0,3}\[([^\]]+)]:[ \t]*\n?[ \t]*\s]+)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=¨0))/gm,i)).replace(/¨0/,"")})),t.subParser("tables",(function(e,n,a){"use strict";if(!n.tables)return e;function i(e,i){return""+t.subParser("spanGamut")(e,n,a)+"\n"}function r(e){var r,o=e.split("\n");for(r=0;r"+(l=t.subParser("spanGamut")(l,n,a))+"\n"));for(r=0;r\n\n\n",i=0;i\n";for(var r=0;r\n"}return n+"\n\n"}(f,g)}return e=(e=(e=(e=a.converter._dispatch("tables.before",e,n,a)).replace(/\\(\|)/g,t.helper.escapeCharactersCallback)).replace(/^ {0,3}\|?.+\|.+\n {0,3}\|?[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:[-=]){2,}[\s\S]+?(?:\n\n|¨0)/gm,r)).replace(/^ {0,3}\|.+\|[ \t]*\n {0,3}\|[ \t]*:?[ \t]*(?:[-=]){2,}[ \t]*:?[ \t]*\|[ \t]*\n( {0,3}\|.+\|[ \t]*\n)*(?:\n|¨0)/gm,r),e=a.converter._dispatch("tables.after",e,n,a)})),t.subParser("underline",(function(e,n,a){"use strict";return n.underline?(e=a.converter._dispatch("underline.before",e,n,a),e=(e=n.literalMidWordUnderscores?(e=e.replace(/\b___(\S[\s\S]*?)___\b/g,(function(e,t){return""+t+""}))).replace(/\b__(\S[\s\S]*?)__\b/g,(function(e,t){return""+t+""})):(e=e.replace(/___(\S[\s\S]*?)___/g,(function(e,t){return/\S$/.test(t)?""+t+"":e}))).replace(/__(\S[\s\S]*?)__/g,(function(e,t){return/\S$/.test(t)?""+t+"":e}))).replace(/(_)/g,t.helper.escapeCharactersCallback),e=a.converter._dispatch("underline.after",e,n,a)):e})),t.subParser("unescapeSpecialChars",(function(e,t,n){"use strict";return e=(e=n.converter._dispatch("unescapeSpecialChars.before",e,t,n)).replace(/¨E(\d+)E/g,(function(e,t){var n=parseInt(t);return String.fromCharCode(n)})),e=n.converter._dispatch("unescapeSpecialChars.after",e,t,n)})),t.subParser("makeMarkdown.blockquote",(function(e,n){"use strict";var a="";if(e.hasChildNodes())for(var i=e.childNodes,r=i.length,o=0;o ")})),t.subParser("makeMarkdown.codeBlock",(function(e,t){"use strict";var n=e.getAttribute("language"),a=e.getAttribute("precodenum");return"```"+n+"\n"+t.preList[a]+"\n```"})),t.subParser("makeMarkdown.codeSpan",(function(e){"use strict";return"`"+e.innerHTML+"`"})),t.subParser("makeMarkdown.emphasis",(function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="*";for(var i=e.childNodes,r=i.length,o=0;o",e.hasAttribute("width")&&e.hasAttribute("height")&&(t+=" ="+e.getAttribute("width")+"x"+e.getAttribute("height")),e.hasAttribute("title")&&(t+=' "'+e.getAttribute("title")+'"'),t+=")"),t})),t.subParser("makeMarkdown.links",(function(e,n){"use strict";var a="";if(e.hasChildNodes()&&e.hasAttribute("href")){var i=e.childNodes,r=i.length;a="[";for(var o=0;o",e.hasAttribute("title")&&(a+=' "'+e.getAttribute("title")+'"'),a+=")"}return a})),t.subParser("makeMarkdown.list",(function(e,n,a){"use strict";var i="";if(!e.hasChildNodes())return"";for(var r=e.childNodes,o=r.length,s=e.getAttribute("start")||1,l=0;l"+t.preList[n]+""})),t.subParser("makeMarkdown.strikethrough",(function(e,n){"use strict";var a="";if(e.hasChildNodes()){a+="~~";for(var i=e.childNodes,r=i.length,o=0;otr>th"),l=e.querySelectorAll("tbody>tr");for(a=0;af&&(f=m)}for(a=0;a/g,"\\$1>")).replace(/^#/gm,"\\#")).replace(/^(\s*)([-=]{3,})(\s*)$/,"$1\\$2$3")).replace(/^( {0,3}\d+)\./gm,"$1\\.")).replace(/^( {0,3})([+-])/gm,"$1\\$2")).replace(/]([\s]*)\(/g,"\\]$1\\(")).replace(/^ {0,3}\[([\S \t]*?)]:/gm,"\\[$1]:")}));"function"==typeof define&&define.amd?define((function(){"use strict";return t})):"undefined"!=typeof module&&module.exports?module.exports=t:this.showdown=t}.call(this);var NostrTools=(()=>{var e=Object.defineProperty,t=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,i=(t,n)=>{for(var a in n)e(t,a,{get:n[a],enumerable:!0})},r={};function o(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function s(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}function l(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}i(r,{Relay:()=>Ia,SimplePool:()=>qa,finalizeEvent:()=>Bt,fj:()=>ya,generateSecretKey:()=>jt,getEventHash:()=>qt,getFilterLimit:()=>_a,getPublicKey:()=>$t,kinds:()=>Vt,matchFilter:()=>ga,matchFilters:()=>va,mergeFilters:()=>ba,nip04:()=>Ai,nip05:()=>Mr,nip10:()=>zr,nip11:()=>Dr,nip13:()=>Br,nip18:()=>Ur,nip19:()=>Da,nip21:()=>Qr,nip25:()=>Jr,nip27:()=>to,nip28:()=>ro,nip30:()=>ho,nip39:()=>bo,nip42:()=>Ta,nip44:()=>wo,nip47:()=>is,nip57:()=>ls,nip98:()=>fs,parseReferences:()=>Ti,serializeEvent:()=>zt,sortEvents:()=>mt,utils:()=>Tt,validateEvent:()=>ft,verifiedSymbol:()=>ht,verifyEvent:()=>Ft});var u="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,c=e=>e instanceof Uint8Array,d=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),h=(e,t)=>e<<32-t|e>>>t;if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function p(e){if("string"==typeof e&&(e=function(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}(e)),!c(e))throw new Error("expected Uint8Array, got "+typeof e);return e}var f=class{clone(){return this._cloneInto()}};function m(e){const t=t=>e().update(p(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function g(e=32){if(u&&"function"==typeof u.getRandomValues)return u.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}var v=class extends f{constructor(e,t,n,a){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=a,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=d(this.buffer)}update(e){l(this);const{view:t,buffer:n,blockLen:a}=this,i=(e=p(e)).length;for(let r=0;ra-r&&(this.process(n,0),r=0);for(let e=r;e>i&r),s=Number(n&r),l=a?4:0,u=a?0:4;e.setUint32(t+l,o,a),e.setUint32(t+u,s,a)}(n,a-8,BigInt(8*this.length),i),this.process(n,0);const o=d(e),u=this.outputLen;if(u%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const c=u/4,h=this.get();if(c>h.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^e&n^t&n,_=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),y=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),w=new Uint32Array(64),k=class extends v{constructor(){super(64,32,8,!1),this.A=0|y[0],this.B=0|y[1],this.C=0|y[2],this.D=0|y[3],this.E=0|y[4],this.F=0|y[5],this.G=0|y[6],this.H=0|y[7]}get(){const{A:e,B:t,C:n,D:a,E:i,F:r,G:o,H:s}=this;return[e,t,n,a,i,r,o,s]}set(e,t,n,a,i,r,o,s){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|a,this.E=0|i,this.F=0|r,this.G=0|o,this.H=0|s}process(e,t){for(let n=0;n<16;n++,t+=4)w[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=w[e-15],n=w[e-2],a=h(t,7)^h(t,18)^t>>>3,i=h(n,17)^h(n,19)^n>>>10;w[e]=i+w[e-7]+a+w[e-16]|0}let{A:n,B:a,C:i,D:r,E:o,F:s,G:l,H:u}=this;for(let e=0;e<64;e++){const t=u+(h(o,6)^h(o,11)^h(o,25))+((c=o)&s^~c&l)+_[e]+w[e]|0,d=(h(n,2)^h(n,13)^h(n,22))+b(n,a,i)|0;u=l,l=s,s=o,o=r+t|0,r=i,i=a,a=n,n=t+d|0}var c;n=n+this.A|0,a=a+this.B|0,i=i+this.C|0,r=r+this.D|0,o=o+this.E|0,s=s+this.F|0,l=l+this.G|0,u=u+this.H|0,this.set(n,a,i,r,o,s,l,u)}roundClean(){w.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}},x=m((()=>new k)),S={};i(S,{bitGet:()=>U,bitLen:()=>V,bitMask:()=>W,bitSet:()=>H,bytesToHex:()=>P,bytesToNumberBE:()=>R,bytesToNumberLE:()=>I,concatBytes:()=>$,createHmacDrbg:()=>K,ensureBytes:()=>j,equalBytes:()=>B,hexToBytes:()=>N,hexToNumber:()=>O,numberToBytesBE:()=>z,numberToBytesLE:()=>q,numberToHexUnpadded:()=>L,numberToVarBytesBE:()=>D,utf8ToBytes:()=>F,validateObject:()=>Z});var C=BigInt(0),E=BigInt(1),T=BigInt(2),A=e=>e instanceof Uint8Array,M=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function P(e){if(!A(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length),0));let n=0;return e.forEach((e=>{if(!A(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}function B(e,t){if(e.length!==t.length)return!1;for(let n=0;nC;e>>=E,t+=1);return t}function U(e,t){return e>>BigInt(t)&E}var H=(e,t,n)=>e|(n?E:C)<(T<new Uint8Array(e),Q=e=>Uint8Array.from(e);function K(e,t,n){if("number"!=typeof e||e<2)throw new Error("hashLen must be a number");if("number"!=typeof t||t<2)throw new Error("qByteLen must be a number");if("function"!=typeof n)throw new Error("hmacFn must be a function");let a=Y(e),i=Y(e),r=0;const o=()=>{a.fill(1),i.fill(0),r=0},s=(...e)=>n(i,a,...e),l=(e=Y())=>{i=s(Q([0]),e),a=s(),0!==e.length&&(i=s(Q([1]),e),a=s())},u=()=>{if(r++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e{let n;for(o(),l(e);!(n=t(u()));)l();return o(),n}}var G={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||e instanceof Uint8Array,isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function Z(e,t,n={}){const a=(t,n,a)=>{const i=G[n];if("function"!=typeof i)throw new Error(`Invalid validator "${n}", expected function`);const r=e[t];if(!(a&&void 0===r||i(r,e)))throw new Error(`Invalid param ${String(t)}=${r} (${typeof r}), expected ${n}`)};for(const[e,n]of Object.entries(t))a(e,n,!1);for(const[e,t]of Object.entries(n))a(e,t,!0);return e}var J=BigInt(0),X=BigInt(1),ee=BigInt(2),te=BigInt(3),ne=BigInt(4),ae=BigInt(5),ie=BigInt(8);BigInt(9),BigInt(16);function re(e,t){const n=e%t;return n>=J?n:t+n}function oe(e,t,n){if(n<=J||t 0");if(n===X)return J;let a=X;for(;t>J;)t&X&&(a=a*e%n),e=e*e%n,t>>=X;return a}function se(e,t,n){let a=e;for(;t-- >J;)a*=a,a%=n;return a}function le(e,t){if(e===J||t<=J)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=re(e,t),a=t,i=J,r=X,o=X,s=J;for(;n!==J;){const e=a/n,t=a%n,l=i-o*e,u=r-s*e;a=n,n=t,i=o,r=s,o=l,s=u}if(a!==X)throw new Error("invert: does not exist");return re(i,t)}function ue(e){if(e%ne===te){const t=(e+X)/ne;return function(e,n){const a=e.pow(n,t);if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}if(e%ie===ae){const t=(e-ae)/ie;return function(e,n){const a=e.mul(n,ee),i=e.pow(a,t),r=e.mul(n,i),o=e.mul(e.mul(r,ee),i),s=e.mul(r,e.sub(o,e.ONE));if(!e.eql(e.sqr(s),n))throw new Error("Cannot find square root");return s}}return function(e){const t=(e-X)/ee;let n,a,i;for(n=e-X,a=0;n%ee===J;n/=ee,a++);for(i=ee;i(e[t]="function",e)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"})),Z(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...de(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}var{bytesToNumberBE:ve,hexToBytes:be}=S,_e={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=_e;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],a=e.subarray(2,n+2);if(!n||a.length!==n)throw new t("Invalid signature integer: wrong length");if(128&a[0])throw new t("Invalid signature integer: negative");if(0===a[0]&&!(128&a[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:ve(a),l:e.subarray(n+2)}},toSig(e){const{Err:t}=_e,n="string"==typeof e?be(e):e;if(!(n instanceof Uint8Array))throw new Error("ui8a expected");let a=n.length;if(a<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==a-2)throw new t("Invalid signature: incorrect length");const{d:i,l:r}=_e._parseInt(n.subarray(2)),{d:o,l:s}=_e._parseInt(r);if(s.length)throw new t("Invalid signature: left bytes after parsing");return{r:i,s:o}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},a=t(n(e.s)),i=t(n(e.r)),r=a.length/2,o=i.length/2,s=n(r),l=n(o);return`30${n(o+r+4)}02${l}${i}02${s}${a}`}},ye=BigInt(0),we=BigInt(1),ke=(BigInt(2),BigInt(3));BigInt(4);function xe(e){const t=function(e){const t=ge(e);Z(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:a,a:i}=t;if(n){if(!a.eql(i,a.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,a=t.toBytes||((e,t,a)=>{const i=t.toAffine();return $(Uint8Array.from([4]),n.toBytes(i.x),n.toBytes(i.y))}),i=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function r(e){const{a:a,b:i}=t,r=n.sqr(e),o=n.mul(r,e);return n.add(n.add(o,n.mul(e,a)),i)}if(!n.eql(n.sqr(t.Gy),r(t.Gx)))throw new Error("bad generator point: equation left != right");function o(e){return"bigint"==typeof e&&yen.eql(e,n.ZERO);return i(t)&&i(a)?d.ZERO:new d(t,a,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(d.fromAffine)}static fromHex(e){const t=d.fromAffine(i(j("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return d.BASE.multiply(l(e))}_setWindowSize(e){this._WINDOW_SIZE=e,u.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:a}=this.toAffine();if(!n.isValid(e)||!n.isValid(a))throw new Error("bad point: x or y not FE");const i=n.sqr(a),o=r(e);if(!n.eql(i,o))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){c(e);const{px:t,py:a,pz:i}=this,{px:r,py:o,pz:s}=e,l=n.eql(n.mul(t,s),n.mul(r,i)),u=n.eql(n.mul(a,s),n.mul(o,i));return l&&u}negate(){return new d(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:a}=t,i=n.mul(a,ke),{px:r,py:o,pz:s}=this;let l=n.ZERO,u=n.ZERO,c=n.ZERO,h=n.mul(r,r),p=n.mul(o,o),f=n.mul(s,s),m=n.mul(r,o);return m=n.add(m,m),c=n.mul(r,s),c=n.add(c,c),l=n.mul(e,c),u=n.mul(i,f),u=n.add(l,u),l=n.sub(p,u),u=n.add(p,u),u=n.mul(l,u),l=n.mul(m,l),c=n.mul(i,c),f=n.mul(e,f),m=n.sub(h,f),m=n.mul(e,m),m=n.add(m,c),c=n.add(h,h),h=n.add(c,h),h=n.add(h,f),h=n.mul(h,m),u=n.add(u,h),f=n.mul(o,s),f=n.add(f,f),h=n.mul(f,m),l=n.sub(l,h),c=n.mul(f,p),c=n.add(c,c),c=n.add(c,c),new d(l,u,c)}add(e){c(e);const{px:a,py:i,pz:r}=this,{px:o,py:s,pz:l}=e;let u=n.ZERO,h=n.ZERO,p=n.ZERO;const f=t.a,m=n.mul(t.b,ke);let g=n.mul(a,o),v=n.mul(i,s),b=n.mul(r,l),_=n.add(a,i),y=n.add(o,s);_=n.mul(_,y),y=n.add(g,v),_=n.sub(_,y),y=n.add(a,r);let w=n.add(o,l);return y=n.mul(y,w),w=n.add(g,b),y=n.sub(y,w),w=n.add(i,r),u=n.add(s,l),w=n.mul(w,u),u=n.add(v,b),w=n.sub(w,u),p=n.mul(f,y),u=n.mul(m,b),p=n.add(u,p),u=n.sub(v,p),p=n.add(v,p),h=n.mul(u,p),v=n.add(g,g),v=n.add(v,g),b=n.mul(f,b),y=n.mul(m,y),v=n.add(v,b),b=n.sub(g,b),b=n.mul(f,b),y=n.add(y,b),g=n.mul(v,y),h=n.add(h,g),g=n.mul(w,y),u=n.mul(_,u),u=n.sub(u,g),g=n.mul(_,v),p=n.mul(w,p),p=n.add(p,g),new d(u,h,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(d.ZERO)}wNAF(e){return p.wNAFCached(this,u,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(d.fromAffine)}))}multiplyUnsafe(e){const a=d.ZERO;if(e===ye)return a;if(s(e),e===we)return this;const{endo:i}=t;if(!i)return p.unsafeLadder(this,e);let{k1neg:r,k1:o,k2neg:l,k2:u}=i.splitScalar(e),c=a,h=a,f=this;for(;o>ye||u>ye;)o&we&&(c=c.add(f)),u&we&&(h=h.add(f)),f=f.double(),o>>=we,u>>=we;return r&&(c=c.negate()),l&&(h=h.negate()),h=new d(n.mul(h.px,i.beta),h.py,h.pz),c.add(h)}multiply(e){s(e);let a,i,r=e;const{endo:o}=t;if(o){const{k1neg:e,k1:t,k2neg:s,k2:l}=o.splitScalar(r);let{p:u,f:c}=this.wNAF(t),{p:h,f:f}=this.wNAF(l);u=p.constTimeNegate(e,u),h=p.constTimeNegate(s,h),h=new d(n.mul(h.px,o.beta),h.py,h.pz),a=u.add(h),i=c.add(f)}else{const{p:e,f:t}=this.wNAF(r);a=e,i=t}return d.normalizeZ([a,i])[0]}multiplyAndAddUnsafe(e,t,n){const a=d.BASE,i=(e,t)=>t!==ye&&t!==we&&e.equals(a)?e.multiply(t):e.multiplyUnsafe(t),r=i(this,t).add(i(e,n));return r.is0()?void 0:r}toAffine(e){const{px:t,py:a,pz:i}=this,r=this.is0();null==e&&(e=r?n.ONE:n.inv(i));const o=n.mul(t,e),s=n.mul(a,e),l=n.mul(i,e);if(r)return{x:n.ZERO,y:n.ZERO};if(!n.eql(l,n.ONE))throw new Error("invZ was invalid");return{x:o,y:s}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===we)return!0;if(n)return n(d,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===we?this:n?n(d,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),a(d,this,e)}toHex(e=!0){return P(this.toRawBytes(e))}}d.BASE=new d(t.Gx,t.Gy,n.ONE),d.ZERO=new d(n.ZERO,n.ONE,n.ZERO);const h=t.nBitLength,p=function(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},a=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let a=e.ZERO,i=t;for(;n>fe;)n&me&&(a=a.add(i)),i=i.double(),n>>=me;return a},precomputeWindow(e,t){const{windows:n,windowSize:i}=a(t),r=[];let o=e,s=o;for(let e=0;e>=h,a>s&&(a-=d,r+=me);const o=t,p=t+Math.abs(a)-1,f=e%2!=0,m=a<0;0===a?u=u.add(n(f,i[o])):l=l.add(n(m,i[p]))}return{p:l,f:u}},wNAFCached(e,t,n,a){const i=e._WINDOW_SIZE||1;let r=t.get(e);return r||(r=this.precomputeWindow(e,i),1!==i&&t.set(e,a(r))),this.wNAF(i,r,n)}}}(d,t.endo?Math.ceil(h/2):h);return{CURVE:t,ProjectivePoint:d,normPrivateKeyToScalar:l,weierstrassEquation:r,isWithinCurveOrder:o}}function Se(e){const t=function(e){const t=ge(e);return Z(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:a}=t,i=n.BYTES+1,r=2*n.BYTES+1;function o(e){return re(e,a)}function s(e){return le(e,a)}const{ProjectivePoint:l,normPrivateKeyToScalar:u,weierstrassEquation:c,isWithinCurveOrder:d}=xe({...t,toBytes(e,t,a){const i=t.toAffine(),r=n.toBytes(i.x),o=$;return a?o(Uint8Array.from([t.hasEvenY()?2:3]),r):o(Uint8Array.from([4]),r,n.toBytes(i.y))},fromBytes(e){const t=e.length,a=e[0],o=e.subarray(1);if(t!==i||2!==a&&3!==a){if(t===r&&4===a){return{x:n.fromBytes(o.subarray(0,n.BYTES)),y:n.fromBytes(o.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${i} compressed bytes or ${r} uncompressed bytes`)}{const e=R(o);if(!(ye<(s=e)&&sP(z(e,t.nByteLength));function p(e){return e>a>>we}const f=(e,t,n)=>R(e.slice(t,n));class m{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=j("compactSignature",e,2*n),new m(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=_e.toSig(j("DER",e));return new m(t,n)}assertValidity(){if(!d(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!d(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new m(this.r,this.s,e)}recoverPublicKey(e){const{r:a,s:i,recovery:r}=this,u=_(j("msgHash",e));if(null==r||![0,1,2,3].includes(r))throw new Error("recovery id invalid");const c=2===r||3===r?a+t.n:a;if(c>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const d=1&r?"03":"02",p=l.fromHex(d+h(c)),f=s(c),m=o(-u*f),g=o(i*f),v=l.BASE.multiplyAndAddUnsafe(p,m,g);if(!v)throw new Error("point at infinify");return v.assertValidity(),v}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new m(this.r,o(-this.s),this.recovery):this}toDERRawBytes(){return N(this.toDERHex())}toDERHex(){return _e.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return N(this.toCompactHex())}toCompactHex(){return h(this.r)+h(this.s)}}const g={isValidPrivateKey(e){try{return u(e),!0}catch(e){return!1}},normPrivateKeyToScalar:u,randomPrivateKey:()=>{const e=pe(t.n);return function(e,t,n=!1){const a=e.length,i=he(t),r=pe(t);if(a<16||a1024)throw new Error(`expected ${r}-1024 bytes of input, got ${a}`);const o=re(n?R(e):I(e),t-X)+X;return n?q(o,i):z(o,i)}(t.randomBytes(e),t.n)},precompute:(e=8,t=l.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function v(e){const t=e instanceof Uint8Array,n="string"==typeof e,a=(t||n)&&e.length;return t?a===i||a===r:n?a===2*i||a===2*r:e instanceof l}const b=t.bits2int||function(e){const n=R(e),a=8*e.length-t.nBitLength;return a>0?n>>BigInt(a):n},_=t.bits2int_modN||function(e){return o(b(e))},y=W(t.nBitLength);function w(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(ye<=e&&ee in i)))throw new Error("sign() legacy options not supported");const{hash:r,randomBytes:c}=t;let{lowS:h,prehash:f,extraEntropy:g}=i;null==h&&(h=!0),e=j("msgHash",e),f&&(e=j("prehashed msgHash",r(e)));const v=_(e),y=u(a),k=[w(y),w(v)];if(null!=g){const e=!0===g?c(n.BYTES):g;k.push(j("extraEntropy",e))}const S=$(...k),C=v;return{seed:S,k2sig:function(e){const t=b(e);if(!d(t))return;const n=s(t),a=l.BASE.multiply(t).toAffine(),i=o(a.x);if(i===ye)return;const r=o(n*o(C+i*y));if(r===ye)return;let u=(a.x===i?0:2)|Number(a.y&we),c=r;return h&&p(r)&&(c=function(e){return p(e)?o(-e):e}(r),u^=1),new m(i,c,u)}}}const x={lowS:t.lowS,prehash:!1},S={lowS:t.lowS,prehash:!1};return l.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return l.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(v(e))throw new Error("first arg must be private key");if(!v(t))throw new Error("second arg must be public key");return l.fromHex(t).multiply(u(e)).toRawBytes(n)},sign:function(e,n,a=x){const{seed:i,k2sig:r}=k(e,n,a),o=t;return K(o.hash.outputLen,o.nByteLength,o.hmac)(i,r)},verify:function(e,n,a,i=S){const r=e;if(n=j("msgHash",n),a=j("publicKey",a),"strict"in i)throw new Error("options.strict was renamed to lowS");const{lowS:u,prehash:c}=i;let d,h;try{if("string"==typeof r||r instanceof Uint8Array)try{d=m.fromDER(r)}catch(e){if(!(e instanceof _e.Err))throw e;d=m.fromCompact(r)}else{if("object"!=typeof r||"bigint"!=typeof r.r||"bigint"!=typeof r.s)throw new Error("PARSE");{const{r:e,s:t}=r;d=new m(e,t)}}h=l.fromHex(a)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(u&&d.hasHighS())return!1;c&&(n=t.hash(n));const{r:p,s:f}=d,g=_(n),v=s(f),b=o(g*v),y=o(p*v),w=l.BASE.multiplyAndAddUnsafe(h,b,y)?.toAffine();return!!w&&o(w.x)===p},ProjectivePoint:l,Signature:m,utils:g}}var Ce=class extends f{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");o(e.outputLen),o(e.blockLen)}(e);const n=p(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const a=this.blockLen,i=new Uint8Array(a);i.set(n.length>a?e.create().update(n).digest():n);for(let e=0;enew Ce(e,t).update(n).digest();function Te(e){return{hash:e,hmac:(t,...n)=>Ee(e,t,function(...e){const t=new Uint8Array(e.reduce(((e,t)=>e+t.length),0));let n=0;return e.forEach((e=>{if(!c(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}(...n)),randomBytes:g}}Ee.create=(e,t)=>new Ce(e,t);var Ae=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),Me=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Pe=BigInt(1),Le=BigInt(2),Oe=(e,t)=>(e+t/Le)/t;function Ne(e){const t=Ae,n=BigInt(3),a=BigInt(6),i=BigInt(11),r=BigInt(22),o=BigInt(23),s=BigInt(44),l=BigInt(88),u=e*e*e%t,c=u*u*e%t,d=se(c,n,t)*c%t,h=se(d,n,t)*c%t,p=se(h,Le,t)*u%t,f=se(p,i,t)*p%t,m=se(f,r,t)*f%t,g=se(m,s,t)*m%t,v=se(g,l,t)*g%t,b=se(v,s,t)*m%t,_=se(b,n,t)*c%t,y=se(_,o,t)*f%t,w=se(y,a,t)*u%t,k=se(w,Le,t);if(!Re.eql(Re.sqr(k),e))throw new Error("Cannot find square root");return k}var Re=function(e,t,n=!1,a={}){if(e<=J)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:i,nByteLength:r}=de(e,t);if(r>2048)throw new Error("Field lengths over 2048 bytes are not supported");const o=ue(e),s=Object.freeze({ORDER:e,BITS:i,BYTES:r,MASK:W(i),ZERO:J,ONE:X,create:t=>re(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return J<=t&&te===J,isOdd:e=>(e&X)===X,neg:t=>re(-t,e),eql:(e,t)=>e===t,sqr:t=>re(t*t,e),add:(t,n)=>re(t+n,e),sub:(t,n)=>re(t-n,e),mul:(t,n)=>re(t*n,e),pow:(e,t)=>function(e,t,n){if(n 0");if(n===J)return e.ONE;if(n===X)return t;let a=e.ONE,i=t;for(;n>J;)n&X&&(a=e.mul(a,i)),i=e.sqr(i),n>>=X;return a}(s,e,t),div:(t,n)=>re(t*le(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>le(t,e),sqrt:a.sqrt||(e=>o(s,e)),invertBatch:e=>function(e,t){const n=new Array(t.length),a=t.reduce(((t,a,i)=>e.is0(a)?t:(n[i]=t,e.mul(t,a))),e.ONE),i=e.inv(a);return t.reduceRight(((t,a,i)=>e.is0(a)?t:(n[i]=e.mul(t,n[i]),e.mul(t,a))),i),n}(s,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?q(e,r):z(e,r),fromBytes:e=>{if(e.length!==r)throw new Error(`Fp.fromBytes: expected ${r}, got ${e.length}`);return n?I(e):R(e)}});return Object.freeze(s)}(Ae,void 0,void 0,{sqrt:Ne}),Ie=function(e,t){const n=t=>Se({...e,...Te(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Re,n:Me,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=Me,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),a=-Pe*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),i=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),r=n,o=BigInt("0x100000000000000000000000000000000"),s=Oe(r*e,t),l=Oe(-a*e,t);let u=re(e-s*n-l*i,t),c=re(-s*a-l*r,t);const d=u>o,h=c>o;if(d&&(u=t-u),h&&(c=t-c),u>o||c>o)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:d,k1:u,k2neg:h,k2:c}}}},x),ze=BigInt(0),qe=e=>"bigint"==typeof e&&ze"bigint"==typeof e&&zee.charCodeAt(0))));n=$(t,t),je[e]=n}return x($(n,...t))}var Be=e=>e.toRawBytes(!0).slice(1),Fe=e=>z(e,32),Ve=e=>re(e,Ae),Ue=e=>re(e,Me),He=Ie.ProjectivePoint,We=(e,t,n)=>He.BASE.multiplyAndAddUnsafe(e,t,n);function Ye(e){let t=Ie.utils.normPrivateKeyToScalar(e),n=He.fromPrivateKey(t);return{scalar:n.hasEvenY()?t:Ue(-t),bytes:Be(n)}}function Qe(e){if(!qe(e))throw new Error("bad x: need 0 < x < p");const t=Ve(e*e);let n=Ne(Ve(t*e+BigInt(7)));n%Le!==ze&&(n=Ve(-n));const a=new He(e,n,Pe);return a.assertValidity(),a}function Ke(...e){return Ue(R($e("BIP0340/challenge",...e)))}function Ge(e){return Ye(e).bytes}function Ze(e,t,n=g(32)){const a=j("message",e),{bytes:i,scalar:r}=Ye(t),o=j("auxRand",n,32),s=Fe(r^R($e("BIP0340/aux",o))),l=$e("BIP0340/nonce",s,i,a),u=Ue(R(l));if(u===ze)throw new Error("sign failed: k is zero");const{bytes:c,scalar:d}=Ye(u),h=Ke(c,i,a),p=new Uint8Array(64);if(p.set(c,0),p.set(Fe(Ue(d+h*r)),32),!Je(p,a,i))throw new Error("sign: Invalid signature produced");return p}function Je(e,t,n){const a=j("signature",e,64),i=j("message",t),r=j("publicKey",n,32);try{const e=Qe(R(r)),t=R(a.subarray(0,32));if(!qe(t))return!1;const n=R(a.subarray(32,64));if(!De(n))return!1;const o=Ke(Fe(t),Be(e),i),s=We(e,n,Ue(-o));return!(!s||!s.hasEvenY()||s.toAffine().x!==t)}catch(e){return!1}}var Xe=(()=>({getPublicKey:Ge,sign:Ze,verify:Je,utils:{randomPrivateKey:Ie.utils.randomPrivateKey,lift_x:Qe,pointToBytes:Be,numberToBytesBE:z,bytesToNumberBE:R,taggedHash:$e,mod:re}}))(),et="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,tt=e=>e instanceof Uint8Array,nt=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),at=(e,t)=>e<<32-t|e>>>t;if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");var it=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function rt(e){if(!tt(e))throw new Error("Uint8Array expected");let t="";for(let n=0;ne+t.length),0));let n=0;return e.forEach((e=>{if(!tt(e))throw new Error("Uint8Array expected");t.set(e,n),n+=e.length})),t}var ut=class{clone(){return this._cloneInto()}};function ct(e){const t=t=>e().update(st(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function dt(e=32){if(et&&"function"==typeof et.getRandomValues)return et.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}var ht=Symbol("verified"),pt=e=>e instanceof Object;function ft(e){if(!pt(e))return!1;if("number"!=typeof e.kind)return!1;if("string"!=typeof e.content)return!1;if("number"!=typeof e.created_at)return!1;if("string"!=typeof e.pubkey)return!1;if(!e.pubkey.match(/^[a-f0-9]{64}$/))return!1;if(!Array.isArray(e.tags))return!1;for(let t=0;te.created_at!==t.created_at?t.created_at-e.created_at:e.id.localeCompare(t.id)))}function gt(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`Wrong positive integer: ${e}`)}function vt(e,...t){if(!(e instanceof Uint8Array))throw new Error("Expected Uint8Array");if(t.length>0&&!t.includes(e.length))throw new Error(`Expected Uint8Array of length ${t}, not of length=${e.length}`)}var bt={number:gt,bool:function(e){if("boolean"!=typeof e)throw new Error(`Expected boolean, not ${e}`)},bytes:vt,hash:function(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");gt(e.outputLen),gt(e.blockLen)},exists:function(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")},output:function(e,t){vt(e);const n=t.outputLen;if(e.lengtha-r&&(this.process(n,0),r=0);for(let e=r;e>i&r),s=Number(n&r),l=a?4:0,u=a?0:4;e.setUint32(t+l,o,a),e.setUint32(t+u,s,a)}(n,a-8,BigInt(8*this.length),i),this.process(n,0);const o=nt(e),s=this.outputLen;if(s%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const l=s/4,u=this.get();if(l>u.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;ee&t^e&n^t&n,wt=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),kt=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),xt=new Uint32Array(64),St=class extends _t{constructor(){super(64,32,8,!1),this.A=0|kt[0],this.B=0|kt[1],this.C=0|kt[2],this.D=0|kt[3],this.E=0|kt[4],this.F=0|kt[5],this.G=0|kt[6],this.H=0|kt[7]}get(){const{A:e,B:t,C:n,D:a,E:i,F:r,G:o,H:s}=this;return[e,t,n,a,i,r,o,s]}set(e,t,n,a,i,r,o,s){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|a,this.E=0|i,this.F=0|r,this.G=0|o,this.H=0|s}process(e,t){for(let n=0;n<16;n++,t+=4)xt[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=xt[e-15],n=xt[e-2],a=at(t,7)^at(t,18)^t>>>3,i=at(n,17)^at(n,19)^n>>>10;xt[e]=i+xt[e-7]+a+xt[e-16]|0}let{A:n,B:a,C:i,D:r,E:o,F:s,G:l,H:u}=this;for(let e=0;e<64;e++){const t=u+(at(o,6)^at(o,11)^at(o,25))+((c=o)&s^~c&l)+wt[e]+xt[e]|0,d=(at(n,2)^at(n,13)^at(n,22))+yt(n,a,i)|0;u=l,l=s,s=o,o=r+t|0,r=i,i=a,a=n,n=t+d|0}var c;n=n+this.A|0,a=a+this.B|0,i=i+this.C|0,r=r+this.D|0,o=o+this.E|0,s=s+this.F|0,l=l+this.G|0,u=u+this.H|0,this.set(n,a,i,r,o,s,l,u)}roundClean(){xt.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}},Ct=class extends St{constructor(){super(),this.A=-1056596264,this.B=914150663,this.C=812702999,this.D=-150054599,this.E=-4191439,this.F=1750603025,this.G=1694076839,this.H=-1090891868,this.outputLen=28}},Et=ct((()=>new St)),Tt=(ct((()=>new Ct)),{});i(Tt,{Queue:()=>It,QueueNode:()=>Rt,binarySearch:()=>Nt,insertEventIntoAscendingList:()=>Ot,insertEventIntoDescendingList:()=>Lt,normalizeURL:()=>Pt,utf8Decoder:()=>At,utf8Encoder:()=>Mt});var At=new TextDecoder("utf-8"),Mt=new TextEncoder;function Pt(e){-1===e.indexOf("://")&&(e="wss://"+e);let t=new URL(e);return t.pathname=t.pathname.replace(/\/+/g,"/"),t.pathname.endsWith("/")&&(t.pathname=t.pathname.slice(0,-1)),("80"===t.port&&"ws:"===t.protocol||"443"===t.port&&"wss:"===t.protocol)&&(t.port=""),t.searchParams.sort(),t.hash="",t.toString()}function Lt(e,t){const[n,a]=Nt(e,(e=>t.id===e.id?0:t.created_at===e.created_at?-1:e.created_at-t.created_at));return a||e.splice(n,0,t),e}function Ot(e,t){const[n,a]=Nt(e,(e=>t.id===e.id?0:t.created_at===e.created_at?-1:t.created_at-e.created_at));return a||e.splice(n,0,t),e}function Nt(e,t){let n=0,a=e.length-1;for(;n<=a;){const i=Math.floor((n+a)/2),r=t(e[i]);if(0===r)return[i,!0];r<0?a=i-1:n=i+1}return[n,!1]}var Rt=class{value;next=null;prev=null;constructor(e){this.value=e}},It=class{first;last;constructor(){this.first=null,this.last=null}enqueue(e){const t=new Rt(e);return this.last?this.last===this.first?(this.last=t,this.last.prev=this.first,this.first.next=t):(t.prev=this.last,this.last.next=t,this.last=t):(this.first=t,this.last=t),!0}dequeue(){if(!this.first)return null;if(this.first===this.last){const e=this.first;return this.first=null,this.last=null,e.value}const e=this.first;return this.first=e.next,e.value}};function zt(e){if(!ft(e))throw new Error("can't serialize event with wrong or missing properties");return JSON.stringify([0,e.pubkey,e.created_at,e.kind,e.tags,e.content])}function qt(e){return rt(Et(Mt.encode(zt(e))))}var Dt=new class{generateSecretKey(){return Xe.utils.randomPrivateKey()}getPublicKey(e){return rt(Xe.getPublicKey(e))}finalizeEvent(e,t){const n=e;return n.pubkey=rt(Xe.getPublicKey(t)),n.id=qt(n),n.sig=rt(Xe.sign(qt(n),t)),n[ht]=!0,n}verifyEvent(e){if("boolean"==typeof e[ht])return e[ht];const t=qt(e);if(t!==e.id)return e[ht]=!1,!1;try{const n=Xe.verify(e.sig,t,e.pubkey);return e[ht]=n,n}catch(t){return e[ht]=!1,!1}}},jt=Dt.generateSecretKey,$t=Dt.getPublicKey,Bt=Dt.finalizeEvent,Ft=Dt.verifyEvent,Vt={};function Ut(e){return 1e3<=e&&e<1e4||[1,2,4,5,6,7,8,16,40,41,42,43,44].includes(e)}function Ht(e){return[0,3].includes(e)||1e4<=e&&e<2e4}function Wt(e){return 2e4<=e&&e<3e4}function Yt(e){return 3e4<=e&&e<4e4}function Qt(e){return Ut(e)?"regular":Ht(e)?"replaceable":Wt(e)?"ephemeral":Yt(e)?"parameterized":"unknown"}i(Vt,{Application:()=>ia,BadgeAward:()=>rn,BadgeDefinition:()=>Zn,BlockedRelaysList:()=>Nn,BookmarkList:()=>Pn,Bookmarksets:()=>Qn,Calendar:()=>da,CalendarEventRSVP:()=>ha,ChannelCreation:()=>sn,ChannelHideMessage:()=>cn,ChannelMessage:()=>un,ChannelMetadata:()=>ln,ChannelMuteUser:()=>dn,ClassifiedListing:()=>sa,ClientAuth:()=>$n,CommunitiesList:()=>Ln,CommunityDefinition:()=>ma,CommunityPostApproval:()=>_n,Contacts:()=>Jt,CreateOrUpdateProduct:()=>ea,CreateOrUpdateStall:()=>Xn,Curationsets:()=>Kn,Date:()=>ua,DraftClassifiedListing:()=>la,DraftLong:()=>na,Emojisets:()=>aa,EncryptedDirectMessage:()=>Xt,EncryptedDirectMessages:()=>en,EventDeletion:()=>tn,FileMetadata:()=>pn,FileServerPreference:()=>qn,Followsets:()=>Hn,GenericRepost:()=>on,Genericlists:()=>Wn,HTTPAuth:()=>Un,Handlerinformation:()=>fa,Handlerrecommendation:()=>pa,Highlights:()=>En,InterestsList:()=>In,Interestsets:()=>Jn,JobFeedback:()=>kn,JobRequest:()=>yn,JobResult:()=>wn,Label:()=>bn,LightningPubRPC:()=>jn,LiveChatMessage:()=>fn,LiveEvent:()=>ra,LongFormArticle:()=>ta,Metadata:()=>Kt,Mutelist:()=>Tn,NWCWalletInfo:()=>Dn,NWCWalletRequest:()=>Bn,NWCWalletResponse:()=>Fn,NostrConnect:()=>Vn,OpenTimestamps:()=>hn,Pinlist:()=>An,ProblemTracker:()=>mn,ProfileBadges:()=>Gn,PublicChatsList:()=>On,Reaction:()=>an,RecommendRelay:()=>Zt,RelayList:()=>Mn,Relaysets:()=>Yn,Report:()=>gn,Reporting:()=>vn,Repost:()=>nn,SearchRelaysList:()=>Rn,ShortTextNote:()=>Gt,Time:()=>ca,UserEmojiList:()=>zn,UserStatuses:()=>oa,Zap:()=>Cn,ZapGoal:()=>xn,ZapRequest:()=>Sn,classifyKind:()=>Qt,isEphemeralKind:()=>Wt,isParameterizedReplaceableKind:()=>Yt,isRegularKind:()=>Ut,isReplaceableKind:()=>Ht});var Kt=0,Gt=1,Zt=2,Jt=3,Xt=4,en=4,tn=5,nn=6,an=7,rn=8,on=16,sn=40,ln=41,un=42,cn=43,dn=44,hn=1040,pn=1063,fn=1311,mn=1971,gn=1984,vn=1984,bn=1985,_n=4550,yn=5999,wn=6999,kn=7e3,xn=9041,Sn=9734,Cn=9735,En=9802,Tn=1e4,An=10001,Mn=10002,Pn=10003,Ln=10004,On=10005,Nn=10006,Rn=10007,In=10015,zn=10030,qn=10096,Dn=13194,jn=21e3,$n=22242,Bn=23194,Fn=23195,Vn=24133,Un=27235,Hn=3e4,Wn=30001,Yn=30002,Qn=30003,Kn=30004,Gn=30008,Zn=30009,Jn=30015,Xn=30017,ea=30018,ta=30023,na=30024,aa=30030,ia=30078,ra=30311,oa=30315,sa=30402,la=30403,ua=31922,ca=31923,da=31924,ha=31925,pa=31989,fa=31990,ma=34550;function ga(e,t){if(e.ids&&-1===e.ids.indexOf(t.id))return!1;if(e.kinds&&-1===e.kinds.indexOf(t.kind))return!1;if(e.authors&&-1===e.authors.indexOf(t.pubkey))return!1;for(let n in e)if("#"===n[0]){let a=e[`#${n.slice(1)}`];if(a&&!t.tags.find((([e,t])=>e===n.slice(1)&&-1!==a.indexOf(t))))return!1}return!(e.since&&t.created_ate.until)}function va(e,t){for(let n=0;n{if("kinds"===e||"ids"===e||"authors"===e||"#"===e[0]){t[e]=t[e]||[];for(let a=0;at.limit)&&(t.limit=a.limit),a.until&&(!t.until||a.until>t.until)&&(t.until=a.until),a.since&&(!t.since||a.sinceHt(e)))?e.authors.length*e.kinds.length:1/0,e.authors?.length&&e.kinds?.every((e=>Yt(e)))&&e["#d"]?.length?e.authors.length*e.kinds.length*e["#d"].length:1/0)}var ya={};function wa(e,t){let n=t.length+3,a=e.indexOf(`"${t}":`)+n,i=e.slice(a).indexOf('"')+a+1;return e.slice(i,i+64)}function ka(e,t){let n=t.length,a=e.indexOf(`"${t}":`)+n+3,i=e.slice(a),r=Math.min(i.indexOf(","),i.indexOf("}"));return parseInt(i.slice(0,r),10)}function xa(e){let t=e.slice(0,22).indexOf('"EVENT"');if(-1===t)return null;let n=e.slice(t+7+1).indexOf('"');if(-1===n)return null;let a=t+7+1+n,i=e.slice(a+1,80).indexOf('"');if(-1===i)return null;let r=a+1+i;return e.slice(a+1,r)}function Sa(e,t){return t===wa(e,"id")}function Ca(e,t){return t===wa(e,"pubkey")}function Ea(e,t){return t===ka(e,"kind")}i(ya,{getHex64:()=>wa,getInt:()=>ka,getSubscriptionId:()=>xa,matchEventId:()=>Sa,matchEventKind:()=>Ea,matchEventPubkey:()=>Ca});var Ta={};function Aa(e,t){return{kind:$n,created_at:Math.floor(Date.now()/1e3),tags:[["relay",e],["challenge",t]],content:""}}async function Ma(){return new Promise((e=>{const t=new MessageChannel,n=()=>{t.port1.removeEventListener("message",n),e()};t.port1.addEventListener("message",n),t.port2.postMessage(0),t.port1.start()}))}i(Ta,{makeAuthEvent:()=>Aa});var Pa,La=e=>(e[ht]=!0,!0),Oa=class{url;_connected=!1;onclose=null;onnotice=e=>console.debug(`NOTICE from ${this.url}: ${e}`);_onauth=null;baseEoseTimeout=4400;connectionTimeout=4400;openSubs=new Map;connectionTimeoutHandle;connectionPromise;openCountRequests=new Map;openEventPublishes=new Map;ws;incomingMessageQueue=new It;queueRunning=!1;challenge;serial=0;verifyEvent;_WebSocket;constructor(e,t){this.url=Pt(e),this.verifyEvent=t.verifyEvent,this._WebSocket=t.websocketImplementation||WebSocket}static async connect(e,t){const n=new Oa(e,t);return await n.connect(),n}closeAllSubscriptions(e){for(let[t,n]of this.openSubs)n.close(e);this.openSubs.clear();for(let[t,n]of this.openEventPublishes)n.reject(new Error(e));this.openEventPublishes.clear();for(let[t,n]of this.openCountRequests)n.reject(new Error(e));this.openCountRequests.clear()}get connected(){return this._connected}async connect(){return this.connectionPromise||(this.challenge=void 0,this.connectionPromise=new Promise(((e,t)=>{this.connectionTimeoutHandle=setTimeout((()=>{t("connection timed out"),this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection timed out")}),this.connectionTimeout);try{this.ws=new this._WebSocket(this.url)}catch(e){return void t(e)}this.ws.onopen=()=>{clearTimeout(this.connectionTimeoutHandle),this._connected=!0,e()},this.ws.onerror=e=>{t(e.message||"websocket error"),this._connected&&(this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection errored"))},this.ws.onclose=async()=>{this._connected&&(this._connected=!1,this.connectionPromise=void 0,this.onclose?.(),this.closeAllSubscriptions("relay connection closed"))},this.ws.onmessage=this._onmessage.bind(this)}))),this.connectionPromise}async runQueue(){for(this.queueRunning=!0;!1!==this.handleNext();)await Ma();this.queueRunning=!1}handleNext(){const e=this.incomingMessageQueue.dequeue();if(!e)return!1;const t=xa(e);if(t){const n=this.openSubs.get(t);if(!n)return;const a=wa(e,"id"),i=n.alreadyHaveEvent?.(a);if(n.receivedEvent?.(this,a),i)return}try{let t=JSON.parse(e);switch(t[0]){case"EVENT":{const e=this.openSubs.get(t[1]),n=t[2];return void(this.verifyEvent(n)&&va(e.filters,n)&&e.onevent(n))}case"COUNT":{const e=t[1],n=t[2],a=this.openCountRequests.get(e);return void(a&&(a.resolve(n.count),this.openCountRequests.delete(e)))}case"EOSE":{const e=this.openSubs.get(t[1]);if(!e)return;return void e.receivedEose()}case"OK":{const e=t[1],n=t[2],a=t[3],i=this.openEventPublishes.get(e);return n?i.resolve(a):i.reject(new Error(a)),void this.openEventPublishes.delete(e)}case"CLOSED":{const e=t[1],n=this.openSubs.get(e);if(!n)return;return n.closed=!0,void n.close(t[2])}case"NOTICE":return void this.onnotice(t[1]);case"AUTH":return this.challenge=t[1],void this._onauth?.(t[1])}}catch(e){return}}async send(e){if(!this.connectionPromise)throw new Error("sending on closed connection");this.connectionPromise.then((()=>{this.ws?.send(e)}))}async auth(e){if(!this.challenge)throw new Error("can't perform auth, no challenge was received");const t=await e(Aa(this.url,this.challenge)),n=new Promise(((e,n)=>{this.openEventPublishes.set(t.id,{resolve:e,reject:n})}));return this.send('["AUTH",'+JSON.stringify(t)+"]"),n}async publish(e){const t=new Promise(((t,n)=>{this.openEventPublishes.set(e.id,{resolve:t,reject:n})}));return this.send('["EVENT",'+JSON.stringify(e)+"]"),t}async count(e,t){this.serial++;const n=t?.id||"count:"+this.serial,a=new Promise(((e,t)=>{this.openCountRequests.set(n,{resolve:e,reject:t})}));return this.send('["COUNT","'+n+'",'+JSON.stringify(e).substring(1)),a}subscribe(e,t){const n=this.prepareSubscription(e,t);return n.fire(),n}prepareSubscription(e,t){this.serial++;const n=t.id||"sub:"+this.serial,a=new Na(this,n,e,t);return this.openSubs.set(n,a),a}close(){this.closeAllSubscriptions("relay connection closed by us"),this._connected=!1,this.ws?.close()}_onmessage(e){this.incomingMessageQueue.enqueue(e.data),this.queueRunning||this.runQueue()}},Na=class{relay;id;closed=!1;eosed=!1;filters;alreadyHaveEvent;receivedEvent;onevent;oneose;onclose;eoseTimeout;eoseTimeoutHandle;constructor(e,t,n,a){this.relay=e,this.filters=n,this.id=t,this.alreadyHaveEvent=a.alreadyHaveEvent,this.receivedEvent=a.receivedEvent,this.eoseTimeout=a.eoseTimeout||e.baseEoseTimeout,this.oneose=a.oneose,this.onclose=a.onclose,this.onevent=a.onevent||(e=>{console.warn(`onevent() callback not defined for subscription '${this.id}' in relay ${this.relay.url}. event received:`,e)})}fire(){this.relay.send('["REQ","'+this.id+'",'+JSON.stringify(this.filters).substring(1)),this.eoseTimeoutHandle=setTimeout(this.receivedEose.bind(this),this.eoseTimeout)}receivedEose(){this.eosed||(clearTimeout(this.eoseTimeoutHandle),this.eosed=!0,this.oneose?.())}close(e="closed by caller"){!this.closed&&this.relay.connected&&(this.relay.send('["CLOSE",'+JSON.stringify(this.id)+"]"),this.closed=!0),this.relay.openSubs.delete(this.id),this.onclose?.(e)}};try{Pa=WebSocket}catch{}var Ra,Ia=class extends Oa{constructor(e){super(e,{verifyEvent:Ft,websocketImplementation:Pa})}static async connect(e){const t=new Ia(e);return await t.connect(),t}},za=class{relays=new Map;seenOn=new Map;trackRelays=!1;verifyEvent;trustedRelayURLs=new Set;_WebSocket;constructor(e){this.verifyEvent=e.verifyEvent,this._WebSocket=e.websocketImplementation}async ensureRelay(e,t){e=Pt(e);let n=this.relays.get(e);return n||(n=new Oa(e,{verifyEvent:this.trustedRelayURLs.has(e)?La:this.verifyEvent,websocketImplementation:this._WebSocket}),t?.connectionTimeout&&(n.connectionTimeout=t.connectionTimeout),this.relays.set(e,n)),await n.connect(),n}close(e){e.map(Pt).forEach((e=>{this.relays.get(e)?.close()}))}subscribeMany(e,t,n){return this.subscribeManyMap(Object.fromEntries(e.map((e=>[e,t]))),n)}subscribeManyMap(e,t){this.trackRelays&&(t.receivedEvent=(e,t)=>{let n=this.seenOn.get(t);n||(n=new Set,this.seenOn.set(t,n)),n.add(e)});const n=new Set,a=[],i=Object.keys(e).length,r=[];let o=e=>{r[e]=!0,r.filter((e=>e)).length===i&&(t.oneose?.(),o=()=>{})};const s=[];let l=(e,n)=>{o(e),s[e]=n,s.filter((e=>e)).length===i&&(t.onclose?.(s),l=()=>{})};const u=e=>{if(t.alreadyHaveEvent?.(e))return!0;const a=n.has(e);return n.add(e),a},c=Promise.all(Object.entries(e).map((async(e,n,i)=>{if(i.indexOf(e)!==n)return void l(n,"duplicate url");let r,[s,c]=e;s=Pt(s);try{r=await this.ensureRelay(s,{connectionTimeout:t.maxWait?Math.max(.8*t.maxWait,t.maxWait-1e3):void 0})}catch(e){return void l(n,e?.message||String(e))}let d=r.subscribe(c,{...t,oneose:()=>o(n),onclose:e=>l(n,e),alreadyHaveEvent:u,eoseTimeout:t.maxWait});a.push(d)})));return{async close(){await c,a.forEach((e=>{e.close()}))}}}subscribeManyEose(e,t,n){const a=this.subscribeMany(e,t,{...n,oneose(){a.close()}});return a}async querySync(e,t,n){return new Promise((async a=>{const i=[];this.subscribeManyEose(e,[t],{...n,onevent(e){i.push(e)},onclose(e){a(i)}})}))}async get(e,t,n){t.limit=1;const a=await this.querySync(e,t,n);return a.sort(((e,t)=>t.created_at-e.created_at)),a[0]||null}publish(e,t){return e.map(Pt).map((async(e,n,a)=>{if(a.indexOf(e)!==n)return Promise.reject("duplicate url");return(await this.ensureRelay(e)).publish(t)}))}listConnectionStatus(){const e=new Map;return this.relays.forEach(((t,n)=>e.set(n,t.connected))),e}destroy(){this.relays.forEach((e=>e.close())),this.relays=new Map}};try{Ra=WebSocket}catch{}var qa=class extends za{constructor(){super({verifyEvent:Ft,websocketImplementation:Ra})}},Da={};function ja(e){if(!Number.isSafeInteger(e))throw new Error(`Wrong integer: ${e}`)}function $a(...e){const t=(e,t)=>n=>e(t(n));return{encode:Array.from(e).reverse().reduce(((e,n)=>e?t(e,n.encode):n.encode),void 0),decode:e.reduce(((e,n)=>e?t(e,n.decode):n.decode),void 0)}}function Ba(e){return{encode:t=>{if(!Array.isArray(t)||t.length&&"number"!=typeof t[0])throw new Error("alphabet.encode input should be an array of numbers");return t.map((t=>{if(ja(t),t<0||t>=e.length)throw new Error(`Digit index outside alphabet: ${t} (alphabet: ${e.length})`);return e[t]}))},decode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("alphabet.decode input should be array of strings");return t.map((t=>{if("string"!=typeof t)throw new Error(`alphabet.decode: not string element=${t}`);const n=e.indexOf(t);if(-1===n)throw new Error(`Unknown letter: "${t}". Allowed: ${e}`);return n}))}}}function Fa(e=""){if("string"!=typeof e)throw new Error("join separator should be string");return{encode:t=>{if(!Array.isArray(t)||t.length&&"string"!=typeof t[0])throw new Error("join.encode input should be array of strings");for(let e of t)if("string"!=typeof e)throw new Error(`join.encode: non-string input=${e}`);return t.join(e)},decode:t=>{if("string"!=typeof t)throw new Error("join.decode input should be string");return t.split(e)}}}function Va(e,t="="){if(ja(e),"string"!=typeof t)throw new Error("padding chr should be string");return{encode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.encode: non-string input=${e}`);for(;n.length*e%8;)n.push(t);return n},decode(n){if(!Array.isArray(n)||n.length&&"string"!=typeof n[0])throw new Error("padding.encode input should be array of strings");for(let e of n)if("string"!=typeof e)throw new Error(`padding.decode: non-string input=${e}`);let a=n.length;if(a*e%8)throw new Error("Invalid padding: string should have whole number of bytes");for(;a>0&&n[a-1]===t;a--)if(!((a-1)*e%8))throw new Error("Invalid padding: string has too much padding");return n.slice(0,a)}}}function Ua(e){if("function"!=typeof e)throw new Error("normalize fn should be function");return{encode:e=>e,decode:t=>e(t)}}function Ha(e,t,n){if(t<2)throw new Error(`convertRadix: wrong from=${t}, base cannot be less than 2`);if(n<2)throw new Error(`convertRadix: wrong to=${n}, base cannot be less than 2`);if(!Array.isArray(e))throw new Error("convertRadix: data should be array");if(!e.length)return[];let a=0;const i=[],r=Array.from(e);for(r.forEach((e=>{if(ja(e),e<0||e>=t)throw new Error(`Wrong integer: ${e}`)}));;){let e=0,o=!0;for(let i=a;ipi,Bech32MaxSize:()=>hi,decode:()=>fi,encodeBytes:()=>yi,naddrEncode:()=>xi,neventEncode:()=>ki,noteEncode:()=>bi,nprofileEncode:()=>wi,npubEncode:()=>vi,nrelayEncode:()=>Si,nsecEncode:()=>gi});var Wa=(e,t)=>t?Wa(t,e%t):e,Ya=(e,t)=>e+(t-Wa(e,t));function Qa(e,t,n,a){if(!Array.isArray(e))throw new Error("convertRadix2: data should be array");if(t<=0||t>32)throw new Error(`convertRadix2: wrong from=${t}`);if(n<=0||n>32)throw new Error(`convertRadix2: wrong to=${n}`);if(Ya(t,n)>32)throw new Error(`convertRadix2: carry overflow from=${t} to=${n} carryBits=${Ya(t,n)}`);let i=0,r=0;const o=2**n-1,s=[];for(const a of e){if(ja(a),a>=2**t)throw new Error(`convertRadix2: invalid data word=${a} from=${t}`);if(i=i<32)throw new Error(`convertRadix2: carry overflow pos=${r} from=${t}`);for(r+=t;r>=n;r-=n)s.push((i>>r-n&o)>>>0);i&=2**r-1}if(i=i<=t)throw new Error("Excess padding");if(!a&&i)throw new Error(`Non-zero padding: ${i}`);return a&&r>0&&s.push(i>>>0),s}function Ka(e,t=!1){if(ja(e),e<=0||e>32)throw new Error("radix2: bits should be in (0..32]");if(Ya(8,e)>32||Ya(e,8)>32)throw new Error("radix2: carry overflow");return{encode:n=>{if(!(n instanceof Uint8Array))throw new Error("radix2.encode input should be Uint8Array");return Qa(Array.from(n),8,e,!t)},decode:n=>{if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("radix2.decode input should be array of strings");return Uint8Array.from(Qa(n,e,8,t))}}}function Ga(e){if("function"!=typeof e)throw new Error("unsafeWrapper fn should be function");return function(...t){try{return e.apply(null,t)}catch(e){}}}var Za=$a(Ka(4),Ba("0123456789ABCDEF"),Fa("")),Ja=$a(Ka(5),Ba("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"),Va(5),Fa("")),Xa=($a(Ka(5),Ba("0123456789ABCDEFGHIJKLMNOPQRSTUV"),Va(5),Fa("")),$a(Ka(5),Ba("0123456789ABCDEFGHJKMNPQRSTVWXYZ"),Fa(""),Ua((e=>e.toUpperCase().replace(/O/g,"0").replace(/[IL]/g,"1")))),$a(Ka(6),Ba("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),Va(6),Fa(""))),ei=$a(Ka(6),Ba("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"),Va(6),Fa("")),ti=e=>{return $a((ja(t=58),{encode:e=>{if(!(e instanceof Uint8Array))throw new Error("radix.encode input should be Uint8Array");return Ha(Array.from(e),256,t)},decode:e=>{if(!Array.isArray(e)||e.length&&"number"!=typeof e[0])throw new Error("radix.decode input should be array of strings");return Uint8Array.from(Ha(e,t,256))}}),Ba(e),Fa(""));var t},ni=ti("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"),ai=(ti("123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"),ti("rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz"),[0,2,3,5,6,7,9,10,11]),ii={encode(e){let t="";for(let n=0;n>25;let n=(33554431&e)<<5;for(let e=0;e>e&1)&&(n^=oi[e]);return n}function li(e,t,n=1){const a=e.length;let i=1;for(let t=0;t126)throw new Error(`Invalid prefix (${e})`);i=si(i)^n>>5}i=si(i);for(let t=0;tn)throw new TypeError(`Wrong string length: ${e.length} (${e}). Expected (8..${n})`);const a=e.toLowerCase();if(e!==a&&e!==e.toUpperCase())throw new Error("String must be lowercase or uppercase");const i=(e=a).lastIndexOf("1");if(0===i||-1===i)throw new Error('Letter "1" must be present between prefix and data only');const r=e.slice(0,i),o=e.slice(i+1);if(o.length<6)throw new Error("Data must be at least 6 characters long");const s=ri.decode(o).slice(0,-6),l=li(r,s,t);if(!o.endsWith(l))throw new Error(`Invalid checksum in ${e}: expected "${l}"`);return{prefix:r,words:s}}return{encode:function(e,n,a=90){if("string"!=typeof e)throw new Error("bech32.encode prefix should be string, not "+typeof e);if(!Array.isArray(n)||n.length&&"number"!=typeof n[0])throw new Error("bech32.encode words should be array of numbers, not "+typeof n);const i=e.length+7+n.length;if(!1!==a&&i>a)throw new TypeError(`Length ${i} exceeds limit ${a}`);return`${e=e.toLowerCase()}1${ri.encode(n)}${li(e,n,t)}`},decode:o,decodeToBytes:function(e){const{prefix:t,words:n}=o(e,!1);return{prefix:t,words:n,bytes:a(n)}},decodeUnsafe:Ga(o),fromWords:a,fromWordsUnsafe:r,toWords:i}}var ci=ui("bech32"),di=(ui("bech32m"),{utf8:{encode:e=>(new TextDecoder).decode(e),decode:e=>(new TextEncoder).encode(e)},hex:$a(Ka(4),Ba("0123456789abcdef"),Fa(""),Ua((e=>{if("string"!=typeof e||e.length%2)throw new TypeError(`hex.decode: expected string, got ${typeof e} with length ${e.length}`);return e.toLowerCase()}))),base16:Za,base32:Ja,base64:Xa,base64url:ei,base58:ni,base58xmr:ii}),hi=(Object.keys(di).join(", "),5e3),pi=/[\x21-\x7E]{1,83}1[023456789acdefghjklmnpqrstuvwxyz]{6,}/;function fi(e){let{prefix:t,words:n}=ci.decode(e,hi),a=new Uint8Array(ci.fromWords(n));switch(t){case"nprofile":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nprofile");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");return{type:"nprofile",data:{pubkey:rt(e[0][0]),relays:e[1]?e[1].map((e=>At.decode(e))):[]}}}case"nevent":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nevent");if(32!==e[0][0].length)throw new Error("TLV 0 should be 32 bytes");if(e[2]&&32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(e[3]&&4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"nevent",data:{id:rt(e[0][0]),relays:e[1]?e[1].map((e=>At.decode(e))):[],author:e[2]?.[0]?rt(e[2][0]):void 0,kind:e[3]?.[0]?parseInt(rt(e[3][0]),16):void 0}}}case"naddr":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for naddr");if(!e[2]?.[0])throw new Error("missing TLV 2 for naddr");if(32!==e[2][0].length)throw new Error("TLV 2 should be 32 bytes");if(!e[3]?.[0])throw new Error("missing TLV 3 for naddr");if(4!==e[3][0].length)throw new Error("TLV 3 should be 4 bytes");return{type:"naddr",data:{identifier:At.decode(e[0][0]),pubkey:rt(e[2][0]),kind:parseInt(rt(e[3][0]),16),relays:e[1]?e[1].map((e=>At.decode(e))):[]}}}case"nrelay":{let e=mi(a);if(!e[0]?.[0])throw new Error("missing TLV 0 for nrelay");return{type:"nrelay",data:At.decode(e[0][0])}}case"nsec":return{type:t,data:a};case"npub":case"note":return{type:t,data:rt(a)};default:throw new Error(`unknown prefix ${t}`)}}function mi(e){let t={},n=e;for(;n.length>0;){let e=n[0],a=n[1],i=n.slice(2,2+a);if(n=n.slice(2+a),i.lengthMt.encode(e)))}))}function ki(e){let t;return void 0!==e.kind&&(t=function(e){const t=new Uint8Array(4);return t[0]=e>>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t}(e.kind)),_i("nevent",Ci({0:[ot(e.id)],1:(e.relays||[]).map((e=>Mt.encode(e))),2:e.author?[ot(e.author)]:[],3:t?[new Uint8Array(t)]:[]}))}function xi(e){let t=new ArrayBuffer(4);return new DataView(t).setUint32(0,e.kind,!1),_i("naddr",Ci({0:[Mt.encode(e.identifier)],1:(e.relays||[]).map((e=>Mt.encode(e))),2:[ot(e.pubkey)],3:[new Uint8Array(t)]}))}function Si(e){return _i("nrelay",Ci({0:[Mt.encode(e)]}))}function Ci(e){let t=[];return Object.entries(e).reverse().forEach((([e,n])=>{n.forEach((n=>{let a=new Uint8Array(n.length+2);a.set([parseInt(e)],0),a.set([n.length],1),a.set(n,2),t.push(a)}))})),lt(...t)}var Ei=/\bnostr:((note|npub|naddr|nevent|nprofile)1\w+)\b|#\[(\d+)\]/g;function Ti(e){let t=[];for(let n of e.content.matchAll(Ei))if(n[2])try{let{type:e,data:a}=fi(n[1]);switch(e){case"npub":t.push({text:n[0],profile:{pubkey:a,relays:[]}});break;case"nprofile":t.push({text:n[0],profile:a});break;case"note":t.push({text:n[0],event:{id:a,relays:[]}});break;case"nevent":t.push({text:n[0],event:a});break;case"naddr":t.push({text:n[0],address:a})}}catch(e){}else if(n[3]){let a=parseInt(n[3],10),i=e.tags[a];if(!i)continue;switch(i[0]){case"p":t.push({text:n[0],profile:{pubkey:i[1],relays:i[2]?[i[2]]:[]}});break;case"e":t.push({text:n[0],event:{id:i[1],relays:i[2]?[i[2]]:[]}});break;case"a":try{let[e,a,r]=i[1].split(":");t.push({text:n[0],address:{identifier:r,pubkey:a,kind:parseInt(e,10),relays:i[2]?[i[2]]:[]}})}catch(e){}}}return t}var Ai={};function Mi(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function Pi(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Li(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function Oi(e,...t){if(!Li(e))throw new Error("Uint8Array expected");if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Ni(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}function Ri(e,t){Oi(e);const n=t.outputLen;if(e.lengthTr,encrypt:()=>Er});var Ii=e=>new Uint8Array(e.buffer,e.byteOffset,e.byteLength),zi=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4)),qi=e=>new DataView(e.buffer,e.byteOffset,e.byteLength);if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function Di(e){if("string"!=typeof e)throw new Error("string expected, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function ji(e){if("string"==typeof e)e=Di(e);else{if(!Li(e))throw new Error("Uint8Array expected, got "+typeof e);e=e.slice()}return e}function $i(e,t){if(e.length!==t.length)return!1;let n=0;for(let a=0;a(Object.assign(t,e),t);function Fi(e,t,n,a){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,a);const i=BigInt(32),r=BigInt(4294967295),o=Number(n>>i&r),s=Number(n&r),l=a?4:0,u=a?0:4;e.setUint32(t+l,o,a),e.setUint32(t+u,s,a)}var Vi=16,Ui=new Uint8Array(16),Hi=zi(Ui),Wi=e=>(e>>>0&255)<<24|(e>>>8&255)<<16|(e>>>16&255)<<8|e>>>24&255;var Yi=class{constructor(e,t){this.blockLen=Vi,this.outputLen=Vi,this.s0=0,this.s1=0,this.s2=0,this.s3=0,this.finished=!1,Oi(e=ji(e),16);const n=qi(e);let a=n.getUint32(0,!1),i=n.getUint32(4,!1),r=n.getUint32(8,!1),o=n.getUint32(12,!1);const s=[];for(let e=0;e<128;e++)s.push({s0:Wi(a),s1:Wi(i),s2:Wi(r),s3:Wi(o)}),({s0:a,s1:i,s2:r,s3:o}={s3:(c=r)<<31|(d=o)>>>1,s2:(u=i)<<31|c>>>1,s1:(l=a)<<31|u>>>1,s0:l>>>1^225<<24&-(1&d)});var l,u,c,d;const h=(p=t||1024)>65536?8:p>1024?4:2;var p;if(![1,2,4,8].includes(h))throw new Error(`ghash: wrong window size=${h}, should be 2, 4 or 8`);this.W=h;const f=128/h,m=this.windowSize=2**h,g=[];for(let e=0;e>>h-o-1&1))continue;const{s0:l,s1:u,s2:c,s3:d}=s[h*e+o];n^=l,a^=u,i^=c,r^=d}g.push({s0:n,s1:a,s2:i,s3:r})}this.t=g}_updateBlock(e,t,n,a){e^=this.s0,t^=this.s1,n^=this.s2,a^=this.s3;const{W:i,t:r,windowSize:o}=this;let s=0,l=0,u=0,c=0;const d=(1<>>8*e&255;for(let e=8/i-1;e>=0;e--){const n=t>>>i*e&d,{s0:a,s1:p,s2:f,s3:m}=r[h*o+n];s^=a,l^=p,u^=f,c^=m,h+=1}}this.s0=s,this.s1=l,this.s2=u,this.s3=c}update(e){e=ji(e),Ni(this);const t=zi(e),n=Math.floor(e.length/Vi),a=e.length%Vi;for(let e=0;e>>1|n,n=(1&a)<<7}return e[0]^=225&-t,e}((e=ji(e)).slice());super(n,t),n.fill(0)}update(e){e=ji(e),Ni(this);const t=zi(e),n=e.length%Vi,a=Math.floor(e.length/Vi);for(let e=0;ee(n,t.length).update(ji(t)).digest(),n=e(new Uint8Array(16),0);return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=(t,n)=>e(t,n),t}var Gi=Ki(((e,t)=>new Yi(e,t))),Zi=Ki(((e,t)=>new Qi(e,t))),Ji=16,Xi=new Uint8Array(Ji),er=283;function tr(e){return e<<1^er&-(e>>7)}function nr(e,t){let n=0;for(;t>0;t>>=1)n^=e&-(1&t),e=tr(e);return n}var ar=(()=>{let e=new Uint8Array(256);for(let t=0,n=1;t<256;t++,n^=tr(n))e[t]=n;const t=new Uint8Array(256);t[0]=99;for(let n=0;n<255;n++){let a=e[255-n];a|=a<<8,t[e[n]]=255&(a^a>>4^a>>5^a>>6^a>>7^99)}return t})(),ir=ar.map(((e,t)=>ar.indexOf(t))),rr=e=>e<<24|e>>>8,or=e=>e<<8|e>>>24;function sr(e,t){if(256!==e.length)throw new Error("Wrong sbox length");const n=new Uint32Array(256).map(((n,a)=>t(e[a]))),a=n.map(or),i=a.map(or),r=i.map(or),o=new Uint32Array(65536),s=new Uint32Array(65536),l=new Uint16Array(65536);for(let t=0;t<256;t++)for(let u=0;u<256;u++){const c=256*t+u;o[c]=n[t]^a[u],s[c]=i[t]^r[u],l[c]=e[t]<<8|e[u]}return{sbox:e,sbox2:l,T0:n,T1:a,T2:i,T3:r,T01:o,T23:s}}var lr=sr(ar,(e=>nr(e,3)<<24|e<<16|e<<8|nr(e,2))),ur=sr(ir,(e=>nr(e,11)<<24|nr(e,13)<<16|nr(e,9)<<8|nr(e,14))),cr=(()=>{const e=new Uint8Array(16);for(let t=0,n=1;t<16;t++,n=tr(n))e[t]=n;return e})();function dr(e){Oi(e);const t=e.length;if(![16,24,32].includes(t))throw new Error(`aes: wrong key size: should be 16, 24 or 32, got: ${t}`);const{sbox2:n}=lr,a=zi(e),i=a.length,r=e=>fr(n,e,e,e,e),o=new Uint32Array(t+28);o.set(a);for(let e=i;e6&&e%i==4&&(t=r(t)),o[e]=o[e-i]^t}return o}function hr(e){const t=dr(e),n=t.slice(),a=t.length,{sbox2:i}=lr,{T0:r,T1:o,T2:s,T3:l}=ur;for(let e=0;e>>8&255]^s[a>>>16&255]^l[a>>>24]}return n}function pr(e,t,n,a,i,r){return e[n<<8&65280|a>>>8&255]^t[i>>>8&65280|r>>>24&255]}function fr(e,t,n,a,i){return e[255&t|65280&n]|e[a>>>16&255|i>>>16&65280]<<16}function mr(e,t,n,a,i){const{sbox2:r,T01:o,T23:s}=lr;let l=0;t^=e[l++],n^=e[l++],a^=e[l++],i^=e[l++];const u=e.length/4-2;for(let r=0;r>>0,s.setUint32(c,h,t),({s0:p,s1:f,s2:m,s3:g}=mr(e,o[0],o[1],o[2],o[3]));const v=Ji*Math.floor(l.length/4);if(v=0;e--)n=n+(255&r[e])|0,r[e]=255&n,n>>>=8;({s0:s,s1:l,s2:u,s3:c}=mr(e,o[0],o[1],o[2],o[3]))}const p=Ji*Math.floor(d.length/4);if(pn(e,t),decrypt:(e,t)=>n(e,t)}}));function _r(e){if(Oi(e),e.length%Ji!=0)throw new Error("aes/(cbc-ecb).decrypt ciphertext should consist of blocks with size 16")}function yr(e,t,n){let a=e.length;const i=a%Ji;if(!t&&0!==i)throw new Error("aec/(cbc-ecb): unpadded plaintext with disabled padding");const r=zi(e);if(t){let e=Ji-i;e||(e=Ji),a+=e}const o=vr(a,n);return{b:r,o:zi(o),out:o}}function wr(e,t){if(!t)return e;const n=e.length;if(!n)throw new Error("aes/pcks5: empty ciphertext not allowed");const a=e[n-1];if(a<=0||a>16)throw new Error(`aes/pcks5: wrong padding byte: ${a}`);const i=e.subarray(0,-a);for(let t=0;t{Oi(t);const{b:i,o:r,out:o}=yr(t,n,a),s=dr(e);let l=0;for(;l+4<=i.length;){const{s0:e,s1:t,s2:n,s3:a}=mr(s,i[l+0],i[l+1],i[l+2],i[l+3]);r[l++]=e,r[l++]=t,r[l++]=n,r[l++]=a}if(n){const e=kr(t.subarray(4*l)),{s0:n,s1:a,s2:i,s3:o}=mr(s,e[0],e[1],e[2],e[3]);r[l++]=n,r[l++]=a,r[l++]=i,r[l++]=o}return s.fill(0),o},decrypt:(t,a)=>{_r(t);const i=hr(e),r=vr(t.length,a),o=zi(t),s=zi(r);for(let e=0;e+4<=o.length;){const{s0:t,s1:n,s2:a,s3:r}=gr(i,o[e+0],o[e+1],o[e+2],o[e+3]);s[e++]=t,s[e++]=n,s[e++]=a,s[e++]=r}return i.fill(0),wr(r,n)}}}));var xr=Bi({blockSize:16,nonceLength:16},(function(e,t,n={}){Oi(e),Oi(t,16);const a=!n.disablePadding;return{encrypt:(n,i)=>{const r=dr(e),{b:o,o:s,out:l}=yr(n,a,i),u=zi(t);let c=u[0],d=u[1],h=u[2],p=u[3],f=0;for(;f+4<=o.length;)c^=o[f+0],d^=o[f+1],h^=o[f+2],p^=o[f+3],({s0:c,s1:d,s2:h,s3:p}=mr(r,c,d,h,p)),s[f++]=c,s[f++]=d,s[f++]=h,s[f++]=p;if(a){const e=kr(n.subarray(4*f));c^=e[0],d^=e[1],h^=e[2],p^=e[3],({s0:c,s1:d,s2:h,s3:p}=mr(r,c,d,h,p)),s[f++]=c,s[f++]=d,s[f++]=h,s[f++]=p}return r.fill(0),l},decrypt:(n,i)=>{_r(n);const r=hr(e),o=zi(t),s=vr(n.length,i),l=zi(n),u=zi(s);let c=o[0],d=o[1],h=o[2],p=o[3];for(let e=0;e+4<=l.length;){const t=c,n=d,a=h,i=p;c=l[e+0],d=l[e+1],h=l[e+2],p=l[e+3];const{s0:o,s1:s,s2:f,s3:m}=gr(r,c,d,h,p);u[e++]=o^t,u[e++]=s^n,u[e++]=f^a,u[e++]=m^i}return r.fill(0),wr(s,a)}}}));function Sr(e,t,n,a,i){const r=e.create(n,a.length+(i?.length||0));i&&r.update(i),r.update(a);const o=new Uint8Array(16),s=qi(o);return i&&Fi(s,0,BigInt(8*i.length),t),Fi(s,8,BigInt(8*a.length),t),r.update(o),r.digest()}Bi({blockSize:16,nonceLength:12,tagLength:16},(function(e,t,n){if(Oi(t),0===t.length)throw new Error("aes/gcm: empty nonce");const a=16;function i(e,t,a){const i=Sr(Gi,!1,e,a,n);for(let e=0;e{Oi(e);const{xk:t,authKey:n,counter:o,tagMask:s}=r(),l=new Uint8Array(e.length+a);br(t,!1,o,e,l);const u=i(n,s,l.subarray(0,l.length-a));return l.set(u,e.length),t.fill(0),l},decrypt:e=>{if(Oi(e),e.lengtha=>{if(!Number.isSafeInteger(a)||t>a||a>n)throw new Error(`${e}: invalid value=${a}, must be [${t}..${n}]`)};Bi({blockSize:16,nonceLength:12,tagLength:16},(function(e,t,n){const a=Cr("AAD",0,2**36),i=Cr("plaintext",0,2**36),r=Cr("nonce",12,12),o=Cr("ciphertext",16,2**36+16);function s(){const n=e.length;if(16!==n&&24!==n&&32!==n)throw new Error(`key length must be 16, 24 or 32 bytes, got: ${n} bytes`);const a=dr(e),i=new Uint8Array(n),r=new Uint8Array(16),o=zi(t);let s=0,l=o[0],u=o[1],c=o[2],d=0;for(const e of[r,i].map(zi)){const t=zi(e);for(let e=0;e{Oi(e),i(e.length);const{encKey:t,authKey:n}=s(),a=l(t,n,e),r=new Uint8Array(e.length+16);return r.set(a,e.length),r.set(u(t,a,e)),t.fill(0),n.fill(0),r},decrypt:e=>{Oi(e),o(e.length);const t=e.subarray(-16),{encKey:n,authKey:a}=s(),i=u(n,t,e.subarray(0,-16)),r=l(n,a,i);if(n.fill(0),a.fill(0),!$i(t,r))throw new Error("invalid polyval tag");return i}}}));async function Er(e,t,n){const a=e instanceof Uint8Array?rt(e):e,i=Ar(Ie.getSharedSecret(a,"02"+t));let r=Uint8Array.from(dt(16)),o=Mt.encode(n),s=xr(i,r).encrypt(o);return`${Xa.encode(new Uint8Array(s))}?iv=${Xa.encode(new Uint8Array(r.buffer))}`}async function Tr(e,t,n){const a=e instanceof Uint8Array?rt(e):e;let[i,r]=n.split("?iv="),o=Ar(Ie.getSharedSecret(a,"02"+t)),s=Xa.decode(r),l=Xa.decode(i),u=xr(o,s).decrypt(l);return At.decode(u)}function Ar(e){return e.slice(1,33)}var Mr={};i(Mr,{NIP05_REGEX:()=>Lr,isValid:()=>Ir,queryProfile:()=>Rr,searchDomain:()=>Nr,useFetchImplementation:()=>Or});var Pr,Lr=/^(?:([\w.+-]+)@)?([\w_-]+(\.[\w_-]+)+)$/;try{Pr=fetch}catch{}function Or(e){Pr=e}async function Nr(e,t=""){try{const n=`https://${e}/.well-known/nostr.json?name=${t}`,a=await Pr(n,{redirect:"error"});return(await a.json()).names}catch(e){return{}}}async function Rr(e){const t=e.match(Lr);if(!t)return null;const[n,a="_",i]=t;try{const e=`https://${i}/.well-known/nostr.json?name=${a}`,t=await(await Pr(e,{redirect:"error"})).json();let n=t.names[a];return n?{pubkey:n,relays:t.relays?.[n]}:null}catch(e){return null}}async function Ir(e,t){let n=await Rr(t);return!!n&&n.pubkey===e}var zr={};function qr(e){const t={reply:void 0,root:void 0,mentions:[],profiles:[]},n=[];for(const a of e.tags)"e"===a[0]&&a[1]&&n.push(a),"p"===a[0]&&a[1]&&t.profiles.push({pubkey:a[1],relays:a[2]?[a[2]]:[]});for(let e=0;eqr});var Dr={};i(Dr,{fetchRelayInformation:()=>$r,useFetchImplementation:()=>jr});try{fetch}catch{}function jr(e){e}async function $r(e){return await(await fetch(e.replace("ws://","http://").replace("wss://","https://"),{headers:{Accept:"application/nostr+json"}})).json()}var Br={};function Fr(e){let t=0;for(let n=0;n=t)break}return a}i(Br,{getPow:()=>Fr,minePow:()=>Vr});var Ur={};function Hr(e,t,n,a){return Bt({kind:nn,tags:[...e.tags??[],["e",t.id,n],["p",t.pubkey]],content:""===e.content?"":JSON.stringify(t),created_at:e.created_at},a)}function Wr(e){if(e.kind!==nn)return;let t,n;for(let a=e.tags.length-1;a>=0&&(void 0===t||void 0===n);a--){const i=e.tags[a];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t?{id:t[1],relays:[t[2],n?.[2]].filter((e=>"string"==typeof e)),author:n?.[1]}:void 0}function Yr(e,{skipVerification:t}={}){const n=Wr(e);if(void 0===n||""===e.content)return;let a;try{a=JSON.parse(e.content)}catch(e){return}return a.id===n.id&&(t||Ft(a))?a:void 0}i(Ur,{finishRepostEvent:()=>Hr,getRepostedEvent:()=>Yr,getRepostedEventPointer:()=>Wr});var Qr={};i(Qr,{NOSTR_URI_REGEX:()=>Kr,parse:()=>Zr,test:()=>Gr});var Kr=new RegExp(`nostr:(${pi.source})`);function Gr(e){return"string"==typeof e&&new RegExp(`^${Kr.source}$`).test(e)}function Zr(e){const t=e.match(new RegExp(`^${Kr.source}$`));if(!t)throw new Error(`Invalid Nostr URI: ${e}`);return{uri:t[0],value:t[1],decoded:fi(t[1])}}var Jr={};function Xr(e,t,n){const a=t.tags.filter((e=>e.length>=2&&("e"===e[0]||"p"===e[0])));return Bt({...e,kind:an,tags:[...e.tags??[],...a,["e",t.id],["p",t.pubkey]],content:e.content??"+"},n)}function eo(e){if(e.kind!==an)return;let t,n;for(let a=e.tags.length-1;a>=0&&(void 0===t||void 0===n);a--){const i=e.tags[a];i.length>=2&&("e"===i[0]&&void 0===t?t=i:"p"===i[0]&&void 0===n&&(n=i))}return void 0!==t&&void 0!==n?{id:t[1],relays:[t[2],n[2]].filter((e=>void 0!==e)),author:n[1]}:void 0}i(Jr,{finishReactionEvent:()=>Xr,getReactedEventPointer:()=>eo});var to={};i(to,{matchAll:()=>ao,regex:()=>no,replaceAll:()=>io});var no=()=>new RegExp(`\\b${Kr.source}\\b`,"g");function*ao(e){const t=e.matchAll(no());for(const e of t)try{const[t,n]=e;yield{uri:t,value:n,decoded:fi(n),start:e.index,end:e.index+t.length}}catch(e){}}function io(e,t){return e.replaceAll(no(),((e,n)=>t({uri:e,value:n,decoded:fi(n)})))}var ro={};i(ro,{channelCreateEvent:()=>oo,channelHideMessageEvent:()=>uo,channelMessageEvent:()=>lo,channelMetadataEvent:()=>so,channelMuteUserEvent:()=>co});var oo=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:sn,tags:[...e.tags??[]],content:n,created_at:e.created_at},t)},so=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:ln,tags:[["e",e.channel_create_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},lo=(e,t)=>{const n=[["e",e.channel_create_event_id,e.relay_url,"root"]];return e.reply_to_channel_message_event_id&&n.push(["e",e.reply_to_channel_message_event_id,e.relay_url,"reply"]),Bt({kind:un,tags:[...n,...e.tags??[]],content:e.content,created_at:e.created_at},t)},uo=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:cn,tags:[["e",e.channel_message_event_id],...e.tags??[]],content:n,created_at:e.created_at},t)},co=(e,t)=>{let n;if("object"==typeof e.content)n=JSON.stringify(e.content);else{if("string"!=typeof e.content)return;n=e.content}return Bt({kind:dn,tags:[["p",e.pubkey_to_mute],...e.tags??[]],content:n,created_at:e.created_at},t)},ho={};i(ho,{EMOJI_SHORTCODE_REGEX:()=>po,matchAll:()=>mo,regex:()=>fo,replaceAll:()=>go});var po=/:(\w+):/,fo=()=>new RegExp(`\\B${po.source}\\B`,"g");function*mo(e){const t=e.matchAll(fo());for(const e of t)try{const[t,n]=e;yield{shortcode:t,name:n,start:e.index,end:e.index+t.length}}catch(e){}}function go(e,t){return e.replaceAll(fo(),((e,n)=>t({shortcode:e,name:n})))}var vo,bo={};i(bo,{useFetchImplementation:()=>_o,validateGithub:()=>yo});try{vo=fetch}catch{}function _o(e){vo=e}async function yo(e,t,n){try{return await(await vo(`https://gist.github.com/${t}/${n}/raw`)).text()===`Verifying that I control the following Nostr public key: ${e}`}catch(e){return!1}}var wo={};i(wo,{decrypt:()=>ns,encrypt:()=>ts,getConversationKey:()=>Go,v2:()=>as});var ko=(e,t)=>255&e[t++]|(255&e[t++])<<8,xo=class{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,Oi(e=ji(e),32);const t=ko(e,0),n=ko(e,2),a=ko(e,4),i=ko(e,6),r=ko(e,8),o=ko(e,10),s=ko(e,12),l=ko(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|a<<6),this.r[3]=8191&(a>>>7|i<<9),this.r[4]=255&(i>>>4|r<<12),this.r[5]=r>>>1&8190,this.r[6]=8191&(r>>>14|o<<2),this.r[7]=8065&(o>>>11|s<<5),this.r[8]=8191&(s>>>8|l<<8),this.r[9]=l>>>5&127;for(let t=0;t<8;t++)this.pad[t]=ko(e,16+2*t)}process(e,t,n=!1){const a=n?0:2048,{h:i,r:r}=this,o=r[0],s=r[1],l=r[2],u=r[3],c=r[4],d=r[5],h=r[6],p=r[7],f=r[8],m=r[9],g=ko(e,t+0),v=ko(e,t+2),b=ko(e,t+4),_=ko(e,t+6),y=ko(e,t+8),w=ko(e,t+10),k=ko(e,t+12),x=ko(e,t+14);let S=i[0]+(8191&g),C=i[1]+(8191&(g>>>13|v<<3)),E=i[2]+(8191&(v>>>10|b<<6)),T=i[3]+(8191&(b>>>7|_<<9)),A=i[4]+(8191&(_>>>4|y<<12)),M=i[5]+(y>>>1&8191),P=i[6]+(8191&(y>>>14|w<<2)),L=i[7]+(8191&(w>>>11|k<<5)),O=i[8]+(8191&(k>>>8|x<<8)),N=i[9]+(x>>>5|a),R=0,I=R+S*o+C*(5*m)+E*(5*f)+T*(5*p)+A*(5*h);R=I>>>13,I&=8191,I+=M*(5*d)+P*(5*c)+L*(5*u)+O*(5*l)+N*(5*s),R+=I>>>13,I&=8191;let z=R+S*s+C*o+E*(5*m)+T*(5*f)+A*(5*p);R=z>>>13,z&=8191,z+=M*(5*h)+P*(5*d)+L*(5*c)+O*(5*u)+N*(5*l),R+=z>>>13,z&=8191;let q=R+S*l+C*s+E*o+T*(5*m)+A*(5*f);R=q>>>13,q&=8191,q+=M*(5*p)+P*(5*h)+L*(5*d)+O*(5*c)+N*(5*u),R+=q>>>13,q&=8191;let D=R+S*u+C*l+E*s+T*o+A*(5*m);R=D>>>13,D&=8191,D+=M*(5*f)+P*(5*p)+L*(5*h)+O*(5*d)+N*(5*c),R+=D>>>13,D&=8191;let j=R+S*c+C*u+E*l+T*s+A*o;R=j>>>13,j&=8191,j+=M*(5*m)+P*(5*f)+L*(5*p)+O*(5*h)+N*(5*d),R+=j>>>13,j&=8191;let $=R+S*d+C*c+E*u+T*l+A*s;R=$>>>13,$&=8191,$+=M*o+P*(5*m)+L*(5*f)+O*(5*p)+N*(5*h),R+=$>>>13,$&=8191;let B=R+S*h+C*d+E*c+T*u+A*l;R=B>>>13,B&=8191,B+=M*s+P*o+L*(5*m)+O*(5*f)+N*(5*p),R+=B>>>13,B&=8191;let F=R+S*p+C*h+E*d+T*c+A*u;R=F>>>13,F&=8191,F+=M*l+P*s+L*o+O*(5*m)+N*(5*f),R+=F>>>13,F&=8191;let V=R+S*f+C*p+E*h+T*d+A*c;R=V>>>13,V&=8191,V+=M*u+P*l+L*s+O*o+N*(5*m),R+=V>>>13,V&=8191;let U=R+S*m+C*f+E*p+T*h+A*d;R=U>>>13,U&=8191,U+=M*c+P*u+L*l+O*s+N*o,R+=U>>>13,U&=8191,R=(R<<2)+R|0,R=R+I|0,I=8191&R,R>>>=13,z+=R,i[0]=I,i[1]=z,i[2]=q,i[3]=D,i[4]=j,i[5]=$,i[6]=B,i[7]=F,i[8]=V,i[9]=U}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let a=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=a,a=e[t]>>>13,e[t]&=8191;e[0]+=5*a,a=e[0]>>>13,e[0]&=8191,e[1]+=a,a=e[1]>>>13,e[1]&=8191,e[2]+=a,n[0]=e[0]+5,a=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+a,a=n[t]>>>13,n[t]&=8191;n[9]-=8192;let i=(1^a)-1;for(let e=0;e<10;e++)n[e]&=i;i=~i;for(let t=0;t<10;t++)e[t]=e[t]&i|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let r=e[0]+t[0];e[0]=65535&r;for(let n=1;n<8;n++)r=(e[n]+t[n]|0)+(r>>>16)|0,e[n]=65535&r}update(e){Ni(this);const{buffer:t,blockLen:n}=this,a=(e=ji(e)).length;for(let i=0;i>>0,e[i++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}};var So=function(e){const t=(t,n)=>e(n).update(ji(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new xo(e))),Co=Di("expand 16-byte k"),Eo=Di("expand 32-byte k"),To=zi(Co),Ao=zi(Eo);function Mo(e,t){return e<>>32-t}function Po(e){return e.byteOffset%4==0}var Lo=64,Oo=16,No=2**32-1,Ro=new Uint32Array;function Io(e,t){const{allowShortKeys:n,extendNonceFn:a,counterLength:i,counterRight:r,rounds:o}=function(e,t){if(null==t||"object"!=typeof t)throw new Error("options must be defined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return Mi(i),Mi(o),Pi(r),Pi(n),(t,s,l,u,c=0)=>{Oi(t),Oi(s),Oi(l);const d=l.length;if(u||(u=new Uint8Array(d)),Oi(u),Mi(c),c<0||c>=No)throw new Error("arx: counter overflow");if(u.length=No)throw new Error("arx: counter overflow");const m=Math.min(Lo,l-f);if(d&&m===Lo){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n0;)h.pop().fill(0);return u}}function zo(e,t,n,a,i,r=20){let o=e[0],s=e[1],l=e[2],u=e[3],c=t[0],d=t[1],h=t[2],p=t[3],f=t[4],m=t[5],g=t[6],v=t[7],b=i,_=n[0],y=n[1],w=n[2],k=o,x=s,S=l,C=u,E=c,T=d,A=h,M=p,P=f,L=m,O=g,N=v,R=b,I=_,z=y,q=w;for(let e=0;e{e.update(t);const n=t.length%16;n&&e.update(jo.subarray(n))},Bo=new Uint8Array(32);function Fo(e,t,n,a,i){const r=e(t,n,Bo),o=So.create(r);i&&$o(o,i),$o(o,a);const s=new Uint8Array(16),l=qi(s);Fi(l,0,BigInt(i?i.length:0),!0),Fi(l,8,BigInt(a.length),!0),o.update(s);const u=o.digest();return r.fill(0),u}var Vo=e=>(t,n,a)=>{const i=16;return Oi(t,32),Oi(n),{encrypt:(r,o)=>{const s=r.length,l=s+i;o?Oi(o,l):o=new Uint8Array(l),e(t,n,r,o,1);const u=Fo(e,t,n,o.subarray(0,-16),a);return o.set(u,s),o},decrypt:(r,o)=>{const s=r.length,l=s-i;if(sa?e.create().update(n).digest():n);for(let e=0;enew Uo(e,t).update(n).digest();Ho.create=(e,t)=>new Uo(e,t);var Wo=new Uint8Array([0]),Yo=new Uint8Array;var Qo=1,Ko=65535;function Go(e,t){const n=Ie.getSharedSecret(e,"02"+t).subarray(1,33);return a=Et,i=n,r="nip44-v2",bt.hash(a),void 0===r&&(r=new Uint8Array(a.outputLen)),Ho(a,st(r),st(i));var a,i,r}function Zo(e,t){const n=function(e,t,n,a=32){if(bt.hash(e),bt.number(a),a>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const i=Math.ceil(a/e.outputLen);void 0===n&&(n=Yo);const r=new Uint8Array(i*e.outputLen),o=Ho.create(e,t),s=o._cloneInto(),l=new Uint8Array(o.outputLen);for(let t=0;tKo)throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");const t=new Uint8Array(2);return new DataView(t.buffer).setUint16(0,e,!1),t}(n),t,new Uint8Array(Jo(n)-n))}function es(e,t,n){if(32!==n.length)throw new Error("AAD associated data must be 32 bytes");const a=lt(n,t);return Ho(Et,e,a)}function ts(e,t,n=dt(32)){const{chacha_key:a,chacha_nonce:i,hmac_key:r}=Zo(t,n),o=Xo(e),s=qo(a,i,o),l=es(r,s,n);return Xa.encode(lt(new Uint8Array([2]),n,s,l))}function ns(e,t){const{nonce:n,ciphertext:a,mac:i}=function(e){if("string"!=typeof e)throw new Error("payload must be a valid string");const t=e.length;if(t<132||t>87472)throw new Error("invalid payload length: "+t);if("#"===e[0])throw new Error("unknown encryption version");let n;try{n=Xa.decode(e)}catch(e){throw new Error("invalid base64: "+e.message)}const a=n.length;if(a<99||a>65603)throw new Error("invalid data length: "+a);const i=n[0];if(2!==i)throw new Error("unknown encryption version "+i);return{nonce:n.subarray(1,33),ciphertext:n.subarray(33,-32),mac:n.subarray(-32)}}(e),{chacha_key:r,chacha_nonce:o,hmac_key:s}=Zo(t,n);if(!$i(es(s,a,n),i))throw new Error("invalid MAC");return function(e){const t=new DataView(e.buffer).getUint16(0),n=e.subarray(2,2+t);if(tKo||n.length!==t||e.length!==2+Jo(t))throw new Error("invalid padding");return At.decode(n)}(qo(r,o,a))}var as={utils:{getConversationKey:Go,calcPaddedLen:Jo},encrypt:ts,decrypt:ns},is={};function rs(e){const{pathname:t,searchParams:n}=new URL(e),a=t,i=n.get("relay"),r=n.get("secret");if(!a||!i||!r)throw new Error("invalid connection string");return{pubkey:a,relay:i,secret:r}}async function os(e,t,n){const a={method:"pay_invoice",params:{invoice:n}},i=await Er(t,e,JSON.stringify(a)),r={kind:Bn,created_at:Math.round(Date.now()/1e3),content:i,tags:[["p",e]]};return Bt(r,t)}i(is,{makeNwcRequestEvent:()=>os,parseConnectionString:()=>rs});var ss,ls={};i(ls,{getZapEndpoint:()=>cs,makeZapReceipt:()=>ps,makeZapRequest:()=>ds,useFetchImplementation:()=>us,validateZapRequest:()=>hs});try{ss=fetch}catch{}function us(e){ss=e}async function cs(e){try{let t="",{lud06:n,lud16:a}=JSON.parse(e.content);if(n){let{words:e}=ci.decode(n,1e3),a=ci.fromWords(e);t=At.decode(a)}else{if(!a)return null;{let[e,n]=a.split("@");t=new URL(`/.well-known/lnurlp/${e}`,`https://${n}`).toString()}}let i=await ss(t),r=await i.json();if(r.allowsNostr&&r.nostrPubkey)return r.callback}catch(e){}return null}function ds({profile:e,event:t,amount:n,relays:a,comment:i=""}){if(!n)throw new Error("amount not given");if(!e)throw new Error("profile not given");let r={kind:9734,created_at:Math.round(Date.now()/1e3),content:i,tags:[["p",e],["amount",n.toString()],["relays",...a]]};return t&&r.tags.push(["e",t]),r}function hs(e){let t;try{t=JSON.parse(e)}catch(e){return"Invalid zap request JSON."}if(!ft(t))return"Zap request is not a valid Nostr event.";if(!Ft(t))return"Invalid signature on zap request.";let n=t.tags.find((([e,t])=>"p"===e&&t));if(!n)return"Zap request doesn't have a 'p' tag.";if(!n[1].match(/^[a-f0-9]{64}$/))return"Zap request 'p' tag is not valid hex.";let a=t.tags.find((([e,t])=>"e"===e&&t));return a&&!a[1].match(/^[a-f0-9]{64}$/)?"Zap request 'e' tag is not valid hex.":t.tags.find((([e,t])=>"relays"===e&&t))?null:"Zap request doesn't have a 'relays' tag."}function ps({zapRequest:e,preimage:t,bolt11:n,paidAt:a}){let i=JSON.parse(e),r=i.tags.filter((([e])=>"e"===e||"p"===e||"a"===e)),o={kind:9735,created_at:Math.round(a.getTime()/1e3),content:"",tags:[...r,["P",i.pubkey],["bolt11",n],["description",e]]};return t&&o.tags.push(["preimage",t]),o}var fs={};i(fs,{getToken:()=>vs,hashPayload:()=>Ss,unpackEventFromToken:()=>_s,validateEvent:()=>Es,validateEventKind:()=>ws,validateEventMethodTag:()=>xs,validateEventPayloadTag:()=>Cs,validateEventTimestamp:()=>ys,validateEventUrlTag:()=>ks,validateToken:()=>bs});var ms,gs="Nostr ";async function vs(e,t,n,a=!1,i){const r={kind:Un,tags:[["u",e],["method",t]],created_at:Math.round((new Date).getTime()/1e3),content:""};i&&r.tags.push(["payload",Ss(i)]);const o=await n(r);return(a?gs:"")+Xa.encode(Mt.encode(JSON.stringify(o)))}async function bs(e,t,n){const a=await _s(e).catch((e=>{throw e}));return await Es(a,t,n).catch((e=>{throw e}))}async function _s(e){if(!e)throw new Error("Missing token");e=e.replace(gs,"");const t=At.decode(Xa.decode(e));if(!t||0===t.length||!t.startsWith("{"))throw new Error("Invalid token");return JSON.parse(t)}function ys(e){return!!e.created_at&&Math.round((new Date).getTime()/1e3)-e.created_at<60}function ws(e){return e.kind===Un}function ks(e,t){const n=e.tags.find((e=>"u"===e[0]));return!!n&&(n.length>0&&n[1]===t)}function xs(e,t){const n=e.tags.find((e=>"method"===e[0]));return!!n&&(n.length>0&&n[1].toLowerCase()===t.toLowerCase())}function Ss(e){return rt(Et(Mt.encode(JSON.stringify(e))))}function Cs(e,t){const n=e.tags.find((e=>"payload"===e[0]));if(!n)return!1;const a=Ss(t);return n.length>0&&n[1]===a}async function Es(e,t,n,a){if(!Ft(e))throw new Error("Invalid nostr event, signature invalid");if(!ws(e))throw new Error("Invalid nostr event, kind invalid");if(!ys(e))throw new Error("Invalid nostr event, created_at timestamp invalid");if(!ks(e,t))throw new Error("Invalid nostr event, url tag invalid");if(!xs(e,n))throw new Error("Invalid nostr event, method tag invalid");if(Boolean(a)&&"object"==typeof a&&Object.keys(a).length>0&&!Cs(e,a))throw new Error("Invalid nostr event, payload tag does not match request body hash");return!0}return ms=r,((i,r,o,s)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let l of n(r))a.call(i,l)||l===o||e(i,l,{get:()=>r[l],enumerable:!(s=t(r,l))||s.enumerable});return i})(e({},"__esModule",{value:!0}),ms)})();function eventReactionWebocket(e){localUrl="",reaction=localStorage.getItem("lnbits.reactions"),reaction&&"None"!==reaction&&("http:"!==location.protocol?localUrl="wss://"+location.host+"/api/v1/ws/"+e:localUrl="ws://"+location.host+"/api/v1/ws/"+e,connection=new WebSocket(localUrl),connection.onmessage=function(e){try{if(JSON.parse(e.data).payment.amount<0)return;reaction=localStorage.getItem("lnbits.reactions"),reaction&&window[reaction.split("|")[1]]()}catch(e){console.log(e)}})}function confettiBothSides(){document.getElementById("vue").disabled=!0;var e=Date.now()+2e3,t=["#FFD700","#ffffff"];!function n(){confetti({particleCount:2,angle:60,spread:55,origin:{x:0},colors:t,zIndex:999999}),confetti({particleCount:2,angle:120,spread:55,origin:{x:1},colors:t,zIndex:999999}),Date.now(){e.substring(0,n.length)===n&&(t=n)})),null==t)throw"Malformed request: unknown prefix";let n=decodeAmount(e.substring(t.length,e.length));return{prefix:t,amount:n}}function decodeData(e,t){let n=e.substring(0,7),a=bech32ToInt(n),i=e.substring(e.length-104,e.length),r=e.substring(7,e.length-104),o=decodeTags(r),s=bech32ToFiveBitArray(n+r);return s=fiveBitArrayTo8BitArray(s,!0),s=textToHexString(t).concat(byteArrayToHexString(s)),{time_stamp:a,tags:o,signature:decodeSignature(i),signing_data:s}}function decodeSignature(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n=t[t.length-1];return{r:byteArrayToHexString(t.slice(0,32)),s:byteArrayToHexString(t.slice(32,t.length-1)),recovery_flag:n}}function decodeAmount(e){let t=e.charAt(e.length-1),n=e.substring(0,e.length-1);if("0"===n.substring(0,1))throw"Malformed request: amount cannot contain leading zeros";if(n=Number(n),n<0||!Number.isInteger(n))throw"Malformed request: amount must be a positive decimal integer";switch(t){case"":return"Any amount";case"p":return n/10;case"n":return 100*n;case"u":return 1e5*n;case"m":return 1e8*n;default:throw"Malformed request: undefined amount multiplier"}}function decodeTags(e){let t=extractTags(e),n=[];return t.forEach((e=>n.push(decodeTag(e.type,e.length,e.data)))),n}function extractTags(e){let t=[];for(;e.length>0;){let n=e.charAt(0),a=bech32ToInt(e.substring(1,3)),i=e.substring(3,a+3);t.push({type:n,length:a,data:i}),e=e.substring(3+a,e.length)}return t}function decodeTag(e,t,n){switch(e){case"p":if(52!==t)break;return{type:e,length:t,description:"payment_hash",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"d":return{type:e,length:t,description:"description",value:bech32ToUTF8String(n)};case"n":if(53!==t)break;return{type:e,length:t,description:"payee_public_key",value:byteArrayToHexString(fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n)))};case"h":if(52!==t)break;return{type:e,length:t,description:"description_hash",value:n};case"x":return{type:e,length:t,description:"expiry",value:bech32ToInt(n)};case"c":return{type:e,length:t,description:"min_final_cltv_expiry",value:bech32ToInt(n)};case"f":let a=bech32ToFiveBitArray(n.charAt(0))[0];if(a<0||a>18)break;return{type:e,length:t,description:"fallback_address",value:{version:a,fallback_address:n=n.substring(1,n.length)}};case"r":let i=(n=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(n))).slice(0,33),r=n.slice(33,41),o=n.slice(41,45),s=n.slice(45,49),l=n.slice(49,51);return{type:e,length:t,description:"routing_information",value:{public_key:byteArrayToHexString(i),short_channel_id:byteArrayToHexString(r),fee_base_msat:byteArrayToInt(o),fee_proportional_millionths:byteArrayToInt(s),cltv_expiry_delta:byteArrayToInt(l)}}}}function polymod(e){let t=[996825010,642813549,513874426,1027748829,705979059],n=1;return e.forEach((e=>{let a=n>>25;n=(33554431&n)<<5^e;for(let e=0;e<5;e++)n^=1==(a>>e&1)?t[e]:0})),n}function expand(e){let t=[];for(let n=0;n>5);t.push(0);for(let n=0;n delta]",status:"Status",notification_source:"Benachrichtigungsquelle",notification_source_label:"Quell-URL (verwenden Sie nur die offizielle LNbits-Statusquelle und Quellen, denen Sie vertrauen können)",more:"mehr",less:"weniger",releases:"Veröffentlichungen",killswitch:"Killswitch",watchdog:"Wachhund",server_logs:"Serverprotokolle",ip_blocker:"IP-Sperre",security:"Sicherheit",security_tools:"Sicherheitstools",block_access_hint:"Zugriff per IP sperren",allow_access_hint:"Zugriff durch IP erlauben (überschreibt blockierte IPs)",enter_ip:"Geben Sie die IP ein und drücken Sie die Eingabetaste",rate_limiter:"Ratenbegrenzer",wallet_limiter:"Geldbeutel-Limiter",wallet_limit_max_withdraw_per_day:"Maximales tägliches Wallet-Auszahlungslimit in Sats (0 zum Deaktivieren)",wallet_max_ballance:"Maximales Guthaben der Wallet in Sats (0 zum Deaktivieren)",wallet_limit_secs_between_trans:"Mindestsekunden zwischen Transaktionen pro Wallet (0 zum Deaktivieren)",number_of_requests:"Anzahl der Anfragen",time_unit:"Zeiteinheit",minute:"Minute",second:"Sekunde",hour:"Stunde",disable_server_log:"Server-Log deaktivieren",enable_server_log:"Serverprotokollierung aktivieren",coming_soon:"Funktion demnächst verfügbar",session_has_expired:"Ihre Sitzung ist abgelaufen. Bitte melden Sie sich erneut an.",instant_access_question:"Möchten Sie sofortigen Zugang?",login_with_user_id:"Mit Benutzer-ID anmelden",or:"oder",create_new_wallet:"Neue Geldbörse erstellen",login_to_account:"Melden Sie sich bei Ihrem Konto an",create_account:"Konto erstellen",account_settings:"Kontoeinstellungen",signin_with_google:"Mit Google anmelden",signin_with_github:"Anmelden mit GitHub",signin_with_keycloak:"Mit Keycloak anmelden",username_or_email:"Benutzername oder E-Mail",password:"Passwort",password_config:"Passwortkonfiguration",password_repeat:"Passwortwiederholung",change_password:"Passwort ändern",set_password:"Passwort festlegen",invalid_password:"Das Passwort muss mindestens 8 Zeichen haben.",login:"Anmelden",register:"Registrieren",username:"Benutzername",user_id:"Benutzer-ID",email:"E-Mail",first_name:"Vorname",last_name:"Nachname",picture:"Bild",verify_email:"E-Mail verifizieren mit",account:"Konto",update_account:"Konto aktualisieren",invalid_username:"Ungültiger Benutzername",auth_provider:"Anbieter für Authentifizierung",my_account:"Mein Konto",back:"Zurück",logout:"Abmelden",look_and_feel:"Aussehen und Verhalten",language:"Sprache",color_scheme:"Farbschema",extension_cost:"Diese Version erfordert eine Zahlung von mindestens {cost} Sats.",extension_paid_sats:"Sie haben bereits {paid_sats} Sats bezahlt.",release_details_error:"Kann die Details zur Veröffentlichung nicht abrufen.",pay_from_wallet:"Zahlen aus dem Geldbeutel",show_qr:"QR anzeigen",retry_install:"Installieren erneut versuchen",new_payment:"Neue Zahlung vornehmen",hide_empty_wallets:"Leere Geldbörsen verbergen"},window.localisation.en={confirm:"Yes",server:"Server",theme:"Theme",funding:"Funding",users:"Users",apps:"Apps",channels:"Channels",transactions:"Transactions",dashboard:"Dashboard",node:"Node",export_users:"Export Users",no_users:"No users found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Biggest Channel Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Number of Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",open_channel:"Open Channel",open:"Open",close_channel:"Close Channel",close:"Close",restart:"Restart server",save:"Save",save_tooltip:"Save your changes",topup:"Topup",topup_wallet:"Topup a wallet",topup_hint:"Use the wallet ID to topup any wallet",restart_tooltip:"Restart the server for changes to take effect",add_funds_tooltip:"Add funds to a wallet.",reset_defaults:"Reset to defaults",reset_defaults_tooltip:"Delete all settings and reset to defaults.",download_backup:"Download database backup",name_your_wallet:"Name your {name} wallet",wallet_topup_ok:"Success creating virtual funds ({amount} sats). Payments depend on actual funds on funding source.",paste_invoice_label:"Paste an invoice, payment request or lnurl code *",lnbits_description:"Easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! You can run LNbits for yourself, or easily offer a custodian solution for others. Each wallet has its own API keys and there is no limit to the number of wallets you can make. Being able to partition funds makes LNbits a useful tool for money management and as a development tool. Extensions add extra functionality to LNbits so you can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage people to develop and submit their own.",export_to_phone:"Export to Phone with QR Code",export_to_phone_desc:"This QR code contains your wallet URL with full access. You can scan it from your phone to open your wallet from there.",wallets:"Wallets",add_wallet:"Add a new wallet",delete_wallet:"Delete wallet",delete_wallet_desc:"This whole wallet will be deleted, the funds will be UNRECOVERABLE.",rename_wallet:"Rename wallet",update_name:"Update name",fiat_tracking:"Fiat tracking",currency:"Currency",update_currency:"Update currency",press_to_claim:"Press to claim bitcoin",donate:"Donate",view_github:"View on GitHub",voidwallet_active:"VoidWallet is active! Payments disabled",use_with_caution:"USE WITH CAUTION - {name} wallet is still in BETA",service_fee:"Service fee: {amount} % per transaction",service_fee_max:"Service fee: {amount} % per transaction (max {max} sats)",service_fee_tooltip:"Service fee charged by the LNbits server admin per outgoing transaction",toggle_darkmode:"Toggle Dark Mode",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs",api_docs:"API docs",api_keys_api_docs:"Node URL, API keys and API docs",lnbits_version:"LNbits version",runs_on:"Runs on",credit_hint:"Press Enter to credit account",credit_label:"{denomination} to credit",paste:"Paste",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request",create_invoice:"Create Invoice",camera_tooltip:"Use camera to scan an invoice/QR",export_csv:"Export to CSV",chart_tooltip:"Show chart",pending:"Pending",copy_invoice:"Copy invoice",withdraw_from:"Withdraw from",cancel:"Cancel",scan:"Scan",read:"Read",pay:"Pay",memo:"Memo",date:"Date",processing_payment:"Processing payment...",not_enough_funds:"Not enough funds!",search_by_tag_memo_amount:"Search by tag, memo, amount",invoice_waiting:"Invoice waiting to be paid",payment_received:"Payment Received",payment_sent:"Payment Sent",receive:"receive",send:"send",outgoing_payment_pending:"Outgoing payment pending",drain_funds:"Drain Funds",drain_funds_desc:"This is an LNURL-withdraw QR code for slurping everything from this wallet. Do not share with anyone. It is compatible with balanceCheck and balanceNotify so your wallet may keep pulling the funds continuously from here after the first withdraw.",i_understand:"I understand",copy_wallet_url:"Copy wallet URL",disclaimer_dialog_title:"Important!",disclaimer_dialog:"You *must* save your login credentials to be able to access your wallet again. If you lose them, you will lose access to your wallet and funds.\n\nFind your login credentials on your account settings page.\n\nThis service is in BETA. LNbits holds no responsibility for loss of access to funds.",no_transactions:"No transactions made yet",manage:"Manage",extensions:"Extensions",no_extensions:"You don't have any extensions installed :(",created:"Created",search_extensions:"Search extensions",warning:"Warning",repository:"Repository",confirm_continue:"Are you sure you want to continue?",manage_extension_details:"Install/uninstall extension",install:"Install",uninstall:"Uninstall",drop_db:"Remove Data",enable:"Enable",pay_to_enable:"Pay To Enable",enable_extension_details:"Enable extension for current user",disable:"Disable",installed:"Installed",activated:"Activated",deactivated:"Deactivated",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable for users",featured:"Featured",all:"All",only_admins_can_install:"(Only admin accounts can install extensions)",admin_only:"Admin Only",new_version:"New Version",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings coming soon",extension_installed_version:"Installed version",extension_uninstall_warning:"You are about to remove the extension for all users.",uninstall_confirm:"Yes, Uninstall",extension_db_drop_info:"All data for the extension will be permanently deleted. There is no way to undo this operation!",extension_db_drop_warning:"You are about to remove all data for the extension. Please type the extension name to continue:",extension_min_lnbits_version:"This release requires at least LNbits version",payment_hash:"Payment Hash",fee:"Fee",amount:"Amount",amount_sats:"Amount (sats)",tag:"Tag",unit:"Unit",description:"Description",expiry:"Expiry",webhook:"Webhook",payment_proof:"Payment Proof",update_available:"Update {version} available!",latest_update:"You are on the latest version {version}.",notifications:"Notifications",no_notifications:"No notifications",notifications_disabled:"LNbits status notifications are disabled.",enable_notifications:"Enable Notifications",enable_notifications_desc:"If enabled it will fetch the latest LNbits Status updates, like security incidents and updates.",enable_killswitch:"Enable Killswitch",enable_killswitch_desc:"If enabled it will change your funding source to VoidWallet automatically if LNbits sends out a killswitch signal. You will need to enable manually after an update.",killswitch_interval:"Killswitch Interval",killswitch_interval_desc:"How often the background task should check for the LNbits killswitch signal from the status source (in minutes).",enable_watchdog:"Enable Watchdog",enable_watchdog_desc:"If enabled it will change your funding source to VoidWallet automatically if your balance is lower than the LNbits balance. You will need to enable manually after an update.",watchdog_interval:"Watchdog Interval",watchdog_interval_desc:"How often the background task should check for a killswitch signal in the watchdog delta [node_balance - lnbits_balance] (in minutes).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Limit before killswitch changes funding source to VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use the official LNbits status source, and sources you can trust)",more:"more",less:"less",releases:"Releases",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Server Logs",ip_blocker:"IP Blocker",security:"Security",security_tools:"Security tools",block_access_hint:"Block access by IP",allow_access_hint:"Allow access by IP (will override blocked IPs)",enter_ip:"Enter IP and hit enter",rate_limiter:"Rate Limiter",wallet_limiter:"Wallet Limiter",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Wallet max balance in sats (0 to disable)",wallet_limit_secs_between_trans:"Min secs between transactions per wallet (0 to disable)",number_of_requests:"Number of requests",time_unit:"Time unit",minute:"minute",second:"second",hour:"hour",disable_server_log:"Disable Server Log",enable_server_log:"Enable Server Log",coming_soon:"Feature coming soon",session_has_expired:"Your session has expired. Please login again.",instant_access_question:"Want instant access?",login_with_user_id:"Login with user ID",or:"or",create_new_wallet:"Create New Wallet",login_to_account:"Login to your account",create_account:"Create account",account_settings:"Account Settings",signin_with_nostr:"Continue with Nostr",signin_with_google:"Sign in with Google",signin_with_github:"Sign in with GitHub",signin_with_keycloak:"Sign in with Keycloak",username_or_email:"Username or Email",password:"Password",password_config:"Password Config",password_repeat:"Password repeat",change_password:"Change Password",update_credentials:"Update Credentials",update_pubkey:"Update Public Key",set_password:"Set Password",invalid_password:"Password must have at least 8 characters",login:"Login",register:"Register",username:"Username",pubkey:"Public Key",user_id:"User ID",email:"Email",first_name:"First Name",last_name:"Last Name",picture:"Picture",verify_email:"Verify email with",account:"Account",update_account:"Update Account",invalid_username:"Invalid Username",auth_provider:"Auth Provider",my_account:"My Account",back:"Back",logout:"Logout",look_and_feel:"Look and Feel",toggle_gradient:"Toggle Gradient",gradient_background:"Gradient Background",language:"Language",color_scheme:"Color Scheme",extension_cost:"This release requires a payment of minimum {cost} sats.",extension_paid_sats:"You have already paid {paid_sats} sats.",release_details_error:"Cannot get the release details.",pay_from_wallet:"Pay from Wallet",wallet_required:"Wallet *",show_qr:"Show QR",retry_install:"Retry Install",new_payment:"Make New Payment",update_payment:"Update Payment",already_paid_question:"Have you already paid?",sell:"Sell",sell_require:"Ask payment to enable extension",sell_info:"The {name} extension requires a payment of minimum {amount} sats to enable.",hide_empty_wallets:"Hide empty wallets",recheck:"Recheck",contributors:"Contributors",license:"License",reset_key:"Reset Key",reset_password:"Reset Password",border_choices:"Border Choices"},window.localisation.es={confirm:"Sí",server:"Servidor",theme:"Tema",funding:"Financiación",users:"Usuarios",apps:"Aplicaciones",channels:"Canales",transactions:"Transacciones",dashboard:"Tablero de instrumentos",node:"Nodo",export_users:"Exportar Usuarios",no_users:"No se encontraron usuarios",total_capacity:"Capacidad Total",avg_channel_size:"Tamaño Medio del Canal",biggest_channel_size:"Tamaño del Canal Más Grande",smallest_channel_size:"Tamaño de canal más pequeño",number_of_channels:"Número de canales",active_channels:"Canales activos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Abierto",open:"Abrir",close_channel:"Cerrar canal",close:"Cerrar",restart:"Reiniciar el servidor",save:"Guardar",save_tooltip:"Guardar cambios",topup:"Recargar",topup_wallet:"Recargar billetera",topup_hint:"Utilice el ID de billetera para recargar cualquier billetera",restart_tooltip:"Reinicie el servidor para aplicar los cambios",add_funds_tooltip:"Agregue fondos a una billetera.",reset_defaults:"Restablecer",reset_defaults_tooltip:"Borrar todas las configuraciones y restablecer a los valores predeterminados.",download_backup:"Descargar copia de seguridad de la base de datos",name_your_wallet:"Nombre de su billetera {name}",wallet_topup_ok:"Éxito creando fondos virtuales ({amount} sats). Los pagos dependen de los fondos reales en la fuente de financiación.",paste_invoice_label:"Pegue la factura aquí",lnbits_description:"Fácil de instalar y liviano, LNbits puede ejecutarse en cualquier fuente de financiación de la red Lightning y hasta LNbits mismo! Puede ejecutar LNbits para usted mismo o ofrecer una solución competente a otros. Cada billetera tiene su propia clave API y no hay límite para la cantidad de billeteras que puede crear. La capacidad de particionar fondos hace de LNbits una herramienta útil para la administración de fondos y como herramienta de desarrollo. Las extensiones agregan funcionalidad adicional a LNbits, por lo que puede experimentar con una variedad de tecnologías de vanguardia en la red Lightning. Lo hemos hecho lo más simple posible para desarrollar extensiones y, como un proyecto gratuito y de código abierto, animamos a las personas a que se desarrollen a sí mismas y envíen sus propios contribuciones.",export_to_phone:"Exportar a teléfono con código QR",export_to_phone_desc:"Este código QR contiene su URL de billetera con acceso completo. Puede escanearlo desde su teléfono para abrir su billetera allí.",wallets:"Billeteras",add_wallet:"Agregar nueva billetera",delete_wallet:"Eliminar billetera",delete_wallet_desc:"Esta billetera completa se eliminará, los fondos son IRREVERSIBLES.",rename_wallet:"Cambiar el nombre de la billetera",update_name:"Actualizar nombre",fiat_tracking:"Seguimiento Fiat",currency:"Moneda",update_currency:"Actualizar moneda",press_to_claim:"Presione para reclamar Bitcoin",donate:"Donar",view_github:"Ver en GitHub",voidwallet_active:"¡VoidWallet está activo! Pagos desactivados",use_with_caution:"USAR CON CUIDADO - {name} Wallet aún está en BETA",service_fee:"Tarifa de servicio: {amount} % por transacción",service_fee_max:"Tarifa de servicio: {amount} % por transacción (máx {max} sats)",service_fee_tooltip:"Comisión de servicio cobrada por el administrador del servidor LNbits por cada transacción saliente",toggle_darkmode:"Cambiar modo oscuro",payment_reactions:"Reacciones de Pago",view_swagger_docs:"Ver documentación de API de LNbits Swagger",api_docs:"Documentación de API",api_keys_api_docs:"URL del nodo, claves de API y documentación de API",lnbits_version:"Versión de LNbits",runs_on:"Corre en",credit_hint:"Presione Enter para cargar la cuenta",credit_label:"Cargar {denomination}",paste:"Pegar",paste_from_clipboard:"Pegar desde el portapapeles",paste_request:"Pegar solicitud",create_invoice:"Crear factura",camera_tooltip:"Utilice la cámara para escanear una factura / código QR",export_csv:"Exportar a CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendiente",copy_invoice:"Copiar factura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Leer",pay:"Pagar",memo:"Memo",date:"Fecha",processing_payment:"Procesando pago ...",not_enough_funds:"¡No hay suficientes fondos!",search_by_tag_memo_amount:"Buscar por etiqueta, memo, cantidad",invoice_waiting:"Factura esperando pago",payment_received:"Pago recibido",payment_sent:"Pago enviado",receive:"recibir",send:"enviar",outgoing_payment_pending:"Pago saliente pendiente",drain_funds:"Drenar fondos",drain_funds_desc:"Este es un código QR LNURL-withdraw para drenar todos los fondos de esta billetera. No lo comparta con nadie. Es compatible con balanceCheck y balanceNotify, por lo que su billetera puede continuar drenando los fondos de aquí después del primer drenaje.",i_understand:"Lo entiendo",copy_wallet_url:"Copiar URL de billetera",disclaimer_dialog_title:"¡Importante!",disclaimer_dialog:"La funcionalidad de inicio de sesión se lanzará en una actualización futura, por ahora, asegúrese de guardar esta página como marcador para acceder a su billetera en el futuro. Este servicio está en BETA y no asumimos ninguna responsabilidad por personas que pierdan el acceso a sus fondos.",no_transactions:"No hay transacciones todavía",manage:"Administrar",extensions:"Extensiones",no_extensions:"No tienes extensiones instaladas :(",created:"Creado",search_extensions:"Extensiones de búsqueda",warning:"Advertencia",repository:"Repositorio",confirm_continue:"¿Está seguro de que desea continuar?",manage_extension_details:"Instalar/desinstalar extensión",install:"Instalar",uninstall:"Desinstalar",drop_db:"Eliminar datos",enable:"Habilitar",enable_extension_details:"Habilitar extensión para el usuario actual",disable:"Deshabilitar",installed:"Instalado",activated:"Activado",deactivated:"Desactivado",release_notes:"Notas de la versión",activate_extension_details:"Hacer que la extensión esté disponible/no disponible para los usuarios",featured:"Destacado",all:"Todos",only_admins_can_install:"(Solo las cuentas de administrador pueden instalar extensiones)",admin_only:"Solo administradores",new_version:"Nueva Versión",extension_depends_on:"Depende de:",extension_rating_soon:"Calificaciones próximamente",extension_installed_version:"Versión instalada",extension_uninstall_warning:"Está a punto de eliminar la extensión para todos los usuarios.",uninstall_confirm:"Sí, desinstalar",extension_db_drop_info:"Todos los datos para la extensión se eliminarán permanentemente. ¡No hay manera de deshacer esta operación!",extension_db_drop_warning:"Está a punto de eliminar todos los datos para la extensión. Por favor, escriba el nombre de la extensión para continuar:",extension_min_lnbits_version:"Esta versión requiere al menos una versión de LNbits",payment_hash:"Hash de pago",fee:"Cuota",amount:"Cantidad",tag:"Etiqueta",unit:"Unidad",description:"Descripción",expiry:"Expiración",webhook:"Webhook",payment_proof:"Prueba de pago",update_available:"¡Actualización {version} disponible!",latest_update:"Usted está en la última versión {version}.",notifications:"Notificaciones",no_notifications:"No hay notificaciones",notifications_disabled:"Las notificaciones de estado de LNbits están desactivadas.",enable_notifications:"Activar notificaciones",enable_notifications_desc:"Si está activado, buscará las últimas actualizaciones del estado de LNbits, como incidentes de seguridad y actualizaciones.",enable_killswitch:"Activar Killswitch",enable_killswitch_desc:"Si está activado, cambiará automáticamente su fuente de financiamiento a VoidWallet si LNbits envía una señal de parada de emergencia. Necesitará activarlo manualmente después de una actualización.",killswitch_interval:"Intervalo de Killswitch",killswitch_interval_desc:"Con qué frecuencia la tarea en segundo plano debe verificar la señal de interruptor de emergencia de LNbits desde la fuente de estado (en minutos).",enable_watchdog:"Activar Watchdog",enable_watchdog_desc:"Si está activado, cambiará automáticamente su fuente de financiamiento a VoidWallet si su saldo es inferior al saldo de LNbits. Tendrá que activarlo manualmente después de una actualización.",watchdog_interval:"Intervalo de vigilancia",watchdog_interval_desc:"Con qué frecuencia la tarea de fondo debe verificar la señal de killswitch en el delta del watchdog [node_balance - lnbits_balance] (en minutos).",watchdog_delta:"Vigilante Delta",watchdog_delta_desc:"Límite antes de que el interruptor de apagado cambie la fuente de financiamiento a VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fuente de notificación",notification_source_label:"URL de origen (solo use la fuente oficial de estado de LNbits y fuentes en las que confíe)",more:"más",less:"menos",releases:"Lanzamientos",killswitch:"Interruptor de apagado",watchdog:"Perro guardián",server_logs:"Registros del Servidor",ip_blocker:"Bloqueador de IP",security:"Seguridad",security_tools:"Herramientas de seguridad",block_access_hint:"Bloquear acceso por IP",allow_access_hint:"Permitir acceso por IP (anulará las IPs bloqueadas)",enter_ip:"Ingrese la IP y presione enter",rate_limiter:"Limitador de tasa",wallet_limiter:"Limitador de Cartera",wallet_limit_max_withdraw_per_day:"Límite diario de retiro de la cartera en sats (0 para deshabilitar)",wallet_max_ballance:"Saldo máximo de la billetera en sats (0 para desactivar)",wallet_limit_secs_between_trans:"Mín. segs entre transacciones por cartera (0 para desactivar)",number_of_requests:"Número de solicitudes",time_unit:"Unidad de tiempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desactivar registro del servidor",enable_server_log:"Activar registro del servidor",coming_soon:"Función próximamente disponible",session_has_expired:"Tu sesión ha expirado. Por favor, inicia sesión de nuevo.",instant_access_question:"¿Quieres acceso instantáneo?",login_with_user_id:"Iniciar sesión con ID de usuario",or:"o",create_new_wallet:"Crear Nueva Cartera",login_to_account:"Inicie sesión en su cuenta",create_account:"Crear cuenta",account_settings:"Configuración de la cuenta",signin_with_google:"Inicia sesión con Google",signin_with_github:"Inicia sesión con GitHub",signin_with_keycloak:"Iniciar sesión con Keycloak",username_or_email:"Nombre de usuario o correo electrónico",password:"Contraseña",password_config:"Configuración de Contraseña",password_repeat:"Repetición de contraseña",change_password:"Cambiar contraseña",set_password:"Establecer contraseña",invalid_password:"La contraseña debe tener al menos 8 caracteres.",login:"Iniciar sesión",register:"Registrarse",username:"Nombre de usuario",user_id:"Identificación de usuario",email:"Correo electrónico",first_name:"Nombre de pila",last_name:"Apellido",picture:"Imagen",verify_email:"Verifique el correo electrónico con",account:"Cuenta",update_account:"Actualizar cuenta",invalid_username:"Nombre de usuario inválido",auth_provider:"Proveedor de Autenticación",my_account:"Mi cuenta",back:"Atrás",logout:"Cerrar sesión",look_and_feel:"Apariencia",language:"Idioma",color_scheme:"Esquema de colores",extension_cost:"Esta versión requiere un pago mínimo de {cost} sats.",extension_paid_sats:"Ya has pagado {paid_sats} sats.",release_details_error:"No se pueden obtener los detalles de la versión.",pay_from_wallet:"Pagar desde la billetera",show_qr:"Mostrar QR",retry_install:"Reintentar Instalación",new_payment:"Realizar nuevo pago",hide_empty_wallets:"Ocultar billeteras vacías"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",funding:"Financement",users:"Utilisateurs",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",topup:"Renflouer",topup_wallet:"Reflouer un portefeuille",topup_hint:"Utilisez l'ID du portefeuille pour recharger n'importe quel portefeuille",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",wallet_topup_ok:"Succès de la création de fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",processing_payment:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_min_lnbits_version:"Cette version nécessite au moins LNbits version",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_killswitch:"Activer le Killswitch",enable_killswitch_desc:"Si activé, il changera automatiquement votre source de financement en VoidWallet si LNbits envoie un signal de coupure. Vous devrez activer manuellement après une mise à jour.",killswitch_interval:"Intervalle du Killswitch",killswitch_interval_desc:"À quelle fréquence la tâche de fond doit-elle vérifier le signal d'arrêt d'urgence LNbits provenant de la source de statut (en minutes).",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",killswitch:"Interrupteur d'arrêt",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",language:"Langue",color_scheme:"Schéma de couleurs",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",hide_empty_wallets:"Masquer les portefeuilles vides"},window.localisation.it={confirm:"Sì",server:"Server",theme:"Tema",funding:"Funding",users:"Utenti",apps:"Applicazioni",channels:"Canali",transactions:"Transazioni",dashboard:"Pannello di controllo",node:"Interruttore",export_users:"Esporta utenti",no_users:"Nessun utente trovato",total_capacity:"Capacità Totale",avg_channel_size:"Dimensione media del canale",biggest_channel_size:"Dimensione del canale più grande",smallest_channel_size:"Dimensione Più Piccola del Canale",number_of_channels:"Numero di Canali",active_channels:"Canali Attivi",connect_peer:"Connetti Peer",connect:"Connetti",open_channel:"Canale aperto",open:"Apri",close_channel:"Chiudi Canale",close:"Chiudi",restart:"Riavvia il server",save:"Salva",save_tooltip:"Salva le modifiche",topup:"Ricarica",topup_wallet:"Ricarica un portafoglio",topup_hint:"Usa l'ID del portafoglio per ricaricare qualsiasi portafoglio",restart_tooltip:"Riavvia il server affinché le modifiche abbiano effetto",add_funds_tooltip:"Aggiungere fondi a un portafoglio",reset_defaults:"Ripristina le impostazioni predefinite",reset_defaults_tooltip:"Cancella tutte le impostazioni e ripristina i valori predefiniti",download_backup:"Scarica il backup del database",name_your_wallet:"Dai un nome al tuo portafoglio {name}",wallet_topup_ok:"Operazione riuscita nella creazione di fondi virtuali ({amount} sats). I pagamenti dipendono dai fondi effettivi sulla fonte di finanziamento.",paste_invoice_label:"Incolla una fattura, una richiesta di pagamento o un codice lnurl *",lnbits_description:"Leggero e facile da configurare, LNbits può funzionare su qualsiasi fonte di finanziamento Lightning Network e persino LNbits stesso! Potete gestire LNbits per conto vostro o offrire facilmente una soluzione di custodia per altri. Ogni portafoglio ha le proprie chiavi API e non c'è limite al numero di portafogli che si possono creare. La possibilità di suddividere i fondi rende LNbits uno strumento utile per la gestione del denaro e come strumento di sviluppo. Le estensioni aggiungono ulteriori funzionalità a LNbits, consentendo di sperimentare una serie di tecnologie all'avanguardia sulla rete Lightning. Abbiamo reso lo sviluppo delle estensioni il più semplice possibile e, in quanto progetto libero e open-source, incoraggiamo le persone a sviluppare e inviare le proprie",export_to_phone:"Esportazione su telefono con codice QR",export_to_phone_desc:"Questo codice QR contiene l'URL del portafoglio con accesso da amministratore. È possibile scansionarlo dal telefono per aprire il portafoglio da lì.",wallets:"Portafogli",add_wallet:"Aggiungi un nuovo portafoglio",delete_wallet:"Elimina il portafoglio",delete_wallet_desc:"L'intero portafoglio sarà cancellato, i fondi saranno irrecuperabili",rename_wallet:"Rinomina il portafoglio",update_name:"Aggiorna il nome",fiat_tracking:"Tracciamento Fiat",currency:"Valuta",update_currency:"Aggiorna valuta",press_to_claim:"Premi per richiedere bitcoin",donate:"Donazioni",view_github:"Visualizza su GitHub",voidwallet_active:"VoidWallet è attivo! Pagamenti disabilitati",use_with_caution:"USARE CON CAUTELA - {name} portafoglio è ancora in BETA",service_fee:"Commissione di servizio: {amount} % per transazione",service_fee_max:"Commissione di servizio: {amount} % per transazione (max {max} sats)",service_fee_tooltip:"Commissione di servizio addebitata dall'amministratore del server LNbits per ogni transazione in uscita",toggle_darkmode:"Attiva la modalità notturna",payment_reactions:"Reazioni al Pagamento",view_swagger_docs:"Visualizza i documentazione dell'API Swagger di LNbits",api_docs:"Documentazione dell'API",api_keys_api_docs:"URL del nodo, chiavi API e documentazione API",lnbits_version:"Versione di LNbits",runs_on:"Esegue su",credit_hint:"Premere Invio per accreditare i fondi",credit_label:"{denomination} da accreditare",paste:"Incolla",paste_from_clipboard:"Incolla dagli appunti",paste_request:"Richiesta di pagamento",create_invoice:"Crea fattura",camera_tooltip:"Usa la fotocamera per scansionare la fattura/QR",export_csv:"Esporta CSV",chart_tooltip:"Mostra grafico",pending:"In attesa",copy_invoice:"Copia fattura",withdraw_from:"Prelevare da",cancel:"Annulla",scan:"Scansiona",read:"Leggi",pay:"Paga",memo:"Memo",date:"Dati",processing_payment:"Elaborazione pagamento...",not_enough_funds:"Non ci sono abbastanza fondi!",search_by_tag_memo_amount:"Cerca per tag, memo, importo...",invoice_waiting:"Fattura in attesa di pagamento",payment_received:"Pagamento ricevuto",payment_sent:"Pagamento inviato",receive:"ricevere",send:"inviare",outgoing_payment_pending:"Pagamento in uscita in attesa",drain_funds:"Fondi di drenaggio",drain_funds_desc:"Questo è un codice QR LNURL-withdraw per prelevare tutti i fondi da questo portafoglio. Non condividerlo con nessuno. È compatibile con balanceCheck e balanceNotify, di conseguenza il vostro portafoglio può continuare a prelevare continuamente i fondi da qui dopo il primo prelievo",i_understand:"Ho capito",copy_wallet_url:"Copia URL portafoglio",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"La funzionalità di login sarà rilasciata in un futuro aggiornamento; per ora, assicuratevi di salvare tra i preferiti questa pagina per accedere nuovamente in futuro a questo portafoglio! Questo servizio è in fase BETA e non ci assumiamo alcuna responsabilità per la perdita all'accesso dei fondi",no_transactions:"Nessuna transazione effettuata",manage:"Gestisci",extensions:"Estensioni",no_extensions:"Non ci sono estensioni installate :(",created:"Creato",search_extensions:"Estensioni di ricerca",warning:"Attenzione",repository:"Deposito",confirm_continue:"Sei sicuro di voler continuare?",manage_extension_details:"Installa/disinstalla estensione",install:"Installare",uninstall:"Disinstalla",drop_db:"Rimuovi Dati",enable:"Abilita",enable_extension_details:"Attiva l'estensione per l'utente corrente",disable:"Disabilita",installed:"Installato",activated:"Attivato",deactivated:"Disattivato",release_notes:"Note di Rilascio",activate_extension_details:"Rendi l'estensione disponibile/non disponibile per gli utenti",featured:"In primo piano",all:"Tutto",only_admins_can_install:"Solo gli account amministratore possono installare estensioni.",admin_only:"Solo amministratore",new_version:"Nuova Versione",extension_depends_on:"Dipende da:",extension_rating_soon:"Valutazioni in arrivo",extension_installed_version:"Versione installata",extension_uninstall_warning:"Stai per rimuovere l'estensione per tutti gli utenti.",uninstall_confirm:"Sì, Disinstalla",extension_db_drop_info:"Tutti i dati relativi all'estensione saranno cancellati permanentemente. Non c'è modo di annullare questa operazione!",extension_db_drop_warning:"Stai per rimuovere tutti i dati per l'estensione. Digita il nome dell'estensione per continuare:",extension_min_lnbits_version:"Questa versione richiede almeno la versione LNbits",payment_hash:"Hash del pagamento",fee:"Tariffa",amount:"Importo",tag:"Etichetta",unit:"Unità",description:"Descrizione",expiry:"Scadenza",webhook:"Webhook",payment_proof:"Prova di pagamento",update_available:"Aggiornamento {version} disponibile!",latest_update:"Sei sulla versione più recente {version}.",notifications:"Notifiche",no_notifications:"Nessuna notifica",notifications_disabled:"Le notifiche di stato di LNbits sono disattivate.",enable_notifications:"Attiva le notifiche",enable_notifications_desc:"Se attivato, recupererà gli ultimi aggiornamenti sullo stato di LNbits, come incidenti di sicurezza e aggiornamenti.",enable_killswitch:"Attiva Killswitch",enable_killswitch_desc:"Se attivato, cambierà automaticamente la tua fonte di finanziamento in VoidWallet se LNbits invia un segnale di killswitch. Dovrai attivare manualmente dopo un aggiornamento.",killswitch_interval:"Intervallo Killswitch",killswitch_interval_desc:"Quanto spesso il compito in background dovrebbe controllare il segnale di killswitch LNbits dalla fonte di stato (in minuti).",enable_watchdog:"Attiva Watchdog",enable_watchdog_desc:"Se abilitato, cambierà automaticamente la tua fonte di finanziamento in VoidWallet se il tuo saldo è inferiore al saldo LNbits. Dovrai abilitarlo manualmente dopo un aggiornamento.",watchdog_interval:"Intervallo Watchdog",watchdog_interval_desc:"Quanto spesso il task in background dovrebbe controllare un segnale di killswitch nel delta del watchdog [node_balance - lnbits_balance] (in minuti).",watchdog_delta:"Guardiano Delta",watchdog_delta_desc:"Limite prima che l'interruttore di sicurezza modifichi la fonte di finanziamento in VoidWallet [lnbits_balance - node_balance > delta]",status:"Stato",notification_source:"Sorgente di notifica",notification_source_label:"URL sorgente (utilizzare solo la fonte ufficiale di stato LNbits e fonti di cui ti puoi fidare)",more:"più",less:"meno",releases:"Pubblicazioni",killswitch:"Interruttore di spegnimento",watchdog:"Cane da guardia",server_logs:"Registri del server",ip_blocker:"Blocco IP",security:"Sicurezza",security_tools:"Strumenti di sicurezza",block_access_hint:"Blocca l'accesso per IP",allow_access_hint:"Consenti l'accesso per IP (sovrascriverà gli IP bloccati)",enter_ip:"Inserisci l'IP e premi invio",rate_limiter:"Limitatore di frequenza",wallet_limiter:"Limitatore del Portafoglio",wallet_limit_max_withdraw_per_day:"Prelievo massimo giornaliero dal portafoglio in sats (0 per disabilitare)",wallet_max_ballance:"Saldo massimo del portafoglio in sats (0 per disabilitare)",wallet_limit_secs_between_trans:"Minuti e secondi tra transazioni per portafoglio (0 per disabilitare)",number_of_requests:"Numero di richieste",time_unit:"Unità di tempo",minute:"minuto",second:"secondo",hour:"ora",disable_server_log:"Disabilita Registro Server",enable_server_log:"Attiva Registro Server",coming_soon:"Caratteristica in arrivo prossimamente",session_has_expired:"La tua sessione è scaduta. Per favore, effettua nuovamente il login.",instant_access_question:"Vuoi accesso immediato?",login_with_user_id:"Accedi con ID utente",or:"oppure",create_new_wallet:"Crea nuovo portafoglio",login_to_account:"Accedi al tuo account",create_account:"Crea un account",account_settings:"Impostazioni dell'account",signin_with_google:"Accedi con Google",signin_with_github:"Accedi con GitHub",signin_with_keycloak:"Accedi con Keycloak",username_or_email:"Nome utente o Email",password:"Password",password_config:"Configurazione della password",password_repeat:"Ripeti la password",change_password:"Cambia Password",set_password:"Imposta password",invalid_password:"La password deve contenere almeno 8 caratteri",login:"Accesso",register:"Registrati",username:"Nome utente",user_id:"ID utente",email:"Email",first_name:"Nome",last_name:"Cognome",picture:"Immagine",verify_email:"Verifica email con",account:"Conto",update_account:"Aggiorna Account",invalid_username:"Nome utente non valido",auth_provider:"Provider di Autenticazione",my_account:"Il mio account",back:"Indietro",logout:"Esci",look_and_feel:"Aspetto e Comportamento",language:"Lingua",color_scheme:"Schema dei colori",extension_cost:"Questa versione richiede un pagamento minimo di {cost} satoshi.",extension_paid_sats:"Hai già pagato {paid_sats} sats.",release_details_error:"Impossibile ottenere i dettagli della versione.",pay_from_wallet:"Paga dal Portafoglio",show_qr:"Mostra QR",retry_install:"Riprova Installazione",new_payment:"Effettua Nuovo Pagamento",hide_empty_wallets:"Nascondi portafogli vuoti"},window.localisation.jp={confirm:"はい",server:"サーバー",theme:"テーマ",funding:"資金調達",users:"ユーザー",apps:"アプリ",channels:"チャンネル",transactions:"トランザクション",dashboard:"ダッシュボード",node:"ノード",export_users:"ユーザーのエクスポート",no_users:"ユーザーが見つかりません",total_capacity:"合計容量",avg_channel_size:"平均チャンネルサイズ",biggest_channel_size:"最大チャネルサイズ",smallest_channel_size:"最小チャンネルサイズ",number_of_channels:"チャンネル数",active_channels:"アクティブチャンネル",connect_peer:"ピアを接続",connect:"接続",open_channel:"オープンチャンネル",open:"開く",close_channel:"チャンネルを閉じる",close:"閉じる",restart:"サーバーを再起動する",save:"保存",save_tooltip:"変更を保存する",topup:"トップアップ",topup_wallet:"ウォレットをトップアップする",topup_hint:"ウォレットIDを使用して、任意のウォレットをトップアップできます",restart_tooltip:"サーバーを再起動して変更を適用します",add_funds_tooltip:"ウォレットに資金を追加します。",reset_defaults:"リセット",reset_defaults_tooltip:"すべての設定を削除してデフォルトに戻します。",download_backup:"データベースのバックアップをダウンロードする",name_your_wallet:"あなたのウォレットの名前 {name}",wallet_topup_ok:"仮想資金の作成に成功しました({amount} sats)。支払いは資金ソースの実際の資金に依存します。",paste_invoice_label:"請求書を貼り付けてください",lnbits_description:"簡単にインストールでき、軽量なLNbitsは、あらゆるライトニングネットワークの資金源と、LNbits自身でさえも実行できます!LNbitsを個人で実行することも、他人に対してカストディアンソリューションをで実行できます! LNbitsを自分で実行することも、他の人に優れたソリューションを提供することもできます。各ウォレットには独自のAPIキーがあり、作成できるウォレットの数に制限はありません。資金を分割する機能は、LNbitsを資金管理ツールとして使用したり、開発ツールとして使用したりするための便利なツールです。拡張機能は、LNbitsに追加の機能を追加します。そのため、LNbitsは最先端の技術をネットワークLightningで試すことができます。拡張機能を開発するのは簡単で、無料でオープンソースのプロジェクトであるため、人々が自分で開発し、自分の貢献を送信することを奨励しています。",export_to_phone:"電話にエクスポート",export_to_phone_desc:"ウォレットを電話にエクスポートすると、ウォレットを削除する前にウォレットを復元できます。ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",wallets:"ウォレット",add_wallet:"ウォレットを追加",delete_wallet:"ウォレットを削除",delete_wallet_desc:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。",rename_wallet:"ウォレットの名前を変更",update_name:"名前を更新",fiat_tracking:"フィアット追跡",currency:"通貨",update_currency:"通貨を更新する",press_to_claim:"クレームするには押してください",donate:"寄付",view_github:"GitHubで表示",voidwallet_active:"Voidwalletアクティブ",use_with_caution:"注意して使用してください - {name} ウォレットはまだベータ版です",service_fee:"取引ごとのサービス手数料: {amount} %",service_fee_max:"取引手数料:{amount}%(最大{max}サトシ)",service_fee_tooltip:"LNbitsサーバー管理者が発生する送金ごとの手数料",toggle_darkmode:"ダークモードを切り替える",payment_reactions:"支払いの反応",view_swagger_docs:"Swaggerドキュメントを表示",api_docs:"APIドキュメント",api_keys_api_docs:"ノードURL、APIキー、APIドキュメント",lnbits_version:"LNbits バージョン",runs_on:"で実行",credit_hint:"クレジットカードを使用して資金を追加するには、LNbitsを使用してください。",credit_label:"{denomination} をクレジットに",paste:"貼り付け",paste_from_clipboard:"クリップボードから貼り付け",paste_request:"リクエストを貼り付ける",create_invoice:"請求書を作成する",camera_tooltip:"QRコードを読み取る",export_csv:"CSVでエクスポート",chart_tooltip:"チャートを表示するには、グラフの上にカーソルを合わせます",pending:"保留中",copy_invoice:"請求書をコピー",withdraw_from:"出金",cancel:"キャンセル",scan:"スキャン",read:"読む",pay:"支払う",memo:"メモ",date:"日付",processing_payment:"支払い処理中",not_enough_funds:"資金が不足しています",search_by_tag_memo_amount:"タグ、メモ、金額で検索",invoice_waiting:"請求書を待っています",payment_received:"お支払いありがとうございます",payment_sent:"支払いが完了しました",receive:"受け取る",send:"送信",outgoing_payment_pending:"支払い保留中",drain_funds:"資金を排出する",drain_funds_desc:"ウォレットの残高をすべて他のウォレットに送金します",i_understand:"理解した",copy_wallet_url:"ウォレットURLをコピー",disclaimer_dialog_title:"重要!",disclaimer_dialog:"ウォレットを削除すると、ウォレットの秘密鍵が削除され、ウォレットを復元することはできません。ウォレットを削除する前に、ウォレットをエクスポートしてください。",no_transactions:"トランザクションはありません",manage:"管理",extensions:"拡張機能",no_extensions:"拡張機能はありません",created:"作成済み",search_extensions:"検索拡張機能",warning:"警告",repository:"リポジトリ",confirm_continue:"続行してもよろしいですか?",manage_extension_details:"拡張機能のインストール/アンインストール",install:"インストール",uninstall:"アンインストール",drop_db:"データを削除",enable:"有効",enable_extension_details:"現在のユーザーの拡張機能を有効にする",disable:"無効",installed:"インストール済み",activated:"有効化",deactivated:"無効化",release_notes:"リリースノート",activate_extension_details:"拡張機能をユーザーが利用できるようにする/利用できないようにする",featured:"特集",all:"すべて",only_admins_can_install:"(管理者アカウントのみが拡張機能をインストールできます)",admin_only:"管理者のみ",new_version:"新しいバージョン",extension_depends_on:"依存先:",extension_rating_soon:"評価は近日公開",extension_installed_version:"インストール済みバージョン",extension_uninstall_warning:"すべてのユーザーの拡張機能を削除しようとしています.",uninstall_confirm:"はい、アンインストールします",extension_db_drop_info:"エクステンションのすべてのデータが完全に削除されます。この操作を元に戻す方法はありません!",extension_db_drop_warning:"エクステンションのすべてのデータを削除しようとしています。続行するには、エクステンションの名前を入力してください:",extension_min_lnbits_version:"このリリースには少なくとも LNbits バージョンが必要です",payment_hash:"支払いハッシュ",fee:"料金",amount:"量",tag:"タグ",unit:"単位",description:"説明",expiry:"有効期限",webhook:"ウェブフック",payment_proof:"支払い証明",update_available:"アップデート{version}が利用可能です!",latest_update:"あなたは最新バージョン{version}を使用しています。",notifications:"通知",no_notifications:"通知はありません",notifications_disabled:"LNbitsステータス通知は無効です。",enable_notifications:"通知を有効にする",enable_notifications_desc:"有効にすると、セキュリティインシデントやアップデートのような最新のLNbitsステータス更新を取得します。",enable_killswitch:"キルスイッチを有効にする",enable_killswitch_desc:"有効にすると、LNbitsからキルスイッチ信号が送信された場合に自動的に資金源をVoidWalletに切り替えます。更新後には手動で有効にする必要があります。",killswitch_interval:"キルスイッチ間隔",killswitch_interval_desc:"バックグラウンドタスクがステータスソースからLNbitsキルスイッチ信号を確認する頻度(分単位)。",enable_watchdog:"ウォッチドッグを有効にする",enable_watchdog_desc:"有効にすると、残高がLNbitsの残高より少ない場合に、資金源を自動的にVoidWalletに変更します。アップデート後は手動で有効にする必要があります。",watchdog_interval:"ウォッチドッグ・インターバル",watchdog_interval_desc:"バックグラウンドタスクがウォッチドッグデルタ[node_balance - lnbits_balance]でキルスイッチシグナルを確認する頻度(分単位)。",watchdog_delta:"ウォッチドッグデルタ",watchdog_delta_desc:"キルスイッチが資金源をVoidWalletに変更する前の限界 [lnbits_balance - node_balance > delta]",status:"ステータス",notification_source:"通知ソース",notification_source_label:"ソースURL(公式のLNbitsステータスソースのみを使用し、信頼できるソースのみを利用してください)",more:"より多くの",less:"少ない",releases:"リリース",killswitch:"キルスイッチ",watchdog:"ウォッチドッグ",server_logs:"サーバーログ",ip_blocker:"IPブロッカー",security:"セキュリティ",security_tools:"セキュリティツール",block_access_hint:"IPによるアクセスをブロック",allow_access_hint:"IPによるアクセスを許可する(ブロックされたIPを上書きします)",enter_ip:"IPを入力してエンターキーを押してください",rate_limiter:"レートリミッター",wallet_limiter:"ウォレットリミッター",wallet_limit_max_withdraw_per_day:"1日あたりの最大ウォレット出金額をsatsで入力してください(0 で無効)。",wallet_max_ballance:"ウォレットの最大残高(sats)(0は無効)",wallet_limit_secs_between_trans:"トランザクション間の最小秒数(ウォレットごと)(0は無効)",number_of_requests:"リクエストの数",time_unit:"時間単位",minute:"分",second:"秒",hour:"時間",disable_server_log:"サーバーログを無効にする",enable_server_log:"サーバーログを有効にする",coming_soon:"機能は間もなく登場します",session_has_expired:"あなたのセッションは期限切れです。もう一度ログインしてください。",instant_access_question:"即時アクセスをご希望ですか?",login_with_user_id:"ユーザーIDでログイン",or:"または",create_new_wallet:"新しいウォレットを作成",login_to_account:"アカウントにログインしてください",create_account:"アカウントを作成",account_settings:"アカウント設定",signin_with_google:"Googleでサインイン",signin_with_github:"GitHubでサインイン",signin_with_keycloak:"Keycloakでサインイン",username_or_email:"ユーザー名またはメールアドレス",password:"パスワード",password_config:"パスワード設定",password_repeat:"パスワードの再入力",change_password:"パスワードを変更",set_password:"パスワードを設定",invalid_password:"パスワードは少なくとも8文字必要です",login:"ログイン",register:"登録",username:"ユーザー名",user_id:"ユーザーID",email:"メール",first_name:"名",last_name:"姓",picture:"写真",verify_email:"メールアドレスの確認を行ってください",account:"アカウント",update_account:"アカウントを更新",invalid_username:"無効なユーザー名",auth_provider:"認証プロバイダ",my_account:"マイアカウント",back:"戻る",logout:"ログアウト",look_and_feel:"ルック・アンド・フィール",language:"言語",color_scheme:"カラースキーム",extension_cost:"このリリースには最低 {cost} サトシの支払いが必要です。",extension_paid_sats:"すでに{paid_sats} satsを支払いました。",release_details_error:"リリースの詳細を取得できません。",pay_from_wallet:"ウォレットから支払う",show_qr:"QRを表示",retry_install:"再試行インストール",new_payment:"新しい支払いを作成する",hide_empty_wallets:"空のウォレットを非表示にする"},window.localisation.cn={confirm:"确定",server:"服务器",theme:"主题",funding:"资金",users:"用户",apps:"应用程序",channels:"频道",transactions:"交易记录",dashboard:"控制面板",node:"节点",export_users:"导出用户",no_users:"未找到用户",total_capacity:"总容量",avg_channel_size:"平均频道大小",biggest_channel_size:"最大通道大小",smallest_channel_size:"最小频道尺寸",number_of_channels:"频道数量",active_channels:"活跃频道",connect_peer:"连接对等",connect:"连接",open_channel:"打开频道",open:"打开",close_channel:"关闭频道",close:"关闭",restart:"重新启动服务器",save:"保存",save_tooltip:"保存更改",topup:"充值",topup_wallet:"给钱包充值",topup_hint:"使用钱包ID为任何钱包充值",restart_tooltip:"重新启动服务器以使更改生效",add_funds_tooltip:"为钱包添加资金",reset_defaults:"重置为默认设置",reset_defaults_tooltip:"删除所有设置并重置为默认设置",download_backup:"下载数据库备份",name_your_wallet:"给你的 {name}钱包起个名字",wallet_topup_ok:"成功创建虚拟资金({amount} sats)。付款取决于资金来源的实际资金。",paste_invoice_label:"粘贴发票,付款请求或lnurl*",lnbits_description:"LNbits 设置简单、轻量级,可以在任何闪电网络的资金来源上运行,甚至可以在LNbits自身上运行!您可以为自己运行LNbits,或者轻松为他人提供托管解决方案。每个钱包都有自己的 API 密钥,你可以创建的钱包数量没有限制。能够把资金分开管理使 LNbits 成为一款有用的资金管理和开发工具。扩展程序增加了 LNbits 的额外功能,所以你可以在闪电网络上尝试各种尖端技术。我们已经尽可能简化了开发扩展程序的过程,作为一个免费和开源的项目,我们鼓励人们开发并提交自己的扩展程序。",export_to_phone:"通过二维码导出到手机",export_to_phone_desc:"这个二维码包含您钱包的URL。您可以使用手机扫描的方式打开您的钱包。",wallets:"钱包",add_wallet:"添加新钱包",delete_wallet:"删除钱包",delete_wallet_desc:"整个钱包将被删除,资金将无法恢复",rename_wallet:"重命名钱包",update_name:"更新名称",fiat_tracking:"菲亚特追踪",currency:"货币",update_currency:"更新货币",press_to_claim:"点击领取比特币",donate:"捐献",view_github:"在GitHub上查看",voidwallet_active:"VoidWallet 已激活!付款功能已禁用。",use_with_caution:"请谨慎使用 - {name}钱包还处于测试版阶段",service_fee:"服务费:{amount}% 每笔交易",service_fee_max:"服务费:{amount}% 每笔交易(最高 {max} sats)",service_fee_tooltip:"LNbits服务器管理员每笔外发交易收取的服务费",toggle_darkmode:"切换暗黑模式",payment_reactions:"支付反应",view_swagger_docs:"查看 LNbits Swagger API 文档",api_docs:"API文档",api_keys_api_docs:"节点URL、API密钥和API文档",lnbits_version:"LNbits版本",runs_on:"可运行在",credit_hint:"按 Enter 键充值账户",credit_label:"{denomination} 充值",paste:"粘贴",paste_from_clipboard:"从剪贴板粘贴",paste_request:"粘贴请求",create_invoice:"创建发票",camera_tooltip:"用相机扫描发票/二维码",export_csv:"导出为CSV",chart_tooltip:"显示图表",pending:"待处理",copy_invoice:"复制发票",withdraw_from:"从",cancel:"取消",scan:"扫描",read:"读取",pay:"付款",memo:"备注",date:"日期",processing_payment:"正在处理支付...",not_enough_funds:"资金不足!",search_by_tag_memo_amount:"按标签、备注、金额搜索",invoice_waiting:"待支付的发票",payment_received:"收到付款",payment_sent:"付款已发送",receive:"收款",send:"付款",outgoing_payment_pending:"付款正在等待处理",drain_funds:"清空资金",drain_funds_desc:"这是一个 LNURL-取款的二维码,用于从该钱包中提取全部资金。请不要与他人分享。它与 balanceCheck 和 balanceNotify 兼容,因此在第一次取款后,您的钱包还可能会持续从这里提取资金",i_understand:"我明白",copy_wallet_url:"复制钱包URL",disclaimer_dialog_title:"重要!",disclaimer_dialog:"登录功能将在以后的更新中发布,请将此页面加为书签,以便将来访问您的钱包!此服务处于测试阶段,我们不对资金的丢失承担任何责任。",no_transactions:"尚未进行任何交易",manage:"管理",extensions:"扩展程序",no_extensions:"你没有安装任何扩展程序 :(",created:"已创建",search_extensions:"搜索扩展程序",warning:"警告",repository:"代码库",confirm_continue:"你确定要继续吗?",manage_extension_details:"安装/卸载扩展程序",install:"安装",uninstall:"卸载",drop_db:"删除数据",enable:"启用",enable_extension_details:"为当前用户启用扩展程序",disable:"禁用",installed:"已安装",activated:"已激活",deactivated:"已停用",release_notes:"发布说明",activate_extension_details:"对用户开放或禁用扩展程序",featured:"精选",all:"全部",only_admins_can_install:"(只有管理员账户可以安装扩展)",admin_only:"仅限管理员",new_version:"新版本",extension_depends_on:"依赖于:",extension_rating_soon:"即将推出评分",extension_installed_version:"已安装的版本",extension_uninstall_warning:"您即将对所有用户删除该扩展程序。",uninstall_confirm:"是的,卸载",extension_db_drop_info:"该扩展程序的所有数据将被永久删除。此操作无法撤销!",extension_db_drop_warning:"您即将删除该扩展的所有数据。请继续输入扩展程序名称以确认操作:",extension_min_lnbits_version:"此版本要求最低的 LNbits 版本为",payment_hash:"付款哈希",fee:"费",amount:"金额",tag:"标签",unit:"单位",description:"详情",expiry:"过期时间",webhook:"Webhook",payment_proof:"付款证明",update_available:"更新{version}可用!",latest_update:"您当前使用的是最新版本{version}。",notifications:"通知",no_notifications:"没有通知",notifications_disabled:"LNbits状态通知已禁用。",enable_notifications:"启用通知",enable_notifications_desc:"如果启用,它将获取最新的LNbits状态更新,如安全事件和更新。",enable_killswitch:"启用紧急停止开关",enable_killswitch_desc:"如果启用,当LNbits发送终止信号时,系统将自动将您的资金来源更改为VoidWallet。更新后,您将需要手动启用。",killswitch_interval:"Killswitch 间隔",killswitch_interval_desc:"后台任务应该多久检查一次来自状态源的LNbits断路信号(以分钟为单位)。",enable_watchdog:"启用看门狗",enable_watchdog_desc:"如果启用,当您的余额低于LNbits余额时,系统将自动将您的资金来源更改为VoidWallet。更新后您将需要手动启用。",watchdog_interval:"看门狗间隔",watchdog_interval_desc:"后台任务应该多久检查一次看门狗增量中的 killswitch 信号 [node_balance - lnbits_balance](以分钟计)。",watchdog_delta:"看门狗德尔塔",watchdog_delta_desc:"在触发紧急停止前切换资金来源至VoidWallet的限制 [lnbits_balance - node_balance > delta]",status:"状态",notification_source:"通知来源",notification_source_label:"来源 URL(仅使用官方LNbits状态源和您信任的源)",more:"更多",less:"少",releases:"版本",killswitch:"杀手锏",watchdog:"监控程序",server_logs:"服务器日志",ip_blocker:"IP 阻止器",security:"安全",security_tools:"安全工具",block_access_hint:"屏蔽IP访问",allow_access_hint:"允许通过IP访问(将覆盖被屏蔽的IP)",enter_ip:"输入IP地址并按回车键",rate_limiter:"速率限制器",wallet_limiter:"钱包限制器",wallet_limit_max_withdraw_per_day:"每日钱包最大提现额度(单位:sats)(设为0则禁用)",wallet_max_ballance:"钱包最大余额(以sats计)(设为0则禁用)",wallet_limit_secs_between_trans:"每个钱包交易间最少秒数(设为0则禁用)",number_of_requests:"请求次数",time_unit:"时间单位",minute:"分钟",second:"秒",hour:"小时",disable_server_log:"禁用服务器日志",enable_server_log:"启用服务器日志",coming_soon:"功能即将推出",session_has_expired:"您的会话已过期。请重新登录。",instant_access_question:"想要即时访问吗?",login_with_user_id:"使用用户ID登录",or:"或",create_new_wallet:"创建新钱包",login_to_account:"登录您的账户",create_account:"创建账户",account_settings:"账户设置",signin_with_google:"使用谷歌账号登录",signin_with_github:"使用GitHub登录",signin_with_keycloak:"使用Keycloak登录",username_or_email:"用户名或电子邮箱",password:"密码",password_config:"密码配置",password_repeat:"密码重复",change_password:"修改密码",set_password:"设置密码",invalid_password:"密码至少需要有8个字符",login:"登录",register:"注册",username:"用户名",user_id:"用户ID",email:"电子邮件",first_name:"名字",last_name:"姓氏",picture:"图片",verify_email:"验证电子邮件与",account:"账户",update_account:"更新帐户",invalid_username:"无效用户名",auth_provider:"认证提供者",my_account:"我的账户",back:"返回",logout:"注销",look_and_feel:"外观和感觉",language:"语言",color_scheme:"配色方案",extension_cost:"此版本需要支付最低 {cost} sats。",extension_paid_sats:"您已经支付了{paid_sats} sats。",release_details_error:"无法获取发布详情。",pay_from_wallet:"从钱包支付",show_qr:"显示QR码",retry_install:"重试安装",new_payment:"创建新支付",hide_empty_wallets:"隐藏空钱包"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",funding:"Financiering",users:"Gebruikers",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",topup:"Bijvullen",topup_wallet:"Een portemonnee bijvullen",topup_hint:"Gebruik de portemonnee-ID om elke portemonnee bij te vullen",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",wallet_topup_ok:"Succes met het aanmaken van virtuele fondsen ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",lnbits_version:"LNbits-versie",runs_on:"Draait op",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",processing_payment:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_min_lnbits_version:"Deze release vereist ten minste LNbits-versie",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_killswitch:"Activeer Killswitch",enable_killswitch_desc:"Indien ingeschakeld, zal het uw financieringsbron automatisch wijzigen naar VoidWallet als LNbits een killswitch-signaal verzendt. U zult het na een update handmatig moeten inschakelen.",killswitch_interval:"Uitschakelschakelaar-interval",killswitch_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op het LNbits killswitch signaal van de statusbron (in minuten).",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",killswitch:"Killswitch",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",language:"Taal",color_scheme:"Kleurenschema",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",hide_empty_wallets:"Verberg lege portemonnees"},window.localisation.pi={confirm:"Aye",server:"Cap`n",theme:"Theme",funding:"Funding",users:"Buccaneers",apps:"Arrrrplications",channels:"Channels",transactions:"Pirate Transactions and loot",dashboard:"Arrr-board",node:"Node",export_users:"Export Mateys",no_users:"No swabbies found",total_capacity:"Total Capacity",avg_channel_size:"Avg. Channel Size",biggest_channel_size:"Largest Bilge Size",smallest_channel_size:"Smallest Channel Size",number_of_channels:"Nummer o' Channels",active_channels:"Active Channels",connect_peer:"Connect Peer",connect:"Connect",open_channel:"Open Channel",open:"Open yer hatches",close_channel:"Shut Yer Gob Channel",close:"Batten down the hatches, we be closin",restart:"Arr, restart Cap`n",save:"Bury Treasure",save_tooltip:"Bury yer changes, matey",topup:"Top up the Chest",topup_wallet:"Add more doubloons to the chest",topup_hint:"Use the chest ID to top up any chest",restart_tooltip:"Restart the Cap`n for changes to take effect, arr!",add_funds_tooltip:"Add doubloons to a chest and make it heavier",reset_defaults:"Reset to Davy Jones Locker",reset_defaults_tooltip:"Scuttle all settings and reset to Davy Jones Locker. Aye, start anew!",download_backup:"Download database booty",name_your_wallet:"Name yer {name} treasure chest",wallet_topup_ok:"Success creatin' virtual funds ({amount} sats). Payments depend on actual funds on funding source.",paste_invoice_label:"Paste a booty, payment request or lnurl code, matey!",lnbits_description:"Arr, easy to set up and lightweight, LNbits can run on any Lightning Network funding source and even LNbits itself! Ye can run LNbits for yourself, or easily offer a custodian solution for others. Each chest has its own API keys and there be no limit to the number of chests ye can make. Being able to partition booty makes LNbits a useful tool for money management and as a development tool. Arr, extensions add extra functionality to LNbits so ye can experiment with a range of cutting-edge technologies on the lightning network. We have made developing extensions as easy as possible, and as a free and open-source project, we encourage scallywags to develop and submit their own.",export_to_phone:"Export to Phone with QR Code, me hearties",export_to_phone_desc:"This QR code contains yer chest URL with full access. Ye can scan it from yer phone to open yer chest from there, arr!",wallets:"Treasure Chests",add_wallet:"Add a new chest and fill it with doubloons!",delete_wallet:"Scuttle the Chest",delete_wallet_desc:"This whole chest will be scuttled, the booty will be UNRECOVERABLE. Aye, be warned!",rename_wallet:"Rename the Chest, me hearty",update_name:"Update name like a captain",fiat_tracking:"Trackin' o' the treasure",currency:"Curr'nsey",update_currency:"Update doubloons",press_to_claim:"Press to claim gold doubloons, matey!",donate:"Donate like a true pirate!",view_github:"View on GitHub and find treasures",voidwallet_active:"VoidWallet be active! Payments disabled",use_with_caution:"USE WITH CAUTION - {name} chest be still in BETA. Aye, be careful!",service_fee:"Service fee: {amount} % per transaction",service_fee_max:"Service fee: {amount} % per transaction (max {max} sats)",service_fee_tooltip:"Service fee charged by the LNbits server admin per goin' transaction",toggle_darkmode:"Toggle Dark Mode, arr!",payment_reactions:"Payment Reactions",view_swagger_docs:"View LNbits Swagger API docs and learn the secrets",api_docs:"API docs for the scallywags",api_keys_api_docs:"Node URL, API keys and API docs",lnbits_version:"LNbits version, arr!",runs_on:"Runs on, matey",credit_hint:"Press Enter to credit account and make it richer",credit_label:"{denomination} to credit, arr!",paste:"Stow",paste_from_clipboard:"Paste from clipboard",paste_request:"Paste Request and find treasures",create_invoice:"Create Booty Request and get rich, me hearties!",camera_tooltip:"Use spyglass to scan a booty/QR, arr!",export_csv:"Export to CSV and keep track of the booty",chart_tooltip:"Show ye chart, me hearty",pending:"Pendin like a ship at anchor",copy_invoice:"Copy booty request, arrr",withdraw_from:"Withdraw from",cancel:"Abandon ship! We be retreatin",scan:"Avast! Scan me beauty, arrr",read:"Read it, if ye dare",pay:"Pay up or walk the plank, ye scallywag",memo:"Message in a bottle, argh",date:"Date of the map, me matey",processing_payment:"Processing yer payment... don´t make me say it again",not_enough_funds:"Arrr, ye don´t have enough doubloons! Walk the plank!",search_by_tag_memo_amount:"Search by tag, message, or booty amount, savvy",invoice_waiting:"Invoice waiting to be plundered, arrr",payment_received:"Payment Received like a treasure, argh",payment_sent:"Payment Sent, hoist the colors! We´ve got some doubloons!",receive:"booty",send:"hoist",outgoing_payment_pending:"Outgoing payment pending in the port, ye scurvy dog",drain_funds:"Plunder all the doubloons, ye buccaneer",drain_funds_desc:"This be an LNURL-withdraw QR code for slurpin everything from this wallet. Don`t share with anyone. It be compatible with balanceCheck and balanceNotify so yer wallet may keep pullin` the funds continuously from here after the first withdraw.",i_understand:"I understand, yo ho ho and a bottle of rum!",copy_wallet_url:"Copy wallet URL like a map, savvy",disclaimer_dialog_title:"Avast!",disclaimer_dialog:"Login functionality to be released in a future update, for now, make sure ye bookmark this page for future access to your booty! This service be in BETA, and we hold no responsibility for people losing access to doubloons.",no_transactions:"No transactions made yet, me hearties. Belay that!",manage:"Manage, me hearty",extensions:"Yer Extensions, ye scurvy dog",no_extensions:"Ye don't have any extensions installed, ye scallywag :(. Where be yer loot?",created:"Created like a legend, savvy",search_extensions:"Search fer extensions",warning:"Avast",repository:"Repository",confirm_continue:"Be ye sure ye want t' proceed?",manage_extension_details:"Install/uninstall extension",install:"Set sail",uninstall:"Avaast",drop_db:"Scuttle Data",enable:"Enable",enable_extension_details:"Enable extension fer th' current user",disable:"Disablin'",installed:"Installed",activated:"Activated",deactivated:"Deactivated",release_notes:"Release Notes",activate_extension_details:"Make extension available/unavailable fer users",featured:"Featured",all:"Arr",only_admins_can_install:"(Only admin accounts can install extensions)",admin_only:"Cap'n Only",new_version:"New Version",extension_depends_on:"Depends on:",extension_rating_soon:"Ratings a'comin' soon",extension_installed_version:"Installed version",extension_uninstall_warning:"Ye be about t' remove th' extension fer all hands.",uninstall_confirm:"Aye, Uninstall",extension_db_drop_info:"All data fer th' extension will be permanently deleted. There be no way to undo this operation!",extension_db_drop_warning:"Ye be about to scuttle all data fer th' extension. Please scribble th' extension name to continue:",extension_min_lnbits_version:"This release be needin' at least LNbits version",payment_hash:"Payment Hash like a treasure map, arrr",fee:"Fee like a toll to cross a strait, matey",amount:"Amount of doubloons, arrr",tag:"Tag",unit:"Unit of measurement like a fathom, ye buccaneer",description:"Description like a tale of adventure, arrr",expiry:"Expiry like the food on a ship, ye landlubber",webhook:"Webhook like a fishing line, arrr",payment_proof:"Payment Proof like a seal of authenticity, argh",update_available:"Update {version} available, me matey!",latest_update:"Ye be on th' latest version {version}.",notifications:"Notificashuns",no_notifications:"No noticin's",notifications_disabled:"LNbits status notifications be disabled, arr!",enable_notifications:"Enable Notifications",enable_notifications_desc:"If ye be allowin' it, it'll be fetchin' the latest LNbits Status updates, like security incidents and updates.",enable_killswitch:"Enabl' th' Killswitch",enable_killswitch_desc:"If enabled it'll be changin' yer fundin' source to VoidWallet automatically if LNbits sends out a killswitch signal, ye will. Ye'll be needin' t' enable manually after an update, arr.",killswitch_interval:"Killswitch Interval",killswitch_interval_desc:"How oft th' background task should be checkin' fer th' LNbits killswitch signal from th' status source (in minutes).",enable_watchdog:"Enable Seadog",enable_watchdog_desc:"If enabled, it will swap yer treasure source t' VoidWallet on its own if yer balance be lower than th' LNbits balance. Ye'll need t' enable by hand after an update.",watchdog_interval:"Seadog Interval",watchdog_interval_desc:"How oft th' background task should be checkin' fer a killswitch signal in th' seadog delta [node_balance - lnbits_balance] (in minutes), arr.",watchdog_delta:"Seadog Delta",watchdog_delta_desc:"Limit afore killswitch changes fundin' source to VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notification Source",notification_source_label:"Source URL (only use th' official LNbits status source, and sources ye can trust)",more:"Arr, 'tis more.",less:"Arr, 'tis more fewer.",releases:"Releases",killswitch:"Killswitch",watchdog:"Seadog",server_logs:"Server Logs",ip_blocker:"IP Blockar",security:"Securrrity",security_tools:"Securrrity tools",block_access_hint:"Block access by IP",allow_access_hint:"Grant permission by IP (will override barred IPs)",enter_ip:"Enter IP and hit enter",rate_limiter:"Rate Limiter",wallet_limiter:"Pouch Limitar",wallet_limit_max_withdraw_per_day:"Max daily wallet withdrawal in sats (0 for no limit, -1 to block withdrawal)",wallet_max_ballance:"Purse max heaviness in sats (0 fer scuttle)",wallet_limit_secs_between_trans:"Min secs 'tween transactions per wallet (0 to disable)",number_of_requests:"Number o' requests",time_unit:"time bein'",minute:"minnit",second:"second",hour:"hour",disable_server_log:"Disabl' {Server} Log",enable_server_log:"Enable Server Log",coming_soon:"Feature comin' soon",session_has_expired:"Yer session has expired. Please login again.",instant_access_question:"Be wantin' quick entry, aye?",login_with_user_id:"Login with user ID",or:"arr",create_new_wallet:"Create New Wallet",login_to_account:"Log in to yer account",create_account:"Create account",account_settings:"Account Settin's",signin_with_google:"Sign in wit' Google",signin_with_github:"Sign in wit' GitHub",signin_with_keycloak:"Sign in wit' Keycloak",username_or_email:"Usarrrname or Email",password:"Passwarrd",password_config:"Passwarrd Config",password_repeat:"Passwarrd repeat",change_password:"Change Passwarrd",set_password:"Set yer Secret Code",invalid_password:"Passwarrd must be havin' at leest 8 charrracters",login:"Log in",register:"Sign on",username:"Username",user_id:"User ID",email:"Email",first_name:"Firrrst Name",last_name:"Surname",picture:"pictur'",verify_email:"Verify email with",account:"Arrrccount",update_account:"Updatin' Arrrccount",invalid_username:"Username be not valid, matey!",auth_provider:"Auth Provider becometh Auth Provider, ye see?",my_account:"Me Arrrccount",back:"Return",logout:"Log out yer session",look_and_feel:"Look and Feel",language:"Langwidge",color_scheme:"Colour Scheme",extension_cost:"This release be needin' a payment o' minimum {cost} sats, arr.",extension_paid_sats:"Ye have already paid {paid_sats} sats.",release_details_error:"Cannot get th' release details.",pay_from_wallet:"Pay from ye Wallet",show_qr:"Show QR",retry_install:"Try 'nstallin' Again",new_payment:"Make New Payment",hide_empty_wallets:"Stow empty wallets"},window.localisation.pl={confirm:"Tak",server:"Serwer",theme:"Motyw",funding:"Finansowanie",users:"Użytkownicy",apps:"Aplikacje",channels:"Kanały",transactions:"Transakcje",dashboard:"Panel kontrolny",node:"Węzeł",export_users:"Eksportuj użytkowników",no_users:"Nie znaleziono użytkowników",total_capacity:"Całkowita Pojemność",avg_channel_size:"Średni rozmiar kanału",biggest_channel_size:"Największy Rozmiar Kanału",smallest_channel_size:"Najmniejszy Rozmiar Kanału",number_of_channels:"Ilość kanałów",active_channels:"Aktywne kanały",connect_peer:"Połącz z węzłem równorzędnym",connect:"Połącz",open_channel:"Otwarty Kanał",open:"Otwórz",close_channel:"Zamknij kanał",close:"Zamknij",restart:"Restart serwera",save:"Zapisz",save_tooltip:"Zapisz zmiany",topup:"Doładowanie",topup_wallet:"Doładuj portfel",topup_hint:"Użyj ID portfela aby go doładować",restart_tooltip:"Zrestartuj serwer aby aktywować zmiany",add_funds_tooltip:"Dodaj środki do portfela.",reset_defaults:"Powrót do ustawień domyślnych",reset_defaults_tooltip:"Wymaż wszystkie ustawienia i ustaw domyślne.",download_backup:"Pobierz kopię zapasową bazy danych",name_your_wallet:"Nazwij swój portfel {name}",wallet_topup_ok:"Sukces w tworzeniu wirtualnych środków ({amount} sats). Płatności zależą od rzeczywistych środków na źródle finansowania.",paste_invoice_label:"Wklej fakturę, żądanie zapłaty lub kod lnurl *",lnbits_description:"Łatwy i lekki w konfiguracji, LNbits może działać w oparciu o dowolne źródło finansowania w sieci lightning czy nawet inną instancję LNbits! Możesz uruchomić instancję LNbits dla siebie lub dla innych. Każdy portfel ma swoje klucze API i nie ma ograniczeń jeśli chodzi o ilość portfeli. LNbits umożliwia dzielenie środków w celu zarządzania nimi, jest również dobrym narzędziem deweloperskim. Rozszerzenia zwiększają funkcjonalność LNbits co umożliwia eksperymentowanie z nowym technologiami w sieci lightning. Tworzenie rozszerzeń jest proste dlatego zachęcamy innych deweloperów do tworzenia dodatkowych funkcjonalności i wysyłanie do nas PR",export_to_phone:"Eksport kodu QR na telefon",export_to_phone_desc:"Ten kod QR zawiera adres URL Twojego portfela z pełnym dostępem do niego. Możesz go zeskanować na swoim telefonie aby otworzyć na nim ten portfel.",wallets:"Portfele",add_wallet:"Dodaj portfel",delete_wallet:"Usuń portfel",delete_wallet_desc:"Ten portfel zostanie usunięty, środków na nim zgromadzonych NIE BĘDZIE MOŻNA ODZYSKAĆ.",rename_wallet:"Zmień nazwę portfela",update_name:"Zaktualizuj nazwę",fiat_tracking:"Śledzenie Fiata",currency:"Waluta",update_currency:"Aktualizuj walutę",press_to_claim:"Naciśnij aby odebrać Bitcoiny",donate:"Podaruj",view_github:"Otwórz GitHub",voidwallet_active:"VoidWallet jest aktywny! Płatności są niemożliwe",use_with_caution:"KORZYSTAJ Z ROZWAGĄ - portfel {name} jest w wersji BETA",service_fee:"Opłata serwisowa: {amount} % za transakcję",service_fee_max:"Opłata serwisowa: {amount} % za transakcję (maks {max} sat)",service_fee_tooltip:"Opłata serwisowa pobierana przez administratora serwera LNbits za każdą wychodzącą transakcję",toggle_darkmode:"Tryb nocny",payment_reactions:"Reakcje na płatność",view_swagger_docs:"Dokumentacja Swagger API",api_docs:"Dokumentacja API",api_keys_api_docs:"Adres URL węzła, klucze API i dokumentacja API",lnbits_version:"Wersja LNbits",runs_on:"Działa na",credit_hint:"Naciśnij Enter aby doładować konto",credit_label:"{denomination} doładowanie",paste:"Wklej",paste_from_clipboard:"Wklej ze schowka",paste_request:"Wklej żądanie",create_invoice:"Utwórz fakturę",camera_tooltip:"Użyj kamery aby zeskanować fakturę lub kod QR",export_csv:"Eksport do CSV",chart_tooltip:"Wykres",pending:"W toku",copy_invoice:"Skopiuj fakturę",withdraw_from:"Wypłać z",cancel:"Anuluj",scan:"Skanuj",read:"Odczytaj",pay:"Zapłać",memo:"Memo",date:"Data",processing_payment:"Przetwarzam płatność...",not_enough_funds:"Brak wystarczających środków!",search_by_tag_memo_amount:"Szukaj po tagu, memo czy wartości",invoice_waiting:"Faktura oczekuje na zapłatę",payment_received:"Otrzymano płatność",payment_sent:"Wysłano płatność",receive:"odbierać",send:"wysłać",outgoing_payment_pending:"Płatność wychodząca w toku",drain_funds:"Opróżnij środki",drain_funds_desc:"To jest kod QR służący do opróżnienia portfela (LNURL-withdraw). Nie udostępniaj go nikomu. Ten kod jest kompatybilny z funkcjami, które umożliwiają wielokrotne żądania aż do zupełnego opróżnienia portfela.",i_understand:"Rozumiem",copy_wallet_url:"Skopiuj URL portfela",disclaimer_dialog_title:"Ważne!",disclaimer_dialog:"Funkcja logowania zostanie uruchomiona w przyszłości. Póki co upewnij się, że zapisałeś adres URL tej strony aby mieć dostęp do tego portfela. Nie udostępniaj adresu tej strony nikomu, kto nie ma mieć do tego portfela dostępu! Ta usługa działa w wersji BETA, nie odpowiadamy za utratę dostępu do środków przez osoby używające LNbits.",no_transactions:"Brak transakcji",manage:"Zarządzaj",extensions:"Rozszerzenia",no_extensions:"Nie masz zainstalowanych żadnych rozszerzeń :(",created:"Utworzono",search_extensions:"Szukaj rozszerzeń",warning:"Ostrzeżenie",repository:"Repozytorium",confirm_continue:"Czy na pewno chcesz kontynuować?",manage_extension_details:"Instaluj/odinstaluj rozszerzenie",install:"Zainstaluj",uninstall:"Odinstaluj",drop_db:"Usuń dane",enable:"Włącz",enable_extension_details:"Włącz rozszerzenie dla aktualnego użytkownika",disable:"Wyłącz",installed:"Zainstalowano",activated:"Aktywowany",deactivated:"Dezaktywowany",release_notes:"Informacje o wydaniu",activate_extension_details:"Udostępnij/nie udostępniaj rozszerzenia użytkownikom",featured:"Polecane",all:"Wszystko",only_admins_can_install:"Tylko konta administratorów mogą instalować rozszerzenia",admin_only:"Tylko dla administratora",new_version:"Nowa wersja",extension_depends_on:"Zależy od:",extension_rating_soon:"Oceny będą dostępne wkrótce",extension_installed_version:"Zainstalowana wersja",extension_uninstall_warning:"Za chwilę usuniesz rozszerzenie dla wszystkich użytkowników.",uninstall_confirm:"Tak, Odinstaluj",extension_db_drop_info:"Wszystkie dane dla rozszerzenia zostaną trwale usunięte. Nie ma sposobu, aby cofnąć tę operację!",extension_db_drop_warning:"Za chwilę usuniesz wszystkie dane dla rozszerzenia. Proszę wpisz nazwę rozszerzenia, aby kontynuować:",extension_min_lnbits_version:"To wymaga przynajmniej wersji LNbits",payment_hash:"Hash Płatności",fee:"Opłata",amount:"Wartość",tag:"Etykieta",unit:"Jednostka",description:"Opis",expiry:"Wygasa",webhook:"Webhook",payment_proof:"Potwierdzenie płatności",update_available:"Aktualizacja {version} dostępna!",latest_update:"Korzystasz z najnowszej wersji {version}.",notifications:"Powiadomienia",no_notifications:"Brak powiadomień",notifications_disabled:"Powiadomienia o statusie LNbits są wyłączone.",enable_notifications:"Włącz powiadomienia",enable_notifications_desc:"Jeśli ta opcja zostanie włączona, będzie pobierać najnowsze informacje o statusie LNbits, takie jak incydenty bezpieczeństwa i aktualizacje.",enable_killswitch:"Włącz Killswitch",enable_killswitch_desc:"Jeśli zostanie włączone, automatycznie zmieni źródło finansowania na VoidWallet, jeśli LNbits wyśle sygnał wyłączający. Po aktualizacji będziesz musiał włączyć to ręcznie.",killswitch_interval:"Interwał wyłącznika awaryjnego",killswitch_interval_desc:"Jak często zadanie w tle powinno sprawdzać sygnał wyłącznika awaryjnego LNbits ze źródła statusu (w minutach).",enable_watchdog:"Włącz Watchdog",enable_watchdog_desc:"Jeśli zostanie włączone, automatycznie zmieni źródło finansowania na VoidWallet, jeśli saldo jest niższe niż saldo LNbits. Po aktualizacji trzeba będzie włączyć ręcznie.",watchdog_interval:"Interwał Watchdog",watchdog_interval_desc:"Jak często zadanie w tle powinno sprawdzać sygnał wyłącznika awaryjnego w delcie strażnika [node_balance - lnbits_balance] (w minutach).",watchdog_delta:"Strażnik Delta",watchdog_delta_desc:"Limit przed aktywacją wyłącznika zmienia źródło finansowania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stan",notification_source:"Źródło powiadomień",notification_source_label:"Adres URL źródła (używaj tylko oficjalnego źródła statusu LNbits oraz źródeł, którym możesz zaufać)",more:"więcej",less:"mniej",releases:"Wydania",killswitch:"Killswitch",watchdog:"Pies gończy",server_logs:"Dzienniki serwera",ip_blocker:"Blokada IP",security:"Bezpieczeństwo",security_tools:"Narzędzia bezpieczeństwa",block_access_hint:"Zablokuj dostęp przez IP",allow_access_hint:"Zezwól na dostęp przez IP (zignoruje zablokowane adresy IP)",enter_ip:"Wpisz adres IP i naciśnij enter",rate_limiter:"Ogranicznik Częstotliwości",wallet_limiter:"Ogranicznik Portfela",wallet_limit_max_withdraw_per_day:"Maksymalna dzienna wypłata z portfela w satoshi (0 aby wyłączyć)",wallet_max_ballance:"Maksymalny stan portfela w satoshi (0 aby wyłączyć)",wallet_limit_secs_between_trans:"Min sekund pomiędzy transakcjami na portfel (0 aby wyłączyć)",number_of_requests:"Liczba żądań",time_unit:"Jednostka czasu",minute:"minuta",second:"sekunda",hour:"godzina",disable_server_log:"Wyłącz log serwera",enable_server_log:"Włącz dziennik serwera",coming_soon:"Funkcja wkrótce będzie dostępna",session_has_expired:"Twoja sesja wygasła. Proszę zaloguj się ponownie.",instant_access_question:"Chcesz mieć natychmiastowy dostęp?",login_with_user_id:"Zaloguj się za pomocą identyfikatora użytkownika",or:"lub",create_new_wallet:"Utwórz nowy portfel",login_to_account:"Zaloguj się do swojego konta",create_account:"Załóż konto",account_settings:"Ustawienia konta",signin_with_google:"Zaloguj się przez Google",signin_with_github:"Zaloguj się przez GitHub",signin_with_keycloak:"Zaloguj się przez Keycloak",username_or_email:"Nazwa użytkownika lub Email",password:"Hasło",password_config:"Konfiguracja Hasła",password_repeat:"Powtórz hasło",change_password:"Zmień hasło",set_password:"Ustaw hasło",invalid_password:"Hasło musi zawierać co najmniej 8 znaków",login:"Logowanie",register:"Zarejestruj",username:"Nazwa użytkownika",user_id:"Identyfikator użytkownika",email:"Email",first_name:"Imię",last_name:"Nazwisko",picture:"Zdjęcie",verify_email:"Zweryfikuj email za pomocą",account:"Konto",update_account:"Aktualizuj konto",invalid_username:"Nieprawidłowa nazwa użytkownika",auth_provider:"Dostawca uwierzytelniania",my_account:"Moje Konto",back:"Wstecz",logout:"Wyloguj",look_and_feel:"Wygląd i zachowanie",language:"Język",color_scheme:"Schemat kolorów",extension_cost:"To niniejsze wydanie wymaga zapłaty minimalnej {cost} satów.",extension_paid_sats:"Już zapłaciłeś {paid_sats} satów.",release_details_error:"Nie można uzyskać szczegółów wydania.",pay_from_wallet:"Zapłać z portfela",show_qr:"Pokaż kod QR",retry_install:"Ponów instalację",new_payment:"Dokonaj nowej płatności",hide_empty_wallets:"Ukryj puste portfele"},window.localisation.fr={confirm:"Oui",server:"Serveur",theme:"Thème",funding:"Financement",users:"Utilisateurs",apps:"Applications",channels:"Canaux",transactions:"Transactions",dashboard:"Tableau de bord",node:"Noeud",export_users:"Exporter les utilisateurs",no_users:"Aucun utilisateur trouvé",total_capacity:"Capacité totale",avg_channel_size:"Taille moyenne du canal",biggest_channel_size:"Taille de canal maximale",smallest_channel_size:"Taille de canal la plus petite",number_of_channels:"Nombre de canaux",active_channels:"Canaux actifs",connect_peer:"Connecter un pair",connect:"Connecter",open_channel:"Ouvrir le canal",open:"Ouvrir",close_channel:"Fermer le canal",close:"Fermer",restart:"Redémarrer le serveur",save:"Enregistrer",save_tooltip:"Enregistrer vos modifications",topup:"Renflouer",topup_wallet:"Reflouer un portefeuille",topup_hint:"Utilisez l'ID du portefeuille pour recharger n'importe quel portefeuille",restart_tooltip:"Redémarrez le serveur pour que les changements prennent effet",add_funds_tooltip:"Ajouter des fonds à un portefeuille.",reset_defaults:"Réinitialiser aux valeurs par défaut",reset_defaults_tooltip:"Supprimer tous les paramètres et les réinitialiser aux valeurs par défaut.",download_backup:"Télécharger la sauvegarde de la base de données",name_your_wallet:"Nommez votre portefeuille {name}",wallet_topup_ok:"Succès de la création de fonds virtuels ({amount} sats). Les paiements dépendent des fonds réels sur la source de financement.",paste_invoice_label:"Coller une facture, une demande de paiement ou un code lnurl *",lnbits_description:"Facile à installer et léger, LNbits peut fonctionner sur n'importe quelle source de financement du réseau Lightning et même LNbits lui-même! Vous pouvez exécuter LNbits pour vous-même ou offrir facilement une solution de gardien pour les autres. Chaque portefeuille a ses propres clés API et il n'y a pas de limite au nombre de portefeuilles que vous pouvez créer. La capacité de partitionner les fonds rend LNbits un outil utile pour la gestion de l'argent et comme outil de développement. Les extensions ajoutent une fonctionnalité supplémentaire à LNbits afin que vous puissiez expérimenter une gamme de technologies de pointe sur le réseau Lightning. Nous avons rendu le développement d'extensions aussi simple que possible et, en tant que projet gratuit et open source, nous encourageons les gens à développer et à soumettre les leurs.",export_to_phone:"Exporter vers le téléphone avec un code QR",export_to_phone_desc:"Ce code QR contient l'URL de votre portefeuille avec un accès complet. Vous pouvez le scanner depuis votre téléphone pour ouvrir votre portefeuille depuis là-bas.",wallets:"Portefeuilles",add_wallet:"Ajouter un nouveau portefeuille",delete_wallet:"Supprimer le portefeuille",delete_wallet_desc:"Ce portefeuille entier sera supprimé et les fonds seront IRRECUPERABLES.",rename_wallet:"Renommer le portefeuille",update_name:"Mettre à jour le nom",fiat_tracking:"Suivi Fiat",currency:"Devise",update_currency:"Mettre à jour la devise",press_to_claim:"Appuyez pour demander du Bitcoin",donate:"Donner",view_github:"Voir sur GitHub",voidwallet_active:"VoidWallet est actif! Paiements désactivés",use_with_caution:"UTILISER AVEC PRUDENCE - Le portefeuille {name} est toujours en version BETA",service_fee:"Frais de service : {amount} % par transaction",service_fee_max:"Frais de service : {amount} % par transaction (max {max} sats)",service_fee_tooltip:"Frais de service facturés par l'administrateur du serveur LNbits pour chaque transaction sortante",toggle_darkmode:"Basculer le mode sombre",payment_reactions:"Réactions de paiement",view_swagger_docs:"Voir les documentation de l'API Swagger de LNbits",api_docs:"Documentation de l'API",api_keys_api_docs:"URL du nœud, clés API et documentation API",lnbits_version:"Version de LNbits",runs_on:"Fonctionne sur",credit_hint:"Appuyez sur Entrée pour créditer le compte",credit_label:"{denomination} à créditer",paste:"Coller",paste_from_clipboard:"Coller depuis le presse-papiers",paste_request:"Coller la requête",create_invoice:"Créer une facture",camera_tooltip:"Utiliser la caméra pour scanner une facture / un code QR",export_csv:"Exporter vers CSV",chart_tooltip:"Afficher le graphique",pending:"En attente",copy_invoice:"Copier la facture",withdraw_from:"Retirer de",cancel:"Annuler",scan:"Scanner",read:"Lire",pay:"Payer",memo:"Mémo",date:"Date",processing_payment:"Traitement du paiement...",not_enough_funds:"Fonds insuffisants !",search_by_tag_memo_amount:"Rechercher par tag, mémo, montant",invoice_waiting:"Facture en attente de paiement",payment_received:"Paiement reçu",payment_sent:"Paiement envoyé",receive:"recevoir",send:"envoyer",outgoing_payment_pending:"Paiement sortant en attente",drain_funds:"Vider les fonds",drain_funds_desc:"Il s'agit d'un code QR LNURL-withdraw pour tout aspirer de ce portefeuille. Ne le partagez avec personne. Il est compatible avec balanceCheck et balanceNotify, de sorte que votre portefeuille peut continuer à retirer les fonds continuellement à partir d'ici après le premier retrait.",i_understand:"J'ai compris",copy_wallet_url:"Copier l'URL du portefeuille",disclaimer_dialog_title:"Important !",disclaimer_dialog:"La fonctionnalité de connexion sera publiée dans une future mise à jour, pour l'instant, assurez-vous de mettre cette page en favori pour accéder à votre portefeuille ultérieurement ! Ce service est en BETA, et nous ne sommes pas responsables des personnes qui perdent l'accès à leurs fonds.",no_transactions:"Aucune transaction effectuée pour le moment",manage:"Gérer",extensions:"Extensions",no_extensions:"Vous n'avez installé aucune extension :(",created:"Créé",search_extensions:"Rechercher des extensions",warning:"Avertissement",repository:"Référentiel",confirm_continue:"Êtes-vous sûr de vouloir continuer ?",manage_extension_details:"Installer/désinstaller l'extension",install:"Installer",uninstall:"Désinstaller",drop_db:"Supprimer les données",enable:"Activer",enable_extension_details:"Activer l'extension pour l'utilisateur actuel",disable:"Désactiver",installed:"Installé",activated:"Activé",deactivated:"Désactivé",release_notes:"Notes de version",activate_extension_details:"Rendre l'extension disponible/indisponible pour les utilisateurs",featured:"Mis en avant",all:"Tout",only_admins_can_install:"Seuls les comptes administrateurs peuvent installer des extensions",admin_only:"Réservé aux administrateurs",new_version:"Nouvelle version",extension_depends_on:"Dépend de :",extension_rating_soon:"Notes des utilisateurs à venir bientôt",extension_installed_version:"Version installée",extension_uninstall_warning:"Vous êtes sur le point de supprimer l'extension pour tous les utilisateurs.",uninstall_confirm:"Oui, Désinstaller",extension_db_drop_info:"Toutes les données pour l'extension seront supprimées de manière permanente. Il n'est pas possible d'annuler cette opération !",extension_db_drop_warning:"Vous êtes sur le point de supprimer toutes les données de l'extension. Veuillez taper le nom de l'extension pour continuer :",extension_min_lnbits_version:"Cette version nécessite au moins LNbits version",payment_hash:"Hash de paiement",fee:"Frais",amount:"Montant",tag:"Étiqueter",unit:"Unité",description:"Description",expiry:"Expiration",webhook:"Webhook",payment_proof:"Preuve de paiement",update_available:"Mise à jour {version} disponible !",latest_update:"Vous êtes sur la dernière version {version}.",notifications:"Notifications",no_notifications:"Aucune notification",notifications_disabled:"Les notifications de statut LNbits sont désactivées.",enable_notifications:"Activer les notifications",enable_notifications_desc:"Si activé, il récupérera les dernières mises à jour du statut LNbits, telles que les incidents de sécurité et les mises à jour.",enable_killswitch:"Activer le Killswitch",enable_killswitch_desc:"Si activé, il changera automatiquement votre source de financement en VoidWallet si LNbits envoie un signal de coupure. Vous devrez activer manuellement après une mise à jour.",killswitch_interval:"Intervalle du Killswitch",killswitch_interval_desc:"À quelle fréquence la tâche de fond doit-elle vérifier le signal d'arrêt d'urgence LNbits provenant de la source de statut (en minutes).",enable_watchdog:"Activer le Watchdog",enable_watchdog_desc:"Si elle est activée, elle changera automatiquement votre source de financement en VoidWallet si votre solde est inférieur au solde LNbits. Vous devrez activer manuellement après une mise à jour.",watchdog_interval:"Intervalle du gardien",watchdog_interval_desc:"À quelle fréquence la tâche en arrière-plan doit-elle vérifier la présence d'un signal d'arrêt d'urgence dans le delta du gardien [node_balance - lnbits_balance] (en minutes).",watchdog_delta:"Chien de garde Delta",watchdog_delta_desc:"Limite avant que l'interrupteur d'arrêt ne change la source de financement pour VoidWallet [lnbits_balance - node_balance > delta]",status:"Statut",notification_source:"Source de notification",notification_source_label:"URL source (utilisez uniquement la source officielle de statut LNbits et des sources de confiance)",more:"plus",less:"moins",releases:"Versions",killswitch:"Interrupteur d'arrêt",watchdog:"Chien de garde",server_logs:"Journaux du serveur",ip_blocker:"Bloqueur d'IP",security:"Sécurité",security_tools:"Outils de sécurité",block_access_hint:"Bloquer l'accès par IP",allow_access_hint:"Autoriser l'accès par IP (cela passera outre les IP bloquées)",enter_ip:"Entrez l'adresse IP et appuyez sur Entrée",rate_limiter:"Limiteur de débit",wallet_limiter:"Limiteur de portefeuille",wallet_limit_max_withdraw_per_day:"Retrait quotidien maximum du portefeuille en sats (0 pour désactiver)",wallet_max_ballance:"Solde maximum du portefeuille en sats (0 pour désactiver)",wallet_limit_secs_between_trans:"Minutes et secondes entre les transactions par portefeuille (0 pour désactiver)",number_of_requests:"Nombre de requêtes",time_unit:"Unité de temps",minute:"minute",second:"seconde",hour:"heure",disable_server_log:"Désactiver le journal du serveur",enable_server_log:"Activer le journal du serveur",coming_soon:"Fonctionnalité à venir bientôt",session_has_expired:"Votre session a expiré. Veuillez vous reconnecter.",instant_access_question:"Voulez-vous un accès instantané ?",login_with_user_id:"Connexion avec l'identifiant utilisateur",or:"ou",create_new_wallet:"Créer un nouveau portefeuille",login_to_account:"Connectez-vous à votre compte",create_account:"Créer un compte",account_settings:"Paramètres du compte",signin_with_google:"Connectez-vous avec Google",signin_with_github:"Connectez-vous avec GitHub",signin_with_keycloak:"Connectez-vous avec Keycloak",username_or_email:"Nom d'utilisateur ou e-mail",password:"Mot de passe",password_config:"Configuration du mot de passe",password_repeat:"Répétition du mot de passe",change_password:"Changer le mot de passe",set_password:"Définir le mot de passe",invalid_password:"Le mot de passe doit comporter au moins 8 caractères",login:"Connexion",register:"Inscrire",username:"Nom d'utilisateur",user_id:"Identifiant utilisateur",email:"E-mail",first_name:"Prénom",last_name:"Nom de famille",picture:"Image",verify_email:"Vérifiez l'e-mail avec",account:"Compte",update_account:"Mettre à jour le compte",invalid_username:"Nom d'utilisateur invalide",auth_provider:"Fournisseur d'authentification",my_account:"Mon compte",back:"Retour",logout:"Déconnexion",look_and_feel:"Apparence",language:"Langue",color_scheme:"Schéma de couleurs",extension_cost:"Cette version nécessite un paiement minimum de {cost} sats.",extension_paid_sats:"Vous avez déjà payé {paid_sats} sats.",release_details_error:"Impossible d'obtenir les détails de la version.",pay_from_wallet:"Payer depuis le portefeuille",show_qr:"Afficher le QR",retry_install:"Réessayer l'installation",new_payment:"Effectuer un nouveau paiement",hide_empty_wallets:"Masquer les portefeuilles vides"},window.localisation.nl={confirm:"Ja",server:"Server",theme:"Thema",funding:"Financiering",users:"Gebruikers",apps:"Apps",channels:"Kanalen",transactions:"Transacties",dashboard:"Dashboard",node:"Knooppunt",export_users:"Gebruikers exporteren",no_users:"Geen gebruikers gevonden",total_capacity:"Totale capaciteit",avg_channel_size:"Gem. Kanaalgrootte",biggest_channel_size:"Grootste Kanaalgrootte",smallest_channel_size:"Kleinste Kanaalgrootte",number_of_channels:"Aantal kanalen",active_channels:"Actieve Kanalen",connect_peer:"Peer verbinden",connect:"Verbinden",open_channel:"Open Kanaal",open:"Open",close_channel:"Kanaal Sluiten",close:"Sluiten",restart:"Server opnieuw opstarten",save:"Opslaan",save_tooltip:"Sla uw wijzigingen op",topup:"Bijvullen",topup_wallet:"Een portemonnee bijvullen",topup_hint:"Gebruik de portemonnee-ID om elke portemonnee bij te vullen",restart_tooltip:"Start de server opnieuw op zodat wijzigingen van kracht worden",add_funds_tooltip:"Voeg geld toe aan een portemonnee.",reset_defaults:"Standaardinstellingen herstellen",reset_defaults_tooltip:"Wis alle instellingen en herstel de standaardinstellingen.",download_backup:"Databaseback-up downloaden",name_your_wallet:"Geef je {name} portemonnee een naam",wallet_topup_ok:"Succes met het aanmaken van virtuele fondsen ({amount} sats). Betalingen zijn afhankelijk van de werkelijke fondsen op de financieringsbron.",paste_invoice_label:"Plak een factuur, betalingsverzoek of lnurl-code*",lnbits_description:"Gemakkelijk in te stellen en lichtgewicht, LNbits kan op elke lightning-netwerkfinancieringsbron draaien en zelfs LNbits zelf! U kunt LNbits voor uzelf laten draaien of gemakkelijk een bewaardersoplossing voor anderen bieden. Elke portemonnee heeft zijn eigen API-sleutels en er is geen limiet aan het aantal portemonnees dat u kunt maken. Het kunnen partitioneren van fondsen maakt LNbits een nuttige tool voor geldbeheer en als ontwikkelingstool. Extensies voegen extra functionaliteit toe aan LNbits, zodat u kunt experimenteren met een reeks toonaangevende technologieën op het bliksemschichtnetwerk. We hebben het ontwikkelen van extensies zo eenvoudig mogelijk gemaakt en als een gratis en opensource-project moedigen we mensen aan om hun eigen ontwikkelingen in te dienen.",export_to_phone:"Exporteren naar telefoon met QR-code",export_to_phone_desc:"Deze QR-code bevat uw portemonnee-URL met volledige toegang. U kunt het vanaf uw telefoon scannen om uw portemonnee van daaruit te openen.",wallets:"Portemonnees",add_wallet:"Een nieuwe portemonnee toevoegen",delete_wallet:"Portemonnee verwijderen",delete_wallet_desc:"Deze hele portemonnee wordt verwijderd, de fondsen worden NIET TERUGGEVONDEN.",rename_wallet:"Portemonnee hernoemen",update_name:"Naam bijwerken",fiat_tracking:"Volgfunctie voor fiat-valuata",currency:"Valuta",update_currency:"Valuta bijwerken",press_to_claim:"Druk om bitcoin te claimen",donate:"Doneren",view_github:"Bekijken op GitHub",voidwallet_active:"VoidWallet is actief! Betalingen uitgeschakeld",use_with_caution:"GEBRUIK MET VOORZICHTIGHEID - {name} portemonnee is nog in BETA",service_fee:"Servicekosten: {amount} % per transactie",service_fee_max:"Servicekosten: {amount} % per transactie (max {max} sats)",service_fee_tooltip:"Transactiekosten in rekening gebracht door de LNbits serverbeheerder per uitgaande transactie",toggle_darkmode:"Donkere modus aan/uit",payment_reactions:"Betalingsreacties",view_swagger_docs:"Bekijk LNbits Swagger API-documentatie",api_docs:"API-documentatie",api_keys_api_docs:"Node URL, API-sleutels en API-documentatie",lnbits_version:"LNbits-versie",runs_on:"Draait op",credit_hint:"Druk op Enter om de rekening te crediteren",credit_label:"{denomination} te crediteren",paste:"Plakken",paste_from_clipboard:"Plakken van klembord",paste_request:"Verzoek plakken",create_invoice:"Factuur aanmaken",camera_tooltip:"Gebruik de camera om een factuur/QR-code te scannen",export_csv:"Exporteer naar CSV",chart_tooltip:"Toon grafiek",pending:"In behandeling",copy_invoice:"Kopieer factuur",withdraw_from:"Opnemen van",cancel:"Annuleren",scan:"Scannen",read:"Lezen",pay:"Betalen",memo:"Memo",date:"Datum",processing_payment:"Verwerking betaling...",not_enough_funds:"Onvoldoende saldo!",search_by_tag_memo_amount:"Zoeken op tag, memo, bedrag",invoice_waiting:"Factuur wachtend op betaling",payment_received:"Betaling ontvangen",payment_sent:"Betaling verzonden",receive:"ontvangen",send:"versturen",outgoing_payment_pending:"Uitgaande betaling in behandeling",drain_funds:"Geld opnemen",drain_funds_desc:"Dit is een LNURL-withdraw QR-code om alles uit deze portemonnee te halen. Deel deze code niet met anderen. Het is compatibel met balanceCheck en balanceNotify zodat jouw portemonnee continu geld kan blijven opnemen vanaf hier na de eerste opname.",i_understand:"Ik begrijp het",copy_wallet_url:"Kopieer portemonnee-URL",disclaimer_dialog_title:"Belangrijk!",disclaimer_dialog:"Inlogfunctionaliteit wordt uitgebracht in een toekomstige update. Zorg er nu voor dat je deze pagina als favoriet markeert om in de toekomst toegang te krijgen tot je portemonnee! Deze service is in BETA en we zijn niet verantwoordelijk voor mensen die de toegang tot hun fondsen verliezen.",no_transactions:"Er zijn nog geen transacties gedaan",manage:"Beheer",extensions:"Extensies",no_extensions:"Je hebt geen extensies geïnstalleerd :(",created:"Aangemaakt",search_extensions:"Zoekextensies",warning:"Waarschuwing",repository:"Repository",confirm_continue:"Weet je zeker dat je wilt doorgaan?",manage_extension_details:"Installeren/verwijderen van extensie",install:"Installeren",uninstall:"Deïnstalleren",drop_db:"Gegevens verwijderen",enable:"Inschakelen",enable_extension_details:"Schakel extensie in voor huidige gebruiker",disable:"Uitschakelen",installed:"Geïnstalleerd",activated:"Geactiveerd",deactivated:"Gedeactiveerd",release_notes:"Release-opmerkingen",activate_extension_details:"Maak extensie beschikbaar/niet beschikbaar voor gebruikers",featured:"Uitgelicht",all:"Alles",only_admins_can_install:"Alleen beheerdersaccounts kunnen extensies installeren",admin_only:"Alleen beheerder",new_version:"Nieuwe Versie",extension_depends_on:"Afhankelijk van:",extension_rating_soon:"Beoordelingen binnenkort beschikbaar",extension_installed_version:"Geïnstalleerde versie",extension_uninstall_warning:"U staat op het punt de extensie voor alle gebruikers te verwijderen.",uninstall_confirm:"Ja, de-installeren",extension_db_drop_info:"Alle gegevens voor de extensie zullen permanent worden verwijderd. Er is geen manier om deze bewerking ongedaan te maken!",extension_db_drop_warning:"U staat op het punt alle gegevens voor de extensie te verwijderen. Typ de naam van de extensie om door te gaan:",extension_min_lnbits_version:"Deze release vereist ten minste LNbits-versie",payment_hash:"Betalings-hash",fee:"Kosten",amount:"Bedrag",tag:"Label",unit:"Eenheid",description:"Beschrijving",expiry:"Vervaldatum",webhook:"Webhook",payment_proof:"Betalingsbewijs",update_available:"Update {version} beschikbaar!",latest_update:"U bent op de nieuwste versie {version}.",notifications:"Meldingen",no_notifications:"Geen meldingen",notifications_disabled:"LNbits-statusmeldingen zijn uitgeschakeld.",enable_notifications:"Schakel meldingen in",enable_notifications_desc:"Indien ingeschakeld zal het de laatste LNbits Status updates ophalen, zoals veiligheidsincidenten en updates.",enable_killswitch:"Activeer Killswitch",enable_killswitch_desc:"Indien ingeschakeld, zal het uw financieringsbron automatisch wijzigen naar VoidWallet als LNbits een killswitch-signaal verzendt. U zult het na een update handmatig moeten inschakelen.",killswitch_interval:"Uitschakelschakelaar-interval",killswitch_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op het LNbits killswitch signaal van de statusbron (in minuten).",enable_watchdog:"Inschakelen Watchdog",enable_watchdog_desc:"Indien ingeschakeld, wordt uw betaalbron automatisch gewijzigd naar VoidWallet als uw saldo lager is dan het saldo van LNbits. U zult dit na een update handmatig moeten inschakelen.",watchdog_interval:"Watchdog-interval",watchdog_interval_desc:"Hoe vaak de achtergrondtaak moet controleren op een killswitch signaal in het watchdog verschil [node_balance - lnbits_balance] (in minuten).",watchdog_delta:"Waakhond Delta",watchdog_delta_desc:"Limiet voordat de killswitch de financieringsbron verandert naar VoidWallet [lnbits_balance - node_balance > delta]",status:"Status",notification_source:"Notificatiebron",notification_source_label:"Bron-URL (gebruik alleen de officiële LNbits-statusbron en bronnen die u vertrouwt)",more:"meer",less:"minder",releases:"Uitgaven",killswitch:"Killswitch",watchdog:"Waakhond",server_logs:"Serverlogboeken",ip_blocker:"IP-blokkering",security:"Beveiliging",security_tools:"Beveiligingstools",block_access_hint:"Toegang blokkeren per IP",allow_access_hint:"Toegang verlenen op basis van IP (zal geblokkeerde IP's overschrijven)",enter_ip:"Voer IP in en druk op enter",rate_limiter:"Snelheidsbegrenzer",wallet_limiter:"Portemonnee Limietsteller",wallet_limit_max_withdraw_per_day:"Maximale dagelijkse opname van wallet in sats (0 om uit te schakelen)",wallet_max_ballance:"Maximale portefeuillesaldo in sats (0 om uit te schakelen)",wallet_limit_secs_between_trans:"Min seconden tussen transacties per portemonnee (0 om uit te schakelen)",number_of_requests:"Aantal verzoeken",time_unit:"Tijdeenheid",minute:"minuut",second:"seconde",hour:"uur",disable_server_log:"Serverlog uitschakelen",enable_server_log:"Activeer Serverlog",coming_soon:"Functie binnenkort beschikbaar",session_has_expired:"Uw sessie is verlopen. Log alstublieft opnieuw in.",instant_access_question:"Wil je directe toegang?",login_with_user_id:"Inloggen met gebruikers-ID",or:"of",create_new_wallet:"Nieuwe portemonnee aanmaken",login_to_account:"Log in op je account",create_account:"Account aanmaken",account_settings:"Accountinstellingen",signin_with_google:"Inloggen met Google",signin_with_github:"Inloggen met GitHub",signin_with_keycloak:"Inloggen met Keycloak",username_or_email:"Gebruikersnaam of e-mail",password:"Wachtwoord",password_config:"Wachtwoordconfiguratie",password_repeat:"Wachtwoord herhalen",change_password:"Wachtwoord wijzigen",set_password:"Wachtwoord instellen",invalid_password:"Wachtwoord moet ten minste 8 tekens bevatten",login:"Inloggen",register:"Registreren",username:"Gebruikersnaam",user_id:"Gebruikers-ID",email:"E-mail",first_name:"Voornaam",last_name:"Achternaam",picture:"Foto",verify_email:"E-mail verifiëren met",account:"Account",update_account:"Account bijwerken",invalid_username:"Ongeldige gebruikersnaam",auth_provider:"Auth Provider",my_account:"Mijn Account",back:"Terug",logout:"Afmelden",look_and_feel:"Uiterlijk en gedrag",language:"Taal",color_scheme:"Kleurenschema",extension_cost:"Deze release vereist een betaling van minimaal {cost} sats.",extension_paid_sats:"U heeft al {paid_sats} sats betaald.",release_details_error:"Kan de gegevens van de release niet ophalen.",pay_from_wallet:"Betalen vanuit Portemonnee",show_qr:"Toon QR",retry_install:"Opnieuw installeren",new_payment:"Nieuwe betaling maken",hide_empty_wallets:"Verberg lege portemonnees"},window.localisation.we={confirm:"Ydw",server:"Gweinydd",theme:"Thema",funding:"Arian fyndio",users:"Defnyddwyr",apps:"Apiau",channels:"Sianelau",transactions:"Trafodion",dashboard:"Panel Gweinyddol",node:"Nod",export_users:"Allfor Defnyddwyr",no_users:"Heb ganfod defnyddwyr",total_capacity:"Capasiti Cyfanswm",avg_channel_size:"Maint Sianel Cyf.",biggest_channel_size:"Maint Sianel Fwyaf",smallest_channel_size:"Maint Sianel Lleiaf",number_of_channels:"Nifer y Sianeli",active_channels:"Sianeli Gweithredol",connect_peer:"Cysylltu â Chymar",connect:"Cysylltu",open_channel:"Sianel Agored",open:"Agor",close_channel:"Cau Sianel",close:"cau",restart:"Ailgychwyn gweinydd",save:"Save",save_tooltip:"cadw eich newidiadau",topup:"Topup",topup_wallet:"Atodi waled",topup_hint:"Defnyddiwch ID y waled i ychwanegu at unrhyw waled",restart_tooltip:"Ailgychwyn y gweinydd er mwyn i newidiadau ddod i rym",add_funds_tooltip:"Ychwanegu arian at waled.",reset_defaults:"Ailosod i`r rhagosodiadau",reset_defaults_tooltip:"Dileu pob gosodiad ac ailosod i`r rhagosodiadau.",download_backup:"Lawrlwytho copi wrth gefn cronfa ddata",name_your_wallet:"Enwch eich waled {name}",wallet_topup_ok:"Llwyddiant wrth greu cronfeydd rhithwir ({amount} sats). Mae taliadau'n dibynnu ar gronfeydd gwirioneddol ar y ffynhonnell cyllido.",paste_invoice_label:"Gludwch anfoneb, cais am daliad neu god lnurl *",lnbits_description:"Yn hawdd iw sefydlu ac yn ysgafn, gall LNbits redeg ar unrhyw ffynhonnell ariannu rhwydwaith mellt a hyd yn oed LNbits ei hun! Gallwch redeg LNbits i chi`ch hun, neu gynnig datrysiad ceidwad i eraill yn hawdd. Mae gan bob waled ei allweddi API ei hun ac nid oes cyfyngiad ar nifer y waledi y gallwch eu gwneud. Mae gallu rhannu cronfeydd yn gwneud LNbits yn arf defnyddiol ar gyfer rheoli arian ac fel offeryn datblygu. Mae estyniadau yn ychwanegu ymarferoldeb ychwanegol at LNbits fel y gallwch arbrofi gydag ystod o dechnolegau blaengar ar y rhwydwaith mellt. Rydym wedi gwneud datblygu estyniadau mor hawdd â phosibl, ac fel prosiect ffynhonnell agored am ddim, rydym yn annog pobl i ddatblygu a chyflwyno eu rhai eu hunain.",export_to_phone:"Allforio i Ffôn gyda chod QR",export_to_phone_desc:"Mae`r cod QR hwn yn cynnwys URL eich waled gyda mynediad llawn. Gallwch ei sganio o`ch ffôn i agor eich waled oddi yno.",wallets:"Waledi",add_wallet:"Ychwanegu waled newydd",delete_wallet:"Dileu waled",delete_wallet_desc:"Bydd y waled gyfan hon yn cael ei dileu, ni fydd modd adennill yr arian.",rename_wallet:"Ailenwi waled",update_name:"Diweddaru enw",fiat_tracking:"Olrhain Fiat",currency:"Arian Cyfred",update_currency:"Diweddaru arian cyfred",press_to_claim:"Pwyswch i hawlio bitcoin",donate:"Rhoi",view_github:"Gweld ar GitHub",voidwallet_active:" Mae VoidWallet yn weithredol! Taliadau wedi`u hanalluogi",use_with_caution:"DEFNYDDIO GYDA GOFAL - mae waled {name} yn dal yn BETA",service_fee:"Ffi gwasanaeth: {amount} % y trafodiad",service_fee_max:"Ffi gwasanaeth: {amount} % y trafodiad (uchafswm {max} sats)",service_fee_tooltip:"Ffi gwasanaeth a godir gan weinyddwr gweinydd LNbits ym mhob trafodiad sy'n mynd allan",toggle_darkmode:"Toglo Modd Tywyll",payment_reactions:"Adweithiau Talu",view_swagger_docs:"Gweld dogfennau API LNbits Swagger",api_docs:"Dogfennau API",api_keys_api_docs:"URL y nod, allweddi API a dogfennau API",lnbits_version:"Fersiwn LNbits",runs_on:"Yn rhedeg ymlaen",credit_hint:"Pwyswch Enter i gyfrif credyd",credit_label:"{denomination} i gredyd",paste:"Gludo",paste_from_clipboard:"Gludo o'r clipfwrdd",paste_request:"Gludo Cais",create_invoice:"Creu Anfoneb",camera_tooltip:"Defnyddio camera i sganio anfoneb/QR",export_csv:"Allforio i CSV",chart_tooltip:"Dangos siart",pending:"yn yr arfaeth",copy_invoice:"Copi anfoneb",withdraw_from:"Tynnu oddi ar",cancel:"Canslo",scan:"Sgan",read:"Darllen",pay:"Talu",memo:"Memo",date:"Dyddiad",processing_payment:"Prosesu taliad...",not_enough_funds:"Dim digon o arian!",search_by_tag_memo_amount:"Chwilio yn ôl tag, memo, swm",invoice_waiting:"Anfoneb yn aros i gael ei thalu",payment_received:"Taliad a Dderbyniwyd",payment_sent:"Taliad a Anfonwyd",receive:"derbyn",send:"anfon",outgoing_payment_pending:"Taliad sy`n aros yn yr arfaeth",drain_funds:"Cronfeydd Draenio",drain_funds_desc:"Cod QR Tynnu`n ôl LNURL yw hwn ar gyfer slurpio popeth o`r waled hon. Peidiwch â rhannu gyda neb. Mae`n gydnaws â balanceCheck a balanceNotify felly efallai y bydd eich waled yn tynnu`r arian yn barhaus o`r fan hon ar ôl y codiad cyntaf.",i_understand:"Rwy`n deall",copy_wallet_url:"Copi URL waled",disclaimer_dialog_title:"Pwysig!",disclaimer_dialog:"Swyddogaeth mewngofnodi i`w ryddhau mewn diweddariad yn y dyfodol, am y tro, gwnewch yn siŵr eich bod yn rhoi nod tudalen ar y dudalen hon ar gyfer mynediad i`ch waled yn y dyfodol! Mae`r gwasanaeth hwn yn BETA, ac nid ydym yn gyfrifol am bobl sy`n colli mynediad at arian.",no_transactions:"Dim trafodion wedi`u gwneud eto",manage:"Rheoli",extensions:"Estyniadau",no_extensions:"Nid oes gennych unrhyw estyniadau wedi'u gosod :(",created:"Crëwyd",search_extensions:"Chwilio estyniadau",warning:"Rhybudd",repository:"Ystorfa",confirm_continue:"Ydych chi'n siŵr eich bod chi eisiau parhau?",manage_extension_details:"Gosod/dadosod estyniad",install:"Gosod",uninstall:"Dadgymhwyso",drop_db:"Dileu Data",enable:"Galluogi",enable_extension_details:"Galluogi estyniad ar gyfer y defnyddiwr presennol",disable:"Analluogi",installed:"Gosodwyd",activated:"Wedi'i actifadu",deactivated:"Anweithredol",release_notes:"Nodiadau Rhyddhau",activate_extension_details:"Gwneud estyniad ar gael/anar gael i ddefnyddwyr",featured:"Nodweddwyd",all:"Pob",only_admins_can_install:"Dim ond cyfrifon gweinyddwr all osod estyniadau",admin_only:"Dim ond Gweinyddwr",new_version:"Fersiwn Newydd",extension_depends_on:"Dibynnu ar:",extension_rating_soon:"Sgôr yn dod yn fuan",extension_installed_version:"Fersiwn wedi'i gosod",extension_uninstall_warning:"Rydych chi ar fin dileu'r estyniad ar gyfer pob defnyddiwr.",uninstall_confirm:"Ie, Dad-osod",extension_db_drop_info:"Bydd yr holl ddata ar gyfer yr estyniad yn cael ei ddileu'n barhaol. Does dim ffordd o dadwneud y weithrediad hwn!",extension_db_drop_warning:"Rydych chi ar fin dileu'r holl ddata ar gyfer yr estyniad. Teipiwch enw'r estyniad i barhau:",extension_min_lnbits_version:"Mae'r rhyddhau hwn yn gofyn o leiaf am fersiwn LNbits",payment_hash:"Hais Taliad",fee:"Fee",amount:"swm",tag:"Tag",unit:"Uned",description:"Disgrifiad",expiry:"dod i ben",webhook:"bachyn we",payment_proof:"prawf taliad",update_available:"Diweddariad {version} ar gael!",latest_update:"Rydych chi ar y fersiwn diweddaraf {version}.",notifications:"Hysbysiadau",no_notifications:"Dim hysbysiadau",notifications_disabled:"Hysbysiadau statws LNbits wedi'u analluogi.",enable_notifications:"Galluogi Hysbysiadau",enable_notifications_desc:"Os bydd wedi'i alluogi bydd yn nôl y diweddariadau Statws LNbits diweddaraf, fel digwyddiadau diogelwch a diweddariadau.",enable_killswitch:"Galluogi Killswitch",enable_killswitch_desc:"Os bydd yn galluogi, bydd yn newid eich ffynhonnell arian i VoidWallet yn awtomatig os bydd LNbits yn anfon arwydd killswitch. Bydd angen i chi alluogi â llaw ar ôl diweddariad.",killswitch_interval:"Amlder Cyllell Dorri",killswitch_interval_desc:"Pa mor aml y dylai'r dasg gefndir wirio am signal killswitch LNbits o'r ffynhonnell statws (mewn munudau).",enable_watchdog:"Galluogi Watchdog",enable_watchdog_desc:"Os bydd yn cael ei alluogi bydd yn newid eich ffynhonnell ariannu i VoidWallet yn awtomatig os bydd eich balans yn is na balans LNbits. Bydd angen i chi alluogi â llaw ar ôl diweddariad.",watchdog_interval:"Amserlennu Gwylio",watchdog_interval_desc:"Pa mor aml y dylai'r dasg gefndir wirio am signal torri yn y gwarchodfa delta [node_balance - lnbits_balance] (mewn munudau).",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Terfyn cyn i'r switshladd newid ffynhonnell ariannu i VoidWallet [lnbits_balance - node_balance > delta]",status:"Statws",notification_source:"Ffynhonnell Hysbysiad",notification_source_label:"URL Ffynhonnell (defnyddiwch yn unig ffynhonnell statws swyddogol LNbits, a ffynonellau y gallwch ymddiried ynddynt)",more:"mwy",less:"llai",releases:"Rhyddhau",killswitch:"Killswitch",watchdog:"Gwyliwr",server_logs:"Logiau Gweinydd",ip_blocker:"Rheolydd IP",security:"Diogelwch",security_tools:"Offer teclynnau diogelwch",block_access_hint:"Atal mynediad gan IP",allow_access_hint:"Caniatáu mynediad gan IP (bydd yn diystyru IPs sydd wedi'u blocio)",enter_ip:"Rhowch IP a gwasgwch enter",rate_limiter:"Cyfyngydd Cyfradd",wallet_limiter:"Cyfyngwr Waled",wallet_limit_max_withdraw_per_day:"Uchafswm tynnu’n ôl waled dyddiol mewn sats (0 i analluogi)",wallet_max_ballance:"Uchafswm balans y waled mewn sats (0 i analluogi)",wallet_limit_secs_between_trans:"Eiliadau lleiaf rhwng trafodion fesul waled (0 i analluogi)",number_of_requests:"Nifer y ceisiadau",time_unit:"Uned amser",minute:"munud",second:"ail",hour:"awr",disable_server_log:"Analluogi Log Gweinydd",enable_server_log:"Galluogi Log Gweinydd",coming_soon:"Nodwedd yn dod yn fuan",session_has_expired:"Mae eich sesiwn wedi dod i ben. Mewngofnodwch eto.",instant_access_question:"Eisiau mynediad ar unwaith?",login_with_user_id:"Mewngofnodi gyda ID y defnyddiwr",or:"neu",create_new_wallet:"Creu Waled Newydd",login_to_account:"Mewngofnodwch i'ch cyfrif",create_account:"Creu cyfrif",account_settings:"Gosodiadau Cyfrif",signin_with_google:"Mewngofnodi gyda Google",signin_with_github:"Mewngofnodi gyda GitHub",signin_with_keycloak:"Mewngofnodi gyda Keycloak",username_or_email:"Defnyddiwr neu E-bost",password:"Cyfrinair",password_config:"Ffurfweddiad Cyfrinair",password_repeat:"Ailadrodd cyfrinair",change_password:"Newid Cyfrinair",set_password:"Gosod Cyfrinair",invalid_password:"Rhaid i'r cyfrinair gynnwys o leiaf 8 nod.",login:"Mewngofnodi",register:"Cofrestru",username:"Enw defnyddiwr",user_id:"ID Defnyddiwr",email:"E-bost",first_name:"Enw Cyntaf",last_name:"Cyfenw",picture:"Llun",verify_email:"Gwirio e-bost gyda",account:"Cyfrif",update_account:"Diweddaru Cyfrif",invalid_username:"Enw Defnyddiwr Annilys",auth_provider:"Darparwr Dilysiad",my_account:"Fy Nghyfrif",back:"Yn ôl",logout:"Allgofnodi",look_and_feel:"Edrych a Theimlo",language:"Iaith",color_scheme:"Cynllun Lliw",extension_cost:"Mae'r rhyddhad hwn yn gofyn am daliad o leiaf {cost} sats.",extension_paid_sats:"Rydych chi eisoes wedi talu {paid_sats} sats.",release_details_error:"Methu cael manylion y rhyddhau.",pay_from_wallet:"Talu o'r Waled",show_qr:"Dangos QR",retry_install:"Ailgeisio Gosod",new_payment:"Gwneud Taliad Newydd",hide_empty_wallets:"Cuddio waledau gwag"},window.localisation.pt={confirm:"Sim",server:"Servidor",theme:"Tema",funding:"Financiamento",users:"Usuários",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho Médio do Canal",biggest_channel_size:"Maior Tamanho do Canal",smallest_channel_size:"Menor Tamanho de Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Aberto",open:"Abrir",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",save:"Gravar",save_tooltip:"Gravar as alterações",topup:"Reforçar conta",topup_wallet:"Recarregar uma carteira",topup_hint:"Use o ID da carteira para recarregar qualquer carteira",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup da base de dados",name_your_wallet:"Nomeie sua carteira {name}",wallet_topup_ok:"Sucesso ao criar fundos virtuais ({amount} sats). Os pagamentos dependem dos fundos reais na fonte de financiamento.",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",wallets:"Carteiras",add_wallet:"Adicionar nova carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",use_with_caution:"USE COM CAUTELA - a carteira {name} ainda está em BETA",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_max:"Taxa de serviço: {amount} % por transação (máximo de {max} sats)",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Nó, chaves de API e documentação de API",lnbits_version:"Versão do LNbits",runs_on:"Executa em",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",paste:"Colar",paste_from_clipboard:"Colar da área de transferência",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Retirar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",pay:"Pagar",memo:"Memo",date:"Data",processing_payment:"Processando pagamento...",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento de saída pendente",drain_funds:"Esvasiar carteira",drain_funds_desc:"Este é um código QR de saque LNURL para sacar tudo desta carteira. Não o partilhe com ninguém. É compatível com balanceCheck e balanceNotify para que a sua carteira possa continuar levantando os fundos continuamente daqui após o primeiro saque.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada numa atualização futura, por enquanto, certifique-se que marca esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerir",extensions:"Extensões",no_extensions:"Não há nenhuma extensão instalada :(",created:"Criado",search_extensions:"Pesquisar extensões",warning:"Aviso",repository:"Repositório",confirm_continue:"Tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",release_notes:"Notas de Lançamento",activate_extension_details:"Torne a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Todos",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",admin_only:"Apenas para administradores",new_version:"Nova Versão",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_min_lnbits_version:"Esta versão requer pelo menos a versão LNbits",payment_hash:"Hash de pagamento",fee:"Taxa",amount:"Quantidade",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",payment_proof:"Comprovativo de pagamento",update_available:"Atualização {version} disponível!",latest_update:"Você está na última versão {version}.",notifications:"Notificações",no_notifications:"Sem notificações",notifications_disabled:"As notificações de status do LNbits estão desativadas.",enable_notifications:"Ativar Notificações",enable_notifications_desc:"Se ativado, ele buscará as últimas atualizações de status do LNbits, como incidentes de segurança e atualizações.",enable_killswitch:"Ativar Killswitch",enable_killswitch_desc:"Se ativado, ele mudará sua fonte de financiamento para VoidWallet automaticamente se o LNbits enviar um sinal de desativação. Você precisará ativar manualmente após uma atualização.",killswitch_interval:"Intervalo do Killswitch",killswitch_interval_desc:"Com que frequência a tarefa de fundo deve verificar o sinal de desativação do LNbits proveniente da fonte de status (em minutos).",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, mudará automaticamente a sua fonte de financiamento para VoidWallet caso o seu saldo seja inferior ao saldo LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de desligamento no delta do watchdog [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes que o killswitch altere a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de Origem (use apenas a fonte oficial de status do LNbits e fontes em que confia)",more:"mais",less:"menos",releases:"Lançamentos",killswitch:"Interruptor de desativação",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá IPs bloqueados)",enter_ip:"Digite o IP e pressione enter.",rate_limiter:"Limitador de Taxa",wallet_limiter:"Limitador de Carteira",wallet_limit_max_withdraw_per_day:"Limite diário máximo de saque da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos seg. entre transações por carteira (0 para desativar)",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Log do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Entrar com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com o GitHub",signin_with_keycloak:"Entrar com o Keycloak",username_or_email:"Nome de usuário ou Email",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",change_password:"Alterar Senha",set_password:"Definir Senha",invalid_password:"A senha deve ter pelo menos 8 caracteres",login:"Entrar",register:"Registrar",username:"Nome de usuário",user_id:"ID do Usuário",email:"E-mail",first_name:"Nome próprio",last_name:"Sobrenome",picture:"Foto",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",my_account:"Minha Conta",back:"Voltar",logout:"Sair",look_and_feel:"Aparência e Sensação",language:"Idioma",color_scheme:"Esquema de Cores",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pague da Carteira",show_qr:"Exibir QR",retry_install:"Reinstalar Tente Novamente",new_payment:"Realizar Novo Pagamento",hide_empty_wallets:"Ocultar carteiras vazias"},window.localisation.br={confirm:"Sim",server:"Servidor",theme:"Tema",funding:"Financiamento",users:"Usuários",apps:"Aplicativos",channels:"Canais",transactions:"Transações",dashboard:"Painel de Controle",node:"Nó",export_users:"Exportar Usuários",no_users:"Nenhum usuário encontrado",total_capacity:"Capacidade Total",avg_channel_size:"Tamanho médio do canal",biggest_channel_size:"Maior Tamanho de Canal",smallest_channel_size:"Tamanho Mínimo do Canal",number_of_channels:"Número de Canais",active_channels:"Canais Ativos",connect_peer:"Conectar Par",connect:"Conectar",open_channel:"Canal Aberto",open:"Abrir",close_channel:"Fechar Canal",close:"Fechar",restart:"Reiniciar servidor",save:"Salvar",save_tooltip:"Salvar suas alterações",topup:"Recarregar",topup_wallet:"Recarregar uma carteira",topup_hint:"Use o ID da carteira para recarregar qualquer carteira",restart_tooltip:"Reinicie o servidor para que as alterações tenham efeito",add_funds_tooltip:"Adicionar fundos a uma carteira.",reset_defaults:"Redefinir para padrões",reset_defaults_tooltip:"Apagar todas as configurações e redefinir para os padrões.",download_backup:"Fazer backup do banco de dados",name_your_wallet:"Nomeie sua carteira {name}",wallet_topup_ok:"Sucesso ao criar fundos virtuais ({amount} sats). Pagamentos dependem dos fundos reais na fonte de financiamento.",paste_invoice_label:"Cole uma fatura, pedido de pagamento ou código lnurl *",lnbits_description:"Fácil de configurar e leve, o LNbits pode ser executado em qualquer fonte de financiamento da Lightning Network e até mesmo o LNbits em si! Você pode executar o LNbits para si mesmo ou oferecer facilmente uma solução de custódia para outros. Cada carteira tem suas próprias chaves de API e não há limite para o número de carteiras que você pode criar. Ser capaz de particionar fundos torna o LNbits uma ferramenta útil para gerenciamento de dinheiro e como uma ferramenta de desenvolvimento. As extensões adicionam funcionalidades extras ao LNbits para que você possa experimentar uma série de tecnologias de ponta na rede lightning. Nós tornamos o desenvolvimento de extensões o mais fácil possível e, como um projeto gratuito e de código aberto, incentivamos as pessoas a desenvolver e enviar as suas próprias.",export_to_phone:"Exportar para o telefone com código QR",export_to_phone_desc:"Este código QR contém a URL da sua carteira com acesso total. Você pode escaneá-lo do seu telefone para abrir sua carteira a partir dele.",wallets:"Carteiras",add_wallet:"Adicionar nova carteira",delete_wallet:"Excluir carteira",delete_wallet_desc:"Toda a carteira será excluída, os fundos serão IRRECUPERÁVEIS.",rename_wallet:"Renomear carteira",update_name:"Atualizar nome",fiat_tracking:"Rastreamento Fiat",currency:"Moeda",update_currency:"Atualizar moeda",press_to_claim:"Pressione para solicitar bitcoin",donate:"Doar",view_github:"Ver no GitHub",voidwallet_active:"VoidWallet está ativo! Pagamentos desabilitados",use_with_caution:"USE COM CAUTELA - a carteira {name} ainda está em BETA",service_fee:"Taxa de serviço: {amount} % por transação",service_fee_max:"Taxa de serviço: {amount} % por transação (máx {max} sats)",service_fee_tooltip:"Taxa de serviço cobrada pelo administrador do servidor LNbits por transação de saída",toggle_darkmode:"Alternar modo escuro",payment_reactions:"Reações de Pagamento",view_swagger_docs:"Ver a documentação da API do LNbits Swagger",api_docs:"Documentação da API",api_keys_api_docs:"URL do Node, chaves da API e documentação da API",lnbits_version:"Versão do LNbits",runs_on:"Executa em",credit_hint:"Pressione Enter para creditar a conta",credit_label:"{denomination} para creditar",paste:"Colar",paste_from_clipboard:"Cole do clipboard",paste_request:"Colar Pedido",create_invoice:"Criar Fatura",camera_tooltip:"Usar a câmara para escanear uma fatura / QR",export_csv:"Exportar para CSV",chart_tooltip:"Mostrar gráfico",pending:"Pendente",copy_invoice:"Copiar fatura",withdraw_from:"Sacar de",cancel:"Cancelar",scan:"Escanear",read:"Ler",pay:"Pagar",memo:"Memo",date:"Data",processing_payment:"Processando pagamento...",not_enough_funds:"Fundos insuficientes!",search_by_tag_memo_amount:"Pesquisar por tag, memo, quantidade",invoice_waiting:"Fatura aguardando pagamento",payment_received:"Pagamento Recebido",payment_sent:"Pagamento Enviado",receive:"receber",send:"enviar",outgoing_payment_pending:"Pagamento pendente de saída",drain_funds:"Drenar Fundos",drain_funds_desc:"Este é um código QR de retirada do LNURL para sugar tudo desta carteira. Não compartilhe com ninguém. É compatível com balanceCheck e balanceNotify para que sua carteira possa continuar retirando os fundos continuamente daqui após a primeira retirada.",i_understand:"Eu entendo",copy_wallet_url:"Copiar URL da carteira",disclaimer_dialog_title:"Importante!",disclaimer_dialog:"Funcionalidade de login a ser lançada em uma atualização futura, por enquanto, certifique-se de marcar esta página para acesso futuro à sua carteira! Este serviço está em BETA, e não nos responsabilizamos por pessoas que perderem o acesso aos fundos.",no_transactions:"Ainda não foram feitas transações",manage:"Gerenciar",extensions:"Extensões",no_extensions:"Você não possui nenhuma extensão instalada :(",created:"Criado",search_extensions:"Extensões de pesquisa",warning:"Aviso",repository:"Repositório",confirm_continue:"Você tem certeza de que deseja continuar?",manage_extension_details:"Instalar/desinstalar extensão",install:"Instalar",uninstall:"Desinstalar",drop_db:"Remover Dados",enable:"Ativar",enable_extension_details:"Ativar extensão para o usuário atual",disable:"Desativar",installed:"Instalado",activated:"Ativado",deactivated:"Desativado",release_notes:"Notas de Lançamento",activate_extension_details:"Tornar a extensão disponível/indisponível para usuários",featured:"Destacado",all:"Tudo",only_admins_can_install:"Apenas contas de administrador podem instalar extensões.",admin_only:"Apenas para Administração",new_version:"Nova Versão",extension_depends_on:"Depende de:",extension_rating_soon:"Avaliações estarão disponíveis em breve",extension_installed_version:"Versão instalada",extension_uninstall_warning:"Você está prestes a remover a extensão para todos os usuários.",uninstall_confirm:"Sim, Desinstalar",extension_db_drop_info:"Todos os dados da extensão serão permanentemente excluídos. Não há como desfazer essa operação!",extension_db_drop_warning:"Você está prestes a remover todos os dados para a extensão. Por favor, digite o nome da extensão para continuar:",extension_min_lnbits_version:"Esta versão requer no mínimo a versão do LNbits",payment_hash:"Hash de pagamento",fee:"Taxa",amount:"Quantidade",tag:"Etiqueta",unit:"Unidade",description:"Descrição",expiry:"Validade",webhook:"Webhook",payment_proof:"Comprovante de pagamento",update_available:"Atualização {version} disponível!",latest_update:"Você está na versão mais recente {version}.",notifications:"Notificações",no_notifications:"Sem notificações",notifications_disabled:"As notificações de status do LNbits estão desativadas.",enable_notifications:"Ativar notificações",enable_notifications_desc:"Se ativado, ele buscará as últimas atualizações de status do LNbits, como incidentes de segurança e atualizações.",enable_killswitch:"Ativar Killswitch",enable_killswitch_desc:"Se ativado, mudará sua fonte de fundos para VoidWallet automaticamente se o LNbits enviar um sinal de desativação. Você precisará ativar manualmente após uma atualização.",killswitch_interval:"Intervalo do Killswitch",killswitch_interval_desc:"Com que frequência a tarefa de fundo deve verificar o sinal de desativação do LNbits proveniente da fonte de status (em minutos).",enable_watchdog:"Ativar Watchdog",enable_watchdog_desc:"Se ativado, ele mudará automaticamente sua fonte de financiamento para VoidWallet se o seu saldo for inferior ao saldo do LNbits. Você precisará ativar manualmente após uma atualização.",watchdog_interval:"Intervalo do Watchdog",watchdog_interval_desc:"Com que frequência a tarefa de fundo deve verificar um sinal de interrupção no delta do monitor [node_balance - lnbits_balance] (em minutos).",watchdog_delta:"Observador Delta",watchdog_delta_desc:"Limite antes da mudança do mecanismo de segurança alterar a fonte de financiamento para VoidWallet [lnbits_balance - node_balance > delta]",status:"Estado",notification_source:"Fonte de Notificação",notification_source_label:"URL de origem (use apenas a fonte de status oficial do LNbits e fontes de confiança)",more:"mais",less:"menos",releases:"Lançamentos",killswitch:"Dispositivo de desativação",watchdog:"Cão de guarda",server_logs:"Registros do Servidor",ip_blocker:"Bloqueador de IP",security:"Segurança",security_tools:"Ferramentas de segurança",block_access_hint:"Bloquear acesso por IP",allow_access_hint:"Permitir acesso por IP (substituirá os IPs bloqueados)",enter_ip:"Digite o IP e pressione enter",rate_limiter:"Limitador de Taxa",wallet_limiter:"Limitador de Carteira",wallet_limit_max_withdraw_per_day:"Retirada máxima diária da carteira em sats (0 para desativar)",wallet_max_ballance:"Saldo máximo da carteira em sats (0 para desativar)",wallet_limit_secs_between_trans:"Minutos e segundos entre transações por carteira (0 para desativar)",number_of_requests:"Número de solicitações",time_unit:"Unidade de tempo",minute:"minuto",second:"segundo",hour:"hora",disable_server_log:"Desativar Log do Servidor",enable_server_log:"Ativar Registro do Servidor",coming_soon:"Funcionalidade em breve",session_has_expired:"Sua sessão expirou. Por favor, faça login novamente.",instant_access_question:"Quer acesso imediato?",login_with_user_id:"Faça login com ID do usuário",or:"ou",create_new_wallet:"Criar Nova Carteira",login_to_account:"Faça login na sua conta",create_account:"Criar conta",account_settings:"Configurações da Conta",signin_with_google:"Entrar com o Google",signin_with_github:"Entrar com GitHub",signin_with_keycloak:"Entrar com Keycloak",username_or_email:"Nome de usuário ou E-mail",password:"Senha",password_config:"Configuração de Senha",password_repeat:"Repetição de senha",change_password:"Alterar Senha",set_password:"Definir Senha",invalid_password:"A senha deve ter pelo menos 8 caracteres",login:"Entrar",register:"Registrar",username:"Nome de usuário",user_id:"ID do Usuário",email:"E-mail",first_name:"Primeiro Nome",last_name:"Sobrenome",picture:"Foto",verify_email:"Verifique o e-mail com",account:"Conta",update_account:"Atualizar Conta",invalid_username:"Nome de usuário inválido",auth_provider:"Provedor de Autenticação",my_account:"Minha Conta",back:"Voltar",logout:"Sair",look_and_feel:"Aparência",language:"Idioma",color_scheme:"Esquema de Cores",extension_cost:"Este lançamento requer um pagamento mínimo de {cost} sats.",extension_paid_sats:"Você já pagou {paid_sats} sats.",release_details_error:"Não é possível obter os detalhes da versão.",pay_from_wallet:"Pagar com a Carteira",show_qr:"Exibir QR",retry_install:"Repetir Instalação",new_payment:"Efetuar Novo Pagamento",hide_empty_wallets:"Ocultar carteiras vazias"},window.localisation.cs={confirm:"Ano",server:"Server",theme:"Téma",funding:"Financování",users:"Uživatelé",apps:"Aplikace",channels:"Kanály",transactions:"Transakce",dashboard:"Přehled",node:"Uzel",export_users:"Exportovat uživatele",no_users:"Nebyli nalezeni žádní uživatelé",total_capacity:"Celková kapacita",avg_channel_size:"Průmerná velikost kanálu",biggest_channel_size:"Největší velikost kanálu",smallest_channel_size:"Nejmenší velikost kanálu",number_of_channels:"Počet kanálů",active_channels:"Aktivní kanály",connect_peer:"Připojit peer",connect:"Připojit",open_channel:"Otevřít kanál",open:"Otevřít",close_channel:"Zavřít kanál",close:"Zavřít",restart:"Restartovat server",save:"Uložit",save_tooltip:"Uložit změny",topup:"Dobít",topup_wallet:"Dobít peněženku",topup_hint:"Použijte ID peněženky pro dobíjení jakékoliv peněženky",restart_tooltip:"Restartujte server pro aplikaci změn",add_funds_tooltip:"Přidat prostředky do peněženky.",reset_defaults:"Obnovit výchozí",reset_defaults_tooltip:"Smazat všechna nastavení a obnovit výchozí.",download_backup:"Stáhnout zálohu databáze",name_your_wallet:"Pojmenujte svou {name} peněženku",wallet_topup_ok:"Úspěšně vytvořeny virtuální prostředky ({amount} sats). Platby závisí na skutečných prostředcích na zdrojovém účtu.",paste_invoice_label:"Vložte fakturu, platební požadavek nebo lnurl kód *",lnbits_description:"Snadno nastavitelný a lehkotonážní, LNbits může běžet na jakémkoliv zdroji financování Lightning Network a dokonce LNbits samotné! LNbits můžete provozovat pro sebe, nebo snadno nabízet správu peněženek pro ostatní. Každá peněženka má své vlastní API klíče a není omezen počet peněženek, které můžete vytvořit. Možnost rozdělení prostředků dělá z LNbits užitečný nástroj pro správu peněz a jako vývojový nástroj. Rozšíření přidávají extra funkčnost k LNbits, takže můžete experimentovat s řadou špičkových technologií na lightning network. Vývoj rozšíření jsme učinili co nejjednodušší a jako svobodný a open-source projekt podporujeme lidi ve vývoji a zasílání vlastních rozšíření.",export_to_phone:"Exportovat do telefonu pomocí QR kódu",export_to_phone_desc:"Tento QR kód obsahuje URL vaší peněženky s plným přístupem. Můžete jej naskenovat z telefonu a otevřít peněženku odtamtud.",wallets:"Peněženky",add_wallet:"Přidat novou peněženku",delete_wallet:"Smazat peněženku",delete_wallet_desc:"Celá peněženka bude smazána, prostředky budou NEOBNOVITELNÉ.",rename_wallet:"Přejmenovat peněženku",update_name:"Aktualizovat název",fiat_tracking:"Sledování fiatu",currency:"Měna",update_currency:"Aktualizovat měnu",press_to_claim:"Stiskněte pro nárokování bitcoinu",donate:"Darovat",view_github:"Zobrazit na GitHubu",voidwallet_active:"VoidWallet je aktivní! Platby zakázány",use_with_caution:"POUŽÍVEJTE S OBEZŘETNOSTÍ - {name} peněženka je stále v BETĚ",service_fee:"Servisný poplatek: {amount} % za transakci",service_fee_max:"Servisný poplatek: {amount} % za transakci (max {max} satoshi)",service_fee_tooltip:"Servisní poplatek účtovaný správcem LNbits serveru za odchozí transakci",toggle_darkmode:"Přepnout tmavý režim",payment_reactions:"Reakce na platby",view_swagger_docs:"Zobrazit LNbits Swagger API dokumentaci",api_docs:"API dokumentace",api_keys_api_docs:"Adresa uzlu, API klíče a API dokumentace",lnbits_version:"Verze LNbits",runs_on:"Běží na",credit_hint:"Stiskněte Enter pro připsání na účet",credit_label:"{denomination} k připsání",paste:"Vložit",paste_from_clipboard:"Vložit ze schránky",paste_request:"Vložit požadavek",create_invoice:"Vytvořit fakturu",camera_tooltip:"Použijte kameru pro skenování faktury/QR",export_csv:"Exportovat do CSV",chart_tooltip:"Zobrazit graf",pending:"Čeká na vyřízení",copy_invoice:"Kopírovat fakturu",withdraw_from:"Vybrat z",cancel:"Zrušit",scan:"Skenovat",read:"Číst",pay:"Platit",memo:"Poznámka",date:"Datum",processing_payment:"Zpracování platby...",not_enough_funds:"Nedostatek prostředků!",search_by_tag_memo_amount:"Hledat podle tagu, poznámky, částky",invoice_waiting:"Faktura čeká na platbu",payment_received:"Platba přijata",payment_sent:"Platba odeslána",receive:"přijmout",send:"odeslat",outgoing_payment_pending:"Odchozí platba čeká na vyřízení",drain_funds:"Vyčerpat prostředky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pro vyčerpání všeho z této peněženky. Nesdílejte s nikým. Je kompatibilní s balanceCheck a balanceNotify, takže vaše peněženka může kontinuálně čerpat prostředky odsud po prvním výběru.",i_understand:"Rozumím",copy_wallet_url:"Kopírovat URL peněženky",disclaimer_dialog_title:"Důležité!",disclaimer_dialog:"Funkcionalita přihlášení bude vydána v budoucí aktualizaci, zatím si ujistěte, že jste si tuto stránku uložili do záložek pro budoucí přístup k vaší peněžence! Tato služba je v BETA verzi a nepřebíráme žádnou zodpovědnost za ztrátu přístupu k prostředkům.",no_transactions:"Zatím žádné transakce",manage:"Spravovat",extensions:"Rozšíření",no_extensions:"Nemáte nainstalováno žádné rozšíření :(",created:"Vytvořeno",search_extensions:"Hledat rozšíření",warning:"Varování",repository:"Repositář",confirm_continue:"Jste si jistí, že chcete pokračovat?",manage_extension_details:"Instalovat/odinstalovat rozšíření",install:"Instalovat",uninstall:"Odinstalovat",drop_db:"Odstranit data",enable:"Povolit",enable_extension_details:"Povolit rozšíření pro aktuálního uživatele",disable:"Zakázat",installed:"Nainstalováno",activated:"Aktivováno",deactivated:"Deaktivováno",release_notes:"Poznámky k vydání",activate_extension_details:"Zpřístupnit/zakázat rozšíření pro uživatele",featured:"Doporučené",all:"Vše",only_admins_can_install:"(Pouze administrátorské účty mohou instalovat rozšíření)",admin_only:"Pouze pro adminy",new_version:"Nová verze",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnocení brzy dostupné",extension_installed_version:"Nainstalovaná verze",extension_uninstall_warning:"Chystáte se odstranit rozšíření pro všechny uživatele.",uninstall_confirm:"Ano, odinstalovat",extension_db_drop_info:"Všechna data pro rozšíření budou trvale odstraněna. Tuto operaci nelze vrátit zpět!",extension_db_drop_warning:"Chystáte se odstranit všechna data pro rozšíření. Prosím, pokračujte zadáním názvu rozšíření:",extension_min_lnbits_version:"Toto vydání vyžaduje alespoň verzi LNbits",payment_hash:"Hash platby",fee:"Poplatek",amount:"Částka",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirace",webhook:"Webhook",payment_proof:"Důkaz platby",update_available:"Dostupná aktualizace {version}!",latest_update:"Máte nejnovější verzi {version}.",notifications:"Notifikace",no_notifications:"Žádné notifikace",notifications_disabled:"Notifikace stavu LNbits jsou zakázány.",enable_notifications:"Povolit notifikace",enable_notifications_desc:"Pokud je povoleno, bude stahovat nejnovější aktualizace stavu LNbits, jako jsou bezpečnostní incidenty a aktualizace.",enable_killswitch:"Povolit Killswitch",enable_killswitch_desc:"Pokud je povoleno, automaticky změní zdroj financování na VoidWallet pokud LNbits odešle signál killswitch. Po aktualizaci budete muset povolit ručně.",killswitch_interval:"Interval Killswitch",killswitch_interval_desc:"Jak často by měl úkol na pozadí kontrolovat signál killswitch od LNbits ze zdroje stavu (v minutách).",enable_watchdog:"Povolit Watchdog",enable_watchdog_desc:"Pokud je povoleno, automaticky změní zdroj financování na VoidWallet pokud je váš zůstatek nižší než zůstatek LNbits. Po aktualizaci budete muset povolit ručně.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Jak často by měl úkol na pozadí kontrolovat signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minutách).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit předtím, než killswitch změní zdroj financování na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikací",notification_source_label:"URL zdroje (používejte pouze oficiální zdroj stavu LNbits a zdroje, kterým můžete věřit)",more:"více",less:"méně",releases:"Vydání",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Logy serveru",ip_blocker:"Blokování IP",security:"Bezpečnost",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovat přístup podle IP",allow_access_hint:"Povolit přístup podle IP (přepíše blokované IP)",enter_ip:"Zadejte IP a stiskněte enter",rate_limiter:"Omezovač počtu požadavků",wallet_limiter:"Omezení peněženky",wallet_limit_max_withdraw_per_day:"Maximální denní limit pro výběr z peněženky v sats (0 pro deaktivaci)",wallet_max_ballance:"Maximální zůstatek v peněžence v sats (0 pro zakázání)",wallet_limit_secs_between_trans:"Minimální počet sekund mezi transakcemi na peněženku (0 pro vypnutí)",number_of_requests:"Počet požadavků",time_unit:"Časová jednotka",minute:"minuta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázat log serveru",enable_server_log:"Povolit log serveru",coming_soon:"Funkce brzy dostupná",session_has_expired:"Vaše relace vypršela. Prosím, přihlašte se znovu.",instant_access_question:"Chcete okamžitý přístup?",login_with_user_id:"Přihlásit se s uživatelským ID",or:"nebo",create_new_wallet:"Vytvořit novou peněženku",login_to_account:"Přihlaste se ke svému účtu",create_account:"Vytvořit účet",account_settings:"Nastavení účtu",signin_with_google:"Přihlásit se přes Google",signin_with_github:"Přihlásit se přes GitHub",signin_with_keycloak:"Přihlásit se přes Keycloak",username_or_email:"Uživatelské jméno nebo Email",password:"Heslo",password_config:"Konfigurace hesla",password_repeat:"Opakujte heslo",change_password:"Změnit heslo",set_password:"Nastavit heslo",invalid_password:"Heslo musí mít alespoň 8 znaků",login:"Přihlášení",register:"Registrovat",username:"Uživatelské jméno",user_id:"ID uživatele",email:"Email",first_name:"Křestní jméno",last_name:"Příjmení",picture:"Obrázek",verify_email:"Ověřte e-mail s",account:"Účet",update_account:"Aktualizovat účet",invalid_username:"Neplatné uživatelské jméno",auth_provider:"Poskytovatel ověření",my_account:"Můj účet",back:"Zpět",logout:"Odhlásit se",look_and_feel:"Vzhled a chování",language:"Jazyk",color_scheme:"Barevné schéma",extension_cost:"Toto vydání vyžaduje minimální platbu {cost} satoshi.",extension_paid_sats:"Již jste zaplatili {paid_sats} sats.",release_details_error:"Nelze získat podrobnosti o vydání.",pay_from_wallet:"Platit z peněženky",show_qr:"Zobrazit QR",retry_install:"Zkusit znovu nainstalovat",new_payment:"Vytvořit novou platbu",hide_empty_wallets:"Skrýt prázdné peněženky"},window.localisation.sk={confirm:"Áno",server:"Server",theme:"Téma",funding:"Financovanie",users:"Používatelia",apps:"Aplikácie",channels:"Kanály",transactions:"Transakcie",dashboard:"Prehľad",node:"Uzol",export_users:"Exportovať používateľov",no_users:"Nenašli sa žiadni používatelia",total_capacity:"Celková kapacita",avg_channel_size:"Priemerná veľkosť kanálu",biggest_channel_size:"Najväčší kanál",smallest_channel_size:"Najmenší kanál",number_of_channels:"Počet kanálov",active_channels:"Aktívne kanály",connect_peer:"Pripojiť peer",connect:"Pripojiť",open_channel:"Otvoriť kanál",open:"Otvoriť",close_channel:"Zatvoriť kanál",close:"Zatvoriť",restart:"Reštartovať server",save:"Uložiť",save_tooltip:"Uložiť vaše zmeny",topup:"Doplniť",topup_wallet:"Doplniť peňaženku",topup_hint:"Použite ID peňaženky na doplnenie ľubovoľnej peňaženky",restart_tooltip:"Pre prejavenie zmien reštartujte server",add_funds_tooltip:"Pridať prostriedky do peňaženky.",reset_defaults:"Obnoviť predvolené",reset_defaults_tooltip:"Odstrániť všetky nastavenia a obnoviť predvolené.",download_backup:"Stiahnuť zálohu databázy",name_your_wallet:"Pomenujte vašu {name} peňaženku",wallet_topup_ok:"Úspešne vytvorené virtuálne prostriedky ({amount} sats). Platby závisia od skutočných prostriedkov v zdroji financovania.",paste_invoice_label:"Vložte faktúru, platobnú požiadavku alebo lnurl kód *",lnbits_description:"Ľahko nastaviteľný a ľahkotonážny, LNbits môže bežať na akomkoľvek zdroji financovania Lightning Network a dokonca LNbits samotný! LNbits môžete používať pre seba, alebo ľahko ponúknuť správcovské riešenie pre iných. Každá peňaženka má svoje vlastné API kľúče a nie je limit na počet peňaženiek, ktoré môžete vytvoriť. Schopnosť rozdeľovať finančné prostriedky robí z LNbits užitočný nástroj pre správu peňazí a ako vývojový nástroj. Rozšírenia pridávajú extra funkčnosť do LNbits, takže môžete experimentovať s radou najnovších technológií na lightning sieti. Vývoj rozšírení sme urobili čo najjednoduchší a ako voľný a open-source projekt, podporujeme ľudí vývoj a odovzdávanie vlastných rozšírení.",export_to_phone:"Exportovať do telefónu s QR kódom",export_to_phone_desc:"Tento QR kód obsahuje URL vašej peňaženky s plným prístupom. Môžete ho naskenovať z vášho telefónu a otvoriť vašu peňaženku odtiaľ.",wallets:"Peňaženky",add_wallet:"Pridať novú peňaženku",delete_wallet:"Zmazať peňaženku",delete_wallet_desc:"Celá peňaženka bude zmazaná, prostriedky budú NEOBNOVITEĽNÉ.",rename_wallet:"Premenovať peňaženku",update_name:"Aktualizovať meno",fiat_tracking:"Sledovanie fiat",currency:"Mena",update_currency:"Aktualizovať menu",press_to_claim:"Stlačte pre nárok na bitcoin",donate:"Prispieť",view_github:"Zobraziť na GitHube",voidwallet_active:"VoidWallet je aktívny! Platby zakázané",use_with_caution:"POUŽÍVAJTE OPATRNE - {name} peňaženka je stále v BETE",service_fee:"Servisný poplatok: {amount} % za transakciu",service_fee_max:"Servisný poplatok: {amount} % za transakciu (max {max} satoshi)",service_fee_tooltip:"Servisný poplatok účtovaný správcom LNbits servera za odchádzajúcu transakciu",toggle_darkmode:"Prepnúť Tmavý režim",payment_reactions:"Reakcie na platbu",view_swagger_docs:"Zobraziť LNbits Swagger API dokumentáciu",api_docs:"API dokumentácia",api_keys_api_docs:"Adresa uzla, API kľúče a API dokumentácia",lnbits_version:"Verzia LNbits",runs_on:"Beží na",credit_hint:"Stlačte Enter pre pripísanie na účet",credit_label:"{denomination} na pripísanie",paste:"Vložiť",paste_from_clipboard:"Vložiť zo schránky",paste_request:"Vložiť požiadavku",create_invoice:"Vytvoriť faktúru",camera_tooltip:"Použite kameru na naskenovanie faktúry/QR",export_csv:"Exportovať do CSV",chart_tooltip:"Zobraziť graf",pending:"Čakajúce",copy_invoice:"Kopírovať faktúru",withdraw_from:"Vybrať z",cancel:"Zrušiť",scan:"Skenovať",read:"Čítať",pay:"Platiť",memo:"Poznámka",date:"Dátum",processing_payment:"Spracovávanie platby...",not_enough_funds:"Nedostatok prostriedkov!",search_by_tag_memo_amount:"Vyhľadať podľa značky, poznámky, sumy",invoice_waiting:"Faktúra čakajúca na zaplatenie",payment_received:"Platba prijatá",payment_sent:"Platba odoslaná",receive:"prijímať",send:"posielať",outgoing_payment_pending:"Odchádzajúca platba čaká",drain_funds:"Vyprázdniť prostriedky",drain_funds_desc:"Toto je LNURL-withdraw QR kód pre vyprázdnienie všetkého z tejto peňaženky. S nikým ho nezdieľajte. Je kompatibilný s balanceCheck a balanceNotify, takže vaša peňaženka môže naďalej kontinuálne vyťahovať prostriedky odtiaľto po prvom výbere.",i_understand:"Rozumiem",copy_wallet_url:"Kopírovať URL peňaženky",disclaimer_dialog_title:"Dôležité!",disclaimer_dialog:"Funkcionalita prihlásenia bude vydaná v budúcej aktualizácii, zatiaľ si uistite, že ste si túto stránku pridali medzi záložky pre budúci prístup k vašej peňaženke! Táto služba je v BETA verzii a nenesieme zodpovednosť za stratu prístupu k prostriedkom.",no_transactions:"Zatiaľ žiadne transakcie",manage:"Spravovať",extensions:"Rozšírenia",no_extensions:"Nemáte nainštalované žiadne rozšírenia :(",created:"Vytvorené",search_extensions:"Hľadať rozšírenia",warning:"Upozornenie",repository:"Repozitár",confirm_continue:"Ste si istí, že chcete pokračovať?",manage_extension_details:"Inštalovať/odinštalovať rozšírenie",install:"Inštalovať",uninstall:"Odinštalovať",drop_db:"Odstrániť údaje",enable:"Povoliť",enable_extension_details:"Povoliť rozšírenie pre aktuálneho používateľa",disable:"Zakázať",installed:"Nainštalované",activated:"Aktivované",deactivated:"Deaktivované",release_notes:"Poznámky k vydaniu",activate_extension_details:"Sprístupniť/neprístupniť rozšírenie pre používateľov",featured:"Odporúčané",all:"Všetky",only_admins_can_install:"(Iba administrátorské účty môžu inštalovať rozšírenia)",admin_only:"Iba pre administrátorov",new_version:"Nová verzia",extension_depends_on:"Závisí na:",extension_rating_soon:"Hodnotenia budú čoskoro dostupné",extension_installed_version:"Nainštalovaná verzia",extension_uninstall_warning:"Chystáte sa odstrániť rozšírenie pre všetkých používateľov.",uninstall_confirm:"Áno, Odinštalovať",extension_db_drop_info:"Všetky údaje pre rozšírenie budú trvalo vymazané. Túto operáciu nie je možné vrátiť!",extension_db_drop_warning:"Chystáte sa odstrániť všetky údaje pre rozšírenie. Pre pokračovanie prosím napíšte názov rozšírenia:",extension_min_lnbits_version:"Toto vydanie vyžaduje aspoň verziu LNbits",payment_hash:"Hash platby",fee:"Poplatok",amount:"Suma",tag:"Tag",unit:"Jednotka",description:"Popis",expiry:"Expirácia",webhook:"Webhook",payment_proof:"Dôkaz platby",update_available:"Dostupná aktualizácia {version}!",latest_update:"Máte najnovšiu verziu {version}.",notifications:"Notifikácie",no_notifications:"Žiadne notifikácie",notifications_disabled:"Notifikácie stavu LNbits sú zakázané.",enable_notifications:"Povoliť Notifikácie",enable_notifications_desc:"Ak povolené, budú sa načítavať najnovšie aktualizácie stavu LNbits, ako sú bezpečnostné incidenty a aktualizácie.",enable_killswitch:"Povoliť Killswitch",enable_killswitch_desc:"Ak povolené, vaš zdroj financovania sa automaticky zmení na VoidWallet, ak LNbits vysielajú signál killswitch. Po aktualizácii bude treba povoliť manuálne.",killswitch_interval:"Interval Killswitch",killswitch_interval_desc:"Ako často by malo pozadie kontrolovať signál killswitch od LNbits zo zdroja stavu (v minútach).",enable_watchdog:"Povoliť Watchdog",enable_watchdog_desc:"Ak povolené, vaš zdroj financovania sa automaticky zmení na VoidWallet, ak je váš zostatok nižší ako zostatok LNbits. Po aktualizácii bude treba povoliť manuálne.",watchdog_interval:"Interval Watchdog",watchdog_interval_desc:"Ako často by malo pozadie kontrolovať signál killswitch v watchdog delta [node_balance - lnbits_balance] (v minútach).",watchdog_delta:"Delta Watchdog",watchdog_delta_desc:"Limit pred zmenou zdroja financovania na VoidWallet [lnbits_balance - node_balance > delta]",status:"Stav",notification_source:"Zdroj notifikácií",notification_source_label:"URL zdroja (používajte len oficiálny LNbits zdroj stavu a zdroje, ktorým môžete dôverovať)",more:"viac",less:"menej",releases:"Vydania",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Logy servera",ip_blocker:"Blokovanie IP",security:"Bezpečnosť",security_tools:"Nástroje bezpečnosti",block_access_hint:"Blokovať prístup podľa IP",allow_access_hint:"Povoliť prístup podľa IP (prebije blokované IP)",enter_ip:"Zadajte IP a stlačte enter",rate_limiter:"Obmedzovač počtu požiadaviek",wallet_limiter:"Obmedzovač peňaženky",wallet_limit_max_withdraw_per_day:"Maximálny denný výber z peňaženky v satošiach (0 pre zrušenie)",wallet_max_ballance:"Maximálny zostatok v peňaženke v satošiach (0 pre deaktiváciu)",wallet_limit_secs_between_trans:"Minimálny počet sekúnd medzi transakciami na peňaženku (0 na deaktiváciu)",number_of_requests:"Počet požiadaviek",time_unit:"Časová jednotka",minute:"minúta",second:"sekunda",hour:"hodina",disable_server_log:"Zakázať Log servera",enable_server_log:"Povoliť Log servera",coming_soon:"Funkcia bude čoskoro dostupná",session_has_expired:"Vaša relácia vypršala. Prosím, prihláste sa znova.",instant_access_question:"Chcete okamžitý prístup?",login_with_user_id:"Prihlásiť sa s používateľským ID",or:"alebo",create_new_wallet:"Vytvoriť novú peňaženku",login_to_account:"Prihláste sa do vášho účtu",create_account:"Vytvoriť účet",account_settings:"Nastavenia účtu",signin_with_google:"Prihlásiť sa pomocou Google",signin_with_github:"Prihlásiť sa pomocou GitHub",signin_with_keycloak:"Prihlásiť sa pomocou Keycloak",username_or_email:"Používateľské meno alebo email",password:"Heslo",password_config:"Konfigurácia hesla",password_repeat:"Opakovanie hesla",change_password:"Zmeniť heslo",set_password:"Nastaviť heslo",invalid_password:"Heslo musí mať aspoň 8 znakov",login:"Prihlásenie",register:"Registrovať",username:"Používateľské meno",user_id:"ID používateľa",email:"Email",first_name:"Meno",last_name:"Priezvisko",picture:"Obrázok",verify_email:"Overiť e-mail s",account:"Účet",update_account:"Aktualizovať účet",invalid_username:"Neplatné užívateľské meno",auth_provider:"Poskytovateľ autentifikácie",my_account:"Môj účet",back:"Späť",logout:"Odhlásiť sa",look_and_feel:"Vzhľad a dojem",language:"Jazyk",color_scheme:"Farebná schéma",extension_cost:"Táto verzia vyžaduje minimálnu platbu {cost} satoshi.",extension_paid_sats:"Už ste zaplatili {paid_sats} sats.",release_details_error:"Nepodarilo sa získať podrobnosti o vydaní.",pay_from_wallet:"Zaplatiť z peňaženky",show_qr:"Zobraziť QR",retry_install:"Skúste inštaláciu znova",new_payment:"Vytvoriť novú platbu",hide_empty_wallets:"Skryť prázdne peňaženky"},window.localisation.kr={confirm:"확인",server:"서버",theme:"테마",funding:"자금",users:"사용자",apps:"앱",channels:"채널",transactions:"거래 내역",dashboard:"현황판",node:"노드",export_users:"사용자 내보내기",no_users:"사용자가 없습니다",total_capacity:"총 용량",avg_channel_size:"평균 채널 용량",biggest_channel_size:"가장 큰 채널 용량",smallest_channel_size:"가장 작은 채널 용량",number_of_channels:"채널 수",active_channels:"활성화된 채널",connect_peer:"피어 연결하기",connect:"연결하기",open_channel:"채널 개설하기",open:"개설",close_channel:"채널 폐쇄하기",close:"폐쇄",restart:"서버 재시작",save:"저장",save_tooltip:"변경 사항 저장",topup:"자금 추가",topup_wallet:"지갑에 자금 추가",topup_hint:"자금을 추가할 지갑의 ID를 넣어주세요",restart_tooltip:"변경 사항을 적용하려면 서버를 재시작해야 합니다.",add_funds_tooltip:"지갑에 자금을 추가합니다.",reset_defaults:"기본 설정으로 돌아가기",reset_defaults_tooltip:"설정했던 내용들을 모두 지우고, 기본 설정으로 돌아갑니다.",download_backup:"데이터베이스 백업 다운로드",name_your_wallet:"사용할 {name}지갑의 이름을 정하세요",wallet_topup_ok:"성공적으로 가상 자금을 생성했습니다 ({amount} sats). 지급은 자금 원천의 실제 자금에 따라 달라집니다.",paste_invoice_label:"인보이스, 결제 요청, 혹은 lnurl 코드를 붙여넣으세요 *",lnbits_description:"설정이 쉽고 가벼운 LNbits는 어떤 라이트닝 네트워크의 예산 자원 위에서든 돌아갈 수 있습니다, 그리고 다른 LNbits 지갑들입니다. 스스로 사용하기 위해, 또는 다른 사람들에게 수탁형 솔루션을 제공하기 위해 LNbits를 운영할 수 있습니다. 각 지갑들은 자신만의 API key를 가지며, 생성 가능한 지갑의 수에는 제한이 없습니다. 자금을 분할할 수 있는 기능으로 인해, LNbits는 자금 운영 도구로써뿐만 아니라 개발 도구로써도 유용합니다. 확장 기능들은 LNbits에 여러분들이 라이트닝 네트워크의 다양한 최신 기술들을 수행해볼 수 있게 하는 추가 기능을 제공합니다. LNbits 개발진들은 확장 기능들의 개발 또한 가능한 쉽게 만들었으며, 무료 오픈 소스 프로젝트답게 사람들이 자신만의 확장 기능들을 개발하고 제출하기를 응원합니다.",export_to_phone:"QR 코드를 이용해 모바일 기기로 내보내기",export_to_phone_desc:"이 QR 코드는 선택된 지갑의 최대 접근 권한을 가진 전체 URL을 담고 있습니다. 스캔 후, 모바일 기기에서 지갑을 열 수 있습니다.",wallets:"지갑",add_wallet:"새로운 지갑을 추가합니다",delete_wallet:"지갑을 삭제합니다",delete_wallet_desc:"이 지갑은 삭제될 것이며, 삭제 시 지갑 내 자금은 복구가 불가능합니다.",rename_wallet:"지갑 이름 변경",update_name:"이름 변경하기",fiat_tracking:"법정통화 가격 표시",currency:"통화",update_currency:"통화 수정하기",press_to_claim:"비트코인을 수령하려면 눌러주세요",donate:"기부",view_github:"GitHub 페이지 보기",voidwallet_active:"VoidWallet이 활성화되었습니다! 결제가 불가능합니다.",use_with_caution:"주의하세요 - {name} 지갑은 아직 BETA 단계입니다.",service_fee:"서비스 수수료: 거래액의 {amount} %",service_fee_max:"서비스 수수료: 거래액의 {amount} % (최대 {max} sats)",service_fee_tooltip:"지불 결제 시마다 LNbits 서버 관리자에게 납부되는 서비스 수수료",toggle_darkmode:"다크 모드 전환",payment_reactions:"결제 반응",view_swagger_docs:"LNbits Swagger API 문서를 봅니다",api_docs:"API 문서",api_keys_api_docs:"노드 URL, API 키와 API 문서",lnbits_version:"LNbits 버전",runs_on:"Runs on",credit_hint:"계정에 자금을 넣으려면 Enter를 눌러주세요",credit_label:"{denomination} 단위로 충전하기",paste:"붙여넣기",paste_from_clipboard:"클립보드에서 붙여넣기",paste_request:"지불 요청 붙여넣기",create_invoice:"인보이스 생성하기",camera_tooltip:"카메라를 이용해서 인보이스/QR을 스캔하세요",export_csv:"CSV 형태로 내보내기",chart_tooltip:"그래프로 보여주기",pending:"대기 중",copy_invoice:"인보이스 복사하기",withdraw_from:"출금",cancel:"취소",scan:"스캔",read:"분석하기",pay:"지불하기",memo:"Memo",date:"일시",processing_payment:"결제 처리 중...",not_enough_funds:"자금이 부족합니다!",search_by_tag_memo_amount:"태그, memo, 수량으로 검색하기",invoice_waiting:"결제를 기다리는 인보이스",payment_received:"받은 결제액",payment_sent:"보낸 결제액",receive:"받기",send:"보내기",outgoing_payment_pending:"지불 대기 중",drain_funds:"자금 비우기",drain_funds_desc:"이는 선택된 지갑으로부터 모든 자금을 인출하는 LNURL-withdraw QR 코드입니다. 그 누구와도 공유하지 마세요. balanceCheck 및 balanceNotify 기능과 호환되며, 당신의 지갑은 첫 출금 이후로도 계속 자금을 끌어당기고 있을 수 있습니다.",i_understand:"이해하였습니다",copy_wallet_url:"지갑 URL 복사하기",disclaimer_dialog_title:"중요!",disclaimer_dialog:"로그인 기능은 향후 업데이트를 통해 지원될 계획이지만, 현재로써는 이 페이지에 향후 다시 접속하기 위해 북마크 설정하는 것을 잊지 마세요! 이 서비스는 아직 BETA 과정에 있고, LNbits 개발자들은 자금 손실에 대해 전혀 책임을 지지 않습니다.",no_transactions:"아직 아무런 거래도 이루어지지 않았습니다",manage:"관리",extensions:"확장 기능",no_extensions:"아직 설치된 확장 기능들이 없네요 :(",created:"생성됨",search_extensions:"확장 기능 검색하기",warning:"주의",repository:"저장소",confirm_continue:"정말로 계속할까요?",manage_extension_details:"확장 기능 설치/삭제하기",install:"설치",uninstall:"삭제",drop_db:"데이터 삭제",enable:"활성화",enable_extension_details:"현재 사용자 계정에 해당 확장 기능을 활성화합니다",disable:"비활성화",installed:"설치됨",activated:"작동됨",deactivated:"작동 중지",release_notes:"배포 노트",activate_extension_details:"사용자들의 확장 기능 사용 가능 여부를 결정합니다",featured:"추천",all:"전체",only_admins_can_install:"(관리자 계정만이 확장 기능을 설치할 수 있습니다)",admin_only:"관리자 전용",new_version:"새로운 버전",extension_depends_on:"의존성 존재:",extension_rating_soon:"평점 기능도 곧 구현됩니다",extension_installed_version:"설치된 버전",extension_uninstall_warning:"모든 사용자들로부터 이 확장 기능을 제거한다는 점에 유의하세요.",uninstall_confirm:"네, 삭제합니다",extension_db_drop_info:"해당 확장 기능의 모든 데이터가 영구적으로 삭제됩니다. 작업 수행 후에는 되돌릴 수 없습니다!",extension_db_drop_warning:"해당 확장 기능의 모든 데이터가 영구적으로 삭제될 겁니다. 계속하려면 확장 기능의 이름을 입력해주세요:",extension_min_lnbits_version:"이 배포 버전은 더 높은 버전의 lnbits가 설치되어 있어야 합니다.",payment_hash:"결제 해쉬값",fee:"수수료",amount:"액수",tag:"태그",unit:"단위",description:"상세",expiry:"만료",webhook:"Webhook",payment_proof:"Payment 증거",update_available:"{version}으로 업데이트가 가능합니다.",latest_update:"이미 {version} 버전으로 업데이트되었습니다.",notifications:"알림",no_notifications:"알림 없음",notifications_disabled:"LNbits 상태 알림이 비활성화되었습니다.",enable_notifications:"알림 활성화",enable_notifications_desc:"활성화 시, 가장 최신의 보안 사고나 소프트웨어 업데이트 등의 LNbits 상황 업데이트를 불러옵니다.",enable_killswitch:"비상 정지 활성화",enable_killswitch_desc:"활성화 시, LNbits 메인 서버에서 비상 정지 신호를 보내면 자동으로 자금의 원천을 VoidWallet으로 변경합니다. 업데이트 이후 수동으로 활성화해 주어야 합니다.",killswitch_interval:"비상 정지 시간 간격",killswitch_interval_desc:"LNbits 메인 서버에서 나오는 비상 정지 신호를 백그라운드 작업으로 얼마나 자주 확인할 것인지를 결정합니다. (분 단위)",enable_watchdog:"와치독 활성화",enable_watchdog_desc:"활성화 시, LNbits 잔금보다 당신의 잔금이 지정한 수준보다 더 낮아질 경우 자동으로 자금의 원천을 VoidWallet으로 변경합니다. 업데이트 이후 수동으로 활성화해 주어야 합니다.",watchdog_interval:"와치독 시간 간격",watchdog_interval_desc:"와치독 델타 값을 기반으로 하여 당신의 LNbits 서버에서 나오는 비상 정지 신호를 백그라운드 작업으로 얼마나 자주 확인할 것인지를 결정합니다. (분 단위)",watchdog_delta:"와치독 델타",watchdog_delta_desc:"당신의 자금 원천을 VoidWallet으로 변경하기까지의 기준 값 [LNbits 잔액 - 노드 잔액 > 델타 값]",status:"상황",notification_source:"알림 메세지 출처",notification_source_label:"알림 메세지를 가져올 URL (공식 LNbits 상황판 출처나, 당신이 신뢰할 수 있는 출처만을 사용하세요)",more:"더 알아보기",less:"적게",releases:"배포 버전들",killswitch:"비상 정지",watchdog:"와치독",server_logs:"서버 로그",ip_blocker:"IP 기반 차단기",security:"보안",security_tools:"보안 도구들",block_access_hint:"IP 기준으로 접속 차단하기",allow_access_hint:"IP 기준으로 접속 허용하기 (차단한 IP들을 무시합니다)",enter_ip:"IP 주소를 입력하고 Enter를 눌러주세요",rate_limiter:"횟수로 제한하기",wallet_limiter:"지갑 제한기",wallet_limit_max_withdraw_per_day:"일일 최대 지갑 출금액(sats) (0은 비활성화)",wallet_max_ballance:"지갑 최대 잔액(sats) (0은 비활성화)",wallet_limit_secs_between_trans:"지갑 당 거래 사이 최소 초 (0은 비활성화)",number_of_requests:"요청 횟수",time_unit:"시간 단위",minute:"분",second:"초",hour:"시간",disable_server_log:"서버 로깅 중단하기",enable_server_log:"서버 로깅 활성화하기",coming_soon:"곧 구현될 기능들입니다",session_has_expired:"세션 유효 기간이 만료되었습니다. 다시 로그인해 주세요.",instant_access_question:"즉시 액세스하시겠습니까?",login_with_user_id:"사용자 ID로 로그인",or:"또는",create_new_wallet:"새 지갑 만들기",login_to_account:"계정에 로그인하세요.",create_account:"계정 생성",account_settings:"계정 설정",signin_with_google:"Google으로 로그인",signin_with_github:"GitHub으로 로그인",signin_with_keycloak:"Keycloak으로 로그인",username_or_email:"사용자 이름 또는 이메일",password:"비밀번호",password_config:"비밀번호 설정",password_repeat:"비밀번호 재입력",change_password:"비밀번호 변경",set_password:"비밀번호 설정",invalid_password:"비밀번호는 최소 8자 이상이어야 합니다",login:"로그인",register:"등록",username:"사용자 이름",user_id:"사용자 ID",email:"이메일",first_name:"성명",last_name:"성",picture:"사진",verify_email:"이메일을 인증하려면",account:"계정",update_account:"계정 업데이트",invalid_username:"잘못된 사용자 이름",auth_provider:"인증 제공자",my_account:"내 계정",back:"뒤로",logout:"로그아웃",look_and_feel:"외관과 느낌",language:"언어",color_scheme:"색상 구성",extension_cost:"이 버전은 최소 {cost} sats의 지불이 필요합니다.",extension_paid_sats:"당신은 이미 {paid_sats} sats를 지불했습니다.",release_details_error:"릴리스 세부 정보를 가져올 수 없습니다.",pay_from_wallet:"지갑에서 결제하다",show_qr:"QR 보기",retry_install:"다시 설치하세요",new_payment:"새로운 결제하기",hide_empty_wallets:"빈 지갑 숨기기"},window.localisation.fi={confirm:"Kyllä",server:"Palvelin",theme:"Teema",funding:"Rahoitus",users:"Käyttäjät",apps:"Sovellukset",channels:"Kanavat",transactions:"Tapahtumat",dashboard:"Ohjauspaneeli",node:"Solmu",export_users:"Vie käyttäjät",no_users:"Käyttäjiä ei löytynyt",total_capacity:"Kokonaiskapasiteetti",avg_channel_size:"Keskimääräisen kanavan kapasiteetti",biggest_channel_size:"Suurimman kanavan kapasiteetti",smallest_channel_size:"Pienimmän kanavan kapasiteetti",number_of_channels:"Kanavien lukumäärä",active_channels:"Aktiivisia kanavia",connect_peer:"Yhdistä naapuriin",connect:"Yhdistä",open_channel:"Avaa kanava",open:"Avaa",close_channel:"Sulje kanava",close:"Sulje",restart:"Palvelimen uudelleen käynnistys",save:"Tallenna",save_tooltip:"Tallenna muutokset",topup:"Topup",topup_wallet:"Lisää varoja lompakkoon",topup_hint:"Lisää varoja lompakkoon sen ID:n perusteella",restart_tooltip:"Uudelleenkäynnistä palvelu muutosten käyttöönottamiseksi",add_funds_tooltip:"Lisää varoja lompakkoon",reset_defaults:"Peruuta muutokset",reset_defaults_tooltip:"Poista kaikki asetusten muutokset ja palauta järjestelmän oletusasetukset.",download_backup:"Lataa tietokannan varmuuskopio",name_your_wallet:"Anna {name}-lompakollesi nimi",wallet_topup_ok:"Virtuaalisten varojen luominen onnistui ({amount} sats). Maksut riippuvat rahoituslähteen todellisista varoista.",paste_invoice_label:"Liitä lasku, maksupyyntö, lnurl-koodi tai Lightning Address *",lnbits_description:"Kevyt ja helppokäyttöinen LNbits voi käyttää rahoituslähteinään erilaisia palveluita, ja jopa LNbits itseään! Voit käyttää sitä itsenäisesti ja helposti tarjota erilaisia Lightning-palveluita. Pystyt luomaan sillä salamaverkkolompakoita eikä niiden määrää ole rajoitettu. Jokaiselle lompakolle saat yksilölliset API-avaimet. Varojen osittaminen tekee siitä erittäin kätevän varojen hallinnassa sekä myös ohjelmistokehityksen työkalun. Laajennukset lisäävät LNbits:in toiminnallisuuksia. Näinpä voit helposti testailla useita erilaisia ja viimeisimpiä salamaverkon teknologioita. Laajennuksien kehittämisen olemme pyrkineet tekemään mahdollisimman helpoksi pitämällä LNbits:in ilmaisena OpenSource-projektina. Kannustamme kaikkia kehittämään ja jakelemaan omia laajennuksia!",export_to_phone:"Käytä puhelimessa lukemalla QR-koodi",export_to_phone_desc:"Tämä QR-koodi sisältää URL-osoitteen, jolla saa lompakkoosi täydet valtuudet. Voi lukea sen puhelimellasi ja avata sillä lompakkosi. Voit myös lisätä lompakkosi selaimella käytettäväksi PWA-sovellukseksi puhelimen aloitusruudulle. ",wallets:"Lompakot",add_wallet:"Lisää lompakko",delete_wallet:"Poista lompakko",delete_wallet_desc:"Lompakko poistetaan pysyvästi. Siirrä lompakosta varat ennalta muualle, sillä tämä toiminto on PERUUTTAMATON!",rename_wallet:"Nimeä lompakko uudelleen",update_name:"Tallenna",fiat_tracking:"Käytettävä valuutta",currency:"Valuutta",update_currency:"Tallenna",press_to_claim:"Lunasta varat painamalla tästä",donate:"Lahjoita",view_github:"Näytä GitHub:ssa",voidwallet_active:"Maksutapahtumat ovat poissa käytöstä, koska VoidWallet on aktiivinen!",use_with_caution:"KÄYTÄ VAROEN - BETA-ohjelmisto on käytössä palvelussa: {name}",service_fee:"Palvelumaksu: {amount} % tapahtumasta",service_fee_max:"Palvelumaksu: {amount} % tapahtumasta (enintään {max} sat)",service_fee_tooltip:"LNbits palvelimen ylläpitäjä veloittaa lähtevästä maksusta palvelumaksun.",toggle_darkmode:"Tumma näkymä",payment_reactions:"Maksureaktiot",view_swagger_docs:"Näytä LNbits Swagger API-dokumentit",api_docs:"API-dokumentaatio",api_keys_api_docs:"Solmun URL, API-avaimet ja -dokumentaatio",lnbits_version:"LNbits versio",runs_on:"Mukana menossa",credit_hint:"Hyväksy painamalla Enter",credit_label:"Lisää tilille varoja {denomination}",paste:"Liitä",paste_from_clipboard:"Liitä leikepöydältä",paste_request:"Liitä pyyntö",create_invoice:"Laskuta",camera_tooltip:"Kuvaa lasku tai QR-koodi",export_csv:"Vie CSV-tiedostoon",chart_tooltip:"Näytä kaaviokuva",pending:"Odottaa",copy_invoice:"Kopioi lasku",withdraw_from:"Nosta kohteesta",cancel:"Peruuta",scan:"Scannaa",read:"Lue",pay:"Maksa",memo:"Kuvaus",date:"Päiväys",processing_payment:"Maksua käsitellään...",not_enough_funds:"Varat eivät riitä!",search_by_tag_memo_amount:"Etsi tunnisteella, muistiolla tai määrällä",invoice_waiting:"Lasku osottaa maksamista",payment_received:"Maksu vastaanotettu",payment_sent:"Maksu lähetetty",receive:"vastaanota",send:"lähetä",outgoing_payment_pending:"Lähtevä maksu odottaa",drain_funds:"Tyhjennä varat",drain_funds_desc:"Tämä LNURL-withdraw -tyyppinen QR-koodi on tarkoitettu kaikkien varojen imurointiin lompakosta. ÄLÄ JAA SITÄ KENELLEKÄÄN! Se on balanceCheck- ja balanceNotify-toimintojen kanssa yhteensopiva, joten sitä voi käyttää lompakon tyhjentämiseen ensimmäisen käytön jälleen jatkuvasti.",i_understand:"Vakuutan ymmärtäväni",copy_wallet_url:"Kopioi lompakon URL",disclaimer_dialog_title:"Tärkeää!",disclaimer_dialog:"Muistathan tallettaa kirjautumistietosi turvallisesta ja helposti saataville, jotta pääset jatkossakin kirjautumaan lompakkoosi! Tutustu myös Tilin asetukset -sivuun. Tämä palvelu on kokeiluvaiheessa (eli BETA), ja niinpä kukaan ei ota mitään vastuuta varojen säilymisestä tai niiden käytettävyyden takaamisesta.",no_transactions:"Lompakossa ei ole yhtään tapahtumaa",manage:"Hallinnointi",extensions:"Laajennukset",no_extensions:"Laajennuksia ei ole asennettu :(",created:"Luotu",search_extensions:"Etsi laajennuksia",warning:"Varoitus",repository:"Laajennuksien lähde",confirm_continue:"Haluatko varmasti jatkaa?",manage_extension_details:"Asenna/Poista laajennus",install:"Asenna",uninstall:"Poista",drop_db:"Poista tiedot",enable:"Ota käyttöön",enable_extension_details:"Ota laajennus käyttöön tälle käyttäjälle",disable:"Poista käytöstä",installed:"Asennettu",activated:"Käytössä",deactivated:"Poissa käytöstä",release_notes:"Julkaisutiedot",activate_extension_details:"Aseta/Poista laajennus käyttäjien saatavilta",featured:"Esittelyssä",all:"Kaikki",only_admins_can_install:"(Vain pääkäyttäjät voivat asentaa laajennuksia)",admin_only:"Pääkäyttäjille",new_version:"Uusi versio",extension_depends_on:"Edellyttää:",extension_rating_soon:"Arvostelut on tulossa pian",extension_installed_version:"Nykyinen versio",extension_uninstall_warning:"Olet poistamassa laajennuksen kaikilta käyttäjiltä.",uninstall_confirm:"Kyllä, poista asennus",extension_db_drop_info:"Kaikki laajennuksen tallettama tieto poistetaan pysyvästi. Poistoa ei voi jälkikäteen peruuttaa!",extension_db_drop_warning:"Olet tuhoamassa laajennuksen tallettamat tiedot. Vahvista poisto kirjoittamalla viivalle seuraavassa näkyvä laajennuksen nimi:",extension_min_lnbits_version:"Tämä julkaisu vaatii vähintään LNbits-version",payment_hash:"Maksun tiiviste",fee:"Kulu",amount:"Määrä",tag:"Tunniste",unit:"Yksikkö",description:"Kuvaus",expiry:"Vanheneminen",webhook:"Webhook",payment_proof:"Maksun varmenne",update_available:"Saatavilla on päivitys versioon {version}!",latest_update:"Käytössä oleva versio {version}, on viimeisin saatavilla oleva.",notifications:"Tiedotteet",no_notifications:"Ei tiedotteita",notifications_disabled:"LNbits-tilatiedotteet on poistettu käytöstä.",enable_notifications:"Ota tiedotteet käyttöön",enable_notifications_desc:"Tämän ollessa valittuna, noudetaan LNbits-tilatiedotteet. Niitä ovat esimerkiksi turvallisuuteen liittyvät tapahtumatiedotteet ja tiedot tämän ohjelmiston päivityksistä.",enable_killswitch:"Ota Killswitch käyttöön",enable_killswitch_desc:"Jos LNbits antaa killswitch-komennon, niin rahoituslähteeksi valitaan automaattisesti heti VoidWallet. Päivityksen jälkeen tämä asetus pitää tarkastaa uudelleen.",killswitch_interval:"Killswitch-aikaväli",killswitch_interval_desc:"Tällä määritetään kuinka usein taustatoiminto tarkistaa killswitch-signaalin tilatiedotteiden lähteestä. Hakujen väli ilmoitetaan minuutteina.",enable_watchdog:"Ota Watchdog käyttöön",enable_watchdog_desc:"Tämän ollessa käytössä, ja solmun varojen laskiessa alle LNbits-varojen määrän, otetaan automaattisesti käyttöön VoidWallet. Päivityksen jälkeen tämä asetus pitää tarkastaa uudelleen.",watchdog_interval:"Watchdog-aikaväli",watchdog_interval_desc:"Tällä määritetään kuinka usein taustatoiminto tarkistaa varojen Delta-muutokset [node_balance - lnbits_balance] killswitch-signaalille. Hakujen väli ilmoitetaan minuutteina.",watchdog_delta:"Watchdog Delta",watchdog_delta_desc:"Saldomuutoksen raja-arvo jolloin killswitch-muuttaa rahoituslähteeksi VoidWallet:in [lnbits_balance - node_balance > delta]",status:"Tilanne",notification_source:"Tiedotteiden lähde",notification_source_label:"Lähde-URL (käytä ainoastaan LNbits:iä tai muuta luotettavaa lähdettä)",more:"enemmän",less:"vähemmän",releases:"Julkaisut",killswitch:"Killswitch",watchdog:"Watchdog",server_logs:"Palvelimen lokit",ip_blocker:"IP-suodatin",security:"Turvallisuus",security_tools:"Turvallisuus työkalut",block_access_hint:"Estä pääsy IP-osoitteen perusteella",allow_access_hint:"Salli pääsy IP-osoitteen perusteella (ohittaa estot)",enter_ip:"Anna IP ja paina +",rate_limiter:"Toiston rajoitin",wallet_limiter:"Lompakon Rajoitin",wallet_limit_max_withdraw_per_day:"Maksimi päivittäinen lompakon nosto sateissa (0 poistaa käytöstä)",wallet_max_ballance:"Lompakon maksimisaldo satosheina (0 poistaa käytöstä)",wallet_limit_secs_between_trans:"Min sekuntia transaktioiden välillä lompakkoa kohden (0 poistaa käytöstä)",number_of_requests:"Pyyntöjen lukumäärä",time_unit:"aikayksikkö",minute:"minuutti",second:"sekunti",hour:"tunti",disable_server_log:"Poista palvelimen loki käytöstä",enable_server_log:"Ota palvelimen loki käyttöön",coming_soon:"Ominaisuus on tulossa pian",session_has_expired:"Käyttämätön sessio on vanhentunut. Kirjaudu uudelleen.",instant_access_question:"Kirjaudu aikaisemmin luodulla tiedolla",login_with_user_id:"Kirjaudu käyttäjä-ID:llä",or:"tai",create_new_wallet:"Avaa uusi lompakko",login_to_account:"Kirjaudu käyttäjänimellä",create_account:"Luo tili",account_settings:"Tilin asetukset",signin_with_google:"Kirjaudu Google-tunnuksella",signin_with_github:"Kirjaudu GitHub-tunnuksella",signin_with_keycloak:"Kirjaudu Keycloak-tunnuksella",username_or_email:"Käyttäjänimi tai sähköposti",password:"Anna uusi salasana",password_config:"Salasanan määritys",password_repeat:"Toista uusi salasana",change_password:"Vaihda salasana",set_password:"Aseta salasana",invalid_password:"Salasanassa tulee olla vähintään kahdeksan merkkiä",login:"Kirjaudu",register:"Rekisteröidy",username:"Käyttäjänimi",user_id:"Käyttäjä ID",email:"Sähköposti",first_name:"Etunimi",last_name:"Sukunimi",picture:"Kuva",verify_email:"Vahvista sähköposti",account:"Tili",update_account:"Päivitä tiliä",invalid_username:"Virheellinen käyttäjänimi",auth_provider:"Tunnistamisen toimittaja",my_account:"Tilini",back:"Takaisin",logout:"Poistu",look_and_feel:"Kieli ja värit",language:"Kieli",color_scheme:"Väriteema",extension_cost:"Tämä julkaisu edellyttää vähintään {cost} satsin maksua.",extension_paid_sats:"Olet jo maksanut {paid_sats} satsia.",release_details_error:"Ei voi hakea julkaisun tietoja.",pay_from_wallet:"Maksa lompakosta",show_qr:"Näytä QR",retry_install:"Yritä asennusta uudelleen",new_payment:"Tee uusi maksu",hide_empty_wallets:"Piilota tyhjät lompakot"},window.LOCALE="en",window.i18n=new VueI18n.createI18n({locale:window.LOCALE,fallbackLocale:window.LOCALE,messages:window.localisation}),window.LNbits={api:{request:function(e,t,n,a){return axios({method:e,url:t,headers:{"X-Api-Key":n},data:a})},getServerHealth:function(){return this.request("get","/api/v1/health")},createInvoice:async function(e,t,n,a="sat",i=null){return this.request("post","/api/v1/payments",e.inkey,{out:!1,amount:t,memo:n,lnurl_callback:i,unit:a})},payInvoice:function(e,t){return this.request("post","/api/v1/payments",e.adminkey,{out:!0,bolt11:t})},payLnurl:function(e,t,n,a,i="",r="",o=""){return this.request("post","/api/v1/payments/lnurl",e.adminkey,{callback:t,description_hash:n,amount:a,comment:r,description:i,unit:o})},authLnurl:function(e,t){return this.request("post","/api/v1/lnurlauth",e.adminkey,{callback:t})},createAccount:function(e){return this.request("post","/api/v1/account",null,{name:e})},register:function(e,t,n,a){return axios({method:"POST",url:"/api/v1/auth/register",data:{username:e,email:t,password:n,password_repeat:a}})},reset:function(e,t,n){return axios({method:"PUT",url:"/api/v1/auth/reset",data:{reset_key:e,password:t,password_repeat:n}})},login:function(e,t){return axios({method:"POST",url:"/api/v1/auth",data:{username:e,password:t}})},loginByProvider:function(e,t,n){return axios({method:"POST",url:`/api/v1/auth/${e}`,headers:t,data:n})},loginUsr:function(e){return axios({method:"POST",url:"/api/v1/auth/usr",data:{usr:e}})},logout:function(){return axios({method:"POST",url:"/api/v1/auth/logout"})},getAuthenticatedUser:function(){return this.request("get","/api/v1/auth")},getWallet:function(e){return this.request("get","/api/v1/wallet",e.inkey)},createWallet:function(e,t){return this.request("post","/api/v1/wallet",e.adminkey,{name:t}).then((e=>{window.location="/wallet?wal="+e.data.id}))},updateWallet:function(e,t){return this.request("patch","/api/v1/wallet",t.adminkey,{name:e})},deleteWallet:function(e){return this.request("delete","/api/v1/wallet",e.adminkey).then((e=>{let t=new URL(window.location.href);t.searchParams.delete("wal"),window.location=t}))},getPayments:function(e,t){return this.request("get","/api/v1/payments/paginated?"+t,e.inkey)},getPayment:function(e,t){return this.request("get","/api/v1/payments/"+t,e.inkey)},updateBalance:function(e,t){return this.request("PUT","/users/api/v1/topup",null,{amount:e,id:t})},getCurrencies(){return this.request("GET","/api/v1/currencies").then((e=>["sats",...e.data]))}},events:{onInvoicePaid:function(e,t){let n=e=>{t(JSON.parse(e.data))};return this.listenersCount=this.listenersCount||{[e.inkey]:0},this.listenersCount[e.inkey]++,this.listeners=this.listeners||{},e.inkey in this.listeners||(this.listeners[e.inkey]=new EventSource("/api/v1/payments/sse?api-key="+e.inkey)),this.listeners[e.inkey].addEventListener("payment-received",n),()=>{this.listeners[e.inkey].removeEventListener("payment-received",n),this.listenersCount[e.inkey]--,this.listenersCount[e.inkey]<=0&&(this.listeners[e.inkey].close(),delete this.listeners[e.inkey])}}},map:{extension:function(e){const t=_.object(["code","isValid","isAdminOnly","name","shortDescription","tile","contributors","hidden"],e);return t.url=["/",t.code,"/"].join(""),t},user:function(e){const t={id:e.id,admin:e.admin,email:e.email,extensions:e.extensions,wallets:e.wallets,admin:e.admin},n=this.wallet;return t.wallets=t.wallets.map((function(e){return n(e)})).sort((function(e,t){return e.name.localeCompare(t.name)})),t.walletOptions=t.wallets.map((function(e){return{label:[e.name," - ",e.id].join(""),value:e.id}})),t},wallet:function(e){return newWallet={id:e.id,name:e.name,adminkey:e.adminkey,inkey:e.inkey,currency:e.currency},newWallet.msat=e.balance_msat,newWallet.sat=Math.floor(e.balance_msat/1e3),newWallet.fsat=new Intl.NumberFormat(window.LOCALE).format(newWallet.sat),newWallet.url=`/wallet?&wal=${e.id}`,newWallet},payment:function(e){obj={checking_id:e.checking_id,status:e.status,amount:e.amount,fee:e.fee,memo:e.memo,time:e.time,bolt11:e.bolt11,preimage:e.preimage,payment_hash:e.payment_hash,expiry:e.expiry,extra:e.extra??{},wallet_id:e.wallet_id,webhook:e.webhook,webhook_status:e.webhook_status,fiat_amount:e.fiat_amount,fiat_currency:e.fiat_currency},obj.date=Quasar.date.formatDate(new Date(obj.time),"YYYY-MM-DD HH:mm"),obj.dateFrom=moment(obj.date).fromNow(),obj.expirydate=Quasar.date.formatDate(new Date(obj.expiry),"YYYY-MM-DD HH:mm"),obj.expirydateFrom=moment(obj.expirydate).fromNow(),obj.msat=obj.amount,obj.sat=obj.msat/1e3,obj.tag=obj.extra?.tag,obj.fsat=new Intl.NumberFormat(window.LOCALE).format(obj.sat),obj.isIn=obj.amount>0,obj.isOut=obj.amount<0,obj.isPending="pending"===obj.status,obj.isPaid="success"===obj.status,obj.isFailed="failed"===obj.status,obj._q=[obj.memo,obj.sat].join(" ").toLowerCase();try{obj.details=JSON.parse(e.extra?.details||"{}")}catch{obj.details={extraDetails:e.extra?.details}}return obj}},utils:{confirmDialog:function(e){return Quasar.Dialog.create({message:e,ok:{flat:!0,color:"orange"},cancel:{flat:!0,color:"grey"}})},digestMessage:async function(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map((e=>e.toString(16).padStart(2,"0"))).join("")},formatDate:function(e){return Quasar.date.formatDate(new Date(1e3*e),"YYYY-MM-DD HH:mm")},formatCurrency:function(e,t){return new Intl.NumberFormat(window.LOCALE,{style:"currency",currency:t}).format(e)},formatSat:function(e){return new Intl.NumberFormat(window.LOCALE).format(e)},formatMsat:function(e){return this.formatSat(e/1e3)},notifyApiError:function(e){if(!e.response)return console.error(e);Quasar.Notify.create({timeout:5e3,type:{400:"warning",401:"warning",500:"negative"}[e.response.status]||"warning",message:e.response.data.message||e.response.data.detail||null,caption:[e.response.status," ",e.response.statusText].join("").toUpperCase()||null,icon:null})},search:function(e,t,n,a){try{const i=t.toLowerCase().split(a||" ");return e.filter((function(e){let t=0;return _.each(i,(function(a){-1!==e[n].indexOf(a)&&t++})),t===i.length}))}catch(t){return e}},prepareFilterQuery(e,t){t&&(e.pagination=t.pagination);let n=e.pagination;e.loading=!0;const a={limit:n.rowsPerPage,offset:(n.page-1)*n.rowsPerPage,sortby:n.sortBy??"",direction:n.descending?"desc":"asc",...e.filter};return e.search&&(a.search=e.search),new URLSearchParams(a)},exportCSV:function(e,t,n){const a=function(e,t){let n=void 0!==t?t(e):e;return n=null==n?"":String(n),n=n.split('"').join('""'),`"${n}"`},i=[e.map((function(e){return a(e.label)}))].concat(t.map((function(t){return e.map((function(e){return a("function"==typeof e.field?e.field(t):t[void 0===e.field?e.name:e.field],e.format)})).join(",")}))).join("\r\n");!0!==Quasar.exportFile(`${n||"table-export"}.csv`,i,"text/csv")&&Quasar.Notify.create({message:"Browser denied file download...",color:"negative",icon:null})},convertMarkdown(e){const t=new showdown.Converter;return t.setFlavor("github"),t.setOption("simpleLineBreaks",!0),t.makeHtml(e)},hexToRgb:function(e){return Quasar.colors.hexToRgb(e)},hexDarken:function(e,t){return Quasar.colors.lighten(e,t)},hexAlpha:function(e,t){return Quasar.colors.changeAlpha(e,t)},getPaletteColor:function(e){return Quasar.colors.getPaletteColor(e)}}},window.windowMixin={i18n:window.i18n,data:function(){return{toggleSubs:!0,reactionChoice:"confettiBothSides",borderChoice:"",gradientChoice:this.$q.localStorage.getItem("lnbits.gradientBg")||!1,isUserAuthorized:!1,g:{offline:!navigator.onLine,visibleDrawer:!1,extensions:[],user:null,wallet:null,payments:[],allowedThemes:null,langs:[]}}},methods:{changeColor:function(e){document.body.setAttribute("data-theme",e),this.$q.localStorage.set("lnbits.theme",e)},applyGradient:function(){if(this.$q.localStorage.getItem("lnbits.gradientBg")){this.setColors(),darkBgColor=this.$q.localStorage.getItem("lnbits.darkBgColor"),primaryColor=this.$q.localStorage.getItem("lnbits.primaryColor");const e=`linear-gradient(to bottom right, ${LNbits.utils.hexDarken(String(primaryColor),-70)}, #0a0a0a)`;document.body.style.setProperty("background-image",e,"important");const t=`background-color: ${LNbits.utils.hexAlpha(String(darkBgColor),.4)} !important`,n=document.createElement("style");n.innerHTML=`body[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"] .q-card:not(.q-dialog .q-card, .lnbits__dialog-card, .q-dialog-plugin--dark), body.body${this.$q.dark.isActive?"--dark":""} .q-header, body.body${this.$q.dark.isActive?"--dark":""} .q-drawer { ${t} }body[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"].body--dark{background: ${LNbits.utils.hexDarken(String(primaryColor),-88)} !important; }[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"] .q-card--dark{background: ${String(darkBgColor)} !important;} }`,document.head.appendChild(n)}},applyBorder:function(){this.borderChoice&&this.$q.localStorage.setItem("lnbits.border",this.borderChoice);let e,t=this.$q.localStorage.getItem("lnbits.border");t||(this.$q.localStorage.set("lnbits.border","retro-border"),t="hard-border"),this.borderChoice=t,"hard-border"==t&&(e="box-shadow: 0 0 0 1px rgba(0,0,0,.12), 0 0 0 1px #ffffff47; border: none;"),"no-border"==t&&(e="box-shadow: none; border: none;"),"retro-border"==t&&(e="border: none; border-color: rgba(255, 255, 255, 0.28); box-shadow: 0 1px 5px rgba(255, 255, 255, 0.2), 0 2px 2px rgba(255, 255, 255, 0.14), 0 3px 1px -2px rgba(255, 255, 255, 0.12);");let n=document.createElement("style");n.innerHTML=`body[data-theme="${this.$q.localStorage.getItem("lnbits.theme")}"] .q-card.q-card--dark, .q-date--dark { ${e} }`,document.head.appendChild(n)},setColors:function(){this.$q.localStorage.set("lnbits.primaryColor",LNbits.utils.getPaletteColor("primary")),this.$q.localStorage.set("lnbits.secondaryColor",LNbits.utils.getPaletteColor("secondary")),this.$q.localStorage.set("lnbits.darkBgColor",LNbits.utils.getPaletteColor("dark"))},copyText:function(e,t,n){Quasar.copyToClipboard(e).then((function(){Quasar.Notify.create({message:t||"Copied to clipboard!",position:n||"bottom"})}))},checkUsrInUrl:async function(){try{const e=new URLSearchParams(window.location.search),t=e.get("usr");if(!t)return;this.isUserAuthorized||await LNbits.api.loginUsr(t),e.delete("usr");const n=e.size?`?${e.toString()}`:"";window.history.replaceState({},document.title,window.location.pathname+n)}finally{this.isUserAuthorized=!!this.$q.cookies.get("is_lnbits_user_authorized")}},logout:async function(){LNbits.utils.confirmDialog('Do you really want to logout? Please visit "My Account" page to check your credentials!').onOk((async()=>{try{await LNbits.api.logout(),window.location="/"}catch(e){LNbits.utils.notifyApiError(e)}}))},themeParams(){const e=new URL(window.location.href),t=new URLSearchParams(window.location.search),n=["theme","dark","gradient"],a=e=>"true"===e.trim().toLowerCase()||"1"===e;if(n.some((e=>t.has(e)))){const i=t.get("theme"),r=t.get("dark"),o=t.get("gradient"),s=t.get("border");if(i&&this.g.allowedThemes.includes(i.trim().toLowerCase())){const e=i.trim().toLowerCase();document.body.setAttribute("data-theme",e),this.$q.localStorage.set("lnbits.theme",e)}if(r){const e=a(r);this.$q.localStorage.set("lnbits.darkMode",e),e||this.$q.localStorage.set("lnbits.gradientBg",!1)}if(o){const e=a(o);this.$q.localStorage.set("lnbits.gradientBg",e),e&&this.$q.localStorage.set("lnbits.darkMode",!0)}s&&this.$q.localStorage.set("lnbits.border",s),n.forEach((e=>t.delete(e))),window.history.replaceState(null,null,e.pathname)}this.setColors()}},created:async function(){1==this.$q.localStorage.getItem("lnbits.darkMode")||0==this.$q.localStorage.getItem("lnbits.darkMode")?this.$q.dark.set(this.$q.localStorage.getItem("lnbits.darkMode")):this.$q.dark.set(!0),this.reactionChoice=this.$q.localStorage.getItem("lnbits.reactions")||"confettiBothSides",this.g.allowedThemes=window.allowedThemes??["bitcoin"];let e=this.$q.localStorage.getItem("lnbits.lang");if(e&&(window.LOCALE=e,window.i18n.global.locale=e),this.g.langs=window.langs??[],addEventListener("offline",(e=>{this.g.offline=!0})),addEventListener("online",(e=>{this.g.offline=!1})),this.$q.localStorage.getItem("lnbits.theme")||this.changeColor(this.g.allowedThemes[0]),this.$q.localStorage.getItem("lnbits.theme")&&!this.g.allowedThemes.includes(this.$q.localStorage.getItem("lnbits.theme"))&&this.changeColor(this.g.allowedThemes[0]),this.$q.localStorage.getItem("lnbits.theme")&&document.body.setAttribute("data-theme",this.$q.localStorage.getItem("lnbits.theme")),this.applyGradient(),this.applyBorder(),window.user&&(this.g.user=Object.freeze(window.LNbits.map.user(window.user))),window.wallet&&(this.g.wallet=Object.freeze(window.LNbits.map.wallet(window.wallet))),window.extensions){const e=this.g.user,t=Object.freeze(window.extensions.map((function(e){return window.LNbits.map.extension(e)})).filter((function(e){return!e.hidden})).filter((function(e){return window.user?.admin?e:!e.isAdminOnly})).map((function(t){return t.isEnabled=!!e&&-1!==e.extensions.indexOf(t.code),t})).sort((function(e,t){const n=e.name.toUpperCase(),a=t.name.toUpperCase();return na?1:0})));this.g.extensions=t}await this.checkUsrInUrl(),this.themeParams()}},window.decryptLnurlPayAES=function(e,t){let n=new Uint8Array(t.match(/[\da-f]{2}/gi).map((e=>parseInt(e,16))));return crypto.subtle.importKey("raw",n,{name:"AES-CBC",length:256},!1,["decrypt"]).then((t=>{let n=Uint8Array.from(window.atob(e.iv),(e=>e.charCodeAt(0))),a=Uint8Array.from(window.atob(e.ciphertext),(e=>e.charCodeAt(0)));return crypto.subtle.decrypt({name:"AES-CBC",iv:n},t,a)})).then((e=>new TextDecoder("utf-8").decode(e)))},function(e,t){!function e(t,n,a,i){var r=!!(t.Worker&&t.Blob&&t.Promise&&t.OffscreenCanvas&&t.OffscreenCanvasRenderingContext2D&&t.HTMLCanvasElement&&t.HTMLCanvasElement.prototype.transferControlToOffscreen&&t.URL&&t.URL.createObjectURL);function o(){}function s(e){var a=n.exports.Promise,i=void 0!==a?a:t.Promise;return"function"==typeof i?new i(e):(e(o,o),null)}var l,u,c,d,h,p,f,m,g=(c=Math.floor(1e3/60),d={},h=0,"function"==typeof requestAnimationFrame&&"function"==typeof cancelAnimationFrame?(l=function(e){var t=Math.random();return d[t]=requestAnimationFrame((function n(a){h===a||h+c-1{a=(a<<5)+e,n+=5,n>=8&&(i.push(a>>n-8&255),n-=8)})),t&&n>0&&i.push(a<<8-n&255),i}function bech32ToUTF8String(e){let t=fiveBitArrayTo8BitArray(bech32ToFiveBitArray(e)),n="";for(let e=0;e20&&(t-=20,e/=Math.pow(10,t),e+=new Array(t+1).join("0"));return e} diff --git a/lnbits/static/css/base.css b/lnbits/static/css/base.css index c5c92f227..4eebe45dd 100644 --- a/lnbits/static/css/base.css +++ b/lnbits/static/css/base.css @@ -530,23 +530,26 @@ video { overflow-wrap: break-word; } -.qrcode__wrapper canvas { +.qrcode__wrapper { position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.qrcode__wrapper canvas { width: 100% !important; - max-width: 100%; - max-height: 100%; + height: 100% !important; + max-width: 350px; } .qrcode__image { + position: absolute; + max-width: 52px; width: 15%; - height: 15%; overflow: hidden; background: #fff; - left: 50%; overflow: hidden; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); padding: 0.2rem; border-radius: 0.2rem; } diff --git a/lnbits/static/i18n/en.js b/lnbits/static/i18n/en.js index 247ae2609..0a6423c6f 100644 --- a/lnbits/static/i18n/en.js +++ b/lnbits/static/i18n/en.js @@ -268,5 +268,6 @@ window.localisation.en = { contributors: 'Contributors', license: 'License', reset_key: 'Reset Key', - reset_password: 'Reset Password' + reset_password: 'Reset Password', + border_choices: 'Border Choices' } diff --git a/lnbits/static/js/account.js b/lnbits/static/js/account.js index 82df5a745..5a1dc1962 100644 --- a/lnbits/static/js/account.js +++ b/lnbits/static/js/account.js @@ -12,6 +12,7 @@ window.app = Vue.createApp({ 'confettiFireworks', 'confettiStars' ], + borderOptions: ['retro-border', 'hard-border', 'no-border'], tab: 'user', credentialsData: { show: false, @@ -63,6 +64,27 @@ window.app = Vue.createApp({ this.$q.localStorage.set('lnbits.gradientBg', false) } }, + applyBorder: function () { + slef = this + if (this.borderChoice) { + this.$q.localStorage.setItem('lnbits.border', this.borderChoice) + } + let borderStyle = this.$q.localStorage.getItem('lnbits.border') + this.borderChoice = borderStyle + let borderStyleCSS + if (borderStyle == 'hard-border') { + borderStyleCSS = `box-shadow: 0 0 0 1px rgba(0,0,0,.12), 0 0 0 1px #ffffff47; border: none;` + } + if (borderStyle == 'no-border') { + borderStyleCSS = `box-shadow: none; border: none;` + } + if (borderStyle == 'retro-border') { + borderStyleCSS = `border: none; border-color: rgba(255, 255, 255, 0.28); box-shadow: 0 1px 5px rgba(255, 255, 255, 0.2), 0 2px 2px rgba(255, 255, 255, 0.14), 0 3px 1px -2px rgba(255, 255, 255, 0.12);` + } + let style = document.createElement('style') + style.innerHTML = `body[data-theme="${this.$q.localStorage.getItem('lnbits.theme')}"] .q-card.q-card--dark, .q-date--dark { ${borderStyleCSS} }` + document.head.appendChild(style) + }, toggleGradient: function () { this.gradientChoice = !this.gradientChoice this.applyGradient() @@ -92,7 +114,7 @@ window.app = Vue.createApp({ user_id: this.user.id, username: this.user.username, email: this.user.email, - config: this.user.config + extra: this.user.extra } ) this.user = data @@ -183,12 +205,15 @@ window.app = Vue.createApp({ const {data} = await LNbits.api.getAuthenticatedUser() this.user = data this.hasUsername = !!data.username - if (!this.user.config) this.user.config = {} + if (!this.user.extra) this.user.extra = {} } catch (e) { LNbits.utils.notifyApiError(e) } if (this.$q.localStorage.getItem('lnbits.gradientBg')) { this.applyGradient() } + if (this.$q.localStorage.getItem('lnbits.border')) { + this.applyBorder() + } } }) diff --git a/lnbits/static/js/base.js b/lnbits/static/js/base.js index afcd3b595..d6805a6f8 100644 --- a/lnbits/static/js/base.js +++ b/lnbits/static/js/base.js @@ -278,7 +278,7 @@ window.LNbits = { preimage: data.preimage, payment_hash: data.payment_hash, expiry: data.expiry, - extra: data.extra, + extra: data.extra ?? {}, wallet_id: data.wallet_id, webhook: data.webhook, webhook_status: data.webhook_status, @@ -286,13 +286,10 @@ window.LNbits = { fiat_currency: data.fiat_currency } - obj.date = Quasar.date.formatDate( - new Date(obj.time * 1000), - 'YYYY-MM-DD HH:mm' - ) + obj.date = Quasar.date.formatDate(new Date(obj.time), 'YYYY-MM-DD HH:mm') obj.dateFrom = moment(obj.date).fromNow() obj.expirydate = Quasar.date.formatDate( - new Date(obj.expiry * 1000), + new Date(obj.expiry), 'YYYY-MM-DD HH:mm' ) obj.expirydateFrom = moment(obj.expirydate).fromNow() @@ -337,6 +334,12 @@ window.LNbits = { .join('') return hashHex }, + formatDate: function (timestamp) { + return Quasar.date.formatDate( + new Date(timestamp * 1000), + 'YYYY-MM-DD HH:mm' + ) + }, formatCurrency: function (value, currency) { return new Intl.NumberFormat(window.LOCALE, { style: 'currency', @@ -476,6 +479,7 @@ window.windowMixin = { return { toggleSubs: true, reactionChoice: 'confettiBothSides', + borderChoice: '', gradientChoice: this.$q.localStorage.getItem('lnbits.gradientBg') || false, isUserAuthorized: false, @@ -517,6 +521,30 @@ window.windowMixin = { document.head.appendChild(style) } }, + applyBorder: function () { + if (this.borderChoice) { + this.$q.localStorage.setItem('lnbits.border', this.borderChoice) + } + let borderStyle = this.$q.localStorage.getItem('lnbits.border') + if (!borderStyle) { + this.$q.localStorage.set('lnbits.border', 'retro-border') + borderStyle = 'hard-border' + } + this.borderChoice = borderStyle + let borderStyleCSS + if (borderStyle == 'hard-border') { + borderStyleCSS = `box-shadow: 0 0 0 1px rgba(0,0,0,.12), 0 0 0 1px #ffffff47; border: none;` + } + if (borderStyle == 'no-border') { + borderStyleCSS = `box-shadow: none; border: none;` + } + if (borderStyle == 'retro-border') { + borderStyleCSS = `border: none; border-color: rgba(255, 255, 255, 0.28); box-shadow: 0 1px 5px rgba(255, 255, 255, 0.2), 0 2px 2px rgba(255, 255, 255, 0.14), 0 3px 1px -2px rgba(255, 255, 255, 0.12);` + } + let style = document.createElement('style') + style.innerHTML = `body[data-theme="${this.$q.localStorage.getItem('lnbits.theme')}"] .q-card.q-card--dark, .q-date--dark { ${borderStyleCSS} }` + document.head.appendChild(style) + }, setColors: function () { this.$q.localStorage.set( 'lnbits.primaryColor', @@ -592,6 +620,7 @@ window.windowMixin = { const theme = params.get('theme') const darkMode = params.get('dark') const gradient = params.get('gradient') + const border = params.get('border') if ( theme && @@ -617,6 +646,9 @@ window.windowMixin = { this.$q.localStorage.set('lnbits.darkMode', true) } } + if (border) { + this.$q.localStorage.set('lnbits.border', border) + } // Remove processed parameters fields.forEach(param => params.delete(param)) @@ -678,6 +710,7 @@ window.windowMixin = { } this.applyGradient() + this.applyBorder() if (window.user) { this.g.user = Object.freeze(window.LNbits.map.user(window.user)) diff --git a/lnbits/static/js/components.js b/lnbits/static/js/components.js index fc723d870..fb9ccd4af 100644 --- a/lnbits/static/js/components.js +++ b/lnbits/static/js/components.js @@ -200,11 +200,25 @@ window.app.component('lnbits-qrcode', { components: { QrcodeVue }, - props: ['value'], + props: { + value: { + type: String, + required: true + }, + options: Object + }, data() { return { - logo: LNBITS_QR_LOGO + custom: { + margin: 1, + width: 350, + size: 350, + logo: LNBITS_QR_LOGO + } } + }, + created() { + this.custom = {...this.custom, ...this.options} } }) @@ -405,7 +419,7 @@ window.app.component('lnbits-notifications-btn', { window.app.component('lnbits-dynamic-fields', { template: '#lnbits-dynamic-fields', mixins: [window.windowMixin], - props: ['options', 'value'], + props: ['options', 'modelValue'], data() { return { formData: null, @@ -427,11 +441,42 @@ window.app.component('lnbits-dynamic-fields', { }, {}) }, handleValueChanged() { - this.$emit('input', this.formData) + this.$emit('update:model-value', this.formData) } }, created() { - this.formData = this.buildData(this.options, this.value) + this.formData = this.buildData(this.options, this.modelValue) + } +}) + +window.app.component('lnbits-dynamic-chips', { + template: '#lnbits-dynamic-chips', + mixins: [window.windowMixin], + props: ['modelValue'], + data() { + return { + chip: '', + chips: [] + } + }, + methods: { + addChip() { + if (!this.chip) return + this.chips.push(this.chip) + this.chip = '' + this.$emit('update:model-value', this.chips.join(',')) + }, + removeChip(index) { + this.chips.splice(index, 1) + this.$emit('update:model-value', this.chips.join(',')) + } + }, + created() { + if (typeof this.modelValue === 'string') { + this.chips = this.modelValue.split(',') + } else { + this.chips = [...this.modelValue] + } } }) @@ -444,7 +489,7 @@ window.app.component('lnbits-update-balance', { return LNBITS_DENOMINATION }, admin() { - return this.g.user.admin + return user.super_user } }, data: function () { diff --git a/lnbits/static/js/node.js b/lnbits/static/js/node.js index 0fef92f29..ddd617b18 100644 --- a/lnbits/static/js/node.js +++ b/lnbits/static/js/node.js @@ -1,9 +1,3 @@ -function shortenNodeId(nodeId) { - return nodeId - ? nodeId.substring(0, 5) + '...' + nodeId.substring(nodeId.length - 5) - : '...' -} - window.app.component('lnbits-node-ranks', { props: ['ranks'], data: function () { @@ -141,7 +135,11 @@ window.app.component('lnbits-node-info', { }, mixins: [window.windowMixin], methods: { - shortenNodeId + shortenNodeId(nodeId) { + return nodeId + ? nodeId.substring(0, 5) + '...' + nodeId.substring(nodeId.length - 5) + : '...' + } }, template: `
diff --git a/lnbits/static/js/users.js b/lnbits/static/js/users.js index 8dfc7bd77..f5d65119e 100644 --- a/lnbits/static/js/users.js +++ b/lnbits/static/js/users.js @@ -165,32 +165,22 @@ window.app = Vue.createApp({ type: 'bubble', options: { scales: { - xAxes: [ - { - type: 'linear', - ticks: { - beginAtZero: true - }, - scaleLabel: { - display: true, - labelString: 'Tx count' - } + x: { + type: 'linear', + beginAtZero: true, + title: { + text: 'Transaction count' } - ], - yAxes: [ - { - type: 'linear', - ticks: { - beginAtZero: true - }, - scaleLabel: { - display: true, - labelString: 'User balance in million sats' - } + }, + y: { + type: 'linear', + beginAtZero: true, + title: { + text: 'User balance in million sats' } - ] + } }, - tooltips: { + tooltip: { callbacks: { label: function (tooltipItem, data) { const dataset = data.datasets[tooltipItem.datasetIndex] @@ -215,6 +205,9 @@ window.app = Vue.createApp({ }) }, methods: { + formatDate: function (value) { + return LNbits.utils.formatDate(value) + }, formatSat: function (value) { return LNbits.utils.formatSat(Math.floor(value / 1000)) }, diff --git a/lnbits/static/js/wallet.js b/lnbits/static/js/wallet.js index 0f2f0e4e2..0a58bf206 100644 --- a/lnbits/static/js/wallet.js +++ b/lnbits/static/js/wallet.js @@ -5,7 +5,10 @@ window.app = Vue.createApp({ return { updatePayments: false, origin: window.location.origin, + wallet: LNbits.map.wallet(window.wallet), user: LNbits.map.user(window.user), + exportUrl: `${window.location.origin}/wallet?usr=${window.user.id}&wal=${window.wallet.id}`, + baseUrl: `${window.location.protocol}//${window.location.host}/`, receive: { show: false, status: 'pending', @@ -142,9 +145,11 @@ window.app = Vue.createApp({ ) .then(response => { this.receive.status = 'success' - this.receive.paymentReq = response.data.payment_request + this.receive.paymentReq = response.data.bolt11 this.receive.paymentHash = response.data.payment_hash + // TODO: lnurl_callback and lnurl_response + // WITHDRAW if (response.data.lnurl_response !== null) { if (response.data.lnurl_response === false) { response.data.lnurl_response = `Unable to connect` @@ -255,7 +260,7 @@ window.app = Vue.createApp({ }) }, decodeQR: function (res) { - this.parse.data.request = res + this.parse.data.request = res[0].rawValue this.decodeRequest() this.parse.camera.show = false }, @@ -391,12 +396,13 @@ window.app = Vue.createApp({ dismissPaymentMsg() clearInterval(this.parse.paymentChecker) // show lnurlpay success action - if (response.data.success_action) { - switch (response.data.success_action.tag) { + const extra = response.data.extra + if (extra.success_action) { + switch (extra.success_action.tag) { case 'url': Quasar.Notify.create({ - message: `${response.data.success_action.url}`, - caption: response.data.success_action.description, + message: `${extra.success_action.url}`, + caption: extra.success_action.description, html: true, type: 'positive', timeout: 0, @@ -405,7 +411,7 @@ window.app = Vue.createApp({ break case 'message': Quasar.Notify.create({ - message: response.data.success_action.message, + message: extra.success_action.message, type: 'positive', timeout: 0, closeBtn: true @@ -416,14 +422,14 @@ window.app = Vue.createApp({ .getPayment(this.g.wallet, response.data.payment_hash) .then(({data: payment}) => decryptLnurlPayAES( - response.data.success_action, + extra.success_action, payment.preimage ) ) .then(value => { Quasar.Notify.create({ message: value, - caption: response.data.success_action.description, + caption: extra.success_action.description, html: true, type: 'positive', timeout: 0, diff --git a/lnbits/static/scss/base.scss b/lnbits/static/scss/base.scss index fe4ac7ed8..3c89bf95f 100644 --- a/lnbits/static/scss/base.scss +++ b/lnbits/static/scss/base.scss @@ -207,23 +207,24 @@ video { } // qrcode -.qrcode__wrapper canvas { +.qrcode__wrapper { position: relative; - width: 100% !important; // important to override qrcode inline width - max-width: 100%; - max-height: 100%; + display: flex; + align-items: center; + justify-content: center; +} +.qrcode__wrapper canvas { + width: 100% !important; // important to override qrcode inline width + height: 100% !important; + max-width: 350px; // default width of component } - .qrcode__image { + position: absolute; + max-width: 52px; width: 15%; - height: 15%; overflow: hidden; background: #fff; - left: 50%; overflow: hidden; - position: absolute; - top: 50%; - transform: translate(-50%, -50%); padding: 0.2rem; border-radius: 0.2rem; } diff --git a/lnbits/static/vendor/vue-qrcode-reader.umd.js b/lnbits/static/vendor/vue-qrcode-reader.umd.js index 033634978..17e8ed565 100644 --- a/lnbits/static/vendor/vue-qrcode-reader.umd.js +++ b/lnbits/static/vendor/vue-qrcode-reader.umd.js @@ -1,3 +1,3 @@ (function(ee,O){typeof exports=="object"&&typeof module<"u"?O(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],O):(ee=typeof globalThis<"u"?globalThis:ee||self,O(ee.VueQrcodeReader={},ee.Vue))})(this,function(ee,O){"use strict";var Wt=(r,o,i)=>{if(!o.has(r))throw TypeError("Cannot "+i)},jt=(r,o,i)=>(Wt(r,o,"read from private field"),i?i.call(r):o.get(r)),tn=(r,o,i)=>{if(o.has(r))throw TypeError("Cannot add the same private member more than once");o instanceof WeakSet?o.add(r):o.set(r,i)},rn=(r,o,i,c)=>(Wt(r,o,"write to private field"),o.set(r,i),i);const Lt=[["aztec","Aztec"],["code_128","Code128"],["code_39","Code39"],["code_93","Code93"],["codabar","Codabar"],["databar","DataBar"],["databar_expanded","DataBarExpanded"],["data_matrix","DataMatrix"],["dx_film_edge","DXFilmEdge"],["ean_13","EAN-13"],["ean_8","EAN-8"],["itf","ITF"],["maxi_code","MaxiCode"],["micro_qr_code","MicroQRCode"],["pdf417","PDF417"],["qr_code","QRCode"],["rm_qr_code","rMQRCode"],["upc_a","UPC-A"],["upc_e","UPC-E"],["linear_codes","Linear-Codes"],["matrix_codes","Matrix-Codes"]],nn=[...Lt,["unknown"]].map(r=>r[0]),Le=new Map(Lt);function an(r){for(const[o,i]of Le)if(r===i)return o;return"unknown"}function on(r){if(Ht(r))return{width:r.naturalWidth,height:r.naturalHeight};if(Bt(r))return{width:r.width.baseVal.value,height:r.height.baseVal.value};if(Vt(r))return{width:r.videoWidth,height:r.videoHeight};if(Nt(r))return{width:r.width,height:r.height};if(Gt(r))return{width:r.displayWidth,height:r.displayHeight};if(qt(r))return{width:r.width,height:r.height};if(zt(r))return{width:r.width,height:r.height};throw new TypeError("The provided value is not of type '(Blob or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or ImageData or OffscreenCanvas or SVGImageElement or VideoFrame)'.")}function Ht(r){try{return r instanceof HTMLImageElement}catch(o){return!1}}function Bt(r){try{return r instanceof SVGImageElement}catch(o){return!1}}function Vt(r){try{return r instanceof HTMLVideoElement}catch(o){return!1}}function qt(r){try{return r instanceof HTMLCanvasElement}catch(o){return!1}}function Nt(r){try{return r instanceof ImageBitmap}catch(o){return!1}}function zt(r){try{return r instanceof OffscreenCanvas}catch(o){return!1}}function Gt(r){try{return r instanceof VideoFrame}catch(o){return!1}}function Yt(r){try{return r instanceof Blob}catch(o){return!1}}function sn(r){try{return r instanceof ImageData}catch(o){return!1}}function cn(r,o){try{const i=new OffscreenCanvas(r,o);if(i.getContext("2d")instanceof OffscreenCanvasRenderingContext2D)return i;throw void 0}catch(i){const c=document.createElement("canvas");return c.width=r,c.height=o,c}}async function Jt(r){if(Ht(r)&&!await fn(r))throw new DOMException("Failed to load or decode HTMLImageElement.","InvalidStateError");if(Bt(r)&&!await hn(r))throw new DOMException("Failed to load or decode SVGImageElement.","InvalidStateError");if(Gt(r)&&pn(r))throw new DOMException("VideoFrame is closed.","InvalidStateError");if(Vt(r)&&(r.readyState===0||r.readyState===1))throw new DOMException("Invalid element or state.","InvalidStateError");if(Nt(r)&&vn(r))throw new DOMException("The image source is detached.","InvalidStateError");const{width:o,height:i}=on(r);if(o===0||i===0)return null;const c=cn(o,i).getContext("2d");c.drawImage(r,0,0);try{return c.getImageData(0,0,o,i)}catch(l){throw new DOMException("Source would taint origin.","SecurityError")}}async function un(r){let o;try{if(globalThis.createImageBitmap)o=await createImageBitmap(r);else if(globalThis.Image){o=new Image;let i="";try{i=URL.createObjectURL(r),o.src=i,await o.decode()}finally{URL.revokeObjectURL(i)}}else return r}catch(i){throw new DOMException("Failed to load or decode Blob.","InvalidStateError")}return await Jt(o)}function ln(r){const{width:o,height:i}=r;if(o===0||i===0)return null;const c=r.getContext("2d");try{return c.getImageData(0,0,o,i)}catch(l){throw new DOMException("Source would taint origin.","SecurityError")}}async function dn(r){if(Yt(r))return await un(r);if(sn(r)){if(mn(r))throw new DOMException("The image data has been detached.","InvalidStateError");return r}return qt(r)||zt(r)?ln(r):await Jt(r)}async function fn(r){try{return await r.decode(),!0}catch(o){return!1}}async function hn(r){var o;try{return await((o=r.decode)==null?void 0:o.call(r)),!0}catch(i){return!1}}function pn(r){return r.format===null}function mn(r){return r.data.buffer.byteLength===0}function vn(r){return r.width===0&&r.height===0}function Qt(r,o){return r instanceof DOMException?new DOMException(`${o}: ${r.message}`,r.name):r instanceof Error?new r.constructor(`${o}: ${r.message}`):new Error(`${o}: ${r}`)}const Xt=["Aztec","Codabar","Code128","Code39","Code93","DataBar","DataBarExpanded","DataMatrix","DXFilmEdge","EAN-13","EAN-8","ITF","Linear-Codes","Matrix-Codes","MaxiCode","MicroQRCode","None","PDF417","QRCode","rMQRCode","UPC-A","UPC-E"];function yn(r){return r.join("|")}function gn(r){const o=Zt(r);let i=0,c=Xt.length-1;for(;i<=c;){const l=Math.floor((i+c)/2),h=Xt[l],v=Zt(h);if(v===o)return h;v{const i=r.match(/_(.+?)\.wasm$/);return i?`https://fastly.jsdelivr.net/npm/zxing-wasm@1.1.3/dist/${i[1]}/${r}`:o+r}};let ut=new WeakMap;function lt(r,o){var i;const c=ut.get(r);if(c!=null&&c.modulePromise&&o===void 0)return c.modulePromise;const l=(i=c==null?void 0:c.moduleOverrides)!=null?i:Pn,h=r({...l});return ut.set(r,{moduleOverrides:l,modulePromise:h}),h}function Tn(r,o){ut.set(r,{moduleOverrides:o})}async function En(r,o,i=Ce){const c={...Ce,...i},l=await lt(r),{size:h}=o,v=new Uint8Array(await o.arrayBuffer()),g=l._malloc(h);l.HEAPU8.set(v,g);const b=l.readBarcodesFromImage(g,h,Kt(l,c));l._free(g);const p=[];for(let C=0;C{var r=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return function(o={}){var i=o,c,l;i.ready=new Promise((e,t)=>{c=e,l=t});var h=Object.assign({},i),v="./this.program",g=typeof window=="object",b=typeof importScripts=="function";typeof process=="object"&&typeof process.versions=="object"&&process.versions.node;var p="";function C(e){return i.locateFile?i.locateFile(e,p):p+e}var S;(g||b)&&(b?p=self.location.href:typeof document<"u"&&document.currentScript&&(p=document.currentScript.src),r&&(p=r),p.indexOf("blob:")!==0?p=p.substr(0,p.replace(/[?#].*/,"").lastIndexOf("/")+1):p="",b&&(S=e=>{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)})),i.print||console.log.bind(console);var $=i.printErr||console.error.bind(console);Object.assign(i,h),h=null,i.arguments&&i.arguments,i.thisProgram&&(v=i.thisProgram),i.quit&&i.quit;var U;i.wasmBinary&&(U=i.wasmBinary),typeof WebAssembly!="object"&&K("no native wasm support detected");var W,j=!1,k,R,Z,I,D,A,me,ce;function Se(){var e=W.buffer;i.HEAP8=k=new Int8Array(e),i.HEAP16=Z=new Int16Array(e),i.HEAPU8=R=new Uint8Array(e),i.HEAPU16=I=new Uint16Array(e),i.HEAP32=D=new Int32Array(e),i.HEAPU32=A=new Uint32Array(e),i.HEAPF32=me=new Float32Array(e),i.HEAPF64=ce=new Float64Array(e)}var Pe=[],De=[],Ae=[];function ze(){if(i.preRun)for(typeof i.preRun=="function"&&(i.preRun=[i.preRun]);i.preRun.length;)pt(i.preRun.shift());wt(Pe)}function ft(){wt(De)}function ht(){if(i.postRun)for(typeof i.postRun=="function"&&(i.postRun=[i.postRun]);i.postRun.length;)Re(i.postRun.shift());wt(Ae)}function pt(e){Pe.unshift(e)}function mt(e){De.unshift(e)}function Re(e){Ae.unshift(e)}var ae=0,ge=null;function vt(e){var t;ae++,(t=i.monitorRunDependencies)===null||t===void 0||t.call(i,ae)}function ve(e){var t;if(ae--,(t=i.monitorRunDependencies)===null||t===void 0||t.call(i,ae),ae==0&&ge){var n=ge;ge=null,n()}}function K(e){var t;(t=i.onAbort)===null||t===void 0||t.call(i,e),e="Aborted("+e+")",$(e),j=!0,e+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(e);throw l(n),n}var yt="data:application/octet-stream;base64,",Ge=e=>e.startsWith(yt),ye;ye="zxing_reader.wasm",Ge(ye)||(ye=C(ye));function Ye(e){if(e==ye&&U)return new Uint8Array(U);if(S)return S(e);throw"both async and sync fetching of the wasm failed"}function gt(e){return!U&&(g||b)&&typeof fetch=="function"?fetch(e,{credentials:"same-origin"}).then(t=>{if(!t.ok)throw"failed to load wasm binary file at '"+e+"'";return t.arrayBuffer()}).catch(()=>Ye(e)):Promise.resolve().then(()=>Ye(e))}function Je(e,t,n){return gt(e).then(a=>WebAssembly.instantiate(a,t)).then(a=>a).then(n,a=>{$(`failed to asynchronously prepare wasm: ${a}`),K(a)})}function wa(e,t,n,a){return!e&&typeof WebAssembly.instantiateStreaming=="function"&&!Ge(t)&&typeof fetch=="function"?fetch(t,{credentials:"same-origin"}).then(s=>{var u=WebAssembly.instantiateStreaming(s,n);return u.then(a,function(d){return $(`wasm streaming compile failed: ${d}`),$("falling back to ArrayBuffer instantiation"),Je(t,n,a)})}):Je(t,n,a)}function ba(){var e={a:ci};function t(a,s){return G=a.exports,W=G.ia,Se(),kr=G.ma,mt(G.ja),ve(),G}vt();function n(a){t(a.instance)}if(i.instantiateWasm)try{return i.instantiateWasm(e,t)}catch(a){$(`Module.instantiateWasm callback failed with error: ${a}`),l(a)}return wa(U,ye,e,n).catch(l),{}}var wt=e=>{for(;e.length>0;)e.shift()(i)};i.noExitRuntime;var Qe=[],Xe=0,Ca=e=>{var t=new bt(e);return t.get_caught()||(t.set_caught(!0),Xe--),t.set_rethrown(!1),Qe.push(t),Yr(t.excPtr),t.get_exception_ptr()},ue=0,$a=()=>{L(0,0);var e=Qe.pop();Gr(e.excPtr),ue=0};function bt(e){this.excPtr=e,this.ptr=e-24,this.set_type=function(t){A[this.ptr+4>>2]=t},this.get_type=function(){return A[this.ptr+4>>2]},this.set_destructor=function(t){A[this.ptr+8>>2]=t},this.get_destructor=function(){return A[this.ptr+8>>2]},this.set_caught=function(t){t=t?1:0,k[this.ptr+12>>0]=t},this.get_caught=function(){return k[this.ptr+12>>0]!=0},this.set_rethrown=function(t){t=t?1:0,k[this.ptr+13>>0]=t},this.get_rethrown=function(){return k[this.ptr+13>>0]!=0},this.init=function(t,n){this.set_adjusted_ptr(0),this.set_type(t),this.set_destructor(n)},this.set_adjusted_ptr=function(t){A[this.ptr+16>>2]=t},this.get_adjusted_ptr=function(){return A[this.ptr+16>>2]},this.get_exception_ptr=function(){var t=Qr(this.get_type());if(t)return A[this.excPtr>>2];var n=this.get_adjusted_ptr();return n!==0?n:this.excPtr}}var _a=e=>{throw ue||(ue=e),ue},Ct=e=>{var t=ue;if(!t)return je(0),0;var n=new bt(t);n.set_adjusted_ptr(t);var a=n.get_type();if(!a)return je(0),t;for(var s in e){var u=e[s];if(u===0||u===a)break;var d=n.ptr+16;if(Jr(u,a,d))return je(u),t}return je(a),t},Sa=()=>Ct([]),Pa=e=>Ct([e]),Ta=(e,t)=>Ct([e,t]),Ea=()=>{var e=Qe.pop();e||K("no exception to throw");var t=e.excPtr;throw e.get_rethrown()||(Qe.push(e),e.set_rethrown(!0),e.set_caught(!1),Xe++),ue=t,ue},Oa=(e,t,n)=>{var a=new bt(e);throw a.init(t,n),ue=e,Xe++,ue},Ma=()=>Xe,Ze={},$t=e=>{for(;e.length;){var t=e.pop(),n=e.pop();n(t)}};function _t(e){return this.fromWireType(D[e>>2])}var Te={},we={},Ke={},Pr,et=e=>{throw new Pr(e)},be=(e,t,n)=>{e.forEach(function(f){Ke[f]=t});function a(f){var m=n(f);m.length!==e.length&&et("Mismatched type converter count");for(var w=0;w{we.hasOwnProperty(f)?s[m]=we[f]:(u.push(f),Te.hasOwnProperty(f)||(Te[f]=[]),Te[f].push(()=>{s[m]=we[f],++d,d===u.length&&a(s)}))}),u.length===0&&a(s)},Da=e=>{var t=Ze[e];delete Ze[e];var n=t.rawConstructor,a=t.rawDestructor,s=t.fields,u=s.map(d=>d.getterReturnType).concat(s.map(d=>d.setterArgumentType));be([e],u,d=>{var f={};return s.forEach((m,w)=>{var _=m.fieldName,T=d[w],E=m.getter,M=m.getterContext,H=d[w+s.length],N=m.setter,F=m.setterContext;f[_]={read:Q=>T.fromWireType(E(M,Q)),write:(Q,y)=>{var P=[];N(F,Q,H.toWireType(P,y)),$t(P)}}}),[{name:t.name,fromWireType:m=>{var w={};for(var _ in f)w[_]=f[_].read(m);return a(m),w},toWireType:(m,w)=>{for(var _ in f)if(!(_ in w))throw new TypeError(`Missing field: "${_}"`);var T=n();for(_ in f)f[_].write(T,w[_]);return m!==null&&m.push(a,T),T},argPackAdvance:ie,readValueFromPointer:_t,destructorFunction:a}]})},Aa=(e,t,n,a,s)=>{},Ra=()=>{for(var e=new Array(256),t=0;t<256;++t)e[t]=String.fromCharCode(t);Tr=e},Tr,J=e=>{for(var t="",n=e;R[n];)t+=Tr[R[n++]];return t},Ee,x=e=>{throw new Ee(e)};function xa(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};var a=t.name;if(e||x(`type "${a}" must have a positive integer typeid pointer`),we.hasOwnProperty(e)){if(n.ignoreDuplicateRegistrations)return;x(`Cannot register type '${a}' twice`)}if(we[e]=t,delete Ke[e],Te.hasOwnProperty(e)){var s=Te[e];delete Te[e],s.forEach(u=>u())}}function oe(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(!("argPackAdvance"in t))throw new TypeError("registerType registeredInstance requires argPackAdvance");return xa(e,t,n)}var ie=8,ka=(e,t,n,a)=>{t=J(t),oe(e,{name:t,fromWireType:function(s){return!!s},toWireType:function(s,u){return u?n:a},argPackAdvance:ie,readValueFromPointer:function(s){return this.fromWireType(R[s])},destructorFunction:null})},Ia=e=>({count:e.count,deleteScheduled:e.deleteScheduled,preservePointerOnDelete:e.preservePointerOnDelete,ptr:e.ptr,ptrType:e.ptrType,smartPtr:e.smartPtr,smartPtrType:e.smartPtrType}),St=e=>{function t(n){return n.$$.ptrType.registeredClass.name}x(t(e)+" instance already deleted")},Pt=!1,Er=e=>{},Fa=e=>{e.smartPtr?e.smartPtrType.rawDestructor(e.smartPtr):e.ptrType.registeredClass.rawDestructor(e.ptr)},Or=e=>{e.count.value-=1;var t=e.count.value===0;t&&Fa(e)},Mr=(e,t,n)=>{if(t===n)return e;if(n.baseClass===void 0)return null;var a=Mr(e,t,n.baseClass);return a===null?null:n.downcast(a)},Dr={},Ua=()=>Object.keys(Ie).length,Wa=()=>{var e=[];for(var t in Ie)Ie.hasOwnProperty(t)&&e.push(Ie[t]);return e},xe=[],Tt=()=>{for(;xe.length;){var e=xe.pop();e.$$.deleteScheduled=!1,e.delete()}},ke,ja=e=>{ke=e,xe.length&&ke&&ke(Tt)},La=()=>{i.getInheritedInstanceCount=Ua,i.getLiveInheritedInstances=Wa,i.flushPendingDeletes=Tt,i.setDelayFunction=ja},Ie={},Ha=(e,t)=>{for(t===void 0&&x("ptr should not be undefined");e.baseClass;)t=e.upcast(t),e=e.baseClass;return t},Ba=(e,t)=>(t=Ha(e,t),Ie[t]),tt=(e,t)=>{(!t.ptrType||!t.ptr)&&et("makeClassHandle requires ptr and ptrType");var n=!!t.smartPtrType,a=!!t.smartPtr;return n!==a&&et("Both smartPtrType and smartPtr must be specified"),t.count={value:1},Fe(Object.create(e,{$$:{value:t,writable:!0}}))};function Va(e){var t=this.getPointee(e);if(!t)return this.destructor(e),null;var n=Ba(this.registeredClass,t);if(n!==void 0){if(n.$$.count.value===0)return n.$$.ptr=t,n.$$.smartPtr=e,n.clone();var a=n.clone();return this.destructor(e),a}function s(){return this.isSmartPointer?tt(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:t,smartPtrType:this,smartPtr:e}):tt(this.registeredClass.instancePrototype,{ptrType:this,ptr:e})}var u=this.registeredClass.getActualType(t),d=Dr[u];if(!d)return s.call(this);var f;this.isConst?f=d.constPointerType:f=d.pointerType;var m=Mr(t,this.registeredClass,f.registeredClass);return m===null?s.call(this):this.isSmartPointer?tt(f.registeredClass.instancePrototype,{ptrType:f,ptr:m,smartPtrType:this,smartPtr:e}):tt(f.registeredClass.instancePrototype,{ptrType:f,ptr:m})}var Fe=e=>typeof FinalizationRegistry>"u"?(Fe=t=>t,e):(Pt=new FinalizationRegistry(t=>{Or(t.$$)}),Fe=t=>{var n=t.$$,a=!!n.smartPtr;if(a){var s={$$:n};Pt.register(t,s,t)}return t},Er=t=>Pt.unregister(t),Fe(e)),qa=()=>{Object.assign(rt.prototype,{isAliasOf(e){if(!(this instanceof rt)||!(e instanceof rt))return!1;var t=this.$$.ptrType.registeredClass,n=this.$$.ptr;e.$$=e.$$;for(var a=e.$$.ptrType.registeredClass,s=e.$$.ptr;t.baseClass;)n=t.upcast(n),t=t.baseClass;for(;a.baseClass;)s=a.upcast(s),a=a.baseClass;return t===a&&n===s},clone(){if(this.$$.ptr||St(this),this.$$.preservePointerOnDelete)return this.$$.count.value+=1,this;var e=Fe(Object.create(Object.getPrototypeOf(this),{$$:{value:Ia(this.$$)}}));return e.$$.count.value+=1,e.$$.deleteScheduled=!1,e},delete(){this.$$.ptr||St(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&x("Object already scheduled for deletion"),Er(this),Or(this.$$),this.$$.preservePointerOnDelete||(this.$$.smartPtr=void 0,this.$$.ptr=void 0)},isDeleted(){return!this.$$.ptr},deleteLater(){return this.$$.ptr||St(this),this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete&&x("Object already scheduled for deletion"),xe.push(this),xe.length===1&&ke&&ke(Tt),this.$$.deleteScheduled=!0,this}})};function rt(){}var Ue=(e,t)=>Object.defineProperty(t,"name",{value:e}),Ar=(e,t,n)=>{if(e[t].overloadTable===void 0){var a=e[t];e[t]=function(){return e[t].overloadTable.hasOwnProperty(arguments.length)||x(`Function '${n}' called with an invalid number of arguments (${arguments.length}) - expects one of (${e[t].overloadTable})!`),e[t].overloadTable[arguments.length].apply(this,arguments)},e[t].overloadTable=[],e[t].overloadTable[a.argCount]=a}},Et=(e,t,n)=>{i.hasOwnProperty(e)?((n===void 0||i[e].overloadTable!==void 0&&i[e].overloadTable[n]!==void 0)&&x(`Cannot register public name '${e}' twice`),Ar(i,e,e),i.hasOwnProperty(n)&&x(`Cannot register multiple overloads of a function with the same number of arguments (${n})!`),i[e].overloadTable[n]=t):(i[e]=t,n!==void 0&&(i[e].numArguments=n))},Na=48,za=57,Ga=e=>{if(e===void 0)return"_unknown";e=e.replace(/[^a-zA-Z0-9_]/g,"$");var t=e.charCodeAt(0);return t>=Na&&t<=za?`_${e}`:e};function Ya(e,t,n,a,s,u,d,f){this.name=e,this.constructor=t,this.instancePrototype=n,this.rawDestructor=a,this.baseClass=s,this.getActualType=u,this.upcast=d,this.downcast=f,this.pureVirtualFunctions=[]}var Ot=(e,t,n)=>{for(;t!==n;)t.upcast||x(`Expected null or instance of ${n.name}, got an instance of ${t.name}`),e=t.upcast(e),t=t.baseClass;return e};function Ja(e,t){if(t===null)return this.isReference&&x(`null is not a valid ${this.name}`),0;t.$$||x(`Cannot pass "${xt(t)}" as a ${this.name}`),t.$$.ptr||x(`Cannot pass deleted object as a pointer of type ${this.name}`);var n=t.$$.ptrType.registeredClass,a=Ot(t.$$.ptr,n,this.registeredClass);return a}function Qa(e,t){var n;if(t===null)return this.isReference&&x(`null is not a valid ${this.name}`),this.isSmartPointer?(n=this.rawConstructor(),e!==null&&e.push(this.rawDestructor,n),n):0;(!t||!t.$$)&&x(`Cannot pass "${xt(t)}" as a ${this.name}`),t.$$.ptr||x(`Cannot pass deleted object as a pointer of type ${this.name}`),!this.isConst&&t.$$.ptrType.isConst&&x(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);var a=t.$$.ptrType.registeredClass;if(n=Ot(t.$$.ptr,a,this.registeredClass),this.isSmartPointer)switch(t.$$.smartPtr===void 0&&x("Passing raw pointer to smart pointer is illegal"),this.sharingPolicy){case 0:t.$$.smartPtrType===this?n=t.$$.smartPtr:x(`Cannot convert argument of type ${t.$$.smartPtrType?t.$$.smartPtrType.name:t.$$.ptrType.name} to parameter type ${this.name}`);break;case 1:n=t.$$.smartPtr;break;case 2:if(t.$$.smartPtrType===this)n=t.$$.smartPtr;else{var s=t.clone();n=this.rawShare(n,le.toHandle(()=>s.delete())),e!==null&&e.push(this.rawDestructor,n)}break;default:x("Unsupporting sharing policy")}return n}function Xa(e,t){if(t===null)return this.isReference&&x(`null is not a valid ${this.name}`),0;t.$$||x(`Cannot pass "${xt(t)}" as a ${this.name}`),t.$$.ptr||x(`Cannot pass deleted object as a pointer of type ${this.name}`),t.$$.ptrType.isConst&&x(`Cannot convert argument of type ${t.$$.ptrType.name} to parameter type ${this.name}`);var n=t.$$.ptrType.registeredClass,a=Ot(t.$$.ptr,n,this.registeredClass);return a}function Rr(e){return this.fromWireType(A[e>>2])}var Za=()=>{Object.assign(nt.prototype,{getPointee(e){return this.rawGetPointee&&(e=this.rawGetPointee(e)),e},destructor(e){var t;(t=this.rawDestructor)===null||t===void 0||t.call(this,e)},argPackAdvance:ie,readValueFromPointer:Rr,deleteObject(e){e!==null&&e.delete()},fromWireType:Va})};function nt(e,t,n,a,s,u,d,f,m,w,_){this.name=e,this.registeredClass=t,this.isReference=n,this.isConst=a,this.isSmartPointer=s,this.pointeeType=u,this.sharingPolicy=d,this.rawGetPointee=f,this.rawConstructor=m,this.rawShare=w,this.rawDestructor=_,!s&&t.baseClass===void 0?a?(this.toWireType=Ja,this.destructorFunction=null):(this.toWireType=Xa,this.destructorFunction=null):this.toWireType=Qa}var xr=(e,t,n)=>{i.hasOwnProperty(e)||et("Replacing nonexistant public symbol"),i[e].overloadTable!==void 0&&n!==void 0?i[e].overloadTable[n]=t:(i[e]=t,i[e].argCount=n)},Ka=(e,t,n)=>{var a=i["dynCall_"+e];return n&&n.length?a.apply(null,[t].concat(n)):a.call(null,t)},at=[],kr,B=e=>{var t=at[e];return t||(e>=at.length&&(at.length=e+1),at[e]=t=kr.get(e)),t},eo=(e,t,n)=>{if(e.includes("j"))return Ka(e,t,n);var a=B(t).apply(null,n);return a},to=(e,t)=>{var n=[];return function(){return n.length=0,Object.assign(n,arguments),eo(e,t,n)}},re=(e,t)=>{e=J(e);function n(){return e.includes("j")?to(e,t):B(t)}var a=n();return typeof a!="function"&&x(`unknown function pointer with signature ${e}: ${t}`),a},ro=(e,t)=>{var n=Ue(t,function(a){this.name=t,this.message=a;var s=new Error(a).stack;s!==void 0&&(this.stack=this.toString()+` `+s.replace(/^Error(:[^\n]*)?\n/,""))});return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.prototype.toString=function(){return this.message===void 0?this.name:`${this.name}: ${this.message}`},n},Ir,Fr=e=>{var t=zr(e),n=J(t);return de(t),n},ot=(e,t)=>{var n=[],a={};function s(u){if(!a[u]&&!we[u]){if(Ke[u]){Ke[u].forEach(s);return}n.push(u),a[u]=!0}}throw t.forEach(s),new Ir(`${e}: `+n.map(Fr).join([", "]))},no=(e,t,n,a,s,u,d,f,m,w,_,T,E)=>{_=J(_),u=re(s,u),f&&(f=re(d,f)),w&&(w=re(m,w)),E=re(T,E);var M=Ga(_);Et(M,function(){ot(`Cannot construct ${_} due to unbound types`,[a])}),be([e,t,n],a?[a]:[],function(H){H=H[0];var N,F;a?(N=H.registeredClass,F=N.instancePrototype):F=rt.prototype;var Q=Ue(_,function(){if(Object.getPrototypeOf(this)!==y)throw new Ee("Use 'new' to construct "+_);if(P.constructor_body===void 0)throw new Ee(_+" has no accessible constructor");var en=P.constructor_body[arguments.length];if(en===void 0)throw new Ee(`Tried to invoke ctor of ${_} with invalid number of parameters (${arguments.length}) - expected (${Object.keys(P.constructor_body).toString()}) parameters instead!`);return en.apply(this,arguments)}),y=Object.create(F,{constructor:{value:Q}});Q.prototype=y;var P=new Ya(_,Q,y,E,N,u,f,w);if(P.baseClass){var z,Y;(Y=(z=P.baseClass).__derivedClasses)!==null&&Y!==void 0||(z.__derivedClasses=[]),P.baseClass.__derivedClasses.push(P)}var Oe=new nt(_,P,!0,!1,!1),ct=new nt(_+"*",P,!1,!1,!1),Kr=new nt(_+" const*",P,!1,!0,!1);return Dr[e]={pointerType:ct,constPointerType:Kr},xr(M,Q),[Oe,ct,Kr]})},Mt=(e,t)=>{for(var n=[],a=0;a>2]);return n};function ao(e){for(var t=1;t{var d=Mt(t,n);s=re(a,s),be([],[e],function(f){f=f[0];var m=`constructor ${f.name}`;if(f.registeredClass.constructor_body===void 0&&(f.registeredClass.constructor_body=[]),f.registeredClass.constructor_body[t-1]!==void 0)throw new Ee(`Cannot register multiple constructors with identical number of parameters (${t-1}) for class '${f.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);return f.registeredClass.constructor_body[t-1]=()=>{ot(`Cannot construct ${f.name} due to unbound types`,d)},be([],d,w=>(w.splice(1,0,null),f.registeredClass.constructor_body[t-1]=Dt(m,w,null,s,u),[])),[]})},Ur=e=>{e=e.trim();const t=e.indexOf("(");return t!==-1?e.substr(0,t):e},io=(e,t,n,a,s,u,d,f,m)=>{var w=Mt(n,a);t=J(t),t=Ur(t),u=re(s,u),be([],[e],function(_){_=_[0];var T=`${_.name}.${t}`;t.startsWith("@@")&&(t=Symbol[t.substring(2)]),f&&_.registeredClass.pureVirtualFunctions.push(t);function E(){ot(`Cannot call ${T} due to unbound types`,w)}var M=_.registeredClass.instancePrototype,H=M[t];return H===void 0||H.overloadTable===void 0&&H.className!==_.name&&H.argCount===n-2?(E.argCount=n-2,E.className=_.name,M[t]=E):(Ar(M,t,T),M[t].overloadTable[n-2]=E),be([],w,function(N){var F=Dt(T,N,_,u,d);return M[t].overloadTable===void 0?(F.argCount=n-2,M[t]=F):M[t].overloadTable[n-2]=F,[]}),[]})};function so(){Object.assign(Wr.prototype,{get(e){return this.allocated[e]},has(e){return this.allocated[e]!==void 0},allocate(e){var t=this.freelist.pop()||this.allocated.length;return this.allocated[t]=e,t},free(e){this.allocated[e]=void 0,this.freelist.push(e)}})}function Wr(){this.allocated=[void 0],this.freelist=[]}var te=new Wr,At=e=>{e>=te.reserved&&--te.get(e).refcount===0&&te.free(e)},co=()=>{for(var e=0,t=te.reserved;t{te.allocated.push({value:void 0},{value:null},{value:!0},{value:!1}),te.reserved=te.allocated.length,i.count_emval_handles=co},le={toValue:e=>(e||x("Cannot use deleted val. handle = "+e),te.get(e).value),toHandle:e=>{switch(e){case void 0:return 1;case null:return 2;case!0:return 3;case!1:return 4;default:return te.allocate({refcount:1,value:e})}}},lo=(e,t)=>{t=J(t),oe(e,{name:t,fromWireType:n=>{var a=le.toValue(n);return At(n),a},toWireType:(n,a)=>le.toHandle(a),argPackAdvance:ie,readValueFromPointer:_t,destructorFunction:null})},fo=(e,t,n)=>{switch(t){case 1:return n?function(a){return this.fromWireType(k[a>>0])}:function(a){return this.fromWireType(R[a>>0])};case 2:return n?function(a){return this.fromWireType(Z[a>>1])}:function(a){return this.fromWireType(I[a>>1])};case 4:return n?function(a){return this.fromWireType(D[a>>2])}:function(a){return this.fromWireType(A[a>>2])};default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},ho=(e,t,n,a)=>{t=J(t);function s(){}s.values={},oe(e,{name:t,constructor:s,fromWireType:function(u){return this.constructor.values[u]},toWireType:(u,d)=>d.value,argPackAdvance:ie,readValueFromPointer:fo(t,n,a),destructorFunction:null}),Et(t,s)},Rt=(e,t)=>{var n=we[e];return n===void 0&&x(t+" has unknown type "+Fr(e)),n},po=(e,t,n)=>{var a=Rt(e,"enum");t=J(t);var s=a.constructor,u=Object.create(a.constructor.prototype,{value:{value:n},constructor:{value:Ue(`${a.name}_${t}`,function(){})}});s.values[n]=u,s[t]=u},xt=e=>{if(e===null)return"null";var t=typeof e;return t==="object"||t==="array"||t==="function"?e.toString():""+e},mo=(e,t)=>{switch(t){case 4:return function(n){return this.fromWireType(me[n>>2])};case 8:return function(n){return this.fromWireType(ce[n>>3])};default:throw new TypeError(`invalid float width (${t}): ${e}`)}},vo=(e,t,n)=>{t=J(t),oe(e,{name:t,fromWireType:a=>a,toWireType:(a,s)=>s,argPackAdvance:ie,readValueFromPointer:mo(t,n),destructorFunction:null})},yo=(e,t,n,a,s,u,d)=>{var f=Mt(t,n);e=J(e),e=Ur(e),s=re(a,s),Et(e,function(){ot(`Cannot call ${e} due to unbound types`,f)},t-1),be([],f,function(m){var w=[m[0],null].concat(m.slice(1));return xr(e,Dt(e,w,null,s,u),t-1),[]})},go=(e,t,n)=>{switch(t){case 1:return n?a=>k[a>>0]:a=>R[a>>0];case 2:return n?a=>Z[a>>1]:a=>I[a>>1];case 4:return n?a=>D[a>>2]:a=>A[a>>2];default:throw new TypeError(`invalid integer width (${t}): ${e}`)}},wo=(e,t,n,a,s)=>{t=J(t);var u=_=>_;if(a===0){var d=32-8*n;u=_=>_<>>d}var f=t.includes("unsigned"),m=(_,T)=>{},w;f?w=function(_,T){return m(T,this.name),T>>>0}:w=function(_,T){return m(T,this.name),T},oe(e,{name:t,fromWireType:u,toWireType:w,argPackAdvance:ie,readValueFromPointer:go(t,n,a!==0),destructorFunction:null})},bo=(e,t,n)=>{var a=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array],s=a[t];function u(d){var f=A[d>>2],m=A[d+4>>2];return new s(k.buffer,m,f)}n=J(n),oe(e,{name:n,fromWireType:u,argPackAdvance:ie,readValueFromPointer:u},{ignoreDuplicateRegistrations:!0})},jr=(e,t,n,a)=>{if(!(a>0))return 0;for(var s=n,u=n+a-1,d=0;d=55296&&f<=57343){var m=e.charCodeAt(++d);f=65536+((f&1023)<<10)|m&1023}if(f<=127){if(n>=u)break;t[n++]=f}else if(f<=2047){if(n+1>=u)break;t[n++]=192|f>>6,t[n++]=128|f&63}else if(f<=65535){if(n+2>=u)break;t[n++]=224|f>>12,t[n++]=128|f>>6&63,t[n++]=128|f&63}else{if(n+3>=u)break;t[n++]=240|f>>18,t[n++]=128|f>>12&63,t[n++]=128|f>>6&63,t[n++]=128|f&63}}return t[n]=0,n-s},Co=(e,t,n)=>jr(e,R,t,n),Lr=e=>{for(var t=0,n=0;n=55296&&a<=57343?(t+=4,++n):t+=3}return t},Hr=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0,$o=(e,t,n)=>{for(var a=t+n,s=t;e[s]&&!(s>=a);)++s;if(s-t>16&&e.buffer&&Hr)return Hr.decode(e.subarray(t,s));for(var u="";t>10,56320|w&1023)}}return u},kt=(e,t)=>e?$o(R,e,t):"",_o=(e,t)=>{t=J(t);var n=t==="std::string";oe(e,{name:t,fromWireType(a){var s=A[a>>2],u=a+4,d;if(n)for(var f=u,m=0;m<=s;++m){var w=u+m;if(m==s||R[w]==0){var _=w-f,T=kt(f,_);d===void 0?d=T:(d+="\0",d+=T),f=w+1}}else{for(var E=new Array(s),m=0;m>2]=u,n&&d)Co(s,m,u+1);else if(d)for(var w=0;w255&&(de(m),x("String has UTF-16 code units that do not fit in 8 bits")),R[m+w]=_}else for(var w=0;w{for(var n=e,a=n>>1,s=a+t/2;!(a>=s)&&I[a];)++a;if(n=a<<1,n-e>32&&Br)return Br.decode(R.subarray(e,n));for(var u="",d=0;!(d>=t/2);++d){var f=Z[e+d*2>>1];if(f==0)break;u+=String.fromCharCode(f)}return u},Po=(e,t,n)=>{var a;if((a=n)!==null&&a!==void 0||(n=2147483647),n<2)return 0;n-=2;for(var s=t,u=n>1]=f,t+=2}return Z[t>>1]=0,t-s},To=e=>e.length*2,Eo=(e,t)=>{for(var n=0,a="";!(n>=t/4);){var s=D[e+n*4>>2];if(s==0)break;if(++n,s>=65536){var u=s-65536;a+=String.fromCharCode(55296|u>>10,56320|u&1023)}else a+=String.fromCharCode(s)}return a},Oo=(e,t,n)=>{var a;if((a=n)!==null&&a!==void 0||(n=2147483647),n<4)return 0;for(var s=t,u=s+n-4,d=0;d=55296&&f<=57343){var m=e.charCodeAt(++d);f=65536+((f&1023)<<10)|m&1023}if(D[t>>2]=f,t+=4,t+4>u)break}return D[t>>2]=0,t-s},Mo=e=>{for(var t=0,n=0;n=55296&&a<=57343&&++n,t+=4}return t},Do=(e,t,n)=>{n=J(n);var a,s,u,d,f;t===2?(a=So,s=Po,d=To,u=()=>I,f=1):t===4&&(a=Eo,s=Oo,d=Mo,u=()=>A,f=2),oe(e,{name:n,fromWireType:m=>{for(var w=A[m>>2],_=u(),T,E=m+4,M=0;M<=w;++M){var H=m+4+M*t;if(M==w||_[H>>f]==0){var N=H-E,F=a(E,N);T===void 0?T=F:(T+="\0",T+=F),E=H+t}}return de(m),T},toWireType:(m,w)=>{typeof w!="string"&&x(`Cannot pass non-string to C++ string type ${n}`);var _=d(w),T=Ut(4+_+t);return A[T>>2]=_>>f,s(w,T+4,_+t),m!==null&&m.push(de,T),T},argPackAdvance:ie,readValueFromPointer:_t,destructorFunction(m){de(m)}})},Ao=(e,t,n,a,s,u)=>{Ze[e]={name:J(t),rawConstructor:re(n,a),rawDestructor:re(s,u),fields:[]}},Ro=(e,t,n,a,s,u,d,f,m,w)=>{Ze[e].fields.push({fieldName:J(t),getterReturnType:n,getter:re(a,s),getterContext:u,setterArgumentType:d,setter:re(f,m),setterContext:w})},xo=(e,t)=>{t=J(t),oe(e,{isVoid:!0,name:t,argPackAdvance:0,fromWireType:()=>{},toWireType:(n,a)=>{}})},It=[],ko=(e,t,n,a)=>(e=It[e],t=le.toValue(t),e(null,t,n,a)),Io={},Fo=e=>{var t=Io[e];return t===void 0?J(e):t},Vr=()=>{if(typeof globalThis=="object")return globalThis;function e(t){t.$$$embind_global$$$=t;var n=typeof $$$embind_global$$$=="object"&&t.$$$embind_global$$$==t;return n||delete t.$$$embind_global$$$,n}if(typeof $$$embind_global$$$=="object"||(typeof global=="object"&&e(global)?$$$embind_global$$$=global:typeof self=="object"&&e(self)&&($$$embind_global$$$=self),typeof $$$embind_global$$$=="object"))return $$$embind_global$$$;throw Error("unable to get global object.")},Uo=e=>e===0?le.toHandle(Vr()):(e=Fo(e),le.toHandle(Vr()[e])),Wo=e=>{var t=It.length;return It.push(e),t},jo=(e,t)=>{for(var n=new Array(e),a=0;a>2],"parameter "+a);return n},Lo=Reflect.construct,Ho=(e,t,n)=>{var a=[],s=e.toWireType(a,n);return a.length&&(A[t>>2]=le.toHandle(a)),s},Bo=(e,t,n)=>{var a=jo(e,t),s=a.shift();e--;var u=new Array(e),d=(m,w,_,T)=>{for(var E=0,M=0;Mm.name).join(", ")}) => ${s.name}>`;return Wo(Ue(f,d))},Vo=e=>{e>4&&(te.get(e).refcount+=1)},qo=e=>{var t=le.toValue(e);$t(t),At(e)},No=(e,t)=>{e=Rt(e,"_emval_take_value");var n=e.readValueFromPointer(t);return le.toHandle(n)},zo=()=>{K("")},Go=(e,t,n)=>R.copyWithin(e,t,t+n),Yo=()=>2147483648,Jo=e=>{var t=W.buffer,n=(e-t.byteLength+65535)/65536;try{return W.grow(n),Se(),1}catch(a){}},Qo=e=>{var t=R.length;e>>>=0;var n=Yo();if(e>n)return!1;for(var a=(m,w)=>m+(w-m%w)%w,s=1;s<=4;s*=2){var u=t*(1+.2/s);u=Math.min(u,e+100663296);var d=Math.min(n,a(Math.max(e,u),65536)),f=Jo(d);if(f)return!0}return!1},Ft={},Xo=()=>v||"./this.program",We=()=>{if(!We.strings){var e=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",t={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:e,_:Xo()};for(var n in Ft)Ft[n]===void 0?delete t[n]:t[n]=Ft[n];var a=[];for(var n in t)a.push(`${n}=${t[n]}`);We.strings=a}return We.strings},Zo=(e,t)=>{for(var n=0;n>0]=e.charCodeAt(n);k[t>>0]=0},Ko=(e,t)=>{var n=0;return We().forEach((a,s)=>{var u=t+n;A[e+s*4>>2]=u,Zo(a,u),n+=a.length+1}),0},ei=(e,t)=>{var n=We();A[e>>2]=n.length;var a=0;return n.forEach(s=>a+=s.length+1),A[t>>2]=a,0},ti=e=>e,it=e=>e%4===0&&(e%100!==0||e%400===0),ri=(e,t)=>{for(var n=0,a=0;a<=t;n+=e[a++]);return n},qr=[31,29,31,30,31,30,31,31,30,31,30,31],Nr=[31,28,31,30,31,30,31,31,30,31,30,31],ni=(e,t)=>{for(var n=new Date(e.getTime());t>0;){var a=it(n.getFullYear()),s=n.getMonth(),u=(a?qr:Nr)[s];if(t>u-n.getDate())t-=u-n.getDate()+1,n.setDate(1),s<11?n.setMonth(s+1):(n.setMonth(0),n.setFullYear(n.getFullYear()+1));else return n.setDate(n.getDate()+t),n}return n};function ai(e,t,n){var a=Lr(e)+1,s=new Array(a);return jr(e,s,0,s.length),s}var oi=(e,t)=>{k.set(e,t)},ii=(e,t,n,a)=>{var s=A[a+40>>2],u={tm_sec:D[a>>2],tm_min:D[a+4>>2],tm_hour:D[a+8>>2],tm_mday:D[a+12>>2],tm_mon:D[a+16>>2],tm_year:D[a+20>>2],tm_wday:D[a+24>>2],tm_yday:D[a+28>>2],tm_isdst:D[a+32>>2],tm_gmtoff:D[a+36>>2],tm_zone:s?kt(s):""},d=kt(n),f={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var m in f)d=d.replace(new RegExp(m,"g"),f[m]);var w=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],_=["January","February","March","April","May","June","July","August","September","October","November","December"];function T(y,P,z){for(var Y=typeof y=="number"?y.toString():y||"";Y.length0?1:0}var Y;return(Y=z(y.getFullYear()-P.getFullYear()))===0&&(Y=z(y.getMonth()-P.getMonth()))===0&&(Y=z(y.getDate()-P.getDate())),Y}function H(y){switch(y.getDay()){case 0:return new Date(y.getFullYear()-1,11,29);case 1:return y;case 2:return new Date(y.getFullYear(),0,3);case 3:return new Date(y.getFullYear(),0,2);case 4:return new Date(y.getFullYear(),0,1);case 5:return new Date(y.getFullYear()-1,11,31);case 6:return new Date(y.getFullYear()-1,11,30)}}function N(y){var P=ni(new Date(y.tm_year+1900,0,1),y.tm_yday),z=new Date(P.getFullYear(),0,4),Y=new Date(P.getFullYear()+1,0,4),Oe=H(z),ct=H(Y);return M(Oe,P)<=0?M(ct,P)<=0?P.getFullYear()+1:P.getFullYear():P.getFullYear()-1}var F={"%a":y=>w[y.tm_wday].substring(0,3),"%A":y=>w[y.tm_wday],"%b":y=>_[y.tm_mon].substring(0,3),"%B":y=>_[y.tm_mon],"%C":y=>{var P=y.tm_year+1900;return E(P/100|0,2)},"%d":y=>E(y.tm_mday,2),"%e":y=>T(y.tm_mday,2," "),"%g":y=>N(y).toString().substring(2),"%G":y=>N(y),"%H":y=>E(y.tm_hour,2),"%I":y=>{var P=y.tm_hour;return P==0?P=12:P>12&&(P-=12),E(P,2)},"%j":y=>E(y.tm_mday+ri(it(y.tm_year+1900)?qr:Nr,y.tm_mon-1),3),"%m":y=>E(y.tm_mon+1,2),"%M":y=>E(y.tm_min,2),"%n":()=>` -`,"%p":y=>y.tm_hour>=0&&y.tm_hour<12?"AM":"PM","%S":y=>E(y.tm_sec,2),"%t":()=>" ","%u":y=>y.tm_wday||7,"%U":y=>{var P=y.tm_yday+7-y.tm_wday;return E(Math.floor(P/7),2)},"%V":y=>{var P=Math.floor((y.tm_yday+7-(y.tm_wday+6)%7)/7);if((y.tm_wday+371-y.tm_yday-2)%7<=2&&P++,P){if(P==53){var z=(y.tm_wday+371-y.tm_yday)%7;z!=4&&(z!=3||!it(y.tm_year))&&(P=1)}}else{P=52;var Y=(y.tm_wday+7-y.tm_yday-1)%7;(Y==4||Y==5&&it(y.tm_year%400-1))&&P++}return E(P,2)},"%w":y=>y.tm_wday,"%W":y=>{var P=y.tm_yday+7-(y.tm_wday+6)%7;return E(Math.floor(P/7),2)},"%y":y=>(y.tm_year+1900).toString().substring(2),"%Y":y=>y.tm_year+1900,"%z":y=>{var P=y.tm_gmtoff,z=P>=0;return P=Math.abs(P)/60,P=P/60*100+P%60,(z?"+":"-")+("0000"+P).slice(-4)},"%Z":y=>y.tm_zone,"%%":()=>"%"};d=d.replace(/%%/g,"\0\0");for(var m in F)d.includes(m)&&(d=d.replace(new RegExp(m,"g"),F[m](u)));d=d.replace(/\0\0/g,"%");var Q=ai(d);return Q.length>t?0:(oi(Q,e),Q.length-1)},si=(e,t,n,a,s)=>ii(e,t,n,a);Pr=i.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},Ra(),Ee=i.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},qa(),La(),Za(),Ir=i.UnboundTypeError=ro(Error,"UnboundTypeError"),so(),uo();var ci={s:Ca,u:$a,b:Sa,g:Pa,q:Ta,J:Ea,f:Oa,V:Ma,d:_a,da:Da,Q:Aa,_:ka,ca:no,ba:oo,w:io,Y:lo,x:ho,h:po,L:vo,M:yo,t:wo,o:bo,K:_o,C:Do,A:Ao,ea:Ro,$:xo,R:ko,ha:At,fa:Uo,Z:Bo,N:Vo,O:qo,aa:No,B:zo,X:Go,W:Qo,T:Ko,U:ei,E:Si,D:hi,F:_i,n:Pi,a:ui,e:mi,m:fi,k:yi,H:Ci,v:wi,G:$i,z:Ei,P:Mi,l:vi,j:pi,c:di,p:li,I:bi,r:Ti,i:gi,y:Oi,ga:ti,S:si},G=ba(),de=i._free=e=>(de=i._free=G.ka)(e),Ut=i._malloc=e=>(Ut=i._malloc=G.la)(e),zr=e=>(zr=G.na)(e),L=(e,t)=>(L=G.oa)(e,t),je=e=>(je=G.pa)(e),V=()=>(V=G.qa)(),q=e=>(q=G.ra)(e),Gr=e=>(Gr=G.sa)(e),Yr=e=>(Yr=G.ta)(e),Jr=(e,t,n)=>(Jr=G.ua)(e,t,n),Qr=e=>(Qr=G.va)(e);i.dynCall_viijii=(e,t,n,a,s,u,d)=>(i.dynCall_viijii=G.wa)(e,t,n,a,s,u,d);var Xr=i.dynCall_jiiii=(e,t,n,a,s)=>(Xr=i.dynCall_jiiii=G.xa)(e,t,n,a,s);i.dynCall_iiiiij=(e,t,n,a,s,u,d)=>(i.dynCall_iiiiij=G.ya)(e,t,n,a,s,u,d),i.dynCall_iiiiijj=(e,t,n,a,s,u,d,f,m)=>(i.dynCall_iiiiijj=G.za)(e,t,n,a,s,u,d,f,m),i.dynCall_iiiiiijj=(e,t,n,a,s,u,d,f,m,w)=>(i.dynCall_iiiiiijj=G.Aa)(e,t,n,a,s,u,d,f,m,w);function ui(e,t){var n=V();try{return B(e)(t)}catch(a){if(q(n),a!==a+0)throw a;L(1,0)}}function li(e,t,n,a){var s=V();try{B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function di(e,t,n){var a=V();try{B(e)(t,n)}catch(s){if(q(a),s!==s+0)throw s;L(1,0)}}function fi(e,t,n,a){var s=V();try{return B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function hi(e,t,n,a,s){var u=V();try{return B(e)(t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}function pi(e,t){var n=V();try{B(e)(t)}catch(a){if(q(n),a!==a+0)throw a;L(1,0)}}function mi(e,t,n){var a=V();try{return B(e)(t,n)}catch(s){if(q(a),s!==s+0)throw s;L(1,0)}}function vi(e){var t=V();try{B(e)()}catch(n){if(q(t),n!==n+0)throw n;L(1,0)}}function yi(e,t,n,a,s){var u=V();try{return B(e)(t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}function gi(e,t,n,a,s,u,d,f,m,w,_){var T=V();try{B(e)(t,n,a,s,u,d,f,m,w,_)}catch(E){if(q(T),E!==E+0)throw E;L(1,0)}}function wi(e,t,n,a,s,u,d){var f=V();try{return B(e)(t,n,a,s,u,d)}catch(m){if(q(f),m!==m+0)throw m;L(1,0)}}function bi(e,t,n,a,s){var u=V();try{B(e)(t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}function Ci(e,t,n,a,s,u){var d=V();try{return B(e)(t,n,a,s,u)}catch(f){if(q(d),f!==f+0)throw f;L(1,0)}}function $i(e,t,n,a,s,u,d,f){var m=V();try{return B(e)(t,n,a,s,u,d,f)}catch(w){if(q(m),w!==w+0)throw w;L(1,0)}}function _i(e,t,n,a){var s=V();try{return B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function Si(e,t,n,a){var s=V();try{return B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function Pi(e){var t=V();try{return B(e)()}catch(n){if(q(t),n!==n+0)throw n;L(1,0)}}function Ti(e,t,n,a,s,u,d,f){var m=V();try{B(e)(t,n,a,s,u,d,f)}catch(w){if(q(m),w!==w+0)throw w;L(1,0)}}function Ei(e,t,n,a,s,u,d,f,m,w,_,T){var E=V();try{return B(e)(t,n,a,s,u,d,f,m,w,_,T)}catch(M){if(q(E),M!==M+0)throw M;L(1,0)}}function Oi(e,t,n,a,s,u,d,f,m,w,_,T,E,M,H,N){var F=V();try{B(e)(t,n,a,s,u,d,f,m,w,_,T,E,M,H,N)}catch(Q){if(q(F),Q!==Q+0)throw Q;L(1,0)}}function Mi(e,t,n,a,s){var u=V();try{return Xr(e,t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}var st;ge=function e(){st||Zr(),st||(ge=e)};function Zr(){if(ae>0||(ze(),ae>0))return;function e(){st||(st=!0,i.calledRun=!0,!j&&(ft(),c(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),ht()))}i.setStatus?(i.setStatus("Running..."),setTimeout(function(){setTimeout(function(){i.setStatus("")},1),e()},1)):e()}if(i.preInit)for(typeof i.preInit=="function"&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return Zr(),o.ready}})();function Mn(r){return lt(He,r)}function Dn(r){return Tn(He,r)}async function An(r,o){return En(He,r,o)}async function Rn(r,o){return On(He,r,o)}var Me;class Be extends EventTarget{constructor(o={}){var i;super(),tn(this,Me,void 0);try{const c=(i=o==null?void 0:o.formats)==null?void 0:i.filter(l=>l!=="unknown");if((c==null?void 0:c.length)===0)throw new TypeError("Hint option provided, but is empty.");c==null||c.forEach(l=>{if(!Le.has(l))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${l}' is not a valid enum value of type BarcodeFormat.`)}),rn(this,Me,c!=null?c:[]),Mn().then(l=>{this.dispatchEvent(new CustomEvent("load",{detail:l}))}).catch(l=>{this.dispatchEvent(new CustomEvent("error",{detail:l}))})}catch(c){throw Qt(c,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return nn.filter(o=>o!=="unknown")}async detect(o){try{const i=await dn(o);if(i===null)return[];let c;try{Yt(i)?c=await An(i,{tryHarder:!0,formats:jt(this,Me).map(l=>Le.get(l))}):c=await Rn(i,{tryHarder:!0,formats:jt(this,Me).map(l=>Le.get(l))})}catch(l){throw console.error(l),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return c.map(l=>{const{topLeft:{x:h,y:v},topRight:{x:g,y:b},bottomLeft:{x:p,y:C},bottomRight:{x:S,y:$}}=l.position,U=Math.min(h,g,p,S),W=Math.min(v,b,C,$),j=Math.max(h,g,p,S),k=Math.max(v,b,C,$);return{boundingBox:new DOMRectReadOnly(U,W,j-U,k-W),rawValue:l.text,format:an(l.format),cornerPoints:[{x:h,y:v},{x:g,y:b},{x:S,y:$},{x:p,y:C}]}})}catch(i){throw Qt(i,"Failed to execute 'detect' on 'BarcodeDetector'")}}}Me=new WeakMap;const dt=(r,o,i="error")=>{let c,l;const h=new Promise((v,g)=>{c=v,l=g,r.addEventListener(o,c),r.addEventListener(i,l)});return h.finally(()=>{r.removeEventListener(o,c),r.removeEventListener(i,l)}),h},tr=r=>new Promise(o=>setTimeout(o,r));class xn extends Error{constructor(){super("can't process cross-origin image"),this.name="DropImageFetchError"}}class rr extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class kn extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class In extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let nr;async function Fn(r){if(window.BarcodeDetector===void 0)return console.debug("[vue-qrcode-reader] Native BarcodeDetector not supported. Will use polyfill."),new Be({formats:r});const o=await window.BarcodeDetector.getSupportedFormats(),i=r.filter(c=>!o.includes(c));return i.length>0?(console.debug(`[vue-qrcode-reader] Native BarcodeDetector does not support formats ${JSON.stringify(i)}. Will use polyfill.`),new Be({formats:r})):(console.debug("[vue-qrcode-reader] Will use native BarcodeDetector."),new window.BarcodeDetector({formats:r}))}async function ar(r){nr=await Fn(r)}const Un=async(r,{detectHandler:o,locateHandler:i,minDelay:c,formats:l})=>{console.debug("[vue-qrcode-reader] start scanning"),await ar(l);const h=v=>async g=>{if(r.readyState===0)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:b,contentBefore:p,lastScanHadContent:C}=v;if(g-b!p.includes(j.rawValue));$&&o(S);const U=S.length>0;U&&i(S),!U&&C&&i(S);const W={lastScanned:g,lastScanHadContent:U,contentBefore:$?S.map(j=>j.rawValue):p};window.requestAnimationFrame(h(W))}}};h({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())},Wn=async r=>{if(r.startsWith("http")&&r.includes(location.host)===!1)throw new xn;const o=document.createElement("img");return o.src=r,await dt(o,"load"),o},or=async(r,o=["qr_code"])=>await new Be({formats:o}).detect(r),jn=async(r,o=["qr_code"])=>{const i=new Be({formats:o}),c=await Wn(r);return await i.detect(c)};var ir={},X={};Object.defineProperty(X,"__esModule",{value:!0}),X.compactObject=lr,X.deprecated=Yn;var Ln=X.detectBrowser=Jn;X.disableLog=Nn,X.disableWarnings=zn,X.extractVersion=Ve,X.filterStats=Qn,X.log=Gn,X.walkStats=qe,X.wrapPeerConnectionEvent=qn;function Hn(r,o,i){return o=Bn(o),o in r?Object.defineProperty(r,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[o]=i,r}function Bn(r){var o=Vn(r,"string");return fe(o)==="symbol"?o:String(o)}function Vn(r,o){if(fe(r)!=="object"||r===null)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var c=i.call(r,o||"default");if(fe(c)!=="object")return c;throw new TypeError("@@toPrimitive must return a primitive value.")}return(o==="string"?String:Number)(r)}function fe(r){"@babel/helpers - typeof";return fe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},fe(r)}var sr=!0,cr=!0;function Ve(r,o,i){var c=r.match(o);return c&&c.length>=i&&parseInt(c[i],10)}function qn(r,o,i){if(r.RTCPeerConnection){var c=r.RTCPeerConnection.prototype,l=c.addEventListener;c.addEventListener=function(v,g){if(v!==o)return l.apply(this,arguments);var b=function(C){var S=i(C);S&&(g.handleEvent?g.handleEvent(S):g(S))};return this._eventMap=this._eventMap||{},this._eventMap[o]||(this._eventMap[o]=new Map),this._eventMap[o].set(g,b),l.apply(this,[v,b])};var h=c.removeEventListener;c.removeEventListener=function(v,g){if(v!==o||!this._eventMap||!this._eventMap[o])return h.apply(this,arguments);if(!this._eventMap[o].has(g))return h.apply(this,arguments);var b=this._eventMap[o].get(g);return this._eventMap[o].delete(g),this._eventMap[o].size===0&&delete this._eventMap[o],Object.keys(this._eventMap).length===0&&delete this._eventMap,h.apply(this,[v,b])},Object.defineProperty(c,"on"+o,{get:function(){return this["_on"+o]},set:function(g){this["_on"+o]&&(this.removeEventListener(o,this["_on"+o]),delete this["_on"+o]),g&&this.addEventListener(o,this["_on"+o]=g)},enumerable:!0,configurable:!0})}}function Nn(r){return typeof r!="boolean"?new Error("Argument type: "+fe(r)+". Please use a boolean."):(sr=r,r?"adapter.js logging disabled":"adapter.js logging enabled")}function zn(r){return typeof r!="boolean"?new Error("Argument type: "+fe(r)+". Please use a boolean."):(cr=!r,"adapter.js deprecation warnings "+(r?"disabled":"enabled"))}function Gn(){if((typeof window>"u"?"undefined":fe(window))==="object"){if(sr)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function Yn(r,o){cr&&console.warn(r+" is deprecated, please use "+o+" instead.")}function Jn(r){var o={browser:null,version:null};if(typeof r>"u"||!r.navigator||!r.navigator.userAgent)return o.browser="Not a browser.",o;var i=r.navigator;if(i.mozGetUserMedia)o.browser="firefox",o.version=Ve(i.userAgent,/Firefox\/(\d+)\./,1);else if(i.webkitGetUserMedia||r.isSecureContext===!1&&r.webkitRTCPeerConnection)o.browser="chrome",o.version=Ve(i.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(r.RTCPeerConnection&&i.userAgent.match(/AppleWebKit\/(\d+)\./))o.browser="safari",o.version=Ve(i.userAgent,/AppleWebKit\/(\d+)\./,1),o.supportsUnifiedPlan=r.RTCRtpTransceiver&&"currentDirection"in r.RTCRtpTransceiver.prototype;else return o.browser="Not a supported browser.",o;return o}function ur(r){return Object.prototype.toString.call(r)==="[object Object]"}function lr(r){return ur(r)?Object.keys(r).reduce(function(o,i){var c=ur(r[i]),l=c?lr(r[i]):r[i],h=c&&!Object.keys(l).length;return l===void 0||h?o:Object.assign(o,Hn({},i,l))},{}):r}function qe(r,o,i){!o||i.has(o.id)||(i.set(o.id,o),Object.keys(o).forEach(function(c){c.endsWith("Id")?qe(r,r.get(o[c]),i):c.endsWith("Ids")&&o[c].forEach(function(l){qe(r,r.get(l),i)})}))}function Qn(r,o,i){var c=i?"outbound-rtp":"inbound-rtp",l=new Map;if(o===null)return l;var h=[];return r.forEach(function(v){v.type==="track"&&v.trackIdentifier===o.id&&h.push(v)}),h.forEach(function(v){r.forEach(function(g){g.type===c&&g.trackId===v.id&&qe(r,g,l)})}),l}Object.defineProperty(ir,"__esModule",{value:!0});var Xn=ir.shimGetUserMedia=ea,Zn=Kn(X);function dr(r){if(typeof WeakMap!="function")return null;var o=new WeakMap,i=new WeakMap;return(dr=function(l){return l?i:o})(r)}function Kn(r,o){if(r&&r.__esModule)return r;if(r===null||he(r)!=="object"&&typeof r!="function")return{default:r};var i=dr(o);if(i&&i.has(r))return i.get(r);var c={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var h in r)if(h!=="default"&&Object.prototype.hasOwnProperty.call(r,h)){var v=l?Object.getOwnPropertyDescriptor(r,h):null;v&&(v.get||v.set)?Object.defineProperty(c,h,v):c[h]=r[h]}return c.default=r,i&&i.set(r,c),c}function he(r){"@babel/helpers - typeof";return he=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},he(r)}var fr=Zn.log;function ea(r,o){var i=r&&r.navigator;if(i.mediaDevices){var c=function(p){if(he(p)!=="object"||p.mandatory||p.optional)return p;var C={};return Object.keys(p).forEach(function(S){if(!(S==="require"||S==="advanced"||S==="mediaSource")){var $=he(p[S])==="object"?p[S]:{ideal:p[S]};$.exact!==void 0&&typeof $.exact=="number"&&($.min=$.max=$.exact);var U=function(k,R){return k?k+R.charAt(0).toUpperCase()+R.slice(1):R==="deviceId"?"sourceId":R};if($.ideal!==void 0){C.optional=C.optional||[];var W={};typeof $.ideal=="number"?(W[U("min",S)]=$.ideal,C.optional.push(W),W={},W[U("max",S)]=$.ideal,C.optional.push(W)):(W[U("",S)]=$.ideal,C.optional.push(W))}$.exact!==void 0&&typeof $.exact!="number"?(C.mandatory=C.mandatory||{},C.mandatory[U("",S)]=$.exact):["min","max"].forEach(function(j){$[j]!==void 0&&(C.mandatory=C.mandatory||{},C.mandatory[U(j,S)]=$[j])})}}),p.advanced&&(C.optional=(C.optional||[]).concat(p.advanced)),C},l=function(p,C){if(o.version>=61)return C(p);if(p=JSON.parse(JSON.stringify(p)),p&&he(p.audio)==="object"){var S=function(k,R,Z){R in k&&!(Z in k)&&(k[Z]=k[R],delete k[R])};p=JSON.parse(JSON.stringify(p)),S(p.audio,"autoGainControl","googAutoGainControl"),S(p.audio,"noiseSuppression","googNoiseSuppression"),p.audio=c(p.audio)}if(p&&he(p.video)==="object"){var $=p.video.facingMode;$=$&&(he($)==="object"?$:{ideal:$});var U=o.version<66;if($&&($.exact==="user"||$.exact==="environment"||$.ideal==="user"||$.ideal==="environment")&&!(i.mediaDevices.getSupportedConstraints&&i.mediaDevices.getSupportedConstraints().facingMode&&!U)){delete p.video.facingMode;var W;if($.exact==="environment"||$.ideal==="environment"?W=["back","rear"]:($.exact==="user"||$.ideal==="user")&&(W=["front"]),W)return i.mediaDevices.enumerateDevices().then(function(j){j=j.filter(function(R){return R.kind==="videoinput"});var k=j.find(function(R){return W.some(function(Z){return R.label.toLowerCase().includes(Z)})});return!k&&j.length&&W.includes("back")&&(k=j[j.length-1]),k&&(p.video.deviceId=$.exact?{exact:k.deviceId}:{ideal:k.deviceId}),p.video=c(p.video),fr("chrome: "+JSON.stringify(p)),C(p)})}p.video=c(p.video)}return fr("chrome: "+JSON.stringify(p)),C(p)},h=function(p){return o.version>=64?p:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[p.name]||p.name,message:p.message,constraint:p.constraint||p.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}},v=function(p,C,S){l(p,function($){i.webkitGetUserMedia($,C,function(U){S&&S(h(U))})})};if(i.getUserMedia=v.bind(i),i.mediaDevices.getUserMedia){var g=i.mediaDevices.getUserMedia.bind(i.mediaDevices);i.mediaDevices.getUserMedia=function(b){return l(b,function(p){return g(p).then(function(C){if(p.audio&&!C.getAudioTracks().length||p.video&&!C.getVideoTracks().length)throw C.getTracks().forEach(function(S){S.stop()}),new DOMException("","NotFoundError");return C},function(C){return Promise.reject(h(C))})})}}}}var hr={};Object.defineProperty(hr,"__esModule",{value:!0});var ta=hr.shimGetUserMedia=aa,ra=na(X);function pr(r){if(typeof WeakMap!="function")return null;var o=new WeakMap,i=new WeakMap;return(pr=function(l){return l?i:o})(r)}function na(r,o){if(r&&r.__esModule)return r;if(r===null||$e(r)!=="object"&&typeof r!="function")return{default:r};var i=pr(o);if(i&&i.has(r))return i.get(r);var c={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var h in r)if(h!=="default"&&Object.prototype.hasOwnProperty.call(r,h)){var v=l?Object.getOwnPropertyDescriptor(r,h):null;v&&(v.get||v.set)?Object.defineProperty(c,h,v):c[h]=r[h]}return c.default=r,i&&i.set(r,c),c}function $e(r){"@babel/helpers - typeof";return $e=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},$e(r)}function aa(r,o){var i=r&&r.navigator,c=r&&r.MediaStreamTrack;if(i.getUserMedia=function(b,p,C){ra.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),i.mediaDevices.getUserMedia(b).then(p,C)},!(o.version>55&&"autoGainControl"in i.mediaDevices.getSupportedConstraints())){var l=function(p,C,S){C in p&&!(S in p)&&(p[S]=p[C],delete p[C])},h=i.mediaDevices.getUserMedia.bind(i.mediaDevices);if(i.mediaDevices.getUserMedia=function(b){return $e(b)==="object"&&$e(b.audio)==="object"&&(b=JSON.parse(JSON.stringify(b)),l(b.audio,"autoGainControl","mozAutoGainControl"),l(b.audio,"noiseSuppression","mozNoiseSuppression")),h(b)},c&&c.prototype.getSettings){var v=c.prototype.getSettings;c.prototype.getSettings=function(){var b=v.apply(this,arguments);return l(b,"mozAutoGainControl","autoGainControl"),l(b,"mozNoiseSuppression","noiseSuppression"),b}}if(c&&c.prototype.applyConstraints){var g=c.prototype.applyConstraints;c.prototype.applyConstraints=function(b){return this.kind==="audio"&&$e(b)==="object"&&(b=JSON.parse(JSON.stringify(b)),l(b,"autoGainControl","mozAutoGainControl"),l(b,"noiseSuppression","mozNoiseSuppression")),g.apply(this,[b])}}}}var ne={};Object.defineProperty(ne,"__esModule",{value:!0}),ne.shimAudioContext=pa,ne.shimCallbacksAPI=ua,ne.shimConstraints=yr,ne.shimCreateOfferLegacy=ha;var oa=ne.shimGetUserMedia=la;ne.shimLocalStreamsAPI=sa,ne.shimRTCIceServerUrls=da,ne.shimRemoteStreamsAPI=ca,ne.shimTrackEventTransceiver=fa;var mr=ia(X);function vr(r){if(typeof WeakMap!="function")return null;var o=new WeakMap,i=new WeakMap;return(vr=function(l){return l?i:o})(r)}function ia(r,o){if(r&&r.__esModule)return r;if(r===null||pe(r)!=="object"&&typeof r!="function")return{default:r};var i=vr(o);if(i&&i.has(r))return i.get(r);var c={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var h in r)if(h!=="default"&&Object.prototype.hasOwnProperty.call(r,h)){var v=l?Object.getOwnPropertyDescriptor(r,h):null;v&&(v.get||v.set)?Object.defineProperty(c,h,v):c[h]=r[h]}return c.default=r,i&&i.set(r,c),c}function pe(r){"@babel/helpers - typeof";return pe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},pe(r)}function sa(r){if(!(pe(r)!=="object"||!r.RTCPeerConnection)){if("getLocalStreams"in r.RTCPeerConnection.prototype||(r.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in r.RTCPeerConnection.prototype)){var o=r.RTCPeerConnection.prototype.addTrack;r.RTCPeerConnection.prototype.addStream=function(c){var l=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(c)||this._localStreams.push(c),c.getAudioTracks().forEach(function(h){return o.call(l,h,c)}),c.getVideoTracks().forEach(function(h){return o.call(l,h,c)})},r.RTCPeerConnection.prototype.addTrack=function(c){for(var l=this,h=arguments.length,v=new Array(h>1?h-1:0),g=1;g=0)){c._remoteStreams.push(h);var v=new Event("addstream");v.stream=h,c.dispatchEvent(v)}})}),o.apply(c,arguments)}}}function ua(r){if(!(pe(r)!=="object"||!r.RTCPeerConnection)){var o=r.RTCPeerConnection.prototype,i=o.createOffer,c=o.createAnswer,l=o.setLocalDescription,h=o.setRemoteDescription,v=o.addIceCandidate;o.createOffer=function(p,C){var S=arguments.length>=2?arguments[2]:arguments[0],$=i.apply(this,[S]);return C?($.then(p,C),Promise.resolve()):$},o.createAnswer=function(p,C){var S=arguments.length>=2?arguments[2]:arguments[0],$=c.apply(this,[S]);return C?($.then(p,C),Promise.resolve()):$};var g=function(p,C,S){var $=l.apply(this,[p]);return S?($.then(C,S),Promise.resolve()):$};o.setLocalDescription=g,g=function(p,C,S){var $=h.apply(this,[p]);return S?($.then(C,S),Promise.resolve()):$},o.setRemoteDescription=g,g=function(p,C,S){var $=v.apply(this,[p]);return S?($.then(C,S),Promise.resolve()):$},o.addIceCandidate=g}}function la(r){var o=r&&r.navigator;if(o.mediaDevices&&o.mediaDevices.getUserMedia){var i=o.mediaDevices,c=i.getUserMedia.bind(i);o.mediaDevices.getUserMedia=function(l){return c(yr(l))}}!o.getUserMedia&&o.mediaDevices&&o.mediaDevices.getUserMedia&&(o.getUserMedia=(function(h,v,g){o.mediaDevices.getUserMedia(h).then(v,g)}).bind(o))}function yr(r){return r&&r.video!==void 0?Object.assign({},r,{video:mr.compactObject(r.video)}):r}function da(r){if(r.RTCPeerConnection){var o=r.RTCPeerConnection;r.RTCPeerConnection=function(c,l){if(c&&c.iceServers){for(var h=[],v=0;v{let o=!1,i;return(...c)=>(o||(i=r(c),o=!0),i)};function se(r,o){if(r===!1)throw new Error(o!=null?o:"assertion failure")}function gr(r){throw new Error("this code should be unreachable")}const va=ma(()=>{const r=Ln(window);switch(r.browser){case"chrome":Xn(window,r);break;case"firefox":ta(window,r);break;case"safari":oa(window,r);break;default:throw new rr}});let _e=Promise.resolve({type:"stop",data:{}});async function wr(r,o,i){var g,b,p;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(o)),window.isSecureContext!==!0)throw new kn;if(((g=navigator==null?void 0:navigator.mediaDevices)==null?void 0:g.getUserMedia)===void 0)throw new rr;va(),console.debug("[vue-qrcode-reader] calling getUserMedia");const c=await navigator.mediaDevices.getUserMedia({audio:!1,video:o});r.srcObject!==void 0?r.srcObject=c:r.mozSrcObject!==void 0?r.mozSrcObject=c:window.URL.createObjectURL?r.src=window.URL.createObjectURL(c):window.webkitURL?r.src=window.webkitURL.createObjectURL(c):r.src=c.id,r.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([dt(r,"loadeddata"),tr(6e3).then(()=>{throw new In})]),console.debug("[vue-qrcode-reader] video element loaded"),await tr(500);const[l]=c.getVideoTracks(),h=(p=(b=l==null?void 0:l.getCapabilities)==null?void 0:b.call(l))!=null?p:{};let v=!1;return i&&h.torch&&(await l.applyConstraints({advanced:[{torch:!0}]}),v=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:r,stream:c,capabilities:h,constraints:o,isTorchOn:v}}}async function ya(r,{constraints:o,torch:i,restart:c=!1}){_e=_e.then(h=>{if(h.type==="start"){const{data:{videoEl:v,stream:g,constraints:b,isTorchOn:p}}=h;return!c&&r===v&&o===b&&i===p?h:br(v,g,p).then(()=>wr(r,o,i))}else if(h.type==="stop"||h.type==="failed")return wr(r,o,i);gr()}).catch(h=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${h}"`),{type:"failed",error:h}));const l=await _e;if(l.type==="stop")throw new Error("Something went wrong with the camera task queue (start task).");if(l.type==="failed")throw l.error;if(l.type==="start")return l.data.capabilities;gr()}async function br(r,o,i){console.debug("[vue-qrcode-reader] stopping camera"),r.src="",r.srcObject=null,r.load(),await dt(r,"error");for(const c of o.getTracks())i!=null||await c.applyConstraints({advanced:[{torch:!1}]}),o.removeTrack(c),c.stop();return{type:"stop",data:{}}}async function Ne(){if(_e=_e.then(o=>{if(o.type==="stop"||o.type==="failed")return o;const{data:{videoEl:i,stream:c,isTorchOn:l}}=o;return br(i,c,l)}),(await _e).type==="start")throw new Error("Something went wrong with the camera task queue (stop task).")}const Cr=O.defineComponent({__name:"QrcodeStream",props:{constraints:{type:Object,default(){return{facingMode:"environment"}}},formats:{type:Array,default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function}},emits:["detect","camera-on","camera-off","error"],setup(r,{emit:o}){const i=r,c=o,l=O.ref(i.constraints),h=O.ref(i.formats);O.watch(()=>i.constraints,(I,D)=>{JSON.stringify(I)!==JSON.stringify(D)&&(l.value=I)},{deep:!0}),O.watch(()=>i.formats,(I,D)=>{JSON.stringify(I)!==JSON.stringify(D)&&(h.value=I)},{deep:!0});const v=O.ref(),g=O.ref(),b=O.ref(),p=O.ref(!1),C=O.ref(!1);O.onMounted(()=>{C.value=!0}),O.onUnmounted(()=>{Ne()});const S=O.computed(()=>({torch:i.torch,constraints:l.value,shouldStream:C.value&&!i.paused}));O.watch(S,async I=>{const D=b.value;se(D!==void 0,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const A=v.value;se(A!==void 0,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const me=A.getContext("2d");if(se(me!==null,"if cavnas is defined, canvas 2d context should also be non-null"),I.shouldStream){Ne(),p.value=!1;try{const ce=await ya(D,I);C.value?(p.value=!0,c("camera-on",ce)):await Ne()}catch(ce){c("error",ce)}}else A.width=D.videoWidth,A.height=D.videoHeight,me.drawImage(D,0,0,D.videoWidth,D.videoHeight),Ne(),p.value=!1,c("camera-off")},{deep:!0}),O.watch(h,async I=>{C.value&&await ar(I)});const $=O.computed(()=>S.value.shouldStream&&p.value);O.watch($,I=>{if(I){se(v.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),U(v.value),se(g.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),U(g.value);const D=()=>i.track===void 0?500:40;se(b.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),Un(b.value,{detectHandler:A=>c("detect",A),formats:h.value,locateHandler:W,minDelay:D()})}});const U=I=>{const D=I.getContext("2d");se(D!==null,"canvas 2d context should always be non-null"),D.clearRect(0,0,I.width,I.height)},W=I=>{const D=g.value;se(D!==void 0,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const A=b.value;if(se(A!==void 0,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),I.length===0||i.track===void 0)U(D);else{const me=A.offsetWidth,ce=A.offsetHeight,Se=A.videoWidth,Pe=A.videoHeight,De=Math.max(me/Se,ce/Pe),Ae=Se*De,ze=Pe*De,ft=Ae/Se,ht=ze/Pe,pt=(me-Ae)/2,mt=(ce-ze)/2,Re=({x:ve,y:K})=>({x:Math.floor(ve*ft),y:Math.floor(K*ht)}),ae=({x:ve,y:K})=>({x:Math.floor(ve+pt),y:Math.floor(K+mt)}),ge=I.map(ve=>{const{boundingBox:K,cornerPoints:yt}=ve,{x:Ge,y:ye}=ae(Re({x:K.x,y:K.y})),{x:Ye,y:gt}=Re({x:K.width,y:K.height});return{...ve,cornerPoints:yt.map(Je=>ae(Re(Je))),boundingBox:DOMRectReadOnly.fromRect({x:Ge,y:ye,width:Ye,height:gt})}});D.width=A.offsetWidth,D.height=A.offsetHeight;const vt=D.getContext("2d");i.track(ge,vt)}},j={width:"100%",height:"100%",position:"relative","z-index":"0"},k={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},R={width:"100%",height:"100%","object-fit":"cover"},Z=O.computed(()=>$.value?R:{...R,visibility:"hidden",position:"absolute"});return(I,D)=>(O.openBlock(),O.createElementBlock("div",{style:j},[O.createElementVNode("video",{ref_key:"videoRef",ref:b,style:O.normalizeStyle(Z.value),autoplay:"",muted:"",playsinline:""},null,4),O.withDirectives(O.createElementVNode("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:v,style:R},null,512),[[O.vShow,!$.value]]),O.createElementVNode("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:g,style:k},null,512),O.createElementVNode("div",{style:k},[O.renderSlot(I.$slots,"default")])]))}}),$r=O.defineComponent({__name:"QrcodeCapture",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect"],setup(r,{emit:o}){const i=r,c=o,l=h=>{if(!(!(h.target instanceof HTMLInputElement)||!h.target.files))for(const v of Array.from(h.target.files))or(v,i.formats).then(g=>{c("detect",g)})};return(h,v)=>(O.openBlock(),O.createElementBlock("input",{onChange:l,type:"file",name:"image",accept:"image/*",capture:"environment",multiple:""},null,32))}}),_r=O.defineComponent({__name:"QrcodeDropZone",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect","dragover","error"],setup(r,{emit:o}){const i=r,c=o,l=async g=>{try{const b=await g;c("detect",b)}catch(b){c("error",b)}},h=g=>{c("dragover",g)},v=({dataTransfer:g})=>{if(!g)return;h(!1);const b=[...Array.from(g.files)],p=g.getData("text/uri-list");b.forEach(C=>{l(or(C))}),p!==""&&l(jn(p,i.formats))};return(g,b)=>(O.openBlock(),O.createElementBlock("div",{onDrop:O.withModifiers(v,["prevent","stop"]),onDragenter:b[0]||(b[0]=O.withModifiers(p=>h(!0),["prevent","stop"])),onDragleave:b[1]||(b[1]=O.withModifiers(p=>h(!1),["prevent","stop"])),onDragover:b[2]||(b[2]=O.withModifiers(()=>{},["prevent","stop"]))},[O.renderSlot(g.$slots,"default")],32))}});function Sr(r){r.component("qrcode-stream",Cr),r.component("qrcode-capture",$r),r.component("qrcode-drop-zone",_r)}const ga={install:Sr};ee.QrcodeCapture=$r,ee.QrcodeDropZone=_r,ee.QrcodeStream=Cr,ee.VueQrcodeReader=ga,ee.install=Sr,ee.setZXingModuleOverrides=Dn,Object.defineProperty(ee,Symbol.toStringTag,{value:"Module"})}); +`,"%p":y=>y.tm_hour>=0&&y.tm_hour<12?"AM":"PM","%S":y=>E(y.tm_sec,2),"%t":()=>" ","%u":y=>y.tm_wday||7,"%U":y=>{var P=y.tm_yday+7-y.tm_wday;return E(Math.floor(P/7),2)},"%V":y=>{var P=Math.floor((y.tm_yday+7-(y.tm_wday+6)%7)/7);if((y.tm_wday+371-y.tm_yday-2)%7<=2&&P++,P){if(P==53){var z=(y.tm_wday+371-y.tm_yday)%7;z!=4&&(z!=3||!it(y.tm_year))&&(P=1)}}else{P=52;var Y=(y.tm_wday+7-y.tm_yday-1)%7;(Y==4||Y==5&&it(y.tm_year%400-1))&&P++}return E(P,2)},"%w":y=>y.tm_wday,"%W":y=>{var P=y.tm_yday+7-(y.tm_wday+6)%7;return E(Math.floor(P/7),2)},"%y":y=>(y.tm_year+1900).toString().substring(2),"%Y":y=>y.tm_year+1900,"%z":y=>{var P=y.tm_gmtoff,z=P>=0;return P=Math.abs(P)/60,P=P/60*100+P%60,(z?"+":"-")+("0000"+P).slice(-4)},"%Z":y=>y.tm_zone,"%%":()=>"%"};d=d.replace(/%%/g,"\0\0");for(var m in F)d.includes(m)&&(d=d.replace(new RegExp(m,"g"),F[m](u)));d=d.replace(/\0\0/g,"%");var Q=ai(d);return Q.length>t?0:(oi(Q,e),Q.length-1)},si=(e,t,n,a,s)=>ii(e,t,n,a);Pr=i.InternalError=class extends Error{constructor(e){super(e),this.name="InternalError"}},Ra(),Ee=i.BindingError=class extends Error{constructor(e){super(e),this.name="BindingError"}},qa(),La(),Za(),Ir=i.UnboundTypeError=ro(Error,"UnboundTypeError"),so(),uo();var ci={s:Ca,u:$a,b:Sa,g:Pa,q:Ta,J:Ea,f:Oa,V:Ma,d:_a,da:Da,Q:Aa,_:ka,ca:no,ba:oo,w:io,Y:lo,x:ho,h:po,L:vo,M:yo,t:wo,o:bo,K:_o,C:Do,A:Ao,ea:Ro,$:xo,R:ko,ha:At,fa:Uo,Z:Bo,N:Vo,O:qo,aa:No,B:zo,X:Go,W:Qo,T:Ko,U:ei,E:Si,D:hi,F:_i,n:Pi,a:ui,e:mi,m:fi,k:yi,H:Ci,v:wi,G:$i,z:Ei,P:Mi,l:vi,j:pi,c:di,p:li,I:bi,r:Ti,i:gi,y:Oi,ga:ti,S:si},G=ba(),de=i._free=e=>(de=i._free=G.ka)(e),Ut=i._malloc=e=>(Ut=i._malloc=G.la)(e),zr=e=>(zr=G.na)(e),L=(e,t)=>(L=G.oa)(e,t),je=e=>(je=G.pa)(e),V=()=>(V=G.qa)(),q=e=>(q=G.ra)(e),Gr=e=>(Gr=G.sa)(e),Yr=e=>(Yr=G.ta)(e),Jr=(e,t,n)=>(Jr=G.ua)(e,t,n),Qr=e=>(Qr=G.va)(e);i.dynCall_viijii=(e,t,n,a,s,u,d)=>(i.dynCall_viijii=G.wa)(e,t,n,a,s,u,d);var Xr=i.dynCall_jiiii=(e,t,n,a,s)=>(Xr=i.dynCall_jiiii=G.xa)(e,t,n,a,s);i.dynCall_iiiiij=(e,t,n,a,s,u,d)=>(i.dynCall_iiiiij=G.ya)(e,t,n,a,s,u,d),i.dynCall_iiiiijj=(e,t,n,a,s,u,d,f,m)=>(i.dynCall_iiiiijj=G.za)(e,t,n,a,s,u,d,f,m),i.dynCall_iiiiiijj=(e,t,n,a,s,u,d,f,m,w)=>(i.dynCall_iiiiiijj=G.Aa)(e,t,n,a,s,u,d,f,m,w);function ui(e,t){var n=V();try{return B(e)(t)}catch(a){if(q(n),a!==a+0)throw a;L(1,0)}}function li(e,t,n,a){var s=V();try{B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function di(e,t,n){var a=V();try{B(e)(t,n)}catch(s){if(q(a),s!==s+0)throw s;L(1,0)}}function fi(e,t,n,a){var s=V();try{return B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function hi(e,t,n,a,s){var u=V();try{return B(e)(t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}function pi(e,t){var n=V();try{B(e)(t)}catch(a){if(q(n),a!==a+0)throw a;L(1,0)}}function mi(e,t,n){var a=V();try{return B(e)(t,n)}catch(s){if(q(a),s!==s+0)throw s;L(1,0)}}function vi(e){var t=V();try{B(e)()}catch(n){if(q(t),n!==n+0)throw n;L(1,0)}}function yi(e,t,n,a,s){var u=V();try{return B(e)(t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}function gi(e,t,n,a,s,u,d,f,m,w,_){var T=V();try{B(e)(t,n,a,s,u,d,f,m,w,_)}catch(E){if(q(T),E!==E+0)throw E;L(1,0)}}function wi(e,t,n,a,s,u,d){var f=V();try{return B(e)(t,n,a,s,u,d)}catch(m){if(q(f),m!==m+0)throw m;L(1,0)}}function bi(e,t,n,a,s){var u=V();try{B(e)(t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}function Ci(e,t,n,a,s,u){var d=V();try{return B(e)(t,n,a,s,u)}catch(f){if(q(d),f!==f+0)throw f;L(1,0)}}function $i(e,t,n,a,s,u,d,f){var m=V();try{return B(e)(t,n,a,s,u,d,f)}catch(w){if(q(m),w!==w+0)throw w;L(1,0)}}function _i(e,t,n,a){var s=V();try{return B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function Si(e,t,n,a){var s=V();try{return B(e)(t,n,a)}catch(u){if(q(s),u!==u+0)throw u;L(1,0)}}function Pi(e){var t=V();try{return B(e)()}catch(n){if(q(t),n!==n+0)throw n;L(1,0)}}function Ti(e,t,n,a,s,u,d,f){var m=V();try{B(e)(t,n,a,s,u,d,f)}catch(w){if(q(m),w!==w+0)throw w;L(1,0)}}function Ei(e,t,n,a,s,u,d,f,m,w,_,T){var E=V();try{return B(e)(t,n,a,s,u,d,f,m,w,_,T)}catch(M){if(q(E),M!==M+0)throw M;L(1,0)}}function Oi(e,t,n,a,s,u,d,f,m,w,_,T,E,M,H,N){var F=V();try{B(e)(t,n,a,s,u,d,f,m,w,_,T,E,M,H,N)}catch(Q){if(q(F),Q!==Q+0)throw Q;L(1,0)}}function Mi(e,t,n,a,s){var u=V();try{return Xr(e,t,n,a,s)}catch(d){if(q(u),d!==d+0)throw d;L(1,0)}}var st;ge=function e(){st||Zr(),st||(ge=e)};function Zr(){if(ae>0||(ze(),ae>0))return;function e(){st||(st=!0,i.calledRun=!0,!j&&(ft(),c(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),ht()))}i.setStatus?(i.setStatus("Running..."),setTimeout(function(){setTimeout(function(){i.setStatus("")},1),e()},1)):e()}if(i.preInit)for(typeof i.preInit=="function"&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return Zr(),o.ready}})();function Mn(r){return lt(He,r)}function Dn(r){return Tn(He,r)}async function An(r,o){return En(He,r,o)}async function Rn(r,o){return On(He,r,o)}var Me;class Be extends EventTarget{constructor(o={}){var i;super(),tn(this,Me,void 0);try{const c=(i=o==null?void 0:o.formats)==null?void 0:i.filter(l=>l!=="unknown");if((c==null?void 0:c.length)===0)throw new TypeError("Hint option provided, but is empty.");c==null||c.forEach(l=>{if(!Le.has(l))throw new TypeError(`Failed to read the 'formats' property from 'BarcodeDetectorOptions': The provided value '${l}' is not a valid enum value of type BarcodeFormat.`)}),rn(this,Me,c!=null?c:[]),Mn().then(l=>{this.dispatchEvent(new CustomEvent("load",{detail:l}))}).catch(l=>{this.dispatchEvent(new CustomEvent("error",{detail:l}))})}catch(c){throw Qt(c,"Failed to construct 'BarcodeDetector'")}}static async getSupportedFormats(){return nn.filter(o=>o!=="unknown")}async detect(o){try{const i=await dn(o);if(i===null)return[];let c;try{Yt(i)?c=await An(i,{tryHarder:!0,formats:jt(this,Me).map(l=>Le.get(l))}):c=await Rn(i,{tryHarder:!0,formats:jt(this,Me).map(l=>Le.get(l))})}catch(l){throw console.error(l),new DOMException("Barcode detection service unavailable.","NotSupportedError")}return c.map(l=>{const{topLeft:{x:h,y:v},topRight:{x:g,y:b},bottomLeft:{x:p,y:C},bottomRight:{x:S,y:$}}=l.position,U=Math.min(h,g,p,S),W=Math.min(v,b,C,$),j=Math.max(h,g,p,S),k=Math.max(v,b,C,$);return{boundingBox:new DOMRectReadOnly(U,W,j-U,k-W),rawValue:l.text,format:an(l.format),cornerPoints:[{x:h,y:v},{x:g,y:b},{x:S,y:$},{x:p,y:C}]}})}catch(i){throw Qt(i,"Failed to execute 'detect' on 'BarcodeDetector'")}}}Me=new WeakMap;const dt=(r,o,i="error")=>{let c,l;const h=new Promise((v,g)=>{c=v,l=g,r.addEventListener(o,c),r.addEventListener(i,l)});return h.finally(()=>{r.removeEventListener(o,c),r.removeEventListener(i,l)}),h},tr=r=>new Promise(o=>setTimeout(o,r));class xn extends Error{constructor(){super("can't process cross-origin image"),this.name="DropImageFetchError"}}class rr extends Error{constructor(){super("this browser has no Stream API support"),this.name="StreamApiNotSupportedError"}}class kn extends Error{constructor(){super("camera access is only permitted in secure context. Use HTTPS or localhost rather than HTTP."),this.name="InsecureContextError"}}class In extends Error{constructor(){super("Loading camera stream timed out after 6 seconds. If you are on iOS in PWA mode, this is a known issue (see https://github.com/gruhn/vue-qrcode-reader/issues/298)"),this.name="StreamLoadTimeoutError"}}let nr;async function Fn(r){if(window.BarcodeDetector===void 0)return console.debug("[vue-qrcode-reader] Native BarcodeDetector not supported. Will use polyfill."),new Be({formats:r});const o=await window.BarcodeDetector.getSupportedFormats(),i=r.filter(c=>!o.includes(c));return i.length>0?(console.debug(`[vue-qrcode-reader] Native BarcodeDetector does not support formats ${JSON.stringify(i)}. Will use polyfill.`),new Be({formats:r})):(console.debug("[vue-qrcode-reader] Will use native BarcodeDetector."),new window.BarcodeDetector({formats:r}))}async function ar(r){nr=await Fn(r)}const Un=async(r,{detectHandler:o,locateHandler:i,minDelay:c,formats:l})=>{console.debug("[vue-qrcode-reader] start scanning"),await ar(l);const h=v=>async g=>{if(r.readyState===0)console.debug("[vue-qrcode-reader] stop scanning: video element readyState is 0");else{const{lastScanned:b,contentBefore:p,lastScanHadContent:C}=v;if(g-b!p.includes(j.rawValue));$&&o(S);const U=S.length>0;U&&i(S),!U&&C&&i(S);const W={lastScanned:g,lastScanHadContent:U,contentBefore:$?S.map(j=>j.rawValue):p};window.requestAnimationFrame(h(W))}}};h({lastScanned:performance.now(),contentBefore:[],lastScanHadContent:!1})(performance.now())},Wn=async r=>{if(r.startsWith("http")&&r.includes(location.host)===!1)throw new xn;const o=document.createElement("img");return o.src=r,await dt(o,"load"),o},or=async(r,o=["qr_code"])=>await new Be({formats:o}).detect(r),jn=async(r,o=["qr_code"])=>{const i=new Be({formats:o}),c=await Wn(r);return await i.detect(c)};var ir={},X={};Object.defineProperty(X,"__esModule",{value:!0}),X.compactObject=lr,X.deprecated=Yn;var Ln=X.detectBrowser=Jn;X.disableLog=Nn,X.disableWarnings=zn,X.extractVersion=Ve,X.filterStats=Qn,X.log=Gn,X.walkStats=qe,X.wrapPeerConnectionEvent=qn;function Hn(r,o,i){return o=Bn(o),o in r?Object.defineProperty(r,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):r[o]=i,r}function Bn(r){var o=Vn(r,"string");return fe(o)==="symbol"?o:String(o)}function Vn(r,o){if(fe(r)!=="object"||r===null)return r;var i=r[Symbol.toPrimitive];if(i!==void 0){var c=i.call(r,o||"default");if(fe(c)!=="object")return c;throw new TypeError("@@toPrimitive must return a primitive value.")}return(o==="string"?String:Number)(r)}function fe(r){"@babel/helpers - typeof";return fe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},fe(r)}var sr=!0,cr=!0;function Ve(r,o,i){var c=r.match(o);return c&&c.length>=i&&parseInt(c[i],10)}function qn(r,o,i){if(r.RTCPeerConnection){var c=r.RTCPeerConnection.prototype,l=c.addEventListener;c.addEventListener=function(v,g){if(v!==o)return l.apply(this,arguments);var b=function(C){var S=i(C);S&&(g.handleEvent?g.handleEvent(S):g(S))};return this._eventMap=this._eventMap||{},this._eventMap[o]||(this._eventMap[o]=new Map),this._eventMap[o].set(g,b),l.apply(this,[v,b])};var h=c.removeEventListener;c.removeEventListener=function(v,g){if(v!==o||!this._eventMap||!this._eventMap[o])return h.apply(this,arguments);if(!this._eventMap[o].has(g))return h.apply(this,arguments);var b=this._eventMap[o].get(g);return this._eventMap[o].delete(g),this._eventMap[o].size===0&&delete this._eventMap[o],Object.keys(this._eventMap).length===0&&delete this._eventMap,h.apply(this,[v,b])},Object.defineProperty(c,"on"+o,{get:function(){return this["_on"+o]},set:function(g){this["_on"+o]&&(this.removeEventListener(o,this["_on"+o]),delete this["_on"+o]),g&&this.addEventListener(o,this["_on"+o]=g)},enumerable:!0,configurable:!0})}}function Nn(r){return typeof r!="boolean"?new Error("Argument type: "+fe(r)+". Please use a boolean."):(sr=r,r?"adapter.js logging disabled":"adapter.js logging enabled")}function zn(r){return typeof r!="boolean"?new Error("Argument type: "+fe(r)+". Please use a boolean."):(cr=!r,"adapter.js deprecation warnings "+(r?"disabled":"enabled"))}function Gn(){if((typeof window>"u"?"undefined":fe(window))==="object"){if(sr)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function Yn(r,o){cr&&console.warn(r+" is deprecated, please use "+o+" instead.")}function Jn(r){var o={browser:null,version:null};if(typeof r>"u"||!r.navigator||!r.navigator.userAgent)return o.browser="Not a browser.",o;var i=r.navigator;if(i.mozGetUserMedia)o.browser="firefox",o.version=Ve(i.userAgent,/Firefox\/(\d+)\./,1);else if(i.webkitGetUserMedia||r.isSecureContext===!1&&r.webkitRTCPeerConnection)o.browser="chrome",o.version=Ve(i.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(r.RTCPeerConnection&&i.userAgent.match(/AppleWebKit\/(\d+)\./))o.browser="safari",o.version=Ve(i.userAgent,/AppleWebKit\/(\d+)\./,1),o.supportsUnifiedPlan=r.RTCRtpTransceiver&&"currentDirection"in r.RTCRtpTransceiver.prototype;else return o.browser="Not a supported browser.",o;return o}function ur(r){return Object.prototype.toString.call(r)==="[object Object]"}function lr(r){return ur(r)?Object.keys(r).reduce(function(o,i){var c=ur(r[i]),l=c?lr(r[i]):r[i],h=c&&!Object.keys(l).length;return l===void 0||h?o:Object.assign(o,Hn({},i,l))},{}):r}function qe(r,o,i){!o||i.has(o.id)||(i.set(o.id,o),Object.keys(o).forEach(function(c){c.endsWith("Id")?qe(r,r.get(o[c]),i):c.endsWith("Ids")&&o[c].forEach(function(l){qe(r,r.get(l),i)})}))}function Qn(r,o,i){var c=i?"outbound-rtp":"inbound-rtp",l=new Map;if(o===null)return l;var h=[];return r.forEach(function(v){v.type==="track"&&v.trackIdentifier===o.id&&h.push(v)}),h.forEach(function(v){r.forEach(function(g){g.type===c&&g.trackId===v.id&&qe(r,g,l)})}),l}Object.defineProperty(ir,"__esModule",{value:!0});var Xn=ir.shimGetUserMedia=ea,Zn=Kn(X);function dr(r){if(typeof WeakMap!="function")return null;var o=new WeakMap,i=new WeakMap;return(dr=function(l){return l?i:o})(r)}function Kn(r,o){if(r&&r.__esModule)return r;if(r===null||he(r)!=="object"&&typeof r!="function")return{default:r};var i=dr(o);if(i&&i.has(r))return i.get(r);var c={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var h in r)if(h!=="default"&&Object.prototype.hasOwnProperty.call(r,h)){var v=l?Object.getOwnPropertyDescriptor(r,h):null;v&&(v.get||v.set)?Object.defineProperty(c,h,v):c[h]=r[h]}return c.default=r,i&&i.set(r,c),c}function he(r){"@babel/helpers - typeof";return he=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},he(r)}var fr=Zn.log;function ea(r,o){var i=r&&r.navigator;if(i.mediaDevices){var c=function(p){if(he(p)!=="object"||p.mandatory||p.optional)return p;var C={};return Object.keys(p).forEach(function(S){if(!(S==="require"||S==="advanced"||S==="mediaSource")){var $=he(p[S])==="object"?p[S]:{ideal:p[S]};$.exact!==void 0&&typeof $.exact=="number"&&($.min=$.max=$.exact);var U=function(k,R){return k?k+R.charAt(0).toUpperCase()+R.slice(1):R==="deviceId"?"sourceId":R};if($.ideal!==void 0){C.optional=C.optional||[];var W={};typeof $.ideal=="number"?(W[U("min",S)]=$.ideal,C.optional.push(W),W={},W[U("max",S)]=$.ideal,C.optional.push(W)):(W[U("",S)]=$.ideal,C.optional.push(W))}$.exact!==void 0&&typeof $.exact!="number"?(C.mandatory=C.mandatory||{},C.mandatory[U("",S)]=$.exact):["min","max"].forEach(function(j){$[j]!==void 0&&(C.mandatory=C.mandatory||{},C.mandatory[U(j,S)]=$[j])})}}),p.advanced&&(C.optional=(C.optional||[]).concat(p.advanced)),C},l=function(p,C){if(o.version>=61)return C(p);if(p=JSON.parse(JSON.stringify(p)),p&&he(p.audio)==="object"){var S=function(k,R,Z){R in k&&!(Z in k)&&(k[Z]=k[R],delete k[R])};p=JSON.parse(JSON.stringify(p)),S(p.audio,"autoGainControl","googAutoGainControl"),S(p.audio,"noiseSuppression","googNoiseSuppression"),p.audio=c(p.audio)}if(p&&he(p.video)==="object"){var $=p.video.facingMode;$=$&&(he($)==="object"?$:{ideal:$});var U=o.version<66;if($&&($.exact==="user"||$.exact==="environment"||$.ideal==="user"||$.ideal==="environment")&&!(i.mediaDevices.getSupportedConstraints&&i.mediaDevices.getSupportedConstraints().facingMode&&!U)){delete p.video.facingMode;var W;if($.exact==="environment"||$.ideal==="environment"?W=["back","rear"]:($.exact==="user"||$.ideal==="user")&&(W=["front"]),W)return i.mediaDevices.enumerateDevices().then(function(j){j=j.filter(function(R){return R.kind==="videoinput"});var k=j.find(function(R){return W.some(function(Z){return R.label.toLowerCase().includes(Z)})});return!k&&j.length&&W.includes("back")&&(k=j[j.length-1]),k&&(p.video.deviceId=$.exact?{exact:k.deviceId}:{ideal:k.deviceId}),p.video=c(p.video),fr("chrome: "+JSON.stringify(p)),C(p)})}p.video=c(p.video)}return fr("chrome: "+JSON.stringify(p)),C(p)},h=function(p){return o.version>=64?p:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[p.name]||p.name,message:p.message,constraint:p.constraint||p.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}},v=function(p,C,S){l(p,function($){i.webkitGetUserMedia($,C,function(U){S&&S(h(U))})})};if(i.getUserMedia=v.bind(i),i.mediaDevices.getUserMedia){var g=i.mediaDevices.getUserMedia.bind(i.mediaDevices);i.mediaDevices.getUserMedia=function(b){return l(b,function(p){return g(p).then(function(C){if(p.audio&&!C.getAudioTracks().length||p.video&&!C.getVideoTracks().length)throw C.getTracks().forEach(function(S){S.stop()}),new DOMException("","NotFoundError");return C},function(C){return Promise.reject(h(C))})})}}}}var hr={};Object.defineProperty(hr,"__esModule",{value:!0});var ta=hr.shimGetUserMedia=aa,ra=na(X);function pr(r){if(typeof WeakMap!="function")return null;var o=new WeakMap,i=new WeakMap;return(pr=function(l){return l?i:o})(r)}function na(r,o){if(r&&r.__esModule)return r;if(r===null||$e(r)!=="object"&&typeof r!="function")return{default:r};var i=pr(o);if(i&&i.has(r))return i.get(r);var c={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var h in r)if(h!=="default"&&Object.prototype.hasOwnProperty.call(r,h)){var v=l?Object.getOwnPropertyDescriptor(r,h):null;v&&(v.get||v.set)?Object.defineProperty(c,h,v):c[h]=r[h]}return c.default=r,i&&i.set(r,c),c}function $e(r){"@babel/helpers - typeof";return $e=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},$e(r)}function aa(r,o){var i=r&&r.navigator,c=r&&r.MediaStreamTrack;if(i.getUserMedia=function(b,p,C){ra.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),i.mediaDevices.getUserMedia(b).then(p,C)},!(o.version>55&&"autoGainControl"in i.mediaDevices.getSupportedConstraints())){var l=function(p,C,S){C in p&&!(S in p)&&(p[S]=p[C],delete p[C])},h=i.mediaDevices.getUserMedia.bind(i.mediaDevices);if(i.mediaDevices.getUserMedia=function(b){return $e(b)==="object"&&$e(b.audio)==="object"&&(b=JSON.parse(JSON.stringify(b)),l(b.audio,"autoGainControl","mozAutoGainControl"),l(b.audio,"noiseSuppression","mozNoiseSuppression")),h(b)},c&&c.prototype.getSettings){var v=c.prototype.getSettings;c.prototype.getSettings=function(){var b=v.apply(this,arguments);return l(b,"mozAutoGainControl","autoGainControl"),l(b,"mozNoiseSuppression","noiseSuppression"),b}}if(c&&c.prototype.applyConstraints){var g=c.prototype.applyConstraints;c.prototype.applyConstraints=function(b){return this.kind==="audio"&&$e(b)==="object"&&(b=JSON.parse(JSON.stringify(b)),l(b,"autoGainControl","mozAutoGainControl"),l(b,"noiseSuppression","mozNoiseSuppression")),g.apply(this,[b])}}}}var ne={};Object.defineProperty(ne,"__esModule",{value:!0}),ne.shimAudioContext=pa,ne.shimCallbacksAPI=ua,ne.shimConstraints=yr,ne.shimCreateOfferLegacy=ha;var oa=ne.shimGetUserMedia=la;ne.shimLocalStreamsAPI=sa,ne.shimRTCIceServerUrls=da,ne.shimRemoteStreamsAPI=ca,ne.shimTrackEventTransceiver=fa;var mr=ia(X);function vr(r){if(typeof WeakMap!="function")return null;var o=new WeakMap,i=new WeakMap;return(vr=function(l){return l?i:o})(r)}function ia(r,o){if(r&&r.__esModule)return r;if(r===null||pe(r)!=="object"&&typeof r!="function")return{default:r};var i=vr(o);if(i&&i.has(r))return i.get(r);var c={},l=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var h in r)if(h!=="default"&&Object.prototype.hasOwnProperty.call(r,h)){var v=l?Object.getOwnPropertyDescriptor(r,h):null;v&&(v.get||v.set)?Object.defineProperty(c,h,v):c[h]=r[h]}return c.default=r,i&&i.set(r,c),c}function pe(r){"@babel/helpers - typeof";return pe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(o){return typeof o}:function(o){return o&&typeof Symbol=="function"&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},pe(r)}function sa(r){if(!(pe(r)!=="object"||!r.RTCPeerConnection)){if("getLocalStreams"in r.RTCPeerConnection.prototype||(r.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in r.RTCPeerConnection.prototype)){var o=r.RTCPeerConnection.prototype.addTrack;r.RTCPeerConnection.prototype.addStream=function(c){var l=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(c)||this._localStreams.push(c),c.getAudioTracks().forEach(function(h){return o.call(l,h,c)}),c.getVideoTracks().forEach(function(h){return o.call(l,h,c)})},r.RTCPeerConnection.prototype.addTrack=function(c){for(var l=this,h=arguments.length,v=new Array(h>1?h-1:0),g=1;g=0)){c._remoteStreams.push(h);var v=new Event("addstream");v.stream=h,c.dispatchEvent(v)}})}),o.apply(c,arguments)}}}function ua(r){if(!(pe(r)!=="object"||!r.RTCPeerConnection)){var o=r.RTCPeerConnection.prototype,i=o.createOffer,c=o.createAnswer,l=o.setLocalDescription,h=o.setRemoteDescription,v=o.addIceCandidate;o.createOffer=function(p,C){var S=arguments.length>=2?arguments[2]:arguments[0],$=i.apply(this,[S]);return C?($.then(p,C),Promise.resolve()):$},o.createAnswer=function(p,C){var S=arguments.length>=2?arguments[2]:arguments[0],$=c.apply(this,[S]);return C?($.then(p,C),Promise.resolve()):$};var g=function(p,C,S){var $=l.apply(this,[p]);return S?($.then(C,S),Promise.resolve()):$};o.setLocalDescription=g,g=function(p,C,S){var $=h.apply(this,[p]);return S?($.then(C,S),Promise.resolve()):$},o.setRemoteDescription=g,g=function(p,C,S){var $=v.apply(this,[p]);return S?($.then(C,S),Promise.resolve()):$},o.addIceCandidate=g}}function la(r){var o=r&&r.navigator;if(o.mediaDevices&&o.mediaDevices.getUserMedia){var i=o.mediaDevices,c=i.getUserMedia.bind(i);o.mediaDevices.getUserMedia=function(l){return c(yr(l))}}!o.getUserMedia&&o.mediaDevices&&o.mediaDevices.getUserMedia&&(o.getUserMedia=(function(h,v,g){o.mediaDevices.getUserMedia(h).then(v,g)}).bind(o))}function yr(r){return r&&r.video!==void 0?Object.assign({},r,{video:mr.compactObject(r.video)}):r}function da(r){if(r.RTCPeerConnection){var o=r.RTCPeerConnection;r.RTCPeerConnection=function(c,l){if(c&&c.iceServers){for(var h=[],v=0;v{let o=!1,i;return(...c)=>(o||(i=r(c),o=!0),i)};function se(r,o){if(r===!1)throw new Error(o!=null?o:"assertion failure")}function gr(r){throw new Error("this code should be unreachable")}const va=ma(()=>{const r=Ln(window);switch(r.browser){case"chrome":Xn(window,r);break;case"firefox":ta(window,r);break;case"safari":oa(window,r);break;default:throw new rr}});let _e=Promise.resolve({type:"stop",data:{}});async function wr(r,o,i){var g,b,p;if(console.debug("[vue-qrcode-reader] starting camera with constraints: ",JSON.stringify(o)),window.isSecureContext!==!0)throw new kn;if(((g=navigator==null?void 0:navigator.mediaDevices)==null?void 0:g.getUserMedia)===void 0)throw new rr;va(),console.debug("[vue-qrcode-reader] calling getUserMedia");const c=await navigator.mediaDevices.getUserMedia({audio:!1,video:o});r.srcObject!==void 0?r.srcObject=c:r.mozSrcObject!==void 0?r.mozSrcObject=c:window.URL.createObjectURL?r.src=window.URL.createObjectURL(c):window.webkitURL?r.src=window.webkitURL.createObjectURL(c):r.src=c.id,r.play(),console.debug("[vue-qrcode-reader] waiting for video element to load"),await Promise.race([dt(r,"loadeddata"),tr(6e3).then(()=>{throw new In})]),console.debug("[vue-qrcode-reader] video element loaded"),await tr(500);const[l]=c.getVideoTracks(),h=(p=(b=l==null?void 0:l.getCapabilities)==null?void 0:b.call(l))!=null?p:{};let v=!1;return i&&h.torch&&(await l.applyConstraints({advanced:[{torch:!0}]}),v=!0),console.debug("[vue-qrcode-reader] camera ready"),{type:"start",data:{videoEl:r,stream:c,capabilities:h,constraints:o,isTorchOn:v}}}async function ya(r,{constraints:o,torch:i,restart:c=!1}){_e=_e.then(h=>{if(h.type==="start"){const{data:{videoEl:v,stream:g,constraints:b,isTorchOn:p}}=h;return!c&&r===v&&o===b&&i===p?h:br(v,g,p).then(()=>wr(r,o,i))}else if(h.type==="stop"||h.type==="failed")return wr(r,o,i);gr()}).catch(h=>(console.debug(`[vue-qrcode-reader] starting camera failed with "${h}"`),{type:"failed",error:h}));const l=await _e;if(l.type==="stop")throw new Error("Something went wrong with the camera task queue (start task).");if(l.type==="failed")throw l.error;if(l.type==="start")return l.data.capabilities;gr()}async function br(r,o,i){console.debug("[vue-qrcode-reader] stopping camera"),r.src="",r.srcObject=null,r.load(),await dt(r,"error");for(const c of o.getTracks())i!=null||await c.applyConstraints({advanced:[{torch:!1}]}),o.removeTrack(c),c.stop();return{type:"stop",data:{}}}async function Ne(){if(_e=_e.then(o=>{if(o.type==="stop"||o.type==="failed")return o;const{data:{videoEl:i,stream:c,isTorchOn:l}}=o;return br(i,c,l)}),(await _e).type==="start")throw new Error("Something went wrong with the camera task queue (stop task).")}const Cr=O.defineComponent({__name:"QrcodeStream",props:{constraints:{type:Object,default(){return{facingMode:"environment"}}},formats:{type:Array,default:()=>["qr_code"]},paused:{type:Boolean,default:!1},torch:{type:Boolean,default:!1},track:{type:Function}},emits:["detect","camera-on","camera-off","error"],setup(r,{emit:o}){const i=r,c=o,l=O.ref(i.constraints),h=O.ref(i.formats);O.watch(()=>i.constraints,(I,D)=>{JSON.stringify(I)!==JSON.stringify(D)&&(l.value=I)},{deep:!0}),O.watch(()=>i.formats,(I,D)=>{JSON.stringify(I)!==JSON.stringify(D)&&(h.value=I)},{deep:!0});const v=O.ref(),g=O.ref(),b=O.ref(),p=O.ref(!1),C=O.ref(!1);O.onMounted(()=>{C.value=!0}),O.onUnmounted(()=>{Ne()});const S=O.computed(()=>({torch:i.torch,constraints:l.value,shouldStream:C.value&&!i.paused}));O.watch(S,async I=>{const D=b.value;se(D!==void 0,"cameraSettings watcher should never be triggered when component is not mounted. Thus video element should always be defined.");const A=v.value;se(A!==void 0,"cameraSettings watcher should never be triggered when component is not mounted. Thus canvas should always be defined.");const me=A.getContext("2d");if(se(me!==null,"if cavnas is defined, canvas 2d context should also be non-null"),I.shouldStream){Ne(),p.value=!1;try{const ce=await ya(D,I);C.value?(p.value=!0,c("camera-on",ce)):await Ne()}catch(ce){c("error",ce)}}else A.width=D.videoWidth,A.height=D.videoHeight,me.drawImage(D,0,0,D.videoWidth,D.videoHeight),Ne(),p.value=!1,c("camera-off")},{deep:!0}),O.watch(h,async I=>{C.value&&await ar(I)});const $=O.computed(()=>S.value.shouldStream&&p.value);O.watch($,I=>{if(I){se(v.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus pause frame canvas is defined"),U(v.value),se(g.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus tracking canvas is defined"),U(g.value);const D=()=>i.track===void 0?500:40;se(b.value!==void 0,"shouldScan watcher should only be triggered when component is mounted. Thus video element is defined"),Un(b.value,{detectHandler:A=>c("detect",A),formats:h.value,locateHandler:W,minDelay:D()})}});const U=I=>{const D=I.getContext("2d");se(D!==null,"canvas 2d context should always be non-null"),D.clearRect(0,0,I.width,I.height)},W=I=>{const D=g.value;se(D!==void 0,"onLocate handler should only be called when component is mounted. Thus tracking canvas is always defined.");const A=b.value;if(se(A!==void 0,"onLocate handler should only be called when component is mounted. Thus video element is always defined."),I.length===0||i.track===void 0)U(D);else{const me=A.offsetWidth,ce=A.offsetHeight,Se=A.videoWidth,Pe=A.videoHeight,De=Math.max(me/Se,ce/Pe),Ae=Se*De,ze=Pe*De,ft=Ae/Se,ht=ze/Pe,pt=(me-Ae)/2,mt=(ce-ze)/2,Re=({x:ve,y:K})=>({x:Math.floor(ve*ft),y:Math.floor(K*ht)}),ae=({x:ve,y:K})=>({x:Math.floor(ve+pt),y:Math.floor(K+mt)}),ge=I.map(ve=>{const{boundingBox:K,cornerPoints:yt}=ve,{x:Ge,y:ye}=ae(Re({x:K.x,y:K.y})),{x:Ye,y:gt}=Re({x:K.width,y:K.height});return{...ve,cornerPoints:yt.map(Je=>ae(Re(Je))),boundingBox:DOMRectReadOnly.fromRect({x:Ge,y:ye,width:Ye,height:gt})}});D.width=A.offsetWidth,D.height=A.offsetHeight;const vt=D.getContext("2d");i.track(ge,vt)}},j={width:"100%",height:"100%",position:"relative","z-index":"0"},k={width:"100%",height:"100%",position:"absolute",top:"0",left:"0"},R={width:"100%",height:"100%","object-fit":"cover"},Z=O.computed(()=>$.value?R:{...R,visibility:"hidden",position:"absolute"});return(I,D)=>(O.openBlock(),O.createElementBlock("div",{style:j},[O.createElementVNode("video",{ref_key:"videoRef",ref:b,style:O.normalizeStyle(Z.value),autoplay:"",muted:"",playsinline:""},null,4),O.withDirectives(O.createElementVNode("canvas",{id:"qrcode-stream-pause-frame",ref_key:"pauseFrameRef",ref:v,style:R},null,512),[[O.vShow,!$.value]]),O.createElementVNode("canvas",{id:"qrcode-stream-tracking-layer",ref_key:"trackingLayerRef",ref:g,style:k},null,512),O.createElementVNode("div",{style:k},[O.renderSlot(I.$slots,"default")])]))}}),$r=O.defineComponent({__name:"QrcodeCapture",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect"],setup(r,{emit:o}){const i=r,c=o,l=h=>{if(!(!(h.target instanceof HTMLInputElement)||!h.target.files))for(const v of Array.from(h.target.files))or(v,i.formats).then(g=>{c("detect",g)})};return(h,v)=>(O.openBlock(),O.createElementBlock("input",{onChange:l,type:"file",name:"image",accept:"image/*",capture:"environment",multiple:""},null,32))}}),_r=O.defineComponent({__name:"QrcodeDropZone",props:{formats:{type:Array,default:()=>["qr_code"]}},emits:["detect","dragover","error"],setup(r,{emit:o}){const i=r,c=o,l=async g=>{try{const b=await g;c("detect",b)}catch(b){c("error",b)}},h=g=>{c("dragover",g)},v=({dataTransfer:g})=>{if(!g)return;h(!1);const b=[...Array.from(g.files)],p=g.getData("text/uri-list");b.forEach(C=>{l(or(C,i.formats))}),p!==""&&l(jn(p,i.formats))};return(g,b)=>(O.openBlock(),O.createElementBlock("div",{onDrop:O.withModifiers(v,["prevent","stop"]),onDragenter:b[0]||(b[0]=O.withModifiers(p=>h(!0),["prevent","stop"])),onDragleave:b[1]||(b[1]=O.withModifiers(p=>h(!1),["prevent","stop"])),onDragover:b[2]||(b[2]=O.withModifiers(()=>{},["prevent","stop"]))},[O.renderSlot(g.$slots,"default")],32))}});function Sr(r){r.component("qrcode-stream",Cr),r.component("qrcode-capture",$r),r.component("qrcode-drop-zone",_r)}const ga={install:Sr};ee.QrcodeCapture=$r,ee.QrcodeDropZone=_r,ee.QrcodeStream=Cr,ee.VueQrcodeReader=ga,ee.install=Sr,ee.setZXingModuleOverrides=Dn,Object.defineProperty(ee,Symbol.toStringTag,{value:"Module"})}); diff --git a/lnbits/tasks.py b/lnbits/tasks.py index 2da57e96c..a43657d0c 100644 --- a/lnbits/tasks.py +++ b/lnbits/tasks.py @@ -20,8 +20,7 @@ from lnbits.core.crud import ( delete_webpush_subscriptions, get_payments, get_standalone_payment, - update_payment_details, - update_payment_status, + update_payment, ) from lnbits.core.models import Payment, PaymentState from lnbits.settings import settings @@ -181,17 +180,14 @@ async def check_pending_payments(): status = await payment.check_status() prefix = f"payment ({i+1} / {count})" if status.failed: - await update_payment_status( - payment.checking_id, status=PaymentState.FAILED - ) + payment.status = PaymentState.FAILED + await update_payment(payment) logger.debug(f"{prefix} failed {payment.checking_id}") elif status.success: - await update_payment_details( - checking_id=payment.checking_id, - fee=status.fee_msat, - preimage=status.preimage, - status=PaymentState.SUCCESS, - ) + payment.fee = status.fee_msat or 0 + payment.preimage = status.preimage + payment.status = PaymentState.SUCCESS + await update_payment(payment) logger.debug(f"{prefix} success {payment.checking_id}") else: logger.debug(f"{prefix} pending {payment.checking_id}") @@ -211,14 +207,10 @@ async def invoice_callback_dispatcher(checking_id: str, is_internal: bool = Fals payment = await get_standalone_payment(checking_id, incoming=True) if payment and payment.is_in: status = await payment.check_status() - await update_payment_details( - checking_id=payment.checking_id, - fee=status.fee_msat, - preimage=status.preimage, - status=PaymentState.SUCCESS, - ) - payment = await get_standalone_payment(checking_id, incoming=True) - assert payment, "updated payment not found" + payment.fee = status.fee_msat or 0 + payment.preimage = status.preimage + payment.status = PaymentState.SUCCESS + await update_payment(payment) internal = "internal" if is_internal else "" logger.success(f"{internal} invoice {checking_id} settled") for name, send_chan in invoice_listeners.items(): diff --git a/lnbits/templates/components.vue b/lnbits/templates/components.vue index cf98d2b7e..4860c3af3 100644 --- a/lnbits/templates/components.vue +++ b/lnbits/templates/components.vue @@ -251,6 +251,17 @@ />
+
+ :  + +
+
@@ -301,7 +312,7 @@ v-if="o.options?.length" :options="o.options" v-model="formData[o.name]" - @input="handleValueChanged" + @update:model-value="handleValueChanged" class="q-ml-xl" > @@ -310,7 +321,7 @@ v-if="o.type === 'number'" type="number" v-model="formData[o.name]" - @input="handleValueChanged" + @update:model-value="handleValueChanged" :label="o.label || o.name" :hint="o.description" :rules="applyRules(o.required)" @@ -322,7 +333,7 @@ type="textarea" rows="5" v-model="formData[o.name]" - @input="handleValueChanged" + @update:model-value="handleValueChanged" :label="o.label || o.name" :hint="o.description" :rules="applyRules(o.required)" @@ -332,7 +343,7 @@ @@ -391,10 +402,16 @@ style="display: none" :rules="applyRules(o.required)" > +
+ +
+ + @@ -585,12 +640,12 @@ :rows="paymentsOmitter" :row-key="paymentTableRowKey" :columns="paymentsTable.columns" - :pagination.sync="paymentsTable.pagination" :no-data-label="$t('no_transactions')" :filter="paymentsTable.search" :loading="paymentsTable.loading" :hide-header="mobileSimple" :hide-bottom="mobileSimple" + v-model:pagination="paymentsTable.pagination" @request="fetchPayments" > -