diff --git a/dashboard/src/components/MenuPage/MultiCurrencyDialog.jsx b/dashboard/src/components/MenuPage/MultiCurrencyDialog.jsx
index b697652..82ef463 100644
--- a/dashboard/src/components/MenuPage/MultiCurrencyDialog.jsx
+++ b/dashboard/src/components/MenuPage/MultiCurrencyDialog.jsx
@@ -427,50 +427,59 @@ export default function MultiCurrencyDialog({
diff --git a/dashboard/src/components/MenuPage/PaymentDialog.jsx b/dashboard/src/components/MenuPage/PaymentDialog.jsx
index e18bf32..6371cf5 100644
--- a/dashboard/src/components/MenuPage/PaymentDialog.jsx
+++ b/dashboard/src/components/MenuPage/PaymentDialog.jsx
@@ -29,7 +29,6 @@ export default function PaymentDialog({
const [activeMethod, setActiveMethod] = useState("");
const [paymentAmounts, setPaymentAmounts] = useState({});
const [note, setNote] = useState("");
- const [loading, setLoading] = useState(false);
const [loadingPaymentMethods, setLoadingPaymentMethods] = useState(true);
const [total, setTotal] = useState(0);
const [openMultiCurrencyDialog, setOpenMultiCurrencyDialog] = useState(false);
@@ -141,126 +140,123 @@ export default function PaymentDialog({
}, [paymentAmounts, total]);
async function handlePay (){
- // Prevent double submission
- if (loading) return;
+ let paidTotal = sumPayments();
- setLoading(true);
- try {
- let paidTotal = sumPayments();
-
- // Get payment breakdown for multiple methods (optimized: single pass)
- const paymentEntries = Object.entries(paymentAmounts)
- .filter(([k, v]) => parseFloat(v) > 0);
-
- let paymentBreakdown = paymentEntries.map(([k, v]) => ({
- payment_method: k,
- amount: parseFloat(v) || 0
+ // Get payment breakdown for multiple methods (optimized: single pass)
+ const paymentEntries = Object.entries(paymentAmounts)
+ .filter(([k, v]) => parseFloat(v) > 0);
+
+ let paymentBreakdown = paymentEntries.map(([k, v]) => ({
+ payment_method: k,
+ amount: parseFloat(v) || 0
+ }));
+
+ // Cap payment amounts at total if total exceeds invoice total
+ if (paidTotal > total && paymentBreakdown.length > 0) {
+ // Scale down proportionally if total exceeds
+ const scaleFactor = total / paidTotal;
+ paymentBreakdown = paymentBreakdown.map(p => ({
+ ...p,
+ amount: p.amount * scaleFactor
}));
+ paidTotal = total;
+ }
- // Cap payment amounts at total if total exceeds invoice total
- if (paidTotal > total && paymentBreakdown.length > 0) {
- // Scale down proportionally if total exceeds
- const scaleFactor = total / paidTotal;
- paymentBreakdown = paymentBreakdown.map(p => ({
- ...p,
- amount: p.amount * scaleFactor
- }));
- paidTotal = total;
- }
+ // Create breakdown note (optimized: single pass)
+ const breakdown = paymentBreakdown
+ .map(p => `${p.payment_method}:${p.amount.toFixed(2)}`)
+ .join(", ");
- // Create breakdown note (optimized: single pass)
- const breakdown = paymentBreakdown
- .map(p => `${p.payment_method}:${p.amount.toFixed(2)}`)
- .join(", ");
-
- const payment_method = paymentBreakdown.length > 1 ? "Multi" : (paymentBreakdown[0]?.payment_method || "Cash");
-
- const fullNote = note ? `${note} | ${breakdown}` : breakdown;
-
- let res;
-
- if (isExistingTransaction && transactionDoctype && transactionName) {
- // Only fetch invoice JSON if needed (optimized: conditional)
- try {
- const invoiceJson = await get_invoice_json(transactionName);
- console.log("Invoice JSON returned from backend:", invoiceJson);
-
- // Convert JSON to string
- const jsonStr = JSON.stringify(invoiceJson, null, 2);
-
- // Create a blob and download (optimized: async download)
- const blob = new Blob([jsonStr], { type: "text/plain" });
- const link = document.createElement("a");
- link.href = URL.createObjectURL(blob);
- link.download = `${transactionName}.txt`;
- document.body.appendChild(link);
- link.click();
- // Cleanup asynchronously (non-blocking)
- setTimeout(() => {
- document.body.removeChild(link);
- URL.revokeObjectURL(link.href);
- }, 0);
- } catch (error) {
- console.error("Error fetching invoice JSON:", error);
- // Continue with payment even if JSON fetch fails
- }
+ const payment_method = paymentBreakdown.length > 1 ? "Multi" : (paymentBreakdown[0]?.payment_method || "Cash");
- // Make payment for existing Sales Invoice or Quotation
- // Always send paymentBreakdown if it exists (even for single payment)
- res = await makePaymentForTransaction(
- transactionDoctype,
- transactionName,
- paidTotal > 0 ? paidTotal : null,
- payment_method,
- fullNote,
- paymentBreakdown.length > 0 ? paymentBreakdown : null
- );
- } else {
- // Create new order and payment using queue (sales invoice and payment created in background)
- const payload =
- orderPayload ||
- ({
- order_type: "Take Away",
- customer_name: customer || (orderPayload && orderPayload.customer_name) || "",
- order_items: cartItems,
- });
-
- // Ensure customer is set
- const finalCustomer = payload.customer_name || customer;
- if (!finalCustomer) {
- throw new Error("Customer is required. Please select a customer or configure a default customer in Settings.");
- }
+ const fullNote = note ? `${note} | ${breakdown}` : breakdown;
- // Use queue system for async processing
- res = await createInvoiceAndPaymentQueue(
- cartItems,
- finalCustomer,
- paymentBreakdown.length > 0 ? paymentBreakdown : null,
- paymentBreakdown.length === 1 ? payment_method : null,
- paidTotal > 0 ? paidTotal : null,
- fullNote,
- payload
- );
- }
+ // Immediately show success and close dialog (optimistic UI)
+ if (typeof onPaid === "function") {
+ onPaid({ success: true, message: "Payment processing..." });
+ }
+ if (typeof onOpenChange === "function") {
+ onOpenChange(false);
+ }
- if (res && res.success) {
- if (typeof onPaid === "function") onPaid(res);
- if (typeof onOpenChange === "function") onOpenChange(false);
- } else {
- console.error("Payment failed", res);
+ // Process payment in background (fire and forget)
+ (async () => {
+ try {
+ if (isExistingTransaction && transactionDoctype && transactionName) {
+ // Only fetch invoice JSON if needed (optimized: conditional)
+ try {
+ const invoiceJson = await get_invoice_json(transactionName);
+ console.log("Invoice JSON returned from backend:", invoiceJson);
+
+ // Convert JSON to string
+ const jsonStr = JSON.stringify(invoiceJson, null, 2);
+
+ // Create a blob and download (optimized: async download)
+ const blob = new Blob([jsonStr], { type: "text/plain" });
+ const link = document.createElement("a");
+ link.href = URL.createObjectURL(blob);
+ link.download = `${transactionName}.txt`;
+ document.body.appendChild(link);
+ link.click();
+ // Cleanup asynchronously (non-blocking)
+ setTimeout(() => {
+ document.body.removeChild(link);
+ URL.revokeObjectURL(link.href);
+ }, 0);
+ } catch (error) {
+ console.error("Error fetching invoice JSON:", error);
+ // Continue with payment even if JSON fetch fails
+ }
+
+ // Make payment for existing Sales Invoice or Quotation (background)
+ await makePaymentForTransaction(
+ transactionDoctype,
+ transactionName,
+ paidTotal > 0 ? paidTotal : null,
+ payment_method,
+ fullNote,
+ paymentBreakdown.length > 0 ? paymentBreakdown : null
+ );
+ } else {
+ // Create new order and payment using queue (sales invoice and payment created in background)
+ const payload =
+ orderPayload ||
+ ({
+ order_type: "Take Away",
+ customer_name: customer || (orderPayload && orderPayload.customer_name) || "",
+ order_items: cartItems,
+ });
+
+ // Ensure customer is set
+ const finalCustomer = payload.customer_name || customer;
+ if (!finalCustomer) {
+ console.error("Customer is required");
+ return;
+ }
+
+ // Use queue system for async processing (background)
+ await createInvoiceAndPaymentQueue(
+ cartItems,
+ finalCustomer,
+ paymentBreakdown.length > 0 ? paymentBreakdown : null,
+ paymentBreakdown.length === 1 ? payment_method : null,
+ paidTotal > 0 ? paidTotal : null,
+ fullNote,
+ payload
+ );
+ }
+ } catch (err) {
+ // Log error but don't block user (payment already shown as successful)
+ console.error("Payment processing error (background):", err);
}
- } catch (err) {
- console.error("Payment error:", err);
- } finally {
- setLoading(false);
- }
+ })();
};
useEffect(() => {
const handleKeyDown = (e) => {
if (e.key === "Enter") {
e.preventDefault();
- if (loading || paymentStatus.hasDue) return;
+ if (paymentStatus.hasDue) return;
handlePay();
}
};
@@ -269,7 +265,7 @@ export default function PaymentDialog({
document.removeEventListener("keydown", handleKeyDown);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
- }, [loading, paymentStatus.hasDue])
+ }, [paymentStatus.hasDue])
return (
<>
@@ -439,10 +435,10 @@ export default function PaymentDialog({
diff --git a/havano_restaurant_pos/api.py b/havano_restaurant_pos/api.py
index fa2f399..b4229ce 100644
--- a/havano_restaurant_pos/api.py
+++ b/havano_restaurant_pos/api.py
@@ -1278,8 +1278,7 @@ def safe(value):
}
-@frappe.whitelist()
-def make_payment_for_transaction(
+def process_payment_for_transaction_background(
doctype,
docname,
amount=None,
@@ -1287,16 +1286,11 @@ def make_payment_for_transaction(
note=None,
payment_breakdown=None,
):
- """Make payment for an existing Sales Invoice or Quotation.
-
- Args:
- doctype: "Sales Invoice" or "Quotation"
- docname: Name of the Sales Invoice or Quotation
- amount: Payment amount (optional, defaults to outstanding amount)
- payment_method: Mode of payment (optional, defaults to "Cash")
- note: Payment notes (optional)
- payment_breakdown: List of dicts with payment_method and amount (optional, for multiple payment methods)
+ """Background job to process payment for an existing Sales Invoice or Quotation.
+ This runs asynchronously in the queue.
+ IMPORTANT: This function must be callable from frappe.enqueue.
"""
+ frappe.set_user("Administrator") # Ensure proper permissions in background job
try:
# Get the document
doc = frappe.get_doc(doctype, docname)
@@ -1705,6 +1699,110 @@ def make_payment_for_transaction(
}
+@frappe.whitelist()
+def make_payment_for_transaction(
+ doctype,
+ docname,
+ amount=None,
+ payment_method=None,
+ note=None,
+ payment_breakdown=None,
+):
+ """Make payment for an existing Sales Invoice or Quotation.
+ Returns immediately with job ID for async processing.
+
+ Args:
+ doctype: "Sales Invoice" or "Quotation"
+ docname: Name of the Sales Invoice or Quotation
+ amount: Payment amount (optional, defaults to outstanding amount)
+ payment_method: Mode of payment (optional, defaults to "Cash")
+ note: Payment notes (optional)
+ payment_breakdown: List of dicts with payment_method and amount (optional, for multiple payment methods)
+ """
+ try:
+ # Basic validation before queuing
+ if not doctype or not docname:
+ return {
+ "success": False,
+ "message": "Missing required parameters",
+ "details": "doctype and docname are required.",
+ }
+
+ # Verify document exists
+ if not frappe.db.exists(doctype, docname):
+ return {
+ "success": False,
+ "message": "Document not found",
+ "details": f"{doctype} {docname} does not exist.",
+ }
+
+ # Enqueue payment processing in background
+ job_id = None
+ try:
+ job_kwargs = {
+ "method": "havano_restaurant_pos.havano_restaurant_pos.api.process_payment_for_transaction_background",
+ "queue": "default",
+ "timeout": 300,
+ "is_async": True,
+ "doctype": doctype,
+ "docname": docname,
+ "amount": amount,
+ "payment_method": payment_method,
+ "note": note,
+ "payment_breakdown": payment_breakdown
+ }
+
+ try:
+ job_kwargs["job_name"] = f"process_payment_for_transaction_{docname}_{frappe.utils.now_datetime().strftime('%Y%m%d%H%M%S')}"
+ except:
+ pass
+
+ job = frappe.enqueue(**job_kwargs)
+ job_id = job.id if hasattr(job, 'id') else (job if isinstance(job, str) else None)
+
+ frappe.logger().info(f"Payment for transaction queued, job_id: {job_id}, doctype: {doctype}, docname: {docname}")
+
+ except Exception as queue_error:
+ # If queue fails, log error but still return success (payment will be processed in background)
+ error_msg = f"Queue enqueue failed for payment transaction: {str(queue_error)}\n{frappe.get_traceback()}"
+ frappe.log_error(error_msg, "Make Payment For Transaction Queue Error")
+ # Still return success - the background job will handle it
+ job_id = None
+
+ # Return success immediately
+ return {
+ "success": True,
+ "message": "Payment queued successfully",
+ "details": "Payment is being processed in the background",
+ "job_id": job_id,
+ }
+
+ except Exception as e:
+ error_traceback = frappe.get_traceback()
+ error_type = type(e).__name__
+ error_msg = str(e)
+
+ try:
+ frappe.log_error(
+ f"Make Payment For Transaction Failed\n"
+ f"Error Type: {error_type}\n"
+ f"Error Message: {error_msg}\n"
+ f"Traceback: {error_traceback}",
+ "Make Payment For Transaction Failed"
+ )
+ except Exception as log_error:
+ try:
+ frappe.log_error(f"Make Payment For Transaction Failed: {error_type}: {error_msg}", "Make Payment For Transaction Failed")
+ except:
+ pass
+
+ return {
+ "success": False,
+ "message": "Failed to queue payment",
+ "details": f"{error_type}: {error_msg}",
+ }
+
+
@frappe.whitelist()
def get_invoice_json(invoice_name):
try:
@@ -2097,19 +2195,512 @@ def get_ha_pos_settings():
@frappe.whitelist()
-@frappe.whitelist()
-def make_multi_currency_payment(customer, payments):
- """Create payment entries for each mode of payment in multi-currency payment.
-
- payments format: {
- "mode_currency": {
- "mode": "Cash",
- "currency": "USD",
- "amount": 100.0
- }
- }
+def process_multi_currency_payment_background(customer, payments):
+ """Background job to process multi-currency payment entries.
+ This runs asynchronously in the queue.
+ IMPORTANT: This function must be callable from frappe.enqueue.
"""
+ frappe.set_user("Administrator") # Ensure proper permissions in background job
try:
+ # Parse JSON if payments is a string
+ if payments is None:
+ return {
+ "success": False,
+ "message": "No payments provided",
+ "details": "Payments parameter is None.",
+ }
+
+ if isinstance(payments, str):
+ try:
+ payments = frappe.parse_json(payments)
+ except Exception as parse_error:
+ return {
+ "success": False,
+ "message": "Invalid payments format",
+ "details": f"Could not parse payments JSON: {str(parse_error)}",
+ }
+
+ if isinstance(customer, str) and customer.startswith('"'):
+ try:
+ customer = frappe.parse_json(customer)
+ except Exception:
+ pass
+
+ # Get company from user defaults or Global Defaults
+ company = frappe.defaults.get_user_default("Company") or frappe.db.get_single_value("Global Defaults", "default_company")
+
+ if not company:
+ return {
+ "success": False,
+ "message": "Company not found",
+ "details": "Please set default company in user defaults or Global Defaults.",
+ }
+
+ if not customer:
+ customer = get_default_customer()
+
+ # Get company currency
+ company_currency = frappe.get_cached_value("Company", company, "default_currency")
+ if not company_currency:
+ company_currency = frappe.get_single_value("System Settings", "currency") or "USD"
+
+ # Get company accounts
+ company_data = frappe.get_cached_value(
+ "Company",
+ company,
+ ["default_receivable_account", "default_cash_account"],
+ as_dict=True
+ )
+
+ if not company_data:
+ return {
+ "success": False,
+ "message": "Company data not found",
+ "details": f"Could not retrieve company data for {company}.",
+ }
+
+ paid_from_account = company_data.get("default_receivable_account")
+ paid_to_account = company_data.get("default_cash_account") or paid_from_account
+
+ if not paid_from_account or not isinstance(paid_from_account, str):
+ return {
+ "success": False,
+ "message": "Missing company accounts",
+ "details": f"Company is missing default receivable account. Got type: {type(paid_from_account).__name__}",
+ }
+
+ if not paid_to_account or not isinstance(paid_to_account, str):
+ return {
+ "success": False,
+ "message": "Missing company accounts",
+ "details": f"Company is missing default cash account. Got type: {type(paid_to_account).__name__}",
+ }
+
+ # Get account currencies
+ account_list = []
+ if isinstance(paid_from_account, str):
+ account_list.append(paid_from_account)
+ if isinstance(paid_to_account, str) and paid_to_account != paid_from_account:
+ account_list.append(paid_to_account)
+
+ if not account_list:
+ return {
+ "success": False,
+ "message": "Invalid account format",
+ "details": "Accounts must be strings.",
+ }
+
+ try:
+ account_currencies = frappe.get_all(
+ "Account",
+ filters={"name": ["in", account_list]},
+ fields=["name", "account_currency"],
+ as_list=False
+ )
+ if not isinstance(account_currencies, list):
+ account_currencies = []
+ except Exception as e:
+ frappe.log_error(f"Error getting account currencies: {str(e)}", "Multi Currency Payment Account Error")
+ account_currencies = []
+
+ account_currency_map = {}
+ try:
+ if account_currencies and isinstance(account_currencies, list) and not isinstance(account_currencies, Exception):
+ for acc in account_currencies:
+ if acc and isinstance(acc, dict) and "name" in acc:
+ account_currency_map[acc["name"]] = acc.get("account_currency") or company_currency
+ except Exception as e:
+ frappe.log_error(f"Error building account currency map: {str(e)}", "Multi Currency Payment Currency Map Error")
+ account_currency_map = {}
+
+ paid_from_currency = account_currency_map.get(paid_from_account, company_currency)
+ paid_to_currency = account_currency_map.get(paid_to_account, company_currency)
+
+ created_payments = []
+ error_messages = []
+
+ # Validate payments parameter
+ if not payments:
+ return {
+ "success": False,
+ "message": "No payments provided",
+ "details": "Payments parameter is required.",
+ }
+
+ if isinstance(payments, str):
+ try:
+ payments = frappe.parse_json(payments)
+ except Exception as parse_error:
+ return {
+ "success": False,
+ "message": "Invalid payments format",
+ "details": f"Payments must be a valid JSON object. Error: {str(parse_error)}",
+ }
+
+ if not isinstance(payments, dict):
+ return {
+ "success": False,
+ "message": "Invalid payments format",
+ "details": f"Payments must be a dictionary, got {type(payments).__name__}.",
+ }
+
+ if len(payments) == 0:
+ return {
+ "success": False,
+ "message": "No payments provided",
+ "details": "Payments dictionary is empty. Please provide at least one payment method with amount > 0.",
+ }
+
+ try:
+ payments_items = payments.items()
+ except (AttributeError, TypeError) as e:
+ return {
+ "success": False,
+ "message": "Invalid payments format",
+ "details": f"Cannot iterate over payments: {str(e)}. Type: {type(payments).__name__}",
+ }
+
+ for key, payment_info in payments_items:
+ try:
+ if isinstance(payment_info, dict):
+ method = payment_info.get("mode", "Cash")
+ paid_amount = float(payment_info.get("amount", 0))
+ else:
+ method = "Cash"
+ try:
+ paid_amount = float(payment_info)
+ except (ValueError, TypeError):
+ error_messages.append(f"Invalid amount for payment {key}: {payment_info}")
+ continue
+ except Exception as parse_error:
+ error_messages.append(f"Error parsing payment {key}: {str(parse_error)}")
+ frappe.log_error(f"Error parsing payment {key}: {str(parse_error)}\nPayment info: {payment_info}", "Multi Currency Payment Parse Error")
+ continue
+
+ if paid_amount <= 0:
+ continue
+
+ original_method = method
+
+ mode_exists = frappe.db.exists("Mode of Payment", method) if method else False
+
+ if not mode_exists and method and method != "Cash":
+ try:
+ new_mode = frappe.new_doc("Mode of Payment")
+ new_mode.mode_of_payment = method
+ new_mode.type = "Cash"
+ new_mode.insert(ignore_permissions=True)
+ frappe.db.commit()
+ mode_exists = True
+ frappe.log_error(
+ f"Created new Mode of Payment '{method}' automatically",
+ "Mode of Payment Auto-Created"
+ )
+ except Exception as create_error:
+ frappe.log_error(
+ f"Mode of Payment '{method}' does not exist and could not be created: {str(create_error)}. Will use ignore_links to bypass validation.",
+ "Mode of Payment Creation Failed"
+ )
+
+ mode_account = None
+ if method and method != "Cash":
+ mode_accounts = frappe.get_all(
+ "Mode of Payment Account",
+ filters={"parent": method, "company": company},
+ fields=["default_account"],
+ limit=1
+ )
+ if mode_accounts and mode_accounts[0].default_account:
+ mode_account = mode_accounts[0].default_account
+
+ if not mode_account:
+ mode_account = paid_to_account
+
+ mode_account_currency = frappe.get_cached_value("Account", mode_account, "account_currency") or company_currency
+
+ mode_type = None
+ if original_method and mode_exists:
+ mode_type = frappe.get_cached_value("Mode of Payment", original_method, "type")
+
+ source_exchange_rate = 1.0
+ target_exchange_rate = 1.0
+
+ received_amount = paid_amount
+ paid_amount_in_company_currency = paid_amount
+
+ if paid_from_currency != mode_account_currency:
+ try:
+ from erpnext.setup.utils import get_exchange_rate
+ target_exchange_rate = get_exchange_rate(
+ mode_account_currency, paid_from_currency, frappe.utils.nowdate()
+ )
+ paid_amount_in_company_currency = paid_amount * target_exchange_rate
+ except Exception:
+ target_exchange_rate = 1.0
+ paid_amount_in_company_currency = paid_amount
+
+ try:
+ payment_entry = frappe.new_doc("Payment Entry")
+ payment_entry.payment_type = "Receive"
+ payment_entry.party_type = "Customer"
+ payment_entry.party = customer
+ payment_entry.company = company
+ payment_entry.posting_date = frappe.utils.nowdate()
+ payment_entry.paid_from = paid_from_account
+ payment_entry.paid_to = mode_account
+ payment_entry.paid_from_account_currency = paid_from_currency
+ payment_entry.paid_to_account_currency = mode_account_currency
+ payment_entry.paid_amount = paid_amount_in_company_currency
+ payment_entry.received_amount = received_amount
+ payment_entry.source_exchange_rate = source_exchange_rate
+ payment_entry.target_exchange_rate = target_exchange_rate
+
+ if mode_type == "Bank":
+ payment_entry.reference_no = f"REF-{frappe.utils.now_datetime().strftime('%Y%m%d%H%M%S')}"
+ payment_entry.reference_date = frappe.utils.nowdate()
+ else:
+ payment_entry.reference_no = None
+ payment_entry.reference_date = frappe.utils.nowdate()
+
+ payment_entry.remarks = f"Multi-currency payment: {original_method}"
+ payment_entry.mode_of_payment = original_method
+
+ try:
+ frappe.flags.ignore_validate = True
+ frappe.flags.ignore_links = True
+ payment_entry.insert(ignore_permissions=True)
+ except Exception as insert_error:
+ error_detail = f"Insert failed for {original_method}: {str(insert_error)}"
+ frappe.log_error(
+ f"{error_detail}\nPayment Entry Data: mode_of_payment={original_method}, paid_to={mode_account}, company={company}, mode_type={mode_type}",
+ "Payment Entry Insert Error"
+ )
+ raise Exception(error_detail)
+ finally:
+ frappe.flags.ignore_validate = False
+ frappe.flags.ignore_links = False
+
+ try:
+ payment_entry.submit(ignore_permissions=True)
+ except Exception as submit_error:
+ try:
+ if payment_entry.name:
+ frappe.delete_doc("Payment Entry", payment_entry.name, ignore_permissions=True, force=True)
+ except:
+ pass
+
+ payment_entry = frappe.new_doc("Payment Entry")
+ payment_entry.payment_type = "Receive"
+ payment_entry.party_type = "Customer"
+ payment_entry.party = customer
+ payment_entry.company = company
+ payment_entry.posting_date = frappe.utils.nowdate()
+ payment_entry.paid_from = paid_from_account
+ payment_entry.paid_to = mode_account
+ payment_entry.paid_from_account_currency = paid_from_currency
+ payment_entry.paid_to_account_currency = mode_account_currency
+ payment_entry.paid_amount = paid_amount_in_company_currency
+ payment_entry.received_amount = received_amount
+ payment_entry.source_exchange_rate = source_exchange_rate
+ payment_entry.target_exchange_rate = target_exchange_rate
+
+ if mode_type == "Bank":
+ payment_entry.reference_no = f"REF-{frappe.utils.now_datetime().strftime('%Y%m%d%H%M%S')}"
+ payment_entry.reference_date = frappe.utils.nowdate()
+ else:
+ payment_entry.reference_no = None
+ payment_entry.reference_date = frappe.utils.nowdate()
+
+ payment_entry.remarks = f"Multi-currency payment: {original_method}"
+ payment_entry.mode_of_payment = original_method
+ frappe.flags.ignore_validate = True
+ frappe.flags.ignore_links = True
+ try:
+ payment_entry.insert()
+ payment_entry.submit()
+ finally:
+ frappe.flags.ignore_validate = False
+ frappe.flags.ignore_links = False
+
+ created_payments.append(payment_entry.name)
+
+ except Exception as e:
+ error_msg = f"Failed to create payment entry for {original_method} (amount: {paid_amount}): {str(e)}"
+ error_messages.append(error_msg)
+ error_traceback = frappe.get_traceback()
+ frappe.log_error(
+ f"{error_msg}\nOriginal Method: {original_method}\nMode Account: {mode_account}\nTraceback: {error_traceback}",
+ "Payment Entry Error"
+ )
+ continue
+
+ if created_payments:
+ frappe.db.commit()
+ else:
+ frappe.db.rollback()
+
+ if not created_payments:
+ return {
+ "success": False,
+ "message": "Failed to create payment entries",
+ "details": "No payment entries were created. " + ("; ".join(error_messages[:3]) if error_messages else "Please check payment methods and accounts."),
+ "errors": error_messages[:5] if error_messages else None,
+ }
+
+ return {
+ "success": True,
+ "message": "Multi-currency payment made successfully",
+ "details": f"Created {len(created_payments)} payment entry/entries",
+ "payment_entries": created_payments,
+ }
+
+ except Exception as e:
+ frappe.db.rollback()
+ error_traceback = frappe.get_traceback()
+ error_type = type(e).__name__
+ error_msg = str(e)
+
+ try:
+ frappe.log_error(
+ f"Process Multi Currency Payment Background Failed\n"
+ f"Error Type: {error_type}\n"
+ f"Error Message: {error_msg}\n"
+ f"Traceback: {error_traceback}",
+ "Process Multi Currency Payment Background Failed"
+ )
+ except Exception as log_error:
+ try:
+ frappe.log_error(f"Process Multi Currency Payment Background Failed: {error_type}: {error_msg}", "Process Multi Currency Payment Background Failed")
+ except:
+ pass
+
+ return {
+ "success": False,
+ "message": "Failed to make multi-currency payment",
+ "details": f"{error_type}: {error_msg}",
+ }
+
+
+@frappe.whitelist()
+def make_multi_currency_payment(customer, payments):
+ """Create payment entries for each mode of payment in multi-currency payment.
+ Returns immediately with job ID for async processing.
+
+ payments format: {
+ "mode_currency": {
+ "mode": "Cash",
+ "currency": "USD",
+ "amount": 100.0
+ }
+ }
+ """
+ try:
+ # Basic validation before queuing
+ if payments is None:
+ return {
+ "success": False,
+ "message": "No payments provided",
+ "details": "Payments parameter is None.",
+ }
+
+ # Parse JSON if payments is a string
+ if isinstance(payments, str):
+ try:
+ payments = frappe.parse_json(payments)
+ except Exception as parse_error:
+ return {
+ "success": False,
+ "message": "Invalid payments format",
+ "details": f"Could not parse payments JSON: {str(parse_error)}",
+ }
+
+ if isinstance(customer, str) and customer.startswith('"'):
+ try:
+ customer = frappe.parse_json(customer)
+ except Exception:
+ pass
+
+ # Validate payments is a dict and not empty
+ if not isinstance(payments, dict) or len(payments) == 0:
+ return {
+ "success": False,
+ "message": "No payments provided",
+ "details": "Payments dictionary is empty. Please provide at least one payment method with amount > 0.",
+ }
+
+ # Get company for validation
+ company = frappe.defaults.get_user_default("Company") or frappe.db.get_single_value("Global Defaults", "default_company")
+ if not company:
+ return {
+ "success": False,
+ "message": "Company not found",
+ "details": "Please set default company in user defaults or Global Defaults.",
+ }
+
+ if not customer:
+ customer = get_default_customer()
+
+ # Enqueue payment processing in background
+ job_id = None
+ try:
+ job_kwargs = {
+ "method": "havano_restaurant_pos.havano_restaurant_pos.api.process_multi_currency_payment_background",
+ "queue": "default",
+ "timeout": 300,
+ "is_async": True,
+ "customer": customer,
+ "payments": payments
+ }
+
+ try:
+ job_kwargs["job_name"] = f"process_multi_currency_payment_{frappe.utils.now_datetime().strftime('%Y%m%d%H%M%S')}"
+ except:
+ pass
+
+ job = frappe.enqueue(**job_kwargs)
+ job_id = job.id if hasattr(job, 'id') else (job if isinstance(job, str) else None)
+
+ frappe.logger().info(f"Multi-currency payment queued, job_id: {job_id}, customer: {customer}")
+
+ except Exception as queue_error:
+ # If queue fails, log error but still return success (payment will be processed in background)
+ error_msg = f"Queue enqueue failed for multi-currency payment: {str(queue_error)}\n{frappe.get_traceback()}"
+ frappe.log_error(error_msg, "Make Multi Currency Payment Queue Error")
+ # Still return success - the background job will handle it
+ job_id = None
+
+ # Return success immediately
+ return {
+ "success": True,
+ "message": "Multi-currency payment queued successfully",
+ "details": "Payment is being processed in the background",
+ "job_id": job_id,
+ }
+
+ except Exception as e:
+ error_traceback = frappe.get_traceback()
+ error_type = type(e).__name__
+ error_msg = str(e)
+
+ try:
+ frappe.log_error(
+ f"Make Multi Currency Payment Failed\n"
+ f"Error Type: {error_type}\n"
+ f"Error Message: {error_msg}\n"
+ f"Traceback: {error_traceback}",
+ "Make Multi Currency Payment Failed"
+ )
+ except Exception as log_error:
+ try:
+ frappe.log_error(f"Make Multi Currency Payment Failed: {error_type}: {error_msg}", "Make Multi Currency Payment Failed")
+ except:
+ pass
+
+ return {
+ "success": False,
+ "message": "Failed to queue multi-currency payment",
+ "details": f"{error_type}: {error_msg}",
+ }
# Parse JSON if payments is a string - with better error handling
if payments is None:
return {
@@ -2756,7 +3347,7 @@ def process_payment_entries(
})
if payment_breakdown_list:
- result = make_payment_for_transaction(
+ result = process_payment_for_transaction_background(
"Sales Invoice",
invoice_name,
amount=None, # Let it calculate from breakdown
@@ -2771,7 +3362,7 @@ def process_payment_entries(
}
elif payment_breakdown and isinstance(payment_breakdown, list) and len(payment_breakdown) > 0:
# Multi-payment method (regular payment with breakdown)
- result = make_payment_for_transaction(
+ result = process_payment_for_transaction_background(
"Sales Invoice",
invoice_name,
amount=amount,
@@ -2781,7 +3372,7 @@ def process_payment_entries(
)
else:
# Single payment method
- result = make_payment_for_transaction(
+ result = process_payment_for_transaction_background(
"Sales Invoice",
invoice_name,
amount=amount,
diff --git a/havano_restaurant_pos/public/dashboard/assets/index-DeAyOdTy.js b/havano_restaurant_pos/public/dashboard/assets/index-DeAyOdTy.js
deleted file mode 100644
index 4053680..0000000
--- a/havano_restaurant_pos/public/dashboard/assets/index-DeAyOdTy.js
+++ /dev/null
@@ -1,213 +0,0 @@
-var Q_=Object.defineProperty,K_=Object.defineProperties;var Z_=Object.getOwnPropertyDescriptors;var md=Object.getOwnPropertySymbols;var Ob=Object.prototype.hasOwnProperty,Db=Object.prototype.propertyIsEnumerable;var Yi=(e,n)=>(n=Symbol[e])?n:Symbol.for("Symbol."+e),J_=e=>{throw TypeError(e)};var Nb=(e,n,a)=>n in e?Q_(e,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[n]=a,_=(e,n)=>{for(var a in n||(n={}))Ob.call(n,a)&&Nb(e,a,n[a]);if(md)for(var a of md(n))Db.call(n,a)&&Nb(e,a,n[a]);return e},J=(e,n)=>K_(e,Z_(n));var _e=(e,n)=>{var a={};for(var o in e)Ob.call(e,o)&&n.indexOf(o)<0&&(a[o]=e[o]);if(e!=null&&md)for(var o of md(e))n.indexOf(o)<0&&Db.call(e,o)&&(a[o]=e[o]);return a};var eC=(e,n)=>()=>(n||e((n={exports:{}}).exports,n),n.exports);var we=(e,n,a)=>new Promise((o,i)=>{var l=h=>{try{d(a.next(h))}catch(f){i(f)}},u=h=>{try{d(a.throw(h))}catch(f){i(f)}},d=h=>h.done?o(h.value):Promise.resolve(h.value).then(l,u);d((a=a.apply(e,n)).next())}),Hs=function(e,n){this[0]=e,this[1]=n},vm=(e,n,a)=>{var o=(u,d,h,f)=>{try{var p=a[u](d),g=(d=p.value)instanceof Hs,x=p.done;Promise.resolve(g?d[0]:d).then(w=>g?o(u==="return"?u:"next",d[1]?{done:w.done,value:w.value}:w,h,f):h({value:w,done:x})).catch(w=>o("throw",w,h,f))}catch(w){f(w)}},i=u=>l[u]=d=>new Promise((h,f)=>o(u,d,h,f)),l={};return a=a.apply(e,n),l[Yi("asyncIterator")]=()=>l,i("next"),i("throw"),i("return"),l},bm=e=>{var n=e[Yi("asyncIterator")],a=!1,o,i={};return n==null?(n=e[Yi("iterator")](),o=l=>i[l]=u=>n[l](u)):(n=n.call(e),o=l=>i[l]=u=>{if(a){if(a=!1,l==="throw")throw u;return u}return a=!0,{done:!1,value:new Hs(new Promise(d=>{var h=n[l](u);h instanceof Object||J_("Object expected"),d(h)}),1)}}),i[Yi("iterator")]=()=>i,o("next"),"throw"in n?o("throw"):i.throw=l=>{throw l},"return"in n&&o("return"),i},Mb=(e,n,a)=>(n=e[Yi("asyncIterator")])?n.call(e):(e=e[Yi("iterator")](),n={},a=(o,i)=>(i=e[o])&&(n[o]=l=>new Promise((u,d,h)=>(l=i.call(e,l),h=l.done,Promise.resolve(l.value).then(f=>u({value:f,done:h}),d)))),a("next"),a("return"),n);var lL=eC(Ot=>{function tC(e,n){for(var a=0;ao[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))o(i);new MutationObserver(i=>{for(const l of i)if(l.type==="childList")for(const u of l.addedNodes)u.tagName==="LINK"&&u.rel==="modulepreload"&&o(u)}).observe(document,{childList:!0,subtree:!0});function a(i){const l={};return i.integrity&&(l.integrity=i.integrity),i.referrerPolicy&&(l.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?l.credentials="include":i.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function o(i){if(i.ep)return;i.ep=!0;const l=a(i);fetch(i.href,l)}})();var nC=typeof globalThis!="undefined"?globalThis:typeof window!="undefined"?window:typeof global!="undefined"?global:typeof self!="undefined"?self:{};function Rx(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var xm={exports:{}},_c={};var Rb;function rC(){if(Rb)return _c;Rb=1;var e=Symbol.for("react.transitional.element"),n=Symbol.for("react.fragment");function a(o,i,l){var u=null;if(l!==void 0&&(u=""+l),i.key!==void 0&&(u=""+i.key),"key"in i){l={};for(var d in i)d!=="key"&&(l[d]=i[d])}else l=i;return i=l.ref,{$$typeof:e,type:o,key:u,ref:i!==void 0?i:null,props:l}}return _c.Fragment=n,_c.jsx=a,_c.jsxs=a,_c}var Ab;function aC(){return Ab||(Ab=1,xm.exports=rC()),xm.exports}var y=aC(),wm={exports:{}},Et={};var jb;function oC(){if(jb)return Et;jb=1;var e=Symbol.for("react.transitional.element"),n=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),l=Symbol.for("react.consumer"),u=Symbol.for("react.context"),d=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),f=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),g=Symbol.iterator;function x(U){return U===null||typeof U!="object"?null:(U=g&&U[g]||U["@@iterator"],typeof U=="function"?U:null)}var w={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,N={};function T(U,Q,he){this.props=U,this.context=Q,this.refs=N,this.updater=he||w}T.prototype.isReactComponent={},T.prototype.setState=function(U,Q){if(typeof U!="object"&&typeof U!="function"&&U!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,U,Q,"setState")},T.prototype.forceUpdate=function(U){this.updater.enqueueForceUpdate(this,U,"forceUpdate")};function A(){}A.prototype=T.prototype;function j(U,Q,he){this.props=U,this.context=Q,this.refs=N,this.updater=he||w}var L=j.prototype=new A;L.constructor=j,S(L,T.prototype),L.isPureReactComponent=!0;var q=Array.isArray,D={H:null,A:null,T:null,S:null,V:null},O=Object.prototype.hasOwnProperty;function k(U,Q,he,P,ie,Se){return he=Se.ref,{$$typeof:e,type:U,key:Q,ref:he!==void 0?he:null,props:Se}}function V(U,Q){return k(U.type,Q,void 0,void 0,void 0,U.props)}function B(U){return typeof U=="object"&&U!==null&&U.$$typeof===e}function ee(U){var Q={"=":"=0",":":"=2"};return"$"+U.replace(/[=:]/g,function(he){return Q[he]})}var re=/\/+/g;function te(U,Q){return typeof U=="object"&&U!==null&&U.key!=null?ee(""+U.key):Q.toString(36)}function xe(){}function ge(U){switch(U.status){case"fulfilled":return U.value;case"rejected":throw U.reason;default:switch(typeof U.status=="string"?U.then(xe,xe):(U.status="pending",U.then(function(Q){U.status==="pending"&&(U.status="fulfilled",U.value=Q)},function(Q){U.status==="pending"&&(U.status="rejected",U.reason=Q)})),U.status){case"fulfilled":return U.value;case"rejected":throw U.reason}}throw U}function fe(U,Q,he,P,ie){var Se=typeof U;(Se==="undefined"||Se==="boolean")&&(U=null);var pe=!1;if(U===null)pe=!0;else switch(Se){case"bigint":case"string":case"number":pe=!0;break;case"object":switch(U.$$typeof){case e:case n:pe=!0;break;case p:return pe=U._init,fe(pe(U._payload),Q,he,P,ie)}}if(pe)return ie=ie(U),pe=P===""?"."+te(U,0):P,q(ie)?(he="",pe!=null&&(he=pe.replace(re,"$&/")+"/"),fe(ie,Q,he,"",function(Fe){return Fe})):ie!=null&&(B(ie)&&(ie=V(ie,he+(ie.key==null||U&&U.key===ie.key?"":(""+ie.key).replace(re,"$&/")+"/")+pe)),Q.push(ie)),1;pe=0;var je=P===""?".":P+":";if(q(U))for(var Ee=0;Ee>>1,U=H[Ce];if(0>>1;Cei(P,W))iei(Se,P)?(H[Ce]=Se,H[ie]=W,Ce=ie):(H[Ce]=P,H[he]=W,Ce=he);else if(iei(Se,W))H[Ce]=Se,H[ie]=W,Ce=ie;else break e}}return ne}function i(H,ne){var W=H.sortIndex-ne.sortIndex;return W!==0?W:H.id-ne.id}if(e.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var l=performance;e.unstable_now=function(){return l.now()}}else{var u=Date,d=u.now();e.unstable_now=function(){return u.now()-d}}var h=[],f=[],p=1,g=null,x=3,w=!1,S=!1,N=!1,T=!1,A=typeof setTimeout=="function"?setTimeout:null,j=typeof clearTimeout=="function"?clearTimeout:null,L=typeof setImmediate!="undefined"?setImmediate:null;function q(H){for(var ne=a(f);ne!==null;){if(ne.callback===null)o(f);else if(ne.startTime<=H)o(f),ne.sortIndex=ne.expirationTime,n(h,ne);else break;ne=a(f)}}function D(H){if(N=!1,q(H),!S)if(a(h)!==null)S=!0,O||(O=!0,te());else{var ne=a(f);ne!==null&&fe(D,ne.startTime-H)}}var O=!1,k=-1,V=5,B=-1;function ee(){return T?!0:!(e.unstable_now()-BH&&ee());){var Ce=g.callback;if(typeof Ce=="function"){g.callback=null,x=g.priorityLevel;var U=Ce(g.expirationTime<=H);if(H=e.unstable_now(),typeof U=="function"){g.callback=U,q(H),ne=!0;break t}g===a(h)&&o(h),q(H)}else o(h);g=a(h)}if(g!==null)ne=!0;else{var Q=a(f);Q!==null&&fe(D,Q.startTime-H),ne=!1}}break e}finally{g=null,x=W,w=!1}ne=void 0}}finally{ne?te():O=!1}}}var te;if(typeof L=="function")te=function(){L(re)};else if(typeof MessageChannel!="undefined"){var xe=new MessageChannel,ge=xe.port2;xe.port1.onmessage=re,te=function(){ge.postMessage(null)}}else te=function(){A(re,0)};function fe(H,ne){k=A(function(){H(e.unstable_now())},ne)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(H){H.callback=null},e.unstable_forceFrameRate=function(H){0>H||125Ce?(H.sortIndex=W,n(f,H),a(h)===null&&H===a(f)&&(N?(j(k),k=-1):N=!0,fe(D,W-Ce))):(H.sortIndex=U,n(h,H),S||w||(S=!0,O||(O=!0,te()))),H},e.unstable_shouldYield=ee,e.unstable_wrapCallback=function(H){var ne=x;return function(){var W=x;x=ne;try{return H.apply(this,arguments)}finally{x=W}}}})(_m)),_m}var zb;function iC(){return zb||(zb=1,Em.exports=sC()),Em.exports}var Cm={exports:{}},fr={};var Ub;function lC(){if(Ub)return fr;Ub=1;var e=Ep();function n(h){var f="https://react.dev/errors/"+h;if(1U||(t.current=Ce[U],Ce[U]=null,U--)}function P(t,r){U++,Ce[U]=t.current,t.current=r}var ie=Q(null),Se=Q(null),pe=Q(null),je=Q(null);function Ee(t,r){switch(P(pe,r),P(Se,t),P(ie,null),r.nodeType){case 9:case 11:t=(t=r.documentElement)&&(t=t.namespaceURI)?tb(t):0;break;default:if(t=r.tagName,r=r.namespaceURI)r=tb(r),t=nb(r,t);else switch(t){case"svg":t=1;break;case"math":t=2;break;default:t=0}}he(ie),P(ie,t)}function Fe(){he(ie),he(Se),he(pe)}function Ve(t){t.memoizedState!==null&&P(je,t);var r=ie.current,s=nb(r,t.type);r!==s&&(P(Se,t),P(ie,s))}function Xe(t){Se.current===t&&(he(ie),he(Se)),je.current===t&&(he(je),bc._currentValue=W)}var et=Object.prototype.hasOwnProperty,Qe=e.unstable_scheduleCallback,mt=e.unstable_cancelCallback,Vt=e.unstable_shouldYield,tn=e.unstable_requestPaint,Bt=e.unstable_now,Kn=e.unstable_getCurrentPriorityLevel,hn=e.unstable_ImmediatePriority,G=e.unstable_UserBlockingPriority,ce=e.unstable_NormalPriority,ve=e.unstable_LowPriority,Pe=e.unstable_IdlePriority,Ue=e.log,Le=e.unstable_setDisableYieldValue,X=null,Re=null;function rt(t){if(typeof Ue=="function"&&Le(t),Re&&typeof Re.setStrictMode=="function")try{Re.setStrictMode(X,t)}catch(r){}}var vt=Math.clz32?Math.clz32:Gt,cn=Math.log,un=Math.LN2;function Gt(t){return t>>>=0,t===0?32:31-(cn(t)/un|0)|0}var mn=256,Zn=4194304;function Pn(t){var r=t&42;if(r!==0)return r;switch(t&-t){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t&4194048;case 4194304:case 8388608:case 16777216:case 33554432:return t&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return t}}function Dn(t,r,s){var c=t.pendingLanes;if(c===0)return 0;var m=0,v=t.suspendedLanes,E=t.pingedLanes;t=t.warmLanes;var R=c&134217727;return R!==0?(c=R&~v,c!==0?m=Pn(c):(E&=R,E!==0?m=Pn(E):s||(s=R&~t,s!==0&&(m=Pn(s))))):(R=c&~v,R!==0?m=Pn(R):E!==0?m=Pn(E):s||(s=c&~t,s!==0&&(m=Pn(s)))),m===0?0:r!==0&&r!==m&&(r&v)===0&&(v=m&-m,s=r&-r,v>=s||v===32&&(s&4194048)!==0)?r:m}function Jn(t,r){return(t.pendingLanes&~(t.suspendedLanes&~t.pingedLanes)&r)===0}function Mn(t,r){switch(t){case 1:case 2:case 4:case 8:case 64:return r+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return r+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Rn(){var t=mn;return mn<<=1,(mn&4194048)===0&&(mn=256),t}function gt(){var t=Zn;return Zn<<=1,(Zn&62914560)===0&&(Zn=4194304),t}function zt(t){for(var r=[],s=0;31>s;s++)r.push(t);return r}function at(t,r){t.pendingLanes|=r,r!==268435456&&(t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0)}function Lt(t,r,s,c,m,v){var E=t.pendingLanes;t.pendingLanes=s,t.suspendedLanes=0,t.pingedLanes=0,t.warmLanes=0,t.expiredLanes&=s,t.entangledLanes&=s,t.errorRecoveryDisabledLanes&=s,t.shellSuspendCounter=0;var R=t.entanglements,$=t.expirationTimes,me=t.hiddenUpdates;for(s=E&~s;0)":-1m||$[c]!==me[m]){var Ne=`
-`+$[c].replace(" at new "," at ");return t.displayName&&Ne.includes("")&&(Ne=Ne.replace("",t.displayName)),Ne}while(1<=c&&0<=m);break}}}finally{kr=!1,Error.prepareStackTrace=s}return(s=t?t.displayName||t.name:"")?cr(s):""}function Co(t){switch(t.tag){case 26:case 27:case 5:return cr(t.type);case 16:return cr("Lazy");case 13:return cr("Suspense");case 19:return cr("SuspenseList");case 0:case 15:return sn(t.type,!1);case 11:return sn(t.type.render,!1);case 1:return sn(t.type,!0);case 31:return cr("Activity");default:return""}}function Ra(t){try{var r="";do r+=Co(t),t=t.return;while(t);return r}catch(s){return`
-Error generating stack: `+s.message+`
-`+s.stack}}function tr(t){switch(typeof t){case"bigint":case"boolean":case"number":case"string":case"undefined":return t;case"object":return t;default:return""}}function Tl(t){var r=t.type;return(t=t.nodeName)&&t.toLowerCase()==="input"&&(r==="checkbox"||r==="radio")}function Ef(t){var r=Tl(t)?"checked":"value",s=Object.getOwnPropertyDescriptor(t.constructor.prototype,r),c=""+t[r];if(!t.hasOwnProperty(r)&&typeof s!="undefined"&&typeof s.get=="function"&&typeof s.set=="function"){var m=s.get,v=s.set;return Object.defineProperty(t,r,{configurable:!0,get:function(){return m.call(this)},set:function(E){c=""+E,v.call(this,E)}}),Object.defineProperty(t,r,{enumerable:s.enumerable}),{getValue:function(){return c},setValue:function(E){c=""+E},stopTracking:function(){t._valueTracker=null,delete t[r]}}}}function si(t){t._valueTracker||(t._valueTracker=Ef(t))}function au(t){if(!t)return!1;var r=t._valueTracker;if(!r)return!0;var s=r.getValue(),c="";return t&&(c=Tl(t)?t.checked?"true":"false":t.value),t=c,t!==s?(r.setValue(t),!0):!1}function ii(t){if(t=t||(typeof document!="undefined"?document:void 0),typeof t=="undefined")return null;try{return t.activeElement||t.body}catch(r){return t.body}}var ou=/[\n"\\]/g;function yr(t){return t.replace(ou,function(r){return"\\"+r.charCodeAt(0).toString(16)+" "})}function ua(t,r,s,c,m,v,E,R){t.name="",E!=null&&typeof E!="function"&&typeof E!="symbol"&&typeof E!="boolean"?t.type=E:t.removeAttribute("type"),r!=null?E==="number"?(r===0&&t.value===""||t.value!=r)&&(t.value=""+tr(r)):t.value!==""+tr(r)&&(t.value=""+tr(r)):E!=="submit"&&E!=="reset"||t.removeAttribute("value"),r!=null?su(t,E,tr(r)):s!=null?su(t,E,tr(s)):c!=null&&t.removeAttribute("value"),m==null&&v!=null&&(t.defaultChecked=!!v),m!=null&&(t.checked=m&&typeof m!="function"&&typeof m!="symbol"),R!=null&&typeof R!="function"&&typeof R!="symbol"&&typeof R!="boolean"?t.name=""+tr(R):t.removeAttribute("name")}function Nl(t,r,s,c,m,v,E,R){if(v!=null&&typeof v!="function"&&typeof v!="symbol"&&typeof v!="boolean"&&(t.type=v),r!=null||s!=null){if(!(v!=="submit"&&v!=="reset"||r!=null))return;s=s!=null?""+tr(s):"",r=r!=null?""+tr(r):s,R||r===t.value||(t.value=r),t.defaultValue=r}c=c!=null?c:m,c=typeof c!="function"&&typeof c!="symbol"&&!!c,t.checked=R?t.checked:!!c,t.defaultChecked=!!c,E!=null&&typeof E!="function"&&typeof E!="symbol"&&typeof E!="boolean"&&(t.name=E)}function su(t,r,s){r==="number"&&ii(t.ownerDocument)===t||t.defaultValue===""+s||(t.defaultValue=""+s)}function To(t,r,s,c){if(t=t.options,r){r={};for(var m=0;m=zr),jl=" ",ha=!1;function kl(t,r){switch(t){case"keyup":return mi.indexOf(r.keyCode)!==-1;case"keydown":return r.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function hu(t){return t=t.detail,typeof t=="object"&&"data"in t?t.data:null}var br=!1;function jo(t,r){switch(t){case"compositionend":return hu(r);case"keypress":return r.which!==32?null:(ha=!0,jl);case"textInput":return t=r.data,t===jl&&ha?null:t;default:return null}}function Ll(t,r){if(br)return t==="compositionend"||!Za&&kl(t,r)?(t=cu(),ws=Ro=da=null,br=!1,t):null;switch(t){case"paste":return null;case"keypress":if(!(r.ctrlKey||r.altKey||r.metaKey)||r.ctrlKey&&r.altKey){if(r.char&&1=r)return{node:s,offset:r-t};t=c}e:{for(;s;){if(s.nextSibling){s=s.nextSibling;break e}s=s.parentNode}s=void 0}s=Sg(s)}}function _g(t,r){return t&&r?t===r?!0:t&&t.nodeType===3?!1:r&&r.nodeType===3?_g(t,r.parentNode):"contains"in t?t.contains(r):t.compareDocumentPosition?!!(t.compareDocumentPosition(r)&16):!1:!1}function Cg(t){t=t!=null&&t.ownerDocument!=null&&t.ownerDocument.defaultView!=null?t.ownerDocument.defaultView:window;for(var r=ii(t.document);r instanceof t.HTMLIFrameElement;){try{var s=typeof r.contentWindow.location.href=="string"}catch(c){s=!1}if(s)t=r.contentWindow;else break;r=ii(t.document)}return r}function Mf(t){var r=t&&t.nodeName&&t.nodeName.toLowerCase();return r&&(r==="input"&&(t.type==="text"||t.type==="search"||t.type==="tel"||t.type==="url"||t.type==="password")||r==="textarea"||t.contentEditable==="true")}var RE=Zr&&"documentMode"in document&&11>=document.documentMode,gi=null,Rf=null,Hl=null,Af=!1;function Tg(t,r,s){var c=s.window===s?s.document:s.nodeType===9?s:s.ownerDocument;Af||gi==null||gi!==ii(c)||(c=gi,"selectionStart"in c&&Mf(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}),Hl&&Pl(Hl,c)||(Hl=c,c=Ju(Rf,"onSelect"),0>=E,m-=E,eo=1<<32-vt(r)+m|s<v?v:8;var E=H.T,R={};H.T=R,yh(t,!1,r,s);try{var $=m(),me=H.S;if(me!==null&&me(R,$),$!==null&&typeof $=="object"&&typeof $.then=="function"){var Ne=HE($,c);tc(t,r,Ne,qr(t))}else tc(t,r,c,qr(t))}catch(De){tc(t,r,{then:function(){},status:"rejected",reason:De},qr())}finally{ne.p=v,H.T=E}}function WE(){}function ph(t,r,s,c){if(t.tag!==5)throw Error(o(476));var m=Ny(t).queue;Ty(t,m,r,W,s===null?WE:function(){return Oy(t),s(c)})}function Ny(t){var r=t.memoizedState;if(r!==null)return r;r={memoizedState:W,baseState:W,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ao,lastRenderedState:W},next:null};var s={};return r.next={memoizedState:s,baseState:s,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ao,lastRenderedState:s},next:null},t.memoizedState=r,t=t.alternate,t!==null&&(t.memoizedState=r),r}function Oy(t){var r=Ny(t).next.queue;tc(t,r,{},qr())}function gh(){return dr(bc)}function Dy(){return kn().memoizedState}function My(){return kn().memoizedState}function IE(t){for(var r=t.return;r!==null;){switch(r.tag){case 24:case 3:var s=qr();t=zo(s);var c=Uo(r,t,s);c!==null&&(Yr(c,r,s),Xl(c,r,s)),r={cache:If()},t.payload=r;return}r=r.return}}function $E(t,r,s){var c=qr();s={lane:c,revertLane:0,action:s,hasEagerState:!1,eagerState:null,next:null},ju(t)?Ay(r,s):(s=zf(t,r,s,c),s!==null&&(Yr(s,t,c),jy(s,r,c)))}function Ry(t,r,s){var c=qr();tc(t,r,s,c)}function tc(t,r,s,c){var m={lane:c,revertLane:0,action:s,hasEagerState:!1,eagerState:null,next:null};if(ju(t))Ay(r,m);else{var v=t.alternate;if(t.lanes===0&&(v===null||v.lanes===0)&&(v=r.lastRenderedReducer,v!==null))try{var E=r.lastRenderedState,R=v(E,s);if(m.hasEagerState=!0,m.eagerState=R,Br(R,E))return gu(t,r,m,0),on===null&&pu(),!1}catch($){}if(s=zf(t,r,m,c),s!==null)return Yr(s,t,c),jy(s,r,c),!0}return!1}function yh(t,r,s,c){if(c={lane:2,revertLane:Xh(),action:c,hasEagerState:!1,eagerState:null,next:null},ju(t)){if(r)throw Error(o(479))}else r=zf(t,s,c,2),r!==null&&Yr(r,t,2)}function ju(t){var r=t.alternate;return t===Tt||r!==null&&r===Tt}function Ay(t,r){Ti=Nu=!0;var s=t.pending;s===null?r.next=r:(r.next=s.next,s.next=r),t.pending=r}function jy(t,r,s){if((s&4194048)!==0){var c=r.lanes;c&=t.pendingLanes,s|=c,r.lanes=s,Je(t,s)}}var ku={readContext:dr,use:Du,useCallback:Tn,useContext:Tn,useEffect:Tn,useImperativeHandle:Tn,useLayoutEffect:Tn,useInsertionEffect:Tn,useMemo:Tn,useReducer:Tn,useRef:Tn,useState:Tn,useDebugValue:Tn,useDeferredValue:Tn,useTransition:Tn,useSyncExternalStore:Tn,useId:Tn,useHostTransitionStatus:Tn,useFormState:Tn,useActionState:Tn,useOptimistic:Tn,useMemoCache:Tn,useCacheRefresh:Tn},ky={readContext:dr,use:Du,useCallback:function(t,r){return Tr().memoizedState=[t,r===void 0?null:r],t},useContext:dr,useEffect:yy,useImperativeHandle:function(t,r,s){s=s!=null?s.concat([t]):null,Au(4194308,4,wy.bind(null,r,t),s)},useLayoutEffect:function(t,r){return Au(4194308,4,t,r)},useInsertionEffect:function(t,r){Au(4,2,t,r)},useMemo:function(t,r){var s=Tr();r=r===void 0?null:r;var c=t();if(Ls){rt(!0);try{t()}finally{rt(!1)}}return s.memoizedState=[c,r],c},useReducer:function(t,r,s){var c=Tr();if(s!==void 0){var m=s(r);if(Ls){rt(!0);try{s(r)}finally{rt(!1)}}}else m=r;return c.memoizedState=c.baseState=m,t={pending:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:m},c.queue=t,t=t.dispatch=$E.bind(null,Tt,t),[c.memoizedState,t]},useRef:function(t){var r=Tr();return t={current:t},r.memoizedState=t},useState:function(t){t=dh(t);var r=t.queue,s=Ry.bind(null,Tt,r);return r.dispatch=s,[t.memoizedState,s]},useDebugValue:hh,useDeferredValue:function(t,r){var s=Tr();return mh(s,t,r)},useTransition:function(){var t=dh(!1);return t=Ty.bind(null,Tt,t.queue,!0,!1),Tr().memoizedState=t,[!1,t]},useSyncExternalStore:function(t,r,s){var c=Tt,m=Tr();if(Ht){if(s===void 0)throw Error(o(407));s=s()}else{if(s=r(),on===null)throw Error(o(349));(Ut&124)!==0||ty(c,r,s)}m.memoizedState=s;var v={value:s,getSnapshot:r};return m.queue=v,yy(ry.bind(null,c,v,t),[t]),c.flags|=2048,Oi(9,Ru(),ny.bind(null,c,v,s,r),null),s},useId:function(){var t=Tr(),r=on.identifierPrefix;if(Ht){var s=to,c=eo;s=(c&~(1<<32-vt(c)-1)).toString(32)+s,r="«"+r+"R"+s,s=Ou++,0ht?(Xn=nt,nt=null):Xn=nt.sibling;var Pt=ye(se,nt,ue[ht],Oe);if(Pt===null){nt===null&&(nt=Xn);break}t&&nt&&Pt.alternate===null&&r(se,nt),Z=v(Pt,Z,ht),Dt===null?Ie=Pt:Dt.sibling=Pt,Dt=Pt,nt=Xn}if(ht===ue.length)return s(se,nt),Ht&&Ds(se,ht),Ie;if(nt===null){for(;htht?(Xn=nt,nt=null):Xn=nt.sibling;var es=ye(se,nt,Pt.value,Oe);if(es===null){nt===null&&(nt=Xn);break}t&&nt&&es.alternate===null&&r(se,nt),Z=v(es,Z,ht),Dt===null?Ie=es:Dt.sibling=es,Dt=es,nt=Xn}if(Pt.done)return s(se,nt),Ht&&Ds(se,ht),Ie;if(nt===null){for(;!Pt.done;ht++,Pt=ue.next())Pt=De(se,Pt.value,Oe),Pt!==null&&(Z=v(Pt,Z,ht),Dt===null?Ie=Pt:Dt.sibling=Pt,Dt=Pt);return Ht&&Ds(se,ht),Ie}for(nt=c(nt);!Pt.done;ht++,Pt=ue.next())Pt=be(nt,se,ht,Pt.value,Oe),Pt!==null&&(t&&Pt.alternate!==null&&nt.delete(Pt.key===null?ht:Pt.key),Z=v(Pt,Z,ht),Dt===null?Ie=Pt:Dt.sibling=Pt,Dt=Pt);return t&&nt.forEach(function(X_){return r(se,X_)}),Ht&&Ds(se,ht),Ie}function Zt(se,Z,ue,Oe){if(typeof ue=="object"&&ue!==null&&ue.type===S&&ue.key===null&&(ue=ue.props.children),typeof ue=="object"&&ue!==null){switch(ue.$$typeof){case x:e:{for(var Ie=ue.key;Z!==null;){if(Z.key===Ie){if(Ie=ue.type,Ie===S){if(Z.tag===7){s(se,Z.sibling),Oe=m(Z,ue.props.children),Oe.return=se,se=Oe;break e}}else if(Z.elementType===Ie||typeof Ie=="object"&&Ie!==null&&Ie.$$typeof===V&&zy(Ie)===Z.type){s(se,Z.sibling),Oe=m(Z,ue.props),rc(Oe,ue),Oe.return=se,se=Oe;break e}s(se,Z);break}else r(se,Z);Z=Z.sibling}ue.type===S?(Oe=Ns(ue.props.children,se.mode,Oe,ue.key),Oe.return=se,se=Oe):(Oe=vu(ue.type,ue.key,ue.props,null,se.mode,Oe),rc(Oe,ue),Oe.return=se,se=Oe)}return E(se);case w:e:{for(Ie=ue.key;Z!==null;){if(Z.key===Ie)if(Z.tag===4&&Z.stateNode.containerInfo===ue.containerInfo&&Z.stateNode.implementation===ue.implementation){s(se,Z.sibling),Oe=m(Z,ue.children||[]),Oe.return=se,se=Oe;break e}else{s(se,Z);break}else r(se,Z);Z=Z.sibling}Oe=Pf(ue,se.mode,Oe),Oe.return=se,se=Oe}return E(se);case V:return Ie=ue._init,ue=Ie(ue._payload),Zt(se,Z,ue,Oe)}if(fe(ue))return yt(se,Z,ue,Oe);if(te(ue)){if(Ie=te(ue),typeof Ie!="function")throw Error(o(150));return ue=Ie.call(ue),dt(se,Z,ue,Oe)}if(typeof ue.then=="function")return Zt(se,Z,Lu(ue),Oe);if(ue.$$typeof===L)return Zt(se,Z,Su(se,ue),Oe);zu(se,ue)}return typeof ue=="string"&&ue!==""||typeof ue=="number"||typeof ue=="bigint"?(ue=""+ue,Z!==null&&Z.tag===6?(s(se,Z.sibling),Oe=m(Z,ue),Oe.return=se,se=Oe):(s(se,Z),Oe=Bf(ue,se.mode,Oe),Oe.return=se,se=Oe),E(se)):s(se,Z)}return function(se,Z,ue,Oe){try{nc=0;var Ie=Zt(se,Z,ue,Oe);return Di=null,Ie}catch(nt){if(nt===$l||nt===_u)throw nt;var Dt=Pr(29,nt,null,se.mode);return Dt.lanes=Oe,Dt.return=se,Dt}}}var Mi=Uy(!0),By=Uy(!1),ra=Q(null),ja=null;function Po(t){var r=t.alternate;P(Yn,Yn.current&1),P(ra,t),ja===null&&(r===null||Ci.current!==null||r.memoizedState!==null)&&(ja=t)}function Py(t){if(t.tag===22){if(P(Yn,Yn.current),P(ra,t),ja===null){var r=t.alternate;r!==null&&r.memoizedState!==null&&(ja=t)}}else Ho()}function Ho(){P(Yn,Yn.current),P(ra,ra.current)}function oo(t){he(ra),ja===t&&(ja=null),he(Yn)}var Yn=Q(0);function Uu(t){for(var r=t;r!==null;){if(r.tag===13){var s=r.memoizedState;if(s!==null&&(s=s.dehydrated,s===null||s.data==="$?"||im(s)))return r}else if(r.tag===19&&r.memoizedProps.revealOrder!==void 0){if((r.flags&128)!==0)return r}else if(r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break;for(;r.sibling===null;){if(r.return===null||r.return===t)return null;r=r.return}r.sibling.return=r.return,r=r.sibling}return null}function vh(t,r,s,c){r=t.memoizedState,s=s(c,r),s=s==null?r:p({},r,s),t.memoizedState=s,t.lanes===0&&(t.updateQueue.baseState=s)}var bh={enqueueSetState:function(t,r,s){t=t._reactInternals;var c=qr(),m=zo(c);m.payload=r,s!=null&&(m.callback=s),r=Uo(t,m,c),r!==null&&(Yr(r,t,c),Xl(r,t,c))},enqueueReplaceState:function(t,r,s){t=t._reactInternals;var c=qr(),m=zo(c);m.tag=1,m.payload=r,s!=null&&(m.callback=s),r=Uo(t,m,c),r!==null&&(Yr(r,t,c),Xl(r,t,c))},enqueueForceUpdate:function(t,r){t=t._reactInternals;var s=qr(),c=zo(s);c.tag=2,r!=null&&(c.callback=r),r=Uo(t,c,s),r!==null&&(Yr(r,t,s),Xl(r,t,s))}};function Hy(t,r,s,c,m,v,E){return t=t.stateNode,typeof t.shouldComponentUpdate=="function"?t.shouldComponentUpdate(c,v,E):r.prototype&&r.prototype.isPureReactComponent?!Pl(s,c)||!Pl(m,v):!0}function Fy(t,r,s,c){t=r.state,typeof r.componentWillReceiveProps=="function"&&r.componentWillReceiveProps(s,c),typeof r.UNSAFE_componentWillReceiveProps=="function"&&r.UNSAFE_componentWillReceiveProps(s,c),r.state!==t&&bh.enqueueReplaceState(r,r.state,null)}function zs(t,r){var s=r;if("ref"in r){s={};for(var c in r)c!=="ref"&&(s[c]=r[c])}if(t=t.defaultProps){s===r&&(s=p({},s));for(var m in t)s[m]===void 0&&(s[m]=t[m])}return s}var Bu=typeof reportError=="function"?reportError:function(t){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var r=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof t=="object"&&t!==null&&typeof t.message=="string"?String(t.message):String(t),error:t});if(!window.dispatchEvent(r))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",t);return}console.error(t)};function Vy(t){Bu(t)}function qy(t){console.error(t)}function Yy(t){Bu(t)}function Pu(t,r){try{var s=t.onUncaughtError;s(r.value,{componentStack:r.stack})}catch(c){setTimeout(function(){throw c})}}function Wy(t,r,s){try{var c=t.onCaughtError;c(s.value,{componentStack:s.stack,errorBoundary:r.tag===1?r.stateNode:null})}catch(m){setTimeout(function(){throw m})}}function xh(t,r,s){return s=zo(s),s.tag=3,s.payload={element:null},s.callback=function(){Pu(t,r)},s}function Iy(t){return t=zo(t),t.tag=3,t}function $y(t,r,s,c){var m=s.type.getDerivedStateFromError;if(typeof m=="function"){var v=c.value;t.payload=function(){return m(v)},t.callback=function(){Wy(r,s,c)}}var E=s.stateNode;E!==null&&typeof E.componentDidCatch=="function"&&(t.callback=function(){Wy(r,s,c),typeof m!="function"&&(Io===null?Io=new Set([this]):Io.add(this));var R=c.stack;this.componentDidCatch(c.value,{componentStack:R!==null?R:""})})}function XE(t,r,s,c,m){if(s.flags|=32768,c!==null&&typeof c=="object"&&typeof c.then=="function"){if(r=s.alternate,r!==null&&Yl(r,s,m,!0),s=ra.current,s!==null){switch(s.tag){case 13:return ja===null?Yh():s.alternate===null&&wn===0&&(wn=3),s.flags&=-257,s.flags|=65536,s.lanes=m,c===Xf?s.flags|=16384:(r=s.updateQueue,r===null?s.updateQueue=new Set([c]):r.add(c),Ih(t,c,m)),!1;case 22:return s.flags|=65536,c===Xf?s.flags|=16384:(r=s.updateQueue,r===null?(r={transitions:null,markerInstances:null,retryQueue:new Set([c])},s.updateQueue=r):(s=r.retryQueue,s===null?r.retryQueue=new Set([c]):s.add(c)),Ih(t,c,m)),!1}throw Error(o(435,s.tag))}return Ih(t,c,m),Yh(),!1}if(Ht)return r=ra.current,r!==null?((r.flags&65536)===0&&(r.flags|=256),r.flags|=65536,r.lanes=m,c!==Vf&&(t=Error(o(422),{cause:c}),ql(Jr(t,s)))):(c!==Vf&&(r=Error(o(423),{cause:c}),ql(Jr(r,s))),t=t.current.alternate,t.flags|=65536,m&=-m,t.lanes|=m,c=Jr(c,s),m=xh(t.stateNode,c,m),Zf(t,m),wn!==4&&(wn=2)),!1;var v=Error(o(520),{cause:c});if(v=Jr(v,s),uc===null?uc=[v]:uc.push(v),wn!==4&&(wn=2),r===null)return!0;c=Jr(c,s),s=r;do{switch(s.tag){case 3:return s.flags|=65536,t=m&-m,s.lanes|=t,t=xh(s.stateNode,c,t),Zf(s,t),!1;case 1:if(r=s.type,v=s.stateNode,(s.flags&128)===0&&(typeof r.getDerivedStateFromError=="function"||v!==null&&typeof v.componentDidCatch=="function"&&(Io===null||!Io.has(v))))return s.flags|=65536,m&=-m,s.lanes|=m,m=Iy(m),$y(m,t,s,c),Zf(s,m),!1}s=s.return}while(s!==null);return!1}var Gy=Error(o(461)),$n=!1;function nr(t,r,s,c){r.child=t===null?By(r,null,s,c):Mi(r,t.child,s,c)}function Xy(t,r,s,c,m){s=s.render;var v=r.ref;if("ref"in c){var E={};for(var R in c)R!=="ref"&&(E[R]=c[R])}else E=c;return js(r),c=rh(t,r,s,E,v,m),R=ah(),t!==null&&!$n?(oh(t,r,m),so(t,r,m)):(Ht&&R&&Hf(r),r.flags|=1,nr(t,r,c,m),r.child)}function Qy(t,r,s,c,m){if(t===null){var v=s.type;return typeof v=="function"&&!Uf(v)&&v.defaultProps===void 0&&s.compare===null?(r.tag=15,r.type=v,Ky(t,r,v,c,m)):(t=vu(s.type,null,c,r,r.mode,m),t.ref=r.ref,t.return=r,r.child=t)}if(v=t.child,!Oh(t,m)){var E=v.memoizedProps;if(s=s.compare,s=s!==null?s:Pl,s(E,c)&&t.ref===r.ref)return so(t,r,m)}return r.flags|=1,t=Ja(v,c),t.ref=r.ref,t.return=r,r.child=t}function Ky(t,r,s,c,m){if(t!==null){var v=t.memoizedProps;if(Pl(v,c)&&t.ref===r.ref)if($n=!1,r.pendingProps=c=v,Oh(t,m))(t.flags&131072)!==0&&($n=!0);else return r.lanes=t.lanes,so(t,r,m)}return wh(t,r,s,c,m)}function Zy(t,r,s){var c=r.pendingProps,m=c.children,v=t!==null?t.memoizedState:null;if(c.mode==="hidden"){if((r.flags&128)!==0){if(c=v!==null?v.baseLanes|s:s,t!==null){for(m=r.child=t.child,v=0;m!==null;)v=v|m.lanes|m.childLanes,m=m.sibling;r.childLanes=v&~c}else r.childLanes=0,r.child=null;return Jy(t,r,c,s)}if((s&536870912)!==0)r.memoizedState={baseLanes:0,cachePool:null},t!==null&&Eu(r,v!==null?v.cachePool:null),v!==null?Kg(r,v):eh(),Py(r);else return r.lanes=r.childLanes=536870912,Jy(t,r,v!==null?v.baseLanes|s:s,s)}else v!==null?(Eu(r,v.cachePool),Kg(r,v),Ho(),r.memoizedState=null):(t!==null&&Eu(r,null),eh(),Ho());return nr(t,r,m,s),r.child}function Jy(t,r,s,c){var m=Gf();return m=m===null?null:{parent:qn._currentValue,pool:m},r.memoizedState={baseLanes:s,cachePool:m},t!==null&&Eu(r,null),eh(),Py(r),t!==null&&Yl(t,r,c,!0),null}function Hu(t,r){var s=r.ref;if(s===null)t!==null&&t.ref!==null&&(r.flags|=4194816);else{if(typeof s!="function"&&typeof s!="object")throw Error(o(284));(t===null||t.ref!==s)&&(r.flags|=4194816)}}function wh(t,r,s,c,m){return js(r),s=rh(t,r,s,c,void 0,m),c=ah(),t!==null&&!$n?(oh(t,r,m),so(t,r,m)):(Ht&&c&&Hf(r),r.flags|=1,nr(t,r,s,m),r.child)}function ev(t,r,s,c,m,v){return js(r),r.updateQueue=null,s=Jg(r,c,s,m),Zg(t),c=ah(),t!==null&&!$n?(oh(t,r,v),so(t,r,v)):(Ht&&c&&Hf(r),r.flags|=1,nr(t,r,s,v),r.child)}function tv(t,r,s,c,m){if(js(r),r.stateNode===null){var v=xi,E=s.contextType;typeof E=="object"&&E!==null&&(v=dr(E)),v=new s(c,v),r.memoizedState=v.state!==null&&v.state!==void 0?v.state:null,v.updater=bh,r.stateNode=v,v._reactInternals=r,v=r.stateNode,v.props=c,v.state=r.memoizedState,v.refs={},Qf(r),E=s.contextType,v.context=typeof E=="object"&&E!==null?dr(E):xi,v.state=r.memoizedState,E=s.getDerivedStateFromProps,typeof E=="function"&&(vh(r,s,E,c),v.state=r.memoizedState),typeof s.getDerivedStateFromProps=="function"||typeof v.getSnapshotBeforeUpdate=="function"||typeof v.UNSAFE_componentWillMount!="function"&&typeof v.componentWillMount!="function"||(E=v.state,typeof v.componentWillMount=="function"&&v.componentWillMount(),typeof v.UNSAFE_componentWillMount=="function"&&v.UNSAFE_componentWillMount(),E!==v.state&&bh.enqueueReplaceState(v,v.state,null),Kl(r,c,v,m),Ql(),v.state=r.memoizedState),typeof v.componentDidMount=="function"&&(r.flags|=4194308),c=!0}else if(t===null){v=r.stateNode;var R=r.memoizedProps,$=zs(s,R);v.props=$;var me=v.context,Ne=s.contextType;E=xi,typeof Ne=="object"&&Ne!==null&&(E=dr(Ne));var De=s.getDerivedStateFromProps;Ne=typeof De=="function"||typeof v.getSnapshotBeforeUpdate=="function",R=r.pendingProps!==R,Ne||typeof v.UNSAFE_componentWillReceiveProps!="function"&&typeof v.componentWillReceiveProps!="function"||(R||me!==E)&&Fy(r,v,c,E),Lo=!1;var ye=r.memoizedState;v.state=ye,Kl(r,c,v,m),Ql(),me=r.memoizedState,R||ye!==me||Lo?(typeof De=="function"&&(vh(r,s,De,c),me=r.memoizedState),($=Lo||Hy(r,s,$,c,ye,me,E))?(Ne||typeof v.UNSAFE_componentWillMount!="function"&&typeof v.componentWillMount!="function"||(typeof v.componentWillMount=="function"&&v.componentWillMount(),typeof v.UNSAFE_componentWillMount=="function"&&v.UNSAFE_componentWillMount()),typeof v.componentDidMount=="function"&&(r.flags|=4194308)):(typeof v.componentDidMount=="function"&&(r.flags|=4194308),r.memoizedProps=c,r.memoizedState=me),v.props=c,v.state=me,v.context=E,c=$):(typeof v.componentDidMount=="function"&&(r.flags|=4194308),c=!1)}else{v=r.stateNode,Kf(t,r),E=r.memoizedProps,Ne=zs(s,E),v.props=Ne,De=r.pendingProps,ye=v.context,me=s.contextType,$=xi,typeof me=="object"&&me!==null&&($=dr(me)),R=s.getDerivedStateFromProps,(me=typeof R=="function"||typeof v.getSnapshotBeforeUpdate=="function")||typeof v.UNSAFE_componentWillReceiveProps!="function"&&typeof v.componentWillReceiveProps!="function"||(E!==De||ye!==$)&&Fy(r,v,c,$),Lo=!1,ye=r.memoizedState,v.state=ye,Kl(r,c,v,m),Ql();var be=r.memoizedState;E!==De||ye!==be||Lo||t!==null&&t.dependencies!==null&&wu(t.dependencies)?(typeof R=="function"&&(vh(r,s,R,c),be=r.memoizedState),(Ne=Lo||Hy(r,s,Ne,c,ye,be,$)||t!==null&&t.dependencies!==null&&wu(t.dependencies))?(me||typeof v.UNSAFE_componentWillUpdate!="function"&&typeof v.componentWillUpdate!="function"||(typeof v.componentWillUpdate=="function"&&v.componentWillUpdate(c,be,$),typeof v.UNSAFE_componentWillUpdate=="function"&&v.UNSAFE_componentWillUpdate(c,be,$)),typeof v.componentDidUpdate=="function"&&(r.flags|=4),typeof v.getSnapshotBeforeUpdate=="function"&&(r.flags|=1024)):(typeof v.componentDidUpdate!="function"||E===t.memoizedProps&&ye===t.memoizedState||(r.flags|=4),typeof v.getSnapshotBeforeUpdate!="function"||E===t.memoizedProps&&ye===t.memoizedState||(r.flags|=1024),r.memoizedProps=c,r.memoizedState=be),v.props=c,v.state=be,v.context=$,c=Ne):(typeof v.componentDidUpdate!="function"||E===t.memoizedProps&&ye===t.memoizedState||(r.flags|=4),typeof v.getSnapshotBeforeUpdate!="function"||E===t.memoizedProps&&ye===t.memoizedState||(r.flags|=1024),c=!1)}return v=c,Hu(t,r),c=(r.flags&128)!==0,v||c?(v=r.stateNode,s=c&&typeof s.getDerivedStateFromError!="function"?null:v.render(),r.flags|=1,t!==null&&c?(r.child=Mi(r,t.child,null,m),r.child=Mi(r,null,s,m)):nr(t,r,s,m),r.memoizedState=v.state,t=r.child):t=so(t,r,m),t}function nv(t,r,s,c){return Vl(),r.flags|=256,nr(t,r,s,c),r.child}var Sh={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Eh(t){return{baseLanes:t,cachePool:qg()}}function _h(t,r,s){return t=t!==null?t.childLanes&~s:0,r&&(t|=aa),t}function rv(t,r,s){var c=r.pendingProps,m=!1,v=(r.flags&128)!==0,E;if((E=v)||(E=t!==null&&t.memoizedState===null?!1:(Yn.current&2)!==0),E&&(m=!0,r.flags&=-129),E=(r.flags&32)!==0,r.flags&=-33,t===null){if(Ht){if(m?Po(r):Ho(),Ht){var R=xn,$;if($=R){e:{for($=R,R=Aa;$.nodeType!==8;){if(!R){R=null;break e}if($=ga($.nextSibling),$===null){R=null;break e}}R=$}R!==null?(r.memoizedState={dehydrated:R,treeContext:Os!==null?{id:eo,overflow:to}:null,retryLane:536870912,hydrationErrors:null},$=Pr(18,null,null,0),$.stateNode=R,$.return=r,r.child=$,xr=r,xn=null,$=!0):$=!1}$||Rs(r)}if(R=r.memoizedState,R!==null&&(R=R.dehydrated,R!==null))return im(R)?r.lanes=32:r.lanes=536870912,null;oo(r)}return R=c.children,c=c.fallback,m?(Ho(),m=r.mode,R=Fu({mode:"hidden",children:R},m),c=Ns(c,m,s,null),R.return=r,c.return=r,R.sibling=c,r.child=R,m=r.child,m.memoizedState=Eh(s),m.childLanes=_h(t,E,s),r.memoizedState=Sh,c):(Po(r),Ch(r,R))}if($=t.memoizedState,$!==null&&(R=$.dehydrated,R!==null)){if(v)r.flags&256?(Po(r),r.flags&=-257,r=Th(t,r,s)):r.memoizedState!==null?(Ho(),r.child=t.child,r.flags|=128,r=null):(Ho(),m=c.fallback,R=r.mode,c=Fu({mode:"visible",children:c.children},R),m=Ns(m,R,s,null),m.flags|=2,c.return=r,m.return=r,c.sibling=m,r.child=c,Mi(r,t.child,null,s),c=r.child,c.memoizedState=Eh(s),c.childLanes=_h(t,E,s),r.memoizedState=Sh,r=m);else if(Po(r),im(R)){if(E=R.nextSibling&&R.nextSibling.dataset,E)var me=E.dgst;E=me,c=Error(o(419)),c.stack="",c.digest=E,ql({value:c,source:null,stack:null}),r=Th(t,r,s)}else if($n||Yl(t,r,s,!1),E=(s&t.childLanes)!==0,$n||E){if(E=on,E!==null&&(c=s&-s,c=(c&42)!==0?1:qt(c),c=(c&(E.suspendedLanes|s))!==0?0:c,c!==0&&c!==$.retryLane))throw $.retryLane=c,bi(t,c),Yr(E,t,c),Gy;R.data==="$?"||Yh(),r=Th(t,r,s)}else R.data==="$?"?(r.flags|=192,r.child=t.child,r=null):(t=$.treeContext,xn=ga(R.nextSibling),xr=r,Ht=!0,Ms=null,Aa=!1,t!==null&&(ta[na++]=eo,ta[na++]=to,ta[na++]=Os,eo=t.id,to=t.overflow,Os=r),r=Ch(r,c.children),r.flags|=4096);return r}return m?(Ho(),m=c.fallback,R=r.mode,$=t.child,me=$.sibling,c=Ja($,{mode:"hidden",children:c.children}),c.subtreeFlags=$.subtreeFlags&65011712,me!==null?m=Ja(me,m):(m=Ns(m,R,s,null),m.flags|=2),m.return=r,c.return=r,c.sibling=m,r.child=c,c=m,m=r.child,R=t.child.memoizedState,R===null?R=Eh(s):($=R.cachePool,$!==null?(me=qn._currentValue,$=$.parent!==me?{parent:me,pool:me}:$):$=qg(),R={baseLanes:R.baseLanes|s,cachePool:$}),m.memoizedState=R,m.childLanes=_h(t,E,s),r.memoizedState=Sh,c):(Po(r),s=t.child,t=s.sibling,s=Ja(s,{mode:"visible",children:c.children}),s.return=r,s.sibling=null,t!==null&&(E=r.deletions,E===null?(r.deletions=[t],r.flags|=16):E.push(t)),r.child=s,r.memoizedState=null,s)}function Ch(t,r){return r=Fu({mode:"visible",children:r},t.mode),r.return=t,t.child=r}function Fu(t,r){return t=Pr(22,t,null,r),t.lanes=0,t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},t}function Th(t,r,s){return Mi(r,t.child,null,s),t=Ch(r,r.pendingProps.children),t.flags|=2,r.memoizedState=null,t}function av(t,r,s){t.lanes|=r;var c=t.alternate;c!==null&&(c.lanes|=r),Yf(t.return,r,s)}function Nh(t,r,s,c,m){var v=t.memoizedState;v===null?t.memoizedState={isBackwards:r,rendering:null,renderingStartTime:0,last:c,tail:s,tailMode:m}:(v.isBackwards=r,v.rendering=null,v.renderingStartTime=0,v.last=c,v.tail=s,v.tailMode=m)}function ov(t,r,s){var c=r.pendingProps,m=c.revealOrder,v=c.tail;if(nr(t,r,c.children,s),c=Yn.current,(c&2)!==0)c=c&1|2,r.flags|=128;else{if(t!==null&&(t.flags&128)!==0)e:for(t=r.child;t!==null;){if(t.tag===13)t.memoizedState!==null&&av(t,s,r);else if(t.tag===19)av(t,s,r);else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===r)break e;for(;t.sibling===null;){if(t.return===null||t.return===r)break e;t=t.return}t.sibling.return=t.return,t=t.sibling}c&=1}switch(P(Yn,c),m){case"forwards":for(s=r.child,m=null;s!==null;)t=s.alternate,t!==null&&Uu(t)===null&&(m=s),s=s.sibling;s=m,s===null?(m=r.child,r.child=null):(m=s.sibling,s.sibling=null),Nh(r,!1,m,s,v);break;case"backwards":for(s=null,m=r.child,r.child=null;m!==null;){if(t=m.alternate,t!==null&&Uu(t)===null){r.child=m;break}t=m.sibling,m.sibling=s,s=m,m=t}Nh(r,!0,s,null,v);break;case"together":Nh(r,!1,null,null,void 0);break;default:r.memoizedState=null}return r.child}function so(t,r,s){if(t!==null&&(r.dependencies=t.dependencies),Wo|=r.lanes,(s&r.childLanes)===0)if(t!==null){if(Yl(t,r,s,!1),(s&r.childLanes)===0)return null}else return null;if(t!==null&&r.child!==t.child)throw Error(o(153));if(r.child!==null){for(t=r.child,s=Ja(t,t.pendingProps),r.child=s,s.return=r;t.sibling!==null;)t=t.sibling,s=s.sibling=Ja(t,t.pendingProps),s.return=r;s.sibling=null}return r.child}function Oh(t,r){return(t.lanes&r)!==0?!0:(t=t.dependencies,!!(t!==null&&wu(t)))}function QE(t,r,s){switch(r.tag){case 3:Ee(r,r.stateNode.containerInfo),ko(r,qn,t.memoizedState.cache),Vl();break;case 27:case 5:Ve(r);break;case 4:Ee(r,r.stateNode.containerInfo);break;case 10:ko(r,r.type,r.memoizedProps.value);break;case 13:var c=r.memoizedState;if(c!==null)return c.dehydrated!==null?(Po(r),r.flags|=128,null):(s&r.child.childLanes)!==0?rv(t,r,s):(Po(r),t=so(t,r,s),t!==null?t.sibling:null);Po(r);break;case 19:var m=(t.flags&128)!==0;if(c=(s&r.childLanes)!==0,c||(Yl(t,r,s,!1),c=(s&r.childLanes)!==0),m){if(c)return ov(t,r,s);r.flags|=128}if(m=r.memoizedState,m!==null&&(m.rendering=null,m.tail=null,m.lastEffect=null),P(Yn,Yn.current),c)break;return null;case 22:case 23:return r.lanes=0,Zy(t,r,s);case 24:ko(r,qn,t.memoizedState.cache)}return so(t,r,s)}function sv(t,r,s){if(t!==null)if(t.memoizedProps!==r.pendingProps)$n=!0;else{if(!Oh(t,s)&&(r.flags&128)===0)return $n=!1,QE(t,r,s);$n=(t.flags&131072)!==0}else $n=!1,Ht&&(r.flags&1048576)!==0&&zg(r,xu,r.index);switch(r.lanes=0,r.tag){case 16:e:{t=r.pendingProps;var c=r.elementType,m=c._init;if(c=m(c._payload),r.type=c,typeof c=="function")Uf(c)?(t=zs(c,t),r.tag=1,r=tv(null,r,c,t,s)):(r.tag=0,r=wh(null,r,c,t,s));else{if(c!=null){if(m=c.$$typeof,m===q){r.tag=11,r=Xy(null,r,c,t,s);break e}else if(m===k){r.tag=14,r=Qy(null,r,c,t,s);break e}}throw r=ge(c)||c,Error(o(306,r,""))}}return r;case 0:return wh(t,r,r.type,r.pendingProps,s);case 1:return c=r.type,m=zs(c,r.pendingProps),tv(t,r,c,m,s);case 3:e:{if(Ee(r,r.stateNode.containerInfo),t===null)throw Error(o(387));c=r.pendingProps;var v=r.memoizedState;m=v.element,Kf(t,r),Kl(r,c,null,s);var E=r.memoizedState;if(c=E.cache,ko(r,qn,c),c!==v.cache&&Wf(r,[qn],s,!0),Ql(),c=E.element,v.isDehydrated)if(v={element:c,isDehydrated:!1,cache:E.cache},r.updateQueue.baseState=v,r.memoizedState=v,r.flags&256){r=nv(t,r,c,s);break e}else if(c!==m){m=Jr(Error(o(424)),r),ql(m),r=nv(t,r,c,s);break e}else for(t=r.stateNode.containerInfo,t.nodeType===9?t=t.body:t=t.nodeName==="HTML"?t.ownerDocument.body:t,xn=ga(t.firstChild),xr=r,Ht=!0,Ms=null,Aa=!0,s=By(r,null,c,s),r.child=s;s;)s.flags=s.flags&-3|4096,s=s.sibling;else{if(Vl(),c===m){r=so(t,r,s);break e}nr(t,r,c,s)}r=r.child}return r;case 26:return Hu(t,r),t===null?(s=ub(r.type,null,r.pendingProps,null))?r.memoizedState=s:Ht||(s=r.type,t=r.pendingProps,c=td(pe.current).createElement(s),c[de]=r,c[Te]=t,ar(c,s,t),Mt(c),r.stateNode=c):r.memoizedState=ub(r.type,t.memoizedProps,r.pendingProps,t.memoizedState),null;case 27:return Ve(r),t===null&&Ht&&(c=r.stateNode=ib(r.type,r.pendingProps,pe.current),xr=r,Aa=!0,m=xn,Xo(r.type)?(lm=m,xn=ga(c.firstChild)):xn=m),nr(t,r,r.pendingProps.children,s),Hu(t,r),t===null&&(r.flags|=4194304),r.child;case 5:return t===null&&Ht&&((m=c=xn)&&(c=__(c,r.type,r.pendingProps,Aa),c!==null?(r.stateNode=c,xr=r,xn=ga(c.firstChild),Aa=!1,m=!0):m=!1),m||Rs(r)),Ve(r),m=r.type,v=r.pendingProps,E=t!==null?t.memoizedProps:null,c=v.children,am(m,v)?c=null:E!==null&&am(m,E)&&(r.flags|=32),r.memoizedState!==null&&(m=rh(t,r,VE,null,null,s),bc._currentValue=m),Hu(t,r),nr(t,r,c,s),r.child;case 6:return t===null&&Ht&&((t=s=xn)&&(s=C_(s,r.pendingProps,Aa),s!==null?(r.stateNode=s,xr=r,xn=null,t=!0):t=!1),t||Rs(r)),null;case 13:return rv(t,r,s);case 4:return Ee(r,r.stateNode.containerInfo),c=r.pendingProps,t===null?r.child=Mi(r,null,c,s):nr(t,r,c,s),r.child;case 11:return Xy(t,r,r.type,r.pendingProps,s);case 7:return nr(t,r,r.pendingProps,s),r.child;case 8:return nr(t,r,r.pendingProps.children,s),r.child;case 12:return nr(t,r,r.pendingProps.children,s),r.child;case 10:return c=r.pendingProps,ko(r,r.type,c.value),nr(t,r,c.children,s),r.child;case 9:return m=r.type._context,c=r.pendingProps.children,js(r),m=dr(m),c=c(m),r.flags|=1,nr(t,r,c,s),r.child;case 14:return Qy(t,r,r.type,r.pendingProps,s);case 15:return Ky(t,r,r.type,r.pendingProps,s);case 19:return ov(t,r,s);case 31:return c=r.pendingProps,s=r.mode,c={mode:c.mode,children:c.children},t===null?(s=Fu(c,s),s.ref=r.ref,r.child=s,s.return=r,r=s):(s=Ja(t.child,c),s.ref=r.ref,r.child=s,s.return=r,r=s),r;case 22:return Zy(t,r,s);case 24:return js(r),c=dr(qn),t===null?(m=Gf(),m===null&&(m=on,v=If(),m.pooledCache=v,v.refCount++,v!==null&&(m.pooledCacheLanes|=s),m=v),r.memoizedState={parent:c,cache:m},Qf(r),ko(r,qn,m)):((t.lanes&s)!==0&&(Kf(t,r),Kl(r,null,null,s),Ql()),m=t.memoizedState,v=r.memoizedState,m.parent!==c?(m={parent:c,cache:c},r.memoizedState=m,r.lanes===0&&(r.memoizedState=r.updateQueue.baseState=m),ko(r,qn,c)):(c=v.cache,ko(r,qn,c),c!==m.cache&&Wf(r,[qn],s,!0))),nr(t,r,r.pendingProps.children,s),r.child;case 29:throw r.pendingProps}throw Error(o(156,r.tag))}function io(t){t.flags|=4}function iv(t,r){if(r.type!=="stylesheet"||(r.state.loading&4)!==0)t.flags&=-16777217;else if(t.flags|=16777216,!pb(r)){if(r=ra.current,r!==null&&((Ut&4194048)===Ut?ja!==null:(Ut&62914560)!==Ut&&(Ut&536870912)===0||r!==ja))throw Gl=Xf,Yg;t.flags|=8192}}function Vu(t,r){r!==null&&(t.flags|=4),t.flags&16384&&(r=t.tag!==22?gt():536870912,t.lanes|=r,ki|=r)}function ac(t,r){if(!Ht)switch(t.tailMode){case"hidden":r=t.tail;for(var s=null;r!==null;)r.alternate!==null&&(s=r),r=r.sibling;s===null?t.tail=null:s.sibling=null;break;case"collapsed":s=t.tail;for(var c=null;s!==null;)s.alternate!==null&&(c=s),s=s.sibling;c===null?r||t.tail===null?t.tail=null:t.tail.sibling=null:c.sibling=null}}function yn(t){var r=t.alternate!==null&&t.alternate.child===t.child,s=0,c=0;if(r)for(var m=t.child;m!==null;)s|=m.lanes|m.childLanes,c|=m.subtreeFlags&65011712,c|=m.flags&65011712,m.return=t,m=m.sibling;else for(m=t.child;m!==null;)s|=m.lanes|m.childLanes,c|=m.subtreeFlags,c|=m.flags,m.return=t,m=m.sibling;return t.subtreeFlags|=c,t.childLanes=s,r}function KE(t,r,s){var c=r.pendingProps;switch(Ff(r),r.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return yn(r),null;case 1:return yn(r),null;case 3:return s=r.stateNode,c=null,t!==null&&(c=t.memoizedState.cache),r.memoizedState.cache!==c&&(r.flags|=2048),ro(qn),Fe(),s.pendingContext&&(s.context=s.pendingContext,s.pendingContext=null),(t===null||t.child===null)&&(Fl(r)?io(r):t===null||t.memoizedState.isDehydrated&&(r.flags&256)===0||(r.flags|=1024,Pg())),yn(r),null;case 26:return s=r.memoizedState,t===null?(io(r),s!==null?(yn(r),iv(r,s)):(yn(r),r.flags&=-16777217)):s?s!==t.memoizedState?(io(r),yn(r),iv(r,s)):(yn(r),r.flags&=-16777217):(t.memoizedProps!==c&&io(r),yn(r),r.flags&=-16777217),null;case 27:Xe(r),s=pe.current;var m=r.type;if(t!==null&&r.stateNode!=null)t.memoizedProps!==c&&io(r);else{if(!c){if(r.stateNode===null)throw Error(o(166));return yn(r),null}t=ie.current,Fl(r)?Ug(r):(t=ib(m,c,s),r.stateNode=t,io(r))}return yn(r),null;case 5:if(Xe(r),s=r.type,t!==null&&r.stateNode!=null)t.memoizedProps!==c&&io(r);else{if(!c){if(r.stateNode===null)throw Error(o(166));return yn(r),null}if(t=ie.current,Fl(r))Ug(r);else{switch(m=td(pe.current),t){case 1:t=m.createElementNS("http://www.w3.org/2000/svg",s);break;case 2:t=m.createElementNS("http://www.w3.org/1998/Math/MathML",s);break;default:switch(s){case"svg":t=m.createElementNS("http://www.w3.org/2000/svg",s);break;case"math":t=m.createElementNS("http://www.w3.org/1998/Math/MathML",s);break;case"script":t=m.createElement("div"),t.innerHTML="
+
diff --git a/havano_restaurant_pos/www/dashboard.html b/havano_restaurant_pos/www/dashboard.html
index 2cd821c..87f52c2 100644
--- a/havano_restaurant_pos/www/dashboard.html
+++ b/havano_restaurant_pos/www/dashboard.html
@@ -5,7 +5,7 @@
dashboard
-
+