@openreceive/elements 0.4.13 → 0.4.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../provider-data/src/generated/pay-tutorial-images.ts", "../../../../../node_modules/qrcode/lib/can-promise.js", "../../../../../node_modules/qrcode/lib/core/utils.js", "../../../../../node_modules/qrcode/lib/core/error-correction-level.js", "../../../../../node_modules/qrcode/lib/core/bit-buffer.js", "../../../../../node_modules/qrcode/lib/core/bit-matrix.js", "../../../../../node_modules/qrcode/lib/core/alignment-pattern.js", "../../../../../node_modules/qrcode/lib/core/finder-pattern.js", "../../../../../node_modules/qrcode/lib/core/mask-pattern.js", "../../../../../node_modules/qrcode/lib/core/error-correction-code.js", "../../../../../node_modules/qrcode/lib/core/galois-field.js", "../../../../../node_modules/qrcode/lib/core/polynomial.js", "../../../../../node_modules/qrcode/lib/core/reed-solomon-encoder.js", "../../../../../node_modules/qrcode/lib/core/version-check.js", "../../../../../node_modules/qrcode/lib/core/regex.js", "../../../../../node_modules/qrcode/lib/core/mode.js", "../../../../../node_modules/qrcode/lib/core/version.js", "../../../../../node_modules/qrcode/lib/core/format-info.js", "../../../../../node_modules/qrcode/lib/core/numeric-data.js", "../../../../../node_modules/qrcode/lib/core/alphanumeric-data.js", "../../../../../node_modules/qrcode/lib/core/byte-data.js", "../../../../../node_modules/qrcode/lib/core/kanji-data.js", "../../../../../node_modules/dijkstrajs/dijkstra.js", "../../../../../node_modules/qrcode/lib/core/segments.js", "../../../../../node_modules/qrcode/lib/core/qrcode.js", "../../../../../node_modules/qrcode/lib/renderer/utils.js", "../../../../../node_modules/qrcode/lib/renderer/canvas.js", "../../../../../node_modules/qrcode/lib/renderer/svg-tag.js", "../../../../../node_modules/qrcode/lib/browser.js", "../../../provider-data/src/data/openreceive-providers.v4.json", "../../../provider-data/src/pay-tutorials.ts", "../../../provider-data/src/generated/provider-icon-images.ts", "../../../provider-data/src/provider-icons.ts", "../../../provider-data/src/index.ts", "../../../core/src/money/decimal.ts", "../../../core/src/values.ts", "../../../core/src/swap/hash.ts", "../../../core/src/swap/address.ts", "../../../core/src/generated/swap-assets.ts", "../../../core/src/swap/assets.ts", "../../../core/src/diagnostics.ts", "../../../browser/src/internal/dom-contract.ts", "../../../browser/src/generated/payment-icon-svgs.ts", "../../../browser/src/internal/icons.ts", "../../../browser/src/generated/compiled-styles.ts", "../../../browser/src/ui-classes.ts", "../../../browser/src/internal/labels.ts", "../../../browser/src/internal/checkout-ticker.ts", "../../../browser/src/internal/checkout-format.ts", "../../../browser/src/internal/checkout-invoice.ts", "../../../browser/src/internal/unix-seconds.ts", "../../../browser/src/internal/checkout-swap-view.ts", "../../../browser/src/internal/checkout-links.ts", "../../../browser/src/internal/checkout-details.ts", "../../../browser/src/internal/log-level.ts", "../../../browser/src/internal/console-logger.ts", "../../../browser/src/internal/checkout-log.ts", "../../../browser/src/internal/checkout-read.ts", "../../../browser/src/internal/wizard.ts", "../../../browser/src/internal/checkout-state.ts", "../../../browser/src/internal/checkout-merge.ts", "../../../browser/src/internal/request-headers.ts", "../../../browser/src/internal/routes.ts", "../../../browser/src/internal/checkout-transport.ts", "../../../browser/src/internal/checkout-actions.ts", "../../../browser/src/internal/swap-http.ts", "../../../browser/src/internal/checkout-watcher.ts", "../../../browser/src/internal/checkout-session.ts", "../../../browser/src/status.ts", "../../../browser/src/internal/theme.ts", "../../../browser/src/internal/elements.ts", "../../../browser/src/internal/guest-resume.ts", "../chunk-DQ6FMWVX.js", "../standalone-entry.js"],
4
+ "sourcesContent": ["/* Generated by tools/package/generate-provider-images.mjs \u2014 do not edit. */\n// Source: packages/js/provider-data/src/assets/pay_tutorials/*.webp. Replace the .webp, then\n// run `npm run generate:provider-images`.\n\n/** Each packaged tutorial as a `data:image/webp;base64` URI, keyed by its registry path. */\nexport const payTutorialImages: Readonly<Record<string, string>> = Object.freeze({\n \"assets/pay_tutorials/boltz-1.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/boltz-2.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/cashapp-1.webp\":\n \"data:image/webp;base64,UklGRo4nAABXRUJQVlA4WAoAAAAQAAAAcQEAHwMAQUxQSHkAAAABP0CmAZFIIVEUUkkQlwkSEbHglQlUkW1jRgQSeBJIoYDRQP8m93cj+j8Bb1fm459K/c7Y+oqtFf/zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//L44qtzdj6ie2+Hdr4AFZQOCDuJgAAUPYAnQEqcgEgAz7tdLJVKi09JiKzWXkwHYlnbvwyVz8/2bJeA1v8Z6BYerlfdEsbgTzEnAPUd+k/YA/VfpI+YDzRf9F6sfQQ/pfUT+g15b/sv/3b/wZTZ6B/1Pbn/lfEX8a+hf1P9s48npXgj/MfvH+8/wHo5/1fB/5cahH5J/Rd353H/jegL7Pfgu/B/3fST7Hf9b3Av55w6Pq/sFf03/derF/reWP9C/5HsHiizioOtU9+Ii4UmdGDYqD4TKWhu/2B5gsSOygVti8acD3f97fdS+QYPkgr95KngFbePnRWE3SPCsJODXuph18WJdFvWgHTF4cKjYO5ZpAxFFotBuPNnUXq3kRkhTXkIdDcU5Xhe6Hbl4gZDzm4zihYK9VLRUVk8M11pTygr4U1riw//Oqel9+cc875AbwqS7Cq5z/QvvFS289CqQQMD5JcmUkNjLHWXDsC+KNrDaus/xUnxu17+7C0oUmhInuT7PjhYk9mn1zpmNPs5PTUqqEdlgEQYHsfo+m1BKlgSQkbbglRySqJl/s86Md0qcQOd+30kchOXmeQm2SglGobZ8LIftceVx4vVi6BVzFEqWOfy2XtLRM179Nlw7lTkPi7vnwWDuASW5ve+NQO8woIJ1J70GlCNG4ISCfLtKamLeBdbYBenlo4zYQplJy3I4ovhzAqA9urGlD8Xl0mTUsMWni/ASKvcwztkOwAaaBZVlrnp+SFYgguPanvg1tjXXlgJ1xD66D4MjAUNqMHhf3cPC8n02kJK5yM1PXED5mQh+TI/rtr3DC5nfJbRtTap0/4mas9faNnFweLLa3wIgC8sd0HVr5ewnnj1F6ULR2h7r2Gx5Ox1BWbJt7bvG+AyCu+dxZfAY6gXBUw0XwkOHStfHXCzVanPNh918TSrefRiiyA9E+79jG+KkA05SSKXHKrroOBM3OafGkki6bLZ2P4T+WyzPBqd/6fKs8vRtLmuIpp7ATl5nKPkx655ZDaK8XRHHHvqic8yyLlK/UxutxbJUfQa6wpNIlHowtw0jroxeuNmgwTOf9D/xILi+uUphwBF6ghWFJBk5vHVuoLOGHc1zleMb6lm34aw/WFe8jR0SYpXBkJMaNfJvrRFRRCoR1Q3ZjW9MkemJDhhGeIhd3QO+ShD04SKysdJg4BV/AouliIzyEl/OZbU4BraSiSsINGQ49dFfmO5TZQqNZX84jbzH3Zf5juU9snrh8or8x3NX5juavx/6JlxFFoOrXy/fRZb4m4k/pjs1VPlFfmCoCMm/pCzJpSeTUfkAiPlkfX8BXn+6wf850mq0V/iaXZB54/EX2OWcIWImGY+U6l3CiLBC7Rn/4iDipTG6Y0BVGzG+G5g12oA9SjJn/I+TD1YoEA4zBb0SKyDN/Q6HRldo0k9cO6laoxcZk6uoRBtPMc1tbII8sDuZHqcTVfmO4+RQXnsWmtX3huxRb0tbCCvzHc1fmO5q9QdtCEw99ApKPSOhm9nZ/b1JgPJXJpmzRhofTlW8ZutiJ09C+KMdPggarIr3f5Mi4Uj0oK7giuTvNkO1SH/T1rdMp05oqzjyt2f85CCzoiLhSZ0X6yu0AfGxXQ+sdzV+Y7mr8x3NXNOkPw9F8kj0x3NX5juavzHPbn2cxv+fL5YnQdWvl++i0HAiMHB2bnq+CKESCSZEy3bOpUhTvnQdWvl++jyYQSSCNJ3M+mB975x3a5izJS1dl6MR6OkSngacxFuIjC7ul0qDDwEAQCi6yYOLa9BGvzAF4YW+YfpP9k15xkyGfcR9fly37ClBtDmmJWbgxoter/YpGCniwMLhT0Kb3Cm+MSHLX4q2xTv17QBN5xTboONLXH3v9CU3zhLDK0QBdPtM3/od7/uU+wlkHJaO1ls+bJCx/bAVqKuKhYHKDktPKGKhEWPye5Atw9106kqAmSkpO38VYcLLBwETY2sbntSIcNLwb96YHJeTbeEDRb1DEkX7KtNTRilJ5znZQKX8lVGPsuObdLdDBUvzHJzF2GDi+l0eyYJMQ8MDAv7uECVt2SHnEC48H8FkASEFq7RAyVfLKPB75juauVbK2Z2d17g93Y8qh+hw5B59DNtFUd5fngWkZT99FoOrK1HmGfrTpMzPY2SP9iEJqCDdY6shBw7JPH0v9PL9hv2YTC76m5u2jcEHayLKXOgqDGWSp+VjBsLh8HOBwgrXAyt79FoOmVUchGydi5iD48+AN0WAyX9tKflNUcEc8NQkeBUOC5m2Ue7OhgjwoxMI2T1edp689ZAwvjAIL0Q0M34sdlM++HEq7BDJOI8R+CWIEpNU/+ihfXGDCWEq/MHfR0RFyMX6SF2lnfR5LWCySb3oeF/dxnbFP62T7mvrYRX250Sh87eutBf3cPC+Rrpv8vCn6HOQ3UShPzcX23nfoVYexkdjEmCeAqKTNnpw1b7JEUgRUi7mYP2HY8kXpYYGvdvLewmE2b4l39XrCSiYoCwjnar0T3aRG47xjABM8L7JrZe2swLOsdT5X0ywFW0gRGiKfM0Y8AS+ZnoGuCGbEDQltFN4FRs5WUhipw1wcdtYdA3N1FV0T5t8bTV9JfBGGgh5/HTJpY4e5yELJJri5RwZoLfdg6BlD4vfXKx31HUMPcWOinqSztIYSMxgLtprAA/viIkq4NPEkum/6TtrghL46h7BJWMP378vWZ7xxt9cjqD861TD5+ILJXaQragpU9HyjeUJNUnlgpXd5DFb471Thgn7mmAP7SBlYHy1pB/mapJDLo69f2AL4+Pn7xl2vTMzL1lisONTNGhFOoewRfbyeR3o6NJDajb0gJ/FDdTG4E3SCfAGOismerRjnO4G5RiANJCX1wngEuPL/KJ0dM+9+pf+vgba5n3ORWUooPNgFhB4nKgHel/SB6BQwOBr9DmCAeuvJ8Q7MhXDXNwvAwZ/FxlyVi1hqzDNEFtynNnhx91439mXqN+fjCHtL7iCL/rGbnpL2EYyWRPgFfrz77D4VG+sXImbXfAvj3n9bNlsJyLXvQB22kHYRNR0hgr0oeCCPfoIN3TNsUwgY9TSqLjq6JadMLhMuVqd0zguq/p7BCNGo+dp+iiroM05Gg7uUdloVMoeVS7xdCj5PoVd+Y10GUJW08ouehYIOPKDlIardhgsqddP3HbByp9C1hvKSr94ER1ayggx0awmhCOZLvxNdXBTNpbJxXbqc3P3doBbXfIjnW7orDjctM+f3ckTQnrM6DnEipJbUlgwdCb+Y5ViPsClMM47TXNCbcJCguguNpndj/slRNXNNHKcwk9laUbhMdBXNvcwqnORxt39X5bhhJSqPSH3mTWxY8XVeMARLX7b2ofY7yXLWjltXsmy4QMd4sIwIys+uvv/cwgJ4KHZOzUyK4QP0+8EbRolcJA7Ym/ewJ5/O03DrYIRhEdaYmAlp8TgkcUexfgp3Ac3PJ/zzuCqtP2KYooLBddtkVS2U6DLKabxcQN1B+15uCI1oAgkl8tm8uXfew46LFVqXHEm7ooAv8K8k6be7LH5gId6ZRAcGiAE/KFIhIsMyCNAOaMGa/W+xU2tDhVGQndB3DNssO8dUY1sV28lcckQq3iiOiNcAXAOrNyB22CcjkmttYFvFBNnEHXfzFK2Xgc5rklOSd2CDv0pskfLee3jw/e6eHOKFZE6KJ+AGBuKfZqIuoAi5TgZOIBy+cY1ZN/kiUUeNOM88ghtvnymnHvqpcIctQVRimuF21J15zl91b6rwzKs8dxR17lXEmnApWpMHIZNhKCfMbUpc13w17/eKJa9Atqg+piX8j5MMoCLZ84QgmIj6W2RgKqQRSEofH8EEUy3IrNMpus9u8BBPDkVJMNUsZ7Qy/ALGITn16zDK7/BZpKHIiEfjpule5svtcuv4q0VHCb3H9J1GnPtaPQjuh77RkrSl0d3RfHjGelg9WK3Aw7IZluhVyFR0W5WOayfUn7qH1tYiaDJNerWBqWUqBixKCg+d9LPMx3JoZWYd3qw6HpjQJwmQpY1Cm/BRCNRCzcZkOFvlwb/2HGHZbphUkqJEZ4N+phgcUaoa1rL9fA3z7sGRgYFirwYfH/wRBX3k4RQknuaF1UtC4RezXuxeMtlADNV7pBnbw0Ls1uEZZEfjNvzvhpvBRLEjFHzN6QD+FQBNOL66sNH4MNrSxfGIEfJDSVP+pEpJsEHOFRGW2hayiK0GjoIu+zrEyKXnWKAVRps3MZfl4YnzBh611/UwfZEaDOMQnCHeC1yLmj0IxvsK2Pb3CKbHRVml7+y7xnkrhcgNJGtZLLdXhbRQK/9BCLwuzErVpRdGZfnWsHTETiXPN0KWNR8uLweuxmuw8VbduT/ntm8b01lAZzaSSF61/LdIEdMRCXGNjT7QXC8zh346UMHByVtlPEkWwCFHq6Yd9IzGgvvvHxNBpYcRKE849EresaE8tG1HWqK1RyRilYvzZ80pwxDLnJbDLYOn2DNgS9FTx/BDJqcyXMb6scrIoHWAA1EPFYYEjNSyAH2lBVgYrR8CZ70JdwuAdFpnfcbfwLBvUv2xBJpE5vc1YRkN5WmPr3r01KR/4H0wDPIRIXO6K62dUOgNO68slqHMTgqgF28zccQNhFd5DKW+tJWysRlo/rySfaT3jmo5md8+L3D/tlff/xhiJCqLOZ19eC07OfUMDUbBE1/NzmkztFrm44ADaS5DdMtYM6fNlhc9TSZ1cvlZVnHNRAgGv3g5mPeYYBbxmVOfoZtMAbVR1zo153A+fGjkPeFEu9V14N0p8WGA9H6cnRpPfO5qhFFHAQjLEqSqDC+kSjmx+PRCVLJtWcHCXDstyycQBcMEe+W5rWb7lERySm5EHVsJn61Jq6CFveDInxwtWrH2/+yGMN+g+kEv45dUBWpdSeKY/lQI1vc7ZWeEeYOHXMsdroWYX/TeUB7EO+QAxKT5wUfRyjr61NNgjBBQ5ykKaFDXnCPmeUajdb9gHO7ft280acSl1EKI7UhTo7yG5jtckBxfY0n938RxnneTLLXclZizA6hT2f6r20Nv1AWTbkknfOPAVzcDoIn5V5hOzY1Zc190a39LNAtpXq7juPBJ3I+ZjbUX+z5GllTKMqr35NPJ49UXHzWZS54PfxIQVmequScJyzzXW8T6sy57G0vrBrhqw7BWvbq48Ft63YAHPSxz2bvxL/voz7Uad9jIMZ7ZrH3fnFmUm5zfJyL13TYSsaMyWZ9ZVcbltyqkexNLwztCdJsngPPO4oDvJkk0H0jrUJAUxRzl6cXM90SDWICNH2DvbsK2GYOrRvdAix1BSNc3CATMva1L/gqP5XX/ejgQuNWsJxJzaRYfKPU5//r+cNa5C003Df01CzrhmKjlGueQ+gtI1c3XThZeAqz5kdzSPm6stv/3cMff4WyoPKnD5IevYhIRAOW1saVow3unAWrGO3YssW5WhJjTnvfoL5LvoPmOK3RiUo/Xo8+iAYK+tN4rmZA6koasr6tARVgTDkOp77CioV1xcbPqMxEIRrV4UbKlo2+ynsWSo7ibD1KdzAUwT95+YD9VOhPjizYerVEVOrYPPOcTHWSgCwqwOwegILahW0v/2XnM7I17nAHtBnoJ0syClQC4AGKSYBOScaMbpaMPh1dbxk9YJzOdIdGHz9fw1Qf9Fm8CoUMFRir6bgq4r5oXqJ9qKxTk8eX7kkShVoXBTrkKf7XzF09hMkgc0/j+1q6AAMaqYCkyzXOG78yv0ZroPpWpYSwdk/vpd9FOL1XWos88i9EUIj4+nBcZuk2URFlhINWwvflukzoGefHZd9hTcawuSYL3PcAe3BeRQ2vMlnvRZz473Y+s0ZxhGI5X5egNJPWig+yS/KYzLTxp1wDXYhi+nqLrnX/Ed/boOWfH30bQkFUOFDdPnCmhnv6C+u8o7vV5XdSBXpR8LP1QcD5PgHWHyEjGD/A2fFrvD/WLyKIkzIK679xVLCVsbRBIe/0LyobudF1t6w7g6SusKXaMUo4K/VhqVCp8RWaTnqLB0CBUyIZizvpw2qaOpgvDaLKram0PwAQEwKbkRLWp3tpA411+HHfFFzCv8dLmBh6yBTOM9VlNEng1X44NctAkeaZHrxOS3qqY4nNFw0Duy0Lr14wgfvExduAnDqKu/c8HMaAbqKnNRofEnRBg0bLMJnPvu2HYL1f9IUPIP8n2fbonq2VRrmeFasUwZIKgTUEVeCz9AEImzH41zYSwp4r9QycuU1+Gq5dVxtRj4ycqdAuMe8aeAiE4SsapOh3C+tzHU3QVdoppqJpF13/ws1dE7GtKsKuHgJCHdaQGmOA155EVGtz5kOKVmxDEKDbQWPWqPyMhlenbY6ifjxclY5ruwFwyCkpmE1+y7DnvJmC22SctmSuaVcr2aFVnFG/n45rsLv/OxziAT9V0q8iPcYJRenTeuiYA4xR17W9KeeKZe9q92JdEzgS8I5giuS4SMPxhP+bwxnq0oV484zUZQEGk7GRm++8omdhVGew7ACGp1rlmNoX1JBCssuoN11OO5x7sJZ8CRdiDIM0sl5mq9snkYP49KTmSxKlaBKObF4uTeKLoDOKJ2ZV+SCDUiGnlmBZijBhOqeeA57R0rIlI4032c5UhZX2nAhLnPMeTv27cD7lm8aVpmlmMYDWk66VZ9N3OiQGvppbt1Mu+wD/hEmqgG4tO7H0VfkiSQcMaa1Pi2TIvbTcqNE3nwZHJlBpoMoe5uSXPW4ysM6HE2/VWLJFHq90ubbliEN5WdJId3X/gthCi+5TXHnuY+ggDKQ9jtly2RRVd2fzim52N8Q+btLd8kQDI4esHNWZi53o44ZyUC/XlP2E7hAW8/Adz/rdk8GwPjme8FfFbRGRxfS3XY9/AW8w8HlDQXqehk/6BCCoxd4Q+UiRoGsnXoHXSPi04I8L/Go+VDRGUD7vCP/Ue0XnS/vyugFRt0r4SjYAkEC06YpYkZ/SIRlM2iQ5TgnCnuXk7aPGeWDX0Nj6Qb+LxCppN+fcjZ4ZOjIqKJC5nGiz6ArEK8L4i1tonevAQpa8nYFvCo+FecSOmTMibetYbiQX23Fx5SrIcNLyoBdH5QM+Ta6BnYx0y4IiLVIb/WyrJxTtMASS28HfW3Yord7g+GeHmPX2LYETh0KWbqIfFKwiywzmiZl3xA5cULMfDJRkbtO3LYMjSTHyTlDi/xLoVqdfQ842wreHOEcjK8TiLw8OA01S7y0T0ePyBXXT+0MrrfXrbfpvcdT69oichRJ2DUCPI9f8nwqMZtj4ho4cFjbbz/MCZwAF6C20/HLXa6SLysdbhyWA2hxIEajc7jap22toAaJQXObPjx4rS5v+TxX+vu8tDB4VC+hjbcIooitilGYFmHiGep7C+r3mMgdeKSknruZJuGvO55rSC/7jd7TBT33wmi8un1/UNRjOGxN9jllCJc86omVr4GPtYKoi/jQxGDr0qmE5y7OzPvpEiJOH3+P1UtsDOcnLrKHI9nnG3woM9jF92KGzSJ11yhGdhHA11Vn2GUrECMk0l1MJYRh/HyAbS+AJUCGT5BpWdgaFc78BYBu1P4f7LV9CLXxsvN+RtzLh/7i7po/S94gOG8B2ulk6RuUPQKE8fqaa+LU+NgOh55Fvkg9tseR3QuNBtby8QhckSIdx9rJh1SEeaFKBQOED4/RVVzg2xBc8ENVEcM5D4rmubuWt0fjN3pIzbF7Zm3ThlXJbjQEsKLAU0pTaJy+HAoDJSAXfgUtoicG26NF0faLW2AOVT1WXZNCIDUgeNWp05smz9oJh0FVC+TG4m2igX/I9YMetQNCPUno1bwMP1Ou5Buu3Qc0r6JLshI6e8yTzKMr/0VXK2hqH7Q1PdtjTQ8o6eOxHGuonxeYY0jLIXCF8ZF1v05Dv7uw/hMCAUykvuMr5xZfHNlkoqwfZViU+h2ORt+5QTKiCCloBOoeXaH0ZU6/pzT4JjchE1gzDaxn56WqRz5mybKtcgIZLqwzaP5g/oV4qNXvjw94gACODh7p2IBVHgKwhAHmuGZK+N1pC/v8jKUezhVrl1Ra3gcs6on04zfCgRdI17xmUF7GPBvFgCqsAAuzZGXl51FLeso5MCA1CJWQAK3IbgIdVtSUXL9W1jVTFPIwwLx46nwyGZC28nwQ9dYy4TNy7sEhR4tGMAgCuyZHS27OdMbOGg0CZ7yN91mquQPIaWCKdIpWOb5Ti5b0bP+P1z5i8WOHmfOhBCSbFFR/RfRbdbq3xtvfvGLPP1G6WFVUW0G0V/gYbbZj15hK2VzRtYcggGEACXkskg57tVoxLvvTe1gaRvfROu7S2/Rmly7wQjzFaplIo5QPtYZVt0vcxu73BOo2WnEmlSu1eQ2MnPGhkMgByAVNu+avzAirCwLMNInw9jUvda9HWS432CIQk0fZJd4PQzZph0dwTaBl+4/8GJPmq1vsP4PN+dIY9Nqs8u1r0W+GbBXlYDExh/t+5aF+8Ynnzyh//h6yYabJ3XdXrPzWnfH5d4zTwTsO8oroWTlKPSZI+2LIN03o2ic0Y/Tv9C+jm9rbFCFevU5AEZ7ePPygFryo383LZwKLp95YViVXNeYUmwzPuXDTWC6+egyhUVEDMg1XHgk6UJpXUM8h6JPbe436rb+4bmS4IodwCgag9/bqsvIoTGq84oQpq/Cv+Z1wsnimF8ggakLoUdg6M62cewWmD/jtWV5LbxP6cs9x0SX3KDPdzRh0/SzrNaQplMP15lEi9OnnnuPFqCkHDLCzz4XFlhAufAACllWANw2ZmMUZvLQbOzaMABEv1UaCoAABcc0Gpu1I0S4UgLGdRJEaBtAkaltBpQeOb0LjHc3yENq2u+ONWCUAIvxAdEZhW4Z+rNZiGy39VszsQHdTCLn8I5ubEXcdpBnqfowoNllRM/r9sN6CBe3fAJv1daA53U1ouK4hBlO18dZmhMX7SwEmsU3xzukdR8fgnvF7zHoPp5ab0il79nNubrf7a2HZi0FXHmAoV8VipRIdOj1r/rsEcqCM8o5vUEWITM9QIjqkGrd3yJ8iCwBgFxqfgXLdwS4qWyXgYis3oJps1sZSVZGoLj0/UFOsuBvOYSwmXVRjSKr6DmXINVSNU55N0THSUpDjUT7PcAnhPm5D0gxf1Tvt6Fehp4QbABr8T/INzZ3EYFH9GiELDfVhnSS/M+UTSqkqU7XQ3NuWP4y2SUsxDnVOHjiunDh1E+c+UGRp/pwFx5r7AEQDDsksjG8iPf2qfXl8CTbCQ23ixfAO+gdShuhTLFkXLNOIXxk4JLI5ZPdakm2luDEuFXH4v8k3ujHCwys+/7yk571dLQHuenKBK6nD7wCMWrm9HYM7mkJOEj+jEW6dWEi4hZ4s7Je4mB40RCyt6wiTBFpoB38xjV/2HJiJPKclVomaAk7RcvHI+vUY/1OhSetmJeA8vM6yqaPMeP6OcDyzKpmcs16BcSXOl2QxdM7ftpUkYkybmFHKpWla9fQu1ueqQSIAlRGbvRlKtvtRB4DjH+miC7mtj6znDEc846j5CHCrPLHZspTTDo6wylTHYNWULLkzWUfvxHfLFBoDfSfpWnlZgczQVL3l+FjhvJl1seOyS1BnlM8UQSnfvFBKeBb/Zs/CR+0eHN9MLjxPIziT/gf3WGij/Q+8Rb+ppY5SosIflo0sDuDUvLUGSAOzBdBHwTVP+bDPjZUy9WXZFhbRMfmYClpu/JDtaolkSebloSr9t6OsDG6qoUf1Mtq+UYsMPS+QQbAEmW4dUzmrh9G8WbZz2XyTMM4/yGM26Qidal0d49ME3vRQidD+Zb3TflhqMdKVQwdgRVfY2t0DxCxMelgkefKlX247cHabmJDYVvUR2zgx2Q2acwn5Cvj6WY1KBGbWLRcKO2bEgWKeTyGteaS1fujQbcmTyd8eHSL0WqKZEhtrZjYdc7exv1SzqnAT1sRJ4YkI0YmVyk3pREihrCswTjqe5zK/btBLmBPGiFWfcj1iCRQUZHGE7Eu0qiIIRjP+kC7ji34udOJEnhAvmoj/Vtgjxe5WTJ43s6D2sfVJCvvKpc/BnDGIugc8XX7r6MAETGyBOlp6Aq2zE9PB5sfk4Kf7S2SRyQ/FCwH2JA3BPIe7Llt7tCAkNMYzeejCyBnSl5wYzqsQgHQ3AyN1I3wRBN2N8gXM2ucbTyxgxupI30Ybnzgoa8gtmqE4j5Y2oWOE24K+2tb50YLNSkxpEZym55BW3LPAHPON7bjXHEqHll876Ya2DJcNRIaE6NNgN7wfbOMmGw7wZ0el1LCJgRM/TA8VOZUjj9eN+RujU47j0DdH9qvCNv0vAIzcVbLq9zANJJ4T+zvBi4hRBJRudDYOTqPywKlFwxRf6cbAI1JuW9v8JYjlE0OXWUskRhppV8yHMxdkVkmTN7inGMvm4ugcCTm2xEcZSINehHz5tjwf4CbEJHcS8iildo7tW4EdkOnf3C3HAUh+cfi/qOgl0xk+gh9ioqvyH0SxLW1c2pNojcu0f/E69WZRWvHJeKBAnqt2L+5+Dnz6RdHX+IzkKy49OqlAzhAKu5mftN1fGzMff9w4Wo0kmvLR/2fGP2Ygvx3eeEGrYKerE9hp5RlXbFShY0oAKWah+F466lXF9JverX3TyoJjkJ90FDhhSnS+vqGXpkPlvEg8UNCqn809xrNRzEjWT3oSN6UFtZ54gBhJ/04BuZiUmOuBUBieq462yPiYR2pXD2DxNafJA3ky/uuXYbeAT4i8g8v3Yx5nKc0lfiHWPbPmDuXAps7A42PSJLjm79V8u/vODsbbmGQjw6rMfoBBHPEjUJ8Uso9BtkXVBGnkTj0m3KNbdWoJUWq3hjuPaVsj5bZQYtPuqns2uEcdxwUgUTOWQOL2yiITAxyG4gRrvIleQD5ePAW+8Qep4ihb3tKDSrWK1Fr10Z1yb+jfg31nxGcUzOZzVHd2/c1uU/lW5ZVtVthc3Iuy96OzniNXTSMYoeY5xuEKqzl+2DfTJs8TQzRnfsiSuQoVOdD4JC5p8uiae81w2MH2lQEXwYT7hl8CSRr6edoDVS4L77R3oDttaco0V++hvEU2r7NsX21C6KN0pvrogBv0lCmvCc2eUA6t6pUNNuI/xEOflXmcQRvB0FlzJClLIoXqkp8V7YtGgTgIOtiPM2WcDfgEBZ7BMwy8TReoDweG3KIrK3o7Ns216Oq8VjWdVJiDXc++08UN++uxpvjeQhTslWh3ySd0I5gKiGAP5uzJFhdpMSoKQ7uMv/s5O7ABd619STu+sgKKZiQhGyNMvjpS57fAz7plwth0RfVOW8xYbn+g3+zHEkv+AdgBFyuyReaLUKPsMwx/HkZ0iBeJ5nT8ulipnN/BcPNQEf618fgqIp6H2qyBsoJ2Sa/cTnuDPGV5rpfeB45UOTVljQuh55FbthGpW55AoQzzvZFPRCZfbmGFzsBl64YbDOA+IVToffYHR5rv1SBnhJBmGXztkrHsOke3sTIh9zcBM5SJMGxDZfx5MPWOjzmwcfxctecvyzJYqVM9Ey70q8vfZm3QRIqS47WCDDG5Wq0Ui9ABpjbxrdK7Ax9PjelT296HYTvAwlOI5i7LhjC87W0eRpXa6okzEMceCtX8tAqJZNACmt91i7MTjZI6Do2WgdrMAk5T2Ho6jsQ5MHlC3+gepFuBfx2ER+Py5/J4J7W623gN1IMvzzmWQjUE5ZClU3/AR0LLVvCDQu3g6ffGlYdoj7oCk8RMc4/VeaNQj2KIiKwcgQRjIu4hSYaPWrsCWodYyVUEA1f6/AzM7jf7nYNs+6/UBU5iAGXvXr3/dSe10Km/9qoOcXCrScRiEEthsFCpW9hvebnwBhW8/jo8gUo8oRnQO2tYXPcXiJt9Lx/i5Qd945eI3s1CleQmr4EnCb1z67+OiJ2dAtlvrvlMUbkAQicFUjVrX0puOTqeICB2oTwKp6olyL8WFILFfm21yaqjAsxjBtzyGSkgYEw8BD2BeAmq8YODgl0wk/cf/wJAjfTpBZv4SjlnLlqoc6ka5VqxIglxbmlkdmwVdR1OyVCEC3Lregp0nAa30P71GrT8xnV5lR1JsVYFYniWdcloGLhwR0KSbnM+wnggyzF0nEf6heGkJJzGohIYffiwJCffQMB65xbZmOd0jyo/VPVwXGLIj2vESmoTxzW9aGmM0XV0PHlX9gpgFh7UiU4Jocn8zkb/lYRk/IysDZbfOhtGehgRlfXOFuDo0Haue9oXlTylPF/5/V34PlPWtswyLqoHhA/Lu54z1DcnZt4egmYpXo5vonFgfPUROP2uTC+RxHjNLBxHHghPkvz/EmSxYybE2kgBQ4eUox/vcqFtUeM2+Ck/Cz2x4ZK2yq08ITI1AHyvjO9ABtUMSihXibwCYmjObfJYMcARQqY/QSjDkvjyGIF23wTCXXh0PFNwjzOGpdaB8GTiEFoDJHzIIeX6VLH2DTXdG9dmNqNdNir5Dhd5Jq5AK4UwfCZnn8L/A+bKXBIKQU0lSJ5MRjvVW3pQhrB9fLMqYlL9bL0f1w5rsAodUcNTwN7WxfymixW9cJW4IuzxR69Jtnb/4/JP050lwok+kJEziwfhHRdykH4dEkaGDznWJR3TsJQekwBTOBnoIhEAEqZJjQQy0u72BvVeILv3RDIC7th9Dh5BKTGaEsSQsgZUwbm9Qo0eKKWlaXpof89lngw9a8gwY1ER98dosP1OpMCa6ks+DOtgrSkqNAeEmAQ5kJzyT3xHqCrakrQNcx6m6/KKVM1D+29/YcFQ3ocaL9Pq/EIPasTvoiX185tR+T2uFNj5pDrTPlUTwlcEO7LWPmNM4IQry7JSeOeqNLXb2N9PhUbHLw6Hzkn2R5v9iOkMhYpyFolFv03CJZ3Un4qlhuSsCCNi4d60k3WeQ0fTB3TfXY3M9iB6flELgYYgsw3Q21h0VYItvZsUC656CGWcZwBIaEwXKTYkdmSR9FaTwskzI57bJYK+V+rXHea1LRYaV2XXKpQDNQEgLl/oMSQ6aqp5bgpgJ+di84RSxPnBR8NldAaNdZbMwNQudUSG7qKx5q/h1aEmcI4mirQtAwXa9+OKGvyl6SgWPJDSDi+5WjmS6gyOWJcfHWHQ91aMZyO3xMxRXc8CyZBjBI3BsIymo/Ibtgr75giPI7uy6fo9TvaF2iy/Tc4Cp4d4UOYZ3zAj6DCbrK7FupOZVoP/lcyYAi6igZlZQnT04XMBIugXLvcW36zOXHehSMdg8eM62hMgGOGAIwVmBJv2UuTzUeE6dh+3mHdcZormI/0D7qedJ1j8ggW4UDoKUnf8wqSOiT8/9Vh72xBMj0VYAaqwoS8bfU/U78yNSBK1gjXAAAA\",\n \"assets/pay_tutorials/cashapp-2.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/cashapp-3.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/cashapp-4.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/cashapp-5.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/cashapp-6.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/coinbase-1.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/coinbase-2.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/fixedfloat-1.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/fixedfloat-2.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/kraken-1.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/kraken-2.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/kraken-3.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/kraken-4.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/strike-1.webp\":\n \"data:image/webp;base64,UklGRmAgAABXRUJQVlA4WAoAAAAQAAAAcQEAHwMAQUxQSHkAAAABP0CmAZFIIVEUUkkQlwkSEbHglQlUkW1jRgQSeBJIoYDRQP8m93cj+j8Bb1fm459K/c7Y+oqtFf/zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//zP//L44qtzdj6ie2+Hdr4AFZQOCDAHwAA0OgAnQEqcgEgAz7tcrFVODmrpiLySbEwHYlpbuFwOl6tcyn5HktOZ5Nb13if7Keur5gHOw//e6G/Z70QOsN9C3pkP8hkxHn7/Cdt3+s/t3kf48Ph+f7mDrY/fjz/6F/8Pwz+XGoR+U/0rwYdo7bb0CPbD7l32X+16N/pn+s9gPy/7671v2A/6b/mvVf/zvKd+f/8v2EhaF0qBIm+XQdy5jfLm2hugTjMYnQRtmui+tGw0eYW797IQHaWHPun9MO5VgQxHdhHpVUfC8oPZcf59D5GvxfYgu5slChOObiwcmw6YROy0ug7lzJR70dvy+qn3RL9RUZewFh0qBIm+MgvS56Gcn8aWjTLFM1uMetISOx2As9AdpeSUp9sQ3rohIm+XQdn7txExhRqfutxs6GeJuh+DHL5Id+wblSLHVNK83Mvfm6QVG+XQdyzMdMD299hVjlzuISsvZl0OlQJE3y7lUSJvl0HcuY3y6DuXMb5dB3LmN36vxCplI259jfLoO5cxvl0HOOvOwTJYQ2phopiwY1EUod+XQdy5jMqg/lzuylpp+nz1CNAh6rvhCIaGOHSoEiZbHC7P3Jj7pC7AOhvLKhX2Rf7B9M8PxRvPqorALVkpY2SwG+OrzigcOgQsaEsFb+jcWURwHjL6ZBlu5tbbJCKyheJfNZneqfZL/rUpRhk8prjCx2OkTSh1dzmySpYnie27z+TDsuYBi6zAODC3BTv3yWL7g4Qbc5UMgtBpMLI/v9QR8t6CKvTYFEgogHO7Zx6mHMKJAAJGz/7e5xMsv3zBBI8GoodmQ0V45V8XaDkYSC9jK7hQb4VB/zuXwOGVnbTa8wISzIRJBVU7XJWhqjKjR+bkKcvmgkCVy11v6QTGvJdLheFcg9lbKDaZhgAz0IFQstSbdFuHL0+bESwMjbcumyJnhW4zbqa1UmN80NE82MljAxMFmOEDWuJEHjdgOo4uUTfLoO37TwtVNBWGfq2KlQ19A8R/pkyXKiYZzFPY8M+jYS6DuXMb5dBLxtveuew4vV+v5vdxTBs8uY3y6DuXMb5dB3LhvSvIdyL9DDuXMb5dB3LmMt3o9hOnaBgFn9MO5cxvl0D0Vm+DWnO47e5iPs9AdTT+7PQHUyxlsvGou5gAE13iKq4VnyMTx/RtmpisWT/mr0B1Mw7UyrUgv9zWm/nwsh7UykDVjrIvV3zrp/dU3cXX9ZeVvV6dMpn/50INx2O56q+g7lzG73lpsKyDnmJ2bg0sjPxL7rOg3Rf7y+pPkEOIN6MMqJvl0SBX57Usd6zzRsiwo18gZW4nOC+obKib5dBzaLVL4vNT0coNVIcYeDA557l9KgK0KqYTeyr/wxwM8GPJQ8vZuBfb4OQDHedagiAAiZcl2iIK9TvIwwgm8Pktn7DXiMsPPsdas4EhOVRQUMyOD6yo7qfZRrO/e3kyUkQXwJqla0tgU90IgWVL9xnR0GF+ON13htDN3l7LmTrCmWqfioXcHedfUHNnwJBdq4+QzbLNYz6JeN1u0zGBUWbRGO6JCHc6/zA+lU3M3vO5bKdvC/aJj0ic/WVE4M8kXvCviuyJjiEfhs9U05V6A6g8YC/wupJAMY1NRIaU3wa0l86glNUsryyC0tQRk18rHEcJ2F17+nKQTqiHBk3R32BUB1flqb91sWhzdTGZM32ixkUS0vn2MwBFG0bk332HkR5EUa3mF5qYo1Sv6LvTLdmTk0/uyAYphs12piQQKl2T20DO0Q1eUATVDxBg/UCgUCnqVD6A6mfdh9lasytn46cidzav/SBAgHSF/b6NLWsvAliTGopz4SWmn9gkSISJaCVzZs+RW1hH3hKx/OkZqKjvwDBPC1RvlrRCQL3tdo5sGIAte1/THbbhpUeGMAO5W0HR1cxvl13w91+n0mRqDLsRHSi6LmPKyIJpH2rDKihR6FPzozLrHbo6glO5UsT+lYOWf8TbaPyzThyQib5EMJ/Zx5SF9HOHr9I7XmDJ8M0xDqhl7dr3IOL7VO7mLwjGtXd/BdcuGJrrFSesq9AZm7Al52/7w5O8ylL7PMHSTKB/16jJoWD63u5wLZ5bwaJTFrijopIm+WmFcpog7qTeHgDQPU7alXxsB3TGy9hEDzRV+SZEy9pf5OIQXLGAzB3O7ZcepjrmzfLoO3vFkVYS/ZW5Czyjpqq8CorYQiEbHjWyl1fjM5GyKO7UO2yh/ET/mrwczyPAkTZS1WfOWGgiQ+gOpp/dnoDpaaHkdo4iarwx5X4f7j7N4c5F9e77GkoUEc+gA5aE6yawH04q6C16wswR90hUJEmgE0W0MxyfEVIULcvW0QuJ3/gByVuilol8HIO3p1okJxMMO5cRl3GTbzglcehbO5tWg+pYosmEGFXLO8wMm4Ftw6VAViZVT3pjpy1fcUAU/R697mAzTIShwH2NbvkXIWZq+ZoKTJxTj04JIm+XQdvsRSYanagxO7ruuQwrrJswZXq5f6uEydofDogcrxAhCY3yzgA/v18kFF8B3JbXjtrxsfGa3pIujAa1q4BTJ7FQvi/182OhH/WbE8e5jbX0iK3TlL+2RDsL7DcXg+WtJJ4kGTb5GqxxUPwt3rqFJM5qlCu6DuOc1VQc4cLBo63JKGN/VBnqal8eQfdZ2ry+XH5TVj4d/qiNCB1vtwua1wbAaz32ShmOa9MEK6Wgoa+R3evsVQd9FRtL8NKXupOTtE37IjsNz7e0yru0NfMSALRPTrhg1mwIlSmUKPM009rei5XBjrQ5t0VSglDZOgbfz3ECiBbqyx9HaO4+Xr7EcD/KIuucWamaNGUY+DLC5lvcLMqr46hWwJGbTMINV9lI0Ix8pqXkAi03WBmWlm7ugxDS8XYd9DEfYQ6BmhjfzV+73qwfkllAX4HBp+ZEMl884YzBYaFkdo3I62crGFztOjDSbapYpbbTNGXxSTQJeCxnxUA4zbv6oXdbjmdGu+Mre2YkdarqLvkfREJrzqR6O00WqcXkbOFmz5KGw637A001UURqCSe4a66+T4AhyvAmmB9NoWQoZQZcufCi40mwHxQgwABet09aANuF/9qgynmn7aQcmdU0343+9bjUPPuCAX3mV36S/dHGCOZxjjF+SEB6lwMR5ywxlVpBARNii9k1ie9/75nEdMmuH/eXTxgY9ui3n2PY+fscjXuSmsYerkWWr72lTpvshECcm+fdaafO4dZTc0AKXu4QryQDXQ0QxiTaEKQK+YIpqJ5W+f0ursrH1vmCGvizd781STtA6LnBAIlsL/J+uAY1UILEJNH2njM2K+sWWBeyWWh7/mzzqFNSwsbsCpoR+dvT0c0AITa84/U1NrCpAtnzsvAU98THY6tX9Eog3YLLvlgr2Vy1nVfxzxydDXjfLDZUL0maEySEK3mkNee6YYZS2UEHuxCvF4g4e7m6Xi0VDgp1ir8QoC2sdWVsjL2zIzpXDhAFpPt+HwWCoTQAAAKpfBH6OCHReHJKvhWxrYyJy10/f2rj3IjULXyXpMbVTgq/BY+99dIqwhOTpo5eHCgFQ0TIAtrzsm1o/zb00AOz0Be3z9sdJRL2H5ur35Iq6OrOWotJ9kjJtnaV8xAtxQCKaxjlUfCTGr6BQFwE76xsBrduEoWS3BR9S2YPnNGV0nEcHkbN+Y4Ixo9uqjeWppysfrwCEnQgkDKz87Y9rRWCXPRCwODaMERXY31HN8yU9NYWubJohuR2TBFAUPDoeqrHNz5TS/9W8ANLwDVn+tHlIST/y3CAcbwZmrfrZ9NlZZUsa/HuQylPx/+EePEE0Qj45Qnn1ChU7MgqyzL1gGNL8/DtfGOK9OfkuxShfjhGTlEFemV5S3NsMFcmt2A7gkRphXuUepqWjlKVcPiBpxU+bZ5tObwO+A37lleAPND3NGWNOcDXBlY68n0s06ljv7r0J5KYt5eWDulr1yxB3Y631kLi9xntt/r9PT6jFSQEI+WHDHygW5PoKh+xt4nRQBpICnEEc47btep9yreEu+rEMSel1JzoM4V8l4dhL3COgAViVpa0S3Bbm+71syMFlJVgvVCP+80yTYo5E3emtr1+rTapY78jnhM5MDAcg67Z59djr6zeEXSxYktVjoqqCDNLFlqtKLvTYwFFi0qjeo+9+ZEoJtw2zkQYWQY2g2M5Ax9fUxz8068dEo9jmtOoKHBRta02yB3kO4+3FsgF/CmrgKZC//iapkqfpuCdqRwWaQQLGpH8hnflBQ0fRtpohsfg/E2gY3ltuqd73gb1jIviXqHSFL1Uk8+6o+Qz6zD6DFWgp0cU0gBV70/Ke6k7y5BhoJzo55qSK9nLnn2UXUNwcLLknf2ApRtuLbxXe4PGfGN8207bcHGciKG47g7cJyUlde6khWPfMztCTeYFRXzY6YTYcpNJu7RtxNDpoUA/IgyvQb+G9p4mRDopvvz7kGMYiGCXToLaLSm0uo8UnyH/Gs3ctjbsqC2DyfdO8FZAthsUhDI2VWiBaomFXaAJsTDM3ynxhaLY28cCXRrhZi7FF58E8vAEUXjtoBZ1nCO7A9y97EwYPhTov9jt2n0jsCTiQwrAXoPhu6/h98QMfIh0hLLrUnF9lhXDm18g54wugNDO7ZaLHYNzvlbceLGKbEy0Ann/uDUy7OioICLLzJ+rL+uZjMXB+CIJ6OEwiwWr84h2If+nheQr6qmp6mUFFGuiT+glhH/7FdO0bTcNnCF37b4CCSXXugVytwQLQlIb2RE4mC4NC1YX5i027uXbcniSTLvLs47xO5WRmehXkMF9LUBn0ILzNi1DBv7WRnqc1DE5bQh3JZ30ePgYRsWPamG5Qfr76pBhkppYFW+YV2GKHbAENTb6stVC93TW7GZFfFyDfekcTuqPadfSdaabHG3bz3ywj16arwYW3dS5534PAUgk8nsbLHd/083VW+FUeHB+qcSp4AvACurFudlI4KfEUqvv7XMGm9Yat5ky/LHR4gXoTv3PKWLIzQUn+w0HmEICIsrEb4UJNAwtwpJFzqQKIsUzaJKGsIxMWI8vD/rvyyZQsJtwXB3kU8GUeYl1GzyWzf6RBp26JOAWdngjhvsn9H+seAbnYrt//zJrAQOwfs/5TlFREAdpKL1Vm7Us5c5k2gNeReRlqEHUpxCkU76MmJxJ6mMO4640DMBV3AfV1VZmvNuAbJlQ8doOZ+bevMvlNQ0tfyGdMHvyo8BVgHatY6+pRrD2gt0Rs8PtslBUnAoik0YsCCcoSNCS1mHwDVVlPA8F/AKi7pBrrgzh4ClWBgCpVqNvdPz6Coxe+gTtSE9db8tTwKnSUW1CP3rTf0lTROjmGTSytGGqtI3/v2cKhEaFK4COU7zttVESHIEztTLW/dDVB2ld/nsQxVLwqbaDJp7kJ4DTD/ZnQySXjnhSq57uYoBaMG8oLb+jJEfRnsxVV7LyInd6uDdtwB8EyXvRogNplrmkXJtr5mJJEKV6qF5y6KPlEHNWJkdQBqOkyw4Gf4bwlA8Z2MPSkceML9hdOZYVWTr83/f78SI6Pw8GmRsar9gyh/eUyiYbPVMyDrxjDZVDjwgE/BAl6NPj6hGiRlLC0E9HC5MOw4t3zD9U/d1uhzf8TALiyxsEkSX9yURvJGaFZ6IQtPG0KrNMztjYEWVTL0fR83VtgaECgPcacmyH1FFbfyAyW+3tahZklXcDxAdbrIOJ6m/f+hNYPMrMqxjY8qMuqR0butM9s3yqk9Lrql3eqQxHooAFq8K5n005u/Lz8LRnn0e4zOO68uEi0f+/h1ncDz9Qz8Dk1WPDcXWId1Pej9Q/J5ecB2FAlPq97Oq30gzdyfeyRB1MwaDLVajy/Z2b5mQMd/h5+D51LUx90eeEp7tZV0dZt3ROVeCVi1xtSwVLt5ZsjV+nw2wU9JgXWQI+ouzihd0VAmQWaOobynxseMXQTczh3B7fTbIHvWZIyFFU4dpr5ggwIlDsX2iL4UlEPoAJqUB5pFqgUul8Obr0hDkhw+PO6WIC7tp4YAF2wPi+SUM9L4Zww1jOlqiXAXv68gLMzsd3/WTcb+XoUJUiudvNfwJj8jClyvT2TwfZkZXebxqE+PWtiSJvYb368u5Ra+M6IEk6aRzEgLIdwqvBjPxk18hUDDvYy81DLNIe6uEcE+ttX7/5DnLjhAyJHSodpFBMNKmKUcggjDc6lB56YUHr1ce9j7AhLbHJdk0N+MrQ8frBxKl4lKqLuHpGXaVaSp4z8Ioi4kqkuM2+GYAwxXXyy/vavnkCNRCf2tQ13B6CJ1RC5vrDdaIsGFJ19RUsIFCua37/L8ojp3E+eWeTe6Hqh0kit7pHK8LtG1UeIOfG+/ZYBrriwz0L7CHNA+VTFzp6Q8ifSX8f+RaaQpLTXtXTwlnmToN3/VieGImrs/IIaCkgjxMcKniB2K7oVAkPOevQQXYHVlTl6M+NLMr0stP8DEAbKBKNq21u36GSLtUfyR/+gSb6YlOZ8aP8kHvpkyqE5T1n0Tu7/uXfCbrOiIHo5ffRi0D6cv0r+TEw+ckf2eo4QyPxnly1icuvI4/T8Blou1SqPaNb8qnkafWf8XbBDPugQmG4OPnySfOrBw6nSwK5Wak7VDKriuo/h9HwZCBJHEuV/H/XXytLXfxqqcW8rgyPZm2OSDhzlpffGRBicle7/T3tbgtFcF3ewoteDmWiDuaX1ZM1lRwoYQ9s2X/6ceCBRRNtxFS1gw3KlxIoa84bmzt8dc4mPL8IjQhf27YWj7nOORj8ZOqMf4X+I8EP0MqcjwOy/DdWk3XPp76S3Kj4TVEe6NZyNerxIxFoWbw23hvUoIbFH892cGWnTuA1pgwyjhS8HWXaVrgjXfGyQdIkUbyGGRACtxNqH+ZhuYOuhF9Dm1StuUxJMB6lsh7yPzFBupIZGkFbffxVcgnyO/OHE3mWvCVM7Xy6Se9JTE68ddMeu7f0UTfLfr8eB/b8O3k4znFPV4kIVVcz+82DnY14P7BEQAcIPea6LR9W93Xr6QejODxRuU5A1XyxwDTsKXYb0rI1qhvZiPu7Pvvkfq7Me+yAx3UJdJNEG9jDzO7Hhv4/KohfHWgw6oBpa9WzZuKWEscOdWhVQ1QGGa0pFBXLWCOMa2xjt+9XQn07cmKC9BLpi5JBz1SHW6tvVFuBjL9Dkw6alNB5TARCnIEVT9OIRbHqiOFUO9jUntZUWg4eL5YMKvzUWTf390KQNsbncmoNx6rITIaCRuZwjuuLX3NDQ9J3SK0n48D85iFQQKXY3poCfIySRkfsNyPj/joOlOhexn9WXZJlE5PGm4H4yKgQ24I+KQgPuBhyW816z81ZeNV7and8eAnuqWrx+FzCexAqCW8u1eB3YA7xRNUnOxvu3mPahCFJxIeJF1M+cQA1/j3Au60SihLJvM6OvskMHDUC8x69QLbknuMrh1Tg2qjBZ1gsbOilosQob0GEXkhTYJF5N3tXaRY0x4BgcHC5m/mHlhbFcNMlOvO7hcDpTxerYPDEZw8raLM7jV24TzifpecA6uI5cecqgDVvxYKqRkooMeSVzi298bfCe1boaoiFmvErn5eroUJZ7LXeZjw3WxhMQWI8RfPsdXq/Zdj51PgnVKXBIwsAt5u/N8nEmJifzrHrgjbrsvbswa0Jb4ghJjUWBDspjxpyhmQr4lUM6hyYwQ+lxcokeUGP/Mzx8beml8FLJzHK4nhd8U+cb+1UBZ8L1suIRZumkj49t5C0PCslPoB5eHfE9Mhfy+CAEgRgcgNHOWwZL/DV+ci/xviRQV70MARXpkPrPRB5HsvDavkud5b5a3TzqM4tsq6EYQ9vCz7/Fdb+lidFe6MsNTk7mPx4H7gRcSIzNdxaCOqHYK8UrR0l5+96JglUlWFt7FS9vDJ3mbwF4gfAX7vcCT2VOGguOeATj11s2uCX46QBJL5aAEqpOAnnrezxXgNIp10ddfFjGoUX3UmhVAPQbr1dLL6s0chSo822bVgaG7QGe5lFJcgoGXQFQAqNwpc8pNxHc71Fgx/uH8vXrFUPGPWzZz3FSqX/Dv2wq0Y1AoBzhcAKdqdiIG9bnLg02G+DapxgLR6EsyYMEu40IUZt30rxgHcZmMvDL/51YRUi3WIDrOL2n908umwOc9mPZtP+DIWcC/RkIZEA2mWyUEVgU2en/MwxKTjIQ5GPxla6nSCfyctJsVURiiXezRdbOEPvo0MFVKfjHR4ORmAiL+y2KYAgGb4Ar1fsrNMVL4E/Hgabs+GKcWFmGeG0wJKTxM+qq/gI4O40oWqG9peosqjOCx8vRTatC8rVXUt+PHvaQ+BxWVUA226rAsFzJ35pb0hA3EmdSlBO0Biy9282X8uWnD4HvVL6QHxiXF4tQFae0lWqWQCGTgBlWw6nPuim/+OJTTWOX+WW4Pvqx7cqX7lJf7eBo/u7LeQ0MUpuP8efOIzG8N+X+F4hW7jUQ4wxHRDbWf3x9TMET2wE3UMTGS+2NupDKEAtI0QXwRe9ifCRpD1YNRHkWO2ftl4CzJfdGpFhuI1rsBSCokDmk/Hgb+pux5Ip2Xyu0Q5RH3/l8AfkiHI05fgWq/S0aYLNpK3Z6+6mWUzAwHqObO/E6V0r46HZZ+WoRp/EGY5TtfYYuR4d9CYRYzGTqnRZ+3NaNPooSWxmYZ6wX3HfwX+EWoXWTya4XL2ULVAsxcBdli9HCmllwhHzMGGVwqFUOO2fpeYPh6ouTDzhgH5eHq1HT6CD2roO3ssB0GNuh926evjAODNpR48NbHjkCpnR1AUXfdSBIOChJD29G2vd+vPReUq5o831LvEjvg0ES7vY4BiT9cChYxqlBL5lt6GjOevtID6PyL98c5/xh8rI7EtHghESrBs0VuvKZIEPzit3xFNgQDOp4uxcCQdds1Uw58TYIEEWuTE1jSPkQ/L1qiGif5e+KWWCRQTM43ecd7Ia/GT2DVXJ7Bn0NPMvu9vatnukYXlwdypYRXTTvK2ZzvFF2evs6c5CqwYI9zVx8kL5OY2cxvf1mAfsfeVf/XU0TG08Btdy9z+G+9jK4OZbdv1/TqWSb5lYLZuEFSQkE/FnegDTxv3ixp2AEJm/jbW95p43yodOeEUaC/R3RiVKXr5wM3EVaQzGHNruTBsbPGH5JRXtT5+MRFSe8V7yJ7uuqtXxQBhjGJewOU1KXEdkQs9tiuPr6gKW6pmCfFAY7M+LMYdkhXsvS3gA0xwLazvwzpdaqaPAidRZDRg1gi8mTSqr1h2mk02ayPWBLSe25ARSHOhBW5kwgPNkAnpQfM0JTWgoxmUIFXwjJ4hcqcOtoDA7y1D52tQhktQ8/KkZm5E3qvuvSOQlscPFnH1JHfJA7fREL/zlKtTmE1YDYGzPMVvwiiFB0nKpHAhMYkK3gExLQChXVgC5tSrUeatPyrNoh8kQMcF9QxYB/VlzCIUry6PevpPP0/e70VbIb87AGqTVDA/GyduC2BLaLe/85VywW3KRh6j4+7j9WM1Z5znbnWgP22hbE08RRyIskmSMN0yVeyozOrl+qMHKeex8q3hstdLQ4RytjbVoNrx8ltnfAw1pBGR9ZXFRNrbQwrnZwEta0RNDWfxNInqff1olaqcVuDxh6xa0sNxOfud+zOOScCwX0E7N0283HrYYAqu+ZWYrzCZvyE1xaB9I7KJURM3eomQakBZTcyb7vgjY7ktsOxh6TDwe+M6LD0BO5+tRM7r18XdgPhHnHIIxlZdCSzPfC520pu3iwK0unUOCVwYifEYdNxZlwMqMJsI943dOZHezTczv77/X3EfG+3DWGWTWlhjY3LJcdV8DaU3CUMPcXrKB/KNDk4pawZquUTKegiFpKBCgjCssVbv6fLeGov5adyOTD36nABQobg9MHK21p4olyU02RyWI+sjCTQ8JSz5F5yLDIEFREfSZSNvp4uG0PYaHCWKiToJGzyaJwKKofjB6x3vu4p1KyaAaaOSegzIudLSahwFRQUjaR/EOeROiS7CngcIuByQQVU5cxLQsBdxGQnQTW+LK77lpFSkr5nGFabQqqiFs7+ly5Z94gNY4RGgltgiGRKnw91J5vpUaqeN/VdA2vVKQawSVGQZkOD0MGhwydrDymjMUN+HEsYE4D5pSOU8am/h6wegDaMVzLgGPL3ia2gxGpa1dKY4dF+xIemcNaKNdl5BEnUe5vciFZPeaXOr14QZg/bvfaQ9+OKlPOtSyGnVkn4PHGFgvKKNO5llXFvwUGjzqM32e2EDMnz7cR6AW5FBmJdko12vS6nhoB7xBU7FFgGTsFEVxpqlQfTkWvGrkvTvUGRfq/1UODFIT9bOnwau1BmvO5Ll5St0k15ENQyAYEZcHdYsjPv4yALic+m1b+yrsY00mXNRqAIFbY+nLj6N4j7Te3Ypg6i9Uqjnr2oiXLASQGmMSD1i5DkyJTniWu7SPwGIwxkrNjnh722LZ42RXsKAxsBi1a2m2EZ2AyZlV+bzlAt7bpcYJpoxBmHUIgHeBAwXHsnoohEGdPXi3ersSbIH6BGJ2fMLofzmgsrtvZr5V5bbW9HkctGaREtviU9h01QTrpU0xNOixW2hJbE75Ccd8GOhf5AkEUSchhWoEveRKbCgDoK2jxnBbXZDFoVizF37zqqUYOv9t7SuKycTfU7d1snKaCUN+oflTEEU6Dn3x9kcY1lGFi8sKGw46XllxUs0/fw8K3Rxu1JmCix1bTJK7dpdzWagCCmCjTh61EDKxcHNxUvpQJfNkGG5JP6BLkrdikM5wOa+87NIO0wWBDW9fHnOhqkkbM00G4RtOeXllAuhtjUUE6UVRIT0tDIIws7v9mEHWabhsqIBsQg9HGJmK1HtZEK8r8fQ05iwXQ2RlaSYHFZNyeiM2bOEo5ze4wAAAA==\",\n \"assets/pay_tutorials/strike-2.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/strike-3.webp\":\n \"data:image/webp;base64,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\",\n \"assets/pay_tutorials/strike-4.webp\":\n \"data:image/webp;base64,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\",\n});\n", "// can-promise has a crash in some versions of react native that dont have\n// standard global objects\n// https://github.com/soldair/node-qrcode/issues/157\n\nmodule.exports = function () {\n return typeof Promise === 'function' && Promise.prototype && Promise.prototype.then\n}\n", "let toSJISFunction\nconst CODEWORDS_COUNT = [\n 0, // Not used\n 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,\n 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,\n 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,\n 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706\n]\n\n/**\n * Returns the QR Code size for the specified version\n *\n * @param {Number} version QR Code version\n * @return {Number} size of QR code\n */\nexports.getSymbolSize = function getSymbolSize (version) {\n if (!version) throw new Error('\"version\" cannot be null or undefined')\n if (version < 1 || version > 40) throw new Error('\"version\" should be in range from 1 to 40')\n return version * 4 + 17\n}\n\n/**\n * Returns the total number of codewords used to store data and EC information.\n *\n * @param {Number} version QR Code version\n * @return {Number} Data length in bits\n */\nexports.getSymbolTotalCodewords = function getSymbolTotalCodewords (version) {\n return CODEWORDS_COUNT[version]\n}\n\n/**\n * Encode data with Bose-Chaudhuri-Hocquenghem\n *\n * @param {Number} data Value to encode\n * @return {Number} Encoded value\n */\nexports.getBCHDigit = function (data) {\n let digit = 0\n\n while (data !== 0) {\n digit++\n data >>>= 1\n }\n\n return digit\n}\n\nexports.setToSJISFunction = function setToSJISFunction (f) {\n if (typeof f !== 'function') {\n throw new Error('\"toSJISFunc\" is not a valid function.')\n }\n\n toSJISFunction = f\n}\n\nexports.isKanjiModeEnabled = function () {\n return typeof toSJISFunction !== 'undefined'\n}\n\nexports.toSJIS = function toSJIS (kanji) {\n return toSJISFunction(kanji)\n}\n", "exports.L = { bit: 1 }\nexports.M = { bit: 0 }\nexports.Q = { bit: 3 }\nexports.H = { bit: 2 }\n\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'l':\n case 'low':\n return exports.L\n\n case 'm':\n case 'medium':\n return exports.M\n\n case 'q':\n case 'quartile':\n return exports.Q\n\n case 'h':\n case 'high':\n return exports.H\n\n default:\n throw new Error('Unknown EC Level: ' + string)\n }\n}\n\nexports.isValid = function isValid (level) {\n return level && typeof level.bit !== 'undefined' &&\n level.bit >= 0 && level.bit < 4\n}\n\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n", "function BitBuffer () {\n this.buffer = []\n this.length = 0\n}\n\nBitBuffer.prototype = {\n\n get: function (index) {\n const bufIndex = Math.floor(index / 8)\n return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) === 1\n },\n\n put: function (num, length) {\n for (let i = 0; i < length; i++) {\n this.putBit(((num >>> (length - i - 1)) & 1) === 1)\n }\n },\n\n getLengthInBits: function () {\n return this.length\n },\n\n putBit: function (bit) {\n const bufIndex = Math.floor(this.length / 8)\n if (this.buffer.length <= bufIndex) {\n this.buffer.push(0)\n }\n\n if (bit) {\n this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))\n }\n\n this.length++\n }\n}\n\nmodule.exports = BitBuffer\n", "/**\n * Helper class to handle QR Code symbol modules\n *\n * @param {Number} size Symbol size\n */\nfunction BitMatrix (size) {\n if (!size || size < 1) {\n throw new Error('BitMatrix size must be defined and greater than 0')\n }\n\n this.size = size\n this.data = new Uint8Array(size * size)\n this.reservedBit = new Uint8Array(size * size)\n}\n\n/**\n * Set bit value at specified location\n * If reserved flag is set, this bit will be ignored during masking process\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n * @param {Boolean} reserved\n */\nBitMatrix.prototype.set = function (row, col, value, reserved) {\n const index = row * this.size + col\n this.data[index] = value\n if (reserved) this.reservedBit[index] = true\n}\n\n/**\n * Returns bit value at specified location\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.get = function (row, col) {\n return this.data[row * this.size + col]\n}\n\n/**\n * Applies xor operator at specified location\n * (used during masking process)\n *\n * @param {Number} row\n * @param {Number} col\n * @param {Boolean} value\n */\nBitMatrix.prototype.xor = function (row, col, value) {\n this.data[row * this.size + col] ^= value\n}\n\n/**\n * Check if bit at specified location is reserved\n *\n * @param {Number} row\n * @param {Number} col\n * @return {Boolean}\n */\nBitMatrix.prototype.isReserved = function (row, col) {\n return this.reservedBit[row * this.size + col]\n}\n\nmodule.exports = BitMatrix\n", "/**\n * Alignment pattern are fixed reference pattern in defined positions\n * in a matrix symbology, which enables the decode software to re-synchronise\n * the coordinate mapping of the image modules in the event of moderate amounts\n * of distortion of the image.\n *\n * Alignment patterns are present only in QR Code symbols of version 2 or larger\n * and their number depends on the symbol version.\n */\n\nconst getSymbolSize = require('./utils').getSymbolSize\n\n/**\n * Calculate the row/column coordinates of the center module of each alignment pattern\n * for the specified QR Code version.\n *\n * The alignment patterns are positioned symmetrically on either side of the diagonal\n * running from the top left corner of the symbol to the bottom right corner.\n *\n * Since positions are simmetrical only half of the coordinates are returned.\n * Each item of the array will represent in turn the x and y coordinate.\n * @see {@link getPositions}\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinate\n */\nexports.getRowColCoords = function getRowColCoords (version) {\n if (version === 1) return []\n\n const posCount = Math.floor(version / 7) + 2\n const size = getSymbolSize(version)\n const intervals = size === 145 ? 26 : Math.ceil((size - 13) / (2 * posCount - 2)) * 2\n const positions = [size - 7] // Last coord is always (size - 7)\n\n for (let i = 1; i < posCount - 1; i++) {\n positions[i] = positions[i - 1] - intervals\n }\n\n positions.push(6) // First coord is always 6\n\n return positions.reverse()\n}\n\n/**\n * Returns an array containing the positions of each alignment pattern.\n * Each array's element represent the center point of the pattern as (x, y) coordinates\n *\n * Coordinates are calculated expanding the row/column coordinates returned by {@link getRowColCoords}\n * and filtering out the items that overlaps with finder pattern\n *\n * @example\n * For a Version 7 symbol {@link getRowColCoords} returns values 6, 22 and 38.\n * The alignment patterns, therefore, are to be centered on (row, column)\n * positions (6,22), (22,6), (22,22), (22,38), (38,22), (38,38).\n * Note that the coordinates (6,6), (6,38), (38,6) are occupied by finder patterns\n * and are not therefore used for alignment patterns.\n *\n * let pos = getPositions(7)\n * // [[6,22], [22,6], [22,22], [22,38], [38,22], [38,38]]\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const coords = []\n const pos = exports.getRowColCoords(version)\n const posLength = pos.length\n\n for (let i = 0; i < posLength; i++) {\n for (let j = 0; j < posLength; j++) {\n // Skip if position is occupied by finder patterns\n if ((i === 0 && j === 0) || // top-left\n (i === 0 && j === posLength - 1) || // bottom-left\n (i === posLength - 1 && j === 0)) { // top-right\n continue\n }\n\n coords.push([pos[i], pos[j]])\n }\n }\n\n return coords\n}\n", "const getSymbolSize = require('./utils').getSymbolSize\nconst FINDER_PATTERN_SIZE = 7\n\n/**\n * Returns an array containing the positions of each finder pattern.\n * Each array's element represent the top-left point of the pattern as (x, y) coordinates\n *\n * @param {Number} version QR Code version\n * @return {Array} Array of coordinates\n */\nexports.getPositions = function getPositions (version) {\n const size = getSymbolSize(version)\n\n return [\n // top-left\n [0, 0],\n // top-right\n [size - FINDER_PATTERN_SIZE, 0],\n // bottom-left\n [0, size - FINDER_PATTERN_SIZE]\n ]\n}\n", "/**\n * Data mask pattern reference\n * @type {Object}\n */\nexports.Patterns = {\n PATTERN000: 0,\n PATTERN001: 1,\n PATTERN010: 2,\n PATTERN011: 3,\n PATTERN100: 4,\n PATTERN101: 5,\n PATTERN110: 6,\n PATTERN111: 7\n}\n\n/**\n * Weighted penalty scores for the undesirable features\n * @type {Object}\n */\nconst PenaltyScores = {\n N1: 3,\n N2: 3,\n N3: 40,\n N4: 10\n}\n\n/**\n * Check if mask pattern value is valid\n *\n * @param {Number} mask Mask pattern\n * @return {Boolean} true if valid, false otherwise\n */\nexports.isValid = function isValid (mask) {\n return mask != null && mask !== '' && !isNaN(mask) && mask >= 0 && mask <= 7\n}\n\n/**\n * Returns mask pattern from a value.\n * If value is not valid, returns undefined\n *\n * @param {Number|String} value Mask pattern value\n * @return {Number} Valid mask pattern or undefined\n */\nexports.from = function from (value) {\n return exports.isValid(value) ? parseInt(value, 10) : undefined\n}\n\n/**\n* Find adjacent modules in row/column with the same color\n* and assign a penalty value.\n*\n* Points: N1 + i\n* i is the amount by which the number of adjacent modules of the same color exceeds 5\n*/\nexports.getPenaltyN1 = function getPenaltyN1 (data) {\n const size = data.size\n let points = 0\n let sameCountCol = 0\n let sameCountRow = 0\n let lastCol = null\n let lastRow = null\n\n for (let row = 0; row < size; row++) {\n sameCountCol = sameCountRow = 0\n lastCol = lastRow = null\n\n for (let col = 0; col < size; col++) {\n let module = data.get(row, col)\n if (module === lastCol) {\n sameCountCol++\n } else {\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n lastCol = module\n sameCountCol = 1\n }\n\n module = data.get(col, row)\n if (module === lastRow) {\n sameCountRow++\n } else {\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n lastRow = module\n sameCountRow = 1\n }\n }\n\n if (sameCountCol >= 5) points += PenaltyScores.N1 + (sameCountCol - 5)\n if (sameCountRow >= 5) points += PenaltyScores.N1 + (sameCountRow - 5)\n }\n\n return points\n}\n\n/**\n * Find 2x2 blocks with the same color and assign a penalty value\n *\n * Points: N2 * (m - 1) * (n - 1)\n */\nexports.getPenaltyN2 = function getPenaltyN2 (data) {\n const size = data.size\n let points = 0\n\n for (let row = 0; row < size - 1; row++) {\n for (let col = 0; col < size - 1; col++) {\n const last = data.get(row, col) +\n data.get(row, col + 1) +\n data.get(row + 1, col) +\n data.get(row + 1, col + 1)\n\n if (last === 4 || last === 0) points++\n }\n }\n\n return points * PenaltyScores.N2\n}\n\n/**\n * Find 1:1:3:1:1 ratio (dark:light:dark:light:dark) pattern in row/column,\n * preceded or followed by light area 4 modules wide\n *\n * Points: N3 * number of pattern found\n */\nexports.getPenaltyN3 = function getPenaltyN3 (data) {\n const size = data.size\n let points = 0\n let bitsCol = 0\n let bitsRow = 0\n\n for (let row = 0; row < size; row++) {\n bitsCol = bitsRow = 0\n for (let col = 0; col < size; col++) {\n bitsCol = ((bitsCol << 1) & 0x7FF) | data.get(row, col)\n if (col >= 10 && (bitsCol === 0x5D0 || bitsCol === 0x05D)) points++\n\n bitsRow = ((bitsRow << 1) & 0x7FF) | data.get(col, row)\n if (col >= 10 && (bitsRow === 0x5D0 || bitsRow === 0x05D)) points++\n }\n }\n\n return points * PenaltyScores.N3\n}\n\n/**\n * Calculate proportion of dark modules in entire symbol\n *\n * Points: N4 * k\n *\n * k is the rating of the deviation of the proportion of dark modules\n * in the symbol from 50% in steps of 5%\n */\nexports.getPenaltyN4 = function getPenaltyN4 (data) {\n let darkCount = 0\n const modulesCount = data.data.length\n\n for (let i = 0; i < modulesCount; i++) darkCount += data.data[i]\n\n const k = Math.abs(Math.ceil((darkCount * 100 / modulesCount) / 5) - 10)\n\n return k * PenaltyScores.N4\n}\n\n/**\n * Return mask value at given position\n *\n * @param {Number} maskPattern Pattern reference value\n * @param {Number} i Row\n * @param {Number} j Column\n * @return {Boolean} Mask value\n */\nfunction getMaskAt (maskPattern, i, j) {\n switch (maskPattern) {\n case exports.Patterns.PATTERN000: return (i + j) % 2 === 0\n case exports.Patterns.PATTERN001: return i % 2 === 0\n case exports.Patterns.PATTERN010: return j % 3 === 0\n case exports.Patterns.PATTERN011: return (i + j) % 3 === 0\n case exports.Patterns.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 === 0\n case exports.Patterns.PATTERN101: return (i * j) % 2 + (i * j) % 3 === 0\n case exports.Patterns.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 === 0\n case exports.Patterns.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 === 0\n\n default: throw new Error('bad maskPattern:' + maskPattern)\n }\n}\n\n/**\n * Apply a mask pattern to a BitMatrix\n *\n * @param {Number} pattern Pattern reference number\n * @param {BitMatrix} data BitMatrix data\n */\nexports.applyMask = function applyMask (pattern, data) {\n const size = data.size\n\n for (let col = 0; col < size; col++) {\n for (let row = 0; row < size; row++) {\n if (data.isReserved(row, col)) continue\n data.xor(row, col, getMaskAt(pattern, row, col))\n }\n }\n}\n\n/**\n * Returns the best mask pattern for data\n *\n * @param {BitMatrix} data\n * @return {Number} Mask pattern reference number\n */\nexports.getBestMask = function getBestMask (data, setupFormatFunc) {\n const numPatterns = Object.keys(exports.Patterns).length\n let bestPattern = 0\n let lowerPenalty = Infinity\n\n for (let p = 0; p < numPatterns; p++) {\n setupFormatFunc(p)\n exports.applyMask(p, data)\n\n // Calculate penalty\n const penalty =\n exports.getPenaltyN1(data) +\n exports.getPenaltyN2(data) +\n exports.getPenaltyN3(data) +\n exports.getPenaltyN4(data)\n\n // Undo previously applied mask\n exports.applyMask(p, data)\n\n if (penalty < lowerPenalty) {\n lowerPenalty = penalty\n bestPattern = p\n }\n }\n\n return bestPattern\n}\n", "const ECLevel = require('./error-correction-level')\r\n\r\nconst EC_BLOCKS_TABLE = [\r\n// L M Q H\r\n 1, 1, 1, 1,\r\n 1, 1, 1, 1,\r\n 1, 1, 2, 2,\r\n 1, 2, 2, 4,\r\n 1, 2, 4, 4,\r\n 2, 4, 4, 4,\r\n 2, 4, 6, 5,\r\n 2, 4, 6, 6,\r\n 2, 5, 8, 8,\r\n 4, 5, 8, 8,\r\n 4, 5, 8, 11,\r\n 4, 8, 10, 11,\r\n 4, 9, 12, 16,\r\n 4, 9, 16, 16,\r\n 6, 10, 12, 18,\r\n 6, 10, 17, 16,\r\n 6, 11, 16, 19,\r\n 6, 13, 18, 21,\r\n 7, 14, 21, 25,\r\n 8, 16, 20, 25,\r\n 8, 17, 23, 25,\r\n 9, 17, 23, 34,\r\n 9, 18, 25, 30,\r\n 10, 20, 27, 32,\r\n 12, 21, 29, 35,\r\n 12, 23, 34, 37,\r\n 12, 25, 34, 40,\r\n 13, 26, 35, 42,\r\n 14, 28, 38, 45,\r\n 15, 29, 40, 48,\r\n 16, 31, 43, 51,\r\n 17, 33, 45, 54,\r\n 18, 35, 48, 57,\r\n 19, 37, 51, 60,\r\n 19, 38, 53, 63,\r\n 20, 40, 56, 66,\r\n 21, 43, 59, 70,\r\n 22, 45, 62, 74,\r\n 24, 47, 65, 77,\r\n 25, 49, 68, 81\r\n]\r\n\r\nconst EC_CODEWORDS_TABLE = [\r\n// L M Q H\r\n 7, 10, 13, 17,\r\n 10, 16, 22, 28,\r\n 15, 26, 36, 44,\r\n 20, 36, 52, 64,\r\n 26, 48, 72, 88,\r\n 36, 64, 96, 112,\r\n 40, 72, 108, 130,\r\n 48, 88, 132, 156,\r\n 60, 110, 160, 192,\r\n 72, 130, 192, 224,\r\n 80, 150, 224, 264,\r\n 96, 176, 260, 308,\r\n 104, 198, 288, 352,\r\n 120, 216, 320, 384,\r\n 132, 240, 360, 432,\r\n 144, 280, 408, 480,\r\n 168, 308, 448, 532,\r\n 180, 338, 504, 588,\r\n 196, 364, 546, 650,\r\n 224, 416, 600, 700,\r\n 224, 442, 644, 750,\r\n 252, 476, 690, 816,\r\n 270, 504, 750, 900,\r\n 300, 560, 810, 960,\r\n 312, 588, 870, 1050,\r\n 336, 644, 952, 1110,\r\n 360, 700, 1020, 1200,\r\n 390, 728, 1050, 1260,\r\n 420, 784, 1140, 1350,\r\n 450, 812, 1200, 1440,\r\n 480, 868, 1290, 1530,\r\n 510, 924, 1350, 1620,\r\n 540, 980, 1440, 1710,\r\n 570, 1036, 1530, 1800,\r\n 570, 1064, 1590, 1890,\r\n 600, 1120, 1680, 1980,\r\n 630, 1204, 1770, 2100,\r\n 660, 1260, 1860, 2220,\r\n 720, 1316, 1950, 2310,\r\n 750, 1372, 2040, 2430\r\n]\r\n\r\n/**\r\n * Returns the number of error correction block that the QR Code should contain\r\n * for the specified version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction blocks\r\n */\r\nexports.getBlocksCount = function getBlocksCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_BLOCKS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Returns the number of error correction codewords to use for the specified\r\n * version and error correction level.\r\n *\r\n * @param {Number} version QR Code version\r\n * @param {Number} errorCorrectionLevel Error correction level\r\n * @return {Number} Number of error correction codewords\r\n */\r\nexports.getTotalCodewordsCount = function getTotalCodewordsCount (version, errorCorrectionLevel) {\r\n switch (errorCorrectionLevel) {\r\n case ECLevel.L:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 0]\r\n case ECLevel.M:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 1]\r\n case ECLevel.Q:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 2]\r\n case ECLevel.H:\r\n return EC_CODEWORDS_TABLE[(version - 1) * 4 + 3]\r\n default:\r\n return undefined\r\n }\r\n}\r\n", "const EXP_TABLE = new Uint8Array(512)\nconst LOG_TABLE = new Uint8Array(256)\n/**\n * Precompute the log and anti-log tables for faster computation later\n *\n * For each possible value in the galois field 2^8, we will pre-compute\n * the logarithm and anti-logarithm (exponential) of this value\n *\n * ref {@link https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Introduction_to_mathematical_fields}\n */\n;(function initTables () {\n let x = 1\n for (let i = 0; i < 255; i++) {\n EXP_TABLE[i] = x\n LOG_TABLE[x] = i\n\n x <<= 1 // multiply by 2\n\n // The QR code specification says to use byte-wise modulo 100011101 arithmetic.\n // This means that when a number is 256 or larger, it should be XORed with 0x11D.\n if (x & 0x100) { // similar to x >= 256, but a lot faster (because 0x100 == 256)\n x ^= 0x11D\n }\n }\n\n // Optimization: double the size of the anti-log table so that we don't need to mod 255 to\n // stay inside the bounds (because we will mainly use this table for the multiplication of\n // two GF numbers, no more).\n // @see {@link mul}\n for (let i = 255; i < 512; i++) {\n EXP_TABLE[i] = EXP_TABLE[i - 255]\n }\n}())\n\n/**\n * Returns log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.log = function log (n) {\n if (n < 1) throw new Error('log(' + n + ')')\n return LOG_TABLE[n]\n}\n\n/**\n * Returns anti-log value of n inside Galois Field\n *\n * @param {Number} n\n * @return {Number}\n */\nexports.exp = function exp (n) {\n return EXP_TABLE[n]\n}\n\n/**\n * Multiplies two number inside Galois Field\n *\n * @param {Number} x\n * @param {Number} y\n * @return {Number}\n */\nexports.mul = function mul (x, y) {\n if (x === 0 || y === 0) return 0\n\n // should be EXP_TABLE[(LOG_TABLE[x] + LOG_TABLE[y]) % 255] if EXP_TABLE wasn't oversized\n // @see {@link initTables}\n return EXP_TABLE[LOG_TABLE[x] + LOG_TABLE[y]]\n}\n", "const GF = require('./galois-field')\n\n/**\n * Multiplies two polynomials inside Galois Field\n *\n * @param {Uint8Array} p1 Polynomial\n * @param {Uint8Array} p2 Polynomial\n * @return {Uint8Array} Product of p1 and p2\n */\nexports.mul = function mul (p1, p2) {\n const coeff = new Uint8Array(p1.length + p2.length - 1)\n\n for (let i = 0; i < p1.length; i++) {\n for (let j = 0; j < p2.length; j++) {\n coeff[i + j] ^= GF.mul(p1[i], p2[j])\n }\n }\n\n return coeff\n}\n\n/**\n * Calculate the remainder of polynomials division\n *\n * @param {Uint8Array} divident Polynomial\n * @param {Uint8Array} divisor Polynomial\n * @return {Uint8Array} Remainder\n */\nexports.mod = function mod (divident, divisor) {\n let result = new Uint8Array(divident)\n\n while ((result.length - divisor.length) >= 0) {\n const coeff = result[0]\n\n for (let i = 0; i < divisor.length; i++) {\n result[i] ^= GF.mul(divisor[i], coeff)\n }\n\n // remove all zeros from buffer head\n let offset = 0\n while (offset < result.length && result[offset] === 0) offset++\n result = result.slice(offset)\n }\n\n return result\n}\n\n/**\n * Generate an irreducible generator polynomial of specified degree\n * (used by Reed-Solomon encoder)\n *\n * @param {Number} degree Degree of the generator polynomial\n * @return {Uint8Array} Buffer containing polynomial coefficients\n */\nexports.generateECPolynomial = function generateECPolynomial (degree) {\n let poly = new Uint8Array([1])\n for (let i = 0; i < degree; i++) {\n poly = exports.mul(poly, new Uint8Array([1, GF.exp(i)]))\n }\n\n return poly\n}\n", "const Polynomial = require('./polynomial')\n\nfunction ReedSolomonEncoder (degree) {\n this.genPoly = undefined\n this.degree = degree\n\n if (this.degree) this.initialize(this.degree)\n}\n\n/**\n * Initialize the encoder.\n * The input param should correspond to the number of error correction codewords.\n *\n * @param {Number} degree\n */\nReedSolomonEncoder.prototype.initialize = function initialize (degree) {\n // create an irreducible generator polynomial\n this.degree = degree\n this.genPoly = Polynomial.generateECPolynomial(this.degree)\n}\n\n/**\n * Encodes a chunk of data\n *\n * @param {Uint8Array} data Buffer containing input data\n * @return {Uint8Array} Buffer containing encoded data\n */\nReedSolomonEncoder.prototype.encode = function encode (data) {\n if (!this.genPoly) {\n throw new Error('Encoder not initialized')\n }\n\n // Calculate EC for this data block\n // extends data size to data+genPoly size\n const paddedData = new Uint8Array(data.length + this.degree)\n paddedData.set(data)\n\n // The error correction codewords are the remainder after dividing the data codewords\n // by a generator polynomial\n const remainder = Polynomial.mod(paddedData, this.genPoly)\n\n // return EC data blocks (last n byte, where n is the degree of genPoly)\n // If coefficients number in remainder are less than genPoly degree,\n // pad with 0s to the left to reach the needed number of coefficients\n const start = this.degree - remainder.length\n if (start > 0) {\n const buff = new Uint8Array(this.degree)\n buff.set(remainder, start)\n\n return buff\n }\n\n return remainder\n}\n\nmodule.exports = ReedSolomonEncoder\n", "/**\n * Check if QR Code version is valid\n *\n * @param {Number} version QR Code version\n * @return {Boolean} true if valid version, false otherwise\n */\nexports.isValid = function isValid (version) {\n return !isNaN(version) && version >= 1 && version <= 40\n}\n", "const numeric = '[0-9]+'\nconst alphanumeric = '[A-Z $%*+\\\\-./:]+'\nlet kanji = '(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|' +\n '[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|' +\n '[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|' +\n '[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+'\nkanji = kanji.replace(/u/g, '\\\\u')\n\nconst byte = '(?:(?![A-Z0-9 $%*+\\\\-./:]|' + kanji + ')(?:.|[\\r\\n]))+'\n\nexports.KANJI = new RegExp(kanji, 'g')\nexports.BYTE_KANJI = new RegExp('[^A-Z0-9 $%*+\\\\-./:]+', 'g')\nexports.BYTE = new RegExp(byte, 'g')\nexports.NUMERIC = new RegExp(numeric, 'g')\nexports.ALPHANUMERIC = new RegExp(alphanumeric, 'g')\n\nconst TEST_KANJI = new RegExp('^' + kanji + '$')\nconst TEST_NUMERIC = new RegExp('^' + numeric + '$')\nconst TEST_ALPHANUMERIC = new RegExp('^[A-Z0-9 $%*+\\\\-./:]+$')\n\nexports.testKanji = function testKanji (str) {\n return TEST_KANJI.test(str)\n}\n\nexports.testNumeric = function testNumeric (str) {\n return TEST_NUMERIC.test(str)\n}\n\nexports.testAlphanumeric = function testAlphanumeric (str) {\n return TEST_ALPHANUMERIC.test(str)\n}\n", "const VersionCheck = require('./version-check')\nconst Regex = require('./regex')\n\n/**\n * Numeric mode encodes data from the decimal digit set (0 - 9)\n * (byte values 30HEX to 39HEX).\n * Normally, 3 data characters are represented by 10 bits.\n *\n * @type {Object}\n */\nexports.NUMERIC = {\n id: 'Numeric',\n bit: 1 << 0,\n ccBits: [10, 12, 14]\n}\n\n/**\n * Alphanumeric mode encodes data from a set of 45 characters,\n * i.e. 10 numeric digits (0 - 9),\n * 26 alphabetic characters (A - Z),\n * and 9 symbols (SP, $, %, *, +, -, ., /, :).\n * Normally, two input characters are represented by 11 bits.\n *\n * @type {Object}\n */\nexports.ALPHANUMERIC = {\n id: 'Alphanumeric',\n bit: 1 << 1,\n ccBits: [9, 11, 13]\n}\n\n/**\n * In byte mode, data is encoded at 8 bits per character.\n *\n * @type {Object}\n */\nexports.BYTE = {\n id: 'Byte',\n bit: 1 << 2,\n ccBits: [8, 16, 16]\n}\n\n/**\n * The Kanji mode efficiently encodes Kanji characters in accordance with\n * the Shift JIS system based on JIS X 0208.\n * The Shift JIS values are shifted from the JIS X 0208 values.\n * JIS X 0208 gives details of the shift coded representation.\n * Each two-byte character value is compacted to a 13-bit binary codeword.\n *\n * @type {Object}\n */\nexports.KANJI = {\n id: 'Kanji',\n bit: 1 << 3,\n ccBits: [8, 10, 12]\n}\n\n/**\n * Mixed mode will contain a sequences of data in a combination of any of\n * the modes described above\n *\n * @type {Object}\n */\nexports.MIXED = {\n bit: -1\n}\n\n/**\n * Returns the number of bits needed to store the data length\n * according to QR Code specifications.\n *\n * @param {Mode} mode Data mode\n * @param {Number} version QR Code version\n * @return {Number} Number of bits\n */\nexports.getCharCountIndicator = function getCharCountIndicator (mode, version) {\n if (!mode.ccBits) throw new Error('Invalid mode: ' + mode)\n\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid version: ' + version)\n }\n\n if (version >= 1 && version < 10) return mode.ccBits[0]\n else if (version < 27) return mode.ccBits[1]\n return mode.ccBits[2]\n}\n\n/**\n * Returns the most efficient mode to store the specified data\n *\n * @param {String} dataStr Input data string\n * @return {Mode} Best mode\n */\nexports.getBestModeForData = function getBestModeForData (dataStr) {\n if (Regex.testNumeric(dataStr)) return exports.NUMERIC\n else if (Regex.testAlphanumeric(dataStr)) return exports.ALPHANUMERIC\n else if (Regex.testKanji(dataStr)) return exports.KANJI\n else return exports.BYTE\n}\n\n/**\n * Return mode name as string\n *\n * @param {Mode} mode Mode object\n * @returns {String} Mode name\n */\nexports.toString = function toString (mode) {\n if (mode && mode.id) return mode.id\n throw new Error('Invalid mode')\n}\n\n/**\n * Check if input param is a valid mode object\n *\n * @param {Mode} mode Mode object\n * @returns {Boolean} True if valid mode, false otherwise\n */\nexports.isValid = function isValid (mode) {\n return mode && mode.bit && mode.ccBits\n}\n\n/**\n * Get mode object from its name\n *\n * @param {String} string Mode name\n * @returns {Mode} Mode object\n */\nfunction fromString (string) {\n if (typeof string !== 'string') {\n throw new Error('Param is not a string')\n }\n\n const lcStr = string.toLowerCase()\n\n switch (lcStr) {\n case 'numeric':\n return exports.NUMERIC\n case 'alphanumeric':\n return exports.ALPHANUMERIC\n case 'kanji':\n return exports.KANJI\n case 'byte':\n return exports.BYTE\n default:\n throw new Error('Unknown mode: ' + string)\n }\n}\n\n/**\n * Returns mode from a value.\n * If value is not a valid mode, returns defaultValue\n *\n * @param {Mode|String} value Encoding mode\n * @param {Mode} defaultValue Fallback value\n * @return {Mode} Encoding mode\n */\nexports.from = function from (value, defaultValue) {\n if (exports.isValid(value)) {\n return value\n }\n\n try {\n return fromString(value)\n } catch (e) {\n return defaultValue\n }\n}\n", "const Utils = require('./utils')\nconst ECCode = require('./error-correction-code')\nconst ECLevel = require('./error-correction-level')\nconst Mode = require('./mode')\nconst VersionCheck = require('./version-check')\n\n// Generator polynomial used to encode version information\nconst G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)\nconst G18_BCH = Utils.getBCHDigit(G18)\n\nfunction getBestVersionForDataLength (mode, length, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, mode)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\nfunction getReservedBitsCount (mode, version) {\n // Character count indicator + mode indicator bits\n return Mode.getCharCountIndicator(mode, version) + 4\n}\n\nfunction getTotalBitsFromDataArray (segments, version) {\n let totalBits = 0\n\n segments.forEach(function (data) {\n const reservedBits = getReservedBitsCount(data.mode, version)\n totalBits += reservedBits + data.getBitsLength()\n })\n\n return totalBits\n}\n\nfunction getBestVersionForMixedData (segments, errorCorrectionLevel) {\n for (let currentVersion = 1; currentVersion <= 40; currentVersion++) {\n const length = getTotalBitsFromDataArray(segments, currentVersion)\n if (length <= exports.getCapacity(currentVersion, errorCorrectionLevel, Mode.MIXED)) {\n return currentVersion\n }\n }\n\n return undefined\n}\n\n/**\n * Returns version number from a value.\n * If value is not a valid version, returns defaultValue\n *\n * @param {Number|String} value QR Code version\n * @param {Number} defaultValue Fallback value\n * @return {Number} QR Code version number\n */\nexports.from = function from (value, defaultValue) {\n if (VersionCheck.isValid(value)) {\n return parseInt(value, 10)\n }\n\n return defaultValue\n}\n\n/**\n * Returns how much data can be stored with the specified QR code version\n * and error correction level\n *\n * @param {Number} version QR Code version (1-40)\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} Quantity of storable data\n */\nexports.getCapacity = function getCapacity (version, errorCorrectionLevel, mode) {\n if (!VersionCheck.isValid(version)) {\n throw new Error('Invalid QR Code version')\n }\n\n // Use Byte mode as default\n if (typeof mode === 'undefined') mode = Mode.BYTE\n\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n if (mode === Mode.MIXED) return dataTotalCodewordsBits\n\n const usableBits = dataTotalCodewordsBits - getReservedBitsCount(mode, version)\n\n // Return max number of storable codewords\n switch (mode) {\n case Mode.NUMERIC:\n return Math.floor((usableBits / 10) * 3)\n\n case Mode.ALPHANUMERIC:\n return Math.floor((usableBits / 11) * 2)\n\n case Mode.KANJI:\n return Math.floor(usableBits / 13)\n\n case Mode.BYTE:\n default:\n return Math.floor(usableBits / 8)\n }\n}\n\n/**\n * Returns the minimum version needed to contain the amount of data\n *\n * @param {Segment} data Segment of data\n * @param {Number} [errorCorrectionLevel=H] Error correction level\n * @param {Mode} mode Data mode\n * @return {Number} QR Code version\n */\nexports.getBestVersionForData = function getBestVersionForData (data, errorCorrectionLevel) {\n let seg\n\n const ecl = ECLevel.from(errorCorrectionLevel, ECLevel.M)\n\n if (Array.isArray(data)) {\n if (data.length > 1) {\n return getBestVersionForMixedData(data, ecl)\n }\n\n if (data.length === 0) {\n return 1\n }\n\n seg = data[0]\n } else {\n seg = data\n }\n\n return getBestVersionForDataLength(seg.mode, seg.getLength(), ecl)\n}\n\n/**\n * Returns version information with relative error correction bits\n *\n * The version information is included in QR Code symbols of version 7 or larger.\n * It consists of an 18-bit sequence containing 6 data bits,\n * with 12 error correction bits calculated using the (18, 6) Golay code.\n *\n * @param {Number} version QR Code version\n * @return {Number} Encoded version info bits\n */\nexports.getEncodedBits = function getEncodedBits (version) {\n if (!VersionCheck.isValid(version) || version < 7) {\n throw new Error('Invalid QR Code version')\n }\n\n let d = version << 12\n\n while (Utils.getBCHDigit(d) - G18_BCH >= 0) {\n d ^= (G18 << (Utils.getBCHDigit(d) - G18_BCH))\n }\n\n return (version << 12) | d\n}\n", "const Utils = require('./utils')\n\nconst G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)\nconst G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)\nconst G15_BCH = Utils.getBCHDigit(G15)\n\n/**\n * Returns format information with relative error correction bits\n *\n * The format information is a 15-bit sequence containing 5 data bits,\n * with 10 error correction bits calculated using the (15, 5) BCH code.\n *\n * @param {Number} errorCorrectionLevel Error correction level\n * @param {Number} mask Mask pattern\n * @return {Number} Encoded format information bits\n */\nexports.getEncodedBits = function getEncodedBits (errorCorrectionLevel, mask) {\n const data = ((errorCorrectionLevel.bit << 3) | mask)\n let d = data << 10\n\n while (Utils.getBCHDigit(d) - G15_BCH >= 0) {\n d ^= (G15 << (Utils.getBCHDigit(d) - G15_BCH))\n }\n\n // xor final data with mask pattern in order to ensure that\n // no combination of Error Correction Level and data mask pattern\n // will result in an all-zero data string\n return ((data << 10) | d) ^ G15_MASK\n}\n", "const Mode = require('./mode')\n\nfunction NumericData (data) {\n this.mode = Mode.NUMERIC\n this.data = data.toString()\n}\n\nNumericData.getBitsLength = function getBitsLength (length) {\n return 10 * Math.floor(length / 3) + ((length % 3) ? ((length % 3) * 3 + 1) : 0)\n}\n\nNumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nNumericData.prototype.getBitsLength = function getBitsLength () {\n return NumericData.getBitsLength(this.data.length)\n}\n\nNumericData.prototype.write = function write (bitBuffer) {\n let i, group, value\n\n // The input data string is divided into groups of three digits,\n // and each group is converted to its 10-bit binary equivalent.\n for (i = 0; i + 3 <= this.data.length; i += 3) {\n group = this.data.substr(i, 3)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, 10)\n }\n\n // If the number of input digits is not an exact multiple of three,\n // the final one or two digits are converted to 4 or 7 bits respectively.\n const remainingNum = this.data.length - i\n if (remainingNum > 0) {\n group = this.data.substr(i)\n value = parseInt(group, 10)\n\n bitBuffer.put(value, remainingNum * 3 + 1)\n }\n}\n\nmodule.exports = NumericData\n", "const Mode = require('./mode')\n\n/**\n * Array of characters available in alphanumeric mode\n *\n * As per QR Code specification, to each character\n * is assigned a value from 0 to 44 which in this case coincides\n * with the array index\n *\n * @type {Array}\n */\nconst ALPHA_NUM_CHARS = [\n '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n ' ', '$', '%', '*', '+', '-', '.', '/', ':'\n]\n\nfunction AlphanumericData (data) {\n this.mode = Mode.ALPHANUMERIC\n this.data = data\n}\n\nAlphanumericData.getBitsLength = function getBitsLength (length) {\n return 11 * Math.floor(length / 2) + 6 * (length % 2)\n}\n\nAlphanumericData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nAlphanumericData.prototype.getBitsLength = function getBitsLength () {\n return AlphanumericData.getBitsLength(this.data.length)\n}\n\nAlphanumericData.prototype.write = function write (bitBuffer) {\n let i\n\n // Input data characters are divided into groups of two characters\n // and encoded as 11-bit binary codes.\n for (i = 0; i + 2 <= this.data.length; i += 2) {\n // The character value of the first character is multiplied by 45\n let value = ALPHA_NUM_CHARS.indexOf(this.data[i]) * 45\n\n // The character value of the second digit is added to the product\n value += ALPHA_NUM_CHARS.indexOf(this.data[i + 1])\n\n // The sum is then stored as 11-bit binary number\n bitBuffer.put(value, 11)\n }\n\n // If the number of input data characters is not a multiple of two,\n // the character value of the final character is encoded as a 6-bit binary number.\n if (this.data.length % 2) {\n bitBuffer.put(ALPHA_NUM_CHARS.indexOf(this.data[i]), 6)\n }\n}\n\nmodule.exports = AlphanumericData\n", "const Mode = require('./mode')\n\nfunction ByteData (data) {\n this.mode = Mode.BYTE\n if (typeof (data) === 'string') {\n this.data = new TextEncoder().encode(data)\n } else {\n this.data = new Uint8Array(data)\n }\n}\n\nByteData.getBitsLength = function getBitsLength (length) {\n return length * 8\n}\n\nByteData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nByteData.prototype.getBitsLength = function getBitsLength () {\n return ByteData.getBitsLength(this.data.length)\n}\n\nByteData.prototype.write = function (bitBuffer) {\n for (let i = 0, l = this.data.length; i < l; i++) {\n bitBuffer.put(this.data[i], 8)\n }\n}\n\nmodule.exports = ByteData\n", "const Mode = require('./mode')\nconst Utils = require('./utils')\n\nfunction KanjiData (data) {\n this.mode = Mode.KANJI\n this.data = data\n}\n\nKanjiData.getBitsLength = function getBitsLength (length) {\n return length * 13\n}\n\nKanjiData.prototype.getLength = function getLength () {\n return this.data.length\n}\n\nKanjiData.prototype.getBitsLength = function getBitsLength () {\n return KanjiData.getBitsLength(this.data.length)\n}\n\nKanjiData.prototype.write = function (bitBuffer) {\n let i\n\n // In the Shift JIS system, Kanji characters are represented by a two byte combination.\n // These byte values are shifted from the JIS X 0208 values.\n // JIS X 0208 gives details of the shift coded representation.\n for (i = 0; i < this.data.length; i++) {\n let value = Utils.toSJIS(this.data[i])\n\n // For characters with Shift JIS values from 0x8140 to 0x9FFC:\n if (value >= 0x8140 && value <= 0x9FFC) {\n // Subtract 0x8140 from Shift JIS value\n value -= 0x8140\n\n // For characters with Shift JIS values from 0xE040 to 0xEBBF\n } else if (value >= 0xE040 && value <= 0xEBBF) {\n // Subtract 0xC140 from Shift JIS value\n value -= 0xC140\n } else {\n throw new Error(\n 'Invalid SJIS character: ' + this.data[i] + '\\n' +\n 'Make sure your charset is UTF-8')\n }\n\n // Multiply most significant byte of result by 0xC0\n // and add least significant byte to product\n value = (((value >>> 8) & 0xff) * 0xC0) + (value & 0xff)\n\n // Convert result to a 13-bit binary string\n bitBuffer.put(value, 13)\n }\n}\n\nmodule.exports = KanjiData\n", "'use strict';\n\n/******************************************************************************\n * Created 2008-08-19.\n *\n * Dijkstra path-finding functions. Adapted from the Dijkstar Python project.\n *\n * Copyright (C) 2008\n * Wyatt Baldwin <self@wyattbaldwin.com>\n * All rights reserved\n *\n * Licensed under the MIT license.\n *\n * http://www.opensource.org/licenses/mit-license.php\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *****************************************************************************/\nvar dijkstra = {\n single_source_shortest_paths: function(graph, s, d) {\n // Predecessor map for each node that has been encountered.\n // node ID => predecessor node ID\n var predecessors = {};\n\n // Costs of shortest paths from s to all nodes encountered.\n // node ID => cost\n var costs = {};\n costs[s] = 0;\n\n // Costs of shortest paths from s to all nodes encountered; differs from\n // `costs` in that it provides easy access to the node that currently has\n // the known shortest path from s.\n // XXX: Do we actually need both `costs` and `open`?\n var open = dijkstra.PriorityQueue.make();\n open.push(s, 0);\n\n var closest,\n u, v,\n cost_of_s_to_u,\n adjacent_nodes,\n cost_of_e,\n cost_of_s_to_u_plus_cost_of_e,\n cost_of_s_to_v,\n first_visit;\n while (!open.empty()) {\n // In the nodes remaining in graph that have a known cost from s,\n // find the node, u, that currently has the shortest path from s.\n closest = open.pop();\n u = closest.value;\n cost_of_s_to_u = closest.cost;\n\n // Get nodes adjacent to u...\n adjacent_nodes = graph[u] || {};\n\n // ...and explore the edges that connect u to those nodes, updating\n // the cost of the shortest paths to any or all of those nodes as\n // necessary. v is the node across the current edge from u.\n for (v in adjacent_nodes) {\n if (adjacent_nodes.hasOwnProperty(v)) {\n // Get the cost of the edge running from u to v.\n cost_of_e = adjacent_nodes[v];\n\n // Cost of s to u plus the cost of u to v across e--this is *a*\n // cost from s to v that may or may not be less than the current\n // known cost to v.\n cost_of_s_to_u_plus_cost_of_e = cost_of_s_to_u + cost_of_e;\n\n // If we haven't visited v yet OR if the current known cost from s to\n // v is greater than the new cost we just found (cost of s to u plus\n // cost of u to v across e), update v's cost in the cost list and\n // update v's predecessor in the predecessor list (it's now u).\n cost_of_s_to_v = costs[v];\n first_visit = (typeof costs[v] === 'undefined');\n if (first_visit || cost_of_s_to_v > cost_of_s_to_u_plus_cost_of_e) {\n costs[v] = cost_of_s_to_u_plus_cost_of_e;\n open.push(v, cost_of_s_to_u_plus_cost_of_e);\n predecessors[v] = u;\n }\n }\n }\n }\n\n if (typeof d !== 'undefined' && typeof costs[d] === 'undefined') {\n var msg = ['Could not find a path from ', s, ' to ', d, '.'].join('');\n throw new Error(msg);\n }\n\n return predecessors;\n },\n\n extract_shortest_path_from_predecessor_list: function(predecessors, d) {\n var nodes = [];\n var u = d;\n var predecessor;\n while (u) {\n nodes.push(u);\n predecessor = predecessors[u];\n u = predecessors[u];\n }\n nodes.reverse();\n return nodes;\n },\n\n find_path: function(graph, s, d) {\n var predecessors = dijkstra.single_source_shortest_paths(graph, s, d);\n return dijkstra.extract_shortest_path_from_predecessor_list(\n predecessors, d);\n },\n\n /**\n * A very naive priority queue implementation.\n */\n PriorityQueue: {\n make: function (opts) {\n var T = dijkstra.PriorityQueue,\n t = {},\n key;\n opts = opts || {};\n for (key in T) {\n if (T.hasOwnProperty(key)) {\n t[key] = T[key];\n }\n }\n t.queue = [];\n t.sorter = opts.sorter || T.default_sorter;\n return t;\n },\n\n default_sorter: function (a, b) {\n return a.cost - b.cost;\n },\n\n /**\n * Add a new item to the queue and ensure the highest priority element\n * is at the front of the queue.\n */\n push: function (value, cost) {\n var item = {value: value, cost: cost};\n this.queue.push(item);\n this.queue.sort(this.sorter);\n },\n\n /**\n * Return the highest priority element in the queue.\n */\n pop: function () {\n return this.queue.shift();\n },\n\n empty: function () {\n return this.queue.length === 0;\n }\n }\n};\n\n\n// node.js module exports\nif (typeof module !== 'undefined') {\n module.exports = dijkstra;\n}\n", "const Mode = require('./mode')\nconst NumericData = require('./numeric-data')\nconst AlphanumericData = require('./alphanumeric-data')\nconst ByteData = require('./byte-data')\nconst KanjiData = require('./kanji-data')\nconst Regex = require('./regex')\nconst Utils = require('./utils')\nconst dijkstra = require('dijkstrajs')\n\n/**\n * Returns UTF8 byte length\n *\n * @param {String} str Input string\n * @return {Number} Number of byte\n */\nfunction getStringByteLength (str) {\n return unescape(encodeURIComponent(str)).length\n}\n\n/**\n * Get a list of segments of the specified mode\n * from a string\n *\n * @param {Mode} mode Segment mode\n * @param {String} str String to process\n * @return {Array} Array of object with segments data\n */\nfunction getSegments (regex, mode, str) {\n const segments = []\n let result\n\n while ((result = regex.exec(str)) !== null) {\n segments.push({\n data: result[0],\n index: result.index,\n mode: mode,\n length: result[0].length\n })\n }\n\n return segments\n}\n\n/**\n * Extracts a series of segments with the appropriate\n * modes from a string\n *\n * @param {String} dataStr Input string\n * @return {Array} Array of object with segments data\n */\nfunction getSegmentsFromString (dataStr) {\n const numSegs = getSegments(Regex.NUMERIC, Mode.NUMERIC, dataStr)\n const alphaNumSegs = getSegments(Regex.ALPHANUMERIC, Mode.ALPHANUMERIC, dataStr)\n let byteSegs\n let kanjiSegs\n\n if (Utils.isKanjiModeEnabled()) {\n byteSegs = getSegments(Regex.BYTE, Mode.BYTE, dataStr)\n kanjiSegs = getSegments(Regex.KANJI, Mode.KANJI, dataStr)\n } else {\n byteSegs = getSegments(Regex.BYTE_KANJI, Mode.BYTE, dataStr)\n kanjiSegs = []\n }\n\n const segs = numSegs.concat(alphaNumSegs, byteSegs, kanjiSegs)\n\n return segs\n .sort(function (s1, s2) {\n return s1.index - s2.index\n })\n .map(function (obj) {\n return {\n data: obj.data,\n mode: obj.mode,\n length: obj.length\n }\n })\n}\n\n/**\n * Returns how many bits are needed to encode a string of\n * specified length with the specified mode\n *\n * @param {Number} length String length\n * @param {Mode} mode Segment mode\n * @return {Number} Bit length\n */\nfunction getSegmentBitsLength (length, mode) {\n switch (mode) {\n case Mode.NUMERIC:\n return NumericData.getBitsLength(length)\n case Mode.ALPHANUMERIC:\n return AlphanumericData.getBitsLength(length)\n case Mode.KANJI:\n return KanjiData.getBitsLength(length)\n case Mode.BYTE:\n return ByteData.getBitsLength(length)\n }\n}\n\n/**\n * Merges adjacent segments which have the same mode\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction mergeSegments (segs) {\n return segs.reduce(function (acc, curr) {\n const prevSeg = acc.length - 1 >= 0 ? acc[acc.length - 1] : null\n if (prevSeg && prevSeg.mode === curr.mode) {\n acc[acc.length - 1].data += curr.data\n return acc\n }\n\n acc.push(curr)\n return acc\n }, [])\n}\n\n/**\n * Generates a list of all possible nodes combination which\n * will be used to build a segments graph.\n *\n * Nodes are divided by groups. Each group will contain a list of all the modes\n * in which is possible to encode the given text.\n *\n * For example the text '12345' can be encoded as Numeric, Alphanumeric or Byte.\n * The group for '12345' will contain then 3 objects, one for each\n * possible encoding mode.\n *\n * Each node represents a possible segment.\n *\n * @param {Array} segs Array of object with segments data\n * @return {Array} Array of object with segments data\n */\nfunction buildNodes (segs) {\n const nodes = []\n for (let i = 0; i < segs.length; i++) {\n const seg = segs[i]\n\n switch (seg.mode) {\n case Mode.NUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.ALPHANUMERIC, length: seg.length },\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.ALPHANUMERIC:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: seg.length }\n ])\n break\n case Mode.KANJI:\n nodes.push([seg,\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n break\n case Mode.BYTE:\n nodes.push([\n { data: seg.data, mode: Mode.BYTE, length: getStringByteLength(seg.data) }\n ])\n }\n }\n\n return nodes\n}\n\n/**\n * Builds a graph from a list of nodes.\n * All segments in each node group will be connected with all the segments of\n * the next group and so on.\n *\n * At each connection will be assigned a weight depending on the\n * segment's byte length.\n *\n * @param {Array} nodes Array of object with segments data\n * @param {Number} version QR Code version\n * @return {Object} Graph of all possible segments\n */\nfunction buildGraph (nodes, version) {\n const table = {}\n const graph = { start: {} }\n let prevNodeIds = ['start']\n\n for (let i = 0; i < nodes.length; i++) {\n const nodeGroup = nodes[i]\n const currentNodeIds = []\n\n for (let j = 0; j < nodeGroup.length; j++) {\n const node = nodeGroup[j]\n const key = '' + i + j\n\n currentNodeIds.push(key)\n table[key] = { node: node, lastCount: 0 }\n graph[key] = {}\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n const prevNodeId = prevNodeIds[n]\n\n if (table[prevNodeId] && table[prevNodeId].node.mode === node.mode) {\n graph[prevNodeId][key] =\n getSegmentBitsLength(table[prevNodeId].lastCount + node.length, node.mode) -\n getSegmentBitsLength(table[prevNodeId].lastCount, node.mode)\n\n table[prevNodeId].lastCount += node.length\n } else {\n if (table[prevNodeId]) table[prevNodeId].lastCount = node.length\n\n graph[prevNodeId][key] = getSegmentBitsLength(node.length, node.mode) +\n 4 + Mode.getCharCountIndicator(node.mode, version) // switch cost\n }\n }\n }\n\n prevNodeIds = currentNodeIds\n }\n\n for (let n = 0; n < prevNodeIds.length; n++) {\n graph[prevNodeIds[n]].end = 0\n }\n\n return { map: graph, table: table }\n}\n\n/**\n * Builds a segment from a specified data and mode.\n * If a mode is not specified, the more suitable will be used.\n *\n * @param {String} data Input data\n * @param {Mode | String} modesHint Data mode\n * @return {Segment} Segment\n */\nfunction buildSingleSegment (data, modesHint) {\n let mode\n const bestMode = Mode.getBestModeForData(data)\n\n mode = Mode.from(modesHint, bestMode)\n\n // Make sure data can be encoded\n if (mode !== Mode.BYTE && mode.bit < bestMode.bit) {\n throw new Error('\"' + data + '\"' +\n ' cannot be encoded with mode ' + Mode.toString(mode) +\n '.\\n Suggested mode is: ' + Mode.toString(bestMode))\n }\n\n // Use Mode.BYTE if Kanji support is disabled\n if (mode === Mode.KANJI && !Utils.isKanjiModeEnabled()) {\n mode = Mode.BYTE\n }\n\n switch (mode) {\n case Mode.NUMERIC:\n return new NumericData(data)\n\n case Mode.ALPHANUMERIC:\n return new AlphanumericData(data)\n\n case Mode.KANJI:\n return new KanjiData(data)\n\n case Mode.BYTE:\n return new ByteData(data)\n }\n}\n\n/**\n * Builds a list of segments from an array.\n * Array can contain Strings or Objects with segment's info.\n *\n * For each item which is a string, will be generated a segment with the given\n * string and the more appropriate encoding mode.\n *\n * For each item which is an object, will be generated a segment with the given\n * data and mode.\n * Objects must contain at least the property \"data\".\n * If property \"mode\" is not present, the more suitable mode will be used.\n *\n * @param {Array} array Array of objects with segments data\n * @return {Array} Array of Segments\n */\nexports.fromArray = function fromArray (array) {\n return array.reduce(function (acc, seg) {\n if (typeof seg === 'string') {\n acc.push(buildSingleSegment(seg, null))\n } else if (seg.data) {\n acc.push(buildSingleSegment(seg.data, seg.mode))\n }\n\n return acc\n }, [])\n}\n\n/**\n * Builds an optimized sequence of segments from a string,\n * which will produce the shortest possible bitstream.\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @return {Array} Array of segments\n */\nexports.fromString = function fromString (data, version) {\n const segs = getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n\n const nodes = buildNodes(segs)\n const graph = buildGraph(nodes, version)\n const path = dijkstra.find_path(graph.map, 'start', 'end')\n\n const optimizedSegs = []\n for (let i = 1; i < path.length - 1; i++) {\n optimizedSegs.push(graph.table[path[i]].node)\n }\n\n return exports.fromArray(mergeSegments(optimizedSegs))\n}\n\n/**\n * Splits a string in various segments with the modes which\n * best represent their content.\n * The produced segments are far from being optimized.\n * The output of this function is only used to estimate a QR Code version\n * which may contain the data.\n *\n * @param {string} data Input string\n * @return {Array} Array of segments\n */\nexports.rawSplit = function rawSplit (data) {\n return exports.fromArray(\n getSegmentsFromString(data, Utils.isKanjiModeEnabled())\n )\n}\n", "const Utils = require('./utils')\nconst ECLevel = require('./error-correction-level')\nconst BitBuffer = require('./bit-buffer')\nconst BitMatrix = require('./bit-matrix')\nconst AlignmentPattern = require('./alignment-pattern')\nconst FinderPattern = require('./finder-pattern')\nconst MaskPattern = require('./mask-pattern')\nconst ECCode = require('./error-correction-code')\nconst ReedSolomonEncoder = require('./reed-solomon-encoder')\nconst Version = require('./version')\nconst FormatInfo = require('./format-info')\nconst Mode = require('./mode')\nconst Segments = require('./segments')\n\n/**\n * QRCode for JavaScript\n *\n * modified by Ryan Day for nodejs support\n * Copyright (c) 2011 Ryan Day\n *\n * Licensed under the MIT license:\n * http://www.opensource.org/licenses/mit-license.php\n *\n//---------------------------------------------------------------------\n// QRCode for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n// http://www.opensource.org/licenses/mit-license.php\n//\n// The word \"QR Code\" is registered trademark of\n// DENSO WAVE INCORPORATED\n// http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n*/\n\n/**\n * Add finder patterns bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupFinderPattern (matrix, version) {\n const size = matrix.size\n const pos = FinderPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -1; r <= 7; r++) {\n if (row + r <= -1 || size <= row + r) continue\n\n for (let c = -1; c <= 7; c++) {\n if (col + c <= -1 || size <= col + c) continue\n\n if ((r >= 0 && r <= 6 && (c === 0 || c === 6)) ||\n (c >= 0 && c <= 6 && (r === 0 || r === 6)) ||\n (r >= 2 && r <= 4 && c >= 2 && c <= 4)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add timing pattern bits to matrix\n *\n * Note: this function must be called before {@link setupAlignmentPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n */\nfunction setupTimingPattern (matrix) {\n const size = matrix.size\n\n for (let r = 8; r < size - 8; r++) {\n const value = r % 2 === 0\n matrix.set(r, 6, value, true)\n matrix.set(6, r, value, true)\n }\n}\n\n/**\n * Add alignment patterns bits to matrix\n *\n * Note: this function must be called after {@link setupTimingPattern}\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupAlignmentPattern (matrix, version) {\n const pos = AlignmentPattern.getPositions(version)\n\n for (let i = 0; i < pos.length; i++) {\n const row = pos[i][0]\n const col = pos[i][1]\n\n for (let r = -2; r <= 2; r++) {\n for (let c = -2; c <= 2; c++) {\n if (r === -2 || r === 2 || c === -2 || c === 2 ||\n (r === 0 && c === 0)) {\n matrix.set(row + r, col + c, true, true)\n } else {\n matrix.set(row + r, col + c, false, true)\n }\n }\n }\n }\n}\n\n/**\n * Add version info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Number} version QR Code version\n */\nfunction setupVersionInfo (matrix, version) {\n const size = matrix.size\n const bits = Version.getEncodedBits(version)\n let row, col, mod\n\n for (let i = 0; i < 18; i++) {\n row = Math.floor(i / 3)\n col = i % 3 + size - 8 - 3\n mod = ((bits >> i) & 1) === 1\n\n matrix.set(row, col, mod, true)\n matrix.set(col, row, mod, true)\n }\n}\n\n/**\n * Add format info bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {Number} maskPattern Mask pattern reference value\n */\nfunction setupFormatInfo (matrix, errorCorrectionLevel, maskPattern) {\n const size = matrix.size\n const bits = FormatInfo.getEncodedBits(errorCorrectionLevel, maskPattern)\n let i, mod\n\n for (i = 0; i < 15; i++) {\n mod = ((bits >> i) & 1) === 1\n\n // vertical\n if (i < 6) {\n matrix.set(i, 8, mod, true)\n } else if (i < 8) {\n matrix.set(i + 1, 8, mod, true)\n } else {\n matrix.set(size - 15 + i, 8, mod, true)\n }\n\n // horizontal\n if (i < 8) {\n matrix.set(8, size - i - 1, mod, true)\n } else if (i < 9) {\n matrix.set(8, 15 - i - 1 + 1, mod, true)\n } else {\n matrix.set(8, 15 - i - 1, mod, true)\n }\n }\n\n // fixed module\n matrix.set(size - 8, 8, 1, true)\n}\n\n/**\n * Add encoded data bits to matrix\n *\n * @param {BitMatrix} matrix Modules matrix\n * @param {Uint8Array} data Data codewords\n */\nfunction setupData (matrix, data) {\n const size = matrix.size\n let inc = -1\n let row = size - 1\n let bitIndex = 7\n let byteIndex = 0\n\n for (let col = size - 1; col > 0; col -= 2) {\n if (col === 6) col--\n\n while (true) {\n for (let c = 0; c < 2; c++) {\n if (!matrix.isReserved(row, col - c)) {\n let dark = false\n\n if (byteIndex < data.length) {\n dark = (((data[byteIndex] >>> bitIndex) & 1) === 1)\n }\n\n matrix.set(row, col - c, dark)\n bitIndex--\n\n if (bitIndex === -1) {\n byteIndex++\n bitIndex = 7\n }\n }\n }\n\n row += inc\n\n if (row < 0 || size <= row) {\n row -= inc\n inc = -inc\n break\n }\n }\n }\n}\n\n/**\n * Create encoded codewords from data input\n *\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @param {ByteData} data Data input\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createData (version, errorCorrectionLevel, segments) {\n // Prepare data buffer\n const buffer = new BitBuffer()\n\n segments.forEach(function (data) {\n // prefix data with mode indicator (4 bits)\n buffer.put(data.mode.bit, 4)\n\n // Prefix data with character count indicator.\n // The character count indicator is a string of bits that represents the\n // number of characters that are being encoded.\n // The character count indicator must be placed after the mode indicator\n // and must be a certain number of bits long, depending on the QR version\n // and data mode\n // @see {@link Mode.getCharCountIndicator}.\n buffer.put(data.getLength(), Mode.getCharCountIndicator(data.mode, version))\n\n // add binary data sequence to buffer\n data.write(buffer)\n })\n\n // Calculate required number of bits\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n const dataTotalCodewordsBits = (totalCodewords - ecTotalCodewords) * 8\n\n // Add a terminator.\n // If the bit string is shorter than the total number of required bits,\n // a terminator of up to four 0s must be added to the right side of the string.\n // If the bit string is more than four bits shorter than the required number of bits,\n // add four 0s to the end.\n if (buffer.getLengthInBits() + 4 <= dataTotalCodewordsBits) {\n buffer.put(0, 4)\n }\n\n // If the bit string is fewer than four bits shorter, add only the number of 0s that\n // are needed to reach the required number of bits.\n\n // After adding the terminator, if the number of bits in the string is not a multiple of 8,\n // pad the string on the right with 0s to make the string's length a multiple of 8.\n while (buffer.getLengthInBits() % 8 !== 0) {\n buffer.putBit(0)\n }\n\n // Add pad bytes if the string is still shorter than the total number of required bits.\n // Extend the buffer to fill the data capacity of the symbol corresponding to\n // the Version and Error Correction Level by adding the Pad Codewords 11101100 (0xEC)\n // and 00010001 (0x11) alternately.\n const remainingByte = (dataTotalCodewordsBits - buffer.getLengthInBits()) / 8\n for (let i = 0; i < remainingByte; i++) {\n buffer.put(i % 2 ? 0x11 : 0xEC, 8)\n }\n\n return createCodewords(buffer, version, errorCorrectionLevel)\n}\n\n/**\n * Encode input data with Reed-Solomon and return codewords with\n * relative error correction bits\n *\n * @param {BitBuffer} bitBuffer Data to encode\n * @param {Number} version QR Code version\n * @param {ErrorCorrectionLevel} errorCorrectionLevel Error correction level\n * @return {Uint8Array} Buffer containing encoded codewords\n */\nfunction createCodewords (bitBuffer, version, errorCorrectionLevel) {\n // Total codewords for this QR code version (Data + Error correction)\n const totalCodewords = Utils.getSymbolTotalCodewords(version)\n\n // Total number of error correction codewords\n const ecTotalCodewords = ECCode.getTotalCodewordsCount(version, errorCorrectionLevel)\n\n // Total number of data codewords\n const dataTotalCodewords = totalCodewords - ecTotalCodewords\n\n // Total number of blocks\n const ecTotalBlocks = ECCode.getBlocksCount(version, errorCorrectionLevel)\n\n // Calculate how many blocks each group should contain\n const blocksInGroup2 = totalCodewords % ecTotalBlocks\n const blocksInGroup1 = ecTotalBlocks - blocksInGroup2\n\n const totalCodewordsInGroup1 = Math.floor(totalCodewords / ecTotalBlocks)\n\n const dataCodewordsInGroup1 = Math.floor(dataTotalCodewords / ecTotalBlocks)\n const dataCodewordsInGroup2 = dataCodewordsInGroup1 + 1\n\n // Number of EC codewords is the same for both groups\n const ecCount = totalCodewordsInGroup1 - dataCodewordsInGroup1\n\n // Initialize a Reed-Solomon encoder with a generator polynomial of degree ecCount\n const rs = new ReedSolomonEncoder(ecCount)\n\n let offset = 0\n const dcData = new Array(ecTotalBlocks)\n const ecData = new Array(ecTotalBlocks)\n let maxDataSize = 0\n const buffer = new Uint8Array(bitBuffer.buffer)\n\n // Divide the buffer into the required number of blocks\n for (let b = 0; b < ecTotalBlocks; b++) {\n const dataSize = b < blocksInGroup1 ? dataCodewordsInGroup1 : dataCodewordsInGroup2\n\n // extract a block of data from buffer\n dcData[b] = buffer.slice(offset, offset + dataSize)\n\n // Calculate EC codewords for this data block\n ecData[b] = rs.encode(dcData[b])\n\n offset += dataSize\n maxDataSize = Math.max(maxDataSize, dataSize)\n }\n\n // Create final data\n // Interleave the data and error correction codewords from each block\n const data = new Uint8Array(totalCodewords)\n let index = 0\n let i, r\n\n // Add data codewords\n for (i = 0; i < maxDataSize; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n if (i < dcData[r].length) {\n data[index++] = dcData[r][i]\n }\n }\n }\n\n // Apped EC codewords\n for (i = 0; i < ecCount; i++) {\n for (r = 0; r < ecTotalBlocks; r++) {\n data[index++] = ecData[r][i]\n }\n }\n\n return data\n}\n\n/**\n * Build QR Code symbol\n *\n * @param {String} data Input string\n * @param {Number} version QR Code version\n * @param {ErrorCorretionLevel} errorCorrectionLevel Error level\n * @param {MaskPattern} maskPattern Mask pattern\n * @return {Object} Object containing symbol data\n */\nfunction createSymbol (data, version, errorCorrectionLevel, maskPattern) {\n let segments\n\n if (Array.isArray(data)) {\n segments = Segments.fromArray(data)\n } else if (typeof data === 'string') {\n let estimatedVersion = version\n\n if (!estimatedVersion) {\n const rawSegments = Segments.rawSplit(data)\n\n // Estimate best version that can contain raw splitted segments\n estimatedVersion = Version.getBestVersionForData(rawSegments, errorCorrectionLevel)\n }\n\n // Build optimized segments\n // If estimated version is undefined, try with the highest version\n segments = Segments.fromString(data, estimatedVersion || 40)\n } else {\n throw new Error('Invalid data')\n }\n\n // Get the min version that can contain data\n const bestVersion = Version.getBestVersionForData(segments, errorCorrectionLevel)\n\n // If no version is found, data cannot be stored\n if (!bestVersion) {\n throw new Error('The amount of data is too big to be stored in a QR Code')\n }\n\n // If not specified, use min version as default\n if (!version) {\n version = bestVersion\n\n // Check if the specified version can contain the data\n } else if (version < bestVersion) {\n throw new Error('\\n' +\n 'The chosen QR Code version cannot contain this amount of data.\\n' +\n 'Minimum version required to store current data is: ' + bestVersion + '.\\n'\n )\n }\n\n const dataBits = createData(version, errorCorrectionLevel, segments)\n\n // Allocate matrix buffer\n const moduleCount = Utils.getSymbolSize(version)\n const modules = new BitMatrix(moduleCount)\n\n // Add function modules\n setupFinderPattern(modules, version)\n setupTimingPattern(modules)\n setupAlignmentPattern(modules, version)\n\n // Add temporary dummy bits for format info just to set them as reserved.\n // This is needed to prevent these bits from being masked by {@link MaskPattern.applyMask}\n // since the masking operation must be performed only on the encoding region.\n // These blocks will be replaced with correct values later in code.\n setupFormatInfo(modules, errorCorrectionLevel, 0)\n\n if (version >= 7) {\n setupVersionInfo(modules, version)\n }\n\n // Add data codewords\n setupData(modules, dataBits)\n\n if (isNaN(maskPattern)) {\n // Find best mask pattern\n maskPattern = MaskPattern.getBestMask(modules,\n setupFormatInfo.bind(null, modules, errorCorrectionLevel))\n }\n\n // Apply mask pattern\n MaskPattern.applyMask(maskPattern, modules)\n\n // Replace format info bits with correct values\n setupFormatInfo(modules, errorCorrectionLevel, maskPattern)\n\n return {\n modules: modules,\n version: version,\n errorCorrectionLevel: errorCorrectionLevel,\n maskPattern: maskPattern,\n segments: segments\n }\n}\n\n/**\n * QR Code\n *\n * @param {String | Array} data Input data\n * @param {Object} options Optional configurations\n * @param {Number} options.version QR Code version\n * @param {String} options.errorCorrectionLevel Error correction level\n * @param {Function} options.toSJISFunc Helper func to convert utf8 to sjis\n */\nexports.create = function create (data, options) {\n if (typeof data === 'undefined' || data === '') {\n throw new Error('No input text')\n }\n\n let errorCorrectionLevel = ECLevel.M\n let version\n let mask\n\n if (typeof options !== 'undefined') {\n // Use higher error correction level as default\n errorCorrectionLevel = ECLevel.from(options.errorCorrectionLevel, ECLevel.M)\n version = Version.from(options.version)\n mask = MaskPattern.from(options.maskPattern)\n\n if (options.toSJISFunc) {\n Utils.setToSJISFunction(options.toSJISFunc)\n }\n }\n\n return createSymbol(data, version, errorCorrectionLevel, mask)\n}\n", "function hex2rgba (hex) {\n if (typeof hex === 'number') {\n hex = hex.toString()\n }\n\n if (typeof hex !== 'string') {\n throw new Error('Color should be defined as hex string')\n }\n\n let hexCode = hex.slice().replace('#', '').split('')\n if (hexCode.length < 3 || hexCode.length === 5 || hexCode.length > 8) {\n throw new Error('Invalid hex color: ' + hex)\n }\n\n // Convert from short to long form (fff -> ffffff)\n if (hexCode.length === 3 || hexCode.length === 4) {\n hexCode = Array.prototype.concat.apply([], hexCode.map(function (c) {\n return [c, c]\n }))\n }\n\n // Add default alpha value\n if (hexCode.length === 6) hexCode.push('F', 'F')\n\n const hexValue = parseInt(hexCode.join(''), 16)\n\n return {\n r: (hexValue >> 24) & 255,\n g: (hexValue >> 16) & 255,\n b: (hexValue >> 8) & 255,\n a: hexValue & 255,\n hex: '#' + hexCode.slice(0, 6).join('')\n }\n}\n\nexports.getOptions = function getOptions (options) {\n if (!options) options = {}\n if (!options.color) options.color = {}\n\n const margin = typeof options.margin === 'undefined' ||\n options.margin === null ||\n options.margin < 0\n ? 4\n : options.margin\n\n const width = options.width && options.width >= 21 ? options.width : undefined\n const scale = options.scale || 4\n\n return {\n width: width,\n scale: width ? 4 : scale,\n margin: margin,\n color: {\n dark: hex2rgba(options.color.dark || '#000000ff'),\n light: hex2rgba(options.color.light || '#ffffffff')\n },\n type: options.type,\n rendererOpts: options.rendererOpts || {}\n }\n}\n\nexports.getScale = function getScale (qrSize, opts) {\n return opts.width && opts.width >= qrSize + opts.margin * 2\n ? opts.width / (qrSize + opts.margin * 2)\n : opts.scale\n}\n\nexports.getImageWidth = function getImageWidth (qrSize, opts) {\n const scale = exports.getScale(qrSize, opts)\n return Math.floor((qrSize + opts.margin * 2) * scale)\n}\n\nexports.qrToImageData = function qrToImageData (imgData, qr, opts) {\n const size = qr.modules.size\n const data = qr.modules.data\n const scale = exports.getScale(size, opts)\n const symbolSize = Math.floor((size + opts.margin * 2) * scale)\n const scaledMargin = opts.margin * scale\n const palette = [opts.color.light, opts.color.dark]\n\n for (let i = 0; i < symbolSize; i++) {\n for (let j = 0; j < symbolSize; j++) {\n let posDst = (i * symbolSize + j) * 4\n let pxColor = opts.color.light\n\n if (i >= scaledMargin && j >= scaledMargin &&\n i < symbolSize - scaledMargin && j < symbolSize - scaledMargin) {\n const iSrc = Math.floor((i - scaledMargin) / scale)\n const jSrc = Math.floor((j - scaledMargin) / scale)\n pxColor = palette[data[iSrc * size + jSrc] ? 1 : 0]\n }\n\n imgData[posDst++] = pxColor.r\n imgData[posDst++] = pxColor.g\n imgData[posDst++] = pxColor.b\n imgData[posDst] = pxColor.a\n }\n }\n}\n", "const Utils = require('./utils')\n\nfunction clearCanvas (ctx, canvas, size) {\n ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n if (!canvas.style) canvas.style = {}\n canvas.height = size\n canvas.width = size\n canvas.style.height = size + 'px'\n canvas.style.width = size + 'px'\n}\n\nfunction getCanvasElement () {\n try {\n return document.createElement('canvas')\n } catch (e) {\n throw new Error('You need to specify a canvas element')\n }\n}\n\nexports.render = function render (qrData, canvas, options) {\n let opts = options\n let canvasEl = canvas\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!canvas) {\n canvasEl = getCanvasElement()\n }\n\n opts = Utils.getOptions(opts)\n const size = Utils.getImageWidth(qrData.modules.size, opts)\n\n const ctx = canvasEl.getContext('2d')\n const image = ctx.createImageData(size, size)\n Utils.qrToImageData(image.data, qrData, opts)\n\n clearCanvas(ctx, canvasEl, size)\n ctx.putImageData(image, 0, 0)\n\n return canvasEl\n}\n\nexports.renderToDataURL = function renderToDataURL (qrData, canvas, options) {\n let opts = options\n\n if (typeof opts === 'undefined' && (!canvas || !canvas.getContext)) {\n opts = canvas\n canvas = undefined\n }\n\n if (!opts) opts = {}\n\n const canvasEl = exports.render(qrData, canvas, opts)\n\n const type = opts.type || 'image/png'\n const rendererOpts = opts.rendererOpts || {}\n\n return canvasEl.toDataURL(type, rendererOpts.quality)\n}\n", "const Utils = require('./utils')\n\nfunction getColorAttrib (color, attrib) {\n const alpha = color.a / 255\n const str = attrib + '=\"' + color.hex + '\"'\n\n return alpha < 1\n ? str + ' ' + attrib + '-opacity=\"' + alpha.toFixed(2).slice(1) + '\"'\n : str\n}\n\nfunction svgCmd (cmd, x, y) {\n let str = cmd + x\n if (typeof y !== 'undefined') str += ' ' + y\n\n return str\n}\n\nfunction qrToPath (data, size, margin) {\n let path = ''\n let moveBy = 0\n let newRow = false\n let lineLength = 0\n\n for (let i = 0; i < data.length; i++) {\n const col = Math.floor(i % size)\n const row = Math.floor(i / size)\n\n if (!col && !newRow) newRow = true\n\n if (data[i]) {\n lineLength++\n\n if (!(i > 0 && col > 0 && data[i - 1])) {\n path += newRow\n ? svgCmd('M', col + margin, 0.5 + row + margin)\n : svgCmd('m', moveBy, 0)\n\n moveBy = 0\n newRow = false\n }\n\n if (!(col + 1 < size && data[i + 1])) {\n path += svgCmd('h', lineLength)\n lineLength = 0\n }\n } else {\n moveBy++\n }\n }\n\n return path\n}\n\nexports.render = function render (qrData, options, cb) {\n const opts = Utils.getOptions(options)\n const size = qrData.modules.size\n const data = qrData.modules.data\n const qrcodesize = size + opts.margin * 2\n\n const bg = !opts.color.light.a\n ? ''\n : '<path ' + getColorAttrib(opts.color.light, 'fill') +\n ' d=\"M0 0h' + qrcodesize + 'v' + qrcodesize + 'H0z\"/>'\n\n const path =\n '<path ' + getColorAttrib(opts.color.dark, 'stroke') +\n ' d=\"' + qrToPath(data, size, opts.margin) + '\"/>'\n\n const viewBox = 'viewBox=\"' + '0 0 ' + qrcodesize + ' ' + qrcodesize + '\"'\n\n const width = !opts.width ? '' : 'width=\"' + opts.width + '\" height=\"' + opts.width + '\" '\n\n const svgTag = '<svg xmlns=\"http://www.w3.org/2000/svg\" ' + width + viewBox + ' shape-rendering=\"crispEdges\">' + bg + path + '</svg>\\n'\n\n if (typeof cb === 'function') {\n cb(null, svgTag)\n }\n\n return svgTag\n}\n", "\nconst canPromise = require('./can-promise')\n\nconst QRCode = require('./core/qrcode')\nconst CanvasRenderer = require('./renderer/canvas')\nconst SvgRenderer = require('./renderer/svg-tag.js')\n\nfunction renderCanvas (renderFunc, canvas, text, opts, cb) {\n const args = [].slice.call(arguments, 1)\n const argsNum = args.length\n const isLastArgCb = typeof args[argsNum - 1] === 'function'\n\n if (!isLastArgCb && !canPromise()) {\n throw new Error('Callback required as last argument')\n }\n\n if (isLastArgCb) {\n if (argsNum < 2) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 2) {\n cb = text\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 3) {\n if (canvas.getContext && typeof cb === 'undefined') {\n cb = opts\n opts = undefined\n } else {\n cb = opts\n opts = text\n text = canvas\n canvas = undefined\n }\n }\n } else {\n if (argsNum < 1) {\n throw new Error('Too few arguments provided')\n }\n\n if (argsNum === 1) {\n text = canvas\n canvas = opts = undefined\n } else if (argsNum === 2 && !canvas.getContext) {\n opts = text\n text = canvas\n canvas = undefined\n }\n\n return new Promise(function (resolve, reject) {\n try {\n const data = QRCode.create(text, opts)\n resolve(renderFunc(data, canvas, opts))\n } catch (e) {\n reject(e)\n }\n })\n }\n\n try {\n const data = QRCode.create(text, opts)\n cb(null, renderFunc(data, canvas, opts))\n } catch (e) {\n cb(e)\n }\n}\n\nexports.create = QRCode.create\nexports.toCanvas = renderCanvas.bind(null, CanvasRenderer.render)\nexports.toDataURL = renderCanvas.bind(null, CanvasRenderer.renderToDataURL)\n\n// only svg for now.\nexports.toString = renderCanvas.bind(null, function (data, _, opts) {\n return SvgRenderer.render(data, opts)\n})\n", "{\n \"schema_version\": \"4.0.0\",\n \"generated\": \"2026-06-20\",\n \"description\": \"Static database of providers and routes the OpenReceive payment wizard can suggest for paying a BOLT11 Lightning invoice.\",\n \"filter\": \"Providers that can send to an arbitrary third-party BOLT11 Lightning invoice, including withdrawal and swap payout flows.\",\n \"_meta\": {\n \"provider_fields\": {\n \"id\": \"stable slug key\",\n \"name\": \"display name\",\n \"kind\": \"short provider category shown as a one-line UI subtitle\",\n \"url\": \"homepage\",\n \"us\": \"true=US-available, false=US-excluded, null=unknown\",\n \"lightning_docs_url\": \"official how-to-pay/send Lightning invoice page, or null\",\n \"icon_path\": \"repo-local icon path used by browser UI\",\n \"tutorials\": \"optional ordered app-specific payment tutorial screenshots\"\n },\n \"route_ref_fields\": {\n \"provider\": \"provider id\",\n \"rank\": \"1-based route-specific display ordering; required when a route has explicit ranked suggestions\"\n }\n },\n \"assets_index\": [\n {\n \"symbol\": \"btc\",\n \"label\": \"Bitcoin Lightning\",\n \"route\": \"btc-lightning\"\n },\n {\n \"symbol\": \"usdt\",\n \"label\": \"Tether (USDT \u2014 any chain)\",\n \"route\": \"usdt\"\n },\n {\n \"symbol\": \"usdc\",\n \"label\": \"USD Coin (USDC)\",\n \"route\": \"usdc\"\n },\n {\n \"symbol\": \"eth\",\n \"label\": \"Ethereum (ETH)\",\n \"route\": \"eth\"\n },\n {\n \"symbol\": \"xmr\",\n \"label\": \"Monero (XMR)\",\n \"route\": \"xmr\"\n },\n {\n \"symbol\": \"ltc\",\n \"label\": \"Litecoin (LTC)\",\n \"route\": \"ltc\"\n },\n {\n \"symbol\": \"trx\",\n \"label\": \"Tron (TRX)\",\n \"route\": \"trx\"\n },\n {\n \"symbol\": \"sol\",\n \"label\": \"Solana (SOL)\",\n \"route\": \"sol\"\n },\n {\n \"symbol\": \"xrp\",\n \"label\": \"XRP\",\n \"route\": \"xrp\"\n },\n {\n \"symbol\": \"usd\",\n \"label\": \"US Dollars (bank / card)\"\n },\n {\n \"symbol\": \"eur\",\n \"label\": \"Euro (SEPA / bank)\"\n },\n {\n \"symbol\": \"gbp\",\n \"label\": \"British Pound\"\n }\n ],\n \"providers\": {\n \"rizful\": {\n \"id\": \"rizful\",\n \"name\": \"Rizful.com\",\n \"kind\": \"browser wallet\",\n \"url\": \"https://rizful.com\",\n \"us\": null,\n \"lightning_docs_url\": \"https://rizful.com/pay_lightning_invoice/rizful\",\n \"icon_path\": \"assets/provider-icons/rizful.webp\"\n },\n \"boltz\": {\n \"id\": \"boltz\",\n \"name\": \"Boltz\",\n \"kind\": \"swap service\",\n \"url\": \"https://boltz.exchange\",\n \"us\": null,\n \"lightning_docs_url\": \"https://api.docs.boltz.exchange/lifecycle.html\",\n \"icon_path\": \"assets/provider-icons/boltz.webp\",\n \"tutorials\": [\n {\n \"index\": 1,\n \"path\": \"assets/pay_tutorials/boltz-1.webp\",\n \"caption\": \"Select the currency you want to start with, and select Receive LN (Bitcoin Lightning)\"\n },\n {\n \"index\": 2,\n \"path\": \"assets/pay_tutorials/boltz-2.webp\",\n \"caption\": \"Paste Lightning invoice and click Create Swap\"\n }\n ]\n },\n \"strike\": {\n \"id\": \"strike\",\n \"name\": \"Strike\",\n \"kind\": \"payments app\",\n \"url\": \"https://strike.me\",\n \"us\": true,\n \"lightning_docs_url\": \"https://docs.strike.me/walkthrough/sending-payments/\",\n \"icon_path\": \"assets/provider-icons/strike.webp\",\n \"tutorials\": [\n {\n \"index\": 1,\n \"path\": \"assets/pay_tutorials/strike-1.webp\",\n \"caption\": \"Tap Send\"\n },\n {\n \"index\": 2,\n \"path\": \"assets/pay_tutorials/strike-2.webp\",\n \"caption\": \"Choose Bitcoin wallet\"\n },\n {\n \"index\": 3,\n \"path\": \"assets/pay_tutorials/strike-3.webp\",\n \"caption\": \"Tap Paste\"\n },\n {\n \"index\": 4,\n \"path\": \"assets/pay_tutorials/strike-4.webp\",\n \"caption\": \"Confirm the payment\"\n }\n ]\n },\n \"aqua\": {\n \"id\": \"aqua\",\n \"name\": \"Aqua Wallet\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://aqua.net\",\n \"us\": null,\n \"lightning_docs_url\": \"https://aqua.net/\",\n \"icon_path\": \"assets/provider-icons/aqua.webp\"\n },\n \"phoenix\": {\n \"id\": \"phoenix\",\n \"name\": \"Phoenix\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://phoenix.acinq.co\",\n \"us\": null,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/phoenix.webp\"\n },\n \"zeus\": {\n \"id\": \"zeus\",\n \"name\": \"Zeus\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://zeusln.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://docs.zeusln.app/\",\n \"icon_path\": \"assets/provider-icons/zeus.webp\"\n },\n \"coinbase\": {\n \"id\": \"coinbase\",\n \"name\": \"Coinbase\",\n \"kind\": \"exchange\",\n \"url\": \"https://coinbase.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://help.coinbase.com/en/coinbase/trading-and-funding/sending-or-receiving-cryptocurrency/lightning\",\n \"icon_path\": \"assets/provider-icons/coinbase.webp\",\n \"tutorials\": [\n {\n \"index\": 1,\n \"path\": \"assets/pay_tutorials/coinbase-1.webp\",\n \"caption\": \"Tap Pay\"\n },\n {\n \"index\": 2,\n \"path\": \"assets/pay_tutorials/coinbase-2.webp\",\n \"caption\": \"Tap the QR scanner\"\n }\n ]\n },\n \"kraken\": {\n \"id\": \"kraken\",\n \"name\": \"Kraken\",\n \"kind\": \"exchange\",\n \"url\": \"https://kraken.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://support.kraken.com/articles/5068216131988-how-do-i-send-bitcoin-on-the-lightning-network-\",\n \"icon_path\": \"assets/provider-icons/kraken.webp\",\n \"tutorials\": [\n {\n \"index\": 1,\n \"path\": \"assets/pay_tutorials/kraken-1.webp\",\n \"caption\": \"Tap Bitcoin\"\n },\n {\n \"index\": 2,\n \"path\": \"assets/pay_tutorials/kraken-2.webp\",\n \"caption\": \"Tap Withdraw\"\n },\n {\n \"index\": 3,\n \"path\": \"assets/pay_tutorials/kraken-3.webp\",\n \"caption\": \"Choose Lightning\"\n },\n {\n \"index\": 4,\n \"path\": \"assets/pay_tutorials/kraken-4.webp\",\n \"caption\": \"Paste or scan the invoice\"\n }\n ]\n },\n \"binance\": {\n \"id\": \"binance\",\n \"name\": \"Binance\",\n \"kind\": \"exchange\",\n \"url\": \"https://binance.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://www.binance.com/en/support/faq/how-to-use-the-bitcoin-lightning-network-to-deposit-and-withdraw-btc-on-binance-7a4eb2d9ccaf4433908b448aa3a93493\",\n \"icon_path\": \"assets/provider-icons/binance.webp\"\n },\n \"okx\": {\n \"id\": \"okx\",\n \"name\": \"OKX\",\n \"kind\": \"exchange\",\n \"url\": \"https://okx.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://www.okx.com/en-us/help/how-do-i-withdraw-bitcoin-btc-with-okx-lightning-network\",\n \"icon_path\": \"assets/provider-icons/okx.webp\"\n },\n \"bitfinex\": {\n \"id\": \"bitfinex\",\n \"name\": \"Bitfinex\",\n \"kind\": \"exchange\",\n \"url\": \"https://bitfinex.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://support.bitfinex.com/hc/en-us/articles/360039801053-Lightning-Network-BTC-LN-BTC-Deposits-Withdrawals\",\n \"icon_path\": \"assets/provider-icons/bitfinex.webp\"\n },\n \"kucoin\": {\n \"id\": \"kucoin\",\n \"name\": \"KuCoin\",\n \"kind\": \"exchange\",\n \"url\": \"https://kucoin.com\",\n \"us\": false,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/kucoin.webp\"\n },\n \"cashapp\": {\n \"id\": \"cashapp\",\n \"name\": \"Cash App\",\n \"kind\": \"payments app\",\n \"url\": \"https://cash.app\",\n \"us\": true,\n \"lightning_docs_url\": \"https://cash.app/help/us/en-US/6506-lightning\",\n \"icon_path\": \"assets/provider-icons/cashapp.webp\",\n \"tutorials\": [\n {\n \"index\": 1,\n \"path\": \"assets/pay_tutorials/cashapp-1.webp\",\n \"caption\": \"Tap your Bitcoin balance\"\n },\n {\n \"index\": 2,\n \"path\": \"assets/pay_tutorials/cashapp-2.webp\",\n \"caption\": \"Tap the transfer button\"\n },\n {\n \"index\": 3,\n \"path\": \"assets/pay_tutorials/cashapp-3.webp\",\n \"caption\": \"Choose Send\"\n },\n {\n \"index\": 4,\n \"path\": \"assets/pay_tutorials/cashapp-4.webp\",\n \"caption\": \"Tap the QR scanner\"\n },\n {\n \"index\": 5,\n \"path\": \"assets/pay_tutorials/cashapp-5.webp\",\n \"caption\": \"Paste the invoice\"\n },\n {\n \"index\": 6,\n \"path\": \"assets/pay_tutorials/cashapp-6.webp\",\n \"caption\": \"Confirm and pay\"\n }\n ]\n },\n \"river\": {\n \"id\": \"river\",\n \"name\": \"River Financial\",\n \"kind\": \"brokerage\",\n \"url\": \"https://river.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://support.river.com/hc/en-us/articles/45489800672915-How-do-I-send-bitcoin\",\n \"icon_path\": \"assets/provider-icons/river.webp\"\n },\n \"coincorner\": {\n \"id\": \"coincorner\",\n \"name\": \"CoinCorner\",\n \"kind\": \"exchange\",\n \"url\": \"https://coincorner.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://support.coincorner.com/hc/en-us/articles/360020667299-Sending-and-receiving-via-Lightning\",\n \"icon_path\": \"assets/provider-icons/coincorner.webp\"\n },\n \"bullbitcoin\": {\n \"id\": \"bullbitcoin\",\n \"name\": \"Bull Bitcoin\",\n \"kind\": \"brokerage\",\n \"url\": \"https://bullbitcoin.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://www.bullbitcoin.com/\",\n \"icon_path\": \"assets/provider-icons/bullbitcoin.webp\"\n },\n \"fixedfloat\": {\n \"id\": \"fixedfloat\",\n \"name\": \"FixedFloat\",\n \"kind\": \"swap service\",\n \"url\": \"https://fixedfloat.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://ff.io/\",\n \"icon_path\": \"assets/provider-icons/fixedfloat.webp\",\n \"tutorials\": [\n {\n \"index\": 1,\n \"path\": \"assets/pay_tutorials/fixedfloat-1.webp\",\n \"caption\": \"Choose USDT to send, then BTC Lightning to receive\"\n },\n {\n \"index\": 2,\n \"path\": \"assets/pay_tutorials/fixedfloat-2.webp\",\n \"caption\": \"Paste the Lightning invoice, then tap Exchange now\"\n }\n ]\n },\n \"sideshift\": {\n \"id\": \"sideshift\",\n \"name\": \"SideShift.ai\",\n \"kind\": \"swap service\",\n \"url\": \"https://sideshift.ai\",\n \"us\": false,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/sideshift.webp\"\n },\n \"blink\": {\n \"id\": \"blink\",\n \"name\": \"Blink\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://blink.sv\",\n \"us\": false,\n \"lightning_docs_url\": \"https://www.blink.sv/\",\n \"icon_path\": \"assets/provider-icons/blink.webp\"\n },\n \"pouch\": {\n \"id\": \"pouch\",\n \"name\": \"Pouch\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://pouch.ph\",\n \"us\": false,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/pouch.webp\"\n },\n \"bitnob\": {\n \"id\": \"bitnob\",\n \"name\": \"Bitnob\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://bitnob.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://intercom.help/Bitnob-help-center/en/articles/6073721\",\n \"icon_path\": \"assets/provider-icons/bitnob.webp\"\n },\n \"bringin\": {\n \"id\": \"bringin\",\n \"name\": \"Bringin\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://bringin.xyz\",\n \"us\": false,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/bringin.webp\"\n },\n \"mtpelerin\": {\n \"id\": \"mtpelerin\",\n \"name\": \"Mt Pelerin\",\n \"kind\": \"brokerage\",\n \"url\": \"https://mtpelerin.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://www.mtpelerin.com/lightning-wallet\",\n \"icon_path\": \"assets/provider-icons/mtpelerin.webp\"\n },\n \"bipa\": {\n \"id\": \"bipa\",\n \"name\": \"Bipa\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://bipa.app\",\n \"us\": false,\n \"lightning_docs_url\": \"https://suporte.bipa.app/hc/pt-br/articles/4415356329371-Como-enviar-Bitcoin-pela-rede-Lightning-na-Bipa\",\n \"icon_path\": \"assets/provider-icons/bipa.webp\"\n },\n \"bitso\": {\n \"id\": \"bitso\",\n \"name\": \"Bitso\",\n \"kind\": \"exchange\",\n \"url\": \"https://bitso.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://support.bitso.com/hc/en-us/articles/32048877697172-Bitso-Help-Center-Lightning-Network-for-Bitcoin\",\n \"icon_path\": \"assets/provider-icons/bitso.webp\"\n },\n \"ripio\": {\n \"id\": \"ripio\",\n \"name\": \"Ripio\",\n \"kind\": \"exchange\",\n \"url\": \"https://ripio.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://ripio.com\",\n \"icon_path\": \"assets/provider-icons/ripio.webp\"\n },\n \"belo\": {\n \"id\": \"belo\",\n \"name\": \"Belo\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://belo.app\",\n \"us\": false,\n \"lightning_docs_url\": \"https://help.belo.app/en/articles/5899323-how-to-withdraw-btc-from-belo-via-the-lightning-network\",\n \"icon_path\": \"assets/provider-icons/belo.webp\"\n },\n \"shakepay\": {\n \"id\": \"shakepay\",\n \"name\": \"Shakepay\",\n \"kind\": \"brokerage\",\n \"url\": \"https://shakepay.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://help.shakepay.com/en/articles/12334301-how-to-receive-or-withdraw-bitcoin-on-the-lightning-network\",\n \"icon_path\": \"assets/provider-icons/shakepay.webp\"\n },\n \"bity\": {\n \"id\": \"bity\",\n \"name\": \"Bity / Bitybank\",\n \"kind\": \"exchange\",\n \"url\": \"https://bity.com.br\",\n \"us\": false,\n \"lightning_docs_url\": \"https://suporte.bity.com.br/pt-BR/articles/6260675-lightning-network\",\n \"icon_path\": \"assets/provider-icons/bity.webp\"\n },\n \"chivo\": {\n \"id\": \"chivo\",\n \"name\": \"Chivo\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://chivowallet.com\",\n \"us\": false,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/chivo.webp\"\n },\n \"speed\": {\n \"id\": \"speed\",\n \"name\": \"Speed\",\n \"kind\": \"payments app\",\n \"url\": \"https://tryspeed.com\",\n \"us\": false,\n \"lightning_docs_url\": \"https://www.tryspeed.com/blog/how-do-i-send-and-receive-bitcoin\",\n \"icon_path\": \"assets/provider-icons/speed.webp\"\n },\n \"walletofsatoshi\": {\n \"id\": \"walletofsatoshi\",\n \"name\": \"Wallet of Satoshi\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://www.walletofsatoshi.com\",\n \"us\": null,\n \"lightning_docs_url\": \"https://support.walletofsatoshi.com/\",\n \"icon_path\": \"assets/provider-icons/walletofsatoshi.webp\"\n },\n \"bitget\": {\n \"id\": \"bitget\",\n \"name\": \"Bitget\",\n \"kind\": \"exchange\",\n \"url\": \"https://www.bitget.com\",\n \"us\": false,\n \"lightning_docs_url\": null,\n \"icon_path\": \"assets/provider-icons/bitget.webp\"\n },\n \"okcoin\": {\n \"id\": \"okcoin\",\n \"name\": \"Okcoin\",\n \"kind\": \"exchange\",\n \"url\": \"https://www.okcoin.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://support.okcoin.com/hc/en-us/articles/360057853471\",\n \"icon_path\": \"assets/provider-icons/okcoin.webp\"\n },\n \"kryptex\": {\n \"id\": \"kryptex\",\n \"name\": \"Kryptex\",\n \"kind\": \"exchange\",\n \"url\": \"https://kryptex.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://www.kryptex.com/en/articles/bitcoin-lightning-network\",\n \"icon_path\": \"assets/provider-icons/kryptex.webp\"\n },\n \"bluewallet\": {\n \"id\": \"bluewallet\",\n \"name\": \"BlueWallet\",\n \"kind\": \"mobile wallet\",\n \"url\": \"https://bluewallet.io\",\n \"us\": true,\n \"lightning_docs_url\": \"https://bluewallet.io/docs/\",\n \"icon_path\": \"assets/provider-icons/bluewallet.webp\"\n },\n \"getalby\": {\n \"id\": \"getalby\",\n \"name\": \"Alby\",\n \"kind\": \"browser wallet\",\n \"url\": \"https://getalby.com\",\n \"us\": true,\n \"lightning_docs_url\": \"https://guides.getalby.com/user-guide/alby-hub/wallet/send\",\n \"icon_path\": \"assets/provider-icons/getalby.webp\"\n }\n },\n \"crypto_routes\": [\n {\n \"id\": \"btc-lightning\",\n \"symbol\": \"btc\",\n \"label\": \"Bitcoin Lightning\",\n \"providers\": [\n {\n \"provider\": \"rizful\",\n \"rank\": 1\n },\n {\n \"provider\": \"getalby\",\n \"rank\": 2\n },\n {\n \"provider\": \"zeus\",\n \"rank\": 3\n },\n {\n \"provider\": \"phoenix\",\n \"rank\": 4\n },\n {\n \"provider\": \"strike\",\n \"rank\": 5\n },\n {\n \"provider\": \"cashapp\",\n \"rank\": 6\n },\n {\n \"provider\": \"coinbase\",\n \"rank\": 7\n },\n {\n \"provider\": \"binance\",\n \"rank\": 8\n },\n {\n \"provider\": \"kraken\",\n \"rank\": 9\n },\n {\n \"provider\": \"walletofsatoshi\",\n \"rank\": 10\n },\n {\n \"provider\": \"okx\",\n \"rank\": 11\n },\n {\n \"provider\": \"bitfinex\",\n \"rank\": 12\n },\n {\n \"provider\": \"kucoin\",\n \"rank\": 13\n },\n {\n \"provider\": \"river\",\n \"rank\": 14\n },\n {\n \"provider\": \"aqua\",\n \"rank\": 15\n },\n {\n \"provider\": \"bluewallet\",\n \"rank\": 16\n },\n {\n \"provider\": \"boltz\",\n \"rank\": 17\n },\n {\n \"provider\": \"okcoin\",\n \"rank\": 18\n },\n {\n \"provider\": \"bitget\",\n \"rank\": 19\n },\n {\n \"provider\": \"kryptex\",\n \"rank\": 20\n },\n {\n \"provider\": \"coincorner\",\n \"rank\": 21\n },\n {\n \"provider\": \"fixedfloat\",\n \"rank\": 22\n },\n {\n \"provider\": \"sideshift\",\n \"rank\": 23\n },\n {\n \"provider\": \"blink\",\n \"rank\": 24\n },\n {\n \"provider\": \"speed\",\n \"rank\": 25\n },\n {\n \"provider\": \"bullbitcoin\",\n \"rank\": 26\n },\n {\n \"provider\": \"shakepay\",\n \"rank\": 27\n },\n {\n \"provider\": \"bitso\",\n \"rank\": 28\n },\n {\n \"provider\": \"bitnob\",\n \"rank\": 29\n },\n {\n \"provider\": \"pouch\",\n \"rank\": 30\n },\n {\n \"provider\": \"bringin\",\n \"rank\": 31\n },\n {\n \"provider\": \"mtpelerin\",\n \"rank\": 32\n },\n {\n \"provider\": \"bipa\",\n \"rank\": 33\n },\n {\n \"provider\": \"ripio\",\n \"rank\": 34\n },\n {\n \"provider\": \"belo\",\n \"rank\": 35\n },\n {\n \"provider\": \"bity\",\n \"rank\": 36\n },\n {\n \"provider\": \"chivo\",\n \"rank\": 37\n }\n ]\n },\n {\n \"id\": \"usdt\",\n \"symbol\": \"usdt\",\n \"label\": \"Tether (USDT \u2014 any chain)\",\n \"providers\": [\n {\n \"provider\": \"boltz\"\n },\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"bitget\"\n }\n ]\n },\n {\n \"id\": \"usdc\",\n \"symbol\": \"usdc\",\n \"label\": \"USD Coin (USDC)\",\n \"providers\": [\n {\n \"provider\": \"boltz\"\n },\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"coinbase\"\n },\n {\n \"provider\": \"kraken\"\n },\n {\n \"provider\": \"bitget\"\n },\n {\n \"provider\": \"okcoin\"\n }\n ]\n },\n {\n \"id\": \"eth\",\n \"symbol\": \"eth\",\n \"label\": \"Ethereum (ETH)\",\n \"providers\": [\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"sideshift\"\n },\n {\n \"provider\": \"coinbase\"\n },\n {\n \"provider\": \"kraken\"\n },\n {\n \"provider\": \"bitget\"\n },\n {\n \"provider\": \"okcoin\"\n }\n ]\n },\n {\n \"id\": \"xmr\",\n \"symbol\": \"xmr\",\n \"label\": \"Monero (XMR)\",\n \"providers\": [\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"sideshift\"\n }\n ]\n },\n {\n \"id\": \"ltc\",\n \"symbol\": \"ltc\",\n \"label\": \"Litecoin (LTC)\",\n \"providers\": [\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"sideshift\"\n },\n {\n \"provider\": \"kraken\"\n },\n {\n \"provider\": \"coinbase\"\n },\n {\n \"provider\": \"bitget\"\n },\n {\n \"provider\": \"okcoin\"\n }\n ]\n },\n {\n \"id\": \"trx\",\n \"symbol\": \"trx\",\n \"label\": \"Tron (TRX)\",\n \"providers\": [\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"bitget\"\n }\n ]\n },\n {\n \"id\": \"sol\",\n \"symbol\": \"sol\",\n \"label\": \"Solana (SOL)\",\n \"providers\": [\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"sideshift\"\n },\n {\n \"provider\": \"coinbase\"\n },\n {\n \"provider\": \"kraken\"\n },\n {\n \"provider\": \"bitget\"\n }\n ]\n },\n {\n \"id\": \"xrp\",\n \"symbol\": \"xrp\",\n \"label\": \"XRP\",\n \"providers\": [\n {\n \"provider\": \"fixedfloat\"\n },\n {\n \"provider\": \"coinbase\"\n },\n {\n \"provider\": \"kraken\"\n },\n {\n \"provider\": \"bitget\"\n }\n ]\n }\n ],\n \"disqualified_providers\": [\n {\n \"id\": \"relai\",\n \"name\": \"Relai\",\n \"url\": \"https://relai.app\",\n \"reason\": \"Lightning wallet sunset \u2014 Relai is removing its Lightning wallet; users told to move funds/close channels.\"\n },\n {\n \"id\": \"bitrefill\",\n \"name\": \"Bitrefill\",\n \"url\": \"https://bitrefill.com\",\n \"reason\": \"Lightning is only an inbound payment method for Bitrefill's own products; no pay-arbitrary-invoice feature.\"\n },\n {\n \"id\": \"pocketbitcoin\",\n \"name\": \"Pocket Bitcoin\",\n \"url\": \"https://pocketbitcoin.com\",\n \"reason\": \"Receive-only \u2014 fiat\u2192BTC is delivered to your own Lightning wallet; cannot pay a third-party invoice.\"\n },\n {\n \"id\": \"robosats\",\n \"name\": \"RoboSats\",\n \"url\": \"https://robosats.org\",\n \"reason\": \"Receive-only \u2014 you receive trade proceeds to your own invoice / pay only RoboSats' own escrow invoices.\"\n },\n {\n \"id\": \"lemon\",\n \"name\": \"Lemon Cash\",\n \"url\": \"https://lemon.me\",\n \"reason\": \"Lightning documented for receiving/deposits only; no verified flow to pay an arbitrary external invoice.\"\n },\n {\n \"id\": \"peach\",\n \"name\": \"Peach Bitcoin\",\n \"url\": \"https://peachbitcoin.com\",\n \"reason\": \"P2P with on-chain multisig escrow; Lightning not live for paying arbitrary invoices.\"\n },\n {\n \"id\": \"orangefren\",\n \"name\": \"Orangefren\",\n \"url\": \"https://orangefren.com\",\n \"reason\": \"Could not verify arbitrary-invoice payout from any official documentation; excluded pending verification.\"\n }\n ]\n}\n", "// The pay-tutorial screenshots ship inside the JavaScript too, but they are\n// the one image set a checkout does not draw on first paint (~270 KB of\n// base64 nobody sees until a tutorial opens), so they live behind a dynamic\n// import(). Code-splitting hosts fetch a separate JavaScript chunk on first\n// tutorial open; single-file builds include the same data in their main bundle.\n\ntype PayTutorialImages = Readonly<Record<string, string>>;\n\nlet cached: PayTutorialImages | undefined;\nlet loading: Promise<PayTutorialImages> | undefined;\n\n/**\n * Load the tutorial images. Memoised: the module is loaded once per page and\n * every later call answers the same promise. A rejection propagates \u2014 callers\n * treat it as \"no image\" and render the caption alone.\n */\nexport function loadPayTutorialImages(): Promise<PayTutorialImages> {\n loading ??= import(\"./generated/pay-tutorial-images.ts\").then((module) => {\n cached = module.payTutorialImages;\n return cached;\n });\n return loading;\n}\n\n/**\n * The `data:` URI for one tutorial `path`, synchronously, from the cache\n * {@link loadPayTutorialImages} fills. `undefined` until that promise has\n * resolved \u2014 a renderer draws the caption without an `<img>` in the meantime.\n */\nexport function payTutorialImage(path: string): string | undefined {\n return cached?.[path];\n}\n", "/* Generated by tools/package/generate-provider-images.mjs \u2014 do not edit. */\n// Source: packages/js/provider-data/src/assets/provider-icons/*.webp. Replace the .webp, then\n// run `npm run generate:provider-images`.\n\n/** Each packaged wallet logo as a `data:image/webp;base64` URI, keyed by its registry path. */\nexport const providerIconImages: Readonly<Record<string, string>> = Object.freeze({\n \"assets/provider-icons/aqua.webp\":\n \"data:image/webp;base64,UklGRvgBAABXRUJQVlA4IOwBAADQCQCdASogACAAPm0wkkYwrxOYDAQAQAbEtgBOmXG9P85tw7Yp5XuAPI56wD0AOkZ/aL0X//+nwQxbxaooCxY2eEzgo85skdk9caeZPqOEABZkUbnA/AAA/vVjnVpKsSG1Pqm7ek/ln9v8n39F7zecLs+hwSXeaorVTivwsNo3yvlT/6ANDBOQbd/Llt69/2ZtQzpyLv3g00pB1H2hsgf/95Ff0LE/3UH/uoP/nQdef//Y5/ukym41qV/sFTvyWIs5e+P/ZoOTXlU4IP/g/hEd1Ezs2+vCsSH5Q4LCu53IRDwv3VBlPmqGEcKz+xzdNo7mIquVCeYP2vpSraTZV4yy/RUNmDXjH+fR61HgA0jQWOFrWoywruFjjnXtzblm2T51c6fiRqVkbOeMXbpM8fjiarbxcuMS81KDsXRFgyhuehc/m4HIZDDE7jimi0ovl2tClUcZ2/AFS+NXVVnw0ccRca7iGK/f0L8sIxdgSvVJGYw+H0nf/kE84A6P9EVX//hFn/CeikoQQMoIvw6fetqtc27LxVwVWjgTzyLqnuXK6Tja+7RVnHpwY1w4tyS0EEv1cj9zJr8LY5Q+E/sv6HgOlPkFyaEsSalCQBMbLf+ed3/RVrWcA/wlecIk/4NUL5zdKic+J5Wbb2FAAAA=\",\n \"assets/provider-icons/belo.webp\":\n \"data:image/webp;base64,UklGRpwBAABXRUJQVlA4IJABAABwDQCdASpIAEgAPm02l0iuryaoo/VZGIANiUASoGji83/HT8gOgD2zIAbAB/Sd0B/AP4f/wP6r7//SAf6rqAPQA/QD0e/2k+C/9qvYE/jX9R//5N2ig7CLEIdib9LIi06frQG4t/ynJElKJ1s5Uv+X5yW8AAD+9Sdf/3BuXa286/7VjnIAPIF/jfNmrOePK7yvCIIBueRJyT66E6PcrFLfE4avkVSIj88FeNA0JaI6PGamrhjkVbmMscG/PJza7/qgUXVho4WbxxGQP3gyd6n2ckS34Md4bnkW2ZHlFeVJbYII64EZpQxGfTeHB6TiAjLMqhUvY8QxCLZ0Ye2ku18BTptJ/7e2ITXa05uc/a9cDVvd3S7Thr1ScryydQ7l19B0zttGJ+nFRWs5BaQhrGqG1yDI4ep/6kUnx8jYRWpdAz9YNiX4xz4lOheF97cupUQXlVH9GTt2kHTs8/XtwuWIl9tcUPX2vh6MKDQnvDP6sSuUmYwflYjiacOVjRf8n/a9hB4q1xn4w18HdQAAAAAA\",\n \"assets/provider-icons/binance.webp\":\n \"data:image/webp;base64,UklGRmIFAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSEQCAAABkGVrj9s2k86h0t1ttmWq6y11FeqFLXVlJPU4PEckAQKYBUSEA0lS4wZ2fSVL+UAS0hMUgw++fh0oG9yZluXUscD0rKrraqbFzW3YwBVnWbe8FIZu2IHoj87lV8CrmSMbDYaWjIbBlVaAAlkFIpBUoAI5hazAhRR9BC53NAq0TDTJYBql+f/fiATTE/Q497wcPZxoFhYoA6UCFMVE8yt+Reri0a8eAm5FfmELKa/g1eyMMQtUxz0U59kr0n5ZI5Z6SkGoEV/Sdk9H2LIQvqcwg+34pBQbskh1HBAgpOJgIAXqftK9p8OFdOxNyxJAAQqSNvcEvvkAHjYWQ7y6ghA3Bh6/f4Ol/XjjI4I0AF8M+BGCGFF4q7GDsKpjELsTyCNyx/5pB95EXFcg9LhsPj2Ez9dI4iC4/gyxuadyrAEWnS9KSBtzeiJ87WKssZ7FxB4h++rDUx+augMH61lMEuCtwQD3dEQRdNj8OHXUYFrBDTmktE4MIdzMq+ngGzaUJLeQXe1qxHdXkN1hvUX55StmqZh9teekqV+t+EurEbEEMtRAjPl/IOZ///Z4dcvVHuN2eyT0D/uYq38IOv0DiJVH6K+Oe0J/5W+GDtZ/vpfqPz+8sa4/p2RYQh5fLBrv7Bl/7akHWOuT1CPVJ7z1UhoS6iXu+i3rX79ZU09aU99aU29bV/+zC7ChhOdXqEJgmtbwBusxp7Vm/mjNfNaa+bU1831r1h+sWQ+xZn3GmvUia9avLFxPkwu2qOxY31Pq7U+W9UYFVlA4IPgCAACQEgCdASpIAEgAPm0skUWqqaEY+b7kQAbEtgGMAfoBngECz/oH4AVijlfwD8gOuyybzf8o+aW61M9ekr8p9w3un9QHmAfqf/mP5h1gP4x6AP2G/0fsyf1z/Qf5n3Af6L1AP6r1BP7b+wB+oHpRftl8CH9o/wX68/Ah+r//g7O3zAAvSIO9OmnhAgQl8alotMrSy8OYSKM9BsZcIQAAAP79bkuf+l/b/8Ch0nYF/nApmyCNlnYIrfAW/FxnlC1hOppsguRoDLf/jq0vhwsivVwqeA3P/n09Hj+sjg+Jdd44PfhVB5SnuATrPRG8sJxT1/dLzaK0VMWTl5t1dIuhM9ieib8EwwB/DLRXOaleC5qNcGcD6NgvCMmjW0hz8mf8q1c+Y39l5e4CDmxe1A1T/gXd/b7c5C+ChRZ6B5UKnWpI6+Hob4ECuKPjvEN52KROsMnkNb1rtl1A4W1KsHt1zYVB6aDCe+LRX0Lb/bArA5y2eOReQNFGQovQ0inmKRqHOlThkTet5SSjuEIZ+aFdiActi2ZLXb6dyhoFSha4r5QV8DtNuV/+Dki5guDrbtK3JlZUnNutde7nM0D7xWm2W/1DuTG6svgUctgfTkhfjMNwTkPyqOiyD8c53LP+WR4YJtgLOIr0nOnJ2x9DIPi5ZQBBc1d4mPZnxWZqLSDckihc6dTh9v8uA68P5ST/VFz57RBNy6t3yUs+5rvkuNMMycCyte86roPVSX88or5vkCAJL8IhGRW6r5CKt610zGUsBVCaJF4qFjUkoxdpUv+J1YBVDaIgTLhY+Fq+4f/o29Zv+8gVrtxmn/PeRLyUUVg3jLEnlranqkzPYJb6MtWCL7zeVLZTUZ2unxbSpjC9lne88Pln/qEPhsXRDyqQS24KwauimT3SI/wa1GLZ9BxMReH5Dey3+iDht3q9ijmf//nJlOqcbQqXhNNOTlsMVaoM2+EScesdPhRiBVnI6gor/1+pgcbp0Pcnvg4JeOf/5akOo9ip29vhfgAA\",\n \"assets/provider-icons/bipa.webp\":\n \"data:image/webp;base64,UklGRlQEAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSCMCAAABD+KwjSRFjp3rGB8jIgZUxm7GcfSe+xiX1hwzGfs6/rUsfIouppFFAIgBwKZtVOY2zGVmZtT/X7VbYls6IKL/DtxGUqRk6Zj7uvoJIGFBs9qj2fp0R7yf1rNR227kQb1FPRpvzw+M9XHejCO9pJRUzZ8cUdDDNKynlR1pvdULJXxt+lpKCdXO7o2Svnfdsjw5e/lEBT6XTk6SyuCKirwOK1IYc1TowhQn4+5RqXsvI0g2OKJiD2FWbG1dULmXZlbk0uCCBF4CgQu9I5J4dBMx90jk3kj6vi6QzHkl/tczRDo+g1wczo0QvNoxlJdI6rL6v0B1n7Q8O6m/aDskdqf9Id1/U/Pu/dnVN0juqvYjfNHz8r+UpsjASRFAP3DgqANEyMII8mMejAuNLQ+2mn3mwdlqP3jwaI+QiaMZF2ZrLqxPXDjduSC/fpBQqlfE5wSfq/C5oxmXq8z4/B751AeLS72yNS71s1HgUs/zECn8fnzk/l9APyIDDzpAccKBaQkAfA79QAhfaitV9UWGTf1P+9Z7U/8m3/00r/4NUh3qfrKb+h89qfvbuFBqXym5OUz6f4zv/6Eyp2NRSUqydPkoOdW6VHnN45MfmeTZVpZHvj4GWSZ5382AsOZCaQA15OYhwxuPeQhAzlE1n7FzIG25q2Je1Kkqml/1N3Lzq1VPS4Ei0/VwehD+jk38WgpUWhKb723HkV4E9eYbdtK80dIKIC4AAFZQOCAKAgAAEA0AnQEqSABIAD5tNJRHKKoKlYKWIANiUEOACPA1WmS8XGuN6gNs15gP1a/VX3qvPY9KrfAPLJ/Zn4Zv2X9IBvgHgBjSGkmVDoOElzfXXR4O9ojyaNPnXASkR/roKGEC/Vkz4I93dWX5RHpKUEf7oAAA/mCT//aY//7SF//9oSiAf//1BgmJVe3+abgLkxK6DfmRYozRnGDkgQYqlx5YtXgyefqIBSz1u8u/GX+jZ+rY+/E3PWkKRJ8FK/7cXdLfIlHR7mlF5xgmAqYYkt/qkyL9rJ7X6WqXIEdVu2Q1qh/y20/X/v/zjRSHYHNzhSbW9v7uTA0Gwi/o+7EP2z6werBQ9ZtBKEqH3uc9c/zuRkfBxaEeAWAKBt8IFsC/A4GLmWM2i5o3yVkQGq1o24/1gP44tZKn3/f9ycKFHtBfmnWBnRrqRd8XuKbMQkyyIzGxN4zaVVrqrzdmQaYpqjSfEgn2L5TZeV71CgR3gseTmyGSgdrSQxvbr1ZHROG38xrEkDkNXrTYL8W0mkB8l/wuwQbiSBBsD+wvfL0AlSTdRTyO5yjaCit/LSfVzv/IVHmr8mZizX/Sp5CAcK6oyL6gejhBJ5eg6cYoLf49nFducBoQUKVam35ltNVoWVpUiNWz8J7N9cuE7AqWZqoeL4XOUGJ+Wn/xZGWqf2Xd4k17b5tQ//+oL1F8cFAA\",\n \"assets/provider-icons/bitfinex.webp\":\n \"data:image/webp;base64,UklGRnQCAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSHAAAAABcFPbrlTdNhqCjKByBj+g4j80EAVMWYup4ta/iIgJACBWpOX8fE2lCd7azSep9wpAhzhpY1RIFydx9GLzSe1WnOTlj21a2Nbz7//KtkxsqWIrcudykz6YohNkY/DEoACy3lm8U7wlL6f1uyUVJgAAVlA4IN4BAADQCgCdASowADAAPm0sk0aurSoipzgNsIANiWwAxq/MOZjO9LdzN/gOsA9ADwQPgb/aL9bvaAJm9YUfMHY0do1Hkwe4gG68+cdfetUS+Y2aDyUngI9kZ7l3xCOYH+fgAAD+/6e8vbUo2AFX7o8DZGGg6TUehKSQXeVd1+JLydqke7nAhfIX4niuIHYOCRHc2SwH0P0yR+j/znAffL9g1/XCgxi3r0Ifcg6mEhgvKQI7VORwuqBrE986a/hPyB3VJl/aCKxmxoMxV/je9U7fn3/cMFjsJcbD3imPdIkl7rEbha4d1HaCj6Du//r03PvkOQU6Qp2Q/KhO/jaxOuVs5FteP9vnzMLGqni2C3C3uAPD+ptlwVfYB4AflXnS/8Eh/+znnPl8t/REdkUL0vydXxo3Kw4+V2AS41Zstiut8EExIf8k8o9kfLSyuQES+WJmM07SERvFGA/aYjpMB9GvPMA+Ho2GnI9Cc7jUG4U5ItvCcCN3nQnGnkwmoajP4YRH9LcRFUHnIbeq54X0/eP88z+URHnARbYCqgTfvsLggx1aHGWsv2zJYzrPnvVGU7lNFcbtsRX+xNG//F1sh/lz+CnSn/PIo85e8/3rkXc1vnxjmePvCjCmZlqDg/ZwdcAA\",\n \"assets/provider-icons/bitget.webp\":\n \"data:image/webp;base64,UklGRnIFAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSDUBAAABgJrtnxPpL4c2Ds+DuzAN0MmGUkZtcFgq4Szq8o2FClCb///NYf6/DTIiGDiSpKQHh3MB5gl0qCjpFB+tBFRb5f3U0EkZO/YTCa6pH9hTB0+uESXVLj7Ky/tS1LQsn4+QfYuqvrIDnr9EWV/7h3Ep6ip3AYxb6rN0hsjWEgyW89VYMgOB0DhKPQY+6U9DPcYXMunkGKtIUQWL7WI+WgERyhosBAxyn3S3Qzz03Z4Zp7PDFpM1i8nwAfTrkI/kB6c8rB+ZZv+9gZEBzeqaJWGYhU8u+JPF9U+Nj8ybi3Hu3qVV+I6HaFFCtB8CoqpAIe9MMJj2E5T/2TQaYzAwZBsEaovjP8D4IVj+DFH2BeIXET2XIP4VUexqLRoXn/T3Bn4anokf23OcwrSfV2H9xo+ik0R0IAIAVlA4IBYEAADQFgCdASpIAEgAPm0sk0aqqygmq5qqAIANiWwAyu20/t34gdzlxzlf4T8vbs34A/Ivok5m82fir/Ofcz7xv5B7APMA/Rz/X9QD+HegD+Sf339rveW9AHoAfyf/Ff//sAPQA8sP9zvgQ/bT9tPcm/rn/Y6wB7pewGU/wA0gU0Xxrvx6VBvGGCBgR0RaIlIj0INHkdcxvdi11BnqlHU8egLLbgVzq5UiPcfYsa9v8MzaURxVMB9TpINISDkIyRpcYAD+8AzHxjPrDRtyA5/bPU69byEba8vognognocaqtns/wdw3qeZ9LqJ/QT3gWT6RY/JcfC8i7tgSTH1Z7VJgShZ9GzLztTziw2Aj9K/lCEbYD2u+bGI8ygd7hTMeDhlvM6Qy7R6MhSrVjVF7czpw1Flt5f/jgABM5IB0EZi5eSaxQf40qpHI9tV3eqiIgT0wBuujOAsnpdrPJ3oFAlruvkI9R5NvO1gqA6Jr0ShOZNTnWnfnWrWLoq+xrW1s9fcrF9StfwGDksOaJ0Hj3XxZ8PC/g3IwUxeRNUL0xJItiIlBl70q5l9hfVHpW6cSCL7AjxBeNTEe3uqOiztESMKzex/WrpZov4Bt43dCYaP1z+ik3LnbUc3HPvpi/TmmHJAHr2XLI/tJh4Sq+beuRQTQuIWfXn295En7BgLzIQPlUi6RVz4ZnEUIRhO+KuAmSG8LBNW510Pn/pD2QibV72cQ4/RP5Pc5pU7QggcVN5/LDcYHs4fURUP/TafD7nvrFS4PbZB5es8gO/8imr/K21hC4l058AOqq6rocDK+fsqvVNwM5Ae75OnV0rvuiz47CaqxvCjspP6Ju/mIziF5m6w7zxgtb6RaCCfJhDSsZ/1h0VmtjkGox/UDmZdfQltq7+9ceEO09OTUdsAdQ0TEUNjYq9JiqJ2ceX8aikA1Z54KEoktaHEyWYpZdoeY+FHZSfwcRJukaUKEyQhCFXdUky7tqYjnWcrVhXFuv2qMuASxaofUeVmDBIDqltMYzNFkDUR2mnX0Hau88MHiWSTyMywnCX6pq1WkEPjuspr/+zFnn7XPKpB8UT/VP8T//5bkyuk/w15njXcD34gc9PRqRFZ6AKlHOWvOp9jeeYD8bmE0tRfc2SaBsdfAxaf8c9uS/UcH4k4FyTXfkXgNVEBhCPH7tHeAzUGwE57xByozF2gOIAlvDPIe9gyTwnzN2OCCxv8/BhQ7CAa9FqsWTizm9P1ibrHsqLaz+2GVc96j2RCIM++kAE254fjxAIS1YhJItGv1AUUJrcADNBvJi/lBL4ctov0DutODk2qk2FIEjP3bXnhP/Ol6EgWM9JAEdj6/p+BWjsIJXR69y2dHqaoQjEt8U2CflUIFO66M+wF+hPSHnxP/OhP7rAAAA==\",\n \"assets/provider-icons/bitnob.webp\":\n \"data:image/webp;base64,UklGRjIEAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSBUBAAABgBtbm5vqz6QGVqEETXgiNSGIVIJmthFFqgG3KT4GZbxIHeAi72Fn8fb/4zcRMQHwqpHjlf5Unn9zHRW5zeCjzBUDdf5pNRGe+Z7mdBZnhLswr78R92dnpMvAfCnRlme0spZ4IdE9o+4mnpi1M/J2/IEeSGzS1+7yyzP6mQMAZngmsMMAvB0FCxeYOJMoDHtCwyDHFQ2Kl85EViIq/tZUTM9USjL+sSvJmFKx7lMRVagocUWD4rkBDRPbEDQIBu6Cgp0HwDoUhCYAODN8ywIAgOZLbDLQ7yDexlYz4XGyh6uXgOeJmsQj20l41QyWWGZ+HF7XC+Eew6LjaPC26YmJ+i01EC6DjzKbl6L1j8hpv8JzBrwKAFZQOCD2AgAA8A4AnQEqSABIAD5tMJRGsK8oFS388EAGxLSACehvufPlegkiX2A/VeIHeD7Ysh/+ErAJUEMc8en0t7B5Yjlw7j4xYgVGEiZMQ2jXgdEMphtYL7F3YMWmuDtnGoI70uwWrNJRyL++wygW1I2pGOVGcFmtzcCMHDl/VLMXR4/7iRAA/vsXg/4dDX++WdftHMm7IFu3OfFCCFRun1lFD75ATaSIRQF27oUHD8H7fckJCTw//yJ/4INLa70C2aa4wQ7Vt1Cc7ry7B3E7mGvH3HaZOlRj34m0C4Jnvf7Yox4aYFD+AORs17xVRTDTQcP5PJOb6scP+EICJuX/fikZYz1f/vcoC9xoN/5orX6kQY6ga6ZWf3TqCAtOOCPCsJ7kvhvwdmf///FYfgD71DpsYouadzToHSOkmSb9+bLH65d+hbT0fIpzf1GoJ8G74WcsnjZ60+fDHuKBMJxzk0+7Xvk2XqrskKBDz8/gXUKgPlpS4yxH4bKXPXv7XxDArbc2Ot4kAMBQ8JhuuRuHIrfE/o8MMh9OYlCIMI12gmkaAgF/zEydtifdrxgyF+xZtS/I1mHnTDQYU/rH/ROgUIzqlGkXDcy4phFfWrK0BlAQoF5N98VZ+QfrtKg/Bl38eGkG+WX+YQEHMPRCQJcDY/kGiMdCBrBqKc4KWPiCK+edZKwUuDRojOubDmrEXrkae++YCCmhGHs2nBcv+MNI+iZw/r/lecB4iD8sGXLNXsK3tKo1F0txROOLXdwf3CwI8kZWh2NnkxHDAQ1OmsbacSU1qU05gWrBLdO24Z8bRgs50N8Xu8WsLKLk9rzfFnS8HGEsZwAK2yQSmbuuvrdwWXWb9J7ELMOfrcpdwuf+lmJzdlWIYRUWj87FX0IJhzE1IHXNQ9YWRLzqfHFZINwnqw8dDg1c7S/TN1hNMC/S59U4kyOKCUv6E5NCRpswtgafsKVlB3b7gdjB3XpgwZdoB53yNojQcGWwC+QJBxSyyQ2URlTLqvNoDnYAAAA=\",\n \"assets/provider-icons/bitso.webp\":\n \"data:image/webp;base64,UklGRpIDAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSOwCAAABkLztExnJe6qOhqtOembWtm2j57QaZffsG062jfQ+e7Jt27ZtG1mnU4tGpZKImACfWpywaBJEF5LVQNFiaWoByQcOq4uuXIr/XA8hUqDvlOW7j5w5d2LfGmOg3lATnSh+BSnHSZGaP8MYbfPxvnFZZRW6SxTW6CitXsYS0bwwsa3fExDDLzfnpXsCIr5ZF0zwBsTnEyp7BNpns2VvQHw+RPMINI2SHoG/l5fzCLS2l/MItJaX9Aj8bWgegeYQ2SPwebZX4NnKXmFPSPAIfB7k0PoVB1yXzqDhIxZv8hikDlizJGQYoZWHH353ANcUcA6kpERZUZTU9Do9Vz2ne9OeQcwFM9d8pQpPVlgBaP2fEOGlssxA6nqbyMziBlLXhzQ4TuQGUj+TZl+AHWhraB7V5QeZz0lM3QUFV5HYg3z8oMd3CjQkF9R4QLKmgAsyDpPsU12QupLkRBrRGEeUEMm5YsXOU+AE0RGD5EzRwidJZsvsjgTUfSRrUtjtVgusIblUkt2qFMkgeZ/JzpB8A20Ke7rMzB7oA92kwBu1mZk6QMNnJOHZSbweNwTQdpDga53XPg1AHEODF5qwGicCQJZJg8eaMDKzAADKXiDCC3oSmyvl/lMmhonw9ezaCg97btJ/0P4tFYZvTu5QMkUWJVFSZJ8Dz9tDRP9WMsTwm4urZ00YM36yYXST6Tb7I0HeO7rIFiLilcpkH3WIqm5wKuLLxmQb1GgQfMrhRSOqNx0hxuRJtnvCc5JjgcoX3HOuCsSe/dwtL3IgTnnoD3eYwxPigfR5v91ghTSIv+Ryi5+1rhRQlttscbM2lwPacst/87LWlQPqkvN+cDJDpYA+fehzPi+Ha+CknH3B5mGdz0kAhytPesrh6bhK4HxycMNHZ2Tj08ZgArBU9a1vww6IOd1VYOvvMPmCGdfLxpFABtaJZbMm7H9m2rE8rR+FvxJoqA801uw7ef78kd3Lp/T1u+Z/n1RALVysWEBNFsBpVlA4IIAAAACwBQCdASpIAEgAPm0ylEciopEXCXQAQAbEtIQ4AMSJBm6C+Oty5dzLCNVj9HaGU+NyVXU+egAA/qa37nXMTnFBaUJHcuCRg55aR/9+A3nWqbb89AF4CsWJqwKPmgcBXO0mDgQN5mtz+YG4f/+JEVt9oSjf0CrVKYMe1D2x6+AAAA==\",\n \"assets/provider-icons/bity.webp\":\n \"data:image/webp;base64,UklGRl4DAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSHEBAAABkENr2yFJ7/f/9dfYs7Zt27ZtG7kR2rZt27ZtR2ZVRf1Vf5VNFhET4AX8Ue00tY9Xzvo9d/XZV1fA2dm8XFmfFRoOWXLtqxu2/8vy2cZvREyGRms+umFbmovgn0y5rb9lSGmmIgBR/Z6LqIwNO4VuXzs7Aar0LhGr+v6XoZ+dHpNDgzLOFzENbnjcux0jgcTpAXo+NBqUPDM4P4/Us0F5VonoUlO3hN44q30iwapzSoTichYInSfFEJBl8kcRkOISAF3t8F8hbTG1IugCEx+7EpRaqT6zRqEkBZVr6hcJq8LKc8wTm0dnJui6xxwB0+CGx3WuNTWgLAv+B8Z7MSASiJwcHPduGxswEyWs6vtfMp+cmZhLgVJmSKiMDTsx29XJpQEqssERACnNVQTA6v7QlQijKbHuj8f5x/y9JJ9tfNuRSZXnvvVYl5kXZzYoV9Z3lXZTTn12eJWZVUfuPnPW94XbH/577Ee1wdS9n3nyaWEAVlA4IMYBAACwCgCdASowADAAPm0wlEcmlBMRxnxABsS2AFiPjjmH4D+AfrN+QGKGcA2zHiq9QDyQOsA9AD9Zusq/bP0ciZO0gD9My7fwG4ZZzsnneJp26QMgTgjMK43w0eyVjH+AAP73AD35tJoNVeT/296UuT/9j2t3/7djn9d/OLtIbi2+fn/5ZZCb3BX3xo+nRUdfm3ysLvfhedF+E5Vs/o8o0zfhoxzvINPVfslmLabizeM69n1yPSHkN2GpRsI0y7JkBrwe7D1oAYLYX0l/5zj9+Rm4jK1tjDoLqwcm+77KYLJM/bUCyijoQq3zwJs63I7EqnaEMRbe9UrUuS2dlMSZT/E6/1WnC18bKNFJtF18VFNJcDNuP0zvcNbjherY6f8Qsv8FzPHwVnndmvqRpH3hBPQ9uArGbvDfbsBmNbP8PNaZbe+zHCmdYZ4h+hmeUIK9a8BtfRogeThQSajVLlXXe/KMp4kHC5/+BK9x+eTa9Lv/da92Bj+V6OTK+zf/G3cu+CimSsEbfj8x8ck9D5OK1CX90Q7ujVcFmeuH95e6TbKasfN0tildBiYXdaMKKkTWifTeHycJ1uaXfzaTZ5dmZ9kFqmUCeAAA\",\n \"assets/provider-icons/blink.webp\":\n \"data:image/webp;base64,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\",\n \"assets/provider-icons/bluewallet.webp\":\n \"data:image/webp;base64,UklGRgIBAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSEgAAAABYBTbdpMXTwVwEYUxEEvNAF1A/pa7ZRURAgGCBiLktrJP++Tcy+akNAw4knw1ZPXZoLlT+k25X8r7f/FQHt4V75J3zb+AvyJWUDgglAAAABAFAJ0BKiAAIAA+bSyTRpWIrAYCACADYlAFYX2L0AAYSCDto+PqWbkKQmU2JKcdkkAA/vaE0CtXwGH3GwfcnucVe+9+Df+Sn13dg3h3fX/cwmowwtDUMEM6R8411UkRNffaTD5Axh+dYks4/exPhbuSkAxY4PJVy8A8ctP2ArMeOe+/j0o3ny3hQYdxi0Ej32ohQAA=\",\n \"assets/provider-icons/boltz.webp\":\n \"data:image/webp;base64,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\",\n \"assets/provider-icons/bringin.webp\":\n \"data:image/webp;base64,UklGRiwDAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSJwAAAABgFvbTuzqJmrAo7rybFUFGUXQwotogGJgQYrn6Uv5j4gJwNOZhNwuClsOMsebdJjqRW1NG3rBvl9UF8dPOI6L8hEZALlxUT88AZtyMbAfME8XE6eZVBuqhIuRIVuRmxXt8u/gZkXLVuRgRZBqQ5XZZEOa49AtKBuA/NA3HAHgOLSNyHhkV3R1z3hOm1T11HQkvDmXkJuGloPM8RRWUDggagIAADAOAJ0BKkgASAA+bTKVSCKuK6ElOApIgA2JZwAxQC+APJ0/YD4FP2H/W72t9W/m7+AT038BXA6IGib/6fU5/7D7Zumz9Neo//Y98lJuiWV6PghftHza5k3xeyhgM0OoDlEm6gGAswwfPSw4PdwYTFndtaszKTRMLJm4AP78dnk7dkT7mGLjkkTkdHXfrgb54+QVU0JxbEK0RyNvNhh7w9HwqhkQJcrBobANLBHf834jz4mvadYVNnwv6KcwQbzuHpPjRHmg7RkSHCsA0B3D2FWN3W2C0dvF/AagTvBs0u6vjvA6N0K//hm1Q/5O8SHAoE1Z2GRsv+dKYhTfabOPuk7wzzMWwSdDj+38slD7gTTUcPPnhvEcVJc5bHGa+zS82tbDrcOPx17y37SxNmo0sdMEik34MlLNdSyWshPxceAFrRXX8x3P+F99hWZj/mxNtga/h9dzWMiezN13gYJ2hMHbo/grvoYdfih5fofkfqEU/SN+eUzoMT6/gtGaERg5nIGSb6zVv8hjKy5nS9ZPWhq4dKVJteI7/PDS8bT88lecRt7X/uRp+qzD20+TeAwmh+TRUFMQaVFF+JYBdJwBt2P7YFaV33FTGx19BdbJfJr6oznbz1RpAA9yGccyApzUYQKQn39867B7Lwkl1gSslmTvfZVKoVIAEpEmk4hX5aZ7f0MB2ndFDPxze69yGcwrf+M8x/Fz73EmYJclh1BZBIAuQ1aEjT8ZsGnv/5944H8NfBv/Zj85p/BRMbGpkTjpeN1towiyQFl5594Tvw9THR+XzMu11bhjgbuNIDOea/vSoLWA8AAcUIAAAA==\",\n \"assets/provider-icons/bullbitcoin.webp\":\n \"data:image/webp;base64,UklGRlYFAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSLUCAAABkG3btiFJJ1C227Zt27Zt27Zt2+aTbdt2d6oTnRH7IW/eyBtfEBETQOyYLCQ4SwzxK12ziUrdVeVL2ZZeVMK2zFzyrJ3RosJ2LpZ5ajkmyaKkSY76HCnXHG1IeBvLoxQ/8jDnz2Liir33DFNYmZ/idYy4mHt4mo+1RsNRMuFOaJsZ1QEMNUMfAHWJKOMNAPm4KqXyl6oiV24AjzOSMs4FOFLzZP9yraPsI7W+9jkXT4od8IxVM74EAMfivNESI3gvgHs1IyNqXgdwKpghReVcbAGAl3lWgW07PaSgT/NfAOCYPdkBALbmEhHlG3LcCvbG1hYWdOe7AxXU6JO6Dw7ugq9+MkmusOuNUwfb0lXu+o3lq12Z7QVz71YGvIsvaOD81VUhue59Dt51S1kGHzWWiYjyXtEDsHJhAPSrRYid47JmBu1ODvKfaqVTnHNDGuKNnvVPlHtWHPEHTbIZWLHAgH1OEBmV2n7lWzCD72s3iYz3sPNNGc1nH0SGw0bA4PihfMCEMAPRixyiXIsSuEJ3OyEKzgNhHPHHYTwAwNl4f5kGbX/xH4DLovsbM9ifbnEC8L7YNSyTP6LoLHVXn5lUolCv43bW4F4s++m+hYqPO7O+fpYYCmDoqHqRSR0Pf7R40aMdvNaPx7omRVQbFUkBD93oPlAtSEpTZ8z+hjUOjK+XRlKq7XFtFALt69JYIikuIixOJoqe/1WDiJA1OoD39cKJGVbvBQB9TXjgpEY/AMC6q5pKpFbaagUAayMpcBQy3wf6lzkx4XM+6vBdGUIiQ+/oYE4ZDaZ+P4zEFn7LWjyb9bYsCVbGORkrFjA8Y4NEUdINxsqFjCdJJH4031QyYU2+emZI1ni0VGaglzxvyJT1Pvj70NwcVPiK28dzpzCZNX7E+/XL341LJPOqFYcOqxhEgQUAVlA4IHoCAAAwDgCdASowADAAPmUqkEWjpCGksdmd+IAMiWxdhka53XUPMt6r8gHSd78d+Mnf5+OQDtAdxB2APMB+vX6wdgD0AP1J6wD0APKu/Zj4D/2u/63+n+AD9Yv/yTdgtVbmY4dinM1FQ2EDoPnh5u47XgBLemzEv/knCVAogAD+9ZrTYD9pJYP2YTg96o3wA1+ZfmXmMuT5U2P29EZSzxavuuiogs0yFKk5NjXfv+VMm//HbopvkoDXxhjPlVjFcHs4iRrxNaWjCMwMjj02z/HQVvTH/xuyLQ+gfMBhAOJrqIH2GJd/4qsvQNkyXGXTTfV+1SZTEfmKRrXraKDnAf8Nfjqo0EOPfsH6t/hr84PtJg7Su3/urNVkf8LHnFUdntp4EHNFNNLM4QhnkWRI1hZ1PROUDOapMP2FR60IGdXZl9LakWGspiDNXoP+IBoBGIRDEWQ18XvbXUcMrIrF42Dudyzd57GyP7SLBIM34iCPflrLhGanWSbZEIsdQ2jQjTAFse1J052vf+oc9L4Z6pX7PjZpfXfasO5J6uwJG5Tu5btmf/hdtRYPR74jnD3265FQgPhfW+cA/Gr5EBxkG//yysc4MUgLV9k9JCs6JfPznQ/vi123ztK66/xU14McXw+ztdhA3LUB0Gb/itmvlduMMHubI8+OZzqS6k2jNC/+VxF4vo1DeuBsdRCEqa/4hbUkX20hqpfQHh+YSjsK8DiQ+YOGrkt/mENv+XMrJZLip4hqIF3wDytzoNYo2nw5RD5/3UDJ8pJf7RS+iLjGZv+mZSARVh4XS3lLrJaV/6j6n3oIROfyVR7BQFbjDvXNpcDM7+dbdkz0FWnbPAAA\",\n \"assets/provider-icons/cashapp.webp\":\n \"data:image/webp;base64,UklGRggBAABXRUJQVlA4WAoAAAAQAAAADwAADwAAQUxQSCcAAAABQNu2bfz/TT5NgKa4U/eImIBUPLGpOGLFGfERv88LsmFlwaZyYQMAVlA4ILoAAABwAwCdASoQABAAAUAmJbACdLoAngDngPYA8o6jABTR+xSalgAA37uEs1a2TI3rR/QcFZ703u+3y+I6XbRxCiH5B43vo2D7Jif+nlm2frGx9vDYgc58RI2UbkY+UfIL7zFhiaXsXFkZRhXZR69WP/agGDNKHslaHgETP1guwTf6vNPbqWab/7lPj3Sfw3loE4J/9lPrR/747tb7vJYb9+Tv/r36o/9+OHx60ulfTv//U/sgYdYsosm4AAA=\",\n \"assets/provider-icons/chivo.webp\":\n \"data:image/webp;base64,UklGRvgDAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSIMBAAABkOQ2kiRJ/39sd6W7xx7hpkP11NZ9HSAiJoD/WudZZlc9AtTi/JZTIs7e+9QCjDr9lyxrAq1El6C380taEataG92vAbT6S2ZI4UsCiV+0ixSTh39LnSqLPyCdVvkLWsPPc2n5eXXu4AXXLxh7vmeVpg8Rw5+qRfGPjFnrh6TetcuntLniJWfvO+Z35J3Wucv1pB4pPS2faUWluI8fzA+g6r5Abv6w1UeWU/sz0XUNiA0Z6gUYlbRN6/woAOl4PkAcXeOx7eKQtAYr2CZkB3qhTI2ZqjfX/rrdbPLounJfQw+sSCBtpoEviE2v8iXbpum2pivmdMSTrUrVxj6pPLt4Iqhe8D5Dqe3D2F9Gu3VCsWZJXzN4vvvhdLPL3OuRvLP8WG6L1Hej26KsMhV5CqVRb5VWX8COuoGzE9TtqsSkh0BlxIKsjW0H6uT4ITmRr4BZLu9j9B7eT5YIUPNSbJLhzSowLrcOHC/D4/BqzRolWgrILgD1dgBWT+6zb+416xT/AwUAVlA4IE4CAADwDACdASpIAEgAPm0wlEaSiKvVVgAgA2JYwDSB3/+oA5Wb4SayrzrXj09x/I5mnHUf4DSIP71kRGd76a9gcmd6Z2gBF8pWGy+qxaaJbqXw3E8ByrBNE9lqGO6YMlPDwbL94CaORVubub2e86lc3K4AAP770d//8EF/EF/EFhq1pEFVyYPuG1EE3dH8LuJVC7H6FfGWaVrQ/T38OHv/lSjxn8ZoiiMCz42q9TNUdjFYEC3NfNFae6d8s9Tcjuu7z6gXSjHRI/JFXAQcbLDFDZzv5C3wLca6O0LFZMCVA4vp9AVawQBu/kC7bSenj/YAOFXqPKx/lCc4DsyMvOJYpT6T8aQZoaVENmV0g9HzIvLzQQh/mYDs6ulFf4jRe62BRIqMv8nCh/BBJfH4/tbfLrR2LAWifUNnJ3ERIleu3M1effER/oUGJYBT93D5AGtjf87lqS62eu9n+s3Njl1lpauuG+Iidy3VvTcj+AxD/+Kf/+L2mWImTxnNpakPY1Xku89g/FT8bHfZGVy9Ov+wzKgmqelyWx1YdV//bu/CWoHu/+dV7M12AlNVGbWQnBnGNsKSW7+HbG9SvoWgNuBI3D4+ZpjT7N0VMnCwO+RlTXGcRvaX7h/xIWukIjNTXwEVjFJ7tS/mGtmMn9Wssr+y2JSMV7bR0Z3v86SpDE4pfiyMZuq0g34gDynsdEL3rQOhQIbh7PLp6P9tQvkYX4/nq0ZRWvqbA2PYYxYdDmf/KFMrnWPBWPqxuqNTMgIVVbdJVezSRHNeXa67s2/2AAAAAA==\",\n \"assets/provider-icons/coinbase.webp\":\n \"data:image/webp;base64,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\",\n \"assets/provider-icons/coincorner.webp\":\n \"data:image/webp;base64,UklGRloDAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSM0BAAABgKP9/5rmH/LAVg8HqFtmZJOZhwOUkZm65RDNyAV4OAFMcgO7gbvWvWkq+f3td4KIcOA2kiIlvcd8TW/4EdZ+HZTTSd8c4fojpzUqnGy5eEhrN819hQ2GTUND5scqBnhY/XaHa3fyYrMutA5UNv3w6jrXDT2USFVf6bhLupl01omYihbN3FLxdKhyENYTzn1SF+McJFy4GFPvGECCuGI1GAWNiZwRGN8GGiQG72zoaCgX8MVuFCzIQhaebaNBIvD/P8HDkwHk59Ag0VeHoQ8PbxUURBIPkvpxTCOSAJQQCb2AikNEnzi8IrLRBW3HduhuIALOJjrilYHDSwjvIYMyuCOB90LlNCCFmCeHlkPVi5eHviF4jyhens/lwdtkPGh1RE4AtxG0OiXbTfAJsgtYfYAoJuDzQsHoM6bz2XR4No7h9DFH4xt8iloEoU9Sf2nhB0bMJd+HocHmD7zzYkGuzwcJbfzuB75YLuyRmiMM1MOnH+htJqop4nOKpfvw7ofytZpKhPQN/hw8dBO2arzFnPUvky53zsZVwjVQtOTmuIia0RKlZWii2aabLVtgD2mZukSGqlsnhZHF3XNUIuec7zBdHrzaYI86FNijCABWUDggZgEAANAJAJ0BKjAAMAA+bSySRq6RS40DMiADYlsAKdHEwYXpP4zdAFxd3c4x6y+dR4gHSA8wHQA/6vqAdIBz6v7SfBD+4X7gezoGdyM6Pvvf49EWf3Ad2Fn+AAD+6/r//mXf/8yJf/+Zib/9cBy0OW4zD//nY3NeJ0q/5sr1rqcQARbDRAq5ugt7YXTEUU5+fbvRK5GiwUrdfSPLW1cVHVRjZoaRtvSWfEmXmTntYrX+miEDuTW9FI4mnHxx4SOypz2gNHzz+eFxqb+QxbuF//tPPKBjpI319gEYP5kLSnPZREYmhCluH6T2rTu8AFx4QhSJfU0T9pLiP5LVnAFwvjWLhxZNyrjwkd9zL/AQn7s3TWrUnVQ/j8i5PB9Ak7o9A2+g7jfKlDGhxamSDCServOPeNIAPvzq62iuRiYG+BvxccS/xcTuWhRWoyr94zkdntOSHu8QItjwhdN8U7+ykZFci3YKfTtQAAA=\",\n \"assets/provider-icons/fixedfloat.webp\":\n \"data:image/webp;base64,UklGRiwEAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSFcCAAABkCwAsGk3J7bzUNu2bdu2tXK7s23rB7q0VnYb27aTSdJ75s6Zk2oXEQ7cto0k2VkE6NzjzvYN4r9TjtYWHLI4qOO29PV3Dr3YFqDM8nzgUckhVQIeAZeyVbG/ZQNU8XhQVxBDQuoKYnSoTPSd2zR9k2BwhETiYnc3d4rOSXA4UnL8TFrMT/MhRsptVGddOAujhksu36gFpx47ji0OllrjYMVWLcyLqYLSaxb8YCkDdDAvFWpVecMqDBrzGSB2tRM/DvOTAQy+KbnD4iW9HQQ7DguSACTfsAhE/MyvLcTXgvUxr3YU9XWrJhzmpoIkZActOP4qghmg9CkABF8P5gfv8YNZuJlHKmkiqOJiczSNPdk3rYrsfbPLxzT29NaiRimUHfAmxJ68AxVZxQd9kNgr+rKnCc3GT2iJAyWHfIyxV1buKJw5nyoqv0x3PAW4vVkKSteiLDDkO3nmrx9s8NCqFGAgfzJl7kd9NrvFfODgkR2bJsmgUY9b4l8ijTzCaoHeaoN9XvVWW8poTISWnlKho0dGajgaZTRk1K+lAjNPWlCOFjLCuFRg5RnprOHDTZYKWTx9S0rsI4abrMvK9rPs0UKlNww+DPm4PVBT7EPQEsKrWX0heGOPHo0gLbEPHSUo6Im9IKEn9jS0xJ6dqqdYPxM9Kz/R3YSM5TUWew0UHvCR6Z2M9IyY/A1KdIqRY6+Cmg96G3G/Kh1NF1B8VGqbX4uMfTZK6APKDkp269zJKtRR3kGWXqB0n0MdAZ64MXH884/vSvrxZZVgwqVxyxZqauIi/k8lAABWUDggrgEAABANAJ0BKkgASAA+bTCTRyijJiIo9JwAgA2JZADJwa7+Z9gZrnt/KBdZd6cMyx7/4DnAP0g61/mA88zo/+oz55T9zPgu8oAmVzHUXElFF7UFBEhZ7KtzmIGedzUPS2Gx5LFaleOLMuPocBFxDJrYahkgAP79NnSHQ7AwKdYtpU5UXuCbQQsW66G6FpmxugmleQzCfbqNlk6u9DGC68ORAYykKsO/94RuOwzU0mGolFkfxGpr7+dv/hgZrNaudbFfFhCi/S8x9e1qmZ0qF0GFlBHPrhv7wtP99YmJdUxWo/nwBp5zBeWwd/8V/vodckvfpMQESpov/ZvKTnMspfaziATtcs5b4DAGP2cn/bZs2uAcafY+tBLufHbNeoe4ebqE+RVIOJJYZQkmbuVy9Ut43kOGjAACk6M5A0K+0HBVYV8GoM7IwNDq/Lm5NG88RZyu4bi/uv9IOgDu9FiJGjU+kBQWx+yz90pGR5TVQOSnnBHSZ2O0fL7ViX13YF1FHV1mlv4U4+r7OAJu7QRE+pZFkh7y6ka/SGRB96OoKi5ZLjuqWr+PPXfg3/d5UoqAAAA=\",\n \"assets/provider-icons/getalby.webp\":\n \"data:image/webp;base64,UklGRnwCAABXRUJQVlA4IHACAAAwEgCdASpIAEgAPm0ylUeuqCelp7gKGIANiWwA0m3A/quoudV/Gb2Nqr/c/vpw0Vif67pAfi/yK+sf5gP2G/UbsGegB/YP5n1gHoAfsB6X/7TfBl+2H7jfAV+r//nBUS3zNV9YfJS1Z8Kj9jJjRxwT8KXQm9SGsiyUQfz+qJVXRo/lu/aBCBAbOkBSbih/o7sMR5VjsMvvEq94AP702b/HNvI4/I4+ObfLPE4iwjBUNFaf1ueC4HAsVrUQ7t4v8LSvybKsN7RoLPVDifGYzymbAlct6VvgPwzi/bufWLGA6bMnC+3HUSbBRjrjljzdcn6xJd/4Zb/CXdBCSOyH11NVDRFo2/35gduSjKt2ruXh//z8/sP5oQ5SWdmV5Nivi1HLvO3ryLg8+Jmh9ahOVdMkORJ7BxAvR1zqeqLk5oFd3PrhCR11/8FUZmrAuN2nyRgAv9IK47X1Dn66Q54JM7TVN+j+W+qD9EnpMv6PmOaPkTI0D6ihBHHCkn9MfXvTXipgcnKl04hb86L2lO6zhJv4ZRt8HdJjrAJzlagG6yoE8UhuZiTJ1szG5cpQ2Z3htKwIXiSFi1cFsn+w8PnmN4YM9zLavyaxMzpiTtMxqrn+hS2Q9xNaBTicc3tbiN0iI8ucu8SmNuCjl3Hwc5E5/AKnPOg1gBgw3/E4Yfs0ALkJeoOFH1yEBCBRegKrvzR89UE8qrE+3nRI6QUskxwPMMCExxdFvYh+oCvlZ2tEaGdx5J6rNn4dXXzU1pDGQGCwvT4Ddvezpaf1EVW//eeee9A3FgE6XHn248rItSAQPTp/geBLGcEiWQB7hDIAAAAAAAA=\",\n \"assets/provider-icons/kraken.webp\":\n \"data:image/webp;base64,UklGRnADAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSNAAAAABcFpr29P8558AG0+1LJN/ArYISzACO6T3Hof9dTy+95rv1TkRwchtG0fSlO17tp/AepzNvaOMi58Zy6MnVM6GNRf3MC9+bB5+XHMIxQkKIgNH6cXwo4LMyDd6sE8FqSe7e3wqiD0Z7Tf8gly/9YIT0RM5zV+DAsDAZNwtIHS5+sHgo4oQg1B4OQa5dyxAXEoUvjEKSfH32RhmShTkEYUjTl7DyY84eRYnX8PkfZj+AasPYcYOoJ9paxGPkw3TXyH2aYwx0/1Q9XvDclWQ9o0MVlA4IHoCAADwEQCdASpIAEgAPm0wkkYqqyijLN5pmIANiWQAzyXpfuWoz90/ID8VeoY4u73fiBxZB1+rz7p9s3at8SLpI+YD9O/2Z93v/Ffpn2AH7M9Zn+gHsZ+WV+s3wZftN+rns9p4D3aNPCROBj31n/dC3THt6YKtGoNc/dDs2RhwHzWnc5y+/1fPsBg7pff3/2gA42nowOrPchVAAAD+7ylHqJSP4Q3m+x6E66hLGvMKhPQABQslOdQ73vZudoAzr/4v07+UTLlwy0gReJKBUZ0WUllTH9XMnesyDHmf94LJS7aMajLjIBHLF+T1OSCjQOfJzgEeoMBFJJ/GQQrPUuGKdKeysuYLasqtYz4ZPtsT67sGfXl3N43T3/qLf1HCGhjJIGyYhSJDgBoHkjTgyzJbfKqfJ+L/NGttAjfn7l0efY60eVGC31uK9A/nz9ObPZLJc6819PR4YUmnxqHGgNQ2OTBKcUapqakjj8J2FayOIWFLHLBNI1aR2YVv0591+p9gI8cYW/4m6nfdbpIP/O+cjeSDYuMij/Lhz/7HysIJIM30MeLbF5MEmb1xcbVcjHaX7v90BIlI6BKZCwXccI3FfDA6Hin0LG93PC/tuBQmzHQf/w81MKvjg4BkACQ68ecnOcfXvLfCpk6GkGz/9tpleCJYn1OJD4DAef28faeINXgZGz7k73P3Gm3WsNkOMPmC98FHuipL671xC38lHj56131r0lfTv3NEvnzXh+2m0hJiyk9yvk6UF4cNUjVoQypSpxZTfb3vl85RgafFOgvKR+5egBALuzU4TDwvoPzJ3NZQWdf/+JJO/mxIPh6QXmy9PkIw3L9h7Xp7AAAA\",\n \"assets/provider-icons/kryptex.webp\":\n \"data:image/webp;base64,UklGRgoEAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSOoBAAABZ8QgkiQn9JDBv+IsISJycOVtCRoZR2hx1pwaE6lMRpTkmoMN49zSNte6ZGKC8i+vCQMRzMz5/qWxDBH9n4B7qnJ2EQ9oDksOVxCMDknatqfV8n61X3B3d3dYAXuGOQtwd3eOt71Okr5om+bLCCYRMQH4b1JWLeXSW1OXVU/Ftm07FxeWsr6kLuflqa2Jv8U9p3dvzBHqpSsX96ae9l88sgYhLx49cHS9j+LUpYMIfseGdd2ydVug8vWNrIPLcigdLbejcVDblLaFEJrrFhTEkYbanPvNWkK9I4BRhQjSYPsXRHE0OOPiMH+9DZF8cDAW34tYELGcfYzF3ZeMg712c7PEINtRPdu4JQZbVpPF+jwCiwIgT5w24s80VCbyJzSNaBKiJaG6FQBqGWToKKIlTbsAEA0Cn7RGAekDpmxCKxLCt/Nh2MOqHL6l/t7K2fHHurrZ9JDAv/v+ccvuRaAZfplVn7+V0/LgW/gWole+3bJ6/aIdVOWgBoBTV+G7lqafrgKBb8kTBCwgvCcZQl5IEEdJ4VvIwOCbIAJO0aMIApbTvSDoUwNfgtCzZfEjaEIDhT4kTRC+wCPTDDqlixBKyS5QA3DepmkIRZOP5k98N2ygufn2+NaT4eT1zeuvZtC+tKZIzGyIfxYBVlA4IPoBAADwDgCdASpIAEgAPm0qkkYup6anNbHrAIANiWoGKAD4+XPVPb45byrvCHcbKN+gHF5/ivYB4inSP8yn7Gfsr7//SAfuX1gHoAeWD+4HwTfs7+1Xsx///rAAd7SnMpNpzhdpLmKnz1SNp68JMwwdW5JG1BugQqMRhqB95/XhApC2AAD++kx//1n//9ZP//9WXzlnj8/WelneYt0jHiBq8moxpPhenu5CEaASvgkMftaepyAmo9+mb6tUQKnlGXBcX45BONRPjZCcFTnFcp+/HY3d4UZ6jEaKPpTYadYIXie5yGI1D8oiPhyL+r6KdWbgLXK02MkCEDrK7Ser6WriIGoS7HjRRKF9xUkVAeWipzHM9hXWWm57cnHAZU/eSNcYMuLt7o36TqDDFXwd/a+/bhEVylU3WvQx9OP0w/v7GfmlyRJyUVMesyktkz8t+xw+h7DrE7iK5C5j8RR0ElFVa5696tI+dUfOQxDSXa0Wvtdcoav3w7ZLFp0TEUmSPBaehyz3RXkZ7pY50vPl9J9c6igOHoYrH+P78N3kUVPIrqGoV08mY4DtnxLtMFia1Usdb7mWbD3DhSx8GtX+NVq5i8U///3rjnIq7Vq+ONmTH375BEKiVKre+qO5sS6APZMub/UK67IABhCsm/BZH9QLP0FKL6qPyHACpsAAAA==\",\n \"assets/provider-icons/kucoin.webp\":\n \"data:image/webp;base64,UklGRs4DAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSI8AAAABcNvaVuQ8ckRKAb8uUqTfCzFV/Dqogxa8zopmdcTPHRETAACGWGrbumxVmPDTxTJsHQ8l2Bufnlvnj+wB2Dxt3U/JAeGxKfiMhsqmYiEedBhYNiWlalGbFm37e7pp0aoWVbQQHnQYmIoOhUx8avAIgEtTf1O2AHx+9PZMHlcbytDTUKLDT2KprY9WhckAAABWUDggGAMAAPAVAJ0BKkgASAA+bS6URbCnLCSs2Zu4gA2JagDLmEJ7Bximx/ev8csww4Q/2v3HfSrlAP056wHmA/Xr0gP0z9wHoAf0v/S9Zb6Cn6q+kz+zPwL/uh+yHs4f/9zRm5d4i/Ln/uCTlFb2phRuc1m7tWyMWJxSMmD4zhqGo0CPVmVV+5Ut1IuGnZ7nOSfNLVd0xhdSPNJJZ2tkJ1qNz0uaemJI2O+ibl4toquqRH3ecRUrChLRCweGyeAA/hOa0+m0d7KQHXiocIH/+6Y9wqTIf/bkP/bj3ArhuracbDjlO7XHTspv0z+voONZkSKjcVRKYVSxmzQrNYvazUfL6t9JrpKla7fpRllu8HziYDfyKM1mkFEIKdWPxRKEMCqep0VMSxVC86HxnRyOQtHyrkCmyweyqdUH9ueutFEs9bw03fFOEZy3nVff5rm4+Ks/qcOREuKyQpsNLKGpiMYRoOKXdS46ukG4Qu0ZK0BoOR4tXH7kF+OnQpe4l10OJcLLIjA0g5cL1bUxL2RzKMfCGZfvFCX9AQ9fynxbm2xX9Ew+GvqZUfpbjTq/V20i8xGA096LEQ3MbSf5vDqngIcgDEe44d0yfqFWxem86sZ5ti1UE5zK7A8BYix+4UZpW7XLaunHpVHkYRrKzv9ETteF0qknebZKSRlv/oqZ+xMjQNK/MWS62CopHQoYoUmRx8TSj+3G5d9Cq//OR5qPnb8yTt7BZPo5i9kGUfZn+1vbXOXecv745sWQpyoi8Pb34ObbiKA3stsIK3n7/sI94wsdFDfDiJ3W09+g7Cuft5EyeeF8kSLLmSsnKn84e7HIxPrm7697Si7d0Sb//MVdsiKyVQ+nZrwbaIqFYVU6XA+fAcoEZVW1FWNwnac2zL7XQPRBfjB3hr3H6NWkAIKqeXwieNhgWalZPM2Qb6Ibc+VZohud+epQo0NIJbCaxbLqFZRMJc6mvQD7UTCvFY7H1Zc8XcaOp3NEVLFs2snAmHgoqleYVakpQokg2p2nA0Wlnjg6AAJImkGQT5SOWYV2AHIsUvz/RyRjGFewUXAAAA==\",\n \"assets/provider-icons/mtpelerin.webp\":\n \"data:image/webp;base64,UklGRnwCAABXRUJQVlA4IHACAACQEACdASpIAEgAPm0wlEaqrygiq5caAIANiWQA1XAQUFM1MIHbPFl6tsUHqA2wHi6etJ6DvQA/mX9u6wz0APLI/bz4P/3A/ab2XNWhhvltwwDPEBOkQBOR5V4j9e1yNml5gDqhCSa/4zdI9m5BLOH/LfB5o3qLQew60sEjSZozavD8LUUdTEjU82BE4oAA/vyobXkHIF/RKOso5Ud6uHx/sT44eEiUIFC/JRcv1tuX6OnKJPBu6d6vnY95h7JcP1Fc+7sKT9wm8dr//eaNUw1gw/XcaBKd6VN696/ZO8rO0VLLHDM8RY8Ffs3h3g0LMe6eUysWTa5SUeh8iJbRUf78ohCixNi07fRyKSXJb8dvfc3uaBVKJsBJsIoU1CBjDWp0fMwYp2RjU3SrA7XueI2yRFUlEHCH1/xZBDjwP03073pf+G7/3X5MFXJulxYbJp4yQTEBjv+os7YCkxKCtB9EvpFaQGM4YwmW6JJ+wLPQa+eCD6ar7kwsXirpedd5u+LFwcXs2c0I6/EigWfcJ3K3qEI2STc5oxcTc8baGzPxCES2DkzuO+qojCixXv4R1r/g1J6muF/NrrHlmeVAbX2VfinhytpcdEkk8RuaZhFEUf2UV8g9b+E6WnsEEKkIhIGmhI+VuxlDXcqqguh1E3YlvUsI5MRuefzuiTEsTeHBDP95VQv7y510uPVXIK2btZPhF52NhzAFqIwsn579JqRw0HCJR0+c06HmRR+ZZhRleqHEiwu8skTBUJG6ocAuZa7q2kmvkUPk/vitleGo5ZTZ5Jj9QBfKFX8uARXCY/JcWNb2SiD1z5Iu7bOAAAAAAAA=\",\n \"assets/provider-icons/okcoin.webp\":\n \"data:image/webp;base64,UklGRr4DAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSIcCAAABx6IwkmTIzPrJP2JyiIgsIBWsDp7eddTeJNIgZwIhtDEzWbloyxEBjAtRgvwmGEaSlIgVfPNPGF5CiOh/lCIAzZ468HjgD0heGU/7UtxaA5JAlm1baS3tA4RAcsvdpQP1V/2o/v+5yxVCjJynEaABETEB2NDWut7pqjAavW/G/nTqfYPoi7u36/qWYcL1TH7v3d8wxqTqly9v3SinCQuJRHcwRRg4EnHn7YvH9zAx1iRhTSlCG0X94N59EwJWZy5MUMFvph/cui0YW6tqaMuNbr+7XTJilNMduwU9fv9hYkS6M4ZWk3anGdGyNkqsJKVmRD1Zo1ahkhA7iWKNoSekOIzLfECSU7+o8pwGBrtA1QKJklWzuK6RbL3jGUFqmY60KlynjEXC5Yy2qJF0ZcarwqjSkpL5UicqTout6ADwKAUSJz4x0E4KyctpANyo0yvDCfBBpCemfsKokEHVu8oXOSiaxnpksfWassDysCuyAHWoOQ/sSsoDOYVM/qlyccjGUOQio0MuBp+LfZ+Lbz4XY8d54MFRHujo2ixQE/q9yMJ/61wWhIN3HaVHbQD+H0V64v8A9Kbi5HBkYNJler4DgN4UqdH+CjZVauGXuDQFiLTkF4ErW+ikqHd8FTeDTOor4dp+EgnR3wYzy1uGU+HxD2abUqeiP4Z5sDtOYzIDFpLVSZBVtARSUgrSCiyXJcXHusCa1AeOjDvGuoP3IibqQ8DqVV3LWGj86AkbqlrbKIgOP0dsy8rUijcT/deTwNZBFmMltiH++W9AjG0QUmmxEgk0h7+jQKTdOI1BFSsI0R33rVOIl1vnR++pYJrB1O6d+x8Q++gadzg5pyqr0be9709N5zzWBwBWUDggEAEAAPAJAJ0BKkgASAA+bTKTRgmJS4dGJCADYlpABbVfgDpMVlWZRvsA1VXUMcpvNGK9pAtwN+qOEJYeLuPwrF0ITVRY8AYHE5knUOgqDF6uET7pklXc5rWeaAAA/vxdN8gFnstOtrVYBM8EWyYpv8G92nSPLItVYnmXJPXuqtwf7Kl3pnVrWQZBUPDHA/78Uca1ujWkgrE9/aYSW7vZNh8h+xFjHCHql22MZTE9+PbQDh7OWUGiZVevA/too/Wau/wlZO6hEyp6AX/xIfuL4pge/ju97Xg1H/Te8s9yMjrbBlWK10W9Skc/hvsQjlYQXsaxyHLd+39VL4jnYZ81yVwDO+/Gxk+aCnU4cQX9AcyAAAAA\",\n \"assets/provider-icons/okx.webp\":\n \"data:image/webp;base64,UklGRggCAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSMcAAAABcFtbe9P8sEMeRIcZGOAfQutoDLl0yaHWCjquc1JFxjn7/3tHxATAYz/KlXHD+aePa6Mw9eD1QJbbM0lXyOAloasz2UqLF9CeSVt8gvMz8Tk+EPZMfpYBQKDPDE4D8GTFQS39tDizWEboeNjm6sykMlyYNRfLIxfd+e/FgYuj42JtuDCKC5VveXAYlTwUqS8rDirpQTjhQAcAkFl6VsA9zqnNER6jpWURngtd0am0gFcDWTga21IG8LqXojLr428Nzqg88uExAFZQOCAaAQAA0AkAnQEqSABIAD5lKI9Fr4aNABABkS0gAryiY4eBmE0iTKFv28G6ErSldE5/4o7+9lUS1SgzbzM1i7ryhLuO48ibw9SQrHiU/9j1uW/2ozIuwG726YYAAP76FJwJDFSNu4bfOnXAd94JVXQEbBzpoviUVp94LEqzOVCutEpGMYtrHpczpKKb2D6Pxgjlj/WRp3vb8qJ1f1VvCv0iTQIFj1/9z96/R2xRy36cOoZBXmTxQmSK9QsWI0gJujckXvpYrl4yqEZU7Eze8/qqo0QAO0f+2MUrtKqhxNIgrSvRtuHnhs/af3/IVNz7GCX69hCxMWQnPEU+/0OI/BW3JSFWNpxMElcprQhbE3oDhXPJUDyaFBaeMB2A2AAA\",\n \"assets/provider-icons/phoenix.webp\":\n \"data:image/webp;base64,UklGRu4DAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSIwBAAABkEPbtqk95/G3bdu2O8ROetu2bduonNq2bSe/7RsnZ7/2LyJiAqj9U0k3/a0mScaR7YK7j1+yceu23bt2b9uweNqgHknu5pIBQseefV/TIv6ytamm5MG+0QlmYA7D7jeJ/9r0elu2guS/v1H8/7djLHGCTgnWhhlmKNbbBXNlLxBleDWXOGqFkfxasL+MgtDXC/6SAojk9wBvExCU2QLwqC2Cx0WA0iJC7FAJULfMFkBeLhAbF+p8tqchxOc8vpQPGG3TZbb+9RhirymX6XYBuo/N7R7KTJkruxTkQxpxj2/BqJuucpnuEIgtj4ZbErfLBYTzQwMlYo9+j7BaJsCu9QjbVITJbQgzJQBlowD8mEaAFicAmmaaIjhf5Psy3Y4QvW5y1Zwo1Mh4Tc92d7En0H94e3j9sSuPn30uKSl5/eT6wdl9o8wJ1vnCX7SdybXQLFxDwlNyc3Pjw1xNJUJWd//FsXAydL/a37Ud8SNj2+xo+6Vuvz8Z3XPB9U8fLw5xIONrjoFBDjK12wtWUDggPAIAALANAJ0BKkgASAA+bTCURxRUCuTmwCADYlkANQH43u2BucA2xvmA88P0Af8X1AP7B5kvsAegB+gHpu+x9gFD7CHsmKlMKTzqlHv9Dxjv1yoiVJ4nzsMqq6K5acmqmV5dAb2GXQAmMb5GZEltXLr4fyEe54YpxAAA/vz4QCF/BBwUgCKQsE2ZIqSXpmfh7wWXEeyX/tWn9+hW3kaLHxGcWsn8bk7qgQhq+M3+fB7XOifyzWiggWuv3KsAmb8qk4/JFhSMTRcKQeqIRYAE+fEEWsm8n69Wh5xM1dwmBISaCiMnB1U88GM0aPhcTn/hRYJH7ZKXELswhidH2BzZpSquYd3NdjI+ppluua/s2j/0tIXWnVooA75bOTf4FTQpz/rLfy4oRXLyyMR9w5ki7fJe3MtKFkeoTv6SK/8/M8frCDfn5nj9YTfNsU28R77C+5roYdp6ZHXWTc8rv8sKTQYGBML8c9pxQi4tczu6x2qf9mu4ifK+5SLhU+29xozv8mIntMbrcR2kgqpX4zazZDnQwHsX3DxXEc0khfd33QYfcgTTiH8HelYbrQgewX4Tdr5swUYUbaE9k0ntx6/oKD51WG2pqfsJqncFoTxGwT1ReJ5crFp+NIrEX2DDnz5qlsfBXL8jEWeJpZJ1QUC///fsEMm+qK/Me/FApDd9K9ce6vJ/fdbAMyMyCzIDbMdacf/d6iQNwxQyUixQMtJjqPkxWfb6RdU+MdbX2YHHzPerq10sZSWdu3YxnWsgAAAA\",\n \"assets/provider-icons/pouch.webp\":\n \"data:image/webp;base64,UklGRuIDAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSOYBAAABkGzbtmk76/C92LbtpGbbpZeSbds2aradmm3btu3k3jODfdZeZ39BREwAhTvZ645bsEg9gAxM0ev0b4QPNiDVim9gxnJF5w3/Ce4+ir7IXbDbGdA/YD0rrGW5ervA3p5Oq9swX+sW69cwR6fIy5fNtO6zXtUkTXcD8ChLFJfSaFgN3wBY6kUwjTTTrA8AvKgcQWmdel8BID7FE7tAmsnPQ3k8q9gADWsw1F/KS30opVHybgi6Su3JyPOnxMIWC8UmurzS9xG+X+hdE+KvDBiXhW5m49UKwLwutIjYmQ+De0qoOsvq/I21Teahw8p+FOwJMpOJ3fc3K15f5HslVq63YD/IL3I8K8dfCf6aVBLBnARO9fuflV9i/31pY0l8SiJu2sJFlEmf/ruYkSTu5WeF5rsDAD9akcgmW6DwQQCIz7NlWpF+2tWx/3ZmJ5G3yfQSJwYAcLk8ySwg7cShvwEE+yuS0MzW6pYpVXa7DwB+L8tNUuE7MqgqPwZ+3OvuU1Tfe9qKitfx7cDgAiTLu1+A/i+0Y/fQCpldMmAuKS2KlPWxgCpi1nwy7EMZM24yNqUxY2fYl7aWGX2CkGs5yMxCt0NGkaHe4B+K9xlMoRSLvwIIJpK5iV2O/cLTkgaRnbXa0A7JDQBWUDgg1gEAAFANAJ0BKjAAMAA+bTKTRoiJqq1XACADYlsan1GFmxdr9V8yKwv1D7zbxLY39g+yD6wehvxE/0a60HmA/WP9YPVm6wD9N+st9BD9N/TL9ib9pf1u+Ar+J/0//xBA3xvhYWucLXXvLr7ALhD549kykNH3cAAA/vEAd5XvNJlOtEjaKeIn+JAYaR+u8fhINQAVhO/D/uzWF5tyQ7KjzQLP6oTOtGwBbza34GOfzOzKf6lF2O4uKG9E/Mh6oFD/Vfm12t7DB/Oz/+qI/+jMf/7rLMReJcfsxhMawmeBf4r4U4CPWuT55BtfhM7fsleAGMtJJBdeCb0KSKeQQdDr3ZXmxHwqwLPZm70b4szxSJ8yS8fFJ2w5F5nemsZubQsSQ1MHMROWMp/A4FR6YK7Qpi2zHfJo7lNQtfkanGPv9HkiIwls9pyZZaPjEL46/nE4zEGJiXIY7L8YSMnW5DUcuNSRzr+Qtssvpzrdl3K5g8JsRgOPgxQYDid/N/COoqy9+E77fAxI5DpnM00cFKs91uoTtRNtbo2rFOwiFxWB+aRafJ6B/cZkO3s2WMkGPc5MXLk86UI+5G7TAdqW5o+vW4zWIOVxP+74LVZ6GZamtPScmbq6NysLAAAA\",\n \"assets/provider-icons/ripio.webp\":\n \"data:image/webp;base64,UklGRpwEAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSLUBAAABh8GwbSTFwcsc8z1DRIQBJxZ4uRUuH3JEkEr3/M6R/MKpBmGBAHAg23bSBHd3qKM1+ve/vRpJ3gIi+u/AbSRFShaPsekJjEPdCavu0E/31+s+9YeuCh2didfws10/0x/nfp/7hljc5DjRRqdj4gpD8erLShyul9pThGBWA3E7VCY/WnReSYDrOdI4sZobCfLW2lwEJxLoKeB4tngkoY6xshE1W0iwS6ZuW8snCfdZblmU7EkSfGYbrowXkuIS/3+ikSQ5Bn+wTyTNk/X739OSRBvtF9FNJrfoV0g4k1TP5vdzVatc1kr5xBtIsoP3SU3SrT+D90U+F/dNsspnTRhjxpEAPBqM+RMCk89YThBmTN9jsNOdHoPeCWcM5rAiEKsOhe6AwqFHoZ9QmO4o3F8ovHDAOcG5Cc4D4fz+cf6POPEBJ17hxE99h8FeZxkGOU6+w8m/MPUATn0CUy/h1G849SRMfYtXbzOtkUmr/e5jZfYjNkx/BNOvgfSPj1RhG5b8KWEtNrbpEvrrFKffh5k/8Gi3N1FcGwtkPhNqKPMimPkVyDxN9Hwv32+Z7+0yjvkezLyRAQBWUDggwAIAAJAQAJ0BKkgASAA+bS6SRaqpKKKvUrzogA2JbAC9zZh/D6tN1j8r/4p+qvUzbu9++boQb2A/sPuA7QHiAf5L7Ve4z5gP2d/WbsGf8b1AOkl9AD9APS7/WD4Jv2l/53+b9nT/3E3uB4bA/4cJcMY6viEP5f3vf5WdUGUUjmL2te7ubU+DetId6GGwSSdfAAD+/oelvzmYq0fXPPaXs60gfKIf23VRj7vOnBVaA8RsQ38ZV2pDLzrf50LAu3aH5JRgSnVHdnHJ9/+lieDbScy19WJQnXWSgAlmOQ8RlHFinv9Gx1hUPPwsg//9Mdb5ahr4OwFTgtKI27VJcEmJOAMqMu9gyRm1App8OhGW2X6AT/hJabE7d79GbNhUfdvRYBdRyss2yesQ+Sz168Dly6bb7Ct4dAB0djtHkYDHIrBrqnLtc57nD7fpgrajqOXM67hPPTnj6+tdEoFIvjQJ7B4tZEASG2RLnr1FtFnaKSsEwW2x/U5MD7+J8Q13QkfIwHCzHDd6htDbWoN//kSn00+SzAn1SDPbDVpFUPunmr63DnXBy8Aw8JO57PGs06sgNQm0sWbHyCzaxtqa6rAUVwpIYLsyassUHFWyxvkWl2tPYItRBbrewosGoaykHW5M5WeRcK//Lt+UvncLlsMVmtriVJDZc4ZL/VNj2OMApPuyAC3fGbEc2tYyDILmrINF/ob63v/ZbubfRSPU1UC0uvZSW8do3UJkbHokN6IL6c438/2OqYxrQ8jbfeoq+DQIwn/x1T5z7QZLZ+RVNnkiKvz/NZv80lIkfS8n9MeCrtFXSQD8L8ux//pjhdso9Fd3VEYTOUupMrREspUHhb+sqBCFnGVfx9ZetUPDnnbtm+4EZcifRPpZqwuWgBzpISVhXTpKMP8aWXrRe816Lk6gk1ZTlDbPdP6nteWKf0Ik+WzZgAAA\",\n \"assets/provider-icons/river.webp\":\n \"data:image/webp;base64,UklGRggDAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSIsAAAABcBrbdht9FfG5P3NjGlOV5ciM06Zfg+pwZNlIj29EGEjbpv1FrBLo0ohN/bAFcPCpFUNP2em0BXNSxw+kWLegroXciJstuPV1XG0AFkzGrQisCYluEL4iO2Ew2XQDMfUo+AGFYfs76ADzOPsaZ+/j9AdRDFRQ+owzxAVILyKSGqFfwfQ0qL4H0xsJAFZQOCBWAgAAsA0AnQEqSABIAD5tNJZHJKglIie4CoiADYlAGoej6pTQBtjuai9VO8bT4B2q8zOkH8W8QMoH6B5gfVzJGP8BzF2z0d6r+3AZ/dxiuWjRBF/S2bdSTaPB5eKpjHG6LBOXee3kpmStqnvKnkfmOR2RB3fpNeCQAAD+/GkSOxf+m3M/mShrUZv965l2mfEOD5V8KqqX+4JPS8CV/ywCP1N7vNN3v5MAmuuMyP20j8oobCgvz5+zh2scf+66Ye3xd+vc/cvFsEo+YTGDlPdI3iCktdYFTOdr2f/gB9xMSR+bl9Na5+bKN/6iFozh6n+N2EYX96GWbdaoVd+Effe/bIPacXUDhCbvzA3zI/b/YkF4KuLXEpq5W5IUyNBJhcyTDY/xC0UrN9DAQZekNCBhwqRcd+n6sBcq5KstE1hpuTq3rfyGSJ//U5F+7dWN90KXhBFDHB7rmKcBJXG2km6LBbC+s5lQimrvA2+sxYpZbgbBOhjQewdFTW8Rg6Qn+C5hep6Hy61+qaf5LnrzfSafLfVCg6IonZ6wyYJfIrcInMCVgKnIb7NWAqy9fTWbh/T55H811o96aZgYxv9E0vkeYDBxWwXqJVZQB18deUp/5OPcAbsDD9ZLfsFO4IqVMJ77KFvaYmQVGFnCpxqhcs0uDRL5ednvj0iG5o9GrBxpQSRExc01O8n6SGPzvWiCcZoKrDAkpqQgRM/YZuWTHdl/FYW1vM/KJYkpIUYCJqv8rl+liOqYkGJibv8Pu3rd/PSPvKeTtm4kHjHRf//JoykGjaAue9ABA4AAAA==\",\n \"assets/provider-icons/rizful.webp\":\n \"data:image/webp;base64,UklGRsACAABXRUJQVlA4ILQCAACQDwCdASpIAEgAPm0sk0WqqaoVKwbQQAbEtIAK8vzG7dNL99pJ3mmoFeU/6j0P78ONj/mell/vfbd7lfoH0YjrIUC0i2JegBqavLYxZTPRFy+Ix30lpgJlDk0jltn5asHfm8ZUQ1eeuiQS1LSm5qvVcICtgjX6vm4b2NWw0S08atkL1XAAAP73B+xxoDnOszSODw/bKX0jP/MAqOH+h22K29gg/z8e8YPhpkXuiRD8Yv0diG7GbzG+JM+6w/tKCx/ioADea434W7hEXyme1+ryl7JoKnqRylIe5+qn2uyRsFzd5XX0gSz22I5LKCePd9M1PYcsecsPIiajr554/BW423Brj0Xotc48EvwfxSqBfv9V7+P+uX91GjWzAEIXt5/udtdK9kNJf4GHy4q8E7ttWxSb9GDgeteYd030CHQLs2p/YI+fRdpeg0nsPifokE1qws/pgLz4hWubFN8H//71OJ2yj8k1BxbMHC/2bWjjiDPTdvl/0A8MHXTa3yPDPC8xbfNnwSRZcM3hQP97gdFkgodxNCt8YHYklkKPISRYaONKfBfx396C3FPh9nJDKR/7VLQvUI2/rR70hDwlsP0Zu01cK89VbJudszNdDZ/wfxARV+TZJ4mDBaebXDRTgTSJxoF7KPit/NBw5wV/Jz//f/i3/Ejz6ty32Td4jyFAZOVz3wvLnZyP4HsRpicZD8F3AQIrxoa9KoGUc2adUhlkABwKXXtrxAza+z/cZLq0MmwDvuQRQF3ILx382JbUiHrCFJfcsPN4G/MDm3GCYc6WL2NTfmHHekG/S7/yqs5d7sDJL7KwKsecObDcCT94ItHvJ5Z27Y7qn+3fwHq4021uAUPfG1tL/4KFvfwGISjHoYazAjr0bVQncVBazeh1uDEPemTV73N2QrQamZ7FUnd8H/IAAA==\",\n \"assets/provider-icons/shakepay.webp\":\n \"data:image/webp;base64,UklGRsQFAABXRUJQVlA4WAoAAAAQAAAAPwAAPwAAQUxQSAcCAAABgFTbbtjoQzAEQQgE8zASsTAHYRGVT+MvYinuLGcVEROAf6MzKWX48yvzIMVcn6Zqxrw3narXFzYkcdmN4ak2R2/qSB4khX0xp0oetHrx2gN4Vh6ksM4MndMfwOIVPUraOFscpGzqnBPnLYktkyQrAOPhMyfqQUlPZ0lKtPNGDnRTkndc0u6tGwvtLWl3QpL34kb0lqTspKTZGVtXwzqPJHYk6Wk4dZneMEka1fMaxUz9kKvA66nmC0cL/TjsREmrWtVw6vc+Kq/8tYBF/UkuYKm3X8rUn2XqHVUc+uRvykZ+oRswFjt0A57NL3lrDxyNFQ1Hiw+s2OJEbZWhnvzZHujmKdEd+zec6F8BJitVKvdA+SQZoTJ2MqwA/BYnatdVr2C8sgfKJ3WZVmDsC47a1SXJhuQF4J+I8kmV6XPg/awoRCuQX2bhOtMH2uY8SF7MFkUcn9Q5DZ8tTqIdQPGbq3Rc9ZPkh1RWeVoqA5d3If8U0gCQlRXDIzLcisGCAEyKyqUNgEWiTJ3HCbsQAJe8mpJ8uMqo9okoV+XDJT0VXP2G8bAqr46O7mKLo8BDiQs1W3T0h3e0K9jahtrVjYHPFg151V9q5sTVyUp+w1XnxPXFQlxfZqrMiZ/OPEmMWZmnypz4+RMnScyIiKRKuuFP2uLpK33g787gF+6Jv25rJymRGf7g/yoAVlA4IJYDAAAQEwCdASpAAEAAPm0ykkcIqIsFVjQgA2JbGt++jaD6Aqg7pvrv2Me5FUH7h+DeKtNz0rftfug7QH2q+4B+m3+o/r/WA/k/9L9QH8a/uX+k/4HvG+gD/TeoB/Vf8x6vX/D9gD+q/432AP1A9J79p/gM/az9rvgP/Xz/tdYAFbfy3Ot+vplPnUwDCcCwTlJl2UsSkBlg+H9z4swJ/WLf3COwAAD+7nNTfmpY8UbT+cWb197RCFuQH8ijUDrnCV/Tz2lINkf7T7/zih0sqJaPtPjrxvrQT//tGfvNxfHSwRnooYleUj63Rn8X/hdaySoV3t6gyRuwRlVf/EFeNzNMRfnRiw1/1t5hB70LZSqWrV9yfSLNadTT+Bz9zk7O2mPxhrDE8TXEvQyDIRXyF3HwJ7AuYZ4p/cW1nqFkzMPb13cJ/qMkIxUcKNqtIDBZC/8vuDG3oCvDnfDW4ly0sWGH4YJHCXkjDkAHoNiKu+0Tzt1Pl7Strkm0O7Yk7k/vGzLs/B9tasiH3sdEIamPuaF8u/6KRWHYogSq7tXwBHhPj7MWwmHjZoOx2lljcCXVmlwqeIfFRFJcz/QqKTBL7KiosSiQivvgfycw2gPuJGoPAUdrKGa/HWX8U31uCvCGyQVJZjfY3u5tMip03PpHvpL220Wibz9einPQaCDWgL1zh2jWP4qHaYda7Qe/AvHlUtVgrN4da7EYqf8ASjVlBsZVo3n/DM0V/AZf7ucCX/+m9d3/oYSwsG3P7sQMj7xIIbv7QeJO7a9vzWEkRYmfTaicKwFJ7iAvdNzlKtgzAb+29yoApqDIHKmF+4TF5DveBQ4VRk65vRTAyVHBdi4AzRRE6Cpq7TZPLoz/jq+YghVgKxp4ZUM5o0UI8Ssb/2vDMknmGL6Unt5HaYKXZYOSj0jCvflug0uUGo9OD9v6dcGKEFq6hwkOeejzxO57UUejxfjqpqn/H56k2AprB4vkhnJkr2/7zXMyreD7gAkL1wx2AbmFXN1lq+8fS/+m0eIx3WLHkqMXndBUHMyftpgLy8sNT/xT/6H/P///OazOH6AfLIJfD+cBNem2eJb/1G//MPieME+v/EcxR3I7nVzj3M8bcu5DsPCi7aXJlzfeQXbpJERzPiVzv6uuS3VL+zKnoh1eqkNj5CcsgF288mBgSQZPTjsgb4OMTpJ+VHITcD+PYT6Kv+ioqNVxUYxCkBuCsnpcMEOv7vUyAAA=\",\n \"assets/provider-icons/sideshift.webp\":\n \"data:image/webp;base64,UklGRnwCAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSLAAAAABcNtsm5vo/2vsCulqd8zgRahy3sCbxB1M6QG4llybKme46iQH/gHu74mICQBA2/VmZzI1z9KBYyEAoGjFu3tuDOnH1m8JBBRTqchwJacCrZYsyPhCtmzHV8TgM3YHW+Lwt/PSBwt0STLNgz7kxGRO/7rnJ82D3icXHi6pt+Nh0XdjxYHyHbslC/MK2bJQTOfKNCWnAgHrTX/70Oboyy5uCQQArDVGaZabkh8Sz7URAFZQOCCmAQAA0AsAnQEqSABIAD5tLpRGMK0sJzC06ViADYlpABPZZ9qgXwgyv7rhx6Qmx4dHWNJ2e+Ws5I1If56scZs0CZ9tbfpZTY2FPDZAhdCMbldiVu7KPzw7n+zGItT1Cl5Jvs2o+thkpe+dgAD+/PhWkmPjnPa+YkCoKMP3x5r1RScci6KRRPf1+8Kws6WZXLTWL44h/l9gvLveCYyh/FaWgrDdikx0ZinY3IusXc+eVjus4GzwIHfDx7WipyoiHHfCxodh4dupzXdIKcv8zOYux/6+zleBhEhldIJr+hv+HeOSNeh1gUvlR9msJaj7dNPxeHL3C5I3Kh2XGIDfKa1IU9FDC2UNH+Suxm2WZUrS5rW/6xSjP/+9qfOsM/waGR9v92Qn5bogXx2Za92zVyIhSSXCMgH2QZ4/Zo7cfGRW1P/7b8OlNhpvOlDQr9zyutmiFypVW+Y5UDYfEXAQEUS3HPKXubRTU1x3iYWvKwPmFUGVUaJ/mZvJ5uevzMZgSIEp3zMM5sgdcHOsiy31HfVU6hsuDI4e+6uG/9j4MFocLvgdCqOj68IAAAA=\",\n \"assets/provider-icons/speed.webp\":\n \"data:image/webp;base64,UklGRmQEAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSAwBAAABgFtr29rmDVNntkf4K9Mk2iJUomkCHkFHE/i4VkrDBmGmylCJfsuM31fnRMQEYO6NiFLS6p/OYI3ln56LbmDBHZFqtQcEzbsL73zJyoscEHVrYo6js+cB5Zp3RrBsDEi7FxtTAqo7IH4XnQiq/QF1MwfgqOwO6N8CODMGDH4ByecBhz3sVAY8QrwwsZGSTERaAyaVNhelAZcaG3U2Ptlw2Pg3qsPGJxt1NjQ2Sly0FS5aESZkaoOJFwEmKjuQLDwngT8OOscAdAbc/CGAnEmurwYBIHpHra8GMLmdsmjZahDT/VVSz+cezBZVi4p8qSQxtz91Z1Jot1JiBwtuR3P6n1wn57OulZTIBuYGVlA4IDIDAAAwEwCdASpIAEgAPm0ylEcqqqwoJ7qrWIANiWwAxRHjfxmrIda/F3l+tOO3P7k89wbbrLyG+oDzAP0I6QHmA/k/9w/Xn3svQh6AH8x/1XWE+gB+wHpr/sP8E/7g/tJ7JDxY6WZn+vNH6clzCj472CIFY3wiCl+iADk7sHscuVwSaNUCCIYTIkFdboD4dbY0AVcKTvZp7uK3eIV7Afc6gFeW+AAA/u0HLzRf2myFOkMBer7hj9wu433n5CacwOLYcWAgilnfT1cyd6zD75rucRzfzGNeCjF3dGgYX6JAYpXPq5bAJ6af7dltHbDH7Q79js3AjXE93a2Dtr4tBAfnB4f+ZifT6u7dbYSUCdzFrOYSdRXI0TFworMT53umRP7Pk1ynRN3x5niFUQsypQOsokWdY6buPYF7ig8i0hzXlQG3DJnQ5g5k91SqausKLK0PL9LKMOe21Ew3ZuujlKMvG+9N7j+8LpR2yqIjZ6YCNh1JTMsX2aYD/tfJz0ow21RG2f5AvuN6wtzIYh7MSX6nqXlSRJ7MbcE97hnUaD0FSh7W6/pJUL5vfN1G52H7hehrAWv1c7iDXrHSCsh2asTzkXa+GLnJeSrNA7vYF981Z/gnRQMp21SO8XKd8aXfRQS8375Dy4Of3XZMllD9sMJ2p6qFvYLDt3ruwZukft23wQbrBC7Xvmu2+ONSKeiR6DrF4WZjmd2dRWCqucVVs+drFsFCTUFkSK7iiX/n+lPmLXs3J27zKn4UcNdY4IGFlH6YDlaTHaiFHlzOgm96C6ZjaKz6yt1BHt9xp1LmVb01A0V+406lzJ0XuuL5JIOq4xQt9YkwGRDyvoMEEuxemamDz8N7QtdDvfB2hYqIQ+BN/4NfxJiDdEXNVtd14taE9JDIEr6B8evO3NpaKY6j6i9OmlvtKY8EmUYCpMujZplgPWgj/E4sz937vkAQAcrTl01UyuBFnzzDRZ0EfHplBu/2vKsixXLPVavWquM2b9tdt5LuYP7+U3bSMd9tH9fj6GFSlvi+H5jX7yOAu9yacBTe7rvyK8wIIuZO/BY2Xbq2gi5Ub+tEnaPbbowAcj5LVNxa0AEAAA==\",\n \"assets/provider-icons/strike.webp\":\n \"data:image/webp;base64,UklGRhICAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSJ8AAAABcBtJktucC5UAXMQCqk/tUvn6HD4aVt2HwIXWWJ8RoaBtG6bdZ7BAkKUrp9HQX2xYVFfJprPWry/XH3ybbajW1N/opPVKTUB/qxGa5Ry6/mZ3YR4zRX+7oZlIm3oCp1Yq31PYV8449P0oOPTT2JM4GosMLEL/d8egSZ7/keefVZIV6khWczz8gYaH8PAZGl5Ew6/YeJpI9iDgezS8UQAAVlA4IEwBAADQCACdASpIAEgAPm00l0gwsBGT2qxsQAbEtIAK8A66/7Mxm1qCZrHQ7u519vAJLJMylm7VMpAZFQ7NQwxWyqkfeDtOfoivsXkTMcrF+J4AAP78rRE7ix5r4zf8V5dsa0zEMRPO1FzKSa7BFGGrz44/4lFV3/U0vFXsbls0/TT+KJdvG5MGN3wz1umFo0ufpBHFfZJcNzYrwlLyeXaaDcPTTzAof1OhrpECml6tRWFkj9StaLYUApgyb0Uf44Xul+AjJp2jWytQw8rPOaEkvVP5bnGoP2etjqToeailmU+QxXC/N9/+MRMzKHej1rjv4eOss6L1wd6vrp1QESOaG80ZvcIbBd61WpZ0iCztBktW5/bk8iJsz7fU11IutTMZL9yGxsU1d9o9wYaO689yzcsY9niZgMw7hjzLDPfGv7g6S4nFn1GnZX20EAAAAA==\",\n \"assets/provider-icons/walletofsatoshi.webp\":\n \"data:image/webp;base64,UklGRgIDAABXRUJQVlA4WAoAAAAQAAAARwAARwAAQUxQSMQAAAABcFpbWxylCigjKgWkAxri0AmN4FG4uKjoVc4+k31/ek5EqHHbNpJ6bV1jPyFaUSptfV7eXt0Jvm5l7q1WMtphbELbnW4bTLyFMEV3kYURqySuu1CXrJBm3aVm6fKddRebzZ/CdZfrxITpAJrp14JAEc9uxiUDgyBVy6BVuoOoLQXrKficQl5SKG8Ubi8Kr+7vmC/M5sy3nHmbM/9z8ggnH3HyGic/cvIsJl9z8j6mf+D0IZh+BtMXYforTJ9G6/cwfWMEVlA4IBgCAABQDgCdASpIAEgAPm0yk0YoqJKXDcxIQAbEsQBq2uBt3zkoz+h8TrTeEA8wHnAf1X1AfQB7qvWAegB5Yn7O/CZWSa6X+5NQFMi8mL9RpT9zFs69RHZdxNrkzIU9koy2591bJB8pDI9CcsJyQlNyywKrbRINxbpPnMMECgAA/vz4Tz8o6WpX+kS2YSkquogFnkQcF/82rn/+HAlld5/7fn4M7cw6/r7EOvrpAOqAMD7gwCJD/lcZ19uPNgOw8B5+zuzTa7jT7f0LFEMijoUe66CPuuehg6+UoxAyTogO8OsUheCPKRvebQjoaZP3n33wb4HoR10yPfTWcfEk9ylED7AcKMS5x+XhITcFHuERO22F7WB1j+a4o1QEjgSDxPWkxDvTEo1B7ARBLW1qOrPBmm5asBVyOD+3FNAvfYZl7NHiZfPcKmYDSPGev0xnEPPvMdkhhj08TJwNvlEXf3/+Dh/yb9HnfO2W2ocmpo+3YzUGYYPrrjDFPZF/PI6qu3XfqxdI0VuBx5dTI0L9U6Ai9O/k3BaFEzSHlyF+n/8w2POQrHOQGTJwiqFtN9ZR8SIpquQtD5gDUlPw1DTMMWNgg8lTAwLfC/2SmpeQYfbWj2uWnJlEtFChkhW+5/+IWKYbPKPAP//TN790v61rl10xQ59Zje4CHQvITKkjIAIl5O9e25NFqgCzwg/h03TXrGnD8ymxzUAAAAAAAA==\",\n \"assets/provider-icons/zeus.webp\":\n \"data:image/webp;base64,UklGRioDAABXRUJQVlA4IB4DAACwEgCdASpIAEgAPm00l0cqpiqiJ7gKGIANiWoA1BEANRy47+OHKO7N+Ccm38G/J/9V/T90A/UDpLeYD9EP1P99v0AegB+hf//7B30APKd/Z/4L/2+9JL//neVpAma02MuJSbLLxR2hbjKRSOTOpKHOi9OCbpcBsl+VMv5sl5hH+QzD1xH221I8sXfb1SYcDNrn6lD6wSyLDP461BywAAD+/gbcnhp69EjO2mRKy69/L+BlvH3bWJT9N+/QzfGCPIKh1CgjVV6iL5/zO7sWZ3lhKvxEL+01VJ8Tqgvb+vOv7zKmNUPiLa6IP4eZmxmqSPhWdXPdRz1mfi183VKAdSZ1xZt4JxfKPNlZj9NK+NFxYkSn72S0sTnh3f1tGX9PkbUoMzIpapJEFvQsfJWefUgZmlcZ5jggV/Jy8t3MJxMztZGfl2NrXkEZ55Ibz/bf8JId3Qe4ScMfSS1sP+WlIdsK6JlULgjXgYktHQw6MY+jJq3lDssYn5hc/b3/vF+REMtOQd5yLmP7smm4lZ9D//qeau66Fxes1yvahBJU5uLzrSd/47PKf0rm8OmS2mVqADQrFjbCER7d4Q5bC8/UG078xGNh6q7vnWqGJBtLZB9a5a46WSxonG/90h6jZ1kJlH77yQ/0BktWdS+Y0d6guUAk1PlziLJHBrBQBVYfIqq7KYhiBBbHTAc5isazHz5BChS744FTi0ugbHk3k1VjIUrAmrEPdkz5Xp7uqWcPJP6E9l0Au6rl69Yyo7kXzxc8IEUTef2of5GHXC/SX/5NMcHt5CZNUzkorO6oDXbW9Y9f+MlqzqYcS9yXuJXiPhZPt7hSfi7uh+AE/SDtXwxvOcK4THTLs02mWXMhvLC3gGDR9X/Z9om17H9nyLwsFc12gRj8Wo8igzFr7HL1iHSxNdPGgMLeju9UJvfOQnxn/BoLHB3osUrDPPY/SWdSCUDObSMypQd23oI9h3uQPcOE7Jvvdp+ig0qVUrffBYz/F/YWsazSfjqjp3dQzrPvAnmJ3aJhrSPAoh4m8wsZhMO5CRLcste8LdmToNgAdsAAAAA=\",\n});\n", "// The wallet logos ship inside the JavaScript as `data:image/webp;base64` URIs\n// (see tools/package/generate-provider-images.mjs): nothing here depends on\n// where the module was loaded from, and no host copies, serves or resolves an\n// image file. Eager, in the main bundle \u2014 the provider grid draws every logo\n// the moment it renders.\nimport { providerIconImages } from \"./generated/provider-icon-images.ts\";\n\n/** Each wallet logo as a `data:` URI, keyed by the registry `icon_path`. */\nexport const providerIconUrls: Readonly<Record<string, string>> = providerIconImages;\n", "import providerRegistryJson from \"./data/openreceive-providers.v4.json\" with { type: \"json\" };\nimport { loadPayTutorialImages, payTutorialImage } from \"./pay-tutorials.ts\";\nimport { providerIconUrls } from \"./provider-icons.ts\";\n\n// Every image this registry names ships inside the JavaScript as a `data:`\n// URI: the wallet logos eagerly, the tutorial screenshots behind one dynamic\n// import. No host copies, serves or resolves an image file.\nexport { loadPayTutorialImages, payTutorialImage, providerIconUrls };\n\nexport type ProviderId = string;\nexport type CryptoRouteId = string;\n\nexport interface Provider {\n readonly id: ProviderId;\n readonly name: string;\n readonly kind: string;\n readonly url: string;\n readonly us: boolean | null;\n readonly lightning_docs_url: string | null;\n readonly icon_path: string;\n readonly tutorials?: readonly ProviderTutorial[];\n}\n\nexport interface ProviderTutorial {\n readonly index: number;\n readonly path: string;\n readonly caption: string;\n}\n\nexport interface ProviderRef {\n readonly provider: ProviderId;\n readonly rank?: number;\n}\n\nexport interface AssetIndexEntry {\n readonly symbol: string;\n readonly label: string;\n readonly route?: CryptoRouteId;\n}\n\nexport interface CryptoRoute {\n readonly id: CryptoRouteId;\n readonly symbol: string;\n readonly label: string;\n readonly providers: readonly ProviderRef[];\n}\n\nexport interface DisqualifiedProvider {\n readonly id: string;\n readonly name: string;\n readonly url: string;\n readonly reason: string;\n}\n\nexport interface ProviderRegistry {\n readonly schema_version: \"4.0.0\";\n readonly generated: string;\n readonly description: string;\n readonly filter: string;\n readonly _meta: Record<string, unknown>;\n readonly assets_index: readonly AssetIndexEntry[];\n readonly providers: Readonly<Record<ProviderId, Provider>>;\n readonly crypto_routes: readonly CryptoRoute[];\n readonly disqualified_providers: readonly DisqualifiedProvider[];\n}\n\nexport interface ResolvedProviderRef {\n readonly provider: Provider;\n readonly rank?: number;\n}\n\nexport interface ProviderFilter {\n readonly us?: boolean | null;\n}\n\nexport interface PaymentWizardRouteRequest {\n readonly asset?: string;\n readonly route?: CryptoRouteId;\n}\n\nexport interface PaymentWizardRoute {\n readonly kind: \"crypto\";\n readonly route: CryptoRoute;\n readonly providers: readonly ResolvedProviderRef[];\n readonly asset?: AssetIndexEntry;\n}\n\nexport interface ProviderRegistryValidationResult {\n readonly valid: boolean;\n readonly errors: readonly string[];\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n Object.freeze(value);\n for (const item of Object.values(value)) {\n deepFreeze(item);\n }\n }\n\n return value;\n}\n\nconst registry = deepFreeze(structuredClone(providerRegistryJson)) as ProviderRegistry;\n\n/**\n * The one route a checkout renders provider suggestions for. See\n * {@link getPaymentWizardRoutes}.\n */\nexport const DEFAULT_PAYMENT_WIZARD_ROUTE: CryptoRouteId = \"btc-lightning\";\n\nfunction sortByProviderName(left: Provider, right: Provider): number {\n return left.name.localeCompare(right.name, \"en\");\n}\n\nfunction resolveProviderRef(ref: ProviderRef): ResolvedProviderRef {\n const provider = registry.providers[ref.provider];\n if (!provider) {\n throw new Error(`provider registry references unknown provider: ${ref.provider}`);\n }\n\n return {\n provider,\n ...(ref.rank === undefined ? {} : { rank: ref.rank }),\n };\n}\n\nfunction resolveProviderRefs(refs: readonly ProviderRef[]): readonly ResolvedProviderRef[] {\n return refs.map(resolveProviderRef);\n}\n\nfunction normalizeAssetSymbol(symbol: string): string {\n return symbol.trim().toLowerCase();\n}\n\nfunction normalizeRouteId(routeId: CryptoRouteId): CryptoRouteId {\n return routeId.trim().toLowerCase();\n}\n\nexport const providerRegistry: ProviderRegistry = registry;\n\nexport function getProviderRegistryMetadata() {\n return {\n schema_version: registry.schema_version,\n generated: registry.generated,\n description: registry.description,\n filter: registry.filter,\n };\n}\n\nexport function listProviders(filter: ProviderFilter = {}): readonly Provider[] {\n return Object.values(registry.providers)\n .filter((provider) => filter.us === undefined || provider.us === filter.us)\n .sort(sortByProviderName);\n}\n\nexport function getProvider(providerId: ProviderId): Provider | undefined {\n return registry.providers[providerId];\n}\n\n/** The wallet logo for a registry provider, as a `data:` URI. */\nexport function providerIconUrl(provider: Pick<Provider, \"icon_path\">): string {\n return providerIconUrls[provider.icon_path];\n}\n\nexport function listAssets(): readonly AssetIndexEntry[] {\n return registry.assets_index;\n}\n\nexport function getAsset(symbol: string): AssetIndexEntry | undefined {\n const normalizedSymbol = normalizeAssetSymbol(symbol);\n return registry.assets_index.find((asset) => asset.symbol === normalizedSymbol);\n}\n\nfunction getCryptoRoute(routeId: CryptoRouteId): CryptoRoute | undefined {\n const normalizedRouteId = normalizeRouteId(routeId);\n return registry.crypto_routes.find((route) => route.id === normalizedRouteId);\n}\n\nexport function listCryptoRouteProviders(routeId: CryptoRouteId): readonly ResolvedProviderRef[] {\n const route = getCryptoRoute(routeId);\n return route ? resolveProviderRefs(route.providers) : [];\n}\n\n/**\n * The provider rows for one route. Called with nothing, it answers the question\n * a checkout is actually asking: `btc-lightning` is the only route that belongs\n * under a Lightning invoice, and the other routes list exchanges that convert an\n * asset INTO a Lightning payment \u2014 a different path from the deposit address a\n * swap provider already quoted, and a mid-payment misdirection on a deposit\n * panel. So the minimal call is the correct one, and naming another route is a\n * deliberate act.\n *\n * The default is gated on \"neither input supplied\", never on an unresolvable\n * route: the registry ships fiat assets with no route at all (`usd`, `eur`,\n * `gbp`), and `{ asset: \"usd\" }` must keep returning [] rather than silently\n * answering with Lightning.\n */\nexport function getPaymentWizardRoutes(\n options: PaymentWizardRouteRequest = {},\n): readonly PaymentWizardRoute[] {\n const asset = options.asset === undefined ? undefined : getAsset(options.asset);\n const routeId =\n options.asset === undefined && options.route === undefined\n ? DEFAULT_PAYMENT_WIZARD_ROUTE\n : options.route === undefined\n ? asset?.route\n : normalizeRouteId(options.route);\n if (!routeId) return [];\n\n const route = getCryptoRoute(routeId);\n if (!route) return [];\n\n return [\n {\n kind: \"crypto\",\n route,\n providers: resolveProviderRefs(route.providers),\n ...(asset === undefined ? {} : { asset }),\n },\n ];\n}\n\nexport function validateRegistry(\n input: ProviderRegistry = registry,\n): ProviderRegistryValidationResult {\n const errors: string[] = [];\n const check = (condition: unknown, message: string) => {\n if (!condition) errors.push(message);\n };\n\n const providers = input.providers === undefined ? {} : input.providers;\n const cryptoRoutes = input.crypto_routes ?? [];\n const disqualifiedProviders = input.disqualified_providers ?? [];\n const providerIds = new Set(Object.keys(providers));\n const disqualifiedIds = new Set(disqualifiedProviders.map((provider) => provider.id));\n const routeIds = new Set(cryptoRoutes.map((route) => route.id));\n\n check(input.schema_version === \"4.0.0\", \"provider registry schema version mismatch\");\n check(\n typeof input.generated === \"string\" && input.generated.length > 0,\n \"provider registry missing generated date\",\n );\n\n for (const duplicate of findDuplicates(cryptoRoutes.map((route) => route.id))) {\n check(false, `crypto route id ${duplicate} is duplicated`);\n }\n\n for (const duplicate of findDuplicates(disqualifiedProviders.map((provider) => provider.id))) {\n check(false, `disqualified provider ${duplicate} is duplicated`);\n }\n\n for (const [id, provider] of Object.entries(providers)) {\n check(id === provider.id, `provider key/id mismatch for ${id}`);\n check(/^[a-z0-9-]+$/.test(id), `provider ${id} has invalid id`);\n check(Boolean(provider.name && provider.url), `provider ${id} missing name or url`);\n check(\n typeof provider.kind === \"string\" && provider.kind.length > 0,\n `provider ${id} missing kind`,\n );\n check(\n typeof provider.url === \"string\" && provider.url.startsWith(\"https://\"),\n `provider ${id} url must be https`,\n );\n check(\n typeof provider.icon_path === \"string\" && provider.icon_path.length > 0,\n `provider ${id} missing icon path`,\n );\n check(!disqualifiedIds.has(id), `provider ${id} appears in disqualified providers`);\n\n check(\n provider.lightning_docs_url === null || typeof provider.lightning_docs_url === \"string\",\n `provider ${id} has invalid docs url`,\n );\n if (provider.tutorials !== undefined) {\n check(Array.isArray(provider.tutorials), `provider ${id} tutorials must be an array`);\n let expectedIndex = 1;\n for (const tutorial of provider.tutorials ?? []) {\n check(tutorial.index === expectedIndex, `provider ${id} tutorials must be sequential`);\n check(\n typeof tutorial.path === \"string\" && tutorial.path.startsWith(\"assets/pay_tutorials/\"),\n `provider ${id} tutorial ${tutorial.index} has invalid path`,\n );\n check(\n typeof tutorial.caption === \"string\" && tutorial.caption.length > 0,\n `provider ${id} tutorial ${tutorial.index} missing caption`,\n );\n expectedIndex += 1;\n }\n }\n }\n\n for (const asset of input.assets_index ?? []) {\n if (asset.route !== undefined) {\n check(routeIds.has(asset.route), `asset references missing route ${asset.route}`);\n }\n }\n\n for (const route of cryptoRoutes) {\n check(\n Boolean(route.id && route.symbol && route.label),\n `crypto route ${route.id} missing id/symbol/label`,\n );\n check(\n Array.isArray(route.providers) && route.providers.length > 0,\n `crypto route ${route.id} needs providers`,\n );\n\n // Rank rule: ranks are optional per route, but once any provider in a\n // route carries a rank, every provider in that route must be ranked and\n // the ranks must run 1..n in listed order.\n let expectedRank = 1;\n const routeHasRanks = route.providers.some((ref) => ref.rank !== undefined);\n const routeProviderIds = new Set<ProviderId>();\n for (const ref of route.providers) {\n check(\n providerIds.has(ref.provider),\n `crypto route ${route.id} references missing provider ${ref.provider}`,\n );\n check(\n !disqualifiedIds.has(ref.provider),\n `crypto route ${route.id} references disqualified provider ${ref.provider}`,\n );\n check(\n !routeProviderIds.has(ref.provider),\n `crypto route ${route.id} references provider ${ref.provider} more than once`,\n );\n routeProviderIds.add(ref.provider);\n if (routeHasRanks) {\n check(ref.rank === expectedRank, `crypto route ${route.id} ranks must be sequential`);\n expectedRank += 1;\n }\n }\n }\n\n for (const provider of disqualifiedProviders) {\n check(\n !providerIds.has(provider.id),\n `disqualified provider ${provider.id} also appears as included`,\n );\n check(Boolean(provider.reason), `disqualified provider ${provider.id} missing reason`);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\nfunction findDuplicates(values: readonly string[]): readonly string[] {\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const value of values) {\n if (seen.has(value)) {\n duplicates.add(value);\n } else {\n seen.add(value);\n }\n }\n\n return [...duplicates];\n}\n", "/**\n * Exact integer/decimal money math for OpenReceive \u2014 the one decimal engine.\n *\n * Uses bigint only, never binary floats. Rate quoting (`../rates/index.ts`) and\n * the Node swap providers parse, divide, and format through these helpers so a\n * single rounding rule applies to every amount OpenReceive prices.\n *\n * Two error domains, kept distinct so a transport can map them without\n * guessing which side was at fault:\n * - {@link DecimalError} extends `RangeError` \u2014 the caller (host or\n * payer) supplied a value outside the accepted domain. Maps to 400.\n * - {@link PriceFeedError} is deliberately NOT a `RangeError` \u2014 a\n * price feed answered with data we cannot price from. Maps to a retryable\n * 503, because a feed being unusable is an outage, never payer input.\n */\n\n/** Caller/payer input outside the accepted domain. */\nexport class DecimalError extends RangeError {\n constructor(message: string) {\n super(message);\n this.name = \"DecimalError\";\n }\n}\n\n/** Price-feed data OpenReceive cannot price from (missing, malformed, or non-positive). */\nexport class PriceFeedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PriceFeedError\";\n }\n}\n\nexport const OPENRECEIVE_SATS_PER_BTC = 100_000_000n;\nexport const OPENRECEIVE_MSATS_PER_SAT = 1000n;\n\nexport interface Decimal {\n readonly units: bigint;\n readonly scale: number;\n}\n\n/** A currency-tagged decimal amount. `currency` is fiat, or `BTC`/`SAT`/`SATS`. */\nexport interface MoneyAmount {\n readonly currency: string;\n readonly value: string;\n}\n\nexport interface BitcoinAmount {\n readonly currency: \"BTC\" | \"SAT\" | \"SATS\";\n readonly value: string;\n}\n\n/** BTC prices keyed by lowercase ISO 4217 code, in units of fiat per 1 BTC. */\nexport interface BtcFiatRateMap {\n readonly bitcoin: Readonly<Record<string, string>>;\n}\n\nconst DECIMAL_PATTERN = /^\\d+(?:\\.\\d+)?$/;\n\n/**\n * Parse a non-negative decimal string into integer units + scale.\n *\n * @throws {DecimalError} when `value` is not a non-negative decimal.\n */\nexport function parseDecimal(value: string, fieldName = \"Amount\"): Decimal {\n if (!DECIMAL_PATTERN.test(value)) {\n throw new DecimalError(`${fieldName} must be a non-negative decimal string.`);\n }\n const [integer, fraction = \"\"] = value.split(\".\");\n return {\n units: BigInt(`${integer}${fraction}`),\n scale: fraction.length,\n };\n}\n\n/**\n * `10 ** scale` as a bigint \u2014 the multiplier that moves a parsed decimal\n * between scales without ever touching a binary float.\n *\n * @throws {DecimalError} when `scale` is not a non-negative integer.\n */\nexport function decimalScaleFactor(scale: number): bigint {\n if (!Number.isInteger(scale) || scale < 0) {\n throw new DecimalError(\"Decimal scale must be a non-negative integer.\");\n }\n return 10n ** BigInt(scale);\n}\n\n/**\n * Format integer units at a fixed scale back to a decimal string. Negative\n * units keep the sign in front of the whole part.\n *\n * @throws {DecimalError} when `scale` is not a non-negative integer.\n */\nexport function formatDecimal(units: bigint, scale: number): string {\n if (!Number.isInteger(scale) || scale < 0) {\n throw new DecimalError(\"Decimal scale must be a non-negative integer.\");\n }\n if (scale === 0) return units.toString();\n const negative = units < 0n;\n // Pad the magnitude: padding a \"-5\" string would emit \"0.000000-5\".\n const digits = (negative ? -units : units).toString().padStart(scale + 1, \"0\");\n const whole = digits.slice(0, -scale);\n const fraction = digits.slice(-scale);\n return `${negative ? \"-\" : \"\"}${whole}.${fraction}`;\n}\n\n/**\n * Ceiling division \u2014 rounds UP on any remainder, so a payer is never quoted\n * less than the amount owed. Assumes a NON-NEGATIVE numerator, which every\n * caller passes: `(n + d - 1n) / d` is a ceiling toward +\u221E, so a negative\n * numerator would round toward zero instead.\n *\n * @throws {DecimalError} when `denominator` is not greater than zero.\n */\nexport function ceilDiv(numerator: bigint, denominator: bigint): bigint {\n if (denominator <= 0n) {\n throw new DecimalError(\"Division denominator must be greater than zero.\");\n }\n return (numerator + denominator - 1n) / denominator;\n}\n\n/** Format whole satoshis as a BTC decimal, trimming trailing zeros. */\nexport function formatBtcFromSats(sats: bigint): string {\n return formatDecimal(sats, 8).replace(/0+$/, \"\").replace(/\\.$/, \"\");\n}\n\nexport function isBitcoinAmountCurrency(currency: string): currency is BitcoinAmount[\"currency\"] {\n return currency === \"BTC\" || currency === \"SAT\" || currency === \"SATS\";\n}\n\n/**\n * Whole satoshis for a BTC/SAT/SATS amount.\n *\n * @throws {DecimalError} when the value is not a non-negative\n * decimal, is finer than one satoshi, or is a fractional satoshi count.\n */\nexport function bitcoinAmountToSats(amount: BitcoinAmount): bigint {\n const parsed = parseDecimal(amount.value, \"amount.value\");\n const scale = decimalScaleFactor(parsed.scale);\n\n if (amount.currency === \"BTC\") {\n const numerator = parsed.units * OPENRECEIVE_SATS_PER_BTC;\n if (numerator % scale !== 0n) {\n throw new DecimalError(\"BTC amount cannot be more precise than satoshis.\");\n }\n return numerator / scale;\n }\n\n if (parsed.units % scale !== 0n) {\n throw new DecimalError(\"SATS amount must be a whole number of satoshis.\");\n }\n return parsed.units / scale;\n}\n\n/**\n * Multiply a money amount by a whole quantity.\n *\n * @throws {DecimalError} for a negative/non-integer quantity or a\n * malformed amount.\n */\nexport function multiplyAmount(amount: MoneyAmount, quantity: number): MoneyAmount {\n if (!Number.isInteger(quantity) || quantity < 0) {\n throw new DecimalError(\"Quantity must be a non-negative integer.\");\n }\n const decimal = parseDecimal(amount.value);\n return {\n currency: amount.currency,\n value: formatDecimal(decimal.units * BigInt(quantity), decimal.scale),\n };\n}\n\n/**\n * Total amounts that share one currency, at the widest scale present.\n *\n * @throws {DecimalError} when the list is empty, mixes currencies,\n * or carries a malformed value.\n */\nexport function sumAmounts(amounts: readonly MoneyAmount[]): MoneyAmount {\n const first = amounts[0];\n if (first === undefined) {\n throw new DecimalError(\"At least one amount is required to total.\");\n }\n const currency = first.currency;\n let scale = 0;\n let totalUnits = 0n;\n\n for (const amount of amounts) {\n if (amount.currency !== currency) {\n throw new DecimalError(\"Amounts must use one currency.\");\n }\n const decimal = parseDecimal(amount.value);\n if (decimal.scale > scale) {\n totalUnits *= decimalScaleFactor(decimal.scale - scale);\n scale = decimal.scale;\n }\n totalUnits += decimal.units * decimalScaleFactor(scale - decimal.scale);\n }\n\n return {\n currency,\n value: formatDecimal(totalUnits, scale),\n };\n}\n\n/** Shared copy for \"the feed cannot price this currency\", used by every rate lookup. */\nexport function formatMissingBtcFiatRateMessage(currency: string, source?: string): string {\n const from = source === undefined ? \"the price feed\" : source;\n return `rate for ${currency.toUpperCase()} not available from ${from}`;\n}\n\n/**\n * Require a BTC/<currency> price from a rate map (keys are lowercase ISO codes).\n *\n * @throws {PriceFeedError} when the map has no rate for the currency.\n */\nexport function requiredBtcFiatRate(rates: BtcFiatRateMap | undefined, currency: string): string {\n const rate = rates?.bitcoin[currency.toLowerCase()];\n if (rate === undefined) {\n throw new PriceFeedError(formatMissingBtcFiatRateMessage(currency));\n }\n return rate;\n}\n\n/**\n * Parse a BTC/fiat price (units of fiat per 1 BTC) from feed data.\n *\n * @throws {PriceFeedError} when the price is malformed or not\n * greater than zero. Never a `RangeError`: a bad price is a feed outage.\n */\nexport function parseBtcFiatPrice(btcFiatPrice: string): Decimal {\n if (!DECIMAL_PATTERN.test(btcFiatPrice)) {\n throw new PriceFeedError(\"BTC fiat price must be a non-negative decimal string.\");\n }\n const price = parseDecimal(btcFiatPrice);\n if (price.units <= 0n) {\n throw new PriceFeedError(\"BTC fiat price must be greater than zero.\");\n }\n return price;\n}\n\n/**\n * Convert a fiat value to whole satoshis using a BTC/fiat price\n * (units of fiat per 1 BTC). Rounds up to the next whole satoshi.\n *\n * @throws {DecimalError} when `fiatValue` is malformed.\n * @throws {PriceFeedError} when `btcFiatPrice` is unusable.\n */\nexport function fiatValueToSats(fiatValue: string, btcFiatPrice: string): bigint {\n const fiat = parseDecimal(fiatValue, \"fiat.value\");\n const price = parseBtcFiatPrice(btcFiatPrice);\n const numerator = fiat.units * decimalScaleFactor(price.scale) * OPENRECEIVE_SATS_PER_BTC;\n const denominator = price.units * decimalScaleFactor(fiat.scale);\n return ceilDiv(numerator, denominator);\n}\n\n/**\n * Reverse of {@link fiatValueToSats}: whole satoshis \u2192 fiat decimal string\n * using a BTC/fiat price (units of fiat per 1 BTC).\n *\n * @throws {DecimalError} for negative sats or a bad output scale.\n * @throws {PriceFeedError} when `btcFiatPrice` is unusable.\n */\nexport function satsToFiatValue(sats: bigint, btcFiatPrice: string, outputScale = 2): string {\n if (sats < 0n) {\n throw new DecimalError(\"Satoshis must be non-negative.\");\n }\n const price = parseBtcFiatPrice(btcFiatPrice);\n const scaleFactor = decimalScaleFactor(outputScale);\n const numerator = sats * price.units * scaleFactor;\n const denominator = OPENRECEIVE_SATS_PER_BTC * decimalScaleFactor(price.scale);\n return formatDecimal(ceilDiv(numerator, denominator), outputScale);\n}\n\n/**\n * Convert a value between two fiat currencies that both have BTC prices\n * (units of fiat per 1 BTC). Used for USD\u2192EUR style display conversion.\n *\n * @throws {DecimalError} for a malformed value or output scale.\n * @throws {PriceFeedError} when either price is unusable.\n */\nexport function convertFiatViaBtcPrices(\n value: string,\n fromBtcPrice: string,\n toBtcPrice: string,\n outputScale = 2,\n): string {\n const amount = parseDecimal(value);\n const fromPrice = parseBtcFiatPrice(fromBtcPrice);\n const toPrice = parseBtcFiatPrice(toBtcPrice);\n const scaleFactor = decimalScaleFactor(outputScale);\n\n const numerator =\n amount.units * toPrice.units * decimalScaleFactor(fromPrice.scale) * scaleFactor;\n const denominator =\n decimalScaleFactor(amount.scale) * decimalScaleFactor(toPrice.scale) * fromPrice.units;\n return formatDecimal(ceilDiv(numerator, denominator), outputScale);\n}\n\n/**\n * Convert an amount into a target currency using BTC price rates. Handles both\n * directions across the BTC bridge \u2014 fiat\u2192fiat, fiat\u2192BTC/SATS, and\n * BTC/SATS\u2192fiat \u2014 plus BTC\u2194SATS, which needs no rate at all. Currency codes\n * compare case-insensitively, matching the lowercase rate-map lookup.\n *\n * @throws {DecimalError} when the amount is malformed.\n * @throws {PriceFeedError} when a rate the conversion needs is\n * missing or unusable.\n */\nexport function convertAmountViaBtcRates(\n amount: MoneyAmount,\n targetCurrency: string,\n rates: BtcFiatRateMap | undefined,\n options: { readonly outputScale?: number } = {},\n): MoneyAmount {\n const from = amount.currency.toUpperCase();\n const target = targetCurrency.toUpperCase();\n if (from === target) return amount;\n\n const outputScale = options.outputScale ?? 2;\n const fromBitcoin = isBitcoinAmountCurrency(from);\n const targetBitcoin = isBitcoinAmountCurrency(target);\n\n if (fromBitcoin) {\n const sats = bitcoinAmountToSats({ currency: from, value: amount.value });\n if (targetBitcoin) return bitcoinAmount(targetCurrency, target, sats);\n return {\n currency: targetCurrency,\n value: satsToFiatValue(sats, requiredBtcFiatRate(rates, target), outputScale),\n };\n }\n\n const fromRate = requiredBtcFiatRate(rates, from);\n if (targetBitcoin) {\n return bitcoinAmount(targetCurrency, target, fiatValueToSats(amount.value, fromRate));\n }\n\n return {\n currency: targetCurrency,\n value: convertFiatViaBtcPrices(\n amount.value,\n fromRate,\n requiredBtcFiatRate(rates, target),\n outputScale,\n ),\n };\n}\n\nfunction bitcoinAmount(currency: string, normalizedCurrency: string, sats: bigint): MoneyAmount {\n return {\n currency,\n value: normalizedCurrency === \"BTC\" ? formatBtcFromSats(sats) : sats.toString(),\n };\n}\n", "/**\n * Value primitives shared across the packages.\n *\n * Each helper has one exact semantics, stated in its doc comment along with\n * which callers deliberately keep a different local variant and why.\n */\n\n/**\n * Whole seconds since the Unix epoch \u2014 the one clock every package shares.\n *\n * FLOOR, never round. `@openreceive/http`'s `isReusablePaymentAttempt` compares\n * this against an invoice's `expires_at` to decide whether to hand a payer back\n * an existing invoice; rounding up would let it reuse an invoice that has\n * already expired.\n */\nexport function unixSeconds(): number {\n return Math.floor(Date.now() / 1_000);\n}\n\n/**\n * Narrowing predicate for a JSON object: not null, not an array.\n *\n * There is no throwing variant here: callers that must REJECT a non-record\n * wrap this and throw their own error type (PriceFeedError, the node\n * service error, HttpError), and that error identity is the whole\n * point of those wrappers.\n */\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/**\n * A JSON object, or `{}` when the value is not one \u2014 for readers that walk an\n * optional nested shape without branching at every level.\n *\n * ARRAY-EXCLUDING: an array yields `{}`. The NWC reply normalizer and the\n * browser checkout readers parse through this too.\n */\nexport function recordOrEmpty(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\n/**\n * A non-empty string, or `undefined` for anything else.\n *\n * No trimming: `@openreceive/http`'s handler trims before this check because\n * trimming is a rule of ITS wire boundary, not of every reader, so it keeps a\n * thin wrapper on top. FixedFloat's reader additionally coerces finite numbers\n * to strings \u2014 a FixedFloat quirk that also stays local.\n *\n * There is no `required` variant here: each caller's throwing counterpart\n * exists only to raise its own domain error.\n */\nexport function nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/**\n * Drop `undefined`-valued own properties.\n *\n * RECURSIVE and array-aware: nested plain records \u2014 including plain records\n * inside arrays \u2014 are compacted too. That depth is why this is for LOG FIELD\n * objects and internal option forwarding only. Do NOT run it over a wire\n * response, a DOM attribute map, or anything a test asserts key presence on\n * with `deepStrictEqual`: it rewrites nested shapes, not just the top level,\n * and the conditional spread is load-bearing there.\n *\n * \"Plain record\" means a non-array object whose prototype is `Object.prototype`\n * or null, so class instances (Error, Date, URL) pass through untouched.\n */\nexport function compact<T extends Record<string, unknown>>(fields: T): T {\n const kept: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(fields)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n kept[key] = value.map((entry) => (isPlainRecord(entry) ? compact(entry) : entry));\n continue;\n }\n kept[key] = isPlainRecord(value) ? compact(value) : value;\n }\n return kept as T;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n", "/**\n * Minimal SHA-256 and Keccak-256 used by the swap address checksum guards.\n *\n * Deliberately dependency-free and runtime-neutral: `@openreceive/core` runs in\n * browsers, workers, and Node, so it cannot reach for `node:crypto`, and the\n * Web Crypto digest API is async while address validation is a synchronous\n * predicate on the refund/deposit path. Inputs here are 20\u201332 byte addresses,\n * so a compact implementation is the right trade.\n */\n\nconst SHA256_K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n] as const;\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const state = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ]);\n const bitLength = message.length * 8;\n // Smallest multiple of 64 with room for the message, the 0x80 marker, and\n // the 8-byte length. (`((len+9)/64|0)*64+64` over-allocated a spurious\n // all-zero block whenever len % 64 == 55, corrupting the digest.)\n const padded = new Uint8Array(Math.ceil((message.length + 9) / 64) * 64);\n padded.set(message);\n padded[message.length] = 0x80;\n const view = new DataView(padded.buffer);\n view.setUint32(padded.length - 8, Math.floor(bitLength / 0x1_0000_0000), false);\n view.setUint32(padded.length - 4, bitLength >>> 0, false);\n\n const w = new Uint32Array(64);\n for (let offset = 0; offset < padded.length; offset += 64) {\n for (let i = 0; i < 16; i += 1) w[i] = view.getUint32(offset + i * 4, false);\n for (let i = 16; i < 64; i += 1) {\n const x = w[i - 15] as number;\n const y = w[i - 2] as number;\n const s0 = ((x >>> 7) | (x << 25)) ^ ((x >>> 18) | (x << 14)) ^ (x >>> 3);\n const s1 = ((y >>> 17) | (y << 15)) ^ ((y >>> 19) | (y << 13)) ^ (y >>> 10);\n w[i] = ((w[i - 16] as number) + s0 + (w[i - 7] as number) + s1) >>> 0;\n }\n\n let a = state[0] as number;\n let b = state[1] as number;\n let c = state[2] as number;\n let d = state[3] as number;\n let e = state[4] as number;\n let f = state[5] as number;\n let g = state[6] as number;\n let h = state[7] as number;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n const choose = (e & f) ^ (~e & g);\n const t1 = (h + s1 + choose + (SHA256_K[i] as number) + (w[i] as number)) >>> 0;\n const s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n const majority = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (s0 + majority) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n\n state[0] = ((state[0] as number) + a) >>> 0;\n state[1] = ((state[1] as number) + b) >>> 0;\n state[2] = ((state[2] as number) + c) >>> 0;\n state[3] = ((state[3] as number) + d) >>> 0;\n state[4] = ((state[4] as number) + e) >>> 0;\n state[5] = ((state[5] as number) + f) >>> 0;\n state[6] = ((state[6] as number) + g) >>> 0;\n state[7] = ((state[7] as number) + h) >>> 0;\n }\n\n const digest = new Uint8Array(32);\n const digestView = new DataView(digest.buffer);\n for (let i = 0; i < 8; i += 1) digestView.setUint32(i * 4, state[i] as number, false);\n return digest;\n}\n\nconst KECCAK_MASK = (1n << 64n) - 1n;\nconst KECCAK_ROTATIONS = [\n 0, 1, 62, 28, 27, 36, 44, 6, 55, 20, 3, 10, 43, 25, 39, 41, 45, 15, 21, 8, 18, 2, 61, 56, 14,\n] as const;\nconst KECCAK_ROUND_CONSTANTS = [\n 0x0000000000000001n,\n 0x0000000000008082n,\n 0x800000000000808an,\n 0x8000000080008000n,\n 0x000000000000808bn,\n 0x0000000080000001n,\n 0x8000000080008081n,\n 0x8000000000008009n,\n 0x000000000000008an,\n 0x0000000000000088n,\n 0x0000000080008009n,\n 0x000000008000000an,\n 0x000000008000808bn,\n 0x800000000000008bn,\n 0x8000000000008089n,\n 0x8000000000008003n,\n 0x8000000000008002n,\n 0x8000000000000080n,\n 0x000000000000800an,\n 0x800000008000000an,\n 0x8000000080008081n,\n 0x8000000000008080n,\n 0x0000000080000001n,\n 0x8000000080008008n,\n] as const;\n/** Keccak-256 bitrate in bytes (1600-bit state minus a 512-bit capacity). */\nconst KECCAK_RATE_BYTES = 136;\n\nfunction rotateLeft64(value: bigint, bits: number): bigint {\n if (bits === 0) return value;\n return ((value << BigInt(bits)) | (value >> BigInt(64 - bits))) & KECCAK_MASK;\n}\n\nfunction keccakPermute(lanes: bigint[]): void {\n for (const roundConstant of KECCAK_ROUND_CONSTANTS) {\n const columns: bigint[] = [];\n for (let x = 0; x < 5; x += 1) {\n columns[x] =\n (lanes[x] as bigint) ^\n (lanes[x + 5] as bigint) ^\n (lanes[x + 10] as bigint) ^\n (lanes[x + 15] as bigint) ^\n (lanes[x + 20] as bigint);\n }\n const theta: bigint[] = [];\n for (let x = 0; x < 5; x += 1) {\n theta[x] = (columns[(x + 4) % 5] as bigint) ^ rotateLeft64(columns[(x + 1) % 5] as bigint, 1);\n }\n for (let x = 0; x < 5; x += 1) {\n for (let y = 0; y < 5; y += 1) {\n lanes[x + 5 * y] = (lanes[x + 5 * y] as bigint) ^ (theta[x] as bigint);\n }\n }\n\n const rotated: bigint[] = new Array(25).fill(0n);\n for (let x = 0; x < 5; x += 1) {\n for (let y = 0; y < 5; y += 1) {\n rotated[y + 5 * ((2 * x + 3 * y) % 5)] = rotateLeft64(\n lanes[x + 5 * y] as bigint,\n KECCAK_ROTATIONS[x + 5 * y] as number,\n );\n }\n }\n\n for (let x = 0; x < 5; x += 1) {\n for (let y = 0; y < 5; y += 1) {\n lanes[x + 5 * y] =\n (rotated[x + 5 * y] as bigint) ^\n (~(rotated[((x + 1) % 5) + 5 * y] as bigint) &\n KECCAK_MASK &\n (rotated[((x + 2) % 5) + 5 * y] as bigint));\n }\n }\n\n lanes[0] = (lanes[0] as bigint) ^ roundConstant;\n }\n}\n\n/** Original Keccak-256 (0x01 padding), the hash Ethereum's EIP-55 checksum uses. */\nexport function keccak256(message: Uint8Array): Uint8Array {\n const lanes: bigint[] = new Array(25).fill(0n);\n const padded = new Uint8Array(\n message.length + KECCAK_RATE_BYTES - (message.length % KECCAK_RATE_BYTES),\n );\n padded.set(message);\n padded[message.length] = ((padded[message.length] as number) | 0x01) & 0xff;\n padded[padded.length - 1] = ((padded[padded.length - 1] as number) | 0x80) & 0xff;\n\n for (let offset = 0; offset < padded.length; offset += KECCAK_RATE_BYTES) {\n for (let lane = 0; lane < KECCAK_RATE_BYTES / 8; lane += 1) {\n let value = 0n;\n for (let byte = 7; byte >= 0; byte -= 1) {\n value = (value << 8n) | BigInt(padded[offset + lane * 8 + byte] as number);\n }\n lanes[lane] = (lanes[lane] as bigint) ^ value;\n }\n keccakPermute(lanes);\n }\n\n const digest = new Uint8Array(32);\n for (let lane = 0; lane < 4; lane += 1) {\n let value = lanes[lane] as bigint;\n for (let byte = 0; byte < 8; byte += 1) {\n digest[lane * 8 + byte] = Number(value & 0xffn);\n value >>= 8n;\n }\n }\n return digest;\n}\n", "/**\n * Address validation for swap deposit/refund networks. Shared by the Node\n * settlement engine and the browser refund UI so one rule set decides where a\n * refund may be sent.\n *\n * These are checksum checks, not shape guards: a refund address is typed or\n * pasted by a payer and a false accept sends money nowhere recoverable.\n * - `TRX` \u2014 Base58Check: 25 bytes, `0x41` mainnet prefix, double-SHA-256 tail.\n * - `ETH` \u2014 EIP-55 capitalization verified whenever the address carries mixed\n * case. An all-lowercase or all-uppercase address carries no checksum bits,\n * so it is accepted on shape alone (as every Ethereum tool does).\n * - `SOL` \u2014 decodes to exactly a 32-byte ed25519 public key, so a truncated\n * paste is rejected. Solana addresses carry no separate checksum.\n *\n * A network OpenReceive does not know is rejected outright; there is no\n * \"long enough\" fallback that would accept nearly any string.\n */\n\nimport { keccak256, sha256 } from \"./hash.ts\";\n\nexport type SwapAddressNetwork = \"ETH\" | \"SOL\" | \"TRX\";\n\nconst BASE58_ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\nconst BASE58_MAP: Readonly<Record<string, number>> = Object.fromEntries(\n [...BASE58_ALPHABET].map((char, index) => [char, index]),\n);\n\nconst ETH_ADDRESS_SHAPE = /^0x[0-9a-fA-F]{40}$/;\nconst TRON_ADDRESS_SHAPE = /^T[1-9A-HJ-NP-Za-km-z]{33}$/;\nconst SOLANA_ADDRESS_SHAPE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;\n\n/** Tron mainnet address version byte; testnet/other prefixes are not payable here. */\nconst TRON_ADDRESS_PREFIX = 0x41;\nconst BASE58CHECK_CHECKSUM_BYTES = 4;\nconst MAX_SWAP_ADDRESS_LENGTH = 200;\n\n/**\n * Bitcoin/Solana base58 decode. Returns `undefined` on invalid characters.\n * Leading `1` chars are treated as leading zero bytes.\n */\nfunction decodeBase58(value: string): Uint8Array | undefined {\n if (value.length === 0) return undefined;\n // Start empty: seeding with [0] added a spurious zero byte for inputs whose\n // big-number value is zero (e.g. the all-'1' Solana System Program address,\n // which must decode to exactly 32 zero bytes).\n const bytes: number[] = [];\n for (const char of value) {\n const digit = BASE58_MAP[char];\n if (digit === undefined) return undefined;\n let carry = digit;\n for (let i = 0; i < bytes.length; i += 1) {\n carry += (bytes[i] as number) * 58;\n bytes[i] = carry & 0xff;\n carry >>= 8;\n }\n while (carry > 0) {\n bytes.push(carry & 0xff);\n carry >>= 8;\n }\n }\n for (const char of value) {\n if (char !== \"1\") break;\n bytes.push(0);\n }\n bytes.reverse();\n return Uint8Array.from(bytes);\n}\n\n/**\n * Resolve an accepted network spelling, or `undefined` for one we cannot check.\n * `TRON` is the only alias: it is the suffix OpenReceive's `pay_in_asset` codes\n * use (`USDT_TRON`) for the network the rest of the code calls `TRX`.\n */\nfunction normalizeSwapAddressNetwork(network: string): SwapAddressNetwork | undefined {\n if (network === \"ETH\") return \"ETH\";\n if (network === \"SOL\") return \"SOL\";\n if (network === \"TRX\" || network === \"TRON\") return \"TRX\";\n return undefined;\n}\n\nfunction isValidTronAddress(address: string): boolean {\n if (!TRON_ADDRESS_SHAPE.test(address)) return false;\n const decoded = decodeBase58(address);\n if (decoded === undefined || decoded.length !== 21 + BASE58CHECK_CHECKSUM_BYTES) return false;\n if (decoded[0] !== TRON_ADDRESS_PREFIX) return false;\n const payload = decoded.subarray(0, 21);\n const checksum = decoded.subarray(21);\n const expected = sha256(sha256(payload));\n for (let i = 0; i < BASE58CHECK_CHECKSUM_BYTES; i += 1) {\n if (checksum[i] !== expected[i]) return false;\n }\n return true;\n}\n\nfunction isValidEthereumAddress(address: string): boolean {\n if (!ETH_ADDRESS_SHAPE.test(address)) return false;\n const body = address.slice(2);\n const lowercase = body.toLowerCase();\n // No mixed case means no EIP-55 bits to verify \u2014 accept on shape, like every\n // Ethereum wallet does for an all-lower or all-upper address.\n if (body === lowercase || body === body.toUpperCase()) return true;\n const digest = keccak256(new TextEncoder().encode(lowercase));\n for (let i = 0; i < lowercase.length; i += 1) {\n const character = lowercase[i] as string;\n if (character < \"a\" || character > \"f\") continue;\n // EIP-55: nibble i of keccak256(lowercase hex) >= 8 means uppercase.\n const nibble =\n i % 2 === 0 ? (digest[i >> 1] as number) >> 4 : (digest[i >> 1] as number) & 0x0f;\n const shouldBeUpper = nibble >= 8;\n if (shouldBeUpper !== (body[i] === character.toUpperCase())) return false;\n }\n return true;\n}\n\nfunction isValidSolanaAddress(address: string): boolean {\n // Typical encoded length is 32\u201344; still require a 32-byte pubkey decode, so\n // a truncated paste (or a 25-byte Base58Check address) cannot slip through.\n if (!SOLANA_ADDRESS_SHAPE.test(address)) return false;\n const decoded = decodeBase58(address);\n return decoded !== undefined && decoded.length === 32;\n}\n\n/**\n * True when `address` is a payable address on `network`, checksum included.\n * `network` is an {@link SwapAddressNetwork} or the `TRON` alias;\n * any other string is rejected rather than waved through on length, so callers\n * resolve the network first (see\n * {@link swapAddressNetworkForPayInAsset}).\n */\nexport function isValidAddressForSwapNetwork(network: string, address: string): boolean {\n if (address.length > MAX_SWAP_ADDRESS_LENGTH || /\\s/.test(address)) return false;\n const normalized = normalizeSwapAddressNetwork(network);\n if (normalized === \"ETH\") return isValidEthereumAddress(address);\n if (normalized === \"SOL\") return isValidSolanaAddress(address);\n if (normalized === \"TRX\") return isValidTronAddress(address);\n return false;\n}\n\n/**\n * The chain-network suffix of an OpenReceive `pay_in_asset` code, uppercased:\n * `USDT_ETH` \u2192 `\"ETH\"`, `SOL_SOL` \u2192 `\"SOL\"`, `USDT_TRON` \u2192 `\"TRON\"`. A code\n * with no suffix answers itself (`\"lightning\"` \u2192 `\"LIGHTNING\"`).\n *\n * ONE owner for this split. Four places used to re-derive it with four inline\n * network tables \u2014 the address checksum rule, the explorer link, the network\n * label, and the confirmation-wait hint \u2014 so a new rail meant finding all four.\n * Callers layer their own vocabulary on the result: this returns the raw\n * suffix, not any one of their enums.\n */\nexport function payInAssetNetwork(payInAsset: string): string | undefined {\n if (payInAsset === \"\") return undefined;\n return payInAsset.split(\"_\").at(-1)?.toUpperCase();\n}\n\n/**\n * Resolve the address network from an OpenReceive `pay_in_asset` code\n * (`USDT_ETH` \u2192 ETH, `USDT_TRON` \u2192 TRX, `SOL_SOL` \u2192 SOL).\n */\nexport function swapAddressNetworkForPayInAsset(\n payInAsset: string,\n): SwapAddressNetwork | undefined {\n const suffix = payInAssetNetwork(payInAsset);\n return suffix === undefined ? undefined : normalizeSwapAddressNetwork(suffix);\n}\n\n/**\n * True when `address` is payable for the asset's network. For an asset whose\n * network OpenReceive does not know, no checksum rule exists to apply, so the\n * check degrades to a bounded non-empty string \u2014 deliberately, and only there.\n */\nexport function isValidSwapAddressForPayInAsset(payInAsset: string, address: string): boolean {\n const network = swapAddressNetworkForPayInAsset(payInAsset);\n if (network === undefined) {\n return address.length >= 5 && address.length <= MAX_SWAP_ADDRESS_LENGTH && !/\\s/.test(address);\n }\n return isValidAddressForSwapNetwork(network, address);\n}\n\n/**\n * User-facing refund address error, or `undefined` when the address is empty\n * (callers should keep HTML `required` / empty-field handling) or valid.\n */\nexport function getSwapRefundAddressError(\n payInAsset: string,\n address: string,\n networkLabel: string,\n): string | undefined {\n const trimmed = address.trim();\n if (trimmed.length === 0) return undefined;\n if (isValidSwapAddressForPayInAsset(payInAsset, trimmed)) return undefined;\n const network = swapAddressNetworkForPayInAsset(payInAsset);\n if (network === \"ETH\") {\n if (ETH_ADDRESS_SHAPE.test(trimmed)) {\n return `That ${networkLabel} address failed its checksum. Copy it again from your wallet.`;\n }\n return `That doesn't look like an ${networkLabel} address. Use a 0x address.`;\n }\n if (network === \"TRX\") {\n if (TRON_ADDRESS_SHAPE.test(trimmed)) {\n return `That ${networkLabel} address failed its checksum. Copy it again from your wallet.`;\n }\n return `That doesn't look like a ${networkLabel} address. Use an address starting with T.`;\n }\n return `That doesn't look like a ${networkLabel} address. Check you pasted the full address.`;\n}\n", "// Generated by tools/codegen/generate-js-models.mjs from spec/data/kernel-tables.json. Do not edit.\n// The pay-in asset table every engine shares, as @openreceive/core sees it.\n\nexport const OPENRECEIVE_SWAP_PAY_IN_ASSETS = [\n \"SOL_SOL\",\n \"USDT_TRON\",\n \"USDT_SOL\",\n \"USDC_SOL\",\n \"ETH_ETH\",\n \"USDT_ETH\",\n \"USDC_ETH\",\n] as const;\nexport type GeneratedSwapPayInAsset = (typeof OPENRECEIVE_SWAP_PAY_IN_ASSETS)[number];\n\nexport interface GeneratedSwapAssetInfo {\n readonly pay_in_asset: GeneratedSwapPayInAsset;\n readonly label: string;\n readonly network_label: string;\n readonly coin: string;\n readonly network: string;\n /** ISO 4217 currency a stablecoin tracks; absent for coins that float. */\n readonly pegged_to?: string;\n}\n\nexport const OPENRECEIVE_SWAP_ASSET_INFO: Readonly<\n Record<GeneratedSwapPayInAsset, GeneratedSwapAssetInfo>\n> = {\n SOL_SOL: {\n pay_in_asset: \"SOL_SOL\",\n label: \"SOL\",\n network_label: \"Solana\",\n coin: \"SOL\",\n network: \"SOL\",\n },\n USDT_TRON: {\n pay_in_asset: \"USDT_TRON\",\n label: \"USDT\",\n network_label: \"Tron\",\n coin: \"USDT\",\n network: \"TRX\",\n pegged_to: \"USD\",\n },\n USDT_SOL: {\n pay_in_asset: \"USDT_SOL\",\n label: \"USDT\",\n network_label: \"Solana\",\n coin: \"USDT\",\n network: \"SOL\",\n pegged_to: \"USD\",\n },\n USDC_SOL: {\n pay_in_asset: \"USDC_SOL\",\n label: \"USDC\",\n network_label: \"Solana\",\n coin: \"USDC\",\n network: \"SOL\",\n pegged_to: \"USD\",\n },\n ETH_ETH: {\n pay_in_asset: \"ETH_ETH\",\n label: \"ETH\",\n network_label: \"Ethereum\",\n coin: \"ETH\",\n network: \"ETH\",\n },\n USDT_ETH: {\n pay_in_asset: \"USDT_ETH\",\n label: \"USDT\",\n network_label: \"Ethereum\",\n coin: \"USDT\",\n network: \"ETH\",\n pegged_to: \"USD\",\n },\n USDC_ETH: {\n pay_in_asset: \"USDC_ETH\",\n label: \"USDC\",\n network_label: \"Ethereum\",\n coin: \"USDC\",\n network: \"ETH\",\n pegged_to: \"USD\",\n },\n};\n", "// What the shared pay-in asset table (spec/data/kernel-tables.json) says about\n// an asset, for code that only has the `pay_in_asset` string: today, whether\n// it is a stablecoin and which currency it tracks.\n\nimport { OPENRECEIVE_SWAP_ASSET_INFO } from \"../generated/swap-assets.ts\";\n\n/**\n * The ISO 4217 currency a stablecoin pay-in asset tracks (`USDC_SOL` \u2192 `\"USD\"`).\n * `undefined` for a coin that floats (`SOL_SOL`, `ETH_ETH`) and for an asset the\n * table does not know, so an unknown asset renders like a floating one.\n */\nexport function swapPayInAssetPeggedTo(payInAsset: string): string | undefined {\n const info = (\n OPENRECEIVE_SWAP_ASSET_INFO as Readonly<Record<string, { readonly pegged_to?: string }>>\n )[payInAsset];\n return info?.pegged_to;\n}\n", "import type { ErrorBody } from \"./errors/index.ts\";\n\nexport function sanitizeLogValue(value: unknown): unknown {\n if (typeof value === \"string\") return redactSecrets(value);\n if (Array.isArray(value)) return value.map(sanitizeLogValue);\n if (typeof value !== \"object\" || value === null) return value;\n\n const clean: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) {\n if (isSensitiveLogKey(key)) {\n clean[key] = \"[REDACTED]\";\n } else {\n clean[key] = sanitizeLogValue(nested);\n }\n }\n return clean;\n}\n\n/**\n * Field names whose VALUE never belongs in a log line, whatever it holds:\n * wallet and provider credentials, the settlement preimage (proof of payment),\n * the raw invoice (`bolt11` payloads carried inside provider errors), and the\n * server-only swap recovery blob (`swap_data` holds the provider order token).\n */\nexport function isSensitiveLogKey(key: string): boolean {\n // `*_present` fields are deliberate presence flags (`preimage_present`) \u2014 the\n // safe thing to log instead of the value.\n if (/_present$/i.test(key)) return false;\n return /secret|token|authorization|cookie|nwc|dsn|preimage|invoice|bolt11|swap_?data|(?:private|api)[_-]?key|^key$|api[_-]?sign/i.test(\n key,\n );\n}\n\nexport function redactSecrets(value: string): string {\n return (\n value\n // Scheme only, no slashes: parseNwcUri accepts both\n // \"nostr+walletconnect://pubkey?...\" and the slashless\n // \"nostr+walletconnect:pubkey?...\", and the secret rides in the query\n // either way.\n .replace(/nostr\\+walletconnect:[^\\s\"'`<>]+/gi, \"[REDACTED_NWC]\")\n // Lightning Swap Connect credential URI: host, key, and secret in one string.\n .replace(/lightning\\+swapconnect:[^\\s\"'`<>]+/gi, \"[REDACTED_LSC]\")\n // `key=` is half an LSC credential pair on its own, so it is redacted\n // wherever it appears in a query string, not only inside a full URI.\n .replace(\n /([?&](?:_or_evt|token|provider_token|secret|key|api_key|api-sign|api_sign)=)[^&\\s\"'`<>]+/gi,\n \"$1[REDACTED]\",\n )\n );\n}\n\n/** A public error has only the canonical fields, never raw causes, stacks or configuration. */\nexport function publicErrorBody(body: ErrorBody): ErrorBody {\n return {\n code: body.code,\n message: redactSecrets(body.message),\n ...(body.retryable === undefined ? {} : { retryable: body.retryable }),\n ...(body.request_id === undefined ? {} : { request_id: redactSecrets(body.request_id) }),\n ...(body.details === undefined ? {} : { details: publicErrorDetails(body.details) }),\n };\n}\nfunction publicErrorDetails(details: Record<string, unknown>): Record<string, unknown> {\n const clean = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(clean);\n if (value === null || typeof value !== \"object\") return sanitizeLogValue(value);\n if (value instanceof Error) return undefined;\n return Object.fromEntries(\n Object.entries(value)\n .filter(([key]) => !/^(cause|stack|config|configuration)$/i.test(key))\n .map(([key, nested]) => [key, isSensitiveLogKey(key) ? \"[REDACTED]\" : clean(nested)]),\n );\n };\n return clean(details) as Record<string, unknown>;\n}\n", "// The browser's DOM contract: the constants, data attributes, element parts,\n// and custom events the checkout markup is built from and that the element,\n// wizard, and wrapper packages query against. Attribute maps are the single\n// source of truth; the matching selector maps are derived from them.\nimport type {\n CheckoutState,\n ResolvedTheme,\n ThemeModel,\n ThemePreference,\n} from \"./checkout-types.ts\";\n\nexport const OPENRECEIVE_QR_QUIET_ZONE_MODULES = 4 as const;\nexport const OPENRECEIVE_QR_DARK_COLOR = \"#000000\" as const;\nexport const OPENRECEIVE_QR_LIGHT_COLOR = \"#FFFFFFFF\" as const;\nexport const OPENRECEIVE_QR_ERROR_CORRECTION = \"M\" as const;\nexport const OPENRECEIVE_THEME_STORAGE_KEY = \"openreceive.theme\" as const;\nexport const OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS = 3000 as const;\n/**\n * Minimum remaining seconds a Lightning invoice must have before it is considered\n * reusable by the browser before asking the mounted create route for a stored\n * or new attempt.\n */\nexport const OPENRECEIVE_LIGHTNING_REUSE_BUFFER_SECONDS = 60 as const;\n/**\n * Default base path the shipped OpenReceive router is mounted at. When a developer passes\n * only an order id (React `<Checkout reference>` / `<openreceive-checkout reference>`), this is\n * the prefix every route is derived from \u2014 see `checkoutRoutes` in ./routes.ts. It is\n * the only URL input the checkout components accept.\n */\nexport const OPENRECEIVE_DEFAULT_PREFIX = \"/openreceive\" as const;\nexport const OPENRECEIVE_COPY_FEEDBACK_MS = 1800 as const;\nexport const OPENRECEIVE_PROVIDER_PREVIEW_LIMIT = 4 as const;\nexport const OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME = \"openreceive-checkout\" as const;\nexport const OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME = \"openreceive-theme-toggle\" as const;\nexport const OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS = {\n copy: \"openreceive-copy\",\n openWallet: \"openreceive-open-wallet\",\n state: \"openreceive-state\",\n settled: \"openreceive-settled\",\n providerCopy: \"openreceive-provider-copy\",\n startOver: \"openreceive-start-over\",\n error: \"openreceive-error\",\n} as const;\nexport const OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS = {\n change: \"openreceive-theme-change\",\n} as const;\n// The mapped return types are template-literal, not `string`, so a derived\n// selector keeps the exact literal type its hand-written predecessor had \u2014\n// `OPENRECEIVE_CHECKOUT_DATA_SELECTORS.root` is still\n// `\"[data-openreceive-checkout]\"` and not merely `string`. These maps are\n// published, so widening them would silently loosen every consumer.\nconst attributeSelectors = <T extends Record<string, string>>(\n attributes: T,\n): { readonly [K in keyof T]: `[${T[K]}]` } =>\n Object.fromEntries(\n Object.entries(attributes).map(([key, attribute]) => [key, `[${attribute}]`]),\n ) as { readonly [K in keyof T]: `[${T[K]}]` };\nconst partSelectors = <T extends Record<string, string>>(\n parts: T,\n): { readonly [K in keyof T]: `[part=\"${T[K]}\"]` } =>\n Object.fromEntries(Object.entries(parts).map(([key, part]) => [key, `[part=\"${part}\"]`])) as {\n readonly [K in keyof T]: `[part=\"${T[K]}\"]`;\n };\nexport const OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES = {\n root: \"data-openreceive-wizard\",\n breadcrumb: \"data-or-breadcrumb\",\n method: \"data-or-method\",\n route: \"data-or-route\",\n swapStart: \"data-or-swap-start\",\n swapBack: \"data-or-swap-back\",\n swapQr: \"data-or-swap-qr\",\n swapCopy: \"data-or-swap-copy\",\n swapCopyLabel: \"data-or-swap-copy-label\",\n swapSelectAll: \"data-or-swap-select-all\",\n swapNetwork: \"data-or-swap-network\",\n swapNetworkValue: \"data-or-swap-network-value\",\n pickerSelect: \"data-or-picker-select\",\n pickerContinue: \"data-or-picker-continue\",\n swapRefundForm: \"data-or-swap-refund-form\",\n swapRefundAddress: \"data-or-swap-refund-address\",\n swapRefundAllowed: \"data-or-swap-refund-allowed\",\n swapRefundConfirm: \"data-or-swap-refund-confirm\",\n swapRefundPayInAsset: \"data-or-swap-refund-pay-in-asset\",\n swapRefundNetworkLabel: \"data-or-swap-refund-network-label\",\n swapRefundError: \"data-or-swap-refund-error\",\n providerCopy: \"data-or-provider-copy\",\n providerTutorial: \"data-or-provider-tutorial\",\n providerTutorialIndex: \"data-or-provider-tutorial-index\",\n} as const;\nexport const OPENRECEIVE_PAYMENT_WIZARD_SELECTORS = attributeSelectors(\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES,\n);\nexport const OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES = {\n root: \"data-openreceive-checkout\",\n qr: \"data-openreceive-qr\",\n meta: \"data-openreceive-meta\",\n state: \"data-openreceive-state\",\n actions: \"data-openreceive-actions\",\n /** What the payer is buying, when the host's amount hook named it. */\n orderDescription: \"data-openreceive-order-description\",\n theme: \"data-openreceive-theme\",\n themeToggle: \"data-openreceive-theme-toggle\",\n} as const;\nexport const OPENRECEIVE_CHECKOUT_DATA_SELECTORS = attributeSelectors(\n OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES,\n);\n/**\n * The stylesheet scope marker. The shipped `styles.css` is rewritten at build\n * time (tools/package/scope-styles.mjs) so every rule \u2014 preflight, theme\n * variables, daisyUI components \u2014 applies only on or under an element carrying\n * this attribute; loaded into a host page it is otherwise inert. Every\n * light-DOM entry the packages render stamps it (React `<Checkout>` and\n * `<ThemeToggle>`, the Vue/Svelte/Angular shell). Custom markup styled from\n * `orClasses` needs it on its own container, together with the resolved\n * `data-theme`, because the theme palette no longer flows from `:root`.\n */\nexport const OPENRECEIVE_STYLE_ROOT_ATTRIBUTE = \"data-openreceive-root\" as const;\nexport const OPENRECEIVE_STYLE_ROOT_SELECTOR = `[${OPENRECEIVE_STYLE_ROOT_ATTRIBUTE}]` as const;\nexport const OPENRECEIVE_CHECKOUT_ELEMENT_PARTS = {\n copy: \"copy\",\n startOver: \"start-over\",\n} as const;\n\n/**\n * Named slots the checkout element projects host light-DOM children into.\n *\n * `order` is the element's answer to React's render-prop `children`: a line-item\n * strip, a thumbnail, a \"you are buying\" summary, drawn from the order\n * OpenReceive does not own. It is projected through a `<slot>` in the shadow\n * root, so it survives every re-render of the shell's `innerHTML` untouched.\n */\nexport const OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS = {\n order: \"order\",\n} as const;\nexport const OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS = partSelectors(\n OPENRECEIVE_CHECKOUT_ELEMENT_PARTS,\n);\nexport const OPENRECEIVE_THEME_TOGGLE_ELEMENT_PARTS = {\n button: \"button\",\n} as const;\nexport const OPENRECEIVE_THEME_TOGGLE_ELEMENT_PART_SELECTORS = partSelectors(\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_PARTS,\n);\nexport type CheckoutElementEventName =\n (typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS)[keyof typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS];\nexport interface CheckoutProviderCopyEventDetail {\n readonly providerId: string;\n}\nexport interface CheckoutStateEventDetail {\n readonly state: CheckoutState;\n}\nexport interface CheckoutErrorEventDetail {\n readonly error: unknown;\n}\nexport interface ThemeChangeEventDetail {\n readonly theme: ThemePreference;\n readonly resolvedTheme: ResolvedTheme;\n}\n\nexport function createCheckoutProviderCopyEvent(\n providerId: string,\n): CustomEvent<CheckoutProviderCopyEventDetail> {\n return new CustomEvent<CheckoutProviderCopyEventDetail>(\n OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.providerCopy,\n {\n detail: {\n providerId,\n },\n },\n );\n}\n\nexport function createCheckoutActionEvent(\n eventName:\n | typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.copy\n | typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.openWallet\n | typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.startOver,\n): CustomEvent {\n return new CustomEvent(eventName);\n}\n\nexport function createCheckoutStateEvent(\n eventName:\n | typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.state\n | typeof OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.settled,\n state: CheckoutState,\n): CustomEvent<CheckoutStateEventDetail> {\n return new CustomEvent<CheckoutStateEventDetail>(eventName, {\n detail: {\n state,\n },\n });\n}\n\nexport function createCheckoutErrorEvent(error: unknown): CustomEvent<CheckoutErrorEventDetail> {\n return new CustomEvent<CheckoutErrorEventDetail>(OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.error, {\n detail: {\n error,\n },\n });\n}\n\nexport function createThemeChangeEvent(theme: ThemeModel): CustomEvent<ThemeChangeEventDetail> {\n return new CustomEvent<ThemeChangeEventDetail>(OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS.change, {\n detail: {\n theme: theme.theme,\n resolvedTheme: theme.resolvedTheme,\n },\n });\n}\n\nexport const OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES = {\n reference: \"reference\",\n /**\n * Base path the shipped router is mounted at (default `/openreceive`). The\n * element's ONLY URL input: create, prepare, payment-check and the four swap\n * routes are all derived from it. There is deliberately no per-route\n * attribute \u2014 see `checkoutRoutes` in ../internal/routes.ts.\n */\n prefix: \"prefix\",\n /**\n * Header name the page's `<meta name=\"csrf-token\">` value is sent under on\n * every request the element makes. Default `X-CSRF-Token` (Rails, Laravel);\n * Django reads `X-CSRFToken`, WordPress REST reads `X-WP-Nonce`. The meta\n * tag name is fixed; only the header name is the host's to choose.\n */\n csrfHeader: \"csrf-header\",\n /** JSON-encoded create-time metadata forwarded to the create request. */\n metadata: \"metadata\",\n invoiceId: \"invoice-id\",\n invoice: \"invoice\",\n rail: \"rail\",\n paymentHash: \"payment-hash\",\n amountMsats: \"amount-msats\",\n fiatCurrency: \"fiat-currency\",\n fiatValue: \"fiat-value\",\n status: \"status\",\n expiresAt: \"expires-at\",\n theme: \"theme\",\n paymentWizard: \"payment-wizard\",\n /**\n * Opt into History API URL sync to `{resume-path-prefix}/{reference}`.\n * Summary fetch always runs in create mode; this only controls URL mutation.\n */\n syncUrl: \"sync-url\",\n /** History API path prefix when `sync-url` is set. Default `/checkout`. */\n resumePathPrefix: \"resume-path-prefix\",\n /**\n * Order id owned by the app router (e.g. Next.js). When set, the element does not\n * push/replace the URL via the History API.\n */\n routeReference: \"route-reference\",\n /**\n * Create mode only. Payment hash of a swap attempt this order already has in\n * flight; the element reopens it after prepare instead of showing the method\n * grid. A hash the server will not serve is ignored.\n */\n resumePaymentHash: \"resume-payment-hash\",\n /**\n * Does a payer who closes this tab have a URL that brings them back to this\n * checkout? Only the refund screen's copy depends on it \u2014 see\n * `SwapDisplayModel.refundReturnLabel`. Unset, the element infers it from\n * `sync-url` / `route-reference`; set it when the host owns a per-order route\n * of its own, which the element cannot see.\n */\n resumable: \"resumable\",\n /**\n * Base URL of an external bolt11 decoder. When set, the checkout shows a\n * \"Decode\" link to `{decode-link-url}?invoice={bolt11}`. Omitted (the\n * default), no decode link is rendered and the invoice never leaves the page.\n */\n decodeLinkUrl: \"decode-link-url\",\n /** `polling=\"false\"` renders the snapshot without status polling (no POST /payments/check). */\n polling: \"polling\",\n /** Status poll cadence in milliseconds; defaults to OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS. */\n pollIntervalMs: \"poll-interval-ms\",\n} as const;\n\nexport const OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES = {\n rootSelector: \"root-selector\",\n checkoutSelector: \"checkout-selector\",\n defaultTheme: \"default-theme\",\n storageKey: \"storage-key\",\n} as const;\n", "/* Generated by tools/package/generate-payment-icons.mjs \u2014 do not edit. */\n// Source: packages/js/browser/src/assets/icons/*.svg. Edit the .svg, then run\n// `npm run generate:payment-icons`.\nexport const OPENRECEIVE_PAYMENT_ICON_IDS = [\n \"btc\",\n \"crypto\",\n \"eth\",\n \"lightning\",\n \"ltc\",\n \"sol\",\n \"trx\",\n \"usdc\",\n \"usdt\",\n \"xmr\",\n \"xrp\",\n] as const;\nexport type PaymentIconId = (typeof OPENRECEIVE_PAYMENT_ICON_IDS)[number];\n\n/** Each packaged payment icon as minified SVG markup, keyed by id. */\nexport const paymentIconSvgs: Readonly<Record<PaymentIconId, string>> = Object.freeze({\n btc: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#F7931A\"/><path fill=\"#FFF\" fill-rule=\"nonzero\" d=\"M23.189 14.02c.314-2.096-1.283-3.223-3.465-3.975l.708-2.84-1.728-.43-.69 2.765c-.454-.114-.92-.22-1.385-.326l.695-2.783L15.596 6l-.708 2.839c-.376-.086-.746-.17-1.104-.26l.002-.009-2.384-.595-.46 1.846s1.283.294 1.256.312c.7.175.826.638.805 1.006l-.806 3.235c.048.012.11.03.18.057l-.183-.045-1.13 4.532c-.086.212-.303.531-.793.41.018.025-1.256-.313-1.256-.313l-.858 1.978 2.25.561c.418.105.828.215 1.231.318l-.715 2.872 1.727.43.708-2.84c.472.127.93.245 1.378.357l-.706 2.828 1.728.43.715-2.866c2.948.558 5.164.333 6.097-2.333.752-2.146-.037-3.385-1.588-4.192 1.13-.26 1.98-1.003 2.207-2.538zm-3.95 5.538c-.533 2.147-4.148.986-5.32.695l.95-3.805c1.172.293 4.929.872 4.37 3.11zm.535-5.569c-.487 1.953-3.495.96-4.47.717l.86-3.45c.975.243 4.118.696 3.61 2.733z\"/></g></svg>',\n crypto:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" role=\"img\" aria-label=\"Crypto\"><defs><linearGradient id=\"crypto-g\" x1=\"8\" x2=\"56\" y1=\"8\" y2=\"56\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#A78BFA\"/><stop offset=\".5\" stop-color=\"#06B6D4\"/><stop offset=\"1\" stop-color=\"#22C55E\"/></linearGradient></defs><rect width=\"64\" height=\"64\" rx=\"16\" fill=\"#F5F3FF\"/><path fill=\"url(#crypto-g)\" d=\"M31.8 9 50 19.5v21L31.8 51 14 40.5v-21L31.8 9Z\"/><path fill=\"#FFFFFF\" fill-opacity=\".92\" d=\"m32 17 10.8 6.2v12.5L32 42l-10.8-6.3V23.2L32 17Zm0 6.8-5 2.9v5.8l5 2.9 5-2.9v-5.8l-5-2.9Z\"/></svg>',\n eth: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#627EEA\"/><g fill=\"#FFF\" fill-rule=\"nonzero\"><path fill-opacity=\".602\" d=\"M16.498 4v8.87l7.497 3.35z\"/><path d=\"M16.498 4L9 16.22l7.498-3.35z\"/><path fill-opacity=\".602\" d=\"M16.498 21.968v6.027L24 17.616z\"/><path d=\"M16.498 27.995v-6.028L9 17.616z\"/><path fill-opacity=\".2\" d=\"M16.498 20.573l7.497-4.353-7.497-3.348z\"/><path fill-opacity=\".602\" d=\"M9 16.22l7.498 4.353v-7.701z\"/></g></g></svg>',\n lightning:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 64 64\" role=\"img\" aria-label=\"Lightning\"><defs><linearGradient id=\"ln-g\" x1=\"18\" x2=\"46\" y1=\"8\" y2=\"58\" gradientUnits=\"userSpaceOnUse\"><stop stop-color=\"#FDE047\"/><stop offset=\".55\" stop-color=\"#F59E0B\"/><stop offset=\"1\" stop-color=\"#EA580C\"/></linearGradient></defs><rect width=\"64\" height=\"64\" rx=\"16\" fill=\"#FFFBEB\"/><path fill=\"url(#ln-g)\" d=\"M37.6 7 17 36h13.6L26.4 57 47 28H33.3L37.6 7Z\"/></svg>',\n ltc: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\"><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#BFBBBB\"/><path fill=\"#FFF\" d=\"M10.427 19.214L9 19.768l.688-2.759 1.444-.58L13.213 8h5.129l-1.519 6.196 1.41-.571-.68 2.75-1.427.571-.848 3.483H23L22.127 24H9.252z\"/></g></svg>',\n sol: '<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\"><circle fill=\"#66F9A1\" cx=\"16\" cy=\"16\" r=\"16\"/><path d=\"M9.925 19.687a.59.59 0 01.415-.17h14.366a.29.29 0 01.207.497l-2.838 2.815a.59.59 0 01-.415.171H7.294a.291.291 0 01-.207-.498l2.838-2.815zm0-10.517A.59.59 0 0110.34 9h14.366c.261 0 .392.314.207.498l-2.838 2.815a.59.59 0 01-.415.17H7.294a.291.291 0 01-.207-.497L9.925 9.17zm12.15 5.225a.59.59 0 00-.415-.17H7.294a.291.291 0 00-.207.498l2.838 2.815c.11.109.26.17.415.17h14.366a.291.291 0 00.207-.498l-2.838-2.815z\" fill=\"#FFF\"/></g></svg>',\n trx: '<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\"><circle fill=\"#EF0027\" cx=\"16\" cy=\"16\" r=\"16\"/><path d=\"M21.932 9.913L7.5 7.257l7.595 19.112 10.583-12.894-3.746-3.562zm-.232 1.17l2.208 2.099-6.038 1.093 3.83-3.192zm-5.142 2.973l-6.364-5.278 10.402 1.914-4.038 3.364zm-.453.934l-1.038 8.58L9.472 9.487l6.633 5.502zm.96.455l6.687-1.21-7.67 9.343.983-8.133z\" fill=\"#FFF\"/></g></svg>',\n usdc: '<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\"><circle fill=\"#3E73C4\" cx=\"16\" cy=\"16\" r=\"16\"/><g fill=\"#FFF\"><path d=\"M20.022 18.124c0-2.124-1.28-2.852-3.84-3.156-1.828-.243-2.193-.728-2.193-1.578 0-.85.61-1.396 1.828-1.396 1.097 0 1.707.364 2.011 1.275a.458.458 0 00.427.303h.975a.416.416 0 00.427-.425v-.06a3.04 3.04 0 00-2.743-2.489V9.142c0-.243-.183-.425-.487-.486h-.915c-.243 0-.426.182-.487.486v1.396c-1.829.242-2.986 1.456-2.986 2.974 0 2.002 1.218 2.791 3.778 3.095 1.707.303 2.255.668 2.255 1.639 0 .97-.853 1.638-2.011 1.638-1.585 0-2.133-.667-2.316-1.578-.06-.242-.244-.364-.427-.364h-1.036a.416.416 0 00-.426.425v.06c.243 1.518 1.219 2.61 3.23 2.914v1.457c0 .242.183.425.487.485h.915c.243 0 .426-.182.487-.485V21.34c1.829-.303 3.047-1.578 3.047-3.217z\"/><path d=\"M12.892 24.497c-4.754-1.7-7.192-6.98-5.424-11.653.914-2.55 2.925-4.491 5.424-5.402.244-.121.365-.303.365-.607v-.85c0-.242-.121-.424-.365-.485-.061 0-.183 0-.244.06a10.895 10.895 0 00-7.13 13.717c1.096 3.4 3.717 6.01 7.13 7.102.244.121.488 0 .548-.243.061-.06.061-.122.061-.243v-.85c0-.182-.182-.424-.365-.546zm6.46-18.936c-.244-.122-.488 0-.548.242-.061.061-.061.122-.061.243v.85c0 .243.182.485.365.607 4.754 1.7 7.192 6.98 5.424 11.653-.914 2.55-2.925 4.491-5.424 5.402-.244.121-.365.303-.365.607v.85c0 .242.121.424.365.485.061 0 .183 0 .244-.06a10.895 10.895 0 007.13-13.717c-1.096-3.46-3.778-6.07-7.13-7.162z\"/></g></g></svg>',\n usdt: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#26A17B\"/><path fill=\"#FFF\" d=\"M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117\"/></g></svg>',\n xmr: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\"><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#F60\"/><path fill=\"#FFF\" fill-rule=\"nonzero\" d=\"M15.97 5.235c5.985 0 10.825 4.84 10.825 10.824a11.07 11.07 0 01-.558 3.432h-3.226v-9.094l-7.04 7.04-7.04-7.04v9.094H5.704a11.07 11.07 0 01-.557-3.432c0-5.984 4.84-10.824 10.824-10.824zM14.358 19.02L16 20.635l1.613-1.614 3.051-3.08v5.72h4.547a10.806 10.806 0 01-9.24 5.192c-3.902 0-7.334-2.082-9.24-5.192h4.546v-5.72l3.08 3.08z\"/></g></svg>',\n xrp: '<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\"><circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#23292F\"/><path d=\"M23.07 8h2.89l-6.015 5.957a5.621 5.621 0 01-7.89 0L6.035 8H8.93l4.57 4.523a3.556 3.556 0 004.996 0L23.07 8zM8.895 24.563H6l6.055-5.993a5.621 5.621 0 017.89 0L26 24.562h-2.895L18.5 20a3.556 3.556 0 00-4.996 0l-4.61 4.563z\" fill=\"#FFF\"/></g></svg>',\n});\n", "// Payment-method icons. Everything the checkout draws ships inside the\n// JavaScript: the SVG markup is compiled into this package (see\n// ../generated/payment-icon-svgs.ts), so nothing here depends on where the\n// module was loaded from and no host copies, serves or resolves an icon file,\n// under any bundler or with none. The same strings back two representations \u2014\n//\n// - `paymentIconSvgs`: raw markup, which the shipped custom element draws\n// inline in its shadow root (no CSP image rule, no page-CSS bleed).\n// - `paymentIconUrls`: `data:image/svg+xml` URIs derived from it, for every\n// seam that carries a URL string \u2014 display models, `<img src>`, the React\n// wrapper, headless hosts.\nimport {\n OPENRECEIVE_PAYMENT_ICON_IDS,\n type PaymentIconId,\n paymentIconSvgs,\n} from \"../generated/payment-icon-svgs.ts\";\nimport type { PaymentMethod } from \"./checkout-types.ts\";\n\nexport { type PaymentIconId, paymentIconSvgs };\n\n/**\n * Percent-encoded, not base64: smaller, and the markup stays readable in the\n * DOM inspector. Only the characters that break a URL or an HTML attribute are\n * encoded; `decodeURIComponent` of the payload gives the SVG back byte-for-byte.\n */\nfunction svgDataUri(svg: string): string {\n return `data:image/svg+xml,${svg.replace(/[%#\"<>&]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`)}`;\n}\n\n/** Each packaged payment icon as a `data:image/svg+xml` URI, keyed by id. */\nexport const paymentIconUrls: Readonly<Record<PaymentIconId, string>> = Object.freeze(\n Object.fromEntries(\n OPENRECEIVE_PAYMENT_ICON_IDS.map((id) => [id, svgDataUri(paymentIconSvgs[id])]),\n ),\n) as Readonly<Record<PaymentIconId, string>>;\n\nexport const paymentMethodIconIds: Readonly<Record<PaymentMethod, PaymentIconId>> = {\n bitcoin: \"btc\",\n} as const;\n\nexport const assetIconIds: Readonly<Record<string, PaymentIconId>> = {\n btc: \"btc\",\n eth: \"eth\",\n ltc: \"ltc\",\n sol: \"sol\",\n trx: \"trx\",\n usdc: \"usdc\",\n usdt: \"usdt\",\n xmr: \"xmr\",\n xrp: \"xrp\",\n} as const;\n", "/* Generated by tools/package/build-browser-css.mjs \u2014 do not edit. */\nexport const compiledStyles =\n \"/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */\\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-tight:1.25;--leading-snug:1.375;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, \\\"Apple Color Emoji\\\", \\\"Segoe UI Emoji\\\", \\\"Segoe UI Symbol\\\", \\\"Noto Color Emoji\\\");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \\\"Liberation Mono\\\", \\\"Courier New\\\", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light],:root:has(input.theme-controller[value=light]:checked),[data-theme=light]{color-scheme:light;--color-base-100:oklch(100% 0 0);--color-base-200:oklch(98% 0 0);--color-base-300:oklch(95% 0 0);--color-base-content:oklch(21% .006 285.885);--color-primary:oklch(45% .24 277.023);--color-primary-content:oklch(93% .034 272.788);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}:root:has(input.theme-controller[value=dark]:checked),[data-theme=dark]{color-scheme:dark;--color-base-100:oklch(25.33% .016 252.42);--color-base-200:oklch(23.26% .014 253.1);--color-base-300:oklch(21.15% .012 254.09);--color-base-content:oklch(97.807% .029 256.847);--color-primary:oklch(58% .233 277.117);--color-primary-content:oklch(96% .018 272.314);--color-secondary:oklch(65% .241 354.308);--color-secondary-content:oklch(94% .028 342.258);--color-accent:oklch(77% .152 181.912);--color-accent-content:oklch(38% .063 188.416);--color-neutral:oklch(14% .005 285.823);--color-neutral-content:oklch(92% .004 286.32);--color-info:oklch(74% .16 232.661);--color-info-content:oklch(29% .066 243.157);--color-success:oklch(76% .177 163.223);--color-success-content:oklch(37% .077 168.94);--color-warning:oklch(82% .189 84.429);--color-warning-content:oklch(41% .112 45.904);--color-error:oklch(71% .194 13.428);--color-error-content:oklch(27% .105 12.094);--radius-selector:.5rem;--radius-field:.25rem;--radius-box:.5rem;--size-selector:.25rem;--size-field:.25rem;--border:1px;--depth:1;--noise:0}@property --radialprogress{syntax:\\\"<percentage>\\\";inherits:true;initial-value:0%}@property --aura-angle{syntax:\\\"<angle>\\\";inherits:false;initial-value:0deg}:root{scrollbar-color:currentColor #0000}@supports (color:color-mix(in lab, red, red)){:root{scrollbar-color:color-mix(in oklch, currentColor 35%, #0000) #0000}}:root{--fx-noise:url(\\\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'%3E%3Cfilter id='a'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.34' numOctaves='4' stitchTiles='stitch'%3E%3C/feTurbulence%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23a)' opacity='0.2'%3E%3C/rect%3E%3C/svg%3E\\\");--page-scroll-lock:initial;--page-overflow:var(--page-scroll-lock) hidden}:root:not(span){overflow:var(--page-overflow)}:root{--page-has-backdrop:var(--page-scroll-lock) 1;--page-scroll-bg:var(--page-scroll-lock) var(--root-bg,#0000)}@supports (color:color-mix(in lab, red, red)){:root{--page-scroll-bg:var(--page-scroll-lock) color-mix(in srgb, var(--root-bg,#0000), oklch(0% 0 0) calc(var(--page-has-backdrop,0) * 40%))}}:root{background-image:var(--page-scroll-lock) linear-gradient(var(--root-bg,#0000), var(--root-bg,#0000));transition:var(--page-scroll-lock) background-color .3s ease-out;animation:var(--page-scroll-lock) set-page-has-scroll forwards;animation-timeline:var(--page-scroll-lock) scroll();--page-has-scroll:initial;scrollbar-gutter:var(--page-has-scroll) var(--page-scroll-lock) stable}@keyframes set-page-has-scroll{0%,to{--page-has-scroll: }}:root,[data-theme]{background-color:var(--root-bg);color:var(--color-base-content)}:root{background-color:var(--page-scroll-bg,var(--root-bg))}:where(:root,[data-theme]){--root-bg:var(--color-base-100)}}@layer components;@layer utilities{.\\\\@container\\\\/methods{container:methods/inline-size}.\\\\@container\\\\/openreceive{container:openreceive/inline-size}.\\\\@container{container-type:inline-size}@layer daisyui.l1.l2.l3{.modal{pointer-events:none;visibility:hidden;width:100%;max-width:none;height:100%;max-height:none;color:inherit;transition:overlay .3s allow-discrete, visibility .3s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;overscroll-behavior:contain;z-index:999;scrollbar-gutter:auto;background-color:#0000;place-items:center;margin:0;padding:0;display:grid;position:fixed;inset:0;overflow:clip}.modal::backdrop{display:none}.modal[popover]{color:inherit;background:0 0;border:0;max-width:none;max-height:none;margin:0;padding:0;inset:0}.modal[popover]::backdrop{background-color:oklch(0% 0 0/.4);transition:background-color .3s ease-out}.tooltip{--tt-bg:var(--color-neutral);--tt-off:calc(100% + .5rem);--tt-tail:calc(100% + 1px + .25rem);--tt-tail-off:.5rem;display:inline-block;position:relative}.tooltip>.tooltip-content,.tooltip[data-tip]:before{border-radius:var(--radius-field);text-align:center;white-space:normal;max-width:20rem;color:var(--color-neutral-content);opacity:0;background-color:var(--tt-bg);pointer-events:none;z-index:2;--tw-content:attr(data-tip);content:var(--tw-content);width:max-content;padding-block:.25rem;padding-inline:.5rem;font-size:.875rem;line-height:1.25;position:absolute}.tooltip:after{opacity:0;background-color:var(--tt-bg);content:\\\"\\\";pointer-events:none;--mask-tooltip:url(\\\"data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A\\\");width:.625rem;height:.25rem;-webkit-mask-position:-1px 0;mask-position:-1px 0;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-image:var(--mask-tooltip);-webkit-mask-image:var(--mask-tooltip);mask-image:var(--mask-tooltip);display:block;position:absolute}@media (prefers-reduced-motion:no-preference){.tooltip>.tooltip-content,.tooltip[data-tip]:before,.tooltip:after{transition:opacity .2s cubic-bezier(.4,0,.2,1) 75ms,transform .2s cubic-bezier(.4,0,.2,1) 75ms}}:is(.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{opacity:1;--tt-pos:0rem}@media (prefers-reduced-motion:no-preference){:is(.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))>.tooltip-content,:is(.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible))[data-tip]:before,:is(.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))).tooltip-open,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):hover,.tooltip:is([data-tip]:not([data-tip=\\\"\\\"]),:has(.tooltip-content:not(:empty))):has(:focus-visible)):after{transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1)}}.tab:is(.tabs>.tab){cursor:pointer;appearance:none;text-align:center;webkit-user-select:none;-webkit-user-select:none;user-select:none;flex-wrap:wrap;justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){.tab:is(.tabs>.tab):hover{color:var(--color-base-content)}}.tab:is(.tabs>.tab){--tab-p:.75rem;--tab-bg:var(--color-base-100);--tab-border-color:var(--color-base-300);--tab-radius-ss:0;--tab-radius-se:0;--tab-radius-es:0;--tab-radius-ee:0;--tab-order:0;--tab-radius-min:calc(.75rem - var(--border));--tab-radius-limit:min(var(--radius-field), var(--tab-radius-min));--tab-radius-grad:#0000 calc(69% - var(--border)), var(--tab-border-color) calc(69% - var(--border) + .25px), var(--tab-border-color) 69%, var(--tab-bg) calc(69% + .25px);order:var(--tab-order);height:var(--tab-height);padding-inline:var(--tab-p);border-color:#0000;font-size:.875rem}.tab:is(.tabs>.tab):is(input[type=radio]){min-width:fit-content}.tab:is(.tabs>.tab):is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.tab:is(.tabs>.tab):is(label){position:relative}.tab:is(.tabs>.tab):is(label) input{cursor:pointer;appearance:none;opacity:0;position:absolute;inset:0}:is(.tab:is(.tabs>.tab):checked,.tab:is(.tabs>.tab):is(label:has(:checked)),.tab:is(.tabs>.tab):is(.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]))+.tab-content{display:block}.tab:is(.tabs>.tab):not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.tab:is(.tabs>.tab):not(:checked,label:has(:checked),:hover,.tab-active,[aria-selected=true],[aria-current=true],[aria-current=page]){color:color-mix(in oklab, var(--color-base-content) 50%, transparent)}}.tab:is(.tabs>.tab):not(input):empty{cursor:default;flex-grow:1}.tab:is(.tabs>.tab):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.tab:is(.tabs>.tab):focus{outline-offset:2px;outline:2px solid #0000}}.tab:is(.tabs>.tab):focus-visible,.tab:is(.tabs>.tab):is(label:has(:checked:focus-visible)){outline-offset:-5px;outline:2px solid}.tab:is(.tabs>.tab)[disabled]{pointer-events:none;opacity:.4}.menu{--menu-active-fg:var(--color-neutral-content);--menu-active-bg:var(--color-neutral);flex-flow:column wrap;width:fit-content;padding:.5rem;font-size:.875rem;display:flex}.menu :where(li ul,li menu){white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem;position:relative}.menu :where(li ul,li menu):before{background-color:var(--color-base-content);opacity:.1;width:var(--border);content:\\\"\\\";inset-inline-start:0;position:absolute;top:.75rem;bottom:.75rem}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}.menu :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);text-align:start;-webkit-user-select:none;user-select:none;grid-auto-columns:minmax(auto,max-content) auto max-content;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;padding-block:.375rem;padding-inline:.75rem;transition-property:color,background-color,box-shadow;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:grid}.menu :where(li>details>summary){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li>details>summary){outline-offset:2px;outline:2px solid #0000}}.menu :where(li>details>summary)::-webkit-details-marker{display:none}:is(.menu :where(li>details>summary),.menu :where(li>.menu-dropdown-toggle)):after{content:\\\"\\\";transform-origin:50%;pointer-events:none;justify-self:flex-end;width:.375rem;height:.375rem;transition-property:rotate,translate;transition-duration:.2s;display:block;translate:0 -1px;rotate:-135deg;box-shadow:inset 2px 2px}.menu details{interpolate-size:allow-keywords;overflow:hidden}.menu details::details-content{block-size:0}@media (prefers-reduced-motion:no-preference){.menu details::details-content{transition-behavior:allow-discrete;transition-property:block-size,content-visibility;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.menu details[open]::details-content{block-size:auto}.menu :where(li>details[open]>summary):after,.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after{translate:0 1px;rotate:45deg}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{color:var(--color-base-content);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn).menu-focus,.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title),li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.menu-active,:active,.btn):focus-visible{outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){outline-offset:2px;outline:2px solid #0000}}.menu :where(li:not(.menu-title,.disabled)>:not(ul,menu,details,.menu-title):not(.menu-active,:active,.btn):hover,li:not(.menu-title,.disabled)>details>summary:not(.menu-title):not(.menu-active,:active,.btn):hover){box-shadow:inset 0 1px oklch(0% 0 0/.01),inset 0 -1px oklch(100% 0 0/.01)}.menu :where(li:empty){background-color:var(--color-base-content);opacity:.1;height:1px;margin:.5rem 1rem}.menu :where(li){flex-flow:column wrap;flex-shrink:0;align-items:stretch;display:flex;position:relative}.menu :where(li) .badge{justify-self:flex-end}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{outline-offset:2px;outline:2px solid #0000}}.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active{color:var(--menu-active-fg);background-color:var(--menu-active-bg);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):not(:is(.menu :where(li)>:not(ul,menu,.menu-title,details,.btn):active,.menu :where(li)>:not(ul,menu,.menu-title,details,.btn).menu-active,.menu :where(li)>details>summary:active):active){box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg)}.menu :where(li).menu-disabled,.menu :where(li) [disabled]{pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.menu :where(li).menu-disabled,.menu :where(li) [disabled]{color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.menu .dropdown:focus-within .menu-dropdown-toggle:after{translate:0 1px;rotate:45deg}.menu .dropdown-content{margin-top:.5rem;padding:.5rem}.menu .dropdown-content:before{display:none}.dropdown{position-area:var(--anchor-v,bottom) var(--anchor-h,span-right);display:inline-block;position:relative}.dropdown>:not(:has(~[class*=dropdown-content])):focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.dropdown>:not(:has(~[class*=dropdown-content])):focus{outline-offset:2px;outline:2px solid #0000}}.dropdown .dropdown-content{position:absolute}.dropdown.dropdown-close .dropdown-content,.dropdown:not(details,.dropdown-open,.dropdown-hover:hover,:focus-within) .dropdown-content,.dropdown.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible)~.dropdown-content{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover],.dropdown .dropdown-content{z-index:999}@media (prefers-reduced-motion:no-preference){.dropdown[popover],.dropdown .dropdown-content{transition-behavior:allow-discrete;transition-property:opacity,scale,display,overlay;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);animation:.2s dropdown}}@starting-style{.dropdown[popover],.dropdown .dropdown-content{opacity:0;scale:.95}}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within)>[tabindex]:first-child{pointer-events:none}:is(.dropdown:not(.dropdown-close).dropdown-open,.dropdown:not(.dropdown-close):not(.dropdown-hover):focus,.dropdown:not(.dropdown-close):focus-within) .dropdown-content,.dropdown:not(.dropdown-close).dropdown-hover:hover .dropdown-content{opacity:1;scale:1}.dropdown:is(details){overflow:revert-layer}.dropdown:is(details) summary::-webkit-details-marker{display:none}.dropdown:where([popover]){background:0 0}.dropdown[popover]{color:inherit;position:fixed}@supports not (position-area:bottom){.dropdown[popover]{margin:auto}.dropdown[popover].dropdown-close{transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover].dropdown-open:not(:popover-open){transform-origin:top;opacity:0;display:none;scale:.95}.dropdown[popover]::backdrop{background-color:oklab(0% none none/.3)}}:is(.dropdown[popover].dropdown-close,.dropdown[popover]:not(.dropdown-open,:popover-open)){transform-origin:top;opacity:0;display:none;scale:.95}:where(.btn){width:unset}.btn{--size:calc(var(--size-field,.25rem) * 10);--btn-p:1rem;--btn-fg:var(--color-base-content);cursor:pointer;text-align:center;vertical-align:middle;outline-offset:2px;webkit-user-select:none;-webkit-user-select:none;user-select:none;border-width:var(--border);touch-action:manipulation;--btn-bg:var(--btn-color,var(--color-base-200));--btn-border:var(--btn-color,var(--color-base-200));border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));flex-wrap:nowrap;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;font-weight:600;transition-property:color,background-color,border-color,box-shadow,transform;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);display:inline-flex}@supports (color:color-mix(in lab, red, red)){.btn{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 calc(var(--depth) * 5%))}}.btn{--btn-soft-bg:initial;--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn{--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));height:var(--size);padding-inline:var(--btn-p);font-size:var(--fontsize,.875rem);background-color:var(--btn-bg);color:var(--btn-fg);border-color:var(--btn-border);border-style:var(--btn-border-style,solid);outline-color:var(--btn-color,var(--color-base-content));--tw-prose-links:var(--btn-fg);background-image:none, var(--fx-noise);background-size:auto, calc(var(--noise,0) * 100%);text-shadow:0 .5px oklch(100% 0 0 / calc(var(--depth) * .15));box-shadow:var(--btn-inset) inset, var(--btn-shadow)}.btn:is([type=checkbox],[type=radio]){appearance:none}.btn:is([type=checkbox],[type=radio])[aria-label]:after{--tw-content:attr(aria-label);content:var(--tw-content)}.loading{pointer-events:none;aspect-ratio:1;vertical-align:middle;width:calc(var(--size-selector,.25rem) * 6);background-color:currentColor;display:inline-block;-webkit-mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\");mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\");-webkit-mask-position:50%;mask-position:50%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion:no-preference){.loading{-webkit-mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\");mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\")}}.countdown{display:inline-flex}.countdown>*{visibility:hidden;--value-v:calc(mod(max(0, var(--value)), 1000));--value-hundreds:calc(round(to-zero, var(--value-v) / 100, 1));--value-tens:calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));--value-ones:calc(mod(var(--value-v), 100));--show-hundreds:clamp(clamp(0, var(--digits,1) - 2, 1), var(--value-hundreds), 1);--show-tens:clamp(clamp(0, var(--digits,1) - 1, 1), var(--value-tens) + var(--show-hundreds), 1);--first-digits:calc(round(to-zero, var(--value-v) / 10, 1));height:1em;width:calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);direction:ltr;transition:width .4s ease-out .2s;display:inline-block;position:relative;overflow-y:clip}.countdown>:before,.countdown>:after{visibility:visible;--tw-content:\\\"00\\\\a 01\\\\a 02\\\\a 03\\\\a 04\\\\a 05\\\\a 06\\\\a 07\\\\a 08\\\\a 09\\\\a 10\\\\a 11\\\\a 12\\\\a 13\\\\a 14\\\\a 15\\\\a 16\\\\a 17\\\\a 18\\\\a 19\\\\a 20\\\\a 21\\\\a 22\\\\a 23\\\\a 24\\\\a 25\\\\a 26\\\\a 27\\\\a 28\\\\a 29\\\\a 30\\\\a 31\\\\a 32\\\\a 33\\\\a 34\\\\a 35\\\\a 36\\\\a 37\\\\a 38\\\\a 39\\\\a 40\\\\a 41\\\\a 42\\\\a 43\\\\a 44\\\\a 45\\\\a 46\\\\a 47\\\\a 48\\\\a 49\\\\a 50\\\\a 51\\\\a 52\\\\a 53\\\\a 54\\\\a 55\\\\a 56\\\\a 57\\\\a 58\\\\a 59\\\\a 60\\\\a 61\\\\a 62\\\\a 63\\\\a 64\\\\a 65\\\\a 66\\\\a 67\\\\a 68\\\\a 69\\\\a 70\\\\a 71\\\\a 72\\\\a 73\\\\a 74\\\\a 75\\\\a 76\\\\a 77\\\\a 78\\\\a 79\\\\a 80\\\\a 81\\\\a 82\\\\a 83\\\\a 84\\\\a 85\\\\a 86\\\\a 87\\\\a 88\\\\a 89\\\\a 90\\\\a 91\\\\a 92\\\\a 93\\\\a 94\\\\a 95\\\\a 96\\\\a 97\\\\a 98\\\\a 99\\\\a \\\";content:var(--tw-content);font-variant-numeric:tabular-nums;white-space:pre;text-align:end;direction:rtl;transition:all 1s cubic-bezier(1,0,0,1),width .2s ease-out .2s,opacity .2s ease-out .2s;position:absolute;overflow-x:clip}.countdown>:before{width:calc(1ch + var(--show-hundreds) * 1ch);top:calc(var(--first-digits) * -1em);opacity:var(--show-tens);inset-inline-end:0}.countdown>:after{width:1ch;top:calc(var(--value-ones) * -1em);inset-inline-start:0}.collapse{border-radius:var(--radius-box,1rem);isolation:isolate;grid-template-rows:max-content 0fr;grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative}@media (prefers-reduced-motion:no-preference){.collapse{transition:grid-template-rows .2s}}.collapse>input:is([type=checkbox],[type=radio]){appearance:none;opacity:0;z-index:1;grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close)),.collapse:not(.collapse-close):has(>input:is([type=checkbox],[type=radio]):checked){grid-template-rows:max-content 1fr}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){--overflow-delay:.2s;overflow:revert-layer;content-visibility:visible;min-height:fit-content}@supports not (content-visibility:visible){.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>.collapse-content,.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){visibility:visible}}.collapse:focus-visible,.collapse:has(>input:is([type=checkbox],[type=radio]):focus-visible),.collapse:has(summary:focus-visible){outline-color:var(--color-base-content);outline-offset:2px;outline-width:2px;outline-style:solid}.collapse:not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-close)>.collapse-title{cursor:pointer}:is(.collapse[tabindex]:focus:not(.collapse-close,.collapse[open]),.collapse[tabindex]:focus-within:not(.collapse-close,.collapse[open]))>.collapse-title{cursor:unset}.collapse:is([open],[tabindex]:focus:not(.collapse-close),[tabindex]:focus-within:not(.collapse-close))>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input:is([type=checkbox],[type=radio]):checked~.collapse-content){padding-bottom:1rem}.collapse:is(details){width:100%}.collapse:is(details)::details-content{--overflow-delay:0s;height:0;overflow:clip}.collapse:is(details):where([open])::details-content{overflow:revert-layer;height:auto}@media (prefers-reduced-motion:no-preference){.collapse:is(details)::details-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out, height .2s;interpolate-size:allow-keywords}.collapse:is(details):where([open])::details-content{--overflow-delay:.2s}}.collapse:is(details)>summary{outline:none;display:block;position:relative}.collapse:is(details)>summary::-webkit-details-marker{display:none}.collapse-content{--overflow-delay:0s;content-visibility:hidden;min-height:0;cursor:unset;grid-row-start:2;grid-column-start:1;padding-left:1rem;padding-right:1rem;overflow:clip}@supports not (content-visibility:hidden){.collapse-content{visibility:hidden}}@media (prefers-reduced-motion:no-preference){.collapse-content{transition:overflow .2s allow-discrete var(--overflow-delay), content-visibility .2s allow-discrete, visibility .2s allow-discrete, min-height .2s ease-out allow-discrete, padding .1s ease-out 20ms, background-color .2s ease-out}}details>.collapse-content{content-visibility:visible}.filter{flex-wrap:wrap;display:flex}.filter [type=radio]{width:auto}.filter input{opacity:1;transition:visibility .1s allow-discrete, margin .1s, opacity .3s, padding .3s, border-width .1s;overflow:hidden;scale:1}.filter input.filter-reset{aspect-ratio:1}.filter input.filter-reset:after{--tw-content:\\\"\u00D7\\\";content:var(--tw-content)}.filter>input:not(:last-child),.filter>:not(:last-child) input{margin-inline-end:.25rem}.list{flex-direction:column;font-size:.875rem;display:flex}.list .list-row{--list-grid-cols:minmax(0, auto) 1fr;border-radius:var(--radius-box);word-break:break-word;grid-auto-flow:column;grid-template-columns:var(--list-grid-cols);gap:1rem;padding:1rem;display:grid;position:relative}:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{content:\\\"\\\";border-bottom:var(--border) solid;inset-inline:var(--radius-box);border-color:var(--color-base-content);position:absolute;bottom:0}@supports (color:color-mix(in lab, red, red)){:is(.list>:not(:last-child).list-row,.list>:not(:last-child) .list-row):after{border-color:color-mix(in oklab, var(--color-base-content) 5%, transparent)}}.toast{translate:var(--toast-x,0) var(--toast-y,0);inset-inline:auto 1rem;background-color:#0000;flex-direction:column;gap:.5rem;width:max-content;max-width:calc(100vw - 2rem);display:flex;position:fixed;top:auto;bottom:1rem}@media (prefers-reduced-motion:no-preference){.toast>*{animation:.25s ease-out toast}}.toggle{border:var(--border) solid currentColor;color:var(--input-color);cursor:pointer;appearance:none;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--toggle-p), var(--radius-selector-max)) + min(var(--border), var(--radius-selector-max)));padding:var(--toggle-p);flex-shrink:0;grid-template-columns:0fr 1fr 1fr;place-content:center;display:inline-grid;position:relative;box-shadow:inset 0 1px}@supports (color:color-mix(in lab, red, red)){.toggle{box-shadow:0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000) inset}}.toggle{--input-color:var(--color-base-content);transition:color .3s,grid-template-columns .2s}@supports (color:color-mix(in lab, red, red)){.toggle{--input-color:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}.toggle{--toggle-p:calc(var(--size) * .125);--size:calc(var(--size-selector,.25rem) * 6);width:calc((var(--size) * 2) - (var(--border) + var(--toggle-p)) * 2);height:var(--size)}.toggle>*{z-index:1;cursor:pointer;appearance:none;background-color:#0000;border:none;grid-column:2/span 1;grid-row-start:1;height:100%;padding:.125rem;transition:opacity .2s,rotate .4s}.toggle>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.toggle>:focus{outline-offset:2px;outline:2px solid #0000}}.toggle>:nth-child(2){color:var(--color-base-100);rotate:0deg}.toggle>:nth-child(3){color:var(--color-base-100);opacity:0;rotate:-15deg}.toggle:has(:checked)>:nth-child(2){opacity:0;rotate:15deg}.toggle:has(:checked)>:nth-child(3){opacity:1;rotate:0deg}.toggle:before{aspect-ratio:1;border-radius:var(--radius-selector);--tw-content:\\\"\\\";content:var(--tw-content);width:100%;height:100%;box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor;background-color:currentColor;grid-row-start:1;grid-column-start:2;transition:background-color .1s,translate .2s,inset-inline-start .2s;position:relative;inset-inline-start:0;translate:0}@supports (color:color-mix(in lab, red, red)){.toggle:before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000)}}.toggle:before{background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise)}@media (forced-colors:active){.toggle:before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{.toggle:before{outline-offset:-1rem;outline:.25rem solid}}.toggle:focus-visible,.toggle:has(:focus-visible){outline-offset:2px;outline:2px solid}.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked){background-color:var(--color-base-100);--input-color:var(--color-base-content);grid-template-columns:1fr 1fr 0fr}:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{background-color:currentColor}@starting-style{:is(.toggle:checked,.toggle[aria-checked=true],.toggle:has(>input:checked)):before{opacity:0}}.toggle:indeterminate{grid-template-columns:.5fr 1fr .5fr}.toggle:disabled{cursor:not-allowed;opacity:.3}.toggle:disabled:before{border:var(--border) solid currentColor;background-color:#0000}.input{appearance:none;background-color:var(--color-base-100);vertical-align:middle;white-space:nowrap;--size:calc(var(--size-field,.25rem) * var(--in-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.5rem;padding-inline:.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.input{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.input{cursor:text;width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field))}@supports (color:color-mix(in lab, red, red)){.input{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.input input{appearance:none;background-color:#0000;border:none;width:100%;height:100%}.input input::placeholder{color:var(--color-base-content);opacity:.5}.input input:focus,.input input:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.input input:focus,.input input:focus-within{outline-offset:2px;outline:2px solid #0000}}.input input::-webkit-calendar-picker-indicator{inset-inline-end:-.15em}.input::-webkit-inner-spin-button{margin-inline-end:-10px}.input::-webkit-calendar-picker-indicator{inset-inline-end:.75em}input.input,.input input{display:inline-flex;position:relative}:is(input.input,.input input)[type=url],:is(input.input,.input input)[type=email]{text-align:left}:is(input.input,.input input)::-webkit-datetime-edit{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-date-and-time-value{min-height:100%;text-align:inherit;align-items:center;display:grid}:is(input.input,.input input)::-webkit-inner-spin-button{margin-block:calc(.25rem * var(--spin-my))}:is(input.input,.input input)::-webkit-calendar-picker-indicator{cursor:pointer;width:1em;height:1em;position:absolute}:is(input.input,.input input)::-webkit-color-swatch-wrapper{padding-block:.25rem}.input:focus,.input:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.input:focus,.input:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.input:focus,.input:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.input:focus,.input:focus-within{--font-size:1rem}}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input):is(input),:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) :is(input){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input{box-shadow:none}:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input)::placeholder,:is(.input:has(>input[disabled]),.input:is(:disabled,[disabled]),fieldset:disabled .input) ::placeholder{color:var(--color-base-content);opacity:.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.range{appearance:none;webkit-appearance:none;--range-thumb:var(--color-base-100);--range-thumb-size:calc(var(--size-selector,.25rem) * 6);--range-progress:currentColor;--range-fill:1;--range-p:.25rem;--range-bg:currentColor}@supports (color:color-mix(in lab, red, red)){.range{--range-bg:color-mix(in oklab, currentColor 10%, #0000)}}.range{--range-fill-x:calc((var(--range-dir,1) * -100cqw) - (var(--range-dir,1) * var(--range-thumb-size) / 2));--range-fill-y:0;--range-fill-spread:calc(100cqw * var(--range-fill));cursor:pointer;vertical-align:middle;--radius-selector-max:calc(var(--radius-selector) + var(--radius-selector) + var(--radius-selector));border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));width:clamp(3rem,20rem,100%);height:var(--range-thumb-size);background-color:#0000;border:none;overflow:hidden}[dir=rtl] .range{--range-dir:-1}.range:focus{outline:none}.range:focus-visible{outline-offset:2px;outline:2px solid}.range::-webkit-slider-runnable-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}@media (forced-colors:active){.range::-webkit-slider-runnable-track{border:1px solid}.range::-moz-range-track{border:1px solid}}.range::-webkit-slider-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));background-color:var(--range-thumb);height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;appearance:none;webkit-appearance:none;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);position:relative;inset-block-start:50%;transform:translateY(-50%)}@supports (color:color-mix(in lab, red, red)){.range::-webkit-slider-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range::-moz-range-track{background-color:var(--range-bg);border-radius:var(--radius-selector);width:100%;height:calc(var(--range-thumb-size) * .5)}.range::-moz-range-thumb{box-sizing:border-box;border-radius:calc(var(--radius-selector) + min(var(--range-p), var(--radius-selector-max)));height:var(--range-thumb-size);width:var(--range-thumb-size);border:var(--range-p) solid;color:var(--range-progress);box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px currentColor, 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread);background-color:currentColor;position:relative}@supports (color:color-mix(in lab, red, red)){.range::-moz-range-thumb{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px color-mix(in oklab, currentColor calc(var(--depth) * 10%), #0000), 0 0 0 2rem var(--range-thumb) inset, var(--range-fill-x) var(--range-fill-y) 0 var(--range-fill-spread)}}.range:disabled{cursor:not-allowed;opacity:.3}.table{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);border-radius:var(--radius-box);text-align:left;font-size:.875rem;position:relative}.table:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}@media (hover:hover){:is(.table tr.row-hover,.table tr.row-hover:nth-child(2n)):hover{background-color:var(--color-base-200)}}.table :where(th,td){vertical-align:middle;padding-block:.75rem;padding-inline:1rem}.table :where(thead,tfoot){white-space:nowrap;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead,tfoot){color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.table :where(thead,tfoot){font-size:.875rem;font-weight:600}.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(tfoot tr:first-child :is(td,th)){border-top:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.table :where(.table-pin-rows thead tr){z-index:1;background-color:var(--color-base-100);position:sticky;top:0}.table :where(.table-pin-rows tfoot tr){z-index:1;background-color:var(--color-base-100);position:sticky;bottom:0}.table :where(.table-pin-cols tr th){background-color:var(--color-base-100);position:sticky;left:0;right:0}.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.table :where(thead tr :is(td,th),tbody tr:not(:last-child) :is(td,th)){border-bottom:var(--border) solid color-mix(in oklch, var(--color-base-content) 5%, #0000)}}.aura{--aura-padding:.125rem;padding:var(--aura-padding);border-radius:calc(var(--aura-padding) + var(--aura-radius,var(--radius-box)));animation:aura var(--tw-duration,6s) linear infinite;background-image:conic-gradient(from var(--aura-angle), transparent 225deg, currentColor);display:inline-block;position:relative}.aura:has(>.card,>.alert){--aura-radius:var(--radius-box)}.aura:has(>.btn,>.input,>.select){--aura-radius:var(--radius-field)}.aura:has(>.checkbox,>.toggle,>.badge){--aura-radius:var(--radius-selector)}.aura:before,.aura:after{animation:inherit;background-color:inherit;background-image:inherit;border-radius:inherit;z-index:0;opacity:.7;filter:blur(.25rem);content:\\\"\\\";width:100%;height:100%;display:block;position:absolute;top:50%;left:50%;translate:-50% -50%}.aura:after{opacity:.3;filter:blur(1rem)}.aura>*{z-index:1;position:relative}.steps{counter-reset:step;grid-auto-columns:1fr;grid-auto-flow:column;display:inline-grid;overflow:auto hidden}.steps .step{text-align:center;--step-bg:var(--color-base-300);--step-fg:var(--color-base-content);grid-template-rows:40px 1fr;grid-template-columns:auto;place-items:center;min-width:4rem;display:grid}.steps .step:before{width:100%;height:.5rem;color:var(--step-bg);background-color:var(--step-bg);content:\\\"\\\";border:1px solid;grid-row-start:1;grid-column-start:1;margin-inline-start:-100%;top:0}.steps .step>.step-icon,.steps .step:not(:has(.step-icon)):after{--tw-content:counter(step);content:var(--tw-content);counter-increment:step;z-index:1;color:var(--step-fg);background-color:var(--step-bg);border:1px solid var(--step-bg);border-radius:3.40282e38px;grid-row-start:1;grid-column-start:1;place-self:center;place-items:center;width:2rem;height:2rem;display:grid;position:relative}.steps .step:first-child:before{--tw-content:none;content:var(--tw-content)}.steps .step[data-content]:after{--tw-content:attr(data-content);content:var(--tw-content)}.select{appearance:none;background-color:var(--color-base-100);vertical-align:middle;--size:calc(var(--size-field,.25rem) * var(--sl-size-mul));--input-color:var(--color-base-content);flex-shrink:1;align-items:center;gap:.375rem;padding-inline:.75rem 1.75rem;display:inline-flex;position:relative}@supports (color:color-mix(in lab, red, red)){.select{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.select{width:clamp(3rem,20rem,100%);height:var(--size);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;white-space:nowrap;text-overflow:ellipsis;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-image:linear-gradient(45deg,#0000 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,#0000 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-repeat:no-repeat;background-size:4px 4px,4px 4px;border-start-start-radius:var(--join-ss,var(--radius-field));border-start-end-radius:var(--join-se,var(--radius-field));border-end-end-radius:var(--join-ee,var(--radius-field));border-end-start-radius:var(--join-es,var(--radius-field));overflow:hidden}@supports (color:color-mix(in lab, red, red)){.select{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}[dir=rtl] .select::picker(select){translate:.5rem}[dir=rtl] .select select::picker(select){translate:.5rem}.select[multiple]{background-image:none;height:auto;padding-block:.75rem;padding-inline-end:.75rem;overflow:auto}.select select{appearance:none;width:calc(100% + 2.75rem);height:calc(100% - calc(var(--border) * 2));background:inherit;border-radius:inherit;border-style:none;align-items:center;margin-inline:-.75rem -1.75rem;padding-inline:.75rem 1.75rem}.select select::placeholder{color:var(--color-base-content);opacity:.5}.select select:focus,.select select:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.select select:focus,.select select:focus-within{outline-offset:2px;outline:2px solid #0000}}.select select:not(:last-child){background-image:none;margin-inline-end:-1.375rem}:is(.select:focus,.select:focus-within,.select:open){--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){:is(.select:focus,.select:focus-within,.select:open){box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}:is(.select:focus,.select:focus-within,.select:open){outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate;background-image:linear-gradient(135deg,#0000 50%,currentColor 50%),linear-gradient(45deg,currentColor 50%,#0000 50%)}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200)}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select):is(select),:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) :is(select){color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select):is(select),:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) :is(select){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select{box-shadow:none}:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select)::placeholder,:is(.select:has(>select[disabled]),.select:is(:disabled,[disabled]),fieldset:disabled .select) ::placeholder{color:var(--color-base-content);opacity:.2}.select:has(>select[disabled])>select[disabled]{cursor:not-allowed}@supports (appearance:base-select){:is(.select,.select select){appearance:base-select}:is(.select,.select select)::picker(select){appearance:base-select}}:is(.select,.select select)::picker(select){color:inherit;border:var(--border) solid var(--color-base-200);border-radius:var(--radius-box);background-color:inherit;max-height:min(24rem,70dvh);box-shadow:0 2px calc(var(--depth) * 3px) -2px oklch(0% 0 0/.2);box-shadow:0 20px 25px -5px rgb(0 0 0/calc(var(--depth) * .1)), 0 8px 10px -6px rgb(0 0 0/calc(var(--depth) * .1));margin-block:.5rem;margin-inline:.5rem;padding:.5rem;translate:-.5rem}:is(.select,.select select)::picker-icon{display:none}:is(.select,.select select) selectedcontent{text-overflow:ellipsis;white-space:nowrap;width:100%;overflow:hidden}:is(.select,.select select) optgroup{padding-top:.5em}:is(.select,.select select) optgroup option:first-child{margin-top:.5em}:is(.select,.select select) option{border-radius:var(--radius-field);padding-block:.375rem;padding-inline:calc(.25rem * var(--option-px));white-space:normal;transition-property:color,background-color;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{cursor:pointer;background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.select,.select select) option:not(:disabled):hover,:is(.select,.select select) option:not(:disabled):focus-visible{outline-offset:2px;outline:2px solid #0000}}:is(.select,.select select) option:not(:disabled):active{background-color:var(--color-neutral);color:var(--color-neutral-content);box-shadow:0 2px calc(var(--depth) * 3px) -2px var(--color-neutral)}.collapse-title{grid-row-start:1;grid-column-start:1;width:100%;min-height:1lh;padding:1rem;padding-inline-end:3rem;transition:background-color .2s ease-out;position:relative}.checkbox{border:var(--border) solid var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox{border:var(--border) solid var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox{cursor:pointer;appearance:none;border-radius:var(--radius-selector);vertical-align:middle;color:var(--color-base-content);box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 0 #0000 inset, 0 0 #0000;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);flex-shrink:0;padding:.25rem;transition:background-color .2s,box-shadow .2s;display:inline-block;position:relative}.checkbox:before{--tw-content:\\\"\\\";content:var(--tw-content);opacity:0;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,70% 80%,70% 100%);width:100%;height:100%;box-shadow:0px 3px 0 0px oklch(100% 0 0 / calc(var(--depth) * .1)) inset;background-color:currentColor;font-size:1rem;line-height:.75;transition:clip-path .3s .1s,opacity .1s .1s,rotate .3s .1s,translate .3s .1s;display:block;rotate:45deg}.checkbox:focus-visible{outline:2px solid var(--input-color,currentColor);outline-offset:2px}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--input-color,#0000);box-shadow:0 0 #0000 inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1))}:is(.checkbox:checked,.checkbox[aria-checked=true]):before{clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 0%,70% 0%,70% 100%);opacity:1}@media (forced-colors:active){:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:\\\"\u2714\uFE0E\\\";clip-path:none;background-color:#0000;rotate:0deg}}@media print{:is(.checkbox:checked,.checkbox[aria-checked=true]):before{--tw-content:\\\"\u2714\uFE0E\\\";clip-path:none;background-color:#0000;rotate:0deg}}.checkbox:indeterminate{background-color:var(--input-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.checkbox:indeterminate{background-color:var(--input-color,color-mix(in oklab, var(--color-base-content) 20%, #0000))}}.checkbox:indeterminate:before{opacity:1;clip-path:polygon(20% 100%,20% 80%,50% 80%,50% 80%,80% 80%,80% 100%);translate:0 -35%;rotate:0deg}.radio{cursor:pointer;appearance:none;vertical-align:middle;border:var(--border) solid var(--input-color,currentColor);border-radius:3.40282e38px;flex-shrink:0;padding:.25rem;display:inline-block;position:relative}@supports (color:color-mix(in lab, red, red)){.radio{border:var(--border) solid var(--input-color,color-mix(in srgb, currentColor 20%, #0000))}}.radio{box-shadow:0 1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset;--size:calc(var(--size-selector,.25rem) * 6);width:var(--size);height:var(--size);color:var(--input-color,currentColor)}.radio:before{--tw-content:\\\"\\\";content:var(--tw-content);background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);border-radius:3.40282e38px;width:100%;height:100%;display:block}.radio:focus-visible{outline:2px solid}.radio:checked,.radio[aria-checked=true]{background-color:var(--color-base-100);border-color:currentColor}@media (prefers-reduced-motion:no-preference){.radio:checked,.radio[aria-checked=true]{animation:.2s ease-out radio}}:is(.radio:checked,.radio[aria-checked=true]):before{box-shadow:0 -1px oklch(0% 0 0 / calc(var(--depth) * .1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * .1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * .1));background-color:currentColor}@media (forced-colors:active){:is(.radio:checked,.radio[aria-checked=true]):before{outline-style:var(--tw-outline-style);outline-offset:calc(1px * -1);outline-width:1px}}@media print{:is(.radio:checked,.radio[aria-checked=true]):before{outline-offset:-1rem;outline:.25rem solid}}.rating{vertical-align:middle;--size:var(--size-selector,.25rem) * 6;display:inline-flex;position:relative}.rating input{cursor:pointer;appearance:none}.rating *{background-color:var(--color-base-content);opacity:.2;width:calc(var(--size) * 1);height:calc(var(--size));border-radius:0}@media (prefers-reduced-motion:no-preference){.rating *{animation:.25s ease-out rating}}.rating .rating-hidden{background-color:#0000;width:.5rem}.rating :checked,.rating [aria-checked=true],.rating [aria-current=true],.rating :has(~:checked,~[aria-checked=true],~[aria-current=true]){opacity:1}.rating :focus-visible{scale:1.1}@media (prefers-reduced-motion:no-preference){.rating :focus-visible{transition:scale .2s ease-out}}.rating :active:focus{animation:none;scale:1.1}.card{border-radius:var(--radius-box);outline-offset:2px;outline:2px solid #0000;flex-direction:column;transition:outline .2s ease-in-out;display:flex;position:relative}.card:focus-visible,.card[aria-checked=true],.card:has(>:checked,>:is([type=checkbox],[type=radio]):focus-visible){outline-color:currentColor}.card:has(>:checked:focus-visible),.card[aria-checked=true]:focus-visible,.card[aria-checked=true]:has(>:is([type=checkbox],[type=radio]):focus-visible){outline-width:4px}.card:has(>:is([type=checkbox],[type=radio])){cursor:pointer;-webkit-user-select:none;user-select:none}.card>:is([type=checkbox],[type=radio]){appearance:none}.progress{appearance:none;border-radius:var(--radius-box);background-color:currentColor;width:100%;height:.5rem;position:relative;overflow:hidden}@supports (color:color-mix(in lab, red, red)){.progress{background-color:color-mix(in oklab, currentcolor 20%, transparent)}}.progress{color:var(--color-base-content)}.progress:indeterminate{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%}@media (prefers-reduced-motion:no-preference){.progress:indeterminate{animation:5s ease-in-out infinite progress}}@supports ((-moz-appearance:none)){.progress:indeterminate::-moz-progress-bar{background-color:#0000}@media (prefers-reduced-motion:no-preference){.progress:indeterminate::-moz-progress-bar{background-image:repeating-linear-gradient(90deg,currentColor -1% 10%,#0000 10% 90%);background-position-x:15%;background-size:200%;animation:5s ease-in-out infinite progress}}.progress::-moz-progress-bar{border-radius:var(--radius-box);background-color:currentColor}}@supports ((-webkit-appearance:none)){.progress::-webkit-progress-bar{border-radius:var(--radius-box);background-color:#0000}.progress::-webkit-progress-value{border-radius:var(--radius-box);background-color:currentColor}}.textarea{appearance:none;border-radius:var(--radius-field);background-color:var(--color-base-100);vertical-align:middle;--input-color:var(--color-base-content);flex-shrink:1;min-height:5rem;padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.textarea{--input-color:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}.textarea{width:clamp(3rem,20rem,100%);font-size:max(var(--font-size,0rem), var(--font-size-min));touch-action:manipulation;border:var(--border) solid var(--input-color,#0000);box-shadow:0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}@supports (color:color-mix(in lab, red, red)){.textarea{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * .1)) inset}}.textarea textarea{appearance:none;background-color:#0000;border:none}.textarea textarea::placeholder{color:var(--color-base-content);opacity:.5}.textarea textarea:focus,.textarea textarea:focus-within{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.textarea textarea:focus,.textarea textarea:focus-within{outline-offset:2px;outline:2px solid #0000}}.textarea:focus,.textarea:focus-within{--input-color:var(--color-base-content);box-shadow:0 1px var(--input-color)}@supports (color:color-mix(in lab, red, red)){.textarea:focus,.textarea:focus-within{box-shadow:0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000)}}.textarea:focus,.textarea:focus-within{outline:2px solid var(--input-color);outline-offset:2px;isolation:isolate}@media (pointer:coarse){@supports (-webkit-touch-callout:none){.textarea:focus,.textarea:focus-within{--font-size:1rem}}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){cursor:not-allowed;border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]){box-shadow:none}:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled]))::placeholder,:is(.textarea:has(>textarea[disabled]),.textarea:is(:disabled,[disabled])) ::placeholder{color:var(--color-base-content);opacity:.2}.textarea:has(>textarea[disabled])>textarea[disabled]{cursor:not-allowed}.stack{grid-template-rows:3px 4px 1fr 4px 3px;grid-template-columns:3px 4px 1fr 4px 3px;display:inline-grid}.stack>*{width:100%;height:100%}.stack>:nth-child(n+2){opacity:.7;width:100%}.stack>:nth-child(2){z-index:2;opacity:.9}.stack>:first-child{z-index:3;width:100%}.tab-content{order:var(--tabcontent-order);--tabcontent-radius-ss:var(--radius-box);--tabcontent-radius-se:var(--radius-box);--tabcontent-radius-es:var(--radius-box);--tabcontent-radius-ee:var(--radius-box);--tabcontent-order:1;width:100%;height:calc(100% - var(--tab-height) + var(--border));margin:var(--tabcontent-margin);border-color:#0000;border-width:var(--border);border-start-start-radius:var(--tabcontent-radius-ss);border-start-end-radius:var(--tabcontent-radius-se);border-end-end-radius:var(--tabcontent-radius-ee);border-end-start-radius:var(--tabcontent-radius-es);display:none}.modal-box{background-color:var(--color-base-100);border-top-left-radius:var(--modal-tl,var(--radius-box));border-top-right-radius:var(--modal-tr,var(--radius-box));border-bottom-left-radius:var(--modal-bl,var(--radius-box));border-bottom-right-radius:var(--modal-br,var(--radius-box));opacity:0;overscroll-behavior:contain;grid-row-start:1;grid-column-start:1;width:91.6667%;max-width:32rem;max-height:100vh;padding:1.5rem;transition:translate .3s ease-out,scale .3s ease-out,opacity .2s ease-out 50ms,box-shadow .3s ease-out;overflow-y:auto;scale:.95;box-shadow:0 25px 50px -12px oklch(0% 0 0/.25)}.breadcrumbs{max-width:100%;padding-block:.5rem;overflow-x:auto}.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol{white-space:nowrap;align-items:center;min-height:min-content;display:flex}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li{align-items:center;display:flex}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>*{cursor:pointer;align-items:center;gap:.5rem;display:flex}@media (hover:hover){:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:hover{text-decoration-line:underline}}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus{outline-offset:2px;outline:2px solid #0000}}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li>:focus-visible{outline-offset:2px;outline:2px solid}:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li+:before{content:\\\"\\\";opacity:.4;background-color:#0000;border-top:1px solid;border-right:1px solid;width:.375rem;height:.375rem;margin-inline:.5rem .75rem;display:block;rotate:45deg}[dir=rtl] :is(:is(.breadcrumbs>menu,.breadcrumbs>ul,.breadcrumbs>ol)>li)+:before{rotate:-135deg}.label{white-space:nowrap;color:currentColor;align-items:center;gap:.375rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.label{color:color-mix(in oklab, currentcolor 60%, transparent)}}.label:has(input){cursor:pointer}.label:is(.input>*,.select>*){white-space:nowrap;height:calc(100% - .5rem);font-size:inherit;align-items:center;padding-inline:.75rem;display:flex}.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid currentColor;margin-inline:-.75rem .75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):first-child{border-inline-end:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid currentColor;margin-inline:.75rem -.75rem}@supports (color:color-mix(in lab, red, red)){.label:is(.input>*,.select>*):last-child{border-inline-start:var(--border) solid color-mix(in oklab, currentColor 10%, #0000)}}.status{aspect-ratio:1;border-radius:var(--radius-selector);background-color:var(--color-base-content);width:.5rem;height:.5rem;display:inline-block}@supports (color:color-mix(in lab, red, red)){.status{background-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.status{vertical-align:middle;color:#0000004d;background-position:50%;background-repeat:no-repeat}@supports (color:color-mix(in lab, red, red)){.status{color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.status{background-image:radial-gradient(circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * .5)), #0000);box-shadow:0 2px 3px -1px}@supports (color:color-mix(in lab, red, red)){.status{box-shadow:0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000)}}.badge{border-radius:var(--radius-selector);vertical-align:middle;color:var(--badge-fg);border:var(--border) solid var(--badge-color,var(--color-base-200));background-size:auto, calc(var(--noise) * 100%);background-image:none, var(--fx-noise);background-color:var(--badge-bg);--badge-bg:var(--badge-color,var(--color-base-100));--badge-fg:var(--color-base-content);--size:calc(var(--size-selector,.25rem) * 6);width:fit-content;height:var(--size);padding-inline:calc(var(--size) / 2 - var(--border));justify-content:center;align-items:center;gap:.5rem;font-size:.875rem;display:inline-flex}.alert{--alert-border-color:var(--color-base-200);border-radius:var(--radius-box);color:var(--color-base-content);background-color:var(--alert-color,var(--color-base-200));text-align:start;background-size:auto, calc(var(--noise) * 33%);background-image:none, var(--fx-noise);box-shadow:0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * .08)) inset, 0 1px #000, 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * .08));border-style:solid;grid-template-columns:auto;grid-auto-flow:column;justify-content:start;place-items:center start;gap:1rem;padding-block:.75rem;padding-inline:1rem;font-size:.875rem;line-height:1.25rem;display:grid}@supports (color:color-mix(in lab, red, red)){.alert{box-shadow:0 3px 0 -2px oklch(100% 0 0 / calc(var(--depth) * .08)) inset, 0 1px color-mix(in oklab, color-mix(in oklab, #000 20%, var(--alert-color,var(--color-base-200))) calc(var(--depth) * 20%), #0000), 0 4px 3px -2px oklch(0% 0 0 / calc(var(--depth) * .08))}}.alert:has(:nth-child(2)){grid-template-columns:auto minmax(auto,1fr)}.skeleton{border-radius:var(--radius-box);background-color:var(--color-base-300)}@media (prefers-reduced-motion:reduce){.skeleton{transition-duration:15s}}.skeleton{will-change:background-position;background-image:linear-gradient(105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100%);background-position-x:-50%;background-size:200%}@media (prefers-reduced-motion:no-preference){.skeleton{animation:1.8s ease-in-out infinite skeleton}}.link{cursor:pointer;text-decoration-line:underline}.link:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.link:focus{outline-offset:2px;outline:2px solid #0000}}.link:focus-visible{outline-offset:2px;outline:2px solid}.btn-outline{--btn-bg:#0000;color:var(--btn-rest-fg,var(--btn-color,var(--color-base-content)));--btn-border:var(--btn-color,var(--color-base-content));--btn-border-style:solid;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn-soft{--btn-bg:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 8%, var(--btn-soft-bg,var(--color-base-100)))}}.btn-soft{color:var(--btn-rest-fg,var(--btn-color,var(--color-base-content)));--btn-border:var(--btn-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.btn-soft{--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-content)) 10%, var(--btn-soft-bg,var(--color-base-100)))}}.btn-soft{--btn-border-style:solid;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn-ghost{--btn-bg:#0000;color:var(--btn-rest-fg,var(--btn-color,var(--color-base-content,currentColor)));--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.menu-title{color:var(--color-base-content);padding-block:.5rem;padding-inline:.75rem}@supports (color:color-mix(in lab, red, red)){.menu-title{color:color-mix(in oklab, var(--color-base-content) 40%, transparent)}}.menu-title{font-size:.875rem;font-weight:600}}@layer daisyui.l1.l2{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open{pointer-events:auto;visibility:visible;opacity:1;transition:visibility 0s allow-discrete, background-color .3s ease-out, opacity .1s ease-out;background-color:oklch(0% 0 0/.4)}.modal:popover-open .modal-box{opacity:1;translate:0;scale:1}:root:has(.modal:popover-open){--page-scroll-lock: }:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal) .modal-box{opacity:1;translate:0;scale:1}:root:has(:is(.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal)){--page-scroll-lock: }@starting-style{.modal.modal-open,.modal[open],.modal:target,.modal-toggle:checked+.modal{opacity:0}.modal:popover-open{opacity:0}}.tooltip>.tooltip-content,.tooltip[data-tip]:before{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-off) 50%}.tooltip:after{transform:translateX(var(--tt-trans,-50%)) translateY(var(--tt-pos,.25rem));inset:auto auto var(--tt-tail) 50%}.collapse-arrow>.collapse-title:after{width:.5rem;height:.5rem;display:block;position:absolute;transform:translateY(-100%)rotate(45deg)}@media (prefers-reduced-motion:no-preference){.collapse-arrow>.collapse-title:after{transition-property:all;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}}.collapse-arrow>.collapse-title:after{content:\\\"\\\";transform-origin:75% 75%;pointer-events:none;top:50%;inset-inline-end:1.4rem;box-shadow:2px 2px}@media (prefers-reduced-motion:no-preference){.collapse[open].collapse-arrow>.collapse-title:after,.collapse.collapse-open.collapse-arrow>.collapse-title:after{transform:translateY(-50%)rotate(225deg)}}.collapse.collapse-open.collapse-plus>.collapse-title:after{--tw-content:\\\"\u2212\\\";content:var(--tw-content)}:is(.collapse[tabindex].collapse-arrow:focus:not(.collapse-close),.collapse.collapse-arrow[tabindex]:focus-within:not(.collapse-close))>.collapse-title:after,.collapse.collapse-arrow:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{transform:translateY(-50%)rotate(225deg)}.collapse[open].collapse-plus>.collapse-title:after,.collapse[tabindex].collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse.collapse-plus:not(.collapse-close)>input:is([type=checkbox],[type=radio]):checked~.collapse-title:after{--tw-content:\\\"\u2212\\\";content:var(--tw-content)}.list .list-row:has(.list-col-grow:first-child){--list-grid-cols:1fr}.list .list-row:has(.list-col-grow:nth-child(2)){--list-grid-cols:minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(3)){--list-grid-cols:minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(4)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(5)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row:has(.list-col-grow:nth-child(6)){--list-grid-cols:minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) minmax(0, auto) 1fr}.list .list-row>*{grid-row-start:1}.input{--in-size-mul:10;--font-size-min:.875rem;--spin-my:-3}.floating-label:has(.input){--top-mul:5;--font-size:.875rem}.steps .step-neutral+.step-neutral:before,.steps .step-neutral:after,.steps .step-neutral>.step-icon{--step-bg:var(--color-neutral);--step-fg:var(--color-neutral-content)}.steps .step-primary+.step-primary:before,.steps .step-primary:after,.steps .step-primary>.step-icon{--step-bg:var(--color-primary);--step-fg:var(--color-primary-content)}.steps .step-secondary+.step-secondary:before,.steps .step-secondary:after,.steps .step-secondary>.step-icon{--step-bg:var(--color-secondary);--step-fg:var(--color-secondary-content)}.steps .step-accent+.step-accent:before,.steps .step-accent:after,.steps .step-accent>.step-icon{--step-bg:var(--color-accent);--step-fg:var(--color-accent-content)}.steps .step-info+.step-info:before,.steps .step-info:after,.steps .step-info>.step-icon{--step-bg:var(--color-info);--step-fg:var(--color-info-content)}.steps .step-success+.step-success:before,.steps .step-success:after,.steps .step-success>.step-icon{--step-bg:var(--color-success);--step-fg:var(--color-success-content)}.steps .step-warning+.step-warning:before,.steps .step-warning:after,.steps .step-warning>.step-icon{--step-bg:var(--color-warning);--step-fg:var(--color-warning-content)}.steps .step-error+.step-error:before,.steps .step-error:after,.steps .step-error>.step-icon{--step-bg:var(--color-error);--step-fg:var(--color-error-content)}.select{--sl-size-mul:10;--font-size-min:.875rem;--option-px:3}.floating-label:has(.select){--top-mul:5;--font-size:.875rem}.swap{cursor:pointer;vertical-align:middle;webkit-user-select:none;-webkit-user-select:none;user-select:none;place-content:center;display:inline-grid;position:relative}.swap input{appearance:none;border:none}.swap>*{grid-row-start:1;grid-column-start:1}@media (prefers-reduced-motion:no-preference){.swap>*{transition-property:transform,rotate,opacity;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1)}}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on,.swap input:is(:checked,:indeterminate)~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1;backface-visibility:visible}.checkbox:disabled,.radio:disabled{cursor:not-allowed;opacity:.2}.rating{--size:var(--size-selector,.25rem) * 6}.textarea{--font-size-min:.875rem}.floating-label:has(.textarea){--top-mul:5;--font-size:.875rem}:is(.stack,.stack.stack-bottom)>*{grid-area:3/3/6/4}:is(.stack,.stack.stack-bottom)>:nth-child(2){grid-area:2/2/5/5}:is(.stack,.stack.stack-bottom)>:first-child{grid-area:1/1/4/6}.stack.stack-top>*{grid-area:1/3/4/4}.stack.stack-top>:nth-child(2){grid-area:2/2/5/5}.stack.stack-top>:first-child{grid-area:3/1/6/6}.stack.stack-start>*{grid-area:3/1/4/4}.stack.stack-start>:nth-child(2){grid-area:2/2/5/5}.stack.stack-start>:first-child{grid-area:1/3/6/6}.stack.stack-end>*{grid-area:3/3/4/6}.stack.stack-end>:nth-child(2){grid-area:2/2/5/5}.stack.stack-end>:first-child{grid-area:1/1/6/4}.btn-square{width:var(--size);height:var(--size);padding-inline:0}.btn-block{width:100%}.loading-md{width:calc(var(--size-selector,.25rem) * 6)}.aura-glow{background-image:radial-gradient(closest-corner,currentColor 0%,#0000 90%);animation:none}.aura-glow:before{animation:aura-glow var(--tw-duration,6s) ease-out infinite}.aura-glow:after{animation:aura-glow-after var(--tw-duration,6s) ease-out infinite}.menu-sm :where(li:not(.menu-title)>:not(ul,menu,details,.menu-title)),.menu-sm :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--radius-field);padding-block:.25rem;padding-inline:.625rem;font-size:.75rem}.menu-sm .menu-title{padding-block:.5rem;padding-inline:.75rem}.badge-ghost{border-color:var(--color-base-200);background-color:var(--color-base-200);color:var(--color-base-content);background-image:none}.loading-spinner{-webkit-mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\");mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='8s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='6s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\")}@media (prefers-reduced-motion:no-preference){.loading-spinner{-webkit-mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\");mask-image:url(\\\"data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E\\\")}}.badge-sm{--size:calc(var(--size-selector,.25rem) * 5);font-size:.75rem}.badge-xs{--size:calc(var(--size-selector,.25rem) * 4);font-size:.625rem}.alert-error{color:var(--color-error-content);--alert-border-color:var(--color-error);--alert-color:var(--color-error)}.alert-info{color:var(--color-info-content);--alert-border-color:var(--color-info);--alert-color:var(--color-info)}.alert-warning{color:var(--color-warning-content);--alert-border-color:var(--color-warning);--alert-color:var(--color-warning)}.input-sm{--in-size-mul:8;--font-size-min:.75rem;--spin-my:-2}.floating-label:has(.input-sm){--top-mul:4;--font-size:.75rem}.select-sm{--sl-size-mul:8;--font-size-min:.75rem;--option-px:2.5}.floating-label:has(.select-sm){--top-mul:4;--font-size:.75rem}.btn-primary{--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content);--btn-soft-bg:initial}.btn-sm{--fontsize:.75rem;--btn-p:.75rem;--size:calc(var(--size-field,.25rem) * 8)}.badge-neutral{--badge-color:var(--color-neutral);--badge-fg:var(--color-neutral-content)}.badge-success{--badge-color:var(--color-success);--badge-fg:var(--color-success-content)}.card-border{border:var(--border) solid var(--color-base-200)}.input-error,.input-error:focus,.input-error:focus-within{--input-color:var(--color-error)}}@layer daisyui.l1{.btn:where(:checked:not(.filter [type=radio].btn)){--btn-color:var(--color-primary);--btn-fg:var(--color-primary-content)}@media (hover:hover){.btn:hover{--btn-bg:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}.btn:hover{color:var(--btn-fg);--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:hover{--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:hover{--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}}.btn:active:not(.btn-active){--btn-bg:var(--btn-color,var(--color-base-200));translate:0 .5px}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-bg:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 5%)}}.btn:active:not(.btn-active){color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-color,var(--color-base-200))}@supports (color:color-mix(in lab, red, red)){.btn:active:not(.btn-active){--btn-border:color-mix(in oklab, var(--btn-color,var(--color-base-200)), #000 7%)}}.btn:active:not(.btn-active){--btn-border-style:solid;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0)}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-bg:var(--btn-color,var(--color-base-200));color:var(--btn-fg,var(--color-base-content));--btn-border:var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border:color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%))}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-border-style:solid;--btn-inset:0 .5px 0 .5px oklch(100% 0 0 / calc(var(--depth) * 6%));--btn-shadow:0 3px 2px -2px var(--btn-bg), 0 4px 3px -2px var(--btn-bg)}@supports (color:color-mix(in lab, red, red)){.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){--btn-shadow:0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000)}}.btn:where(:checked:not(.filter [type=radio].btn),:not([type=radio],[type=checkbox]):focus-visible){isolation:isolate}.btn:focus-visible,.btn:has(:focus-visible){isolation:isolate;outline-width:2px;outline-style:solid}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]):not(:focus-visible){visibility:hidden}.filter:not(:has(:checked:not(.filter-reset))) :is(.filter-reset,[type=reset]):not(:focus-visible),.filter:not(:has(:focus-visible)):has(:checked:not(.filter-reset,[type=checkbox])) :is(input,button):not(:checked,.filter-reset,[type=reset]){opacity:0;border-width:0;width:0;margin-inline:0;padding-inline:0;scale:0}.alert-soft{color:var(--alert-color,var(--color-base-content));background:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.alert-soft{background:color-mix(in oklab, var(--alert-color,var(--color-base-content)) 8%, var(--color-base-100))}}.alert-soft{--alert-border-color:var(--alert-color,var(--color-base-content))}@supports (color:color-mix(in lab, red, red)){.alert-soft{--alert-border-color:color-mix(in oklab, var(--alert-color,var(--color-base-content)) 10%, var(--color-base-100))}}.alert-soft{box-shadow:none;background-image:none}}@layer daisyui{.btn:is(:disabled,[disabled],[aria-disabled=true]){pointer-events:none;color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]){color:color-mix(in oklch, var(--color-base-content) 20%, #0000)}}.btn:is(:disabled,[disabled],[aria-disabled=true]){--btn-bg:#0000;--btn-border:#0000;--btn-inset:0 0 0 0 oklch(0% 0 0/0);--btn-shadow:0 0 0 0 oklch(0% 0 0/0);background-image:none}.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.btn:is(:disabled,[disabled],[aria-disabled=true]):not(.btn-link,.btn-ghost){background-color:color-mix(in oklab, var(--color-base-content) 10%, transparent)}}}.pointer-events-none{pointer-events:none}.countdown.countdown{line-height:1em}.collapse:not(td,tr,colgroup){visibility:revert-layer}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}@layer daisyui.l1.l2.l3.l4{.card figure:first-child{border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-end-radius:unset;border-end-start-radius:unset;overflow:hidden}.card figure:last-child{border-start-start-radius:unset;border-start-end-radius:unset;border-end-end-radius:inherit;border-end-start-radius:inherit;overflow:hidden}.card figure{justify-content:center;align-items:center;display:flex}}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.join{--join-ss:0;--join-se:0;--join-es:0;--join-ee:0;--join-v:0;--join-h:1;align-items:stretch;display:inline-flex}@scope(.join){:scope>:where(:focus,:has(:focus)){z-index:1}@media (hover:hover){:scope>:where(.btn:hover,:has(.btn:hover)){isolation:isolate}}:scope :where(:scope>:first-child){--join-ss:var(--radius-field);--join-se:calc(var(--radius-field) * var(--join-v));--join-es:calc(var(--radius-field) * var(--join-h));--join-ee:0}:scope :where(:scope>:last-child){--join-ss:0;--join-se:calc(var(--radius-field) * var(--join-h));--join-es:calc(var(--radius-field) * var(--join-v));--join-ee:var(--radius-field)}:scope :where(:scope>:only-child){--join-ss:var(--radius-field);--join-se:var(--radius-field);--join-es:var(--radius-field);--join-ee:var(--radius-field)}}.z-10{z-index:10}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:0}.mt-0{margin-top:0}.mt-0\\\\.5{margin-top:calc(var(--spacing) * .5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.alert{border-width:var(--border);border-color:var(--alert-border-color,var(--color-base-200))}:root .prose{--tw-prose-body:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-body:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose{--tw-prose-headings:var(--color-base-content);--tw-prose-lead:var(--color-base-content);--tw-prose-links:var(--color-base-content);--tw-prose-bold:var(--color-base-content);--tw-prose-counters:var(--color-base-content);--tw-prose-bullets:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-bullets:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-hr:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-hr:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-quotes:var(--color-base-content);--tw-prose-quote-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-quote-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-captions:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-captions:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-code:var(--color-base-content);--tw-prose-pre-code:var(--color-neutral-content);--tw-prose-pre-bg:var(--color-neutral);--tw-prose-th-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-th-borders:color-mix(in oklab, var(--color-base-content) 50%, #0000)}}:root .prose{--tw-prose-td-borders:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-td-borders:color-mix(in oklab, var(--color-base-content) 20%, #0000)}}:root .prose{--tw-prose-kbd:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){:root .prose{--tw-prose-kbd:color-mix(in oklab, var(--color-base-content) 80%, #0000)}}:root .prose :where(code):not(pre>code){background-color:var(--color-base-200);border-radius:var(--radius-selector);border:var(--border) solid var(--color-base-300);font-weight:inherit;padding-block:.2em;padding-inline:.5em}:root .prose :where(code):not(pre>code):before,:root .prose :where(code):not(pre>code):after{display:none}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-\\\\[52px\\\\]{width:52px;height:52px}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.h-full{height:100%}.max-h-\\\\[min\\\\(66vh\\\\,720px\\\\)\\\\]{max-height:min(66vh,720px)}.min-h-0{min-height:0}.min-h-6{min-height:calc(var(--spacing) * 6)}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-\\\\[120px\\\\]{min-height:120px}.w-\\\\[min\\\\(148px\\\\,38cqw\\\\)\\\\]{width:min(148px,38cqw)}.w-\\\\[min\\\\(208px\\\\,100\\\\%\\\\)\\\\]{width:min(208px,100%)}.w-auto{width:auto}.w-full{width:100%}.max-w-\\\\[min\\\\(148px\\\\,38cqw\\\\)\\\\]{max-width:min(148px,38cqw)}.max-w-\\\\[min\\\\(440px\\\\,100\\\\%\\\\)\\\\]{max-width:min(440px,100%)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-\\\\[min\\\\(240px\\\\,100\\\\%\\\\)\\\\]{min-width:min(240px,100%)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\\\\[1fr_auto\\\\]{grid-template-columns:1fr auto}.grid-cols-\\\\[auto_minmax\\\\(0\\\\,1fr\\\\)\\\\]{grid-template-columns:auto minmax(0,1fr)}.grid-cols-\\\\[minmax\\\\(0\\\\,1fr\\\\)_auto\\\\]{grid-template-columns:minmax(0,1fr) auto}.grid-cols-\\\\[repeat\\\\(auto-fit\\\\,minmax\\\\(min\\\\(100\\\\%\\\\,10rem\\\\)\\\\,1fr\\\\)\\\\)\\\\]{grid-template-columns:repeat(auto-fit,minmax(min(100%,10rem),1fr))}.grid-rows-\\\\[0fr\\\\]{grid-template-rows:0fr}.grid-rows-\\\\[1fr\\\\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-start{justify-items:start}.gap-0{gap:0}.gap-0\\\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\\\\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\\\\.5{row-gap:calc(var(--spacing) * 1.5)}.justify-self-center{justify-self:center}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--radius-box);border-radius:var(--radius-box)}.rounded-field{border-radius:var(--radius-field);border-radius:var(--radius-field)}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-base-300{border-color:var(--color-base-300)}.border-base-content,.border-base-content\\\\/15{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\\\/15{border-color:color-mix(in oklab, var(--color-base-content) 15%, transparent)}}.border-base-content\\\\/20{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\\\/20{border-color:color-mix(in oklab, var(--color-base-content) 20%, transparent)}}.border-base-content\\\\/25{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\\\/25{border-color:color-mix(in oklab, var(--color-base-content) 25%, transparent)}}.border-base-content\\\\/30{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.border-base-content\\\\/30{border-color:color-mix(in oklab, var(--color-base-content) 30%, transparent)}}.border-info,.border-info\\\\/40{border-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.border-info\\\\/40{border-color:color-mix(in oklab, var(--color-info) 40%, transparent)}}.border-primary{border-color:var(--color-primary)}.border-secondary{border-color:var(--color-secondary)}.border-success,.border-success\\\\/40{border-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.border-success\\\\/40{border-color:color-mix(in oklab, var(--color-success) 40%, transparent)}}.border-warning,.border-warning\\\\/40{border-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\\\\/40{border-color:color-mix(in oklab, var(--color-warning) 40%, transparent)}}.bg-base-100{background-color:var(--color-base-100)}.bg-base-200{background-color:var(--color-base-200)}.bg-info,.bg-info\\\\/10{background-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.bg-info\\\\/10{background-color:color-mix(in oklab, var(--color-info) 10%, transparent)}}.bg-primary,.bg-primary\\\\/10{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\\\/10{background-color:color-mix(in oklab, var(--color-primary) 10%, transparent)}}.bg-secondary,.bg-secondary\\\\/10{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.bg-secondary\\\\/10{background-color:color-mix(in oklab, var(--color-secondary) 10%, transparent)}}.bg-success,.bg-success\\\\/10{background-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.bg-success\\\\/10{background-color:color-mix(in oklab, var(--color-success) 10%, transparent)}}.bg-warning,.bg-warning\\\\/10{background-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\\\\/10{background-color:color-mix(in oklab, var(--color-warning) 10%, transparent)}}.bg-white{background-color:var(--color-white)}.stroke-current{stroke:currentColor}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\\\\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\\\\[0\\\\.65rem\\\\]{font-size:.65rem}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.text-base-content,.text-base-content\\\\/55{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\\\/55{color:color-mix(in oklab, var(--color-base-content) 55%, transparent)}}.text-base-content\\\\/60{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\\\/60{color:color-mix(in oklab, var(--color-base-content) 60%, transparent)}}.text-base-content\\\\/65{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\\\/65{color:color-mix(in oklab, var(--color-base-content) 65%, transparent)}}.text-base-content\\\\/70{color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.text-base-content\\\\/70{color:color-mix(in oklab, var(--color-base-content) 70%, transparent)}}.text-error{color:var(--color-error)}.text-info-content{color:var(--color-info-content)}.text-success{color:var(--color-success)}.text-success-content{color:var(--color-success-content)}.text-warning{color:var(--color-warning)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.prose :where(a.btn:not(.btn-link)):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration-line:none}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-info,.ring-info\\\\/50{--tw-ring-color:var(--color-info)}@supports (color:color-mix(in lab, red, red)){.ring-info\\\\/50{--tw-ring-color:color-mix(in oklab, var(--color-info) 50%, transparent)}}.ring-primary,.ring-primary\\\\/30{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\\\\/30{--tw-ring-color:color-mix(in oklab, var(--color-primary) 30%, transparent)}}.ring-primary\\\\/50{--tw-ring-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.ring-primary\\\\/50{--tw-ring-color:color-mix(in oklab, var(--color-primary) 50%, transparent)}}.ring-secondary,.ring-secondary\\\\/50{--tw-ring-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.ring-secondary\\\\/50{--tw-ring-color:color-mix(in oklab, var(--color-secondary) 50%, transparent)}}.ring-success,.ring-success\\\\/50{--tw-ring-color:var(--color-success)}@supports (color:color-mix(in lab, red, red)){.ring-success\\\\/50{--tw-ring-color:color-mix(in oklab, var(--color-success) 50%, transparent)}}.ring-warning,.ring-warning\\\\/50{--tw-ring-color:var(--color-warning)}@supports (color:color-mix(in lab, red, red)){.ring-warning\\\\/50{--tw-ring-color:color-mix(in oklab, var(--color-warning) 50%, transparent)}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\\\[grid-template-rows\\\\,opacity\\\\,margin\\\\]{transition-property:grid-template-rows,opacity,margin;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.outline-none\\\\!{--tw-outline-style:none!important;outline-style:none!important}.select-all{-webkit-user-select:all;user-select:all}@media (hover:hover){.hover\\\\:border-base-content\\\\/45:hover{border-color:var(--color-base-content)}@supports (color:color-mix(in lab, red, red)){.hover\\\\:border-base-content\\\\/45:hover{border-color:color-mix(in oklab, var(--color-base-content) 45%, transparent)}}.hover\\\\:border-primary:hover{border-color:var(--color-primary)}.hover\\\\:bg-base-100:hover{background-color:var(--color-base-100)}}.focus\\\\:outline-offset-0\\\\!:focus{outline-offset:0px!important}.focus\\\\:outline-none\\\\!:focus{--tw-outline-style:none!important;outline-style:none!important}.focus-visible\\\\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\\\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\\\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\\\\:outline-primary:focus-visible{outline-color:var(--color-primary)}@media (prefers-reduced-motion:reduce){.motion-reduce\\\\:transition-none{transition-property:none}}@container methods (min-width:18rem){.\\\\@min-\\\\[18rem\\\\]\\\\/methods\\\\:block{display:block}.\\\\@min-\\\\[18rem\\\\]\\\\/methods\\\\:hidden{display:none}.\\\\@min-\\\\[18rem\\\\]\\\\/methods\\\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@container openreceive (min-width:40rem){.\\\\@sm\\\\/openreceive\\\\:size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.\\\\@sm\\\\/openreceive\\\\:gap-3{gap:calc(var(--spacing) * 3)}}@container (min-width:40rem){.\\\\@sm\\\\:p-5{padding:calc(var(--spacing) * 5)}.\\\\@sm\\\\:px-5{padding-inline:calc(var(--spacing) * 5)}.\\\\@sm\\\\:py-4{padding-block:calc(var(--spacing) * 4)}}@container openreceive (min-width:40rem){.\\\\@sm\\\\/openreceive\\\\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}}@container (min-width:40rem){.\\\\@sm\\\\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@container (min-width:48rem){.\\\\@md\\\\:col-span-1{grid-column:span 1/span 1}.\\\\@md\\\\:w-\\\\[min\\\\(200px\\\\,36cqw\\\\)\\\\]{width:min(200px,36cqw)}.\\\\@md\\\\:w-auto{width:auto}.\\\\@md\\\\:max-w-\\\\[min\\\\(200px\\\\,36cqw\\\\)\\\\]{max-width:min(200px,36cqw)}}@container openreceive (min-width:48rem){.\\\\@md\\\\/openreceive\\\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (min-width:48rem){.\\\\@md\\\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\\\\@md\\\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\\\\@md\\\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\\\\@md\\\\:grid-cols-\\\\[auto_minmax\\\\(0\\\\,1fr\\\\)\\\\]{grid-template-columns:auto minmax(0,1fr)}.\\\\@md\\\\:grid-cols-\\\\[minmax\\\\(0\\\\,1fr\\\\)_auto_auto\\\\]{grid-template-columns:minmax(0,1fr) auto auto}.\\\\@md\\\\:items-start{align-items:flex-start}.\\\\@md\\\\:gap-x-2{column-gap:calc(var(--spacing) * 2)}.\\\\@md\\\\:gap-x-5{column-gap:calc(var(--spacing) * 5)}.\\\\@md\\\\:gap-y-1{row-gap:var(--spacing)}.\\\\@md\\\\:justify-self-end{justify-self:flex-end}.\\\\@md\\\\:justify-self-start{justify-self:flex-start}.\\\\@md\\\\:text-left{text-align:left}}@container openreceive (min-width:64rem){.\\\\@lg\\\\/openreceive\\\\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\\\\@lg\\\\/openreceive\\\\:grid-cols-\\\\[9rem_minmax\\\\(0\\\\,1fr\\\\)_minmax\\\\(8rem\\\\,auto\\\\)\\\\]{grid-template-columns:9rem minmax(0,1fr) minmax(8rem,auto)}.\\\\@lg\\\\/openreceive\\\\:items-start{align-items:flex-start}}.\\\\[\\\\&_svg\\\\]\\\\:block svg{display:block}.\\\\[\\\\&_svg\\\\]\\\\:h-auto svg{height:auto}.\\\\[\\\\&_svg\\\\]\\\\:w-\\\\[min\\\\(208px\\\\,100\\\\%\\\\)\\\\] svg{width:min(208px,100%)}.\\\\[\\\\&_svg\\\\]\\\\:w-full svg{width:100%}}:host{display:block}:host([hidden]){display:none}@keyframes dropdown{0%{opacity:0}}@keyframes rotator{89.9999%,to{--first-item-position:0 0%}90%,99.9999%{--first-item-position:0 calc(var(--items) * 100%)}to{translate:0 -100%}}@keyframes radio{0%{padding:5px}50%{padding:3px}}@keyframes toast{0%{opacity:0;scale:.9}to{opacity:1;scale:1}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}@keyframes progress{50%{background-position-x:-115%}}@keyframes rating{0%,40%{filter:brightness(1.05)contrast(1.05);scale:1.1}}@keyframes aura{to{--aura-angle:360deg;transform:translateZ(1px)}}@keyframes aura-glow{20%,80%{opacity:.7;filter:blur(.25rem)}50%{opacity:1;filter:blur(.75rem)}}@keyframes aura-glow-after{20%,80%{opacity:.3;filter:blur(1rem)}50%{opacity:.6;filter:blur(1.5rem)}}@keyframes menu{0%{opacity:0}}@property --tw-rotate-x{syntax:\\\"*\\\";inherits:false}@property --tw-rotate-y{syntax:\\\"*\\\";inherits:false}@property --tw-rotate-z{syntax:\\\"*\\\";inherits:false}@property --tw-skew-x{syntax:\\\"*\\\";inherits:false}@property --tw-skew-y{syntax:\\\"*\\\";inherits:false}@property --tw-border-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\\\"*\\\";inherits:false}@property --tw-font-weight{syntax:\\\"*\\\";inherits:false}@property --tw-tracking{syntax:\\\"*\\\";inherits:false}@property --tw-ordinal{syntax:\\\"*\\\";inherits:false}@property --tw-slashed-zero{syntax:\\\"*\\\";inherits:false}@property --tw-numeric-figure{syntax:\\\"*\\\";inherits:false}@property --tw-numeric-spacing{syntax:\\\"*\\\";inherits:false}@property --tw-numeric-fraction{syntax:\\\"*\\\";inherits:false}@property --tw-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\\\"*\\\";inherits:false}@property --tw-ring-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\\\"*\\\";inherits:false}@property --tw-inset-ring-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\\\"*\\\";inherits:false}@property --tw-ring-offset-width{syntax:\\\"<length>\\\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\\\"*\\\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\\\"*\\\";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:\\\"*\\\";inherits:false}@property --tw-brightness{syntax:\\\"*\\\";inherits:false}@property --tw-contrast{syntax:\\\"*\\\";inherits:false}@property --tw-grayscale{syntax:\\\"*\\\";inherits:false}@property --tw-hue-rotate{syntax:\\\"*\\\";inherits:false}@property --tw-invert{syntax:\\\"*\\\";inherits:false}@property --tw-opacity{syntax:\\\"*\\\";inherits:false}@property --tw-saturate{syntax:\\\"*\\\";inherits:false}@property --tw-sepia{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow-color{syntax:\\\"*\\\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\\\"<percentage>\\\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\\\"*\\\";inherits:false}@property --tw-duration{syntax:\\\"*\\\";inherits:false}@property --tw-ease{syntax:\\\"*\\\";inherits:false}@property --tw-outline-style{syntax:\\\"*\\\";inherits:false;initial-value:solid}\";\n", "/**\n * Shared daisyUI / Tailwind class strings for OpenReceive checkout UI.\n * Kept as string constants so Tailwind can scan them for the prebuilt stylesheet.\n */\n\nexport const orClasses = {\n /**\n * The drop-in's own box. It is a size QUERY CONTAINER (container-type: inline-size): every\n * `@sm:` / `@md:` / `@lg:` variant below keys on this element's inline size,\n * never on the viewport \u2014 the host decides how wide the checkout is, and a\n * 560px card on a 1280px page must lay out like a 560px screen. The rem\n * breakpoints are the viewport ones (see styles.source.css). daisyUI paints\n * the theme's base-100 on this root, so it pads and rounds itself too: a\n * painted surface with content flush against its edges is never right. No\n * container variant may appear on THIS string \u2014 a container cannot query\n * itself.\n */\n root: \"grid gap-3 min-w-0 rounded-box p-4 @container/openreceive\",\n /**\n * What the payer is buying, above the amount. Present only when the host\n * returned a `description` from its amount hook \u2014 the checkout renders the\n * total and never the order, so this is the one line of order context the\n * default path has.\n */\n orderDescription: \"text-base font-semibold leading-snug m-0 min-w-0\",\n paymentLayout:\n \"grid gap-3 grid-cols-[auto_minmax(0,1fr)] gap-x-3 @md:gap-x-5 items-start min-w-0\",\n paymentLayoutExpired: \"grid gap-3 grid-cols-1 items-start min-w-0\",\n lightningPane: \"grid gap-2 items-start justify-items-start min-w-0\",\n qr: \"justify-self-start w-[min(148px,38cqw)] @md:w-[min(200px,36cqw)] [&_svg]:block [&_svg]:w-full [&_svg]:h-auto\",\n satsDetail:\n \"text-base-content/60 text-sm leading-snug justify-self-start max-w-[min(148px,38cqw)] @md:max-w-[min(200px,36cqw)]\",\n invoiceTitle: \"m-0 text-sm font-semibold leading-tight\",\n paymentInfo: \"grid gap-1.5 min-w-0 content-start\",\n meta: \"flex flex-wrap gap-1.5 items-center\",\n metaItem: \"badge badge-ghost badge-sm min-h-6\",\n stateSettled: \"badge badge-success badge-sm\",\n statePending: \"badge badge-ghost badge-sm\",\n actions: \"flex flex-wrap gap-2 justify-start\",\n btn: \"btn btn-outline\",\n btnGhost: \"btn btn-ghost\",\n copyIcon: \"shrink-0 size-4\",\n themeToggle: \"btn btn-outline btn-sm gap-2 justify-self-end\",\n paymentStatus: \"flex items-center gap-2.5 min-w-0\",\n paymentStatusBody: \"grid gap-0.5 min-w-0 flex-1\",\n paymentStatusTitle: \"text-base font-semibold leading-tight min-w-0\",\n paymentStatusDetail: \"text-base-content/60 text-sm leading-snug\",\n spinner: \"loading loading-spinner loading-md text-warning\",\n /** Spinner on a primary button \u2014 inherit the button foreground, not the warning color. */\n continueSpinner: \"loading loading-spinner loading-md shrink-0\",\n settledIcon: \"size-8 shrink-0 text-success\",\n countdown: \"text-base-content/60 text-sm\",\n countdownStrong: \"text-base-content font-semibold\",\n /** The spinner/notice body of the creating, minting and create-error screens; sits inside `root`, which pads. */\n creating: \"grid gap-2 place-items-center\",\n wizard: \"overflow-hidden rounded-box border border-base-content/20 bg-base-200 grid gap-0\",\n wizardHeader: \"grid gap-0.5 p-3 @sm:px-5 @sm:py-4\",\n wizardHeaderTitle: \"text-lg font-bold m-0 @sm:text-xl\",\n wizardHeaderSubtitle: \"text-base-content/65 text-sm m-0 mt-0.5\",\n wizardBody: \"border-t border-base-content/15 grid gap-3 p-4 @sm:p-5\",\n // Measure the space available to the tiles after all host and panel padding.\n // Keep the grid and its full-width network reveal on the same breakpoint.\n methodBody: \"border-t border-base-content/15 grid gap-3 p-3 @sm:p-5 @container/methods\",\n methodGrid:\n \"grid grid-cols-1 items-stretch gap-2 @min-[18rem]/methods:grid-cols-2 @sm/openreceive:gap-3 @md/openreceive:grid-cols-3 @lg/openreceive:grid-cols-4\",\n methodCardUnavailable:\n \"flex h-full min-h-24 min-w-0 w-full flex-col items-center justify-start gap-1.5 rounded-box border border-base-content/20 bg-base-100 px-2.5 py-3 text-center text-base-content opacity-50 cursor-not-allowed shadow-sm\",\n methodCurrenciesLoading:\n \"col-span-full flex min-h-24 w-full flex-col items-center justify-center gap-2 rounded-box border border-dashed border-base-content/25 bg-base-100 px-2.5 py-3 text-center text-base-content/70 shadow-sm\",\n methodCardReady:\n \"flex h-full min-h-24 min-w-0 w-full flex-col items-center justify-start gap-1.5 rounded-box border border-base-content/20 bg-base-100 px-2.5 py-3 text-center text-base-content shadow-sm transition-colors hover:border-base-content/45 hover:bg-base-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary cursor-pointer\",\n methodCardActiveBitcoin: \"border-warning bg-warning/10 ring-1 ring-warning/50\",\n methodCardActiveUsdt: \"border-success bg-success/10 ring-1 ring-success/50\",\n methodCardActiveUsdc: \"border-info bg-info/10 ring-1 ring-info/50\",\n methodCardActiveSol: \"border-primary bg-primary/10 ring-1 ring-primary/50\",\n methodCardActiveEth: \"border-secondary bg-secondary/10 ring-1 ring-secondary/50\",\n methodCardActiveDefault: \"border-primary bg-primary/10 ring-1 ring-primary/50\",\n methodIconWrap:\n \"grid size-8 shrink-0 place-items-center overflow-hidden rounded-full @sm/openreceive:size-10\",\n methodIcon: \"size-8 aspect-square @sm/openreceive:size-10\",\n methodTitle: \"block whitespace-normal break-words font-bold text-sm @sm/openreceive:text-base\",\n methodTitleWrap: \"min-w-0 w-full text-center\",\n methodDetail: \"text-base-content/60 text-xs leading-snug\",\n /**\n * The line under a tile's name: what the Bitcoin tile is, or the networks a\n * coin can arrive on. Visible at EVERY width \u2014 a grid of five bare coin names\n * is a grid of five questions, and the answer is one short line long.\n */\n methodTileDetail: \"block whitespace-normal break-words text-xs leading-snug text-base-content/60\",\n /** Limit / unavailable hint under a payment tile \u2014 visible at all breakpoints. */\n methodLimitHint: \"block px-1 text-center text-xs leading-snug text-base-content/55\",\n methodNetworkReveal: \"rounded-box border border-base-content/20 bg-base-100 p-3\",\n methodNetworkRevealDesktop: \"hidden @min-[18rem]/methods:block\",\n methodNetworkRevealMobile: \"border-l border-base-content/30 pl-2 @min-[18rem]/methods:hidden\",\n methodNetworkRevealMobileUsdt: \"border-l border-success/40 pl-2 @min-[18rem]/methods:hidden\",\n methodNetworkRevealMobileUsdc: \"border-l border-info/40 pl-2 @min-[18rem]/methods:hidden\",\n methodNetworkRevealAnim:\n \"grid overflow-hidden transition-[grid-template-rows,opacity,margin] duration-200 ease-out motion-reduce:transition-none @min-[18rem]/methods:hidden\",\n methodNetworkRevealAnimOpen: \"mt-2 grid-rows-[1fr] opacity-100\",\n methodNetworkRevealAnimClosed: \"grid-rows-[0fr] opacity-0\",\n methodNetworkRevealInner: \"min-h-0 overflow-hidden\",\n methodNetworkLayout:\n \"grid gap-3 @lg/openreceive:grid-cols-[9rem_minmax(0,1fr)_minmax(8rem,auto)] @lg/openreceive:items-start\",\n methodNetworkHeading: \"break-words text-sm font-semibold text-base-content m-0\",\n methodNetworkHint: \"break-words mt-0.5 text-xs text-base-content/55 m-0\",\n methodNetworkGrid:\n \"grid grid-cols-[repeat(auto-fit,minmax(min(100%,10rem),1fr))] gap-2 items-start\",\n methodNetworkButton:\n \"btn h-auto min-h-11 min-w-0 w-full flex-wrap justify-start gap-2 rounded-field border border-base-content/25 bg-base-100 px-3 py-2 text-sm text-base-content shadow-sm hover:border-base-content/45 hover:bg-base-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary\",\n methodNetworkButtonUnavailable:\n \"btn h-auto min-h-11 min-w-0 w-full flex-wrap justify-start gap-2 rounded-field border border-base-content/20 bg-base-100 px-3 py-2 text-sm text-base-content opacity-50 cursor-not-allowed shadow-sm pointer-events-none\",\n methodNetworkLabel: \"min-w-0 whitespace-normal break-words text-left\",\n methodNetworkButtonActiveUsdt: \"border-success bg-success/10 ring-1 ring-success/50\",\n methodNetworkButtonActiveUsdc: \"border-info bg-info/10 ring-1 ring-info/50\",\n methodNetworkButtonActiveDefault: \"border-primary bg-primary/10 ring-1 ring-primary/50\",\n methodNetworkIcon: \"size-6 shrink-0 aspect-square\",\n methodNetworkCheck:\n \"ml-auto grid size-5 place-items-center rounded-full bg-success text-[0.65rem] text-success-content\",\n methodNetworkCheckUsdc:\n \"ml-auto grid size-5 place-items-center rounded-full bg-info text-[0.65rem] text-info-content\",\n methodNetworkSummary: \"mt-2 flex flex-wrap items-center gap-1.5 text-xs text-base-content/65 m-0\",\n methodNetworkSummaryIcon:\n \"grid size-4 place-items-center rounded-full bg-success text-[0.65rem] text-success-content\",\n methodNetworkSummaryIconUsdc:\n \"grid size-4 place-items-center rounded-full bg-info text-[0.65rem] text-info-content\",\n methodConfirmDesktop:\n \"btn btn-primary h-auto min-h-11 min-w-0 w-full whitespace-normal break-words gap-2 px-2 py-2\",\n methodTile: \"grid h-full min-w-0 content-start gap-0.5\",\n breadcrumbs: \"breadcrumbs text-sm\",\n breadcrumbCurrent: \"font-bold\",\n routePicker: \"grid grid-cols-2 @md:grid-cols-4 gap-2\",\n routeButton:\n \"card card-border bg-base-100 grid gap-1.5 content-start min-h-[120px] p-2.5 text-left cursor-pointer hover:border-primary\",\n routeButtonSelected:\n \"card card-border bg-base-100 grid gap-1.5 content-start min-h-[120px] p-2.5 text-left border-primary ring-2 ring-primary/30\",\n wizardResults: \"grid gap-2.5\",\n wizardEmpty: \"alert\",\n wizardRoute: \"grid gap-3\",\n wizardRouteHeading: \"flex flex-wrap items-center gap-2\",\n providerGrid: \"grid grid-cols-1 @md:grid-cols-2 gap-2\",\n providerCard:\n \"card card-border bg-base-100 p-3 grid gap-2 items-center grid-cols-[minmax(0,1fr)_auto] @md:grid-cols-[minmax(0,1fr)_auto_auto] @md:gap-x-2 @md:gap-y-1\",\n providerHeading: \"flex gap-2 items-center min-w-0\",\n providerIcon: \"rounded size-7 shrink-0\",\n providerName: \"font-semibold truncate m-0 min-w-0\",\n providerKind: \"text-base-content/60 text-sm m-0 justify-self-end text-right\",\n providerActions: \"col-span-2 flex w-full @md:col-span-1 @md:w-auto @md:justify-self-end\",\n providerOpen: \"btn btn-outline btn-sm w-full @md:w-auto\",\n swapActions: \"grid gap-2.5 grid-cols-1 @md:grid-cols-3\",\n swapAction: \"grid gap-2\",\n swapEstimate: \"text-base-content/60 m-0 text-sm\",\n swapWarning: \"alert alert-warning text-sm\",\n swapNetworkWarning: \"alert alert-error alert-soft text-sm items-start gap-3\",\n /**\n * Same deposit heading on a rail whose address format pins both the chain and\n * the asset (`SwapDepositRisk` \"pinned\"): identical layout, no alarm colour\n * and no warning triangle. A red banner on every rail is read on none.\n */\n swapNetworkNotice: \"alert alert-soft text-sm items-start gap-3\",\n swapNetworkWarningIcon: \"size-6 shrink-0 stroke-current\",\n swapNetworkWarningContent: \"grid gap-1 min-w-0 w-full\",\n swapNetworkWarningTitle: \"font-bold m-0\",\n swapNetworkWarningBody: \"m-0\",\n swapNetworkWarningEmphasis: \"font-bold underline\",\n swapProgress: \"text-base-content/60 m-0\",\n swapInstruction: \"m-0 text-base-content text-base font-bold text-center @md:text-left\",\n swapStart: \"btn btn-outline\",\n swapPanel: \"grid gap-3\",\n swapDepositLayout:\n \"grid gap-3 @md:grid-cols-[auto_minmax(0,1fr)] @md:gap-x-5 @md:items-start min-w-0\",\n swapDepositSide: \"grid gap-3 min-w-0 content-start\",\n swapHeading: \"flex flex-wrap gap-2 items-center justify-between\",\n /**\n * The heading on the three refund states. Same content as `swapHeading`, in\n * an alert: \"Refund needed\" is not a section title, it is the payer being\n * told their money did not go where they sent it for.\n */\n swapRefundHeading: \"alert alert-error alert-soft items-start gap-3 text-left\",\n /**\n * The return callout, which sits ABOVE the refund form rather than under the\n * support details. It is the sentence that decides whether the payer can come\n * back at all, and a payer who has to leave for an address in another wallet\n * reads it before they go, not after they scroll past the form.\n */\n swapRefundReturn: \"alert alert-warning alert-soft items-start gap-3 text-left\",\n swapRefundReturnTitle: \"font-bold m-0\",\n swapRefundReturnBody: \"m-0 font-semibold\",\n swapHeadingTitle: \"text-lg font-semibold\",\n swapHeadingDetail: \"text-base-content/60\",\n swapQr: \"block h-auto w-[min(208px,100%)]\",\n /**\n * The white card the code sits on. A QR is only scannable against white, and a\n * bare code floating on the panel background reads as an artifact of the page\n * rather than the thing to point a phone at.\n */\n swapQrFrame:\n \"grid place-items-center justify-self-center rounded-box border border-base-content/15 bg-white p-3 @md:justify-self-start [&_svg]:block [&_svg]:h-auto [&_svg]:w-[min(208px,100%)]\",\n swapDetails: \"grid gap-2 m-0\",\n swapDetailsDt: \"text-base-content/60 text-xs font-bold uppercase\",\n swapDetailsDd: \"grid gap-2 grid-cols-[minmax(0,1fr)_auto] items-center m-0\",\n swapDetailsCode: \"min-w-0 break-all font-mono text-sm\",\n // Readonly select-all fields: keep the quiet resting border, suppress daisyUI's\n // focus outline+offset which otherwise reads as a double ring around selected text.\n swapDetailsInput:\n \"input input-sm w-full min-w-0 font-mono text-sm outline-none! focus:outline-none! focus:outline-offset-0!\",\n swapDetailsActions: \"flex flex-wrap gap-2 justify-end\",\n detailCopy: \"btn btn-sm btn-square btn-ghost\",\n swapDetailsLink: \"btn btn-sm btn-outline\",\n swapBreakdown: \"grid gap-2 rounded-box border border-base-content/15 bg-base-100 px-3 py-2.5\",\n swapBreakdownTitle: \"m-0 text-base-content/60 text-xs font-bold uppercase\",\n swapBreakdownRows: \"grid grid-cols-[1fr_auto] gap-x-3 gap-y-1.5 items-baseline m-0\",\n swapWaitingTitle: \"flex items-baseline justify-between gap-3 min-w-0\",\n swapCountdown: \"shrink-0 text-base-content font-semibold tabular-nums\",\n swapBack: \"btn btn-sm btn-outline justify-self-start\",\n swapSupport: \"collapse collapse-arrow bg-base-200\",\n swapSupportTitle: \"collapse-title font-bold min-h-0 py-2\",\n swapSupportContent: \"collapse-content\",\n transactionDetails: \"collapse collapse-arrow bg-base-200\",\n transactionDetailsTitle: \"collapse-title font-bold min-h-0 py-2\",\n transactionDetailsContent: \"collapse-content\",\n swapRefund: \"grid gap-2 rounded-box border border-base-content/15 bg-base-100 px-3 py-2.5\",\n /** Section titles inside a card: the breakdown, the refund form, the keep-this note. */\n swapSectionTitle: \"m-0 text-base-content/60 text-xs font-bold uppercase tracking-wide\",\n swapRefundReason: \"m-0 text-base-content/60 text-sm\",\n swapRefundInstruction: \"m-0 text-sm\",\n /**\n * What the provider says about the money \u2014 sent, expected, coming back \u2014 as a\n * quiet fact table. Not copy rows: nobody pastes \"0.04 SOL\" anywhere, and a\n * column of copy buttons on the worst screen in the flow reads as four more\n * things to do.\n */\n swapFacts: \"grid gap-1.5 rounded-box border border-base-content/15 bg-base-100 px-3 py-2.5 m-0\",\n swapFactsRow: \"grid grid-cols-[minmax(0,1fr)_auto] items-baseline gap-3\",\n swapFactsLabel: \"text-base-content/60 text-sm m-0\",\n swapFactsValue: \"text-sm m-0 tabular-nums\",\n /**\n * The way back into this payment, on every screen and not only the refund\n * one. A payer with no account has nothing else that reaches this page again,\n * and the moment to copy it is BEFORE the deposit goes wrong.\n */\n keepOrder: \"grid gap-1.5 rounded-box border border-base-content/15 bg-base-100 px-3 py-2.5\",\n keepOrderBody: \"m-0 text-base-content/60 text-sm\",\n swapRefundInput: \"input input-bordered w-full\",\n swapRefundInputInvalid: \"input input-bordered input-error w-full\",\n swapRefundError: \"m-0 text-error text-sm\",\n swapRefundHint: \"m-0 text-warning text-sm\",\n tutorialModal: \"modal modal-open\",\n tutorialBox: \"modal-box grid gap-3 max-w-[min(440px,100%)]\",\n tutorialHeader: \"flex gap-2 items-center justify-between\",\n tutorialTitle: \"flex items-center gap-2.5 min-w-0\",\n tutorialHeaderLogo: \"size-9 rounded shrink-0\",\n tutorialClose: \"btn btn-sm btn-square btn-ghost\",\n tutorialFrame:\n \"flex items-center justify-center min-h-0 overflow-hidden rounded-box border border-base-content/20 bg-base-200\",\n tutorialImage: \"block w-auto max-w-full h-auto max-h-[min(66vh,720px)] object-contain\",\n /** The step directive (\"Tap Withdraw\"): a callout in the Bitcoin accent so it reads as the instruction, not a label. */\n tutorialCaption:\n \"m-0 rounded-box border border-warning/40 bg-warning/10 px-4 py-2.5 text-lg font-bold text-center\",\n tutorialIntro: \"grid gap-3 p-4 text-center\",\n tutorialProviderLogo: \"justify-self-center size-[52px] rounded\",\n tutorialCopy: \"btn btn-outline justify-self-center min-w-[min(240px,100%)]\",\n tutorialCopyMessage: \"text-success font-bold\",\n tutorialProgress: \"m-0 text-base-content/60 text-xs text-center\",\n tutorialSteps: \"flex gap-1.5 justify-center\",\n tutorialStep: \"badge badge-xs badge-ghost size-2 p-0\",\n tutorialStepActive: \"badge badge-xs badge-neutral size-2 p-0\",\n tutorialControls: \"grid grid-cols-2 gap-2\",\n} as const;\n", "// User-facing checkout copy, the compiled stylesheet the element adopts, and\n// the attribute coercers that turn raw DOM strings into the typed values\n// declared in ./checkout-types.ts.\nimport { compiledStyles } from \"../generated/compiled-styles.ts\";\nimport type {\n ParseOpenReceiveOptionalIntegerOptions,\n PaymentMethod,\n PaymentMethodOption,\n ResolvedTheme,\n ThemePreference,\n} from \"./checkout-types.ts\";\n\nexport const checkoutLabels = {\n copyInvoice: \"Copy invoice\",\n copied: \"Copied!\",\n openWallet: \"Open Wallet\",\n bitcoinLightningInvoice: \"Bitcoin Lightning invoice\",\n paymentStatus: {\n waitingTitle: \"Waiting for payment\",\n waitingDetail: \"Keep this page open while we verify settlement.\",\n settledTitle: \"Payment received\",\n settledDetail: \"Backend settlement verified.\",\n expiredTitle: \"Invoice expired\",\n expiredDetail: \"Create a fresh invoice to keep going.\",\n },\n countdownPrefix: \"Invoice expires in\",\n startOver: \"Start over\",\n wizardTitle: \"Pay this invoice\",\n wizardSubtitle: \"Choose how you want to pay.\",\n paymentMethod: \"Payment method\",\n /** Breadcrumb back-link once a method (or swap) is already selected. */\n switchPaymentMethod: \"Switch payment method\",\n loadingCurrencies: \"Loading currencies...\",\n emptyBitcoin: \"Choose Bitcoin Lightning.\",\n openProvider: \"How To Pay\",\n tutorialTitlePrefix: \"Pay a Lightning invoice with\",\n tutorialIntroPrefix: \"It's easy to make this payment using\",\n tutorialIntroCopy: \"The first step is to copy the invoice to your clipboard.\",\n tutorialCopiedContinue: \"Copied! Click next below to continue with tutorial.\",\n tutorialExit: \"Exit\",\n lightningNetwork: \"Lightning Network\",\n chooseNetwork: \"Choose network\",\n selectNetwork: \"Select network\",\n continue: \"Continue\",\n preparingPayment: \"Preparing payment\",\n networkSummary: \"{asset} will be sent on {network}.\",\n chooseAssetNetwork: \"Choose {asset} network\",\n selectNetworkToContinue: \"Select a network to continue\",\n transactionDetails: \"Transaction details\",\n viewOnExplorer: \"Explorer\",\n decodeInvoice: \"Decode\",\n /**\n * Deposit heading for a rail whose address does NOT pin the chain, or whose\n * asset is a token an exchange will happily withdraw on the wrong one \u2014 the\n * two ways a deposit is actually lost. See `SwapDepositRisk`.\n */\n wrongCurrencyOrNetworkTitle: \"Wrong currency or network = lost funds\",\n /**\n * Deposit heading for a rail whose address format pins both the chain and the\n * asset (SOL on Solana). Deliberately quiet: an alarm shown on every rail is\n * read on none, and the rails where it is load-bearing \u2014 USDT on four\n * networks, ETH on six \u2014 are the ones that pay for the erosion.\n */\n sendExactAmountTitle: \"Send the exact amount\",\n // Payer-facing copy the two renderers (React elements, element HTML) both\n // emit. The dual-renderer architecture is deliberate; duplicated strings are\n // not \u2014 the drift it already caused was React's hardcoded \"Preparing...\" next\n // to the element's `preparingPayment`. tests/wrapper-parity.test.mjs holds the\n // line.\n swapStartFailedTitle: \"Could not prepare the payment address\",\n tryAgain: \"Try again\",\n payWithLightningInstead: \"Pay with Lightning instead\",\n supportReviewNeeded: \"This payment needs support review.\",\n // The heading already carries `supportReviewNeeded`; a banner repeating it\n // verbatim is the same words twice and no way forward. This is the sentence\n // that names the next step, above the facts a human needs to find the money.\n supportReviewFacts:\n \"Contact the shop with the payment details below \u2014 they identify this deposit.\",\n preparingPaymentAddress: \"Preparing payment address\",\n preparingPaymentAddressDetail: \"Getting your {asset} payment address\u2026\",\n createPaymentAddress: \"Create {asset} ({network}) payment address\",\n paymentBreakdown: \"Payment breakdown\",\n cartTotal: \"Cart total\",\n youSend: \"You send\",\n swapAndNetworkFees: \"Swap + network fees\",\n refundAddressPlaceholder: \"{network} refund address\",\n reviewRefundAddress: \"Review refund address\",\n confirmRefund: \"Confirm refund\",\n confirmRefundTo: \"Confirm refund to {address}.\",\n submitting: \"Submitting...\",\n tutorialBack: \"Back\",\n tutorialNext: \"Next\",\n tutorialClose: \"Close\",\n /**\n * The deposit panel's copy rows. Every value the payer has to REPRODUCE gets a\n * labelled row with a copy button \u2014 the amount included, because on token\n * rails the QR carries no amount and the payer types it by hand.\n */\n swapCopyAddress: \"Address\",\n swapCopyMemo: \"Memo\",\n swapCopyAmount: \"Amount\",\n /** Out-of-range swap asset: both renderers build this panel from one model. */\n swapUnavailableTitle: \"{asset} unavailable\",\n swapUnavailableFallback: \"{asset} is not available for this amount.\",\n swapUnavailableMinimumOnly: \"Minimum {minimum} {asset}.\",\n swapUnavailableRange: \"Accepted range: {minimum}\u2013{maximum} {asset}.\",\n swapUnavailableHint:\n \"Choose another asset above, or pay the Lightning invoice at the top of this page.\",\n /**\n * One-sentence form of the same limit, for a grid that DISABLES a tile rather\n * than navigating to the four-part pane above \u2014 a tooltip or caption has room\n * for a sentence and nowhere to put a title, a detail, a range and a hint.\n * Built by `swapOptionLimitSentence`, from the same figures as\n * `swapOptionLimitMessage`, so the tile and the pane can never quote\n * different numbers.\n */\n swapCartMinimumSentence: \"To pay with {asset}, your cart total must be at least {amount}.\",\n swapCartMaximumSentence: \"To pay with {asset}, your cart total must be at most {amount}.\",\n /** Same sentence when the provider only reported PAY-side limits. */\n swapPayMinimumSentence: \"To pay with {asset}, the minimum is {amount} {asset}.\",\n swapPayMaximumSentence: \"To pay with {asset}, the maximum is {amount} {asset}.\",\n /**\n * Shown on the refund screen so the payer can return after closing the tab \u2014\n * and TRUE ONLY IF THIS CHECKOUT HAS A URL TO RETURN TO. Both are reached\n * through {@link SwapDisplayModel.refundReturnLabel}, which picks between\n * them from what the host declared; neither should be rendered directly.\n */\n /** Heading over the return callout on the refund screens. */\n refundReturnTitle: \"Save this before you go\",\n /** Label on the copy row beside the return warning, when there is a URL. */\n refundReturnUrlLabel: \"This page\",\n refundReturnWarning:\n \"Bookmark this page, or copy its URL. You need it to return to this refund screen.\",\n /**\n * The same screen when the checkout is NOT resumable \u2014 no synced URL, no\n * per-order route. Telling that payer to bookmark the page would send them\n * back to an empty checkout with their deposit unreachable, so it says the\n * true thing instead.\n */\n refundNoReturnWarning:\n \"Do not close this tab until you have submitted this refund. This checkout has no address \" +\n \"to return to, so this screen is the only place it can be requested.\",\n /**\n * The same \"how you get back here\" fact, BEFORE anything has gone wrong.\n *\n * A payer has no account and gets no email from us: the reference and its URL\n * are the only things that reach this payment again, and the moment to copy\n * them is while the deposit is still in flight \u2014 not after a short send has\n * put a refund form on the screen. Rendered only on a checkout the host\n * declared resumable, for the same reason `refundReturnWarning` is: telling a\n * payer to keep a link that goes nowhere is worse than saying nothing.\n */\n keepOrderTitle: \"Keep this order id\",\n keepOrderBody: \"It is the way back to this payment. The link is already in your address bar.\",\n keepOrderIdLabel: \"Order id\",\n keepOrderUrlLabel: \"Checkout link\",\n /** The refund form's own heading, and the two lines above its input. */\n refundSectionTitle: \"Refund this deposit\",\n refundReasonLabel: \"Reason: {reason}\",\n refundAddressOwnership: \"Use a {network} address you control. Do not paste the deposit address.\",\n} as const;\n\nexport { orClasses } from \"../ui-classes.ts\";\nexport { compiledStyles };\n\nexport const checkoutElementStyles = `:host{display:block}${compiledStyles}`;\n\nexport const paymentMethods: readonly PaymentMethodOption[] = [\n {\n id: \"bitcoin\",\n // The detail line disambiguates this tile from its NEIGHBOURS, so it must\n // describe this tile. In a grid where USDT / USDC / SOL / ETH are their own\n // tiles, \"send on-chain into a swap\" described what those tiles do \u2014 one\n // tile away from four tiles that actually do it.\n title: \"Bitcoin\",\n detail: \"Pay via Lightning\",\n },\n];\n\nexport function parseOptionalInteger(\n value: string | null | undefined,\n options: ParseOpenReceiveOptionalIntegerOptions = {},\n): number | undefined {\n if (value === null || value === undefined || value === \"\") return undefined;\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new RangeError(`${options.label ?? \"value\"} must be a non-negative safe integer`);\n }\n return parsed;\n}\n\nexport function parseBooleanAttribute(value: string | null | undefined): boolean | undefined {\n if (value === null || value === undefined) return undefined;\n return value !== \"false\";\n}\n\nexport function parseResolvedTheme(value: string | null | undefined): ResolvedTheme | undefined {\n return value === \"light\" || value === \"dark\" ? value : undefined;\n}\n\nexport function parseThemePreference(\n value: string | null | undefined,\n): ThemePreference | undefined {\n return value === \"light\" || value === \"dark\" || value === \"system\" ? value : undefined;\n}\n\nexport function parsePaymentMethod(value: string | null): PaymentMethod | null {\n return value === \"bitcoin\" ? value : null;\n}\n", "// Two small timer-driven value controllers the checkout UI shares: transient\n// feedback (\"Copied!\" reverting itself) and a value that re-derives on a tick\n// (the expiry countdown). Both are DOM-free so React, the custom element and\n// the headless engine can all drive them.\n\nimport { unixSeconds } from \"@openreceive/core\";\nimport {\n OPENRECEIVE_COPY_FEEDBACK_MS,\n type TickingValueController,\n type TickingValueOptions,\n type TransientFeedbackController,\n type TransientFeedbackOptions,\n} from \"./ui.ts\";\n\nexport function createTransientFeedbackController<T>(\n options: TransientFeedbackOptions<T>,\n): TransientFeedbackController<T> {\n const delayMs = options.delayMs ?? OPENRECEIVE_COPY_FEEDBACK_MS;\n const setTimeoutFn = options.setTimeout ?? globalThis.setTimeout;\n const clearTimeoutFn = options.clearTimeout ?? globalThis.clearTimeout;\n let timeout: ReturnType<typeof globalThis.setTimeout> | undefined;\n\n const clear = (): void => {\n if (timeout === undefined) return;\n clearTimeoutFn(timeout);\n timeout = undefined;\n };\n\n return {\n show(value: T): void {\n clear();\n options.onValue(value);\n timeout = setTimeoutFn(() => {\n timeout = undefined;\n options.onValue(options.resetValue);\n }, delayMs);\n },\n clear,\n };\n}\n\nexport function createTickingValueController(options: TickingValueOptions): TickingValueController {\n const intervalMs = options.intervalMs ?? 1000;\n const now = options.now ?? unixSeconds;\n const setIntervalFn = options.setInterval ?? globalThis.setInterval;\n const clearIntervalFn = options.clearInterval ?? globalThis.clearInterval;\n let timer: ReturnType<typeof globalThis.setInterval> | undefined;\n\n const refresh = (): void => {\n options.onValue(now());\n };\n\n const stop = (): void => {\n if (timer === undefined) return;\n clearIntervalFn(timer);\n timer = undefined;\n };\n\n return {\n start(): void {\n stop();\n if (options.active === false) return;\n refresh();\n timer = setIntervalFn(refresh, intervalMs);\n },\n stop,\n refresh,\n };\n}\n", "// Display formatting for the checkout UI: the countdown, amounts (msats,\n// fiat, the combined caption), swap limits, the short labels for a payment\n// hash / timestamp / invoice, and the HTML escaper every string renderer runs\n// values through. Pure functions over values \u2014 nothing here reads a snapshot.\n\nimport {\n ceilDiv,\n decimalScaleFactor,\n formatDecimal,\n isBitcoinAmountCurrency,\n parseDecimal,\n} from \"@openreceive/core\";\n\nexport function formatCountdown(seconds: number): string {\n const safeSeconds = Math.max(0, Math.trunc(seconds));\n const minutes = Math.floor(safeSeconds / 60);\n const remainderSeconds = safeSeconds % 60;\n return `${minutes}:${remainderSeconds.toString().padStart(2, \"0\")}`;\n}\n\n/**\n * Trim insignificant trailing zeros from a decimal crypto amount for display,\n * e.g. \"12.25900000\" -> \"12.259\" and \"5.000\" -> \"5\". Only fractional digits are\n * stripped: integer amounts like \"100\" keep their zeros, and non-numeric input\n * is returned unchanged.\n */\nexport function formatDepositAmount(amount: string): string {\n if (!/^[0-9]+(?:\\.[0-9]+)?$/.test(amount) || !amount.includes(\".\")) return amount;\n return amount.replace(/0+$/, \"\").replace(/\\.$/, \"\");\n}\n\n/** Integer division rounded half up. */\nexport function roundedDiv(numerator: bigint, denominator: bigint): bigint {\n return (numerator + denominator / 2n) / denominator;\n}\n\n/** Re-scale integer units from `scale` to `digits` decimal places, half-up. */\nexport function rescaleHalfUp(units: bigint, scale: number, digits: number): bigint {\n return roundedDiv(units * 10n ** BigInt(digits), 10n ** BigInt(scale));\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n}\n\n/**\n * THE msat rule, in one place: is this a value `formatMsats` can be\n * handed?\n *\n * Every rule in this file that judges an msat amount asks this instead of\n * repeating the `Number.isSafeInteger(...) && ... >= 0` pair, so the rule has\n * exactly one definition. `undefined` answers false, so callers holding an\n * optional amount need no extra check.\n */\nfunction isDisplayableMsats(amountMsats: number | undefined): amountMsats is number {\n return amountMsats !== undefined && Number.isSafeInteger(amountMsats) && amountMsats >= 0;\n}\n\n/**\n * Throws on a non-amount, and every caller lets it: wire construction, amount\n * validation, and the display sites share this formatter, and a malformed\n * amount from our own server is a bug that must surface, not be smoothed over.\n */\nexport function formatMsats(amountMsats: number): string {\n if (!isDisplayableMsats(amountMsats)) {\n throw new RangeError(\"amount_msats must be a non-negative safe integer\");\n }\n\n if (amountMsats % 1000 === 0) {\n const sats = amountMsats / 1000;\n return `${formatInteger(sats)} ${sats === 1 ? \"sat\" : \"sats\"}`;\n }\n\n return `${formatInteger(amountMsats)} msats`;\n}\n\nexport function formatFiatAmount(\n fiat:\n | {\n readonly currency?: string;\n readonly value?: string;\n }\n | null\n | undefined,\n): string | undefined {\n if (fiat?.currency === undefined || fiat.value === undefined) return undefined;\n if (fiat.currency === \"BTC\") return `${fiat.value} BTC`;\n // \"SAT\" and \"SATS\" are one currency to core's isBitcoinAmountCurrency, so\n // they render alike here rather than \"SAT\" falling through as pseudo-fiat.\n if (isBitcoinAmountCurrency(fiat.currency)) return `${fiat.value} sats`;\n const value = formatFiatValue(fiat.value);\n return fiat.currency === \"USD\" ? `$${value}` : `${value} ${fiat.currency}`;\n}\n\n/**\n * Money at exactly two decimals with thousands grouping: \"87.0\" (a Ruby\n * BigDecimal echo of the host's price) and \"87\" both render as \"87.00\",\n * \"1234.5\" as \"1,234.50\". Exact bigint math \u2014 a display value with more than\n * two decimals rounds half up, never through a binary float. Our own server\n * sent the string, so a malformed one throws (parseDecimal) rather than\n * quietly printing garbage on the payment screen.\n */\nexport function formatFiatValue(value: string): string {\n const { units, scale } = parseDecimal(value, \"fiat.value\");\n const cents = scale <= 2 ? units * decimalScaleFactor(2 - scale) : rescaleHalfUp(units, scale, 2);\n const [whole, fraction] = formatDecimal(cents, 2).split(\".\");\n return `${BigInt(whole).toLocaleString(\"en-US\")}.${fraction}`;\n}\n\n/** Combined QR caption, e.g. `19,174 sats / $12.00 USD` \u2014 the ISO code, because \"$\" alone does not say which dollar. */\nexport function formatAmountCaption(options: {\n readonly amountLabel?: string;\n readonly fiatLabel?: string;\n readonly fiatCurrency?: string;\n}): string | undefined {\n const fiat =\n options.fiatLabel === undefined\n ? undefined\n : options.fiatCurrency === \"USD\" && !options.fiatLabel.endsWith(\" USD\")\n ? `${options.fiatLabel} USD`\n : options.fiatLabel;\n if (options.amountLabel !== undefined && fiat !== undefined) {\n return `${options.amountLabel} / ${fiat}`;\n }\n return options.amountLabel ?? fiat;\n}\n\nfunction formatInteger(value: number): string {\n return value.toLocaleString(\"en-US\");\n}\n\n/**\n * Renders an invoice-side (Lightning receive) msat limit as a short amount for\n * display under a disabled swap asset, e.g. \"$10.00\". Converts to the\n * checkout's own fiat currency using its rate; falls back to a sats figure when\n * the checkout is sats/BTC-denominated or no usable rate is available.\n *\n * Minimums ceil and maximums floor to the display scale so the note never\n * understates a floor or overstates a ceiling.\n */\nexport function formatSwapLimit(\n checkout: {\n readonly amount_msats: number;\n readonly fiat?: { readonly currency: string; readonly value: string };\n },\n limitMsats: number | undefined,\n rounding: \"ceil\" | \"floor\" = \"ceil\",\n): string | undefined {\n // Same displayability rule as every other amount; the extra `=== 0` is this\n // function's own: the checkout amount is a DENOMINATOR below.\n if (\n !isDisplayableMsats(limitMsats) ||\n !isDisplayableMsats(checkout.amount_msats) ||\n checkout.amount_msats === 0\n ) {\n return undefined;\n }\n const fiat = checkout.fiat;\n // Only genuinely fiat-denominated checkouts scale: a bitcoin denomination\n // (BTC/SAT/SATS, per core) is already the sat figure below.\n if (fiat !== undefined && !isBitcoinAmountCurrency(fiat.currency)) {\n const scaled = scaleFiatLimitExact({\n fiatValue: fiat.value,\n amountMsats: checkout.amount_msats,\n limitMsats,\n rounding,\n });\n if (scaled !== undefined) {\n const formatted = formatFiatAmount({\n currency: fiat.currency,\n value: scaled,\n });\n if (formatted !== undefined) return formatted;\n }\n }\n const sats = rounding === \"floor\" ? Math.floor(limitMsats / 1000) : Math.ceil(limitMsats / 1000);\n return `${sats} ${sats === 1 ? \"sat\" : \"sats\"}`;\n}\n\n/**\n * Exact `invoice_fiat * limit_msats / amount_msats` at two decimal places.\n * Uses bigint only \u2014 never binary floats.\n */\nfunction scaleFiatLimitExact(input: {\n readonly fiatValue: string;\n readonly amountMsats: number;\n readonly limitMsats: number;\n readonly rounding: \"ceil\" | \"floor\";\n}): string | undefined {\n // Our own server's fiat value: parseDecimal throws on a malformed one rather\n // than quietly degrading the whole limit to sats.\n const fiat = parseDecimal(input.fiatValue);\n if (fiat.units <= 0n) return undefined;\n const outScale = 2;\n // result_units_at_2dp = round(fiat_units * limit / amount * 10^(2 - fiatScale))\n const numerator = fiat.units * BigInt(input.limitMsats) * 10n ** BigInt(outScale);\n const denominator = BigInt(input.amountMsats) * 10n ** BigInt(fiat.scale);\n if (denominator <= 0n) return undefined;\n const units =\n input.rounding === \"floor\" ? numerator / denominator : ceilDiv(numerator, denominator);\n return formatDecimal(units, outScale);\n}\n\nexport function formatPaymentHashLabel(hash: string): string {\n return hash.length <= 16 ? hash : `${hash.slice(0, 8)}...${hash.slice(-8)}`;\n}\n\n/**\n * The largest unix-seconds value a `Date` can represent. The ECMAScript time\n * range is +/- 8.64e15 ms (ES2024 21.4.1.1); past it every `Date` method that\n * renders \u2014 `toISOString`, `toLocaleString` \u2014 throws `RangeError: Invalid time\n * value`.\n */\nconst MAX_DISPLAYABLE_UNIX_SECONDS = 8.64e15 / 1000;\n\n/**\n * THE unix-timestamp rule, in one place: is this a value a clock can render?\n * Sibling of {@link isDisplayableMsats}. Renderability only \u2014 the ceiling is\n * the `Date` range and nothing narrower.\n */\nfunction isDisplayableUnixSeconds(seconds: number | undefined): seconds is number {\n return (\n seconds !== undefined &&\n Number.isFinite(seconds) &&\n seconds > 0 &&\n seconds <= MAX_DISPLAYABLE_UNIX_SECONDS\n );\n}\n\n/**\n * ECHOES rather than throws on a value it cannot render \u2014 the one place this\n * rule reads differently from the amount rule above, deliberately.\n * `formatMsats` throws because wire construction and amount validation share\n * it and a bad amount there must surface; nothing constructs or validates\n * anything through this formatter, so degrading to the raw value is its\n * contract.\n */\nexport function formatUnixTime(seconds: number): string {\n if (!isDisplayableUnixSeconds(seconds)) return String(seconds);\n return new Date(seconds * 1000).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nexport function formatInvoiceLabel(invoice: string): string {\n if (invoice.length <= 48) return invoice;\n return `${invoice.slice(0, 20)}\u2026${invoice.slice(-16)}`;\n}\n\n/** The payer-facing labels a {@link CheckoutState} carries next to its raw fields. */\nexport interface CheckoutStateLabels {\n readonly amountLabel?: string;\n readonly fiatLabel?: string;\n readonly paymentHashLabel?: string;\n}\n\n/**\n * THE label rule \u2014 one copy, applied everywhere a checkout is shown.\n *\n * `normalizeCheckoutState` runs it so every CheckoutState already carries its\n * labels, and the elements renderer runs it over raw attributes in create mode,\n * before there is an attempt to build a state from. It replaces the label half\n * of the deleted `createCheckoutDisplayModel`; the other half (the `lightning:`\n * URI) belongs to `createCheckoutState`, which is the only place that knows the\n * rail.\n *\n * `transactionStateLabel` is deliberately NOT here: it was a verbatim copy of\n * `transaction_state`, which the state already carries, and nothing read it.\n */\nexport function deriveCheckoutStateLabels(source: {\n readonly amount_msats?: number;\n readonly fiat_quote?: {\n readonly fiat?: {\n readonly currency?: string;\n readonly value?: string;\n };\n } | null;\n readonly payment_hash?: string;\n}): CheckoutStateLabels {\n const fiatLabel = formatFiatAmount(source.fiat_quote?.fiat);\n const amountLabel =\n source.amount_msats === undefined ? undefined : formatMsats(source.amount_msats);\n return {\n ...(amountLabel === undefined ? {} : { amountLabel }),\n ...(fiatLabel === undefined ? {} : { fiatLabel }),\n ...(source.payment_hash === undefined\n ? {}\n : { paymentHashLabel: formatPaymentHashLabel(source.payment_hash) }),\n };\n}\n", "// BOLT11 safety: the guards that keep a wallet connection string (or any\n// other non-invoice) out of a QR, a clipboard, or a rendered link, plus the\n// one place that builds a `lightning:` URI. Every path that shows or copies an\n// invoice goes through `assertInvoice` first.\n\nexport function assertDisplayInvoice(invoice: string): void {\n assertInvoice(invoice);\n}\n\nexport function createLightningUri(invoice: string): string {\n assertInvoice(invoice);\n return `lightning:${invoice}`;\n}\n\nexport function assertInvoice(invoice: string): void {\n if (typeof invoice !== \"string\" || invoice.length === 0) {\n throw new TypeError(\"invoice must be a non-empty BOLT11 string\");\n }\n\n // Scheme only, no slashes: core's parseNwcUri accepts both\n // \"nostr+walletconnect://pubkey?...\" and the slashless\n // \"nostr+walletconnect:pubkey?...\", so matching on \"://\" would let the\n // second form through to a QR or a clipboard.\n if (invoice.toLowerCase().startsWith(\"nostr+walletconnect:\")) {\n throw new TypeError(\"invoice must not be an NWC connection string\");\n }\n}\n", "import { unixSeconds } from \"@openreceive/core\";\n\n/**\n * A unix timestamp in **seconds** \u2014 the unit every OpenReceive wire field uses\n * (`expires_at`, `provider_expires_at`, `settled_at`, `paid_at`) and therefore\n * the unit every `now` option compares against.\n *\n * It is a plain `number`; the alias exists so the unit shows up where the\n * option does. `Date.now()` is MILLISECONDS and is the wrong value here \u2014\n * {@link resolveNow} rejects it rather than letting every invoice read as\n * expired. Use `Math.floor(Date.now() / 1000)`.\n */\nexport type UnixSeconds = number;\n\n// Seconds this large land in the year 33658; milliseconds this large land in\n// 2001. Every real `Date.now()` is above it and every real seconds clock is\n// below it, so the split is unambiguous rather than a heuristic.\nconst MILLISECONDS_THRESHOLD = 1e12;\n\n/**\n * The caller's `now`, or the current time \u2014 in seconds, checked.\n *\n * Passing milliseconds used to be silent: `now` sits on one side of an\n * `expires_at <= now` comparison, so a `Date.now()` made every invoice read\n * `expired` with no error and no warning. It throws instead, at the call that\n * made the mistake \u2014 the same choice `formatMsats` makes for a malformed\n * amount.\n */\nexport function resolveNow(now: UnixSeconds | undefined): UnixSeconds {\n if (now === undefined) return unixSeconds();\n if (now > MILLISECONDS_THRESHOLD) {\n throw new RangeError(\n `OpenReceive \\`now\\` is a unix timestamp in SECONDS; received ${now}, which is milliseconds. Pass Math.floor(Date.now() / 1000).`,\n );\n }\n return now;\n}\n", "// The swap attempt as the payer sees it: the fee breakdown, the deposit-panel\n// display model, the refund staging overlay, provider-state labels and\n// details, and the asset/route matching the wizard selection needs.\n\nimport {\n type Decimal,\n formatDecimal,\n parseDecimal,\n payInAssetNetwork,\n swapAddressNetworkForPayInAsset,\n swapPayInAssetPeggedTo,\n} from \"@openreceive/core\";\nimport {\n formatCountdown,\n formatDepositAmount,\n formatFiatAmount,\n rescaleHalfUp,\n roundedDiv,\n} from \"./checkout-format.ts\";\nimport {\n type CheckoutInvoiceSnapshot,\n type CheckoutInvoiceSwapFee,\n type CheckoutSnapshot,\n checkoutLabels,\n type SwapDepositRisk,\n type SwapDisplayModel,\n type SwapFeeBreakdown,\n} from \"./ui.ts\";\nimport { resolveNow, type UnixSeconds } from \"./unix-seconds.ts\";\n\n/** The swap attempt fields the fee breakdown needs beyond the fee itself. */\nexport type SwapFeeBreakdownContext = Pick<\n NonNullable<CheckoutInvoiceSnapshot[\"swap\"]>,\n \"pay_in_asset\" | \"deposit_amount\"\n>;\n\n/**\n * Whether the fee breakdown for this attempt is expressed in the pay-in token\n * rather than in fiat: true when the asset is a stablecoin pegged to the very\n * currency the provider valued it in. \"You send $50.03\" under \"Pay 50.05 USDC\"\n * reads as the same number with a typo, and the payer cannot tell which one to\n * type into their wallet \u2014 so for a pegged asset the fiat valuation of the\n * pay-in side (`fee.pay_in_fiat`) is never rendered anywhere. The peg comes\n * from the shared asset table, keyed by asset, never by matching the symbol.\n */\nexport function swapFeeInTokenUnits(fee: CheckoutInvoiceSwapFee, payInAsset: string): boolean {\n return swapPayInAssetPeggedTo(payInAsset) === fee.currency;\n}\n\n/**\n * Turn the provider's fiat equivalents into a display-ready fee breakout. The\n * merchant receives `payout_fiat` (the cart total); the payer sends more, and the\n * difference is the swap fee (exchange spread + network fees).\n *\n * Two renderings, one rule ({@link swapFeeInTokenUnits}):\n * - Floating asset (SOL, ETH): every row is fiat. `youSend` is `pay_in_fiat`.\n * - Stablecoin pegged to the fee currency (USDC, USDT with a USD fee): `youSend`\n * is the deposit amount itself in the token \u2014 the identical string the header\n * and the copyable amount row show \u2014 and the fee is\n * `deposit_amount - payout_fiat` in token units. `pay_in_fiat` is not used.\n *\n * Without `swap` the breakdown is fiat-only. Returns undefined when the figures\n * are missing or not sensible so callers can hide the row.\n */\nexport function createSwapFeeBreakdown(\n fee: CheckoutInvoiceSwapFee | undefined,\n swap?: SwapFeeBreakdownContext,\n): SwapFeeBreakdown | undefined {\n if (fee === undefined) return undefined;\n // Exact decimal math on the shared money engine \u2014 never binary floats, even\n // for display-only values.\n // Hiding the fee row on an unreadable figure is a PRODUCT choice \u2014 a\n // breakdown that cannot be computed is worse than no breakdown \u2014 so the\n // parse is caught here, at the row boundary, and nowhere else.\n const payout = parseFeeDecimal(fee.payout_fiat);\n // Distinct from the parse: this one guards our own division below.\n if (payout === undefined || payout.units <= 0n) return undefined;\n const fiat = (units: bigint, scale: number): string => {\n const value = formatDecimal(rescaleHalfUp(units, scale, 2), 2);\n return formatFiatAmount({ currency: fee.currency, value }) ?? `${value} ${fee.currency}`;\n };\n\n if (swap !== undefined && swapFeeInTokenUnits(fee, swap.pay_in_asset)) {\n const deposit = parseFeeDecimal(swap.deposit_amount);\n if (deposit === undefined) return undefined;\n const { assetLabel } = getSwapAssetDisplay(swap.pay_in_asset);\n const gap = decimalGap(deposit, payout);\n return {\n cartTotal: fiat(gap.base, gap.scale),\n youSend: `${formatDepositAmount(swap.deposit_amount)} ${assetLabel}`,\n fee: `${formatDecimal(rescaleHalfUp(gap.fee, gap.scale, 2), 2)} ${assetLabel}`,\n feePercent: percentOf(gap.fee, gap.base),\n };\n }\n\n const payIn = parseFeeDecimal(fee.pay_in_fiat);\n if (payIn === undefined) return undefined;\n const gap = decimalGap(payIn, payout);\n return {\n cartTotal: fiat(gap.base, gap.scale),\n youSend: fiat(gap.base + gap.fee, gap.scale),\n fee: fiat(gap.fee, gap.scale),\n feePercent: percentOf(gap.fee, gap.base),\n };\n}\n\nfunction parseFeeDecimal(value: string): Decimal | undefined {\n try {\n return parseDecimal(value);\n } catch {\n return undefined;\n }\n}\n\n/**\n * `paid - base` at one shared scale, floored at zero (a provider can value the\n * pay-in side below the payout by a rounding cent; that is not a negative fee).\n */\nfunction decimalGap(\n paid: Decimal,\n base: Decimal,\n): { readonly fee: bigint; readonly base: bigint; readonly scale: number } {\n const scale = Math.max(paid.scale, base.scale);\n const paidUnits = paid.units * 10n ** BigInt(scale - paid.scale);\n const baseUnits = base.units * 10n ** BigInt(scale - base.scale);\n return { fee: paidUnits > baseUnits ? paidUnits - baseUnits : 0n, base: baseUnits, scale };\n}\n\n/** fee/base * 100 at one decimal place, half-up: tenths = fee*1000/base. */\nfunction percentOf(fee: bigint, base: bigint): string {\n const tenths = roundedDiv(fee * 1000n, base);\n return `${(tenths / 10n).toString()}.${(tenths % 10n).toString()}%`;\n}\n\n/**\n * Which of the two ways a deposit is lost is reachable on this rail \u2014 the input\n * to how loud the deposit panel is. See {@link SwapDepositRisk} for the\n * vocabulary and why native-vs-token is NOT the axis.\n *\n * Derived, never tabulated. A hand-kept rail list goes stale the day a rail is\n * added, and it would go stale in the unsafe direction: a new rail would\n * inherit whatever the last edit happened to leave. The two questions are asked\n * of the pay-in code itself, so an unclassifiable one falls through to the full\n * alarm.\n *\n * 1. Does the address FORMAT pin the chain? Only for networks\n * `swapAddressNetworkForPayInAsset` can name a checksum rule for, minus ETH:\n * a `0x\u2026` address is byte-identical on every EVM chain. An unrecognized\n * network answers no.\n * 2. Is the asset that chain's NATIVE coin? `SOL_SOL` yes, `USDT_TRON` no.\n * Compared against the normalized network so the `TRON`/`TRX` spelling split\n * cannot make native TRX look like a token.\n */\nexport function swapDepositRisk(payInAsset: string): SwapDepositRisk {\n const network = swapAddressNetworkForPayInAsset(payInAsset);\n // ETH is named because its address format is the ambiguity: every EVM chain\n // accepts the same `0x\u2026` string. `undefined` is every network we have no\n // format rule for at all.\n if (network === undefined || network === \"ETH\") return \"chain_ambiguous\";\n // Is the asset this chain's NATIVE coin? `SOL_SOL` yes, `USDT_TRON` no. Ask\n // core the same question about a code built from the symbol alone, so the\n // `TRON` suffix / `TRX` symbol spelling split resolves through core's one\n // network table rather than a second copy of it here.\n const symbol = payInAsset.slice(0, payInAsset.lastIndexOf(\"_\"));\n return swapAddressNetworkForPayInAsset(`${symbol}_${symbol}`) === network\n ? \"pinned\"\n : \"asset_only\";\n}\n\n/**\n * @param options.now Unix timestamp in **seconds** ({@link UnixSeconds}); the\n * provider countdown is measured against it. Milliseconds (`Date.now()`)\n * throw rather than pinning every deposit window at zero.\n * @param options.resumable Whether this checkout has a URL the payer can come\n * BACK to \u2014 a synced history path, or the host's own per-order route. It\n * decides {@link SwapDisplayModel.refundReturnLabel} and nothing else; the\n * refund form itself stays available either way, because a payer who is on\n * the screen right now can still submit one. Defaults to `false`: a host that\n * has not said it is resumable is the host whose payer must not be told to\n * bookmark the page.\n */\nexport function createSwapDisplayModel(\n invoice: CheckoutInvoiceSnapshot,\n options: { readonly now?: UnixSeconds; readonly resumable?: boolean } = {},\n): SwapDisplayModel | undefined {\n const swap = invoice.swap;\n if (swap === undefined) return undefined;\n const expiresAt = Math.min(\n swap.provider_expires_at,\n invoice.expires_at ?? swap.provider_expires_at,\n );\n const expiresInSeconds = Math.max(0, expiresAt - resolveNow(options.now));\n const asset = getSwapAssetDisplay(swap.pay_in_asset);\n const depositAmount = formatDepositAmount(swap.deposit_amount);\n const networkWarningEmphasis = `${depositAmount} ${asset.assetLabel} on the ${asset.networkLabel} network`;\n const depositRisk = swapDepositRisk(swap.pay_in_asset);\n // Settlement authority is OpenReceive's own wallet sweep, surfaced as the shadow\n // invoice's settled transaction_state \u2014 never the provider's `completed` state (see\n // OPENRECEIVE_SWAP_STATES). Once the order is paid the panel shows a final\n // confirmation, even if `provider_state` still lags on \"confirming\"/\"exchanging\".\n const settled = invoice.transaction_state === \"settled\";\n const instructionsExpired = expiresInSeconds === 0 && swap.provider_state === \"awaiting_deposit\";\n const feeBreakdown = createSwapFeeBreakdown(swap.fee, swap);\n\n return {\n provider: swap.provider,\n attemptId: swap.attempt_id ?? invoice.invoice_id,\n payInAsset: swap.pay_in_asset,\n assetLabel: asset.assetLabel,\n networkLabel: asset.networkLabel,\n depositRisk,\n networkWarningTitle:\n depositRisk === \"pinned\"\n ? checkoutLabels.sendExactAmountTitle\n : checkoutLabels.wrongCurrencyOrNetworkTitle,\n networkWarningEmphasis,\n // The lost-funds sentence is claimed only where it is reachable.\n networkWarning:\n depositRisk === \"pinned\"\n ? `Send exactly ${networkWarningEmphasis}.`\n : `Be sure you are sending exactly ${networkWarningEmphasis}. If you send the wrong currency or send on the wrong network, your funds will be lost!`,\n depositAddress: swap.deposit_address,\n ...(swap.deposit_memo === undefined ? {} : { depositMemo: swap.deposit_memo }),\n depositAmount,\n copyRows: [\n // Selectable, not just copyable: a payer on a phone that blocks the\n // clipboard API still has to be able to select the string by hand.\n {\n label: checkoutLabels.swapCopyAddress,\n value: swap.deposit_address,\n selectable: true,\n },\n // Present only on the rails that require one, and a deposit that arrives\n // WITHOUT it can be unrecoverable at the provider \u2014 worse than an\n // underpayment, because there is no `refund_required` to act on. It is a\n // labelled row like the others, never prose inside a warning banner.\n ...(swap.deposit_memo === undefined\n ? []\n : [\n {\n label: checkoutLabels.swapCopyMemo,\n value: swap.deposit_memo,\n selectable: false,\n },\n ]),\n { label: checkoutLabels.swapCopyAmount, value: depositAmount, selectable: true },\n ],\n providerStateLabel: instructionsExpired\n ? \"Payment window closed\"\n : settled\n ? \"Payment complete\"\n : getSwapProviderStateLabel(swap.provider_state),\n providerStateDetail: instructionsExpired\n ? \"Do not send another payment. We are checking for an existing deposit and any recovery options.\"\n : settled\n ? \"Your payment is confirmed and your order is complete.\"\n : getSwapProviderStateDetail(swap.provider_state, swap.pay_in_asset, {\n refundReason: swap.refund_reason,\n depositAmount: swap.deposit_amount,\n depositReceivedAmount: swap.deposit_received_amount,\n refundAmount: swap.refund_amount,\n }),\n state: settled\n ? \"settled\"\n : instructionsExpired\n ? \"progress\"\n : getSwapPanelState(swap.provider_state),\n expiresInSeconds,\n countdownLabel: formatCountdown(expiresInSeconds),\n qrPayload: createSwapQrPayload(swap),\n ...(feeBreakdown === undefined ? {} : { feeBreakdown }),\n ...(swap.deposit_tx_id === undefined ? {} : { depositTxId: swap.deposit_tx_id }),\n ...(swap.payout_tx_id === undefined ? {} : { payoutTxId: swap.payout_tx_id }),\n ...(swap.refund_address === undefined ? {} : { refundAddress: swap.refund_address }),\n refundAllowed: swap.provider_state === \"refund_required\",\n resumable: options.resumable === true,\n refundReturnLabel:\n options.resumable === true\n ? checkoutLabels.refundReturnWarning\n : checkoutLabels.refundNoReturnWarning,\n ...(swap.refund_tx_id === undefined ? {} : { refundTxId: swap.refund_tx_id }),\n ...(swap.refund_reason === undefined ? {} : { refundReason: swap.refund_reason }),\n ...(swap.deposit_received_amount === undefined\n ? {}\n : {\n depositReceivedAmount: formatDepositAmount(swap.deposit_received_amount),\n }),\n ...(swap.refund_amount === undefined\n ? {}\n : { refundAmount: formatDepositAmount(swap.refund_amount) }),\n ...(swap.provider_order_id === undefined ? {} : { providerOrderId: swap.provider_order_id }),\n };\n}\n\n/**\n * Package-private. Poll snapshots omit the locally staged refund address, so it\n * is overlaid back on before anything reads them. This is not a rule an\n * integration has to remember: {@link CheckoutWatcher} holds the staged invoice\n * and folds it through {@link overlaySwapRefundStagingIntoSnapshot} on every\n * snapshot it publishes, and {@link selectCurrentSwapInvoice} is the same fold\n * for a renderer that carries its own started attempt.\n */\nexport function overlaySwapRefundStaging(\n invoice: CheckoutInvoiceSnapshot,\n local: CheckoutInvoiceSnapshot | undefined | null,\n): CheckoutInvoiceSnapshot {\n const localSwap = local?.swap;\n const invoiceSwap = invoice.swap;\n if (\n local === undefined ||\n local === null ||\n localSwap === undefined ||\n invoiceSwap === undefined\n ) {\n return invoice;\n }\n if (local.invoice_id !== invoice.invoice_id) return invoice;\n // The staged refund ADDRESS is the review marker: it is present locally after\n // the payer reviews and absent from the server's view until they confirm.\n const refund_address = invoiceSwap.refund_address ?? localSwap.refund_address;\n if (refund_address === invoiceSwap.refund_address) return invoice;\n return {\n ...invoice,\n swap: {\n ...invoiceSwap,\n ...(refund_address === undefined ? {} : { refund_address }),\n },\n };\n}\n\n/**\n * The same overlay across a whole snapshot: every invoice, plus `active`. The\n * watcher applies this before `onSnapshot` and before `createCheckoutState`, so\n * a host that stores what it is handed keeps the address the payer is reviewing\n * without knowing this function exists.\n */\nexport function overlaySwapRefundStagingIntoSnapshot(\n snapshot: CheckoutSnapshot,\n staged: CheckoutInvoiceSnapshot | undefined | null,\n): CheckoutSnapshot {\n if (staged?.swap?.refund_address === undefined) return snapshot;\n const invoices = snapshot.invoices.map((invoice) => overlaySwapRefundStaging(invoice, staged));\n const changed = invoices.some((invoice, index) => invoice !== snapshot.invoices[index]);\n const active =\n snapshot.active === undefined ? undefined : overlaySwapRefundStaging(snapshot.active, staged);\n if (!changed && active === snapshot.active) return snapshot;\n return {\n ...snapshot,\n invoices,\n ...(active === undefined ? {} : { active }),\n };\n}\n\n/**\n * The current swap attempt as a renderer should read it: the polled snapshot's\n * copy when it has one, the locally started attempt when the snapshot has not\n * caught up, and the staged refund address folded over either. Both shipped\n * renderers used to keep a near-identical copy of this; a headless UI holding\n * its own snapshot store wants the same three rules.\n *\n * `dismissedInvoiceId` is the \"back to Lightning\" / \"switch payment method\"\n * exit: while it is set, NO attempt is current until a new start or a refund\n * clears it. The payer walked away from the swap they were looking at, and every\n * older attempt in the snapshot is one they walked away from before that. The\n * snapshot copy is the fallback only when nothing was dismissed (a resumed\n * attempt this session never started). Falling back to \"the first other swap\"\n * reopened the previous coin's deposit once an order had two attempts, and\n * every further click re-dismissed the same one, so the exit stopped working.\n */\nexport function selectCurrentSwapInvoice(\n snapshot: CheckoutSnapshot | undefined,\n options: {\n readonly started?: CheckoutInvoiceSnapshot | null;\n readonly dismissedInvoiceId?: string | null;\n } = {},\n): CheckoutInvoiceSnapshot | undefined {\n const dismissedInvoiceId = options.dismissedInvoiceId ?? null;\n const started = options.started ?? null;\n if (started === null) {\n if (dismissedInvoiceId !== null) return undefined;\n return snapshot?.invoices.find(\n (invoice) => invoice.rail === \"swap\" && invoice.swap !== undefined,\n );\n }\n if (started.invoice_id === dismissedInvoiceId) return undefined;\n const matched =\n snapshot?.invoices.find((invoice) => invoice.invoice_id === started.invoice_id) ?? started;\n return overlaySwapRefundStaging(matched, started);\n}\n\nexport function swapAssetMatchesRoute(routeKey: string, payInAsset: string | undefined): boolean {\n if (payInAsset === undefined) return false;\n const route = routeKey.includes(\":\") ? (routeKey.split(\":\").at(-1) ?? routeKey) : routeKey;\n if (route === \"usdt\") return payInAsset.startsWith(\"USDT_\");\n if (route === \"usdc\") return payInAsset.startsWith(\"USDC_\");\n if (route === \"eth\") return payInAsset === \"ETH_ETH\";\n if (route === \"sol\") return payInAsset === \"SOL_SOL\";\n return false;\n}\n\nexport function getSwapProviderStateLabel(state: string): string {\n if (state === \"creating_provider_order\") return \"Preparing payment address\";\n if (state === \"awaiting_deposit\") return \"Waiting for your payment\";\n if (state === \"confirming\") return \"Confirming payment\";\n if (state === \"exchanging\") return \"Converting payment\";\n if (state === \"paying_invoice\" || state === \"completed\") return \"Finalizing checkout\";\n if (state === \"expired\") return \"Expired\";\n if (state === \"refund_required\") return \"Refund needed\";\n if (state === \"refund_pending\") return \"Refund pending\";\n if (state === \"refunded\") return \"Refunded\";\n if (state === \"attention\") return \"Needs attention\";\n if (state === \"failed\") return \"Failed\";\n return state;\n}\n\nfunction getSwapProviderStateDetail(\n state: string,\n payInAsset: string,\n refundContext: {\n readonly refundReason?: string;\n readonly depositAmount?: string;\n readonly depositReceivedAmount?: string;\n readonly refundAmount?: string;\n } = {},\n): string {\n const { networkLabel, assetLabel } = getSwapAssetDisplay(payInAsset);\n if (state === \"creating_provider_order\") return \"Creating a payment address.\";\n if (state === \"awaiting_deposit\") return \"Send exactly the amount shown.\";\n if (state === \"confirming\") {\n return `Your payment was detected on ${networkLabel}. ${getSwapConfirmationWaitHint(payInAsset)}`;\n }\n if (state === \"exchanging\") {\n return \"Your payment is confirmed and being converted. This usually finishes within a minute.\";\n }\n if (state === \"paying_invoice\" || state === \"completed\") {\n return \"We are checking whether the wallet received the payment. Provider completion alone does not confirm payment.\";\n }\n if (state === \"expired\") return \"No payment was received before the payment window closed.\";\n if (state === \"refund_required\" || state === \"refund_pending\" || state === \"refunded\") {\n return getSwapRefundDetail(state, assetLabel, refundContext);\n }\n if (state === \"attention\") return checkoutLabels.supportReviewNeeded;\n if (state === \"failed\") return \"This payment address can no longer be used.\";\n return state;\n}\n\nfunction getSwapRefundDetail(\n state: string,\n assetLabel: string,\n refundContext: {\n readonly refundReason?: string;\n readonly depositAmount?: string;\n readonly depositReceivedAmount?: string;\n readonly refundAmount?: string;\n },\n): string {\n const reasonDetail = getSwapRefundReasonDetail(refundContext, assetLabel);\n const refundAmountDetail =\n refundContext.refundAmount === undefined\n ? undefined\n : `Estimated refund: ${formatDepositAmount(refundContext.refundAmount)} ${assetLabel} before network fees.`;\n\n if (state === \"refund_required\") {\n const action = \"Enter an address you control to request a refund.\";\n return [reasonDetail, action, refundAmountDetail].filter(Boolean).join(\" \");\n }\n if (state === \"refund_pending\") {\n return [reasonDetail, \"Your refund request has been sent.\", refundAmountDetail]\n .filter(Boolean)\n .join(\" \");\n }\n return [reasonDetail, \"The provider reports the refund was sent.\", refundAmountDetail]\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction getSwapRefundReasonDetail(\n refundContext: {\n readonly refundReason?: string;\n readonly depositAmount?: string;\n readonly depositReceivedAmount?: string;\n },\n assetLabel: string,\n): string | undefined {\n const expected =\n refundContext.depositAmount === undefined\n ? undefined\n : formatDepositAmount(refundContext.depositAmount);\n const received =\n refundContext.depositReceivedAmount === undefined\n ? undefined\n : formatDepositAmount(refundContext.depositReceivedAmount);\n\n if (refundContext.refundReason === \"underpaid\") {\n if (expected !== undefined && received !== undefined) {\n return `You sent ${received} ${assetLabel} but ${expected} ${assetLabel} was required.`;\n }\n return \"The amount received was less than required.\";\n }\n if (refundContext.refundReason === \"overpaid\") {\n if (expected !== undefined && received !== undefined) {\n return `You sent ${received} ${assetLabel} but ${expected} ${assetLabel} was required.`;\n }\n return \"The amount received was more than required.\";\n }\n if (refundContext.refundReason === \"late_deposit\") {\n return \"Your payment arrived after the payment window closed.\";\n }\n if (refundContext.refundReason === \"underpaid_and_late\") {\n if (expected !== undefined && received !== undefined) {\n return `You sent ${received} ${assetLabel} but ${expected} ${assetLabel} was required, and it arrived after the payment window closed.`;\n }\n return \"Your payment was under the required amount and arrived after the window closed.\";\n }\n if (refundContext.refundReason === \"overpaid_and_late\") {\n if (expected !== undefined && received !== undefined) {\n return `You sent ${received} ${assetLabel} but ${expected} ${assetLabel} was required, and it arrived after the payment window closed.`;\n }\n return \"Your payment was over the required amount and arrived after the window closed.\";\n }\n return undefined;\n}\n\n/**\n * Rough payer-facing confirmation guidance by deposit network. Not a SLA \u2014\n * chain congestion and provider policy can take longer.\n */\nexport function getSwapConfirmationWaitHint(payInAsset: string): string {\n const network = payInAssetNetwork(payInAsset);\n if (network === \"TRON\") return \"Confirmation usually takes 1\u20133 minutes.\";\n if (network === \"SOL\") return \"Confirmation usually takes under a minute.\";\n if (network === \"ETH\") return \"Confirmation often takes 5\u201315 minutes.\";\n return \"Confirmation usually takes a few minutes.\";\n}\n\nfunction getSwapPanelState(state: string): SwapDisplayModel[\"state\"] {\n if (state === \"creating_provider_order\") return \"creating\";\n if (state === \"awaiting_deposit\") return \"deposit\";\n if (\n state === \"confirming\" ||\n state === \"exchanging\" ||\n state === \"paying_invoice\" ||\n state === \"completed\"\n ) {\n return \"progress\";\n }\n if (state === \"expired\") return \"expired\";\n if (state === \"refund_required\") return \"refund_required\";\n if (state === \"refund_pending\") return \"refund_pending\";\n if (state === \"refunded\") return \"refunded\";\n if (state === \"attention\") return \"attention\";\n return \"failed\";\n}\n\nexport function getSwapAssetDisplay(payInAsset: string): {\n readonly assetLabel: string;\n readonly networkLabel: string;\n} {\n const network = payInAssetNetwork(payInAsset);\n const networkLabel =\n network === \"TRON\"\n ? \"Tron\"\n : network === \"SOL\"\n ? \"Solana\"\n : network === \"ETH\"\n ? \"Ethereum\"\n : (network ?? payInAsset);\n return {\n assetLabel: payInAsset.split(\"_\")[0] ?? payInAsset,\n networkLabel,\n };\n}\n\n/**\n * The QR the payer scans for a swap deposit.\n *\n * AMOUNT-PREFILL POLICY: only the NATIVE-COIN rails carry an amount\n * (`ethereum:\u2026?value=`, `solana:\u2026?amount=`). Token rails (USDT_TRON, USDT_ETH,\n * USDC_ETH, \u2026) deliberately encode the bare deposit address: the EIP-681\n * token-transfer form is parsed inconsistently across wallets, and a wallet\n * that mis-parses it shows a broken request rather than no prefill. For those\n * rails the panel's \"send exactly X\" is the amount of record.\n *\n * The one thing this never does is silently drop a prefill it was supposed to\n * emit: a deposit_amount from our own server that will not convert throws, and\n * the panel's error surface shows it. An amount-LESS payment URI is the worst\n * outcome of the three, because the wallet then lets the payer type any amount.\n */\nfunction createSwapQrPayload(swap: NonNullable<CheckoutInvoiceSnapshot[\"swap\"]>): string {\n if (swap.pay_in_asset === \"ETH_ETH\") {\n const wei = decimalAmountToIntegerString(swap.deposit_amount, 18);\n return `ethereum:${swap.deposit_address}?value=${wei}`;\n }\n if (swap.pay_in_asset === \"SOL_SOL\") {\n const amount = formatDepositAmount(swap.deposit_amount);\n return `solana:${swap.deposit_address}?amount=${encodeURIComponent(amount)}`;\n }\n return swap.deposit_address;\n}\n\nfunction decimalAmountToIntegerString(amount: string, decimals: number): string {\n const parsed = parseDecimal(amount);\n if (parsed.scale > decimals) {\n throw new RangeError(`deposit_amount is more precise than ${decimals} decimals: ${amount}`);\n }\n return (parsed.units * 10n ** BigInt(decimals - parsed.scale)).toString();\n}\n\n/**\n * Provider states this attempt can never leave, mirroring the engine's swap\n * state table (`terminal: true` there). `refund_required`/`refund_pending` are\n * deliberately absent: the payer still acts on the first, and the second must\n * keep polling to observe the provider reaching `refunded`.\n */\nexport function isTerminalSwapProviderState(providerState: string | undefined): boolean {\n return (\n providerState === \"expired\" ||\n providerState === \"refunded\" ||\n providerState === \"attention\" ||\n providerState === \"failed\"\n );\n}\n", "// Outbound links from the checkout: the block explorer for a deposit or\n// payout transaction, an external bolt11 decoder, and the detail-row link that\n// picks between them. Every URL is built from an allowlisted network, never\n// from provider text.\n\nimport { payInAssetNetwork } from \"@openreceive/core\";\nimport { checkoutLabels } from \"./ui.ts\";\n\n/** Deposit networks that have a public block explorer in OpenReceive UI. */\nexport type ExplorerNetwork = \"ETH\" | \"SOL\" | \"TRON\";\n\n/**\n * Resolve the chain network from a `pay_in_asset` like `USDT_ETH` / `SOL_SOL`.\n * Returns undefined for unknown or Lightning-only values.\n */\nexport function getExplorerNetwork(payInAsset: string | undefined): ExplorerNetwork | undefined {\n const network = payInAsset === undefined ? undefined : payInAssetNetwork(payInAsset);\n if (network === \"ETH\" || network === \"SOL\" || network === \"TRON\") return network;\n return undefined;\n}\n\n/**\n * Public block-explorer URL for an on-chain address or transaction.\n * Lightning identifiers are intentionally unsupported \u2014 use\n * {@link createLightningInvoiceDecodeUrl} for bolt11.\n */\nexport function createBlockExplorerUrl(options: {\n readonly payInAsset?: string;\n readonly network?: ExplorerNetwork | string;\n readonly kind: \"address\" | \"tx\";\n readonly value: string;\n}): string | undefined {\n const value = options.value.trim();\n if (value === \"\") return undefined;\n const network =\n options.network === \"ETH\" || options.network === \"SOL\" || options.network === \"TRON\"\n ? options.network\n : getExplorerNetwork(\n options.payInAsset ?? (typeof options.network === \"string\" ? options.network : undefined),\n );\n if (network === undefined) return undefined;\n const encoded = encodeURIComponent(value);\n if (network === \"ETH\") {\n return options.kind === \"tx\"\n ? `https://etherscan.io/tx/${encoded}`\n : `https://etherscan.io/address/${encoded}`;\n }\n if (network === \"SOL\") {\n return options.kind === \"tx\"\n ? `https://solscan.io/tx/${encoded}`\n : `https://solscan.io/account/${encoded}`;\n }\n return options.kind === \"tx\"\n ? `https://tronscan.org/#/transaction/${encoded}`\n : `https://tronscan.org/#/address/${encoded}`;\n}\n\n/**\n * Link to an external bolt11 decoder, as `{decodeLinkUrl}?invoice={bolt11}`.\n * Strips an optional `lightning:` URI prefix.\n *\n * Off unless the host names a decoder: a bolt11 carries the amount, payee and\n * description, and fetching it hands the payer's IP to that third party too, so\n * OpenReceive never picks one on the host's behalf. Omit `decodeLinkUrl` and no\n * link is rendered.\n */\nexport function createLightningInvoiceDecodeUrl(\n invoice: string,\n decodeLinkUrl?: string,\n): string | undefined {\n const base = decodeLinkUrl?.trim();\n if (base === undefined || base === \"\") return undefined;\n const raw = invoice.trim();\n if (raw === \"\") return undefined;\n const bolt11 = raw.toLowerCase().startsWith(\"lightning:\") ? raw.slice(\"lightning:\".length) : raw;\n if (bolt11 === \"\") return undefined;\n const separator = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${separator}invoice=${encodeURIComponent(bolt11)}`;\n}\n\n/** What a detail row's value IS, which decides the link it can carry. */\nexport type DetailLinkKind = \"invoice\" | \"address\" | \"tx\";\n\n/**\n * External link metadata for a swap/transaction detail row (explorer or decode).\n *\n * `kind` is explicit, never inferred from the row's display label: dispatching\n * on English strings meant renaming a label \u2014 or localizing one \u2014 silently\n * killed its explorer or decode link, with nothing to notice.\n */\nexport function createDetailExternalLink(options: {\n readonly kind: DetailLinkKind;\n readonly value: string;\n readonly payInAsset?: string;\n /** Host-configured bolt11 decoder. Omitted, no decode link is offered. */\n readonly decodeLinkUrl?: string;\n}): { readonly href: string; readonly hrefLabel: string } | undefined {\n const value = options.value.trim();\n if (value === \"\") return undefined;\n if (options.kind === \"invoice\") {\n const href = createLightningInvoiceDecodeUrl(value, options.decodeLinkUrl);\n return href === undefined ? undefined : { href, hrefLabel: checkoutLabels.decodeInvoice };\n }\n const href = createBlockExplorerUrl({\n payInAsset: options.payInAsset,\n kind: options.kind,\n value,\n });\n return href === undefined ? undefined : { href, hrefLabel: checkoutLabels.viewOnExplorer };\n}\n", "// The transaction-details rows: the key/value panel the checkout renders under\n// the invoice, on the live screen and again on the receipt. A pure projection\n// of a checkout state or display data into labelled rows.\n\nimport type { CheckoutState, TransactionDetailRow, TransactionDetailsInput } from \"./ui.ts\";\nimport {\n formatDepositAmount,\n formatFiatAmount,\n formatInvoiceLabel,\n formatMsats,\n formatPaymentHashLabel,\n formatUnixTime,\n} from \"./checkout-format.ts\";\nimport { createDetailExternalLink, type DetailLinkKind } from \"./checkout-links.ts\";\nimport {\n createSwapFeeBreakdown,\n getSwapAssetDisplay,\n swapFeeInTokenUnits,\n} from \"./checkout-swap-view.ts\";\n\n/**\n * Build display rows for settled checkout / swap state from public OpenReceive\n * fields only. Omits undefined values; never surfaces NWC or send-payment secrets.\n *\n * A `checkout_lock` rail returns NO rows. That rail is the deferred placeholder\n * a prepared checkout carries before the payer has chosen anything, so there is\n * no transaction to describe yet \u2014 and a host following \"transaction details on\n * the live checkout AND on the receipt\" would otherwise open a caret over a\n * record of nothing. An empty array is already every caller's \"render nothing\"\n * signal, so the rule enforces itself and no host has to learn the rail\n * vocabulary to obey it.\n */\nexport function createTransactionDetails(input: TransactionDetailsInput): TransactionDetailRow[] {\n if (input.rail === \"checkout_lock\") return [];\n const rows: TransactionDetailRow[] = [];\n const payInAsset = input.swap?.pay_in_asset;\n // `kind` says what the value IS; the label is only shown. A row with no kind\n // carries no external link.\n const push = (\n label: string,\n value: string | undefined,\n copyValue?: string,\n kind?: DetailLinkKind,\n ) => {\n if (value === undefined || value === \"\") return;\n const linkValue = copyValue ?? value;\n const link =\n kind === undefined\n ? undefined\n : createDetailExternalLink({\n kind,\n value: linkValue,\n ...(payInAsset === undefined ? {} : { payInAsset }),\n ...(input.decodeLinkUrl === undefined ? {} : { decodeLinkUrl: input.decodeLinkUrl }),\n });\n rows.push({\n label,\n value,\n ...(copyValue === undefined ? {} : { copyValue }),\n ...(link === undefined ? {} : { href: link.href, hrefLabel: link.hrefLabel }),\n });\n };\n\n push(\"Order ID\", input.reference);\n push(\"Checkout ID\", input.checkout_id);\n push(\"Invoice ID\", input.invoice_id);\n push(\"Rail\", input.rail);\n push(\"Status\", input.transaction_state);\n push(\"Workflow\", input.workflow_state);\n\n if (input.amount_msats !== undefined) {\n push(\"Amount\", formatMsats(input.amount_msats));\n push(\"Amount (msats)\", String(input.amount_msats));\n }\n const fiat = formatFiatAmount(input.fiat_quote?.fiat);\n push(\"Fiat\", fiat);\n\n if (typeof input.invoice === \"string\" && input.invoice.length > 0) {\n push(\"Lightning invoice\", formatInvoiceLabel(input.invoice), input.invoice, \"invoice\");\n }\n if (input.payment_hash !== undefined) {\n push(\"Payment hash\", formatPaymentHashLabel(input.payment_hash), input.payment_hash);\n }\n\n if (input.settled_at !== undefined) {\n push(\"Settled at\", formatUnixTime(input.settled_at));\n }\n if (input.expires_at !== undefined) {\n push(\"Expires at\", formatUnixTime(input.expires_at));\n }\n\n const swap = input.swap;\n if (swap !== undefined) {\n // Once the order settles, swap polling stops (see CheckoutController.syncWatchers),\n // so `provider_state` is the last snapshot taken before settlement \u2014 it can lag\n // (e.g. still \"awaiting_deposit\" when the provider raced through deposit \u2192 payout\n // inside one poll interval). Label it as a last-known value, not a live one.\n // See docs/guides/automated-swaps.md, \"Provider state after settlement\".\n const settled = input.transaction_state === \"settled\";\n const asset = getSwapAssetDisplay(swap.pay_in_asset);\n push(\"Swap provider\", swap.provider);\n push(\"Provider order\", swap.provider_order_id);\n push(\"Swap attempt\", swap.attempt_id);\n push(\"Pay-in asset\", swap.pay_in_asset);\n push(\"Asset\", asset.assetLabel);\n push(\"Network\", asset.networkLabel);\n push(\"Deposit address\", swap.deposit_address, undefined, \"address\");\n push(\"Deposit memo\", swap.deposit_memo);\n push(\"Deposit amount\", formatDepositAmount(swap.deposit_amount));\n if (swap.deposit_received_amount !== undefined) {\n push(\"Amount received\", formatDepositAmount(swap.deposit_received_amount));\n }\n push(settled ? \"Last provider state\" : \"Provider state\", swap.provider_state);\n if (swap.refund_reason !== undefined) {\n push(\"Refund reason\", swap.refund_reason);\n }\n if (swap.refund_amount !== undefined) {\n push(\"Estimated refund\", formatDepositAmount(swap.refund_amount));\n }\n if (swap.provider_expires_at !== undefined) {\n push(\"Provider expires at\", formatUnixTime(swap.provider_expires_at));\n }\n push(\"Deposit transaction\", swap.deposit_tx_id, undefined, \"tx\");\n push(\"Lightning payout\", swap.payout_tx_id);\n push(\"Refund address\", swap.refund_address, undefined, \"address\");\n push(\"Refund transaction\", swap.refund_tx_id, undefined, \"tx\");\n const feeBreakdown = createSwapFeeBreakdown(swap.fee, swap);\n if (feeBreakdown !== undefined) {\n push(\"Cart total\", feeBreakdown.cartTotal);\n push(\"You send\", feeBreakdown.youSend);\n push(\n \"Swap + network fees\",\n feeBreakdown.feePercent === undefined\n ? feeBreakdown.fee\n : `${feeBreakdown.fee} (${feeBreakdown.feePercent})`,\n );\n } else if (swap.fee !== undefined) {\n push(\"Fee currency\", swap.fee.currency);\n // The raw rows follow the same rule as the breakdown: a fiat valuation of\n // a USD-stablecoin deposit is never shown next to the deposit amount.\n if (!swapFeeInTokenUnits(swap.fee, swap.pay_in_asset)) {\n push(\"Pay-in fiat\", swap.fee.pay_in_fiat);\n }\n push(\"Payout fiat\", swap.fee.payout_fiat);\n }\n }\n\n return rows;\n}\n\nexport function createTransactionDetailsFromState(\n state: Pick<\n CheckoutState,\n | \"reference\"\n | \"checkout_id\"\n | \"invoice_id\"\n | \"invoice\"\n | \"rail\"\n | \"payment_hash\"\n | \"amount_msats\"\n | \"fiat_quote\"\n | \"transaction_state\"\n | \"workflow_state\"\n | \"expires_at\"\n | \"settled_at\"\n | \"swap\"\n >,\n): TransactionDetailRow[] {\n return createTransactionDetails({\n reference: state.reference,\n checkout_id: state.checkout_id,\n invoice_id: state.invoice_id,\n invoice: state.invoice,\n rail: state.rail,\n ...(state.payment_hash === undefined ? {} : { payment_hash: state.payment_hash }),\n ...(state.amount_msats === undefined ? {} : { amount_msats: state.amount_msats }),\n ...(state.fiat_quote === undefined ? {} : { fiat_quote: state.fiat_quote }),\n transaction_state: state.transaction_state,\n workflow_state: state.workflow_state,\n ...(state.expires_at === undefined ? {} : { expires_at: state.expires_at }),\n ...(state.settled_at === undefined ? {} : { settled_at: state.settled_at }),\n ...(state.swap === undefined ? {} : { swap: state.swap }),\n });\n}\n\n/**\n * Everything a transaction-details panel accepts: a live checkout state, the\n * flat detail input, pre-built rows, or nothing.\n *\n * React's `<TransactionDetails>` and the elements HTML renderer used to declare\n * this union and its resolver separately, byte-identically. Only the RENDERING\n * legitimately differs between them (React.createElement vs an HTML string);\n * which rows a source yields is one rule and lives here.\n */\nexport type TransactionDetailsSource =\n | CheckoutState\n | TransactionDetailsInput\n | readonly TransactionDetailRow[]\n | null\n | undefined;\n\nexport function resolveTransactionDetailRows(\n source: TransactionDetailsSource,\n): TransactionDetailRow[] {\n if (source === null || source === undefined) return [];\n if (Array.isArray(source)) return [...source];\n if (isCheckoutStateSource(source)) {\n return createTransactionDetailsFromState(source);\n }\n return createTransactionDetails(source as TransactionDetailsInput);\n}\n\n/**\n * Distinguishes a CheckoutState from a flat detail input structurally: only the\n * state carries `phase` next to the identity fields, and only it wants the\n * state-shaped reader above.\n */\nfunction isCheckoutStateSource(value: object): value is CheckoutState {\n return (\n \"checkout_id\" in value &&\n \"reference\" in value &&\n \"invoice_id\" in value &&\n \"invoice\" in value &&\n \"transaction_state\" in value &&\n \"phase\" in value\n );\n}\n", "import type { BrowserLogLevel } from \"./ui.ts\";\n\nconst BROWSER_LOG_LEVEL_ORDER: Record<BrowserLogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nconst BROWSER_LOG_LEVEL_ALIASES: Record<string, BrowserLogLevel> = {\n debug: \"debug\",\n info: \"info\",\n warn: \"warn\",\n warning: \"warn\",\n error: \"error\",\n};\n\n/** Compare browser log levels (`debug` < `info` < `warn` < `error`). */\nexport function browserLogLevelOrder(level: BrowserLogLevel): number {\n return BROWSER_LOG_LEVEL_ORDER[level];\n}\n\n/**\n * Parse `LOG_LEVEL` values such as `DEBUG`, `info`, or `Warning`.\n * Returns `undefined` when the value is missing or unrecognized.\n */\nexport function parseBrowserLogLevel(\n value: string | undefined | null,\n): BrowserLogLevel | undefined {\n if (value === undefined || value === null) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized.length === 0) return undefined;\n return BROWSER_LOG_LEVEL_ALIASES[normalized];\n}\n\n/** Resolve a log level string, falling back to `info` when unset/invalid. */\nexport function resolveBrowserLogLevel(\n value?: string | null,\n fallback: BrowserLogLevel = \"info\",\n): BrowserLogLevel {\n return parseBrowserLogLevel(value) ?? fallback;\n}\n\ntype BrowserEnvSource = Readonly<Record<string, string | undefined>>;\n\n/**\n * Read `LOG_LEVEL` for browser/checkout consoles.\n *\n * Checks, in order:\n * 1. explicit source map\n * 2. `globalThis.__OPENRECEIVE_LOG_LEVEL__` (runtime injection from the host HTML)\n * 3. `import.meta.env.LOG_LEVEL` / `VITE_LOG_LEVEL` / `NEXT_PUBLIC_LOG_LEVEL`\n * 4. `process.env.LOG_LEVEL` when available (SSR / Vite)\n *\n * Default `info`.\n */\nexport function readBrowserLogLevelFromEnvironment(source?: BrowserEnvSource): BrowserLogLevel {\n if (source !== undefined) {\n return resolveBrowserLogLevel(\n source.LOG_LEVEL ?? source.VITE_LOG_LEVEL ?? source.NEXT_PUBLIC_LOG_LEVEL,\n );\n }\n\n const fromGlobal = parseBrowserLogLevel(readGlobalLogLevel());\n if (fromGlobal !== undefined) return fromGlobal;\n\n const metaEnv = readImportMetaEnv();\n const parsedMeta = parseBrowserLogLevel(\n metaEnv?.LOG_LEVEL ?? metaEnv?.VITE_LOG_LEVEL ?? metaEnv?.NEXT_PUBLIC_LOG_LEVEL,\n );\n if (parsedMeta !== undefined) return parsedMeta;\n\n const processEnv =\n typeof process !== \"undefined\" ? (process.env as BrowserEnvSource | undefined) : undefined;\n return resolveBrowserLogLevel(processEnv?.LOG_LEVEL);\n}\n\nfunction readGlobalLogLevel(): string | undefined {\n try {\n const value = (globalThis as { __OPENRECEIVE_LOG_LEVEL__?: unknown }).__OPENRECEIVE_LOG_LEVEL__;\n return typeof value === \"string\" ? value : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readImportMetaEnv(): BrowserEnvSource | undefined {\n try {\n // Property access only \u2014 never a bare `import.meta` reference. Bundlers\n // (webpack) statically replace `import.meta.env`/`import.meta.url`, but a\n // bare reference forces a runtime import.meta mock that throws in\n // classic-script output (`__webpack_module__ is not defined`).\n return (import.meta as ImportMeta & { readonly env?: BrowserEnvSource }).env;\n } catch {\n return undefined;\n }\n}\n", "import { isSensitiveLogKey, sanitizeLogValue } from \"@openreceive/core\";\nimport {\n browserLogLevelOrder,\n readBrowserLogLevelFromEnvironment,\n resolveBrowserLogLevel,\n} from \"./log-level.ts\";\nimport type { BrowserLogEntry, BrowserLogger, BrowserLoggerOption, BrowserLogLevel } from \"./ui.ts\";\n\ntype ConsoleTarget = Pick<Console, \"debug\" | \"info\" | \"warn\" | \"error\" | \"log\">;\n\ninterface ConsoleWriterOptions {\n readonly minLevel?: BrowserLogLevel | string;\n readonly console?: ConsoleTarget;\n readonly now?: () => Date;\n}\n\n/**\n * Shared body of both console loggers: level gate, level\u2192method mapping, and the\n * `[ISO8601] LEVEL [prefix] event: message { fields }` line. Returns a writer that\n * drops entries below the resolved minimum level.\n */\nfunction createConsoleWriter(\n options: ConsoleWriterOptions,\n): (\n level: BrowserLogLevel,\n prefix: string,\n event: string,\n message: string,\n fields: Record<string, unknown>,\n) => void {\n const target = options.console ?? console;\n const now = options.now ?? (() => new Date());\n\n return (level, prefix, event, message, fields) => {\n // Re-resolve when unset so runtime `LOG_LEVEL` / `__OPENRECEIVE_LOG_LEVEL__`\n // changes are honored without rebuilding the client bundle.\n const minLevel =\n options.minLevel === undefined\n ? readBrowserLogLevelFromEnvironment()\n : resolveBrowserLogLevel(options.minLevel);\n if (browserLogLevelOrder(level) < browserLogLevelOrder(minLevel)) {\n return;\n }\n const method =\n level === \"error\"\n ? \"error\"\n : level === \"warn\"\n ? \"warn\"\n : level === \"debug\"\n ? \"debug\"\n : \"info\";\n const sink = target[method] ?? target.log;\n const {\n level: _level,\n event: _event,\n message: cleanMessage,\n ...cleanFields\n } = sanitizeBrowserLogEntry({ level, event, message, ...fields });\n sink.call(\n target,\n `[${now().toISOString()}] ${level.toUpperCase()} [${prefix}] ${event}: ${cleanMessage}`,\n cleanFields,\n );\n };\n}\n\n/**\n * Redact secrets from a browser log entry before it reaches a logger. Any field whose key\n * looks like a secret (`secret`/`token`/`authorization`/`cookie`/`nwc`), at any nesting\n * depth, is replaced with `[REDACTED]`; string values are additionally scrubbed of NWC URIs\n * and `token=`/`secret=` query params. Exported so callers that log a request (including its\n * headers) can guarantee ordinary application secrets never leak.\n */\nexport function sanitizeBrowserLogEntry(entry: BrowserLogEntry): BrowserLogEntry {\n const clean: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(entry)) {\n if (isSensitiveLogKey(key)) {\n clean[key] = \"[REDACTED]\";\n } else {\n clean[key] = sanitizeLogValue(value);\n }\n }\n return clean as BrowserLogEntry;\n}\n\nexport interface CreateBrowserConsoleLoggerOptions {\n /** Prefix before the event, e.g. `openreceive:my-app:client`. Default `openreceive`. */\n readonly prefix?: string;\n /**\n * Minimum level to emit. Default: `LOG_LEVEL` from the environment, or `info`.\n * Accepts the same values as `LOG_LEVEL` (`DEBUG` | `INFO` | `WARN` | `ERROR`).\n */\n readonly minLevel?: BrowserLogLevel | string;\n readonly console?: ConsoleTarget;\n /** Clock for the leading ISO timestamp. Default `() => new Date()`. */\n readonly now?: () => Date;\n}\n\n/**\n * Browser logger that writes OpenReceive checkout log entries to the console.\n * Checkout helpers attach this automatically when `logger` is omitted; pass\n * `logger={false}` / `logger: false` to disable, or a custom sink to override.\n *\n * Format: `[ISO8601] LEVEL [prefix] event: message { fields }`\n */\nexport function createBrowserConsoleLogger(\n options: CreateBrowserConsoleLoggerOptions = {},\n): BrowserLogger {\n const prefix = options.prefix ?? \"openreceive\";\n const write = createConsoleWriter(options);\n\n return (entry: BrowserLogEntry) => {\n const { level, event, message, ...fields } = entry;\n write(level, prefix, event, message, fields);\n };\n}\n\nexport type AppBrowserConsoleLogger = (\n event: string,\n message: string,\n fields?: Record<string, unknown>,\n level?: BrowserLogLevel,\n) => void;\n\nexport interface CreateAppBrowserConsoleLoggerOptions {\n readonly prefix: string;\n /**\n * Minimum level to emit. Default: `LOG_LEVEL` from the environment, or `info`.\n */\n readonly minLevel?: BrowserLogLevel | string;\n readonly console?: ConsoleTarget;\n readonly now?: () => Date;\n}\n\n/** Ad-hoc `(event, message, fields?, level?)` console logger for host browser apps. */\nexport function createAppBrowserConsoleLogger(\n options: CreateAppBrowserConsoleLoggerOptions,\n): AppBrowserConsoleLogger {\n const write = createConsoleWriter(options);\n\n return (event, message, fields = {}, level = \"info\") => {\n write(level, options.prefix, event, message, fields);\n };\n}\n\nlet defaultBrowserConsoleLogger: BrowserLogger | undefined;\n\n/**\n * Built-in console logger used when hosts omit `logger`.\n * Honors `LOG_LEVEL` / `globalThis.__OPENRECEIVE_LOG_LEVEL__` on each emit.\n */\nexport function getDefaultBrowserConsoleLogger(): BrowserLogger {\n defaultBrowserConsoleLogger ??= createBrowserConsoleLogger();\n return defaultBrowserConsoleLogger;\n}\n\n/**\n * Resolve a browser logger option:\n * - `false` disables logging\n * - a function uses that sink\n * - `undefined` attaches the built-in console logger\n */\nexport function resolveBrowserLogger(logger?: BrowserLoggerOption): BrowserLogger | undefined {\n if (logger === false) return undefined;\n if (logger !== undefined) return logger;\n return getDefaultBrowserConsoleLogger();\n}\n", "// The browser checkout's audit log: which fields of a checkout state and of a\n// swap attempt may reach a log sink, and the emitter that sanitizes and\n// forwards them. The field lists here are an allowlist \u2014 see the note on\n// `swapAuditLogFields`.\n\nimport { compact } from \"@openreceive/core\";\nimport { resolveBrowserLogger, sanitizeBrowserLogEntry } from \"./console-logger.ts\";\nimport type { CheckoutState, BrowserLoggerOption, BrowserLogLevel } from \"./ui.ts\";\nimport { getSwapProviderStateLabel } from \"./checkout-swap-view.ts\";\n\n/** The swap fields the checkout audit log is allowed to see. */\ninterface SwapAuditLogSource {\n readonly attempt_id?: string;\n readonly provider?: string;\n readonly provider_order_id?: string;\n readonly pay_in_asset?: string;\n readonly provider_state?: string;\n readonly attention?: boolean;\n readonly attention_reason?: string;\n readonly refund_reason?: string;\n readonly refund_tx_id?: string;\n readonly deposit_tx_id?: string;\n readonly payout_tx_id?: string;\n}\n\nexport function checkoutLogFields(state: {\n readonly checkout_id?: string;\n readonly reference?: string;\n readonly invoice_id?: string;\n readonly payment_hash?: string;\n readonly amount_msats?: number;\n readonly transaction_state?: string;\n readonly workflow_state?: string;\n readonly phase?: string;\n readonly expires_in_seconds?: number;\n readonly settled?: boolean;\n readonly paid?: boolean;\n readonly rail?: string;\n readonly swap?: SwapAuditLogSource;\n}): Record<string, unknown> {\n return compact({\n checkout_id: state.checkout_id,\n reference: state.reference,\n invoice_id: state.invoice_id,\n payment_hash: state.payment_hash,\n amount_msats: state.amount_msats,\n transaction_state: state.transaction_state,\n workflow_state: state.workflow_state,\n phase: state.phase,\n expires_in_seconds: state.expires_in_seconds,\n settled: state.settled,\n paid: state.paid,\n rail: state.rail,\n ...swapAuditLogFields(state.swap),\n });\n}\n\n/**\n * This list is an ALLOWLIST, not a redaction pass: whatever is named here\n * reaches a log sink verbatim \u2014 which is why the preimage and the raw bolt11\n * are absent. tests/browser-checkout-controller.test.mjs holds that line.\n */\nfunction swapAuditLogFields(swap: SwapAuditLogSource | undefined): Record<string, unknown> {\n if (swap === undefined) return {};\n return compact({\n attempt_id: swap.attempt_id,\n provider: swap.provider,\n provider_order_id: swap.provider_order_id,\n pay_in_asset: swap.pay_in_asset,\n provider_state: swap.provider_state,\n attention: swap.attention,\n attention_reason: swap.attention_reason,\n refund_reason: swap.refund_reason,\n refund_tx_id: swap.refund_tx_id,\n deposit_tx_id: swap.deposit_tx_id,\n payout_tx_id: swap.payout_tx_id,\n });\n}\n\nexport function emitBrowserSwapTransition(\n logger: BrowserLoggerOption | undefined,\n previous: CheckoutState | undefined,\n next: CheckoutState,\n): void {\n const previousSwap = previous?.swap;\n const nextSwap = next.swap;\n if (nextSwap === undefined) return;\n\n const previousState = previousSwap?.provider_state;\n const nextState = nextSwap.provider_state;\n const previousAttention = previousSwap?.attention_reason;\n const nextAttention = nextSwap.attention_reason;\n const previousSettled = previous?.settled === true || previous?.paid === true;\n const nextSettled = next.settled === true || next.paid === true;\n\n const stateChanged = previousState !== nextState;\n const attentionChanged = previousAttention !== nextAttention;\n const settlementChanged = previousSettled !== nextSettled;\n if (!stateChanged && !attentionChanged && !settlementChanged) return;\n\n const level: BrowserLogLevel =\n nextState === \"attention\" || nextSwap.attention === true\n ? \"warn\"\n : nextState === \"refund_required\" ||\n nextState === \"refund_pending\" ||\n nextState === \"refunded\" ||\n nextState === \"failed\" ||\n nextState === \"expired\" ||\n settlementChanged\n ? \"info\"\n : \"debug\";\n\n emitBrowserLog(\n logger,\n level,\n \"swap.state.changed\",\n \"Swap attempt state changed in checkout UI.\",\n {\n ...checkoutLogFields(next),\n previous_provider_state: previousState,\n previous_settled: previousSettled,\n wallet_settled: nextSettled,\n ui_label: nextSettled ? \"Payment complete\" : getSwapProviderStateLabel(nextState),\n },\n );\n}\n\nexport function emitBrowserLog(\n logger: BrowserLoggerOption | undefined,\n level: BrowserLogLevel,\n event: string,\n message: string,\n fields: Record<string, unknown> = {},\n): void {\n const sink = resolveBrowserLogger(logger);\n if (sink === undefined) return;\n\n try {\n sink(\n sanitizeBrowserLogEntry({\n level,\n event,\n message,\n ...fields,\n }),\n );\n } catch {\n // Checkout logs are diagnostic only and must not affect user actions.\n }\n}\n", "// Readers that parse our own checkout responses \u2014 a create body, a prepare\n// body, a status poll \u2014 into the typed checkout shape. A required field that\n// is missing or mistyped is a bug in our own API, and throws.\n\nimport { nonEmptyString } from \"@openreceive/core\";\nimport type { CheckoutInvoiceSnapshot } from \"./ui.ts\";\n\nexport function optionalRecord(value: unknown): Record<string, unknown> | undefined {\n if (value === undefined) return undefined;\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"OpenReceive metadata must be an object.\");\n }\n return value as Record<string, unknown>;\n}\n\nexport function requiredInvoiceRail(value: unknown): CheckoutInvoiceSnapshot[\"rail\"] {\n if (value === \"lightning\" || value === \"swap\" || value === \"checkout_lock\") return value;\n throw new TypeError(\"OpenReceive invoice rail must be lightning, swap, or checkout_lock.\");\n}\n\nexport function requiredString(value: unknown, fieldName: string): string {\n const text = nonEmptyString(value);\n if (text === undefined) {\n throw new TypeError(`OpenReceive checkout response requires ${fieldName}.`);\n }\n return text;\n}\n\n/**\n * An optional integer field from our own server. ABSENT means absent; PRESENT\n * but not a safe integer throws, exactly like the required reader below.\n * Returning undefined for a mistyped value made real fields vanish silently \u2014\n * a dropped `paid_at` hid the settlement timestamp, a dropped\n * `provider_expires_at` kept a stale swap deadline on screen.\n */\nexport function optionalSafeInteger(value: unknown, fieldName = \"integer\"): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value !== \"number\" || !Number.isSafeInteger(value)) {\n throw new TypeError(`OpenReceive checkout response ${fieldName} must be a safe integer.`);\n }\n return value;\n}\n\nexport function requiredSafeInteger(value: unknown, fieldName: string): number {\n const integer = optionalSafeInteger(value, fieldName);\n if (integer === undefined) {\n throw new TypeError(`OpenReceive checkout response requires ${fieldName}.`);\n }\n return integer;\n}\n", "import { getSwapRefundAddressError } from \"@openreceive/core/swap-address\";\nimport {\n type AssetIndexEntry,\n getPaymentWizardRoutes,\n listAssets,\n payTutorialImage,\n providerIconUrls,\n type PaymentWizardRoute,\n type Provider,\n type ResolvedProviderRef,\n} from \"@openreceive/provider-data\";\nimport { formatSwapLimit } from \"./checkout-format.ts\";\nimport {\n type CheckoutPhase,\n type CheckoutPaymentMethod,\n type PaymentMethod,\n type PaymentMethodOption,\n type PaymentWizardController,\n type PaymentWizardControllerOptions,\n type PaymentWizardModel,\n type PaymentWizardRequest,\n type PaymentWizardSelection,\n type PaymentWizardSelectionAction,\n type PaymentWizardState,\n type WizardProviderDisplay,\n type WizardProviderTutorialDisplay,\n type WizardRouteAssetDisplay,\n type WizardRouteDisplay,\n type PaymentIconId,\n assetIconIds,\n checkoutLabels,\n paymentIconUrls,\n paymentMethodIconIds,\n orClasses,\n} from \"./ui.ts\";\n\n// Everything the wizard draws ships inside the JavaScript: the payment icons\n// are compiled into this package (`paymentIconUrls` are `data:` URIs), the\n// wallet logos are `data:` URIs in @openreceive/provider-data's main bundle,\n// and the tutorial screenshots are the same behind one dynamic import. Every\n// `icon`/`image` a display model carries is therefore a URL that needs\n// nothing from the host \u2014 no file to copy, serve or resolve. The one\n// host-facing consequence is CSP: a strict `img-src` must allow `data:`.\n\nexport function getBitcoinAssets(): readonly AssetIndexEntry[] {\n return listAssets().filter((asset) => asset.symbol === \"btc\" && asset.route !== undefined);\n}\n\nfunction getDefaultBitcoinRoute(): string | null {\n const routes = [\n ...new Set(\n getBitcoinAssets().flatMap((asset) => (asset.route === undefined ? [] : [asset.route])),\n ),\n ];\n return routes.length === 1 ? (routes[0] ?? null) : null;\n}\n\nexport function getPaymentStatusText(phase: CheckoutPhase): {\n readonly title: string;\n readonly detail: string;\n} {\n if (phase === \"settled\") {\n return {\n title: checkoutLabels.paymentStatus.settledTitle,\n detail: checkoutLabels.paymentStatus.settledDetail,\n };\n }\n if (phase === \"expired\") {\n return {\n title: checkoutLabels.paymentStatus.expiredTitle,\n detail: checkoutLabels.paymentStatus.expiredDetail,\n };\n }\n return {\n title: checkoutLabels.paymentStatus.waitingTitle,\n detail: checkoutLabels.paymentStatus.waitingDetail,\n };\n}\n\nexport function getWizardEmptyMessage(): string {\n return checkoutLabels.emptyBitcoin;\n}\n\nexport function getCheckoutProviderOpenLabel(): string {\n return checkoutLabels.openProvider;\n}\n\nexport function getCheckoutProviderIcon(provider: Pick<Provider, \"icon_path\">): string {\n return providerIconUrls[provider.icon_path] ?? paymentIconUrls.crypto;\n}\n\n/**\n * A tutorial's `image` is `undefined` until `loadPayTutorialImages()` has\n * resolved: renderers call it when a tutorial opens and re-render, drawing the\n * caption alone in the meantime.\n */\nexport function getCheckoutProviderTutorials(\n provider: Pick<Provider, \"tutorials\">,\n): readonly WizardProviderTutorialDisplay[] {\n return (provider.tutorials ?? []).map((tutorial) => ({\n index: tutorial.index,\n path: tutorial.path,\n image: payTutorialImage(tutorial.path),\n caption: tutorial.caption,\n }));\n}\n\nexport function getRouteNetworkLabel(routeId: string): string {\n return routeId === \"lightning\" || routeId === \"btc-lightning\"\n ? checkoutLabels.lightningNetwork\n : routeId;\n}\n\nexport function createWizardRouteAssetDisplays(\n assets: readonly AssetIndexEntry[],\n options: { readonly selectedRoute?: string | null } = {},\n): readonly WizardRouteAssetDisplay[] {\n return assets.map((asset) => {\n const id = asset.route ?? asset.symbol;\n const iconId = routeIconId(asset);\n return {\n id,\n label: asset.label,\n subtitle: getRouteNetworkLabel(id),\n icon: paymentIconUrls[iconId],\n iconId,\n selected: options.selectedRoute === id,\n };\n });\n}\n\n/**\n * The wallet suggestions for each route, as displays.\n *\n * The registry answers ~37 providers for Lightning. Both shipped renderers draw\n * all of them, in a grid on the route screen where that is fine; a host putting\n * them under the invoice instead \u2014 beside a QR, in a fixed-height panel \u2014 wants\n * `providerPreviewLimit` and a \"show all\" affordance built from\n * {@link WizardRouteDisplay.providerCount}. `OPENRECEIVE_PROVIDER_PREVIEW_LIMIT`\n * is the number the shipped styles are drawn against.\n *\n * No default limit, deliberately: the renderers show the whole grid, and a\n * default that silently hid 33 wallets from them would be a worse bug than the\n * one it prevents.\n */\nexport function createWizardRouteDisplays(\n routes: readonly PaymentWizardRoute[],\n options: {\n /** Draw at most this many providers per route. Omitted, every one is drawn. */\n readonly providerPreviewLimit?: number;\n } = {},\n): readonly WizardRouteDisplay[] {\n return routes.map((route) => ({\n key: getWizardRouteDisplayKey(route),\n title: getWizardRouteDisplayTitle(route),\n subtitle: getWizardRouteDisplaySubtitle(route),\n providers: (options.providerPreviewLimit === undefined\n ? route.providers\n : route.providers.slice(0, options.providerPreviewLimit)\n ).map(createWizardProviderDisplay),\n providerCount: route.providers.length,\n }));\n}\n\nfunction getWizardRouteDisplayKey(route: PaymentWizardRoute): string {\n return route.route.id;\n}\n\nfunction getWizardRouteDisplayTitle(route: PaymentWizardRoute): string {\n return route.route.label;\n}\n\nfunction getWizardRouteDisplaySubtitle(route: PaymentWizardRoute): string {\n return route.route.symbol.toUpperCase();\n}\n\nfunction createWizardProviderDisplay(entry: ResolvedProviderRef): WizardProviderDisplay {\n return {\n id: entry.provider.id,\n name: entry.provider.name,\n kind: entry.provider.kind,\n url: entry.provider.lightning_docs_url ?? entry.provider.url,\n icon: getCheckoutProviderIcon(entry.provider),\n tutorials: getCheckoutProviderTutorials(entry.provider),\n copyLabel: checkoutLabels.copyInvoice,\n copiedLabel: checkoutLabels.copied,\n openLabel: getCheckoutProviderOpenLabel(),\n };\n}\n\n// Each `get\u2026Icon` getter answers a URL; its `get\u2026IconId` twin answers the key\n// behind it, which is what a renderer drawing `paymentIconSvgs` inline needs.\n// Same decision, two representations \u2014 the id getters are the one place the\n// mapping lives.\n\nexport function getPaymentMethodIconId(method: PaymentMethod): PaymentIconId {\n return paymentMethodIconIds[method];\n}\n\nexport function getPaymentMethodIcon(method: PaymentMethod): string {\n return paymentIconUrls[getPaymentMethodIconId(method)];\n}\n\nfunction assetIconId(symbol: string): PaymentIconId {\n return assetIconIds[symbol] ?? \"crypto\";\n}\n\n/** Icon id for a swap network label (Tron \u2192 trx, Solana \u2192 sol, Ethereum \u2192 eth). */\nexport function getNetworkIconId(networkLabel: string): PaymentIconId {\n const key = networkLabel.trim().toLowerCase();\n if (key === \"tron\" || key === \"trx\") return \"trx\";\n if (key === \"solana\" || key === \"sol\") return \"sol\";\n if (key === \"ethereum\" || key === \"eth\") return \"eth\";\n return \"crypto\";\n}\n\nexport function getNetworkIcon(networkLabel: string): string {\n return paymentIconUrls[getNetworkIconId(networkLabel)];\n}\n\n/**\n * Icon id for a swap pay-in option card. Always the token/coin mark (USDT,\n * USDC, SOL, \u2026). Network marks (Tron/Solana/Ethereum) belong only in the\n * network reveal via {@link getNetworkIconId}.\n */\nexport function getSwapOptionIconId(option: { readonly label: string }): PaymentIconId {\n return assetIconId(option.label.trim().toLowerCase());\n}\n\nexport function getSwapOptionIcon(option: { readonly label: string }): string {\n return paymentIconUrls[getSwapOptionIconId(option)];\n}\n\nexport interface SwapMethodGroup<T extends { readonly label: string }> {\n readonly label: string;\n readonly options: readonly T[];\n}\n\n/**\n * Collapse multi-network coins (e.g. USDT on Tron/Solana/Ethereum) into one method entry\n * with several network choices. Single-network coins stay as one-option groups.\n */\nexport function groupSwapOptionsByLabel<T extends { readonly label: string }>(\n options: readonly T[],\n): readonly SwapMethodGroup<T>[] {\n const groups: SwapMethodGroup<T>[] = [];\n const indexByLabel = new Map<string, number>();\n for (const option of options) {\n const key = option.label.trim().toUpperCase();\n const existing = indexByLabel.get(key);\n if (existing === undefined) {\n indexByLabel.set(key, groups.length);\n groups.push({ label: option.label, options: [option] });\n continue;\n }\n const group = groups[existing];\n if (group === undefined) continue;\n groups[existing] = { label: group.label, options: [...group.options, option] };\n }\n return groups;\n}\n\n/**\n * Preferred checkout method-grid order when swap coins are present:\n * Bitcoin \u2192 USDT \u2192 USDC \u2192 SOL \u2192 ETH, then leftovers (including Crypto).\n */\nexport const OPENRECEIVE_METHOD_GRID_ORDER = [\n { kind: \"method\", id: \"bitcoin\" },\n { kind: \"swap\", label: \"USDT\" },\n { kind: \"swap\", label: \"USDC\" },\n { kind: \"swap\", label: \"SOL\" },\n { kind: \"swap\", label: \"ETH\" },\n] as const;\n\nexport type MethodGridEntry<T extends { readonly label: string }> =\n | {\n readonly kind: \"method\";\n readonly method: PaymentMethodOption;\n }\n | {\n readonly kind: \"swap\";\n readonly group: SwapMethodGroup<T>;\n };\n\n/**\n * Interleave payment methods with grouped swap coins in the preferred grid order.\n * When no swap options are present yet, returns the payment methods only.\n */\nexport function buildMethodGridEntries<T extends { readonly label: string }>(\n paymentMethods: readonly PaymentMethodOption[],\n swapOptions: readonly T[],\n): readonly MethodGridEntry<T>[] {\n const swapGroups = groupSwapOptionsByLabel(swapOptions);\n if (swapGroups.length === 0) {\n return paymentMethods.map((method) => ({ kind: \"method\" as const, method }));\n }\n\n const methodsById = new Map(paymentMethods.map((method) => [method.id, method]));\n const groupsByLabel = new Map(\n swapGroups.map((group) => [group.label.trim().toUpperCase(), group] as const),\n );\n const usedMethodIds = new Set<string>();\n const usedSwapLabels = new Set<string>();\n const entries: MethodGridEntry<T>[] = [];\n\n for (const slot of OPENRECEIVE_METHOD_GRID_ORDER) {\n if (slot.kind === \"method\") {\n const method = methodsById.get(slot.id);\n if (method === undefined) continue;\n usedMethodIds.add(method.id);\n entries.push({ kind: \"method\", method });\n continue;\n }\n const group = groupsByLabel.get(slot.label);\n if (group === undefined) continue;\n usedSwapLabels.add(slot.label);\n entries.push({ kind: \"swap\", group });\n }\n\n for (const method of paymentMethods) {\n if (usedMethodIds.has(method.id)) continue;\n entries.push({ kind: \"method\", method });\n }\n for (const group of swapGroups) {\n const key = group.label.trim().toUpperCase();\n if (usedSwapLabels.has(key)) continue;\n entries.push({ kind: \"swap\", group });\n }\n return entries;\n}\n\nexport type PaymentAccentId = \"bitcoin\" | \"usdt\" | \"usdc\" | \"sol\" | \"eth\" | \"default\";\n\nexport function swapPickerKey(label: string): string {\n return `swap:${label.trim().toUpperCase()}`;\n}\n\nexport function parseMethodPickerKey(\n key: string,\n): { readonly kind: \"method\"; readonly methodId: string } | null {\n if (!key.startsWith(\"method:\")) return null;\n return { kind: \"method\", methodId: key.slice(\"method:\".length) };\n}\n\nexport function parseSwapPickerKey(\n key: string,\n): { readonly kind: \"swap\"; readonly label: string } | null {\n if (!key.startsWith(\"swap:\")) return null;\n return { kind: \"swap\", label: key.slice(\"swap:\".length) };\n}\n\nexport function paymentAccentId(labelOrMethodId: string): PaymentAccentId {\n const key = labelOrMethodId.trim().toLowerCase();\n if (key === \"bitcoin\" || key === \"btc\") return \"bitcoin\";\n if (key === \"usdt\") return \"usdt\";\n if (key === \"usdc\") return \"usdc\";\n if (key === \"sol\" || key === \"solana\") return \"sol\";\n if (key === \"eth\" || key === \"ethereum\") return \"eth\";\n return \"default\";\n}\n\nconst assetActiveClassByAccent: Readonly<Record<PaymentAccentId, string>> = {\n bitcoin: orClasses.methodCardActiveBitcoin,\n usdt: orClasses.methodCardActiveUsdt,\n usdc: orClasses.methodCardActiveUsdc,\n sol: orClasses.methodCardActiveSol,\n eth: orClasses.methodCardActiveEth,\n default: orClasses.methodCardActiveDefault,\n};\n\nconst networkActiveClassByAccent: Readonly<Record<\"usdt\" | \"usdc\" | \"default\", string>> = {\n usdt: orClasses.methodNetworkButtonActiveUsdt,\n usdc: orClasses.methodNetworkButtonActiveUsdc,\n default: orClasses.methodNetworkButtonActiveDefault,\n};\n\nexport function assetButtonClasses(options: {\n readonly accent: PaymentAccentId;\n readonly selected: boolean;\n readonly disabled?: boolean;\n}): string {\n const base = options.disabled ? orClasses.methodCardUnavailable : orClasses.methodCardReady;\n if (!options.selected || options.disabled) return base;\n return `${base} ${assetActiveClassByAccent[options.accent]}`;\n}\n\nexport function networkButtonClasses(options: {\n readonly accent: PaymentAccentId;\n readonly selected: boolean;\n readonly disabled?: boolean;\n}): string {\n if (options.disabled) return orClasses.methodNetworkButtonUnavailable;\n if (!options.selected) return orClasses.methodNetworkButton;\n const accent =\n options.accent === \"usdt\" || options.accent === \"usdc\" ? options.accent : \"default\";\n return `${orClasses.methodNetworkButton} ${networkActiveClassByAccent[accent]}`;\n}\n\nexport function networkMobileRevealClasses(accent: PaymentAccentId): string {\n if (accent === \"usdt\") return orClasses.methodNetworkRevealMobileUsdt;\n if (accent === \"usdc\") return orClasses.methodNetworkRevealMobileUsdc;\n return orClasses.methodNetworkRevealMobile;\n}\n\nexport function networkCheckClasses(accent: PaymentAccentId): string {\n return accent === \"usdc\" ? orClasses.methodNetworkCheckUsdc : orClasses.methodNetworkCheck;\n}\n\nexport function networkSummaryIconClasses(accent: PaymentAccentId): string {\n return accent === \"usdc\"\n ? orClasses.methodNetworkSummaryIconUsdc\n : orClasses.methodNetworkSummaryIcon;\n}\n\nexport function formatNetworkSummary(assetLabel: string, networkLabel: string): string {\n return checkoutLabels.networkSummary\n .replace(\"{asset}\", assetLabel)\n .replace(\"{network}\", networkLabel);\n}\n\n/**\n * The line under a coin tile's name: the networks that coin can arrive on,\n * \"Tron \u00B7 Solana \u00B7 Ethereum\".\n *\n * Both renderers read it here, so a tile can never list different networks from\n * the reveal panel underneath it. Duplicates are dropped rather than repeated:\n * two USDT_SOL rows from a provider catalog are one network to a payer.\n */\nexport function formatMethodNetworkDetail(\n options: readonly { readonly network_label: string }[],\n): string {\n const labels: string[] = [];\n for (const option of options) {\n const label = option.network_label.trim();\n if (label.length > 0 && !labels.includes(label)) labels.push(label);\n }\n return labels.join(\" \u00B7 \");\n}\n\nexport function formatChooseNetworkHeading(assetLabel: string): string {\n return checkoutLabels.chooseAssetNetwork.replace(\"{asset}\", assetLabel);\n}\n\n/**\n * When switching between multi-network coins, reuse the prior network label if the\n * newly selected coin supports it. Otherwise clear that coin's network selection.\n */\nexport function resolvePreservedNetworkSelection<\n T extends {\n readonly pay_in_asset: string;\n readonly network_label: string;\n readonly available?: boolean;\n },\n>(options: {\n readonly previousGroup: { readonly label: string; readonly options: readonly T[] } | undefined;\n readonly nextGroup: { readonly label: string; readonly options: readonly T[] };\n readonly selectedAssetByGroup: Readonly<Record<string, string>>;\n}): string | undefined {\n const nextKey = options.nextGroup.label.trim().toUpperCase();\n const current = options.selectedAssetByGroup[nextKey];\n if (\n current !== undefined &&\n options.nextGroup.options.some(\n (option) => option.pay_in_asset === current && option.available !== false,\n )\n ) {\n return current;\n }\n\n const previous = options.previousGroup;\n if (previous === undefined) return undefined;\n const previousKey = previous.label.trim().toUpperCase();\n const previousAsset = options.selectedAssetByGroup[previousKey];\n if (previousAsset === undefined) return undefined;\n const previousOption = previous.options.find((option) => option.pay_in_asset === previousAsset);\n if (previousOption === undefined) return undefined;\n const match = options.nextGroup.options.find(\n (option) => option.network_label === previousOption.network_label && option.available !== false,\n );\n return match?.pay_in_asset;\n}\n\n/** The swap group a compact-selector picker key points at, when it is a swap key. */\nexport function findSwapGridGroup<T extends { readonly label: string }>(\n entries: readonly MethodGridEntry<T>[],\n pickerKey: string | null | undefined,\n): SwapMethodGroup<T> | undefined {\n if (pickerKey === null || pickerKey === undefined) return undefined;\n const parsed = parseSwapPickerKey(pickerKey);\n if (parsed === null) return undefined;\n const entry = entries.find(\n (entry) => entry.kind === \"swap\" && entry.group.label.trim().toUpperCase() === parsed.label,\n );\n return entry?.kind === \"swap\" ? entry.group : undefined;\n}\n\n/**\n * Per-coin network selection after a picker tile is selected: keeps the coin's\n * own prior pick when still available, otherwise carries the previously\n * selected coin's network over when the new coin supports it (see\n * {@link resolvePreservedNetworkSelection}), otherwise clears the\n * coin's entry. Returns the map unchanged for non-swap keys and single-network\n * groups.\n */\nexport function updateSelectedSwapAssetByGroup<\n T extends {\n readonly label: string;\n readonly pay_in_asset: string;\n readonly network_label: string;\n readonly available?: boolean;\n },\n>(options: {\n readonly entries: readonly MethodGridEntry<T>[];\n readonly nextKey: string;\n readonly previousKey: string | null;\n readonly selectedAssetByGroup: Readonly<Record<string, string>>;\n}): Record<string, string> {\n const nextGroup = findSwapGridGroup(options.entries, options.nextKey);\n if (nextGroup === undefined || nextGroup.options.length <= 1) {\n return options.selectedAssetByGroup;\n }\n const previousGroup = findSwapGridGroup(options.entries, options.previousKey);\n const preserved = resolvePreservedNetworkSelection({\n previousGroup,\n nextGroup,\n selectedAssetByGroup: options.selectedAssetByGroup,\n });\n const groupKey = nextGroup.label.trim().toUpperCase();\n if (preserved === undefined) {\n const { [groupKey]: _removed, ...rest } = options.selectedAssetByGroup;\n return rest;\n }\n return { ...options.selectedAssetByGroup, [groupKey]: preserved };\n}\n\n/**\n * What a compact-selector tile click means, resolved once.\n *\n * The network question exists ONLY because a deposit address is\n * network-specific and a wrong send is unrecoverable \u2014 which is exactly why it\n * must not be asked when it is not a real question. A single-network group\n * therefore resolves to `start_swap`, not `choose_network`: the rule is data\n * here, so a custom UI cannot ask a group with one answer which answer it wants.\n */\nexport type WizardSelection<T extends { readonly label: string }> =\n | { readonly kind: \"select_method\"; readonly methodId: string }\n | { readonly kind: \"start_swap\"; readonly payInAsset: string }\n | {\n readonly kind: \"choose_network\";\n readonly group: SwapMethodGroup<T>;\n readonly groupKey: string;\n readonly heading: string;\n readonly panelId: string;\n readonly headingId: string;\n /**\n * The per-group choice map after the pick, from\n * {@link updateSelectedSwapAssetByGroup}: keyed by GROUP KEY\n * (`group.label` upper-cased), valued by the chosen option's\n * `pay_in_asset` \u2014 NOT its `network_label`. A deposit address is\n * network-specific, so the value has to be the thing that identifies the\n * address, and `pay_in_asset` is what every other seam here keys on.\n */\n readonly selectedAssetByGroup: Record<string, string>;\n }\n | { readonly kind: \"none\" };\n\n/**\n * Resolve a picker key against the grid: which of the three things a tile click\n * can mean, with everything that arm needs already in hand.\n *\n * `previousKey` is the tile that was open before, so a carried-over network\n * choice resolves the same way it does in both shipped renderers.\n */\nexport function resolveWizardSelection<\n T extends {\n readonly label: string;\n readonly pay_in_asset: string;\n readonly network_label: string;\n readonly available?: boolean;\n },\n>(options: {\n readonly pickerKey: string;\n readonly previousKey?: string | null;\n readonly entries: readonly MethodGridEntry<T>[];\n /** Keyed by group key, valued by the chosen option's `pay_in_asset`. */\n readonly selectedAssetByGroup?: Readonly<Record<string, string>>;\n}): WizardSelection<T> {\n const methodPick = parseMethodPickerKey(options.pickerKey);\n if (methodPick !== null) return { kind: \"select_method\", methodId: methodPick.methodId };\n const group = findSwapGridGroup(options.entries, options.pickerKey);\n if (group === undefined) return { kind: \"none\" };\n const selectedAssetByGroup = options.selectedAssetByGroup ?? {};\n if (group.options.length <= 1) {\n // One network is not a question. Prefer an available option so a group whose\n // only entry is out of range resolves to `none` rather than starting a swap\n // the server will refuse.\n const option = group.options.find((entry) => entry.available !== false);\n if (option === undefined) return { kind: \"none\" };\n return { kind: \"start_swap\", payInAsset: option.pay_in_asset };\n }\n const groupKey = group.label.trim().toUpperCase();\n return {\n kind: \"choose_network\",\n group,\n groupKey,\n heading: formatChooseNetworkHeading(group.label),\n ...wizardNetworkGroupIds(groupKey),\n selectedAssetByGroup: updateSelectedSwapAssetByGroup({\n entries: options.entries,\n nextKey: options.pickerKey,\n previousKey: options.previousKey ?? null,\n selectedAssetByGroup,\n }),\n };\n}\n\n/** Invoice-side amount context for fiat swap-limit notes. */\nexport interface SwapLimitContext {\n readonly amount_msats: number;\n readonly fiat?: { readonly currency: string; readonly value: string };\n}\n\n/**\n * The generated DOM ids for one network group's disclosure panel and its\n * heading. ONE helper so `aria-controls` and `aria-labelledby` cannot disagree\n * \u2014 between the two renderers, or between the two ids inside one of them (the\n * element used to sanitize the panel id and not the heading id; React\n * sanitized neither).\n */\nexport function wizardNetworkGroupIds(groupKey: string): {\n readonly panelId: string;\n readonly headingId: string;\n} {\n const slug = groupKey.toLowerCase().replace(/[^a-z0-9_-]/g, \"-\");\n return { panelId: `network-panel-${slug}`, headingId: `network-heading-${slug}` };\n}\n\n/**\n * The out-of-range swap panel, as data. Both renderers build the same panel\n * from this: the element writes HTML, React writes elements, and neither one\n * owns the copy or the range arithmetic.\n */\nexport interface SwapUnavailableModel {\n readonly title: string;\n readonly detail: string;\n /** Accepted pay-in range, when the provider reported limits. */\n readonly range?: string;\n readonly hint: string;\n}\n\nexport function createSwapUnavailableModel(\n option: Pick<\n CheckoutPaymentMethod,\n | \"label\"\n | \"available\"\n | \"unavailable_reason\"\n | \"unavailable_message\"\n | \"minimum_invoice_amount_msats\"\n | \"maximum_invoice_amount_msats\"\n | \"minimum_pay_amount\"\n | \"maximum_pay_amount\"\n >,\n checkout: SwapLimitContext | undefined,\n): SwapUnavailableModel {\n const detail =\n swapOptionLimitMessage(option, checkout) ??\n option.unavailable_message ??\n checkoutLabels.swapUnavailableFallback.replace(\"{asset}\", option.label);\n const range =\n option.minimum_pay_amount === undefined\n ? undefined\n : option.maximum_pay_amount === undefined\n ? checkoutLabels.swapUnavailableMinimumOnly\n .replace(\"{minimum}\", option.minimum_pay_amount)\n .replace(\"{asset}\", option.label)\n : checkoutLabels.swapUnavailableRange\n .replace(\"{minimum}\", option.minimum_pay_amount)\n .replace(\"{maximum}\", option.maximum_pay_amount)\n .replace(\"{asset}\", option.label);\n return {\n title: checkoutLabels.swapUnavailableTitle.replace(\"{asset}\", option.label),\n detail,\n ...(range === undefined ? {} : { range }),\n hint: checkoutLabels.swapUnavailableHint,\n };\n}\n\n/**\n * Short reason to show for an out-of-range swap asset. Prefers a fiat figure\n * (\"Minimum amount $10.00\") converted from the invoice-side limit using the\n * checkout's own rate, falling back to the pay-in asset's own units\n * (\"Minimum 5 USDT\") when the provider only reports pay-side limits, then to\n * the provider's generic message.\n */\nexport function swapOptionLimitMessage(\n option: Pick<\n CheckoutPaymentMethod,\n | \"label\"\n | \"available\"\n | \"unavailable_reason\"\n | \"unavailable_message\"\n | \"minimum_invoice_amount_msats\"\n | \"maximum_invoice_amount_msats\"\n | \"minimum_pay_amount\"\n | \"maximum_pay_amount\"\n >,\n checkout: SwapLimitContext | undefined,\n): string | undefined {\n if (option.available !== false) return undefined;\n if (option.unavailable_reason === \"amount_too_small\") {\n const fiat =\n checkout === undefined\n ? undefined\n : formatSwapLimit(checkout, option.minimum_invoice_amount_msats, \"ceil\");\n if (fiat !== undefined) return `Minimum amount ${fiat}`;\n if (option.minimum_pay_amount !== undefined) {\n return `Minimum ${option.minimum_pay_amount} ${option.label}`;\n }\n }\n if (option.unavailable_reason === \"amount_too_large\") {\n const fiat =\n checkout === undefined\n ? undefined\n : formatSwapLimit(checkout, option.maximum_invoice_amount_msats, \"floor\");\n if (fiat !== undefined) return `Maximum amount ${fiat}`;\n if (option.maximum_pay_amount !== undefined) {\n return `Maximum ${option.maximum_pay_amount} ${option.label}`;\n }\n }\n return option.unavailable_message;\n}\n\n/**\n * The same limit as {@link swapOptionLimitMessage}, as ONE finished sentence:\n * \"To pay with SOL, your cart total must be at least $2.43.\"\n *\n * `createSwapUnavailableModel` answers the case where the payer PICKED an\n * unavailable asset and lands on a pane, which has room for a title, a detail,\n * a range and a hint. A grid that disables the tile instead has nowhere to put\n * four parts and needs one line \u2014 for a tooltip, a caption, an `aria-label`.\n * Both are built from the same figures, so the tile and the pane cannot quote\n * different numbers.\n *\n * Returns `undefined` for an option that is available; for an unavailable one\n * it always returns something, falling back to the provider's own message and\n * then to the generic sentence, so a caption is never blank.\n *\n * @param options.label Override the asset name in the sentence \u2014 pass the GROUP\n * label (\"USDT\") when the tile represents a group whose cheapest entry point\n * came from {@link swapGroupLimitOption}, so the sentence names what the payer\n * clicked rather than one network behind it.\n */\nexport function swapOptionLimitSentence(\n option: Pick<\n CheckoutPaymentMethod,\n | \"label\"\n | \"available\"\n | \"unavailable_reason\"\n | \"unavailable_message\"\n | \"minimum_invoice_amount_msats\"\n | \"maximum_invoice_amount_msats\"\n | \"minimum_pay_amount\"\n | \"maximum_pay_amount\"\n >,\n checkout: SwapLimitContext | undefined,\n options: { readonly label?: string } = {},\n): string | undefined {\n if (option.available !== false) return undefined;\n const asset = options.label ?? option.label;\n const sentence = (template: string, amount: string): string =>\n template.replace(\"{asset}\", asset).replaceAll(\"{amount}\", amount);\n\n if (option.unavailable_reason === \"amount_too_small\") {\n const fiat =\n checkout === undefined\n ? undefined\n : formatSwapLimit(checkout, option.minimum_invoice_amount_msats, \"ceil\");\n if (fiat !== undefined) return sentence(checkoutLabels.swapCartMinimumSentence, fiat);\n if (option.minimum_pay_amount !== undefined) {\n return sentence(checkoutLabels.swapPayMinimumSentence, option.minimum_pay_amount);\n }\n }\n if (option.unavailable_reason === \"amount_too_large\") {\n const fiat =\n checkout === undefined\n ? undefined\n : formatSwapLimit(checkout, option.maximum_invoice_amount_msats, \"floor\");\n if (fiat !== undefined) return sentence(checkoutLabels.swapCartMaximumSentence, fiat);\n if (option.maximum_pay_amount !== undefined) {\n return sentence(checkoutLabels.swapPayMaximumSentence, option.maximum_pay_amount);\n }\n }\n return (\n option.unavailable_message ?? checkoutLabels.swapUnavailableFallback.replace(\"{asset}\", asset)\n );\n}\n\n/** Prefer the lowest invoice-side floor when every network in a group is unavailable. */\nexport function swapGroupLimitOption<\n T extends {\n readonly available?: boolean;\n readonly unavailable_reason?: string;\n readonly minimum_invoice_amount_msats?: number;\n },\n>(options: readonly T[]): T | undefined {\n if (options.length === 0) return undefined;\n const unavailable = options.filter((option) => option.available === false);\n const tooSmall = unavailable.filter((option) => option.unavailable_reason === \"amount_too_small\");\n const candidates =\n tooSmall.length > 0 ? tooSmall : unavailable.length > 0 ? unavailable : options;\n let best = candidates[0];\n for (const option of candidates) {\n if (best === undefined) {\n best = option;\n continue;\n }\n const bestMin = best.minimum_invoice_amount_msats;\n const optionMin = option.minimum_invoice_amount_msats;\n if (optionMin === undefined) continue;\n if (bestMin === undefined || optionMin < bestMin) best = option;\n }\n return best;\n}\n\n/** One method-grid tile, as data. */\nexport type MethodGridDisplayEntry<T extends { readonly label: string }> =\n | {\n readonly kind: \"method\";\n readonly method: PaymentMethodOption;\n readonly accent: PaymentAccentId;\n readonly disabled: boolean;\n }\n | { readonly kind: \"swap\"; readonly group: MethodGridGroupDisplay<T> };\n\n/**\n * One coin's tile in the method grid, with every derivation both renderers used\n * to redo by hand.\n *\n * `needsNetworkStep` and `startPayInAsset` are the `options.length > 1` rule as\n * DATA: a tile either opens the network step or starts a swap outright, and a\n * renderer picking between two DOM attributes never re-derives which.\n */\nexport interface MethodGridGroupDisplay<T extends { readonly label: string }> {\n readonly label: string;\n /** The group's normalized key \u2014 how `selectedAssetByGroup` is keyed. */\n readonly groupKey: string;\n readonly pickerKey: string;\n readonly accent: PaymentAccentId;\n readonly options: readonly T[];\n readonly multiNetwork: boolean;\n /** This tile is the open one in the compact selector. */\n readonly selected: boolean;\n /** A swap on one of this group's networks is being started right now. */\n readonly starting: boolean;\n /** Every network in the group is out of range for this cart. */\n readonly disabled: boolean;\n /** The option the tile's icon and title stand for. */\n readonly displayOption: T;\n /** The payer's pick when there is one, else {@link displayOption}. */\n readonly activeOption: T;\n readonly selectedOption?: T;\n /**\n * The SHORT tile message (\"Minimum amount $2.71\"), present only when the tile\n * is disabled \u2014 the pane's full sentence is a different string, deliberately\n * (see `swapOptionLimitSentence`).\n */\n readonly limitMessage?: string;\n readonly panelId: string;\n readonly headingId: string;\n readonly heading: string;\n readonly needsNetworkStep: boolean;\n readonly startPayInAsset?: string;\n}\n\n/** The compact selector's Continue button, as data. */\nexport interface MethodGridContinueDisplay {\n readonly payInAsset: string;\n readonly disabled: boolean;\n /** This exact asset is the one being started. */\n readonly starting: boolean;\n /** Finished copy: the limit message, \"Preparing payment\", or \"Continue\". */\n readonly label: string;\n}\n\n/**\n * The method grid as a display model \u2014 the last pane on the headless surface\n * that had none (routes have `createWizardRouteDisplays`, the deposit panel\n * `createSwapDisplayModel`, status `createCheckoutStatusModel`).\n */\nexport interface MethodGridDisplay<T extends { readonly label: string }> {\n readonly entries: readonly MethodGridDisplayEntry<T>[];\n /** A swap start is in flight, so every tile is inert. */\n readonly gridBusy: boolean;\n /** The open tile has more than one network, so a choice is still owed. */\n readonly networkRequired: boolean;\n readonly selectedGroup?: MethodGridGroupDisplay<T>;\n readonly continueTarget?: MethodGridContinueDisplay;\n readonly canContinue: boolean;\n}\n\n/**\n * Build the method grid's display model from the grid entries plus the three\n * pieces of renderer state (which tile is open, which network each coin is set\n * to, which asset is starting) and the invoice-side amount the limit notes are\n * quoted against.\n */\nexport function createMethodGridDisplay<\n T extends {\n readonly label: string;\n readonly pay_in_asset: string;\n readonly network_label: string;\n readonly available: boolean;\n readonly unavailable_reason?: string;\n readonly unavailable_message?: string;\n readonly minimum_pay_amount?: string;\n readonly maximum_pay_amount?: string;\n readonly minimum_invoice_amount_msats?: number;\n readonly maximum_invoice_amount_msats?: number;\n },\n>(options: {\n readonly entries: readonly MethodGridEntry<T>[];\n readonly selectedPickerKey?: string | null;\n /** Keyed by group key, valued by the chosen option's `pay_in_asset`. */\n readonly selectedAssetByGroup?: Readonly<Record<string, string>>;\n /** The asset whose swap is being started, or null/undefined for none. */\n readonly startingAsset?: string | null;\n readonly checkout?: SwapLimitContext;\n}): MethodGridDisplay<T> {\n const selectedKey = options.selectedPickerKey ?? null;\n const selectedAssetByGroup = options.selectedAssetByGroup ?? {};\n const startingAsset =\n options.startingAsset === null || options.startingAsset === \"\"\n ? undefined\n : options.startingAsset;\n const gridBusy = startingAsset !== undefined;\n\n const entries: MethodGridDisplayEntry<T>[] = [];\n for (const entry of options.entries) {\n if (entry.kind === \"method\") {\n entries.push({\n kind: \"method\",\n method: entry.method,\n accent: paymentAccentId(entry.method.id),\n disabled: gridBusy,\n });\n continue;\n }\n const group = entry.group;\n const displayOption =\n group.options.find((option) => option.available !== false) ?? group.options[0];\n // An empty group has no tile to draw; both renderers already bailed here.\n if (displayOption === undefined) continue;\n const groupKey = group.label.trim().toUpperCase();\n const multiNetwork = group.options.length > 1;\n const selectedAsset = selectedAssetByGroup[groupKey];\n const selectedOption =\n selectedAsset === undefined\n ? undefined\n : group.options.find((option) => option.pay_in_asset === selectedAsset);\n const activeOption = selectedOption ?? displayOption;\n const disabled = group.options.every((option) => option.available === false);\n const limitOption = disabled\n ? (swapGroupLimitOption(group.options) ?? activeOption)\n : activeOption;\n entries.push({\n kind: \"swap\",\n group: {\n label: group.label,\n groupKey,\n pickerKey: swapPickerKey(group.label),\n accent: paymentAccentId(group.label),\n options: group.options,\n multiNetwork,\n selected: selectedKey === swapPickerKey(group.label),\n starting: group.options.some((option) => option.pay_in_asset === startingAsset),\n disabled,\n displayOption,\n activeOption,\n ...(selectedOption === undefined ? {} : { selectedOption }),\n ...(() => {\n const limitMessage = swapOptionLimitMessage(limitOption, options.checkout);\n return limitMessage === undefined ? {} : { limitMessage };\n })(),\n ...wizardNetworkGroupIds(groupKey),\n heading: formatChooseNetworkHeading(group.label),\n needsNetworkStep: multiNetwork,\n ...(multiNetwork ? {} : { startPayInAsset: displayOption.pay_in_asset }),\n },\n });\n }\n\n const selectedGroup = entries.find(\n (entry): entry is Extract<MethodGridDisplayEntry<T>, { kind: \"swap\" }> =>\n entry.kind === \"swap\" && entry.group.pickerKey === selectedKey,\n )?.group;\n const networkRequired = selectedGroup?.multiNetwork === true;\n const selectedNetworkOption = selectedGroup?.selectedOption;\n const continueTarget =\n selectedNetworkOption === undefined\n ? undefined\n : buildContinueDisplay(selectedNetworkOption, {\n gridBusy,\n startingAsset,\n checkout: options.checkout,\n });\n\n return {\n entries,\n gridBusy,\n networkRequired,\n ...(selectedGroup === undefined ? {} : { selectedGroup }),\n ...(continueTarget === undefined ? {} : { continueTarget }),\n canContinue: continueTarget !== undefined && !continueTarget.disabled,\n };\n}\n\nfunction buildContinueDisplay<\n T extends Pick<\n CheckoutPaymentMethod,\n | \"label\"\n | \"pay_in_asset\"\n | \"available\"\n | \"unavailable_reason\"\n | \"unavailable_message\"\n | \"minimum_pay_amount\"\n | \"maximum_pay_amount\"\n | \"minimum_invoice_amount_msats\"\n | \"maximum_invoice_amount_msats\"\n >,\n>(\n option: T,\n context: {\n readonly gridBusy: boolean;\n readonly startingAsset: string | undefined;\n readonly checkout: SwapLimitContext | undefined;\n },\n): MethodGridContinueDisplay {\n const outOfRange = option.available === false;\n const starting = option.pay_in_asset === context.startingAsset;\n const limitMessage = swapOptionLimitMessage(option, context.checkout);\n return {\n payInAsset: option.pay_in_asset,\n disabled: outOfRange || context.gridBusy,\n starting,\n label:\n outOfRange && limitMessage !== undefined\n ? limitMessage\n : starting\n ? checkoutLabels.preparingPayment\n : checkoutLabels.continue,\n };\n}\n\n/**\n * Payer-facing validation for a swap refund address, shared by every refund\n * form: an empty address prompts for one, anything else is checked against the\n * pay-in asset's address format.\n */\nexport function getSwapRefundFormError(\n payInAsset: string,\n address: string,\n networkLabel: string,\n): string | undefined {\n if (address.length === 0) return \"Enter a refund address.\";\n return getSwapRefundAddressError(payInAsset, address, networkLabel);\n}\n\nexport function getRouteIcon(asset: Pick<AssetIndexEntry, \"route\" | \"symbol\">): string {\n return paymentIconUrls[routeIconId(asset)];\n}\n\nfunction routeIconId(asset: Pick<AssetIndexEntry, \"route\" | \"symbol\">): PaymentIconId {\n const routeId = asset.route ?? asset.symbol;\n if (asset.symbol === \"btc\" && routeId.includes(\"lightning\")) return \"lightning\";\n return assetIconId(asset.symbol);\n}\n\nexport function createPaymentWizardState(request: PaymentWizardRequest): PaymentWizardState {\n const selectedRouteId =\n request.selectedMethod === \"bitcoin\"\n ? (request.selectedBitcoinRoute ?? getDefaultBitcoinRoute())\n : null;\n const routes = selectedRouteId === null ? [] : getPaymentWizardRoutes({ route: selectedRouteId });\n\n return {\n selectedRouteId,\n routes,\n };\n}\n\nexport function createPaymentWizardSelection(): PaymentWizardSelection {\n return {\n selectedMethod: null,\n selectedBitcoinRoute: null,\n };\n}\n\nexport function createPaymentWizardModel(selection: PaymentWizardSelection): PaymentWizardModel {\n const wizard = createPaymentWizardState({\n selectedMethod: selection.selectedMethod,\n selectedBitcoinRoute: selection.selectedBitcoinRoute,\n });\n const routeAssets = selection.selectedMethod === \"bitcoin\" ? getBitcoinAssets() : [];\n const selectedRoute = wizard.selectedRouteId;\n\n return {\n selection,\n wizard,\n routeAssets,\n selectedRoute,\n };\n}\n\nexport function updatePaymentWizardSelection(\n selection: PaymentWizardSelection,\n action: PaymentWizardSelectionAction,\n): PaymentWizardSelection {\n switch (action.type) {\n case \"select_method\": {\n return {\n ...selection,\n selectedMethod: action.method,\n selectedBitcoinRoute:\n action.method === \"bitcoin\"\n ? (selection.selectedBitcoinRoute ?? getDefaultBitcoinRoute())\n : selection.selectedBitcoinRoute,\n };\n }\n case \"change_method\": {\n return {\n ...selection,\n selectedMethod: null,\n selectedBitcoinRoute: null,\n };\n }\n case \"change_route\": {\n if (selection.selectedMethod === \"bitcoin\") {\n return {\n ...selection,\n selectedBitcoinRoute: null,\n };\n }\n return selection;\n }\n case \"select_route\": {\n if (selection.selectedMethod === \"bitcoin\") {\n return {\n ...selection,\n selectedBitcoinRoute: action.route,\n };\n }\n return selection;\n }\n }\n}\n\nexport class BrowserPaymentWizardController implements PaymentWizardController {\n private readonly options: PaymentWizardControllerOptions;\n private selection: PaymentWizardSelection;\n\n constructor(options: PaymentWizardControllerOptions = {}) {\n this.options = options;\n this.selection = options.selection ?? createPaymentWizardSelection();\n }\n\n getSelection(): PaymentWizardSelection {\n return this.selection;\n }\n\n getModel(): PaymentWizardModel {\n return createPaymentWizardModel(this.selection);\n }\n\n update(action: PaymentWizardSelectionAction): PaymentWizardSelection {\n const next = updatePaymentWizardSelection(this.selection, action);\n this.selection = next;\n this.options.onSelection?.(next);\n return next;\n }\n\n selectMethod(method: PaymentMethod): PaymentWizardSelection {\n return this.update({\n type: \"select_method\",\n method,\n });\n }\n\n changeMethod(): PaymentWizardSelection {\n return this.update({\n type: \"change_method\",\n });\n }\n\n selectRoute(route: string): PaymentWizardSelection {\n return this.update({\n type: \"select_route\",\n route,\n });\n }\n}\n\nexport function createPaymentWizardController(\n options: PaymentWizardControllerOptions = {},\n): PaymentWizardController {\n return new BrowserPaymentWizardController(options);\n}\n", "// One checkout state, derived: snapshot + now -> CheckoutState, the phase\n// machine that decides settled/terminal/paid, the status model the UI renders,\n// and the conversions back to a snapshot the swap re-key and the element's\n// attribute path need.\n//\n// There is exactly ONE flattening rule here. React used to carry a second copy\n// (toCheckoutDisplayData -> createCheckoutDisplayModel -> toCheckoutViewModel)\n// that disagreed with this one about fiat, about the amount fallback, about the\n// error message, and about whether a swap gets a `lightning:` URI. Those four\n// reconciliations are commented individually below; do not reintroduce a second\n// path.\n\nimport { deriveCheckoutStateLabels, formatCountdown } from \"./checkout-format.ts\";\nimport { createLightningUri } from \"./checkout-invoice.ts\";\nimport { checkoutLogFields, emitBrowserLog, emitBrowserSwapTransition } from \"./checkout-log.ts\";\nimport { requiredInvoiceRail, requiredString } from \"./checkout-read.ts\";\nimport { isTerminalSwapProviderState } from \"./checkout-swap-view.ts\";\nimport {\n type CheckoutInvoiceSnapshot,\n type CheckoutPhase,\n type CheckoutSnapshot,\n type CheckoutState,\n type CheckoutStatusModel,\n type CheckoutStatusModelInput,\n type CreateCheckoutStateOptions,\n checkoutLabels,\n OPENRECEIVE_LIGHTNING_REUSE_BUFFER_SECONDS,\n} from \"./ui.ts\";\nimport { resolveNow, type UnixSeconds } from \"./unix-seconds.ts\";\nimport { getPaymentStatusText } from \"./wizard.ts\";\n\n/**\n * Choose the invoice the checkout UI should treat as primary.\n *\n * Prefers the active payable invoice; otherwise a bolt11-bearing invoice (Lightning),\n * preferring one that has settled. After a swap settles alongside a Lightning invoice,\n * the newest entry is often the settled swap shadow (rail \"swap\", no public bolt11) \u2014\n * fall back to the payable Lightning invoice for QR/copy display.\n *\n * When Lightning was never minted (deferred create + swap-only), return the swap invoice\n * so settlement still drives paid/`onSettled` UI even though bolt11 is omitted.\n *\n * `checkout_lock` rails are deferred placeholders and are skipped. Returns `undefined`\n * only when the checkout still has only a checkout_lock (or no invoices).\n */\nexport function selectCheckoutDisplayInvoice(\n snapshot: CheckoutSnapshot,\n): CheckoutInvoiceSnapshot | undefined {\n // Skip checkout_lock (deferred placeholder) \u2014 it has no bolt11 to display.\n if (snapshot.active !== undefined && snapshot.active.rail !== \"checkout_lock\") {\n return snapshot.active;\n }\n const nonLock = snapshot.invoices.filter((invoice) => invoice.rail !== \"checkout_lock\");\n const withBolt11 = nonLock.filter(\n (invoice) => typeof invoice.invoice === \"string\" && invoice.invoice.length > 0,\n );\n // transaction_state is the server's verdict; the browser never re-derives\n // \"settled\" from settled_at (see status.ts: one rule, one owner). settled_at\n // is display-only.\n const settledBolt11 = withBolt11.find((invoice) => invoice.transaction_state === \"settled\");\n if (settledBolt11 !== undefined) return settledBolt11;\n // Prefer a payable Lightning invoice for QR/copy when one exists (even next to a\n // settled swap shadow).\n if (withBolt11[0] !== undefined) return withBolt11[0];\n // Swap-only checkout: surface the swap invoice (null bolt11) so settlement is visible.\n const settledSwap = nonLock.find((invoice) => invoice.transaction_state === \"settled\");\n return settledSwap ?? nonLock[0];\n}\n\nexport function isPaidCheckoutSnapshot(snapshot: CheckoutSnapshot): boolean {\n return snapshot.status === \"paid\";\n}\n\n/**\n * True when the given Lightning invoice has more than {@link OPENRECEIVE_LIGHTNING_REUSE_BUFFER_SECONDS}\n * seconds remaining. Pass an optional `now` (Unix seconds) for deterministic tests; defaults to the\n * current clock.\n */\nexport function isReusableLightningInvoice(expiresAt: number, now?: UnixSeconds): boolean {\n return expiresAt - resolveNow(now) > OPENRECEIVE_LIGHTNING_REUSE_BUFFER_SECONDS;\n}\n\nexport function createCheckoutState(\n snapshot: CheckoutSnapshot,\n options: CreateCheckoutStateOptions = {},\n): CheckoutState {\n const invoiceRecord = selectCheckoutDisplayInvoice(snapshot);\n\n if (invoiceRecord === undefined) {\n // Deferred checkout \u2014 no bolt11 minted yet. Return a minimal open/pending state so\n // callers (useCheckout, CheckoutWatcher) don't throw. The invoice fields are empty\n // strings; callers MUST gate any bolt11-dependent UI on the lightning pane being shown.\n // Normalized like any other state so it carries the same labels; with no\n // expires_at and a pending/invoice_created pair the phase machine returns\n // exactly the invoice_created / not-settled / not-terminal verdict this\n // branch used to hard-code. Deliberately returned before the log calls\n // below: a checkout with nothing minted yet is not a state worth auditing.\n return normalizeCheckoutState(\n {\n checkout_id: snapshot.checkout_id,\n reference: snapshot.reference,\n invoice_id: \"\",\n invoice: \"\",\n rail: \"checkout_lock\",\n lightning_uri: \"\",\n ...(snapshot.amount_msats === undefined ? {} : { amount_msats: snapshot.amount_msats }),\n ...(snapshot.fiat !== undefined ? { fiat_quote: { fiat: snapshot.fiat } } : {}),\n transaction_state: \"pending\",\n workflow_state: \"invoice_created\",\n paid: false,\n ...(snapshot.description === undefined ? {} : { description: snapshot.description }),\n },\n resolveNow(options.now),\n );\n }\n\n const invoice = invoiceRecord;\n // Swap shadows intentionally omit bolt11 from public payloads; checkout_lock has none yet.\n // Anything else on the Lightning rail with no bolt11 cannot be displayed at all.\n // The message names DISPLAY, not the wire: this function is also handed\n // in-memory snapshots that never came from a response (G4 divergence (c)).\n const bolt11 =\n typeof invoice.invoice === \"string\" && invoice.invoice.length > 0\n ? invoice.invoice\n : invoice.rail === \"swap\" || invoice.rail === \"checkout_lock\"\n ? \"\"\n : missingDisplayInvoice();\n const paid = isPaidCheckoutSnapshot(snapshot);\n const settledAt = snapshot.paid_at ?? invoice.settled_at;\n const transactionState = paid ? \"settled\" : (invoice.transaction_state ?? \"pending\");\n const workflowState = paid ? \"paid\" : (invoice.workflow_state ?? \"invoice_created\");\n // FIAT (G4 divergence (a)) \u2014 resolved THREE ways, and the fallback is\n // load-bearing. A public swap payload sets the ATTEMPT's fiat_quote to null and\n // a checkout_lock attempt has none at all, so in both cases the CHECKOUT's own\n // `fiat` is the only fiat the payer can be shown. Passing the attempt's null\n // straight through made the fiat line vanish from the swap screen; that is why\n // the deferred branch above already carries this fallback and why the\n // flattening branch now does too.\n const fiatQuote =\n invoice.fiat_quote === null && snapshot.fiat !== undefined\n ? { fiat: snapshot.fiat }\n : (invoice.fiat_quote ?? (snapshot.fiat === undefined ? undefined : { fiat: snapshot.fiat }));\n\n const state = normalizeCheckoutState(\n {\n checkout_id: snapshot.checkout_id,\n reference: snapshot.reference,\n invoice_id: invoice.invoice_id,\n invoice: bolt11,\n rail: invoice.rail,\n // G4 divergence (d): the swap rail gets NO `lightning:` URI even when the\n // attempt happens to carry a bolt11. A swap is paid at the deposit\n // address, and a wallet-jump link on that screen sends the payer down the\n // wrong rail. `invoice` above still holds the bolt11 for anything that\n // legitimately needs it.\n lightning_uri:\n invoice.rail === \"checkout_lock\" || invoice.rail === \"swap\" || bolt11 === \"\"\n ? \"\"\n : createLightningUri(bolt11),\n ...(invoice.payment_hash === undefined ? {} : { payment_hash: invoice.payment_hash }),\n // G4 divergence (b): the checkout's amount is what is owed, so an attempt\n // that omits its own amount still shows one rather than no amount at all.\n amount_msats: invoice.amount_msats ?? snapshot.amount_msats,\n ...(fiatQuote === undefined ? {} : { fiat_quote: fiatQuote }),\n ...(snapshot.description === undefined ? {} : { description: snapshot.description }),\n transaction_state: transactionState,\n workflow_state: workflowState,\n ...(invoice.expires_at === undefined ? {} : { expires_at: invoice.expires_at }),\n ...(settledAt === undefined ? {} : { settled_at: settledAt }),\n ...(invoice.swap === undefined ? {} : { swap: invoice.swap }),\n paid,\n },\n resolveNow(options.now),\n );\n const source = options.source ?? \"create\";\n if (source === \"create\") {\n emitBrowserLog(\n options.logger,\n \"info\",\n \"checkout.state.created\",\n \"Created checkout state from order snapshot.\",\n checkoutLogFields(state),\n );\n } else if (source === \"refresh\") {\n emitBrowserLog(\n options.logger,\n \"debug\",\n \"checkout.state.refreshed\",\n \"Refreshed checkout state from order status.\",\n checkoutLogFields(state),\n );\n emitBrowserSwapTransition(options.logger, options.previousState, state);\n }\n return state;\n}\n\n/**\n * Wrap ONE payment attempt as a whole checkout snapshot.\n *\n * The custom element's source of truth is HTML attributes, not a wire payload:\n * declarative and SSR usage give it one attempt's fields and nothing else. This\n * is the only place that invents the surrounding checkout, and it stays\n * conservative \u2014 checkout_id and reference fall back to the invoice id, and the\n * checkout counts as paid exactly when the attempt does.\n *\n * It takes a {@link CheckoutInvoiceSnapshot}, the canonical sub-part, rather\n * than the flattened CheckoutDisplayData shape it used to: an attempt read off\n * attributes is still an attempt.\n */\nexport function createCheckoutSnapshotFromInvoice(\n attempt: CheckoutInvoiceSnapshot,\n identity: { readonly checkout_id?: string; readonly reference?: string } = {},\n): CheckoutSnapshot {\n const rail = requiredInvoiceRail(attempt.rail);\n const invoiceId = requiredString(attempt.invoice_id, \"invoice_id\");\n const invoice: CheckoutInvoiceSnapshot = {\n invoice_id: invoiceId,\n invoice: attempt.invoice,\n rail,\n ...(attempt.payment_hash === undefined ? {} : { payment_hash: attempt.payment_hash }),\n ...(attempt.amount_msats === undefined ? {} : { amount_msats: attempt.amount_msats }),\n ...(attempt.fiat_quote === undefined ? {} : { fiat_quote: attempt.fiat_quote }),\n ...(attempt.transaction_state === undefined\n ? {}\n : { transaction_state: attempt.transaction_state }),\n ...(attempt.workflow_state === undefined ? {} : { workflow_state: attempt.workflow_state }),\n ...(attempt.expires_at === undefined ? {} : { expires_at: attempt.expires_at }),\n ...(attempt.settled_at === undefined ? {} : { settled_at: attempt.settled_at }),\n ...(attempt.swap === undefined ? {} : { swap: attempt.swap }),\n };\n const paid = attempt.transaction_state === \"settled\";\n return {\n checkout_id: identity.checkout_id ?? invoiceId,\n reference: identity.reference ?? invoiceId,\n status: paid ? \"paid\" : \"open\",\n ...(attempt.settled_at === undefined ? {} : { paid_at: attempt.settled_at }),\n amount_msats: attempt.amount_msats ?? 0,\n active: paid ? undefined : invoice,\n invoices: [invoice],\n };\n}\n\nexport function refreshCheckoutState(\n state: CheckoutState,\n options: CreateCheckoutStateOptions = {},\n): CheckoutState {\n return createCheckoutState(snapshotFromCheckoutState(state), {\n ...options,\n source: options.source ?? \"countdown\",\n previousState: options.previousState ?? state,\n });\n}\n\nexport function shouldCheckoutShowWaiting(\n state: CheckoutState,\n options: { readonly now?: UnixSeconds } = {},\n): boolean {\n if (state.terminal || state.settled) return false;\n if (state.expires_at === undefined) return true;\n return state.expires_at > resolveNow(options.now);\n}\n\n/**\n * The payer-facing status line: a phase, finished copy, and a countdown. No\n * step number anywhere \u2014 progress in this checkout is a STATUS, not a position,\n * and backwards movement is a breadcrumb (`checkoutLabels.switchPaymentMethod`)\n * rather than a step back. Both shipped renderers print `title`/`detail`\n * verbatim; a custom UI should too.\n *\n * The returned `phase` is NOT the source's. A non-terminal phase whose\n * countdown has reached zero is reported as `expired`, so the screen turns over\n * the moment the clock does instead of waiting for the next poll to disagree \u2014\n * which is why a caller must render the model's `phase` and never the\n * snapshot's.\n */\nexport function createCheckoutStatusModel(\n source?: CheckoutState | CheckoutStatusModelInput,\n options: { readonly now?: UnixSeconds } = {},\n): CheckoutStatusModel {\n const isCheckoutState = source !== undefined && \"invoice_id\" in source && \"invoice\" in source;\n const phase = source?.phase ?? \"invoice_created\";\n const expiresInSeconds = source?.expires_in_seconds;\n const displayPhase =\n phase !== \"settled\" && phase !== \"failed\" && phase !== \"cancelled\" && expiresInSeconds === 0\n ? \"expired\"\n : phase;\n const statusText = getPaymentStatusText(displayPhase);\n\n return {\n phase: displayPhase,\n waiting:\n displayPhase === \"expired\"\n ? false\n : source === undefined\n ? false\n : isCheckoutState\n ? shouldCheckoutShowWaiting(source, options)\n : (source.waiting ?? false),\n title: statusText.title,\n detail: statusText.detail,\n countdownPrefix: checkoutLabels.countdownPrefix,\n // No countdown once settled \u2014 the invoice's remaining lifetime is meaningless\n // to a payer whose payment already landed.\n ...(expiresInSeconds === undefined || displayPhase === \"expired\" || displayPhase === \"settled\"\n ? {}\n : {\n expires_in_seconds: expiresInSeconds,\n countdownLabel: formatCountdown(expiresInSeconds),\n }),\n };\n}\n\nexport function normalizeCheckoutState(\n state: Omit<CheckoutState, \"phase\" | \"settled\" | \"terminal\" | \"expires_in_seconds\"> &\n Partial<Pick<CheckoutState, \"phase\" | \"settled\" | \"terminal\" | \"expires_in_seconds\">>,\n now?: UnixSeconds,\n): CheckoutState {\n const {\n phase: _phase,\n settled: _settled,\n terminal: _terminal,\n expires_in_seconds: _expiresInSeconds,\n // Labels are derived, never carried: a caller handing back a previous state\n // with one field changed must not keep that state's stale labels.\n amountLabel: _amountLabel,\n fiatLabel: _fiatLabel,\n paymentHashLabel: _paymentHashLabel,\n ...base\n } = state;\n const statePhase = getCheckoutPhase(state.transaction_state, state.workflow_state);\n const expiresInSeconds =\n base.expires_at === undefined || now === undefined\n ? undefined\n : Math.max(0, base.expires_at - now);\n const phase =\n statePhase === \"invoice_created\" || statePhase === \"verifying\"\n ? expiresInSeconds === 0\n ? \"expired\"\n : statePhase\n : statePhase;\n\n const settled = base.paid || base.transaction_state === \"settled\";\n const monitoring = checkoutMonitoring(base);\n\n return {\n ...base,\n ...deriveCheckoutStateLabels(base),\n phase,\n settled,\n // A local instruction deadline says nothing about wallet or refund finality.\n terminal: !monitoring.payment && !monitoring.provider,\n ...(expiresInSeconds === undefined ? {} : { expires_in_seconds: expiresInSeconds }),\n };\n}\n\nfunction missingDisplayInvoice(): never {\n throw new TypeError(\"OpenReceive checkout requires a display Lightning invoice.\");\n}\n\nfunction getCheckoutPhase(transactionState: string, workflowState: string): CheckoutPhase {\n if (workflowState === \"cancelled\") return \"cancelled\";\n if (transactionState === \"settled\") return \"settled\";\n if (transactionState === \"expired\" || workflowState === \"expired\") {\n return \"expired\";\n }\n if (transactionState === \"failed\" || workflowState === \"failed\") {\n return \"failed\";\n }\n if (workflowState === \"verifying\") {\n return \"verifying\";\n }\n return \"invoice_created\";\n}\n\n/** Independent authoritative workflows, shared by the watcher and HTTP transport. */\nexport function checkoutMonitoring(state: {\n readonly transaction_state?: string;\n readonly workflow_state?: string;\n readonly paid?: boolean;\n readonly swap?: CheckoutInvoiceSnapshot[\"swap\"];\n}): { readonly payment: boolean; readonly provider: boolean } {\n if (state.workflow_state === \"cancelled\") return { payment: false, provider: false };\n const payment =\n !state.paid &&\n ![\"settled\", \"expired\", \"failed\", \"attention\"].includes(state.transaction_state ?? \"pending\") &&\n ![\"expired\", \"failed\", \"attention\"].includes(state.workflow_state ?? \"invoice_created\");\n const providerState = state.swap?.provider_state;\n const recovery = providerState === \"refund_required\" || providerState === \"refund_pending\";\n const provider =\n providerState !== undefined &&\n !isTerminalSwapProviderState(providerState) &&\n providerState !== \"completed\" &&\n (recovery || (!state.paid && state.transaction_state !== \"settled\"));\n return { payment, provider };\n}\n\nfunction snapshotFromCheckoutState(state: CheckoutState): CheckoutSnapshot {\n const invoice: CheckoutInvoiceSnapshot = {\n invoice_id: state.invoice_id,\n invoice: state.invoice,\n rail: state.rail,\n ...(state.payment_hash === undefined ? {} : { payment_hash: state.payment_hash }),\n ...(state.amount_msats === undefined ? {} : { amount_msats: state.amount_msats }),\n ...(state.fiat_quote === undefined ? {} : { fiat_quote: state.fiat_quote }),\n transaction_state: state.transaction_state,\n workflow_state: state.workflow_state,\n ...(state.expires_at === undefined ? {} : { expires_at: state.expires_at }),\n ...(state.settled_at === undefined ? {} : { settled_at: state.settled_at }),\n ...(state.swap === undefined ? {} : { swap: state.swap }),\n };\n return {\n checkout_id: state.checkout_id,\n reference: state.reference,\n status: state.paid ? \"paid\" : state.terminal ? \"expired\" : \"open\",\n ...(state.settled_at === undefined ? {} : { paid_at: state.settled_at }),\n amount_msats: state.amount_msats ?? 0,\n active: state.paid ? undefined : invoice,\n invoices: [invoice],\n };\n}\n", "import { isReusableLightningInvoice, selectCheckoutDisplayInvoice } from \"./checkout-state.ts\";\nimport type { UnixSeconds } from \"./unix-seconds.ts\";\nimport type { CheckoutInvoiceSnapshot, CheckoutSnapshot } from \"./ui.ts\";\n\n/**\n * The Lightning invoice a deferred-mint checkout can reuse instead of minting a\n * fresh bolt11: a lightning-rail invoice with a payable bolt11 and enough time\n * left on the clock (see {@link isReusableLightningInvoice}).\n */\nexport function findReusableLightningInvoice(\n snapshot: CheckoutSnapshot,\n now?: UnixSeconds,\n): CheckoutInvoiceSnapshot | undefined {\n return snapshot.invoices.find(\n (invoice) =>\n invoice.rail === \"lightning\" &&\n typeof invoice.invoice === \"string\" &&\n invoice.invoice.length > 0 &&\n invoice.expires_at !== undefined &&\n isReusableLightningInvoice(invoice.expires_at, now),\n );\n}\n\n/**\n * Fold a started attempt (swap deposit or minted bolt11) into a snapshot: the\n * attempt becomes the active invoice, its predecessor entry and any\n * checkout_lock placeholder drop out, and polling re-keys onto it.\n */\nexport function mergeAttemptIntoSnapshot(\n invoice: CheckoutInvoiceSnapshot,\n base: CheckoutSnapshot,\n): CheckoutSnapshot {\n const withoutSame = base.invoices.filter(\n (entry) => entry.invoice_id !== invoice.invoice_id && entry.rail !== \"checkout_lock\",\n );\n return {\n ...base,\n checkout_id: invoice.invoice_id,\n active: invoice,\n invoices: [invoice, ...withoutSame],\n ...(invoice.amount_msats === undefined ? {} : { amount_msats: invoice.amount_msats }),\n };\n}\n\n/**\n * {@link mergeAttemptIntoSnapshot} with a minimal fallback snapshot\n * for hosts that started an attempt before any checkout snapshot existed.\n */\nexport function mergeAttemptIntoCheckout(\n invoice: CheckoutInvoiceSnapshot,\n previous: CheckoutSnapshot | undefined,\n reference: string,\n): CheckoutSnapshot {\n const base =\n previous ??\n ({\n checkout_id: invoice.invoice_id,\n reference: reference,\n status: \"open\" as const,\n amount_msats: invoice.amount_msats ?? 0,\n invoices: [],\n } satisfies CheckoutSnapshot);\n return mergeAttemptIntoSnapshot(invoice, base);\n}\n\n/**\n * Fold a freshly minted Lightning checkout into the running snapshot. The\n * minted bolt11 becomes the active invoice while `payment_methods` (and any\n * previously started attempts) from the prior snapshot are preserved \u2014 the\n * mint response does not carry the warmed method catalog.\n */\nexport function mergeMintedCheckout(\n checkout: CheckoutSnapshot,\n previous: CheckoutSnapshot | undefined,\n): CheckoutSnapshot {\n const minted = selectCheckoutDisplayInvoice(checkout) ?? checkout.active;\n if (minted === undefined) {\n return {\n ...checkout,\n ...(previous?.payment_methods === undefined\n ? {}\n : { payment_methods: previous.payment_methods }),\n };\n }\n if (previous === undefined) return mergeAttemptIntoSnapshot(minted, checkout);\n return mergeAttemptIntoSnapshot(minted, {\n ...previous,\n ...checkout,\n invoices: previous.invoices,\n payment_methods: previous.payment_methods ?? checkout.payment_methods,\n // Prepare answered with it and create echoes it, but a host that only\n // returns it from one of the two must not lose it at the mint.\n description: checkout.description ?? previous.description,\n });\n}\n", "/**\n * The headers every OpenReceive request carries: the JSON content type the\n * handler requires, the page's CSRF token when there is one, then whatever the\n * host passed (which wins on a clash).\n *\n * Rails (and frameworks sharing the convention) render the session's CSRF\n * token into `<meta name=\"csrf-token\">`. Forwarding it lets a host's mount\n * inherit its framework's forgery protection with no extra wiring; on a page\n * without the meta tag nothing is added.\n *\n * The META TAG NAME is fixed \u2014 hosts render the token into it \u2014 but the header\n * NAME it is sent under is the framework's choice: Rails and Laravel read\n * `X-CSRF-Token` (the default), Django's CsrfViewMiddleware reads `X-CSRFToken`,\n * WordPress REST reads `X-WP-Nonce`. `csrfHeader` is that knob; every checkout\n * surface exposes it under the same name (`csrf-header` on the element).\n */\nconst DEFAULT_CSRF_HEADER = \"X-CSRF-Token\";\n\nexport function requestHeaders(\n host: Readonly<Record<string, string>> | undefined,\n csrfHeader: string = DEFAULT_CSRF_HEADER,\n): Readonly<Record<string, string>> {\n return {\n \"Content-Type\": \"application/json\",\n ...csrfTokenHeader(csrfHeader),\n ...host,\n };\n}\n\nfunction csrfTokenHeader(csrfHeader: string): Readonly<Record<string, string>> {\n if (typeof document === \"undefined\") return {};\n const token = document.querySelector('meta[name=\"csrf-token\"]')?.getAttribute(\"content\");\n return token ? { [csrfHeader]: token } : {};\n}\n", "/**\n * Route derivation for the mounted OpenReceive router.\n *\n * The browser is given ONE thing \u2014 `prefix`, the base path the shipped router\n * is mounted at \u2014 and derives every route it calls from it. They are one set on\n * purpose: the create route, the prepare route, the payment-check status route\n * and the four swap routes all belong to the same mount, so a checkout cannot\n * be created against one deployment and settled against another. That is why\n * there is no per-route override, and why `prefix` is the only URL concept the\n * browser packages accept.\n *\n * A trailing slash on the prefix is stripped; `\"\"` means \"mounted at the root\".\n */\nexport interface Routes {\n /** POST: mint (or reuse) a Lightning attempt for an order. */\n readonly checkouts: string;\n /** POST: lock the order amount and load payment methods without minting. */\n readonly checkoutsPrepare: string;\n /** POST: the payer-facing status read for the displayed attempt. */\n readonly paymentsCheck: string;\n /** POST: start a swap deposit attempt for a pay-in asset. */\n readonly swaps: string;\n /** POST: quote a pay-in asset before starting a swap. */\n readonly swapsQuote: string;\n /** POST: the swap provider's live state for one attempt. */\n readonly swapsStatus: string;\n /** POST: review or confirm a refund for one swap attempt. */\n readonly swapsRefunds: string;\n}\n\n/**\n * Every route the browser calls, derived from the router's mount prefix.\n *\n * Throws instead of defaulting because THERE IS ONE MOUNT: quietly substituting\n * a default for a `prefix` that never arrived would split the flow across\n * DIFFERENT deployments \u2014 a checkout created against one host, then prepared,\n * polled, swapped and refunded against another. That is a lost payment, not a\n * cosmetic bug, and it surfaces long after the mistake. Every published entry\n * point (`requestCheckout` / `prepareCheckout`, `createStatusFetcher`\n * and the swap calls) derives its routes here, so this one check covers all of\n * them before the first request goes out.\n *\n * NOT REDUNDANT WITH THE TYPES. `prefix` is REQUIRED in every options type that\n * carries it, so a TypeScript caller never reaches this throw. It is here for\n * the callers the types do not reach: plain JavaScript integrations, a wrapper\n * handing through an attribute or prop that was never set, and any value that\n * only turns out to be `undefined` at run time. Without it those callers get a\n * `TypeError` from `.replace` on `undefined`, which names neither the option\n * nor the fix.\n */\nexport function checkoutRoutes(prefix: string): Routes {\n if (typeof prefix !== \"string\") {\n throw new TypeError(\n \"OpenReceive requires `prefix`, the base path the shipped router is mounted at \" +\n `(for example \"/openreceive\"); every checkout, status and swap route is derived ` +\n `from it. Received ${prefix === null ? \"null\" : typeof prefix}.`,\n );\n }\n const base = prefix.replace(/\\/+$/, \"\");\n return {\n checkouts: `${base}/checkouts`,\n checkoutsPrepare: `${base}/checkouts/prepare`,\n paymentsCheck: `${base}/payments/check`,\n swaps: `${base}/swaps`,\n swapsQuote: `${base}/swaps/quote`,\n swapsStatus: `${base}/swaps/status`,\n swapsRefunds: `${base}/swaps/refunds`,\n };\n}\n", "// Everything that talks to the mounted OpenReceive routes: the request error\n// type, the JSON response reader, prepare/create calls, the status fetcher and\n// its polling merge, and the parsers that turn a response body into a\n// CheckoutSnapshot. Every URL comes from ./routes.ts, derived from the caller's\n// `prefix` \u2014 this module never accepts a route of its own.\n\nimport { isRecord, nonEmptyString, recordOrEmpty } from \"@openreceive/core\";\nimport { assertDisplayInvoice } from \"./checkout-invoice.ts\";\nimport { mergeMintedCheckout } from \"./checkout-merge.ts\";\nimport {\n optionalRecord,\n optionalSafeInteger,\n requiredSafeInteger,\n requiredString,\n} from \"./checkout-read.ts\";\nimport { checkoutMonitoring } from \"./checkout-state.ts\";\nimport { requestHeaders } from \"./request-headers.ts\";\nimport { checkoutRoutes, type Routes } from \"./routes.ts\";\nimport type {\n CheckoutInvoiceSnapshot,\n CheckoutPaymentMethod,\n CheckoutSnapshot,\n CheckoutStatusRefresh,\n CreateOpenReceiveStatusFetcherOptions,\n PrepareCheckoutOptions,\n RequestCheckoutOptions,\n} from \"./ui.ts\";\n\n/**\n * Typed transport error for OpenReceive browser requests. Carries the server's\n * error semantics (status, shared error code, retryable hint, Retry-After) so\n * callers can back off instead of blind fixed-interval retries \u2014 and so hosts\n * can distinguish \"retry\" from \"bug\".\n */\n/**\n * Consecutive /swaps/status failures before the swap panel says so. One or two\n * blips are ordinary; a run of them means the payer is looking at frozen\n * provider state.\n */\nconst SWAP_STATUS_FAILURE_LIMIT = 3 as const;\n\nexport class BrowserRequestError extends Error {\n readonly status: number;\n readonly code?: string;\n readonly retryable?: boolean;\n readonly retryAfterSeconds?: number;\n\n constructor(\n message: string,\n options: {\n readonly status: number;\n readonly code?: string;\n readonly retryable?: boolean;\n readonly retryAfterSeconds?: number;\n },\n ) {\n super(message);\n this.name = \"BrowserRequestError\";\n this.status = options.status;\n if (options.code !== undefined) this.code = options.code;\n if (options.retryable !== undefined) this.retryable = options.retryable;\n if (options.retryAfterSeconds !== undefined) this.retryAfterSeconds = options.retryAfterSeconds;\n }\n}\n\n/**\n * Read a fetch Response as JSON with error semantics preserved: non-OK\n * responses throw BrowserRequestError (even when the body is not\n * JSON \u2014 a proxy's HTML 502 must not surface as a SyntaxError), and the\n * Retry-After header is captured when present.\n */\nexport async function readJsonResponse(\n response: {\n readonly ok: boolean;\n readonly status: number;\n readonly headers?: { get(name: string): string | null };\n json(): Promise<unknown>;\n },\n fallbackMessage: string,\n): Promise<unknown> {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n // Only a NON-OK body may be non-JSON: that is the proxy HTML 502 case this\n // tolerance exists for. An OK response from our own server that is not JSON\n // is a real failure, and swallowing it here resurfaced downstream as a\n // mislabeled \"checkout response requires payment_hash\".\n if (response.ok) {\n throw new BrowserRequestError(`${fallbackMessage} The server returned a non-JSON body.`, {\n status: response.status,\n retryable: false,\n });\n }\n body = undefined;\n }\n if (!response.ok) {\n const record =\n body !== null && typeof body === \"object\" ? (body as Record<string, unknown>) : undefined;\n const retryAfterRaw = Number(response.headers?.get?.(\"retry-after\") ?? Number.NaN);\n throw new BrowserRequestError(\n typeof record?.message === \"string\" ? record.message : fallbackMessage,\n {\n status: response.status,\n ...(typeof record?.code === \"string\" ? { code: record.code } : {}),\n ...(typeof record?.retryable === \"boolean\" ? { retryable: record.retryable } : {}),\n ...(Number.isFinite(retryAfterRaw) && retryAfterRaw > 0\n ? { retryAfterSeconds: retryAfterRaw }\n : {}),\n },\n );\n }\n return body;\n}\n\ninterface NormalizedRequestCheckoutOptions {\n readonly signal?: AbortSignal;\n readonly routes: Routes;\n readonly reference: string;\n readonly fetch?: typeof globalThis.fetch;\n readonly headers?: Readonly<Record<string, string>>;\n readonly csrfHeader?: string;\n readonly memo?: string;\n readonly metadata?: Record<string, unknown>;\n}\n\nfunction normalizeRequestCheckoutOptions(\n options: RequestCheckoutOptions,\n): NormalizedRequestCheckoutOptions {\n const reference = nonEmptyString(options.reference);\n const metadata = optionalRecord(options.metadata);\n return {\n signal: options.signal,\n routes: checkoutRoutes(options.prefix),\n reference: reference ?? \"\",\n fetch: options.fetch,\n headers: options.headers,\n csrfHeader: options.csrfHeader,\n ...(options.memo === undefined ? {} : { memo: options.memo }),\n ...(metadata === undefined ? {} : { metadata }),\n };\n}\n\nexport async function requestCheckout(options: RequestCheckoutOptions): Promise<CheckoutSnapshot> {\n const request = normalizeRequestCheckoutOptions(options);\n if (request.reference.length === 0) {\n throw new Error(\"OpenReceive checkout creation requires reference.\");\n }\n\n const fetcher = request.fetch ?? globalThis.fetch;\n if (fetcher === undefined) {\n throw new Error(\"OpenReceive checkout creation requires fetch.\");\n }\n\n if (request.memo !== undefined && request.memo.length > 500) {\n throw new Error(\"OpenReceive memo must be 500 characters or fewer.\");\n }\n\n const requestBody = {\n reference: request.reference,\n ...(request.memo === undefined ? {} : { memo: request.memo }),\n ...(request.metadata === undefined ? {} : { metadata: structuredClone(request.metadata) }),\n };\n\n const headers = request.headers === undefined ? {} : request.headers;\n const response = await fetcher(request.routes.checkouts, {\n method: \"POST\",\n signal: request.signal,\n headers: requestHeaders(headers, request.csrfHeader),\n body: JSON.stringify(requestBody),\n });\n const body = (await readJsonResponse(response, \"Could not create checkout.\")) as\n | Record<string, unknown>\n | undefined;\n\n const snapshot = checkoutSnapshotFromResponseBody(body);\n const responseInvoice = snapshot.active;\n if (isRecord(responseInvoice) && typeof responseInvoice.invoice === \"string\") {\n assertDisplayInvoice(responseInvoice.invoice);\n }\n\n // The mint response carries the bolt11 and nothing else. Folding it into the\n // snapshot the caller already had is what keeps `payment_methods` (and any\n // sibling swap attempt) alive across the mint \u2014 see `previous` on\n // RequestCheckoutOptions. With no `previous`, this is the bare snapshot.\n return options.previous === undefined\n ? snapshot\n : mergeMintedCheckout(snapshot, options.previous);\n}\n\n/**\n * Lock the host order amount and load payment methods without minting Lightning.\n * Bitcoin selection later calls {@link requestCheckout} to mint (or reuse) a bolt11.\n */\nexport async function prepareCheckout(options: PrepareCheckoutOptions): Promise<CheckoutSnapshot> {\n const request = normalizeRequestCheckoutOptions(options);\n if (request.reference.length === 0) {\n throw new Error(\"OpenReceive checkout prepare requires reference.\");\n }\n\n const fetcher = request.fetch ?? globalThis.fetch;\n if (fetcher === undefined) {\n throw new Error(\"OpenReceive checkout prepare requires fetch.\");\n }\n\n const headers = request.headers === undefined ? {} : request.headers;\n const response = await fetcher(request.routes.checkoutsPrepare, {\n method: \"POST\",\n signal: request.signal,\n headers: requestHeaders(headers, request.csrfHeader),\n body: JSON.stringify({ reference: request.reference }),\n });\n const body = await readJsonResponse(response, \"Could not prepare checkout.\");\n\n return checkoutLockSnapshotFromPrepareBody(body, request.reference);\n}\n\nexport function createStatusFetcher(\n options: CreateOpenReceiveStatusFetcherOptions,\n): CheckoutStatusRefresh {\n // Track the latest refreshed snapshot so repeated calls on the same fetcher\n // (headless polling loops) see current swap state, not the creation snapshot \u2014\n // otherwise the terminal-state guard below never fires and every tick keeps\n // hitting /swaps/status after the provider is already terminal.\n let snapshot = options.snapshot;\n // Consecutive /swaps/status failures on this fetcher. Reset by any success.\n let swapStatusFailures = 0;\n const routes = checkoutRoutes(options.prefix);\n return async (reference) => {\n if (reference.length === 0) {\n throw new Error(\"OpenReceive status refresh requires reference.\");\n }\n\n const fetcher = options.fetch ?? globalThis.fetch;\n if (fetcher === undefined) {\n throw new Error(\"OpenReceive status refresh requires fetch.\");\n }\n\n const headers = options.headers === undefined ? {} : options.headers;\n const activePaymentHash =\n nonEmptyString(snapshot.active?.payment_hash) ??\n (snapshot.active?.rail === \"checkout_lock\"\n ? undefined\n : nonEmptyString(snapshot.active?.invoice_id));\n // Deferred checkout_lock has no attempt yet \u2014 skip wallet status until Lightning or swap.\n if (activePaymentHash === undefined || !/^[0-9a-f]{64}$/i.test(activePaymentHash)) {\n return snapshot;\n }\n const next = structuredClone(snapshot);\n if (next.active === undefined) return next;\n let active = next.active;\n let payment: Record<string, unknown> = {};\n let paymentError: unknown;\n if (checkoutMonitoring(active).payment) {\n try {\n const response = await fetcher(routes.paymentsCheck, {\n method: \"POST\",\n headers: requestHeaders(headers, options.csrfHeader),\n body: JSON.stringify({ reference, payment_hash: activePaymentHash }),\n });\n payment = recordOrEmpty(\n await readJsonResponse(response, \"Could not refresh invoice status.\"),\n );\n const state = nonEmptyString(payment.status) ?? \"pending\";\n const paidAt = optionalSafeInteger(payment.paid_at, \"paid_at\");\n active = {\n ...active,\n transaction_state: state === \"not_found\" ? \"pending\" : state,\n ...(paidAt === undefined ? {} : { settled_at: paidAt }),\n };\n } catch (error) {\n // Provider recovery must remain reachable during wallet outages too.\n paymentError = error;\n }\n }\n if (active.rail === \"swap\" && checkoutMonitoring(active).provider) {\n try {\n const swapResponse = await fetcher(routes.swapsStatus, {\n method: \"POST\",\n headers: requestHeaders(headers, options.csrfHeader),\n body: JSON.stringify({ reference, payment_hash: activePaymentHash }),\n });\n active = mergeSwapStatusIntoInvoice(\n active,\n recordOrEmpty(await readJsonResponse(swapResponse, \"Could not refresh swap status.\")),\n );\n swapStatusFailures = 0;\n } catch (error) {\n swapStatusFailures += 1;\n const definitive = error instanceof BrowserRequestError && error.retryable === false;\n if (\n active.swap !== undefined &&\n (definitive || swapStatusFailures >= SWAP_STATUS_FAILURE_LIMIT)\n ) {\n active = {\n ...active,\n swap: { ...active.swap, attention: true, attention_reason: \"swap_status_unavailable\" },\n };\n }\n if (paymentError === undefined && !checkoutMonitoring(active).payment) paymentError = error;\n }\n }\n const state = active.transaction_state;\n const paymentMethods = normalizePaymentMethods(payment.payment_methods);\n // Sibling attempts stay in the snapshot: an order can hold a live swap next\n // to a still-valid Lightning invoice, and dropping the sibling forced a\n // fresh POST /checkouts when the payer switched back to Lightning.\n const others = next.invoices.filter(\n (entry) => entry.invoice_id !== active.invoice_id && entry.rail !== \"checkout_lock\",\n );\n snapshot = {\n ...next,\n active,\n invoices: [active, ...others],\n status:\n state === \"settled\"\n ? \"paid\"\n : state === \"expired\" || state === \"failed\"\n ? \"expired\"\n : \"open\",\n ...(paymentMethods === undefined ? {} : { payment_methods: paymentMethods }),\n };\n if (paymentError !== undefined && active.swap === undefined) throw paymentError;\n return snapshot;\n };\n}\n\n/** Fold a bare PublicSwap status body into the invoice's swap snapshot. */\nfunction mergeSwapStatusIntoInvoice<\n Invoice extends Pick<CheckoutInvoiceSnapshot, \"swap\" | \"expires_at\">,\n>(invoice: Invoice, status: Record<string, unknown>): Invoice {\n const swap = invoice.swap;\n if (swap === undefined) return invoice;\n const merged: Record<string, unknown> = { ...swap };\n const providerState = nonEmptyString(status.provider_state);\n if (providerState !== undefined) merged.provider_state = providerState;\n const providerExpiresAt = optionalSafeInteger(status.provider_expires_at, \"provider_expires_at\");\n if (providerExpiresAt !== undefined) merged.provider_expires_at = providerExpiresAt;\n for (const key of [\n \"deposit_tx_id\",\n \"payout_tx_id\",\n \"refund_tx_id\",\n \"refund_reason\",\n \"refund_amount\",\n \"deposit_received_amount\",\n \"refund_address\",\n \"attention_reason\",\n ]) {\n if (typeof status[key] === \"string\") merged[key] = status[key];\n }\n if (typeof status.attention === \"boolean\") merged.attention = status.attention;\n return {\n ...invoice,\n swap: merged as unknown as NonNullable<CheckoutInvoiceSnapshot[\"swap\"]>,\n ...(providerExpiresAt === undefined ? {} : { expires_at: providerExpiresAt }),\n };\n}\n\nfunction checkoutLockSnapshotFromPrepareBody(\n body: unknown,\n fallbackReference: string,\n): CheckoutSnapshot {\n const record = recordOrEmpty(body);\n // One reader style for one response from our own server: the prepare body's\n // own reference is authoritative, and the caller's value is the fallback only\n // when the server omitted it entirely.\n const reference = requiredString(record.reference ?? fallbackReference, \"reference\");\n const amountMsats = requiredSafeInteger(record.amount_msats, \"amount_msats\");\n const lockId = `lock:${reference}`;\n const lockInvoice: CheckoutInvoiceSnapshot = {\n invoice_id: lockId,\n rail: \"checkout_lock\",\n amount_msats: amountMsats,\n transaction_state: \"pending\",\n workflow_state: \"invoice_created\",\n };\n // No String() coercion of our own wire fields: the pair is included only when\n // BOTH halves are really there, so a malformed quote cannot paper itself over\n // as an empty-string currency that the spread below then silently drops.\n const fiatQuote = record.fiat_quote;\n const fiatRecord = isRecord(fiatQuote) && isRecord(fiatQuote.fiat) ? fiatQuote.fiat : undefined;\n const fiatCurrency = nonEmptyString(fiatRecord?.currency);\n const fiatValue = nonEmptyString(fiatRecord?.value);\n const fiat =\n fiatCurrency === undefined || fiatValue === undefined\n ? undefined\n : { currency: fiatCurrency, value: fiatValue };\n const paymentMethods = normalizePaymentMethods(record.payment_methods);\n const description = nonEmptyString(record.description);\n return {\n checkout_id: lockId,\n reference: reference,\n status: \"open\",\n amount_msats: amountMsats,\n ...(fiat === undefined ? {} : { fiat }),\n active: lockInvoice,\n invoices: [lockInvoice],\n ...(paymentMethods === undefined ? {} : { payment_methods: paymentMethods }),\n ...(description === undefined ? {} : { description }),\n };\n}\n\nfunction checkoutSnapshotFromResponseBody(body: unknown): CheckoutSnapshot {\n const record = recordOrEmpty(body);\n const wrapped = recordOrEmpty(record.checkout);\n // `payment_methods` is a SIBLING of `checkout` in the create response, the\n // way it is in prepare and payments/check. Reading it here is what lets a\n // mint carry the pay-in catalog on its own; `previous` then only has to\n // carry snapshot continuity (sibling attempts), not rescue the catalog.\n const paymentMethods = normalizePaymentMethods(record.payment_methods);\n // A SIBLING of `checkout`, like `payment_methods`: the display string belongs\n // to the checkout call, not to the `Checkout` object the swap routes share.\n const description = nonEmptyString(record.description);\n return {\n ...checkoutSnapshot(wrapped),\n ...(paymentMethods === undefined ? {} : { payment_methods: paymentMethods }),\n ...(description === undefined ? {} : { description }),\n };\n}\n\nfunction checkoutSnapshot(checkout: Record<string, unknown>): CheckoutSnapshot {\n const paymentHash = requiredString(checkout.payment_hash, \"payment_hash\");\n const reference = requiredString(checkout.reference, \"reference\");\n const amountMsats = requiredSafeInteger(checkout.amount_msats, \"amount_msats\");\n const invoice: CheckoutInvoiceSnapshot = {\n invoice_id: paymentHash,\n rail: \"lightning\",\n invoice: requiredString(checkout.bolt11, \"bolt11\"),\n payment_hash: paymentHash,\n amount_msats: amountMsats,\n transaction_state: \"pending\",\n workflow_state: \"invoice_created\",\n expires_at: requiredSafeInteger(checkout.expires_at, \"expires_at\"),\n ...(isRecord(checkout.fiat_quote) || checkout.fiat_quote === null\n ? { fiat_quote: checkout.fiat_quote as CheckoutInvoiceSnapshot[\"fiat_quote\"] }\n : {}),\n };\n return {\n checkout_id: paymentHash,\n reference: reference,\n status: \"open\",\n amount_msats: amountMsats,\n active: invoice,\n invoices: [invoice],\n };\n}\n\nfunction normalizePaymentMethods(value: unknown): readonly CheckoutPaymentMethod[] | undefined {\n if (!Array.isArray(value)) return undefined;\n return value.map(normalizePaymentMethod);\n}\n\n/**\n * One payment-methods entry from our own server. A method missing a required\n * field THROWS rather than vanishing from the grid: a silently dropped method\n * is a payment route the payer never sees and nobody ever hears about, which is\n * exactly the failure the trust model says to surface instead of swallow.\n */\nfunction normalizePaymentMethod(input: unknown): CheckoutPaymentMethod {\n const record = recordOrEmpty(input);\n // Empty provider means the asset is known but no LSC provider offered it, so\n // this one is required-but-possibly-empty rather than required-non-empty.\n const provider = record.provider;\n if (typeof provider !== \"string\") {\n throw new TypeError(\"payment method provider must be a string\");\n }\n const unavailableReason = nonEmptyString(record.unavailable_reason);\n const unavailableMessage = nonEmptyString(record.unavailable_message);\n const payAmount = nonEmptyString(record.pay_amount);\n const minimumPayAmount = nonEmptyString(record.minimum_pay_amount);\n const maximumPayAmount = nonEmptyString(record.maximum_pay_amount);\n const minimumInvoiceAmountMsats = optionalSafeInteger(\n record.minimum_invoice_amount_msats,\n \"minimum_invoice_amount_msats\",\n );\n const maximumInvoiceAmountMsats = optionalSafeInteger(\n record.maximum_invoice_amount_msats,\n \"maximum_invoice_amount_msats\",\n );\n return {\n pay_in_asset: requiredString(record.pay_in_asset, \"pay_in_asset\"),\n label: requiredString(record.label, \"label\"),\n network_label: requiredString(record.network_label, \"network_label\"),\n provider,\n available: record.available === true,\n ...(unavailableReason === undefined ? {} : { unavailable_reason: unavailableReason }),\n ...(unavailableMessage === undefined ? {} : { unavailable_message: unavailableMessage }),\n ...(payAmount === undefined ? {} : { pay_amount: payAmount }),\n ...(minimumPayAmount === undefined ? {} : { minimum_pay_amount: minimumPayAmount }),\n ...(maximumPayAmount === undefined ? {} : { maximum_pay_amount: maximumPayAmount }),\n ...(minimumInvoiceAmountMsats === undefined\n ? {}\n : { minimum_invoice_amount_msats: minimumInvoiceAmountMsats }),\n ...(maximumInvoiceAmountMsats === undefined\n ? {}\n : { maximum_invoice_amount_msats: maximumInvoiceAmountMsats }),\n };\n}\n", "/// <reference path=\"../qrcode.d.ts\" />\n\n// What the payer can do with an invoice: render it as a QR (SVG or PNG data\n// URL), copy it, or hand it to a wallet. Each action logs what it did and\n// refuses anything `assertInvoice` rejects.\n\nimport * as defaultQrEncoder from \"qrcode\";\nimport {\n type CopyInvoiceOptions,\n OPENRECEIVE_QR_DARK_COLOR,\n OPENRECEIVE_QR_ERROR_CORRECTION,\n OPENRECEIVE_QR_LIGHT_COLOR,\n OPENRECEIVE_QR_QUIET_ZONE_MODULES,\n type QrEncoder,\n type QrOptions,\n type OpenWalletOptions,\n} from \"./ui.ts\";\nimport { recordOrEmpty } from \"@openreceive/core\";\nimport { assertInvoice, createLightningUri } from \"./checkout-invoice.ts\";\nimport { emitBrowserLog } from \"./checkout-log.ts\";\n\nexport async function createQrSvg(invoice: string, options: QrOptions = {}): Promise<string> {\n return await createQrPayloadSvg(createLightningUri(invoice), options);\n}\n\nexport async function createQrPayloadSvg(\n payload: string,\n options: QrOptions = {},\n): Promise<string> {\n const encoder = getQrEncoder(options.encoder);\n const svg = await encoder.toString(payload, {\n type: \"svg\",\n errorCorrectionLevel: OPENRECEIVE_QR_ERROR_CORRECTION,\n margin: OPENRECEIVE_QR_QUIET_ZONE_MODULES,\n width: options.width,\n color: {\n dark: OPENRECEIVE_QR_DARK_COLOR,\n light: OPENRECEIVE_QR_LIGHT_COLOR,\n },\n });\n\n return String(svg);\n}\n\nexport async function createQrPngDataUrl(\n invoice: string,\n options: QrOptions = {},\n): Promise<string> {\n const encoder = getQrEncoder(options.encoder);\n\n if (encoder.toDataURL === undefined) {\n throw new Error(\"QR encoder does not support PNG data URL output.\");\n }\n\n const png = await encoder.toDataURL(createLightningUri(invoice), {\n type: \"image/png\",\n errorCorrectionLevel: OPENRECEIVE_QR_ERROR_CORRECTION,\n margin: OPENRECEIVE_QR_QUIET_ZONE_MODULES,\n width: options.width,\n color: {\n dark: OPENRECEIVE_QR_DARK_COLOR,\n light: OPENRECEIVE_QR_LIGHT_COLOR,\n },\n });\n\n return String(png);\n}\n\nexport async function copyInvoice(options: CopyInvoiceOptions): Promise<void> {\n assertInvoice(options.invoice);\n const clipboard = options.clipboard ?? globalThis.navigator?.clipboard;\n\n if (clipboard === undefined) {\n throw new Error(\"Clipboard API is unavailable.\");\n }\n\n await clipboard.writeText(options.invoice);\n emitBrowserLog(\n options.logger,\n \"info\",\n \"checkout.invoice.copied\",\n \"Copied Lightning invoice to clipboard.\",\n options.logContext,\n );\n}\n\n/**\n * Hand the invoice to the payer's wallet as a `lightning:` URI, and return the\n * URI. **Touch devices.**\n *\n * The default path is `location.assign` on the CURRENT window \u2014 the right\n * primitive for a custom-scheme deep link on a phone, and the wrong thing\n * anywhere else. With no registered `lightning:` handler the call does nothing\n * visible; with one, it navigates the payer off a checkout that is still\n * polling `/payments/check`. Pass `open` to route the URI somewhere that is not\n * the checkout window.\n *\n * This is why the shipped `<Checkout>` renders no wallet button of its own and\n * exposes `components.OpenWalletButton` as an opt-in slot instead: a desktop\n * payer is never sent to a handler that does not exist, next to the QR code\n * that IS the desktop payment path. A custom UI drawing its own button owns\n * that decision \u2014 see docs/guides/headless-checkout.md.\n */\nexport function openWallet(options: OpenWalletOptions): string {\n const uri = createLightningUri(options.invoice);\n\n if (options.open !== undefined) {\n options.open(uri);\n emitBrowserLog(\n options.logger,\n \"info\",\n \"checkout.wallet.opened\",\n \"Opened Lightning invoice URI.\",\n options.logContext,\n );\n return uri;\n }\n\n const location = globalThis.window?.location;\n if (location === undefined) {\n throw new Error(\"window.location is unavailable.\");\n }\n\n location.assign(uri);\n emitBrowserLog(\n options.logger,\n \"info\",\n \"checkout.wallet.opened\",\n \"Opened Lightning invoice URI.\",\n options.logContext,\n );\n return uri;\n}\n\n/**\n * A QR that follows a changing payload, without every host rewriting the same\n * effect.\n *\n * {@link createQrSvg} and {@link createQrPayloadSvg} are ASYNC, and that is the\n * trap: `dangerouslySetInnerHTML={{ __html: createQrSvg(invoice) }}` type-checks\n * (React types `__html` as `string | TrustedHTML`, and `TrustedHTML` is an empty\n * interface every object satisfies) and paints the literal text\n * \"[object Promise]\" inside the QR box. Resolving it by hand then needs the\n * other half nobody writes the first time: a slow encode that lands AFTER the\n * payload changed must not paint the old QR over the new one.\n *\n * So: call `show`/`showPayload` whenever the payload changes and render what\n * `onValue` last handed you. Only the newest call can publish \u2014 an earlier\n * encode still in flight is dropped, resolved or rejected. `stop()` drops the\n * one in flight, for a host going away. Same shape as\n * {@link createTickingValueController}: DOM-free, framework-free, one\n * implementation instead of one per renderer.\n */\nexport interface QrSvgControllerOptions {\n /** The newest encoded SVG. Not called for a superseded or stopped encode. */\n onValue(svg: string): void;\n /** Encode failures, on the same terms. */\n onError?(error: unknown): void;\n readonly encoder?: QrEncoder;\n readonly width?: number;\n}\n\nexport interface QrSvgController {\n /** Encode a bolt11, as the `lightning:` URI a wallet expects. */\n show(invoice: string): void;\n /** Encode a payload verbatim \u2014 a swap deposit URI, say. */\n showPayload(payload: string): void;\n /** Publish nothing further; the encode in flight is abandoned. */\n stop(): void;\n}\n\nexport function createQrSvgController(options: QrSvgControllerOptions): QrSvgController {\n // Monotonic, and bumped by `stop()` too: \"is this still the newest request\"\n // is the whole rule, and a stopped controller is one nobody can match.\n let generation = 0;\n\n const qrOptions = (): QrOptions => ({\n ...(options.encoder === undefined ? {} : { encoder: options.encoder }),\n ...(options.width === undefined ? {} : { width: options.width }),\n });\n\n const publish = (pending: Promise<string>): void => {\n generation += 1;\n const mine = generation;\n void pending.then(\n (svg) => {\n if (mine === generation) options.onValue(svg);\n },\n (error: unknown) => {\n if (mine === generation) options.onError?.(error);\n },\n );\n };\n\n return {\n show(invoice: string): void {\n publish(createQrSvg(invoice, qrOptions()));\n },\n showPayload(payload: string): void {\n publish(createQrPayloadSvg(payload, qrOptions()));\n },\n stop(): void {\n generation += 1;\n },\n };\n}\n\nfunction getQrEncoder(encoder: QrEncoder | undefined): QrEncoder {\n if (encoder !== undefined) return encoder;\n if (isQrEncoder(defaultQrEncoder)) return defaultQrEncoder;\n throw new Error(\"qrcode package did not expose a compatible encoder.\");\n}\n\nfunction isQrEncoder(value: unknown): value is QrEncoder {\n const record = recordOrEmpty(value);\n // Every object inherits Object.prototype.toString, so probing for `toString`\n // alone accepts anything \u2014 and a wrong import would then silently render a QR\n // of \"[object Object]\". Require the module's own encoder entry points.\n return (\n typeof record.toString === \"function\" &&\n record.toString !== Object.prototype.toString &&\n (typeof record.create === \"function\" || typeof record.toDataURL === \"function\")\n );\n}\n", "import { nonEmptyString, recordOrEmpty } from \"@openreceive/core\";\nimport { mergeAttemptIntoSnapshot } from \"./checkout-merge.ts\";\nimport { optionalSafeInteger } from \"./checkout-read.ts\";\nimport { readJsonResponse } from \"./checkout-transport.ts\";\nimport { resolveBrowserLogger, sanitizeBrowserLogEntry } from \"./console-logger.ts\";\nimport { requestHeaders } from \"./request-headers.ts\";\nimport { checkoutRoutes, type Routes } from \"./routes.ts\";\nimport type {\n BrowserLoggerOption,\n BrowserLogLevel,\n CheckoutInvoiceSnapshot,\n CheckoutSnapshot,\n} from \"./ui.ts\";\n\n/**\n * What every swap call needs: the fetch to use, and the mount `prefix` its\n * route is derived from (see {@link checkoutRoutes}). `prefix` is the only\n * URL input \u2014 no call in this module takes a route of its own.\n */\nexport interface SwapRequestOptions {\n readonly signal?: AbortSignal;\n readonly fetch: typeof globalThis.fetch;\n readonly prefix: string;\n readonly logger?: BrowserLoggerOption;\n readonly headers?: Readonly<Record<string, string>>;\n /** Header name the page's `<meta name=\"csrf-token\">` is sent under \u2014 see {@link requestHeaders}. */\n readonly csrfHeader?: string;\n}\n\n/**\n * POST JSON through the mounted swap route set.\n *\n * `action` selects the route client-side and is never sent: the shipped schemas\n * are `additionalProperties: false`, so an extra key is a 400. Only the actions\n * listed here are routed \u2014 an unrecognized one throws rather than silently\n * posting to `${prefix}/payments/check`. Swap starts go through\n * `startSwapRequest`, which owns the /swaps route and its audit events.\n */\nexport async function postJson(\n options: SwapRequestOptions & { readonly body: Record<string, unknown> },\n): Promise<unknown> {\n const { body } = options;\n const routes = checkoutRoutes(options.prefix);\n const reference = nonEmptyString(body.reference);\n const action = nonEmptyString(body.action);\n if (action !== undefined && action !== \"swap_quote\" && action !== \"refund_swap\") {\n throw new Error(`Unrecognized checkout action ${action}.`);\n }\n emitSwapActionLog(options.logger, \"requested\", body);\n\n try {\n const result =\n action === \"swap_quote\"\n ? await requestJson(options, routes.swapsQuote, {\n reference: reference,\n pay_in_asset: body.pay_in_asset,\n })\n : action === \"refund_swap\"\n ? await refundRequest(options, routes, body, reference)\n : await requestJson(options, routes.paymentsCheck, withoutAction(body));\n if (action === \"refund_swap\") {\n emitSwapActionLog(options.logger, \"succeeded\", body, swapActionResultFields(result));\n }\n return result;\n } catch (error) {\n emitSwapActionLog(options.logger, \"failed\", body, {\n error_message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\nexport function normalizeSwapStartInvoice(body: unknown): CheckoutInvoiceSnapshot {\n const outer = recordOrEmpty(body);\n const swap = recordOrEmpty(outer.swap ?? body);\n const checkout = recordOrEmpty(swap.checkout);\n const paymentHash = nonEmptyString(swap.payment_hash ?? checkout.payment_hash);\n if (\n paymentHash === undefined ||\n nonEmptyString(swap.provider) === undefined ||\n nonEmptyString(swap.pay_in_asset) === undefined ||\n nonEmptyString(swap.deposit_address) === undefined ||\n nonEmptyString(swap.deposit_amount) === undefined ||\n nonEmptyString(swap.provider_state) === undefined ||\n typeof swap.provider_expires_at !== \"number\"\n ) {\n throw new Error(\"Swap response did not include provider instructions.\");\n }\n // Optional echo of the checkout's own amount, which the client already knows.\n const amountMsats = optionalSafeInteger(checkout.amount_msats, \"amount_msats\");\n return {\n invoice_id: paymentHash,\n rail: \"swap\",\n payment_hash: paymentHash,\n ...(amountMsats === undefined ? {} : { amount_msats: amountMsats }),\n transaction_state: \"pending\",\n workflow_state: \"invoice_created\",\n expires_at: swap.provider_expires_at,\n swap: {\n provider: swap.provider as string,\n pay_in_asset: swap.pay_in_asset as string,\n deposit_address: swap.deposit_address as string,\n deposit_amount: swap.deposit_amount as string,\n provider_state: swap.provider_state as NonNullable<\n CheckoutInvoiceSnapshot[\"swap\"]\n >[\"provider_state\"],\n provider_expires_at: swap.provider_expires_at,\n ...copyOptionalSwapFields(swap),\n },\n };\n}\n\n/**\n * Start a swap on the mounted /swaps route. This is the only swap-start path,\n * so the swap.start.* audit events are emitted here \u2014 routing it through\n * postJson would log a start while posting somewhere else.\n */\nexport async function startSwapRequest(\n options: SwapRequestOptions & {\n readonly reference: string;\n readonly payInAsset: string;\n },\n): Promise<CheckoutInvoiceSnapshot> {\n const logBody = {\n action: \"start_swap\",\n reference: options.reference,\n pay_in_asset: options.payInAsset,\n };\n emitSwapActionLog(options.logger, \"requested\", logBody);\n try {\n const body = await requestJson(options, checkoutRoutes(options.prefix).swaps, {\n reference: options.reference,\n pay_in_asset: options.payInAsset,\n });\n emitSwapActionLog(options.logger, \"succeeded\", logBody, swapActionResultFields(body));\n return normalizeSwapStartInvoice(body);\n } catch (error) {\n emitSwapActionLog(options.logger, \"failed\", logBody, {\n error_message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n}\n\n/**\n * Read one swap attempt by payment hash, as a normalized invoice snapshot.\n *\n * THIS IS THE ONLY WAY BACK TO AN ATTEMPT THE BROWSER NO LONGER HOLDS.\n * `POST /checkouts/prepare` answers with the amount and the pay-in catalog and\n * NO attempts, so a checkout rebuilt from a reference alone opens on the\n * payment-method grid \u2014 and re-selecting the same asset only re-serves the\n * committed attempt while it is still live and comfortably before expiry, after\n * which it mints a second deposit address. `/swaps/status` selects one attempt\n * and applies no reuse test, so it still answers for a deposit that stopped\n * being payable hours ago. That is what a payer told to bookmark a refund\n * screen actually needs; see docs/guides/swap-refunds.md.\n *\n * Rejects like its siblings \u2014 a `BrowserRequestError` carrying `status`, so a\n * caller can tell an unknown attempt (404) from an outage. {@link\n * resumeSwapAttempt} is the forgiving wrapper the renderers use.\n */\nexport async function requestSwapStatus(\n options: SwapRequestOptions & {\n readonly reference: string;\n readonly paymentHash: string;\n },\n): Promise<CheckoutInvoiceSnapshot> {\n const body = await requestJson(options, checkoutRoutes(options.prefix).swapsStatus, {\n reference: options.reference,\n payment_hash: options.paymentHash,\n });\n return normalizeSwapStartInvoice(body);\n}\n\n/**\n * A prepared snapshot, with the host's remembered swap attempt folded back in.\n *\n * A FAILURE IS SILENCE, NOT AN ERROR. The payment hash comes from the host's\n * own storage, which can hold a stale note \u2014 an attempt on another visitor's\n * order, or one the server will no longer serve. Neither is a reason to put an\n * error screen in front of a payer who can still start a fresh payment, so the\n * prepared snapshot is returned unchanged and the checkout opens on the method\n * grid exactly as it would have.\n *\n * Shared rather than written twice: React and the custom element both need it\n * for `resumePaymentHash`, and the rule above is the part that would drift.\n */\nexport async function resumeSwapAttempt(\n options: SwapRequestOptions & {\n readonly reference: string;\n readonly paymentHash: string;\n readonly snapshot: CheckoutSnapshot;\n },\n): Promise<CheckoutSnapshot> {\n if (options.paymentHash.length === 0) return options.snapshot;\n try {\n const invoice = await requestSwapStatus(options);\n return mergeAttemptIntoSnapshot(invoice, options.snapshot);\n } catch {\n return options.snapshot;\n }\n}\n\n/**\n * Review-or-confirm a swap refund for one attempt, and return the normalized\n * swap invoice \u2014 carrying the staged refund address on review.\n *\n * `paymentHash` is what the route takes, so it is what this takes. Resolving an\n * attempt id to a hash is the job of whoever holds the snapshot: the controller\n * does it in {@link CheckoutController.stageSwapRefund}, which is what an\n * integration should be calling.\n */\nexport async function requestSwapRefund(\n options: SwapRequestOptions & {\n readonly reference?: string;\n readonly paymentHash: string;\n readonly refundAddress: string;\n readonly confirm: boolean;\n },\n): Promise<CheckoutInvoiceSnapshot> {\n const body = await postJson({\n fetch: options.fetch,\n prefix: options.prefix,\n ...(options.logger === undefined ? {} : { logger: options.logger }),\n ...(options.headers === undefined ? {} : { headers: options.headers }),\n ...(options.csrfHeader === undefined ? {} : { csrfHeader: options.csrfHeader }),\n body: {\n ...(options.reference === undefined ? {} : { reference: options.reference }),\n payment_hash: options.paymentHash,\n action: \"refund_swap\",\n refund_address: options.refundAddress,\n confirm: options.confirm,\n },\n });\n return normalizeSwapStartInvoice(body);\n}\n\nasync function refundRequest(\n options: SwapRequestOptions,\n routes: Routes,\n body: Record<string, unknown>,\n reference: string | undefined,\n): Promise<unknown> {\n if (reference === undefined) throw new Error(\"Swap refund requires reference.\");\n const refundAddress = nonEmptyString(body.refund_address);\n if (refundAddress === undefined) throw new Error(\"Swap refund requires refund_address.\");\n const paymentHash = nonEmptyString(body.payment_hash);\n if (paymentHash === undefined) throw new Error(\"Swap refund requires payment_hash.\");\n if (body.confirm === true) {\n const status = recordOrEmpty(\n await requestJson(options, routes.swapsRefunds, {\n reference: reference,\n payment_hash: paymentHash,\n refund_address: refundAddress,\n }),\n );\n return { swap: status };\n }\n const status = recordOrEmpty(\n await requestJson(options, routes.swapsStatus, {\n reference: reference,\n payment_hash: paymentHash,\n }),\n );\n // Review, not submit: the staged address rides back on the snapshot so the\n // panel can show it for confirmation. Confirmation is a browser UX step \u2014\n // authorization and provider-state refresh happen on the host when the\n // confirmed refund request is submitted.\n return { swap: { ...status, refund_address: refundAddress } };\n}\n\nfunction withoutAction(body: Record<string, unknown>): Record<string, unknown> {\n const { action: _action, ...rest } = body;\n return rest;\n}\n\nasync function requestJson(\n options: SwapRequestOptions,\n url: string,\n body: Record<string, unknown>,\n): Promise<unknown> {\n // Bare call on a local, never `options.fetch(...)`: invoking window.fetch as\n // a method of the options object rebinds `this` and the browser throws\n // \"Illegal invocation\".\n const fetcher = options.fetch;\n const response = await fetcher(url, {\n method: \"POST\",\n signal: options.signal,\n headers: requestHeaders(options.headers, options.csrfHeader),\n body: JSON.stringify(body),\n });\n return readJsonResponse(response, \"OpenReceive request failed.\");\n}\n\nfunction copyOptionalSwapFields(\n swap: Record<string, unknown>,\n): Partial<NonNullable<CheckoutInvoiceSnapshot[\"swap\"]>> {\n const output: Record<string, unknown> = {};\n for (const key of [\n \"deposit_memo\",\n \"deposit_tx_id\",\n \"payout_tx_id\",\n \"refund_tx_id\",\n \"refund_reason\",\n \"refund_amount\",\n \"attention\",\n \"attempt_id\",\n \"provider_order_id\",\n \"refund_address\",\n \"attention_reason\",\n \"deposit_received_amount\",\n \"fee\",\n ]) {\n if (swap[key] !== undefined) output[key] = swap[key];\n }\n return output as Partial<NonNullable<CheckoutInvoiceSnapshot[\"swap\"]>>;\n}\n\nfunction emitSwapActionLog(\n logger: BrowserLoggerOption | undefined,\n outcome: \"requested\" | \"succeeded\" | \"failed\",\n body: Record<string, unknown>,\n extra: Record<string, unknown> = {},\n): void {\n const sink = resolveBrowserLogger(logger);\n if (sink === undefined) return;\n const action = nonEmptyString(body.action);\n if (action !== \"start_swap\" && action !== \"refund_swap\") return;\n const event = action === \"start_swap\" ? `swap.start.${outcome}` : `swap.refund.${outcome}`;\n const level: BrowserLogLevel =\n outcome === \"failed\" ? \"warn\" : outcome === \"requested\" ? \"debug\" : \"info\";\n try {\n sink(\n sanitizeBrowserLogEntry({\n level,\n event,\n message: `${action === \"start_swap\" ? \"Swap start\" : \"Swap refund\"} ${outcome}.`,\n reference: nonEmptyString(body.reference),\n pay_in_asset: nonEmptyString(body.pay_in_asset),\n ...(action === \"refund_swap\" ? { confirm: body.confirm === true } : {}),\n ...extra,\n }),\n );\n } catch {\n // Diagnostics never affect payer actions.\n }\n}\n\nfunction swapActionResultFields(body: unknown): Record<string, unknown> {\n const swap = recordOrEmpty(recordOrEmpty(body).swap ?? body);\n return {\n payment_hash: nonEmptyString(swap.payment_hash),\n provider_state: nonEmptyString(swap.provider_state),\n attention: typeof swap.attention === \"boolean\" ? swap.attention : undefined,\n };\n}\n", "// The polling loop and the controller around it: CheckoutWatcher owns the\n// interval, the terminal-state stop rules, the subscriber list and the staged\n// swap-refund address; BrowserCheckoutController is the object the UI packages\n// drive.\n\nimport { unixSeconds } from \"@openreceive/core\";\nimport { copyInvoice, openWallet } from \"./checkout-actions.ts\";\nimport { checkoutLogFields, emitBrowserLog } from \"./checkout-log.ts\";\nimport {\n createCheckoutState,\n normalizeCheckoutState,\n refreshCheckoutState,\n} from \"./checkout-state.ts\";\nimport { overlaySwapRefundStagingIntoSnapshot } from \"./checkout-swap-view.ts\";\nimport { BrowserRequestError, createStatusFetcher } from \"./checkout-transport.ts\";\nimport { requestSwapRefund } from \"./swap-http.ts\";\nimport {\n type CheckoutController,\n type CheckoutControllerOptions,\n type CheckoutInvoiceSnapshot,\n type CheckoutSnapshot,\n type CheckoutState,\n type CheckoutWatcherOptions,\n OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS,\n} from \"./ui.ts\";\n\nexport class CheckoutWatcher {\n private options: CheckoutWatcherOptions;\n private state: CheckoutState | undefined;\n private snapshot: CheckoutSnapshot;\n /**\n * The swap attempt the payer is reviewing a refund for, held here because the\n * server does not know about it until they confirm: `/swaps/status` answers\n * without a `refund_address`, so a poll result would otherwise wipe what they\n * typed mid-review. Every snapshot this watcher publishes is folded through\n * it first, which is why no consumer has to remember an overlay rule.\n */\n private stagedSwapInvoice: CheckoutInvoiceSnapshot | undefined;\n\n /**\n * The host's order copy, remembered for the life of the checkout. It rides\n * `/checkouts/prepare` and `/checkouts` only \u2014 `/payments/check` has no\n * reason to re-send an unchanging display string on every tick \u2014 so without\n * this the first poll after the mint blanks it under the payer.\n */\n private description: string | undefined;\n private countdownTimer: ReturnType<typeof globalThis.setInterval> | undefined;\n private pollTimer: ReturnType<typeof globalThis.setInterval> | undefined;\n private running = false;\n private generation = 0;\n private pendingRefresh: Promise<CheckoutSnapshot | null> | undefined;\n private pollInFlight = false;\n private pollFailureCount = 0;\n private pollBackoffUntil: number | undefined;\n\n constructor(options: CheckoutWatcherOptions) {\n this.options = options;\n this.snapshot = options.snapshot;\n }\n\n start(): CheckoutState {\n this.stop();\n this.running = true;\n const snapshot = this.publishSnapshot(this.options.snapshot);\n const state = createCheckoutState(snapshot, {\n now: this.now(),\n logger: this.options.logger,\n });\n this.applyState(state);\n return state;\n }\n\n /** The last snapshot as the server gave it, before any staging overlay. */\n getSnapshot(): CheckoutSnapshot {\n return this.snapshot;\n }\n\n getStagedSwapInvoice(): CheckoutInvoiceSnapshot | undefined {\n return this.stagedSwapInvoice;\n }\n\n /**\n * Hold a swap attempt whose refund address the payer has staged, fold it into\n * the snapshot immediately, and republish. Passing `undefined` un-stages \u2014\n * the \"back to Lightning\" exit and a fresh start both go through it.\n */\n stageSwapInvoice(invoice: CheckoutInvoiceSnapshot | undefined): CheckoutState | undefined {\n this.stagedSwapInvoice = invoice;\n const snapshot = this.publishSnapshot(this.snapshot);\n const current = this.state;\n const next = createCheckoutState(snapshot, {\n now: this.now(),\n logger: this.options.logger,\n source: \"refresh\",\n ...(current === undefined ? {} : { previousState: current }),\n });\n if (this.running) {\n this.applyState(next);\n } else {\n this.state = next;\n }\n return next;\n }\n\n /**\n * Fold the staged refund address back in and hand the result to `onSnapshot`,\n * so the host's copy and the derived state can never disagree about what the\n * payer is reviewing.\n *\n * What is REMEMBERED is the un-overlaid snapshot. Keeping the overlaid one\n * would bake the staged address into the record the next publish is computed\n * from, and un-staging could never take it back out.\n */\n private publishSnapshot(snapshot: CheckoutSnapshot): CheckoutSnapshot {\n const carried =\n snapshot.description === undefined && this.description !== undefined\n ? { ...snapshot, description: this.description }\n : snapshot;\n this.description = carried.description;\n this.snapshot = carried;\n const overlaid = overlaySwapRefundStagingIntoSnapshot(carried, this.stagedSwapInvoice);\n this.options.onSnapshot?.(overlaid);\n return overlaid;\n }\n\n stop(): void {\n this.running = false;\n this.generation += 1;\n this.pollInFlight = false;\n this.pendingRefresh = undefined;\n this.stopCountdown();\n this.stopPolling();\n }\n\n getState(): CheckoutState | undefined {\n return this.state;\n }\n\n /**\n * Stop and enter the terminal `cancelled` phase. Unlike {@link stop}, the\n * watcher's own state moves, so later reads report `cancelled` instead of the\n * last polled state.\n */\n cancel(): CheckoutState {\n const current =\n this.state ??\n createCheckoutState(this.options.snapshot, {\n now: this.now(),\n logger: this.options.logger,\n });\n this.stop();\n // A settled attempt is already terminal and its money has moved: cancelling\n // it would only lie to the payer.\n if (current.settled) {\n this.state = current;\n return current;\n }\n const cancelled = normalizeCheckoutState(\n { ...current, workflow_state: \"cancelled\" },\n this.now(),\n );\n this.state = cancelled;\n this.options.onState(cancelled);\n return cancelled;\n }\n\n async reloadState(): Promise<CheckoutState> {\n const current =\n this.state ??\n createCheckoutState(this.options.snapshot, {\n now: this.now(),\n logger: this.options.logger,\n });\n const refreshStatus = this.options.refreshStatus;\n if (refreshStatus === undefined || current.reference.length === 0) {\n return current;\n }\n\n const generation = this.generation;\n try {\n const fetched = await this.fetchSnapshot(current.reference);\n if (generation !== this.generation) return this.state ?? current;\n if (fetched === null) return current;\n const next = this.publishSnapshot(fetched);\n const nextState = createCheckoutState(next, {\n now: this.now(),\n logger: this.options.logger,\n source: \"refresh\",\n previousState: current,\n });\n if (this.running) {\n this.applyState(nextState);\n } else {\n this.state = nextState;\n }\n return nextState;\n } catch (error) {\n if (generation !== this.generation) return this.state ?? current;\n this.options.onError?.(error);\n throw error;\n }\n }\n\n private fetchSnapshot(reference: string): Promise<CheckoutSnapshot | null> {\n if (this.pendingRefresh !== undefined) return this.pendingRefresh;\n const pending = Promise.resolve(this.options.refreshStatus?.(reference) ?? null);\n this.pendingRefresh = pending;\n void pending\n .finally(() => {\n if (this.pendingRefresh === pending) this.pendingRefresh = undefined;\n })\n .catch(() => undefined);\n return pending;\n }\n\n private applyState(state: CheckoutState): void {\n if (!this.running) return;\n this.state = state;\n this.options.onState(state);\n this.syncWatchers();\n }\n\n private syncWatchers(): void {\n const state = this.state;\n if (state === undefined || !this.running) return;\n\n if (state.terminal) {\n this.stop();\n return;\n }\n\n if (state.settled || state.expires_at === undefined || state.expires_in_seconds === 0) {\n this.stopCountdown();\n } else if (this.countdownTimer === undefined) {\n this.countdownTimer = this.setInterval()(() => {\n const current = this.state;\n if (current === undefined) return;\n this.applyState(\n refreshCheckoutState(current, {\n now: this.now(),\n logger: this.options.logger,\n source: \"countdown\",\n }),\n );\n }, 1000);\n }\n\n const canPollAttempt =\n state.rail !== \"checkout_lock\" &&\n typeof state.payment_hash === \"string\" &&\n /^[0-9a-f]{64}$/i.test(state.payment_hash);\n if (\n this.options.refreshStatus === undefined ||\n state.reference.length === 0 ||\n !canPollAttempt\n ) {\n this.stopPolling();\n } else if (this.pollTimer === undefined) {\n this.pollTimer = this.setInterval()(() => {\n void this.poll();\n }, this.options.pollIntervalMs ?? OPENRECEIVE_DEFAULT_POLL_INTERVAL_MS);\n }\n }\n\n private async poll(): Promise<void> {\n const refreshStatus = this.options.refreshStatus;\n const current = this.state;\n if (!this.running || refreshStatus === undefined || current === undefined) return;\n if (current.terminal) {\n this.stopPolling();\n return;\n }\n // One request at a time: a slow backend must not stack overlapping polls\n // (which multiply load exactly when it is struggling, and whose stale\n // responses could arrive out of order).\n if (this.pollInFlight) return;\n // Failed polls back off (honoring the server's Retry-After when present)\n // instead of hammering at the fixed interval.\n if (this.pollBackoffUntil !== undefined && this.now() < this.pollBackoffUntil) return;\n this.pollInFlight = true;\n const generation = this.generation;\n\n try {\n const fetched = await this.fetchSnapshot(current.reference);\n if (generation !== this.generation) return;\n this.pollFailureCount = 0;\n this.pollBackoffUntil = undefined;\n if (fetched === null) return;\n if (!this.running || this.state === undefined) return;\n // A response that raced a settlement must never flip a paid screen\n // back to \"waiting for payment\".\n if (this.state.terminal) return;\n const next = this.publishSnapshot(fetched);\n this.applyState(\n createCheckoutState(next, {\n now: this.now(),\n logger: this.options.logger,\n source: \"refresh\",\n previousState: this.state,\n }),\n );\n } catch (error) {\n if (generation !== this.generation) return;\n this.pollFailureCount += 1;\n const retryAfterSeconds =\n error instanceof BrowserRequestError ? error.retryAfterSeconds : undefined;\n const backoffSeconds =\n retryAfterSeconds ?? Math.min(60, 2 ** Math.min(this.pollFailureCount, 6));\n this.pollBackoffUntil = this.now() + backoffSeconds;\n this.options.onError?.(error);\n } finally {\n if (generation === this.generation) this.pollInFlight = false;\n }\n }\n\n private stopCountdown(): void {\n if (this.countdownTimer === undefined) return;\n this.clearInterval()(this.countdownTimer);\n this.countdownTimer = undefined;\n }\n\n private stopPolling(): void {\n if (this.pollTimer === undefined) return;\n this.clearInterval()(this.pollTimer);\n this.pollTimer = undefined;\n }\n\n private now(): number {\n return this.options.now?.() ?? unixSeconds();\n }\n\n private setInterval(): typeof globalThis.setInterval {\n return this.options.setInterval ?? globalThis.setInterval;\n }\n\n private clearInterval(): typeof globalThis.clearInterval {\n return this.options.clearInterval ?? globalThis.clearInterval;\n }\n}\n\nexport class BrowserCheckoutController implements CheckoutController {\n private options: CheckoutControllerOptions;\n private watcher: CheckoutWatcher;\n private state: CheckoutState | undefined;\n private generation = 0;\n\n constructor(options: CheckoutControllerOptions) {\n this.options = options;\n this.watcher = this.createWatcher(options);\n }\n\n start(): CheckoutState {\n this.state = this.watcher.start();\n return this.state;\n }\n\n stop(): void {\n this.generation += 1;\n this.watcher.stop();\n }\n\n getState(): CheckoutState | undefined {\n // The watcher owns state. A stopped watcher still applies reloadState()\n // results to itself without calling back, so preferring the controller's\n // last observed copy would serve a stale state after stop().\n return this.watcher.getState() ?? this.state;\n }\n\n async copyInvoice(): Promise<void> {\n const state = this.currentState();\n await copyInvoice({\n invoice: state.invoice,\n clipboard: this.options.clipboard,\n logger: this.options.logger,\n logContext: checkoutLogFields(state),\n });\n }\n\n openWallet(): string {\n const state = this.currentState();\n return openWallet({\n invoice: state.invoice,\n open: this.options.open,\n logger: this.options.logger,\n logContext: checkoutLogFields(state),\n });\n }\n\n async reloadState(): Promise<CheckoutState> {\n return this.watcher.reloadState();\n }\n\n /**\n * Step one of the two-step refund: post `/swaps/status` and hold the address\n * the payer typed, so the panel can show it back for confirmation. It touches\n * no refund route \u2014 nothing is submitted until {@link confirmSwapRefund}.\n *\n * The staged address lives in the watcher, so every later poll keeps it.\n */\n async stageSwapRefund(options: {\n readonly attemptId: string;\n readonly refundAddress: string;\n }): Promise<CheckoutInvoiceSnapshot> {\n return this.submitSwapRefund(options, false);\n }\n\n /** Step two: the only call that posts `/swaps/refunds`. */\n async confirmSwapRefund(options: {\n readonly attemptId: string;\n readonly refundAddress: string;\n }): Promise<CheckoutInvoiceSnapshot> {\n return this.submitSwapRefund(options, true);\n }\n\n /**\n * Drop the staged address. The payer leaving the swap for Lightning is the\n * one exit that is not a submitted refund, so the engine owns clearing it.\n */\n clearSwapRefundStaging(): void {\n if (this.watcher.getStagedSwapInvoice() === undefined) return;\n this.watcher.stageSwapInvoice(undefined);\n }\n\n private async submitSwapRefund(\n options: { readonly attemptId: string; readonly refundAddress: string },\n confirm: boolean,\n ): Promise<CheckoutInvoiceSnapshot> {\n const prefix = this.options.prefix;\n if (prefix === undefined) {\n throw new TypeError(\"Swap refunds need the mount prefix the controller was given.\");\n }\n const snapshot = this.watcher.getSnapshot();\n // The controller holds the snapshot, so it resolves the attempt's payment\n // hash itself \u2014 the route takes a hash, and an integration should not have\n // to hand back an invoice array to look one up.\n const paymentHash = resolveAttemptPaymentHash(\n [this.watcher.getStagedSwapInvoice(), ...snapshot.invoices],\n options.attemptId,\n );\n if (paymentHash === undefined) {\n throw new Error(`No swap attempt ${options.attemptId} in this checkout.`);\n }\n const generation = this.generation;\n const invoice = await requestSwapRefund({\n fetch: this.options.fetch ?? globalThis.fetch,\n prefix,\n ...(snapshot.reference === \"\" ? {} : { reference: snapshot.reference }),\n ...(this.options.statusHeaders === undefined ? {} : { headers: this.options.statusHeaders }),\n ...(this.options.csrfHeader === undefined ? {} : { csrfHeader: this.options.csrfHeader }),\n ...(this.options.logger === undefined ? {} : { logger: this.options.logger }),\n paymentHash,\n refundAddress: options.refundAddress,\n confirm,\n });\n if (generation !== this.generation) throw new DOMException(\"Checkout changed.\", \"AbortError\");\n this.watcher.stageSwapInvoice(invoice);\n return invoice;\n }\n\n cancel(): CheckoutState {\n this.generation += 1;\n this.state = this.watcher.cancel();\n emitBrowserLog(\n this.options.logger,\n \"info\",\n \"checkout.cancelled\",\n \"Cancelled checkout and stopped the watcher.\",\n checkoutLogFields(this.state),\n );\n return this.state;\n }\n\n private createWatcher(options: CheckoutControllerOptions): CheckoutWatcher {\n // `polling: false` withholds the status fetcher, NOT the mount: `prefix`\n // still says where the routes are, so a refund can be staged on a checkout\n // that is deliberately not polling.\n const refreshStatus =\n options.polling === false\n ? undefined\n : (options.refreshStatus ??\n (options.prefix === undefined\n ? undefined\n : createStatusFetcher({\n prefix: options.prefix,\n snapshot: options.snapshot,\n fetch: options.fetch,\n headers: options.statusHeaders,\n csrfHeader: options.csrfHeader,\n })));\n\n return new CheckoutWatcher({\n ...options,\n ...(refreshStatus === undefined ? {} : { refreshStatus }),\n onState: (state) => {\n this.state = state;\n options.onState?.(state);\n },\n ...(options.onSnapshot === undefined ? {} : { onSnapshot: options.onSnapshot }),\n });\n }\n\n private currentState(): CheckoutState {\n return (\n this.getState() ??\n createCheckoutState(this.options.snapshot, {\n now: this.options.now?.(),\n logger: this.options.logger,\n })\n );\n }\n}\n\nexport function createCheckoutController(options: CheckoutControllerOptions): CheckoutController {\n return new BrowserCheckoutController(options);\n}\n\n/**\n * An attempt is addressed by `swap.attempt_id ?? invoice_id` everywhere the\n * payer can see it (that is what `SwapDisplayModel.attemptId` is), and the\n * routes take `payment_hash`. This is the one place that translation happens.\n */\nfunction resolveAttemptPaymentHash(\n invoices: readonly (CheckoutInvoiceSnapshot | undefined)[],\n attemptId: string,\n): string | undefined {\n for (const invoice of invoices) {\n if (invoice === undefined) continue;\n if ((invoice.swap?.attempt_id ?? invoice.invoice_id) !== attemptId) continue;\n if (invoice.payment_hash !== undefined) return invoice.payment_hash;\n }\n return undefined;\n}\n", "// The create-mode flow both OpenReceive checkout renderers run: the deferred\n// Lightning mint and the swap start, plus the five pieces of state a host needs\n// to render them.\n//\n// It used to be written out once in @openreceive/elements (the element class)\n// and once in @openreceive/react (CheckoutCreate + PaymentWizard). They had\n// already drifted \u2014 React had no in-flight guard on the mint at all, and the\n// element's swap-start recovery was not scoped to the asset being started.\n// Both bugs are fixed here, in the one copy. See docs/internal/wrapper-parity.md.\n//\n// Two of those five fields gate a request: `mintingLightning` and\n// `startingSwapAsset` are read in return-early conditions, so a second click, a\n// poll-driven re-render or an attribute the element wrote itself cannot become\n// a second POST. They cover only the IN-FLIGHT window. The already-completed\n// window is guarded off state that outlives the request instead: ensureLightning\n// reuses a bolt11 that still has time on the clock, and startSwap re-shows an\n// asset's deposit instructions rather than starting a colliding second attempt.\n// The other three fields decide nothing about requests \u2014 `wizardError` and\n// `swapStartError` are the payer-facing strings the catch paths set, and\n// `lightningRequested` is a render flag (create mode defers the QR until the\n// payer asks for it).\n//\n// What is NOT here, deliberately: rendering, and how a new snapshot reaches the\n// screen. The element publishes by writing its own attributes and rebuilding a\n// shadow tree; React publishes with setState and hands a started swap attempt\n// up to whichever component owns the snapshot. That difference is the whole\n// reason there are two renderers, so it stays an injected callback rather than\n// a branch in here.\n\nimport { recordOrEmpty } from \"@openreceive/core\";\nimport {\n findReusableLightningInvoice,\n mergeAttemptIntoSnapshot,\n mergeMintedCheckout,\n} from \"./checkout-merge.ts\";\nimport { postJson, startSwapRequest } from \"./swap-http.ts\";\nimport type {\n BrowserLoggerOption,\n CheckoutInvoiceSnapshot,\n CheckoutPaymentMethod,\n CheckoutSnapshot,\n} from \"./ui.ts\";\n\n/**\n * The swap attempt the wizard is showing. It stays host state \u2014 the element's\n * breadcrumb, refund draft and deposit panel read it, and React's wizard keeps\n * it in `useState` \u2014 so the session reaches it through accessors instead of\n * owning a second copy that could disagree.\n */\nexport interface SwapSelection {\n started(): CheckoutInvoiceSnapshot | undefined;\n setStarted(invoice: CheckoutInvoiceSnapshot): void;\n dismissedInvoiceId(): string | null;\n setDismissedInvoiceId(invoiceId: string | null): void;\n setSelectedAsset(payInAsset: string | null): void;\n}\n\n/**\n * Everything {@link CheckoutSession.startSwap} needs, as ONE option.\n *\n * These three used to be three optional fields beside each other\n * (`swapSelection`, `swapPrefix`, `fetch`), which let a host supply two of them\n * and get silence: `startSwap` returned at its first `undefined` without a\n * throw, an `onError` or a state change, so the payer clicked Continue and the\n * screen did not move. They are only ever useful as a set, so they are one\n * field now and the mistake is no longer representable \u2014 a host either drives\n * swaps or it does not.\n */\nexport interface CheckoutSwapOptions {\n /** The swap attempt the wizard is showing, over the host's own state. */\n selection: SwapSelection;\n /**\n * The mount prefix swap routes are derived from. May still answer\n * `undefined` \u2014 a standalone wizard has no prefix until its host has one \u2014\n * and a start attempted before then is reported through `onError` rather\n * than swallowed.\n */\n prefix(): string | undefined;\n /** Read at call time so a host that swaps `globalThis.fetch` is honoured. */\n fetch(): typeof globalThis.fetch | undefined;\n /**\n * Header name the page's `<meta name=\"csrf-token\">` is sent under on the\n * quote and start calls. Read at call time like the two above; `undefined`\n * means the default, `X-CSRF-Token`.\n */\n csrfHeader?(): string | undefined;\n /**\n * Publish a freshly started swap attempt. The two hosts fold it into their\n * snapshot differently (the element re-keys its poll controller onto the\n * merged snapshot; React hands the attempt to whichever component owns the\n * snapshot), so the merge stays on the host side of this callback.\n */\n onStarted?(invoice: CheckoutInvoiceSnapshot): void;\n}\n\nexport interface CheckoutSessionOptions {\n /**\n * The snapshot the host is rendering right now, read at call time \u2014 the\n * element's changes under it on every poll.\n */\n snapshot(): CheckoutSnapshot | undefined;\n /** The order being paid, read at call time (the element's is an attribute). */\n reference(): string | undefined;\n /** Endpoint is part of checkout identity; trailing slashes are equivalent. */\n prefix?(): string | undefined;\n /**\n * Mint a Lightning invoice for this reference (POST `${prefix}/checkouts`).\n * The host closes over its own prefix, metadata and fetch. Answer `undefined`\n * to say \"this host cannot mint\" \u2014 React's payment wizard is such a host: it\n * asks its parent for Lightning through `onRequestLightning` instead.\n */\n requestCheckout?(reference: string, signal?: AbortSignal): Promise<CheckoutSnapshot> | undefined;\n /** Publish a snapshot that now carries the Lightning attempt. */\n onSnapshot?(snapshot: CheckoutSnapshot): void;\n /**\n * Swap support, all of it or none of it. Omit for a Lightning-only host:\n * {@link CheckoutSession.startSwap} then reports through `onError` instead\n * of doing nothing.\n */\n swap?: CheckoutSwapOptions;\n logger?: BrowserLoggerOption;\n /** The host's error surface: a DOM `openreceive:error` event, or `onError`. */\n onError(error: unknown): void;\n /** Session state changed \u2014 re-render. */\n onChange(): void;\n}\n\nexport interface CheckoutSession {\n /** Lightning mint failure, shown inline in the wizard by the element. */\n readonly wizardError: string | undefined;\n /** Swap-start failure, shown inline in the deposit slot with a retry button. */\n readonly swapStartError: string | undefined;\n /** Create mode: the Lightning QR is deferred until the payer asks for it. */\n readonly lightningRequested: boolean;\n /** True while a mint is in flight \u2014 the guard, and the spinner. */\n readonly mintingLightning: boolean;\n /** In-flight swap create; a second click must not mint a colliding attempt. */\n readonly startingSwapAsset: string | null;\n /**\n * Quotes observed for each pay-in asset, keyed by `pay_in_asset`. An entry\n * with `available: false` is why `startSwap` stopped before starting, and\n * carries the accepted range the host renders in its unavailable panel.\n */\n readonly swapQuotes: Readonly<Record<string, CheckoutPaymentMethod>>;\n /** Invalidate every outstanding action when identity changes. */\n syncIdentity(): void;\n reset(): void;\n dispose(): void;\n capture(): { readonly signal: AbortSignal; isCurrent(): boolean };\n ensureLightning(): Promise<void>;\n /**\n * Quote the pay-in asset, then start the swap when the quote confirms the\n * amount is in range. Both steps live HERE so the element and React behave\n * identically: an out-of-range amount is an unavailable quote in\n * {@link swapQuotes}, not a generic swap-start error.\n */\n startSwap(payInAsset: string): Promise<void>;\n /** A new order is being prepared: Lightning is deferred again. */\n resetLightningRequest(): void;\n /** The payer left the focused swap flow, so the failure they left goes too. */\n clearSwapStartError(): void;\n}\n\nconst SWAP_START_FAILED = \"Could not prepare the payment address. Please try again.\";\nconst MISSING_SWAP_OPTIONS =\n \"startSwap needs the session's `swap` options (selection, prefix, fetch) \u2014 this session was \" +\n \"created without them, so it cannot start a swap. See docs/guides/headless-checkout.md.\";\nconst MISSING_SWAP_WIRING = \"startSwap cannot start a swap: the session was given no\";\nconst MINT_FAILED = \"Could not create the Lightning invoice. Please try again.\";\n\n/**\n * A swap-quote body keyed by its pay-in asset. The route echoes the asset as\n * `pay_asset`; the checkout grid keys methods by `pay_in_asset`, so the alias\n * is resolved once, here.\n */\nfunction normalizeSwapQuote(body: unknown): CheckoutPaymentMethod | undefined {\n const quote = recordOrEmpty(recordOrEmpty(body).quote ?? body);\n const payInAsset = quote.pay_in_asset ?? quote.pay_asset;\n return typeof payInAsset === \"string\"\n ? ({ ...quote, pay_in_asset: payInAsset } as unknown as CheckoutPaymentMethod)\n : undefined;\n}\n\n/** The server's payer-facing text travels on the thrown error; keep it. */\nfunction payerFacingMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.length > 0 ? error.message : fallback;\n}\n\nexport function createCheckoutSession(options: CheckoutSessionOptions): CheckoutSession {\n let wizardError: string | undefined;\n let swapStartError: string | undefined;\n let lightningRequested = false;\n let mintingLightning = false;\n let startingSwapAsset: string | null = null;\n let swapQuotes: Record<string, CheckoutPaymentMethod> = {};\n let generation = 0;\n let abort = new AbortController();\n const identityKey = () =>\n JSON.stringify([\n options.reference(),\n (options.prefix?.() ?? options.swap?.prefix() ?? \"\").replace(/\\/+$/, \"\"),\n ]);\n let identity = identityKey();\n function invalidateActions(): void {\n abort.abort();\n abort = new AbortController();\n generation += 1;\n mintingLightning = false;\n startingSwapAsset = null;\n }\n function reset(): void {\n invalidateActions();\n identity = identityKey();\n wizardError = undefined;\n swapStartError = undefined;\n lightningRequested = false;\n mintingLightning = false;\n startingSwapAsset = null;\n swapQuotes = {};\n }\n function syncIdentity(): void {\n if (identityKey() !== identity) reset();\n }\n function capture() {\n syncIdentity();\n const captured = generation;\n return {\n signal: abort.signal,\n isCurrent: () => captured === generation && identityKey() === identity,\n };\n }\n\n async function ensureLightning(): Promise<void> {\n const action = capture();\n // A second click while the first mint is in flight would POST /checkouts\n // again; the loser's 409 then surfaced as a wizard error over a perfectly\n // good invoice. `startSwap` guards the same way.\n if (mintingLightning) return;\n const reference = options.reference();\n if (reference === undefined || reference.length === 0) return;\n const current = options.snapshot();\n if (current !== undefined) {\n // Reuse a bolt11 that still has enough time on the clock rather than\n // minting a second attempt for the same reference. Pinned on both hosts:\n // \"re-selecting Bitcoin after the mint reuses the bolt11 \u2026\" in\n // tests/element-lifecycle.test.mjs and tests/react-checkout-behavior.test.mjs.\n const reusableLightning = findReusableLightningInvoice(current);\n if (reusableLightning !== undefined) {\n lightningRequested = true;\n options.onSnapshot?.(mergeAttemptIntoSnapshot(reusableLightning, current));\n // Same as every other state mutation here: `lightningRequested` is a\n // render flag, so the host has to be told to re-render for it.\n options.onChange();\n return;\n }\n }\n mintingLightning = true;\n wizardError = undefined;\n options.onChange();\n try {\n const pending = options.requestCheckout?.(reference, action.signal);\n if (pending === undefined) return;\n const checkout = await pending;\n if (!action.isCurrent()) return;\n lightningRequested = true;\n // The mint response does not carry the warmed method catalog, so the\n // merge keeps `payment_methods` and the sibling attempts from the\n // snapshot that was already on screen.\n options.onSnapshot?.(mergeMintedCheckout(checkout, options.snapshot()));\n } catch (error) {\n if (!action.isCurrent()) return;\n // Surface the mint failure inline instead of silently returning to the\n // method picker.\n wizardError = payerFacingMessage(error, MINT_FAILED);\n options.onError(error);\n } finally {\n if (action.isCurrent()) {\n mintingLightning = false;\n options.onChange();\n }\n }\n }\n\n async function startSwap(payInAsset: string): Promise<void> {\n const action = capture();\n // The same double-POST guard as the mint: a poll-driven re-render hands the\n // payer a fresh, enabled button while the first start is still in flight.\n if (startingSwapAsset !== null) return;\n const swap = options.swap;\n if (swap === undefined) {\n options.onError(new Error(MISSING_SWAP_OPTIONS));\n return;\n }\n const selection = swap.selection;\n const prefix = swap.prefix();\n const fetcher = swap.fetch();\n const csrfHeader = swap.csrfHeader?.();\n const reference = options.reference();\n // A start that cannot be made is a WIRING mistake, and silence about it is\n // what this used to be: the payer clicked Continue, nothing was requested,\n // and nothing said why. Report it on the host's own error surface.\n if (prefix === undefined || fetcher === undefined) {\n const missing = [\n ...(prefix === undefined ? [\"swap.prefix()\"] : []),\n ...(fetcher === undefined ? [\"swap.fetch()\"] : []),\n ];\n options.onError(new Error(`${MISSING_SWAP_WIRING} ${missing.join(\" and \")}.`));\n return;\n }\n // Not an error, unlike the two above: no reference yet is a moment in the\n // lifecycle (the checkout has not been prepared), not a host that wired the\n // session wrong. It resolves itself on the next render.\n if (reference === undefined || reference.length === 0) return;\n // Already holding this asset's deposit instructions: show them again rather\n // than mint a colliding second attempt. Pinned on both hosts:\n // \"re-selecting a started swap asset re-opens its panel without a second\n // start\" in tests/element-lifecycle.test.mjs, and \"the session refuses a\n // second start for an asset it already holds instructions for\" in\n // tests/react-checkout-behavior.test.mjs.\n const alreadyStarted = selection.started();\n if (\n alreadyStarted?.swap?.pay_in_asset === payInAsset &&\n alreadyStarted.invoice_id !== selection.dismissedInvoiceId()\n ) {\n selection.setSelectedAsset(payInAsset);\n options.onChange();\n return;\n }\n startingSwapAsset = payInAsset;\n swapStartError = undefined;\n options.onChange();\n\n try {\n // Quote FIRST. An amount outside the provider's range is a normal answer,\n // not a failure: it becomes an unavailable entry in `swapQuotes` and the\n // host shows its accepted range, rather than a generic start error.\n const quote = await quoteSwapAsset(\n payInAsset,\n prefix,\n fetcher,\n reference,\n csrfHeader,\n action,\n );\n if (!action.isCurrent()) return;\n if (quote !== undefined && quote.available === false) return;\n const started = await startSwapRequest({\n signal: action.signal,\n fetch: fetcher,\n prefix,\n ...(csrfHeader === undefined ? {} : { csrfHeader }),\n reference,\n payInAsset,\n ...(options.logger === undefined ? {} : { logger: options.logger }),\n });\n if (!action.isCurrent()) return;\n selection.setStarted(started);\n selection.setDismissedInvoiceId(null);\n // Publish the attempt we just got back, never a read-back of the\n // selection: a React host's setter does not land until its next render,\n // so reading it here would republish the PREVIOUS attempt.\n //\n // Publishing re-keys the status poll onto the swap attempt: without it the\n // poller kept the pre-swap snapshot (create mode never polled at all;\n // snapshot mode polled the old Lightning hash, which the handler 404s) and\n // a paid swap customer was told \"Invoice expired\".\n swap.onStarted?.(started);\n selection.setSelectedAsset(payInAsset);\n options.onChange();\n } catch (error) {\n if (!action.isCurrent()) return;\n // A start that lost a race to instructions which already landed for THIS\n // asset must not replace the deposit panel with the loser's error \u2014 the\n // status poll can fold a server-side idempotent attempt in mid-request.\n // Scoped to the asset, and to an attempt the payer has not dismissed:\n // unscoped, a failed USDT start silently reopened ETH's panel and ate the\n // error.\n const landed = selection.started();\n if (\n landed?.swap?.pay_in_asset === payInAsset &&\n landed.invoice_id !== selection.dismissedInvoiceId()\n ) {\n selection.setSelectedAsset(payInAsset);\n options.onChange();\n return;\n }\n // Inline error with retry \u2014 never an infinite \"Preparing payment\n // address\u2026\" spinner (the retry button re-triggers this swap start).\n selection.setSelectedAsset(payInAsset);\n failSwapStart(error);\n } finally {\n if (action.isCurrent()) {\n startingSwapAsset = null;\n options.onChange();\n }\n }\n }\n\n /**\n * POST the swap quote for one pay-in asset and remember the answer.\n * `undefined` means the server sent a body this reader cannot key by asset,\n * which is treated as \"no opinion\" and lets the start proceed.\n */\n async function quoteSwapAsset(\n payInAsset: string,\n prefix: string,\n fetcher: typeof globalThis.fetch,\n reference: string,\n csrfHeader: string | undefined,\n action: ReturnType<typeof capture>,\n ): Promise<CheckoutPaymentMethod | undefined> {\n const body = await postJson({\n signal: action.signal,\n fetch: fetcher,\n prefix,\n ...(csrfHeader === undefined ? {} : { csrfHeader }),\n ...(options.logger === undefined ? {} : { logger: options.logger }),\n body: { reference, action: \"swap_quote\", pay_in_asset: payInAsset },\n });\n if (!action.isCurrent()) return undefined;\n const quote = normalizeSwapQuote(body);\n if (quote === undefined) return undefined;\n swapQuotes = { ...swapQuotes, [quote.pay_in_asset]: quote };\n return quote;\n }\n\n function failSwapStart(error: unknown): void {\n swapStartError = payerFacingMessage(error, SWAP_START_FAILED);\n options.onError(error);\n options.onChange();\n }\n\n return {\n get wizardError() {\n return wizardError;\n },\n get swapStartError() {\n return swapStartError;\n },\n get lightningRequested() {\n return lightningRequested;\n },\n get mintingLightning() {\n return mintingLightning;\n },\n get startingSwapAsset() {\n return startingSwapAsset;\n },\n get swapQuotes() {\n return swapQuotes;\n },\n syncIdentity,\n reset,\n dispose: reset,\n capture,\n ensureLightning,\n startSwap,\n resetLightningRequest() {\n reset();\n },\n clearSwapStartError() {\n // Leaving a panel also withdraws its pending quote/create/refund action.\n // A delayed success must not reselect the asset the payer just dismissed.\n invalidateActions();\n swapStartError = undefined;\n },\n };\n}\n", "import type { TransactionSettlementStatus } from \"@openreceive/core\";\nimport { resolveNow, type UnixSeconds } from \"./internal/unix-seconds.ts\";\n\n/** The payer-facing status: exactly {@link TransactionSettlementStatus}, derived from the server's verdict and the expiry clock. */\nexport type Status = TransactionSettlementStatus;\n\nexport interface StatusInvoiceLike {\n readonly transaction_state?: string;\n readonly expires_at?: number | string | null;\n}\n\n/**\n * @param options.now Unix timestamp in **seconds** ({@link UnixSeconds}) to\n * compare `expires_at` against; defaults to the current time. Milliseconds\n * (`Date.now()`) throw a RangeError rather than reading every invoice as\n * expired.\n */\nexport function deriveStatus(\n invoice: StatusInvoiceLike,\n options: { readonly now?: UnixSeconds } = {},\n): Status {\n // transaction_state is the server's verdict, computed from the settlement\n // rule in @openreceive/core. The browser never re-derives \"settled\" from\n // settled_at: one rule, one owner.\n if (invoice.transaction_state === \"settled\") return \"settled\";\n if (invoice.transaction_state === \"failed\") return \"failed\";\n if (invoice.transaction_state === \"expired\") return \"expired\";\n\n const expiresAt = readUnixSeconds(invoice.expires_at);\n if (expiresAt !== undefined && expiresAt <= resolveNow(options.now)) {\n return \"expired\";\n }\n\n return \"pending\";\n}\n\nfunction readUnixSeconds(value: number | string | null | undefined): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value !== \"string\" || value.trim().length === 0) return undefined;\n\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n", "import {\n OPENRECEIVE_THEME_STORAGE_KEY,\n type ReadThemePreferenceOptions,\n type ResolvedTheme,\n type StoredThemeModelOptions,\n type ThemeAttributeTarget,\n type ThemeControlTargets,\n type ThemeModel,\n type ThemeModelOptions,\n type ThemePreference,\n type ThemeStorageOptions,\n} from \"./ui.ts\";\n\nexport function readThemePreference(options: ReadThemePreferenceOptions = {}): ThemePreference {\n const value = readStorageValue(\n options.storage ?? getBrowserStorage(),\n options.storageKey ?? OPENRECEIVE_THEME_STORAGE_KEY,\n );\n return value === \"light\" || value === \"dark\" || value === \"system\"\n ? value\n : (options.defaultTheme ?? \"system\");\n}\n\nexport function writeThemePreference(\n theme: ThemePreference,\n options: ThemeStorageOptions = {},\n): void {\n writeStorageValue(\n options.storage ?? getBrowserStorage(),\n options.storageKey ?? OPENRECEIVE_THEME_STORAGE_KEY,\n theme,\n );\n}\n\nexport function resolveTheme(\n theme: ThemePreference,\n options: {\n readonly systemDark?: boolean;\n } = {},\n): ResolvedTheme {\n if (theme === \"light\" || theme === \"dark\") return theme;\n if (options.systemDark !== undefined) return options.systemDark ? \"dark\" : \"light\";\n return globalThis.matchMedia?.(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n\nexport function getNextThemePreference(\n theme: ThemePreference,\n options: ThemeModelOptions = {},\n): ThemePreference {\n return resolveTheme(theme, options) === \"dark\" ? \"light\" : \"dark\";\n}\n\nexport function getThemeToggleLabel(resolvedTheme: ResolvedTheme): string {\n // The label names the ACTION, not the state: a checkout stuck light on a dark\n // page must offer \"switch to dark mode\", not announce \"light mode\" at it.\n return `switch to ${resolvedTheme === \"dark\" ? \"light\" : \"dark\"} mode`;\n}\n\nexport function createThemeModel(\n theme: ThemePreference,\n options: ThemeModelOptions = {},\n): ThemeModel {\n const resolvedTheme = resolveTheme(theme, options);\n return {\n theme,\n resolvedTheme,\n nextTheme: getNextThemePreference(theme, options),\n toggleLabel: getThemeToggleLabel(resolvedTheme),\n attributes: {\n \"data-theme\": resolvedTheme,\n \"data-openreceive-theme\": resolvedTheme,\n },\n checkoutElementAttributes: {\n theme: resolvedTheme,\n },\n };\n}\n\nexport function createStoredThemeModel(options: StoredThemeModelOptions = {}): ThemeModel {\n const theme = readThemePreference(options);\n return createThemeModel(theme, { systemDark: options.systemDark });\n}\n\nexport function toggleStoredThemePreference(options: StoredThemeModelOptions = {}): ThemeModel {\n const currentTheme = createStoredThemeModel(options);\n writeThemePreference(currentTheme.nextTheme, options);\n return createStoredThemeModel(options);\n}\n\nexport function applyThemeAttributes(\n target: ThemeAttributeTarget | null | undefined,\n theme: ThemeModel,\n): void {\n if (target === null || target === undefined) return;\n for (const [name, value] of Object.entries(theme.attributes)) {\n if (target.getAttribute(name) !== value) target.setAttribute(name, value);\n }\n}\n\nexport function applyCheckoutThemeAttributes(\n target: ThemeAttributeTarget | null | undefined,\n theme: ThemeModel,\n): void {\n if (target === null || target === undefined) return;\n for (const [name, value] of Object.entries(theme.checkoutElementAttributes)) {\n if (target.getAttribute(name) !== value) target.setAttribute(name, value);\n }\n}\n\nexport function applyThemeControls(targets: ThemeControlTargets, theme: ThemeModel): void {\n applyThemeAttributes(targets.root, theme);\n applyCheckoutThemeAttributes(targets.checkout, theme);\n if (targets.toggle !== null && targets.toggle !== undefined) {\n targets.toggle.textContent = theme.toggleLabel;\n }\n}\n\nexport function syncStoredThemeControls(\n targets: ThemeControlTargets,\n options: StoredThemeModelOptions = {},\n): ThemeModel {\n const theme = createStoredThemeModel(options);\n applyThemeControls(targets, theme);\n return theme;\n}\n\nexport function toggleStoredThemeControls(\n targets: ThemeControlTargets,\n options: StoredThemeModelOptions = {},\n): ThemeModel {\n const theme = toggleStoredThemePreference(options);\n applyThemeControls(targets, theme);\n return theme;\n}\n\nfunction readStorageValue(storage: Storage | undefined, key: string): string | null {\n try {\n return storage?.getItem(key) ?? null;\n } catch {\n return null;\n }\n}\n\nfunction writeStorageValue(storage: Storage | undefined, key: string, value: string): void {\n try {\n storage?.setItem(key, value);\n } catch {\n // Browser storage is convenience only; checkout must keep working without it.\n }\n}\n\nfunction getBrowserStorage(): Storage | undefined {\n try {\n return globalThis.localStorage;\n } catch {\n return undefined;\n }\n}\n", "import { deriveStatus } from \"../status.ts\";\nimport { assertDisplayInvoice } from \"./checkout-invoice.ts\";\nimport { isPaidCheckoutSnapshot, selectCheckoutDisplayInvoice } from \"./checkout-state.ts\";\nimport { OPENRECEIVE_STYLE_ROOT_ATTRIBUTE } from \"./dom-contract.ts\";\nimport { applyThemeAttributes, createStoredThemeModel } from \"./theme.ts\";\nimport {\n type CheckoutElementAttributeOptions,\n type CheckoutElementAttributes,\n type CheckoutElementEventHandlers,\n type CheckoutElementListeners,\n type CheckoutElementTarget,\n type CheckoutShellElements,\n type CheckoutShellModel,\n type CheckoutShellOptions,\n type CheckoutSnapshot,\n type CreateCheckoutShellOptions,\n type CreateOpenReceiveThemeToggleElementOptions,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES,\n OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS,\n OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME,\n type ThemeAttributeTarget,\n type ThemeToggleElementAttributeOptions,\n type ThemeToggleElementAttributes,\n} from \"./ui.ts\";\n\n/**\n * Attributes every mode carries: routing, theming, and the create-time options the\n * element re-reads later (`metadata` is read when Lightning is finally minted, the\n * resume-path trio when the element syncs the URL). Snapshot mode has already\n * created the attempt, so the create-time options are not emitted there.\n */\nfunction createModeAttributes(options: CheckoutElementAttributeOptions): CheckoutElementAttributes {\n const attributes: CheckoutElementAttributes = {};\n if (options.metadata !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.metadata] = JSON.stringify(options.metadata);\n }\n if (options.syncUrl === true) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.syncUrl] = \"\";\n }\n if (options.resumePathPrefix !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.resumePathPrefix] = options.resumePathPrefix;\n }\n if (options.routeReference !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.routeReference] = options.routeReference;\n }\n if (options.resumePaymentHash !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.resumePaymentHash] =\n options.resumePaymentHash;\n }\n return attributes;\n}\n\nfunction sharedElementAttributes(\n options: CheckoutElementAttributeOptions,\n): CheckoutElementAttributes {\n const attributes: CheckoutElementAttributes = {};\n // An unbound framework prop arrives as `null` from Vue/Svelte/Angular and as\n // `undefined` from React; both mean \"not set\" and must leave the attribute\n // off entirely, so the element falls back to its own default.\n const isSet = <T>(value: T | null | undefined): value is T =>\n value !== undefined && value !== null;\n if (isSet(options.prefix)) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.prefix] = options.prefix;\n }\n // Shared, not create-mode: the status poll and the swap calls carry the\n // token in every mode.\n if (isSet(options.csrfHeader)) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.csrfHeader] = options.csrfHeader;\n }\n if (isSet(options.theme)) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.theme] = options.theme;\n }\n if (options.paymentWizard !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.paymentWizard] = String(\n options.paymentWizard,\n );\n }\n if (options.decodeLinkUrl !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.decodeLinkUrl] = options.decodeLinkUrl;\n }\n // Shared for the same reason: a swap refund screen \u2014 the one thing this\n // governs \u2014 shows in snapshot mode too.\n if (options.resumable !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.resumable] = String(options.resumable);\n }\n if (options.polling !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.polling] = String(options.polling);\n }\n if (options.pollIntervalMs !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.pollIntervalMs] = String(\n options.pollIntervalMs,\n );\n }\n return attributes;\n}\n\n/**\n * Attributes for `<openreceive-checkout>` in each of its three modes:\n *\n * - **create** (`snapshot === null`): routing + theming + the create-time options.\n * The element owns the whole lifecycle from `reference` (+ optional `prefix`).\n * - **deferred** (a snapshot with no payer bolt11 \u2014 amount locked, method grid\n * showing): the same set, because the element still has a Lightning mint ahead of\n * it, plus the locked amount.\n * - **snapshot** (a snapshot carrying a bolt11): the full invoice display set. The\n * attempt already exists, so create-time options no longer apply.\n */\nexport function createCheckoutElementAttributes(\n snapshot: CheckoutSnapshot | null,\n options: CheckoutElementAttributeOptions = {},\n): CheckoutElementAttributes {\n // `reference` is required in create mode because there is no snapshot to read it from.\n if (snapshot === null) {\n if (options.reference === undefined || options.reference.length === 0) {\n throw new TypeError(\n \"OpenReceive checkout element create mode requires a reference when no snapshot is given.\",\n );\n }\n return {\n [OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.reference]: options.reference,\n ...sharedElementAttributes(options),\n ...createModeAttributes(options),\n };\n }\n\n const displayInvoice = selectCheckoutDisplayInvoice(snapshot);\n const bolt11 = displayInvoice?.invoice;\n if (displayInvoice === undefined || typeof bolt11 !== \"string\") {\n const deferred: CheckoutElementAttributes = {\n [OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.reference]: snapshot.reference,\n ...sharedElementAttributes(options),\n ...createModeAttributes(options),\n };\n if (snapshot.amount_msats !== undefined) {\n deferred[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.amountMsats] = String(snapshot.amount_msats);\n }\n return deferred;\n }\n const invoice = displayInvoice;\n assertDisplayInvoice(bolt11);\n const attributes: CheckoutElementAttributes = {\n [OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.reference]: snapshot.reference,\n [OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.invoiceId]: invoice.invoice_id,\n [OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.invoice]: bolt11,\n [OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.rail]: invoice.rail,\n };\n\n if (invoice.payment_hash !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.paymentHash] = invoice.payment_hash;\n }\n const amountMsats = invoice.amount_msats ?? snapshot.amount_msats;\n if (amountMsats !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.amountMsats] = String(amountMsats);\n }\n const fiat = invoice.fiat_quote?.fiat ?? snapshot.fiat;\n if (fiat?.currency !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.fiatCurrency] = fiat.currency;\n }\n if (fiat?.value !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.fiatValue] = fiat.value;\n }\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.status] = isPaidCheckoutSnapshot(snapshot)\n ? \"settled\"\n : snapshot.status === \"expired\"\n ? \"expired\"\n : deriveStatus(invoice);\n if (invoice.expires_at !== undefined) {\n attributes[OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.expiresAt] = String(invoice.expires_at);\n }\n\n return { ...attributes, ...sharedElementAttributes(options) };\n}\n\nexport function createThemeToggleElementAttributes(\n options: ThemeToggleElementAttributeOptions = {},\n): ThemeToggleElementAttributes {\n return {\n ...(options.rootSelector === undefined\n ? {}\n : { [OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.rootSelector]: options.rootSelector }),\n ...(options.checkoutSelector === undefined\n ? {}\n : {\n [OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.checkoutSelector]: options.checkoutSelector,\n }),\n ...(options.defaultTheme === undefined\n ? {}\n : { [OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.defaultTheme]: options.defaultTheme }),\n ...(options.storageKey === undefined\n ? {}\n : { [OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.storageKey]: options.storageKey }),\n };\n}\n\nexport function createCheckoutElementListeners(\n handlers: CheckoutElementEventHandlers = {},\n): CheckoutElementListeners {\n return {\n ...(handlers.onCopy === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.copy]: handlers.onCopy }),\n ...(handlers.onOpenWallet === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.openWallet]: handlers.onOpenWallet }),\n ...(handlers.onState === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.state]: handlers.onState }),\n ...(handlers.onSettled === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.settled]: handlers.onSettled }),\n ...(handlers.onProviderCopy === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.providerCopy]: handlers.onProviderCopy }),\n ...(handlers.onStartOver === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.startOver]: handlers.onStartOver }),\n ...(handlers.onError === undefined\n ? {}\n : { [OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.error]: handlers.onError }),\n };\n}\n\nexport function createCheckoutShellModel(\n snapshot: CheckoutSnapshot | null,\n options: CheckoutShellOptions = {},\n): CheckoutShellModel {\n const theme = createStoredThemeModel(options);\n // themeToggle: false \u2192 host (e.g. ThemeScope) owns theming; don't stamp a conflicting theme.\n const ownTheme = options.themeToggle !== false;\n return {\n theme,\n // The scope marker is unconditional: the shipped stylesheet only reaches\n // elements under it, whoever owns the theme.\n rootAttributes: {\n [OPENRECEIVE_STYLE_ROOT_ATTRIBUTE]: \"\",\n ...(ownTheme ? theme.attributes : {}),\n },\n checkout: {\n tagName: OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME,\n attributes: createCheckoutElementAttributes(snapshot, {\n ...options,\n ...(ownTheme ? { theme: theme.resolvedTheme } : {}),\n }),\n listeners: createCheckoutElementListeners(options),\n },\n themeToggle: ownTheme\n ? {\n tagName: OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME,\n attributes: createThemeToggleElementAttributes({\n rootSelector: options.rootSelector,\n checkoutSelector: options.checkoutSelector ?? OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME,\n defaultTheme: options.defaultTheme,\n storageKey: options.storageKey,\n }),\n }\n : null,\n };\n}\n\nexport function applyCheckoutElementAttributes(\n target: ThemeAttributeTarget,\n attributes: CheckoutElementAttributes,\n): void {\n for (const [name, value] of Object.entries(attributes)) {\n // `null` is skipped as well as `undefined`, and that is not belt-and-braces.\n // Vue, Svelte and Angular all surface an unbound prop as `null`, not\n // `undefined`, so a wrapper passing an unset `prefix` or `theme` straight\n // through would otherwise reach `setAttribute`, which stringifies it \u2014 and\n // the element would derive every route from a mount path of \"null\".\n if (value !== undefined && value !== null) target.setAttribute(name, value);\n }\n}\n\nexport function applyCheckoutElementListeners(\n target: Pick<CheckoutElementTarget, \"addEventListener\">,\n listeners: CheckoutElementListeners,\n): void {\n for (const [name, listener] of Object.entries(listeners)) {\n if (listener !== undefined) target.addEventListener(name, listener);\n }\n}\n\nexport function applyThemeToggleElementAttributes(\n target: ThemeAttributeTarget,\n attributes: ThemeToggleElementAttributes,\n): void {\n for (const [name, value] of Object.entries(attributes)) {\n if (value !== undefined) target.setAttribute(name, value);\n }\n}\n\nexport function createThemeToggleElement(\n options: CreateOpenReceiveThemeToggleElementOptions = {},\n): HTMLElement {\n const ownerDocument = options.document ?? globalThis.document;\n if (ownerDocument === undefined) {\n throw new Error(\"OpenReceive theme toggle element creation requires document.\");\n }\n\n const element = ownerDocument.createElement(OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME);\n applyThemeToggleElementAttributes(element, createThemeToggleElementAttributes(options));\n return element;\n}\n\nexport function createCheckoutShell(\n snapshot: CheckoutSnapshot,\n options: CreateCheckoutShellOptions = {},\n): CheckoutShellElements {\n const ownerDocument = options.document ?? globalThis.document;\n if (ownerDocument === undefined) {\n throw new Error(\"OpenReceive checkout shell creation requires document.\");\n }\n\n const shell = createCheckoutShellModel(snapshot, options);\n if (shell.themeToggle !== null) {\n applyThemeAttributes(options.root, shell.theme);\n }\n\n const checkout = ownerDocument.createElement(shell.checkout.tagName);\n applyCheckoutElementAttributes(checkout, shell.checkout.attributes);\n applyCheckoutElementListeners(checkout, shell.checkout.listeners);\n\n let themeToggle: HTMLElement | null = null;\n if (shell.themeToggle !== null) {\n themeToggle = ownerDocument.createElement(shell.themeToggle.tagName);\n applyThemeToggleElementAttributes(themeToggle, shell.themeToggle.attributes);\n }\n\n return {\n theme: shell.theme,\n rootAttributes: shell.rootAttributes,\n checkout,\n themeToggle,\n };\n}\n", "/**\n * Guest checkout resume helpers for no-account content sites.\n *\n * Pattern:\n * - Put the public `reference` in the URL (`/checkout/:reference`) so refresh/share works.\n * - Let the host authorize access to the order using its normal session or guest-order policy.\n * - Mirror an optional host order summary in sessionStorage for instant same-tab restore;\n * use the host-supplied `fetchOrder` when storage is empty.\n *\n */\n\nexport interface GuestCheckoutResumeOptions<TOrder> {\n /**\n * URL path prefix before the order id. Default `\"/checkout\"` \u2192 `/checkout/:reference`.\n * Leading/trailing slashes are normalized.\n */\n readonly pathPrefix?: string;\n /** sessionStorage key prefix for host order summaries (required so hosts do not collide). */\n readonly storageKeyPrefix: string;\n /** Extract the public order id used as the storage/URL key. */\n readonly referenceOf: (order: TOrder) => string;\n /** Validate a value from storage or a fetch body as a host order. */\n readonly parseOrder: (value: unknown) => TOrder | undefined;\n /**\n * Load an order when sessionStorage misses (new tab / shared link).\n * Return `undefined` for missing or unauthorized orders.\n */\n readonly fetchOrder?: (reference: string) => Promise<TOrder | undefined>;\n /** Path to push when leaving a checkout URL. Default `\"/\"`. */\n readonly homePath?: string;\n}\n\nexport interface GuestCheckoutResumeController<TOrder> {\n /** Normalized path prefix including a leading slash, e.g. `\"/checkout\"`. */\n readonly pathPrefix: string;\n checkoutPath(reference: string): string;\n /** Parse `/checkout/:reference` from a pathname. Returns undefined when not a resume URL. */\n parseReference(pathname: string): string | undefined;\n rememberOrder(order: TOrder): void;\n readRememberedOrder(reference: string): TOrder | undefined;\n /** Forget one order, or every order under this storage prefix when `reference` is omitted. */\n forgetOrder(reference?: string): void;\n /** Push the checkout path when not already there (History API / SPAs). */\n enterCheckout(reference: string): void;\n /** Return to `homePath` when the current location is a checkout resume URL. */\n leaveCheckout(): void;\n /** sessionStorage first, then optional `fetchOrder`. */\n loadOrderForResume(reference: string): Promise<TOrder | undefined>;\n}\n\n/**\n * Create a host-owned guest resume controller. OpenReceive does not invent a host session \u2014\n * this is the reusable URL + sessionStorage glue so demos (and apps) do not copy-paste it.\n */\nexport function createGuestCheckoutResume<TOrder>(\n options: GuestCheckoutResumeOptions<TOrder>,\n): GuestCheckoutResumeController<TOrder> {\n const pathPrefix = normalizePathPrefix(options.pathPrefix ?? \"/checkout\");\n const pathSegment = pathPrefix.slice(1);\n const storageKeyPrefix = options.storageKeyPrefix;\n if (storageKeyPrefix.length === 0) {\n throw new Error(\"createGuestCheckoutResume: storageKeyPrefix must be non-empty\");\n }\n const homePath = options.homePath ?? \"/\";\n\n function checkoutPath(reference: string): string {\n return `${pathPrefix}/${encodeURIComponent(reference)}`;\n }\n\n function parseReference(pathname: string): string | undefined {\n const segments = pathname.split(\"/\").filter((segment) => segment.length > 0);\n if (segments.length !== 2 || segments[0] !== pathSegment) return undefined;\n const raw = segments[1];\n if (raw === undefined || raw.length === 0) return undefined;\n let reference: string;\n try {\n reference = decodeURIComponent(raw);\n } catch {\n return undefined;\n }\n if (reference.length === 0 || reference.includes(\"/\") || reference.includes(\"..\"))\n return undefined;\n return reference;\n }\n\n function orderStorageKey(reference: string): string {\n return `${storageKeyPrefix}${reference}`;\n }\n\n function rememberOrder(order: TOrder): void {\n const reference = options.referenceOf(order);\n if (reference.length === 0) return;\n const store = sessionStore();\n if (store === undefined) return;\n try {\n store.setItem(orderStorageKey(reference), JSON.stringify(order));\n } catch {\n // Best-effort; fetchOrder can still restore display.\n }\n }\n\n function readRememberedOrder(reference: string): TOrder | undefined {\n const store = sessionStore();\n if (store === undefined) return undefined;\n try {\n const raw = store.getItem(orderStorageKey(reference));\n if (raw === null || raw.length === 0) return undefined;\n return options.parseOrder(JSON.parse(raw) as unknown);\n } catch {\n return undefined;\n }\n }\n\n function forgetOrder(reference?: string): void {\n const store = sessionStore();\n if (store === undefined) return;\n try {\n if (reference !== undefined) {\n store.removeItem(orderStorageKey(reference));\n return;\n }\n const keys: string[] = [];\n for (let index = 0; index < store.length; index += 1) {\n const key = store.key(index);\n if (key?.startsWith(storageKeyPrefix)) keys.push(key);\n }\n for (const key of keys) store.removeItem(key);\n } catch {\n // Ignore storage failures on reset.\n }\n }\n\n function enterCheckout(reference: string): void {\n enterCheckoutResumePath(reference, { pathPrefix });\n }\n\n function leaveCheckout(): void {\n if (typeof globalThis.location === \"undefined\") return;\n if (parseReference(globalThis.location.pathname) === undefined) return;\n globalThis.history.pushState({}, \"\", homePath);\n }\n\n async function loadOrderForResume(reference: string): Promise<TOrder | undefined> {\n const remembered = readRememberedOrder(reference);\n if (remembered !== undefined) return remembered;\n if (options.fetchOrder === undefined) return undefined;\n try {\n const fetched = await options.fetchOrder(reference);\n if (fetched === undefined) return undefined;\n rememberOrder(fetched);\n return fetched;\n } catch {\n return undefined;\n }\n }\n\n return {\n pathPrefix,\n checkoutPath,\n parseReference,\n rememberOrder,\n readRememberedOrder,\n forgetOrder,\n enterCheckout,\n leaveCheckout,\n loadOrderForResume,\n };\n}\n\n/**\n * Push `/checkout/:reference` (or a custom path prefix) via the History API when not already\n * there. Used by `<Checkout syncUrl>` and hosts that sync the URL after creating an order.\n * No-ops when `routeReference` is provided (app router already owns the URL).\n */\nexport function enterCheckoutResumePath(\n reference: string,\n options: {\n readonly pathPrefix?: string;\n /** When set, skip History API sync (Next.js / file-based routes own the URL). */\n readonly routeReference?: string;\n } = {},\n): void {\n if (options.routeReference !== undefined) return;\n if (reference.length === 0) return;\n const pathPrefix = normalizePathPrefix(options.pathPrefix ?? \"/checkout\");\n const path = `${pathPrefix}/${encodeURIComponent(reference)}`;\n if (typeof globalThis.location === \"undefined\") return;\n if (globalThis.location.pathname === path) return;\n globalThis.history.pushState({ openreceiveCheckout: reference }, \"\", path);\n}\n\n/**\n * The URL a resumable checkout tells the payer to copy, or `undefined` off a\n * browser.\n *\n * `checkoutLabels.refundReturnWarning` says \"Bookmark this page, or copy its\n * URL\", and a sentence that names an affordance should be next to one. Both\n * renderers read it through this function so the refund screens cannot disagree\n * about what \"its URL\" means.\n */\nexport function currentCheckoutUrl(): string | undefined {\n if (typeof globalThis.location === \"undefined\") return undefined;\n const href = globalThis.location.href;\n return href.length > 0 ? href : undefined;\n}\n\n/**\n * Guest resume fetch for a host-owned order endpoint. OpenReceive ships no order-read route.\n * Pass the result as `fetchOrder` to {@link createGuestCheckoutResume}.\n */\nexport function createGuestOrderFetcher<TOrder>(options: {\n readonly parseOrder: (value: unknown) => TOrder | undefined;\n /**\n * Build the URL of the HOST APPLICATION's own order endpoint (e.g. `/orders/:id`).\n * Nothing here is an OpenReceive route: the mounted router's routes all come from\n * `prefix` (see ./routes.ts), and it serves no order-read endpoint at all.\n */\n readonly hostOrderUrl: (reference: string) => string;\n readonly fetch?: typeof globalThis.fetch;\n}): (reference: string) => Promise<TOrder | undefined> {\n const fetchFn = options.fetch ?? globalThis.fetch;\n const hostOrderUrl = options.hostOrderUrl;\n return async (reference: string): Promise<TOrder | undefined> => {\n const response = await fetchFn(hostOrderUrl(reference));\n if (response.status === 404 || !response.ok) return undefined;\n const body = (await response.json()) as unknown;\n if (typeof body !== \"object\" || body === null) return undefined;\n const record = body as Record<string, unknown>;\n if (\"summary\" in record) return options.parseOrder(record.summary);\n if (\"order\" in record) return options.parseOrder(record.order);\n return undefined;\n };\n}\n\nfunction normalizePathPrefix(prefix: string): string {\n const trimmed = prefix.trim().replace(/^\\/+|\\/+$/g, \"\");\n if (trimmed.length === 0) {\n throw new Error(\"createGuestCheckoutResume: pathPrefix must be non-empty\");\n }\n if (trimmed.includes(\"/\") || trimmed.includes(\"..\")) {\n throw new Error(\"createGuestCheckoutResume: pathPrefix must be a single path segment\");\n }\n return `/${trimmed}`;\n}\n\nfunction sessionStore(): Storage | undefined {\n try {\n if (typeof sessionStorage === \"undefined\") return undefined;\n return sessionStorage;\n } catch {\n return undefined;\n }\n}\n", "// src/index.ts\nimport {\n createThemeToggleElement,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES as OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES4,\n OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS as OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS2,\n OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME as OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME2,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES as OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES2,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME as OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME2\n} from \"@openreceive/browser/headless\";\n\n// src/define-elements.ts\nimport {\n buildMethodGridEntries as buildMethodGridEntries2,\n copyInvoice,\n createCheckoutActionEvent,\n createCheckoutController,\n createCheckoutErrorEvent,\n createCheckoutProviderCopyEvent,\n createCheckoutSnapshotFromInvoice as createCheckoutSnapshotFromInvoice2,\n createCheckoutStateEvent,\n createCheckoutStatusModel as createCheckoutStatusModel2,\n createPaymentWizardSelection,\n createQrPayloadSvg,\n createQrSvg,\n createSwapDisplayModel as createSwapDisplayModel3,\n createThemeChangeEvent,\n deriveStatus as deriveStatus2,\n enterCheckoutResumePath,\n getSwapRefundFormError,\n loadPayTutorialImages,\n OPENRECEIVE_CHECKOUT_DATA_SELECTORS,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES as OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3,\n OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS,\n OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS,\n OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME,\n OPENRECEIVE_DEFAULT_PREFIX as OPENRECEIVE_DEFAULT_PREFIX2,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7,\n OPENRECEIVE_PAYMENT_WIZARD_SELECTORS as OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_PART_SELECTORS,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME,\n orClasses as orClasses7,\n parseBooleanAttribute,\n parseOptionalInteger,\n parsePaymentMethod,\n parseResolvedTheme,\n parseThemePreference,\n paymentMethods as paymentMethods2,\n resolveWizardSelection,\n selectCurrentSwapInvoice,\n syncStoredThemeControls,\n toggleStoredThemeControls,\n updatePaymentWizardSelection\n} from \"@openreceive/browser/headless\";\n\n// src/dom-helpers.ts\nimport {\n createDetailExternalLink,\n createTransientFeedbackController,\n escapeHtml,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES,\n OPENRECEIVE_PAYMENT_WIZARD_SELECTORS,\n checkoutLabels,\n orClasses\n} from \"@openreceive/browser/headless\";\nvar COPY_INVOICE_ICON = `<svg class=\"${orClasses.copyIcon}\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\" focusable=\"false\"><rect x=\"5\" y=\"5\" width=\"8\" height=\"9\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/><path d=\"M3.5 11V3.5A1.5 1.5 0 0 1 5 2h5.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/></svg>`;\nvar elementCopyFeedbackControllers = /* @__PURE__ */ new WeakMap();\nfunction readElementFiatQuote(element) {\n const currency = element.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.fiatCurrency);\n const value = element.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.fiatValue);\n if (currency === null || value === null) return void 0;\n return {\n fiat: {\n currency,\n value\n }\n };\n}\nfunction readElementNumberAttribute(element, attribute) {\n const raw = element.getAttribute(attribute);\n if (raw === null || raw.trim() === \"\") return void 0;\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : void 0;\n}\nfunction readElementAmountMsats(element) {\n return readElementNumberAttribute(element, OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.amountMsats);\n}\nfunction readElementExpiresAt(element) {\n return readElementNumberAttribute(element, OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES.expiresAt);\n}\nfunction parseElementRail(value) {\n if (value === \"swap\") return \"swap\";\n if (value === \"checkout_lock\") return \"checkout_lock\";\n return \"lightning\";\n}\nfunction showElementCopyFeedback(button) {\n if (button === null) return;\n let controller = elementCopyFeedbackControllers.get(button);\n if (controller === void 0) {\n const labelEl = button.querySelector(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS.swapCopyLabel);\n const resetValue = button.getAttribute(\"aria-label\")?.trim() || labelEl?.textContent?.trim() || button.textContent?.trim() || checkoutLabels.copyInvoice;\n controller = createTransientFeedbackController({\n resetValue,\n onValue: (label) => {\n if (!button.isConnected) return;\n if (button instanceof HTMLElement && button.hasAttribute(\"aria-label\")) {\n button.setAttribute(\"aria-label\", label);\n button.setAttribute(\"title\", label);\n }\n if (labelEl instanceof HTMLElement) {\n labelEl.textContent = label;\n return;\n }\n if (!(button instanceof HTMLElement && button.querySelector(\"svg\"))) {\n button.textContent = label;\n }\n }\n });\n elementCopyFeedbackControllers.set(button, controller);\n }\n controller.show(checkoutLabels.copied);\n}\nfunction wireSwapSelectAllInputs(root) {\n for (const input of root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS.swapSelectAll)) {\n if (!(input instanceof HTMLInputElement)) continue;\n const selectAll = () => {\n input.select();\n };\n input.addEventListener(\"focus\", selectAll);\n input.addEventListener(\"click\", selectAll);\n input.addEventListener(\"mouseup\", (event) => {\n event.preventDefault();\n });\n input.addEventListener(\"select\", () => {\n if (input.selectionStart !== 0 || input.selectionEnd !== input.value.length) {\n input.setSelectionRange(0, input.value.length);\n }\n });\n }\n}\nfunction renderElementSwapCopyDetailHtml(label, value, options = {}) {\n const displayValue = options.displayValue ?? value;\n const link = options.href === void 0 ? options.kind === void 0 ? void 0 : createDetailExternalLink({\n kind: options.kind,\n value,\n ...options.payInAsset === void 0 ? {} : { payInAsset: options.payInAsset }\n }) : {\n href: options.href,\n hrefLabel: options.hrefLabel ?? checkoutLabels.viewOnExplorer\n };\n const external = link === void 0 ? \"\" : `<a\n part=\"swap-external\"\n class=\"${orClasses.swapDetailsLink}\"\n href=\"${escapeHtml(link.href)}\"\n rel=\"noreferrer\"\n target=\"_blank\"\n >${escapeHtml(link.hrefLabel)}</a>`;\n const valueField = options.selectable === true ? `<input\n class=\"${orClasses.swapDetailsInput}\"\n type=\"text\"\n readonly\n value=\"${escapeHtml(displayValue)}\"\n aria-label=\"${escapeHtml(label)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES.swapSelectAll}\n />` : `<code class=\"${orClasses.swapDetailsCode}\">${escapeHtml(displayValue)}</code>`;\n return `\n <dt class=\"${orClasses.swapDetailsDt}\">${escapeHtml(label)}</dt>\n <dd class=\"${orClasses.swapDetailsDd}\">\n ${valueField}\n <div class=\"${orClasses.swapDetailsActions}\">\n <button\n part=\"swap-copy\"\n class=\"${orClasses.detailCopy}\"\n aria-label=\"Copy\"\n title=\"Copy\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES.swapCopy}=\"${escapeHtml(value)}\"\n type=\"button\"\n >${COPY_INVOICE_ICON}</button>\n ${external}\n </div>\n </dd>\n `;\n}\n\n// src/element-checkout-session.ts\nimport {\n applyCheckoutElementAttributes,\n createCheckoutElementAttributes,\n createCheckoutSession,\n mergeAttemptIntoCheckout,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES as OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES2,\n OPENRECEIVE_DEFAULT_PREFIX,\n prepareCheckout,\n requestCheckout,\n resumeSwapAttempt\n} from \"@openreceive/browser/headless\";\nfunction createElementCheckoutSession(host) {\n let creating = false;\n let createdKey;\n let createError;\n let applyingOwnAttributes = 0;\n function currentPrefix() {\n return host.element.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES2.prefix) ?? OPENRECEIVE_DEFAULT_PREFIX;\n }\n function currentCsrfHeader() {\n const name = host.element.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES2.csrfHeader);\n return name === null || name.length === 0 ? void 0 : name;\n }\n function currentReference() {\n const reference = host.element.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES2.reference);\n return reference === null || reference.length === 0 ? void 0 : reference;\n }\n function currentCreateKey() {\n const reference = currentReference();\n return reference === void 0 ? void 0 : `${currentPrefix()}::${reference}`;\n }\n function writeOwnAttributes(write) {\n applyingOwnAttributes += 1;\n try {\n write();\n } finally {\n applyingOwnAttributes -= 1;\n }\n }\n function applyOwnAttributes(attributes) {\n writeOwnAttributes(() => {\n applyCheckoutElementAttributes(host.element, attributes);\n });\n }\n function publishSnapshot(snapshot) {\n host.handleControllerSnapshot(snapshot);\n const prefix = currentPrefix();\n applyOwnAttributes(\n createCheckoutElementAttributes(snapshot, {\n prefix,\n ...host.currentThemeOption()\n })\n );\n host.render();\n host.startCheckoutController();\n }\n const session = createCheckoutSession({\n snapshot: () => host.latestCheckoutSnapshot(),\n reference: currentReference,\n prefix: currentPrefix,\n requestCheckout: (reference, signal) => {\n const metadata = host.createMetadata();\n const csrfHeader = currentCsrfHeader();\n return requestCheckout({\n prefix: currentPrefix(),\n signal,\n reference,\n ...metadata === void 0 ? {} : { metadata },\n ...csrfHeader === void 0 ? {} : { csrfHeader },\n fetch: globalThis.fetch\n });\n },\n onSnapshot: publishSnapshot,\n swap: {\n selection: host.swapSelection,\n prefix: () => host.resolvePollPrefix(currentReference()),\n fetch: () => globalThis.fetch,\n csrfHeader: currentCsrfHeader,\n // A swap attempt is NOT written back as attributes: a bolt11 attribute\n // would take the element out of create mode. It re-keys the poll\n // controller onto the merged snapshot and nothing else.\n onStarted: (invoice) => {\n const reference = currentReference();\n if (reference === void 0) return;\n const previous = host.latestCheckoutSnapshot() ?? host.currentCheckoutSnapshot();\n host.handleControllerSnapshot(mergeAttemptIntoCheckout(invoice, previous, reference));\n host.startCheckoutController();\n }\n },\n logger: host.logger,\n onError: (error) => host.dispatchError(error),\n onChange: () => host.render()\n });\n async function createCheckout() {\n const reference = currentReference();\n if (reference === void 0) return;\n const prefix = currentPrefix();\n const csrfHeader = currentCsrfHeader();\n const key = `${prefix}::${reference}`;\n if (creating) return;\n if (createdKey === key) {\n host.startCheckoutController();\n return;\n }\n creating = true;\n createdKey = key;\n session.resetLightningRequest();\n const action = session.capture();\n try {\n createError = void 0;\n host.syncResumePath(reference);\n const prepared = await prepareCheckout({\n signal: action.signal,\n prefix,\n reference,\n ...csrfHeader === void 0 ? {} : { csrfHeader },\n fetch: globalThis.fetch\n });\n if (!action.isCurrent()) return;\n const resumeHash = host.resumePaymentHash();\n const checkout = resumeHash === void 0 ? prepared : await resumeSwapAttempt({\n signal: action.signal,\n fetch: globalThis.fetch,\n prefix,\n ...csrfHeader === void 0 ? {} : { csrfHeader },\n reference,\n paymentHash: resumeHash,\n snapshot: prepared\n });\n if (!action.isCurrent()) return;\n if (checkout.active?.swap !== void 0) {\n host.swapSelection.setSelectedAsset(checkout.active.swap.pay_in_asset);\n host.swapSelection.setDismissedInvoiceId(null);\n }\n host.handleControllerSnapshot(checkout);\n applyOwnAttributes(\n createCheckoutElementAttributes(checkout, {\n prefix,\n ...host.currentThemeOption()\n })\n );\n host.render();\n host.startCheckoutController();\n } catch (error) {\n if (!action.isCurrent()) return;\n createError = error instanceof Error && error.message.length > 0 ? error.message : \"Could not start checkout.\";\n host.dispatchError(error);\n host.render();\n } finally {\n if (action.isCurrent()) {\n creating = false;\n const current = currentCreateKey();\n if (host.element.isConnected && current !== void 0 && current !== key && host.isCreateMode()) {\n void createCheckout();\n }\n }\n }\n }\n function retryCreateCheckout() {\n createdKey = void 0;\n createError = void 0;\n host.render();\n void createCheckout();\n }\n return {\n get createError() {\n return createError;\n },\n get wizardError() {\n return session.wizardError;\n },\n get swapStartError() {\n return session.swapStartError;\n },\n get lightningRequested() {\n return session.lightningRequested;\n },\n get mintingLightning() {\n return session.mintingLightning;\n },\n get startingSwapAsset() {\n return session.startingSwapAsset;\n },\n get swapQuotes() {\n return session.swapQuotes;\n },\n get applyingOwnAttributes() {\n return applyingOwnAttributes > 0;\n },\n createCheckout,\n retryCreateCheckout,\n ensureLightning: () => session.ensureLightning(),\n startSwap: (payInAsset) => session.startSwap(payInAsset),\n clearSwapStartError: () => session.clearSwapStartError(),\n applyOwnAttributes,\n writeOwnAttributes,\n capture: () => session.capture(),\n dispose() {\n session.dispose();\n if (creating) createdKey = void 0;\n creating = false;\n },\n forgetCreateKey() {\n session.reset();\n creating = false;\n createError = void 0;\n createdKey = void 0;\n }\n };\n}\n\n// src/element-styles.ts\nimport { checkoutElementStyles } from \"@openreceive/browser/headless\";\nvar checkoutStyleTag = `<style>${checkoutElementStyles}</style>`;\nvar sheetsByDocument = /* @__PURE__ */ new WeakMap();\nfunction adoptCheckoutStyles(root) {\n const ownerDocument = root.ownerDocument;\n if (ownerDocument === null) return false;\n const view = ownerDocument.defaultView;\n const SheetConstructor = view?.CSSStyleSheet ?? globalThis.CSSStyleSheet;\n if (SheetConstructor === void 0 || !Array.isArray(root.adoptedStyleSheets)) return false;\n let sheet = sheetsByDocument.get(ownerDocument);\n if (sheet === void 0) {\n try {\n const created = new SheetConstructor();\n if (typeof created.replaceSync !== \"function\") return false;\n created.replaceSync(checkoutElementStyles);\n sheet = created;\n } catch {\n return false;\n }\n sheetsByDocument.set(ownerDocument, sheet);\n }\n if (!root.adoptedStyleSheets.includes(sheet)) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n }\n return true;\n}\n\n// src/render-checkout.ts\nimport {\n assertDisplayInvoice,\n createCheckoutStatusModel,\n createLightningInvoiceDecodeUrl as createLightningInvoiceDecodeUrl2,\n deriveCheckoutStateLabels,\n deriveStatus,\n escapeHtml as escapeHtml7,\n formatAmountCaption,\n OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES,\n OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS,\n OPENRECEIVE_CHECKOUT_ELEMENT_PARTS,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES6,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_PARTS,\n checkoutLabels as checkoutLabels6,\n orClasses as orClasses6\n} from \"@openreceive/browser/headless\";\n\n// src/render-wizard.ts\nimport {\n assetButtonClasses,\n buildMethodGridEntries,\n checkoutLabels as checkoutLabels5,\n createMethodGridDisplay,\n createPaymentWizardModel,\n createSwapDisplayModel as createSwapDisplayModel2,\n createSwapUnavailableModel,\n createWizardRouteAssetDisplays,\n createWizardRouteDisplays,\n currentCheckoutUrl as currentCheckoutUrl2,\n escapeHtml as escapeHtml6,\n formatMethodNetworkDetail,\n formatNetworkSummary,\n getNetworkIconId,\n getPaymentMethodIconId,\n getSwapOptionIconId,\n getWizardEmptyMessage,\n networkButtonClasses,\n networkCheckClasses,\n networkMobileRevealClasses,\n networkSummaryIconClasses,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5,\n orClasses as orClasses5,\n paymentMethods,\n swapAssetMatchesRoute as swapAssetMatchesRoute2\n} from \"@openreceive/browser/headless\";\n\n// src/payment-icon.ts\nimport { escapeHtml as escapeHtml2, paymentIconSvgs } from \"@openreceive/browser/headless\";\nfunction renderPaymentIconHtml(id, options) {\n return paymentIconSvgs[id].replace(\n /^<svg\\b([^>]*)>/,\n (_match, attributes) => `<svg${attributes.replace(/\\s(?:class|role|aria-label)=\"[^\"]*\"/g, \"\")} class=\"${options.className}\" role=\"img\" aria-label=\"${escapeHtml2(options.label)}\">`\n );\n}\n\n// src/render-provider-tutorial.ts\nimport {\n createLightningInvoiceDecodeUrl,\n escapeHtml as escapeHtml3,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2,\n checkoutLabels as checkoutLabels2,\n orClasses as orClasses2\n} from \"@openreceive/browser/headless\";\nfunction renderProviderOpenActionHtml(provider) {\n if (provider.tutorials.length === 0) {\n return `<a class=\"${orClasses2.providerOpen}\" href=\"${escapeHtml3(provider.url)}\" rel=\"noreferrer\" target=\"_blank\">${escapeHtml3(provider.openLabel)}</a>`;\n }\n return `\n <button\n part=\"provider-open\"\n class=\"${orClasses2.providerOpen}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorial}=\"${escapeHtml3(provider.id)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorialIndex}=\"0\"\n type=\"button\"\n >${escapeHtml3(provider.openLabel)}</button>\n `;\n}\nfunction renderTutorialModalHtml(routes, activeProviderId, activeTutorialIndex, copied, lightningInvoice, decodeLinkUrl) {\n if (activeProviderId === null) return \"\";\n const provider = routes.flatMap((route) => route.providers).find((candidate) => candidate.id === activeProviderId);\n if (provider === void 0 || provider.tutorials.length === 0) return \"\";\n const totalSteps = provider.tutorials.length + 1;\n const stepIndex = Math.max(0, Math.min(provider.tutorials.length, activeTutorialIndex));\n const tutorial = stepIndex === 0 ? void 0 : provider.tutorials[stepIndex - 1];\n const previousIndex = Math.max(0, stepIndex - 1);\n const nextIndex = Math.min(provider.tutorials.length, stepIndex + 1);\n const isFinalStep = stepIndex === provider.tutorials.length;\n const decodeHref = lightningInvoice === void 0 || lightningInvoice.trim() === \"\" ? void 0 : createLightningInvoiceDecodeUrl(lightningInvoice, decodeLinkUrl);\n const decodeButton = decodeHref === void 0 ? \"\" : `<a part=\"tutorial-decode\" class=\"${orClasses2.tutorialCopy}\" href=\"${escapeHtml3(decodeHref)}\" rel=\"noreferrer\" target=\"_blank\">${escapeHtml3(checkoutLabels2.decodeInvoice)}</a>`;\n const body = stepIndex === 0 ? `\n <div part=\"tutorial-intro\" class=\"${orClasses2.tutorialIntro}\">\n <img part=\"tutorial-provider-logo\" alt=\"\" src=\"${escapeHtml3(provider.icon)}\" class=\"${orClasses2.tutorialProviderLogo}\">\n <p>${escapeHtml3(checkoutLabels2.tutorialIntroPrefix)} ${escapeHtml3(provider.name)}.</p>\n <p>${escapeHtml3(checkoutLabels2.tutorialIntroCopy)}</p>\n <button part=\"tutorial-copy\" class=\"${orClasses2.tutorialCopy}\" type=\"button\">${escapeHtml3(checkoutLabels2.copyInvoice)}</button>\n ${decodeButton}\n ${copied ? `<p part=\"tutorial-copy-message\" class=\"${orClasses2.tutorialCopyMessage}\">${escapeHtml3(checkoutLabels2.tutorialCopiedContinue)}</p>` : \"\"}\n </div>\n ` : `\n <div part=\"tutorial-frame\" class=\"${orClasses2.tutorialFrame}\">\n ${// No `<img>` until the lazily loaded screenshot is in hand: an\n // empty src is a request for the page itself.\n tutorial?.image === void 0 ? \"\" : `<img part=\"tutorial-image\" class=\"${orClasses2.tutorialImage}\" alt=\"${escapeHtml3(tutorial.caption)}\" src=\"${escapeHtml3(tutorial.image)}\">`}\n </div>\n <p part=\"tutorial-caption\" class=\"${orClasses2.tutorialCaption}\">${escapeHtml3(tutorial?.caption ?? \"\")}</p>\n `;\n return `\n <div part=\"tutorial\" class=\"${orClasses2.tutorialModal}\" role=\"dialog\" aria-modal=\"true\" aria-label=\"${escapeHtml3(checkoutLabels2.tutorialTitlePrefix)} ${escapeHtml3(provider.name)}\" tabindex=\"-1\">\n <div part=\"tutorial-dialog\" class=\"${orClasses2.tutorialBox}\">\n <div part=\"tutorial-header\" class=\"${orClasses2.tutorialHeader}\">\n <div part=\"tutorial-title\" class=\"${orClasses2.tutorialTitle}\">\n <img part=\"tutorial-header-logo\" alt=\"\" src=\"${escapeHtml3(provider.icon)}\" class=\"${orClasses2.tutorialHeaderLogo}\">\n <h3>${escapeHtml3(checkoutLabels2.tutorialTitlePrefix)} ${escapeHtml3(provider.name)}</h3>\n </div>\n <button\n part=\"tutorial-close\"\n class=\"${orClasses2.tutorialClose}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorial}=\"\"\n type=\"button\"\n aria-label=\"${escapeHtml3(checkoutLabels2.tutorialClose)}\"\n >X</button>\n </div>\n ${body}\n <div part=\"tutorial-steps\" class=\"${orClasses2.tutorialSteps}\" aria-hidden=\"true\">\n ${Array.from(\n { length: totalSteps },\n (_, index) => `\n <span part=\"${index === stepIndex ? \"tutorial-step-active\" : \"tutorial-step\"}\" class=\"${index === stepIndex ? orClasses2.tutorialStepActive : orClasses2.tutorialStep}\"></span>\n `\n ).join(\"\")}\n </div>\n <p part=\"tutorial-progress\" class=\"${orClasses2.tutorialProgress}\">Step ${stepIndex + 1} of ${totalSteps}</p>\n <div part=\"tutorial-controls\" class=\"${orClasses2.tutorialControls}\">\n <button\n part=\"tutorial-nav\"\n class=\"${orClasses2.btn}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorial}=\"${escapeHtml3(provider.id)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorialIndex}=\"${previousIndex}\"\n type=\"button\"\n ${stepIndex === 0 ? \"disabled\" : \"\"}\n >${escapeHtml3(checkoutLabels2.tutorialBack)}</button>\n <button\n part=\"tutorial-nav\"\n class=\"${orClasses2.btn}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorial}=\"${isFinalStep ? \"\" : escapeHtml3(provider.id)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES2.providerTutorialIndex}=\"${nextIndex}\"\n type=\"button\"\n >${escapeHtml3(isFinalStep ? checkoutLabels2.tutorialExit : checkoutLabels2.tutorialNext)}</button>\n </div>\n </div>\n </div>\n `;\n}\n\n// src/render-swap-panel.ts\nimport {\n checkoutLabels as checkoutLabels4,\n createSwapDisplayModel,\n currentCheckoutUrl,\n escapeHtml as escapeHtml5,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4,\n orClasses as orClasses4,\n swapAssetMatchesRoute,\n swapOptionLimitMessage\n} from \"@openreceive/browser/headless\";\n\n// src/transaction-details.ts\nimport {\n escapeHtml as escapeHtml4,\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES as OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES3,\n OPENRECEIVE_PAYMENT_WIZARD_SELECTORS as OPENRECEIVE_PAYMENT_WIZARD_SELECTORS2,\n checkoutLabels as checkoutLabels3,\n orClasses as orClasses3,\n resolveTransactionDetailRows\n} from \"@openreceive/browser/headless\";\nfunction renderTransactionDetailsHtml(source, options = {}) {\n const rows = resolveTransactionDetailRows(source);\n if (rows.length === 0) return \"\";\n const openAttr = options.open === true ? \" open\" : \"\";\n const className = options.className ?? orClasses3.transactionDetails;\n return `\n <details part=\"transaction-details\" class=\"${escapeHtml4(className)}\"${openAttr}>\n <summary class=\"${orClasses3.transactionDetailsTitle}\">${escapeHtml4(checkoutLabels3.transactionDetails)}</summary>\n <div class=\"${orClasses3.transactionDetailsContent}\">\n <dl part=\"swap-details\" class=\"${orClasses3.swapDetails}\">\n ${rows.map(\n (row) => renderElementSwapCopyDetailHtml(row.label, row.copyValue ?? row.value, {\n displayValue: row.value,\n ...row.href === void 0 ? {} : { href: row.href },\n ...row.hrefLabel === void 0 ? {} : { hrefLabel: row.hrefLabel }\n })\n ).join(\"\")}\n </dl>\n </div>\n </details>\n `;\n}\nfunction createTransactionDetailsElement(source, options = {}) {\n const html = renderTransactionDetailsHtml(source, options);\n if (html === \"\") return null;\n const doc = options.document ?? globalThis.document;\n const host = doc.createElement(\"div\");\n host.innerHTML = html.trim();\n const details = host.firstElementChild;\n if (!(details instanceof HTMLElement)) return null;\n wireTransactionDetailsCopy(details, options.onCopyError);\n return details;\n}\nfunction wireTransactionDetailsCopy(root, onCopyError) {\n wireSwapSelectAllInputs(root);\n for (const button of root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS2.swapCopy)) {\n if (!(button instanceof HTMLButtonElement)) continue;\n button.addEventListener(\"click\", () => {\n const value = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES3.swapCopy);\n if (value === null || value === \"\") return;\n void globalThis.navigator?.clipboard?.writeText(value).then(() => showElementCopyFeedback(button)).catch((error) => onCopyError?.(error));\n });\n }\n}\n\n// src/render-swap-panel.ts\nfunction renderElementSwapActionsHtml(routeKey, options, view) {\n const shown = options.filter((option) => option.provider.length > 0).filter((option) => swapAssetMatchesRoute(routeKey, option.pay_in_asset));\n if (shown.length === 0) return \"\";\n return `\n <div part=\"swap-actions\" class=\"${orClasses4.swapActions}\">\n ${shown.map((option) => {\n const disabled = option.available === false;\n const limitMessage = elementsSwapLimitMessage(option, view);\n const info = disabled ? limitMessage === void 0 ? \"\" : `<p part=\"swap-warning\" class=\"${orClasses4.swapWarning}\">${escapeHtml5(limitMessage)}</p>` : option.pay_amount === void 0 ? \"\" : `<p part=\"swap-estimate\" class=\"${orClasses4.swapEstimate}\">Estimated ${escapeHtml5(option.pay_amount)} ${escapeHtml5(option.label)} to settle this checkout.</p>`;\n return `\n <div class=\"${orClasses4.swapAction}\">\n ${info}\n <button\n part=\"swap-start\"\n class=\"${orClasses4.swapStart}\"\n ${disabled ? \"\" : `${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapStart}=\"${escapeHtml5(option.pay_in_asset)}\"`}\n ${disabled ? 'disabled aria-disabled=\"true\"' : \"\"}\n type=\"button\"\n >${escapeHtml5(\n checkoutLabels4.createPaymentAddress.replace(\"{asset}\", option.label).replace(\"{network}\", option.network_label)\n )}</button>\n </div>\n `;\n }).join(\"\")}\n </div>\n `;\n}\nfunction elementsSwapLimitContext(view) {\n if (view.amountMsats === void 0) return void 0;\n return {\n amount_msats: view.amountMsats,\n ...view.fiat?.currency === void 0 || view.fiat.value === void 0 ? {} : { fiat: { currency: view.fiat.currency, value: view.fiat.value } }\n };\n}\nfunction elementsSwapLimitMessage(option, view) {\n return swapOptionLimitMessage(option, elementsSwapLimitContext(view));\n}\nfunction renderElementSwapPanelHtml(invoice, view = {}) {\n const display = createSwapDisplayModel(invoice, {\n ...view.resumable === void 0 ? {} : { resumable: view.resumable }\n });\n if (display === void 0) return \"\";\n const backButton = `\n <button part=\"swap-back\" class=\"${orClasses4.swapBack}\" ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapBack} type=\"button\">${escapeHtml5(checkoutLabels4.payWithLightningInstead)}</button>\n `;\n const supportDetails = renderElementSwapSupportDetailsHtml(display);\n const heading = `\n <div part=\"swap-heading\" class=\"${orClasses4.swapHeading}\">\n <strong class=\"${orClasses4.swapHeadingTitle}\">${escapeHtml5(display.providerStateLabel)}</strong>\n <span class=\"${orClasses4.swapHeadingDetail}\">${escapeHtml5(display.providerStateDetail)}</span>\n </div>\n `;\n const refundHeading = `\n <div part=\"swap-heading\" class=\"${orClasses4.swapRefundHeading}\" role=\"alert\">\n ${renderElementAlertIconHtml(\"warning\")}\n <div class=\"${orClasses4.swapNetworkWarningContent}\">\n <strong class=\"${orClasses4.swapHeadingTitle}\">${escapeHtml5(display.providerStateLabel)}</strong>\n <span class=\"${orClasses4.swapHeadingDetail}\">${escapeHtml5(display.providerStateDetail)}</span>\n </div>\n </div>\n `;\n if (display.state === \"creating\") {\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n <div part=\"status\" class=\"${orClasses4.paymentStatus}\">\n <span part=\"spinner\" class=\"${orClasses4.spinner}\" aria-hidden=\"true\"></span>\n <div class=\"${orClasses4.paymentStatusBody}\">\n <strong class=\"${orClasses4.paymentStatusTitle}\">${escapeHtml5(display.providerStateLabel)}</strong>\n <p class=\"${orClasses4.paymentStatusDetail}\">${escapeHtml5(display.providerStateDetail)}</p>\n </div>\n </div>\n ${backButton}\n </section>\n `;\n }\n if (display.state === \"deposit\") {\n const feeBreakdown = renderElementSwapFeeBreakdownHtml(display.feeBreakdown);\n const waitingStatus = `\n <div part=\"status\" class=\"${orClasses4.paymentStatus}\">\n <span part=\"spinner\" class=\"${orClasses4.spinner}\" aria-hidden=\"true\"></span>\n <div class=\"${orClasses4.paymentStatusBody}\">\n <div class=\"${orClasses4.swapWaitingTitle}\">\n <strong class=\"${orClasses4.paymentStatusTitle}\">${escapeHtml5(display.providerStateLabel)}</strong>\n <strong part=\"swap-countdown\" class=\"${orClasses4.swapCountdown}\">${escapeHtml5(display.countdownLabel)}</strong>\n </div>\n <p class=\"${orClasses4.paymentStatusDetail}\">${escapeHtml5(display.providerStateDetail)}</p>\n </div>\n </div>\n `;\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n <p part=\"swap-instruction\" class=\"${orClasses4.swapInstruction}\">Pay <strong>${escapeHtml5(display.depositAmount)} ${escapeHtml5(display.assetLabel)}</strong> to this address</p>\n ${renderElementSwapNetworkWarningHtml(display)}\n <div part=\"swap-deposit-layout\" class=\"${orClasses4.swapDepositLayout}\">\n <div part=\"swap-qr\" class=\"${orClasses4.swapQrFrame}\" ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapQr}=\"${escapeHtml5(display.qrPayload)}\"></div>\n <div part=\"swap-deposit-side\" class=\"${orClasses4.swapDepositSide}\">\n <dl part=\"swap-details\" class=\"${orClasses4.swapDetails}\">\n ${display.copyRows.map(\n (row) => renderElementSwapCopyDetailHtml(row.label, row.copyValue ?? row.value, {\n selectable: row.selectable,\n displayValue: row.value\n })\n ).join(\"\")}\n </dl>\n ${waitingStatus}\n ${feeBreakdown}\n </div>\n </div>\n ${backButton}\n </section>\n `;\n }\n if (display.state === \"settled\") {\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n ${heading}\n <dl part=\"swap-details\" class=\"${orClasses4.swapDetails}\">\n ${display.depositTxId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Deposit transaction\", display.depositTxId, { kind: \"tx\", payInAsset: display.payInAsset })}\n ${display.payoutTxId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Lightning payout\", display.payoutTxId)}\n ${display.providerOrderId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Provider order\", display.providerOrderId)}\n </dl>\n ${renderElementTransactionDetailsHtml(invoice, view)}\n </section>\n `;\n }\n if (display.state === \"progress\") {\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n <div part=\"status\" class=\"${orClasses4.paymentStatus}\">\n <span part=\"spinner\" class=\"${orClasses4.spinner}\" aria-hidden=\"true\"></span>\n <div class=\"${orClasses4.paymentStatusBody}\">\n <strong class=\"${orClasses4.paymentStatusTitle}\">${escapeHtml5(display.providerStateLabel)}</strong>\n <p class=\"${orClasses4.paymentStatusDetail}\">${escapeHtml5(display.providerStateDetail)}</p>\n </div>\n </div>\n ${supportDetails}\n </section>\n `;\n }\n if (display.state === \"expired\") {\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n ${heading}\n <p part=\"swap-warning\" class=\"${orClasses4.swapWarning}\">This payment address expired without a detected payment. Create a new payment address to try again.</p>\n ${supportDetails}\n ${backButton}\n </section>\n `;\n }\n if (display.state === \"refund_required\") {\n const stagedRefundAddress = display.refundAddress;\n const refundFacts = renderElementSwapAmountFactsHtml(display);\n const refundFormIntro = `\n <p class=\"${orClasses4.swapSectionTitle}\">${escapeHtml5(checkoutLabels4.refundSectionTitle)}</p>\n ${display.refundReason === void 0 ? \"\" : `<p class=\"${orClasses4.swapRefundReason}\">${escapeHtml5(\n checkoutLabels4.refundReasonLabel.replace(\n \"{reason}\",\n display.refundReason.replace(/_/g, \" \")\n )\n )}</p>`}\n <p class=\"${orClasses4.swapRefundInstruction}\">${escapeHtml5(\n checkoutLabels4.refundAddressOwnership.replace(\"{network}\", display.networkLabel)\n )}</p>\n `;\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n ${refundHeading}\n ${renderElementSwapRefundReturnWarningHtml(display)}\n ${refundFacts}\n ${stagedRefundAddress === void 0 ? `\n <form\n part=\"swap-refund\"\n class=\"${orClasses4.swapRefund}\"\n novalidate\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundForm}=\"${escapeHtml5(display.attemptId)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundPayInAsset}=\"${escapeHtml5(display.payInAsset)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundNetworkLabel}=\"${escapeHtml5(display.networkLabel)}\"\n ${display.refundAllowed ? `${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundAllowed}=\"true\"` : \"\"}\n >\n ${refundFormIntro}\n <input\n class=\"${orClasses4.swapRefundInput}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundAddress}\n name=\"refund_address\"\n placeholder=\"${escapeHtml5(checkoutLabels4.refundAddressPlaceholder.replace(\"{network}\", display.networkLabel))}\"\n type=\"text\"\n autocomplete=\"off\"\n required\n >\n <p\n part=\"swap-refund-error\"\n class=\"${orClasses4.swapRefundError}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundError}\n hidden\n role=\"alert\"\n ></p>\n <p part=\"swap-refund-hint\" class=\"${orClasses4.swapRefundHint}\">Make sure you control this ${escapeHtml5(display.networkLabel)} address. Refunds sent to the wrong address usually cannot be recovered.</p>\n <button class=\"${orClasses4.btn}\" type=\"submit\">${escapeHtml5(checkoutLabels4.reviewRefundAddress)}</button>\n </form>\n ` : `\n <form\n part=\"swap-refund\"\n class=\"${orClasses4.swapRefund}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundForm}=\"${escapeHtml5(display.attemptId)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundPayInAsset}=\"${escapeHtml5(display.payInAsset)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundNetworkLabel}=\"${escapeHtml5(display.networkLabel)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundConfirm}=\"true\"\n ${display.refundAllowed ? `${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundAllowed}=\"true\"` : \"\"}\n >\n ${refundFormIntro}\n <p class=\"${orClasses4.swapRefundInstruction}\">${escapeHtml5(checkoutLabels4.confirmRefundTo.replace(\"{address}\", stagedRefundAddress))}</p>\n <input\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES4.swapRefundAddress}\n name=\"refund_address\"\n type=\"hidden\"\n value=\"${escapeHtml5(stagedRefundAddress)}\"\n >\n <button class=\"${orClasses4.btn}\" type=\"submit\">${escapeHtml5(checkoutLabels4.confirmRefund)}</button>\n </form>\n `}\n ${supportDetails}\n </section>\n `;\n }\n if (display.state === \"refund_pending\" || display.state === \"refunded\") {\n const refundFacts = renderElementSwapAmountFactsHtml(display);\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n ${refundHeading}\n ${renderElementSwapRefundReturnWarningHtml(display)}\n ${refundFacts}\n <dl part=\"swap-details\" class=\"${orClasses4.swapDetails}\">\n ${display.refundAddress === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Refund address\", display.refundAddress, { kind: \"address\", payInAsset: display.payInAsset })}\n ${display.refundTxId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Refund transaction\", display.refundTxId, { kind: \"tx\", payInAsset: display.payInAsset })}\n </dl>\n ${supportDetails}\n </section>\n `;\n }\n return `\n <section part=\"swap-panel\" class=\"${orClasses4.swapPanel}\">\n ${heading}\n <p part=\"swap-warning\" class=\"${orClasses4.swapWarning}\">${escapeHtml5(checkoutLabels4.supportReviewFacts)}</p>\n ${renderElementSwapAmountFactsHtml(display)}\n ${renderElementSwapSupportDetailsHtml(display, { open: true })}\n ${backButton}\n </section>\n `;\n}\nfunction renderElementSwapRefundReturnWarningHtml(display) {\n const url = display.resumable ? currentCheckoutUrl() : void 0;\n return `\n <div part=\"swap-refund-return\" class=\"${orClasses4.swapRefundReturn}\">\n ${renderElementAlertIconHtml(\"bookmark\")}\n <div class=\"${orClasses4.swapNetworkWarningContent}\">\n <p class=\"${orClasses4.swapRefundReturnTitle}\">${escapeHtml5(checkoutLabels4.refundReturnTitle)}</p>\n <p class=\"${orClasses4.swapRefundReturnBody}\">${escapeHtml5(display.refundReturnLabel)}</p>\n ${url === void 0 ? \"\" : `<dl part=\"swap-details\" class=\"${orClasses4.swapDetails}\">${renderElementSwapCopyDetailHtml(\n checkoutLabels4.refundReturnUrlLabel,\n url,\n { selectable: true }\n )}</dl>`}\n </div>\n </div>\n `;\n}\nfunction renderElementSwapAmountFactsHtml(display) {\n const facts = [\n ...display.depositReceivedAmount === void 0 ? [] : [\n [\"Amount received\", `${display.depositReceivedAmount} ${display.assetLabel}`],\n [\"Amount required\", `${display.depositAmount} ${display.assetLabel}`]\n ],\n ...display.refundAmount === void 0 ? [] : [[\"Estimated refund\", `${display.refundAmount} ${display.assetLabel}`]]\n ];\n if (facts.length === 0) return \"\";\n const rows = facts.map(\n ([label, value]) => `\n <div class=\"${orClasses4.swapFactsRow}\">\n <dt class=\"${orClasses4.swapFactsLabel}\">${escapeHtml5(label)}</dt>\n <dd class=\"${orClasses4.swapFactsValue}\">${escapeHtml5(value)}</dd>\n </div>`\n ).join(\"\");\n return `<dl part=\"swap-facts\" class=\"${orClasses4.swapFacts}\">${rows}</dl>`;\n}\nfunction renderElementAlertIconHtml(kind) {\n const path = kind === \"warning\" ? \"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" : \"M17 3H7a2 2 0 00-2 2v16l7-3.5L19 21V5a2 2 0 00-2-2z\";\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" class=\"${orClasses4.swapNetworkWarningIcon}\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"${path}\" />\n </svg>`;\n}\nfunction renderElementSwapNetworkWarningHtml(display) {\n const alarm = display.depositRisk !== \"pinned\";\n const emphasisStart = display.networkWarning.indexOf(display.networkWarningEmphasis);\n const before = emphasisStart === -1 ? escapeHtml5(display.networkWarning) : escapeHtml5(display.networkWarning.slice(0, emphasisStart));\n const after = emphasisStart === -1 ? \"\" : escapeHtml5(\n display.networkWarning.slice(emphasisStart + display.networkWarningEmphasis.length)\n );\n const emphasis = emphasisStart === -1 ? \"\" : `<strong class=\"${orClasses4.swapNetworkWarningEmphasis}\">${escapeHtml5(display.networkWarningEmphasis)}</strong>`;\n const icon = alarm ? `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" class=\"${orClasses4.swapNetworkWarningIcon}\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>` : \"\";\n return `\n <div part=\"swap-network-warning\"${alarm ? ' role=\"alert\"' : \"\"} data-or-deposit-risk=\"${escapeHtml5(display.depositRisk)}\" class=\"${alarm ? orClasses4.swapNetworkWarning : orClasses4.swapNetworkNotice}\">\n ${icon}\n <div class=\"${orClasses4.swapNetworkWarningContent}\">\n <p class=\"${orClasses4.swapNetworkWarningTitle}\">${escapeHtml5(display.networkWarningTitle)}</p>\n <p class=\"${orClasses4.swapNetworkWarningBody}\">${before}${emphasis}${after}</p>\n </div>\n </div>\n `;\n}\nfunction renderElementTransactionDetailsHtml(invoice, view) {\n const bolt11 = typeof invoice.invoice === \"string\" ? invoice.invoice : view.lightningInvoice;\n return renderTransactionDetailsHtml({\n ...view.reference === void 0 ? {} : { reference: view.reference },\n ...view.checkoutId === void 0 ? {} : { checkout_id: view.checkoutId },\n invoice_id: invoice.invoice_id,\n ...bolt11 === void 0 ? {} : { invoice: bolt11 },\n rail: invoice.rail,\n ...invoice.payment_hash === void 0 ? view.paymentHash === void 0 ? {} : { payment_hash: view.paymentHash } : { payment_hash: invoice.payment_hash },\n ...invoice.amount_msats === void 0 ? view.amountMsats === void 0 ? {} : { amount_msats: view.amountMsats } : { amount_msats: invoice.amount_msats },\n ...invoice.fiat_quote === void 0 ? view.fiat?.currency === void 0 || view.fiat.value === void 0 ? {} : { fiat_quote: { fiat: { currency: view.fiat.currency, value: view.fiat.value } } } : { fiat_quote: invoice.fiat_quote },\n ...invoice.transaction_state === void 0 ? {} : { transaction_state: invoice.transaction_state },\n ...invoice.workflow_state === void 0 ? {} : { workflow_state: invoice.workflow_state },\n ...invoice.expires_at === void 0 ? {} : { expires_at: invoice.expires_at },\n ...invoice.settled_at === void 0 ? {} : { settled_at: invoice.settled_at },\n ...invoice.swap === void 0 ? {} : { swap: invoice.swap }\n });\n}\nfunction renderElementSwapFeeBreakdownHtml(breakdown) {\n if (breakdown === void 0) return \"\";\n const feeValue = breakdown.feePercent === void 0 ? breakdown.fee : `${breakdown.fee} (${breakdown.feePercent})`;\n return `\n <div part=\"swap-breakdown\" class=\"${orClasses4.swapBreakdown}\">\n <p part=\"swap-breakdown-title\" class=\"${orClasses4.swapBreakdownTitle}\">${escapeHtml5(checkoutLabels4.paymentBreakdown)}</p>\n <dl part=\"swap-details\" class=\"${orClasses4.swapBreakdownRows}\">\n <dt>${escapeHtml5(checkoutLabels4.cartTotal)}</dt>\n <dd>${escapeHtml5(breakdown.cartTotal)}</dd>\n <dt>${escapeHtml5(checkoutLabels4.youSend)}</dt>\n <dd>${escapeHtml5(breakdown.youSend)}</dd>\n <dt>${escapeHtml5(checkoutLabels4.swapAndNetworkFees)}</dt>\n <dd>${escapeHtml5(feeValue)}</dd>\n </dl>\n </div>\n `;\n}\nfunction renderElementSwapSupportDetailsHtml(display, options = {}) {\n if (display.depositTxId === void 0 && display.payoutTxId === void 0 && display.refundTxId === void 0 && display.providerOrderId === void 0) {\n return \"\";\n }\n return `\n <details part=\"swap-support\" class=\"${orClasses4.swapSupport}\"${options.open === true ? \" open\" : \"\"}>\n <summary class=\"${orClasses4.swapSupportTitle}\">Payment details</summary>\n <div class=\"${orClasses4.swapSupportContent}\">\n <dl part=\"swap-details\" class=\"${orClasses4.swapDetails}\">\n ${display.depositTxId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Deposit transaction\", display.depositTxId, { kind: \"tx\", payInAsset: display.payInAsset })}\n ${display.payoutTxId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Lightning payout\", display.payoutTxId)}\n ${display.refundTxId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Refund transaction\", display.refundTxId, { kind: \"tx\", payInAsset: display.payInAsset })}\n ${display.providerOrderId === void 0 ? \"\" : renderElementSwapCopyDetailHtml(\"Provider order\", display.providerOrderId)}\n </dl>\n </div>\n </details>\n `;\n}\n\n// src/render-wizard.ts\nfunction wizardStartingAsset(view) {\n const asset = view.startingSwapAsset;\n return asset !== void 0 && asset !== null && asset.length > 0 ? asset : void 0;\n}\nfunction renderElementSwapUnavailableHtml(quote, checkout) {\n const model = createSwapUnavailableModel(quote, checkout);\n return `<section part=\"swap-panel\" class=\"${orClasses5.swapPanel}\">\n <div part=\"swap-heading\" class=\"${orClasses5.swapHeading}\">\n <strong class=\"${orClasses5.swapHeadingTitle}\">${escapeHtml6(model.title)}</strong>\n </div>\n <p part=\"swap-warning\" class=\"${orClasses5.swapWarning}\">${escapeHtml6(model.detail)}</p>\n ${model.range === void 0 ? \"\" : `<p class=\"${orClasses5.swapWarning}\">${escapeHtml6(model.range)}</p>`}\n <p class=\"${orClasses5.swapProgress}\">${escapeHtml6(model.hint)}</p>\n </section>`;\n}\nfunction renderPaymentWizardHtml(view = {}) {\n const keepOrderNote = renderElementKeepOrderNoteHtml(view);\n const selection = {\n selectedMethod: view.selectedMethod ?? null,\n selectedBitcoinRoute: view.selectedBitcoinRoute ?? null\n };\n const model = createPaymentWizardModel(selection);\n const { wizard } = model;\n const routeAssetDisplays = createWizardRouteAssetDisplays(model.routeAssets, {\n selectedRoute: model.selectedRoute\n });\n const routeDisplays = createWizardRouteDisplays(wizard.routes);\n const showRoutePicker = routeAssetDisplays.length > 0 && (model.selectedRoute === null || routeDisplays.length === 0);\n const breadcrumbs = selection.selectedMethod === null ? \"\" : renderWizardBreadcrumbsHtml({\n method: selection.selectedMethod,\n selectedRoute: model.selectedRoute,\n routeAssets: routeAssetDisplays\n });\n const swapAssetOptions = (view.swapOptions ?? []).filter((option) => option.provider.length > 0);\n const selectedSwapAsset = view.selectedSwapAsset ?? null;\n const selectedSwapOption = selectedSwapAsset === null ? void 0 : swapAssetOptions.find((option) => option.pay_in_asset === selectedSwapAsset);\n if (selectedSwapAsset !== null) {\n const label = selectedSwapOption === void 0 ? \"this coin\" : `${selectedSwapOption.label} \\xB7 ${selectedSwapOption.network_label}`;\n const activeSwap = view.swapInvoice !== void 0 && view.swapInvoice.swap?.pay_in_asset === selectedSwapAsset ? view.swapInvoice : void 0;\n const activeSwapState = activeSwap === void 0 ? void 0 : createSwapDisplayModel2(activeSwap, {\n ...view.resumable === void 0 ? {} : { resumable: view.resumable }\n })?.state;\n const refundOwed = activeSwapState === \"refund_required\";\n const refundStage = activeSwapState?.startsWith(\"refund\") ?? false;\n return `\n <section part=\"wizard\" class=\"${orClasses5.wizard}\" ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.root}>\n <div class=\"${orClasses5.wizardBody}\">\n ${refundOwed ? \"\" : `<div part=\"wizard-breadcrumbs\" class=\"${orClasses5.breadcrumbs}\">\n <button\n part=\"wizard-breadcrumb\"\n class=\"${orClasses5.btnGhost}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.breadcrumb}=\"swap-asset\"\n type=\"button\"\n >${escapeHtml6(checkoutLabels5.switchPaymentMethod)}</button>\n <span aria-hidden=\"true\">/</span>\n <span part=\"wizard-breadcrumb-current\" class=\"${orClasses5.breadcrumbCurrent}\">${escapeHtml6(label)}</span>\n </div>`}\n <div part=\"wizard-results\" class=\"${orClasses5.wizardResults}\">\n ${activeSwap !== void 0 ? renderElementSwapPanelHtml(activeSwap, view) : view.swapStartError !== void 0 ? `<section part=\"swap-panel\" class=\"${orClasses5.swapPanel}\">\n <div part=\"swap-error\" role=\"alert\" class=\"${orClasses5.paymentStatus}\">\n <div class=\"${orClasses5.paymentStatusBody}\">\n <strong class=\"${orClasses5.paymentStatusTitle}\">${escapeHtml6(checkoutLabels5.swapStartFailedTitle)}</strong>\n <p class=\"${orClasses5.paymentStatusDetail}\">${escapeHtml6(view.swapStartError)}</p>\n <button\n part=\"swap-retry\"\n class=\"${orClasses5.btn}\"\n type=\"button\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.swapStart}=\"${escapeHtml6(selectedSwapAsset)}\"\n >${escapeHtml6(checkoutLabels5.tryAgain)}</button>\n </div>\n </div>\n </section>` : view.unavailableSwapQuote !== void 0 ? renderElementSwapUnavailableHtml(\n view.unavailableSwapQuote,\n view.swapLimitContext\n ) : `<section part=\"swap-panel\" class=\"${orClasses5.swapPanel}\">\n <div part=\"status\" class=\"${orClasses5.paymentStatus}\">\n <span part=\"spinner\" class=\"${orClasses5.spinner}\" aria-hidden=\"true\"></span>\n <div class=\"${orClasses5.paymentStatusBody}\">\n <strong class=\"${orClasses5.paymentStatusTitle}\">${escapeHtml6(checkoutLabels5.preparingPaymentAddress)}</strong>\n <p class=\"${orClasses5.paymentStatusDetail}\">${escapeHtml6(\n checkoutLabels5.preparingPaymentAddressDetail.replace(\n \"{asset}\",\n selectedSwapOption?.label ?? \"coin\"\n )\n )}</p>\n </div>\n </div>\n </section>`}\n </div>\n ${refundStage ? \"\" : keepOrderNote}\n </div>\n </section>\n `;\n }\n const methodPicker = selection.selectedMethod === null ? renderElementCompactPaymentSelectorHtml(swapAssetOptions, view) : \"\";\n return `\n <section part=\"wizard\" class=\"${orClasses5.wizard}\" ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.root}>\n ${view.wizardError === void 0 ? \"\" : `<p part=\"wizard-error\" role=\"alert\" class=\"${orClasses5.paymentStatusDetail}\">${escapeHtml6(view.wizardError)}</p>`}\n ${methodPicker}\n ${selection.selectedMethod === null && keepOrderNote.length > 0 ? `<div class=\"${orClasses5.wizardBody}\">${keepOrderNote}</div>` : \"\"}\n ${selection.selectedMethod === null ? \"\" : `\n <div class=\"${orClasses5.wizardBody}\">\n ${breadcrumbs}\n ${showRoutePicker ? `\n <div part=\"route-picker\" class=\"${orClasses5.routePicker}\">\n ${routeAssetDisplays.map(\n (asset) => `\n <button\n part=\"route${asset.selected ? \" selected\" : \"\"}\"\n class=\"${asset.selected ? orClasses5.routeButtonSelected : orClasses5.routeButton}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.route}=\"${escapeHtml6(asset.id)}\"\n type=\"button\"\n >\n ${renderPaymentIconHtml(asset.iconId, {\n className: orClasses5.methodIcon,\n label: asset.label\n })}\n <strong class=\"${orClasses5.methodTitle}\">${escapeHtml6(asset.label)}</strong>\n <small class=\"${orClasses5.methodDetail}\">${escapeHtml6(asset.subtitle)}</small>\n </button>\n `\n ).join(\"\")}\n </div>\n ` : \"\"}\n ${`\n <div part=\"wizard-results\" class=\"${orClasses5.wizardResults}\">\n ${routeDisplays.length === 0 ? `\n <p part=\"wizard-empty\" class=\"${orClasses5.wizardEmpty}\">${escapeHtml6(\n getWizardEmptyMessage()\n )}</p>\n\t ` : routeDisplays.map((route) => {\n const activeSwap = view.swapInvoice !== void 0 && swapAssetMatchesRoute2(route.key, view.swapInvoice.swap?.pay_in_asset) ? view.swapInvoice : void 0;\n return `\n\t <section part=\"wizard-route\" class=\"${orClasses5.wizardRoute}\">\n <h3 class=\"${orClasses5.wizardRouteHeading}\">\n ${escapeHtml6(route.title)}\n </h3>\n ${activeSwap === void 0 ? renderElementSwapActionsHtml(route.key, view.swapOptions ?? [], view) : renderElementSwapPanelHtml(activeSwap, view)}\n ${activeSwap === void 0 ? `<div part=\"provider-grid\" class=\"${orClasses5.providerGrid}\">\n ${route.providers.map(\n (provider) => `\n <article part=\"provider\" class=\"${orClasses5.providerCard}\">\n <div part=\"provider-heading\" class=\"${orClasses5.providerHeading}\">\n <img class=\"${orClasses5.providerIcon}\" alt=\"\" src=\"${escapeHtml6(provider.icon)}\">\n <h4 class=\"${orClasses5.providerName}\">${escapeHtml6(provider.name)}</h4>\n\t </div>\n <p part=\"provider-kind\" class=\"${orClasses5.providerKind}\">${escapeHtml6(provider.kind)}</p>\n\t <div part=\"provider-actions\" class=\"${orClasses5.providerActions}\">\n ${renderProviderOpenActionHtml(provider)}\n </div>\n </article>\n `\n ).join(\"\")}\n </div>` : \"\"}\n </section>\n `;\n }).join(\"\")}\n </div>\n `}\n ${keepOrderNote}\n </div>\n `}\n ${renderTutorialModalHtml(\n routeDisplays,\n view.activeTutorialProviderId ?? null,\n view.activeTutorialIndex ?? 0,\n view.activeTutorialCopied ?? false,\n view.lightningInvoice,\n view.decodeLinkUrl\n )}\n </section>\n `;\n}\nfunction renderElementKeepOrderNoteHtml(view) {\n if (view.resumable !== true) return \"\";\n const reference = view.reference ?? \"\";\n const url = currentCheckoutUrl2();\n if (reference.length === 0 && url === void 0) return \"\";\n return `\n <div part=\"keep-order\" class=\"${orClasses5.keepOrder}\">\n <p class=\"${orClasses5.swapSectionTitle}\">${escapeHtml6(checkoutLabels5.keepOrderTitle)}</p>\n <p class=\"${orClasses5.keepOrderBody}\">${escapeHtml6(checkoutLabels5.keepOrderBody)}</p>\n <dl part=\"swap-details\" class=\"${orClasses5.swapDetails}\">\n ${reference.length === 0 ? \"\" : renderElementSwapCopyDetailHtml(checkoutLabels5.keepOrderIdLabel, reference, {\n selectable: true\n })}\n ${url === void 0 ? \"\" : renderElementSwapCopyDetailHtml(checkoutLabels5.keepOrderUrlLabel, url, {\n selectable: true\n })}\n </dl>\n </div>\n `;\n}\nfunction renderElementCompactPaymentSelectorHtml(swapAssetOptions, view) {\n const limitContext = elementsSwapLimitContext(view);\n const display = createMethodGridDisplay({\n entries: buildMethodGridEntries(paymentMethods, swapAssetOptions),\n selectedPickerKey: view.selectedPickerKey ?? null,\n selectedAssetByGroup: view.selectedSwapAssetByGroup ?? {},\n startingAsset: wizardStartingAsset(view) ?? null,\n ...limitContext === void 0 ? {} : { checkout: limitContext }\n });\n const currenciesLoading = view.currenciesLoading === true && swapAssetOptions.length === 0;\n const { gridBusy, networkRequired, selectedGroup, continueTarget } = display;\n const continueButton = (className) => renderElementMethodConfirmHtml({\n className,\n disabled: continueTarget === void 0 || continueTarget.disabled,\n starting: continueTarget?.starting === true,\n swapStartAsset: continueTarget === void 0 || continueTarget.disabled ? void 0 : continueTarget.payInAsset,\n label: escapeHtml6(continueTarget?.label ?? checkoutLabels5.continue)\n });\n const tiles = display.entries.map((entry) => {\n if (entry.kind === \"method\") {\n const method = entry.method;\n return `\n <button\n part=\"method\"\n type=\"button\"\n class=\"${assetButtonClasses({ accent: entry.accent, selected: false, disabled: entry.disabled })}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.method}=\"${escapeHtml6(method.id)}\"\n ${entry.disabled ? 'disabled aria-disabled=\"true\"' : \"\"}\n >\n <span aria-hidden=\"true\" class=\"${orClasses5.methodIconWrap}\">\n ${renderPaymentIconHtml(getPaymentMethodIconId(method.id), {\n className: orClasses5.methodIcon,\n label: method.title\n })}\n </span>\n <span class=\"${orClasses5.methodTitleWrap}\">\n <span class=\"${orClasses5.methodTitle}\">${escapeHtml6(method.title)}</span>\n <span class=\"${orClasses5.methodTileDetail}\">${escapeHtml6(method.detail)}</span>\n </span>\n </button>`;\n }\n return renderElementSwapMethodGroupHtml(\n entry.group,\n view,\n gridBusy,\n entry.group.selected ? continueButton(orClasses5.methodConfirmDesktop) : void 0\n );\n }).join(\"\");\n const loadingTile = currenciesLoading ? `<div part=\"currencies-loading\" role=\"status\" aria-live=\"polite\" class=\"${orClasses5.methodCurrenciesLoading}\">\n <span part=\"spinner\" class=\"${orClasses5.spinner}\" aria-hidden=\"true\"></span>\n <span class=\"${orClasses5.methodTitle}\">${escapeHtml6(checkoutLabels5.loadingCurrencies)}</span>\n </div>` : \"\";\n const desktopReveal = networkRequired && selectedGroup !== void 0 ? `<div class=\"${orClasses5.methodNetworkRevealDesktop}\">${renderElementNetworkSelectorHtml(\n selectedGroup,\n view,\n continueButton(orClasses5.methodConfirmDesktop),\n false\n )}</div>` : \"\";\n return `\n <header class=\"${orClasses5.wizardHeader}\">\n <h2 id=\"payment-method-heading\" class=\"${orClasses5.wizardHeaderTitle}\">${escapeHtml6(checkoutLabels5.wizardTitle)}</h2>\n <p class=\"${orClasses5.wizardHeaderSubtitle}\">${escapeHtml6(checkoutLabels5.wizardSubtitle)}</p>\n </header>\n <div class=\"${orClasses5.methodBody}\" aria-labelledby=\"payment-method-heading\">\n <div part=\"method-grid\" role=\"group\" aria-label=\"${escapeHtml6(checkoutLabels5.paymentMethod)}\" class=\"${orClasses5.methodGrid}\">\n ${tiles}${loadingTile}\n </div>\n ${desktopReveal}\n </div>\n `;\n}\nfunction renderElementNetworkSelectorHtml(group, view, continueButtonHtml, mobile) {\n const { accent, groupKey, panelId, headingId, selectedOption } = group;\n const networkButtons = group.options.map((option) => {\n const optionDisabled = option.available === false;\n const optionSelected = option.pay_in_asset === selectedOption?.pay_in_asset;\n const optionLimit = elementsSwapLimitMessage(option, view);\n return `\n <div class=\"${orClasses5.methodTile}\">\n <button\n type=\"button\"\n aria-pressed=\"${optionSelected ? \"true\" : \"false\"}\"\n class=\"${networkButtonClasses({\n accent,\n selected: optionSelected,\n disabled: optionDisabled\n })}\"\n ${optionDisabled ? 'disabled aria-disabled=\"true\"' : \"\"}\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.swapNetwork}=\"${escapeHtml6(groupKey)}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.swapNetworkValue}=\"${escapeHtml6(option.pay_in_asset)}\"\n >\n <span aria-hidden=\"true\" class=\"grid size-6 shrink-0 place-items-center\">\n ${renderPaymentIconHtml(getNetworkIconId(option.network_label), {\n className: orClasses5.methodNetworkIcon,\n label: option.network_label\n })}\n </span>\n <span class=\"${orClasses5.methodNetworkLabel}\">${escapeHtml6(option.network_label)}</span>\n ${optionSelected ? `<span aria-hidden=\"true\" class=\"${networkCheckClasses(accent)}\">\\u2713</span>` : \"\"}\n </button>\n ${optionDisabled && optionLimit !== void 0 ? `<span class=\"${orClasses5.methodLimitHint}\">${escapeHtml6(optionLimit)}</span>` : \"\"}\n </div>`;\n }).join(\"\");\n const summary = selectedOption === void 0 ? \"\" : `<p aria-live=\"polite\" class=\"${orClasses5.methodNetworkSummary}\">\n <span aria-hidden=\"true\" class=\"${networkSummaryIconClasses(accent)}\">\\u2713</span>\n ${escapeHtml6(formatNetworkSummary(group.label, selectedOption.network_label))}\n </p>`;\n return `\n <div\n id=\"${panelId}\"\n role=\"group\"\n aria-labelledby=\"${headingId}\"\n class=\"${mobile ? networkMobileRevealClasses(accent) : orClasses5.methodNetworkReveal}\"\n >\n <div class=\"${orClasses5.methodNetworkLayout}\">\n <div>\n <h3 id=\"${headingId}\" class=\"${orClasses5.methodNetworkHeading}\">${escapeHtml6(\n group.heading\n )}</h3>\n <p class=\"${orClasses5.methodNetworkHint}\">${escapeHtml6(\n checkoutLabels5.selectNetworkToContinue\n )}</p>\n </div>\n <div role=\"group\" aria-labelledby=\"${headingId}\" class=\"${orClasses5.methodNetworkGrid}\">\n ${networkButtons}\n </div>\n ${continueButtonHtml}\n </div>\n ${summary}\n </div>`;\n}\nfunction renderElementMethodConfirmHtml(options) {\n const swapStart = options.disabled || options.swapStartAsset === void 0 ? \"\" : `${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.swapStart}=\"${escapeHtml6(options.swapStartAsset)}\"`;\n return `\n <button\n type=\"button\"\n part=\"method-confirm\"\n class=\"${options.className}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.pickerContinue}=\"\"\n ${swapStart}\n ${options.disabled ? 'disabled aria-disabled=\"true\"' : \"\"}\n ${options.starting ? 'aria-busy=\"true\"' : \"\"}\n >${options.starting ? `<span part=\"spinner\" class=\"${orClasses5.continueSpinner}\" aria-hidden=\"true\"></span>` : \"\"}${options.label}</button>`;\n}\nfunction renderElementSwapMethodGroupHtml(group, view, gridBusy, continueButtonHtml) {\n const {\n pickerKey,\n selected,\n displayOption,\n multiNetwork,\n starting,\n disabled,\n accent,\n limitMessage,\n panelId\n } = group;\n const networkDetail = formatMethodNetworkDetail(group.options);\n const mobileReveal = multiNetwork ? `\n <div class=\"${orClasses5.methodNetworkRevealAnim} ${selected ? orClasses5.methodNetworkRevealAnimOpen : orClasses5.methodNetworkRevealAnimClosed}\">\n <div class=\"${orClasses5.methodNetworkRevealInner}\">\n ${selected ? renderElementNetworkSelectorHtml(group, view, continueButtonHtml ?? \"\", true) : \"\"}\n </div>\n </div>` : \"\";\n return `\n <div class=\"${orClasses5.methodTile}\">\n <button\n part=\"method\"\n type=\"button\"\n aria-pressed=\"${starting || multiNetwork && selected ? \"true\" : \"false\"}\"\n ${multiNetwork ? `aria-expanded=\"${selected ? \"true\" : \"false\"}\" aria-controls=\"${panelId}\"` : \"\"}\n class=\"${assetButtonClasses({\n accent,\n selected: starting || multiNetwork && selected,\n disabled: disabled || gridBusy && !starting\n })}\"\n ${disabled || gridBusy ? 'disabled aria-disabled=\"true\"' : \"\"}\n ${starting ? 'aria-busy=\"true\"' : \"\"}\n ${disabled || gridBusy ? \"\" : multiNetwork ? `${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.pickerSelect}=\"${escapeHtml6(pickerKey)}\"` : `${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.swapStart}=\"${escapeHtml6(displayOption.pay_in_asset)}\"`}\n >\n <span aria-hidden=\"true\" class=\"${orClasses5.methodIconWrap}\">\n ${starting ? `<span part=\"spinner\" class=\"${orClasses5.spinner}\" aria-hidden=\"true\"></span>` : renderPaymentIconHtml(getSwapOptionIconId(displayOption), {\n className: orClasses5.methodIcon,\n label: group.label\n })}\n </span>\n <span class=\"${orClasses5.methodTitleWrap}\">\n <span class=\"${orClasses5.methodTitle}\">${escapeHtml6(group.label)}</span>\n ${networkDetail.length === 0 ? \"\" : `<span class=\"${orClasses5.methodTileDetail}\">${escapeHtml6(networkDetail)}</span>`}\n </span>\n </button>\n ${disabled && limitMessage !== void 0 ? `<span class=\"${orClasses5.methodLimitHint}\">${escapeHtml6(limitMessage)}</span>` : \"\"}\n ${mobileReveal}\n </div>`;\n}\nfunction renderWizardBreadcrumbsHtml(options) {\n const method = paymentMethods.find((candidate) => candidate.id === options.method);\n const methodLabel = method?.title ?? checkoutLabels5.paymentMethod;\n const routeLabel = options.selectedRoute === null || options.routeAssets.length <= 1 ? null : options.routeAssets.find((asset) => asset.id === options.selectedRoute)?.label ?? options.selectedRoute;\n return `\n <nav part=\"wizard-breadcrumbs\" class=\"${orClasses5.breadcrumbs}\" aria-label=\"Payment path\">\n <button\n part=\"wizard-breadcrumb\"\n class=\"${orClasses5.btnGhost}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.breadcrumb}=\"method\"\n type=\"button\"\n >\n <span>${escapeHtml6(checkoutLabels5.switchPaymentMethod)}</span>\n </button>\n <span part=\"wizard-breadcrumb-separator\" aria-hidden=\"true\">/</span>\n ${routeLabel === null ? `<span part=\"wizard-breadcrumb-current\" class=\"${orClasses5.breadcrumbCurrent}\">${escapeHtml6(methodLabel)}</span>` : `\n <button\n part=\"wizard-breadcrumb\"\n class=\"${orClasses5.btnGhost}\"\n ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES5.breadcrumb}=\"route\"\n type=\"button\"\n >\n <span>${escapeHtml6(methodLabel)}</span>\n </button>\n <span part=\"wizard-breadcrumb-separator\" aria-hidden=\"true\">/</span>\n <span part=\"wizard-breadcrumb-current\" class=\"${orClasses5.breadcrumbCurrent}\">${escapeHtml6(routeLabel)}</span>\n `}\n </nav>\n `;\n}\n\n// src/views.ts\nimport {\n createCheckoutSnapshotFromInvoice,\n createCheckoutState\n} from \"@openreceive/browser/headless\";\nfunction parseElementInvoiceId(value) {\n if (value === null || value.trim() === \"\") return void 0;\n return value;\n}\nfunction createElementCheckoutState(view) {\n const invoiceId = parseElementInvoiceId(view.invoice_id ?? null);\n if (invoiceId === void 0) return void 0;\n return createCheckoutState(\n createCheckoutSnapshotFromInvoice({\n invoice_id: invoiceId,\n invoice: view.invoice,\n rail: view.rail ?? \"lightning\",\n ...view.payment_hash === void 0 ? {} : { payment_hash: view.payment_hash },\n ...view.amount_msats === void 0 ? {} : { amount_msats: view.amount_msats },\n ...view.fiat_quote === void 0 ? {} : { fiat_quote: view.fiat_quote },\n ...view.status === void 0 ? {} : { transaction_state: transactionStateFromStatus(view.status) },\n ...view.expires_at === void 0 ? {} : { expires_at: view.expires_at }\n })\n );\n}\nfunction transactionStateFromStatus(status) {\n if (status === \"settled\") return \"settled\";\n if (status === \"expired\") return \"expired\";\n if (status === \"failed\") return \"failed\";\n return \"pending\";\n}\nfunction parseElementStatus(value) {\n if (value === \"pending\" || value === \"settled\" || value === \"expired\" || value === \"failed\") {\n return value;\n }\n return void 0;\n}\n\n// src/render-checkout.ts\nfunction renderCheckoutHtml(view) {\n if (view.invoice !== \"\") assertDisplayInvoice(view.invoice);\n const checkoutState = view.liveState ?? createElementCheckoutState(view);\n const labels = deriveCheckoutStateLabels(view);\n const amountCaption = formatAmountCaption({\n amountLabel: labels.amountLabel,\n fiatLabel: labels.fiatLabel,\n fiatCurrency: view.fiat_quote?.fiat?.currency\n });\n const satsDetail = amountCaption === void 0 ? \"\" : `<div part=\"sats-detail\" class=\"${orClasses6.satsDetail}\">${escapeHtml7(amountCaption)}</div>`;\n const statusLabel = view.status ?? (checkoutState === void 0 ? deriveStatus(view) : deriveStatus(checkoutState));\n const showSummaryMeta = statusLabel === \"settled\" || statusLabel === \"expired\";\n const stateClass = statusLabel === \"settled\" ? orClasses6.stateSettled : orClasses6.statePending;\n const stateLabel = showSummaryMeta ? `<span part=\"state\" class=\"${stateClass}\" data-state=\"${escapeHtml7(statusLabel)}\">${escapeHtml7(statusLabel)}</span>` : \"\";\n const status = checkoutState === void 0 ? \"\" : renderElementPaymentStatusHtml(checkoutState);\n const statusModel = checkoutState === void 0 ? void 0 : createCheckoutStatusModel(checkoutState);\n const expired = statusModel?.phase === \"expired\";\n const settled = statusLabel === \"settled\";\n const swapFocused = (view.wizard?.selectedSwapAsset ?? null) !== null;\n const methodGridShowing = view.payment_wizard !== false && view.wizard?.selectedMethod == null && !swapFocused;\n const hideLightning = !settled && (view.lightningRequested === false || swapFocused || methodGridShowing && !expired);\n const wizard = expired && !swapFocused || settled || view.payment_wizard === false ? \"\" : renderPaymentWizardHtml(view.wizard);\n const copyButton = `<button part=\"${OPENRECEIVE_CHECKOUT_ELEMENT_PARTS.copy}\" class=\"${orClasses6.btn}\" type=\"button\">${COPY_INVOICE_ICON}<span ${OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES6.swapCopyLabel}>${escapeHtml7(checkoutLabels6.copyInvoice)}</span></button>`;\n const decodeInvoice = view.invoice.trim() !== \"\" ? view.invoice : typeof view.wizard?.lightningInvoice === \"string\" && view.wizard.lightningInvoice.trim() !== \"\" ? view.wizard.lightningInvoice : void 0;\n const decodeHref = decodeInvoice === void 0 ? void 0 : createLightningInvoiceDecodeUrl2(decodeInvoice, view.decodeLinkUrl);\n const decodeButton = decodeHref === void 0 ? \"\" : `<a part=\"decode-invoice\" class=\"${orClasses6.btn}\" href=\"${escapeHtml7(decodeHref)}\" rel=\"noreferrer\" target=\"_blank\">${escapeHtml7(checkoutLabels6.decodeInvoice)}</a>`;\n const startOverButton = `<button part=\"${OPENRECEIVE_CHECKOUT_ELEMENT_PARTS.startOver}\" class=\"${orClasses6.btn}\" type=\"button\">${escapeHtml7(checkoutLabels6.startOver)}</button>`;\n const lightningPane = hideLightning || expired || settled ? \"\" : `<div part=\"lightning-pane\" class=\"${orClasses6.lightningPane}\">\n <div part=\"qr\" class=\"${orClasses6.qr}\" ${OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES.qr}></div>\n ${satsDetail}\n </div>`;\n const paymentLayoutClass = expired || settled ? orClasses6.paymentLayoutExpired : orClasses6.paymentLayout;\n const metaRow = stateLabel === \"\" ? \"\" : `<div part=\"meta\" class=\"${orClasses6.meta}\">${stateLabel}</div>`;\n const invoiceTitle = expired || settled ? \"\" : `<p part=\"invoice-title\" class=\"${orClasses6.invoiceTitle}\">${escapeHtml7(checkoutLabels6.bitcoinLightningInvoice)}</p>`;\n const actions = settled ? (\n // No state means no attempt to derive one from (a standalone caller that\n // passed `status: \"settled\"` and no invoice-id), so the panel reads the\n // attributes directly.\n //\n // The SAME panel the swap flow renders one screen earlier: copy buttons\n // and explorer links, not un-copyable text. A payer's whole evidence that\n // they paid is a payment hash and, on a swap, a deposit txid, and this is\n // the screen they keep. No `decodeLinkUrl` is passed, so the bolt11 never\n // reaches a third party.\n renderTransactionDetailsHtml(checkoutState ?? { ...view, rail: view.rail ?? \"lightning\" })\n ) : expired ? `<div part=\"actions\" class=\"${orClasses6.actions}\">${startOverButton}</div>` : `<div part=\"actions\" class=\"${orClasses6.actions}\">${copyButton}${decodeButton}</div>`;\n const resolvedTheme = view.theme ?? \"light\";\n const orderDescription = view.description === void 0 || view.description === \"\" ? \"\" : `<p part=\"order-description\" ${OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES.orderDescription} class=\"${orClasses6.orderDescription}\">${escapeHtml7(view.description)}</p>`;\n return `\n ${styleTag(view.inlineStyles)}\n <section part=\"root\" data-theme=\"${escapeHtml7(resolvedTheme)}\" class=\"${orClasses6.root}\">\n <slot name=\"${OPENRECEIVE_CHECKOUT_ELEMENT_SLOTS.order}\"></slot>\n ${orderDescription}\n ${view.mintingLightning ? `<div part=\"status\" role=\"status\" aria-live=\"polite\" class=\"${orClasses6.creating}\">\n <span part=\"spinner\" class=\"${orClasses6.spinner}\" aria-hidden=\"true\"></span>\n <p>${escapeHtml7(checkoutLabels6.preparingPayment)}</p>\n </div>` : \"\"}\n ${hideLightning ? \"\" : `<div part=\"payment-layout\" class=\"${paymentLayoutClass}\">\n ${lightningPane}\n <div part=\"payment-info\" class=\"${orClasses6.paymentInfo}\">\n ${invoiceTitle}\n ${status}\n ${metaRow}\n ${actions}\n </div>\n </div>`}\n ${wizard}\n </section>\n `;\n}\nfunction styleTag(inlineStyles) {\n return inlineStyles === false ? \"\" : checkoutStyleTag;\n}\nfunction renderCheckoutCreateErrorHtml(message, options = {}) {\n const resolvedTheme = options.theme ?? \"light\";\n const retryButton = `<button part=\"retry\" class=\"${orClasses6.btn}\" type=\"button\">Try again</button>`;\n return `\n ${styleTag(options.inlineStyles)}\n <section part=\"root\" data-theme=\"${escapeHtml7(resolvedTheme)}\" class=\"${orClasses6.root}\" data-openreceive-create-error>\n <div part=\"status\" role=\"alert\" class=\"${orClasses6.creating}\">\n <div><strong>Could not start checkout.</strong></div>\n <p>${escapeHtml7(message)}</p>\n ${retryButton}\n </div>\n </section>\n `;\n}\nfunction renderCheckoutCreatingHtml(options = {}) {\n const resolvedTheme = options.theme ?? \"light\";\n return `\n ${styleTag(options.inlineStyles)}\n <section part=\"root\" data-theme=\"${escapeHtml7(resolvedTheme)}\" class=\"${orClasses6.root}\" data-openreceive-creating>\n <div part=\"status\" class=\"${orClasses6.creating}\">\n <span part=\"spinner\" class=\"${orClasses6.spinner}\" aria-hidden=\"true\"></span>\n <div><strong>Creating checkout\\u2026</strong></div>\n </div>\n </section>\n `;\n}\nfunction renderThemeToggleHtml(label, options = {}) {\n return `\n ${styleTag(options.inlineStyles)}\n <button\n aria-label=\"${escapeHtml7(label)}\"\n class=\"${orClasses6.themeToggle}\"\n part=\"${OPENRECEIVE_THEME_TOGGLE_ELEMENT_PARTS.button}\"\n title=\"${escapeHtml7(label)}\"\n type=\"button\"\n ${OPENRECEIVE_CHECKOUT_DATA_ATTRIBUTES.themeToggle}\n >${escapeHtml7(label)}</button>\n `;\n}\nvar SETTLED_CHECK_ICON = `<svg part=\"settled-icon\" class=\"${orClasses6.settledIcon}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" aria-hidden=\"true\" focusable=\"false\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"/></svg>`;\nfunction renderElementPaymentStatusHtml(state) {\n const status = createCheckoutStatusModel(state);\n const countdown = status.countdownLabel === void 0 ? \"\" : `<small part=\"countdown\" class=\"${orClasses6.countdown}\">${escapeHtml7(status.countdownPrefix)} <strong class=\"${orClasses6.countdownStrong}\">${escapeHtml7(status.countdownLabel)}</strong></small>`;\n return `\n <div part=\"status\" role=\"status\" aria-live=\"polite\" class=\"${orClasses6.paymentStatus}\">\n ${status.waiting ? `<span part=\"spinner\" class=\"${orClasses6.spinner}\" aria-hidden=\"true\"></span>` : \"\"}\n ${status.phase === \"settled\" ? SETTLED_CHECK_ICON : \"\"}\n <div class=\"${orClasses6.paymentStatusBody}\">\n <strong class=\"${orClasses6.paymentStatusTitle}\">${escapeHtml7(status.title)}</strong>\n <p class=\"${orClasses6.paymentStatusDetail}\">${escapeHtml7(status.detail)}</p>\n ${countdown}\n </div>\n </div>\n `;\n}\n\n// src/define-elements.ts\nvar DEFAULT_TAG_NAME = OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME;\nfunction markElementConfirmButtonBusy(button) {\n button.disabled = true;\n button.setAttribute(\"aria-disabled\", \"true\");\n button.setAttribute(\"aria-busy\", \"true\");\n if (button.querySelector('[part=\"spinner\"]') !== null) return;\n const spinner = button.ownerDocument.createElement(\"span\");\n spinner.setAttribute(\"part\", \"spinner\");\n spinner.className = orClasses7.continueSpinner;\n spinner.setAttribute(\"aria-hidden\", \"true\");\n button.prepend(spinner);\n}\nfunction checkoutSnapshotDisplayKey(snapshot) {\n const { active: _active, paid_at: _paidAt, invoices, ...display } = snapshot;\n return JSON.stringify({\n ...display,\n invoices: invoices.map(\n ({ amount_msats: _amountMsats, fiat_quote: _fiatQuote, ...invoice }) => invoice\n )\n });\n}\nfunction defineElements(options = {}) {\n const registry = options.registry ?? globalThis.customElements;\n const HTMLElementCtor = globalThis.HTMLElement;\n const tagName = options.tagName ?? DEFAULT_TAG_NAME;\n const themeToggleTagName = options.themeToggleTagName ?? OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME;\n if (registry === void 0 || HTMLElementCtor === void 0) {\n throw new Error(\"Custom elements are unavailable in this environment.\");\n }\n class CheckoutElement extends HTMLElementCtor {\n selection = createPaymentWizardSelection();\n activeTutorialProviderId = null;\n activeTutorialIndex = 0;\n activeTutorialCopied = false;\n swapOptions = [];\n swapOptionsLoaded = false;\n selectedSwapAssetByGroup = {};\n selectedPickerKey = null;\n selectedSwapAsset = null;\n startedSwapInvoice;\n latestCheckoutSnapshot;\n /** Skip full shadow rebuilds when a poll returns the same payable UI. */\n lastSnapshotDisplayKey;\n dismissedSwapInvoiceId = null;\n controller;\n announcedSettledReference;\n /** Last applied state, used to detect countdown-only ticks (partial DOM update). */\n lastCheckoutState;\n /** Refund-address draft survives poll rebuilds of the shadow tree. */\n refundAddressDraft = \"\";\n refundAddressDraftFocused = false;\n refundAddressDraftSelectionStart = null;\n refundAddressDraftSelectionEnd = null;\n /** Tutorial provider whose dialog was last focused, so re-renders don't re-steal focus. */\n focusedTutorialProviderId = null;\n tutorialImagesRequested = false;\n /**\n * Create mode's whole request lifecycle \u2014 prepare-once, the deferred\n * Lightning mint, the swap start \u2014 plus the guard that keeps attributes the\n * element writes itself out of attributeChangedCallback. Every one of those\n * is a double-POST guard, which is why they live together.\n */\n session = createElementCheckoutSession({\n element: this,\n logger: options.logger,\n swapSelection: {\n started: () => this.startedSwapInvoice,\n setStarted: (invoice) => {\n this.startedSwapInvoice = invoice;\n },\n dismissedInvoiceId: () => this.dismissedSwapInvoiceId,\n setDismissedInvoiceId: (invoiceId) => {\n this.dismissedSwapInvoiceId = invoiceId;\n },\n setSelectedAsset: (payInAsset) => {\n this.selectedSwapAsset = payInAsset;\n }\n },\n isCreateMode: () => this.isCreateMode(),\n render: () => {\n this.render();\n },\n startCheckoutController: () => {\n this.startCheckoutController();\n },\n handleControllerSnapshot: (snapshot) => {\n this.handleControllerSnapshot(snapshot);\n },\n latestCheckoutSnapshot: () => this.latestCheckoutSnapshot,\n currentCheckoutSnapshot: () => this.currentCheckoutSnapshot(),\n currentThemeOption: () => this.currentThemeOption(),\n createMetadata: () => this.createMetadata(),\n syncResumePath: (reference) => {\n this.syncResumePath(reference);\n },\n resumePaymentHash: () => this.resumePaymentHash(),\n resolvePollPrefix: (reference) => this.resolvePollPrefix(reference),\n dispatchError: (error) => {\n this.dispatchError(error);\n }\n });\n /** When `theme` is unset, follow the nearest ancestor `[data-theme]` (e.g. ThemeScope). */\n themeAncestorObserver;\n observedThemeAncestor = null;\n static get observedAttributes() {\n return [\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.reference,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.prefix,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.csrfHeader,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoiceId,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.rail,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentHash,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.amountMsats,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.fiatCurrency,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.fiatValue,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.status,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.expiresAt,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.theme,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentWizard,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.syncUrl,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumePathPrefix,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.routeReference,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumePaymentHash,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumable,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.polling,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.pollIntervalMs,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.decodeLinkUrl\n ];\n }\n connectedCallback() {\n this.render();\n this.syncThemeAncestorObserver();\n if (this.isCreateMode()) {\n void this.session.createCheckout();\n return;\n }\n this.startCheckoutController();\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (this.session.applyingOwnAttributes) return;\n const identityChanged = name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.reference || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.prefix;\n if (!this.isConnected && !identityChanged) return;\n if (oldValue === newValue) return;\n if (name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.prefix && oldValue?.replace(/\\/+$/, \"\") === newValue?.replace(/\\/+$/, \"\"))\n return;\n const displayOnly = name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.theme || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.syncUrl || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumePathPrefix || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.routeReference || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumable || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.decodeLinkUrl;\n if (displayOnly) {\n this.render();\n this.syncThemeAncestorObserver();\n return;\n }\n const pollingChanged = name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.polling || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.pollIntervalMs || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.csrfHeader;\n if (pollingChanged) {\n this.render();\n this.syncThemeAncestorObserver();\n this.startCheckoutController();\n return;\n }\n const createInputChanged = name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.reference || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.prefix || name === OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice;\n if (createInputChanged) {\n const managed = this.latestCheckoutSnapshot !== void 0;\n this.stopCheckoutController();\n this.session.forgetCreateKey();\n this.latestCheckoutSnapshot = void 0;\n this.lastCheckoutState = void 0;\n this.lastSnapshotDisplayKey = void 0;\n this.startedSwapInvoice = void 0;\n this.dismissedSwapInvoiceId = null;\n this.selectedSwapAsset = null;\n this.selectedPickerKey = null;\n this.selectedSwapAssetByGroup = {};\n this.selection = createPaymentWizardSelection();\n this.swapOptions = [];\n this.swapOptionsLoaded = false;\n this.clearRefundAddressDraft();\n if (managed && name !== OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice) {\n this.session.writeOwnAttributes(() => {\n for (const key of [\n \"invoice\",\n \"invoiceId\",\n \"paymentHash\",\n \"rail\",\n \"amountMsats\",\n \"fiatCurrency\",\n \"fiatValue\",\n \"status\",\n \"expiresAt\"\n ]) {\n this.removeAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3[key]);\n }\n });\n }\n }\n if (!this.isConnected) return;\n if (this.isCreateMode()) {\n this.render();\n this.syncThemeAncestorObserver();\n if (createInputChanged) {\n void this.session.createCheckout();\n }\n return;\n }\n this.render();\n this.syncThemeAncestorObserver();\n this.startCheckoutController();\n }\n disconnectedCallback() {\n this.session.dispose();\n this.stopCheckoutController();\n this.stopThemeAncestorObserver();\n }\n /**\n * The tutorial screenshots are the one image set behind a dynamic import.\n * The first tutorial open fetches them and re-renders; until then (or if\n * the chunk never arrives) the dialog draws the caption alone.\n */\n loadTutorialImages() {\n if (this.tutorialImagesRequested) return;\n this.tutorialImagesRequested = true;\n loadPayTutorialImages().then(\n () => {\n if (this.isConnected) this.render();\n },\n () => void 0\n );\n }\n // Create mode: a `reference` is set but no `invoice` snapshot is provided. The element\n // owns the whole lifecycle \u2014 it prepares the checkout against\n // `${prefix}/checkouts/prepare` (locking the amount without minting), mints a Lightning\n // invoice only when the payer picks Bitcoin, then polls status against\n // `${prefix}/payments/check` and drives swaps under the prefix.\n isCreateMode() {\n const invoice = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice);\n const reference = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.reference);\n return (invoice === null || invoice === \"\") && reference !== null && reference.length > 0;\n }\n /**\n * Create-time metadata from the JSON `metadata` attribute.\n *\n * Read lazily, at mint time \u2014 which is why `metadata` is deliberately NOT a\n * create input: a host that changes it after mount is picked up by the next\n * mint, and re-keying the prepared checkout for it would orphan the\n * prepared attempt for nothing.\n *\n * Host-authored like `poll-interval-ms`, and ruled the same way: a value\n * that is not a JSON object is a host typo and must be heard, not silently\n * dropped from the create request.\n */\n createMetadata() {\n const raw = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.metadata);\n if (raw === null || raw.length === 0) return void 0;\n let parsed;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n throw new TypeError(\n `metadata must be a JSON object: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new TypeError(\"metadata must be a JSON object\");\n }\n return parsed;\n }\n /**\n * Whether a payer who closes this tab has a URL to come back to. Only\n * `sync-url` puts one there \u2014 the refund screen's copy has to say the true\n * thing either way, so this is read rather than assumed.\n */\n isResumable() {\n const declared = parseBooleanAttribute(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumable)\n );\n if (declared !== void 0) return declared;\n const routeReference = this.getAttribute(\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.routeReference\n );\n if (routeReference !== null && routeReference.length > 0) return true;\n return parseBooleanAttribute(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.syncUrl)\n ) === true;\n }\n /**\n * The swap attempt this order already has in flight, if the host named one.\n *\n * Read from the attribute at prepare time rather than captured at\n * construction: a host that learns the hash asynchronously (its own order\n * fetch) sets the attribute late, and the create lifecycle re-runs.\n */\n resumePaymentHash() {\n const value = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumePaymentHash);\n return value === null || value.length === 0 ? void 0 : value;\n }\n /** Order data belongs to the host; this only performs optional History API sync. */\n syncResumePath(reference) {\n const syncUrl = parseBooleanAttribute(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.syncUrl)\n ) === true;\n if (syncUrl) {\n const resumePathPrefix = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.resumePathPrefix) ?? \"/checkout\";\n const routeReference = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.routeReference) ?? void 0;\n enterCheckoutResumePath(reference, {\n pathPrefix: resumePathPrefix,\n ...routeReference === void 0 || routeReference.length === 0 ? {} : { routeReference }\n });\n }\n }\n handleControllerSnapshot(snapshot) {\n this.latestCheckoutSnapshot = snapshot;\n if (snapshot.payment_methods !== void 0) {\n this.swapOptions = snapshot.payment_methods;\n this.swapOptionsLoaded = true;\n }\n const swapInvoice = snapshot.invoices.find(\n (invoice) => invoice.rail === \"swap\" && invoice.swap !== void 0\n );\n if (swapInvoice !== void 0) {\n this.startedSwapInvoice = swapInvoice;\n }\n const displayKey = checkoutSnapshotDisplayKey(snapshot);\n if (this.lastSnapshotDisplayKey === displayKey) return;\n this.lastSnapshotDisplayKey = displayKey;\n this.render();\n }\n render() {\n this.captureRefundAddressDraft();\n const invoiceAttr = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice);\n const deferredReady = this.isCreateMode() && this.latestCheckoutSnapshot !== void 0 && (invoiceAttr === null || invoiceAttr === \"\");\n if ((invoiceAttr === null || invoiceAttr === \"\") && !deferredReady) {\n if (this.isCreateMode()) {\n const { root: root2, inlineStyles: inlineStyles2 } = this.prepareShadowRoot();\n if (this.session.createError !== void 0) {\n root2.innerHTML = renderCheckoutCreateErrorHtml(this.session.createError, {\n theme: this.resolveTheme(),\n inlineStyles: inlineStyles2\n });\n root2.querySelector('[part=\"retry\"]')?.addEventListener(\"click\", () => this.session.retryCreateCheckout());\n return;\n }\n root2.innerHTML = renderCheckoutCreatingHtml({\n theme: this.resolveTheme(),\n inlineStyles: inlineStyles2\n });\n return;\n }\n this.replaceChildren();\n return;\n }\n const invoiceId = parseElementInvoiceId(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoiceId)\n );\n const invoice = invoiceAttr ?? \"\";\n const lightningRequested = !this.isCreateMode() || this.session.lightningRequested || invoice.length > 0;\n const decodeLinkUrl = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.decodeLinkUrl) ?? void 0;\n const selectedQuote = this.selectedSwapAsset === null ? void 0 : this.session.swapQuotes[this.selectedSwapAsset];\n const unavailableSwapQuote = selectedQuote?.available === false ? selectedQuote : void 0;\n const { root, inlineStyles } = this.prepareShadowRoot();\n root.innerHTML = renderCheckoutHtml({\n inlineStyles,\n ...decodeLinkUrl === void 0 ? {} : { decodeLinkUrl },\n invoice_id: invoiceId,\n invoice,\n rail: parseElementRail(this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.rail)),\n payment_hash: this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentHash) ?? void 0,\n amount_msats: readElementAmountMsats(this),\n fiat_quote: readElementFiatQuote(this),\n status: parseElementStatus(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.status)\n ),\n expires_at: readElementExpiresAt(this),\n // Host-owned order context, straight off the polled snapshot: the\n // element has no attribute for it because the payer must never be able\n // to write the copy next to the amount.\n ...this.latestCheckoutSnapshot?.description === void 0 ? {} : { description: this.latestCheckoutSnapshot.description },\n theme: this.resolveTheme(),\n payment_wizard: parseBooleanAttribute(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentWizard)\n ),\n lightningRequested: this.session.mintingLightning ? false : lightningRequested,\n mintingLightning: this.session.mintingLightning,\n wizard: {\n selectedMethod: this.selection.selectedMethod,\n selectedBitcoinRoute: this.selection.selectedBitcoinRoute,\n swapOptions: this.swapOptions,\n currenciesLoading: !this.swapOptionsLoaded,\n selectedSwapAssetByGroup: this.selectedSwapAssetByGroup,\n selectedPickerKey: this.selectedPickerKey,\n startingSwapAsset: this.session.startingSwapAsset,\n selectedSwapAsset: this.selectedSwapAsset,\n resumable: this.isResumable(),\n ...this.latestCheckoutSnapshot?.amount_msats === void 0 ? {} : { amountMsats: this.latestCheckoutSnapshot.amount_msats },\n ...this.latestCheckoutSnapshot?.fiat === void 0 ? {} : { fiat: this.latestCheckoutSnapshot.fiat },\n ...this.latestCheckoutSnapshot?.reference === void 0 ? {} : { reference: this.latestCheckoutSnapshot.reference },\n ...this.latestCheckoutSnapshot?.checkout_id === void 0 ? {} : { checkoutId: this.latestCheckoutSnapshot.checkout_id },\n lightningInvoice: invoice,\n ...decodeLinkUrl === void 0 ? {} : { decodeLinkUrl },\n ...this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentHash) === null ? {} : {\n paymentHash: this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentHash) ?? void 0\n },\n swapInvoice: this.currentSwapInvoice(),\n activeTutorialProviderId: this.activeTutorialProviderId,\n activeTutorialIndex: this.activeTutorialIndex,\n activeTutorialCopied: this.activeTutorialCopied,\n ...this.session.swapStartError === void 0 ? {} : { swapStartError: this.session.swapStartError },\n ...unavailableSwapQuote === void 0 ? {} : { unavailableSwapQuote },\n ...this.latestCheckoutSnapshot === void 0 ? {} : { swapLimitContext: this.latestCheckoutSnapshot },\n ...this.session.wizardError === void 0 ? {} : { wizardError: this.session.wizardError }\n },\n ...this.lastCheckoutState === void 0 ? {} : { liveState: this.lastCheckoutState }\n });\n const copyButton = root.querySelector(OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS.copy);\n if (invoice.length > 0) {\n copyButton?.addEventListener(\"click\", () => {\n void (this.controller?.copyInvoice() ?? copyInvoice({ invoice, logger: options.logger })).then(() => {\n showElementCopyFeedback(copyButton);\n this.dispatchEvent(\n createCheckoutActionEvent(OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.copy)\n );\n }).catch((error) => this.dispatchError(error));\n });\n }\n root.querySelector(OPENRECEIVE_CHECKOUT_ELEMENT_PART_SELECTORS.startOver)?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n createCheckoutActionEvent(OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.startOver)\n );\n });\n const qrTarget = root.querySelector(OPENRECEIVE_CHECKOUT_DATA_SELECTORS.qr);\n if (qrTarget !== null && invoice.length > 0) {\n void createQrSvg(invoice, {\n encoder: options.qrEncoder,\n width: 256\n }).then((svg) => {\n if (this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice) !== invoice) {\n return;\n }\n qrTarget.innerHTML = svg;\n }).catch((error) => this.dispatchError(error));\n }\n this.bindWizard(root, invoice, options.logger);\n this.renderSwapQrCodes(root);\n }\n /**\n * Shadow root plus the shared compiled stylesheet. `inlineStyles` is true only\n * where constructable stylesheets are unavailable and the markup must carry a\n * `<style>` of its own.\n */\n prepareShadowRoot() {\n const root = this.shadowRoot ?? this.attachShadow({ mode: \"open\" });\n return { root, inlineStyles: !adoptCheckoutStyles(root) };\n }\n captureRefundAddressDraft() {\n const root = this.shadowRoot;\n if (root === null) return;\n const input = root.querySelector(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapRefundAddress);\n if (!(input instanceof HTMLInputElement) || input.type === \"hidden\") return;\n this.refundAddressDraft = input.value;\n this.refundAddressDraftFocused = root.activeElement === input;\n this.refundAddressDraftSelectionStart = input.selectionStart;\n this.refundAddressDraftSelectionEnd = input.selectionEnd;\n }\n clearRefundAddressDraft() {\n this.refundAddressDraft = \"\";\n this.refundAddressDraftFocused = false;\n this.refundAddressDraftSelectionStart = null;\n this.refundAddressDraftSelectionEnd = null;\n }\n startCheckoutController() {\n const attributeSnapshot = this.currentCheckoutSnapshot();\n const latest = this.latestCheckoutSnapshot;\n const chosen = latest?.active?.rail === \"swap\" ? latest : attributeSnapshot ?? latest;\n const snapshot = chosen !== void 0 && chosen.description === void 0 && latest?.description !== void 0 && latest.reference === chosen.reference ? { ...chosen, description: latest.description } : chosen;\n const prefix = this.resolvePollPrefix(snapshot?.reference);\n if (snapshot === void 0) {\n this.stopCheckoutController();\n return;\n }\n const polling = parseBooleanAttribute(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.polling)\n ) !== false;\n const pollIntervalMs = parseOptionalInteger(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.pollIntervalMs),\n { label: \"poll-interval-ms\" }\n );\n const csrfHeader = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.csrfHeader);\n this.stopCheckoutController();\n this.controller = createCheckoutController({\n snapshot,\n ...prefix === void 0 ? {} : { prefix },\n ...csrfHeader === null || csrfHeader.length === 0 ? {} : { csrfHeader },\n polling,\n ...pollIntervalMs === void 0 ? {} : { pollIntervalMs },\n logger: options.logger,\n onError: (error) => this.dispatchError(error),\n onState: (nextState) => this.applyCheckoutState(nextState),\n onSnapshot: (snapshot2) => this.handleControllerSnapshot(snapshot2)\n });\n this.controller.start();\n void this.controller.reloadState().catch((error) => this.dispatchError(error));\n }\n stopCheckoutController() {\n this.controller?.stop();\n this.controller = void 0;\n }\n /**\n * The mount every server route is derived from, matching React snapshot\n * mode: the `prefix` attribute, default `/openreceive`. Answers `undefined`\n * when there is no order to act on \u2014 nothing to poll, nothing to swap.\n */\n resolvePollPrefix(reference) {\n const id = reference ?? this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.reference);\n if (id === null || id === void 0 || id.length === 0) return void 0;\n return this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.prefix) ?? OPENRECEIVE_DEFAULT_PREFIX2;\n }\n currentCheckoutSnapshot() {\n const reference = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.reference);\n const invoiceId = parseElementInvoiceId(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoiceId)\n );\n const invoice = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.invoice);\n if (invoiceId === void 0 || invoice === null) return void 0;\n const amountMsats = readElementAmountMsats(this);\n const expiresAt = readElementExpiresAt(this);\n const fiatQuote = readElementFiatQuote(this);\n const paymentHash = this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.paymentHash);\n return createCheckoutSnapshotFromInvoice2(\n {\n invoice_id: invoiceId,\n invoice,\n rail: parseElementRail(this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.rail)),\n ...paymentHash === null ? {} : { payment_hash: paymentHash },\n ...amountMsats === void 0 ? {} : { amount_msats: amountMsats },\n ...fiatQuote === void 0 ? {} : { fiat_quote: fiatQuote },\n transaction_state: transactionStateFromStatus(\n parseElementStatus(this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.status)) ?? \"pending\"\n ),\n ...expiresAt === void 0 ? {} : { expires_at: expiresAt }\n },\n { ...reference === null ? {} : { reference } }\n );\n }\n applyCheckoutState(state) {\n const previous = this.lastCheckoutState;\n this.lastCheckoutState = state;\n this.session.writeOwnAttributes(() => {\n this.setAttributeIfChanged(\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.status,\n deriveStatus2(state)\n );\n if (state.expires_at !== void 0) {\n this.setAttributeIfChanged(\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.expiresAt,\n String(state.expires_at)\n );\n }\n });\n if (previous !== void 0 && this.isCountdownOnlyTick(previous, state)) {\n this.updateCountdownText(state);\n } else {\n this.render();\n }\n this.dispatchEvent(\n createCheckoutStateEvent(OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.state, state)\n );\n if (state.settled && state.reference !== this.announcedSettledReference) {\n this.announcedSettledReference = state.reference;\n this.dispatchEvent(\n createCheckoutStateEvent(OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.settled, state)\n );\n }\n }\n isCountdownOnlyTick(previous, next) {\n return previous.checkout_id === next.checkout_id && previous.invoice_id === next.invoice_id && previous.invoice === next.invoice && previous.rail === next.rail && previous.payment_hash === next.payment_hash && previous.transaction_state === next.transaction_state && previous.workflow_state === next.workflow_state && previous.phase === next.phase && previous.settled === next.settled && previous.terminal === next.terminal && previous.paid === next.paid && previous.expires_at === next.expires_at && previous.swap?.provider_state === next.swap?.provider_state;\n }\n /** Patch the countdown text nodes without rebuilding the shadow DOM. */\n updateCountdownText(state) {\n const root = this.shadowRoot;\n if (root === null) return;\n const model = createCheckoutStatusModel2(state);\n const countdown = root.querySelector('[part=\"countdown\"] strong');\n if (countdown !== null && model.countdownLabel !== void 0) {\n countdown.textContent = model.countdownLabel;\n }\n const swapInvoice = this.currentSwapInvoice();\n if (swapInvoice !== void 0) {\n const display = createSwapDisplayModel3(swapInvoice, { resumable: this.isResumable() });\n const swapCountdown = root.querySelector('[part=\"swap-countdown\"]');\n if (swapCountdown !== null && display !== void 0) {\n swapCountdown.textContent = display.countdownLabel;\n }\n }\n }\n setAttributeIfChanged(name, value) {\n if (this.getAttribute(name) !== value) this.setAttribute(name, value);\n }\n bindWizard(root, invoice, logger) {\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.method).forEach((button) => {\n button.addEventListener(\"click\", () => {\n if (button.hasAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.pickerContinue)) return;\n if (button.hasAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.pickerSelect)) return;\n const method = parsePaymentMethod(\n button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.method)\n );\n if (method === null) return;\n this.selectedPickerKey = null;\n this.selection = updatePaymentWizardSelection(this.selection, {\n type: \"select_method\",\n method\n });\n if (method === \"bitcoin\") {\n void this.session.ensureLightning();\n }\n this.render();\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.pickerSelect).forEach((button) => {\n button.addEventListener(\"click\", () => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n const key = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.pickerSelect);\n if (key === null || key.length === 0) return;\n const selection = resolveWizardSelection({\n pickerKey: key,\n previousKey: this.selectedPickerKey,\n entries: buildMethodGridEntries2(paymentMethods2, this.swapOptions),\n selectedAssetByGroup: this.selectedSwapAssetByGroup\n });\n if (selection.kind === \"none\") return;\n if (selection.kind === \"select_method\") {\n const method = parsePaymentMethod(selection.methodId);\n if (method === null) return;\n this.selectedPickerKey = null;\n this.selection = updatePaymentWizardSelection(this.selection, {\n type: \"select_method\",\n method\n });\n if (method === \"bitcoin\") {\n void this.session.ensureLightning();\n }\n this.render();\n return;\n }\n if (selection.kind === \"start_swap\") {\n this.selectedPickerKey = null;\n void this.session.startSwap(selection.payInAsset);\n return;\n }\n this.selectedPickerKey = key;\n this.selectedSwapAssetByGroup = selection.selectedAssetByGroup;\n this.render();\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.pickerContinue).forEach((button) => {\n button.addEventListener(\"click\", () => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n const method = parsePaymentMethod(\n button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.method)\n );\n if (method !== null) {\n this.selection = updatePaymentWizardSelection(this.selection, {\n type: \"select_method\",\n method\n });\n this.render();\n return;\n }\n const payInAsset = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapStart);\n if (payInAsset === null) return;\n markElementConfirmButtonBusy(button);\n void this.session.startSwap(payInAsset);\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.breadcrumb).forEach((button) => {\n button.addEventListener(\"click\", () => {\n const target = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.breadcrumb);\n if (target === \"swap-asset\") {\n this.session.clearSwapStartError();\n this.selectedSwapAsset = null;\n this.selectedPickerKey = null;\n this.selectedSwapAssetByGroup = {};\n this.render();\n return;\n }\n if (target === \"method\") {\n this.selection = updatePaymentWizardSelection(this.selection, {\n type: \"change_method\"\n });\n this.render();\n return;\n }\n if (target === \"route\") {\n this.selection = updatePaymentWizardSelection(this.selection, {\n type: \"change_route\"\n });\n this.render();\n }\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.route).forEach((button) => {\n button.addEventListener(\"click\", () => {\n const route = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.route);\n if (route === null) return;\n this.selection = updatePaymentWizardSelection(this.selection, {\n type: \"select_route\",\n route\n });\n this.render();\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapStart).forEach((button) => {\n button.addEventListener(\"click\", () => {\n if (button.hasAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.pickerContinue)) return;\n const payInAsset = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapStart);\n if (payInAsset === null) return;\n if (button instanceof HTMLButtonElement) markElementConfirmButtonBusy(button);\n void this.session.startSwap(payInAsset);\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapNetworkValue).forEach((button) => {\n button.addEventListener(\"click\", () => {\n if (!(button instanceof HTMLButtonElement) || button.disabled) return;\n const groupKey = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapNetwork);\n const payInAsset = button.getAttribute(\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapNetworkValue\n );\n if (groupKey === null || groupKey.length === 0 || payInAsset === null) return;\n const details = button.closest(\"details\");\n if (details instanceof HTMLDetailsElement) details.open = false;\n this.selectedSwapAssetByGroup = {\n ...this.selectedSwapAssetByGroup,\n [groupKey]: payInAsset\n };\n this.render();\n });\n });\n root.querySelector(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapBack)?.addEventListener(\"click\", () => {\n const current = this.currentSwapInvoice();\n this.session.clearSwapStartError();\n this.dismissedSwapInvoiceId = current?.invoice_id ?? null;\n this.selectedSwapAsset = null;\n this.selectedPickerKey = null;\n this.selectedSwapAssetByGroup = {};\n this.clearRefundAddressDraft();\n this.controller?.clearSwapRefundStaging();\n void this.session.ensureLightning();\n this.render();\n });\n wireSwapSelectAllInputs(root);\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapCopy).forEach((button) => {\n button.addEventListener(\"click\", () => {\n const value = button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapCopy);\n if (value === null) return;\n void globalThis.navigator?.clipboard?.writeText(value).then(() => showElementCopyFeedback(button)).catch((error) => this.dispatchError(error));\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapRefundForm).forEach((form) => {\n const input = form.querySelector(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapRefundAddress);\n const errorEl = form.querySelector(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapRefundError);\n const payInAsset = form.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapRefundPayInAsset) ?? \"\";\n const networkLabel = form.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapRefundNetworkLabel) ?? \"refund\";\n const setRefundAddressError = (message) => {\n if (input instanceof HTMLInputElement) {\n input.className = message === void 0 ? orClasses7.swapRefundInput : orClasses7.swapRefundInputInvalid;\n if (message === void 0) input.removeAttribute(\"aria-invalid\");\n else input.setAttribute(\"aria-invalid\", \"true\");\n }\n if (errorEl instanceof HTMLElement) {\n if (message === void 0) {\n errorEl.textContent = \"\";\n errorEl.hidden = true;\n } else {\n errorEl.textContent = message;\n errorEl.hidden = false;\n }\n }\n };\n const validateRefundAddress = (address, showEmpty) => {\n if (address.length === 0 && !showEmpty) return void 0;\n return getSwapRefundFormError(payInAsset, address, networkLabel);\n };\n if (input instanceof HTMLInputElement && input.type !== \"hidden\") {\n if (this.refundAddressDraft.length > 0) {\n input.value = this.refundAddressDraft;\n }\n input.addEventListener(\"input\", () => {\n this.refundAddressDraft = input.value;\n const address = input.value.trim();\n if (address.length === 0) {\n setRefundAddressError(void 0);\n return;\n }\n setRefundAddressError(validateRefundAddress(address, false));\n });\n input.addEventListener(\"blur\", () => {\n const address = input.value.trim();\n if (address.length === 0) return;\n setRefundAddressError(validateRefundAddress(address, false));\n });\n if (this.refundAddressDraftFocused) {\n input.focus();\n const start = this.refundAddressDraftSelectionStart ?? input.value.length;\n const end = this.refundAddressDraftSelectionEnd ?? input.value.length;\n input.setSelectionRange(start, end);\n }\n const restoredError = validateRefundAddress(input.value.trim(), false);\n if (restoredError !== void 0) setRefundAddressError(restoredError);\n }\n form.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n const attemptId = form.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapRefundForm);\n const refundAllowed = form.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapRefundAllowed) === \"true\";\n const confirm = form.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapRefundConfirm) === \"true\";\n const refundAddress = input instanceof HTMLInputElement ? input.value.trim() : \"\";\n if (attemptId === null || !refundAllowed) return;\n const error = validateRefundAddress(refundAddress, true);\n if (error !== void 0) {\n setRefundAddressError(error);\n return;\n }\n setRefundAddressError(void 0);\n void this.refundSwap(attemptId, refundAddress, confirm);\n });\n });\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.providerTutorial).forEach((button) => {\n button.addEventListener(\"click\", () => {\n const providerId = button.getAttribute(\n OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.providerTutorial\n );\n if (providerId === null) return;\n if (providerId === \"\") {\n this.activeTutorialProviderId = null;\n this.activeTutorialIndex = 0;\n this.activeTutorialCopied = false;\n this.render();\n return;\n }\n const index = Number(\n button.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.providerTutorialIndex) ?? \"0\"\n );\n if (this.activeTutorialProviderId !== providerId) {\n this.activeTutorialCopied = false;\n }\n this.activeTutorialProviderId = providerId;\n this.activeTutorialIndex = Number.isSafeInteger(index) && index >= 0 ? index : 0;\n this.loadTutorialImages();\n this.render();\n });\n });\n root.querySelector('[part=\"tutorial-copy\"]')?.addEventListener(\"click\", () => {\n void copyInvoice({ invoice, logger }).then(() => {\n this.activeTutorialCopied = true;\n if (this.activeTutorialProviderId !== null) {\n this.dispatchEvent(createCheckoutProviderCopyEvent(this.activeTutorialProviderId));\n }\n this.dispatchEvent(createCheckoutActionEvent(OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS.copy));\n this.render();\n }).catch((error) => this.dispatchError(error));\n });\n const tutorial = root.querySelector('[part=\"tutorial\"]');\n tutorial?.addEventListener(\"click\", (event) => {\n if (event.target !== event.currentTarget) return;\n this.activeTutorialProviderId = null;\n this.activeTutorialIndex = 0;\n this.activeTutorialCopied = false;\n this.render();\n });\n tutorial?.addEventListener(\"keydown\", (event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (event.key !== \"Escape\" || this.activeTutorialProviderId === null) return;\n this.activeTutorialProviderId = null;\n this.activeTutorialIndex = 0;\n this.activeTutorialCopied = false;\n this.render();\n });\n if (tutorial instanceof HTMLElement && this.activeTutorialProviderId !== null && this.focusedTutorialProviderId !== this.activeTutorialProviderId) {\n this.focusedTutorialProviderId = this.activeTutorialProviderId;\n tutorial.focus();\n }\n if (this.activeTutorialProviderId === null) {\n this.focusedTutorialProviderId = null;\n }\n }\n async refundSwap(attemptId, refundAddress, confirm) {\n const controller = this.controller;\n if (controller === void 0) return;\n const action = this.session.capture();\n try {\n const invoice = confirm ? await controller.confirmSwapRefund({ attemptId, refundAddress }) : await controller.stageSwapRefund({ attemptId, refundAddress });\n if (!action.isCurrent() || this.controller !== controller) return;\n this.startedSwapInvoice = invoice;\n this.dismissedSwapInvoiceId = null;\n this.render();\n } catch (error) {\n if (action.isCurrent() && this.controller === controller) this.dispatchError(error);\n }\n }\n currentSwapInvoice() {\n return selectCurrentSwapInvoice(this.latestCheckoutSnapshot, {\n started: this.startedSwapInvoice,\n dismissedInvoiceId: this.dismissedSwapInvoiceId\n });\n }\n renderSwapQrCodes(root) {\n root.querySelectorAll(OPENRECEIVE_PAYMENT_WIZARD_SELECTORS3.swapQr).forEach((target) => {\n const payload = target.getAttribute(OPENRECEIVE_PAYMENT_WIZARD_ATTRIBUTES7.swapQr);\n if (payload === null) return;\n void createQrPayloadSvg(payload, {\n encoder: options.qrEncoder,\n width: 220\n }).then((svg) => {\n target.innerHTML = svg;\n }).catch((error) => this.dispatchError(error));\n });\n }\n currentThemeOption() {\n const theme = parseResolvedTheme(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.theme)\n );\n return theme === void 0 ? {} : { theme };\n }\n /** Explicit `theme` attr wins; otherwise inherit nearest ancestor `[data-theme]`. */\n resolveTheme() {\n const attr = parseResolvedTheme(\n this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.theme)\n );\n if (attr !== void 0) return attr;\n const ancestor = this.closest(\"[data-theme]\");\n const inherited = parseResolvedTheme(ancestor?.getAttribute(\"data-theme\"));\n if (inherited !== void 0) return inherited;\n return \"light\";\n }\n syncThemeAncestorObserver() {\n const hasOwnTheme = parseResolvedTheme(this.getAttribute(OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES3.theme)) !== void 0;\n if (hasOwnTheme) {\n this.stopThemeAncestorObserver();\n return;\n }\n const ancestor = this.closest(\"[data-theme]\");\n if (ancestor === this.observedThemeAncestor && this.themeAncestorObserver !== void 0) {\n return;\n }\n this.stopThemeAncestorObserver();\n if (ancestor === null) return;\n const MutationObserverCtor = globalThis.MutationObserver;\n if (MutationObserverCtor === void 0) return;\n this.observedThemeAncestor = ancestor;\n this.themeAncestorObserver = new MutationObserverCtor(() => {\n this.render();\n this.syncThemeAncestorObserver();\n });\n this.themeAncestorObserver.observe(ancestor, {\n attributes: true,\n attributeFilter: [\"data-theme\"]\n });\n }\n stopThemeAncestorObserver() {\n this.themeAncestorObserver?.disconnect();\n this.themeAncestorObserver = void 0;\n this.observedThemeAncestor = null;\n }\n dispatchError(error) {\n this.dispatchEvent(createCheckoutErrorEvent(error));\n }\n }\n class ThemeToggleElement extends HTMLElementCtor {\n observer;\n observedTarget = null;\n static get observedAttributes() {\n return [\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.rootSelector,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.checkoutSelector,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.defaultTheme,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.storageKey\n ];\n }\n connectedCallback() {\n this.render();\n this.startObserver();\n }\n attributeChangedCallback() {\n if (!this.isConnected) return;\n this.render();\n this.startObserver();\n }\n disconnectedCallback() {\n this.stopObserver();\n }\n render() {\n const root = this.shadowRoot ?? this.attachShadow({ mode: \"open\" });\n const inlineStyles = !adoptCheckoutStyles(root);\n const theme = this.syncTheme();\n root.innerHTML = renderThemeToggleHtml(theme.toggleLabel, { inlineStyles });\n root.querySelector(OPENRECEIVE_THEME_TOGGLE_ELEMENT_PART_SELECTORS.button)?.addEventListener(\"click\", () => {\n const nextTheme = toggleStoredThemeControls(this.themeTargets(), this.themeOptions());\n this.dispatchEvent(createThemeChangeEvent(nextTheme));\n this.render();\n });\n }\n syncTheme() {\n return syncStoredThemeControls(this.themeTargets(), this.themeOptions());\n }\n /**\n * Watch only what can invalidate the toggle: the theme attributes it mirrors,\n * and children arriving under the same wrapper (a checkout element mounted\n * after the toggle). Observing the whole page body with `subtree` ran a\n * querySelector sweep on every unrelated DOM mutation on the host page.\n */\n startObserver() {\n const MutationObserverCtor = globalThis.MutationObserver;\n if (MutationObserverCtor === void 0) return;\n const target = this.themeTargets().root ?? this.ownerDocument.documentElement;\n if (target === null || target === void 0) return;\n if (this.observer !== void 0 && this.observedTarget === target) return;\n this.stopObserver();\n this.observedTarget = target;\n this.observer = new MutationObserverCtor(() => {\n this.syncTheme();\n });\n this.observer.observe(target, {\n attributes: true,\n attributeFilter: [\"data-theme\", \"data-openreceive-theme\"],\n childList: true\n });\n }\n stopObserver() {\n this.observer?.disconnect();\n this.observer = void 0;\n this.observedTarget = null;\n }\n themeTargets() {\n const rootSelector = this.getAttribute(\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.rootSelector\n );\n const checkoutSelector = this.getAttribute(\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.checkoutSelector\n );\n const button = this.shadowRoot?.querySelector(OPENRECEIVE_THEME_TOGGLE_ELEMENT_PART_SELECTORS.button) ?? null;\n const defaultRoot = this.closest(\"[data-openreceive-theme]\");\n return {\n root: rootSelector === null ? defaultRoot ?? void 0 : this.ownerDocument.querySelector(rootSelector) ?? void 0,\n checkout: checkoutSelector === null ? defaultRoot?.querySelector(tagName) ?? void 0 : this.ownerDocument.querySelector(checkoutSelector) ?? void 0,\n toggle: button\n };\n }\n themeOptions() {\n const defaultTheme = parseThemePreference(\n this.getAttribute(OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.defaultTheme)\n );\n return {\n ...defaultTheme === void 0 ? {} : { defaultTheme },\n ...this.getAttribute(OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.storageKey) === null ? {} : {\n storageKey: this.getAttribute(OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES.storageKey) ?? void 0\n }\n };\n }\n }\n if (registry.get(tagName) === void 0) {\n registry.define(tagName, CheckoutElement);\n }\n if (registry.get(themeToggleTagName) === void 0) {\n registry.define(themeToggleTagName, ThemeToggleElement);\n }\n}\n\nexport {\n renderTransactionDetailsHtml,\n createTransactionDetailsElement,\n renderCheckoutHtml,\n renderCheckoutCreateErrorHtml,\n renderThemeToggleHtml,\n defineElements,\n createThemeToggleElement,\n OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES4 as OPENRECEIVE_CHECKOUT_ELEMENT_ATTRIBUTES,\n OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS2 as OPENRECEIVE_CHECKOUT_ELEMENT_EVENTS,\n OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME2 as OPENRECEIVE_CHECKOUT_ELEMENT_TAG_NAME,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES2 as OPENRECEIVE_THEME_TOGGLE_ELEMENT_ATTRIBUTES,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_EVENTS,\n OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME2 as OPENRECEIVE_THEME_TOGGLE_ELEMENT_TAG_NAME\n};\n", "export * from \"./index.js\";\nimport { defineElements } from \"./index.js\";\ndefineElements();\n"],
5
+ "mappings": "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CV,EACA,CACE,SAAY,YACZ,KAAQ,EACV,EACA,CACE,SAAY,QACZ,KAAQ,EACV,EACA,CACE,SAAY,QACZ,KAAQ,EACV,EACA,CACE,SAAY,cACZ,KAAQ,EACV,EACA,CACE,SAAY,WACZ,KAAQ,EACV,EACA,CACE,SAAY,QACZ,KAAQ,EACV,EACA,CACE,SAAY,SACZ,KAAQ,EACV,EACA,CACE,SAAY,QACZ,KAAQ,EACV,EACA,CACE,SAAY,UACZ,KAAQ,EACV,EACA,CACE,SAAY,YACZ,KAAQ,EACV,EACA,CACE,SAAY,OACZ,KAAQ,EACV,EACA,CACE,SAAY,QACZ,KAAQ,EACV,EACA,CACE,SAAY,OACZ,KAAQ,EACV,EACA,CACE,SAAY,OACZ,KAAQ,EACV,EACA,CACE,SAAY,QACZ,KAAQ,EACV,CACF,CACF,EACA,CACE,GAAM,OACN,OAAU,OACV,MAAS,iCACT,UAAa,CACX,CACE,SAAY,OACd,EACA,CACE,SAAY,YACd,EACA,CACE,SAAY,QACd,CACF,CACF,EACA,CACE,GAAM,OACN,OAAU,OACV,MAAS,kBACT,UAAa,CACX,CACE,SAAY,OACd,EACA,CACE,SAAY,YACd,EACA,CACE,SAAY,UACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,CACF,CACF,EACA,CACE,GAAM,MACN,OAAU,MACV,MAAS,iBACT,UAAa,CACX,CACE,SAAY,YACd,EACA,CACE,SAAY,WACd,EACA,CACE,SAAY,UACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,CACF,CACF,EACA,CACE,GAAM,MACN,OAAU,MACV,MAAS,eACT,UAAa,CACX,CACE,SAAY,YACd,EACA,CACE,SAAY,WACd,CACF,CACF,EACA,CACE,GAAM,MACN,OAAU,MACV,MAAS,iBACT,UAAa,CACX,CACE,SAAY,YACd,EACA,CACE,SAAY,WACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,UACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,CACF,CACF,EACA,CACE,GAAM,MACN,OAAU,MACV,MAAS,aACT,UAAa,CACX,CACE,SAAY,YACd,EACA,CACE,SAAY,QACd,CACF,CACF,EACA,CACE,GAAM,MACN,OAAU,MACV,MAAS,eACT,UAAa,CACX,CACE,SAAY,YACd,EACA,CACE,SAAY,WACd,EACA,CACE,SAAY,UACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,CACF,CACF,EACA,CACE,GAAM,MACN,OAAU,MACV,MAAS,MACT,UAAa,CACX,CACE,SAAY,YACd,EACA,CACE,SAAY,UACd,EACA,CACE,SAAY,QACd,EACA,CACE,SAAY,QACd,CACF,CACF,CACF,EACA,uBAA0B,CACxB,CACE,GAAM,QACN,KAAQ,QACR,IAAO,oBACP,OAAU,iHACZ,EACA,CACE,GAAM,YACN,KAAQ,YACR,IAAO,wBACP,OAAU,6GACZ,EACA,CACE,GAAM,gBACN,KAAQ,iBACR,IAAO,4BACP,OAAU,gHACZ,EACA,CACE,GAAM,WACN,KAAQ,WACR,IAAO,uBACP,OAAU,8GACZ,EACA,CACE,GAAM,QACN,KAAQ,aACR,IAAO,mBACP,OAAU,0GACZ,EACA,CACE,GAAM,QACN,KAAQ,gBACR,IAAO,2BACP,OAAU,sFACZ,EACA,CACE,GAAM,aACN,KAAQ,aACR,IAAO,yBACP,OAAU,2GACZ,CACF,CACF,EC92BA,IAAI,OACJ,IAAI,QAOG,SAAS,uBAAoD,CAClE,UAAY,qFAA6C,KAAM,QAAW,CACxE,OAAS,OAAO,kBAChB,OAAO,MACT,CAAC,EACD,OAAO,OACT,CAOO,SAAS,iBAAiB,KAAkC,CACjE,OAAO,SAAS,IAAI,CACtB,CC1BO,IAAM,mBAAuD,OAAO,OAAO,CAChF,kCACE,ssBACF,kCACE,0kBACF,qCACE,k1DACF,kCACE,0+CACF,sCACE,02BACF,oCACE,02DACF,oCACE,87CACF,mCACE,0uCACF,kCACE,kqCACF,mCACE,06EACF,wCACE,8XACF,mCACE,0wFACF,qCACE,kmCACF,yCACE,k0DACF,qCACE,sYACF,mCACE,k3CACF,sCACE,8m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",
6
+ "names": ["module", "require_utils", "gap", "href", "paymentMethods", "entry", "state", "paymentMethods", "status", "registry"]
7
+ }