@cofhe/react 0.3.1 → 0.4.0
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.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/unreachable-case-error/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/assert/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/create-factory-with-constraint/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/is-exact/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/noop/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/index.ts","../src/providers/CofheProvider.tsx","../src/providers/QueryProvider.tsx","../src/utils/cn.ts","../src/utils/utils.ts","../src/types/token.ts","../src/utils/logging.ts","../src/utils/debounce.ts","../src/utils/waitUntilRpcAwareAndReadContract.ts","../src/components/FnxFloatingButton/FloatingButtonComponent.tsx","../src/components/FnxFloatingButton/FnxFloatingButtonContext.tsx","../src/utils/bigintJson.ts","../src/stores/transactionStore.ts","../src/hooks/useCofheConnection.ts","../src/hooks/useTrackPendingTransactions.ts","../src/hooks/useCofheReadContract.ts","../src/hooks/useCofhePermits.ts","../src/hooks/useIsCofheErrorActive.ts","../src/constants/confidentialTokenABIs.ts","../src/hooks/useCofheTokenLists.ts","../src/hooks/useCofheTokenPublicBalance.ts","../src/constants/erc20ABIs.ts","../src/utils/format.ts","../src/hooks/useCofheTokenClaimable.ts","../src/utils/decryptionAwareReadContract.ts","../src/stores/decryptionWatchingStore.ts","../src/hooks/useIsWaitingForDecryptionToInvalidate.ts","../src/hooks/useStoredTransactions.ts","../src/hooks/usePendingTransactions.ts","../src/stores/portalModalStore.tsx","../src/stores/portalUIStore.tsx","../src/stores/portalStatuses.tsx","../src/stores/portalNavigationStore.tsx","../src/components/FnxFloatingButton/components/ToastPrimitives.tsx","../src/components/FnxFloatingButton/components/HashLink.tsx","../src/stores/portalToasts.tsx","../src/hooks/useTransactionGlobalLifecycle.ts","../src/hooks/useTrackDecryptingTransactions.ts","../src/hooks/useTransactionReceiptsByHash.ts","../src/hooks/useCofheReadDecryptionResults.ts","../src/hooks/useCofheClient.ts","../src/hooks/useCofheTokenDecryptedBalance.ts","../src/hooks/useCofheReadContractAndDecrypt.ts","../src/hooks/useCofheDecrypt.ts","../src/hooks/useCofheTokenTransfer.ts","../src/hooks/useCofheEncryptAndWriteContract.ts","../src/hooks/useCofheEncrypt.ts","../src/hooks/internal/useStepsState.ts","../src/hooks/useCofheWriteContract.ts","../src/hooks/useCofheTokenShield.ts","../src/hooks/useCofheTokenUnshield.ts","../src/hooks/useStoredTransaction.ts","../src/hooks/useOnceTransactionMined.ts","../src/hooks/useOnceDecrypted.ts","../src/hooks/useCofheTokenClaimUnshielded.ts","../src/hooks/useCofheTokensClaimable.ts","../src/hooks/useNormalizedList.ts","../src/hooks/useIsWaitingForDecryptionByAddress.ts","../src/hooks/useCofheTokensWithExistingEncryptedBalances.ts","../src/hooks/useCofheReadContracts.ts","../src/hooks/useTokensWithPublicBalances.ts","../src/hooks/permits/usePermitDuration.ts","../src/hooks/permits/usePermitForm.ts","../src/stores/portalPersisted.tsx","../src/hooks/permits/useCofheCreatePermitMutation.ts","../src/hooks/permits/usePermitsList.ts","../src/hooks/permits/useCofheNavigateToCreatePermit.tsx","../src/hooks/permits/useReceivePermit.ts","../src/hooks/permits/usePermitDetailsAndActions.ts","../src/hooks/useCopyFeedback.ts","../src/hooks/useCofheAutoConnect.ts","../src/providers/internalQueryHooks.ts","../src/providers/queryUtils.ts","../src/hooks/useCofheConnect.ts","../src/hooks/useReschedulableTimeout.ts","../src/utils/coingecko.ts","../src/hooks/useCoingeckoUsdPrice.ts","../src/hooks/useCoingeckoContractMarketChartRange.ts","../src/hooks/useWatchPermitStatus.ts","../src/hooks/useWatchClaimablesStatus.ts","../src/hooks/useCofheClaimableTokens.ts","../src/components/FhenixLogoIcon.tsx","../src/components/FnxFloatingButton/StatusBarSection.tsx","../src/components/FnxFloatingButton/StatusBarContent.tsx","../src/components/primitives/AnimatedZStack.tsx","../src/components/FnxFloatingButton/ContentSection.tsx","../src/components/FnxFloatingButton/pages/MainPage/WalletHeader.tsx","../src/components/FnxFloatingButton/components/AddressButton.tsx","../src/components/FnxFloatingButton/components/ConnectedChainIndicator.tsx","../src/assets/chains/11155111.svg","../src/assets/chains/84532.svg","../src/components/FnxFloatingButton/components/ChainIcon.tsx","../src/components/FnxFloatingButton/pages/MainPage/AssetCard.tsx","../src/components/FnxFloatingButton/components/TokenIcon.tsx","../src/components/FnxFloatingButton/components/LoadingDots.tsx","../src/components/FnxFloatingButton/components/TokenBalanceView.tsx","../src/components/FnxFloatingButton/components/CofheTokenConfidentialBalance.tsx","../src/hooks/useCofhePinnedTokenAddress.ts","../src/hooks/useCofhePinnedToken.ts","../src/components/FnxFloatingButton/pages/MainPage/BottomNavigation.tsx","../src/components/FnxFloatingButton/components/ActionButton.tsx","../src/components/FnxFloatingButton/components/AmountInput.tsx","../src/components/FnxFloatingButton/components/Button.tsx","../src/components/FnxFloatingButton/components/TokenPriceChart.tsx","../src/components/FnxFloatingButton/components/PageContainer.tsx","../src/components/FnxFloatingButton/components/TransactionItem.tsx","../src/components/FnxFloatingButton/pages/MainPage.tsx","../src/components/FnxFloatingButton/pages/SettingsPage.tsx","../src/components/FnxFloatingButton/stores/settingsStore.ts","../src/components/FnxFloatingButton/pages/permits/PermitsListPage/index.tsx","../src/components/FnxFloatingButton/Accordion.tsx","../src/components/FnxFloatingButton/pages/permits/components/PermitItem.tsx","../src/components/FnxFloatingButton/modals/InfoModalButton.tsx","../src/components/FnxFloatingButton/components/PermitCard.tsx","../src/components/StripedBackground.tsx","../src/components/FnxFloatingButton/pages/permits/GeneratePermitPage/index.tsx","../src/assets/fhenix-permit-icon.svg","../src/components/FnxFloatingButton/pages/permits/components/NameSection.tsx","../src/components/FnxFloatingButton/pages/permits/components/ExpirySection.tsx","../src/components/FnxFloatingButton/pages/permits/DelegatePermitPage/index.tsx","../src/components/FnxFloatingButton/pages/permits/components/ReceiverSection.tsx","../src/components/FnxFloatingButton/pages/permits/ImportPermitPage/index.tsx","../src/assets/fhenix-permit-receive.svg","../src/components/FnxFloatingButton/pages/TokenInfoPage.tsx","../src/components/FnxFloatingButton/pages/TokenInfoBalanceChart.tsx","../src/components/FnxFloatingButton/pages/TokenInfoTransactionHistory.tsx","../src/components/FnxFloatingButton/pages/SendPage.tsx","../src/components/FnxFloatingButton/pages/ShieldPageV2.tsx","../src/hooks/useIsUnshieldingMining.ts","../src/components/FnxFloatingButton/pages/ActivityPage.tsx","../src/components/FnxFloatingButton/pages/DebugPage.tsx","../src/components/FnxFloatingButton/modals/TokenListModal.tsx","../src/components/FnxFloatingButton/components/TokenRow.tsx","../src/components/FnxFloatingButton/pages/PortfolioPage.tsx","../src/components/FnxFloatingButton/pages/ClaimableTokens.tsx","../src/components/FnxFloatingButton/pagesConfig/const.ts","../src/components/FnxFloatingButton/modals/ExampleSelectionPage.tsx","../src/components/FnxFloatingButton/modals/ExampleInfoPage.tsx","../src/components/FnxFloatingButton/modals/PermitDetailsModal.tsx","../src/components/FnxFloatingButton/modals/BaseInfoModal.tsx","../src/components/FnxFloatingButton/modals/PermitTypeInfoModal.tsx","../src/components/FnxFloatingButton/modals/PermitInfoModal.tsx","../src/components/FnxFloatingButton/modals/index.ts","../src/components/FnxFloatingButton/ToastsSection.tsx","../src/components/FnxFloatingButton/FnxFloatingButtonBase.tsx","../src/components/FnxFloatingButton/FnxFloatingButton.tsx","../src/config.ts","../src/components/FnxEncryptInput.tsx","../src/index.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJpbWl0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgc3ltYm9sIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbHQtaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCIuLi9wcmltaXRpdmVcIjtcblxuZXhwb3J0IHR5cGUgQnVpbHRpbiA9IFByaW1pdGl2ZSB8IEZ1bmN0aW9uIHwgRGF0ZSB8IEVycm9yIHwgUmVnRXhwO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIva2V5LW9mLWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEtleW9mQmFzZSA9IGtleW9mIGFueTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4Y2x1ZGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4Y2x1ZGU8VW5pb25UeXBlLCBFeGNsdWRlZE1lbWJlcnMgZXh0ZW5kcyBVbmlvblR5cGU+ID0gRXhjbHVkZTxVbmlvblR5cGUsIEV4Y2x1ZGVkTWVtYmVycz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4dHJhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4dHJhY3Q8VHlwZSwgVW5pb24gZXh0ZW5kcyBQYXJ0aWFsPFR5cGU+PiA9IEV4dHJhY3Q8VHlwZSwgVW5pb24+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LW9taXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgU3RyaWN0T21pdDxUeXBlIGV4dGVuZHMgQW55UmVjb3JkLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgQW55QXJyYXlcbiAgPyBuZXZlclxuICA6IE9taXQ8VHlwZSwgS2V5cz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFdyaXRhYmxlPFR5cGU+ID0geyAtcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXN5bmNPclN5bmM8VHlwZT4gPSBQcm9taXNlTGlrZTxUeXBlPiB8IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy10eXBlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY09yU3luYyB9IGZyb20gXCIuLi9hc3luYy1vci1zeW5jXCI7XG5cbmV4cG9ydCB0eXBlIEFzeW5jT3JTeW5jVHlwZTxBc3luY09yU3luY1R5cGU+ID0gQXN5bmNPclN5bmNUeXBlIGV4dGVuZHMgQXN5bmNPclN5bmM8aW5mZXIgVHlwZT4gPyBUeXBlIDogbmV2ZXI7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5b2ZCYXNlIH0gZnJvbSBcIi4uL2tleS1vZi1iYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c106IFR5cGUgfTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS12YWx1ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBgVmFsdWVPZmAgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5VmFsdWVzPFR5cGU+ID0gVHlwZVtrZXlvZiBUeXBlXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1lcmdlPE9iamVjdDEsIE9iamVjdDI+ID0gUHJldHRpZnk8T21pdDxPYmplY3QxLCBrZXlvZiBPYmplY3QyPiAmIE9iamVjdDI+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2Utbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVyZ2UgfSBmcm9tIFwiLi4vbWVyZ2VcIjtcblxudHlwZSBfTWVyZ2VOPFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFJlc3VsdD4gPSBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IF9NZXJnZU48VGFpbCwgTWVyZ2U8UmVzdWx0LCBIZWFkPj5cbiAgOiBSZXN1bHQ7XG5cbmV4cG9ydCB0eXBlIE1lcmdlTjxUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IF9NZXJnZU48VHVwbGUsIHt9PjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV3YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOZXdhYmxlPFJldHVyblR5cGU+IHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFJldHVyblR5cGU7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLW5ldmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25OZXZlcjxUeXBlIGV4dGVuZHMge30+ID0gUGljazxcbiAgVHlwZSxcbiAgeyBbS2V5IGluIGtleW9mIFR5cGVdOiBUeXBlW0tleV0gZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogS2V5IH1ba2V5b2YgVHlwZV1cbj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb21pdC1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPbWl0UHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7IFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IG5ldmVyIDogS2V5XTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3BhcXVlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFN0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBuZXZlciA6IFR5cGUpIDogbmV2ZXI7XG5cbmRlY2xhcmUgY29uc3QgX19PUEFRVUVfVFlQRV9fOiB1bmlxdWUgc3ltYm9sO1xuXG5leHBvcnQgdHlwZSBXaXRoT3BhcXVlPFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgW19fT1BBUVVFX1RZUEVfX106IFRva2VuO1xufTtcblxuZXhwb3J0IHR5cGUgT3BhcXVlPFR5cGUsIFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IFRva2VuIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbDxUb2tlbj4gPyBUeXBlICYgV2l0aE9wYXF1ZTxUb2tlbj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aC12YWx1ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gVE9ETzogbWVyZ2UgdG8gRXh0cmFjdEZyb21BcnJheVxudHlwZSBFeHRyYWN0RnJvbU9iamVjdDxPYmogZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+LCBLZXk+ID0gS2V5IGV4dGVuZHMga2V5b2YgT2JqXG4gID8gT2JqW0tleV1cbiAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTxPYmo+XG4gID8gTm9uTnVsbGFibGU8T2JqPltLZXldIHwgdW5kZWZpbmVkXG4gIDogdW5kZWZpbmVkO1xuXG4vLyBUT0RPOiBtZXJnZSB0byBFeHRyYWN0RnJvbU9iamVjdFxudHlwZSBFeHRyYWN0RnJvbUFycmF5PEFyciBleHRlbmRzIHJlYWRvbmx5IGFueVtdLCBLZXk+ID0gYW55W10gZXh0ZW5kcyBBcnJcbiAgPyBBcnIgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgVClbXVxuICAgID8gVCB8IHVuZGVmaW5lZFxuICAgIDogdW5kZWZpbmVkXG4gIDogS2V5IGV4dGVuZHMga2V5b2YgQXJyXG4gID8gQXJyW0tleV1cbiAgOiB1bmRlZmluZWQ7XG5cbnR5cGUgR2V0V2l0aEFycmF5PFR5cGUsIFBhdGgsIFByZXR0aWZpZWRUeXBlID0gUHJldHRpZnk8VHlwZT4+ID0gUGF0aCBleHRlbmRzIFtdXG4gID8gVHlwZVxuICA6IFBhdGggZXh0ZW5kcyBbaW5mZXIgS2V5LCAuLi5pbmZlciBSZXN0XVxuICA/IFByZXR0aWZpZWRUeXBlIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPlxuICAgID8gR2V0V2l0aEFycmF5PEV4dHJhY3RGcm9tT2JqZWN0PFByZXR0aWZpZWRUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdXG4gICAgPyBHZXRXaXRoQXJyYXk8RXh0cmFjdEZyb21BcnJheTxUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogdW5kZWZpbmVkXG4gIDogbmV2ZXI7XG5cbnR5cGUgUGF0aDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBLZXl9LiR7aW5mZXIgUmVzdH1gXG4gID8gW0tleSwgLi4uUGF0aDxSZXN0Pl1cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgS2V5fWBcbiAgPyBbS2V5XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBQYXRoVmFsdWU8VHlwZSwgU3RyaW5nUGF0aD4gPSBHZXRXaXRoQXJyYXk8VHlwZSwgUGF0aDxTdHJpbmdQYXRoPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzTmV2ZXIgfSBmcm9tIFwiLi4vaXMtbmV2ZXJcIjtcbmltcG9ydCB7IENyZWF0ZVR5cGVPcHRpb25zIH0gZnJvbSBcIi4uL2NyZWF0ZS10eXBlLW9wdGlvbnNcIjtcbmltcG9ydCB7IFZhbHVlT2YgfSBmcm9tIFwiLi4vdmFsdWUtb2ZcIjtcbmltcG9ydCB7IEhhc1BhcnNhYmxlUGF0aCB9IGZyb20gXCIuLi9oYXMtcGFyc2FibGUtcGF0aFwiO1xuXG50eXBlIFBhdGhhYmxlID0gc3RyaW5nIHwgbnVtYmVyO1xuXG50eXBlIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnMgPSB7XG4gIGRlcHRoOiBbXTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGRlcHRoIFRoaXMgb3B0aW9uIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpblxuICogYFJlY3Vyc2l2ZVBhdGhzT3B0aW9uc1snZGVwdGgnXVsnbGVuZ3RoJ11gLiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGhcbiAqIGBQYXRoc09wdGlvbnNbJ2RlcHRoJ11gXG4gKi9cbnR5cGUgUmVjdXJzaXZlUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogYW55W107XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBCeSBkZWZhdWx0LCB0aGUgZGVwdGggb3B0aW9uIGlzIHNldCB0byA3LiBJdCBzaG91bGQgY292ZXIgdGhlXG4gKiBtYWpvcml0eSBvZiB1c2UgY2FzZXMuIElmIGJ5IGFueSBjaGFuY2UgaXQgZG9lc24ndCBmaXQgeW91LCBmZWVsIGZyZWUgdG9cbiAqIGluY3JlYXNlIHRoZSB2YWx1ZS4gSG93ZXZlciwgdGhpcyBtYXkgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiBnZXR0aW5nXG4gKiBgVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlYCBlcnJvci5cbiAqXG4gKiBAcGFyYW0gYW55QXJyYXlJbmRleEFjY2Vzc29yIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gd2lsZGNhcmQgYWNjZXNzIHRvXG4gKiBhcnJheSBpbmRpY2VzIC0gdXNhZ2UgbXVzdCBiZSBpbnRlbnRpb25hbGx5IGNvbmZpZ3VyZWQuXG4gKi9cbnR5cGUgRGVmYXVsdFBhdGhzT3B0aW9ucyA9IHtcbiAgZGVwdGg6IDc7XG4gIGFueUFycmF5SW5kZXhBY2Nlc3NvcjogYCR7bnVtYmVyfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBUaGlzIG9wdGlvbiByZXN0cmljdHMgdGhlIGRlcHRoIG9mIHRoZSBwYXRocyBsb29rdXAgYW5kIHJlbW92ZXMgYFR5cGVcbiAqIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGVgIGVycm9ycyBmb3JcbiAqIHBvdGVudGlhbGx5IGluZmluaXRlIHR5cGVzLlxuICpcbiAqIEBwYXJhbSBhbnlBcnJheUluZGV4QWNjZXNzb3IgVGhpcyB3aWxkY2FyZCB3aWxsIHNhdGlzZnkgYW55IGFycmF5IGluZGV4IGlmIGRlZmluZWQuXG4gKi9cbnR5cGUgUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogbnVtYmVyO1xuICBhbnlBcnJheUluZGV4QWNjZXNzb3I6IHN0cmluZztcbn07XG5cbnR5cGUgQXBwZW5kPFR1cGxlIGV4dGVuZHMgYW55W10+ID0gWy4uLlR1cGxlLCAwXTtcblxudHlwZSBSZWN1cnNpdmVQYXRoczxcbiAgVHlwZSxcbiAgVXNlck9wdGlvbnMgZXh0ZW5kcyBSZXF1aXJlZDxQYXRoc09wdGlvbnM+LFxuICBDYWxsT3B0aW9ucyBleHRlbmRzIFJlY3Vyc2l2ZVBhdGhzT3B0aW9ucyxcbj4gPSBJc05ldmVyPGtleW9mIFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IG5ldmVyXG4gIDogLy8gYE5vbk51bGxhYmxlYCByZW1vdmVzIGB1bmRlZmluZWRgIHdoZW4gcGFydGlhbCBwcm9wZXJ0aWVzIGV4aXN0IGluIG9iamVjdFxuICAgIE5vbk51bGxhYmxlPFxuICAgICAgVmFsdWVPZjx7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgP1xuICAgICAgICAgICAgICB8IGAke0FueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSwgVXNlck9wdGlvbnM+fWBcbiAgICAgICAgICAgICAgfCAoQ2FsbE9wdGlvbnNbXCJkZXB0aFwiXVtcImxlbmd0aFwiXSBleHRlbmRzIFVzZXJPcHRpb25zW1wiZGVwdGhcIl1cbiAgICAgICAgICAgICAgICAgID8gLy8gU3RvcCBhdCB0aGUgY29uZmlndXJlZCBkZXB0aFxuICAgICAgICAgICAgICAgICAgICBuZXZlclxuICAgICAgICAgICAgICAgICAgOiBUeXBlW0tleV0gZXh0ZW5kcyBpbmZlciBWYWx1ZVxuICAgICAgICAgICAgICAgICAgPyBWYWx1ZSBleHRlbmRzIFZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gLy8gQXZvaWQgY2FsbGluZyBgVW5zYWZlUGF0aHNgIHRvIGtlZXAgYENhbGxPcHRpb25zYCBsb2NhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgSGFzUGFyc2FibGVQYXRoPFZhbHVlPiBleHRlbmRzIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICA/IFJlY3Vyc2l2ZVBhdGhzPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogQXBwZW5kPENhbGxPcHRpb25zW1wiZGVwdGhcIl0+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+IGV4dGVuZHMgaW5mZXIgUmVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBJc05ldmVyPFJlc3Q+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogUmVzdCBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7QW55QXJyYXlJbmRleEFjY2Vzc29yT3JLZXk8S2V5LCBVc2VyT3B0aW9ucz59LiR7UmVzdH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICA6IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgIDogbmV2ZXIpXG4gICAgICAgICAgOiBuZXZlcjtcbiAgICAgIH0+XG4gICAgPjtcblxudHlwZSBVbnNhZmVQYXRoczxUeXBlLCBPcHRpb25zIGV4dGVuZHMgUmVxdWlyZWQ8UGF0aHNPcHRpb25zPj4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIHRydWVcbiAgICA/IFJlY3Vyc2l2ZVBhdGhzPFR5cGUsIE9wdGlvbnMsIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnM+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIEFueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSBleHRlbmRzIFBhdGhhYmxlLCBVc2VyT3B0aW9ucyBleHRlbmRzIFJlcXVpcmVkPFBhdGhzT3B0aW9ucz4+ID0gS2V5IGV4dGVuZHMgbnVtYmVyXG4gID8gS2V5IHwgVXNlck9wdGlvbnNbXCJhbnlBcnJheUluZGV4QWNjZXNzb3JcIl1cbiAgOiBLZXk7XG5cbmV4cG9ydCB0eXBlIFBhdGhzPFR5cGUsIE92ZXJyaWRlUGF0aE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBhdGhzT3B0aW9ucz4gPSB7fT4gPSBVbnNhZmVQYXRoczxcbiAgVHlwZSxcbiAgQ3JlYXRlVHlwZU9wdGlvbnM8UGF0aHNPcHRpb25zLCBPdmVycmlkZVBhdGhPcHRpb25zLCBEZWZhdWx0UGF0aHNPcHRpb25zPlxuPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQaWNrUHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IEtleSA6IG5ldmVyXTogVHlwZVtLZXldO1xufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJldHRpZnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFByZXR0aWZ5PFR5cGU+ID0gVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gID8gVHlwZVxuICA6IEV4dHJhY3Q8XG4gICAgICB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IFR5cGVbS2V5XTtcbiAgICAgIH0sXG4gICAgICBUeXBlXG4gICAgPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2FmZS1kaWN0aW9uYXJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXlvZkJhc2UgfSBmcm9tIFwiLi4va2V5LW9mLWJhc2VcIjtcblxuZXhwb3J0IHR5cGUgU2FmZURpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c10/OiBUeXBlIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdW5pb24tdG8taW50ZXJzZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9IChVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6IFVuaW9uKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIEludGVyc2VjdGlvbixcbikgPT4gdm9pZFxuICA/IEludGVyc2VjdGlvblxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdmFsdWUtb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55RnVuY3Rpb24gfSBmcm9tIFwiLi4vYW55LWZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiLi4vcHJpbWl0aXZlXCI7XG5cbmV4cG9ydCB0eXBlIFZhbHVlT2Y8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlBcnJheVxuICA/IFR5cGVbbnVtYmVyXVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlGdW5jdGlvblxuICA/IFJldHVyblR5cGU8VHlwZT5cbiAgOiBUeXBlW2tleW9mIFR5cGVdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIveG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gV2hlbiBUeXBlMiBpcyB1bmtub3duLCBpdCBjcmVhdGVzIHR5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBleGNsdWRlZCBmcm9tIGl0XG4vLyBlLmcuIFdpdGhvdXQ8eyBmb286IG51bWJlcjsgYmFyOiBudW1iZXIgfSwgdW5rbm93bj4gaXMgeyBmb28/OiBuZXZlcjsgYmFyPzogbmV2ZXIgfVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RzLWVzc2VudGlhbHMvdHMtZXNzZW50aWFscy9pc3N1ZXMvNDAwXG5cbnR5cGUgV2l0aG91dDxUeXBlMSwgVHlwZTI+ID0gSXNVbmtub3duPFR5cGUyPiBleHRlbmRzIHRydWVcbiAgPyBuZXZlclxuICA6IHsgW1AgaW4gRXhjbHVkZTxrZXlvZiBUeXBlMSwga2V5b2YgVHlwZTI+XT86IG5ldmVyIH07XG5cbi8vIFRoaXMgdXRpbGl0eSB0eXBlIGJvZHkgaXMgYXV0b2dlbmVyYXRlZCBpbiBKUyBieSBydW5uaW5nOlxuLy8gY29uc3QgdHlwZXMgPSBBcnJheSg1MCkuZmlsbCgwKS5tYXAoKF8sIGluZGV4KSA9PiBgVHlwZSR7aW5kZXggKyAxfWApXG4vLyB0eXBlcy5tYXAodHlwZSA9PiBgV2l0aG91dDwke3R5cGVzLmZpbHRlcih0ID0+IHQgIT09IHR5cGUpLmpvaW4oJyYnKX0sICR7dHlwZX0+ICYgJHt0eXBlfWApLmpvaW4oJ3wnKVxuZXhwb3J0IHR5cGUgWE9SPFxuICBUeXBlMSxcbiAgVHlwZTIsXG4gIFR5cGUzID0gdW5rbm93bixcbiAgVHlwZTQgPSB1bmtub3duLFxuICBUeXBlNSA9IHVua25vd24sXG4gIFR5cGU2ID0gdW5rbm93bixcbiAgVHlwZTcgPSB1bmtub3duLFxuICBUeXBlOCA9IHVua25vd24sXG4gIFR5cGU5ID0gdW5rbm93bixcbiAgVHlwZTEwID0gdW5rbm93bixcbiAgVHlwZTExID0gdW5rbm93bixcbiAgVHlwZTEyID0gdW5rbm93bixcbiAgVHlwZTEzID0gdW5rbm93bixcbiAgVHlwZTE0ID0gdW5rbm93bixcbiAgVHlwZTE1ID0gdW5rbm93bixcbiAgVHlwZTE2ID0gdW5rbm93bixcbiAgVHlwZTE3ID0gdW5rbm93bixcbiAgVHlwZTE4ID0gdW5rbm93bixcbiAgVHlwZTE5ID0gdW5rbm93bixcbiAgVHlwZTIwID0gdW5rbm93bixcbiAgVHlwZTIxID0gdW5rbm93bixcbiAgVHlwZTIyID0gdW5rbm93bixcbiAgVHlwZTIzID0gdW5rbm93bixcbiAgVHlwZTI0ID0gdW5rbm93bixcbiAgVHlwZTI1ID0gdW5rbm93bixcbiAgVHlwZTI2ID0gdW5rbm93bixcbiAgVHlwZTI3ID0gdW5rbm93bixcbiAgVHlwZTI4ID0gdW5rbm93bixcbiAgVHlwZTI5ID0gdW5rbm93bixcbiAgVHlwZTMwID0gdW5rbm93bixcbiAgVHlwZTMxID0gdW5rbm93bixcbiAgVHlwZTMyID0gdW5rbm93bixcbiAgVHlwZTMzID0gdW5rbm93bixcbiAgVHlwZTM0ID0gdW5rbm93bixcbiAgVHlwZTM1ID0gdW5rbm93bixcbiAgVHlwZTM2ID0gdW5rbm93bixcbiAgVHlwZTM3ID0gdW5rbm93bixcbiAgVHlwZTM4ID0gdW5rbm93bixcbiAgVHlwZTM5ID0gdW5rbm93bixcbiAgVHlwZTQwID0gdW5rbm93bixcbiAgVHlwZTQxID0gdW5rbm93bixcbiAgVHlwZTQyID0gdW5rbm93bixcbiAgVHlwZTQzID0gdW5rbm93bixcbiAgVHlwZTQ0ID0gdW5rbm93bixcbiAgVHlwZTQ1ID0gdW5rbm93bixcbiAgVHlwZTQ2ID0gdW5rbm93bixcbiAgVHlwZTQ3ID0gdW5rbm93bixcbiAgVHlwZTQ4ID0gdW5rbm93bixcbiAgVHlwZTQ5ID0gdW5rbm93bixcbiAgVHlwZTUwID0gdW5rbm93bixcbj4gPSBQcmV0dGlmeTxcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMVxuICAgID4gJlxuICAgICAgVHlwZTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTJcbiAgICA+ICZcbiAgICAgIFR5cGUyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzXG4gICAgPiAmXG4gICAgICBUeXBlMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNFxuICAgID4gJlxuICAgICAgVHlwZTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTVcbiAgICA+ICZcbiAgICAgIFR5cGU1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU2XG4gICAgPiAmXG4gICAgICBUeXBlNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlN1xuICAgID4gJlxuICAgICAgVHlwZTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZThcbiAgICA+ICZcbiAgICAgIFR5cGU4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU5XG4gICAgPiAmXG4gICAgICBUeXBlOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxMFxuICAgID4gJlxuICAgICAgVHlwZTEwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTExXG4gICAgPiAmXG4gICAgICBUeXBlMTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTJcbiAgICA+ICZcbiAgICAgIFR5cGUxMilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxM1xuICAgID4gJlxuICAgICAgVHlwZTEzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE0XG4gICAgPiAmXG4gICAgICBUeXBlMTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTVcbiAgICA+ICZcbiAgICAgIFR5cGUxNSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxNlxuICAgID4gJlxuICAgICAgVHlwZTE2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE3XG4gICAgPiAmXG4gICAgICBUeXBlMTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMThcbiAgICA+ICZcbiAgICAgIFR5cGUxOClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxOVxuICAgID4gJlxuICAgICAgVHlwZTE5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIwXG4gICAgPiAmXG4gICAgICBUeXBlMjApXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjFcbiAgICA+ICZcbiAgICAgIFR5cGUyMSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyMlxuICAgID4gJlxuICAgICAgVHlwZTIyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIzXG4gICAgPiAmXG4gICAgICBUeXBlMjMpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjRcbiAgICA+ICZcbiAgICAgIFR5cGUyNClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyNVxuICAgID4gJlxuICAgICAgVHlwZTI1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI2XG4gICAgPiAmXG4gICAgICBUeXBlMjYpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjdcbiAgICA+ICZcbiAgICAgIFR5cGUyNylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyOFxuICAgID4gJlxuICAgICAgVHlwZTI4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI5XG4gICAgPiAmXG4gICAgICBUeXBlMjkpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzBcbiAgICA+ICZcbiAgICAgIFR5cGUzMClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzMVxuICAgID4gJlxuICAgICAgVHlwZTMxKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTMyXG4gICAgPiAmXG4gICAgICBUeXBlMzIpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzNcbiAgICA+ICZcbiAgICAgIFR5cGUzMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzNFxuICAgID4gJlxuICAgICAgVHlwZTM0KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM1XG4gICAgPiAmXG4gICAgICBUeXBlMzUpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzZcbiAgICA+ICZcbiAgICAgIFR5cGUzNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzN1xuICAgID4gJlxuICAgICAgVHlwZTM3KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM4XG4gICAgPiAmXG4gICAgICBUeXBlMzgpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzlcbiAgICA+ICZcbiAgICAgIFR5cGUzOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0MFxuICAgID4gJlxuICAgICAgVHlwZTQwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQxXG4gICAgPiAmXG4gICAgICBUeXBlNDEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDJcbiAgICA+ICZcbiAgICAgIFR5cGU0MilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0M1xuICAgID4gJlxuICAgICAgVHlwZTQzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ0XG4gICAgPiAmXG4gICAgICBUeXBlNDQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDVcbiAgICA+ICZcbiAgICAgIFR5cGU0NSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0NlxuICAgID4gJlxuICAgICAgVHlwZTQ2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ3XG4gICAgPiAmXG4gICAgICBUeXBlNDcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDhcbiAgICA+ICZcbiAgICAgIFR5cGU0OClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0OVxuICAgID4gJlxuICAgICAgVHlwZTQ5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5LFxuICAgICAgVHlwZTUwXG4gICAgPiAmXG4gICAgICBUeXBlNTApXG4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1vcHRpb25hbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1hcmtPcHRpb25hbDxUeXBlLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IFByZXR0aWZ5PFBhcnRpYWw8VHlwZT4gJiBSZXF1aXJlZDxPbWl0PFR5cGUsIEtleXMgfCBPcHRpb25hbEtleXM8VHlwZT4+Pj5cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSBcIi4uL3dyaXRhYmxlXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrUmVhZG9ubHk8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgS2V5cyB8IFJlYWRvbmx5S2V5czxUeXBlICYgb2JqZWN0Pj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuZXhwb3J0IHR5cGUgTWFya1JlcXVpcmVkPFR5cGUsIEtleXMgZXh0ZW5kcyBrZXlvZiBUeXBlPiA9IFR5cGUgZXh0ZW5kcyBUeXBlXG4gID8gUHJldHRpZnk8VHlwZSAmIFJlcXVpcmVkPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwiLi4vd3JpdGFibGVcIjtcbmltcG9ydCB7IFdyaXRhYmxlS2V5cyB9IGZyb20gXCIuLi93cml0YWJsZS1rZXlzXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrV3JpdGFibGU8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBXcml0YWJsZUtleXM8VHlwZSAmIG9iamVjdD4gfCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbGRhYmxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWVwUGFydGlhbCB9IGZyb20gXCIuLi9kZWVwLXBhcnRpYWxcIjtcbmltcG9ydCB7IERlZXBXcml0YWJsZSB9IGZyb20gXCIuLi9kZWVwLXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIEJ1aWxkYWJsZTxUeXBlPiA9IERlZXBQYXJ0aWFsPERlZXBXcml0YWJsZTxUeXBlPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLW9wdGlvbmFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtPcHRpb25hbCB9IGZyb20gXCIuLi9tYXJrLW9wdGlvbmFsXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWxTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtPcHRpb25hbDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8UmVjdXJzaXZlRGVlcE1hcmtPcHRpb25hbFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya09wdGlvbmFsPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLXJlcXVpcmVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtSZXF1aXJlZCB9IGZyb20gXCIuLi9tYXJrLXJlcXVpcmVkXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWRTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtSZXF1aXJlZDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8UmVjdXJzaXZlRGVlcE1hcmtSZXF1aXJlZFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya1JlcXVpcmVkPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1ub24tbnVsbGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWx0aW4gfSBmcm9tIFwiLi4vYnVpbHQtaW5cIjtcblxuZXhwb3J0IHR5cGUgRGVlcE5vbk51bGxhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBOb25OdWxsYWJsZTxUeXBlPlxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IE1hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seU1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcE5vbk51bGxhYmxlPEtleXM+LCBEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlcz5cbiAgPyBQcm9taXNlPERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcE5vbk51bGxhYmxlPFR5cGVbS2V5XT4gfVxuICA6IE5vbk51bGxhYmxlPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1udWxsYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwTnVsbGFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCBudWxsXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwTnVsbGFibGU8S2V5cz4sIERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrTWFwIGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPEtleXM+IGV4dGVuZHMgb2JqZWN0XG4gICAgPyBXZWFrTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrU2V0IGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPFZhbHVlcz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtTZXQ8RGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBUeXBlIGV4dGVuZHMgSXNUdXBsZTxUeXBlPlxuICAgID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB8IG51bGwgfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICAgIDogUmVhZG9ubHlBcnJheTxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBWYWx1ZT5cbiAgPyBQcm9taXNlPERlZXBOdWxsYWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB9XG4gIDogVHlwZSB8IG51bGw7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1vbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwT21pdDxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcE9taXQ8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyXG4gICAgICAgID8gRmlsdGVyW0tleV0gZXh0ZW5kcyB0cnVlXG4gICAgICAgICAgPyBuZXZlclxuICAgICAgICAgIDogS2V5XG4gICAgICAgIDogS2V5XTogS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gRGVlcE9taXQ8VHlwZVtLZXldLCBGaWx0ZXJbS2V5XT4gOiBUeXBlW0tleV07XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1wYXJ0aWFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFeGNsdWRlPEJ1aWx0aW4sIEVycm9yPlxuICA/IFR5cGVcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFBhcnRpYWw8S2V5cz4sIERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxpbmZlciBWYWx1ZXM+XG4gID8gVHlwZSBleHRlbmRzIElzVHVwbGU8VHlwZT5cbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXT86IERlZXBQYXJ0aWFsPFR5cGVbS2V5XT4gfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUGFydGlhbDxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdPzogRGVlcFBhcnRpYWw8VHlwZVtLZXldPiB9XG4gIDogSXNVbmtub3duPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IHVua25vd25cbiAgOiBQYXJ0aWFsPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1waWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGljazxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcFBpY2s8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICAvLyBpdGVyYXRlIG92ZXIga2V5cyBvZiBUeXBlLCB3aGljaCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQga2V5czogb3B0aW9uYWwsIHJlcXVpcmVkIG9yIHJlYWRvbmx5XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gS2V5IDogbmV2ZXJdOiBGaWx0ZXJbS2V5ICYga2V5b2YgRmlsdGVyXSBleHRlbmRzIHRydWVcbiAgICAgICAgPyBUeXBlW0tleV1cbiAgICAgICAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBGaWx0ZXJcbiAgICAgICAgPyBEZWVwUGljazxUeXBlW0tleV0sIEZpbHRlcltLZXldPlxuICAgICAgICA6IG5ldmVyO1xuICAgIH1cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5pbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUmVhZG9ubHk8VHlwZT4gPSBUeXBlIGV4dGVuZHMgRXhjbHVkZTxCdWlsdGluLCBFcnJvcj5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBSZWFkb25seTxLZXlzPiwgRGVlcFJlYWRvbmx5PFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFdlYWtNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlPlxuICA/IFByb21pc2U8RGVlcFJlYWRvbmx5PFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgQW55QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IElzTmV2ZXI8SXNUdXBsZTxUeXBlPj4gZXh0ZW5kcyBmYWxzZVxuICAgID8geyByZWFkb25seSBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwUmVhZG9ubHk8VHlwZVtLZXldPiB9XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFJlYWRvbmx5PFR5cGVbS2V5XT4gfVxuICA6IElzVW5rbm93bjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyB1bmtub3duXG4gIDogUmVhZG9ubHk8VHlwZT47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHR5cGUgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBSZXF1aXJlZDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFcnJvclxuICA/IFJlcXVpcmVkPFR5cGU+XG4gIDogVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUmVxdWlyZWQ8S2V5cz4sIERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUmVxdWlyZWQ8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBJc05ldmVyPElzVHVwbGU8VHlwZT4+IGV4dGVuZHMgZmFsc2VcbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXS0/OiBEZWVwUmVxdWlyZWQ8VHlwZVtLZXldPiB9XG4gICAgOiBUeXBlIGV4dGVuZHMgQXJyYXk8VmFsdWVzPlxuICAgID8gQXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgOiBUeXBlIGV4dGVuZHMge31cbiAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV0tPzogRGVlcFJlcXVpcmVkPFR5cGVbS2V5XT4gfVxuICA6IFJlcXVpcmVkPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC11bmRlZmluYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwVW5kZWZpbmFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCB1bmRlZmluZWRcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBVbmRlZmluYWJsZTxLZXlzPiwgRGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtNYXAga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8S2V5cz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBVbmRlZmluYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtTZXQga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPiBleHRlbmRzIG9iamVjdFxuICAgID8gV2Vha1NldDxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IFR5cGUgZXh0ZW5kcyBJc1R1cGxlPFR5cGU+XG4gICAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBVbmRlZmluYWJsZTxUeXBlW0tleV0+IHwgdW5kZWZpbmVkIH1cbiAgICA6IFR5cGUgZXh0ZW5kcyBBcnJheTxWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwVW5kZWZpbmFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFVuZGVmaW5hYmxlPFR5cGVbS2V5XT4gfVxuICA6IFR5cGUgfCB1bmRlZmluZWQ7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNVbmtub3duIH0gZnJvbSBcIi4uL2lzLXVua25vd25cIjtcblxuZXhwb3J0IHR5cGUgRGVlcFdyaXRhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEV4Y2x1ZGU8QnVpbHRpbiwgRXJyb3I+XG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5LCBpbmZlciBWYWx1ZT5cbiAgPyBNYXA8RGVlcFdyaXRhYmxlPEtleT4sIERlZXBXcml0YWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gTWFwPERlZXBXcml0YWJsZTxLZXk+LCBEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gV2Vha01hcDxEZWVwV3JpdGFibGU8S2V5PiwgRGVlcFdyaXRhYmxlPFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgLXJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBXcml0YWJsZTxUeXBlW0tleV0+IH1cbiAgOiBJc1Vua25vd248VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gdW5rbm93blxuICA6IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtb21pdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcE9taXQgfSBmcm9tIFwiLi4vZGVlcC1vbWl0XCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBPbWl0PFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcE9taXQ8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtcGljay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcFBpY2sgfSBmcm9tIFwiLi4vZGVlcC1waWNrXCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBQaWNrPFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcFBpY2s8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3B0aW9uYWwta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgT3B0aW9uYWxLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IGtleW9mIHtcbiAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlIGV4dGVuZHMgUmVxdWlyZWQ8UGljazxUeXBlLCBLZXk+PiA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1rZXlzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaWNrUHJvcGVydGllcyB9IGZyb20gXCIuLi9waWNrLXByb3BlcnRpZXNcIjtcblxuZXhwb3J0IHR5cGUgUGlja0tleXM8VHlwZSwgVmFsdWU+ID0ga2V5b2YgUGlja1Byb3BlcnRpZXM8VHlwZSwgVmFsdWU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHkta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNGdWxseVdyaXRhYmxlIH0gZnJvbSBcIi4uL2lzLWZ1bGx5LXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFJlYWRvbmx5S2V5czxUeXBlIGV4dGVuZHMgb2JqZWN0PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duXG4gID8ga2V5b2Yge1xuICAgICAgW0tleSBpbiBrZXlvZiBUeXBlIGFzIElzRnVsbHlXcml0YWJsZTxQaWNrPFR5cGUsIEtleT4+IGV4dGVuZHMgdHJ1ZSA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVxdWlyZWQta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIE9wdGlvbmFsS2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcblxuZXhwb3J0IHR5cGUgV3JpdGFibGVLZXlzPFR5cGUgZXh0ZW5kcyBvYmplY3Q+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIFJlYWRvbmx5S2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXhhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueVJlY29yZCB9IGZyb20gXCIuLi9hbnktcmVjb3JkXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5cbnR5cGUgSXNVbmlvbjxUVW5pb24+ID0gVW5pb25Ub1R1cGxlPFRVbmlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAxID8gZmFsc2UgOiB0cnVlO1xuXG50eXBlIFVuaW9uVG9GdW5jdGlvbkluc2VydGlvbjxUVW5pb24+ID0gKFRVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6ICgpID0+IFRVbmlvbikgPT4gYW55IDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIFRQYXJhbSxcbikgPT4gYW55XG4gID8gVFBhcmFtXG4gIDogbmV2ZXI7XG5cbi8vIE5PVEU6IFdoZW4gcmVwbGFjaW5nIHRoZSB1dGlsaXR5IHR5cGUgd2l0aCBgVW5pb25Ub1R1cGxlYCBmcm9tIGAuLi91bmlvbi10by10dXBsZWAsXG4vLyBgaXNCQyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgaXNCQ2AgYWxsb3dzIGBCQyB8IHtyZWFkb25seSBiOiAyO3JlYWRvbmx5IGM6IDM7fWAgYXMgcGFyYW1ldGVyPz8/XG50eXBlIFVuaW9uVG9UdXBsZTxUVW5pb24+ID0gVW5pb25Ub0Z1bmN0aW9uSW5zZXJ0aW9uPFRVbmlvbj4gZXh0ZW5kcyAoKSA9PiBpbmZlciBUUmV0dXJuVHlwZVxuICA/IFsuLi5VbmlvblRvVHVwbGU8RXhjbHVkZTxUVW5pb24sIFRSZXR1cm5UeXBlPj4sIFRSZXR1cm5UeXBlXVxuICA6IFtdO1xuXG50eXBlIEV4YWN0VW5pb25MZW5ndGg8VFZhbHVlLCBUU2hhcGU+ID0gVW5pb25Ub1R1cGxlPFRWYWx1ZT5bXCJsZW5ndGhcIl0gZXh0ZW5kcyBVbmlvblRvVHVwbGU8VFNoYXBlPltcImxlbmd0aFwiXVxuICA/IHRydWVcbiAgOiBmYWxzZTtcblxuLy8gTk9URTogYFhPUmAgY2Fubm90IGJlIHVzZWQgYXMgaXQncyBvbmx5IGhhbmR5IHdpdGggb2JqZWN0cywgbm90IGJvb2xlYW5zXG50eXBlIEJvb2xlYW5Yb3I8VCwgVT4gPSBUIGV4dGVuZHMgdHJ1ZSA/IChVIGV4dGVuZHMgdHJ1ZSA/IHRydWUgOiBmYWxzZSkgOiBVIGV4dGVuZHMgZmFsc2UgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgQm9vbGVhbkFuZDxUVHVwbGU+ID0gVFR1cGxlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFJlc3RdXG4gID8gSGVhZCBleHRlbmRzIHRydWVcbiAgICA/IEJvb2xlYW5BbmQ8UmVzdD5cbiAgICA6IGZhbHNlXG4gIDogVFR1cGxlIGV4dGVuZHMgW11cbiAgPyB0cnVlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gQm9vbGVhbkFuZDxcbiAgW0lzTmV2ZXI8RXhjbHVkZTxrZXlvZiBUVmFsdWUsIGtleW9mIFRTaGFwZT4+LCBJc05ldmVyPEV4Y2x1ZGU8a2V5b2YgVFNoYXBlLCBrZXlvZiBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0VmFsdWVEaWZmPFRWYWx1ZSwgVFNoYXBlPiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVFZhbHVlXTogRXhjbHVkZTxUVmFsdWVbVEtleV0sIFRTaGFwZVtUS2V5ICYga2V5b2YgVFNoYXBlXT47XG59W2tleW9mIFRWYWx1ZV07XG5cbnR5cGUgT2JqZWN0VmFsdWVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBCb29sZWFuQW5kPFxuICBbSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFZhbHVlLCBUU2hhcGU+PiwgSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFNoYXBlLCBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbVFNoYXBlXVxuICA/IEJvb2xlYW5BbmQ8XG4gICAgICBbXG4gICAgICAgIEJvb2xlYW5Yb3I8SXNVbmlvbjxUVmFsdWU+LCBJc1VuaW9uPFRTaGFwZT4+LFxuICAgICAgICBFeGFjdFVuaW9uTGVuZ3RoPFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgICAgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+LFxuICAgICAgICBPYmplY3RWYWx1ZUV4YWN0PFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgIF1cbiAgICA+IGV4dGVuZHMgdHJ1ZVxuICAgID8gVFZhbHVlXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIElzQXJyYXk8VFZhbHVlPiA9IFtUVmFsdWVdIGV4dGVuZHMgW3JlYWRvbmx5IGFueVtdXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1JlYWRvbmx5PFRBcnJheT4gPSBSZWFkb25seTxUQXJyYXk+IGV4dGVuZHMgVEFycmF5ID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFNhbWVMZW5ndGg8VFZhbHVlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFRTaGFwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IElzTmV2ZXI8XG4gIFByaW1pdGl2ZUV4YWN0PFRWYWx1ZVtcImxlbmd0aFwiXSwgVFNoYXBlW1wibGVuZ3RoXCJdPlxuPiBleHRlbmRzIHRydWVcbiAgPyBmYWxzZVxuICA6IHRydWU7XG5cbnR5cGUgQXJyYXlFeGFjdDxUVmFsdWUgZXh0ZW5kcyByZWFkb25seSBhbnlbXSwgVFNoYXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10+ID0gQm9vbGVhbkFuZDxcbiAgW1xuICAgIC8vIGJvdGggYXJyYXlzXG4gICAgSXNBcnJheTxUVmFsdWU+LFxuICAgIElzQXJyYXk8VFNoYXBlPixcbiAgICAvLyBzYW1lIGxlbmd0aFxuICAgIFNhbWVMZW5ndGg8VFZhbHVlLCBUU2hhcGU+LFxuICAgIC8vIGJvdGggcmVhZG9ubHkgb3Igbm90XG4gICAgQm9vbGVhblhvcjxJc1JlYWRvbmx5PFRWYWx1ZT4sIElzUmVhZG9ubHk8VFNoYXBlPj4sXG4gIF1cbj4gZXh0ZW5kcyB0cnVlXG4gID8gW1RWYWx1ZSwgVFNoYXBlXSBleHRlbmRzIFtyZWFkb25seSAoaW5mZXIgVFZhbHVlRWxlbWVudClbXSwgcmVhZG9ubHkgKGluZmVyIFRTaGFwZUVsZW1lbnQpW11dXG4gICAgPyBFeGFjdDxUVmFsdWVFbGVtZW50LCBUU2hhcGVFbGVtZW50PiBleHRlbmRzIFRWYWx1ZUVsZW1lbnRcbiAgICAgID8gVFZhbHVlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBOT1RFOiBXaGVuIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoIGBBcmVOb25EaXN0cmlidXRpdmVFcXVhbDxUVmFsdWUsIFRTaGFwZT4gZXh0ZW5kcyB0cnVlID8gVFZhbHVlIDogbmV2ZXJgLFxuLy8gYGlzQkNvckJDMyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgYmNPckJjM2AgaXMgaW5mZXJyZWQgYXMgYEJDYD8/P1xudHlwZSBQcmltaXRpdmVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBbVFZhbHVlXSBleHRlbmRzIFtUU2hhcGVdID8gKFtUU2hhcGVdIGV4dGVuZHMgW1RWYWx1ZV0gPyBUVmFsdWUgOiBuZXZlcikgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gID8gW1RTaGFwZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gICAgPyBBcnJheUV4YWN0PFRWYWx1ZSwgVFNoYXBlPlxuICAgIDogbmV2ZXJcbiAgOiBbVFZhbHVlXSBleHRlbmRzIFtBbnlSZWNvcmRdXG4gID8gT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+XG4gIDogUHJpbWl0aXZlRXhhY3Q8VFZhbHVlLCBUU2hhcGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtYW55L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTkyNzUyMy9kaXNhbGxvdy1jYWxsLXdpdGgtYW55LzQ5OTI4MzYwIzQ5OTI4MzYwXG5leHBvcnQgdHlwZSBJc0FueTxUeXBlPiA9IDAgZXh0ZW5kcyAxICYgVHlwZSA/IHRydWUgOiBmYWxzZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtbmV2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzTmV2ZXI8VHlwZT4gPSBbVHlwZV0gZXh0ZW5kcyBbbmV2ZXJdID8gdHJ1ZSA6IGZhbHNlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdW5rbm93bi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNBbnkgfSBmcm9tIFwiLi4vaXMtYW55XCI7XG5cbmV4cG9ydCB0eXBlIElzVW5rbm93bjxUeXBlPiA9IElzQW55PFR5cGU+IGV4dGVuZHMgdHJ1ZSA/IGZhbHNlIDogdW5rbm93biBleHRlbmRzIFR5cGUgPyB0cnVlIDogZmFsc2U7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzVHVwbGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPyAoYW55W10gZXh0ZW5kcyBUeXBlID8gbmV2ZXIgOiBUeXBlKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LW9iamVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgTm9uRW1wdHlPYmplY3Q8T2JqZWN0IGV4dGVuZHMgQW55UmVjb3JkPiA9IGtleW9mIE9iamVjdCBleHRlbmRzIG5ldmVyID8gbmV2ZXIgOiBPYmplY3Q7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlBcnJheTxUeXBlID0gYW55PiA9IEFycmF5PFR5cGU+IHwgUmVhZG9ubHlBcnJheTxUeXBlPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBcnJheU9yU2luZ2xlPFR5cGU+ID0gVHlwZSB8IFR5cGVbXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZWxlbWVudC1vZi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRWxlbWVudE9mPFR5cGUgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgKGluZmVyIFZhbHVlcylbXSA/IFZhbHVlcyA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaGVhZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIEhlYWQ8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duID8gKFR5cGVbXCJsZW5ndGhcIl0gZXh0ZW5kcyAwID8gbmV2ZXIgOiBUeXBlWzBdKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFR5cGU+ID0gW1R5cGUsIC4uLlR5cGVbXV07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHktYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBSZWFkb25seUFycmF5T3JTaW5nbGU8VHlwZT4gPSBUeXBlIHwgcmVhZG9ubHkgVHlwZVtdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdGFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIFRhaWw8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyByZWFkb25seSBbXVxuICA/IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IFthbnk/LCAuLi5pbmZlciBSZXN0XVxuICA/IFJlc3RcbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFR1cGxlPFR5cGUgPSBhbnk+ID0gW1R5cGU/LCAuLi5UeXBlW11dO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvY2FtZWwtY2FzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsidHlwZSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBmYWxzZSA6IHRydWUpIDogZmFsc2U7XG5cbnR5cGUgV29yZEluQ2FtZWxDYXNlPFR5cGUsIFdvcmQgZXh0ZW5kcyBzdHJpbmcgPSBcIlwiPiA9IFR5cGUgZXh0ZW5kcyBgJHtXb3JkfSR7aW5mZXIgTmV4dENoYXJhY3Rlcn0ke2luZmVyIF99YFxuICA/IE5leHRDaGFyYWN0ZXIgZXh0ZW5kcyBDYXBpdGFsaXplPE5leHRDaGFyYWN0ZXI+XG4gICAgPyBXb3JkXG4gICAgOiBXb3JkSW5DYW1lbENhc2U8VHlwZSwgYCR7V29yZH0ke05leHRDaGFyYWN0ZXJ9YD5cbiAgOiBXb3JkO1xuXG50eXBlIFNlcGFyYXRvciA9IFwiX1wiIHwgXCItXCI7XG5cbnR5cGUgSW5jbHVkZXNTZXBhcmF0b3I8VHlwZT4gPSBUeXBlIGV4dGVuZHMgYCR7c3RyaW5nfSR7U2VwYXJhdG9yfSR7c3RyaW5nfWAgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNPbmVXb3JkPFR5cGU+ID0gVHlwZSBleHRlbmRzIExvd2VyY2FzZTxUeXBlICYgc3RyaW5nPlxuICA/IHRydWVcbiAgOiBUeXBlIGV4dGVuZHMgVXBwZXJjYXNlPFR5cGUgJiBzdHJpbmc+XG4gID8gdHJ1ZVxuICA6IGZhbHNlO1xuXG50eXBlIElzQ2FtZWxDYXNlPFR5cGU+ID0gVHlwZSBleHRlbmRzIFVuY2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Bhc2NhbENhc2U8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQ2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxuLyoqIHNuYWtlX2Nhc2UsIENPTlNUQU5UX0NBU0UsIGtlYmFiLWNhc2Ugb3IgQ09CT0wtQ0FTRSAqL1xudHlwZSBTZXBhcmF0b3JDYXNlUGFyc2VyPFxuICBUeXBlLFxuICBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10sXG4+ID0gVHlwZSBleHRlbmRzIGAke2luZmVyIFdvcmR9JHtTZXBhcmF0b3J9JHtpbmZlciBUYWlsfWBcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFRhaWwsIFsuLi5UdXBsZSwgTG93ZXJjYXNlPFdvcmQ+XT5cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgV29yZH1gXG4gID8gWy4uLlR1cGxlLCBMb3dlcmNhc2U8V29yZD5dXG4gIDogVHVwbGU7XG5cbnR5cGUgQ2FtZWxDYXNlUGFyc2VyPFR5cGUsIFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPSBbXT4gPSBUeXBlIGV4dGVuZHMgXCJcIlxuICA/IFR1cGxlXG4gIDogVHlwZSBleHRlbmRzIGAke1dvcmRJbkNhbWVsQ2FzZTxUeXBlPn0ke2luZmVyIFRhaWx9YFxuICA/IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBXb3JkfSR7VGFpbH1gXG4gICAgPyBDYW1lbENhc2VQYXJzZXI8VW5jYXBpdGFsaXplPFRhaWw+LCBbLi4uVHVwbGUsIExvd2VyY2FzZTxXb3JkPl0+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBDb252ZXJ0IGZpcnN0IGNoYXJhY3RlciBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIGxvd2VyY2FzZSBhbmQgcmV1c2UgQ2FtZWxDYXNlUGFyc2VyXG50eXBlIFBhc2NhbENhc2VQYXJzZXI8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gQ2FtZWxDYXNlUGFyc2VyPFVuY2FwaXRhbGl6ZTxUeXBlPj4gOiBuZXZlcjtcblxudHlwZSBTcGxpdEFueUNhc2U8VHlwZT4gPSBJbmNsdWRlc1NlcGFyYXRvcjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNPbmVXb3JkPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFtMb3dlcmNhc2U8VHlwZSAmIHN0cmluZz5dXG4gIDogSXNDYW1lbENhc2U8VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gQ2FtZWxDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNQYXNjYWxDYXNlPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFBhc2NhbENhc2VQYXJzZXI8VHlwZT5cbiAgOiBbXTtcblxudHlwZSBQYXNjYWxDYXBpdGFsaXplcjxUeXBlLCBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IEhlYWQgZXh0ZW5kcyBzdHJpbmdcbiAgICA/IFBhc2NhbENhcGl0YWxpemVyPFRhaWwsIFsuLi5UdXBsZSwgQ2FwaXRhbGl6ZTxIZWFkPl0+XG4gICAgOiBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBUdXBsZT5cbiAgOiBUdXBsZTtcblxudHlwZSBDYW1lbENhcGl0YWxpemVyPFR5cGU+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBGaXJzdCwgLi4uaW5mZXIgVGFpbF0gPyBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBbRmlyc3RdPiA6IFtdO1xuXG50eXBlIEpvaW48VHlwZSwgSm9pbmVkU3RyaW5nIGV4dGVuZHMgc3RyaW5nID0gXCJcIj4gPSBUeXBlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFRhaWxdXG4gID8gSGVhZCBleHRlbmRzIHN0cmluZ1xuICAgID8gSm9pbjxUYWlsLCBgJHtKb2luZWRTdHJpbmd9JHtIZWFkfWA+XG4gICAgOiBKb2luPFRhaWw+XG4gIDogSm9pbmVkU3RyaW5nO1xuXG5leHBvcnQgdHlwZSBDYW1lbENhc2U8VHlwZT4gPSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gZXh0ZW5kcyB0cnVlID8gSm9pbjxDYW1lbENhcGl0YWxpemVyPFNwbGl0QW55Q2FzZTxUeXBlPj4+IDogVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1jYW1lbC1jYXNlLXByb3BlcnRpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbWVsQ2FzZSB9IGZyb20gXCIuLi9jYW1lbC1jYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBDYW1lbENhc2VQcm9wZXJ0aWVzPFR5cGU+ID0gVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGUgYXMgQ2FtZWxDYXNlPEtleT5dOiBEZWVwQ2FtZWxDYXNlUHJvcGVydGllczxUeXBlW0tleV0+IH1cbiAgOiBUeXBlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlGdW5jdGlvbjxBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUmV0dXJuVHlwZSA9IGFueT4gPSAoLi4uYXJnczogQXJncykgPT4gUmV0dXJuVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmVkaWNhdGVGdW5jdGlvbiA9ICh4OiBhbnksIC4uLl96OiBhbnlbXSkgPT4geCBpcyBhbnk7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLXR5cGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZWRpY2F0ZUZ1bmN0aW9uIH0gZnJvbSBcIi4uL3ByZWRpY2F0ZS1mdW5jdGlvblwiO1xuXG5leHBvcnQgdHlwZSBQcmVkaWNhdGVUeXBlPFR5cGUgZXh0ZW5kcyBQcmVkaWNhdGVGdW5jdGlvbj4gPSBUeXBlIGV4dGVuZHMgKFxuICB0YXJnZXQ6IGFueSxcbiAgLi4ucmVzdDogYW55W11cbikgPT4gdGFyZ2V0IGlzIGluZmVyIE5hcnJvd2VkVHlwZVxuICA/IE5hcnJvd2VkVHlwZVxuICA6IG5ldmVyO1xuIl19","export class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${value}`);\n }\n}\n","export function assert(condition: any, message: string = \"no additional info provided\"): asserts condition {\n if (!condition) {\n throw new Error(\"Assertion Error: \" + message);\n }\n}\n","export const createFactoryWithConstraint =\n <Constraint>() =>\n <Value extends Constraint>(value: Value): Value =>\n value;\n","import { Exact } from \"../../exact\";\n\nexport const isExact =\n <ExpectedShape>() =>\n <ActualShape>(x: Exact<ActualShape, ExpectedShape>) =>\n x as ExpectedShape;\n","export function noop(..._args: unknown[]): void {}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXdhaXRlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgYnVpbHRpbiBgQXdhaXRlZGAgKi9cbmV4cG9ydCB0eXBlIEF3YWl0ZWQ8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVmFsdWU+ID8gVmFsdWUgOiBuZXZlcjtcbiJdfQ==","// Basic\n\nexport * from \"./primitive\";\nexport * from \"./built-in\";\nexport * from \"./key-of-base\";\nexport * from \"./strict-exclude\";\nexport * from \"./strict-extract\";\nexport * from \"./strict-omit\";\nexport * from \"./writable\";\n\n// Utility types\n\nexport * from \"./async-or-sync\";\nexport * from \"./async-or-sync-type\";\nexport * from \"./dictionary\";\nexport * from \"./dictionary-values\";\nexport * from \"./merge\";\nexport * from \"./merge-n\";\nexport * from \"./newable\";\nexport * from \"./non-never\";\nexport * from \"./omit-properties\";\nexport * from \"./opaque\";\nexport * from \"./path-value\";\nexport * from \"./paths\";\nexport * from \"./pick-properties\";\nexport * from \"./prettify\";\nexport * from \"./safe-dictionary\";\nexport * from \"./union-to-intersection\";\nexport * from \"./value-of\";\nexport * from \"./xor\";\n\n// Mark wrapper types\n\nexport * from \"./mark-optional\";\nexport * from \"./mark-readonly\";\nexport * from \"./mark-required\";\nexport * from \"./mark-writable\";\n\n// Deep wrapper types\n\nexport * from \"./buildable\";\nexport * from \"./deep-mark-optional\";\nexport * from \"./deep-mark-required\";\nexport * from \"./deep-non-nullable\";\nexport * from \"./deep-nullable\";\nexport * from \"./deep-omit\";\nexport * from \"./deep-partial\";\nexport * from \"./deep-pick\";\nexport * from \"./deep-readonly\";\nexport * from \"./deep-required\";\nexport * from \"./deep-undefinable\";\nexport * from \"./deep-writable\";\nexport * from \"./strict-deep-omit\";\nexport * from \"./strict-deep-pick\";\n\n// Key types\n\nexport * from \"./optional-keys\";\nexport * from \"./pick-keys\";\nexport * from \"./readonly-keys\";\nexport * from \"./required-keys\";\nexport * from \"./writable-keys\";\n\n// Type checkers\n\nexport * from \"./exact\";\nexport * from \"./is-any\";\nexport * from \"./is-never\";\nexport * from \"./is-unknown\";\nexport * from \"./is-tuple\";\nexport * from \"./non-empty-object\";\n\n// Arrays and Tuples\n\nexport * from \"./any-array\";\nexport * from \"./array-or-single\";\nexport * from \"./element-of\";\nexport * from \"./head\";\nexport * from \"./non-empty-array\";\nexport * from \"./readonly-array-or-single\";\nexport * from \"./tail\";\nexport * from \"./tuple\";\n\n// Change case\n\nexport * from \"./camel-case\";\nexport * from \"./deep-camel-case-properties\";\n\n// Function types\n\nexport * from \"./any-function\";\nexport * from \"./predicate-function\";\nexport * from \"./predicate-type\";\n\n// Utility functions\n\nexport * from \"./functions/unreachable-case-error\";\nexport * from \"./functions/assert\";\nexport * from \"./functions/create-factory-with-constraint\";\nexport * from \"./functions/is-exact\";\nexport * from \"./functions/noop\";\n\n// Build-in types\n\nexport * from \"./awaited\";\n","import { createContext, useContext, useMemo, useState } from 'react';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index';\nimport { QueryProvider } from './QueryProvider';\nimport { createCofheClient } from '@cofhe/sdk/web';\nimport { FnxFloatingButtonWithProvider } from '@/components/FnxFloatingButton/FnxFloatingButton';\nimport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\nimport { createCofheConfig } from '@/config';\nimport { chains } from '@cofhe/sdk/chains';\nimport { assert } from 'ts-essentials';\nimport type { FloatingButtonPosition } from '@/components/FnxFloatingButton/types';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider(props: CofheProviderProps) {\n const { children, queryClient, publicClient, walletClient } = props;\n\n const config = useMemo(() => {\n // priority: explicit config prop > config from provided client > create default config\n if (props.config) return props.config;\n if (props.cofheClient) {\n assert(config.environment === 'react', 'Provided cofheClient must have react config');\n return props.cofheClient.config;\n }\n return createCofheConfig({ supportedChains: Object.values(chains) });\n }, [props.config, props.cofheClient]);\n\n // use provided client or create a new one out of the config\n const cofheClient = useMemo(() => props.cofheClient ?? createCofheClient(config), [props.cofheClient, config]);\n\n // dynamic values\n const [position, setPosition] = useState<FloatingButtonPosition>(config.react.position);\n const [theme, setTheme] = useState(config.react.initialTheme);\n\n return (\n <CofheContext.Provider\n value={{\n client: cofheClient,\n state: {\n position,\n setPosition,\n theme,\n setTheme,\n },\n }}\n >\n <QueryProvider queryClient={queryClient}>\n <AutoConnect walletClient={walletClient} publicClient={publicClient} />\n <FnxFloatingButtonWithProvider>{children}</FnxFloatingButtonWithProvider>\n </QueryProvider>\n </CofheContext.Provider>\n );\n}\n\nfunction AutoConnect({ walletClient, publicClient }: Pick<CofheProviderProps, 'walletClient' | 'publicClient'>) {\n useCofheAutoConnect({ walletClient, publicClient });\n return null;\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { QueryClient } from '@tanstack/react-query';\nimport { createContext, useContext, useMemo } from 'react';\n\n// Internal context to expose the QueryClient used by this module\nconst InternalQueryClientContext = createContext<QueryClient | null>(null);\n\nexport const useInternalQueryClient = (): QueryClient => {\n const qc = useContext(InternalQueryClientContext);\n if (!qc) throw new Error('QueryClient not available. Wrap with CofheProvider/QueryProvider.');\n return qc;\n};\n\nexport const QueryProvider = ({\n children,\n queryClient: overridingQueryClient,\n}: {\n children: React.ReactNode;\n queryClient?: QueryClient;\n}) => {\n // Create a client if not provided\n const queryClient = useMemo(() => {\n if (overridingQueryClient) return overridingQueryClient;\n return new QueryClient();\n }, [overridingQueryClient]);\n\n return <InternalQueryClientContext.Provider value={queryClient}>{children}</InternalQueryClientContext.Provider>;\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n};\n","import * as viemChains from 'viem/chains';\nimport { ETH_ADDRESS_LOWERCASE, type Token, type Erc20Pair } from '../types/token.js';\nimport type { FheTypeValue } from '@cofhe/sdk';\nimport { isValidElement } from 'react';\n\n// Build a lookup map of chainId -> viem chain (for block explorers, etc.)\nconst viemChainById = Object.values(viemChains).reduce<Record<number, (typeof viemChains)[keyof typeof viemChains]>>(\n (acc, chain) => {\n if (chain && typeof chain === 'object' && 'id' in chain) {\n acc[chain.id] = chain;\n }\n return acc;\n },\n {}\n);\n\n/**\n * Gets the block explorer URL for a given chain ID\n * @param chainId - The chain ID to look up\n * @returns The block explorer base URL, or undefined if not found\n */\nexport const getBlockExplorerUrl = (chainId: number): string | undefined => {\n const chain = viemChainById[chainId];\n return chain?.blockExplorers?.default?.url;\n};\n\n/**\n * Gets the block explorer transaction URL for a given chain ID and transaction hash\n * @param chainId - The chain ID\n * @param hash - The transaction hash\n * @returns The full transaction URL, or undefined if chain not found\n */\nexport const getBlockExplorerTxUrl = (chainId: number, hash: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/tx/${hash}` : undefined;\n};\n\n/**\n * Gets the block explorer address URL for a given chain ID and address\n * @param chainId - The chain ID\n * @param address - The address\n * @returns The full address URL, or undefined if chain not found\n */\nexport const getBlockExplorerAddressUrl = (chainId: number, address: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/address/${address}` : undefined;\n};\n\n/**\n * Gets the block explorer token URL for a given chain ID and token address\n * @param chainId - The chain ID\n * @param tokenAddress - The token contract address\n * @returns The full token URL, or undefined if chain not found\n */\nexport const getBlockExplorerTokenUrl = (chainId: number, tokenAddress: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/token/${tokenAddress}` : undefined;\n};\n\n// ============================================================================\n// Token Helper Functions\n// ============================================================================\n\n/**\n * Check if an erc20Pair address is the native ETH address\n * @param erc20Pair - The ERC20 pair object from token extensions\n * @returns True if the pair address matches ETH_ADDRESS\n */\nexport const isEthPair = (erc20Pair: Erc20Pair | undefined): boolean => {\n if (!erc20Pair) return false;\n return erc20Pair.address.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n};\n\n/**\n * Check if a token is a wrapped ETH token (ConfidentialETH)\n * @param token - The token object\n * @returns True if the token is a wrapped token with ETH as the underlying pair\n */\nexport const isWrappedEthToken = (token: Token): boolean => {\n if (token.extensions.fhenix.confidentialityType !== 'wrapped') return false;\n return isEthPair(token.extensions.fhenix.erc20Pair);\n};\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n {\n label: 'Encrypted Bool',\n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: 'Boolean value (true/false)',\n },\n {\n label: 'Encrypted Uint8',\n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: '8-bit unsigned integer (0 to 255)',\n },\n {\n label: 'Encrypted Uint16',\n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: '16-bit unsigned integer (0 to 65,535)',\n },\n {\n label: 'Encrypted Uint32',\n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: '32-bit unsigned integer (0 to 4,294,967,295)',\n },\n {\n label: 'Encrypted Uint64',\n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: '64-bit unsigned integer (0 to 18,446,744,073,709,551,615)',\n },\n {\n label: 'Encrypted Uint128',\n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: '128-bit unsigned integer',\n },\n {\n label: 'Encrypted Address',\n value: 'address',\n maxValue: null, // Address validation is different\n description: 'Ethereum address (0x...)',\n },\n];\n\nexport const NOOP_CALLBACK = () => () => {};\n\n/**\n * Truncates a hex string (address or hash) to show beginning and end with ellipsis\n * @param value - The hex string to truncate (address, hash, etc.)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated string, or original if too short\n *\n * @example\n * truncateHash('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport const truncateHash = (value: string, start = 6, end = 4): string => {\n if (value.length <= start + end) return value;\n return `${value.slice(0, start)}...${value.slice(-end)}`;\n};\n\n/**\n * Truncates an Ethereum address (alias for truncateHash with address-friendly defaults)\n * @param address - The full Ethereum address (0x...)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated address string, or undefined if address is invalid\n *\n * @example\n * truncateAddress('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport function truncateAddress(\n address: string | undefined | null,\n start: number = 6,\n end: number = 4\n): string | undefined {\n if (!address) return undefined;\n return truncateHash(address, start, end);\n}\n\n/**\n * Sanitizes numeric input to only allow numbers and a single decimal point\n * @param value - The input value to sanitize\n * @returns Sanitized value with only numbers and at most one decimal point\n *\n * @example\n * sanitizeNumericInput('123.45.67') // Returns: '123.4567'\n * sanitizeNumericInput('abc123.45') // Returns: '123.45'\n * sanitizeNumericInput('123') // Returns: '123'\n */\nexport function sanitizeNumericInput(value: string): string {\n // Only allow numbers and decimal point\n const cleaned = value.replace(/[^0-9.]/g, '');\n\n // Ensure only one decimal point\n const parts = cleaned.split('.');\n if (parts.length > 2) {\n return parts[0] + '.' + parts.slice(1).join('');\n }\n\n return cleaned;\n}\n\n/**\n * Formats a timestamp as a relative time string (e.g., \"2 hours ago\")\n * @param timestamp - Unix timestamp in milliseconds\n * @returns Formatted relative time string\n */\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n return 'Just now';\n};\n\nexport const formatExpirationLabel = (expiration?: number) => {\n if (!expiration) {\n return { label: 'Unknown', expired: false, expiringSoon: false };\n }\n\n const now = Math.floor(Date.now() / 1000);\n const diff = expiration - now;\n\n const expired = diff <= 0;\n const expiringSoon = diff <= 1 * 60 * 60;\n if (expired) {\n return { label: 'Expired', expired: true, expiringSoon: false };\n }\n\n const day = 60 * 60 * 24;\n const hour = 60 * 60;\n const minute = 60;\n\n if (diff >= day) {\n const days = Math.ceil(diff / day);\n return { label: `${days} Day${days === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n if (diff >= hour) {\n const hours = Math.ceil(diff / hour);\n return { label: `${hours} Hour${hours === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n const minutes = Math.max(1, Math.ceil(diff / minute));\n return { label: `${minutes} Minute${minutes === 1 ? '' : 's'}`, expired: false, expiringSoon };\n};\n\nexport function isReactNode(data: unknown): data is React.ReactNode {\n // Check for primitive types that are valid React nodes or if it's a valid React element\n if (\n data === null ||\n data === undefined ||\n typeof data === 'string' ||\n typeof data === 'number' ||\n typeof data === 'boolean' ||\n isValidElement(data)\n ) {\n return true;\n }\n\n // Check if it's an array of React nodes (recursive check)\n if (Array.isArray(data)) {\n return data.every(isReactNode);\n }\n\n return false;\n}\n","/**\n * Token types shared across hooks/components/utils.\n *\n * IMPORTANT: Keep this file dependency-free (no imports from hooks/providers/utils)\n * to avoid circular dependencies.\n */\n\nimport { baseSepolia, sepolia } from '@cofhe/sdk/chains';\nimport type { Address } from 'viem';\n\n/**\n * Special address representing native ETH (used in erc20Pair for ConfidentialETH tokens)\n */\nexport const ETH_ADDRESS_LOWERCASE = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const;\n\ntype TokenWithoutExtensions = Omit<Token, 'extensions'>;\nexport function constructNativeToken(chainId: number): TokenWithoutExtensions {\n return {\n chainId,\n address: ETH_ADDRESS_LOWERCASE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n };\n}\n\n/**\n * ERC20 pair information for wrapped confidential tokens\n */\nexport type Erc20Pair = {\n /** Address of the underlying ERC20 token (or ETH_ADDRESS for native ETH) */\n address: Address;\n symbol: string;\n decimals: number;\n logoURI?: string;\n};\n\nexport type Token = {\n chainId: number;\n address: `0x${string}`;\n symbol: string;\n decimals: number;\n name: string;\n logoURI?: string;\n extensions: Record<string, unknown> & {\n fhenix: {\n confidentialityType: 'wrapped' | 'pure' | 'dual';\n confidentialValueType: 'uint64' | 'uint128';\n /** ERC20 pair for wrapped tokens - contains underlying token info */\n erc20Pair?: Erc20Pair;\n };\n };\n};\n\n// source: https://storage.googleapis.com/cofhesdk/sepolia.json\nexport const WETH_SEPOLIA_TOKEN: Token = {\n chainId: 11155111,\n address: '0x87A3effB84CBE1E4caB6Ab430139eC41d156D55A',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\n\n// source: https://storage.googleapis.com/cofhesdk/base-sepolia.json\nconst WETH_BASE_SEPOLIA_TOKEN: Token = {\n chainId: 84532,\n address: '0xbED96aa98a49FeA71fcC55d755b915cF022a9159',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n coingeckoId: 'eeth',\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\nexport const DEFAULT_TOKEN_BY_CHAIN_ID: Record<number, Token> = {\n [sepolia.id]: WETH_SEPOLIA_TOKEN,\n [baseSepolia.id]: WETH_BASE_SEPOLIA_TOKEN,\n};\n","import type { FheTypeValue } from '@cofhe/sdk';\n\nexport const logBlockStart = (message: string) => {\n console.log('┌──────────────────┬──────────────────────────────────────────────────');\n console.log(`│ [COFHE] │ ${message}`);\n console.log('├──────────────────┴──────────────────────────────────────────────────');\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log('└─────────────────────────────────────────────────────────────────────');\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return 'ebool';\n case 'uint8':\n return 'euint8';\n case 'uint16':\n return 'euint16';\n case 'uint32':\n return 'euint32';\n case 'uint64':\n return 'euint64';\n case 'uint128':\n return 'euint128';\n case 'address':\n return 'eaddress';\n default:\n return 'unknown';\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? 'true' : 'false';\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + '..' + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n};\n","import {\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type ContractFunctionReturnType,\n type PublicClient,\n} from 'viem';\n\nexport type WaitUntilRpcAwareAndReadContractOptions = {\n onSuccess?: () => void;\n pollingInterval?: number;\n signal?: AbortSignal;\n};\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Waits until an RPC node is aware of a specific `blockHash`, then performs the\n * contract read.\n *\n * Implementation detail: the function issues two RPC calls concurrently:\n * - `eth_getBlockByHash(blockHash)` to confirm the node has the block\n * - `eth_call` (via `publicClient.call`) for the actual contract read\n *\n * If your viem client transport has batching enabled, these concurrent calls are\n * typically sent as a single JSON-RPC batch — which is important when your RPC\n * provider load-balances across nodes.\n */\nexport type ReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = ContractFunctionReturnType<\n TAbi,\n 'pure' | 'view',\n TfunctionName,\n ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>\n>;\nexport async function maybeWaitUntilRpcAwareAndReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n publicClient: PublicClient,\n params: {\n blockHashToBeAwareOf?: `0x${string}`;\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n },\n options: WaitUntilRpcAwareAndReadContractOptions = {}\n): Promise<ReadContractResult<TAbi, TfunctionName>> {\n // if no blockHash given to be aware of, just read directly\n if (!params.blockHashToBeAwareOf)\n return publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n });\n\n const pollingInterval = options.pollingInterval ?? 1_000;\n\n console.log(`Waiting until RPC is aware of block ${params.blockHashToBeAwareOf} to read contract...`);\n let done = false;\n while (!done) {\n if (options.signal?.aborted) throw abortError();\n\n const [blockRes, readRes] = await Promise.allSettled([\n publicClient.request({\n method: 'eth_getBlockByHash',\n params: [params.blockHashToBeAwareOf, false],\n }),\n publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }),\n ]);\n\n const blockKnown = blockRes.status === 'fulfilled' && blockRes.value != null;\n\n if (blockKnown && readRes.status === 'fulfilled') {\n options?.onSuccess?.();\n done = true;\n return readRes.value;\n }\n\n await sleep(pollingInterval, options.signal);\n }\n\n // Unreachable, but keeps TS happy.\n throw new Error('Unexpected exit from wait loop');\n}\n","import { cn } from '@/utils';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\nimport type { FnxStatusVariant } from './types';\n\nconst statusVariantStyles: Record<FnxStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nexport const FloatingButtonComponent: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n const { theme } = useFnxFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { portalOpen } = usePortalUI();\n\n const topStatusVariant = statuses[statuses.length - 1]?.variant;\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'fnx-panel fnx-floating-icon',\n 'w-12 h-12',\n 'flex items-center justify-center cursor-pointer flex-shrink-0',\n 'focus:outline-none',\n statusVariantStyles[topStatusVariant]\n )}\n >\n <div className=\"flex items-center justify-center\">\n {portalOpen && <CloseIcon className=\"w-6 h-6\" />}\n {!portalOpen && <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />}\n </div>\n </button>\n );\n};\n","import { type ReactNode, createContext, useContext } from 'react';\nimport type { FloatingButtonPosition } from './types';\nimport { useCofheContext } from '../../providers';\nimport { useTrackPendingTransactions } from '@/hooks/useTrackPendingTransactions';\nimport { useTrackDecryptingTransactions } from '@/hooks/useTrackDecryptingTransactions';\nimport { useWatchPermitStatus } from '@/hooks/useWatchPermitStatus';\nimport { useWatchClaimablesStatus } from '@/hooks/useWatchClaimablesStatus';\n\nexport type TokenListMode = 'view' | 'select';\n\ninterface FnxFloatingButtonContextValue {\n theme: 'dark' | 'light';\n effectivePosition: FloatingButtonPosition;\n isLeftSide: boolean;\n isTopSide: boolean;\n}\n\nconst FnxFloatingButtonContext = createContext<FnxFloatingButtonContextValue | null>(null);\n\ninterface FnxFloatingButtonProviderProps {\n children?: ReactNode;\n}\n\nexport const FnxFloatingButtonProvider: React.FC<FnxFloatingButtonProviderProps> = ({ children }) => {\n const { state } = useCofheContext();\n\n const theme = state.theme;\n const effectivePosition = state.position;\n const isLeftSide = effectivePosition.includes('left');\n const isTopSide = effectivePosition.includes('top');\n\n useTrackPendingTransactions();\n useTrackDecryptingTransactions();\n useWatchPermitStatus();\n useWatchClaimablesStatus();\n\n return (\n <FnxFloatingButtonContext.Provider\n value={{\n theme,\n effectivePosition,\n isLeftSide,\n isTopSide,\n }}\n >\n {children}\n </FnxFloatingButtonContext.Provider>\n );\n};\n\nexport const useFnxFloatingButtonContext = (): FnxFloatingButtonContextValue => {\n const context = useContext(FnxFloatingButtonContext);\n if (!context) {\n throw new Error('useFnxFloatingButtonContext must be used within FnxFloatingButtonProvider');\n }\n return context;\n};\n","export const BIGINT_JSON_MARKER_KEY = '__bigint__' as const;\n\ntype BigintMarker = { [BIGINT_JSON_MARKER_KEY]: string };\n\ntype JSONReviver = (key: string, value: unknown) => unknown;\ntype JSONReplacer = (key: string, value: unknown) => unknown;\n\nexport const bigintJSONReviver: JSONReviver = (_key, value) => {\n if (typeof value === 'object' && value !== null && BIGINT_JSON_MARKER_KEY in value) {\n return BigInt((value as BigintMarker)[BIGINT_JSON_MARKER_KEY]);\n }\n return value;\n};\n\nexport const bigintJSONReplacer: JSONReplacer = (_key, value) => {\n if (typeof value === 'bigint') {\n return { [BIGINT_JSON_MARKER_KEY]: value.toString() } satisfies BigintMarker;\n }\n return value;\n};\n\nexport const bigintJSONStorageOptions = {\n reviver: bigintJSONReviver,\n replacer: bigintJSONReplacer,\n} as const;\n","import type { Token } from '@/types/token';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\ntype ChainRecord<T> = Record<number, T>;\ntype HashRecord<T> = Record<string, T>;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport enum TransactionStatus {\n Pending = 'pending',\n Failed = 'failed',\n Confirmed = 'confirmed',\n}\nexport type TransactionStatusString = 'Pending' | 'Failed' | 'Confirmed';\n\nexport enum TransactionActionType {\n ShieldSend = 'shieldSend',\n Shield = 'shield',\n Unshield = 'unshield',\n Claim = 'claim',\n}\nexport type TransactionActionString = 'Shielded Transfer' | 'Shield' | 'Unshield' | 'Claim';\n\ntype BaseTransaction = {\n hash: `0x${string}`;\n status: TransactionStatus;\n timestamp: number;\n chainId: number;\n // actionType: Exclude<TransactionActionType, TransactionActionType.Unshield>;\n account: Address;\n\n token: Token;\n //\n\n tokenAmount: bigint;\n isPendingDecryption: boolean;\n};\n\ntype ShieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Shield;\n};\ntype SendingTransaction = BaseTransaction & {\n actionType: TransactionActionType.ShieldSend;\n};\ntype ClaimingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Claim;\n};\n\ntype UnshieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Unshield;\n};\n\nexport type Transaction = UnshieldingTransaction | ShieldingTransaction | SendingTransaction | ClaimingTransaction;\n\ntype NewTransaction = DistributiveOmit<Transaction, 'status' | 'timestamp'>;\n\nexport interface TransactionStore {\n // TODO: should be chainId -> account -> txHash -> Transaction\n transactions: ChainRecord<HashRecord<Transaction>>;\n addTransaction: (transaction: NewTransaction) => void;\n getTransaction: (chainId: number, hash: string) => Transaction | undefined;\n getAllTransactions: (chainId: number, account?: string) => Transaction[];\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string) => Transaction[];\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => void;\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => void;\n clearTransactions: (chainId?: number) => void;\n}\n\nconst actionToStringMap: Record<TransactionActionType, TransactionActionString> = {\n [TransactionActionType.ShieldSend]: 'Shielded Transfer',\n [TransactionActionType.Shield]: 'Shield',\n [TransactionActionType.Unshield]: 'Unshield',\n [TransactionActionType.Claim]: 'Claim',\n};\n\nexport const actionToString = (a: TransactionActionType): TransactionActionString => actionToStringMap[a];\n\nconst statusToStringMap: Record<TransactionStatus, TransactionStatusString> = {\n [TransactionStatus.Pending]: 'Pending',\n [TransactionStatus.Failed]: 'Failed',\n [TransactionStatus.Confirmed]: 'Confirmed',\n};\n\nexport const statusToString = (a: TransactionStatus): TransactionStatusString => statusToStringMap[a];\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<TransactionStore>(() => localStorage, bigintJSONStorageOptions);\n\nfunction constructNewTx(transaction: NewTransaction): Transaction {\n return {\n ...transaction,\n status: TransactionStatus.Pending,\n timestamp: Date.now(),\n };\n}\n\nexport const useTransactionStore = create<TransactionStore>()(\n persist(\n (set, get) => ({\n transactions: {},\n\n addTransaction: (transaction: NewTransaction) => {\n set((state) => {\n const chainTxs = state.transactions[transaction.chainId] || {};\n const pendingTx = constructNewTx(transaction);\n return {\n transactions: {\n ...state.transactions,\n [transaction.chainId]: {\n ...chainTxs,\n [transaction.hash]: pendingTx,\n },\n },\n };\n });\n },\n\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n status,\n // if tx failed, it's no longer pending decryption\n isPendingDecryption: status === TransactionStatus.Failed ? false : chainTxs[hash].isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n getTransaction: (chainId: number, hash: string): Transaction | undefined => {\n return get().transactions[chainId]?.[hash];\n },\n\n getAllTransactions: (chainId: number, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => !account || !tx.account || tx.account.toLowerCase() === account.toLowerCase())\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => {\n return tx.account.toLowerCase() === account?.toLowerCase();\n })\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n clearTransactions: (chainId?: number) => {\n set((state) => {\n if (chainId !== undefined) {\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {},\n },\n };\n }\n return { transactions: {} };\n });\n },\n }),\n {\n name: 'cofhe-transaction-store',\n storage: bigintStorage,\n }\n )\n);\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { CONNECT_STORE_DEFAULTS, type CofheClient, type CofheClientConnectionState } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { NOOP_CALLBACK } from '../utils';\n\nconst subscribeToConnectionConstructor = (client: CofheClient) => (onStoreChange: () => void) => {\n return client.subscribe(() => {\n onStoreChange();\n });\n};\nconst getConnectionSnapshotConstructor = (client: CofheClient) => () => client.getSnapshot();\n\nconst DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;\n\n// sync core store\nexport const useCofheConnection = (): CofheClientConnectionState => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToConnectionConstructor(client),\n getConnectionSnapshot: client && getConnectionSnapshotConstructor(client),\n };\n }, [client]);\n\n return useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n};\n\nexport const useCofheIsConnected = (): boolean => {\n const { connected } = useCofheConnection();\n return connected;\n};\n\nexport const useCofheAccount = (): `0x${string}` | undefined => {\n const { account } = useCofheConnection();\n return account;\n};\n\nexport const useCofheChainId = (): number | undefined => {\n const { chainId } = useCofheConnection();\n return chainId;\n};\n\nexport const useCofheSupportedChains = () => {\n const client = useCofheContext().client;\n return client.config.supportedChains;\n};\n\nexport const useCofhePublicClient = () => useCofheConnection().publicClient;\n\nexport const useCofheWalletClient = () => useCofheConnection().walletClient;\n","import {\n TransactionActionType,\n TransactionStatus,\n useTransactionStore,\n type Transaction,\n} from '@/stores/transactionStore';\nimport { useCofhePublicClient } from './useCofheConnection';\nimport { useInternalQueries, useInternalQueryClient } from '@/providers';\nimport { assert } from 'ts-essentials';\nimport { constructCofheReadContractQueryForInvalidation } from './useCofheReadContract';\nimport { QueryClient, type QueriesOptions } from '@tanstack/react-query';\nimport type { Address, TransactionReceipt } from 'viem';\nimport { getTokenContractConfig } from '@/constants/confidentialTokenABIs';\nimport { ETH_ADDRESS_LOWERCASE, type Token } from './useCofheTokenLists';\nimport { constructPublicTokenBalanceQueryKeyForInvalidation } from './useCofheTokenPublicBalance';\nimport { constructUnshieldClaimsQueryKeyForInvalidation, invalidateClaimableQueries } from './useCofheTokenClaimable';\nimport { usePendingTransactions } from './usePendingTransactions';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\nimport { useEffect, useRef } from 'react';\n\nfunction invalidateConfidentialTokenBalanceQueries(token: Token, queryClient: QueryClient) {\n const tokenBalanceQueryKey = constructCofheReadContractQueryForInvalidation({\n cofheChainId: token.chainId,\n address: token.address,\n functionName: getTokenContractConfig(token.extensions.fhenix.confidentialityType).functionName,\n });\n\n console.log('Invalidating shield/send read contract queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n // TODO: it can potentially invalidate irrelevenat queries who happen to belong to the same contract but different function. Not sure if worth fixing\n exact: false,\n });\n}\n\nfunction invalidatePublicTokenBalanceQueries(\n {\n tokenAddress,\n chainId,\n accountAddress,\n }: {\n tokenAddress: Address;\n chainId: number;\n accountAddress: Address;\n },\n queryClient: QueryClient\n) {\n const tokenBalanceQueryKey = constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n accountAddress,\n });\n\n console.log('Invalidating public token balance read contract queries for token:', tokenBalanceQueryKey);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n });\n}\n\nfunction invalidatePublicAndConfidentialTokenBalanceQueries(\n token: Token,\n accountAddress: Address,\n queryClient: QueryClient\n) {\n invalidateConfidentialTokenBalanceQueries(token, queryClient);\n\n const publicPairTokenAddress = token.extensions.fhenix.erc20Pair?.address;\n assert(publicPairTokenAddress, 'Public pair token address is required for shield transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicPairTokenAddress,\n chainId: token.chainId,\n accountAddress,\n },\n queryClient\n );\n}\n\ntype UseTrackPendingTransactionsInput = {\n onReceiptSuccess: (tx: Transaction, receipt: TransactionReceipt) => void;\n onReceiptFail?: (tx: Transaction, receipt: TransactionReceipt) => void;\n onFetchFailure?: (error: unknown, tx: Transaction) => void;\n};\nfunction useTrackPendingTransactionsBase({\n onReceiptSuccess,\n onReceiptFail,\n onFetchFailure,\n}: UseTrackPendingTransactionsInput) {\n // Batch check pending transactions using react-query's useQueries\n const accountsPendingTxs = usePendingTransactions();\n const publicClient = useCofhePublicClient();\n\n const queries: QueriesOptions<TransactionReceipt[]> = accountsPendingTxs.map((tx) => ({\n queryKey: ['tx-receipt', tx.chainId, tx.hash],\n queryFn: async () => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n try {\n const receipt = await publicClient.waitForTransactionReceipt({ hash: tx.hash as `0x${string}` });\n\n const status = receipt.status === 'success' ? TransactionStatus.Confirmed : TransactionStatus.Failed;\n // invalidate if tx was successful\n if (status === TransactionStatus.Confirmed) onReceiptSuccess(tx, receipt);\n else onReceiptFail?.(tx, receipt);\n\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, status);\n\n return receipt;\n } catch (e) {\n onFetchFailure?.(e, tx);\n // no need to invalidate on failure, since nothing has changed on chain\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, TransactionStatus.Failed);\n throw e;\n }\n },\n\n enabled: !!publicClient && accountsPendingTxs.length > 0,\n refetchOnWindowFocus: false,\n refetchOnReconnect: true,\n }));\n useInternalQueries({\n queries,\n });\n}\n\nfunction useHandleInvalidations() {\n const queryClient = useInternalQueryClient();\n\n const { upsert: upsertDecryptionWatcher, byKey } = useDecryptionWatchersStore();\n console.log('Scheduled invalidations store:', byKey);\n const handleInvalidations = (tx: Transaction) => {\n // each transaction requires gas, so native token balance changes on every transaction\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: ETH_ADDRESS_LOWERCASE,\n chainId: tx.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n if (tx.actionType === TransactionActionType.ShieldSend) {\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n } else if (tx.actionType === TransactionActionType.Shield) {\n // on shield public balance decreases and private increases\n invalidatePublicAndConfidentialTokenBalanceQueries(tx.token, tx.account, queryClient);\n } else if (tx.actionType === TransactionActionType.Unshield) {\n // on unshield - private balance decreases, claimable increases, public remains the same\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n\n // schedule invalidation for unshield claims once decryption is observed\n upsertDecryptionWatcher({\n key: `${tx.actionType}-tx-${tx.hash}`,\n accountAddress: tx.account,\n createdAt: Date.now(),\n chainId: tx.chainId,\n triggerTxHash: tx.hash,\n queryKeys: [\n constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: tx.token.chainId,\n tokenAddress: tx.token.address,\n confidentialityType: tx.token.extensions.fhenix.confidentialityType,\n accountAddress: tx.account,\n }),\n ],\n });\n } else if (tx.actionType === TransactionActionType.Claim) {\n // on claim - claimable decreases, public increases, private remains the same\n const publicTokenAddress = tx.token.extensions.fhenix.erc20Pair?.address;\n assert(publicTokenAddress, 'Public pair token address is required for claim transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicTokenAddress,\n chainId: tx.token.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n invalidateClaimableQueries({\n token: tx.token,\n accountAddress: tx.account,\n\n queryClient,\n });\n } else {\n // @ts-expect-error actionType = \"never\" at this point\n console.warn('No invalidation logic for transaction action type:', tx.actionType);\n }\n };\n\n return handleInvalidations;\n}\n\nfunction useOnceTransactionSubmitted(onSubmit: (tx: Transaction) => void) {\n const pendingTransactions = usePendingTransactions();\n const previousPendingTxsRef = useRef<Transaction[]>([]);\n\n useEffect(() => {\n const newlySubmittedTxs = pendingTransactions.filter(\n (tx) => !previousPendingTxsRef.current.some((prevTx) => prevTx.hash === tx.hash)\n );\n\n for (const tx of newlySubmittedTxs) {\n onSubmit(tx);\n\n // You can add any additional logic you want to execute once per transaction submission here\n }\n\n previousPendingTxsRef.current = pendingTransactions;\n }, [onSubmit, pendingTransactions]);\n}\n\nexport function useTrackPendingTransactions() {\n const handleInvalidations = useHandleInvalidations();\n const { onTransactionMined, onWatchReceiptFailure, onTransactionSubmitted } = useTransactionGlobalLifecycle();\n\n // 1 tx submitted\n useOnceTransactionSubmitted(onTransactionSubmitted);\n\n useTrackPendingTransactionsBase({\n // 2.a. tx mined successfully\n onReceiptSuccess: (tx, receipt) => {\n handleInvalidations(tx);\n onTransactionMined(tx, receipt);\n },\n // 2.b. tx mined with failure\n onReceiptFail: (tx, receipt) => {\n onTransactionMined(tx, receipt);\n },\n\n // 2.c. fetch failure\n onFetchFailure: (error, tx) => {\n onWatchReceiptFailure(error, tx);\n },\n });\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport {\n type Address,\n type ContractFunctionReturnType,\n type ContractFunctionName,\n type ContractFunctionArgs,\n type ReadContractReturnType,\n} from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheActivePermit } from './useCofhePermits';\nimport { assert } from 'ts-essentials';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { useInternalQueries, useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi, type CofheReturnType, type ContractReturnType } from '@cofhe/abi';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContract';\n\nfunction serializeIfBigint(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n}\n\nfunction serializeBigintRecursively(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(serializeBigintRecursively);\n } else {\n return serializeIfBigint(value);\n }\n}\n\nexport function constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n enabled,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n args?: readonly unknown[];\n requiresPermit?: boolean;\n activePermitHash?: string;\n enabled?: boolean;\n}): readonly unknown[] {\n return [\n ...constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n }),\n\n args ? serializeBigintRecursively(args) : [],\n requiresPermit ? activePermitHash : undefined,\n // normally, \"enabled\" shouldn't be part of queryKey, but without adding it, there is a weird bug: when there's a CofheError, query still running queryFn resulting in the blank screen\n enabled,\n ];\n}\n\nexport function constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n // add more specificity if needed. Just make sure it matches the order of keys\n}): readonly unknown[] {\n return [QUERY_CACHE_PREFIX, cofheChainId, address, functionName];\n}\n\nexport type UseCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = Omit<UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error>, 'queryKey' | 'queryFn'> & {\n enabled?: boolean; // TODO: check callback variant, maybe it'll fix the issue above about forcing enable to be query key\n};\n\nexport function getEnabledForCofheReadContract(params: {\n isCofheErrorActive: boolean;\n publicClient: unknown;\n address?: Address;\n abi?: Abi;\n functionName?: string;\n requiresPermit: boolean;\n hasActivePermit: boolean;\n userEnabled?: boolean;\n}): boolean {\n const { isCofheErrorActive, publicClient, address, abi, functionName, requiresPermit, hasActivePermit, userEnabled } =\n params;\n\n return (\n !isCofheErrorActive &&\n !!publicClient &&\n !!address &&\n !!abi &&\n !!functionName &&\n (!requiresPermit || hasActivePermit) &&\n (userEnabled ?? true)\n );\n}\n\nfunction convertReadContractResultToCofheReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(\n value: ContractFunctionReturnType<TAbi, 'pure' | 'view', TfunctionName, TArgs>\n): ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n> {\n // TODO: convertViemReturnTypeToCofheReturnType -- need core typing changes, currently seems to not support fn overloads\n // viems inferred TArgs mismatch Cofhe's\n return value as ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n >;\n}\n\nexport function createCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(params: {\n enabled: boolean;\n cofheChainId?: number;\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: TArgs;\n requiresPermit: boolean;\n activePermitHash?: string;\n publicClient: ReturnType<typeof useCofhePublicClient>;\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n}): UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error> {\n const {\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n publicClient,\n queryOptions,\n } = params;\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return {\n enabled,\n queryKey: constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash,\n enabled,\n }),\n queryFn: async () => {\n assert(address, 'Contract address should be guaranteed by enabled check');\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(abi, 'ABI should be guaranteed by enabled check');\n assert(functionName, 'Function name should be guaranteed by enabled check');\n\n const out = await publicClient.readContract({\n address,\n abi,\n functionName,\n args,\n });\n\n const convertedOut = convertReadContractResultToCofheReturnType<TAbi, TfunctionName, TArgs>(out);\n\n const transformed = transformEncryptedReturnTypes(abi, functionName, convertedOut);\n\n return transformed;\n },\n ...restQueryOptions,\n };\n}\n\n/**\n * Generic hook: read a contract and return the result (with permit/error gating support).\n * is Cofhe-ABI aware: returns CofheReturnType (but doesn't support TArgs typing yet).\n */\nexport type UseCofheReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = UseQueryResult<CofheReturnType<TAbi, TfunctionName>, Error> & {\n disabledDueToMissingPermit: boolean;\n};\nexport function useCofheReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>\n): UseCofheReadContractResult<TAbi, TfunctionName> {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const isCofheErrorActive = useIsCofheErrorActive();\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const activePermit = useCofheActivePermit();\n\n const enabled = getEnabledForCofheReadContract({\n isCofheErrorActive,\n publicClient,\n address,\n abi,\n functionName,\n requiresPermit,\n hasActivePermit: !!activePermit,\n userEnabled: queryOptions?.enabled,\n });\n\n const result = useInternalQuery(\n createCofheReadContractQueryOptions({\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash: activePermit?.permit.hash,\n publicClient,\n queryOptions,\n })\n );\n\n return {\n ...result,\n disabledDueToMissingPermit: requiresPermit && !activePermit,\n };\n}\n","import type { CofheClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { NOOP_CALLBACK } from '../utils';\nimport { PERMIT_STORE_DEFAULTS, PermitUtils, type Permit } from '@cofhe/sdk/permits';\nimport { useCofheConnection } from './useCofheConnection';\n\nconst subscribeToPermitsConstructor = (client: CofheClient) => (onStoreChange: () => void) => {\n return client.permits.subscribe(() => {\n onStoreChange();\n });\n};\n\nconst getPermitsSnapshotConstructor = (client: CofheClient) => () => client.permits.getSnapshot();\n\n// type PermitsState = ReturnType<CofheClientPermits['getSnapshot']>;\n\nconst DEFAULT_SNAPSHOT_GETTER = () => PERMIT_STORE_DEFAULTS;\n\nconst useCofhePermitsStore = () => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToPermitsConstructor(client),\n getConnectionSnapshot: client && getPermitsSnapshotConstructor(client),\n };\n }, [client]);\n\n const state = useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n return { state, client };\n};\n\nexport const useCofheActivePermit = ():\n | {\n permit: Permit;\n isValid: boolean;\n }\n | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n // active permit\n\n const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : undefined;\n const serialized = hash && allPermits ? allPermits[hash] : undefined;\n\n const permitData = useMemo(() => {\n const _permit = serialized ? PermitUtils.deserialize(serialized) : undefined;\n if (!_permit || !hash) return undefined;\n return {\n permit: _permit,\n isValid: _permit ? PermitUtils.isValid(_permit).valid : false,\n hash,\n };\n }, [serialized, hash]);\n\n return connected ? permitData : undefined;\n};\n\nexport const useCofheActivePermitHash = (): string | undefined => {\n const activePermit = useCofheActivePermit();\n return useMemo(() => activePermit?.permit.hash, [activePermit?.permit.hash]);\n};\n\nexport const useCofheAllPermits = (): Permit[] => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n\n const allPermitsWithHashes = useMemo(\n () =>\n allPermits\n ? Object.keys(allPermits)\n .filter((hash) => !!allPermits[hash])\n .map((hash) => {\n const serializedPermit = allPermits[hash];\n if (!serializedPermit) throw new Error('Permit data missing');\n\n return PermitUtils.deserialize(serializedPermit);\n })\n : [],\n [allPermits]\n );\n\n return connected ? allPermitsWithHashes : [];\n};\n\nexport const useCofhePermit = (hash: string): Permit | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n const { state } = useCofhePermitsStore();\n return useMemo(() => {\n if (!connected || !chainId || !account) return undefined;\n const serializedPermit = state.permits[chainId]?.[account]?.[hash];\n if (!serializedPermit) return undefined;\n return PermitUtils.deserialize(serializedPermit);\n }, [connected, chainId, account, hash, state.permits]);\n};\n\ntype Callbacks = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport const useCofheRemovePermit = ({ onSuccess, onError }: Callbacks = {}) => {\n const { account, chainId } = useCofheConnection();\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n async (hashToRemove: string) => {\n try {\n if (!client || !chainId || !account) {\n throw new Error('Client, chainId, and account must be defined to remove a permit');\n }\n\n client.permits.removePermit(hashToRemove, chainId, account);\n onSuccess?.();\n } catch (error) {\n onError?.(new Error(error instanceof Error ? error.message : 'Unknown error'));\n }\n },\n [client, chainId, account, onSuccess, onError]\n );\n};\n\nexport const useCofheSelectPermit = ({ onSuccess, onError }: Callbacks = {}) => {\n const { account, chainId } = useCofheConnection();\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToSet: string) => {\n try {\n if (!client || !chainId || !account) {\n throw new Error('Client, chainId, and account must be defined to set active permit hash');\n }\n client.permits.selectActivePermit(hashToSet, chainId, account);\n onSuccess?.();\n } catch (error) {\n onError?.(new Error(error instanceof Error ? error.message : 'Unknown error'));\n }\n },\n [client, chainId, account, onSuccess, onError]\n );\n};\n","import { CofheError } from '@cofhe/sdk';\nimport { useContext } from 'react';\nimport { ErrorBoundaryContext } from 'react-error-boundary';\n\n/**\n *\n * @returns check if ErrorBoundary is currently handling a CofheError.\n * This is useful to prevent/block interactions with Cofhe until the error is resolved by the handling logic and the error is reset\n */\nexport function useIsCofheErrorActive(): boolean {\n const errorBoundaryContext = useContext(ErrorBoundaryContext);\n return errorBoundaryContext?.error instanceof CofheError;\n}\n","import type { Token } from '@/types/token';\nimport { parseAbi, type Abi } from 'viem';\n\n// ============================================================================\n// ERC20 Standard ABIs (for approval flow)\n// ============================================================================\n\n/**\n * ABI for ERC20 allowance check\n */\nexport const ERC20_ALLOWANCE_ABI = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n]);\n\n/**\n * ABI for ERC20 approve\n */\nexport const ERC20_APPROVE_ABI = parseAbi(['function approve(address spender, uint256 amount) returns (bool)']);\n\n// ============================================================================\n// Confidential Token Balance ABIs\n// ============================================================================\n\n/**\n * ABI for wrapped confidentiality type tokens (e.g., Redact)\n * Uses `encBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_WRAPPED_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'encBalanceOf',\n outputs: [\n {\n internalType: 'euint128',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for pure confidentiality type tokens (e.g., Base mini app)\n * Uses `confidentialBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_PURE_ABI = parseAbi([\n 'function confidentialBalanceOf(address account) view returns (uint256)',\n]);\n\n/**\n * ABI for dual confidentiality type tokens\n * Uses `confidentialBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_DUAL_ABI = parseAbi([\n 'function confidentialBalanceOf(address account) view returns (uint256)',\n]);\n\n/**\n * Map confidentialityType to balance ABIs and function names\n */\nexport const CONFIDENTIAL_ABIS = {\n wrapped: {\n abi: CONFIDENTIAL_TYPE_WRAPPED_ABI,\n functionName: 'encBalanceOf' as const,\n },\n pure: {\n abi: CONFIDENTIAL_TYPE_PURE_ABI,\n functionName: 'confidentialBalanceOf' as const,\n },\n dual: {\n abi: CONFIDENTIAL_TYPE_DUAL_ABI,\n functionName: 'confidentialBalanceOf' as const,\n },\n} as const;\n\n// ============================================================================\n// Confidential Token Transfer ABIs\n// ============================================================================\n\n/**\n * ABI for wrapped confidentiality type token transfers\n * Uses `encTransfer(address to, InEuint128 inValue)` function\n */\nexport const WRAPPED_TRANSFER_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'ctHash',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'securityZone',\n type: 'uint8',\n },\n {\n internalType: 'uint8',\n name: 'utype',\n type: 'uint8',\n },\n {\n internalType: 'bytes',\n name: 'signature',\n type: 'bytes',\n },\n ],\n internalType: 'struct InEuint128',\n name: 'inValue',\n type: 'tuple',\n },\n ],\n name: 'encTransfer',\n outputs: [\n {\n internalType: 'euint128',\n name: 'transferred',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for pure confidentiality type token transfers\n * Uses `confidentialTransfer(address to, InEuint64 inValue)` function\n */\nexport const PURE_TRANSFER_ABI = [\n {\n name: 'confidentialTransfer',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n {\n name: 'inValue',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'securityZone', type: 'uint8' },\n { name: 'utype', type: 'uint8' },\n { name: 'signature', type: 'bytes' },\n ],\n },\n ],\n outputs: [{ name: 'transferred', type: 'uint256' }],\n },\n] as const satisfies Abi;\n\n/**\n * ABI for dual confidentiality type token transfers (TBD - to be implemented)\n * Uses `TBD_DUAL_FUNCTION_NAME(address to, InEuintXXX inValue)` function\n */\nexport const DUAL_TRANSFER_ABI = [\n {\n name: 'TBD_DUAL_FUNCTION_NAME',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n {\n name: 'inValue',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'securityZone', type: 'uint8' },\n { name: 'utype', type: 'uint8' },\n { name: 'signature', type: 'bytes' },\n ],\n },\n ],\n outputs: [{ name: 'transferred', type: 'uint256' }],\n },\n] as const satisfies Abi;\n\n/**\n * Map confidentialityType to transfer ABIs and function names\n */\nexport const TRANSFER_ABIS = {\n wrapped: {\n abi: WRAPPED_TRANSFER_ABI,\n functionName: 'encTransfer' as const,\n },\n pure: {\n abi: PURE_TRANSFER_ABI,\n functionName: 'confidentialTransfer' as const,\n },\n dual: {\n // Placeholder for dual type\n abi: DUAL_TRANSFER_ABI,\n functionName: 'TBD_DUAL_FUNCTION_NAME' as const,\n },\n} as const;\n\n// ============================================================================\n// Shield/Unshield ABIs (for dual and wrapped tokens)\n// ============================================================================\n\n/**\n * ABI for dual token shield - converts regular balance to confidential\n * Takes plaintext uint256 amount\n */\nexport const DUAL_SHIELD_ABI = parseAbi(['function shield(uint256 amount) public']);\n\n/**\n * ABI for dual token unshield - initiates conversion from confidential to regular\n * Takes plaintext uint64 amount\n */\nexport const DUAL_UNSHIELD_ABI = parseAbi(['function unshield(uint64 amount) public']);\n\n/**\n * ABI to claim unshielded tokens after decryption completes\n */\nexport const DUAL_CLAIM_UNSHIELD_ABI = parseAbi(['function claimUnshielded() public']);\n\n/**\n * ABI to check pending unshield claim status\n * Returns UnshieldClaim struct with: ctHash, requestedAmount, decryptedAmount, decrypted, claimed\n */\nexport const DUAL_GET_UNSHIELD_CLAIM_ABI = [\n {\n name: 'getUserUnshieldClaim',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'user', type: 'address' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint64' },\n { name: 'decryptedAmount', type: 'uint64' },\n { name: 'decrypted', type: 'bool' },\n { name: 'claimed', type: 'bool' },\n ],\n },\n ],\n },\n] as const satisfies Abi;\n\n/**\n * ABI for wrapped token encrypt (shield) - requires prior ERC20 approval\n * Transfers ERC20 tokens to wrapper and mints confidential tokens\n */\nexport const WRAPPED_ENCRYPT_ABI = parseAbi(['function encrypt(address to, uint128 value) public']);\n\n/**\n * ABI for wrapped token decrypt (unshield) - initiates conversion back to ERC20\n * Burns confidential tokens and creates a claim for ERC20\n */\nexport const WRAPPED_DECRYPT_ABI = parseAbi(['function decrypt(address to, uint128 value) public']);\n\n/**\n * ABI for wrapped token claim decrypted - claims ERC20 after decryption\n */\nexport const WRAPPED_CLAIM_DECRYPTED_ABI = parseAbi(['function claimDecrypted(uint256 ctHash) public']);\n\n/**\n * ABI for wrapped token claim all decrypted - claims all pending ERC20\n */\nexport const WRAPPED_CLAIM_ALL_DECRYPTED_ABI = parseAbi(['function claimAllDecrypted() public']);\n\n/**\n * ABI for wrapped token getUserClaims - returns all pending claims for a user\n * Returns array of Claim structs: { ctHash, requestedAmount, decryptedAmount, decrypted, to, claimed }\n */\nexport const WRAPPED_GET_USER_CLAIMS_ABI = [\n {\n inputs: [{ name: 'user', type: 'address' }],\n name: 'getUserClaims',\n outputs: [\n {\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint128' },\n { name: 'decryptedAmount', type: 'uint128' },\n { name: 'decrypted', type: 'bool' },\n { name: 'to', type: 'address' },\n { name: 'claimed', type: 'bool' },\n ],\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for wrapped ETH encrypt with ETH value\n */\nexport const WRAPPED_ETH_ENCRYPT_ETH_ABI = parseAbi(['function encryptETH(address to) public payable']);\n\n/**\n * ABI for wrapped ETH encrypt with WETH\n */\nexport const WRAPPED_ETH_ENCRYPT_WETH_ABI = parseAbi(['function encryptWETH(address to, uint128 value) public']);\n\n/**\n * Map confidentialityType to shield ABIs and function names\n */\nexport const SHIELD_ABIS = {\n dual: {\n abi: DUAL_SHIELD_ABI,\n functionName: 'shield' as const,\n },\n wrapped: {\n // TBD - needs approval flow and underlying token reference\n abi: WRAPPED_ENCRYPT_ABI,\n functionName: 'encrypt' as const,\n },\n} as const;\n\n/**\n * Map confidentialityType to unshield ABIs and function names\n */\nexport const UNSHIELD_ABIS = {\n dual: {\n abi: DUAL_UNSHIELD_ABI,\n functionName: 'unshield' as const,\n },\n wrapped: {\n // TBD - needs claim flow\n abi: WRAPPED_DECRYPT_ABI,\n functionName: 'decrypt' as const,\n },\n} as const;\n\n/**\n * Map confidentialityType to claim ABIs and function names\n */\nexport const CLAIM_ABIS = {\n dual: {\n abi: DUAL_CLAIM_UNSHIELD_ABI,\n functionName: 'claimUnshielded' as const,\n },\n wrapped: {\n abi: WRAPPED_CLAIM_ALL_DECRYPTED_ABI,\n functionName: 'claimAllDecrypted' as const,\n },\n} as const;\n\nexport function getTokenContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n return CONFIDENTIAL_ABIS[confidentialityType];\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useCofheContext } from '../providers/CofheProvider';\nimport { useMemo } from 'react';\nimport { ETH_ADDRESS_LOWERCASE, type Erc20Pair, type Token } from '../types/token.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport type { Address } from 'viem';\nimport { useCofheChainId } from './useCofheConnection';\n\nexport { ETH_ADDRESS_LOWERCASE, type Token, type Erc20Pair };\n\ntype TokenList = {\n name: string;\n timestamp: string;\n version: {\n major: number;\n minor: number;\n patch: number;\n };\n tokens: Token[];\n};\n\ntype UseTokenListsResult = UseQueryResult<TokenList, Error>[];\ntype UseTokenListsInput = {\n chainId?: number;\n};\ntype UseTokenListsOptions = Omit<UseQueryOptions<TokenList, Error>, 'queryKey' | 'queryFn' | 'select'>;\n// Returns array of query results for token lists for the current network\nexport function useCofheTokenLists(\n { chainId }: UseTokenListsInput,\n queryOptions?: UseTokenListsOptions\n): UseTokenListsResult {\n const widgetConfig = useCofheContext().client.config.react;\n const tokensListsUrls = chainId ? widgetConfig.tokenLists?.[chainId] : [];\n\n const queriesOptions: UseQueryOptions<TokenList, Error>[] =\n tokensListsUrls?.map((url) => ({\n cacheTime: Infinity,\n staleTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: ['tokenList', chainId, url],\n queryFn: async ({ signal }): Promise<TokenList> => {\n const timestamp = Date.now();\n const urlWithCacheBust = `${url}${url.includes('?') ? '&' : '?'}v=${timestamp}`;\n const res = await fetch(urlWithCacheBust, { signal });\n if (!res.ok) {\n throw new Error(`Failed to fetch token list: ${res.status} ${res.statusText}`);\n }\n return await res.json();\n },\n select: (data: TokenList): TokenList => {\n // filter only tokens for the current chain (some lists contain multiple chains)\n return {\n ...data,\n tokens: data.tokens.filter((token) => token.chainId === chainId),\n };\n },\n ...queryOptions,\n })) || [];\n\n const result = useInternalQueries({\n queries: queriesOptions,\n });\n\n return result;\n}\n\nexport function selectTokensFromTokensList(tokenList: TokenList): Token[] {\n return tokenList.tokens;\n}\n\nexport function useCofheTokens(chainId?: number): Token[] {\n const tokenLists = useCofheTokenLists({ chainId });\n const tokens = useMemo(() => {\n const map = new Map<string, Token>();\n tokenLists.forEach((result) => {\n if (!result.data) return;\n\n result.data.tokens.forEach((token) => {\n const key = `${token.chainId}-${token.address.toLowerCase()}`;\n if (map.has(key)) return;\n map.set(key, token);\n });\n });\n return Array.from(map.values());\n }, [tokenLists]);\n return tokens;\n}\n\nexport function useCofheToken(\n { chainId: _chainId, address }: { chainId?: number; address?: Address },\n // TODO: after adding this functionality, don't fetch if not enabled\n metdataQueryOptions?: Omit<UseQueryOptions<Token | undefined, Error>, 'queryKey' | 'queryFn' | 'select'>\n) {\n const cofheChainId = useCofheChainId();\n const chainId = _chainId ?? cofheChainId;\n\n const tokens = useCofheTokens(chainId);\n const tokenFromList = useMemo(() => {\n if (!address || !chainId) return;\n return tokens.find((t) => t.chainId === chainId && t.address.toLowerCase() === address.toLowerCase());\n }, [address, chainId, tokens]);\n\n // TODO: fetch from chain (metadata) if all the token lists have been loaded but token is not found\n\n return tokenFromList;\n}\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheAccount, useCofhePublicClient } from './useCofheConnection';\nimport { type Token, ETH_ADDRESS_LOWERCASE } from './useCofheTokenLists';\nimport { ERC20_BALANCE_OF_ABI } from '../constants/erc20ABIs';\nimport { assert } from 'ts-essentials';\nimport { useInternalQuery } from '../providers/index';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\n\nexport function constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId?: number;\n accountAddress?: Address;\n tokenAddress?: Address;\n}): readonly unknown[] {\n return ['tokenBalance', chainId, accountAddress?.toLowerCase(), tokenAddress?.toLowerCase()];\n}\n\nexport function constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId: number;\n accountAddress: Address;\n tokenAddress: Address;\n}) {\n return constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n });\n}\n\ntype UseTokenBalanceInput = {\n /** Token contract address */\n tokenAddress?: Address;\n /** Account address to check balance for (optional, defaults to connected account) */\n accountAddress?: Address;\n};\n\nexport type UseTokenBalanceOptions<TSelectedData = bigint> = Omit<\n UseQueryOptions<bigint, Error, TSelectedData>,\n 'queryKey' | 'queryFn'\n>;\n\nexport type PublicTokenBalanceSource = {\n address: Address;\n decimals: number;\n};\n\nexport function getPublicTokenBalanceSource(token: Token | undefined): PublicTokenBalanceSource | undefined {\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n const underlyingErc20 = token?.extensions.fhenix.erc20Pair;\n\n const tokenToFetchBalanceFrom =\n confidentialityType === 'wrapped' ? underlyingErc20 : confidentialityType === 'dual' ? token : undefined;\n\n if (!tokenToFetchBalanceFrom) return undefined;\n\n return {\n address: tokenToFetchBalanceFrom.address,\n decimals: tokenToFetchBalanceFrom.decimals,\n };\n}\n\nexport function createPublicTokenBalanceQueryOptions<TSelectedData = bigint>(params: {\n publicClient: ReturnType<typeof useCofhePublicClient>;\n accountAddress?: Address;\n tokenAddress?: Address;\n queryOptions?: UseTokenBalanceOptions<TSelectedData>;\n}): UseQueryOptions<bigint, Error, TSelectedData> {\n const { publicClient, accountAddress, tokenAddress, queryOptions } = params;\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions ?? {};\n const baseEnabled = !!publicClient && !!accountAddress && !!tokenAddress;\n const enabled = baseEnabled && (userEnabled ?? true);\n\n const queryKey = constructPublicTokenBalanceQueryKey({\n chainId: publicClient?.chain?.id,\n accountAddress,\n tokenAddress,\n });\n\n return {\n queryKey,\n queryFn: async () => {\n assert(tokenAddress, 'Token address is required to fetch token balance');\n assert(publicClient, 'PublicClient is required to fetch token balance');\n assert(accountAddress, 'Account address is required to fetch token balance');\n\n const isNativeToken = tokenAddress.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n const balance = isNativeToken\n ? publicClient.getBalance({\n address: accountAddress,\n })\n : publicClient.readContract({\n address: tokenAddress,\n abi: ERC20_BALANCE_OF_ABI,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n\n return balance;\n },\n enabled,\n refetchOnMount: false,\n ...restQueryOptions,\n };\n}\n\n/**\n * Hook to get ERC20 token balance and return normalized display value\n * @param input - Token address, decimals, and optional publicClient/accountAddress\n * @param queryOptions - Optional React Query options\n * @returns Query result with normalized balance as string\n */\nfunction useTokenBalance<TSelectedData = bigint>(\n { tokenAddress, accountAddress }: UseTokenBalanceInput,\n queryOptions?: UseTokenBalanceOptions<TSelectedData>\n) {\n const publicClient = useCofhePublicClient();\n\n return useInternalQuery(\n createPublicTokenBalanceQueryOptions({\n publicClient,\n accountAddress,\n tokenAddress,\n queryOptions,\n })\n );\n}\n\n// ============================================================================\n// Unified Public Balance Hook\n// ============================================================================\n\ntype UsePublicTokenBalanceInput = {\n /** Token from token list */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UsePublicTokenBalanceResult = {\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Hook to get public (non-confidential) balance for a token.\n * Handles both dual tokens (balanceOf on token address) and wrapped tokens (balanceOf on erc20Pair or native ETH).\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenPublicBalance(\n { token, accountAddress, displayDecimals = 5 }: UsePublicTokenBalanceInput,\n options?: Omit<UseTokenBalanceOptions, 'select'> // disallow passing 'select' because it's harder to type\n): UsePublicTokenBalanceResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress || connectedAccount;\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const tokenToFetchBalanceFrom = getPublicTokenBalanceSource(token);\n\n const { data, isFetching, refetch } = useTokenBalance(\n {\n tokenAddress: tokenToFetchBalanceFrom?.address,\n accountAddress: account,\n },\n {\n enabled: userEnabled,\n select: (value) => {\n assert(\n typeof tokenToFetchBalanceFrom?.decimals === 'number',\n 'Token decimals must be defined to format public token balance'\n );\n return formatTokenAmount(value, tokenToFetchBalanceFrom.decimals, displayDecimals);\n },\n ...restOptions,\n }\n );\n\n return {\n data,\n isFetching,\n refetch,\n };\n}\n","import { parseAbi } from 'viem';\n\n// ============================================================================\n// Standard ERC20 ABIs\n// ============================================================================\n\n/**\n * Standard ERC20 balanceOf function ABI\n */\nexport const ERC20_BALANCE_OF_ABI = parseAbi(['function balanceOf(address owner) view returns (uint256)']);\n\n/**\n * Standard ERC20 decimals function ABI\n */\nexport const ERC20_DECIMALS_ABI = parseAbi(['function decimals() view returns (uint8)']);\n\n/**\n * Standard ERC20 symbol function ABI\n */\nexport const ERC20_SYMBOL_ABI = parseAbi(['function symbol() view returns (string)']);\n\n/**\n * Standard ERC20 name function ABI\n */\nexport const ERC20_NAME_ABI = parseAbi(['function name() view returns (string)']);\n","import BigNumber from 'bignumber.js';\n\nexport type TokenFormatOutput = {\n /** Raw balance in smallest unit (bigint) */\n wei: bigint;\n /** Numeric balance value */\n unit: BigNumber;\n /** Formatted balance string */\n formatted: string;\n};\n\nexport function formatTokenAmount(amount: bigint, decimals: number, displayDecimals?: number): TokenFormatOutput {\n const amountBN = new BigNumber(amount).dividedBy(10 ** decimals);\n return {\n wei: amount,\n unit: amountBN,\n formatted: displayDecimals\n ? amountBN\n .toFixed(displayDecimals)\n // remove trailing zeros\n .replace(/\\.?0+$/, '')\n : amountBN.toFixed(), // the only precise way, without parseFloat\n };\n}\n\nexport function unitToWei(amount: string, decimals: number): bigint {\n return BigInt(new BigNumber(amount).multipliedBy(10 ** decimals).toFixed(0));\n}\n\nexport function formatUsdAmount(amount: number | BigNumber, displayDecimals: number = 2): string {\n const amountBN = BigNumber.isBigNumber(amount) ? amount : new BigNumber(amount);\n return `$${amountBN.toFormat(displayDecimals)}`;\n}\n","import { QueryClient, type QueryKey, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { DUAL_GET_UNSHIELD_CLAIM_ABI, WRAPPED_GET_USER_CLAIMS_ABI } from '../constants/confidentialTokenABIs.js';\nimport { useInternalQuery } from '../providers/index.js';\nimport { decryptionAwareReadContract } from '@/utils/decryptionAwareReadContract.js';\nimport { useIsWaitingForDecryptionToInvalidate } from './useIsWaitingForDecryptionToInvalidate.js';\nimport { assert } from 'ts-essentials';\n\nexport function constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number | undefined;\n tokenAddress: Address | undefined;\n confidentialityType: string | undefined;\n accountAddress: Address | undefined;\n}) {\n return ['unshieldClaims', chainId, tokenAddress, confidentialityType, accountAddress];\n}\nexport function invalidateClaimableQueries({\n token,\n accountAddress,\n queryClient,\n}: {\n token: Token;\n accountAddress: Address;\n queryClient: QueryClient;\n}) {\n console.log('Invalidating unshield claims queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress,\n }),\n });\n}\n\nexport function constructUnshieldClaimsQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number;\n tokenAddress: Address;\n confidentialityType: string;\n accountAddress: Address;\n}) {\n return constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n });\n}\n\nexport const DEFAULT_UNSHIELD_CLAIM_SUMMARY: UnshieldClaimsSummary = {\n claimableAmount: 0n,\n pendingAmount: 0n,\n hasClaimable: false,\n hasPending: false,\n};\n\nexport function isTokenConfidentialityTypeClaimable(type: string | undefined): type is 'dual' | 'wrapped' {\n return type === 'dual' || type === 'wrapped';\n}\n\nexport type FetchUnshieldClaimsSummaryInput = {\n publicClient: NonNullable<ReturnType<typeof useCofhePublicClient>>;\n token: Token;\n accountAddress: Address;\n confidentialityType: 'dual' | 'wrapped';\n queryKey: QueryKey;\n signal: AbortSignal;\n};\n\nexport async function fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress,\n confidentialityType,\n queryKey,\n signal,\n}: FetchUnshieldClaimsSummaryInput): Promise<UnshieldClaimsSummary> {\n if (confidentialityType === 'dual') {\n const claim = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: DUAL_GET_UNSHIELD_CLAIM_ABI,\n functionName: 'getUserUnshieldClaim',\n args: [accountAddress],\n },\n });\n\n if (claim.ctHash === 0n || claim.claimed) return DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n\n return {\n claimableAmount: claim.decrypted ? claim.decryptedAmount : 0n,\n pendingAmount: claim.decrypted ? 0n : claim.requestedAmount,\n hasClaimable: claim.decrypted && claim.decryptedAmount > 0n,\n hasPending: !claim.decrypted,\n };\n }\n\n if (confidentialityType === 'wrapped') {\n const result = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: WRAPPED_GET_USER_CLAIMS_ABI,\n functionName: 'getUserClaims',\n args: [accountAddress],\n },\n });\n\n const claims = result.filter((c) => !c.claimed);\n\n const { claimableAmount, pendingAmount } = claims.reduce(\n (acc, claim) => {\n if (claim.decrypted) {\n acc.claimableAmount += claim.decryptedAmount;\n } else {\n acc.pendingAmount += claim.requestedAmount;\n }\n return acc;\n },\n { claimableAmount: 0n, pendingAmount: 0n }\n );\n\n return {\n claimableAmount,\n pendingAmount,\n hasClaimable: claimableAmount > 0n,\n hasPending: pendingAmount > 0n,\n };\n }\n\n return DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n}\n\n// ============================================================================\n// Unified Unshield Claims Hook\n// ============================================================================\n\n/**\n * Unified unshield claims summary - works for both dual and wrapped tokens\n */\nexport type UnshieldClaimsSummary = {\n /** Total amount that can be claimed now (decrypted and not claimed) */\n claimableAmount: bigint;\n /** Total amount pending decryption */\n pendingAmount: bigint;\n /** Whether there are any claimable amounts */\n hasClaimable: boolean;\n /** Whether there are any pending (not yet decrypted) claims */\n hasPending: boolean;\n};\n\ntype UseUnshieldClaimsInput = {\n /** Token object with confidentialityType */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsOptions = Omit<UseQueryOptions<UnshieldClaimsSummary, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Unified hook to fetch unshield claims for any token type (dual or wrapped)\n * @param input - Token object and optional account address\n * @param queryOptions - Optional React Query options\n * @returns Query result with UnshieldClaimsSummary\n */\nexport function useCofheTokenClaimable(\n { accountAddress: account, token }: UseUnshieldClaimsInput,\n queryOptions?: UseUnshieldClaimsOptions\n): UseQueryResult<UnshieldClaimsSummary, Error> & {\n isWaitingForDecryption: boolean;\n} {\n const publicClient = useCofhePublicClient();\n\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token?.chainId,\n tokenAddress: token?.address,\n confidentialityType,\n accountAddress: account,\n });\n // is waiting for decryption finalization -> once Unshield tx mined, but before Decryption result available\n const isWaitingForDecryption = useIsWaitingForDecryptionToInvalidate(queryKey);\n\n const result = useInternalQuery({\n queryKey,\n queryFn: async ({ signal, queryKey }): Promise<UnshieldClaimsSummary> => {\n assert(token, 'token is guaranteed to be defined in query function due to `enabled` condition');\n assert(confidentialityType, 'token.confidentialityType is guaranteed to be defined in query function');\n assert(account, 'account is guaranteed to be defined in query function due to `enabled` condition');\n assert(publicClient, 'publicClient is guaranteed to be defined in query function due to `enabled` condition');\n\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType is guaranteed to be claimable type due to `enabled` condition'\n );\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: !!publicClient && !!account && !!token && isTokenConfidentialityTypeClaimable(confidentialityType),\n ...queryOptions,\n });\n\n return {\n ...result,\n isWaitingForDecryption,\n };\n}\n","import { type QueryKey } from '@tanstack/react-query';\nimport { type Abi, type Address, type ContractFunctionArgs, type ContractFunctionName, type PublicClient } from 'viem';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore.js';\nimport {\n maybeWaitUntilRpcAwareAndReadContract,\n type ReadContractResult,\n type WaitUntilRpcAwareAndReadContractOptions,\n} from '../utils/waitUntilRpcAwareAndReadContract.js';\n\nexport const BLOCK_AWARENESS_POLLING_INTERVAL = 3_000; // 5 seconds\n\ntype Input<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> = {\n publicClient: PublicClient;\n queryKey: QueryKey;\n signal: AbortSignal;\n readContractParams: {\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n };\n};\nexport function decryptionAwareReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>({\n publicClient,\n queryKey,\n signal,\n readContractParams,\n}: Input<TAbi, TfunctionName>): Promise<ReadContractResult<TAbi, TfunctionName>> {\n const decryptionWatchersState = useDecryptionWatchersStore.getState();\n\n // if there was a tx previously, which caused the need to invalidae this query upon decryption observation,\n // and if decryption has been observed for it, use the block hash to ensure RPC is aware of it\n // so that readContract can read up-to-date data\n const blockHashToBeAwareOf =\n decryptionWatchersState.findObservedDecryption(queryKey)?.decryptionObservedAt?.blockHash;\n\n console.log('Tracked decryption block for unshield claims:', blockHashToBeAwareOf);\n\n const rpcAwarenessOptions: WaitUntilRpcAwareAndReadContractOptions = {\n signal,\n pollingInterval: BLOCK_AWARENESS_POLLING_INTERVAL,\n onSuccess: () => {\n // once we have successfully read decrypted data, remove the invalidation tracking\n decryptionWatchersState.removeQueryKeyFromWatchers(queryKey);\n },\n };\n\n return maybeWaitUntilRpcAwareAndReadContract(\n publicClient,\n {\n blockHashToBeAwareOf,\n ...readContractParams,\n },\n rpcAwarenessOptions\n );\n}\n","import type { QueryKey } from '@tanstack/react-query';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { TransactionActionType } from './transactionStore';\n\nexport type DecryptionWatcherStatus = 'scheduled' | 'executed';\n\nexport type DecryptionWatcher = {\n key: `${TransactionActionType}-tx-0x${string}`;\n createdAt: number;\n triggerTxHash: `0x${string}`;\n decryptionObservedAt?: {\n blockNumber: bigint;\n timestamp: number;\n blockHash?: `0x${string}`;\n };\n chainId: number;\n accountAddress: Address;\n queryKeys: QueryKey[];\n};\n\ntype DecryptionWatchersState = {\n byKey: Record<string, DecryptionWatcher>;\n\n upsert: (input: Omit<DecryptionWatcher, 'status'> & { status?: DecryptionWatcherStatus }) => void;\n setDecryptionObservedAt: (params: { key: string; blockNumber: bigint; blockHash?: `0x${string}` }) => void;\n findObservedDecryption: (queryKey: QueryKey) => DecryptionWatcher | undefined;\n removeQueryKeyFromWatchers: (queryKey: QueryKey) => void;\n};\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<DecryptionWatchersState>(() => localStorage, bigintJSONStorageOptions);\n\nexport const useDecryptionWatchersStore = create<DecryptionWatchersState>()(\n persist(\n (set, get) => ({\n byKey: {},\n\n upsert: (input) => {\n set((state) => {\n return {\n byKey: {\n ...state.byKey,\n [input.key]: input,\n },\n };\n });\n },\n findObservedDecryption: (queryKey) => {\n return Object.values(get().byKey).find((item) =>\n item.queryKeys.some((key) => JSON.stringify(key) === JSON.stringify(queryKey) && !!item.decryptionObservedAt)\n );\n },\n removeQueryKeyFromWatchers: (queryKey) => {\n set((state) => {\n const updatedByKey = { ...state.byKey };\n // remove the queryKey from all scheduled invalidations\n for (const [key, item] of Object.entries(updatedByKey)) {\n const matchingIndex = item.queryKeys.findIndex(\n (keyInItem) => JSON.stringify(keyInItem) === JSON.stringify(queryKey)\n );\n if (matchingIndex !== -1) {\n const newQueryKeys = [...item.queryKeys];\n newQueryKeys.splice(matchingIndex, 1);\n updatedByKey[key] = {\n ...item,\n queryKeys: newQueryKeys,\n };\n }\n }\n\n // if any invalidation has no more queryKeys, remove it entirely\n for (const [key, item] of Object.entries(updatedByKey)) {\n if (item.queryKeys.length === 0) {\n delete updatedByKey[key];\n }\n }\n return {\n byKey: updatedByKey,\n };\n });\n },\n\n setDecryptionObservedAt: ({\n key,\n blockNumber,\n blockHash,\n }: {\n key: string;\n blockNumber: bigint;\n blockHash?: `0x${string}`;\n }) => {\n set((state) => {\n const existing = state.byKey[key];\n if (!existing) return state;\n return {\n byKey: {\n ...state.byKey,\n [key]: {\n ...existing,\n decryptionObservedAt: {\n blockNumber,\n blockHash,\n timestamp: Date.now(),\n },\n },\n },\n };\n });\n },\n }),\n {\n name: 'cofhe-scheduled-invalidations',\n storage: bigintStorage,\n version: 1,\n }\n )\n);\n","import { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useMemo } from 'react';\nimport type { QueryKey } from '@tanstack/react-query';\n\nexport function useAwaitingDecryptionQueryKeySet(): ReadonlySet<string> {\n const { byKey } = useDecryptionWatchersStore();\n\n const cacheKeysAwaitingDecryption = useMemo(() => Object.values(byKey).flatMap((item) => item.queryKeys), [byKey]);\n\n return useMemo(\n () => new Set(cacheKeysAwaitingDecryption.map((key) => JSON.stringify(key))),\n [cacheKeysAwaitingDecryption]\n );\n}\n\nexport function useIsWaitingForDecryptionToInvalidate(queryKey: QueryKey): boolean {\n const cacheKeySet = useAwaitingDecryptionQueryKeySet();\n\n const result = useMemo(() => cacheKeySet.has(JSON.stringify(queryKey)), [cacheKeySet, queryKey]);\n\n console.log(`isWaitingForDecryption for queryKey ${JSON.stringify(queryKey)}:`, result);\n\n return result;\n}\n","import { useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransactions<T>({\n chainId,\n account,\n filter,\n reducer,\n}: {\n chainId?: number;\n account?: string;\n filter?: (tx: Transaction) => boolean;\n reducer?: (txs: Transaction[]) => T;\n}) {\n const transactions = useTransactionStore((state) => state.transactions);\n\n const transactionsAsArray = useMemo(\n () =>\n Object.values(\n chainId\n ? // if chainId provided -- will filter on chain's txs first\n transactions[chainId] ?? {}\n : // if chainId not provided -- will filter on all txs\n Object.values(transactions).flatMap((chainTxs) => Object.values(chainTxs))\n ),\n [transactions, chainId]\n );\n\n const filtered = useMemo(\n () =>\n transactionsAsArray.filter((tx) => {\n if (account && tx.account.toLowerCase() !== account.toLowerCase()) return false;\n\n if (filter && !filter(tx)) return false;\n\n return true;\n }),\n [transactionsAsArray, filter, account]\n );\n\n const reduced = useMemo(() => {\n return reducer?.(filtered);\n }, [filtered, reducer]);\n\n const uniqueHashes = new Set(filtered.map((tx) => tx.hash));\n\n assert(\n uniqueHashes.size === filtered.length,\n 'There should be no duplicate transactions with the same hash in the result'\n );\n\n const filteredTxsByHash = useMemo(\n () =>\n filtered.reduce<Record<`0x${string}`, Transaction>>((acc, tx) => {\n return {\n ...acc,\n [tx.hash]: tx,\n };\n }, {}),\n [filtered]\n );\n return {\n filteredTxs: filtered,\n hashes: uniqueHashes,\n filteredTxsByHash,\n reduced,\n };\n}\n","import { TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useStoredTransactions } from './useStoredTransactions';\n\nconst filter = (tx: Transaction) => tx.status === TransactionStatus.Pending;\nexport function usePendingTransactions(): Transaction[] {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs } = useStoredTransactions({\n chainId,\n account,\n filter,\n });\n return filteredTxs;\n}\n","import type {\n OpenPortalModalFn,\n PortalModal,\n PortalModalPropsMap,\n PortalModalState,\n} from '@/components/FnxFloatingButton/modals/types';\nimport { create } from 'zustand';\n\ntype PortalModalStore = {\n modalStack: PortalModalState[];\n};\n\ntype PortalModalActions = {\n openModal: OpenPortalModalFn;\n closeModal: (modal: PortalModal) => void;\n clearAllModals: () => void;\n};\n\nexport const usePortalModals = create<PortalModalStore & PortalModalActions>()((set, get) => ({\n modalStack: [],\n\n openModal: <M extends PortalModal>(\n ...args: PortalModalPropsMap[M] extends void ? [modal: M] : [modal: M, props: PortalModalPropsMap[M]]\n ) => {\n const [modal, props] = args;\n const onClose = () => get().closeModal(modal);\n const modalState = { modal, onClose, ...(props ?? {}) } as PortalModalState;\n set({ modalStack: [...get().modalStack, modalState] });\n },\n closeModal: (modal) => {\n set({ modalStack: get().modalStack.filter((m) => m.modal !== modal) });\n },\n clearAllModals: () => {\n set({ modalStack: [] });\n },\n}));\n","import { useMemo } from 'react';\nimport { create } from 'zustand';\nimport { usePortalStatuses } from './portalStatuses';\n\nconst ANIM_DURATION = 300;\n\ntype PortalUIStore = {\n portalOpen: boolean;\n statusPanelOpen: boolean;\n contentPanelOpen: boolean;\n contentHeights: Array<{ id: string; height: number }>;\n\n openTimeoutId: ReturnType<typeof setTimeout> | null;\n closeTimeoutId: ReturnType<typeof setTimeout> | null;\n};\n\ntype OpenPortalArgs = {\n onOpenBegin?: () => void;\n onOpenEnd?: () => void;\n};\ntype ClosePortalArgs = {\n onCloseBegin?: () => void;\n onCloseEnd?: () => void;\n};\ntype TogglePortalArgs = OpenPortalArgs & ClosePortalArgs;\n\ntype PortalUIActions = {\n clearTimeouts: () => void;\n openPortal: (args?: OpenPortalArgs) => void;\n closePortal: (args?: ClosePortalArgs) => void;\n togglePortal: (args?: TogglePortalArgs) => void;\n\n setContentHeight: (id: string, height: number) => void;\n removeContentHeight: (id: string) => void;\n};\n\nexport const usePortalUI = create<PortalUIStore & PortalUIActions>()((set, get) => ({\n portalOpen: false,\n statusPanelOpen: false,\n contentPanelOpen: false,\n contentHeights: [],\n\n openTimeoutId: null,\n closeTimeoutId: null,\n clearTimeouts: () => {\n const { openTimeoutId, closeTimeoutId } = get();\n if (openTimeoutId) clearTimeout(openTimeoutId);\n if (closeTimeoutId) clearTimeout(closeTimeoutId);\n set({ openTimeoutId: null, closeTimeoutId: null });\n },\n openPortal: (args = {}) => {\n const { onOpenBegin, onOpenEnd } = args;\n const { closeTimeoutId, statusPanelOpen } = get();\n\n // Open portal\n onOpenBegin?.();\n set({ portalOpen: true });\n\n // Cancel closing timeout\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n set({ closeTimeoutId: null });\n }\n\n // Open status panel immediately\n set({ statusPanelOpen: true });\n\n const hasOpenStatus = usePortalStatuses.getState().statuses.length > 0;\n if (statusPanelOpen || hasOpenStatus) {\n // Open content immediately if status panel visible or statuses exist\n set({ contentPanelOpen: true });\n onOpenEnd?.();\n } else {\n // Open content after delay\n const id = setTimeout(() => {\n set({ contentPanelOpen: true, openTimeoutId: null });\n onOpenEnd?.();\n }, ANIM_DURATION);\n\n set({ openTimeoutId: id });\n }\n },\n closePortal: (args = {}) => {\n const { onCloseBegin, onCloseEnd } = args;\n const { openTimeoutId } = get();\n\n // Close portal\n onCloseBegin?.();\n set({ portalOpen: false });\n\n // Cancel opening timeout\n if (openTimeoutId) {\n clearTimeout(openTimeoutId);\n set({ openTimeoutId: null });\n }\n\n // Close content immediately\n set({ contentPanelOpen: false });\n\n // Close status panel after delay\n const id = setTimeout(() => {\n set({ statusPanelOpen: false, closeTimeoutId: null });\n onCloseEnd?.();\n }, ANIM_DURATION);\n\n set({ closeTimeoutId: id });\n },\n togglePortal: (args) => {\n get().portalOpen ? get().closePortal(args) : get().openPortal(args);\n },\n\n setContentHeight: (id, height) => {\n const existing = get().contentHeights;\n const updated = [...existing.filter((h) => h.id !== id), { id, height }];\n set({ contentHeights: updated });\n },\n removeContentHeight: (id) => {\n set({ contentHeights: get().contentHeights.filter((height) => height.id !== id) });\n },\n}));\n\nexport const usePortalUIMaxContentHeight = () => {\n const { contentHeights } = usePortalUI();\n return useMemo(() => {\n return contentHeights.reduce((max, height) => Math.max(max, height.height), 0);\n }, [contentHeights]);\n};\n","import type { FnxStatus } from '@/components/FnxFloatingButton/types';\nimport { create } from 'zustand';\n\ntype PortalStatusesStore = {\n statuses: FnxStatus[];\n};\n\ntype PortalStatusesActions = {\n addStatus: (status: FnxStatus) => void;\n removeStatus: (id: string) => void;\n hasStatus: (id: string) => boolean;\n};\n\nexport const usePortalStatuses = create<PortalStatusesStore & PortalStatusesActions>()((set, get) => ({\n statuses: [],\n addStatus: (status) => {\n // avoid duplicates\n if (get().hasStatus(status.id)) return;\n\n const existing = get().statuses;\n set({ statuses: [...existing, status] });\n },\n removeStatus: (id) => {\n const existing = get().statuses;\n set({ statuses: existing.filter((s) => s.id !== id) });\n },\n hasStatus: (id) => {\n return get().statuses.some((s) => s.id === id);\n },\n}));\n","/* eslint-disable no-redeclare */\nimport {\n FloatingButtonPage,\n type FloatingButtonPagePropsMap,\n type PageState,\n type PagesWithProps,\n} from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { create } from 'zustand';\n\nexport type NavigateParams = {\n // When true, do not append to history; override current page instead\n skipPagesHistory?: boolean;\n};\n\nexport type NavigateArgs<K extends FloatingButtonPage> = {\n pageProps?: FloatingButtonPagePropsMap[K];\n navigateParams?: NavigateParams;\n};\n\ntype NavigateToFn = <K extends FloatingButtonPage>(\n page: K,\n ...rest: K extends PagesWithProps ? [args: NavigateArgs<K>] : [args?: NavigateArgs<K>]\n) => void;\n\ntype PortalNavigationStore = {\n pageHistory: PageState[];\n overridingPage: PageState | null;\n};\n\ntype PortalNavigationActions = {\n navigateTo: NavigateToFn;\n navigateBack: () => void;\n replace: NavigateToFn;\n clearNavigationHistory: () => void;\n};\n\nexport const usePortalNavigation = create<PortalNavigationStore & PortalNavigationActions>()((set, get) => {\n function clearNavigationHistory(): void {\n set({ pageHistory: [{ page: FloatingButtonPage.Main }], overridingPage: null });\n }\n\n function warnIfAlreadyOnPage<K extends FloatingButtonPage>(page: K): boolean {\n const currentPage = get().overridingPage ?? get().pageHistory[get().pageHistory.length - 1];\n const onPage = currentPage?.page === page;\n if (onPage) {\n console.warn(`Attempted to navigate to page ${page} but already on that page`);\n }\n return onPage;\n }\n\n const navigateTo: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n const args = rest[0];\n const props = args?.pageProps;\n const skipPagesHistory = args?.navigateParams?.skipPagesHistory === true;\n if (skipPagesHistory) {\n set({ overridingPage: { page, props } });\n } else {\n const existing = get().pageHistory;\n const updated = [...existing, { page, props }];\n set({ pageHistory: updated });\n }\n };\n\n const replace: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n clearNavigationHistory();\n\n navigateTo(page, ...rest);\n };\n\n return {\n pageHistory: [{ page: FloatingButtonPage.Main }],\n overridingPage: null,\n\n clearNavigationHistory,\n navigateTo,\n navigateBack: () => {\n if (get().overridingPage !== null) {\n // if currently there is an overriding page, just remove it\n set({ overridingPage: null });\n } else {\n // otherwise pop last page from history\n set({ pageHistory: get().pageHistory.slice(0, -1) });\n }\n },\n replace,\n };\n});\n\nexport const usePortalCurrentPage = () => {\n const { overridingPage, pageHistory } = usePortalNavigation();\n return overridingPage ?? pageHistory[pageHistory.length - 1];\n};\n","import { TbAlertTriangle, TbInfoCircle, TbCircleCheck, TbX } from 'react-icons/tb';\nimport { motion } from 'motion/react';\nimport { HashLink } from './HashLink';\nimport { cn } from '@/utils';\nimport type { FnxToastVariant, FnxToastImperativeParams, FnxToastInjectedProps } from '../types';\n\nexport type ToastPrimitiveProps = FnxToastImperativeParams & FnxToastInjectedProps;\n\nconst variantIconMap: Record<FnxToastVariant, React.ReactNode> = {\n info: <TbInfoCircle className=\"text-blue-500 size-5\" />,\n success: <TbCircleCheck className=\"text-green-500 size-5\" />,\n error: <TbAlertTriangle className=\"text-red-500 size-5\" />,\n warning: <TbAlertTriangle className=\"text-yellow-500 size-5\" />,\n};\n\nconst variantClassNameMap: Record<FnxToastVariant, string> = {\n info: 'bg-blue-50 border-blue-200 text-blue-800',\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n};\n\nconst variantProgressBarColorMap: Record<FnxToastVariant | 'base', string> = {\n base: 'bg-gray-500',\n info: 'bg-blue-500',\n success: 'bg-green-500',\n error: 'bg-red-500',\n warning: 'bg-yellow-500',\n};\n\nconst ToastCloseButton: React.FC<Pick<ToastPrimitiveProps, 'onDismiss'>> = ({ onDismiss }) => {\n return (\n <button className=\"self-start\" onClick={() => onDismiss?.()}>\n <TbX className=\"text-gray-500 size-5\" />\n </button>\n );\n};\n\nconst ToastActionButton: React.FC<Pick<ToastPrimitiveProps, 'action' | 'onDismiss'>> = ({ action, onDismiss }) => {\n if (action == null) return null;\n\n return (\n <button\n onClick={() => {\n onDismiss?.();\n action.onClick();\n }}\n >\n {action.label}\n </button>\n );\n};\n\nconst ToastDurationIndicator: React.FC<\n Pick<ToastPrimitiveProps, 'duration' | 'remainingMs' | 'paused' | 'variant'>\n> = ({ duration, remainingMs, paused, variant }) => {\n if (remainingMs == null || remainingMs <= 0 || duration == null || duration === 'infinite') return null;\n\n const progress = remainingMs / duration;\n const progressColor = variantProgressBarColorMap[variant ?? 'base'];\n\n return (\n <div className=\"absolute bottom-0 left-0 w-full h-1 overflow-hidden\">\n {paused ? (\n <div className={cn(progressColor, 'h-full origin-right')} style={{ transform: `scaleX(${progress})` }} />\n ) : (\n <motion.div\n className={cn('h-full origin-right', progressColor)}\n initial={{ scaleX: progress }}\n animate={{ scaleX: 0 }}\n transition={{\n duration: remainingMs / 1000,\n ease: 'linear',\n }}\n />\n )}\n </div>\n );\n};\n\nexport const ToastPrimitiveBase: React.FC<\n FnxToastInjectedProps & { variant?: FnxToastVariant; children: React.ReactNode }\n> = ({ id, duration, remainingMs, variant, paused, children, onPause, onDismiss }) => {\n return (\n <div\n className={cn(\n 'flex flex-row gap-3 p-2 relative items-center justify-start pb-3',\n variant != null && variantClassNameMap[variant]\n )}\n onMouseEnter={() => {\n if (id == null) return;\n onPause?.(true);\n }}\n onMouseLeave={() => {\n if (id == null) return;\n onPause?.(false);\n }}\n >\n {variant != null && variantIconMap[variant]}\n <div className=\"flex-1\">{children}</div>\n <ToastCloseButton onDismiss={onDismiss} />\n {duration !== 'infinite' && (\n <ToastDurationIndicator duration={duration} remainingMs={remainingMs} paused={paused} variant={variant} />\n )}\n </div>\n );\n};\n\nconst ToastContent: React.FC<\n Pick<ToastPrimitiveProps, 'title' | 'description' | 'transaction' | 'action' | 'onDismiss'>\n> = ({ title, description, transaction, action, onDismiss }) => {\n return (\n <>\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-sm font-medium\">{title}</h3>\n {description != null && <p className=\"text-xs\">{description}</p>}\n {transaction != null && <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} />}\n </div>\n <div className=\"flex-1\" />\n <ToastActionButton action={action} onDismiss={onDismiss} />\n </>\n );\n};\n\nexport const ToastPrimitive: React.FC<ToastPrimitiveProps> = (props) => {\n return (\n <ToastPrimitiveBase {...props}>\n <ToastContent {...props} />\n </ToastPrimitiveBase>\n );\n};\n","import { useState } from 'react';\nimport { LuCopy, LuCheck, LuExternalLink } from 'react-icons/lu';\nimport { cn } from '../../../utils/cn.js';\nimport {\n truncateHash,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n} from '../../../utils/utils.js';\n\nexport type HashLinkType = 'tx' | 'address' | 'token';\n\ninterface HashLinkProps {\n type: HashLinkType;\n hash: string;\n chainId?: number;\n className?: string;\n copyable?: boolean;\n iconSize?: number;\n /** Use extra short truncation (5...3 instead of 6...4) */\n extraShort?: boolean;\n}\n\nexport const HashLink: React.FC<HashLinkProps> = ({\n type,\n hash,\n chainId,\n className,\n copyable = true,\n iconSize = 14,\n extraShort = false,\n}) => {\n const start = extraShort ? 5 : 6;\n const end = extraShort ? 3 : 4;\n const ellipsed = truncateHash(hash, start, end);\n\n const getHref = (): string | undefined => {\n if (!chainId) return undefined;\n switch (type) {\n case 'tx':\n return getBlockExplorerTxUrl(chainId, hash);\n case 'address':\n return getBlockExplorerAddressUrl(chainId, hash);\n case 'token':\n return getBlockExplorerTokenUrl(chainId, hash);\n }\n };\n\n const href = getHref();\n\n const handleClick = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {copyable && <CopyButton text={hash} size={iconSize} />}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={!href}\n className={cn(\n 'flex items-center gap-1 font-mono text-xs hover:underline',\n 'fnx-text-primary opacity-60 hover:opacity-100 transition-opacity',\n !href && 'cursor-default hover:no-underline',\n className\n )}\n >\n <span>{ellipsed}</span>\n {href && <LuExternalLink style={{ width: iconSize, height: iconSize }} />}\n </button>\n </div>\n );\n};\n\ninterface CopyButtonProps {\n text: string;\n size?: number;\n className?: string;\n}\n// TODO: This will be replaced with the new copy system from another PR\nexport const CopyButton: React.FC<CopyButtonProps> = ({ text, size = 14, className }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 800);\n } catch (err) {\n console.error('Failed to copy address:', err);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn('fnx-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer', className)}\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <LuCheck style={{ width: size, height: size }} className=\"text-green-500\" />\n ) : (\n <LuCopy style={{ width: size, height: size }} />\n )}\n </button>\n );\n};\n","import { ToastPrimitive } from '@/components/FnxFloatingButton/components/ToastPrimitives';\nimport type { FnxFloatingButtonToast, FnxToastImperativeParams } from '@/components/FnxFloatingButton/types';\nimport { isReactNode } from '@/utils';\nimport { create } from 'zustand';\n\ntype PortalToastsStore = {\n toasts: FnxFloatingButtonToast[];\n};\n\ntype PortalToastsActions = {\n addToast: (toast: React.ReactNode | FnxToastImperativeParams, duration?: number | 'infinite') => void;\n pauseToast: (id: string, paused: boolean) => void;\n removeToast: (id: string) => void;\n};\n\nexport const usePortalToasts = create<PortalToastsStore & PortalToastsActions>()((set, get) => ({\n toasts: [],\n\n addToast: (toast, duration = 5000) => {\n const content = isReactNode(toast) ? toast : <ToastPrimitive {...toast} />;\n const existing = get().toasts;\n const updated = [\n ...existing,\n {\n id: crypto.randomUUID(),\n duration,\n startMs: Date.now(),\n remainingMs: duration === 'infinite' ? Infinity : duration,\n paused: false,\n content,\n },\n ];\n set({ toasts: updated });\n },\n pauseToast: (id, paused) => {\n const existing = get().toasts;\n const updated = existing.map((t) => {\n if (t.id !== id) return t;\n if (t.paused === paused) return t;\n\n let remainingMs = t.remainingMs;\n let startMs = Date.now();\n if (paused) {\n const elapsedMs = Date.now() - t.startMs;\n remainingMs = Math.max(0, t.remainingMs - elapsedMs);\n }\n\n return { ...t, paused, startMs, remainingMs };\n });\n set({ toasts: updated });\n },\n removeToast: (id) => {\n const existing = get().toasts;\n set({ toasts: existing.filter((t) => t.id !== id) });\n },\n}));\n","import { usePortalToasts } from '@/stores';\nimport type { DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport type { Transaction } from '@/stores/transactionStore';\nimport type { TransactionReceipt } from 'viem';\n\nconst TOAST_DELAY_MS = 10_000;\nfunction useTransactionGlobalToastsLifecycle() {\n const { addToast } = usePortalToasts();\n return {\n // 1.tx is submitted\n onTransactionSubmitted: (transaction: Transaction) => {\n console.log('____ Transaction submitted:', transaction);\n addToast(\n {\n variant: 'info',\n title: `${transaction.actionType} Transaction Submitted`,\n description: `${transaction.actionType} transaction has been submitted.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n onTransactionSubmitError: (error: unknown, transactionType: Transaction['actionType']) => {\n console.error('____ Transaction submission failed for type:', transactionType, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transactionType} Transaction Submission Failed`,\n description:\n error instanceof Error ? error.message : 'An unknown error occurred during transaction submission.',\n },\n TOAST_DELAY_MS\n );\n },\n\n // 2.a. tx is mined (could be success or fail)\n onTransactionMined: (transaction: Transaction, receipt: TransactionReceipt /* could be fail or success */) => {\n console.log('____ Transaction mined:', transaction, 'with receipt:', receipt);\n if (receipt.status === 'success') {\n const descriptionPostfix = transaction.isPendingDecryption ? ' It is pending decryption now.' : '';\n addToast(\n {\n variant: transaction.isPendingDecryption ? 'info' : 'success', // if pending decryption, show as info\n title: `${transaction.actionType} Transaction Mined`,\n description: `${transaction.actionType} transaction has been mined.${descriptionPostfix}`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n } else {\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Failed`,\n description: `${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n }\n },\n // 2.b. tx receipt fetch failed\n onWatchReceiptFailure: (error: unknown, transaction: Transaction) => {\n console.error('____ Transaction receipt fetch failed for tx:', transaction, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Fetch Failed`,\n description: `Fetching ${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n\n // 3. tx is decrypted (if applicable)\n onTransactionDecrypted: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => {\n console.log('____ Transaction decrypted:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n addToast(\n {\n variant: 'success',\n title: `${decryptionCausingTx.actionType} Decryption Succeeded`,\n description: `${decryptionCausingTx.actionType} transaction has been decrypted.`,\n transaction: {\n hash: decryptionCausingTx.hash,\n chainId: decryptionCausingTx.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n };\n}\n\nexport function useTransactionGlobalLifecycle() {\n const {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n } = useTransactionGlobalToastsLifecycle();\n\n // You can add more lifecycle handlers here in the future if needed. For now only toasts. Cache invalidations are built-in in other, lower-level hooks.\n return {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n };\n}\n","import { TransactionStatus, useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useTransactionReceiptsByHash } from './useTransactionReceiptsByHash';\nimport { assert } from 'ts-essentials';\nimport { useCofheReadDecryptionResults } from './useCofheReadDecryptionResults';\nimport { useInternalQueryClient } from '@/providers';\nimport { useDecryptionWatchersStore, type DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\n\nfunction useHandleInvalidationsAfterDecryption() {\n const queryClient = useInternalQueryClient();\n return useCallback<UseTrackDecryptingTransactionsBaseInput['onDecryptionResolve']>(\n async (tx, decryptionWatcher) => {\n console.log('Invalidating queries for decryption watcher:', decryptionWatcher);\n for (const queryKey of decryptionWatcher.queryKeys) {\n console.log('Invalidating query due to observed decryption:', queryKey);\n // query invalidation will cause __decryption-block-aware__ readContract calls to wait until RPC is aware of the decryption block\n // and on successful read, the queryKey will be removed from the decryption watchers store,\n // and then if a watcher doesn't have queryKeys anymore, it will be removed entirely from the store\n // which ends the tracking lifecycle for that decryption event\n await queryClient.invalidateQueries({ queryKey });\n }\n },\n [queryClient]\n );\n}\n\nconst filter = (tx: Transaction) => tx.isPendingDecryption && tx.status === TransactionStatus.Confirmed;\ntype UseTrackDecryptingTransactionsBaseInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\nfunction useTrackDecryptingTransactionsBase({ onDecryptionResolve }: UseTrackDecryptingTransactionsBaseInput) {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n // step 1: get all mined txs that are pending decryption\n const { hashes, filteredTxsByHash: minedTxsPendingDecryptionByHash } = useStoredTransactions({\n filter,\n account,\n chainId,\n });\n\n // todo: first check if pending queries cache already has that, might spare a request\n // step 2: get their receipts (to parse logs and find ciphertexts to watch)\n const { receiptsByHash } = useTransactionReceiptsByHash({\n hashes,\n });\n\n // step 3: from receipts, find ciphertexts to watch\n const minedTxsWithCiphertextsToWatch = useMemo(() => {\n return Object.entries(minedTxsPendingDecryptionByHash)\n .filter(([, tx]) => receiptsByHash[tx.hash] !== undefined)\n .map(([, tx]) => {\n const ciphertextToWatch = findDecryptRequestLog(tx.account, receiptsByHash[tx.hash].logs)?.ciphertext;\n assert(\n ciphertextToWatch,\n 'Ciphertext to watch should be found in the transaction logs if a tx that isPendingDecryption and has a receipt'\n );\n return {\n tx,\n receipt: receiptsByHash[tx.hash],\n ciphertextToWatch,\n };\n });\n }, [minedTxsPendingDecryptionByHash, receiptsByHash]);\n\n const ciphertextsToWatch = useMemo(() => {\n return new Set(minedTxsWithCiphertextsToWatch.map(({ ciphertextToWatch }) => ciphertextToWatch));\n }, [minedTxsWithCiphertextsToWatch]);\n\n // step 4: use decryption results polling hook to watch for decryption results\n const decryptionResults = useCofheReadDecryptionResults(ciphertextsToWatch);\n\n const queryClient = useInternalQueryClient();\n\n const { setDecryptionObservedAt } = useDecryptionWatchersStore();\n\n // step 5: when decryption results arrive, update store and and set decryptionObservedAt info to trigger invalidations\n useEffect(() => {\n const txsWithDecryptionResults = minedTxsWithCiphertextsToWatch\n .filter(({ ciphertextToWatch }) => decryptionResults[ciphertextToWatch] !== undefined)\n .map((item) => {\n const decryptionResult = decryptionResults[item.ciphertextToWatch];\n assert(decryptionResult, 'decryptionResult must be defined here');\n return {\n ...item,\n decryptionResult: decryptionResult,\n };\n });\n\n for (const { tx, decryptionResult, receipt, ciphertextToWatch } of txsWithDecryptionResults) {\n // update store\n useTransactionStore.getState().setTransactionDecryptionStatus(\n tx.chainId,\n tx.hash,\n false // no longer pending decryption\n );\n\n console.log('Decryption completed for tx, invalidating relevant queries', {\n tx,\n decryptionResult,\n receipt,\n ciphertextToWatch,\n });\n // before cache invalidation, make sure the request that follows will use up-to-date block number\n setDecryptionObservedAt({\n key: `${tx.actionType}-tx-${tx.hash}`,\n blockNumber: decryptionResult.observedAt.blockNumber,\n blockHash: decryptionResult.observedAt.blockHash,\n });\n }\n }, [decryptionResults, queryClient, setDecryptionObservedAt, minedTxsWithCiphertextsToWatch]);\n\n // step 6: invalidate relevant queries when decryption is observed\n useOnDecryptionCallback({\n onDecryptionResolve,\n });\n}\n\ntype OnDecryptionInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\nfunction useOnDecryptionCallback({ onDecryptionResolve }: OnDecryptionInput) {\n const { byKey } = useDecryptionWatchersStore();\n\n // step 1: get all query keys that need to be invalidated due to observed decryption\n const watchersWithObservedDecryption = useMemo(\n () => Object.values(byKey).filter((item) => item.decryptionObservedAt !== undefined),\n [byKey]\n );\n\n console.log('All observed decryptions:', watchersWithObservedDecryption);\n\n const handleDecryptionResolve = useCallback(async () => {\n const transactionStore = useTransactionStore.getState().transactions;\n for (const sch of watchersWithObservedDecryption) {\n const tx = transactionStore[sch.chainId]?.[sch.triggerTxHash];\n onDecryptionResolve(tx, sch);\n }\n }, [watchersWithObservedDecryption, onDecryptionResolve]);\n\n const stableHandleDecryptionResolve = useRef(handleDecryptionResolve);\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n\n useEffect(() => {\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n }, [handleDecryptionResolve]);\n\n useEffect(() => {\n if (watchersWithObservedDecryption.length > 0) {\n console.log('All observed decryption query keys subject to invalidate:', watchersWithObservedDecryption);\n stableHandleDecryptionResolve.current();\n }\n }, [watchersWithObservedDecryption]);\n}\n\nfunction findDecryptRequestLog(account: string, logs: { topics: string[]; data: string }[] = []) {\n for (const log of logs) {\n const result = safeParseDecryptRequestLog(log, account);\n if (result) return result;\n }\n return undefined;\n}\n\nfunction safeParseDecryptRequestLog(\n log: { topics: string[]; data: string },\n account: string\n):\n | false\n | {\n ciphertext: string;\n } {\n const topic0Correct = log.topics[0]\n ?.toLowerCase()\n .startsWith('0xe9de54a3e7ddf0c48cc6e1134185300d5a71acbf2d8c21fcdefa9d9dd9e20ac1');\n const topic1Correct = log.topics[1] === undefined;\n const strippedData = log.data.startsWith('0x') ? log.data.slice(2) : log.data;\n const dataAsWords = strippedData.match(/.{1,64}/g) || [];\n\n const word1IsCorrect =\n dataAsWords[1]?.toLowerCase() === '00000000000000000000000000000000000000000000000000000000000000a0';\n const word2IsCorrect = dataAsWords[2]?.toLowerCase() === account.toLowerCase().slice(2).padStart(64, '0');\n return topic0Correct && topic1Correct && word1IsCorrect && word2IsCorrect\n ? {\n ciphertext: '0x' + dataAsWords[0],\n }\n : false;\n}\n\nexport function useTrackDecryptingTransactions() {\n const handleInvalidationsAfterDecryption = useHandleInvalidationsAfterDecryption();\n const { onTransactionDecrypted } = useTransactionGlobalLifecycle();\n\n useTrackDecryptingTransactionsBase({\n onDecryptionResolve: async (decryptionCausingTx, decryptionWatcher) => {\n console.log('Decryption resolved for tx:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n handleInvalidationsAfterDecryption(decryptionCausingTx, decryptionWatcher);\n onTransactionDecrypted(decryptionCausingTx, decryptionWatcher);\n },\n });\n}\n","import { useMemo } from 'react';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { TransactionReceipt } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\n\ntype TxReceiptQueryKey = readonly ['tx-receipt', number | undefined, `0x${string}`];\n\nexport type UseTransactionReceiptsByHashInput = {\n hashes?: Set<`0x${string}`>;\n /** Defaults to the connected chain id. */\n chainId?: number;\n enabled?: boolean;\n /** Additional TanStack query options applied to each receipt query. */\n queryOptions?: Omit<\n UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>,\n 'queryKey' | 'queryFn' | 'enabled'\n >;\n};\n\nexport type UseTransactionReceiptsByHashResult = {\n queriesResults: UseQueryResult<TransactionReceipt, Error>[];\n receiptsByHash: Record<`0x${string}`, TransactionReceipt>;\n};\n\n/**\n * Fetch receipts for a list of already-mined transaction hashes.\n * Uses the internal TanStack QueryClient via `useInternalQueries`.\n */\nexport function useTransactionReceiptsByHash(\n { hashes, chainId: chainIdInput, enabled: enabledInput = true, queryOptions }: UseTransactionReceiptsByHashInput = {\n enabled: true,\n }\n): UseTransactionReceiptsByHashResult {\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const chainId = chainIdInput ?? cofheChainId;\n\n const enabled = !!publicClient && !!chainId && enabledInput && hashes !== undefined && hashes?.size > 0;\n\n const queries = useMemo(() => {\n if (!hashes) return [];\n return Array.from(hashes).map((hash) => {\n const queryKey: TxReceiptQueryKey = ['tx-receipt', chainId, hash];\n\n return {\n queryKey,\n enabled,\n queryFn: async (): Promise<TransactionReceipt> => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n // The caller guarantees these txs are already mined.\n return await publicClient.getTransactionReceipt({ hash });\n },\n notifyOnChangeProps: ['data'],\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n ...queryOptions,\n } satisfies UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>;\n });\n }, [chainId, enabled, hashes, publicClient, queryOptions]);\n\n const queriesResults: UseQueryResult<TransactionReceipt, Error>[] = useInternalQueries({\n queries,\n });\n\n const receiptsByHash = useMemo<Record<`0x${string}`, TransactionReceipt>>(() => {\n console.log('useTransactionReceiptsByHash - receiptsByHash recalculated');\n if (!hashes) return {};\n return Array.from(hashes).reduce<Record<`0x${string}`, TransactionReceipt>>((acc, hash, i) => {\n // skip those that don't have receipt data yet\n if (!queriesResults[i]?.data) return acc;\n\n acc[hash] = queriesResults[i].data;\n return acc;\n }, {});\n }, [hashes, queriesResults]);\n\n return { queriesResults, receiptsByHash };\n}\n","import { useMemo } from 'react';\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { TASK_MANAGER_ADDRESS } from '@cofhe/sdk';\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n// function getDecryptResultSafe(uint256 ctHash) external view returns (uint256, bool)\nconst TASK_MANAGER_ABI = [\n {\n type: 'function',\n name: 'getDecryptResultSafe',\n inputs: [\n {\n name: 'ctHash',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'result',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'decrypted',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n\nconst DECRYPTION_RESULT_POLLING_INTERVAL_MS = 5_000;\nexport type DecryptionResultWithObservedBlock = {\n result: bigint;\n decrypted: true;\n observedAt: {\n blockNumber: bigint;\n blockHash: `0x${string}`;\n };\n};\nexport function useCofheReadDecryptionResults(ciphertexts: Set<string>) {\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n\n const queries = useMemo(() => {\n return Array.from(ciphertexts).map((ct) => {\n return {\n queryKey: ['decryptionResult', chainId, ct] as const,\n queryFn: async ({ signal }: { signal: AbortSignal }) => {\n if (!publicClient) throw new Error('PublicClient is required');\n\n // Keep the query in-flight until the decryption result is available.\n // This way `isFetching` reflects the real \"waiting for decryption\" period.\n while (!signal.aborted) {\n // Try to fetch (1) decryption result and (2) latest block header together.\n // If the transport batches, these should go in one JSON-RPC batch.\n const [res, block] = await Promise.allSettled([\n publicClient.readContract({\n address: TASK_MANAGER_ADDRESS,\n abi: TASK_MANAGER_ABI,\n functionName: 'getDecryptResultSafe',\n args: [BigInt(ct)],\n }),\n publicClient.getBlock(),\n ]);\n\n if (\n res.status === 'fulfilled' &&\n block.status === 'fulfilled' &&\n block.value?.hash &&\n block.value?.number\n ) {\n const decoded = res.value;\n const result = decoded[0];\n const decrypted = decoded[1];\n\n if (decrypted) {\n const data: DecryptionResultWithObservedBlock = {\n result,\n decrypted: true,\n observedAt: {\n blockNumber: block.value.number,\n blockHash: block.value.hash,\n },\n };\n\n return data;\n }\n }\n\n await sleep(DECRYPTION_RESULT_POLLING_INTERVAL_MS, signal);\n }\n\n throw abortError();\n },\n enabled: !!publicClient && !!chainId && ct !== undefined,\n };\n });\n }, [chainId, ciphertexts, publicClient]);\n\n const results = useInternalQueries({ queries });\n\n const isDecryptedByCt = useMemo(() => {\n return results.reduce<Record<string, DecryptionResultWithObservedBlock | undefined>>((record, res, index) => {\n const ct = Array.from(ciphertexts)[index];\n\n record[ct] = res.data;\n\n return record;\n }, {});\n }, [ciphertexts, results]);\n\n return isDecryptedByCt;\n}\n","import type { CofheClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport type { CofheConfigWithReact } from '@/config';\n\nexport const useCofheClient = (): CofheClient<CofheConfigWithReact> => {\n return useCofheContext().client;\n};\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { FheTypes } from '@cofhe/sdk';\nimport { type Token } from './useCofheTokenLists';\nimport { CONFIDENTIAL_ABIS, getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport { assert } from 'ts-essentials';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport { useCofheReadContractAndDecrypt } from './useCofheReadContractAndDecrypt';\n\n// ============================================================================\n// Unified Confidential Balance Hook\n// ============================================================================\n\ntype UseConfidentialTokenBalanceInput = {\n /** Token from token list */\n token?: Token;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UseConfidentialTokenBalanceOptions = Omit<UseQueryOptions<bigint, Error>, 'queryKey' | 'queryFn' | 'select'> & {\n enabled?: boolean;\n};\n\ntype UseConfidentialTokenBalanceResult = {\n /** Raw balance in smallest unit (bigint) */\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n disabledDueToMissingPermit: boolean;\n};\n\n/**\n * Hook to get confidential (encrypted) balance for a token with convenient formatting.\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with raw bigint, formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenDecryptedBalance(\n { token, accountAddress, displayDecimals = 5 }: UseConfidentialTokenBalanceInput,\n options?: UseConfidentialTokenBalanceOptions\n): UseConfidentialTokenBalanceResult {\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const contractConfig = token && getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n\n const {\n decrypted: { data: decryptedData, isFetching: isDecryptionFetching },\n encrypted: { isFetching: isEncryptedFetching, refetch: refetchCiphertext },\n disabledDueToMissingPermit,\n } = useCofheReadContractAndDecrypt(\n {\n address: token?.address,\n abi: contractConfig?.abi,\n functionName: contractConfig?.functionName,\n args: accountAddress ? [accountAddress] : undefined,\n requiresPermit: true,\n },\n {\n readQueryOptions: {\n refetchOnMount: false,\n enabled: userEnabled && !!token,\n },\n decryptingQueryOptions: {\n refetchOnMount: false,\n select: (amountWei) => {\n assert(token, 'Token must be defined to format confidential balance');\n if (typeof amountWei !== 'bigint') {\n throw new Error('Expected bigint from confidential decryption');\n }\n return formatTokenAmount(amountWei, token.decimals, displayDecimals);\n },\n },\n ...restOptions,\n }\n );\n\n return {\n disabledDueToMissingPermit,\n\n data: decryptedData,\n\n isFetching: isDecryptionFetching || isEncryptedFetching,\n refetch: refetchCiphertext,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address, type Abi, type ContractFunctionName, type ContractFunctionArgs } from 'viem';\nimport { FheTypes, type UnsealedItem } from '@cofhe/sdk';\nimport { useCofheDecrypt } from './useCofheDecrypt';\nimport {\n useCofheReadContract,\n type UseCofheReadContractQueryOptions,\n type UseCofheReadContractResult,\n} from './useCofheReadContract';\nimport type { CofheFirstReturnFheType, CofheReturnType, EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\ntype SupportedFheTypeFromReturn<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> =\n CofheFirstReturnFheType<TAbi, TfunctionName> extends FheTypes\n ? CofheFirstReturnFheType<TAbi, TfunctionName>\n : FheTypes;\n\nfunction isEncryptedValue<TFheType extends FheTypes>(value: unknown): value is EncryptedReturnTypeByUtype<TFheType> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'ctHash' in value &&\n 'utype' in value &&\n Object.values<unknown>(FheTypes).includes(value.utype)\n );\n}\n\nfunction convertCofheReturnTypeToEncryptedReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes,\n>(value: CofheReturnType<TAbi, TfunctionName>): EncryptedReturnTypeByUtype<TFheType> {\n if (isEncryptedValue<TFheType>(value)) return value;\n\n // TODO: convertCofheReturnTypeToEncryptedReturnType -- support for mixed return types (e.g., structs with both encrypted and plain values)\n throw new Error(\n 'Auto-decryption now only supports a case where the contract function returns a single encrypted value'\n );\n}\n/**\n * Generic hook: read a confidential contract value and decrypt it.\n */\n// TODO: useCofheReadContractAndDecrypt only works for a scenario when the contract function returns a signle plain encrypted value (i.e. not struct etc)\nexport function useCofheReadContractAndDecrypt<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes = SupportedFheTypeFromReturn<TAbi, TfunctionName>,\n TDecryptedSelectedData = UnsealedItem<TFheType>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n\n {\n readQueryOptions,\n decryptingQueryOptions,\n }: {\n readQueryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n decryptingQueryOptions?: Omit<\n UseQueryOptions<UnsealedItem<TFheType>, Error, TDecryptedSelectedData>,\n 'queryKey' | 'queryFn'\n >;\n } = {}\n): {\n encrypted: UseCofheReadContractResult<TAbi, TfunctionName>;\n decrypted: UseQueryResult<TDecryptedSelectedData, Error>;\n disabledDueToMissingPermit: boolean;\n} {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const encrypted = useCofheReadContract({ address, abi, functionName, args, requiresPermit }, readQueryOptions);\n\n const encryptedData = encrypted.data;\n\n const asEncryptedReturnType = encryptedData\n ? convertCofheReturnTypeToEncryptedReturnType<TAbi, TfunctionName, TFheType>(encryptedData)\n : undefined;\n\n const decrypted = useCofheDecrypt(\n {\n input: asEncryptedReturnType,\n },\n decryptingQueryOptions\n );\n\n return {\n encrypted,\n decrypted,\n disabledDueToMissingPermit: encrypted.disabledDueToMissingPermit,\n };\n}\n","import { useCofheContext, useInternalQuery } from '@/providers';\nimport { CofheError, FheTypes, type UnsealedItem } from '@cofhe/sdk';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { assert } from 'ts-essentials';\nimport type { EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\n/**\n * Hook to decrypt a ciphertext using the Cofhe client.\n * @param input - Ciphertext and FHE type\n * @param queryOptions - Optional React Query options\n * @returns Decrypted balance as bigint\n */\nexport function useCofheDecrypt<U extends FheTypes, TSeletedData = UnsealedItem<U>>(\n {\n input,\n }: {\n input?: EncryptedReturnTypeByUtype<U>;\n },\n queryOptions?: Omit<UseQueryOptions<UnsealedItem<U>, Error, TSeletedData>, 'queryKey' | 'queryFn'>\n): UseQueryResult<TSeletedData, Error> {\n const { client } = useCofheContext();\n const isCofheErrorActive = useIsCofheErrorActive();\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions || {};\n const enabled = !!input && input.ctHash > 0n && !isCofheErrorActive && !!client && (userEnabled ?? true);\n\n return useInternalQuery({\n enabled,\n queryKey: ['decryptCiphertext', input?.ctHash.toString(), input?.utype],\n queryFn: async () => {\n assert(input, 'input is guaranteed to be defined by enabled condition');\n return client.decryptForView(input.ctHash, input.utype).execute();\n },\n meta: {\n persist: true,\n },\n ...restQueryOptions,\n retry: (failureCount, error) => {\n if (error instanceof CofheError) return false; // don't retry decryption errors\n\n // default retry behavior - 3 retries\n return failureCount < 3;\n },\n });\n}\n","import { type Address } from 'viem';\nimport type { Token } from './useCofheTokenLists.js';\nimport { TRANSFER_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { type EncryptableItem } from '@cofhe/sdk';\nimport { useCofheEncryptAndWriteContract } from './useCofheEncryptAndWriteContract.js';\nimport type { useCofheWriteContractOptions } from './useCofheWriteContract.js';\nimport type { EncryptionOptions } from './useCofheEncrypt.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\ntype TokenTransferExtras = { token: Token; amount: bigint; userAddress: Address };\ntype UseCofheTokenTransferOptions = Pick<\n useCofheWriteContractOptions<TokenTransferExtras>,\n 'onSuccess' | 'onError' | 'onMutate'\n>;\n\ntype EncryptAndSendInput = {\n input: {\n token: Token;\n to: Address;\n amount: bigint;\n userAddress: Address;\n };\n encryptionOptions?: EncryptionOptions<EncryptableItem>;\n};\n\nexport function useCofheTokenTransfer(writeMutationOptions?: UseCofheTokenTransferOptions) {\n const { onSuccess: passedOnSuccess, onError: passedOnError, ...restOfOptions } = writeMutationOptions || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n const { encryption, write, encryptAndWrite } = useCofheEncryptAndWriteContract<TokenTransferExtras>({\n writingMutationOptions: {\n onError: (error, variables, onMutateResult, context) => {\n if (passedOnError) passedOnError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.ShieldSend);\n },\n onSuccess: (hash, variables, onMutateResult, context) => {\n if (passedOnSuccess) passedOnSuccess(hash, variables, onMutateResult, context);\n\n const extras =\n typeof variables === 'object' && variables !== null && 'extras' in variables ? variables.extras : null;\n\n if (!extras) return;\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: extras.token,\n tokenAmount: extras.amount,\n chainId: extras.token.chainId,\n actionType: TransactionActionType.ShieldSend,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account: extras.userAddress,\n });\n },\n ...restOfOptions,\n },\n });\n\n return {\n encryption,\n write,\n isPending: encryption.isPending || write.isPending,\n data: write.data,\n encryptAmountAndSendToken: ({ input, encryptionOptions }: EncryptAndSendInput) => {\n const { token, to, amount, userAddress } = input;\n\n const { input: _ignoredInput, ...encryptionOpts } = encryptionOptions ?? {};\n const contractConfig = TRANSFER_ABIS[token.extensions.fhenix.confidentialityType];\n\n return encryptAndWrite({\n params: {\n address: token.address,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n account: userAddress,\n chain: undefined,\n },\n args: [to, amount] as const,\n extras: {\n token,\n amount,\n userAddress,\n },\n encryptionOptions: encryptionOpts,\n });\n },\n };\n}\n","import type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n WriteContractParameters,\n WriteContractReturnType,\n} from 'viem';\nimport { type CofheInputArgsPreTransform, extractEncryptableValues, insertEncryptedValues } from '@cofhe/abi';\nimport type { EncryptableItem, EncryptedItemInput } from '@cofhe/sdk';\nimport { useCofheEncrypt, type EncryptInputsOptions, type UseCofheEncryptOptions } from './useCofheEncrypt';\nimport { useCofheWriteContract, type useCofheWriteContractOptions } from './useCofheWriteContract';\n\ntype NoInferLocal<T> = [T][T extends any ? 0 : never];\n\ntype ConfidentialityAwareAbiArgs<TAbi extends Abi | readonly unknown[], TFunctionName extends string> = NoInferLocal<\n Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n>;\n\nexport async function _encryptAndWriteContract<\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>({\n params,\n args,\n encrypt,\n write,\n}: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n // Don't let args participate in inferring `TAbi`/`TFunctionName`.\n // Otherwise, an incorrect args shape can cause TS to widen TAbi to `readonly unknown[]`\n // (and then args become `unknown[]`, silently accepting anything).\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>;\n write: (\n writeParams: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >\n ) => Promise<WriteContractReturnType>;\n}): Promise<WriteContractReturnType> {\n const transformer = constructEncryptAndTransform<TAbi, TFunctionName, TChainOverride>(\n params.abi,\n params.functionName,\n encrypt\n );\n const transformedArgs: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'] = await transformer(args);\n\n // You can’t fix that spot “purely” (no as … and no any) while keeping this wrapper fully-generic over TAbi/TFunctionName.\n // Reason: viem’s WriteContractParameters ultimately includes a conditional type that depends on:\n // readonly [] extends ContractFunctionArgs<TAbi, ..., TFunctionName>\n // Inside a generic function body, TypeScript must typecheck for all possible TAbi/TFunctionName, so it cannot prove which branch you’re in. That’s why it rejects constructing/passing newParams as WriteContractParameters<...> even when your runtime object is correct.\n const newParams = {\n ...params,\n args: transformedArgs,\n } as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >;\n\n return write(newParams);\n}\n\nfunction constructEncryptAndTransform<\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>(\n abi: TAbi,\n functionName: TFunctionName,\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>\n): (\n mixedArgs: Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n) => Promise<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args']\n> {\n // encrypts inputs that need to be encrypted and transform them\n return async (mixedArgs) => {\n const extracted = extractEncryptableValues(abi, functionName, mixedArgs);\n const encrypted = await encrypt(extracted);\n const merged = insertEncryptedValues(abi, functionName, mixedArgs, encrypted);\n\n // TODO: mismatch between CofheInputArgs<TAbi, TFunctionName> and WriteContractParameters<...>['args'] types\n return merged as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'];\n };\n}\n\nexport function useCofheEncryptAndWriteContract<TExtraVars = unknown>({\n encrypingMutationOptions,\n writingMutationOptions,\n}: {\n encrypingMutationOptions?: UseCofheEncryptOptions;\n writingMutationOptions?: useCofheWriteContractOptions<TExtraVars>;\n} = {}) {\n const encryption = useCofheEncrypt(encrypingMutationOptions);\n const write = useCofheWriteContract<TExtraVars>(writingMutationOptions);\n\n const encryptAndWrite = async <\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n >(args: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n extras?: TExtraVars;\n encryptionOptions?: EncryptInputsOptions;\n }) =>\n _encryptAndWriteContract<TAbi, TFunctionName, TChainOverride>({\n ...args,\n encrypt: (encryptableItems) =>\n encryption.encryptInputsAsync({\n items: encryptableItems as readonly EncryptableItem[],\n ...(args.encryptionOptions ?? {}),\n }),\n write: (writeParams) => {\n const vars =\n 'extras' in args ? { writeContractInput: writeParams, extras: args.extras as TExtraVars } : writeParams;\n\n return write.writeContractAsync<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride\n >(vars);\n },\n });\n\n return {\n encryptAndWrite,\n encryption,\n write,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport {\n assertCorrectEncryptedItemInput,\n EncryptStep,\n type EncryptableItem,\n type EncryptedItemInput,\n type EncryptStepCallbackContext,\n type EncryptedItemInputs,\n isLastEncryptionStep,\n} from '@cofhe/sdk';\nimport { assert } from 'ts-essentials';\nimport { useStepsState, type EncryptionStep, type StepsState } from './internal/useStepsState';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheContext } from '../providers/index.js';\nexport type EncryptableArray = readonly EncryptableItem[];\nexport type EncryptionOptions<T extends EncryptableItem | EncryptableArray> = {\n input?: T;\n account?: string;\n chainId?: number;\n securityZone?: number; // TODO: potential conflifct/ambiguity with createEncryptable arg - figure it out\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\ntype StepConfig = { label: string; progress: number };\nconst STEP_CONFIG: Record<EncryptStep, StepConfig> = {\n initTfhe: {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n fetchKeys: {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n pack: {\n label: 'Packing data...',\n progress: 40,\n },\n prove: {\n label: 'Generating proof...',\n progress: 70,\n },\n verify: {\n label: 'Verifying...',\n progress: 90,\n },\n};\n\nconst DONE_STEP_CONFIG: StepConfig = {\n label: 'Encryption complete!',\n progress: 100,\n};\n\nexport function getStepConfig(step: EncryptionStep) {\n if (isLastEncryptionStep(step.step) && step.context?.isEnd) return DONE_STEP_CONFIG;\n\n return STEP_CONFIG[step.step];\n}\ntype EncryptInputsResult<T extends readonly EncryptableItem[]> = EncryptedItemInputs<[...T]>;\n\nexport type EncryptInputsOptions = {\n account?: string;\n chainId?: number;\n securityZone?: number;\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\nexport type EncryptInputsVariables<T extends readonly EncryptableItem[] = readonly EncryptableItem[]> =\n | T\n | ({\n items: T;\n } & EncryptInputsOptions);\n\nfunction hasEncryptInputsOptions<T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n): variables is { items: T } & EncryptInputsOptions {\n return typeof variables === 'object' && variables !== null && 'items' in variables;\n}\n\nfunction assertEncryptInputsResult<T extends readonly EncryptableItem[]>(\n inputs: T,\n encrypted: readonly EncryptedItemInput[]\n): asserts encrypted is EncryptInputsResult<T> {\n if (encrypted.length !== inputs.length) {\n throw new Error(`Encryption result length mismatch (expected ${inputs.length}, got ${encrypted.length})`);\n }\n\n for (let i = 0; i < encrypted.length; i++) {\n const encryptedItem = encrypted[i];\n const inputItem = inputs[i];\n\n assertCorrectEncryptedItemInput(encryptedItem);\n\n if (encryptedItem.utype !== inputItem.utype) {\n throw new Error(`Encryption result type mismatch at index ${i}`);\n }\n }\n}\n\nexport type UseCofheEncryptOptions = Omit<\n UseMutationOptions<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: encrypt a list of EncryptableItems into encrypted input structs.\n *\n */\nexport function useCofheEncrypt(options?: UseCofheEncryptOptions): UseMutationResult<\n readonly EncryptedItemInput[],\n Error,\n EncryptInputsVariables,\n void\n> & {\n encryptInputsAsync: <const T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n ) => Promise<EncryptInputsResult<T>>;\n encryptInputs: (variables: EncryptInputsVariables) => void;\n isEncrypting: boolean;\n stepsState: StepsState;\n} {\n const client = useCofheContext().client;\n const stepsState = useStepsState();\n const { onStep: handleStepStateChange, onSetKey: handleStepSetKey } = stepsState;\n\n const mutation = useInternalMutation<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'encryptInputs'],\n mutationFn: async (variables) => {\n assert(client, 'CoFHE client not initialized');\n\n const key = crypto.randomUUID();\n handleStepSetKey(key);\n\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n // SDK expects a mutable array type; copy preserves runtime value while satisfying typing.\n const mutableItems = Array.from(items);\n\n const builder = client.encryptInputs(mutableItems);\n\n const externalOnStepChange = hasEncryptInputsOptions(variables) ? variables.onStepChange : undefined;\n\n const combinedOnStepChange = (step: EncryptStep, context?: EncryptStepCallbackContext) => {\n handleStepStateChange(key, step, context);\n externalOnStepChange?.(step, context);\n };\n\n // Always set callback so we can track steps consistently.\n builder.onStep(combinedOnStepChange);\n\n if (hasEncryptInputsOptions(variables)) {\n if (variables.account) builder.setAccount(variables.account);\n if (variables.chainId) builder.setChainId(variables.chainId);\n if (variables.securityZone) builder.setSecurityZone(variables.securityZone);\n }\n\n return builder.execute();\n },\n });\n\n return {\n ...mutation,\n encryptInputsAsync: async <const T extends readonly EncryptableItem[]>(variables: EncryptInputsVariables<T>) => {\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n const result = await mutation.mutateAsync(variables);\n assertEncryptInputsResult(items, result);\n return result;\n },\n encryptInputs: (variables) => mutation.mutate(variables),\n isEncrypting: mutation.isPending,\n stepsState,\n };\n}\n","import { EncryptStep, type EncryptStepCallbackContext } from '@cofhe/sdk';\nimport { useCallback, useMemo, useState } from 'react';\n\nexport type EncryptionStep = { step: EncryptStep; context?: EncryptStepCallbackContext };\n\ntype StepWithOrder = `${number}_${EncryptStep}_${'start' | 'stop'}`;\ntype CompactSteps = Partial<Record<StepWithOrder, number | undefined>>;\n\nfunction validateAndCompactizeSteps(encSteps: EncryptionStep[]): CompactSteps {\n const result: CompactSteps = {};\n encSteps.forEach((encStep, index) => {\n const postfix = encStep.context?.isStart ? 'start' : encStep.context?.isEnd ? 'stop' : null;\n if (!postfix) throw new Error('Invalid step context: must be start or end');\n\n const idx: StepWithOrder = `${index}_${encStep.step}_${postfix}`;\n\n result[idx] = encStep.context?.duration;\n });\n\n return result;\n}\n\n// Key is identifier for each encryption mutation call\nexport type StepsState = {\n onStep: (key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n onSetKey: (key: string | null) => void;\n compactSteps: CompactSteps;\n lastStep: EncryptionStep | null;\n};\n\nexport function useStepsState(): StepsState {\n const [steps, setSteps] = useState<Record<string, EncryptionStep[]>>({});\n const [currentKey, setCurrentKey] = useState<string | null>(null);\n\n const onStep = useCallback((key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => {\n if (step === EncryptStep.InitTfhe && context?.isStart) {\n // init with a single-element array\n setSteps((prev) => ({ ...prev, [key]: [{ step, context }] }));\n } else {\n setSteps((prev) => ({ ...prev, [key]: [...prev[key], { step, context }] }));\n }\n }, []);\n\n const onSetKey = useCallback((key: string | null) => {\n setCurrentKey(key);\n }, []);\n\n const compactSteps = useMemo(\n () => validateAndCompactizeSteps(currentKey ? steps[currentKey] : []),\n [steps, currentKey]\n );\n\n const lastStep = currentKey ? steps[currentKey][steps[currentKey].length - 1] : null;\n\n return {\n onStep,\n onSetKey,\n compactSteps,\n lastStep,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n Hash,\n WalletClient,\n WriteContractParameters,\n} from 'viem';\nimport { assert } from 'ts-essentials';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheWalletClient } from './useCofheConnection.js';\n\ntype WalletWriteContractParamsAny = Parameters<WalletClient['writeContract']>[0];\n\nexport type WalletWriteContractInputWithExtras<TExtras> = {\n writeContractInput: WalletWriteContractParamsAny;\n extras: TExtras;\n};\n\ntype WalletWriteContractMutationVariables<TExtras> =\n | WalletWriteContractParamsAny\n | WalletWriteContractInputWithExtras<TExtras>;\n\nfunction hasExtras<TExtras>(\n variables: WalletWriteContractMutationVariables<TExtras>\n): variables is WalletWriteContractInputWithExtras<TExtras> {\n return (\n typeof variables === 'object' && variables !== null && 'writeContractInput' in variables && 'extras' in variables\n );\n}\n\nexport type WalletWriteContractParams<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n> = WriteContractParameters<TAbi, TFunctionName, TArgs, Chain | undefined, Account | undefined, TChainOverride>;\n\nexport type useCofheWriteContractOptions<TExtras = unknown> = Omit<\n UseMutationOptions<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: call `walletClient.writeContract`.\n *\n * Unlike `useCofheWriteContract`, this accepts viem's full `writeContract` parameter type.\n */\nexport function useCofheWriteContract<TExtras = unknown>(\n options?: useCofheWriteContractOptions<TExtras>\n): UseMutationResult<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown> & {\n writeContractAsync: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => Promise<Hash>;\n writeContract: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => void;\n} {\n const walletClient = useCofheWalletClient();\n\n const mutation = useInternalMutation<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'walletWriteContract'],\n mutationFn: async (variables) => {\n assert(walletClient, 'WalletClient is required to write to a contract');\n\n const writeContractInput = hasExtras(variables) ? variables.writeContractInput : variables;\n return walletClient.writeContract(writeContractInput);\n },\n });\n\n const writeContractAsync = async <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutateAsync(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n const writeContract = <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutate(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n return {\n ...mutation,\n writeContractAsync,\n writeContract,\n };\n}\n","import {\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token, ETH_ADDRESS_LOWERCASE } from './useCofheTokenLists.js';\nimport {\n SHIELD_ABIS,\n UNSHIELD_ABIS,\n CLAIM_ABIS,\n DUAL_GET_UNSHIELD_CLAIM_ABI,\n WRAPPED_ETH_ENCRYPT_ETH_ABI,\n WRAPPED_ENCRYPT_ABI,\n WRAPPED_GET_USER_CLAIMS_ABI,\n ERC20_ALLOWANCE_ABI,\n ERC20_APPROVE_ABI,\n} from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation, useInternalQuery } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UnshieldClaim = {\n ctHash: bigint;\n requestedAmount: bigint;\n decryptedAmount: bigint;\n decrypted: boolean;\n claimed: boolean;\n};\n\ntype UseTokenShieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to shield (in token's smallest unit) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenShieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseTokenShieldInput>, 'mutationFn'>;\n\n// ============================================================================\n// Shield Hook\n// ============================================================================\n\n/**\n * Hook to shield tokens (convert regular balance to confidential)\n * - Dual tokens: calls `shield(uint256 amount)`\n * - Wrapped tokens: TBD (needs approval flow)\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenShield(\n options?: UseTokenShieldOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenShieldInput> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseTokenShieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token shield');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token shield');\n }\n\n // Only dual and wrapped support shielding\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Shield not supported for confidentialityType: ${confidentialityType}`);\n }\n\n let hash: `0x${string}`;\n\n if (confidentialityType === 'wrapped') {\n // Check if this is a wrapped ETH token (erc20Pair is ETH_ADDRESS)\n const erc20PairAddress = input.token.extensions.fhenix.erc20Pair?.address as Address | undefined;\n const isEth = erc20PairAddress?.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n if (isEth) {\n // For ETH: use encryptETH(address to) with value\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: WRAPPED_ETH_ENCRYPT_ETH_ABI,\n functionName: 'encryptETH',\n args: [walletClient.account.address],\n value: input.amount,\n account: walletClient.account,\n chain: undefined,\n });\n } else {\n // For ERC20 wrapped tokens: need to check allowance and approve if needed\n if (!erc20PairAddress) {\n throw new Error('erc20Pair address is required for wrapped ERC20 tokens');\n }\n\n if (!publicClient) {\n throw new Error('PublicClient is required for allowance check');\n }\n\n // Check current allowance\n input.onStatusChange?.('Checking allowance...');\n const currentAllowance = await publicClient.readContract({\n address: erc20PairAddress,\n abi: ERC20_ALLOWANCE_ABI,\n functionName: 'allowance',\n args: [walletClient.account.address, tokenAddress],\n });\n\n // If allowance is insufficient, request approval\n if (currentAllowance < input.amount) {\n input.onStatusChange?.('Approval required - please confirm in wallet...');\n // Request approval for the exact amount (or max uint256 for unlimited)\n const approvalHash = await walletClient.writeContract({\n address: erc20PairAddress,\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [tokenAddress, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n\n // Wait for approval transaction to be confirmed\n input.onStatusChange?.('Waiting for approval confirmation...');\n await publicClient.waitForTransactionReceipt({ hash: approvalHash });\n input.onStatusChange?.('Approved! Now shielding...');\n }\n\n // Now call encrypt\n input.onStatusChange?.('Please confirm shield in wallet...');\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: WRAPPED_ENCRYPT_ABI,\n functionName: 'encrypt',\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n } else {\n // Dual tokens: use shield(uint256 amount)\n const contractConfig = SHIELD_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for shield: ${confidentialityType}`);\n }\n\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Shield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token shield');\n assert(account, 'Wallet account is required for token shield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Shield,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type MutationFunctionContext, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { UNSHIELD_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, TransactionStatus, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useOnceTransactionMined } from './useOnceTransactionMined.js';\nimport { useOnceDecrypted } from './useOnceDecrypted.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Unshield Hook\n// ============================================================================\ntype UseTokenUnshieldMutationInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to unshield (in token's smallest unit, uint64 max for dual) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenUnshieldMutationOptions = Omit<\n UseMutationOptions<`0x${string}`, Error, UseTokenUnshieldMutationInput>,\n 'mutationFn'\n>;\n/**\n * Hook to unshield tokens (initiate conversion from confidential to regular)\n * - Dual tokens: calls `unshield(uint64 amount)`, then need to claim\n * - Wrapped tokens: TBD\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nfunction useCofheTokenUnshieldMutation(\n options?: UseTokenUnshieldMutationOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenUnshieldMutationInput> {\n const walletClient = useCofheWalletClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n\n const { onSuccess, onError, ...restOfOptions } = options || {};\n\n return useInternalMutation({\n mutationFn: async (input: UseTokenUnshieldMutationInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token unshield');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token unshield');\n }\n\n // Only dual and wrapped support unshielding\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Unshield not supported for confidentialityType: ${confidentialityType}`);\n }\n\n const contractConfig = UNSHIELD_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for unshield: ${confidentialityType}`);\n }\n\n let hash: `0x${string}`;\n\n input.onStatusChange?.('Please confirm in wallet...');\n\n if (confidentialityType === 'wrapped') {\n // Wrapped tokens: decrypt(address to, uint128 value)\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n } else {\n // For dual tokens, unshield takes uint64\n const amount = BigInt.asUintN(64, input.amount);\n\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Unshield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token unshield');\n assert(account, 'Wallet account is required for token unshield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Unshield,\n isPendingDecryption: true, // is tx that requires decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n\ntype UseCofheTokenUnshieldInput = {\n onUserSignatureRequest?: (variables: UseTokenUnshieldMutationInput, context: MutationFunctionContext) => void;\n onTransactionSubmitSuccess?: (hash: `0x${string}`) => void;\n onTransactionSubmitError?: (error: Error) => void;\n onceMined?: (transaction: { hash: `0x${string}`; status: TransactionStatus }) => void;\n onceDecrypted?: () => void;\n};\nexport function useCofheTokenUnshield(input: UseCofheTokenUnshieldInput) {\n const unshieldMutation = useCofheTokenUnshieldMutation({\n onMutate: input.onUserSignatureRequest,\n onSuccess: input.onTransactionSubmitSuccess,\n onError: input.onTransactionSubmitError,\n });\n\n const { isMining: isTokenUnshieldMining } = useOnceTransactionMined({\n txHash: unshieldMutation.data,\n onceMined: input.onceMined,\n });\n\n const { isPendingDecryption } = useOnceDecrypted({\n txHash: unshieldMutation.data,\n onceDecrypted: input.onceDecrypted,\n });\n\n return {\n ...unshieldMutation,\n isTokenUnshieldMining,\n isPendingDecryption,\n };\n}\n","import { type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransaction(txHash: `0x${string}` | undefined) {\n const filter = useMemo(() => {\n return (tx: Transaction) => tx.hash === txHash;\n }, [txHash]);\n const { filteredTxs } = useStoredTransactions({ filter });\n assert(filteredTxs.length <= 1, 'There should be at most one transaction with a given hash');\n\n return filteredTxs[0];\n}\n","import type { Transaction, TransactionStatus } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when transaction is mined (i.e. goes from pending to final status - confirmed/failed)\n// i.e. it wont fire again if component re-renders or transaction status changes again (which shouldn't ever happen unless exception, as it's final data from the chain)\n\n// use this hook for ad-hock UI effects that should happen once tx is mined (e.g. show a toast, navigate, etc)\n// DO NOT use this hook for balance invalidation as it's handled in useTrackPendingTransactions\nexport function useOnceTransactionMined({\n txHash,\n onceMined,\n}: {\n txHash: `0x${string}` | undefined;\n onceMined?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange: onceMined\n ? (prevStatus, newStatus, transaction) => {\n if (prevStatus === 'pending' && (newStatus === 'confirmed' || newStatus === 'failed')) {\n onceMined(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isMining: transaction?.status === 'pending',\n };\n}\n\nfunction useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange,\n}: {\n txHash: `0x${string}` | undefined;\n onTransactionStatusChange?: (\n prevStatus: TransactionStatus | undefined,\n newStatus: TransactionStatus,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onTransactionStatusChange) return;\n\n // if status changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.status !== transaction?.status && !!transaction) {\n onTransactionStatusChange(previousTransactionRef.current?.status, transaction.status, transaction);\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onTransactionStatusChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import type { Transaction } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when a transaction enters \"pending decryption\" state\n// i.e. it won't fire again if component re-renders etc\nexport function useOnceDecrypted({\n txHash,\n onceDecrypted,\n}: {\n txHash: `0x${string}` | undefined;\n onceDecrypted?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange: onceDecrypted\n ? (prevIsPendingDecryption, newIsPendingDecryption, transaction) => {\n if (prevIsPendingDecryption === true && newIsPendingDecryption === false) {\n onceDecrypted(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isPendingDecryption: transaction?.isPendingDecryption === true,\n };\n}\n\nfunction useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange,\n}: {\n txHash: `0x${string}` | undefined;\n onDecryptionPendingChange?: (\n prevIsPendingDecryption: boolean | undefined,\n newIsPendingDecryption: boolean,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onDecryptionPendingChange) return;\n // if flag changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.isPendingDecryption !== transaction?.isPendingDecryption && !!transaction) {\n onDecryptionPendingChange(\n previousTransactionRef.current?.isPendingDecryption,\n transaction.isPendingDecryption,\n transaction\n );\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onDecryptionPendingChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import { type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { CLAIM_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Claim Unshield Hook\n// ============================================================================\ntype UseClaimUnshieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount being claimed (for activity logging) */\n amount: bigint;\n};\ntype UseClaimUnshieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseClaimUnshieldInput>, 'mutationFn'>;\n/**\n * Hook to claim unshielded tokens after decryption completes\n * - Dual tokens: calls `claimUnshielded()`\n * - Wrapped tokens: calls `claimAllDecrypted()`\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenClaimUnshielded(\n options?: UseClaimUnshieldOptions\n): UseMutationResult<`0x${string}`, Error, UseClaimUnshieldInput> {\n const walletClient = useCofheWalletClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseClaimUnshieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for claim');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for claim');\n }\n\n // Only dual and wrapped support claiming\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Claim not supported for confidentialityType: ${confidentialityType}`);\n }\n\n const contractConfig = CLAIM_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for claim: ${confidentialityType}`);\n }\n\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [],\n account: walletClient.account,\n chain: undefined,\n });\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Claim);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for claim');\n assert(account, 'Wallet account is required for claim');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n\n token: input.token,\n tokenAmount: input.amount,\n\n chainId,\n actionType: TransactionActionType.Claim,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type QueryFunctionContext, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { type Address } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport { useNormalizedList } from './useNormalizedList.js';\nimport { useIsWaitingForDecryptionByAddress } from './useIsWaitingForDecryptionByAddress.js';\nimport {\n constructUnshieldClaimsQueryKey,\n DEFAULT_UNSHIELD_CLAIM_SUMMARY,\n fetchUnshieldClaimsSummary,\n isTokenConfidentialityTypeClaimable,\n type UnshieldClaimsSummary,\n} from './useCofheTokenClaimable.js';\nimport { useStoredTransactions } from './useStoredTransactions.js';\nimport { TransactionActionType, TransactionStatus } from '@/stores/transactionStore.js';\n\nexport type UnshieldClaimsSummaryByTokenAddress = Record<Address, UnshieldClaimsSummary>;\nexport type ClaimableAmountByTokenAddress = Record<Address, bigint>;\nexport type BooleanByAddress = Record<Address, boolean>;\n\ntype UseUnshieldClaimsManyInput = {\n tokens: Token[];\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsManyOptions = Omit<\n UseQueryOptions<\n UnshieldClaimsSummary,\n Error,\n UnshieldClaimsSummary,\n ReturnType<typeof constructUnshieldClaimsQueryKey>\n >,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\ntype ClaimableToken = Token & {\n extensions: Token['extensions'] & {\n fhenix: Token['extensions']['fhenix'] & {\n confidentialityType: 'dual' | 'wrapped';\n };\n };\n};\n\nfunction isClaimableToken(token: Token): token is ClaimableToken {\n return isTokenConfidentialityTypeClaimable(token.extensions?.fhenix?.confidentialityType);\n}\n\nfunction claimableDedupeKey(token: ClaimableToken): string {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n return `${token.chainId}:${token.address.toLowerCase()}:${confidentialityType}`;\n}\n\nfunction claimableSort(a: ClaimableToken, b: ClaimableToken): number {\n if (a.chainId !== b.chainId) return a.chainId - b.chainId;\n return a.address.toLowerCase().localeCompare(b.address.toLowerCase());\n}\ntype CombinedResult = {\n summariesByTokenAddress: UnshieldClaimsSummaryByTokenAddress;\n claimableByTokenAddress: ClaimableAmountByTokenAddress;\n isWaitingForDecryptionByTokenAddress?: BooleanByAddress;\n isUnshieldingInProgressByTokenAddress?: BooleanByAddress;\n isClaimingByTokenAddress?: BooleanByAddress;\n queries: UseQueryResult<UnshieldClaimsSummary, Error>[];\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n totalTokensClaimable: number;\n error: Error | null;\n};\n\nconst pendingClaimsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Claim && tx.status === TransactionStatus.Pending;\n\nconst pendingUnshieldsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Unshield && tx.status === TransactionStatus.Pending;\n\nconst asBooleanByTokenAddressLowercase = (\n txs: { token: { address: string }; actionType: TransactionActionType; status: TransactionStatus }[]\n) => {\n return txs.reduce<Record<string, boolean>>((acc, tx) => {\n const key = tx.token.address.toLowerCase();\n acc[key] = true;\n\n return acc;\n }, {});\n};\n\nexport function useCofheTokensClaimable(\n { tokens, accountAddress: account }: UseUnshieldClaimsManyInput,\n queryOptions?: UseUnshieldClaimsManyOptions\n): CombinedResult {\n const publicClient = useCofhePublicClient();\n\n const normalizedTokens = useNormalizedList(tokens, {\n filter: isClaimableToken,\n dedupeKey: claimableDedupeKey,\n sort: claimableSort,\n });\n\n const enabledBase = !!publicClient && !!account && normalizedTokens.length > 0;\n\n const waitingEntries = useMemo(() => {\n if (!account) return [];\n return normalizedTokens.map((token) => ({\n address: token.address,\n queryKey: constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress: account,\n }),\n }));\n }, [account, normalizedTokens]);\n\n const isWaitingForDecryptionByTokenAddress = useIsWaitingForDecryptionByAddress(waitingEntries);\n\n const chainId = useCofheChainId();\n\n const { reduced: isUnshieldingInProgressByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingUnshieldsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const { reduced: isClaimingByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingClaimsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const combined = useInternalQueries({\n queries: normalizedTokens.map((token) => {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType,\n accountAddress: account,\n });\n\n return {\n queryKey,\n queryFn: async ({\n signal,\n queryKey,\n }: QueryFunctionContext<ReturnType<typeof constructUnshieldClaimsQueryKey>>) => {\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType narrowed by token guard'\n );\n\n assert(account, 'account is required to fetch unshield claims');\n assert(publicClient, 'publicClient is required to fetch unshield claims');\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: enabledBase,\n ...queryOptions,\n };\n }),\n combine: (results) => {\n return results.reduce<\n Omit<\n CombinedResult,\n 'isWaitingForDecryptionByTokenAddress' | 'isUnshieldingInProgressByTokenAddress' | 'isClaimingByTokenAddress'\n >\n >(\n (acc, result, index) => {\n const token = normalizedTokens[index];\n if (!token) return acc;\n\n const summary = result.data ?? DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n acc.summariesByTokenAddress[token.address] = summary;\n acc.claimableByTokenAddress[token.address] = summary.claimableAmount;\n\n if (summary.hasClaimable) {\n acc.totalTokensClaimable += 1;\n }\n\n acc.isLoading = acc.isLoading || result.isLoading;\n acc.isFetching = acc.isFetching || result.isFetching;\n acc.isError = acc.isError || result.isError;\n if (!acc.error && result.error) acc.error = result.error;\n\n return acc;\n },\n {\n summariesByTokenAddress: {},\n claimableByTokenAddress: {},\n totalTokensClaimable: 0,\n queries: results,\n isLoading: false,\n isFetching: false,\n isError: false,\n error: null,\n }\n );\n },\n });\n\n return {\n summariesByTokenAddress: combined.summariesByTokenAddress,\n claimableByTokenAddress: combined.claimableByTokenAddress,\n totalTokensClaimable: combined.totalTokensClaimable,\n queries: combined.queries,\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n isWaitingForDecryptionByTokenAddress,\n isUnshieldingInProgressByTokenAddress,\n isClaimingByTokenAddress,\n };\n}\n","import { useMemo } from 'react';\n\nexport type NormalizeOptions<T, U extends T = T> = {\n /** Optional filter; can be a type guard to narrow the output type */\n filter?: (item: T) => item is U;\n /** Optional de-dupe key function */\n dedupeKey?: (item: U) => string;\n /** Optional deterministic sort */\n sort?: (a: U, b: U) => number;\n};\n\nexport function useNormalizedList<T, U extends T = T>(items: T[] | undefined, options?: NormalizeOptions<T, U>): U[] {\n return useMemo(() => {\n if (!items || items.length === 0) return [];\n\n const filter = options?.filter;\n const dedupeKey = options?.dedupeKey;\n const sort = options?.sort;\n\n const filtered = (filter ? items.filter(filter) : (items as unknown as U[])) as U[];\n\n const deduped = (() => {\n if (!dedupeKey) return filtered;\n const seen = new Set<string>();\n const unique: U[] = [];\n for (const item of filtered) {\n const key = dedupeKey(item);\n if (seen.has(key)) continue;\n seen.add(key);\n unique.push(item);\n }\n return unique;\n })();\n\n if (sort) deduped.sort(sort);\n\n return deduped;\n }, [items, options?.dedupeKey, options?.filter, options?.sort]);\n}\n\n// Compatibility aliases (internal/private helper; keep naming flexible)\nexport const useNormalizedItems = useNormalizedList;\nexport const useNormalizedTokens = useNormalizedList;\n","import { useMemo } from 'react';\nimport { isAddress, type Address } from 'viem';\nimport { assert } from 'ts-essentials';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { useAwaitingDecryptionQueryKeySet } from './useIsWaitingForDecryptionToInvalidate.js';\n\nexport type IsWaitingForDecryptionByAddress = Record<Address, boolean>;\n\nexport type WaitingForDecryptionEntry = {\n address: Address;\n queryKey: QueryKey;\n};\n\n/**\n * Given a list of entries and the invalidation-store snapshot, computes whether each address\n * is currently awaiting decryption invalidation.\n */\nexport function useIsWaitingForDecryptionByAddress(\n entries: WaitingForDecryptionEntry[]\n): IsWaitingForDecryptionByAddress {\n const awaitingDecryptionKeySet = useAwaitingDecryptionQueryKeySet();\n\n return useMemo(() => {\n const map: IsWaitingForDecryptionByAddress = {};\n\n for (const entry of entries) {\n assert(isAddress(entry.address), 'address is valid');\n map[entry.address] = awaitingDecryptionKeySet.has(JSON.stringify(entry.queryKey));\n }\n\n return map;\n }, [awaitingDecryptionKeySet, entries]);\n}\n","import { useMemo } from 'react';\nimport type { Address } from 'viem';\n\nimport type { Token } from '@/types/token';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport {\n useCofheReadContracts,\n type CofheReadContractsContract,\n type UseCofheReadContractsQueryOptions,\n} from './useCofheReadContracts';\n\nfunction asCtHash(value: unknown): bigint | undefined {\n if (typeof value === 'bigint') return value;\n if (value && typeof value === 'object' && 'ctHash' in value) {\n const ctHash = (value as { ctHash?: unknown }).ctHash;\n if (typeof ctHash === 'bigint') return ctHash;\n }\n return undefined;\n}\n\nexport type UseCofheTokensWithExistingBalancesInput = {\n chainId?: number;\n accountAddress?: Address;\n};\n\nexport type UseCofheTokensWithExistingBalancesResult = {\n tokens: Token[];\n tokensWithExistingEncryptedBalance: Token[];\n ctHashByTokenAddress: Record<string, bigint>;\n\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n error: Error | null;\n\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Returns tokens whose confidential (encrypted) balance handle exists for the given account.\n *\n * This does NOT decrypt balances. It only checks if the encrypted balance return value (ctHash) is non-zero.\n */\nexport function useCofheTokensWithExistingEncryptedBalances(\n { chainId: _chainId, accountAddress }: UseCofheTokensWithExistingBalancesInput = {},\n queryOptions?: UseCofheReadContractsQueryOptions\n): UseCofheTokensWithExistingBalancesResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress ?? connectedAccount;\n const currentChainId = useCofheChainId();\n const chainIdForTokens = _chainId ?? currentChainId;\n\n const tokens = useCofheTokens(chainIdForTokens);\n\n const contracts = useMemo((): readonly CofheReadContractsContract[] => {\n if (!account) return [];\n\n return tokens.map((token) => {\n const config = getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n return {\n address: token.address,\n abi: config.abi,\n functionName: config.functionName,\n args: [account],\n };\n });\n }, [account, tokens]);\n\n const read = useCofheReadContracts(\n {\n contracts,\n multicallOptions: {\n allowFailure: true,\n },\n },\n {\n refetchOnMount: false,\n ...queryOptions,\n enabled: (queryOptions?.enabled ?? true) && !!account && tokens.length > 0,\n }\n );\n\n const { tokensWithExistingEncryptedBalance, ctHashByTokenAddress, error } = useMemo(() => {\n const map: Record<string, bigint> = {};\n const filtered: Token[] = [];\n\n const items = read.data;\n if (!items || items.length === 0) {\n return {\n tokensWithExistingEncryptedBalance: filtered,\n ctHashByTokenAddress: map,\n error: read.error ?? null,\n };\n }\n\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index];\n const item = items[index];\n if (!token || !item) continue;\n if (item.error) continue;\n\n const ctHash = asCtHash(item.result);\n if (ctHash == null) continue;\n if (ctHash === 0n) continue;\n\n map[token.address.toLowerCase()] = ctHash;\n filtered.push(token);\n }\n\n return {\n tokensWithExistingEncryptedBalance: filtered,\n ctHashByTokenAddress: map,\n error: read.error ?? null,\n };\n }, [read.data, read.error, tokens]);\n\n return {\n tokens,\n tokensWithExistingEncryptedBalance,\n ctHashByTokenAddress,\n\n isLoading: read.isLoading,\n isFetching: read.isFetching,\n isError: read.isError,\n error,\n\n refetch: read.refetch,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { assert } from 'ts-essentials';\nimport type { Address } from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi } from '@cofhe/abi';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContracts';\n\nfunction serializeIfBigint(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n}\n\nfunction serializeBigintRecursively(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(serializeBigintRecursively);\n } else {\n return serializeIfBigint(value);\n }\n}\n\nexport type CofheReadContractsContract = {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n};\n\nexport type CofheReadContractsMulticallOptions = {\n /**\n * When `true` (default in viem), returns per-call status objects.\n * When `false`, throws on any failed call.\n */\n allowFailure?: boolean;\n /** Optional viem multicall options (kept loose to avoid coupling to viem's internal generics). */\n [key: string]: unknown;\n};\n\nexport type CofheReadContractsItem = {\n result?: unknown;\n error?: Error;\n};\n\nexport type UseCofheReadContractsQueryOptions = Omit<\n UseQueryOptions<CofheReadContractsItem[], Error>,\n 'queryKey' | 'queryFn'\n> & {\n enabled?: boolean;\n};\n\nexport function constructCofheReadContractsQueryKey(params: {\n cofheChainId?: number;\n contracts?: readonly CofheReadContractsContract[];\n allowFailure?: boolean;\n enabled?: boolean;\n}): readonly unknown[] {\n const { cofheChainId, contracts, allowFailure, enabled } = params;\n\n const serializedContracts = (contracts ?? []).map((contract) => {\n // Avoid putting non-serializable values in queryKey.\n // `abi` is typically a plain JSON array, safe to include.\n return {\n address: contract.address,\n functionName: contract.functionName,\n args: Array.isArray(contract.args) ? serializeBigintRecursively(contract.args) : contract.args,\n abi: contract.abi,\n };\n });\n\n return [QUERY_CACHE_PREFIX, cofheChainId, serializedContracts, allowFailure, enabled];\n}\n\nexport function getEnabledForCofheReadContracts(params: {\n isCofheErrorActive: boolean;\n publicClient: unknown;\n cofheChainId?: number;\n contracts?: readonly CofheReadContractsContract[];\n userEnabled?: boolean;\n}): boolean {\n const { isCofheErrorActive, publicClient, cofheChainId, contracts, userEnabled } = params;\n\n return (\n !isCofheErrorActive &&\n !!publicClient &&\n !!cofheChainId &&\n !!contracts &&\n contracts.length > 0 &&\n (userEnabled ?? true)\n );\n}\n\nfunction isViemAllowFailureResult(\n value: unknown\n): value is { status: 'success' | 'failure'; result?: unknown; error?: Error } {\n return !!value && typeof value === 'object' && 'status' in value;\n}\n\nfunction transformResultForContract(contract: CofheReadContractsContract, value: unknown): unknown {\n // `transformEncryptedReturnTypes` expects Cofhe ABI & function typing, but multicall contracts can be heterogeneous.\n // Runtime transformation still works; we keep types intentionally loose here.\n return transformEncryptedReturnTypes(contract.abi, contract.functionName, value);\n}\n\nexport function useCofheReadContracts(\n params: {\n contracts?: readonly CofheReadContractsContract[];\n multicallOptions?: CofheReadContractsMulticallOptions;\n },\n queryOptions?: UseCofheReadContractsQueryOptions\n): UseQueryResult<CofheReadContractsItem[], Error> {\n const { contracts, multicallOptions } = params;\n\n const isCofheErrorActive = useIsCofheErrorActive();\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n\n const enabled = getEnabledForCofheReadContracts({\n isCofheErrorActive,\n publicClient,\n cofheChainId,\n contracts,\n userEnabled: queryOptions?.enabled,\n });\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return useInternalQuery({\n enabled,\n queryKey: constructCofheReadContractsQueryKey({\n cofheChainId,\n contracts,\n allowFailure: multicallOptions?.allowFailure,\n // Same rationale as in `useCofheReadContract`: guard against a blank screen when CofheError is active.\n enabled,\n }),\n queryFn: async () => {\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(contracts && contracts.length > 0, 'Contracts should be guaranteed by enabled check');\n\n const raw = await publicClient.multicall({\n contracts,\n ...(multicallOptions || {}),\n });\n\n // When `allowFailure: true`, viem returns per-item { status, result?, error? }.\n // When `allowFailure: false`, viem returns an array of results (and throws on failure).\n return raw.map((item, index): CofheReadContractsItem => {\n const contract = contracts[index];\n if (!contract) return { error: new Error('Multicall result length mismatch') };\n\n if (isViemAllowFailureResult(item)) {\n if (item.status === 'failure') {\n return { error: item.error ?? new Error('Multicall call failed') };\n }\n return { result: transformResultForContract(contract, item.result) };\n }\n\n return { result: transformResultForContract(contract, item) };\n });\n },\n ...restQueryOptions,\n });\n}\n","import { useMemo } from 'react';\nimport type { Address } from 'viem';\n\nimport type { Token } from '@/types/token';\nimport { useInternalQueries } from '../providers';\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport {\n createPublicTokenBalanceQueryOptions,\n getPublicTokenBalanceSource,\n type PublicTokenBalanceSource,\n type UseTokenBalanceOptions,\n} from './useCofheTokenPublicBalance';\n\nexport type UseTokensWithPublicBalancesInput = {\n chainId?: number;\n accountAddress?: Address;\n displayDecimals?: number;\n};\n\nexport type UseTokensWithPublicBalancesResult = {\n tokens: Token[];\n tokensWithPublicBalances: Token[];\n publicBalanceByTokenAddress: Record<string, TokenFormatOutput>;\n\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n error: Error | null;\n\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Returns CoFHE tokens which have a non-zero public balance.\n *\n * Public balance source:\n * - `wrapped`: underlying `erc20Pair` (or native ETH)\n * - `dual`: token contract `balanceOf` (ERC20)\n * - `pure`: skipped (no public balance)\n */\nexport function useTokensWithPublicBalances(\n { chainId: _chainId, accountAddress, displayDecimals = 5 }: UseTokensWithPublicBalancesInput = {},\n options?: { enabled?: boolean } & Omit<UseTokenBalanceOptions, 'select'>\n): UseTokensWithPublicBalancesResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress ?? connectedAccount;\n\n const currentChainId = useCofheChainId();\n const chainIdForTokens = _chainId ?? currentChainId;\n\n const publicClient = useCofhePublicClient();\n\n const tokens = useCofheTokens(chainIdForTokens);\n\n const entries = useMemo((): Array<{ token: Token; source: PublicTokenBalanceSource }> => {\n const out: Array<{ token: Token; source: PublicTokenBalanceSource }> = [];\n for (const token of tokens) {\n const source = getPublicTokenBalanceSource(token);\n if (!source) continue;\n out.push({ token, source });\n }\n return out;\n }, [tokens]);\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n const enabled = userEnabled && !!publicClient && !!account && entries.length > 0;\n\n const combined = useInternalQueries({\n queries: entries.map(({ source }) =>\n createPublicTokenBalanceQueryOptions({\n publicClient,\n accountAddress: account,\n tokenAddress: source.address,\n queryOptions: {\n enabled,\n ...restOptions,\n },\n })\n ),\n combine: (results) => {\n const out: Token[] = [];\n const balanceMap: Record<string, TokenFormatOutput> = {};\n\n let isLoading = false;\n let isFetching = false;\n let isError = false;\n let error: Error | null = null;\n\n for (let index = 0; index < results.length; index++) {\n const result = results[index];\n const entry = entries[index];\n if (!result || !entry) continue;\n\n isLoading = isLoading || result.isLoading;\n isFetching = isFetching || result.isFetching;\n isError = isError || result.isError;\n if (!error && result.error) error = result.error;\n\n const wei = result.data;\n if (typeof wei !== 'bigint') continue;\n if (wei <= 0n) continue;\n\n out.push(entry.token);\n balanceMap[entry.token.address.toLowerCase()] = formatTokenAmount(wei, entry.source.decimals, displayDecimals);\n }\n\n return {\n tokensWithPublicBalances: out,\n publicBalanceByTokenAddress: balanceMap,\n isLoading,\n isFetching,\n isError,\n error,\n refetch: async () => {\n await Promise.all(results.map((r) => r.refetch()));\n },\n };\n },\n });\n\n return {\n tokens,\n tokensWithPublicBalances: combined.tokensWithPublicBalances,\n publicBalanceByTokenAddress: combined.publicBalanceByTokenAddress,\n\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n\n refetch: combined.refetch,\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\n\nexport type DurationUnit = 'hours' | 'days' | 'weeks' | 'months';\n\nexport interface UsePermitDurationOptions {\n onDurationChange: (seconds: number) => void;\n initialSeconds?: number;\n}\n\nexport interface DurationPreset {\n label: string;\n seconds: number;\n}\n\nexport interface UsePermitDurationResult {\n durationSeconds: number;\n customCount: number | '';\n customUnit: DurationUnit;\n presets: readonly DurationPreset[];\n units: readonly DurationUnit[];\n selectPreset: (seconds: number) => void;\n setCustomCount: (value: number | '') => void;\n setCustomUnit: (unit: DurationUnit) => void;\n applyCustom: (count: number | '', unit: DurationUnit) => void;\n unitSeconds: Readonly<Record<DurationUnit, number>>;\n}\n\nexport function usePermitDuration(options: UsePermitDurationOptions): UsePermitDurationResult {\n const { onDurationChange, initialSeconds = 7 * 24 * 60 * 60 } = options;\n\n const presets: readonly DurationPreset[] = useMemo(\n () => [\n { label: '1 day', seconds: 1 * 24 * 60 * 60 },\n { label: '1 week', seconds: 7 * 24 * 60 * 60 },\n { label: '1 month', seconds: 30 * 24 * 60 * 60 },\n ],\n []\n );\n\n const unitSeconds: Readonly<Record<DurationUnit, number>> = useMemo(\n () => ({\n hours: 60 * 60,\n days: 24 * 60 * 60,\n weeks: 7 * 24 * 60 * 60,\n months: 30 * 24 * 60 * 60,\n }),\n []\n );\n\n const [durationSeconds, setDurationSecondsState] = useState(initialSeconds);\n const [customCount, setCustomCountState] = useState<number | ''>('');\n const [customUnit, setCustomUnitState] = useState<DurationUnit>('days');\n\n const selectPreset = useCallback(\n (seconds: number) => {\n setDurationSecondsState(seconds);\n onDurationChange(seconds);\n },\n [onDurationChange]\n );\n\n const applyCustom = useCallback(\n (count: number | '', unit: DurationUnit) => {\n setCustomCountState(count);\n setCustomUnitState(unit);\n if (typeof count === 'number' && count > 0) {\n const computed = count * unitSeconds[unit];\n setDurationSecondsState(computed);\n onDurationChange(computed);\n }\n },\n [unitSeconds, onDurationChange]\n );\n\n const setCustomCount = useCallback((value: number | '') => applyCustom(value, customUnit), [applyCustom, customUnit]);\n const setCustomUnit = useCallback((unit: DurationUnit) => applyCustom(customCount, unit), [applyCustom, customCount]);\n\n return {\n durationSeconds,\n customCount,\n customUnit,\n presets,\n units: ['days', 'weeks', 'months', 'hours'] as const,\n selectPreset,\n setCustomCount,\n setCustomUnit,\n applyCustom,\n unitSeconds,\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useCofheCreatePermitMutation, type CreatePermitArgs } from './useCofheCreatePermitMutation';\n\nexport interface UsePermitFormOptions {\n isDelegate?: boolean;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UsePermitFormResult {\n permitName: string;\n receiver: string;\n error: string | null; // global/submit error\n nameError: string | null; // field-specific error for name\n receiverError: string | null;\n isValid: boolean;\n isSubmitting: boolean;\n durationSeconds: number;\n handleNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n handleReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n setDurationSeconds: (seconds: number) => void;\n handleSubmit: () => Promise<void>;\n reset: () => void;\n}\n\nexport function usePermitForm(options: UsePermitFormOptions = {}): UsePermitFormResult {\n const { onSuccess, onError, isDelegate = false } = options;\n const [permitName, setPermitName] = useState('');\n const [receiver, setReceiver] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [nameError, setNameError] = useState<string | null>(null);\n const [receiverError, setReceiverError] = useState<string | null>(null);\n const [durationSeconds, setDurationSeconds] = useState(7 * 24 * 60 * 60);\n const { mutateAsync: createPermitMutateAsync, isPending: isPermitCreationPending } = useCofheCreatePermitMutation({\n onSuccess,\n onError,\n });\n\n const recipientAddressValid = isDelegate ? isValidAddress(receiver) : true;\n const isValid = !!permitName.trim() && recipientAddressValid;\n\n const handleNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setPermitName(e.target.value);\n if (nameError) setNameError(null);\n },\n [nameError]\n );\n\n const handleReceiverChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setReceiver(e.target.value);\n if (receiverError) setReceiverError(null);\n },\n [receiverError]\n );\n\n const handleSubmit = useCallback(async () => {\n if (isPermitCreationPending) return;\n const nameToUse = permitName.trim();\n if (!nameToUse) {\n setNameError('Permit name is required.');\n return;\n }\n if (isDelegate) {\n if (!isValidAddress(receiver)) {\n setReceiverError('Valid receiver address is required.');\n return;\n }\n }\n try {\n const expirationSeconds = Math.floor(Date.now() / 1000) + durationSeconds;\n const args: CreatePermitArgs = isDelegate\n ? { name: nameToUse, isSelf: false, receiver: receiver.trim() as `0x${string}`, expirationSeconds }\n : { name: nameToUse, isSelf: true, expirationSeconds };\n\n await createPermitMutateAsync(args);\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n } catch (e: any) {\n setError(e?.message ?? 'Failed to create permit');\n }\n }, [isPermitCreationPending, permitName, isDelegate, receiver, durationSeconds, createPermitMutateAsync]);\n\n const reset = useCallback(() => {\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n }, []);\n\n return {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting: isPermitCreationPending,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n reset,\n };\n}\n\nfunction isValidAddress(address: string): boolean {\n const a = address.trim();\n return /^0x[a-fA-F0-9]{40}$/.test(a);\n}\n","// Persisted store for long running flags / settings / etc\n\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\n\ntype PortalPersistedStore = {\n hasCreatedFirstPermit: boolean;\n};\n\ntype PortalPersistedActions = {\n setHasCreatedFirstPermit: (hasCreated: boolean) => void;\n};\n\nexport const usePortalPersisted = create<PortalPersistedStore & PortalPersistedActions>()(\n persist(\n (set, get) => ({\n hasCreatedFirstPermit: false,\n\n setHasCreatedFirstPermit: (hasCreated) => set({ hasCreatedFirstPermit: hasCreated }),\n }),\n {\n name: 'cofhesdk-react-persisted',\n storage: createJSONStorage(() => localStorage),\n }\n )\n);\n","import { usePortalPersisted } from '@/stores/portalPersisted.js';\nimport { useInternalMutation } from '../../providers/index.js';\nimport { useCofheClient } from '../useCofheClient.js';\n\nexport type CreatePermitArgs =\n | {\n name: string;\n isSelf: true;\n expirationSeconds: number; // unix timestamp (seconds)\n }\n | {\n name: string;\n isSelf: false;\n receiver: `0x${string}`;\n expirationSeconds: number; // unix timestamp (seconds)\n };\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport const useCofheCreatePermitMutation = ({ onSuccess, onError }: Input = {}) => {\n const cofheClient = useCofheClient();\n const { setHasCreatedFirstPermit } = usePortalPersisted();\n\n return useInternalMutation<void, Error, CreatePermitArgs>({\n onSuccess,\n onError,\n onSettled: () => {\n // Mark that the user has created at least one permit\n // After this, we will show him warnings and notifications accordingly\n setHasCreatedFirstPermit(true);\n },\n mutationFn: async (args) => {\n const { name, isSelf, expirationSeconds } = args;\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n\n if (isSelf) {\n await cofheClient.permits.createSelf({\n expiration: expirationSeconds,\n issuer: account,\n name: name.trim(),\n });\n return;\n }\n\n await cofheClient.permits.createSharing({\n expiration: expirationSeconds,\n issuer: account,\n recipient: args.receiver,\n name: name.trim(),\n });\n },\n });\n};\n","import { useCallback, useMemo } from 'react';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useCofheActivePermit, useCofheAllPermits } from '../useCofhePermits';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { useCofheNavigateToCreatePermit } from './useCofheNavigateToCreatePermit';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/FnxFloatingButton/modals/types';\n\nexport type PermitStatus = 'active' | 'valid' | 'expired';\nexport type PermitActionId = 'generate' | 'delegate' | 'import';\n\nexport const usePermitsList = () => {\n const allPermits = useCofheAllPermits();\n const activePermit = useCofheActivePermit();\n const { navigateTo } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const activePermitHash = useMemo(() => {\n return activePermit?.permit.hash;\n }, [activePermit?.permit.hash]);\n\n const selfPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'self');\n }, [allPermits]);\n\n const delegatedPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'sharing');\n }, [allPermits]);\n\n const importedPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'recipient');\n }, [allPermits]);\n\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n const handlePermitAction = useCallback(\n (actionId: PermitActionId) => {\n if (actionId === 'generate') {\n navigateToGeneratePermit();\n return;\n }\n if (actionId === 'delegate') {\n navigateTo(FloatingButtonPage.DelegatePermits, {});\n return;\n }\n if (actionId === 'import') {\n navigateTo(FloatingButtonPage.ReceivePermits);\n }\n },\n [navigateTo, navigateToGeneratePermit]\n );\n\n const handleOpenPermit = useCallback(\n (hash: string) => {\n openModal(PortalModal.PermitDetails, { hash });\n },\n [openModal]\n );\n\n return {\n activePermitHash,\n selfPermits,\n delegatedPermits,\n importedPermits,\n handlePermitAction,\n handleOpenPermit,\n };\n};\n","import type { GeneratePermitPageProps } from '@/components/FnxFloatingButton/pages/permits/GeneratePermitPage/types';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\n\nimport { useCallback } from 'react';\n\ntype Input = {\n cause?: GeneratePermitPageProps['cause'];\n};\nexport const useCofheNavigateToCreatePermit = () => {\n const { navigateTo, navigateBack } = usePortalNavigation();\n const { portalOpen, openPortal } = usePortalUI();\n\n return useCallback(\n ({ cause }: Input = {}) => {\n if (!portalOpen) openPortal();\n navigateTo(FloatingButtonPage.GeneratePermits, {\n pageProps: { cause, onSuccessNavigateTo: () => navigateBack() },\n navigateParams: { skipPagesHistory: true },\n });\n },\n [openPortal, portalOpen, navigateBack, navigateTo]\n );\n};\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../../providers/CofheProvider.js';\nimport { PermitUtils, type RecipientPermit } from '@cofhe/sdk/permits';\n\nexport type UseReceivePermitReturn = {\n importedPermit: RecipientPermit | null;\n permitData: string;\n setPermitData: (v: string) => void;\n permitName: string;\n setPermitName: (v: string) => void;\n isSubmitting: boolean;\n errorMsg: string | null;\n successMsg: string | null;\n submit: () => Promise<void>;\n};\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport function useReceivePermit({ onSuccess, onError }: Input = {}): UseReceivePermitReturn {\n const { client } = useCofheContext();\n\n const [importedPermit, setImportedPermit] = useState<RecipientPermit | null>(null);\n const [permitData, setPermitData] = useState('');\n const [permitName, setPermitName] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n\n const submit = useCallback(async () => {\n setErrorMsg(null);\n setSuccessMsg(null);\n if (!permitData.trim()) {\n setErrorMsg('Please paste permit data.');\n return;\n }\n\n try {\n setIsSubmitting(true);\n // If user provided a name, override the incoming permit's name\n let importArg: any | string = permitData.trim();\n if (permitName.trim()) {\n try {\n const parsed = JSON.parse(permitData.trim());\n importArg = { ...parsed, name: permitName.trim() };\n } catch (e) {\n setErrorMsg('Invalid permit data. Expected JSON.');\n setIsSubmitting(false);\n return;\n }\n }\n\n await client.permits.importShared(importArg);\n\n setSuccessMsg('Permit received and set active.');\n onSuccess?.();\n } catch (err: any) {\n const message = err?.message ?? 'Failed to import permit';\n setErrorMsg(message);\n onError?.(new Error(message));\n } finally {\n setIsSubmitting(false);\n }\n }, [client, permitData, permitName, onSuccess, onError]);\n\n const handleSetPermitData = useCallback((v: string) => {\n setPermitData(v);\n try {\n const permit = PermitUtils.importShared(v);\n setImportedPermit(permit);\n setErrorMsg(null);\n } catch (e) {\n console.error('Error parsing pasted permit data', e);\n setImportedPermit(null);\n // TODO: Improve error message, we have the error message in the caught error but its a zod error so its messy\n setErrorMsg(`Invalid permit data. Expected JSON.`);\n }\n }, []);\n\n return {\n importedPermit,\n permitData,\n setPermitData: handleSetPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { zeroAddress } from 'viem';\nimport { PermitUtils } from '@cofhe/sdk/permits';\nimport {\n useCofheActivePermit,\n useCofhePermit,\n useCofheRemovePermit,\n useCofheSelectPermit,\n} from '../useCofhePermits.js';\nimport { useCopyFeedback } from '../useCopyFeedback.js';\nimport { formatExpirationLabel, truncateAddress } from '@/utils/utils.js';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\n\nconst COPY_KEY = 'permit-details-json';\n\nexport const usePermitDetailsAndActions = (permitHash: string) => {\n const permit = useCofhePermit(permitHash);\n const activePermit = useCofheActivePermit();\n const { navigateBack } = usePortalNavigation();\n const { isCopied, copyWithFeedback } = useCopyFeedback();\n const { addToast } = usePortalToasts();\n const selectActivePermit = useCofheSelectPermit({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit selected',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to select permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n },\n });\n const removePermit = useCofheRemovePermit({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit deleted',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to delete permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n },\n });\n\n const isActivePermit = permit != null && activePermit?.permit.hash === permitHash;\n const expirationDate = permit != null ? new Date(permit.expiration * 1000).toLocaleString() : undefined;\n const isShareablePermit = permit?.type === 'sharing';\n\n const permitLabel = useMemo(() => {\n if (!permit) return undefined;\n if (permit.name?.trim()) return permit.name;\n const fallbackAddress =\n permit.recipient && permit.recipient !== zeroAddress ? permit.recipient : permit.issuer || zeroAddress;\n return truncateAddress(fallbackAddress, 4, 4) ?? fallbackAddress;\n }, [permit]);\n\n const expirationInfo = useMemo(() => formatExpirationLabel(permit?.expiration), [permit?.expiration]);\n\n const permitJson = useMemo(() => {\n if (!permit) return undefined;\n return PermitUtils.export(permit);\n }, [permit]);\n\n const handleBack = useCallback(() => {\n navigateBack();\n }, [navigateBack]);\n\n const handleCopySharablePermitData = useCallback(() => {\n if (!permitJson) return;\n copyWithFeedback(COPY_KEY, permitJson);\n addToast({\n variant: 'success',\n title: 'Permit data copied',\n description: 'Share copied data with recipient.',\n });\n }, [copyWithFeedback, permitJson, addToast]);\n\n const handleSelectActivePermit = useCallback(() => {\n selectActivePermit(permitHash);\n }, [selectActivePermit, permitHash]);\n\n const handleRemovePermit = useCallback(() => {\n removePermit(permitHash);\n }, [removePermit, permitHash]);\n\n return {\n permitExists: permit != null,\n permit,\n permitLabel,\n permitJson,\n expirationInfo,\n expirationDate,\n handleBack,\n handleCopySharablePermitData,\n handleSelectActivePermit,\n handleRemovePermit,\n isCopyComplete: isCopied(COPY_KEY),\n isActivePermit,\n isShareablePermit,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * useCopyFeedback\n * - Copies provided text to clipboard and exposes transient \"copied\" state per key.\n * - Useful for lists where each row has a copy action and needs quick feedback.\n */\nexport function useCopyFeedback(defaultDurationMs: number = 2000) {\n const [copiedKeys, setCopiedKeys] = useState<Set<string>>(new Set());\n const timersRef = useRef<Map<string, number>>(new Map());\n\n const isCopied = useCallback((key: string) => copiedKeys.has(key), [copiedKeys]);\n\n const clearTimer = useCallback((key: string) => {\n const timers = timersRef.current;\n const existing = timers.get(key);\n if (existing) {\n window.clearTimeout(existing);\n timers.delete(key);\n }\n }, []);\n\n const copyWithFeedback = useCallback(\n async (key: string, text: string, durationMs?: number): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text);\n\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n\n clearTimer(key);\n const timeout = window.setTimeout(() => {\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n timersRef.current.delete(key);\n }, durationMs ?? defaultDurationMs);\n timersRef.current.set(key, timeout);\n return true;\n } catch {\n return false;\n }\n },\n [clearTimer, defaultDurationMs]\n );\n\n // Cleanup timers on unmount\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n for (const id of timersRef.current.values()) {\n window.clearTimeout(id);\n }\n timersRef.current.clear();\n };\n }, []);\n\n return { copiedKeys, isCopied, copyWithFeedback };\n}\n","import type { PublicClient, WalletClient } from 'viem';\nimport { useCofheClient } from './useCofheClient';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { useCofheConnect } from './useCofheConnect';\n\ntype Input = {\n publicClient?: PublicClient;\n walletClient?: WalletClient;\n};\nexport const useCofheAutoConnect = ({ walletClient, publicClient }: Input) => {\n const client = useCofheClient();\n\n const connectMutationFn = useCofheConnect().mutate;\n\n const supportedChainIds = useMemo(() => {\n return new Set(client.config.supportedChains.map((chain) => chain.id));\n }, [client.config.supportedChains]);\n\n const disconnectIfConnected = useCallback(() => {\n if (client.connected || client.connecting) {\n client.disconnect();\n }\n }, [client]);\n\n useEffect(() => {\n // Keep COFHE connection in sync with the upstream (wagmi) connection.\n // - if wagmi disconnects, it stops providing clients -> disconnect COFHE\n // - if wagmi provides clients -> ensure COFHE is connected\n if (!publicClient || !walletClient) {\n disconnectIfConnected();\n return;\n }\n\n const chainId = walletClient.chain?.id ?? publicClient.chain?.id;\n if (chainId !== undefined && !supportedChainIds.has(chainId)) {\n disconnectIfConnected();\n return;\n }\n\n if (client.connecting) return;\n connectMutationFn({ publicClient, walletClient });\n }, [publicClient, walletClient, client, connectMutationFn, supportedChainIds, disconnectIfConnected]);\n};\n","import {\n useQuery as rqUseQuery,\n useMutation as rqUseMutation,\n useQueries as rqUseQueries,\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useInternalQueryClient } from './QueryProvider';\nimport { isPersistedQuery } from './queryUtils';\n\nfunction applyPersistedDefaults<TData, TError, TSelectedData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryOptions<TData, TError, TSelectedData> {\n if (!isPersistedQuery(options as { meta?: unknown; queryKey?: QueryKey })) return options;\n\n return {\n ...options,\n // Persisted results are typically deterministic. Default to not refetching on mount/focus/reconnect.\n // Consumers can override per-query when needed.\n staleTime: options.staleTime ?? Infinity,\n refetchOnMount: options.refetchOnMount ?? false,\n refetchOnWindowFocus: options.refetchOnWindowFocus ?? false,\n refetchOnReconnect: options.refetchOnReconnect ?? false,\n };\n}\n\n/**\n * Internal wrapper for TanStack's useQuery that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalQuery(options)`.\n */\nexport function useInternalQuery<TData = unknown, TError = Error, TSelectedData = TData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryResult<TSelectedData, TError> {\n const qc = useInternalQueryClient();\n return rqUseQuery<TData, TError, TSelectedData>(applyPersistedDefaults(options), qc);\n}\n\n/**\n * Internal wrapper for TanStack's useMutation that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalMutation(options)`.\n */\nexport function useInternalMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(\n options: UseMutationOptions<TData, TError, TVariables, TContext>\n): UseMutationResult<TData, TError, TVariables, TContext> {\n const qc = useInternalQueryClient();\n return rqUseMutation<TData, TError, TVariables, TContext>(options, qc);\n}\n\n/**\n * Internal wrapper for TanStack's useQueries that always uses the module's QueryClient.\n * Typing mirrors `rqUseQueries` so all generics and inference are preserved.\n */\nexport const useInternalQueries: typeof rqUseQueries = (options, _ignoredQueryClient) => {\n const qc = useInternalQueryClient();\n if (options && typeof options === 'object' && 'queries' in options) {\n const typedOptions = options as { queries: Array<UseQueryOptions<any, any, any>> };\n return rqUseQueries(\n {\n ...(options as any),\n queries: typedOptions.queries.map((q) => applyPersistedDefaults(q)),\n } as any,\n qc\n );\n }\n return rqUseQueries(options as any, qc);\n};\n","import { type QueryKey } from '@tanstack/react-query';\nimport { persistQueryClientRestore, persistQueryClientSubscribe } from '@tanstack/react-query-persist-client';\nimport { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister';\nimport { useEffect } from 'react';\nimport type { useInternalQueryClient } from './QueryProvider';\n\nexport function isPersistedQuery(options: { meta?: unknown; queryKey?: QueryKey }): boolean {\n const meta = options.meta as { persist?: boolean } | undefined;\n return meta?.persist === true;\n}\nconst persistenceConfig = {\n storage: 'localStorage' satisfies 'sessionStorage' | 'localStorage',\n key: 'cofhe:react-query',\n maxAgeMs: 86_400_000,\n};\n\nconst BIGINT_SENTINEL_KEY = '__cofhe_bigint__';\n\nfunction serializeWithBigInt(value: any): string {\n return JSON.stringify(value, (_key, v) => {\n if (typeof v === 'bigint') return { [BIGINT_SENTINEL_KEY]: v.toString() };\n return v;\n });\n}\n\nfunction deserializeWithBigInt(serialized: string): any {\n return JSON.parse(serialized, (_key, v) => {\n if (\n v &&\n typeof v === 'object' &&\n BIGINT_SENTINEL_KEY in (v as Record<string, unknown>) &&\n typeof (v as Record<string, unknown>)[BIGINT_SENTINEL_KEY] === 'string'\n ) {\n return BigInt((v as Record<string, unknown>)[BIGINT_SENTINEL_KEY] as string);\n }\n return v;\n });\n}\n\nconst storage = persistenceConfig.storage === 'localStorage' ? window.localStorage : window.sessionStorage;\nconst persister = createAsyncStoragePersister({\n storage,\n key: persistenceConfig.key ?? 'cofhe:react-query',\n serialize: serializeWithBigInt,\n deserialize: deserializeWithBigInt,\n});\n\nexport function usePersistentQueriesSubscription({\n queryClient,\n overridingQueryClient,\n}: {\n queryClient: ReturnType<typeof useInternalQueryClient>;\n overridingQueryClient?: ReturnType<typeof useInternalQueryClient>;\n}) {\n // IMPORTANT:\n // Do NOT use <PersistQueryClientProvider>.\n // It wraps children with TanStack's <QueryClientProvider>, which overrides any external provider\n // the consuming dapp (e.g. Wagmi) sets up. Instead, persist/restore imperatively against *our* client.\n useEffect(() => {\n // If the consumer explicitly provides a QueryClient do not attach persistence to it.\n if (overridingQueryClient) return;\n\n let unsubscribe: (() => void) | undefined;\n let cancelled = false;\n\n const options = {\n queryClient: queryClient as any,\n persister,\n maxAge: persistenceConfig.maxAgeMs ?? 86_400_000,\n buster: 'cofhe-react-query-v1',\n dehydrateOptions: {\n // Persist only queries that opt-in via meta.persist.\n // Backwards-compat: also persist decrypt results by queryKey prefix.\n shouldDehydrateQuery: (query: unknown) => isPersistedQuery(query as any),\n },\n };\n\n persistQueryClientRestore(options)\n .catch(() => {\n // Ignore restore errors (e.g. corrupt storage); we'll simply start fresh.\n })\n .finally(() => {\n if (cancelled) return;\n unsubscribe = persistQueryClientSubscribe(options);\n });\n\n return () => {\n cancelled = true;\n unsubscribe?.();\n };\n }, [overridingQueryClient, queryClient]);\n}\n","import type { PublicClient, WalletClient } from 'viem';\nimport type { UseMutationOptions } from '@tanstack/react-query';\nimport { useCofheClient } from './useCofheClient';\nimport { useInternalMutation } from '@/providers/internalQueryHooks';\n\ntype ConnectVars = { publicClient: PublicClient; walletClient: WalletClient };\n\ntype ConnectMutationOptions = Omit<UseMutationOptions<void, Error, ConnectVars, unknown>, 'mutationKey' | 'mutationFn'>;\n\nexport const useCofheConnect = (options?: ConnectMutationOptions) => {\n const client = useCofheClient();\n return useInternalMutation<void, Error, ConnectVars>({\n // spread user-provided options first; enforce critical keys afterwards\n ...options,\n mutationKey: ['cofhe', 'connect'],\n mutationFn: async ({ publicClient, walletClient }) => {\n await client.connect(publicClient, walletClient);\n },\n });\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * A reusable hook to schedule a timeout that can be rescheduled and safely cleaned up.\n * Useful for auto-clearing messages, debounced effects, or any delayed callback.\n */\nexport function useReschedulableTimeout(callback: () => void, defaultTimeout: number) {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const schedule = (timeout?: number) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n callback();\n }, timeout ?? defaultTimeout);\n };\n\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n return { schedule, cancel };\n}\n","import type { Address } from 'viem';\nimport { ETH_ADDRESS_LOWERCASE } from '@/types/token';\n\nexport const DEFAULT_COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3' as const;\n\n// CoinGecko \"platform\" ids used by /simple/token_price/{platform}\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 10: 'optimistic-ethereum',\n 56: 'binance-smart-chain',\n 100: 'xdai',\n 137: 'polygon-pos',\n 250: 'fantom',\n 42161: 'arbitrum-one',\n 43114: 'avalanche',\n 8453: 'base',\n} as const;\n\n// CoinGecko \"coin\" ids used by /simple/price?ids=...\n// Note: Many EVM chains share native ETH pricing (L2s etc.), but we keep a minimal mapping.\nexport const COINGECKO_NATIVE_COIN_ID_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 10: 'ethereum',\n 42161: 'ethereum',\n 8453: 'ethereum',\n 100: 'xdai',\n 137: 'matic-network',\n 56: 'binancecoin',\n 43114: 'avalanche-2',\n 250: 'fantom',\n} as const;\n\nexport function normalizeCoingeckoContractAddress(address: Address): string {\n return address.toLowerCase();\n}\n\nexport function getCoingeckoPlatformId(chainId: number | undefined): string | undefined {\n if (!chainId) return undefined;\n return COINGECKO_PLATFORM_BY_CHAIN_ID[chainId];\n}\n\nexport function getCoingeckoNativeCoinId(chainId: number | undefined): string | undefined {\n if (!chainId) return undefined;\n return COINGECKO_NATIVE_COIN_ID_BY_CHAIN_ID[chainId];\n}\n\nexport function buildCoingeckoSimpleTokenPriceUrl({\n apiBaseUrl = DEFAULT_COINGECKO_API_BASE_URL,\n platformId,\n contractAddress,\n}: {\n apiBaseUrl?: string;\n platformId: string;\n contractAddress: Address;\n}): string {\n const contract = normalizeCoingeckoContractAddress(contractAddress);\n const url = new URL(`${apiBaseUrl.replace(/\\/$/, '')}/simple/token_price/${platformId}`);\n url.searchParams.set('contract_addresses', contract);\n url.searchParams.set('vs_currencies', 'usd');\n return url.toString();\n}\n\nexport function buildCoingeckoSimplePriceUrl({\n apiBaseUrl = DEFAULT_COINGECKO_API_BASE_URL,\n coinId,\n}: {\n apiBaseUrl?: string;\n coinId: string;\n}): string {\n const url = new URL(`${apiBaseUrl.replace(/\\/$/, '')}/simple/price`);\n url.searchParams.set('ids', coinId);\n url.searchParams.set('vs_currencies', 'usd');\n return url.toString();\n}\n\nexport function parseCoingeckoSimpleTokenPriceUsd({\n responseJson,\n contractAddress,\n}: {\n responseJson: unknown;\n contractAddress: Address;\n}): number | null {\n const key = normalizeCoingeckoContractAddress(contractAddress);\n const obj = responseJson as Record<string, any>;\n const usd = obj?.[key]?.usd;\n if (typeof usd !== 'number' || !Number.isFinite(usd)) return null;\n return usd;\n}\n\nexport function parseCoingeckoSimplePriceUsd({\n responseJson,\n coinId,\n}: {\n responseJson: unknown;\n coinId: string;\n}): number | null {\n const obj = responseJson as Record<string, any>;\n const usd = obj?.[coinId]?.usd;\n if (typeof usd !== 'number' || !Number.isFinite(usd)) return null;\n return usd;\n}\n\nexport function isNativeTokenAddress(address: Address | undefined): boolean {\n if (!address) return false;\n return address.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n}\n\nexport const TMP_WBTC_ON_MAINNET = {\n chainId: 1,\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n} as const;\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { Address } from 'viem';\n\nimport { useInternalQuery } from '@/providers';\nimport {\n buildCoingeckoSimplePriceUrl,\n buildCoingeckoSimpleTokenPriceUrl,\n DEFAULT_COINGECKO_API_BASE_URL,\n getCoingeckoNativeCoinId,\n getCoingeckoPlatformId,\n isNativeTokenAddress,\n parseCoingeckoSimplePriceUsd,\n parseCoingeckoSimpleTokenPriceUsd,\n} from '@/utils/coingecko';\n\nexport type UseCoingeckoUsdPriceInput = {\n chainId?: number;\n tokenAddress?: Address;\n /** Defaults to true. */\n enabled?: boolean;\n /** Defaults to https://api.coingecko.com/api/v3 */\n apiBaseUrl?: string;\n /** Optional override when chainId isn't in our mapping. */\n platformIdOverride?: string;\n /** Optional override for native token lookup (ETH_ADDRESS). */\n nativeCoinIdOverride?: string;\n};\n\nexport type UseCoingeckoUsdPriceOptions = Omit<\n UseQueryOptions<number | null, Error, number | null>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Fetches a token's USD price from CoinGecko.\n * - ERC20: uses /simple/token_price/{platform}\n * - Native token (ETH_ADDRESS): uses /simple/price?ids={coinId}\n *\n * Returns `null` when CoinGecko has no price for the token.\n */\nexport function useCoingeckoUsdPrice(\n {\n chainId,\n tokenAddress,\n enabled: enabledInput = true,\n apiBaseUrl,\n platformIdOverride,\n nativeCoinIdOverride,\n }: UseCoingeckoUsdPriceInput,\n queryOptions?: UseCoingeckoUsdPriceOptions\n): UseQueryResult<number | null, Error> {\n const platformId = platformIdOverride ?? getCoingeckoPlatformId(chainId);\n const nativeCoinId = nativeCoinIdOverride ?? getCoingeckoNativeCoinId(chainId);\n const effectiveApiBaseUrl = apiBaseUrl ?? DEFAULT_COINGECKO_API_BASE_URL;\n\n const baseEnabled = !!tokenAddress && (isNativeTokenAddress(tokenAddress) ? !!nativeCoinId : !!platformId);\n const enabled = baseEnabled && enabledInput;\n\n const queryKey = [\n 'coingecko-usd-price',\n { chainId, tokenAddress, apiBaseUrl: effectiveApiBaseUrl, platformId, nativeCoinId },\n ] as const;\n\n return useInternalQuery({\n queryKey,\n enabled,\n queryFn: async ({ signal }) => {\n if (!tokenAddress) throw new Error('tokenAddress is required');\n if (typeof fetch !== 'function') {\n throw new Error('Global fetch is not available in this environment');\n }\n\n if (isNativeTokenAddress(tokenAddress)) {\n if (!nativeCoinId) return null;\n const url = buildCoingeckoSimplePriceUrl({ apiBaseUrl: effectiveApiBaseUrl, coinId: nativeCoinId });\n const res = await fetch(url, { signal, headers: { accept: 'application/json' } });\n if (!res.ok) throw new Error(`CoinGecko request failed: ${res.status} ${res.statusText}`);\n const json = await res.json();\n return parseCoingeckoSimplePriceUsd({ responseJson: json, coinId: nativeCoinId });\n }\n\n if (!platformId) return null;\n const url = buildCoingeckoSimpleTokenPriceUrl({\n apiBaseUrl: effectiveApiBaseUrl,\n platformId,\n contractAddress: tokenAddress,\n });\n\n const res = await fetch(url, { signal, headers: { accept: 'application/json' } });\n if (!res.ok) throw new Error(`CoinGecko request failed: ${res.status} ${res.statusText}`);\n const json = await res.json();\n return parseCoingeckoSimpleTokenPriceUsd({ responseJson: json, contractAddress: tokenAddress });\n },\n // Reasonable defaults; consumer can override via queryOptions.\n staleTime: queryOptions?.staleTime ?? 60_000,\n refetchOnWindowFocus: queryOptions?.refetchOnWindowFocus ?? false,\n ...queryOptions,\n });\n}\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { Address } from 'viem';\n\nimport { useInternalQuery } from '@/providers';\nimport {\n DEFAULT_COINGECKO_API_BASE_URL,\n getCoingeckoPlatformId,\n normalizeCoingeckoContractAddress,\n} from '@/utils/coingecko';\n\nexport type CoingeckoMarketChartPoint = {\n /** Unix ms */\n ts: number;\n /** Price value (e.g. USD) */\n value: number;\n};\n\nexport type UseCoingeckoContractMarketChartRangeInput = {\n chainId?: number;\n contractAddress?: Address;\n /** Defaults to true. */\n enabled?: boolean;\n /** Defaults to https://api.coingecko.com/api/v3 */\n apiBaseUrl?: string;\n /** Optional override when chainId isn't in our mapping. */\n platformIdOverride?: string;\n /** Defaults to 'usd'. */\n vsCurrency?: string;\n /** Defaults to 24 hours. */\n rangeMs?: number;\n};\n\nexport type UseCoingeckoContractMarketChartRangeOptions = Omit<\n UseQueryOptions<CoingeckoMarketChartPoint[] | null, Error, CoingeckoMarketChartPoint[] | null>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Fetches contract market chart data from CoinGecko using:\n * /coins/{platformId}/contract/{contractAddress}/market_chart/range\n *\n * Returns `null` when CoinGecko has no data or request fails.\n */\nexport function useCoingeckoContractMarketChartRange(\n {\n chainId,\n contractAddress,\n enabled: enabledInput = true,\n apiBaseUrl,\n platformIdOverride,\n vsCurrency = 'usd',\n rangeMs = 24 * 3600_000,\n }: UseCoingeckoContractMarketChartRangeInput,\n queryOptions?: UseCoingeckoContractMarketChartRangeOptions\n): UseQueryResult<CoingeckoMarketChartPoint[] | null, Error> {\n const platformId = platformIdOverride ?? getCoingeckoPlatformId(chainId);\n const effectiveApiBaseUrl = apiBaseUrl ?? DEFAULT_COINGECKO_API_BASE_URL;\n\n const enabled = !!platformId && !!contractAddress && enabledInput;\n\n const queryKey = [\n 'coingecko-contract-market-chart-range',\n { chainId, contractAddress, apiBaseUrl: effectiveApiBaseUrl, platformId, vsCurrency, rangeMs },\n ] as const;\n\n return useInternalQuery({\n queryKey,\n enabled,\n queryFn: async ({ signal }) => {\n if (!platformId || !contractAddress) return null;\n if (typeof fetch !== 'function') {\n throw new Error('Global fetch is not available in this environment');\n }\n\n const now = Date.now();\n const from = Math.floor((now - rangeMs) / 1000);\n const to = Math.floor(now / 1000);\n\n const contract = normalizeCoingeckoContractAddress(contractAddress);\n const url = new URL(\n `${effectiveApiBaseUrl.replace(/\\/$/, '')}/coins/${platformId}/contract/${contract}/market_chart/range`\n );\n url.searchParams.set('vs_currency', vsCurrency);\n url.searchParams.set('from', String(from));\n url.searchParams.set('to', String(to));\n\n try {\n const res = await fetch(url.toString(), { signal, headers: { accept: 'application/json' } });\n if (!res.ok) return null;\n\n const json = (await res.json()) as { prices?: Array<[number, number]> };\n const prices = json.prices ?? [];\n if (prices.length < 2) return null;\n\n const points: CoingeckoMarketChartPoint[] = prices\n .map(([ts, value]) => ({ ts, value }))\n .filter((p) => Number.isFinite(p.ts) && Number.isFinite(p.value));\n\n return points.length >= 2 ? points : null;\n } catch {\n return null;\n }\n },\n staleTime: queryOptions?.staleTime ?? 60_000,\n refetchOnWindowFocus: queryOptions?.refetchOnWindowFocus ?? false,\n ...queryOptions,\n });\n}\n","import { useCofheActivePermit } from '@/hooks';\nimport { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\nimport { truncateHash } from '@/utils';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useEffect, useRef } from 'react';\nimport { FloatingButtonPage } from '../components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalPersisted } from '@/stores/portalPersisted';\nimport { useCofheIsConnected } from './useCofheConnection';\n\nexport const STATUS_ID_MISSING_PERMIT = 'missing-permit';\nexport const STATUS_ID_PERMIT_EXPIRED = 'permit-expired';\nexport const STATUS_ID_PERMIT_EXPIRING_SOON = 'permit-expiring-soon';\nexport const STATUS_ID_PERMIT_SHARED = 'permit-shared';\n\nexport const showMissingPermitStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_MISSING_PERMIT,\n variant: 'error',\n title: 'Missing permit',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\n\nexport const hideMissingPermitStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_MISSING_PERMIT);\n};\n\nexport const showPermitExpiredStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRED,\n variant: 'error',\n title: 'Permit expired',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiredStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRED);\n};\n\nexport const showPermitExpiringSoonStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRING_SOON,\n variant: 'warning',\n title: 'Permit expiring soon',\n description: `Expires at ${new Date(permit.expiration * 1000).toLocaleTimeString()}`,\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiringSoonStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n};\n\nexport const showPermitSharedStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_SHARED,\n variant: 'info',\n title: 'Imported permit active',\n description: `Viewing ${truncateHash(permit.issuer, 4, 4)}'s data`,\n });\n};\nexport const hidePermitSharedStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_SHARED);\n};\n\n/**\n * Watches the user's active permit and displays statuses if:\n * - Warning - permit will expire in less that 1 hour\n * - Error - permit has expired\n * - Info - using a shared permit\n */\nexport const useWatchPermitStatus = () => {\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const activePermit = useCofheActivePermit();\n const connected = useCofheIsConnected();\n\n useEffect(() => {\n const updateStatuses = (permit: Permit | undefined) => {\n const hasCreatedFirstPermit = usePortalPersisted.getState().hasCreatedFirstPermit;\n const missingPermitStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_MISSING_PERMIT);\n const expiredStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRED);\n const expiringSoonStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n const sharedStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_SHARED);\n\n if (permit == null) {\n if (hasCreatedFirstPermit && !missingPermitStatusShown && connected) {\n showMissingPermitStatus();\n }\n if (expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n if (expiringSoonStatusShown) {\n hidePermitExpiringSoonStatus();\n }\n if (sharedStatusShown) {\n hidePermitSharedStatus();\n }\n return;\n }\n\n if (permit != null && missingPermitStatusShown) {\n hideMissingPermitStatus();\n }\n\n const timestamp = Math.floor(Date.now() / 1000);\n const expiration = permit.expiration;\n\n // Expired status\n const isExpired = expiration < timestamp;\n if (isExpired && !expiredStatusShown) {\n showPermitExpiredStatus();\n }\n if (!isExpired && expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n\n // Expiring soon status\n const isExpiringSoon = expiration - timestamp < 1 * 60 * 60;\n if (!isExpired && isExpiringSoon && !expiringSoonStatusShown) {\n showPermitExpiringSoonStatus(permit);\n }\n if ((!isExpiringSoon && expiringSoonStatusShown) || isExpired) {\n hidePermitExpiringSoonStatus();\n }\n\n // Shared status\n const isShared = permit.type === 'recipient';\n if (isShared && !sharedStatusShown) {\n showPermitSharedStatus(permit);\n }\n if (!isShared && sharedStatusShown) {\n hidePermitSharedStatus();\n }\n };\n\n updateStatuses(activePermit?.permit);\n intervalRef.current = setInterval(() => {\n updateStatuses(activePermit?.permit);\n }, 2000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [activePermit, connected]);\n};\n","import { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\n\nimport { useEffect } from 'react';\n\nimport { useCofheClaimableTokens } from './useCofheClaimableTokens';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\n\nexport const CLAIMS_AVAILABLE_STATUS_ID = 'claims-available';\ntype Input = {\n onClick: () => void;\n};\nexport const showClaimsAvailableStatus = ({ onClick }: Input) => {\n usePortalStatuses.getState().addStatus({\n id: CLAIMS_AVAILABLE_STATUS_ID,\n variant: 'info',\n title: '', // TODO: no title per design\n description: `You have unclaimed encrypted tokens`,\n action: {\n label: 'VIEW',\n onClick,\n },\n });\n};\nexport const hideClaimsAvailableStatus = () => {\n usePortalStatuses.getState().removeStatus(CLAIMS_AVAILABLE_STATUS_ID);\n};\n\nexport const useWatchClaimablesStatus = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n\n useEffect(() => {\n const claimsAvailableStatusShown = usePortalStatuses.getState().hasStatus(CLAIMS_AVAILABLE_STATUS_ID);\n if (totalTokensClaimable > 0 && !claimsAvailableStatusShown) {\n showClaimsAvailableStatus({\n onClick: () => {\n openPortal();\n navigateTo(FloatingButtonPage.ClaimableTokens);\n },\n });\n }\n\n if (totalTokensClaimable === 0 && claimsAvailableStatusShown) {\n hideClaimsAvailableStatus();\n }\n }, [navigateTo, openPortal, totalTokensClaimable]);\n};\n","import { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { useCofheTokensClaimable } from './useCofheTokensClaimable';\n\nexport function useCofheClaimableTokens() {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const result = useCofheTokensClaimable({\n accountAddress: account,\n tokens: allTokens,\n });\n\n return result;\n}\n","import { cn } from '@/utils';\nimport fhenixIconBlack from '@/assets/fhenix-icon-black.png';\nimport fhenixIconWhite from '@/assets/fhenix-icon-white.png';\n\nexport const FhenixLogoIcon: React.FC<{ theme: 'dark' | 'light'; className?: string }> = ({ theme, className }) => {\n return (\n <img\n className={cn('w-10 h-10', className)}\n src={theme === 'dark' ? fhenixIconWhite : fhenixIconBlack}\n alt=\"Fhenix Logo Icon\"\n />\n );\n};\n","import { type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\n\nexport const StatusBarSection: React.FC<{ children?: ReactNode }> = ({ children }) => {\n const { isLeftSide } = useFnxFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { statusPanelOpen } = usePortalUI();\n\n return (\n <AnimatePresence>\n {(statusPanelOpen || statuses.length > 0) && (\n <motion.div\n className=\"relative flex flex-1 h-12 items-center justify-between\"\n initial={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineSettings } from 'react-icons/md';\nimport { IoIosCheckmarkCircleOutline, IoIosCloseCircleOutline, IoIosTime } from 'react-icons/io';\nimport { useMemo } from 'react';\nimport { cn } from '@/utils';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { FloatingButtonPage } from './pagesConfig/types';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport type { FnxStatus, FnxStatusVariant } from './types';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { usePortalNavigation, usePortalStatuses } from '@/stores';\nimport { useCofheConnection } from '@/hooks';\nimport { CLAIMS_AVAILABLE_STATUS_ID } from '@/hooks/useWatchClaimablesStatus';\nimport {\n STATUS_ID_MISSING_PERMIT,\n STATUS_ID_PERMIT_EXPIRED,\n STATUS_ID_PERMIT_EXPIRING_SOON,\n STATUS_ID_PERMIT_SHARED,\n} from '@/hooks/useWatchPermitStatus';\n\nconst ConnectionStatus: React.FC = () => {\n const { theme } = useFnxFloatingButtonContext();\n const { navigateTo } = usePortalNavigation();\n const { connected } = useCofheConnection();\n\n return (\n <div className=\"fnx-panel w-full h-full flex px-4 items-center justify-between\">\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status */}\n <div className=\"flex items-center gap-1 ml-auto mr-2\">\n {connected ? (\n <>\n <IoIosCheckmarkCircleOutline className=\"text-green-500\" />\n <span className=\"font-medium\" aria-live=\"polite\">\n Connected\n </span>\n </>\n ) : (\n <>\n <IoIosCloseCircleOutline className=\"text-red-500\" />\n <span className=\"font-medium\" aria-live=\"polite\">\n Disconnected\n </span>\n </>\n )}\n </div>\n\n {/* Settings Icon */}\n <button\n onClick={() => navigateTo(FloatingButtonPage.Settings)}\n className={cn('p-1 rounded fnx-hover-overlay transition-colors', 'fnx-text-primary')}\n >\n <MdOutlineSettings className=\"w-4 h-4\" />\n </button>\n </div>\n );\n};\n\nconst statusTextColorMap: Record<FnxStatusVariant, string> = {\n error: 'text-red-500',\n warning: 'text-yellow-500',\n info: 'text-blue-500',\n};\n\nconst statusBorderColorMap: Record<FnxStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nconst ActiveStatusContent: React.FC<{ status: FnxStatus }> = ({ status }) => {\n const { theme } = useFnxFloatingButtonContext();\n\n return (\n <div\n className={cn(\n 'fnx-panel w-full h-full flex px-4 items-center justify-between',\n statusBorderColorMap[status.variant]\n )}\n >\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status Info */}\n <div className=\"flex flex-col ml-2 mr-auto\">\n <h3 className={cn('text-sm font-medium', statusTextColorMap[status.variant])}>{status.title}</h3>\n {status.description != null && (\n <p className={cn('text-xs', statusTextColorMap[status.variant])}>{status.description}</p>\n )}\n </div>\n\n {/* Action Button */}\n {status.action != null && (\n <button\n onClick={status.action?.onClick}\n className={cn('p-1 rounded fnx-hover-overlay transition-colors', 'fnx-text-primary')}\n >\n {status.action.label}\n </button>\n )}\n </div>\n );\n};\n\nconst STATUSES_ORDER = new Map<string, number>(\n [\n // first always goes \"claims available\" as claiming doesn't require a permit\n CLAIMS_AVAILABLE_STATUS_ID,\n\n // next goes all permit related statuses\n STATUS_ID_MISSING_PERMIT,\n STATUS_ID_PERMIT_EXPIRED,\n STATUS_ID_PERMIT_EXPIRING_SOON,\n STATUS_ID_PERMIT_SHARED,\n\n // next everything else can be sorted by time or just left in the order they were added\n ]\n .reverse()\n .map((id, index) => [id, index])\n);\n\nfunction sortStatuses(a: FnxStatus, b: FnxStatus): number {\n const aIndex = STATUSES_ORDER.get(a.id) ?? -1;\n const bIndex = STATUSES_ORDER.get(b.id) ?? -1;\n\n if (aIndex === -1 && bIndex === -1) {\n // If both statuses are not in the predefined order, keep their original order\n return 0;\n }\n if (aIndex === -1) {\n // If only a is not in the predefined order, b should come first\n return 1;\n }\n if (bIndex === -1) {\n // If only b is not in the predefined order, a should come first\n return -1;\n }\n // If both statuses are in the predefined order, sort by their index\n return aIndex - bIndex;\n}\n\nexport const StatusBarContent: React.FC = () => {\n const { statuses } = usePortalStatuses();\n\n const sortedStatuses = useMemo(() => statuses.sort(sortStatuses), [statuses]);\n\n return (\n <AnimatedZStack>\n {/* Connection status showing connection state and chain */}\n <ConnectionStatus />\n\n {/* Active errors or warnings to be resolved */}\n {sortedStatuses.map((status) => (\n <ActiveStatusContent key={status.id} status={status} />\n ))}\n </AnimatedZStack>\n );\n};\n","// eslint-disable-next-line no-redeclare\nimport React from 'react';\nimport { cn } from '@/utils';\nimport type { ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\n\ntype AnimatedZStackItemProps = {\n children?: ReactNode;\n stackOffset: number;\n stackScale: number;\n index: number;\n length: number;\n className?: string;\n};\n\nconst AnimatedZStackItem: React.FC<AnimatedZStackItemProps> = ({\n children,\n stackOffset,\n stackScale,\n index,\n length,\n className,\n}) => {\n // Primary item is always index 0, and does not translate on entry/exit\n // Additional items animate in from the bottom and out to the bottom\n // All items animate opacity\n const isPrimaryItem = index === 0;\n const entryStyle = isPrimaryItem\n ? {\n opacity: 0,\n }\n : {\n opacity: 0,\n top: stackOffset,\n scale: 1 + stackScale,\n };\n\n // invIndex is the depth of the card in the stack\n // As the length of the stack increases, the depth of the card decreases\n // Deeper items scale down and move up\n const invIndex = length - index - 1;\n const animStyle = {\n opacity: 1,\n top: invIndex * -stackOffset,\n scale: 1 - invIndex * stackScale,\n zIndex: index,\n };\n\n return (\n <motion.div\n className={cn('w-full h-full absolute origin-top', invIndex === 0 && 'events-none', className)}\n initial={entryStyle}\n exit={entryStyle}\n animate={animStyle}\n >\n {children}\n </motion.div>\n );\n};\n\ntype AnimatedZStackProps = {\n children?: ReactNode;\n stackOffset?: number;\n stackScale?: number;\n itemClassName?: string;\n};\n\nexport const AnimatedZStack: React.FC<AnimatedZStackProps> = ({\n children,\n stackOffset = 8,\n stackScale = 0.05,\n itemClassName,\n}) => {\n const filteredChildren = React.Children.toArray(children).filter(Boolean);\n\n return (\n <AnimatePresence>\n {filteredChildren.map((child, index) => (\n <AnimatedZStackItem\n key={index}\n stackOffset={stackOffset}\n stackScale={stackScale}\n index={index}\n length={filteredChildren.length}\n className={itemClassName}\n >\n {child}\n </AnimatedZStackItem>\n ))}\n </AnimatePresence>\n );\n};\n","import { useEffect, useMemo, useRef, type ReactNode } from 'react';\n\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { pages } from './pagesConfig/const';\nimport { type PageState } from './pagesConfig/types';\nimport { type PortalModalState } from './modals/types';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { modals } from './modals';\nimport { usePortalUI, usePortalCurrentPage, usePortalUIMaxContentHeight, usePortalModals } from '@/stores';\nimport { cn } from '@/utils';\n\ninterface ContentSectionProps {\n overriddingPage?: PageState;\n}\n\nconst MeasuredContentRenderer: React.FC<{\n children?: ReactNode;\n id: string;\n isModal?: boolean;\n onModalOverlayClick?: () => void;\n}> = ({ children, id, isModal, onModalOverlayClick }) => {\n const { setContentHeight, removeContentHeight } = usePortalUI();\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!contentRef.current) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.borderBoxSize?.[0]?.blockSize ?? entry.target.getBoundingClientRect().height;\n setContentHeight(id, height);\n }\n });\n\n observer.observe(contentRef.current);\n return () => {\n observer.disconnect();\n removeContentHeight(id);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return (\n <>\n {isModal && (\n <div\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onModalOverlayClick?.();\n }}\n className=\"absolute flex w-full h-full bg-[#0E2F3F]/30 origin-top translate-y-[-8px] scale-[0.95]\"\n />\n )}\n <div className=\"relative flex w-full h-full overflow-y-hidden pointer-events-none\">\n <div className={cn('fnx-panel absolute flex left-0 w-full p-4 top-0 pointer-events-auto')} ref={contentRef}>\n {children}\n </div>\n </div>\n </>\n );\n};\n\nconst ContentRenderer: React.FC<{ page: PageState }> = ({ page }) => {\n const content = useMemo(() => {\n const PageComp = pages[page.page];\n const props = page.props ?? {};\n return <PageComp {...props} />;\n }, [page]);\n\n return <MeasuredContentRenderer id=\"content\">{content}</MeasuredContentRenderer>;\n};\n\nconst ModalRenderer: React.FC<{ modal: PortalModalState }> = ({ modal }) => {\n const content = useMemo(() => {\n const ModalComp = modals[modal.modal] as React.FC<typeof modal>;\n return <ModalComp {...modal} />;\n }, [modal]);\n\n return (\n <MeasuredContentRenderer id={`${modal.modal}-modal`} isModal onModalOverlayClick={modal.onClose}>\n {content}\n </MeasuredContentRenderer>\n );\n};\n\nexport const ContentSection: React.FC<ContentSectionProps> = ({ overriddingPage }) => {\n const { isTopSide } = useFnxFloatingButtonContext();\n const { contentPanelOpen } = usePortalUI();\n const { modalStack } = usePortalModals();\n const maxContentHeight = usePortalUIMaxContentHeight();\n const currentPage = usePortalCurrentPage();\n const pageOrOverridingPage = overriddingPage ?? currentPage;\n\n return (\n <AnimatePresence>\n {contentPanelOpen && (\n <motion.div\n className=\"relative flex w-full z-50\"\n initial={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n animate={{ opacity: 1, y: 0, height: `${maxContentHeight}px`, maxHeight: `${maxContentHeight}px` }}\n exit={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n >\n <AnimatedZStack>\n <ContentRenderer page={pageOrOverridingPage} />\n {modalStack.map((modal) => {\n return <ModalRenderer key={modal.modal} modal={modal} />;\n })}\n </AnimatedZStack>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineAccountBalanceWallet } from 'react-icons/md';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { AddressButton } from '../../components/AddressButton';\nimport { ConnectedChainIndicator } from '../../components/ConnectedChainIndicator';\n\nexport const WalletHeader: React.FC = () => {\n const walletAddress = useCofheAccount();\n\n return (\n <div className=\"flex items-center justify-between\">\n {/* Left: Wallet Address */}\n <AddressButton address={walletAddress} icon={<MdOutlineAccountBalanceWallet className=\"w-4 h-4\" />} />\n\n {/* Right: Network Selector + Settings */}\n <div className=\"flex items-center gap-2\">\n <ConnectedChainIndicator />\n </div>\n </div>\n );\n};\n","import { useState } from 'react';\nimport { MdContentCopy, MdCheck } from 'react-icons/md';\nimport { cn } from '../../../utils/cn.js';\nimport { truncateAddress } from '../../../utils/utils.js';\n\ninterface AddressButtonProps {\n address: string | null | undefined;\n className?: string;\n icon?: React.ReactNode;\n showCopyIcon?: boolean;\n}\n\nexport const AddressButton: React.FC<AddressButtonProps> = ({ address, className, icon, showCopyIcon = true }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopyAddress = async () => {\n if (!address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy address:', err);\n }\n };\n\n const truncatedAddress = truncateAddress(address) || 'Not connected';\n\n return (\n <button\n onClick={handleCopyAddress}\n disabled={!address}\n className={cn(\n 'flex items-center gap-2 px-2 py-1 rounded fnx-hover-overlay transition-colors',\n 'fnx-text-primary text-sm',\n className\n )}\n >\n {icon}\n <span className=\"font-mono\">{truncatedAddress}</span>\n {showCopyIcon && address && (copied ? <MdCheck className=\"w-3 h-3\" /> : <MdContentCopy className=\"w-3 h-3\" />)}\n {copied && !showCopyIcon && <span className=\"text-xs opacity-70\">Copied!</span>}\n </button>\n );\n};\n","import { getChainById } from '@cofhe/sdk/chains';\nimport { ChainIcon } from './ChainIcon';\nimport { cn } from '@/utils/cn';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\n\nexport const ConnectedChainIndicator: React.FC = () => {\n const chainId = useCofheChainId();\n\n // Get network name from SDK chains\n const chain = chainId ? getChainById(chainId) : undefined;\n const currentNetwork = chain?.name || 'Eth';\n\n return (\n <div\n className={cn(\n 'flex items-center gap-1 px-2 py-1 rounded fnx-hover-overlay transition-colors',\n 'fnx-text-primary text-sm outline-none border fnx-dropdown-border',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n <ChainIcon chainId={chainId} />\n <span className=\"font-medium\">{currentNetwork}</span>\n </div>\n );\n};\n","import type { SVGProps } from \"react\";\nconst Svg11155111 = (props: SVGProps<SVGSVGElement>) => <svg id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlnsXlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 1920 1920\" enableBackground=\"new 0 0 1920 1920\" xmlSpace=\"preserve\" {...props}><g><polygon fill=\"#8A92B2\" points=\"959.8,80.7 420.1,976.3 959.8,731 \" /><polygon fill=\"#62688F\" points=\"959.8,731 420.1,976.3 959.8,1295.4 \" /><polygon fill=\"#62688F\" points=\"1499.6,976.3 959.8,80.7 959.8,731 \" /><polygon fill=\"#454A75\" points=\"959.8,1295.4 1499.6,976.3 959.8,731 \" /><polygon fill=\"#8A92B2\" points=\"420.1,1078.7 959.8,1839.3 959.8,1397.6 \" /><polygon fill=\"#62688F\" points=\"959.8,1397.6 959.8,1839.3 1499.9,1078.7 \" /></g></svg>;\nexport default Svg11155111;","import type { SVGProps } from \"react\";\nconst Svg84532 = (props: SVGProps<SVGSVGElement>) => <svg width={256} height={256} viewBox=\"0 0 256 256\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M256 128C256 198.692 198.592 256 127.777 256C60.5909 256 5.47394 204.417 0 138.759H169.482V117.24H0C5.47394 51.583 60.5909 0 127.777 0C198.592 0 256 57.3074 256 128Z\" fill=\"#0052FF\" /></svg>;\nexport default Svg84532;","import { cn } from '@/utils';\n\n// The icons probably needs to be part of the SDK chains package\n// Import chain icons\nimport sepolia from '@/assets/chains/11155111.svg';\nimport baseSepolia from '@/assets/chains/84532.svg';\n\nconst chainIcons: Record<number, React.FC<React.SVGProps<SVGSVGElement>>> = {\n 11155111: sepolia,\n 84532: baseSepolia,\n};\n\ninterface ChainIconProps {\n chainId: number | undefined;\n className?: string;\n}\n\nexport const ChainIcon: React.FC<ChainIconProps> = ({ chainId, className }) => {\n const Icon = chainId ? chainIcons[chainId] : undefined;\n\n if (Icon) {\n return <Icon className={cn('w-4 h-4 flex-shrink-0', className)} />;\n }\n\n // Fallback icon\n return (\n <div className={cn('w-4 h-4 rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0', className)}>\n <span className=\"text-[8px]\">⟠</span>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { TokenIcon } from '../../components/TokenIcon';\nimport { CofheTokenConfidentialBalance } from '../../components/CofheTokenConfidentialBalance';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { DEFAULT_TOKEN_BY_CHAIN_ID } from '@/types/token';\n\nexport const AssetCard: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n\n const pinnedToken = useCofhePinnedToken();\n const chainId = useCofheChainId();\n const fallbackToken = chainId ? DEFAULT_TOKEN_BY_CHAIN_ID[chainId] : undefined;\n const token = pinnedToken ?? fallbackToken;\n\n const handleClick = () => {\n if (token) {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: { token },\n });\n } else {\n throw new Error('No token found for AssetCard. No pinned token and no fallback token for current chain.');\n }\n };\n\n return (\n <div\n onClick={handleClick}\n className={cn('fnx-card-bg p-4 cursor-pointer', 'hover:opacity-90 transition-opacity', 'border fnx-card-border')}\n >\n <div className=\"flex items-center justify-between\">\n {/* Left Side: Icon, Ticker, Privacy Metrics */}\n <div className=\"flex items-center gap-3 flex-1\">\n {/* Asset Icon */}\n <TokenIcon logoURI={token?.logoURI} alt={token?.symbol} size=\"md\" />\n\n {/* Ticker and Privacy */}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-lg font-bold fnx-text-primary\">{token?.symbol}</h3>\n\n {/* Privacy Metrics Placeholder for future implementation */}\n {/* <div className=\"flex items-center gap-2 text-xs fnx-text-primary opacity-80\">\n <div className=\"flex items-center gap-1\">\n <VisibilityOffIcon className=\"w-3 h-3\" />\n <span>{asset.privacyHidden}%</span>\n </div>\n <span>|</span>\n <div className=\"flex items-center gap-1\">\n <VisibilityIcon className=\"w-3 h-3\" />\n <span>{asset.privacyVisible}%</span>\n </div>\n </div> */}\n </div>\n </div>\n\n {/* Right Side: Balance, Change, Arrow */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col items-end\">\n {/* // TODO: add suport for displaying native token balance if no pinned address */}\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"xl\"\n decimalPrecision={5}\n className=\"font-bold\"\n />\n {/* <div className=\"text-sm fnx-positive-change font-medium\">\n {asset.change}\n </div> */}\n </div>\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60\" />\n </div>\n </div>\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { cn } from '@/utils';\nimport defaultTokenIcon from '@/assets/default-token.webp';\n\ntype TokenIconSize = 'sm' | 'md' | 'lg' | 'xl';\n\ninterface TokenIconProps {\n /** Token logo URI */\n logoURI?: string | null;\n /** Alt text for the image */\n alt?: string;\n /** Size variant */\n size?: TokenIconSize;\n /** CSS class name for the container div (overrides size if provided) */\n className?: string;\n /** CSS class name for the image */\n imageClassName?: string;\n}\n\nconst sizeClasses: Record<TokenIconSize, string> = {\n sm: 'w-5 h-5',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n xl: 'w-16 h-16',\n};\n\nexport const TokenIcon: React.FC<TokenIconProps> = ({\n logoURI,\n alt = 'Token',\n size = 'sm',\n className,\n imageClassName = 'w-full h-full object-cover',\n}) => {\n const [iconError, setIconError] = useState(false);\n\n // Reset error when logoURI changes\n useEffect(() => {\n setIconError(false);\n }, [logoURI]);\n\n const containerClassName =\n className ||\n cn(sizeClasses[size], 'rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0 overflow-hidden');\n\n return (\n <div className={containerClassName}>\n <img\n src={iconError || !logoURI ? defaultTokenIcon : logoURI}\n alt={alt}\n className={imageClassName}\n onError={() => setIconError(true)}\n />\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\n\nexport interface LoadingDotsProps {\n /** Size variant for the dots */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Custom className for the container */\n className?: string;\n /** Color variant - defaults to primary text color */\n variant?: 'primary' | 'secondary';\n}\n\nconst sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n};\n\nexport const LoadingDots: React.FC<LoadingDotsProps> = ({ size = 'md', className, variant = 'primary' }) => {\n return (\n <span\n className={cn(\n 'fnx-loading-dots',\n sizeClasses[size],\n variant === 'primary' ? 'fnx-text-primary' : 'opacity-70',\n className\n )}\n >\n <span>•</span>\n <span>•</span>\n <span>•</span>\n </span>\n );\n};\n","import { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nimport { cn } from '@/utils';\nimport { LoadingDots } from './LoadingDots';\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-xl',\n xl: 'text-2xl',\n};\n\ntype TokenBalanceViewProps = {\n className?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n formattedBalance?: string;\n symbol?: string;\n isFetching?: boolean;\n hidden?: boolean;\n};\nexport const TokenBalanceView: React.FC<TokenBalanceViewProps> = ({\n className,\n size = 'md',\n formattedBalance,\n symbol,\n isFetching,\n hidden,\n}) => {\n return (\n <span className={cn(sizeClasses[size], 'font-medium fnx-text-primary', className)}>\n {hidden ? <ConfidentialValuePlaceholder /> : isFetching ? <LoadingDots size={size} /> : formattedBalance}\n {symbol && ` ${symbol}`}\n </span>\n );\n};\n\nconst ConfidentialValuePlaceholder: React.FC = () => {\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n return (\n <span\n className=\"cursor-pointer hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n navigateToGeneratePermit({\n cause: 'clicked_on_confidential_balance',\n });\n }}\n >\n {'* * *'}\n </span>\n );\n};\n","import type { Address } from 'viem';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { TokenBalanceView } from './TokenBalanceView';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\n\nexport enum BalanceType {\n Public = 'public',\n Confidential = 'confidential',\n}\n\ninterface TokenBalanceProps {\n /** Token object from token list (for non-native tokens) */\n token?: Token;\n /** Account address to fetch balance for */\n accountAddress?: Address;\n\n /** Number of decimal places to show (default: 5) */\n decimalPrecision?: number;\n /** Whether to show the token symbol */\n showSymbol?: boolean;\n\n /** Custom className for the balance text */\n className?: string;\n /** Size variant for the balance display */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nconst DEFAULT_DISPLAY_DECIMALS = 5;\n\nexport const CofheTokenConfidentialBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n // Determine which account address to use\n const effectiveAccountAddress = accountAddress ?? account;\n\n // Use unified hook for confidential balance fetching\n const {\n data: { formatted: confidentialBalanceFormatted } = {},\n isFetching: isFetchingConfidential,\n disabledDueToMissingPermit,\n } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: effectiveAccountAddress,\n displayDecimals: decimalPrecision,\n });\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n hidden={disabledDueToMissingPermit}\n isFetching={isFetchingConfidential}\n formattedBalance={confidentialBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n\nexport const CofheTokenPublicBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n const effectiveAccountAddress = accountAddress ?? account;\n\n const { data: { formatted: publicBalanceFormatted } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance(\n { token, accountAddress: effectiveAccountAddress, displayDecimals: decimalPrecision }\n );\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n isFetching={isFetchingPublic}\n formattedBalance={publicBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n","import { useCofheContext } from '@/providers';\nimport { useCofheChainId } from './useCofheConnection';\n\n/**\n * Hook to get pinned token address for the current chain\n * @returns Pinned token address for current chain, or undefined if none\n */\nexport function useCofhePinnedTokenAddress() {\n const widgetConfig = useCofheContext().client.config.react;\n const chainId = useCofheChainId();\n const pinnedTokenAddress = chainId ? widgetConfig.pinnedTokens?.[chainId?.toString()] : undefined;\n return pinnedTokenAddress;\n}\n","import { useCofhePinnedTokenAddress } from './useCofhePinnedTokenAddress';\nimport { useCofheToken } from './useCofheTokenLists';\n\nexport function useCofhePinnedToken({ enabled }: { enabled?: boolean } = {}) {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const token = useCofheToken(\n {\n address: pinnedTokenAddress,\n },\n {\n // only fetch metadata if pinned token address is defined\n enabled: enabled !== false && !!pinnedTokenAddress,\n }\n );\n return token;\n}\n","import { cn } from '@/utils/cn';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { IoMdKey } from 'react-icons/io';\nimport { AiOutlinePieChart } from 'react-icons/ai';\nimport { TbShieldPlus } from 'react-icons/tb';\nimport { FaBug } from 'react-icons/fa';\nimport type { ComponentType, ReactNode } from 'react';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { assert, type ElementOf } from 'ts-essentials';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\nimport { Button } from '../../components';\nimport { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { DEFAULT_TOKEN_BY_CHAIN_ID } from '@/types/token';\n\nconst iconClassName = 'w-4 h-4';\n\nconst ShieldIcon = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n\n const badgeText = totalTokensClaimable > 99 ? '99+' : totalTokensClaimable > 0 ? `+${totalTokensClaimable}` : null;\n\n return (\n <span className=\"relative inline-flex items-center justify-center w-6 h-6 shrink-0\">\n <TbShieldPlus className={iconClassName} />\n {badgeText && (\n <span\n className={cn(\n 'pointer-events-none',\n 'absolute top-0 right-0',\n 'translate-x-[35%] -translate-y-[35%]',\n 'min-w-[18px] h-[18px] px-1',\n 'rounded-full',\n 'flex items-center justify-center',\n 'text-[10px] leading-none font-semibold',\n 'bg-[#6EE7F5] text-[#003B4A]',\n 'outline outline-2 outline-[var(--fnx-button-bg)]',\n 'shadow-sm'\n )}\n >\n {badgeText}\n </span>\n )}\n </span>\n );\n};\n\ntype PagesInBottomMenu =\n | FloatingButtonPage.Send\n | FloatingButtonPage.Shield\n | FloatingButtonPage.Portfolio\n | FloatingButtonPage.Permits\n | FloatingButtonPage.Debug;\n\nconst baseNavItems: {\n id: PagesInBottomMenu;\n label: string;\n icon: ReactNode | ComponentType<{}>;\n}[] = [\n {\n id: FloatingButtonPage.Send,\n label: 'Send',\n icon: <GoArrowUpRight className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Shield,\n label: 'Shield',\n icon: ShieldIcon,\n },\n {\n id: FloatingButtonPage.Portfolio,\n label: 'Portfolio',\n icon: <AiOutlinePieChart className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Permits,\n label: 'Permits',\n icon: <IoMdKey className={iconClassName} />,\n },\n] as const;\n\nconst debugNavItem = {\n id: FloatingButtonPage.Debug,\n label: 'Debug',\n icon: <FaBug className={iconClassName} />,\n} as const;\n\n/**\n * Checks if we're in production by checking multiple environment variable sources\n * Supports: process.env (Node.js/webpack), import.meta.env (Vite), and other common patterns\n */\nconst isProduction = (): boolean => {\n // Check process.env (Node.js, webpack, etc.)\n // eslint-disable-next-line turbo/no-undeclared-env-vars, no-undef\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n return false;\n }\n\n // Check import.meta.env (Vite)\n if (typeof import.meta !== 'undefined') {\n // {\n // \"BASE_URL\": \"/\",\n // \"DEV\": true,\n // \"MODE\": \"development\",\n // \"PROD\": false,\n // \"SSR\": false\n // }\n const metaEnv = (import.meta as any).env;\n\n // ONLY if ALL flags indicate development AND prod flag doesn't indicate prod, treat as development\n if (metaEnv && metaEnv.MODE === 'development' && metaEnv.DEV === true && metaEnv.PROD === false) {\n return false;\n }\n }\n\n // Default to hiding debug in library context\n return true;\n};\n\nconst navItems = [...baseNavItems, ...(!isProduction() ? [debugNavItem] : [])] as const;\n\nexport const BottomNavigation: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n const pinnedToken = useCofhePinnedToken();\n const chainId = useCofheChainId();\n const fallbackToken = chainId ? DEFAULT_TOKEN_BY_CHAIN_ID[chainId] : undefined;\n const defaultToken = pinnedToken ?? fallbackToken;\n\n const handleNavClick = (page: ElementOf<typeof baseNavItems>['id']) => {\n openPortal();\n\n if (page === FloatingButtonPage.Portfolio) {\n navigateTo(FloatingButtonPage.Portfolio);\n return;\n }\n\n if (page === FloatingButtonPage.Send) {\n assert(defaultToken, 'No pinned token available for Send page');\n navigateTo(FloatingButtonPage.Send, { pageProps: { token: defaultToken } });\n return;\n }\n\n if (page === FloatingButtonPage.Shield) {\n assert(defaultToken, 'No pinned token available for Shield page');\n navigateTo(FloatingButtonPage.Shield, { pageProps: { token: defaultToken } });\n return;\n }\n\n navigateTo(page);\n };\n\n return (\n <div className=\"flex gap-2\">\n {navItems.map((item) => (\n <Button\n key={item.id}\n onClick={() => handleNavClick(item.id)}\n icon={typeof item.icon === 'function' ? <item.icon /> : item.icon}\n iconPosition=\"top\"\n label={item.label}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\nimport type { ReactNode } from 'react';\n\ninterface ActionButtonProps {\n onClick: () => void;\n disabled?: boolean;\n icon?: ReactNode;\n label: string;\n className?: string;\n variant?: 'default' | 'tab';\n pressed?: boolean;\n}\n\n/**\n * Reusable action button styled like the bottom navigation buttons with sharp edges.\n */\nexport const ActionButton: React.FC<ActionButtonProps> = ({\n onClick,\n disabled = false,\n icon,\n label,\n className,\n variant = 'default',\n pressed = false,\n}) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'w-full font-medium flex items-center justify-center gap-1',\n variant === 'tab' ? 'py-2 px-2 text-sm' : 'py-1.5 px-2 text-xs',\n 'fnx-nav-button',\n pressed && 'fnx-nav-button-active',\n 'transition-all',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n >\n {icon}\n <span>{label}</span>\n </button>\n );\n};\n","import { sanitizeNumericInput } from '../../../utils/utils.js';\n\ninterface AmountInputProps {\n value: string;\n onChange: (value: string) => void;\n onMaxClick: () => void;\n placeholder?: string;\n className?: string;\n}\n\n/**\n * Reusable amount input with max button for token operations.\n */\nexport const AmountInput: React.FC<AmountInputProps> = ({\n value,\n onChange,\n onMaxClick,\n placeholder = '0',\n className,\n}) => {\n return (\n <div className={`flex items-center gap-1 w-full ${className ?? ''}`}>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={value}\n onChange={(e) => onChange(sanitizeNumericInput(e.target.value))}\n placeholder={placeholder}\n className=\"flex-1 min-w-0 bg-transparent text-sm font-medium fnx-text-primary outline-none placeholder:opacity-50 text-center border-b fnx-card-border pb-1\"\n />\n <button onClick={onMaxClick} className=\"fnx-max-button text-xxxs font-medium px-1 py-0.5 rounded flex-shrink-0\">\n max\n </button>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport type { ReactNode } from 'react';\n\nexport type ButtonVariant = 'primary' | 'default' | 'error' | 'warning' | 'ghost' | 'outline';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Button variant style */\n variant?: ButtonVariant;\n /** Button size */\n size?: ButtonSize;\n /** Text content (alternative to children) */\n label?: string;\n /** Icon component to display */\n icon?: ReactNode;\n /** Icon position relative to text */\n iconPosition?: 'left' | 'right' | 'top';\n /** Override default className */\n className?: string;\n /** Button content (alternative to text prop) */\n children?: ReactNode;\n}\n\n/**\n * Reusable button component with support for light/dark mode, multiple variants, and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"default\" size=\"md\" text=\"Sign\" />\n * <Button variant=\"error\" size=\"sm\" text=\"Cancel\" icon={<Icon />} />\n * <Button variant=\"outline\" size=\"lg\">\n * Click me\n * </Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'default',\n size = 'md',\n label,\n icon,\n iconPosition = 'left',\n className,\n children,\n disabled,\n ...props\n}) => {\n // Determine content - prefer text prop over children\n const content = label ?? children;\n\n // Determine if layout should be vertical\n const isVertical = iconPosition === 'top';\n\n // Base classes\n const baseClasses = cn(\n 'inline-flex items-center justify-center',\n isVertical && 'flex-col',\n 'font-medium',\n 'border transition-all',\n 'focus:outline-none focus:ring-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors duration-200'\n );\n\n // Size classes - adjust gap for vertical layout\n const sizeClasses: Record<ButtonSize, string> = {\n sm: isVertical ? 'px-2 py-1 text-xs gap-1' : 'px-2 py-1 text-xs gap-1.5',\n md: isVertical ? 'px-3 py-1.5 text-xs gap-1' : 'px-3 py-1.5 text-xs gap-1.5',\n lg: isVertical ? 'px-4 py-2 text-sm gap-1.5' : 'px-4 py-2 text-sm gap-2',\n // xl: isVertical ? 'px-6 py-3 text-base gap-2' : 'px-6 py-3 text-base gap-2.5',\n };\n\n // Variant classes for light mode\n const variantClassesLight: Record<ButtonVariant, string> = {\n primary: cn('bg-[#80E6E6] hover:bg-[#6DD5D5]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#80E6E6]'),\n default: cn(\n 'bg-white hover:bg-[#6DD5D5]',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n error: cn('bg-[#FFB399] hover:bg-[#FF9F80]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFB399]'),\n warning: cn('bg-[#FFD699] hover:bg-[#FFC966]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFD699]'),\n ghost: cn('bg-transparent hover:bg-gray-100', 'text-[#003366]', 'border-transparent', 'focus:ring-gray-300'),\n outline: cn(\n 'bg-white hover:bg-gray-50',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n };\n\n // Variant classes for dark mode\n const variantClassesDark: Record<ButtonVariant, string> = {\n primary: cn(\n 'dark:bg-[#2E9D9D] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#2E9D9D]'\n ),\n default: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n error: cn(\n 'dark:bg-[#D9532E] dark:hover:bg-[#C0441F]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#D9532E]'\n ),\n warning: cn(\n 'dark:bg-[#E67E22] dark:hover:bg-[#D35400]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#E67E22]'\n ),\n ghost: cn(\n 'dark:bg-transparent dark:hover:bg-[#374151]',\n 'dark:text-white',\n 'dark:border-transparent',\n 'dark:focus:ring-gray-600'\n ),\n outline: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#4A4A4A]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n };\n\n // Combine all classes\n const buttonClasses = cn(\n baseClasses,\n sizeClasses[size],\n variantClassesLight[variant],\n variantClassesDark[variant],\n className\n );\n\n // Icon wrapper classes - flex container that doesn't constrain icon size\n const iconWrapperClasses = 'flex items-center justify-center flex-shrink-0';\n\n return (\n <button className={buttonClasses} disabled={disabled} {...props}>\n {icon && iconPosition === 'top' && <span className={iconWrapperClasses}>{icon}</span>}\n {icon && iconPosition === 'left' && <span className={iconWrapperClasses}>{icon}</span>}\n {content}\n {icon && iconPosition === 'right' && <span className={iconWrapperClasses}>{icon}</span>}\n </button>\n );\n};\n","import { useId, useMemo } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n type TooltipContentProps,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { cn } from '@/utils/cn';\n\nexport interface TokenPriceChartPoint {\n /** Unix ms */\n ts: number;\n /** Price in USD */\n value: number;\n}\n\nexport interface TokenPriceChartProps {\n points: TokenPriceChartPoint[];\n className?: string;\n height?: number;\n}\n\nconst formatTime = (ts: number): string =>\n new Date(ts).toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n\nconst formatUsd = (n: number): string =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n\nconst CustomTooltip = ({ active, payload, label }: TooltipContentProps<number, string>) => {\n if (!active || !payload?.length) return null;\n const v = payload[0]?.value;\n if (typeof v !== 'number') return null;\n\n return (\n <div className=\"rounded-md border fnx-card-border fnx-card-bg px-2 py-1 shadow-sm\">\n <div className=\"text-xxxs opacity-70\">{typeof label === 'number' ? formatTime(label) : ''}</div>\n <div className=\"text-xs font-semibold fnx-text-primary\">{formatUsd(v)}</div>\n </div>\n );\n};\n\nconst themeClasses = {\n /** Used by the chart line + area fill via `currentColor` */\n accent: 'text-teal-500 dark:text-teal-400',\n /** Recharts renders grid lines as SVG paths with this class */\n gridLines:\n '[&_.recharts-cartesian-grid_line]:stroke-slate-400/25 dark:[&_.recharts-cartesian-grid_line]:stroke-white/10',\n /** Recharts tooltip cursor is an SVG path with this class */\n tooltipCursor:\n '[&_.recharts-tooltip-cursor]:stroke-current [&_.recharts-tooltip-cursor]:stroke-opacity-35 dark:[&_.recharts-tooltip-cursor]:stroke-opacity-45',\n} as const;\n\nexport const TokenPriceChart: React.FC<TokenPriceChartProps> = ({ points, className, height = 150 }) => {\n const gradientId = useId();\n\n const { start, mid, end } = useMemo(() => {\n if (!points.length) {\n const now = Date.now();\n return { start: now - 24 * 3600_000, mid: now - 12 * 3600_000, end: now };\n }\n const start = points[0].ts;\n const end = points[points.length - 1].ts;\n const mid = start + (end - start) / 2;\n return { start, mid, end };\n }, [points]);\n\n return (\n <div\n className={cn(\n 'w-full',\n // Tailwind-driven theming for Recharts (SVG) using `currentColor` + nested selectors\n themeClasses.accent,\n themeClasses.gridLines,\n themeClasses.tooltipCursor,\n className\n )}\n >\n <div style={{ height }} className=\"w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={points} margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"currentColor\" stopOpacity={0.5} />\n <stop offset=\"100%\" stopColor=\"currentColor\" stopOpacity={0} />\n </linearGradient>\n </defs>\n\n <CartesianGrid vertical={false} strokeDasharray=\"3 3\" />\n\n <XAxis dataKey=\"ts\" type=\"number\" domain={['dataMin', 'dataMax']} hide />\n <YAxis dataKey=\"value\" domain={['dataMin', 'dataMax']} hide />\n <Tooltip content={CustomTooltip} />\n\n <Area\n type=\"monotone\"\n dataKey=\"value\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fillOpacity={1}\n fill={`url(#${gradientId})`}\n dot={false}\n activeDot={{ r: 4, stroke: 'currentColor', strokeWidth: 2, fill: '#ffffff' }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n\n <div className=\"flex items-center justify-between text-xxxs opacity-60 mt-1\">\n <span>{formatTime(start)}</span>\n <span>{formatTime(mid)}</span>\n <span>{formatTime(end)}</span>\n </div>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { type ReactNode } from 'react';\n\ninterface PageContainerProps {\n /** Whether the page is a modal */\n isModal?: boolean;\n /** Optional header component that will be fixed at the top */\n header?: ReactNode;\n /** Body content that will be scrollable if it overflows */\n content?: ReactNode;\n /** Optional footer component that will be pinned to the bottom */\n footer?: ReactNode;\n}\n\n/**\n * PageContainer provides a consistent layout structure for pages with:\n * - Optional header (fixed at top)\n * - Scrollable body content\n * - Optional footer (pinned at bottom)\n * - Max height of 500px, but shrinks to fit content when smaller\n */\nexport const PageContainer: React.FC<PageContainerProps> = ({ isModal, header, content, footer }) => {\n return (\n <div className={cn('flex flex-col max-h-[500px] w-full gap-4', isModal ? '' : 'h-full')}>\n {/* Header - fixed at top, doesn't scroll */}\n {header && <div className=\"flex-shrink-0\">{header}</div>}\n\n {/* Body - scrollable middle section that fills available space */}\n {content && <div className=\"flex-1 min-h-0 overflow-y-auto\">{content}</div>}\n\n {/* Footer - fixed at bottom, doesn't scroll */}\n {footer && <div className=\"flex-shrink-0\">{footer}</div>}\n </div>\n );\n};\n","import { formatUnits } from 'viem';\nimport { cn } from '../../../utils/cn.js';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { TbShieldPlus, TbShieldMinus, TbShieldCheck } from 'react-icons/tb';\nimport {\n type Transaction,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n} from '../../../stores/transactionStore.js';\nimport { formatRelativeTime } from '../../../utils/utils.js';\nimport { HashLink } from './HashLink.js';\n\ninterface TransactionItemProps {\n transaction: Transaction;\n}\n\nconst ActionIcon: React.FC<{ actionType: TransactionActionType }> = ({ actionType }) => {\n const iconClassName = 'w-5 h-5';\n\n switch (actionType) {\n case TransactionActionType.ShieldSend:\n return <GoArrowUpRight className={iconClassName} />;\n case TransactionActionType.Shield:\n return <TbShieldPlus className={iconClassName} />;\n case TransactionActionType.Unshield:\n return <TbShieldMinus className={iconClassName} />;\n case TransactionActionType.Claim:\n return <TbShieldCheck className={iconClassName} />;\n default:\n return <GoArrowUpRight className={iconClassName} />;\n }\n};\n\nexport const TransactionItem: React.FC<TransactionItemProps> = ({ transaction }) => {\n const statusColorClass =\n transaction.status === TransactionStatus.Pending\n ? 'text-yellow-600 dark:text-yellow-400'\n : transaction.status === TransactionStatus.Confirmed\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400';\n\n return (\n <div className=\"fnx-card-bg p-3 rounded-lg border fnx-dropdown-border\">\n <div className=\"flex items-start gap-3\">\n {/* Action Icon */}\n <div className=\"w-8 h-8 rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0 fnx-text-primary\">\n <ActionIcon actionType={transaction.actionType} />\n </div>\n\n {/* Transaction Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold fnx-text-primary\">{actionToString(transaction.actionType)}</span>\n <span className=\"text-sm font-semibold fnx-text-primary\">\n {formatUnits(transaction.tokenAmount, transaction.token.decimals)} {transaction.token.symbol}\n </span>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 mt-1\">\n <span className={cn('text-xs font-medium', statusColorClass)}>{statusToString(transaction.status)}</span>\n <span className=\"text-xs fnx-text-primary opacity-60\">{formatRelativeTime(transaction.timestamp)}</span>\n </div>\n\n <div className=\"mt-1\">\n <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} copyable />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { WalletHeader } from './MainPage/WalletHeader';\nimport { AssetCard } from './MainPage/AssetCard';\nimport { BottomNavigation } from './MainPage/BottomNavigation';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const MainPage: React.FC = () => (\n <PageContainer header={<WalletHeader />} content={<AssetCard />} footer={<BottomNavigation />} />\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useSettingsStore, ShieldPageVariant, SHIELD_PAGE_VARIANT_LABELS } from '../stores/settingsStore.js';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const SettingsPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { shieldPageVariant, setShieldPageVariant } = useSettingsStore();\n\n const variants = Object.values(ShieldPageVariant);\n\n return (\n <PageContainer\n header={\n <button onClick={navigateBack} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Settings</span>\n </button>\n }\n content={\n <div className=\"space-y-3\">\n <p className=\"text-sm font-medium\">A/B Testing</p>\n\n {/* Shield Page Variant */}\n <div className=\"space-y-2\">\n <p className=\"text-xs opacity-70\">Shield Page</p>\n <div className=\"space-y-1\">\n {variants.map((variant) => (\n <label key={variant} className=\"flex items-center gap-2 text-xs cursor-pointer\">\n <input\n type=\"radio\"\n name=\"shieldPageVariant\"\n checked={shieldPageVariant === variant}\n onChange={() => setShieldPageVariant(variant)}\n />\n <span>{SHIELD_PAGE_VARIANT_LABELS[variant]}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n }\n />\n );\n};\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\n// ============================================================================\n// Shield Page Variants (A/B Testing)\n// ============================================================================\n\nexport enum ShieldPageVariant {\n Option1 = 'option1',\n Option2 = 'option2',\n}\n\nexport const SHIELD_PAGE_VARIANT_LABELS: Record<ShieldPageVariant, string> = {\n [ShieldPageVariant.Option1]: 'Modern UI',\n [ShieldPageVariant.Option2]: 'Classic UI',\n};\n\n// ============================================================================\n// Settings Store\n// ============================================================================\n\ninterface SettingsState {\n /** Selected shield page variant for A/B testing */\n shieldPageVariant: ShieldPageVariant;\n\n /** Set the shield page variant */\n setShieldPageVariant: (variant: ShieldPageVariant) => void;\n}\n\nexport const useSettingsStore = create<SettingsState>()(\n persist(\n (set) => ({\n shieldPageVariant: ShieldPageVariant.Option1,\n\n setShieldPageVariant: (variant) => set({ shieldPageVariant: variant }),\n }),\n {\n name: 'cofhe-settings',\n }\n )\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { FaKey, FaDownload, FaPlus } from 'react-icons/fa';\nimport { type ElementType } from 'react';\nimport { Accordion, AccordionSection } from '../../../Accordion.js';\nimport { PermitItem } from '../components/PermitItem.js';\nimport { usePermitsList } from '@/hooks/permits/index.js';\nimport type { PermitActionId } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer.js';\nimport { useCofheActivePermit } from '@/hooks/useCofhePermits.js';\nimport type { Permit } from '@cofhe/sdk/permits';\nimport { Button } from '@/components/FnxFloatingButton/components/Button.js';\nimport { InfoModalButton } from '@/components/FnxFloatingButton/modals/InfoModalButton.js';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/FnxFloatingButton/modals/types.js';\nimport { PermitCard } from '@/components/FnxFloatingButton/components/PermitCard.js';\n\ntype PermitActionItem = { id: PermitActionId; label: string; icon: ElementType };\n\nconst permitActions: PermitActionItem[] = [\n { id: 'generate', label: 'Generate', icon: FaPlus },\n { id: 'delegate', label: 'Delegate', icon: FaKey },\n { id: 'import', label: 'Import', icon: FaDownload },\n];\n\ntype Args = {\n generatedPermitsCount: number;\n receivedPermitsCount: number;\n activePermit?: Permit;\n};\n\nfunction computeDefaultActiveAccordionId({ activePermit }: Args): 'self' | 'received' {\n if (activePermit?.type === 'recipient') {\n return 'received';\n }\n return 'self';\n}\n\nexport const PermitsListPage: React.FC = () => {\n const { activePermitHash, selfPermits, delegatedPermits, importedPermits, handlePermitAction, handleOpenPermit } =\n usePermitsList();\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const { permit } = useCofheActivePermit() ?? {};\n\n const defaultActiveAccordionId = computeDefaultActiveAccordionId({\n generatedPermitsCount: selfPermits.length,\n receivedPermitsCount: importedPermits.length,\n activePermit: permit,\n });\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-3\">\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={navigateBack}\n type=\"button\"\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Permits</span>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitInfo)} />\n </button>\n {activePermitHash != null && (\n <PermitCard\n hash={activePermitHash}\n className=\"-ml-4 -mr-4\"\n header={<p className=\"text-sm font-semibold\">Active Permit:</p>}\n />\n )}\n </div>\n }\n content={\n <div className=\"gap-4\">\n <Accordion defaultActiveId={defaultActiveAccordionId}>\n <div className=\"flex flex-col gap-3\">\n <AccordionSection\n id=\"self\"\n renderHeader={() => (\n <>\n <span>Self: ({selfPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'self' })} />\n </>\n )}\n >\n {selfPermits.length === 0 ? (\n <div className=\"pl-4 text-xs p-2 px-4 italic\">No self permits.</div>\n ) : (\n <div>\n {selfPermits.map((permit) => {\n return (\n <PermitItem\n key={permit.hash}\n activePermitHash={activePermitHash}\n permit={permit}\n onClick={() => handleOpenPermit(permit.hash)}\n />\n );\n })}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"delegated\"\n renderHeader={() => (\n <>\n <span>Delegated: ({delegatedPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'sharing' })} />\n </>\n )}\n >\n {delegatedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No delegated permits.</div>\n ) : (\n <div>\n {delegatedPermits.map((permit) => (\n <PermitItem key={permit.hash} permit={permit} onClick={() => handleOpenPermit(permit.hash)} />\n ))}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"received\"\n renderHeader={() => (\n <>\n <span>Imported: ({importedPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'recipient' })} />\n </>\n )}\n >\n {importedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No imported permits.</div>\n ) : (\n <div>\n {importedPermits.map((permit) => (\n <PermitItem\n key={permit.hash}\n activePermitHash={activePermitHash}\n permit={permit}\n onClick={() => handleOpenPermit(permit.hash)}\n />\n ))}\n </div>\n )}\n </AccordionSection>\n </div>\n </Accordion>\n </div>\n }\n footer={\n <div className=\"grid grid-cols-3 gap-2\">\n {permitActions.map(({ id, label, icon: Icon }) => (\n <Button key={id} onClick={() => handlePermitAction(id)} icon={<Icon />} iconPosition=\"top\" label={label} />\n ))}\n </div>\n }\n />\n );\n};\n","import { cn } from '@/utils';\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\nimport { Button } from './components';\nimport { FaChevronDown, FaChevronUp } from 'react-icons/fa6';\n\ninterface AccordionContextValue {\n activeId: string | null;\n toggle: (id: string) => void;\n}\n\nconst AccordionContext = createContext<AccordionContextValue | undefined>(undefined);\n\ninterface AccordionProps {\n children: ReactNode;\n defaultActiveId?: string | null;\n}\n\nexport const Accordion = ({ children, defaultActiveId = null }: AccordionProps) => {\n const [activeId, setActiveId] = useState<string | null>(defaultActiveId);\n\n const handleToggle = useCallback(\n (id: string) => {\n setActiveId(activeId === id ? null : id);\n },\n [activeId]\n );\n\n const contextValue = useMemo<AccordionContextValue>(\n () => ({\n activeId,\n toggle: handleToggle,\n }),\n [handleToggle, activeId]\n );\n\n return <AccordionContext.Provider value={contextValue}>{children}</AccordionContext.Provider>;\n};\n\nconst useAccordionContext = () => {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('Accordion components must be used within an Accordion');\n }\n\n return context;\n};\n\ninterface AccordionSectionProps {\n id: string;\n renderHeader: (isOpen: boolean) => ReactNode;\n children: ReactNode;\n sectionClassName?: string;\n triggerClassName?: string;\n contentClassName?: string;\n}\n\nexport const AccordionSection = ({\n id,\n renderHeader,\n children,\n sectionClassName,\n triggerClassName,\n contentClassName,\n}: AccordionSectionProps) => {\n const { activeId, toggle } = useAccordionContext();\n const isOpen = activeId === id;\n\n return (\n <section className={sectionClassName}>\n <Button\n variant=\"ghost\"\n className={cn('!justify-start w-full text-md py-2', triggerClassName)}\n aria-expanded={isOpen}\n onClick={() => toggle(id)}\n >\n {renderHeader(isOpen)}\n <span className=\"flex flex-1\" />\n {isOpen ? <FaChevronUp /> : <FaChevronDown />}\n </Button>\n {isOpen ? (\n <div className={cn('relative', contentClassName)}>\n <span\n className=\"absolute left-0 top-0 bottom-0 border-l border-[#0E2F3F]/30 dark:border-white/40\"\n aria-hidden\n />\n {children}\n </div>\n ) : null}\n </section>\n );\n};\n","import type { PermitStatus } from '@/hooks/permits/index.js';\nimport { ValidationUtils, type Permit } from '@cofhe/sdk/permits';\nimport type { FC } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nconst statusStyles: Record<PermitStatus, string> = {\n active: 'bg-[#01D082] text-[#0D3547] border border-[#068571]',\n valid: 'bg-[#247AFF] text-white border border-[#247AFF]',\n expired: 'bg-[#F0784F] text-[#4A1004] border border-[#A1421F]',\n};\n\nconst statusToLabel: Record<PermitStatus, string> = {\n active: 'Active',\n valid: 'Valid',\n expired: 'Expired',\n};\n\ninterface PermitItemProps {\n permit: Permit;\n activePermitHash?: string;\n onClick?: (id: string) => void;\n}\n\nexport const PermitItem: FC<PermitItemProps> = ({ permit, onClick, activePermitHash }) => {\n const status: PermitStatus = ValidationUtils.isExpired(permit)\n ? 'expired'\n : permit.hash === activePermitHash\n ? 'active'\n : 'valid';\n\n return (\n <Button\n variant=\"ghost\"\n className=\"flex flex-row w-full items-centera !justify-start gap-3 p-0.5\"\n onClick={() => onClick?.(permit.hash)}\n >\n <span\n className={cn(\n 'inline-flex items-center justify-center px-1 py-1 text-sm font-semibold h-6 w-24',\n statusStyles[status]\n )}\n >\n {statusToLabel[status]}\n </span>\n {permit.name}\n </Button>\n );\n};\n","import { FaCircleInfo } from 'react-icons/fa6';\n\nexport const InfoModalButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n return (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className=\"inline-flex self-center\"\n >\n <FaCircleInfo />\n </button>\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport { zeroAddress } from 'viem';\nimport { cn, formatExpirationLabel, truncateAddress } from '@/utils';\nimport { useCopyFeedback } from '@/hooks/useCopyFeedback';\nimport { type Permit, type PermitType } from '@cofhe/sdk/permits';\nimport { PermitStripedBackground } from '@/components/StripedBackground';\nimport { useCofheActivePermitHash, useCofhePermit } from '@/hooks/useCofhePermits';\nimport { useMemo } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst CopyButton: React.FC<{ hash: string }> = ({ hash }) => {\n const { copiedKeys, copyWithFeedback } = useCopyFeedback();\n\n return (\n <button type=\"button\" onClick={() => copyWithFeedback(hash, hash)}>\n {copiedKeys.has(hash) ? <FaCheck /> : <FaRegCopy />}\n </button>\n );\n};\n\nexport const BasePermitCard: React.FC<{ permit: Permit; className?: string; header?: React.ReactNode }> = ({\n permit,\n className,\n header,\n}) => {\n const activePermitHash = useCofheActivePermitHash();\n const expirationInfo = formatExpirationLabel(permit.expiration);\n\n const metadataTags = useMemo(() => {\n const isActivePermit = permit.hash === activePermitHash;\n const tags: string[] = [];\n if (expirationInfo.expired) tags.push('expired');\n if (expirationInfo.expiringSoon) tags.push('expiring soon');\n if (isActivePermit) tags.push('active');\n return tags;\n }, [expirationInfo.expired, expirationInfo.expiringSoon, activePermitHash, permit]);\n\n return (\n <div\n className={cn(\n 'relative gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n <PermitStripedBackground\n variant={expirationInfo.expired ? 'error' : expirationInfo.expiringSoon ? 'warning' : permit.type}\n className=\"absolute inset-0 z-[1]\"\n />\n <div className=\"relative z-[2] flex flex-1 flex-col gap-3\">\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left\">\n <b>-- {PermitTypeLabel[permit.type].toUpperCase()} PERMIT --</b>\n <br />\n Name: <b>{permit.name}</b>\n <br />\n Issuer: <b>{truncateAddress(permit.issuer, 6, 6)}</b> <CopyButton hash={permit.issuer} />\n <br />\n Expiration:{' '}\n <b>\n {permit.expiration} <i>({expirationInfo.label})</i>\n </b>\n <br />\n {permit.recipient != null && permit.recipient !== zeroAddress && (\n <>\n Recipient: <b>{truncateAddress(permit.recipient, 6, 6)}</b> <CopyButton hash={permit.recipient} />\n <br />\n </>\n )}\n {permit.validatorContract != null && permit.validatorContract !== zeroAddress && (\n <>\n Validator:\n <br />\n {' '}Contract: <b>{truncateAddress(permit.validatorContract, 6, 6)}</b>{' '}\n <CopyButton hash={permit.validatorContract} />\n <br />\n {' '}ID: <b>{permit.validatorId}</b>\n <br />\n </>\n )}\n {metadataTags.length > 0 && <br />}\n {metadataTags.map((tag) => (\n <b key={tag}>\n -- {tag.toUpperCase()} --\n <br />\n </b>\n ))}\n </pre>\n </div>\n </div>\n );\n};\n\nexport const PermitCard: React.FC<{ hash: string; className?: string; header?: React.ReactNode }> = ({\n hash,\n className,\n header,\n}) => {\n const permit = useCofhePermit(hash);\n\n if (permit == null) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left italic p-10\">Permit not found.</pre>\n </div>\n );\n }\n\n return <BasePermitCard permit={permit} className={className} header={header} />;\n};\n","import { cn } from '@/utils/cn';\nimport { type CSSProperties, useMemo } from 'react';\n\ntype StripeProps = {\n /** CSS color for stripes: \"#f00\", \"rgb(...)\", \"hsl(...)\", \"currentColor\", etc. Use \"currentColor\" with Tailwind text color classes. */\n stripeColor?: string;\n /** Background/base color behind the stripes */\n baseColor?: string;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport function StripedBackground({\n stripeColor = 'rgba(255,255,255,0.18)',\n baseColor = 'transparent',\n className,\n style,\n children,\n}: StripeProps) {\n const bgImage = useMemo(() => {\n // 2px stripe, 2px gap, repeating at 45 degrees (positive diagonal)\n return `repeating-linear-gradient(\n 45deg,\n ${stripeColor} 0px,\n ${stripeColor} 2px,\n transparent 2px,\n transparent 4px\n )`;\n }, [stripeColor]);\n\n const mergedStyle: CSSProperties = {\n backgroundColor: baseColor,\n backgroundImage: bgImage,\n ...style,\n };\n\n return (\n <div className={className} style={mergedStyle}>\n {children}\n </div>\n );\n}\n\ntype PermitStripedProps = {\n variant: 'self' | 'sharing' | 'recipient' | 'error' | 'warning';\n className?: string;\n children?: React.ReactNode;\n};\n\nconst PermitStripedVariantColors: Record<PermitStripedProps['variant'], string> = {\n self: 'text-blue-500',\n sharing: 'text-green-500',\n recipient: 'text-purple-500',\n error: 'text-red-500',\n warning: 'text-yellow-500',\n};\n\nconst PermitStripedVariantOpacities: Record<PermitStripedProps['variant'], string> = {\n self: 'opacity-15',\n sharing: 'opacity-15',\n recipient: 'opacity-15',\n error: 'opacity-30',\n warning: 'opacity-30',\n};\n\nexport const PermitStripedBackground = ({ variant, className, children }: PermitStripedProps) => {\n const color = PermitStripedVariantColors[variant];\n const opacity = PermitStripedVariantOpacities[variant];\n return (\n <StripedBackground stripeColor=\"currentColor\" className={cn(color, opacity, className)}>\n {children}\n </StripedBackground>\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport type { GeneratePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nexport const GeneratePermitPage: React.FC<GeneratePermitPageProps> = ({\n onSuccessNavigateTo,\n onCancel,\n onBack,\n cause,\n}) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n error,\n nameError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: false,\n onSuccess: () => {\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Create Self-usage Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n {cause === 'clicked_on_confidential_balance' && (\n <>You are trying to view a confidential balance, which requires a permit to access the encrypted data.</>\n )}\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form creates a \"SELF\" permit, which only grants access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitIcon = (props: SVGProps<SVGSVGElement>) => <svg width={19} height={22} viewBox=\"0 0 19 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16 19V21.97H14V19H11V17H14V14H16V17H19V19H16ZM18 10C18 10.9 17.9 11.78 17.71 12.65C17.13 12.35 16.5 12.15 15.81 12.05C15.93 11.45 16 10.83 16 10.22V5.3L9 2.18L2 5.3V10.22C2 14.54 5.25 19 9 20L9.31 19.91C9.5 20.53 9.83 21.11 10.22 21.62L9 22C3.84 20.74 0 15.55 0 10V4L9 0L18 4V10Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitIcon;","export type NameSectionProps = {\n permitName: string;\n error?: string | null;\n onNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const NameSection: React.FC<NameSectionProps> = ({ permitName, error, onNameChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Name:</span>\n </div>\n <input\n id=\"permit-name\"\n type=\"text\"\n placeholder=\"Human readable name\"\n value={permitName}\n onChange={onNameChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Permit name\"\n />\n {error && (\n <p role=\"alert\" className=\"px-4 pt-1 text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {error}\n </p>\n )}\n </div>\n);\n","import { Button } from '@/components/FnxFloatingButton/components';\n\nexport const ExpirySection = <U extends string>({\n presets,\n units,\n durationSeconds,\n customCount,\n customUnit,\n selectPreset,\n setCustomUnit,\n applyCustom,\n}: {\n presets: ReadonlyArray<{ label: string; seconds: number }>;\n units: ReadonlyArray<U>;\n durationSeconds: number;\n customCount: number | '';\n customUnit: U;\n selectPreset: (seconds: number) => void;\n setCustomUnit: (u: U) => void;\n applyCustom: (count: number | '', unit: U) => void;\n}) => (\n <div className=\"flex flex-col w-full gap-2\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Expiration:</span>\n </div>\n <div className=\"grid grid-cols-3 gap-3\">\n {presets.map((option) => {\n const isActive = durationSeconds === option.seconds;\n return (\n <Button\n key={option.label}\n variant={isActive ? 'primary' : 'default'}\n onClick={() => selectPreset(option.seconds)}\n label={option.label}\n />\n );\n })}\n </div>\n\n {/* TODO: Re-enable custom duration input */}\n {/* <p className=\"text-base font-semibold text-[#0E2F3F] dark:text-white\">- or -</p>\n <div className=\"flex flex-row w-full items-center gap-3\">\n <div className=\"flex-1\">\n <input\n id=\"custom-duration-count\"\n type=\"number\"\n min={1}\n placeholder=\"#\"\n value={customCount}\n onChange={(e) => {\n const raw = e.target.value;\n const v = raw === '' ? '' : Math.max(1, Number(raw));\n applyCustom(v, customUnit);\n }}\n className=\"border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Custom duration count\"\n />\n </div>\n <div className=\"flex items-center gap-2 rounded-xl border border-[#0E2F3F]/40 px-3 py-2 text-base font-semibold text-[#0E2F3F] dark:border-white/40 dark:text-white\">\n <div className=\"flex-1\">\n <label htmlFor=\"custom-duration-unit\" className=\"sr-only\">\n Custom duration unit\n </label>\n </div>\n <select\n id=\"custom-duration-unit\"\n value={customUnit}\n onChange={(e) => setCustomUnit(e.target.value as U)}\n className=\"bg-transparent outline-none appearance-none pr-5\"\n aria-label=\"Custom duration unit\"\n >\n {units.map((u) => (\n <option key={u as string} value={u as string} className=\"text-[#0E2F3F]\">\n {u}\n </option>\n ))}\n </select>\n </div>\n </div> */}\n </div>\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ReceiverSection } from '../components/ReceiverSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport type { DelegatePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nexport const DelegatePermitPage: React.FC<DelegatePermitPageProps> = ({ onSuccessNavigateTo, onCancel, onBack }) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: true,\n onSuccess: () => {\n // TODO: also add toast here in any case\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n description: 'Copy and share data with recipient',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Delegate Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form generates a permit that can be copied and shared with \"recipient\". Recipient will be granted\n access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n <ReceiverSection receiver={receiver} receiverError={receiverError} onReceiverChange={handleReceiverChange} />\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","export type ReceiverSectionProps = {\n receiver: string;\n receiverError?: string | null;\n onReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const ReceiverSection: React.FC<ReceiverSectionProps> = ({ receiver, receiverError, onReceiverChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Receiver:</span>\n </div>\n <input\n id=\"receiver-address\"\n type=\"text\"\n placeholder=\"Receiver address (0x...)\"\n value={receiver}\n onChange={onReceiverChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Receiver address\"\n />\n {receiverError && (\n <p role=\"alert\" className=\"text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {receiverError}\n </p>\n )}\n </div>\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport PermitReceiveIcon from '@/assets/fhenix-permit-receive.svg';\nimport { useReceivePermit } from '@/hooks/permits/index.js';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components/Button.js';\nimport { BasePermitCard } from '@/components/FnxFloatingButton/components/PermitCard.js';\n\nexport const ImportPermitPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n importedPermit,\n permitData,\n setPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n } = useReceivePermit({\n onSuccess: () => {\n navigateBack();\n addToast({\n variant: 'success',\n title: 'Permit imported',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to import permit',\n description: error.message,\n });\n console.error('Error importing permit', error);\n },\n });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Import permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitReceiveIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE import permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n This form importes a permit that has been shared with you.\n <br />\n Paste the permit data into the input below to import it.\n </p>\n\n {importedPermit == null && (\n <textarea\n id=\"fnx-permit-data\"\n rows={8}\n placeholder=\"Paste permit data\"\n className=\"w-full border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitData}\n onChange={(e) => setPermitData(e.target.value)}\n />\n )}\n\n {importedPermit != null && (\n <>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"fnx-permit-name\">\n Imported Permit:\n </label>\n <BasePermitCard permit={importedPermit} />\n </div>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"fnx-permit-name\">\n Name override:\n </label>\n <input\n id=\"fnx-permit-name\"\n type=\"text\"\n placeholder={importedPermit.name ?? 'Permit name...'}\n className=\"w-full rounded-xl border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitName}\n onChange={(e) => setPermitName(e.target.value)}\n />\n </div>\n </>\n )}\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {errorMsg && <div className=\"text-red-600 text-sm\">{errorMsg}</div>}\n {successMsg && <div className=\"text-green-600 text-sm\">{successMsg}</div>}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button variant=\"default\" onClick={navigateBack}>\n Cancel\n </Button>\n <Button variant=\"primary\" disabled={isSubmitting} onClick={submit}>\n {isSubmitting ? 'Importing...' : 'Import Permit'}\n </Button>\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitReceive = (props: SVGProps<SVGSVGElement>) => <svg width={21} height={21} viewBox=\"0 0 21 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M8 12C9.1 12 10 12.89 10 14C10 15.11 9.11 16 8 16C6.89 16 6 15.11 6 14C6 12.89 6.9 12 8 12ZM16 0C13.24 0 11 2.24 11 5V7H2C0.9 7 0 7.9 0 9V19C0 20.1 0.9 21 2 21H14C15.1 21 16 20.1 16 19V9C16 7.9 15.1 7 14 7H13V5C13 3.34 14.34 2 16 2C17.66 2 19 3.34 19 5V7H21V5C21 2.24 18.76 0 16 0ZM14 9V19H2V9H14Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitReceive;","import type { Token } from '@/types/token';\nimport { useCoingeckoContractMarketChartRange } from '@/hooks';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { sepolia } from '@cofhe/sdk/chains';\nimport { TMP_WBTC_ON_MAINNET } from '@/utils/coingecko';\nimport { useMemo } from 'react';\n\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\n\nimport { Button } from '../components/Button';\nimport { PageContainer } from '../components/PageContainer';\nimport { TokenInfoBalanceChart } from './TokenInfoBalanceChart';\nimport { TokenInfoTransactionHistory, TokenInfoTransactionHistoryHeader } from './TokenInfoTransactionHistory';\n\ntype TokenInfoPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.TokenInfo]: TokenInfoPageProps;\n }\n}\n\nexport const TokenInfoPage: React.FC<TokenInfoPageProps> = ({ token }) => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n\n const { data: chartPoints } = useCoingeckoContractMarketChartRange({\n ...(token.chainId === sepolia.id\n ? {\n chainId: TMP_WBTC_ON_MAINNET.chainId,\n contractAddress: TMP_WBTC_ON_MAINNET.address,\n }\n : {\n chainId: token.chainId,\n contractAddress: token.extensions.fhenix.erc20Pair?.address,\n }),\n rangeMs: 24 * 3600_000,\n });\n\n const priceUsd = useMemo(() => {\n const lastPoint = chartPoints?.[chartPoints.length - 1];\n return lastPoint?.value;\n }, [chartPoints]);\n\n return (\n <PageContainer\n header={\n <>\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <div className=\"flex flex-col leading-tight\">\n <p className=\"text-sm font-medium\">Tokens list</p>\n </div>\n </button>\n </div>\n\n <TokenInfoBalanceChart token={token} chartPoints={chartPoints ?? []} />\n\n <TokenInfoTransactionHistoryHeader token={token} />\n </>\n }\n content={<TokenInfoTransactionHistory token={token} priceUsd={priceUsd} />}\n footer={\n <div className=\"flex gap-3\">\n <Button\n variant=\"primary\"\n className=\"flex-1\"\n label=\"Unshield\"\n onClick={() =>\n navigateTo(FloatingButtonPage.Shield, {\n pageProps: {\n token,\n defaultMode: 'unshield',\n },\n })\n }\n />\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n label=\"Send\"\n onClick={() => navigateTo(FloatingButtonPage.Send, { pageProps: { token } })}\n />\n </div>\n }\n />\n );\n};\n","import { useMemo } from 'react';\n\nimport LockIcon from '@mui/icons-material/Lock';\nimport PublicIcon from '@mui/icons-material/Public';\n\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { useCofheTokenDecryptedBalance } from '@/hooks';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\n\nimport { TokenIcon } from '../components/TokenIcon';\nimport { TokenPriceChart, type TokenPriceChartPoint } from '../components/TokenPriceChart';\nimport { LoadingDots } from '../components/LoadingDots';\nimport { CofheTokenConfidentialBalance } from '../components/CofheTokenConfidentialBalance';\n\nimport type { Token } from '@/types/token';\n\ninterface TokenInfoBalanceChartProps {\n token: Token;\n chartPoints: TokenPriceChartPoint[];\n}\n\nconst money = (n: number) =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\nexport const TokenInfoBalanceChart: React.FC<TokenInfoBalanceChartProps> = ({ token, chartPoints }) => {\n const account = useCofheAccount();\n\n const { data: publicBalance, isFetching: isFetchingPublicBalance } = useCofheTokenPublicBalance({ token });\n\n const { data: confidentialBalance, isFetching: isFetchingConfidentialBalance } = useCofheTokenDecryptedBalance({\n accountAddress: account,\n token,\n });\n\n const isFetchingBalances = isFetchingConfidentialBalance || isFetchingPublicBalance;\n\n const balancePercents = useMemo(() => {\n if (!confidentialBalance && !publicBalance) return;\n\n const confidentialUnit = confidentialBalance?.unit ?? null;\n const publicUnit = publicBalance?.unit ?? null;\n\n const totalUnit = (confidentialUnit?.plus(publicUnit ?? 0) ?? publicUnit)?.toNumber() ?? 0;\n\n const confidentialPct =\n totalUnit && totalUnit > 0 && confidentialUnit\n ? parseInt(confidentialUnit.div(totalUnit).times(100).toFixed(2))\n : 0;\n\n const publicPct = 100 - confidentialPct;\n\n return {\n confidentialPct,\n publicPct,\n };\n }, [confidentialBalance, publicBalance]);\n\n const price = useMemo(() => {\n const lastPoint = chartPoints?.[chartPoints.length - 1];\n const firstPoint = chartPoints?.[0];\n\n if (!lastPoint || !firstPoint) return;\n\n return {\n valueUsd: lastPoint.value,\n changeUsd: lastPoint.value - firstPoint.value,\n changePct: ((lastPoint.value - firstPoint.value) / firstPoint.value) * 100,\n };\n }, [chartPoints]);\n\n return (\n <>\n {/* Token summary */}\n <div className=\"p-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <TokenIcon logoURI={token.logoURI} alt={token.extensions.fhenix.erc20Pair?.symbol} size=\"md\" />\n <div className=\"flex flex-col leading-tight\">\n <p className=\"text-sm font-bold fnx-text-primary\">{token.extensions.fhenix.erc20Pair?.symbol}</p>\n <div className=\"flex items-center gap-3 text-xxs opacity-80\">\n <div\n className=\"inline-flex items-center gap-1\"\n title=\"Confidential balance percent\"\n aria-label=\"Confidential balance percent\"\n >\n <LockIcon style={{ fontSize: 14 }} />\n {isFetchingBalances ? (\n <LoadingDots size=\"sm\" variant=\"secondary\" />\n ) : !balancePercents ? (\n <span>--%</span>\n ) : (\n <span>{balancePercents.confidentialPct}%</span>\n )}\n </div>\n\n <div\n className=\"inline-flex items-center gap-1\"\n title=\"Public balance percent\"\n aria-label=\"Public balance percent\"\n >\n <PublicIcon style={{ fontSize: 14 }} />\n {isFetchingBalances ? (\n <LoadingDots size=\"sm\" variant=\"secondary\" />\n ) : !balancePercents ? (\n <span>--%</span>\n ) : (\n <span>{balancePercents.publicPct}%</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col items-end\">\n <CofheTokenConfidentialBalance token={token} size=\"lg\" decimalPrecision={5} className=\"font-bold\" />\n {price && (\n <div className=\"flex flex-row\">\n <p className=\"text-xxs \">{money(price.valueUsd)}</p>\n <p className=\"text-xxs fnx-text-primary\">\n <span>\n ({price.changeUsd > 0 ? '+' : ''} {price.changePct.toFixed(2)}%)\n </span>\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Price + chart */}\n <div className=\"space-y-2\">\n {price && (\n <div className=\"flex items-end justify-between\">\n <div></div>\n <div className=\"text-xxxs opacity-60\">Last 24h</div>\n </div>\n )}\n\n <div className=\"p-3\">\n <TokenPriceChart points={chartPoints} />\n </div>\n </div>\n </>\n );\n};\n","import { useMemo } from 'react';\n\nimport { formatUnits } from 'viem';\n\nimport { HashLink } from '../components/HashLink';\nimport { cn } from '@/utils/cn';\n\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { actionToString } from '@/stores/transactionStore';\n\nimport type { Token } from '@/types/token';\n\ninterface TokenInfoTransactionHistoryHeaderProps {\n token: Token;\n}\n\nexport const TokenInfoTransactionHistoryHeader: React.FC<TokenInfoTransactionHistoryHeaderProps> = ({ token }) => {\n return (\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-bold fnx-text-primary\">Activity</h3>\n <HashLink type=\"token\" hash={token.address} chainId={token.chainId} extraShort />\n {token.extensions.fhenix.erc20Pair?.address && (\n <HashLink type=\"token\" hash={token.extensions.fhenix.erc20Pair.address} chainId={token.chainId} extraShort />\n )}\n </div>\n );\n};\n\ninterface TokenInfoTransactionHistoryProps {\n token: Token;\n priceUsd?: number;\n}\n\nconst money = (n: number) =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\nexport const TokenInfoTransactionHistory: React.FC<TokenInfoTransactionHistoryProps> = ({ token, priceUsd }) => {\n const account = useCofheAccount();\n\n const { filteredTxs: tokenTxs } = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter: (tx) => tx.token.address.toLowerCase() === token.address.toLowerCase(),\n });\n\n const activity = useMemo(() => {\n return tokenTxs\n .slice()\n .sort((a, b) => b.timestamp - a.timestamp)\n .map((tx) => {\n const amountToken = parseFloat(formatUnits(tx.tokenAmount, tx.token.decimals));\n const amountUsd =\n typeof priceUsd === 'number' && Number.isFinite(amountToken) ? amountToken * priceUsd : undefined;\n\n return {\n kind: actionToString(tx.actionType),\n amountUsd,\n amountToken: Number.isFinite(amountToken) ? amountToken : 0,\n };\n });\n }, [tokenTxs, priceUsd]);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"p-3\">\n {!activity || activity.length === 0 ? (\n <div className=\"py-6 text-center\">\n <p className=\"text-sm fnx-text-primary opacity-60\">No activity found</p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {activity.map((item, idx) => {\n return (\n <div key={idx} className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-2\">\n <div\n className={cn(\n 'w-8 h-8 rounded-full',\n 'bg-cyan-200/70 dark:bg-cyan-900/40',\n 'flex items-center justify-center'\n )}\n />\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-bold fnx-text-primary\">{item.kind}</p>\n </div>\n </div>\n\n <div className=\"flex flex-col items-end\">\n <p className=\"text-sm font-bold fnx-text-primary\">\n {typeof item.amountUsd === 'number' ? money(item.amountUsd) : '--'}\n </p>\n <p className=\"text-xxxs opacity-70\">\n {item.amountToken} {token.symbol}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { useState, useMemo } from 'react';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { isAddress, maxUint128 } from 'viem';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheTokenTransfer } from '@/hooks/useCofheTokenTransfer';\nimport { cn } from '../../../utils/cn';\nimport { truncateAddress, sanitizeNumericInput } from '../../../utils/utils';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { unitToWei } from '@/utils/format';\nimport { assert } from 'ts-essentials';\nimport { CofheTokenConfidentialBalance } from '../components';\nimport { useCofheTokensWithExistingEncryptedBalances, type Token } from '@/hooks';\nimport { getStepConfig } from '@/hooks/useCofheEncrypt';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer';\nimport { PortalModal } from '../modals/types';\nimport { BalanceType } from '../components/CofheTokenConfidentialBalance';\n\nexport type SendPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Send]: SendPageProps;\n }\n}\n\nexport const SendPage: React.FC<SendPageProps> = ({ token: _token }) => {\n const [overriddenToken, setOverriddenToken] = useState<Token | null>(null);\n\n const token = overriddenToken ?? _token;\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const account = useCofheAccount();\n const {\n encryptAmountAndSendToken,\n data: txHash,\n isPending: isEncryptingOrSendingTx,\n write: { isPending: isSending },\n encryption: {\n stepsState: { lastStep },\n isEncrypting: isEncryptingInput,\n },\n } = useCofheTokenTransfer({\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to send tokens';\n setError(errorMessage);\n console.error('Send tx submit error:', error);\n },\n onMutate: () => {\n setError(null);\n setSuccess(null);\n },\n onSuccess: (hash) => {\n setSuccess(`Transaction sent! Hash: ${truncateAddress(hash)}. Is being mined...`);\n setAmount('');\n setRecipientAddress('');\n },\n });\n\n useOnceTransactionMined({\n txHash,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setSuccess(`Transaction confirmed! Hash: ${truncateAddress(transaction.hash)}`);\n } else if (transaction.status === 'failed') {\n setError(`Transaction failed! Hash: ${truncateAddress(transaction.hash)}`);\n }\n },\n });\n\n const { data: { unit: confidentialUnitBalance } = {} } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: account,\n });\n\n const encryptionProgressLabel = useMemo(() => lastStep?.step && getStepConfig(lastStep).label, [lastStep]);\n\n const [amount, setAmount] = useState('');\n const [recipientAddress, setRecipientAddress] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // Validate recipient address\n const isValidAddress = isAddress(recipientAddress);\n\n // Validate amount\n const isValidAmount = (amount.length > 0 && confidentialUnitBalance && confidentialUnitBalance.gte(amount)) ?? false;\n\n const handleSend = async () => {\n assert(isAddress(recipientAddress), 'Recipient address is not valid');\n\n // Check if amount exceeds uint128 max value (2^128 - 1)\n // Convert amount to token's smallest unit (considering decimals)\n const amountWei = unitToWei(amount, token.decimals);\n // TODO: Does this need to be different if the confidential token uses euint64 for the balance precision?\n assert(amountWei <= maxUint128, 'Amount exceeds maximum supported value (uint128 max)');\n assert(account, 'Sender account is required');\n\n // Use the token transfer hook to send encrypted tokens\n await encryptAmountAndSendToken({\n input: {\n token,\n to: recipientAddress,\n amount: amountWei,\n userAddress: account,\n },\n });\n };\n\n const handleMaxAmount = () => {\n // Calculate available balance for MAX button\n if (confidentialUnitBalance) setAmount(confidentialUnitBalance.toFixed());\n };\n\n const { tokensWithExistingEncryptedBalance } = useCofheTokensWithExistingEncryptedBalances();\n\n return (\n <PageContainer\n header={\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shielded Transfer</p>\n </button>\n }\n content={\n <>\n {/* Asset Section */}\n <div className=\"fnx-card-bg p-2 border fnx-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Asset to be sent</label>\n </div>\n <div className=\"flex items-center gap-3\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"md\" />\n\n {/* Amount Input and Symbol on same line, centered with logo */}\n <div className=\"flex-1 flex items-center gap-1 min-w-0\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => {\n setAmount(sanitizeNumericInput(e.target.value));\n }}\n placeholder=\"0.00\"\n className=\"flex-1 min-w-0 bg-transparent text-2xl font-bold fnx-text-primary outline-none placeholder:opacity-50\"\n />\n <button\n onClick={() => {\n openModal(PortalModal.TokenList, {\n balanceType: BalanceType.Confidential,\n tokens: tokensWithExistingEncryptedBalance,\n title: 'Select token to transfer',\n onSelectToken: (token) => {\n setOverriddenToken(token);\n },\n });\n }}\n className=\"flex items-center gap-1 text-2xl font-bold fnx-text-primary hover:opacity-80 transition-opacity whitespace-nowrap flex-shrink-0\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60 flex-shrink-0\" />\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-3 -mt-1 text-xs opacity-70\">\n {/* Invisible placeholder to align with icon above */}\n <div className=\"w-10 flex-shrink-0\" />\n\n {/* Available text and MAX button */}\n <div className=\"flex-1 flex items-center justify-start min-w-0 gap-2\">\n <span className=\"text-xs opacity-70\">Available </span>\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={true}\n size=\"sm\"\n decimalPrecision={5}\n className=\"text-xs opacity-70 font-medium\"\n />\n <button\n onClick={handleMaxAmount}\n className=\"fnx-max-button text-xxxs ml-1 font-medium px-0.5 py-0.2 rounded\"\n >\n MAX\n </button>\n </div>\n </div>\n </div>\n\n {/* Down Arrow */}\n <div className=\"flex justify-center\">\n <div className=\"w-8 h-8 rounded-full fnx-icon-bg flex items-center justify-center\">\n <span className=\"text-lg\">↓</span>\n </div>\n </div>\n\n {/* Recipient Address */}\n <div className=\"fnx-card-bg p-4 border fnx-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Recipient Address:</label>\n </div>\n <input\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"0x...\"\n className={cn(\n 'w-full bg-transparent fnx-text-primary outline-none border-b pb-2 px-2',\n 'placeholder:opacity-50',\n isValidAddress ? 'border-green-500' : recipientAddress ? 'border-red-500' : 'fnx-card-border'\n )}\n />\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-3\">\n <p className=\"text-sm text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Success Message */}\n {success && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-3\">\n <p className=\"text-sm text-green-800 dark:text-green-200\">{success}</p>\n </div>\n )}\n\n {/* Encryption Status */}\n {isEncryptingOrSendingTx && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-3\">\n <p className=\"text-sm text-blue-800 dark:text-blue-200\">\n {isEncryptingInput ? encryptionProgressLabel || 'Encrypting amount...' : 'Sending transaction...'}\n </p>\n </div>\n )}\n </>\n }\n footer={\n <button\n onClick={handleSend}\n disabled={!isValidAddress || !isValidAmount || isSending || isEncryptingInput}\n className={cn(\n 'fnx-send-button w-full py-3 px-4 font-small',\n 'flex items-center justify-center gap-2',\n isValidAddress && isValidAmount && !isSending && !isEncryptingInput\n ? 'fnx-send-button-enabled'\n : 'fnx-send-button-disabled'\n )}\n >\n <span>Send</span>\n <span className=\"text-lg\">↗</span>\n </button>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { TbShieldPlus, TbShieldMinus } from 'react-icons/tb';\nimport { LuExternalLink } from 'react-icons/lu';\nimport { useState } from 'react';\nimport { parseUnits } from 'viem';\nimport { useCofheAccount, useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { useCofheTokenShield } from '@/hooks/useCofheTokenShield';\nimport { cn } from '../../../utils/cn';\nimport { getBlockExplorerTxUrl, truncateHash } from '../../../utils/utils';\nimport { ActionButton, AmountInput, CofheTokenConfidentialBalance, TokenIcon } from '../components/index';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { formatTokenAmount, unitToWei } from '@/utils/format';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport {\n useCofheTokenClaimUnshielded,\n useCofheTokenUnshield,\n useCofheTokenClaimable,\n useCofheTokensWithExistingEncryptedBalances,\n useTokensWithPublicBalances,\n} from '@/hooks';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { useReschedulableTimeout } from '@/hooks/useReschedulableTimeout';\nimport { assert } from 'ts-essentials';\nimport type { BigNumber } from 'bignumber.js';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { BalanceType, CofheTokenPublicBalance } from '../components/CofheTokenConfidentialBalance';\nimport { useIsUnshieldingMining } from '@/hooks/useIsUnshieldingMining';\nimport { PageContainer } from '../components/PageContainer';\nimport { PortalModal } from '../modals/types';\nimport { CopyButton } from '../components/HashLink';\n\nconst AUTOCLEAR_TX_STATUS_TIMEOUT = 5000;\nconst DISPLAY_DECIMALS = 5;\n\ntype Mode = 'shield' | 'unshield';\n\ntype LifecycleStatus = { message: React.ReactNode; type: 'info' | 'success' };\n\nexport type ShieldPageProps = {\n token: Token;\n defaultMode?: Mode;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Shield]: ShieldPageProps;\n }\n}\n\nfunction useLifecycleStore() {\n const [error, setError] = useState<React.ReactNode | null>(null);\n const [status, setStatus] = useState<LifecycleStatus | null>(null);\n return {\n error,\n setError,\n status,\n setStatus,\n };\n}\n\nfunction TxHashWithActions({ hash, chainId }: { hash: string; chainId?: number }) {\n const href = chainId ? getBlockExplorerTxUrl(chainId, hash) : undefined;\n const ellipsed = truncateHash(hash);\n\n const handleOpenExplorer = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <span className=\"inline-flex items-center gap-1.5 align-baseline\">\n <span className=\"font-mono\">{ellipsed}</span>\n <CopyButton text={hash} size={14} />\n <button\n type=\"button\"\n onClick={handleOpenExplorer}\n disabled={!href}\n aria-label=\"Open transaction in explorer\"\n title={href ? 'Open in explorer' : 'Explorer not available for this chain'}\n className={cn(\n 'fnx-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer',\n !href && 'cursor-default opacity-30'\n )}\n >\n <LuExternalLink style={{ width: 14, height: 14 }} />\n </button>\n </span>\n );\n}\n\n// Reusable hook to safely auto-clear a status message after a delay\n// (moved) useReschedulableTimeout is now in '@/hooks/useReschedulableTimeout'\n\nfunction useClaimUnshieldedWithLifecycle() {\n const { setError, setStatus, error, status } = useLifecycleStore();\n const chainId = useCofheChainId();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const claimUnshield = useCofheTokenClaimUnshielded({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing claim transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Claim transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n },\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to claim unshielded tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Claim tx submit error:', error);\n },\n });\n\n const { isMining: isClaimingMining } = useOnceTransactionMined({\n txHash: claimUnshield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Claim transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Claim transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n return {\n claimUnshield,\n isClaimingMining,\n error,\n status,\n };\n}\n\ntype ShieldAndUnshieldViewProps = Omit<ShieldPageViewProps, 'token' | 'mode' | 'setMode'>;\n\nfunction useShieldWithLifecycle(token: Token): Omit<ShieldAndUnshieldViewProps, 'setToken'> {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const [shieldAmount, setShieldAmount] = useState('');\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const tokenShield = useCofheTokenShield({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing shielding transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Shield transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n setShieldAmount('');\n },\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to shield tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Shield tx submit error:', error);\n },\n });\n const { isMining: isTokenShieldMining } = useOnceTransactionMined({\n txHash: tokenShield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Shield transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Shield transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n const handleShield = async () => {\n const amountWei = unitToWei(shieldAmount, token.decimals);\n await tokenShield.mutateAsync({\n token,\n amount: amountWei,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: publicBalanceUnit } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance({\n token,\n accountAddress: account,\n });\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n\n const handleShieldMax = () => {\n if (publicBalanceUnit) setShieldAmount(publicBalanceUnit.toFixed());\n };\n\n const isValidShieldAmount = (shieldAmount.length > 0 && publicBalanceUnit?.gte(shieldAmount)) ?? false;\n\n return {\n status,\n error,\n isProcessing: tokenShield.isPending || isTokenShieldMining,\n inputAmount: shieldAmount,\n setInputAmount: setShieldAmount,\n onMaxClick: handleShieldMax,\n isValidAmount: isValidShieldAmount,\n sourceSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n destSymbol: token.symbol,\n sourceLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n destLogoURI: token.logoURI,\n handlePrimaryAction: handleShield,\n primaryLabel: 'Shield',\n primaryIcon: <TbShieldPlus className=\"w-3 h-3\" />,\n };\n}\n\nfunction useUnshieldWithLifecycle(token: Token): Omit<ShieldAndUnshieldViewProps, 'setToken'> {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const [unshieldAmount, setUnshieldAmount] = useState('');\n const tokenUnshield = useCofheTokenUnshield({\n onUserSignatureRequest: (hash) => {\n () => {\n setError(null);\n setStatus({ message: 'Preparing unshielding transaction...', type: 'info' });\n };\n },\n onTransactionSubmitSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Unshield transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n setUnshieldAmount('');\n },\n onTransactionSubmitError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to unshield tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Unshield tx submit error:', error);\n },\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Unshield transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} /> Now\n waiting for decryption...\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Unshield transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n },\n onceDecrypted: () => {\n setStatus({ message: 'Unshield decryption completed!', type: 'success' });\n scheduleStatusClear();\n },\n });\n const handleUnshield = async () => {\n const amountInSmallestUnit = parseUnits(unshieldAmount, token.decimals);\n tokenUnshield.mutateAsync({\n token,\n amount: amountInSmallestUnit,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n const handleUnshieldMax = () => {\n if (confidentialBalanceUnit) setUnshieldAmount(confidentialBalanceUnit.toFixed());\n };\n const isValidUnshieldAmount = (unshieldAmount.length > 0 && confidentialBalanceUnit?.gte(unshieldAmount)) ?? false;\n\n return {\n status,\n error,\n isProcessing: tokenUnshield.isPending || tokenUnshield.isTokenUnshieldMining || tokenUnshield.isPendingDecryption,\n inputAmount: unshieldAmount,\n setInputAmount: setUnshieldAmount,\n onMaxClick: handleUnshieldMax,\n isValidAmount: isValidUnshieldAmount ?? false,\n sourceSymbol: token.symbol,\n destSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n sourceLogoURI: token.logoURI,\n destLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n handlePrimaryAction: handleUnshield,\n primaryLabel: 'Unshield',\n primaryIcon: <TbShieldMinus className=\"w-3 h-3\" />,\n };\n}\n\nconst shieldableTypes = new Set(['dual', 'wrapped']);\n\nexport const ShieldPageV2: React.FC<ShieldPageProps> = ({ token: _token, defaultMode }) => {\n const [mode, setMode] = useState<Mode>(defaultMode ?? 'shield');\n const [overriddenToken, setOverriddenToken] = useState<Token | null>(null);\n const token = overriddenToken ?? _token;\n\n return mode === 'shield' ? (\n <ShieldTab token={token} mode={mode} setMode={setMode} setToken={setOverriddenToken} />\n ) : (\n <UnshieldTab token={token} mode={mode} setMode={setMode} setToken={setOverriddenToken} />\n );\n};\n\ntype ShieldPageViewProps = {\n error: React.ReactNode | null;\n token: Token;\n mode: Mode;\n status: LifecycleStatus | null;\n setToken: (token: Token) => void;\n setMode: (mode: Mode) => void;\n\n isProcessing: boolean;\n inputAmount: string;\n setInputAmount: (value: string) => void;\n onMaxClick: () => void;\n isValidAmount: boolean;\n sourceSymbol: string | undefined;\n destSymbol: string | undefined;\n\n sourceLogoURI: string | undefined;\n destLogoURI: string | undefined;\n handlePrimaryAction: () => void;\n primaryLabel: string;\n primaryIcon: React.ReactNode;\n};\n\nfunction ShieldTab({\n token,\n mode,\n setMode,\n setToken,\n}: {\n token: Token;\n mode: Mode;\n setMode: (mode: Mode) => void;\n setToken: (token: Token) => void;\n}) {\n const shieldViewProps = useShieldWithLifecycle(token);\n return (\n <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} setToken={setToken} {...shieldViewProps} />\n );\n}\n\nfunction UnshieldTab({\n token,\n mode,\n setMode,\n setToken,\n}: {\n token: Token;\n mode: Mode;\n setMode: (mode: Mode) => void;\n setToken: (token: Token) => void;\n}) {\n const unshieldViewProps = useUnshieldWithLifecycle(token);\n return (\n <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} setToken={setToken} {...unshieldViewProps} />\n );\n}\n\nfunction ClaimingSection({ token }: { token: Token }) {\n const account = useCofheAccount();\n const {\n data: unshieldedClaims,\n isFetching: isFetchingClaims,\n isWaitingForDecryption: isWaitingForNewClaimsDecryption,\n } = useCofheTokenClaimable({\n token,\n accountAddress: account,\n });\n const {\n claimUnshield,\n error: claimingError,\n status: claimingStatus,\n isClaimingMining,\n } = useClaimUnshieldedWithLifecycle();\n\n const pairedSymbol = token.extensions.fhenix.erc20Pair?.symbol;\n const handleClaim = async () => {\n assert(unshieldedClaims, 'Unshield claims data is required to claim unshielded tokens');\n claimUnshield.mutateAsync({\n token,\n amount: unshieldedClaims.claimableAmount,\n });\n };\n\n const isUnshieldingMining = useIsUnshieldingMining(token);\n\n return (\n <>\n {/* Claim + pending (same logic as ShieldPage) */}\n {unshieldedClaims?.hasClaimable && (\n <ActionButton\n onClick={handleClaim}\n disabled={\n claimUnshield.isPending ||\n isClaimingMining ||\n isFetchingClaims ||\n isWaitingForNewClaimsDecryption ||\n isUnshieldingMining\n }\n label={\n claimUnshield.isPending\n ? 'Claiming...'\n : `Claim ${isFetchingClaims || isWaitingForNewClaimsDecryption ? '...' : formatTokenAmount(unshieldedClaims.claimableAmount, token.decimals, 5).formatted} ${pairedSymbol}`\n }\n className=\"mt-1\"\n />\n )}\n\n {unshieldedClaims?.hasPending && token && !unshieldedClaims.hasClaimable && (\n <p className=\"text-xxs text-yellow-600 dark:text-yellow-400 text-center\">\n Pending: {formatTokenAmount(unshieldedClaims.pendingAmount, token.decimals).formatted} {pairedSymbol}\n </p>\n )}\n <StatusAndError status={claimingStatus} error={claimingError} />\n </>\n );\n}\n\nfunction StatusAndError({ status, error }: { status: LifecycleStatus | null; error: React.ReactNode | null }) {\n return (\n <>\n {/* Error */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-2\">\n <p className=\"text-xs text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Status */}\n {status && (\n <div\n className={cn(\n 'rounded-lg p-2 border',\n status.type === 'success'\n ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'\n : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n >\n <p\n className={cn(\n 'text-xs',\n status.type === 'success' ? 'text-green-800 dark:text-green-200' : 'text-blue-800 dark:text-blue-200'\n )}\n >\n {status.message}\n </p>\n </div>\n )}\n </>\n );\n}\n\nconst ShieldAndUnshieldPageView: React.FC<ShieldPageViewProps> = ({\n error,\n token,\n mode,\n setMode,\n status,\n setToken,\n\n isProcessing,\n inputAmount,\n setInputAmount,\n onMaxClick,\n isValidAmount,\n sourceSymbol,\n destSymbol,\n\n sourceLogoURI,\n destLogoURI,\n handlePrimaryAction,\n primaryLabel,\n primaryIcon,\n}) => {\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const isShieldableToken = shieldableTypes.has(token.extensions.fhenix.confidentialityType);\n\n const { tokensWithExistingEncryptedBalance } = useCofheTokensWithExistingEncryptedBalances();\n const { tokensWithPublicBalances } = useTokensWithPublicBalances();\n\n // TODO: probably can be refactored into a view with more stramlined logic\n return (\n <PageContainer\n header={\n <div className=\"flex items-center justify-between\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shield / Unshield</p>\n </button>\n\n <button\n onClick={() =>\n openModal(PortalModal.TokenList, {\n balanceType: mode === 'shield' ? BalanceType.Public : BalanceType.Confidential,\n tokens: mode === 'unshield' ? tokensWithExistingEncryptedBalance : tokensWithPublicBalances,\n title: mode === 'shield' ? 'Select token to shield' : 'Select token to unshield',\n onSelectToken: (token) => setToken(token),\n })\n }\n className=\"flex items-center gap-1 text-sm font-bold fnx-text-primary hover:opacity-80 transition-opacity\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowDownIcon style={{ fontSize: 16 }} className=\"opacity-60\" />\n </button>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {/* Tabs */}\n <div className=\"flex gap-2\">\n <ActionButton\n onClick={() => setMode('shield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'shield'}\n label=\"Shield\"\n />\n <ActionButton\n onClick={() => setMode('unshield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'unshield'}\n label=\"Unshield\"\n />\n </div>\n\n {/* Two-panel layout */}\n <div className=\"space-y-2\">\n {/* Source */}\n <div className=\"fnx-card-bg border fnx-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Asset to be shielded' : 'Asset to be unshielded'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={sourceLogoURI} alt={sourceSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <AmountInput\n value={inputAmount}\n onChange={setInputAmount}\n onMaxClick={onMaxClick}\n className=\"w-28\"\n />\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{sourceSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Available{' '}\n {mode === 'unshield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-center text-xl opacity-80\">↓</div>\n\n {/* Received (read-only) */}\n <div className=\"fnx-card-bg border fnx-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Shielded asset received' : 'Unshielded asset received'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={destLogoURI} alt={destSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <p className=\"text-lg font-bold leading-none\">{inputAmount || '0'}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{destSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Balance\n {mode === 'shield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary action */}\n <ActionButton\n onClick={handlePrimaryAction}\n disabled={!isValidAmount || isProcessing || !isShieldableToken}\n icon={primaryIcon}\n label={primaryLabel}\n className=\"py-2\"\n />\n <StatusAndError status={status} error={error} />\n <ClaimingSection token={token} />\n\n {/* Not Shieldable Token Warning */}\n {!isShieldableToken && (\n <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-2\">\n <p className=\"text-xs text-yellow-800 dark:text-yellow-200\">\n This token does not support shielding/unshielding.\n </p>\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import { TransactionActionType, TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount } from './useCofheConnection';\nimport type { Token } from './useCofheTokenLists';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useCallback } from 'react';\n\nexport function useIsUnshieldingMining(token: Token) {\n const account = useCofheAccount();\n const filter = useCallback(\n (tx: Transaction) => {\n return (\n tx.token.address === token.address &&\n tx.actionType === TransactionActionType.Unshield &&\n tx.status === TransactionStatus.Pending\n );\n },\n [token.address]\n );\n const allPendingTxs = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter,\n });\n\n return allPendingTxs.filteredTxs.length > 0;\n}\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useCofheChainId, useCofheAccount } from '@/hooks/useCofheConnection.js';\nimport { TransactionItem } from '../components/TransactionItem.js';\nimport { usePortalNavigation } from '@/stores';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const ActivityPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs: transactions } = useStoredTransactions({\n chainId,\n account,\n });\n\n return (\n <PageContainer\n header={\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Activity</p>\n </button>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {transactions.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm fnx-text-primary opacity-60\">No transactions found</p>\n </div>\n ) : (\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\n {transactions.map((tx) => (\n <TransactionItem key={tx.hash} transaction={tx} />\n ))}\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { ToastPrimitive, ToastPrimitiveBase } from '../components/ToastPrimitives.js';\nimport { useState } from 'react';\nimport { PortalModal } from '../modals/types';\nimport { usePortalNavigation, usePortalStatuses, usePortalModals, usePortalToasts } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\nimport { useCofheClient } from '@/hooks/useCofheClient.js';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { createWalletClient, http } from 'viem';\nimport { usePortalPersisted } from '@/stores/portalPersisted.js';\n\ntype Tab = 'modal' | 'status' | 'toast' | 'permit';\n\nexport const DebugPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { statuses, addStatus, removeStatus } = usePortalStatuses();\n const { addToast } = usePortalToasts();\n const { openModal } = usePortalModals();\n const [modalSelection, setModalSelection] = useState<string | undefined>(undefined);\n const [activeTab, setActiveTab] = useState<Tab>('modal');\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Back</span>\n </button>\n <div className=\"flex gap-2 border-b\">\n <button onClick={() => setActiveTab('modal')} className={activeTab === 'modal' ? 'font-bold' : ''}>\n Modal\n </button>\n <button onClick={() => setActiveTab('status')} className={activeTab === 'status' ? 'font-bold' : ''}>\n Status\n </button>\n <button onClick={() => setActiveTab('toast')} className={activeTab === 'toast' ? 'font-bold' : ''}>\n Toast\n </button>\n <button onClick={() => setActiveTab('permit')} className={activeTab === 'permit' ? 'font-bold' : ''}>\n Permit\n </button>\n </div>\n </div>\n }\n content={\n <>\n {activeTab === 'modal' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n openModal(PortalModal.ExampleSelection, {\n onSelect: (selection: string) => {\n setModalSelection(selection);\n },\n });\n }}\n >\n Open selection modal: selection: {modalSelection}\n </button>\n <button\n onClick={() => {\n openModal(PortalModal.ExampleInfo);\n }}\n >\n Open info modal\n </button>\n </div>\n )}\n\n {activeTab === 'status' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-warning-status');\n if (isPresent) {\n removeStatus('test-warning-status');\n } else {\n addStatus({\n id: 'test-warning-status',\n variant: 'warning',\n title: 'Warning status',\n description: 'This is a warning status',\n });\n }\n }}\n >\n \"test-warning-status\" (toggle)\n </button>\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-error-status');\n if (isPresent) {\n removeStatus('test-error-status');\n } else {\n addStatus({\n id: 'test-error-status',\n variant: 'error',\n title: 'Error status',\n description: 'This is an error status',\n });\n }\n }}\n >\n \"test-error-status\" (toggle)\n </button>\n <button\n onClick={() => {\n addStatus({\n id: 'test-status-with-action',\n variant: 'warning',\n title: 'Warning status',\n action: {\n label: 'RESOLVE',\n onClick: () => {\n removeStatus('test-status-with-action');\n },\n },\n });\n }}\n >\n \"test-status-with-action\" (open)\n </button>\n </div>\n )}\n\n {activeTab === 'toast' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n addToast(\n <ToastPrimitiveBase>\n <div>Custom content</div>\n </ToastPrimitiveBase>\n );\n }}\n >\n Custom content toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'info',\n title: \"This toast won't go away on its own\",\n description: 'Click the X to dismiss it',\n },\n 'infinite'\n );\n }}\n >\n Non-expiring Toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'warning',\n title: 'Warning toast',\n description: 'Take the action',\n action: {\n label: 'ACTION',\n onClick: () => {\n alert('Action taken');\n },\n },\n },\n 'infinite'\n );\n }}\n >\n Toast with Action\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"info\"\n title=\"Info toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Info Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"success\"\n title=\"Success toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Success Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"error\"\n title=\"Error toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Error Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"warning\"\n title=\"Warning toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Warning Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'info',\n title: 'Info toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Info Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Success toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Success Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Error toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Error Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'warning',\n title: 'Warning toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Warning Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Permit invalid',\n description: 'Unable to decrypt data with this permit',\n action: {\n label: 'OPEN PERMITS',\n onClick: () => {\n alert('open permits');\n },\n },\n });\n }}\n >\n Invalid Permit\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Permit created successfully',\n });\n }}\n >\n Permit created\n </button>\n </div>\n )}\n\n {activeTab === 'permit' && (\n <div className=\"flex flex-col gap-3\">\n <FirstPermitDebug />\n <CreateSelfExpiringPermitButton />\n <CreateAndUseReceivingPermitButton />\n </div>\n )}\n </>\n }\n />\n );\n};\n\nconst FirstPermitDebug = () => {\n const { hasCreatedFirstPermit, setHasCreatedFirstPermit } = usePortalPersisted();\n return (\n <div>\n <p>Has created first permit: {hasCreatedFirstPermit ? '[Y]' : '[N]'}</p>\n <button\n onClick={() => {\n setHasCreatedFirstPermit(false);\n }}\n >\n Reset first permit created flag\n </button>\n </div>\n );\n};\n\nconst CreateSelfExpiringPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const create = async () => {\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n const expiration = Math.floor(Date.now() / 1000) + 2 * 60;\n await cofheClient.permits.createSelf({\n name: `Exp ${expiration}`,\n issuer: account,\n expiration: expiration,\n });\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={create}>Create self permit (expires in 2 minutes)</button>;\n};\n\nconst CreateAndUseReceivingPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const receiveAndUse = async () => {\n const { account, publicClient } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n if (!publicClient) throw new Error('No public client found');\n\n // Create account to create the sharing permit from private key\n const sharingAccount = privateKeyToAccount('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80');\n const sharingWalletClient = createWalletClient({\n chain: publicClient!.chain,\n transport: http(),\n account: sharingAccount,\n });\n\n // Create a sharing permit with account {sharingAccount} and recipient {account}\n const sharedPermit = await cofheClient.permits.createSharing(\n {\n name: 'Sharing permit',\n issuer: sharingAccount.address,\n expiration: Math.floor(Date.now() / 1000) + 120 * 60,\n recipient: account,\n },\n {\n publicClient,\n walletClient: sharingWalletClient,\n }\n );\n\n // Receive shared permit\n await cofheClient.permits.importShared(sharedPermit);\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={receiveAndUse}>Create and use receiving permit</button>;\n};\n","import { PageContainer } from '../components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { type Token, useCofheTokens } from '@/hooks';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { TokenRow } from '../components/TokenRow';\nimport { useCofhePinnedTokenAddress } from '@/hooks/useCofhePinnedTokenAddress';\nimport type { BalanceType } from '../components/CofheTokenConfidentialBalance';\nimport { Button } from '../components';\n\nexport const AddCustomTokenButton = () => <Button variant=\"outline\" size=\"sm\" label=\"Add custom Token +\" />;\nexport const TokenListModal: React.FC<PortalModalStateMap[PortalModal.TokenList]> = ({\n tokens,\n onClose,\n title,\n onSelectToken,\n balanceType,\n}) => {\n return (\n <PageContainer\n header={\n <div className=\"flex justify-between flex-row\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">{title}</p>\n </button>\n <AddCustomTokenButton />\n </div>\n }\n content={\n <TokenListContent\n balanceType={balanceType}\n tokens={tokens}\n onSelectToken={(token) => {\n onSelectToken(token);\n onClose();\n }}\n />\n }\n />\n );\n};\n\nexport const TokenListContent: React.FC<{\n tokens: Token[];\n balanceType: BalanceType;\n onSelectToken: (token: Token) => void;\n}> = ({ tokens, onSelectToken, balanceType }) => {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const normalizedPinnedAddress = pinnedTokenAddress?.toLowerCase();\n\n const pinnedToken = normalizedPinnedAddress\n ? tokens.find((t) => t.address.toLowerCase() === normalizedPinnedAddress)\n : undefined;\n\n const nonPinnedTokens = pinnedToken\n ? tokens.filter((t) => t.address.toLowerCase() !== normalizedPinnedAddress)\n : tokens;\n\n return (\n <div className=\"fnx-token-list-container\">\n {tokens.length === 0 ? (\n <p className=\"text-xs opacity-70 py-4 text-center\">No tokens found</p>\n ) : (\n <>\n {pinnedToken && (\n <TokenRow\n balanceType={balanceType}\n onClick={() => {\n onSelectToken(pinnedToken);\n }}\n key={`pinned-${pinnedToken.address}`}\n token={pinnedToken}\n topLabel=\"Pinned\"\n />\n )}\n {nonPinnedTokens.map((token) => (\n <TokenRow\n balanceType={balanceType}\n onClick={() => {\n onSelectToken(token);\n }}\n key={token.address}\n token={token}\n />\n ))}\n </>\n )}\n </div>\n );\n};\n","import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { cn } from '../../../utils/cn';\nimport type { Token } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from './TokenIcon';\nimport { CofheTokenConfidentialBalance, BalanceType, CofheTokenPublicBalance } from './CofheTokenConfidentialBalance';\nimport { useCofheTokenDecryptedBalance, useCoingeckoUsdPrice } from '@/hooks';\nimport { sepolia } from '@cofhe/sdk/chains';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { formatUsdAmount } from '@/utils/format';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { TMP_WBTC_ON_MAINNET } from '@/utils/coingecko';\n\nexport const TokenRow: React.FC<{\n token: Token;\n onClick: () => void;\n balanceType: BalanceType;\n topLabel?: string;\n}> = ({ token, onClick, topLabel, balanceType }) => {\n const account = useCofheAccount();\n const { data: confidentialBalance } = useCofheTokenDecryptedBalance(\n {\n token,\n accountAddress: account,\n },\n {\n enabled: balanceType === BalanceType.Confidential,\n }\n );\n\n const { data: publicBalance } = useCofheTokenPublicBalance({ token, accountAddress: account });\n // tmp: TODO: for testnet, fetch the price of WBTC on mainnet to display in the UI\n const { data: price } = useCoingeckoUsdPrice(\n token.chainId === sepolia.id\n ? {\n chainId: TMP_WBTC_ON_MAINNET.chainId,\n tokenAddress: TMP_WBTC_ON_MAINNET.address,\n }\n : {\n chainId: token.chainId,\n tokenAddress: token.extensions.fhenix.erc20Pair?.address,\n }\n );\n\n const usdValue =\n balanceType === BalanceType.Confidential\n ? confidentialBalance && price && formatUsdAmount(confidentialBalance.unit.multipliedBy(price))\n : publicBalance && price && formatUsdAmount(publicBalance.unit.multipliedBy(price));\n\n return (\n <div\n onClick={onClick}\n className={cn(\n 'flex items-center justify-between px-3 py-2 rounded-lg',\n 'fnx-hover-overlay transition-colors',\n 'cursor-pointer'\n )}\n >\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"sm\" />\n\n {/* Token label */}\n <div className=\"min-w-0 flex-1\">\n {topLabel && <div className=\"text-xxxs opacity-70 fnx-text-primary leading-none\">{topLabel}</div>}\n <div className=\"text-sm font-medium fnx-text-primary truncate leading-tight\">\n {balanceType === BalanceType.Confidential ? token.symbol : token.extensions.fhenix.erc20Pair?.symbol}\n </div>\n </div>\n </div>\n\n {/* Balance and Arrow */}\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <div className=\"w-24 text-right whitespace-nowrap tabular-nums\">\n {balanceType === BalanceType.Confidential ? (\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium inline-block w-full text-right\"\n />\n ) : (\n <CofheTokenPublicBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium inline-block w-full text-right\"\n />\n )}\n </div>\n\n <div className=\"w-24 text-right whitespace-nowrap tabular-nums\">\n {usdValue ? (\n <span className=\"text-sm opacity-70 fnx-text-primary inline-block w-full text-right\">{usdValue}</span>\n ) : (\n <span className=\"text-sm opacity-0 select-none inline-block w-full text-right\">$0.00</span>\n )}\n </div>\n\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60 flex-shrink-0\" />\n </div>\n </div>\n );\n};\n","import { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { PageContainer } from '../components/PageContainer';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useCofheTokens } from '@/hooks';\nimport { AddCustomTokenButton, TokenListContent } from '../modals/TokenListModal';\nimport { usePortalNavigation } from '@/stores';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { BalanceType } from '../components/CofheTokenConfidentialBalance';\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Portfolio]: void;\n }\n}\nexport const PortfolioPage: React.FC = () => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n\n return (\n <PageContainer\n header={\n <div className=\"flex justify-between flex-row\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Tokens list</p>\n </button>\n <AddCustomTokenButton />\n </div>\n }\n content={\n <TokenListContent\n balanceType={BalanceType.Confidential}\n tokens={allTokens}\n onSelectToken={(token) => {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: {\n token,\n },\n });\n }}\n />\n }\n />\n );\n};\n","import { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { PageContainer } from '../components/PageContainer';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokens } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { formatTokenAmount } from '@/utils/format';\nimport { useMemo, useState } from 'react';\nimport { useCofheTokenClaimUnshielded } from '@/hooks';\nimport { cn } from '@/utils';\nimport { Button } from '../components';\nimport type { Address } from 'viem';\nimport { assert } from 'ts-essentials';\nexport function ClaimableTokens() {\n // TODO: or show multichain, with switching?\n\n const chainsClaimableTokens = useCofheClaimableTokens();\n const claimableByTokenAddress = chainsClaimableTokens.claimableByTokenAddress;\n const unshieldingInProgressByTokenAddress = chainsClaimableTokens.isUnshieldingInProgressByTokenAddress;\n const waitingByTokenAddress = chainsClaimableTokens.isWaitingForDecryptionByTokenAddress;\n const isClaimingByTokenAddress = chainsClaimableTokens.isClaimingByTokenAddress;\n const { navigateBack } = usePortalNavigation();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const claimMutation = useCofheTokenClaimUnshielded();\n\n const rows = useMemo(() => {\n const byLower = new Map(allTokens.map((t) => [t.address.toLowerCase(), t] as const));\n // TODO: show those that have zero claimable right now but is maybe ongoing unshielding/decryption?\n return Object.entries(claimableByTokenAddress)\n .filter(([_t, amount]) => amount > 0n)\n .map(([tokenAddress, claimableAmount]) => {\n const token = byLower.get(tokenAddress.toLowerCase());\n return token ? { token, claimableAmount } : null;\n })\n .filter((x): x is NonNullable<typeof x> => Boolean(x));\n }, [allTokens, claimableByTokenAddress]);\n\n const handleClaim = async (tokenAddress: string) => {\n const row = rows.find((r) => r.token.address.toLowerCase() === tokenAddress.toLowerCase());\n assert(row, 'token not found for claim');\n\n await claimMutation.mutateAsync({ token: row.token, amount: row.claimableAmount });\n };\n\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-3\">\n <button\n className=\"flex items-center gap-2 text-xl font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n </button>\n <span>Claimable Tokens list</span>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-4 pr-1\">\n {rows.map(({ token, claimableAmount }) => {\n const isDecrypting = waitingByTokenAddress?.[token.address] ?? false;\n const isUnshielding =\n unshieldingInProgressByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n const formatted = formatTokenAmount(claimableAmount, token.decimals, 5).formatted;\n const isClaimingThis = isClaimingByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n\n return (\n <div key={token.address} className=\"grid grid-cols-[1fr,auto,auto] items-center gap-4\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <TokenIcon\n logoURI={token.logoURI}\n alt={token.name}\n size=\"md\"\n className={cn(\n 'w-10 h-10 rounded-full',\n 'fnx-icon-bg',\n 'border border-[var(--fnx-button-default-border)]',\n 'flex items-center justify-center flex-shrink-0 overflow-hidden'\n )}\n />\n <div className=\"min-w-0\">\n <div className=\"text-xl font-semibold fnx-text-primary truncate\">{token.name}</div>\n </div>\n </div>\n\n <div className=\"text-2xl font-semibold fnx-text-primary tabular-nums\">{formatted}</div>\n\n <Button\n type=\"button\"\n onClick={() => handleClaim(token.address)}\n disabled={isUnshielding || isDecrypting || isClaimingThis || claimMutation.isPending}\n >\n {isDecrypting ? 'Decrypting' : isUnshielding ? 'Unshielding' : 'Claim'}\n </Button>\n </div>\n );\n })}\n\n {rows.length === 0 && <div className=\"text-sm opacity-70 fnx-text-primary\">No claimable tokens.</div>}\n </div>\n }\n />\n );\n}\n","import type { FC } from 'react';\nimport {\n ActivityPage,\n GeneratePermitPage,\n MainPage,\n PermitsListPage,\n SendPage,\n SettingsPage,\n TokenInfoPage,\n DebugPage,\n ShieldPageV2,\n DelegatePermitPage,\n ImportPermitPage,\n} from '../pages';\nimport { FloatingButtonPage } from './types';\nimport { PortfolioPage } from '../pages/PortfolioPage';\nimport { ClaimableTokens } from '../pages/ClaimableTokens';\n\nexport const pages: Record<FloatingButtonPage, FC<any>> = {\n [FloatingButtonPage.Main]: MainPage,\n [FloatingButtonPage.Settings]: SettingsPage,\n [FloatingButtonPage.TokenInfo]: TokenInfoPage,\n [FloatingButtonPage.Send]: SendPage,\n [FloatingButtonPage.Shield]: ShieldPageV2,\n [FloatingButtonPage.Activity]: ActivityPage,\n [FloatingButtonPage.Permits]: PermitsListPage,\n [FloatingButtonPage.GeneratePermits]: GeneratePermitPage,\n [FloatingButtonPage.DelegatePermits]: DelegatePermitPage,\n [FloatingButtonPage.ReceivePermits]: ImportPermitPage,\n [FloatingButtonPage.Debug]: DebugPage,\n [FloatingButtonPage.Portfolio]: PortfolioPage,\n [FloatingButtonPage.ClaimableTokens]: ClaimableTokens,\n};\n","import { PortalModal, type PortalModalStateMap } from './types';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleSelectionPage: React.FC<PortalModalStateMap[PortalModal.ExampleSelection]> = ({\n onClose,\n onSelect,\n}) => {\n const options = ['1', '2', '3'];\n\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Select an option</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n {options.map((option) => (\n <button\n key={option}\n onClick={() => {\n onSelect(option);\n onClose();\n }}\n >\n Option {option}\n </button>\n ))}\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Close</span>\n </button>\n </div>\n }\n />\n );\n};\n","import CloseIcon from '@mui/icons-material/Close';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleInfoPage: React.FC<PortalModalStateMap[PortalModal.ExampleInfo]> = ({ onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">More info</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n <p>Cofhesdk is complex, so we have created this modal to help you understand.</p>\n <p>\n You probably clicked on a ? button next to some functionality. And in this modal you'll get your information\n or explanation.\n </p>\n <p>This is another paragraph of explanation.</p>\n <p>Now that you're done reading, you can click \"Got It\" at the bottom to close this modal.</p>\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Got It</span>\n </button>\n </div>\n }\n />\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { usePermitDetailsPage } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { Button } from '../components';\nimport { InfoModalButton } from './InfoModalButton';\nimport { usePortalModals } from '@/stores';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { PermitCard } from '../components/PermitCard';\nimport { truncateAddress } from '@/utils';\nimport { useCallback, useState } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst NoPermitFoundModal: React.FC<{ onClose: () => void }> = ({ onClose }) => {\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\">\n No permit found\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n <p>No permit found</p>\n </div>\n }\n footer={<Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />}\n />\n );\n};\n\nexport const PermitDetailsModal: React.FC<PortalModalStateMap[PortalModal.PermitDetails]> = ({ hash, onClose }) => {\n const {\n permit,\n expirationInfo,\n isActivePermit,\n isShareablePermit,\n handleSelectActivePermit,\n handleCopySharablePermitData,\n handleRemovePermit,\n isCopyComplete,\n } = usePermitDetailsPage(hash);\n const { openModal } = usePortalModals();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const handlePermitSelect = useCallback(() => {\n handleSelectActivePermit();\n onClose();\n }, [handleSelectActivePermit, onClose]);\n\n const handlePermitShare = useCallback(() => {\n handleCopySharablePermitData();\n }, [handleCopySharablePermitData]);\n\n const handlePermitDelete = useCallback(async () => {\n if (!confirmDelete) {\n setConfirmDelete(true);\n return;\n }\n handleRemovePermit();\n onClose();\n }, [confirmDelete, onClose, handleRemovePermit]);\n\n if (permit == null) {\n return <NoPermitFoundModal onClose={onClose} />;\n }\n\n return (\n <PageContainer\n isModal\n header={\n <PermitCard\n hash={hash}\n className=\"-mt-4 -ml-4 -mr-4\"\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={onClose}\n type=\"button\"\n >\n <CloseIcon fontSize=\"small\" />\n <span>Permit</span>\n </button>\n }\n />\n }\n content={\n permit != null && (\n <div className=\"flex flex-col gap-3\">\n <p className=\"flex flex-row gap-2 text-sm\">\n Type: <b>{PermitTypeLabel[permit.type]}</b>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: permit.type })} />\n </p>\n\n <p className=\"text-sm\">\n Expires in: <b>{expirationInfo.label}</b>\n </p>\n\n {permit.type === 'self' && (\n <p className=\"text-sm\">\n To select this permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is active, you\n will be able to view your own encrypted data.\n </p>\n )}\n {permit.type === 'sharing' && (\n <p className=\"text-sm\">\n To share this permit with <b>recipient</b>, click the <b>\"SHARE\"</b> button below to copy the permit\n data to your clipboard. Share the copied permit data with <b>recipient</b> to grant them access to your\n encrypted data.\n <br />\n <br />\n <i>\n <b>Note:</b> The copied permit data is not sensitive and can be sent to recipient via any\n communication channel.\n </i>\n </p>\n )}\n {permit.type === 'recipient' && (\n <p className=\"text-sm\">\n To select this imported permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is\n active, you will be able to view <b>issuer</b>'s ({truncateAddress(permit.issuer, 4, 4)}) encrypted\n data.\n </p>\n )}\n </div>\n )\n }\n footer={\n <div className=\"flex flex-row gap-3 w-full\">\n {isShareablePermit && (\n <Button variant=\"primary\" onClick={handlePermitShare}>\n {isCopyComplete ? <FaCheck /> : <FaRegCopy />}\n {isCopyComplete ? 'COPIED' : 'SHARE'}\n </Button>\n )}\n {!isShareablePermit && (\n <Button\n variant=\"primary\"\n label={isActivePermit ? 'ALREADY ACTIVE' : 'SELECT'}\n onClick={handlePermitSelect}\n disabled={isActivePermit}\n />\n )}\n <Button label={confirmDelete ? 'CONFIRM' : 'DELETE'} onClick={handlePermitDelete} variant=\"error\" />\n <Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />\n </div>\n }\n />\n );\n};\n","import CloseIcon from '@mui/icons-material/Close';\nimport { PageContainer } from '../components/PageContainer';\nimport { Button } from '../components';\n\ntype Props = {\n header: React.ReactNode | string;\n content: React.ReactNode;\n onClose: () => void;\n};\n\nexport const BaseInfoModal: React.FC<Props> = ({ header, content, onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button\n onClick={onClose}\n className=\"flex items-center gap-1 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n >\n <CloseIcon style={{ fontSize: 16 }} />\n {typeof header === 'string' ? (\n <p className=\"text-base font-semibold tracking-tight text-[#0E2F3F]\">{header}</p>\n ) : (\n header\n )}\n </button>\n }\n content={<div className=\"flex flex-1 flex-col w-full gap-3 items-start justify-start\">{content}</div>}\n footer={\n <div className=\"flex flex-row\">\n <Button onClick={onClose}>\n <span>Close</span>\n </Button>\n </div>\n }\n />\n );\n};\n","import type { PortalModal, PortalModalStateMap } from './types';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nexport const PermitTypeInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitTypeInfo]> = ({ type, onClose }) => {\n return (\n <BaseInfoModal\n header={`${PermitTypeLabel[type]} Permit`}\n content={\n <>\n {/* TODO: Improve copy */}\n {type === 'self' && (\n <p>\n \"Self\" permits are created by a user to access their own encrypted data. The provided signature is\n verified on-chain by the ACL (Access Control List).\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'sharing' && (\n <p>\n \"Delegated\" permits are created by a user (Issuer) to share their encrypted data with another user\n (Recipient). Both Issuer and Rceipient must sign as a handshake. Issuer's signature is verified on-chain\n by the ACL (Access Control List) and grants access to Recipient, and Recipient's signature applies and\n verifies the re-encryption key.\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'recipient' && (\n <p>\n \"Imported\" permits are imported by a user (Recipient) to access encrypted data that has been shared with\n them by the permit's Issuer. Both Issuer and Rceipient must sign as a handshake. Issuer's signature is\n verified on-chain by the ACL (Access Control List) and grants access to Recipient, and Recipient's\n signature applies and verifies the re-encryption key.\n </p>\n )}\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nexport const PermitInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitInfo]> = ({ onClose }) => {\n return (\n <BaseInfoModal\n header=\"Permit\"\n content={\n <>\n <div className=\"flex flex-col w-full justify-center items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <PermitIcon className=\"h-7 w-7 fill-black dark:fill-white\" aria-label=\"CoFHE permit icon\" />\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n CoFHE permits are used to authenticate your identity and grant access to your encrypted data.\n </p>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Generating a permit requires a signature, which will open your connected wallet to sign a message (EIP712).\n This signed message contains only info used to authenticate and grant access.\n </p>\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import { ExampleSelectionPage } from './ExampleSelectionPage';\nimport { ExampleInfoPage } from './ExampleInfoPage';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { PermitDetailsModal } from './PermitDetailsModal';\nimport { PermitTypeInfoModal } from './PermitTypeInfoModal';\nimport { PermitInfoModal } from './PermitInfoModal';\nimport { TokenListModal } from './TokenListModal';\n\nexport const modals: { [M in PortalModal]: React.FC<PortalModalStateMap[M]> } = {\n [PortalModal.ExampleSelection]: ExampleSelectionPage,\n [PortalModal.ExampleInfo]: ExampleInfoPage,\n [PortalModal.PermitDetails]: PermitDetailsModal,\n [PortalModal.PermitTypeInfo]: PermitTypeInfoModal,\n [PortalModal.PermitInfo]: PermitInfoModal,\n [PortalModal.TokenList]: TokenListModal,\n};\n","import { isValidElement, cloneElement, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\n\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport type { FnxFloatingButtonToast } from './types';\nimport { cn } from '@/utils';\nimport { usePortalToasts } from '@/stores';\n\nconst ToastClearer = ({ id, paused, remainingMs }: { id: string; paused: boolean; remainingMs: number }) => {\n const { removeToast } = usePortalToasts();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (remainingMs <= 0) {\n removeToast(id);\n return;\n }\n\n // Clear the timer if the toast has been paused\n if (paused && timerRef.current != null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n // Start the timer if the toast has been unpaused\n if (!paused) {\n timerRef.current = setTimeout(() => removeToast(id), remainingMs);\n }\n\n return () => {\n if (timerRef.current == null) return;\n clearTimeout(timerRef.current);\n timerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [remainingMs, paused]);\n\n return null;\n};\n\nconst ToastComponent: React.FC<FnxFloatingButtonToast> = ({ id, duration, paused, startMs, remainingMs, content }) => {\n const { isTopSide } = useFnxFloatingButtonContext();\n const { pauseToast, removeToast } = usePortalToasts();\n\n const handlePause = (paused: boolean) => {\n pauseToast(id, paused);\n };\n\n const handleDismiss = () => {\n removeToast(id);\n };\n\n // Inject id and paused into content if it's a React element\n const injectedContent = isValidElement(content)\n ? cloneElement(content, {\n id,\n paused,\n startMs,\n remainingMs,\n duration,\n onPause: handlePause,\n onDismiss: handleDismiss,\n ...content.props,\n })\n : content;\n\n return (\n <motion.div\n key={id}\n initial={{ opacity: 0, y: isTopSide ? -4 : 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: isTopSide ? 4 : -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className={cn('min-h-8 bg-white border items-center justify-start w-full max-w-full')}\n >\n {injectedContent}\n {duration != 'infinite' && <ToastClearer id={id} paused={paused} remainingMs={remainingMs} />}\n </motion.div>\n );\n};\n\nexport const ToastsSection: React.FC = () => {\n const { toasts } = usePortalToasts();\n return (\n <div className=\"flex flex-col gap-3 w-full max-w-full\">\n <AnimatePresence>\n {toasts.map((toast) => (\n <ToastComponent key={toast.id} {...toast} />\n ))}\n </AnimatePresence>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { FloatingButtonComponent } from './FloatingButtonComponent';\nimport { StatusBarSection } from './StatusBarSection';\nimport { StatusBarContent } from './StatusBarContent';\nimport { ContentSection } from './ContentSection';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport type { FloatingButtonPosition, FnxFloatingButtonProps } from './types';\nimport { ToastsSection } from './ToastsSection';\nimport { usePortalModals, usePortalNavigation, usePortalUI } from '@/stores';\n\nconst positionStyles: Record<FloatingButtonPosition, string> = {\n 'top-left': 'top-4 left-4',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n};\n\nexport const FnxFloatingButtonBase: React.FC<FnxFloatingButtonProps> = ({\n className,\n testId,\n zIndex = 9999,\n positionType = 'fixed',\n overriddingPage,\n}) => {\n const { effectivePosition, isTopSide, isLeftSide, theme } = useFnxFloatingButtonContext();\n const { togglePortal } = usePortalUI();\n const { clearAllModals } = usePortalModals();\n const { clearNavigationHistory } = usePortalNavigation();\n const darkMode = theme === 'dark';\n\n return (\n <div\n data-testid={testId}\n className={cn(\n 'fnx-floating-button',\n darkMode && 'dark',\n positionType,\n 'flex gap-3',\n positionStyles[effectivePosition],\n // bottom-* opens UP (popup above), top-* opens DOWN (popup below)\n isTopSide ? 'flex-col-reverse items-start' : 'flex-col items-start',\n `z-[${zIndex}]`,\n className\n )}\n >\n <ToastsSection />\n\n <ContentSection overriddingPage={overriddingPage} />\n\n {/* Button and Bar Row */}\n <div className={cn('flex w-full gap-3 items-center', isLeftSide ? 'flex-row' : 'flex-row-reverse')}>\n <FloatingButtonComponent\n onClick={() =>\n togglePortal({\n onCloseEnd: () => {\n clearNavigationHistory();\n clearAllModals();\n },\n })\n }\n />\n\n <StatusBarSection>\n <StatusBarContent />\n </StatusBarSection>\n </div>\n </div>\n );\n};\n","import { FnxFloatingButtonBase } from './FnxFloatingButtonBase';\nimport { FnxFloatingButtonProvider } from './FnxFloatingButtonContext';\nimport type { FnxFloatingButtonProps } from './types';\n\nexport const FnxFloatingButtonWithProvider: React.FC<FnxFloatingButtonProps> = (props) => {\n return (\n <FnxFloatingButtonProvider>\n <FnxFloatingButtonBase {...props} />\n {props.children}\n </FnxFloatingButtonProvider>\n );\n};\n","import { z } from 'zod';\nimport { type CofheConfig, type CofheInputConfig } from '@cofhe/sdk';\nimport { createCofheConfig as createCofheConfigWeb } from '@cofhe/sdk/web';\nimport { getAddress, isAddress, zeroAddress } from 'viem';\n\n/**\n * Zod schema for react configuration validation\n */\n\nexport const addressSchema = z\n .string()\n .refine((val) => isAddress(val), {\n error: 'Invalid address',\n })\n .refine((val) => val !== zeroAddress, {\n error: 'Must not be zeroAddress',\n })\n .transform((val) => getAddress(val));\n\nexport const CofheReactConfigSchema = z.object({\n shareablePermits: z.boolean().optional().default(false),\n enableShieldUnshield: z.boolean().optional().default(true),\n autogeneratePermits: z.boolean().optional().default(true),\n permitExpirationOptions: z\n .array(\n z.object({\n label: z.string(),\n intervalSeconds: z.number().min(0),\n })\n )\n .optional()\n .default([\n { label: '1 Day', intervalSeconds: 86400 },\n { label: '1 Week', intervalSeconds: 604800 },\n { label: '1 Month', intervalSeconds: 2592000 },\n ]),\n defaultPermitExpirationSeconds: z.number().optional().default(604800), // 1 week\n pinnedTokens: z.record(z.string(), addressSchema).optional(),\n tokenLists: z\n .record(z.string(), z.array(z.string()))\n .transform((lists) => lists as Partial<Record<number, string[]>>)\n .optional(),\n position: z.enum(['bottom-right', 'bottom-left', 'top-right', 'top-left']).optional().default('bottom-right'),\n initialTheme: z.enum(['dark', 'light']).optional().default('light'),\n});\n\n/**\n * Input config type inferred from the schema\n */\nexport type CofheReactInputConfig = CofheInputConfig & {\n react?: z.input<typeof CofheReactConfigSchema>;\n};\n\nexport type CofheConfigWithReact = CofheConfig & {\n react: z.output<typeof CofheReactConfigSchema>;\n};\n/**\n * Creates a CoFHE client plus React configuration with reasonable defaults.\n * @param config - Cofhe client input merged with a `react` object (fheKeyStorage defaults to IndexedDB when omitted).\n * @returns The combined client configuration with a validated `react` section and Web defaults applied.\n */\nexport function createCofheConfig(config: CofheReactInputConfig): CofheConfigWithReact {\n const { react: reactConfigInput = {}, ...webConfig } = config;\n\n const webClientConfig = createCofheConfigWeb({\n environment: 'react',\n ...webConfig,\n });\n const reactConfigResult = CofheReactConfigSchema.safeParse(reactConfigInput);\n\n if (!reactConfigResult.success) {\n throw new Error(`Invalid cofhe react configuration: ${z.prettifyError(reactConfigResult.error)}`, {\n cause: reactConfigResult.error,\n });\n }\n\n return {\n ...webClientConfig,\n react: reactConfigResult.data,\n };\n}\n","import { useState, useRef, useEffect, useMemo } from 'react';\nimport type {\n BaseProps,\n DropdownOption,\n ComponentSize,\n EncryptionProgressData,\n EncryptionResultData,\n EncryptionStartData,\n} from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { Encryptable, type FheTypeValue } from '@cofhe/sdk';\nimport { getStepConfig, useCofheEncrypt } from '@/hooks/useCofheEncrypt';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError,\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const {\n encryptInputsAsync: encrypt,\n isEncrypting,\n stepsState: { lastStep: lastEncryptionStep },\n } = useCofheEncrypt();\n\n const { progress: encryptionProgress, label: encryptionProgressLabel } = useMemo(() => {\n return lastEncryptionStep\n ? getStepConfig(lastEncryptionStep)\n : {\n progress: undefined,\n label: undefined,\n };\n }, [lastEncryptionStep]);\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncrypting) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncrypting) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncrypting]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncrypting && lastEncryptionStep && encryptionProgress && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: lastEncryptionStep.step,\n progress: encryptionProgress,\n label: encryptionProgressLabel,\n });\n }\n }, [encryptionProgress, encryptionProgressLabel, onEncryptProgress, isEncrypting, lastEncryptionStep]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' },\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError\n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500'\n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncrypting) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncrypting) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncrypting) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) =>\n cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible\n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium'\n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500',\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') =>\n cn('h-full transition-all duration-300 ease-out rounded-full', progressVariantClasses[variant]);\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n\n const typeInfo = FheTypesList.find((type) => type.value === typeValue);\n if (!typeInfo) return false;\n\n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n\n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n\n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n\n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n\n return true;\n }\n\n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n\n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n\n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n\n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n\n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(\n encryptedResult,\n (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n },\n 2\n ); // Pretty format with 2 spaces\n\n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n\n // Show success indication\n setCopySuccess(true);\n\n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n\n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n\n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const [encryptionResult] = await encrypt([Encryptable.create(type, textValue)]);\n\n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n\n const data = { value: textValue, encrypted: encryptionResult };\n\n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncrypting) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => <SecurityIcon sx={{ fontSize: 14 }} />;\n\n const ChevronDownIcon = () => <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n\n {/* Encryption status indicator */}\n {(isEncrypting || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncrypting ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">Encrypting...</div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess ? 'bg-green-600 cursor-default' : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? 'Copied to clipboard!' : 'Copy encrypted result to clipboard'}\n >\n <>\n {copySuccess ? <CheckIcon sx={{ fontSize: 12 }} /> : <ContentCopyIcon sx={{ fontSize: 12 }} />}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n\n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n\n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n\n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={\n !isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined\n }\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div\n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncrypting\n ? 'slideDownFadeIn 0.5s ease-out forwards'\n : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">{encryptionProgress || 0}%</span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{\n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out',\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {hasError && errorMessage && (\n <p\n className=\"mt-2 text-sm text-red-600 dark:text-red-400\"\n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n","// Styles\nimport './styles.css';\n\n// Providers\nexport { CofheProvider, useCofheContext } from './providers/index';\n\n// Hooks\nexport {\n useCofheConnection,\n useCofheActivePermit,\n useCofheAllPermits,\n useCofheRemovePermit,\n useCofheSelectPermit,\n useCofhePublicClient,\n useCofheWalletClient,\n useCofheEncrypt,\n useCofheWriteContract,\n useCofheClient,\n useCofheTokens,\n useCofheTokensWithExistingEncryptedBalances,\n useTokensWithPublicBalances,\n useCofheTokenLists,\n useCofheTokenShield,\n useCofheTokenUnshield,\n useCofheTokenClaimUnshielded,\n useCofheTokenClaimable,\n useCofheTokensClaimable,\n useCofheTokenDecryptedBalance,\n useCofheTokenTransfer,\n useTransactionReceiptsByHash,\n ETH_ADDRESS_LOWERCASE,\n type Erc20Pair,\n type UnshieldClaim,\n type UnshieldClaimsSummary,\n type UnshieldClaimsSummaryByTokenAddress,\n type ClaimableAmountByTokenAddress,\n type UseTransactionReceiptsByHashInput,\n useCoingeckoUsdPrice,\n type UseCoingeckoUsdPriceInput,\n type UseCoingeckoUsdPriceOptions,\n useCoingeckoContractMarketChartRange,\n type CoingeckoMarketChartPoint,\n type UseCoingeckoContractMarketChartRangeInput,\n type UseCoingeckoContractMarketChartRangeOptions,\n} from '@/hooks/index';\n\nexport { useCofheEncryptAndWriteContract } from '@/hooks/useCofheEncryptAndWriteContract';\nexport { useCofheReadContractAndDecrypt } from '@/hooks/useCofheReadContractAndDecrypt';\n\n// Components\nexport { FnxEncryptInput, FnxFloatingButtonWithProvider } from './components/index';\nexport { MainPage, SettingsPage } from './components/FnxFloatingButton/pages/index';\n\n// Utils\nexport {\n FheTypesList,\n fheTypeToString,\n encryptedValueToString,\n getBlockExplorerUrl,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n formatRelativeTime,\n truncateHash,\n isEthPair,\n isWrappedEthToken,\n} from './utils/index';\n\n// Stores\nexport {\n useTransactionStore,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n type Transaction,\n type TransactionStore,\n type TransactionStatusString,\n type TransactionActionString,\n} from './stores/transactionStore';\n\nexport { createCofheConfig } from './config';\n\n// Types\nexport type { CofheContextValue, CofheProviderProps, CofheClientConfig } from './types/index';\n\nexport type { FnxFloatingButtonProps } from './components/FnxFloatingButton/types';\n\nexport type { FloatingButtonPosition } from './components/FnxFloatingButton/types';\n\nexport { createCofheClient } from '@cofhe/sdk/web';\n\nexport { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nexport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\n\nexport type { CofheConfigWithReact as CofhesdkConfigWithReact } from './config';\n\nexport type { Token } from './types/token';\n\nexport { useInternalQueryClient } from './providers/index';\n"],"mappings":"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","names":["assert","createContext","useContext","useMemo","useState","createContext","useContext","TransactionStatus","TransactionActionType","useMemo","useMemo","import_ts_essentials","useMemo","useSyncExternalStore","DEFAULT_SNAPSHOT_GETTER","useMemo","useSyncExternalStore","useContext","useMemo","useInternalQueries","useMemo","parseAbi","import_ts_essentials","create","createJSONStorage","persist","bigintStorage","createJSONStorage","create","persist","useMemo","import_ts_essentials","queryKey","import_ts_essentials","useMemo","filter","create","useMemo","create","create","create","useMemo","create","jsx","jsx","jsxs","create","jsx","useInternalQueries","useCallback","useEffect","useMemo","useRef","import_ts_essentials","useMemo","useMemo","useInternalQueries","import_ts_essentials","useMemo","abortError","sleep","useMemo","useInternalQueries","useCallback","filter","useMemo","useEffect","useRef","import_ts_essentials","FheTypes","CofheError","import_ts_essentials","CofheError","FheTypes","import_ts_essentials","useCallback","useMemo","useState","import_ts_essentials","import_ts_essentials","import_ts_essentials","useMemo","import_ts_essentials","filter","useMemo","useEffect","useRef","transaction","useEffect","useRef","transaction","import_ts_essentials","import_ts_essentials","useMemo","useMemo","filter","import_ts_essentials","useMemo","useMemo","useMemo","useInternalQueries","queryKey","useMemo","import_ts_essentials","transformEncryptedReturnTypes","QUERY_CACHE_PREFIX","serializeIfBigint","serializeBigintRecursively","useMemo","useMemo","useMemo","useInternalQueries","useState","useCallback","useMemo","useCallback","useState","create","createJSONStorage","persist","useState","useCallback","useCallback","useMemo","useCallback","useMemo","useCallback","useState","useCallback","PermitUtils","useState","useCallback","useCallback","useMemo","PermitUtils","useCallback","useEffect","useRef","useState","useMemo","PermitUtils","useCallback","useCallback","useEffect","useMemo","useEffect","useInternalQueries","useMemo","useCallback","useEffect","useEffect","useRef","url","res","json","useEffect","useRef","useRef","useEffect","useEffect","useEffect","jsx","createContext","useContext","jsx","jsx","jsxs","motion","jsx","motion","useMemo","AnimatePresence","motion","jsx","Fragment","jsx","jsxs","useMemo","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","jsx","jsxs","jsx","__default","jsx","__default","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","jsx","jsxs","sizeClasses","jsx","jsxs","sizeClasses","jsx","jsx","jsx","jsxs","GoArrowUpRight","TbShieldPlus","import_ts_essentials","jsx","jsxs","jsx","jsxs","jsx","jsxs","sizeClasses","useMemo","jsx","jsxs","useMemo","start","end","mid","jsx","jsxs","jsx","jsxs","iconClassName","jsx","jsxs","TbShieldPlus","GoArrowUpRight","jsx","create","persist","ShieldPageVariant","jsx","jsxs","ArrowBackIcon","createContext","useCallback","useContext","useMemo","useState","jsx","jsxs","createContext","useState","useCallback","useMemo","useContext","jsx","jsxs","jsx","zeroAddress","useMemo","jsx","useMemo","Fragment","jsx","jsxs","CopyButton","zeroAddress","Fragment","jsx","jsxs","ArrowBackIcon","permit","ArrowBackIcon","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","error","ArrowBackIcon","ArrowBackIcon","jsx","jsxs","jsx","jsxs","error","ArrowBackIcon","ArrowBackIcon","jsx","Fragment","jsx","jsxs","ArrowBackIcon","sepolia","useMemo","ArrowBackIcon","useMemo","Fragment","jsx","jsxs","useMemo","useMemo","formatUnits","jsx","jsxs","money","useMemo","formatUnits","Fragment","jsx","jsxs","sepolia","useMemo","ArrowBackIcon","useState","useMemo","ArrowBackIcon","KeyboardArrowRightIcon","isAddress","import_ts_essentials","Fragment","jsx","jsxs","useState","error","useMemo","isValidAddress","isAddress","ArrowBackIcon","token","KeyboardArrowRightIcon","ArrowBackIcon","TbShieldPlus","TbShieldMinus","LuExternalLink","useState","import_ts_essentials","useCallback","filter","Fragment","jsx","jsxs","useState","LuExternalLink","error","TbShieldPlus","TbShieldMinus","ArrowBackIcon","token","ArrowBackIcon","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","useState","Fragment","jsx","jsxs","useState","ArrowBackIcon","create","ArrowBackIcon","KeyboardArrowRightIcon","sepolia","jsx","jsxs","sepolia","KeyboardArrowRightIcon","Fragment","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","useMemo","import_ts_essentials","jsx","jsxs","useMemo","ArrowBackIcon","AnimatePresence","motion","CloseIcon","jsx","jsxs","CloseIcon","CloseIcon","jsx","jsxs","CloseIcon","FaCheck","FaRegCopy","CloseIcon","useCallback","useState","jsx","jsxs","PermitTypeLabel","CloseIcon","FaCheck","FaRegCopy","CloseIcon","jsx","jsxs","CloseIcon","Fragment","jsx","jsxs","PermitTypeLabel","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","useMemo","AnimatePresence","motion","isValidElement","useEffect","useRef","motion","AnimatePresence","jsx","jsxs","useRef","useEffect","paused","isValidElement","motion","AnimatePresence","jsx","jsxs","jsx","jsxs","isAddress","zeroAddress","import_ts_essentials","jsx","jsxs","createContext","useMemo","useState","useContext","useState","useRef","useEffect","useMemo","KeyboardArrowDownIcon","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","sizeClasses","errorMessage","ShieldIcon","KeyboardArrowDownIcon","createCofheClient"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/unreachable-case-error/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/assert/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/create-factory-with-constraint/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/is-exact/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/noop/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/index.ts","../src/providers/CofheProvider.tsx","../src/providers/QueryProvider.tsx","../src/utils/cn.ts","../src/utils/utils.ts","../src/types/token.ts","../src/utils/logging.ts","../src/utils/debounce.ts","../src/utils/waitUntilRpcAwareAndReadContract.ts","../src/components/FnxFloatingButton/FloatingButtonComponent.tsx","../src/components/FnxFloatingButton/FnxFloatingButtonContext.tsx","../src/utils/bigintJson.ts","../src/stores/transactionStore.ts","../src/hooks/useCofheConnection.ts","../src/hooks/useTrackPendingTransactions.ts","../src/hooks/useCofheReadContract.ts","../src/hooks/useCofhePermits.ts","../src/hooks/useIsCofheErrorActive.ts","../src/constants/confidentialTokenABIs.ts","../src/hooks/useCofheTokenLists.ts","../src/hooks/useCofheTokenPublicBalance.ts","../src/constants/erc20ABIs.ts","../src/utils/format.ts","../src/hooks/useCofheTokenClaimable.ts","../src/utils/decryptionAwareReadContract.ts","../src/stores/decryptionWatchingStore.ts","../src/hooks/useIsWaitingForDecryptionToInvalidate.ts","../src/hooks/useStoredTransactions.ts","../src/hooks/usePendingTransactions.ts","../src/stores/portalModalStore.tsx","../src/stores/portalUIStore.tsx","../src/stores/portalStatuses.tsx","../src/stores/portalNavigationStore.tsx","../src/components/FnxFloatingButton/components/ToastPrimitives.tsx","../src/components/FnxFloatingButton/components/HashLink.tsx","../src/stores/portalToasts.tsx","../src/hooks/useTransactionGlobalLifecycle.ts","../src/hooks/useTrackDecryptingTransactions.ts","../src/hooks/useTransactionReceiptsByHash.ts","../src/hooks/useCofheReadDecryptionResults.ts","../src/hooks/useCofheClient.ts","../src/hooks/useCofheTokenDecryptedBalance.ts","../src/hooks/useCofheReadContractAndDecrypt.ts","../src/hooks/useCofheDecrypt.ts","../src/hooks/useCofheTokenTransfer.ts","../src/hooks/useCofheEncryptAndWriteContract.ts","../src/hooks/useCofheEncrypt.ts","../src/hooks/internal/useStepsState.ts","../src/hooks/useCofheWriteContract.ts","../src/hooks/useCofheTokenShield.ts","../src/hooks/useCofheTokenUnshield.ts","../src/hooks/useStoredTransaction.ts","../src/hooks/useOnceTransactionMined.ts","../src/hooks/useOnceDecrypted.ts","../src/hooks/useCofheTokenClaimUnshielded.ts","../src/hooks/useCofheTokensClaimable.ts","../src/hooks/useNormalizedList.ts","../src/hooks/useIsWaitingForDecryptionByAddress.ts","../src/hooks/useCofheTokensWithExistingEncryptedBalances.ts","../src/hooks/useCofheReadContracts.ts","../src/hooks/useTokensWithPublicBalances.ts","../src/hooks/permits/usePermitDuration.ts","../src/hooks/permits/usePermitForm.ts","../src/stores/portalPersisted.tsx","../src/hooks/permits/useCofheCreatePermitMutation.ts","../src/hooks/permits/usePermitsList.ts","../src/hooks/permits/useCofheNavigateToCreatePermit.tsx","../src/hooks/permits/useReceivePermit.ts","../src/hooks/permits/usePermitDetailsAndActions.ts","../src/hooks/useCopyFeedback.ts","../src/hooks/useCofheAutoConnect.ts","../src/providers/internalQueryHooks.ts","../src/providers/queryUtils.ts","../src/hooks/useCofheConnect.ts","../src/hooks/useReschedulableTimeout.ts","../src/utils/coingecko.ts","../src/hooks/useCoingeckoUsdPrice.ts","../src/hooks/useCoingeckoContractMarketChartRange.ts","../src/hooks/useWatchPermitStatus.ts","../src/hooks/useWatchClaimablesStatus.ts","../src/hooks/useCofheClaimableTokens.ts","../src/components/FhenixLogoIcon.tsx","../src/components/FnxFloatingButton/StatusBarSection.tsx","../src/components/FnxFloatingButton/StatusBarContent.tsx","../src/components/primitives/AnimatedZStack.tsx","../src/components/FnxFloatingButton/ContentSection.tsx","../src/components/FnxFloatingButton/pages/MainPage/WalletHeader.tsx","../src/components/FnxFloatingButton/components/AddressButton.tsx","../src/components/FnxFloatingButton/components/ConnectedChainIndicator.tsx","../src/assets/chains/11155111.svg","../src/assets/chains/84532.svg","../src/components/FnxFloatingButton/components/ChainIcon.tsx","../src/components/FnxFloatingButton/pages/MainPage/AssetCard.tsx","../src/components/FnxFloatingButton/components/TokenIcon.tsx","../src/components/FnxFloatingButton/components/LoadingDots.tsx","../src/components/FnxFloatingButton/components/TokenBalanceView.tsx","../src/components/FnxFloatingButton/components/CofheTokenConfidentialBalance.tsx","../src/hooks/useCofhePinnedTokenAddress.ts","../src/hooks/useCofhePinnedToken.ts","../src/components/FnxFloatingButton/pages/MainPage/BottomNavigation.tsx","../src/components/FnxFloatingButton/components/ActionButton.tsx","../src/components/FnxFloatingButton/components/AmountInput.tsx","../src/components/FnxFloatingButton/components/Button.tsx","../src/components/FnxFloatingButton/components/TokenPriceChart.tsx","../src/components/FnxFloatingButton/components/PageContainer.tsx","../src/components/FnxFloatingButton/components/TransactionItem.tsx","../src/components/FnxFloatingButton/pages/MainPage.tsx","../src/components/FnxFloatingButton/pages/SettingsPage.tsx","../src/components/FnxFloatingButton/stores/settingsStore.ts","../src/components/FnxFloatingButton/pages/permits/PermitsListPage/index.tsx","../src/components/FnxFloatingButton/Accordion.tsx","../src/components/FnxFloatingButton/pages/permits/components/PermitItem.tsx","../src/components/FnxFloatingButton/modals/InfoModalButton.tsx","../src/components/FnxFloatingButton/components/PermitCard.tsx","../src/components/StripedBackground.tsx","../src/components/FnxFloatingButton/pages/permits/GeneratePermitPage/index.tsx","../src/assets/fhenix-permit-icon.svg","../src/components/FnxFloatingButton/pages/permits/components/NameSection.tsx","../src/components/FnxFloatingButton/pages/permits/components/ExpirySection.tsx","../src/components/FnxFloatingButton/pages/permits/DelegatePermitPage/index.tsx","../src/components/FnxFloatingButton/pages/permits/components/ReceiverSection.tsx","../src/components/FnxFloatingButton/pages/permits/ImportPermitPage/index.tsx","../src/assets/fhenix-permit-receive.svg","../src/components/FnxFloatingButton/pages/TokenInfoPage.tsx","../src/components/FnxFloatingButton/pages/TokenInfoBalanceChart.tsx","../src/components/FnxFloatingButton/pages/TokenInfoTransactionHistory.tsx","../src/components/FnxFloatingButton/pages/SendPage.tsx","../src/components/FnxFloatingButton/pages/ShieldPageV2.tsx","../src/hooks/useIsUnshieldingMining.ts","../src/components/FnxFloatingButton/pages/ActivityPage.tsx","../src/components/FnxFloatingButton/pages/DebugPage.tsx","../src/components/FnxFloatingButton/modals/TokenListModal.tsx","../src/components/FnxFloatingButton/components/TokenRow.tsx","../src/components/FnxFloatingButton/pages/PortfolioPage.tsx","../src/components/FnxFloatingButton/pages/ClaimableTokens.tsx","../src/components/FnxFloatingButton/pagesConfig/const.ts","../src/components/FnxFloatingButton/modals/ExampleSelectionPage.tsx","../src/components/FnxFloatingButton/modals/ExampleInfoPage.tsx","../src/components/FnxFloatingButton/modals/PermitDetailsModal.tsx","../src/components/FnxFloatingButton/modals/BaseInfoModal.tsx","../src/components/FnxFloatingButton/modals/PermitTypeInfoModal.tsx","../src/components/FnxFloatingButton/modals/PermitInfoModal.tsx","../src/components/FnxFloatingButton/modals/index.ts","../src/components/FnxFloatingButton/ToastsSection.tsx","../src/components/FnxFloatingButton/FnxFloatingButtonBase.tsx","../src/components/FnxFloatingButton/FnxFloatingButton.tsx","../src/config.ts","../src/components/FnxEncryptInput.tsx","../src/index.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJpbWl0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgc3ltYm9sIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbHQtaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCIuLi9wcmltaXRpdmVcIjtcblxuZXhwb3J0IHR5cGUgQnVpbHRpbiA9IFByaW1pdGl2ZSB8IEZ1bmN0aW9uIHwgRGF0ZSB8IEVycm9yIHwgUmVnRXhwO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIva2V5LW9mLWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEtleW9mQmFzZSA9IGtleW9mIGFueTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4Y2x1ZGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4Y2x1ZGU8VW5pb25UeXBlLCBFeGNsdWRlZE1lbWJlcnMgZXh0ZW5kcyBVbmlvblR5cGU+ID0gRXhjbHVkZTxVbmlvblR5cGUsIEV4Y2x1ZGVkTWVtYmVycz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4dHJhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4dHJhY3Q8VHlwZSwgVW5pb24gZXh0ZW5kcyBQYXJ0aWFsPFR5cGU+PiA9IEV4dHJhY3Q8VHlwZSwgVW5pb24+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LW9taXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgU3RyaWN0T21pdDxUeXBlIGV4dGVuZHMgQW55UmVjb3JkLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgQW55QXJyYXlcbiAgPyBuZXZlclxuICA6IE9taXQ8VHlwZSwgS2V5cz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFdyaXRhYmxlPFR5cGU+ID0geyAtcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXN5bmNPclN5bmM8VHlwZT4gPSBQcm9taXNlTGlrZTxUeXBlPiB8IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy10eXBlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY09yU3luYyB9IGZyb20gXCIuLi9hc3luYy1vci1zeW5jXCI7XG5cbmV4cG9ydCB0eXBlIEFzeW5jT3JTeW5jVHlwZTxBc3luY09yU3luY1R5cGU+ID0gQXN5bmNPclN5bmNUeXBlIGV4dGVuZHMgQXN5bmNPclN5bmM8aW5mZXIgVHlwZT4gPyBUeXBlIDogbmV2ZXI7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5b2ZCYXNlIH0gZnJvbSBcIi4uL2tleS1vZi1iYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c106IFR5cGUgfTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS12YWx1ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBgVmFsdWVPZmAgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5VmFsdWVzPFR5cGU+ID0gVHlwZVtrZXlvZiBUeXBlXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1lcmdlPE9iamVjdDEsIE9iamVjdDI+ID0gUHJldHRpZnk8T21pdDxPYmplY3QxLCBrZXlvZiBPYmplY3QyPiAmIE9iamVjdDI+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2Utbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVyZ2UgfSBmcm9tIFwiLi4vbWVyZ2VcIjtcblxudHlwZSBfTWVyZ2VOPFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFJlc3VsdD4gPSBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IF9NZXJnZU48VGFpbCwgTWVyZ2U8UmVzdWx0LCBIZWFkPj5cbiAgOiBSZXN1bHQ7XG5cbmV4cG9ydCB0eXBlIE1lcmdlTjxUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IF9NZXJnZU48VHVwbGUsIHt9PjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV3YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOZXdhYmxlPFJldHVyblR5cGU+IHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFJldHVyblR5cGU7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLW5ldmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25OZXZlcjxUeXBlIGV4dGVuZHMge30+ID0gUGljazxcbiAgVHlwZSxcbiAgeyBbS2V5IGluIGtleW9mIFR5cGVdOiBUeXBlW0tleV0gZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogS2V5IH1ba2V5b2YgVHlwZV1cbj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb21pdC1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPbWl0UHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7IFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IG5ldmVyIDogS2V5XTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3BhcXVlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFN0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBuZXZlciA6IFR5cGUpIDogbmV2ZXI7XG5cbmRlY2xhcmUgY29uc3QgX19PUEFRVUVfVFlQRV9fOiB1bmlxdWUgc3ltYm9sO1xuXG5leHBvcnQgdHlwZSBXaXRoT3BhcXVlPFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgW19fT1BBUVVFX1RZUEVfX106IFRva2VuO1xufTtcblxuZXhwb3J0IHR5cGUgT3BhcXVlPFR5cGUsIFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IFRva2VuIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbDxUb2tlbj4gPyBUeXBlICYgV2l0aE9wYXF1ZTxUb2tlbj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aC12YWx1ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gVE9ETzogbWVyZ2UgdG8gRXh0cmFjdEZyb21BcnJheVxudHlwZSBFeHRyYWN0RnJvbU9iamVjdDxPYmogZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+LCBLZXk+ID0gS2V5IGV4dGVuZHMga2V5b2YgT2JqXG4gID8gT2JqW0tleV1cbiAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTxPYmo+XG4gID8gTm9uTnVsbGFibGU8T2JqPltLZXldIHwgdW5kZWZpbmVkXG4gIDogdW5kZWZpbmVkO1xuXG4vLyBUT0RPOiBtZXJnZSB0byBFeHRyYWN0RnJvbU9iamVjdFxudHlwZSBFeHRyYWN0RnJvbUFycmF5PEFyciBleHRlbmRzIHJlYWRvbmx5IGFueVtdLCBLZXk+ID0gYW55W10gZXh0ZW5kcyBBcnJcbiAgPyBBcnIgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgVClbXVxuICAgID8gVCB8IHVuZGVmaW5lZFxuICAgIDogdW5kZWZpbmVkXG4gIDogS2V5IGV4dGVuZHMga2V5b2YgQXJyXG4gID8gQXJyW0tleV1cbiAgOiB1bmRlZmluZWQ7XG5cbnR5cGUgR2V0V2l0aEFycmF5PFR5cGUsIFBhdGgsIFByZXR0aWZpZWRUeXBlID0gUHJldHRpZnk8VHlwZT4+ID0gUGF0aCBleHRlbmRzIFtdXG4gID8gVHlwZVxuICA6IFBhdGggZXh0ZW5kcyBbaW5mZXIgS2V5LCAuLi5pbmZlciBSZXN0XVxuICA/IFByZXR0aWZpZWRUeXBlIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPlxuICAgID8gR2V0V2l0aEFycmF5PEV4dHJhY3RGcm9tT2JqZWN0PFByZXR0aWZpZWRUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdXG4gICAgPyBHZXRXaXRoQXJyYXk8RXh0cmFjdEZyb21BcnJheTxUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogdW5kZWZpbmVkXG4gIDogbmV2ZXI7XG5cbnR5cGUgUGF0aDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBLZXl9LiR7aW5mZXIgUmVzdH1gXG4gID8gW0tleSwgLi4uUGF0aDxSZXN0Pl1cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgS2V5fWBcbiAgPyBbS2V5XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBQYXRoVmFsdWU8VHlwZSwgU3RyaW5nUGF0aD4gPSBHZXRXaXRoQXJyYXk8VHlwZSwgUGF0aDxTdHJpbmdQYXRoPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzTmV2ZXIgfSBmcm9tIFwiLi4vaXMtbmV2ZXJcIjtcbmltcG9ydCB7IENyZWF0ZVR5cGVPcHRpb25zIH0gZnJvbSBcIi4uL2NyZWF0ZS10eXBlLW9wdGlvbnNcIjtcbmltcG9ydCB7IFZhbHVlT2YgfSBmcm9tIFwiLi4vdmFsdWUtb2ZcIjtcbmltcG9ydCB7IEhhc1BhcnNhYmxlUGF0aCB9IGZyb20gXCIuLi9oYXMtcGFyc2FibGUtcGF0aFwiO1xuXG50eXBlIFBhdGhhYmxlID0gc3RyaW5nIHwgbnVtYmVyO1xuXG50eXBlIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnMgPSB7XG4gIGRlcHRoOiBbXTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGRlcHRoIFRoaXMgb3B0aW9uIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpblxuICogYFJlY3Vyc2l2ZVBhdGhzT3B0aW9uc1snZGVwdGgnXVsnbGVuZ3RoJ11gLiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGhcbiAqIGBQYXRoc09wdGlvbnNbJ2RlcHRoJ11gXG4gKi9cbnR5cGUgUmVjdXJzaXZlUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogYW55W107XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBCeSBkZWZhdWx0LCB0aGUgZGVwdGggb3B0aW9uIGlzIHNldCB0byA3LiBJdCBzaG91bGQgY292ZXIgdGhlXG4gKiBtYWpvcml0eSBvZiB1c2UgY2FzZXMuIElmIGJ5IGFueSBjaGFuY2UgaXQgZG9lc24ndCBmaXQgeW91LCBmZWVsIGZyZWUgdG9cbiAqIGluY3JlYXNlIHRoZSB2YWx1ZS4gSG93ZXZlciwgdGhpcyBtYXkgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiBnZXR0aW5nXG4gKiBgVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlYCBlcnJvci5cbiAqXG4gKiBAcGFyYW0gYW55QXJyYXlJbmRleEFjY2Vzc29yIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gd2lsZGNhcmQgYWNjZXNzIHRvXG4gKiBhcnJheSBpbmRpY2VzIC0gdXNhZ2UgbXVzdCBiZSBpbnRlbnRpb25hbGx5IGNvbmZpZ3VyZWQuXG4gKi9cbnR5cGUgRGVmYXVsdFBhdGhzT3B0aW9ucyA9IHtcbiAgZGVwdGg6IDc7XG4gIGFueUFycmF5SW5kZXhBY2Nlc3NvcjogYCR7bnVtYmVyfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBUaGlzIG9wdGlvbiByZXN0cmljdHMgdGhlIGRlcHRoIG9mIHRoZSBwYXRocyBsb29rdXAgYW5kIHJlbW92ZXMgYFR5cGVcbiAqIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGVgIGVycm9ycyBmb3JcbiAqIHBvdGVudGlhbGx5IGluZmluaXRlIHR5cGVzLlxuICpcbiAqIEBwYXJhbSBhbnlBcnJheUluZGV4QWNjZXNzb3IgVGhpcyB3aWxkY2FyZCB3aWxsIHNhdGlzZnkgYW55IGFycmF5IGluZGV4IGlmIGRlZmluZWQuXG4gKi9cbnR5cGUgUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogbnVtYmVyO1xuICBhbnlBcnJheUluZGV4QWNjZXNzb3I6IHN0cmluZztcbn07XG5cbnR5cGUgQXBwZW5kPFR1cGxlIGV4dGVuZHMgYW55W10+ID0gWy4uLlR1cGxlLCAwXTtcblxudHlwZSBSZWN1cnNpdmVQYXRoczxcbiAgVHlwZSxcbiAgVXNlck9wdGlvbnMgZXh0ZW5kcyBSZXF1aXJlZDxQYXRoc09wdGlvbnM+LFxuICBDYWxsT3B0aW9ucyBleHRlbmRzIFJlY3Vyc2l2ZVBhdGhzT3B0aW9ucyxcbj4gPSBJc05ldmVyPGtleW9mIFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IG5ldmVyXG4gIDogLy8gYE5vbk51bGxhYmxlYCByZW1vdmVzIGB1bmRlZmluZWRgIHdoZW4gcGFydGlhbCBwcm9wZXJ0aWVzIGV4aXN0IGluIG9iamVjdFxuICAgIE5vbk51bGxhYmxlPFxuICAgICAgVmFsdWVPZjx7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgP1xuICAgICAgICAgICAgICB8IGAke0FueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSwgVXNlck9wdGlvbnM+fWBcbiAgICAgICAgICAgICAgfCAoQ2FsbE9wdGlvbnNbXCJkZXB0aFwiXVtcImxlbmd0aFwiXSBleHRlbmRzIFVzZXJPcHRpb25zW1wiZGVwdGhcIl1cbiAgICAgICAgICAgICAgICAgID8gLy8gU3RvcCBhdCB0aGUgY29uZmlndXJlZCBkZXB0aFxuICAgICAgICAgICAgICAgICAgICBuZXZlclxuICAgICAgICAgICAgICAgICAgOiBUeXBlW0tleV0gZXh0ZW5kcyBpbmZlciBWYWx1ZVxuICAgICAgICAgICAgICAgICAgPyBWYWx1ZSBleHRlbmRzIFZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gLy8gQXZvaWQgY2FsbGluZyBgVW5zYWZlUGF0aHNgIHRvIGtlZXAgYENhbGxPcHRpb25zYCBsb2NhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgSGFzUGFyc2FibGVQYXRoPFZhbHVlPiBleHRlbmRzIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICA/IFJlY3Vyc2l2ZVBhdGhzPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogQXBwZW5kPENhbGxPcHRpb25zW1wiZGVwdGhcIl0+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+IGV4dGVuZHMgaW5mZXIgUmVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBJc05ldmVyPFJlc3Q+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogUmVzdCBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7QW55QXJyYXlJbmRleEFjY2Vzc29yT3JLZXk8S2V5LCBVc2VyT3B0aW9ucz59LiR7UmVzdH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICA6IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgIDogbmV2ZXIpXG4gICAgICAgICAgOiBuZXZlcjtcbiAgICAgIH0+XG4gICAgPjtcblxudHlwZSBVbnNhZmVQYXRoczxUeXBlLCBPcHRpb25zIGV4dGVuZHMgUmVxdWlyZWQ8UGF0aHNPcHRpb25zPj4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIHRydWVcbiAgICA/IFJlY3Vyc2l2ZVBhdGhzPFR5cGUsIE9wdGlvbnMsIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnM+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIEFueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSBleHRlbmRzIFBhdGhhYmxlLCBVc2VyT3B0aW9ucyBleHRlbmRzIFJlcXVpcmVkPFBhdGhzT3B0aW9ucz4+ID0gS2V5IGV4dGVuZHMgbnVtYmVyXG4gID8gS2V5IHwgVXNlck9wdGlvbnNbXCJhbnlBcnJheUluZGV4QWNjZXNzb3JcIl1cbiAgOiBLZXk7XG5cbmV4cG9ydCB0eXBlIFBhdGhzPFR5cGUsIE92ZXJyaWRlUGF0aE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBhdGhzT3B0aW9ucz4gPSB7fT4gPSBVbnNhZmVQYXRoczxcbiAgVHlwZSxcbiAgQ3JlYXRlVHlwZU9wdGlvbnM8UGF0aHNPcHRpb25zLCBPdmVycmlkZVBhdGhPcHRpb25zLCBEZWZhdWx0UGF0aHNPcHRpb25zPlxuPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQaWNrUHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IEtleSA6IG5ldmVyXTogVHlwZVtLZXldO1xufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJldHRpZnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFByZXR0aWZ5PFR5cGU+ID0gVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gID8gVHlwZVxuICA6IEV4dHJhY3Q8XG4gICAgICB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IFR5cGVbS2V5XTtcbiAgICAgIH0sXG4gICAgICBUeXBlXG4gICAgPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2FmZS1kaWN0aW9uYXJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXlvZkJhc2UgfSBmcm9tIFwiLi4va2V5LW9mLWJhc2VcIjtcblxuZXhwb3J0IHR5cGUgU2FmZURpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c10/OiBUeXBlIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdW5pb24tdG8taW50ZXJzZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9IChVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6IFVuaW9uKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIEludGVyc2VjdGlvbixcbikgPT4gdm9pZFxuICA/IEludGVyc2VjdGlvblxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdmFsdWUtb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55RnVuY3Rpb24gfSBmcm9tIFwiLi4vYW55LWZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiLi4vcHJpbWl0aXZlXCI7XG5cbmV4cG9ydCB0eXBlIFZhbHVlT2Y8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlBcnJheVxuICA/IFR5cGVbbnVtYmVyXVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlGdW5jdGlvblxuICA/IFJldHVyblR5cGU8VHlwZT5cbiAgOiBUeXBlW2tleW9mIFR5cGVdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIveG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gV2hlbiBUeXBlMiBpcyB1bmtub3duLCBpdCBjcmVhdGVzIHR5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBleGNsdWRlZCBmcm9tIGl0XG4vLyBlLmcuIFdpdGhvdXQ8eyBmb286IG51bWJlcjsgYmFyOiBudW1iZXIgfSwgdW5rbm93bj4gaXMgeyBmb28/OiBuZXZlcjsgYmFyPzogbmV2ZXIgfVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RzLWVzc2VudGlhbHMvdHMtZXNzZW50aWFscy9pc3N1ZXMvNDAwXG5cbnR5cGUgV2l0aG91dDxUeXBlMSwgVHlwZTI+ID0gSXNVbmtub3duPFR5cGUyPiBleHRlbmRzIHRydWVcbiAgPyBuZXZlclxuICA6IHsgW1AgaW4gRXhjbHVkZTxrZXlvZiBUeXBlMSwga2V5b2YgVHlwZTI+XT86IG5ldmVyIH07XG5cbi8vIFRoaXMgdXRpbGl0eSB0eXBlIGJvZHkgaXMgYXV0b2dlbmVyYXRlZCBpbiBKUyBieSBydW5uaW5nOlxuLy8gY29uc3QgdHlwZXMgPSBBcnJheSg1MCkuZmlsbCgwKS5tYXAoKF8sIGluZGV4KSA9PiBgVHlwZSR7aW5kZXggKyAxfWApXG4vLyB0eXBlcy5tYXAodHlwZSA9PiBgV2l0aG91dDwke3R5cGVzLmZpbHRlcih0ID0+IHQgIT09IHR5cGUpLmpvaW4oJyYnKX0sICR7dHlwZX0+ICYgJHt0eXBlfWApLmpvaW4oJ3wnKVxuZXhwb3J0IHR5cGUgWE9SPFxuICBUeXBlMSxcbiAgVHlwZTIsXG4gIFR5cGUzID0gdW5rbm93bixcbiAgVHlwZTQgPSB1bmtub3duLFxuICBUeXBlNSA9IHVua25vd24sXG4gIFR5cGU2ID0gdW5rbm93bixcbiAgVHlwZTcgPSB1bmtub3duLFxuICBUeXBlOCA9IHVua25vd24sXG4gIFR5cGU5ID0gdW5rbm93bixcbiAgVHlwZTEwID0gdW5rbm93bixcbiAgVHlwZTExID0gdW5rbm93bixcbiAgVHlwZTEyID0gdW5rbm93bixcbiAgVHlwZTEzID0gdW5rbm93bixcbiAgVHlwZTE0ID0gdW5rbm93bixcbiAgVHlwZTE1ID0gdW5rbm93bixcbiAgVHlwZTE2ID0gdW5rbm93bixcbiAgVHlwZTE3ID0gdW5rbm93bixcbiAgVHlwZTE4ID0gdW5rbm93bixcbiAgVHlwZTE5ID0gdW5rbm93bixcbiAgVHlwZTIwID0gdW5rbm93bixcbiAgVHlwZTIxID0gdW5rbm93bixcbiAgVHlwZTIyID0gdW5rbm93bixcbiAgVHlwZTIzID0gdW5rbm93bixcbiAgVHlwZTI0ID0gdW5rbm93bixcbiAgVHlwZTI1ID0gdW5rbm93bixcbiAgVHlwZTI2ID0gdW5rbm93bixcbiAgVHlwZTI3ID0gdW5rbm93bixcbiAgVHlwZTI4ID0gdW5rbm93bixcbiAgVHlwZTI5ID0gdW5rbm93bixcbiAgVHlwZTMwID0gdW5rbm93bixcbiAgVHlwZTMxID0gdW5rbm93bixcbiAgVHlwZTMyID0gdW5rbm93bixcbiAgVHlwZTMzID0gdW5rbm93bixcbiAgVHlwZTM0ID0gdW5rbm93bixcbiAgVHlwZTM1ID0gdW5rbm93bixcbiAgVHlwZTM2ID0gdW5rbm93bixcbiAgVHlwZTM3ID0gdW5rbm93bixcbiAgVHlwZTM4ID0gdW5rbm93bixcbiAgVHlwZTM5ID0gdW5rbm93bixcbiAgVHlwZTQwID0gdW5rbm93bixcbiAgVHlwZTQxID0gdW5rbm93bixcbiAgVHlwZTQyID0gdW5rbm93bixcbiAgVHlwZTQzID0gdW5rbm93bixcbiAgVHlwZTQ0ID0gdW5rbm93bixcbiAgVHlwZTQ1ID0gdW5rbm93bixcbiAgVHlwZTQ2ID0gdW5rbm93bixcbiAgVHlwZTQ3ID0gdW5rbm93bixcbiAgVHlwZTQ4ID0gdW5rbm93bixcbiAgVHlwZTQ5ID0gdW5rbm93bixcbiAgVHlwZTUwID0gdW5rbm93bixcbj4gPSBQcmV0dGlmeTxcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMVxuICAgID4gJlxuICAgICAgVHlwZTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTJcbiAgICA+ICZcbiAgICAgIFR5cGUyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzXG4gICAgPiAmXG4gICAgICBUeXBlMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNFxuICAgID4gJlxuICAgICAgVHlwZTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTVcbiAgICA+ICZcbiAgICAgIFR5cGU1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU2XG4gICAgPiAmXG4gICAgICBUeXBlNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlN1xuICAgID4gJlxuICAgICAgVHlwZTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZThcbiAgICA+ICZcbiAgICAgIFR5cGU4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU5XG4gICAgPiAmXG4gICAgICBUeXBlOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxMFxuICAgID4gJlxuICAgICAgVHlwZTEwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTExXG4gICAgPiAmXG4gICAgICBUeXBlMTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTJcbiAgICA+ICZcbiAgICAgIFR5cGUxMilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxM1xuICAgID4gJlxuICAgICAgVHlwZTEzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE0XG4gICAgPiAmXG4gICAgICBUeXBlMTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTVcbiAgICA+ICZcbiAgICAgIFR5cGUxNSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxNlxuICAgID4gJlxuICAgICAgVHlwZTE2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE3XG4gICAgPiAmXG4gICAgICBUeXBlMTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMThcbiAgICA+ICZcbiAgICAgIFR5cGUxOClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxOVxuICAgID4gJlxuICAgICAgVHlwZTE5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIwXG4gICAgPiAmXG4gICAgICBUeXBlMjApXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjFcbiAgICA+ICZcbiAgICAgIFR5cGUyMSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyMlxuICAgID4gJlxuICAgICAgVHlwZTIyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIzXG4gICAgPiAmXG4gICAgICBUeXBlMjMpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjRcbiAgICA+ICZcbiAgICAgIFR5cGUyNClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyNVxuICAgID4gJlxuICAgICAgVHlwZTI1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI2XG4gICAgPiAmXG4gICAgICBUeXBlMjYpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjdcbiAgICA+ICZcbiAgICAgIFR5cGUyNylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyOFxuICAgID4gJlxuICAgICAgVHlwZTI4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI5XG4gICAgPiAmXG4gICAgICBUeXBlMjkpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzBcbiAgICA+ICZcbiAgICAgIFR5cGUzMClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzMVxuICAgID4gJlxuICAgICAgVHlwZTMxKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTMyXG4gICAgPiAmXG4gICAgICBUeXBlMzIpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzNcbiAgICA+ICZcbiAgICAgIFR5cGUzMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzNFxuICAgID4gJlxuICAgICAgVHlwZTM0KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM1XG4gICAgPiAmXG4gICAgICBUeXBlMzUpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzZcbiAgICA+ICZcbiAgICAgIFR5cGUzNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzN1xuICAgID4gJlxuICAgICAgVHlwZTM3KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM4XG4gICAgPiAmXG4gICAgICBUeXBlMzgpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzlcbiAgICA+ICZcbiAgICAgIFR5cGUzOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0MFxuICAgID4gJlxuICAgICAgVHlwZTQwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQxXG4gICAgPiAmXG4gICAgICBUeXBlNDEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDJcbiAgICA+ICZcbiAgICAgIFR5cGU0MilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0M1xuICAgID4gJlxuICAgICAgVHlwZTQzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ0XG4gICAgPiAmXG4gICAgICBUeXBlNDQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDVcbiAgICA+ICZcbiAgICAgIFR5cGU0NSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0NlxuICAgID4gJlxuICAgICAgVHlwZTQ2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ3XG4gICAgPiAmXG4gICAgICBUeXBlNDcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDhcbiAgICA+ICZcbiAgICAgIFR5cGU0OClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0OVxuICAgID4gJlxuICAgICAgVHlwZTQ5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5LFxuICAgICAgVHlwZTUwXG4gICAgPiAmXG4gICAgICBUeXBlNTApXG4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1vcHRpb25hbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1hcmtPcHRpb25hbDxUeXBlLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IFByZXR0aWZ5PFBhcnRpYWw8VHlwZT4gJiBSZXF1aXJlZDxPbWl0PFR5cGUsIEtleXMgfCBPcHRpb25hbEtleXM8VHlwZT4+Pj5cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSBcIi4uL3dyaXRhYmxlXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrUmVhZG9ubHk8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgS2V5cyB8IFJlYWRvbmx5S2V5czxUeXBlICYgb2JqZWN0Pj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuZXhwb3J0IHR5cGUgTWFya1JlcXVpcmVkPFR5cGUsIEtleXMgZXh0ZW5kcyBrZXlvZiBUeXBlPiA9IFR5cGUgZXh0ZW5kcyBUeXBlXG4gID8gUHJldHRpZnk8VHlwZSAmIFJlcXVpcmVkPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwiLi4vd3JpdGFibGVcIjtcbmltcG9ydCB7IFdyaXRhYmxlS2V5cyB9IGZyb20gXCIuLi93cml0YWJsZS1rZXlzXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrV3JpdGFibGU8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBXcml0YWJsZUtleXM8VHlwZSAmIG9iamVjdD4gfCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbGRhYmxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWVwUGFydGlhbCB9IGZyb20gXCIuLi9kZWVwLXBhcnRpYWxcIjtcbmltcG9ydCB7IERlZXBXcml0YWJsZSB9IGZyb20gXCIuLi9kZWVwLXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIEJ1aWxkYWJsZTxUeXBlPiA9IERlZXBQYXJ0aWFsPERlZXBXcml0YWJsZTxUeXBlPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLW9wdGlvbmFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtPcHRpb25hbCB9IGZyb20gXCIuLi9tYXJrLW9wdGlvbmFsXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWxTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtPcHRpb25hbDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8UmVjdXJzaXZlRGVlcE1hcmtPcHRpb25hbFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya09wdGlvbmFsPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLXJlcXVpcmVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtSZXF1aXJlZCB9IGZyb20gXCIuLi9tYXJrLXJlcXVpcmVkXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWRTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtSZXF1aXJlZDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8UmVjdXJzaXZlRGVlcE1hcmtSZXF1aXJlZFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya1JlcXVpcmVkPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1ub24tbnVsbGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWx0aW4gfSBmcm9tIFwiLi4vYnVpbHQtaW5cIjtcblxuZXhwb3J0IHR5cGUgRGVlcE5vbk51bGxhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBOb25OdWxsYWJsZTxUeXBlPlxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IE1hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seU1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcE5vbk51bGxhYmxlPEtleXM+LCBEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlcz5cbiAgPyBQcm9taXNlPERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcE5vbk51bGxhYmxlPFR5cGVbS2V5XT4gfVxuICA6IE5vbk51bGxhYmxlPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1udWxsYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwTnVsbGFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCBudWxsXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwTnVsbGFibGU8S2V5cz4sIERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrTWFwIGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPEtleXM+IGV4dGVuZHMgb2JqZWN0XG4gICAgPyBXZWFrTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrU2V0IGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPFZhbHVlcz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtTZXQ8RGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBUeXBlIGV4dGVuZHMgSXNUdXBsZTxUeXBlPlxuICAgID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB8IG51bGwgfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICAgIDogUmVhZG9ubHlBcnJheTxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBWYWx1ZT5cbiAgPyBQcm9taXNlPERlZXBOdWxsYWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB9XG4gIDogVHlwZSB8IG51bGw7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1vbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwT21pdDxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcE9taXQ8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyXG4gICAgICAgID8gRmlsdGVyW0tleV0gZXh0ZW5kcyB0cnVlXG4gICAgICAgICAgPyBuZXZlclxuICAgICAgICAgIDogS2V5XG4gICAgICAgIDogS2V5XTogS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gRGVlcE9taXQ8VHlwZVtLZXldLCBGaWx0ZXJbS2V5XT4gOiBUeXBlW0tleV07XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1wYXJ0aWFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFeGNsdWRlPEJ1aWx0aW4sIEVycm9yPlxuICA/IFR5cGVcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFBhcnRpYWw8S2V5cz4sIERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxpbmZlciBWYWx1ZXM+XG4gID8gVHlwZSBleHRlbmRzIElzVHVwbGU8VHlwZT5cbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXT86IERlZXBQYXJ0aWFsPFR5cGVbS2V5XT4gfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUGFydGlhbDxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdPzogRGVlcFBhcnRpYWw8VHlwZVtLZXldPiB9XG4gIDogSXNVbmtub3duPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IHVua25vd25cbiAgOiBQYXJ0aWFsPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1waWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGljazxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcFBpY2s8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICAvLyBpdGVyYXRlIG92ZXIga2V5cyBvZiBUeXBlLCB3aGljaCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQga2V5czogb3B0aW9uYWwsIHJlcXVpcmVkIG9yIHJlYWRvbmx5XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gS2V5IDogbmV2ZXJdOiBGaWx0ZXJbS2V5ICYga2V5b2YgRmlsdGVyXSBleHRlbmRzIHRydWVcbiAgICAgICAgPyBUeXBlW0tleV1cbiAgICAgICAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBGaWx0ZXJcbiAgICAgICAgPyBEZWVwUGljazxUeXBlW0tleV0sIEZpbHRlcltLZXldPlxuICAgICAgICA6IG5ldmVyO1xuICAgIH1cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5pbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUmVhZG9ubHk8VHlwZT4gPSBUeXBlIGV4dGVuZHMgRXhjbHVkZTxCdWlsdGluLCBFcnJvcj5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBSZWFkb25seTxLZXlzPiwgRGVlcFJlYWRvbmx5PFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFdlYWtNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlPlxuICA/IFByb21pc2U8RGVlcFJlYWRvbmx5PFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgQW55QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IElzTmV2ZXI8SXNUdXBsZTxUeXBlPj4gZXh0ZW5kcyBmYWxzZVxuICAgID8geyByZWFkb25seSBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwUmVhZG9ubHk8VHlwZVtLZXldPiB9XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFJlYWRvbmx5PFR5cGVbS2V5XT4gfVxuICA6IElzVW5rbm93bjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyB1bmtub3duXG4gIDogUmVhZG9ubHk8VHlwZT47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHR5cGUgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBSZXF1aXJlZDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFcnJvclxuICA/IFJlcXVpcmVkPFR5cGU+XG4gIDogVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUmVxdWlyZWQ8S2V5cz4sIERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUmVxdWlyZWQ8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBJc05ldmVyPElzVHVwbGU8VHlwZT4+IGV4dGVuZHMgZmFsc2VcbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXS0/OiBEZWVwUmVxdWlyZWQ8VHlwZVtLZXldPiB9XG4gICAgOiBUeXBlIGV4dGVuZHMgQXJyYXk8VmFsdWVzPlxuICAgID8gQXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgOiBUeXBlIGV4dGVuZHMge31cbiAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV0tPzogRGVlcFJlcXVpcmVkPFR5cGVbS2V5XT4gfVxuICA6IFJlcXVpcmVkPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC11bmRlZmluYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwVW5kZWZpbmFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCB1bmRlZmluZWRcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBVbmRlZmluYWJsZTxLZXlzPiwgRGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtNYXAga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8S2V5cz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBVbmRlZmluYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtTZXQga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPiBleHRlbmRzIG9iamVjdFxuICAgID8gV2Vha1NldDxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IFR5cGUgZXh0ZW5kcyBJc1R1cGxlPFR5cGU+XG4gICAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBVbmRlZmluYWJsZTxUeXBlW0tleV0+IHwgdW5kZWZpbmVkIH1cbiAgICA6IFR5cGUgZXh0ZW5kcyBBcnJheTxWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwVW5kZWZpbmFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFVuZGVmaW5hYmxlPFR5cGVbS2V5XT4gfVxuICA6IFR5cGUgfCB1bmRlZmluZWQ7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNVbmtub3duIH0gZnJvbSBcIi4uL2lzLXVua25vd25cIjtcblxuZXhwb3J0IHR5cGUgRGVlcFdyaXRhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEV4Y2x1ZGU8QnVpbHRpbiwgRXJyb3I+XG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5LCBpbmZlciBWYWx1ZT5cbiAgPyBNYXA8RGVlcFdyaXRhYmxlPEtleT4sIERlZXBXcml0YWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gTWFwPERlZXBXcml0YWJsZTxLZXk+LCBEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gV2Vha01hcDxEZWVwV3JpdGFibGU8S2V5PiwgRGVlcFdyaXRhYmxlPFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgLXJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBXcml0YWJsZTxUeXBlW0tleV0+IH1cbiAgOiBJc1Vua25vd248VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gdW5rbm93blxuICA6IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtb21pdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcE9taXQgfSBmcm9tIFwiLi4vZGVlcC1vbWl0XCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBPbWl0PFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcE9taXQ8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtcGljay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcFBpY2sgfSBmcm9tIFwiLi4vZGVlcC1waWNrXCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBQaWNrPFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcFBpY2s8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3B0aW9uYWwta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgT3B0aW9uYWxLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IGtleW9mIHtcbiAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlIGV4dGVuZHMgUmVxdWlyZWQ8UGljazxUeXBlLCBLZXk+PiA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1rZXlzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaWNrUHJvcGVydGllcyB9IGZyb20gXCIuLi9waWNrLXByb3BlcnRpZXNcIjtcblxuZXhwb3J0IHR5cGUgUGlja0tleXM8VHlwZSwgVmFsdWU+ID0ga2V5b2YgUGlja1Byb3BlcnRpZXM8VHlwZSwgVmFsdWU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHkta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNGdWxseVdyaXRhYmxlIH0gZnJvbSBcIi4uL2lzLWZ1bGx5LXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFJlYWRvbmx5S2V5czxUeXBlIGV4dGVuZHMgb2JqZWN0PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duXG4gID8ga2V5b2Yge1xuICAgICAgW0tleSBpbiBrZXlvZiBUeXBlIGFzIElzRnVsbHlXcml0YWJsZTxQaWNrPFR5cGUsIEtleT4+IGV4dGVuZHMgdHJ1ZSA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVxdWlyZWQta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIE9wdGlvbmFsS2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcblxuZXhwb3J0IHR5cGUgV3JpdGFibGVLZXlzPFR5cGUgZXh0ZW5kcyBvYmplY3Q+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIFJlYWRvbmx5S2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXhhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueVJlY29yZCB9IGZyb20gXCIuLi9hbnktcmVjb3JkXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5cbnR5cGUgSXNVbmlvbjxUVW5pb24+ID0gVW5pb25Ub1R1cGxlPFRVbmlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAxID8gZmFsc2UgOiB0cnVlO1xuXG50eXBlIFVuaW9uVG9GdW5jdGlvbkluc2VydGlvbjxUVW5pb24+ID0gKFRVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6ICgpID0+IFRVbmlvbikgPT4gYW55IDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIFRQYXJhbSxcbikgPT4gYW55XG4gID8gVFBhcmFtXG4gIDogbmV2ZXI7XG5cbi8vIE5PVEU6IFdoZW4gcmVwbGFjaW5nIHRoZSB1dGlsaXR5IHR5cGUgd2l0aCBgVW5pb25Ub1R1cGxlYCBmcm9tIGAuLi91bmlvbi10by10dXBsZWAsXG4vLyBgaXNCQyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgaXNCQ2AgYWxsb3dzIGBCQyB8IHtyZWFkb25seSBiOiAyO3JlYWRvbmx5IGM6IDM7fWAgYXMgcGFyYW1ldGVyPz8/XG50eXBlIFVuaW9uVG9UdXBsZTxUVW5pb24+ID0gVW5pb25Ub0Z1bmN0aW9uSW5zZXJ0aW9uPFRVbmlvbj4gZXh0ZW5kcyAoKSA9PiBpbmZlciBUUmV0dXJuVHlwZVxuICA/IFsuLi5VbmlvblRvVHVwbGU8RXhjbHVkZTxUVW5pb24sIFRSZXR1cm5UeXBlPj4sIFRSZXR1cm5UeXBlXVxuICA6IFtdO1xuXG50eXBlIEV4YWN0VW5pb25MZW5ndGg8VFZhbHVlLCBUU2hhcGU+ID0gVW5pb25Ub1R1cGxlPFRWYWx1ZT5bXCJsZW5ndGhcIl0gZXh0ZW5kcyBVbmlvblRvVHVwbGU8VFNoYXBlPltcImxlbmd0aFwiXVxuICA/IHRydWVcbiAgOiBmYWxzZTtcblxuLy8gTk9URTogYFhPUmAgY2Fubm90IGJlIHVzZWQgYXMgaXQncyBvbmx5IGhhbmR5IHdpdGggb2JqZWN0cywgbm90IGJvb2xlYW5zXG50eXBlIEJvb2xlYW5Yb3I8VCwgVT4gPSBUIGV4dGVuZHMgdHJ1ZSA/IChVIGV4dGVuZHMgdHJ1ZSA/IHRydWUgOiBmYWxzZSkgOiBVIGV4dGVuZHMgZmFsc2UgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgQm9vbGVhbkFuZDxUVHVwbGU+ID0gVFR1cGxlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFJlc3RdXG4gID8gSGVhZCBleHRlbmRzIHRydWVcbiAgICA/IEJvb2xlYW5BbmQ8UmVzdD5cbiAgICA6IGZhbHNlXG4gIDogVFR1cGxlIGV4dGVuZHMgW11cbiAgPyB0cnVlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gQm9vbGVhbkFuZDxcbiAgW0lzTmV2ZXI8RXhjbHVkZTxrZXlvZiBUVmFsdWUsIGtleW9mIFRTaGFwZT4+LCBJc05ldmVyPEV4Y2x1ZGU8a2V5b2YgVFNoYXBlLCBrZXlvZiBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0VmFsdWVEaWZmPFRWYWx1ZSwgVFNoYXBlPiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVFZhbHVlXTogRXhjbHVkZTxUVmFsdWVbVEtleV0sIFRTaGFwZVtUS2V5ICYga2V5b2YgVFNoYXBlXT47XG59W2tleW9mIFRWYWx1ZV07XG5cbnR5cGUgT2JqZWN0VmFsdWVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBCb29sZWFuQW5kPFxuICBbSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFZhbHVlLCBUU2hhcGU+PiwgSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFNoYXBlLCBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbVFNoYXBlXVxuICA/IEJvb2xlYW5BbmQ8XG4gICAgICBbXG4gICAgICAgIEJvb2xlYW5Yb3I8SXNVbmlvbjxUVmFsdWU+LCBJc1VuaW9uPFRTaGFwZT4+LFxuICAgICAgICBFeGFjdFVuaW9uTGVuZ3RoPFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgICAgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+LFxuICAgICAgICBPYmplY3RWYWx1ZUV4YWN0PFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgIF1cbiAgICA+IGV4dGVuZHMgdHJ1ZVxuICAgID8gVFZhbHVlXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIElzQXJyYXk8VFZhbHVlPiA9IFtUVmFsdWVdIGV4dGVuZHMgW3JlYWRvbmx5IGFueVtdXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1JlYWRvbmx5PFRBcnJheT4gPSBSZWFkb25seTxUQXJyYXk+IGV4dGVuZHMgVEFycmF5ID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFNhbWVMZW5ndGg8VFZhbHVlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFRTaGFwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IElzTmV2ZXI8XG4gIFByaW1pdGl2ZUV4YWN0PFRWYWx1ZVtcImxlbmd0aFwiXSwgVFNoYXBlW1wibGVuZ3RoXCJdPlxuPiBleHRlbmRzIHRydWVcbiAgPyBmYWxzZVxuICA6IHRydWU7XG5cbnR5cGUgQXJyYXlFeGFjdDxUVmFsdWUgZXh0ZW5kcyByZWFkb25seSBhbnlbXSwgVFNoYXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10+ID0gQm9vbGVhbkFuZDxcbiAgW1xuICAgIC8vIGJvdGggYXJyYXlzXG4gICAgSXNBcnJheTxUVmFsdWU+LFxuICAgIElzQXJyYXk8VFNoYXBlPixcbiAgICAvLyBzYW1lIGxlbmd0aFxuICAgIFNhbWVMZW5ndGg8VFZhbHVlLCBUU2hhcGU+LFxuICAgIC8vIGJvdGggcmVhZG9ubHkgb3Igbm90XG4gICAgQm9vbGVhblhvcjxJc1JlYWRvbmx5PFRWYWx1ZT4sIElzUmVhZG9ubHk8VFNoYXBlPj4sXG4gIF1cbj4gZXh0ZW5kcyB0cnVlXG4gID8gW1RWYWx1ZSwgVFNoYXBlXSBleHRlbmRzIFtyZWFkb25seSAoaW5mZXIgVFZhbHVlRWxlbWVudClbXSwgcmVhZG9ubHkgKGluZmVyIFRTaGFwZUVsZW1lbnQpW11dXG4gICAgPyBFeGFjdDxUVmFsdWVFbGVtZW50LCBUU2hhcGVFbGVtZW50PiBleHRlbmRzIFRWYWx1ZUVsZW1lbnRcbiAgICAgID8gVFZhbHVlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBOT1RFOiBXaGVuIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoIGBBcmVOb25EaXN0cmlidXRpdmVFcXVhbDxUVmFsdWUsIFRTaGFwZT4gZXh0ZW5kcyB0cnVlID8gVFZhbHVlIDogbmV2ZXJgLFxuLy8gYGlzQkNvckJDMyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgYmNPckJjM2AgaXMgaW5mZXJyZWQgYXMgYEJDYD8/P1xudHlwZSBQcmltaXRpdmVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBbVFZhbHVlXSBleHRlbmRzIFtUU2hhcGVdID8gKFtUU2hhcGVdIGV4dGVuZHMgW1RWYWx1ZV0gPyBUVmFsdWUgOiBuZXZlcikgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gID8gW1RTaGFwZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gICAgPyBBcnJheUV4YWN0PFRWYWx1ZSwgVFNoYXBlPlxuICAgIDogbmV2ZXJcbiAgOiBbVFZhbHVlXSBleHRlbmRzIFtBbnlSZWNvcmRdXG4gID8gT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+XG4gIDogUHJpbWl0aXZlRXhhY3Q8VFZhbHVlLCBUU2hhcGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtYW55L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTkyNzUyMy9kaXNhbGxvdy1jYWxsLXdpdGgtYW55LzQ5OTI4MzYwIzQ5OTI4MzYwXG5leHBvcnQgdHlwZSBJc0FueTxUeXBlPiA9IDAgZXh0ZW5kcyAxICYgVHlwZSA/IHRydWUgOiBmYWxzZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtbmV2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzTmV2ZXI8VHlwZT4gPSBbVHlwZV0gZXh0ZW5kcyBbbmV2ZXJdID8gdHJ1ZSA6IGZhbHNlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdW5rbm93bi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNBbnkgfSBmcm9tIFwiLi4vaXMtYW55XCI7XG5cbmV4cG9ydCB0eXBlIElzVW5rbm93bjxUeXBlPiA9IElzQW55PFR5cGU+IGV4dGVuZHMgdHJ1ZSA/IGZhbHNlIDogdW5rbm93biBleHRlbmRzIFR5cGUgPyB0cnVlIDogZmFsc2U7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzVHVwbGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPyAoYW55W10gZXh0ZW5kcyBUeXBlID8gbmV2ZXIgOiBUeXBlKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LW9iamVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgTm9uRW1wdHlPYmplY3Q8T2JqZWN0IGV4dGVuZHMgQW55UmVjb3JkPiA9IGtleW9mIE9iamVjdCBleHRlbmRzIG5ldmVyID8gbmV2ZXIgOiBPYmplY3Q7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlBcnJheTxUeXBlID0gYW55PiA9IEFycmF5PFR5cGU+IHwgUmVhZG9ubHlBcnJheTxUeXBlPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBcnJheU9yU2luZ2xlPFR5cGU+ID0gVHlwZSB8IFR5cGVbXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZWxlbWVudC1vZi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRWxlbWVudE9mPFR5cGUgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgKGluZmVyIFZhbHVlcylbXSA/IFZhbHVlcyA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaGVhZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIEhlYWQ8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duID8gKFR5cGVbXCJsZW5ndGhcIl0gZXh0ZW5kcyAwID8gbmV2ZXIgOiBUeXBlWzBdKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFR5cGU+ID0gW1R5cGUsIC4uLlR5cGVbXV07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHktYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBSZWFkb25seUFycmF5T3JTaW5nbGU8VHlwZT4gPSBUeXBlIHwgcmVhZG9ubHkgVHlwZVtdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdGFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIFRhaWw8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyByZWFkb25seSBbXVxuICA/IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IFthbnk/LCAuLi5pbmZlciBSZXN0XVxuICA/IFJlc3RcbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFR1cGxlPFR5cGUgPSBhbnk+ID0gW1R5cGU/LCAuLi5UeXBlW11dO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvY2FtZWwtY2FzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsidHlwZSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBmYWxzZSA6IHRydWUpIDogZmFsc2U7XG5cbnR5cGUgV29yZEluQ2FtZWxDYXNlPFR5cGUsIFdvcmQgZXh0ZW5kcyBzdHJpbmcgPSBcIlwiPiA9IFR5cGUgZXh0ZW5kcyBgJHtXb3JkfSR7aW5mZXIgTmV4dENoYXJhY3Rlcn0ke2luZmVyIF99YFxuICA/IE5leHRDaGFyYWN0ZXIgZXh0ZW5kcyBDYXBpdGFsaXplPE5leHRDaGFyYWN0ZXI+XG4gICAgPyBXb3JkXG4gICAgOiBXb3JkSW5DYW1lbENhc2U8VHlwZSwgYCR7V29yZH0ke05leHRDaGFyYWN0ZXJ9YD5cbiAgOiBXb3JkO1xuXG50eXBlIFNlcGFyYXRvciA9IFwiX1wiIHwgXCItXCI7XG5cbnR5cGUgSW5jbHVkZXNTZXBhcmF0b3I8VHlwZT4gPSBUeXBlIGV4dGVuZHMgYCR7c3RyaW5nfSR7U2VwYXJhdG9yfSR7c3RyaW5nfWAgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNPbmVXb3JkPFR5cGU+ID0gVHlwZSBleHRlbmRzIExvd2VyY2FzZTxUeXBlICYgc3RyaW5nPlxuICA/IHRydWVcbiAgOiBUeXBlIGV4dGVuZHMgVXBwZXJjYXNlPFR5cGUgJiBzdHJpbmc+XG4gID8gdHJ1ZVxuICA6IGZhbHNlO1xuXG50eXBlIElzQ2FtZWxDYXNlPFR5cGU+ID0gVHlwZSBleHRlbmRzIFVuY2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Bhc2NhbENhc2U8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQ2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxuLyoqIHNuYWtlX2Nhc2UsIENPTlNUQU5UX0NBU0UsIGtlYmFiLWNhc2Ugb3IgQ09CT0wtQ0FTRSAqL1xudHlwZSBTZXBhcmF0b3JDYXNlUGFyc2VyPFxuICBUeXBlLFxuICBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10sXG4+ID0gVHlwZSBleHRlbmRzIGAke2luZmVyIFdvcmR9JHtTZXBhcmF0b3J9JHtpbmZlciBUYWlsfWBcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFRhaWwsIFsuLi5UdXBsZSwgTG93ZXJjYXNlPFdvcmQ+XT5cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgV29yZH1gXG4gID8gWy4uLlR1cGxlLCBMb3dlcmNhc2U8V29yZD5dXG4gIDogVHVwbGU7XG5cbnR5cGUgQ2FtZWxDYXNlUGFyc2VyPFR5cGUsIFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPSBbXT4gPSBUeXBlIGV4dGVuZHMgXCJcIlxuICA/IFR1cGxlXG4gIDogVHlwZSBleHRlbmRzIGAke1dvcmRJbkNhbWVsQ2FzZTxUeXBlPn0ke2luZmVyIFRhaWx9YFxuICA/IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBXb3JkfSR7VGFpbH1gXG4gICAgPyBDYW1lbENhc2VQYXJzZXI8VW5jYXBpdGFsaXplPFRhaWw+LCBbLi4uVHVwbGUsIExvd2VyY2FzZTxXb3JkPl0+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBDb252ZXJ0IGZpcnN0IGNoYXJhY3RlciBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIGxvd2VyY2FzZSBhbmQgcmV1c2UgQ2FtZWxDYXNlUGFyc2VyXG50eXBlIFBhc2NhbENhc2VQYXJzZXI8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gQ2FtZWxDYXNlUGFyc2VyPFVuY2FwaXRhbGl6ZTxUeXBlPj4gOiBuZXZlcjtcblxudHlwZSBTcGxpdEFueUNhc2U8VHlwZT4gPSBJbmNsdWRlc1NlcGFyYXRvcjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNPbmVXb3JkPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFtMb3dlcmNhc2U8VHlwZSAmIHN0cmluZz5dXG4gIDogSXNDYW1lbENhc2U8VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gQ2FtZWxDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNQYXNjYWxDYXNlPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFBhc2NhbENhc2VQYXJzZXI8VHlwZT5cbiAgOiBbXTtcblxudHlwZSBQYXNjYWxDYXBpdGFsaXplcjxUeXBlLCBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IEhlYWQgZXh0ZW5kcyBzdHJpbmdcbiAgICA/IFBhc2NhbENhcGl0YWxpemVyPFRhaWwsIFsuLi5UdXBsZSwgQ2FwaXRhbGl6ZTxIZWFkPl0+XG4gICAgOiBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBUdXBsZT5cbiAgOiBUdXBsZTtcblxudHlwZSBDYW1lbENhcGl0YWxpemVyPFR5cGU+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBGaXJzdCwgLi4uaW5mZXIgVGFpbF0gPyBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBbRmlyc3RdPiA6IFtdO1xuXG50eXBlIEpvaW48VHlwZSwgSm9pbmVkU3RyaW5nIGV4dGVuZHMgc3RyaW5nID0gXCJcIj4gPSBUeXBlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFRhaWxdXG4gID8gSGVhZCBleHRlbmRzIHN0cmluZ1xuICAgID8gSm9pbjxUYWlsLCBgJHtKb2luZWRTdHJpbmd9JHtIZWFkfWA+XG4gICAgOiBKb2luPFRhaWw+XG4gIDogSm9pbmVkU3RyaW5nO1xuXG5leHBvcnQgdHlwZSBDYW1lbENhc2U8VHlwZT4gPSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gZXh0ZW5kcyB0cnVlID8gSm9pbjxDYW1lbENhcGl0YWxpemVyPFNwbGl0QW55Q2FzZTxUeXBlPj4+IDogVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1jYW1lbC1jYXNlLXByb3BlcnRpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbWVsQ2FzZSB9IGZyb20gXCIuLi9jYW1lbC1jYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBDYW1lbENhc2VQcm9wZXJ0aWVzPFR5cGU+ID0gVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGUgYXMgQ2FtZWxDYXNlPEtleT5dOiBEZWVwQ2FtZWxDYXNlUHJvcGVydGllczxUeXBlW0tleV0+IH1cbiAgOiBUeXBlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlGdW5jdGlvbjxBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUmV0dXJuVHlwZSA9IGFueT4gPSAoLi4uYXJnczogQXJncykgPT4gUmV0dXJuVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmVkaWNhdGVGdW5jdGlvbiA9ICh4OiBhbnksIC4uLl96OiBhbnlbXSkgPT4geCBpcyBhbnk7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLXR5cGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZWRpY2F0ZUZ1bmN0aW9uIH0gZnJvbSBcIi4uL3ByZWRpY2F0ZS1mdW5jdGlvblwiO1xuXG5leHBvcnQgdHlwZSBQcmVkaWNhdGVUeXBlPFR5cGUgZXh0ZW5kcyBQcmVkaWNhdGVGdW5jdGlvbj4gPSBUeXBlIGV4dGVuZHMgKFxuICB0YXJnZXQ6IGFueSxcbiAgLi4ucmVzdDogYW55W11cbikgPT4gdGFyZ2V0IGlzIGluZmVyIE5hcnJvd2VkVHlwZVxuICA/IE5hcnJvd2VkVHlwZVxuICA6IG5ldmVyO1xuIl19","export class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${value}`);\n }\n}\n","export function assert(condition: any, message: string = \"no additional info provided\"): asserts condition {\n if (!condition) {\n throw new Error(\"Assertion Error: \" + message);\n }\n}\n","export const createFactoryWithConstraint =\n <Constraint>() =>\n <Value extends Constraint>(value: Value): Value =>\n value;\n","import { Exact } from \"../../exact\";\n\nexport const isExact =\n <ExpectedShape>() =>\n <ActualShape>(x: Exact<ActualShape, ExpectedShape>) =>\n x as ExpectedShape;\n","export function noop(..._args: unknown[]): void {}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXdhaXRlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgYnVpbHRpbiBgQXdhaXRlZGAgKi9cbmV4cG9ydCB0eXBlIEF3YWl0ZWQ8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVmFsdWU+ID8gVmFsdWUgOiBuZXZlcjtcbiJdfQ==","// Basic\n\nexport * from \"./primitive\";\nexport * from \"./built-in\";\nexport * from \"./key-of-base\";\nexport * from \"./strict-exclude\";\nexport * from \"./strict-extract\";\nexport * from \"./strict-omit\";\nexport * from \"./writable\";\n\n// Utility types\n\nexport * from \"./async-or-sync\";\nexport * from \"./async-or-sync-type\";\nexport * from \"./dictionary\";\nexport * from \"./dictionary-values\";\nexport * from \"./merge\";\nexport * from \"./merge-n\";\nexport * from \"./newable\";\nexport * from \"./non-never\";\nexport * from \"./omit-properties\";\nexport * from \"./opaque\";\nexport * from \"./path-value\";\nexport * from \"./paths\";\nexport * from \"./pick-properties\";\nexport * from \"./prettify\";\nexport * from \"./safe-dictionary\";\nexport * from \"./union-to-intersection\";\nexport * from \"./value-of\";\nexport * from \"./xor\";\n\n// Mark wrapper types\n\nexport * from \"./mark-optional\";\nexport * from \"./mark-readonly\";\nexport * from \"./mark-required\";\nexport * from \"./mark-writable\";\n\n// Deep wrapper types\n\nexport * from \"./buildable\";\nexport * from \"./deep-mark-optional\";\nexport * from \"./deep-mark-required\";\nexport * from \"./deep-non-nullable\";\nexport * from \"./deep-nullable\";\nexport * from \"./deep-omit\";\nexport * from \"./deep-partial\";\nexport * from \"./deep-pick\";\nexport * from \"./deep-readonly\";\nexport * from \"./deep-required\";\nexport * from \"./deep-undefinable\";\nexport * from \"./deep-writable\";\nexport * from \"./strict-deep-omit\";\nexport * from \"./strict-deep-pick\";\n\n// Key types\n\nexport * from \"./optional-keys\";\nexport * from \"./pick-keys\";\nexport * from \"./readonly-keys\";\nexport * from \"./required-keys\";\nexport * from \"./writable-keys\";\n\n// Type checkers\n\nexport * from \"./exact\";\nexport * from \"./is-any\";\nexport * from \"./is-never\";\nexport * from \"./is-unknown\";\nexport * from \"./is-tuple\";\nexport * from \"./non-empty-object\";\n\n// Arrays and Tuples\n\nexport * from \"./any-array\";\nexport * from \"./array-or-single\";\nexport * from \"./element-of\";\nexport * from \"./head\";\nexport * from \"./non-empty-array\";\nexport * from \"./readonly-array-or-single\";\nexport * from \"./tail\";\nexport * from \"./tuple\";\n\n// Change case\n\nexport * from \"./camel-case\";\nexport * from \"./deep-camel-case-properties\";\n\n// Function types\n\nexport * from \"./any-function\";\nexport * from \"./predicate-function\";\nexport * from \"./predicate-type\";\n\n// Utility functions\n\nexport * from \"./functions/unreachable-case-error\";\nexport * from \"./functions/assert\";\nexport * from \"./functions/create-factory-with-constraint\";\nexport * from \"./functions/is-exact\";\nexport * from \"./functions/noop\";\n\n// Build-in types\n\nexport * from \"./awaited\";\n","import { createContext, useContext, useMemo, useState } from 'react';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index';\nimport { QueryProvider } from './QueryProvider';\nimport { createCofheClient } from '@cofhe/sdk/web';\nimport { FnxFloatingButtonWithProvider } from '@/components/FnxFloatingButton/FnxFloatingButton';\nimport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\nimport { createCofheConfig } from '@/config';\nimport { chains } from '@cofhe/sdk/chains';\nimport { assert } from 'ts-essentials';\nimport type { FloatingButtonPosition } from '@/components/FnxFloatingButton/types';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider(props: CofheProviderProps) {\n const { children, queryClient, publicClient, walletClient } = props;\n\n const config = useMemo(() => {\n // priority: explicit config prop > config from provided client > create default config\n if (props.config) return props.config;\n if (props.cofheClient) {\n assert(config.environment === 'react', 'Provided cofheClient must have react config');\n return props.cofheClient.config;\n }\n return createCofheConfig({ supportedChains: Object.values(chains) });\n }, [props.config, props.cofheClient]);\n\n // use provided client or create a new one out of the config\n const cofheClient = useMemo(() => props.cofheClient ?? createCofheClient(config), [props.cofheClient, config]);\n\n // dynamic values\n const [position, setPosition] = useState<FloatingButtonPosition>(config.react.position);\n const [theme, setTheme] = useState(config.react.initialTheme);\n\n return (\n <CofheContext.Provider\n value={{\n client: cofheClient,\n state: {\n position,\n setPosition,\n theme,\n setTheme,\n },\n }}\n >\n <QueryProvider queryClient={queryClient}>\n <AutoConnect walletClient={walletClient} publicClient={publicClient} />\n <FnxFloatingButtonWithProvider>{children}</FnxFloatingButtonWithProvider>\n </QueryProvider>\n </CofheContext.Provider>\n );\n}\n\nfunction AutoConnect({ walletClient, publicClient }: Pick<CofheProviderProps, 'walletClient' | 'publicClient'>) {\n useCofheAutoConnect({ walletClient, publicClient });\n return null;\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import { QueryClient } from '@tanstack/react-query';\nimport { createContext, useContext, useMemo } from 'react';\n\n// Internal context to expose the QueryClient used by this module\nconst InternalQueryClientContext = createContext<QueryClient | null>(null);\n\nexport const useInternalQueryClient = (): QueryClient => {\n const qc = useContext(InternalQueryClientContext);\n if (!qc) throw new Error('QueryClient not available. Wrap with CofheProvider/QueryProvider.');\n return qc;\n};\n\nexport const QueryProvider = ({\n children,\n queryClient: overridingQueryClient,\n}: {\n children: React.ReactNode;\n queryClient?: QueryClient;\n}) => {\n // Create a client if not provided\n const queryClient = useMemo(() => {\n if (overridingQueryClient) return overridingQueryClient;\n return new QueryClient();\n }, [overridingQueryClient]);\n\n return <InternalQueryClientContext.Provider value={queryClient}>{children}</InternalQueryClientContext.Provider>;\n};\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n};\n","import * as viemChains from 'viem/chains';\nimport { ETH_ADDRESS_LOWERCASE, type Token, type Erc20Pair } from '../types/token.js';\nimport type { FheTypeValue } from '@cofhe/sdk';\nimport { isValidElement } from 'react';\n\n// Build a lookup map of chainId -> viem chain (for block explorers, etc.)\nconst viemChainById = Object.values(viemChains).reduce<Record<number, (typeof viemChains)[keyof typeof viemChains]>>(\n (acc, chain) => {\n if (chain && typeof chain === 'object' && 'id' in chain) {\n acc[chain.id] = chain;\n }\n return acc;\n },\n {}\n);\n\n/**\n * Gets the block explorer URL for a given chain ID\n * @param chainId - The chain ID to look up\n * @returns The block explorer base URL, or undefined if not found\n */\nexport const getBlockExplorerUrl = (chainId: number): string | undefined => {\n const chain = viemChainById[chainId];\n return chain?.blockExplorers?.default?.url;\n};\n\n/**\n * Gets the block explorer transaction URL for a given chain ID and transaction hash\n * @param chainId - The chain ID\n * @param hash - The transaction hash\n * @returns The full transaction URL, or undefined if chain not found\n */\nexport const getBlockExplorerTxUrl = (chainId: number, hash: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/tx/${hash}` : undefined;\n};\n\n/**\n * Gets the block explorer address URL for a given chain ID and address\n * @param chainId - The chain ID\n * @param address - The address\n * @returns The full address URL, or undefined if chain not found\n */\nexport const getBlockExplorerAddressUrl = (chainId: number, address: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/address/${address}` : undefined;\n};\n\n/**\n * Gets the block explorer token URL for a given chain ID and token address\n * @param chainId - The chain ID\n * @param tokenAddress - The token contract address\n * @returns The full token URL, or undefined if chain not found\n */\nexport const getBlockExplorerTokenUrl = (chainId: number, tokenAddress: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/token/${tokenAddress}` : undefined;\n};\n\n// ============================================================================\n// Token Helper Functions\n// ============================================================================\n\n/**\n * Check if an erc20Pair address is the native ETH address\n * @param erc20Pair - The ERC20 pair object from token extensions\n * @returns True if the pair address matches ETH_ADDRESS\n */\nexport const isEthPair = (erc20Pair: Erc20Pair | undefined): boolean => {\n if (!erc20Pair) return false;\n return erc20Pair.address.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n};\n\n/**\n * Check if a token is a wrapped ETH token (ConfidentialETH)\n * @param token - The token object\n * @returns True if the token is a wrapped token with ETH as the underlying pair\n */\nexport const isWrappedEthToken = (token: Token): boolean => {\n if (token.extensions.fhenix.confidentialityType !== 'wrapped') return false;\n return isEthPair(token.extensions.fhenix.erc20Pair);\n};\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n {\n label: 'Encrypted Bool',\n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: 'Boolean value (true/false)',\n },\n {\n label: 'Encrypted Uint8',\n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: '8-bit unsigned integer (0 to 255)',\n },\n {\n label: 'Encrypted Uint16',\n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: '16-bit unsigned integer (0 to 65,535)',\n },\n {\n label: 'Encrypted Uint32',\n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: '32-bit unsigned integer (0 to 4,294,967,295)',\n },\n {\n label: 'Encrypted Uint64',\n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: '64-bit unsigned integer (0 to 18,446,744,073,709,551,615)',\n },\n {\n label: 'Encrypted Uint128',\n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: '128-bit unsigned integer',\n },\n {\n label: 'Encrypted Address',\n value: 'address',\n maxValue: null, // Address validation is different\n description: 'Ethereum address (0x...)',\n },\n];\n\nexport const NOOP_CALLBACK = () => () => {};\n\n/**\n * Truncates a hex string (address or hash) to show beginning and end with ellipsis\n * @param value - The hex string to truncate (address, hash, etc.)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated string, or original if too short\n *\n * @example\n * truncateHash('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport const truncateHash = (value: string, start = 6, end = 4): string => {\n if (value.length <= start + end) return value;\n return `${value.slice(0, start)}...${value.slice(-end)}`;\n};\n\n/**\n * Truncates an Ethereum address (alias for truncateHash with address-friendly defaults)\n * @param address - The full Ethereum address (0x...)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated address string, or undefined if address is invalid\n *\n * @example\n * truncateAddress('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport function truncateAddress(\n address: string | undefined | null,\n start: number = 6,\n end: number = 4\n): string | undefined {\n if (!address) return undefined;\n return truncateHash(address, start, end);\n}\n\n/**\n * Sanitizes numeric input to only allow numbers and a single decimal point\n * @param value - The input value to sanitize\n * @returns Sanitized value with only numbers and at most one decimal point\n *\n * @example\n * sanitizeNumericInput('123.45.67') // Returns: '123.4567'\n * sanitizeNumericInput('abc123.45') // Returns: '123.45'\n * sanitizeNumericInput('123') // Returns: '123'\n */\nexport function sanitizeNumericInput(value: string): string {\n // Only allow numbers and decimal point\n const cleaned = value.replace(/[^0-9.]/g, '');\n\n // Ensure only one decimal point\n const parts = cleaned.split('.');\n if (parts.length > 2) {\n return parts[0] + '.' + parts.slice(1).join('');\n }\n\n return cleaned;\n}\n\n/**\n * Formats a timestamp as a relative time string (e.g., \"2 hours ago\")\n * @param timestamp - Unix timestamp in milliseconds\n * @returns Formatted relative time string\n */\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n return 'Just now';\n};\n\nexport const formatExpirationLabel = (expiration?: number) => {\n if (!expiration) {\n return { label: 'Unknown', expired: false, expiringSoon: false };\n }\n\n const now = Math.floor(Date.now() / 1000);\n const diff = expiration - now;\n\n const expired = diff <= 0;\n const expiringSoon = diff <= 1 * 60 * 60;\n if (expired) {\n return { label: 'Expired', expired: true, expiringSoon: false };\n }\n\n const day = 60 * 60 * 24;\n const hour = 60 * 60;\n const minute = 60;\n\n if (diff >= day) {\n const days = Math.ceil(diff / day);\n return { label: `${days} Day${days === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n if (diff >= hour) {\n const hours = Math.ceil(diff / hour);\n return { label: `${hours} Hour${hours === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n const minutes = Math.max(1, Math.ceil(diff / minute));\n return { label: `${minutes} Minute${minutes === 1 ? '' : 's'}`, expired: false, expiringSoon };\n};\n\nexport function isReactNode(data: unknown): data is React.ReactNode {\n // Check for primitive types that are valid React nodes or if it's a valid React element\n if (\n data === null ||\n data === undefined ||\n typeof data === 'string' ||\n typeof data === 'number' ||\n typeof data === 'boolean' ||\n isValidElement(data)\n ) {\n return true;\n }\n\n // Check if it's an array of React nodes (recursive check)\n if (Array.isArray(data)) {\n return data.every(isReactNode);\n }\n\n return false;\n}\n","/**\n * Token types shared across hooks/components/utils.\n *\n * IMPORTANT: Keep this file dependency-free (no imports from hooks/providers/utils)\n * to avoid circular dependencies.\n */\n\nimport { baseSepolia, sepolia } from '@cofhe/sdk/chains';\nimport type { Address } from 'viem';\n\n/**\n * Special address representing native ETH (used in erc20Pair for ConfidentialETH tokens)\n */\nexport const ETH_ADDRESS_LOWERCASE = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const;\n\ntype TokenWithoutExtensions = Omit<Token, 'extensions'>;\nexport function constructNativeToken(chainId: number): TokenWithoutExtensions {\n return {\n chainId,\n address: ETH_ADDRESS_LOWERCASE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n };\n}\n\n/**\n * ERC20 pair information for wrapped confidential tokens\n */\nexport type Erc20Pair = {\n /** Address of the underlying ERC20 token (or ETH_ADDRESS for native ETH) */\n address: Address;\n symbol: string;\n decimals: number;\n logoURI?: string;\n};\n\nexport type Token = {\n chainId: number;\n address: `0x${string}`;\n symbol: string;\n decimals: number;\n name: string;\n logoURI?: string;\n extensions: Record<string, unknown> & {\n fhenix: {\n confidentialityType: 'wrapped' | 'pure' | 'dual';\n confidentialValueType: 'uint64' | 'uint128';\n /** ERC20 pair for wrapped tokens - contains underlying token info */\n erc20Pair?: Erc20Pair;\n };\n };\n};\n\n// source: https://storage.googleapis.com/cofhesdk/sepolia.json\nexport const WETH_SEPOLIA_TOKEN: Token = {\n chainId: 11155111,\n address: '0x87A3effB84CBE1E4caB6Ab430139eC41d156D55A',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\n\n// source: https://storage.googleapis.com/cofhesdk/base-sepolia.json\nconst WETH_BASE_SEPOLIA_TOKEN: Token = {\n chainId: 84532,\n address: '0xbED96aa98a49FeA71fcC55d755b915cF022a9159',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n coingeckoId: 'eeth',\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\nexport const DEFAULT_TOKEN_BY_CHAIN_ID: Record<number, Token> = {\n [sepolia.id]: WETH_SEPOLIA_TOKEN,\n [baseSepolia.id]: WETH_BASE_SEPOLIA_TOKEN,\n};\n","import type { FheTypeValue } from '@cofhe/sdk';\n\nexport const logBlockStart = (message: string) => {\n console.log('┌──────────────────┬──────────────────────────────────────────────────');\n console.log(`│ [COFHE] │ ${message}`);\n console.log('├──────────────────┴──────────────────────────────────────────────────');\n};\n\nexport const logBlockMessage = (message: string) => {\n console.log(`│ ${message}`);\n};\n\nexport const logBlockEnd = () => {\n console.log('└─────────────────────────────────────────────────────────────────────');\n};\n\nexport const logBlockMessageAndEnd = (message: string) => {\n logBlockMessage(message);\n logBlockEnd();\n};\n\nexport const fheTypeToString = (fheType: FheTypeValue) => {\n switch (fheType) {\n case 'bool':\n return 'ebool';\n case 'uint8':\n return 'euint8';\n case 'uint16':\n return 'euint16';\n case 'uint32':\n return 'euint32';\n case 'uint64':\n return 'euint64';\n case 'uint128':\n return 'euint128';\n case 'address':\n return 'eaddress';\n default:\n return 'unknown';\n }\n};\n\nexport const plaintextToString = (fheType: FheTypeValue, plaintext: string | bigint | boolean) => {\n if (fheType === 'bool') {\n return plaintext === 1n || plaintext === true ? 'true' : 'false';\n }\n return plaintext;\n};\n\nexport const encryptedValueToString = (fheType: FheTypeValue, handle: bigint) => {\n const hashStr = handle.toString();\n const truncated = hashStr.slice(0, 6) + '..' + hashStr.slice(hashStr.length - 6);\n\n return `${fheTypeToString(fheType)}(${truncated})`;\n};\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked.\n */\nexport const debounce = <T extends (..._args: any[]) => any>(\n func: T,\n wait: number\n): ((..._args: Parameters<T>) => void) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n func(...args);\n }, wait);\n };\n};\n","import {\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type ContractFunctionReturnType,\n type PublicClient,\n} from 'viem';\n\nexport type WaitUntilRpcAwareAndReadContractOptions = {\n onSuccess?: () => void;\n pollingInterval?: number;\n signal?: AbortSignal;\n};\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Waits until an RPC node is aware of a specific `blockHash`, then performs the\n * contract read.\n *\n * Implementation detail: the function issues two RPC calls concurrently:\n * - `eth_getBlockByHash(blockHash)` to confirm the node has the block\n * - `eth_call` (via `publicClient.call`) for the actual contract read\n *\n * If your viem client transport has batching enabled, these concurrent calls are\n * typically sent as a single JSON-RPC batch — which is important when your RPC\n * provider load-balances across nodes.\n */\nexport type ReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = ContractFunctionReturnType<\n TAbi,\n 'pure' | 'view',\n TfunctionName,\n ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>\n>;\nexport async function maybeWaitUntilRpcAwareAndReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n publicClient: PublicClient,\n params: {\n blockHashToBeAwareOf?: `0x${string}`;\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n },\n options: WaitUntilRpcAwareAndReadContractOptions = {}\n): Promise<ReadContractResult<TAbi, TfunctionName>> {\n // if no blockHash given to be aware of, just read directly\n if (!params.blockHashToBeAwareOf)\n return publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n });\n\n const pollingInterval = options.pollingInterval ?? 1_000;\n\n console.log(`Waiting until RPC is aware of block ${params.blockHashToBeAwareOf} to read contract...`);\n let done = false;\n while (!done) {\n if (options.signal?.aborted) throw abortError();\n\n const [blockRes, readRes] = await Promise.allSettled([\n publicClient.request({\n method: 'eth_getBlockByHash',\n params: [params.blockHashToBeAwareOf, false],\n }),\n publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }),\n ]);\n\n const blockKnown = blockRes.status === 'fulfilled' && blockRes.value != null;\n\n if (blockKnown && readRes.status === 'fulfilled') {\n options?.onSuccess?.();\n done = true;\n return readRes.value;\n }\n\n await sleep(pollingInterval, options.signal);\n }\n\n // Unreachable, but keeps TS happy.\n throw new Error('Unexpected exit from wait loop');\n}\n","import { cn } from '@/utils';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\nimport type { FnxStatusVariant } from './types';\n\nconst statusVariantStyles: Record<FnxStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nexport const FloatingButtonComponent: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n const { theme } = useFnxFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { portalOpen } = usePortalUI();\n\n const topStatusVariant = statuses[statuses.length - 1]?.variant;\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'fnx-panel fnx-floating-icon',\n 'w-12 h-12',\n 'flex items-center justify-center cursor-pointer flex-shrink-0',\n 'focus:outline-none',\n statusVariantStyles[topStatusVariant]\n )}\n >\n <div className=\"flex items-center justify-center\">\n {portalOpen && <CloseIcon className=\"w-6 h-6\" />}\n {!portalOpen && <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />}\n </div>\n </button>\n );\n};\n","import { type ReactNode, createContext, useContext } from 'react';\nimport type { FloatingButtonPosition } from './types';\nimport { useCofheContext } from '../../providers';\nimport { useTrackPendingTransactions } from '@/hooks/useTrackPendingTransactions';\nimport { useTrackDecryptingTransactions } from '@/hooks/useTrackDecryptingTransactions';\nimport { useWatchPermitStatus } from '@/hooks/useWatchPermitStatus';\nimport { useWatchClaimablesStatus } from '@/hooks/useWatchClaimablesStatus';\n\nexport type TokenListMode = 'view' | 'select';\n\ninterface FnxFloatingButtonContextValue {\n theme: 'dark' | 'light';\n effectivePosition: FloatingButtonPosition;\n isLeftSide: boolean;\n isTopSide: boolean;\n}\n\nconst FnxFloatingButtonContext = createContext<FnxFloatingButtonContextValue | null>(null);\n\ninterface FnxFloatingButtonProviderProps {\n children?: ReactNode;\n}\n\nexport const FnxFloatingButtonProvider: React.FC<FnxFloatingButtonProviderProps> = ({ children }) => {\n const { state } = useCofheContext();\n\n const theme = state.theme;\n const effectivePosition = state.position;\n const isLeftSide = effectivePosition.includes('left');\n const isTopSide = effectivePosition.includes('top');\n\n useTrackPendingTransactions();\n useTrackDecryptingTransactions();\n useWatchPermitStatus();\n useWatchClaimablesStatus();\n\n return (\n <FnxFloatingButtonContext.Provider\n value={{\n theme,\n effectivePosition,\n isLeftSide,\n isTopSide,\n }}\n >\n {children}\n </FnxFloatingButtonContext.Provider>\n );\n};\n\nexport const useFnxFloatingButtonContext = (): FnxFloatingButtonContextValue => {\n const context = useContext(FnxFloatingButtonContext);\n if (!context) {\n throw new Error('useFnxFloatingButtonContext must be used within FnxFloatingButtonProvider');\n }\n return context;\n};\n","export const BIGINT_JSON_MARKER_KEY = '__bigint__' as const;\n\ntype BigintMarker = { [BIGINT_JSON_MARKER_KEY]: string };\n\ntype JSONReviver = (key: string, value: unknown) => unknown;\ntype JSONReplacer = (key: string, value: unknown) => unknown;\n\nexport const bigintJSONReviver: JSONReviver = (_key, value) => {\n if (typeof value === 'object' && value !== null && BIGINT_JSON_MARKER_KEY in value) {\n return BigInt((value as BigintMarker)[BIGINT_JSON_MARKER_KEY]);\n }\n return value;\n};\n\nexport const bigintJSONReplacer: JSONReplacer = (_key, value) => {\n if (typeof value === 'bigint') {\n return { [BIGINT_JSON_MARKER_KEY]: value.toString() } satisfies BigintMarker;\n }\n return value;\n};\n\nexport const bigintJSONStorageOptions = {\n reviver: bigintJSONReviver,\n replacer: bigintJSONReplacer,\n} as const;\n","import type { Token } from '@/types/token';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\ntype ChainRecord<T> = Record<number, T>;\ntype HashRecord<T> = Record<string, T>;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport enum TransactionStatus {\n Pending = 'pending',\n Failed = 'failed',\n Confirmed = 'confirmed',\n}\nexport type TransactionStatusString = 'Pending' | 'Failed' | 'Confirmed';\n\nexport enum TransactionActionType {\n ShieldSend = 'shieldSend',\n Shield = 'shield',\n Unshield = 'unshield',\n Claim = 'claim',\n}\nexport type TransactionActionString = 'Shielded Transfer' | 'Shield' | 'Unshield' | 'Claim';\n\ntype BaseTransaction = {\n hash: `0x${string}`;\n status: TransactionStatus;\n timestamp: number;\n chainId: number;\n // actionType: Exclude<TransactionActionType, TransactionActionType.Unshield>;\n account: Address;\n\n token: Token;\n //\n\n tokenAmount: bigint;\n isPendingDecryption: boolean;\n};\n\ntype ShieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Shield;\n};\ntype SendingTransaction = BaseTransaction & {\n actionType: TransactionActionType.ShieldSend;\n};\ntype ClaimingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Claim;\n};\n\ntype UnshieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Unshield;\n};\n\nexport type Transaction = UnshieldingTransaction | ShieldingTransaction | SendingTransaction | ClaimingTransaction;\n\ntype NewTransaction = DistributiveOmit<Transaction, 'status' | 'timestamp'>;\n\nexport interface TransactionStore {\n // TODO: should be chainId -> account -> txHash -> Transaction\n transactions: ChainRecord<HashRecord<Transaction>>;\n addTransaction: (transaction: NewTransaction) => void;\n getTransaction: (chainId: number, hash: string) => Transaction | undefined;\n getAllTransactions: (chainId: number, account?: string) => Transaction[];\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string) => Transaction[];\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => void;\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => void;\n clearTransactions: (chainId?: number) => void;\n}\n\nconst actionToStringMap: Record<TransactionActionType, TransactionActionString> = {\n [TransactionActionType.ShieldSend]: 'Shielded Transfer',\n [TransactionActionType.Shield]: 'Shield',\n [TransactionActionType.Unshield]: 'Unshield',\n [TransactionActionType.Claim]: 'Claim',\n};\n\nexport const actionToString = (a: TransactionActionType): TransactionActionString => actionToStringMap[a];\n\nconst statusToStringMap: Record<TransactionStatus, TransactionStatusString> = {\n [TransactionStatus.Pending]: 'Pending',\n [TransactionStatus.Failed]: 'Failed',\n [TransactionStatus.Confirmed]: 'Confirmed',\n};\n\nexport const statusToString = (a: TransactionStatus): TransactionStatusString => statusToStringMap[a];\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<TransactionStore>(() => localStorage, bigintJSONStorageOptions);\n\nfunction constructNewTx(transaction: NewTransaction): Transaction {\n return {\n ...transaction,\n status: TransactionStatus.Pending,\n timestamp: Date.now(),\n };\n}\n\nexport const useTransactionStore = create<TransactionStore>()(\n persist(\n (set, get) => ({\n transactions: {},\n\n addTransaction: (transaction: NewTransaction) => {\n set((state) => {\n const chainTxs = state.transactions[transaction.chainId] || {};\n const pendingTx = constructNewTx(transaction);\n return {\n transactions: {\n ...state.transactions,\n [transaction.chainId]: {\n ...chainTxs,\n [transaction.hash]: pendingTx,\n },\n },\n };\n });\n },\n\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n status,\n // if tx failed, it's no longer pending decryption\n isPendingDecryption: status === TransactionStatus.Failed ? false : chainTxs[hash].isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n getTransaction: (chainId: number, hash: string): Transaction | undefined => {\n return get().transactions[chainId]?.[hash];\n },\n\n getAllTransactions: (chainId: number, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => !account || !tx.account || tx.account.toLowerCase() === account.toLowerCase())\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => {\n return tx.account.toLowerCase() === account?.toLowerCase();\n })\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n clearTransactions: (chainId?: number) => {\n set((state) => {\n if (chainId !== undefined) {\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {},\n },\n };\n }\n return { transactions: {} };\n });\n },\n }),\n {\n name: 'cofhe-transaction-store',\n storage: bigintStorage,\n }\n )\n);\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { CONNECT_STORE_DEFAULTS, type CofheClient, type CofheClientConnectionState } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { NOOP_CALLBACK } from '../utils';\n\nconst subscribeToConnectionConstructor = (client: CofheClient) => (onStoreChange: () => void) => {\n return client.subscribe(() => {\n onStoreChange();\n });\n};\nconst getConnectionSnapshotConstructor = (client: CofheClient) => () => client.getSnapshot();\n\nconst DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;\n\n// sync core store\nexport const useCofheConnection = (): CofheClientConnectionState => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToConnectionConstructor(client),\n getConnectionSnapshot: client && getConnectionSnapshotConstructor(client),\n };\n }, [client]);\n\n return useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n};\n\nexport const useCofheIsConnected = (): boolean => {\n const { connected } = useCofheConnection();\n return connected;\n};\n\nexport const useCofheAccount = (): `0x${string}` | undefined => {\n const { account } = useCofheConnection();\n return account;\n};\n\nexport const useCofheChainId = (): number | undefined => {\n const { chainId } = useCofheConnection();\n return chainId;\n};\n\nexport const useCofheSupportedChains = () => {\n const client = useCofheContext().client;\n return client.config.supportedChains;\n};\n\nexport const useCofhePublicClient = () => useCofheConnection().publicClient;\n\nexport const useCofheWalletClient = () => useCofheConnection().walletClient;\n","import {\n TransactionActionType,\n TransactionStatus,\n useTransactionStore,\n type Transaction,\n} from '@/stores/transactionStore';\nimport { useCofhePublicClient } from './useCofheConnection';\nimport { useInternalQueries, useInternalQueryClient } from '@/providers';\nimport { assert } from 'ts-essentials';\nimport { constructCofheReadContractQueryForInvalidation } from './useCofheReadContract';\nimport { QueryClient, type QueriesOptions } from '@tanstack/react-query';\nimport type { Address, TransactionReceipt } from 'viem';\nimport { getTokenContractConfig } from '@/constants/confidentialTokenABIs';\nimport { ETH_ADDRESS_LOWERCASE, type Token } from './useCofheTokenLists';\nimport { constructPublicTokenBalanceQueryKeyForInvalidation } from './useCofheTokenPublicBalance';\nimport { constructUnshieldClaimsQueryKeyForInvalidation, invalidateClaimableQueries } from './useCofheTokenClaimable';\nimport { usePendingTransactions } from './usePendingTransactions';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\nimport { useEffect, useRef } from 'react';\n\nfunction invalidateConfidentialTokenBalanceQueries(token: Token, queryClient: QueryClient) {\n const tokenBalanceQueryKey = constructCofheReadContractQueryForInvalidation({\n cofheChainId: token.chainId,\n address: token.address,\n functionName: getTokenContractConfig(token.extensions.fhenix.confidentialityType).functionName,\n });\n\n console.log('Invalidating shield/send read contract queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n // TODO: it can potentially invalidate irrelevenat queries who happen to belong to the same contract but different function. Not sure if worth fixing\n exact: false,\n });\n}\n\nfunction invalidatePublicTokenBalanceQueries(\n {\n tokenAddress,\n chainId,\n accountAddress,\n }: {\n tokenAddress: Address;\n chainId: number;\n accountAddress: Address;\n },\n queryClient: QueryClient\n) {\n const tokenBalanceQueryKey = constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n accountAddress,\n });\n\n console.log('Invalidating public token balance read contract queries for token:', tokenBalanceQueryKey);\n\n queryClient.invalidateQueries({\n queryKey: tokenBalanceQueryKey,\n });\n}\n\nfunction invalidatePublicAndConfidentialTokenBalanceQueries(\n token: Token,\n accountAddress: Address,\n queryClient: QueryClient\n) {\n invalidateConfidentialTokenBalanceQueries(token, queryClient);\n\n const publicPairTokenAddress = token.extensions.fhenix.erc20Pair?.address;\n assert(publicPairTokenAddress, 'Public pair token address is required for shield transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicPairTokenAddress,\n chainId: token.chainId,\n accountAddress,\n },\n queryClient\n );\n}\n\ntype UseTrackPendingTransactionsInput = {\n onReceiptSuccess: (tx: Transaction, receipt: TransactionReceipt) => void;\n onReceiptFail?: (tx: Transaction, receipt: TransactionReceipt) => void;\n onFetchFailure?: (error: unknown, tx: Transaction) => void;\n};\nfunction useTrackPendingTransactionsBase({\n onReceiptSuccess,\n onReceiptFail,\n onFetchFailure,\n}: UseTrackPendingTransactionsInput) {\n // Batch check pending transactions using react-query's useQueries\n const accountsPendingTxs = usePendingTransactions();\n const publicClient = useCofhePublicClient();\n\n const queries: QueriesOptions<TransactionReceipt[]> = accountsPendingTxs.map((tx) => ({\n queryKey: ['tx-receipt', tx.chainId, tx.hash],\n queryFn: async () => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n try {\n const receipt = await publicClient.waitForTransactionReceipt({ hash: tx.hash as `0x${string}` });\n\n const status = receipt.status === 'success' ? TransactionStatus.Confirmed : TransactionStatus.Failed;\n // invalidate if tx was successful\n if (status === TransactionStatus.Confirmed) onReceiptSuccess(tx, receipt);\n else onReceiptFail?.(tx, receipt);\n\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, status);\n\n return receipt;\n } catch (e) {\n onFetchFailure?.(e, tx);\n // no need to invalidate on failure, since nothing has changed on chain\n useTransactionStore.getState().updateTransactionStatus(tx.chainId, tx.hash, TransactionStatus.Failed);\n throw e;\n }\n },\n\n enabled: !!publicClient && accountsPendingTxs.length > 0,\n refetchOnWindowFocus: false,\n refetchOnReconnect: true,\n }));\n useInternalQueries({\n queries,\n });\n}\n\nfunction useHandleInvalidations() {\n const queryClient = useInternalQueryClient();\n\n const { upsert: upsertDecryptionWatcher, byKey } = useDecryptionWatchersStore();\n console.log('Scheduled invalidations store:', byKey);\n const handleInvalidations = (tx: Transaction) => {\n // each transaction requires gas, so native token balance changes on every transaction\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: ETH_ADDRESS_LOWERCASE,\n chainId: tx.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n if (tx.actionType === TransactionActionType.ShieldSend) {\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n } else if (tx.actionType === TransactionActionType.Shield) {\n // on shield public balance decreases and private increases\n invalidatePublicAndConfidentialTokenBalanceQueries(tx.token, tx.account, queryClient);\n } else if (tx.actionType === TransactionActionType.Unshield) {\n // on unshield - private balance decreases, claimable increases, public remains the same\n invalidateConfidentialTokenBalanceQueries(tx.token, queryClient);\n\n // schedule invalidation for unshield claims once decryption is observed\n upsertDecryptionWatcher({\n key: `${tx.actionType}-tx-${tx.hash}`,\n accountAddress: tx.account,\n createdAt: Date.now(),\n chainId: tx.chainId,\n triggerTxHash: tx.hash,\n queryKeys: [\n constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: tx.token.chainId,\n tokenAddress: tx.token.address,\n confidentialityType: tx.token.extensions.fhenix.confidentialityType,\n accountAddress: tx.account,\n }),\n ],\n });\n } else if (tx.actionType === TransactionActionType.Claim) {\n // on claim - claimable decreases, public increases, private remains the same\n const publicTokenAddress = tx.token.extensions.fhenix.erc20Pair?.address;\n assert(publicTokenAddress, 'Public pair token address is required for claim transaction invalidation');\n invalidatePublicTokenBalanceQueries(\n {\n tokenAddress: publicTokenAddress,\n chainId: tx.token.chainId,\n accountAddress: tx.account,\n },\n queryClient\n );\n invalidateClaimableQueries({\n token: tx.token,\n accountAddress: tx.account,\n\n queryClient,\n });\n } else {\n // @ts-expect-error actionType = \"never\" at this point\n console.warn('No invalidation logic for transaction action type:', tx.actionType);\n }\n };\n\n return handleInvalidations;\n}\n\nfunction useOnceTransactionSubmitted(onSubmit: (tx: Transaction) => void) {\n const pendingTransactions = usePendingTransactions();\n const previousPendingTxsRef = useRef<Transaction[]>([]);\n\n useEffect(() => {\n const newlySubmittedTxs = pendingTransactions.filter(\n (tx) => !previousPendingTxsRef.current.some((prevTx) => prevTx.hash === tx.hash)\n );\n\n for (const tx of newlySubmittedTxs) {\n onSubmit(tx);\n\n // You can add any additional logic you want to execute once per transaction submission here\n }\n\n previousPendingTxsRef.current = pendingTransactions;\n }, [onSubmit, pendingTransactions]);\n}\n\nexport function useTrackPendingTransactions() {\n const handleInvalidations = useHandleInvalidations();\n const { onTransactionMined, onWatchReceiptFailure, onTransactionSubmitted } = useTransactionGlobalLifecycle();\n\n // 1 tx submitted\n useOnceTransactionSubmitted(onTransactionSubmitted);\n\n useTrackPendingTransactionsBase({\n // 2.a. tx mined successfully\n onReceiptSuccess: (tx, receipt) => {\n handleInvalidations(tx);\n onTransactionMined(tx, receipt);\n },\n // 2.b. tx mined with failure\n onReceiptFail: (tx, receipt) => {\n onTransactionMined(tx, receipt);\n },\n\n // 2.c. fetch failure\n onFetchFailure: (error, tx) => {\n onWatchReceiptFailure(error, tx);\n },\n });\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport {\n type Address,\n type ContractFunctionReturnType,\n type ContractFunctionName,\n type ContractFunctionArgs,\n type ReadContractReturnType,\n} from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheActivePermit } from './useCofhePermits';\nimport { assert } from 'ts-essentials';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { useInternalQueries, useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi, type CofheReturnType, type ContractReturnType } from '@cofhe/abi';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContract';\n\nfunction serializeIfBigint(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n}\n\nfunction serializeBigintRecursively(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(serializeBigintRecursively);\n } else {\n return serializeIfBigint(value);\n }\n}\n\nexport function constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n enabled,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n args?: readonly unknown[];\n requiresPermit?: boolean;\n activePermitHash?: string;\n enabled?: boolean;\n}): readonly unknown[] {\n return [\n ...constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n }),\n\n args ? serializeBigintRecursively(args) : [],\n requiresPermit ? activePermitHash : undefined,\n // normally, \"enabled\" shouldn't be part of queryKey, but without adding it, there is a weird bug: when there's a CofheError, query still running queryFn resulting in the blank screen\n enabled,\n ];\n}\n\nexport function constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n // add more specificity if needed. Just make sure it matches the order of keys\n}): readonly unknown[] {\n return [QUERY_CACHE_PREFIX, cofheChainId, address, functionName];\n}\n\nexport type UseCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = Omit<UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error>, 'queryKey' | 'queryFn'> & {\n enabled?: boolean; // TODO: check callback variant, maybe it'll fix the issue above about forcing enable to be query key\n};\n\nexport function getEnabledForCofheReadContract(params: {\n isCofheErrorActive: boolean;\n publicClient: unknown;\n address?: Address;\n abi?: Abi;\n functionName?: string;\n requiresPermit: boolean;\n hasActivePermit: boolean;\n userEnabled?: boolean;\n}): boolean {\n const { isCofheErrorActive, publicClient, address, abi, functionName, requiresPermit, hasActivePermit, userEnabled } =\n params;\n\n return (\n !isCofheErrorActive &&\n !!publicClient &&\n !!address &&\n !!abi &&\n !!functionName &&\n (!requiresPermit || hasActivePermit) &&\n (userEnabled ?? true)\n );\n}\n\nfunction convertReadContractResultToCofheReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(\n value: ContractFunctionReturnType<TAbi, 'pure' | 'view', TfunctionName, TArgs>\n): ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n> {\n // TODO: convertViemReturnTypeToCofheReturnType -- need core typing changes, currently seems to not support fn overloads\n // viems inferred TArgs mismatch Cofhe's\n return value as ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n >;\n}\n\nexport function createCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(params: {\n enabled: boolean;\n cofheChainId?: number;\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: TArgs;\n requiresPermit: boolean;\n activePermitHash?: string;\n publicClient: ReturnType<typeof useCofhePublicClient>;\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n}): UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error> {\n const {\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n publicClient,\n queryOptions,\n } = params;\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return {\n enabled,\n queryKey: constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash,\n enabled,\n }),\n queryFn: async () => {\n assert(address, 'Contract address should be guaranteed by enabled check');\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(abi, 'ABI should be guaranteed by enabled check');\n assert(functionName, 'Function name should be guaranteed by enabled check');\n\n const out = await publicClient.readContract({\n address,\n abi,\n functionName,\n args,\n });\n\n const convertedOut = convertReadContractResultToCofheReturnType<TAbi, TfunctionName, TArgs>(out);\n\n const transformed = transformEncryptedReturnTypes(abi, functionName, convertedOut);\n\n return transformed;\n },\n ...restQueryOptions,\n };\n}\n\n/**\n * Generic hook: read a contract and return the result (with permit/error gating support).\n * is Cofhe-ABI aware: returns CofheReturnType (but doesn't support TArgs typing yet).\n */\nexport type UseCofheReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = UseQueryResult<CofheReturnType<TAbi, TfunctionName>, Error> & {\n disabledDueToMissingPermit: boolean;\n};\nexport function useCofheReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>\n): UseCofheReadContractResult<TAbi, TfunctionName> {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const isCofheErrorActive = useIsCofheErrorActive();\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const activePermit = useCofheActivePermit();\n\n const enabled = getEnabledForCofheReadContract({\n isCofheErrorActive,\n publicClient,\n address,\n abi,\n functionName,\n requiresPermit,\n hasActivePermit: !!activePermit,\n userEnabled: queryOptions?.enabled,\n });\n\n const result = useInternalQuery(\n createCofheReadContractQueryOptions({\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash: activePermit?.permit.hash,\n publicClient,\n queryOptions,\n })\n );\n\n return {\n ...result,\n disabledDueToMissingPermit: requiresPermit && !activePermit,\n };\n}\n","import type { CofheClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { NOOP_CALLBACK } from '../utils';\nimport { PERMIT_STORE_DEFAULTS, PermitUtils, type Permit } from '@cofhe/sdk/permits';\nimport { useCofheConnection } from './useCofheConnection';\n\nconst subscribeToPermitsConstructor = (client: CofheClient) => (onStoreChange: () => void) => {\n return client.permits.subscribe(() => {\n onStoreChange();\n });\n};\n\nconst getPermitsSnapshotConstructor = (client: CofheClient) => () => client.permits.getSnapshot();\n\n// type PermitsState = ReturnType<CofheClientPermits['getSnapshot']>;\n\nconst DEFAULT_SNAPSHOT_GETTER = () => PERMIT_STORE_DEFAULTS;\n\nconst useCofhePermitsStore = () => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToPermitsConstructor(client),\n getConnectionSnapshot: client && getPermitsSnapshotConstructor(client),\n };\n }, [client]);\n\n const state = useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n return { state, client };\n};\n\nexport const useCofheActivePermit = ():\n | {\n permit: Permit;\n isValid: boolean;\n }\n | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n // active permit\n\n const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : undefined;\n const serialized = hash && allPermits ? allPermits[hash] : undefined;\n\n const permitData = useMemo(() => {\n const _permit = serialized ? PermitUtils.deserialize(serialized) : undefined;\n if (!_permit || !hash) return undefined;\n return {\n permit: _permit,\n isValid: _permit ? PermitUtils.isValid(_permit).valid : false,\n hash,\n };\n }, [serialized, hash]);\n\n return connected ? permitData : undefined;\n};\n\nexport const useCofheActivePermitHash = (): string | undefined => {\n const activePermit = useCofheActivePermit();\n return useMemo(() => activePermit?.permit.hash, [activePermit?.permit.hash]);\n};\n\nexport const useCofheAllPermits = (): Permit[] => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n\n const allPermitsWithHashes = useMemo(\n () =>\n allPermits\n ? Object.keys(allPermits)\n .filter((hash) => !!allPermits[hash])\n .map((hash) => {\n const serializedPermit = allPermits[hash];\n if (!serializedPermit) throw new Error('Permit data missing');\n\n return PermitUtils.deserialize(serializedPermit);\n })\n : [],\n [allPermits]\n );\n\n return connected ? allPermitsWithHashes : [];\n};\n\nexport const useCofhePermit = (hash: string): Permit | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n const { state } = useCofhePermitsStore();\n return useMemo(() => {\n if (!connected || !chainId || !account) return undefined;\n const serializedPermit = state.permits[chainId]?.[account]?.[hash];\n if (!serializedPermit) return undefined;\n return PermitUtils.deserialize(serializedPermit);\n }, [connected, chainId, account, hash, state.permits]);\n};\n\ntype Callbacks = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport const useCofheRemovePermit = ({ onSuccess, onError }: Callbacks = {}) => {\n const { account, chainId } = useCofheConnection();\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n async (hashToRemove: string) => {\n try {\n if (!client || !chainId || !account) {\n throw new Error('Client, chainId, and account must be defined to remove a permit');\n }\n\n client.permits.removePermit(hashToRemove, chainId, account);\n onSuccess?.();\n } catch (error) {\n onError?.(new Error(error instanceof Error ? error.message : 'Unknown error'));\n }\n },\n [client, chainId, account, onSuccess, onError]\n );\n};\n\nexport const useCofheSelectPermit = ({ onSuccess, onError }: Callbacks = {}) => {\n const { account, chainId } = useCofheConnection();\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToSet: string) => {\n try {\n if (!client || !chainId || !account) {\n throw new Error('Client, chainId, and account must be defined to set active permit hash');\n }\n client.permits.selectActivePermit(hashToSet, chainId, account);\n onSuccess?.();\n } catch (error) {\n onError?.(new Error(error instanceof Error ? error.message : 'Unknown error'));\n }\n },\n [client, chainId, account, onSuccess, onError]\n );\n};\n","import { CofheError } from '@cofhe/sdk';\nimport { useContext } from 'react';\nimport { ErrorBoundaryContext } from 'react-error-boundary';\n\n/**\n *\n * @returns check if ErrorBoundary is currently handling a CofheError.\n * This is useful to prevent/block interactions with Cofhe until the error is resolved by the handling logic and the error is reset\n */\nexport function useIsCofheErrorActive(): boolean {\n const errorBoundaryContext = useContext(ErrorBoundaryContext);\n return errorBoundaryContext?.error instanceof CofheError;\n}\n","import type { Token } from '@/types/token';\nimport { parseAbi, type Abi } from 'viem';\n\n// ============================================================================\n// ERC20 Standard ABIs (for approval flow)\n// ============================================================================\n\n/**\n * ABI for ERC20 allowance check\n */\nexport const ERC20_ALLOWANCE_ABI = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n]);\n\n/**\n * ABI for ERC20 approve\n */\nexport const ERC20_APPROVE_ABI = parseAbi(['function approve(address spender, uint256 amount) returns (bool)']);\n\n// ============================================================================\n// Confidential Token Balance ABIs\n// ============================================================================\n\n/**\n * ABI for wrapped confidentiality type tokens (e.g., Redact)\n * Uses `encBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_WRAPPED_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'encBalanceOf',\n outputs: [\n {\n internalType: 'euint128',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for pure confidentiality type tokens (e.g., Base mini app)\n * Uses `confidentialBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_PURE_ABI = parseAbi([\n 'function confidentialBalanceOf(address account) view returns (uint256)',\n]);\n\n/**\n * ABI for dual confidentiality type tokens\n * Uses `confidentialBalanceOf(address)` function\n */\nexport const CONFIDENTIAL_TYPE_DUAL_ABI = parseAbi([\n 'function confidentialBalanceOf(address account) view returns (uint256)',\n]);\n\n/**\n * Map confidentialityType to balance ABIs and function names\n */\nexport const CONFIDENTIAL_ABIS = {\n wrapped: {\n abi: CONFIDENTIAL_TYPE_WRAPPED_ABI,\n functionName: 'encBalanceOf' as const,\n },\n pure: {\n abi: CONFIDENTIAL_TYPE_PURE_ABI,\n functionName: 'confidentialBalanceOf' as const,\n },\n dual: {\n abi: CONFIDENTIAL_TYPE_DUAL_ABI,\n functionName: 'confidentialBalanceOf' as const,\n },\n} as const;\n\n// ============================================================================\n// Confidential Token Transfer ABIs\n// ============================================================================\n\n/**\n * ABI for wrapped confidentiality type token transfers\n * Uses `encTransfer(address to, InEuint128 inValue)` function\n */\nexport const WRAPPED_TRANSFER_ABI = [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'ctHash',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'securityZone',\n type: 'uint8',\n },\n {\n internalType: 'uint8',\n name: 'utype',\n type: 'uint8',\n },\n {\n internalType: 'bytes',\n name: 'signature',\n type: 'bytes',\n },\n ],\n internalType: 'struct InEuint128',\n name: 'inValue',\n type: 'tuple',\n },\n ],\n name: 'encTransfer',\n outputs: [\n {\n internalType: 'euint128',\n name: 'transferred',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for pure confidentiality type token transfers\n * Uses `confidentialTransfer(address to, InEuint64 inValue)` function\n */\nexport const PURE_TRANSFER_ABI = [\n {\n name: 'confidentialTransfer',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n {\n name: 'inValue',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'securityZone', type: 'uint8' },\n { name: 'utype', type: 'uint8' },\n { name: 'signature', type: 'bytes' },\n ],\n },\n ],\n outputs: [{ name: 'transferred', type: 'uint256' }],\n },\n] as const satisfies Abi;\n\n/**\n * ABI for dual confidentiality type token transfers (TBD - to be implemented)\n * Uses `TBD_DUAL_FUNCTION_NAME(address to, InEuintXXX inValue)` function\n */\nexport const DUAL_TRANSFER_ABI = [\n {\n name: 'TBD_DUAL_FUNCTION_NAME',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n {\n name: 'inValue',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'securityZone', type: 'uint8' },\n { name: 'utype', type: 'uint8' },\n { name: 'signature', type: 'bytes' },\n ],\n },\n ],\n outputs: [{ name: 'transferred', type: 'uint256' }],\n },\n] as const satisfies Abi;\n\n/**\n * Map confidentialityType to transfer ABIs and function names\n */\nexport const TRANSFER_ABIS = {\n wrapped: {\n abi: WRAPPED_TRANSFER_ABI,\n functionName: 'encTransfer' as const,\n },\n pure: {\n abi: PURE_TRANSFER_ABI,\n functionName: 'confidentialTransfer' as const,\n },\n dual: {\n // Placeholder for dual type\n abi: DUAL_TRANSFER_ABI,\n functionName: 'TBD_DUAL_FUNCTION_NAME' as const,\n },\n} as const;\n\n// ============================================================================\n// Shield/Unshield ABIs (for dual and wrapped tokens)\n// ============================================================================\n\n/**\n * ABI for dual token shield - converts regular balance to confidential\n * Takes plaintext uint256 amount\n */\nexport const DUAL_SHIELD_ABI = parseAbi(['function shield(uint256 amount) public']);\n\n/**\n * ABI for dual token unshield - initiates conversion from confidential to regular\n * Takes plaintext uint64 amount\n */\nexport const DUAL_UNSHIELD_ABI = parseAbi(['function unshield(uint64 amount) public']);\n\n/**\n * ABI to claim unshielded tokens after decryption completes\n */\nexport const DUAL_CLAIM_UNSHIELD_ABI = parseAbi(['function claimUnshielded() public']);\n\n/**\n * ABI to check pending unshield claim status\n * Returns UnshieldClaim struct with: ctHash, requestedAmount, decryptedAmount, decrypted, claimed\n */\nexport const DUAL_GET_UNSHIELD_CLAIM_ABI = [\n {\n name: 'getUserUnshieldClaim',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'user', type: 'address' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint64' },\n { name: 'decryptedAmount', type: 'uint64' },\n { name: 'decrypted', type: 'bool' },\n { name: 'claimed', type: 'bool' },\n ],\n },\n ],\n },\n] as const satisfies Abi;\n\n/**\n * ABI for wrapped token encrypt (shield) - requires prior ERC20 approval\n * Transfers ERC20 tokens to wrapper and mints confidential tokens\n */\nexport const WRAPPED_ENCRYPT_ABI = parseAbi(['function encrypt(address to, uint128 value) public']);\n\n/**\n * ABI for wrapped token decrypt (unshield) - initiates conversion back to ERC20\n * Burns confidential tokens and creates a claim for ERC20\n */\nexport const WRAPPED_DECRYPT_ABI = parseAbi(['function decrypt(address to, uint128 value) public']);\n\n/**\n * ABI for wrapped token claim decrypted - claims ERC20 after decryption\n */\nexport const WRAPPED_CLAIM_DECRYPTED_ABI = parseAbi(['function claimDecrypted(uint256 ctHash) public']);\n\n/**\n * ABI for wrapped token claim all decrypted - claims all pending ERC20\n */\nexport const WRAPPED_CLAIM_ALL_DECRYPTED_ABI = parseAbi(['function claimAllDecrypted() public']);\n\n/**\n * ABI for wrapped token getUserClaims - returns all pending claims for a user\n * Returns array of Claim structs: { ctHash, requestedAmount, decryptedAmount, decrypted, to, claimed }\n */\nexport const WRAPPED_GET_USER_CLAIMS_ABI = [\n {\n inputs: [{ name: 'user', type: 'address' }],\n name: 'getUserClaims',\n outputs: [\n {\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint128' },\n { name: 'decryptedAmount', type: 'uint128' },\n { name: 'decrypted', type: 'bool' },\n { name: 'to', type: 'address' },\n { name: 'claimed', type: 'bool' },\n ],\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n] as const;\n\n/**\n * ABI for wrapped ETH encrypt with ETH value\n */\nexport const WRAPPED_ETH_ENCRYPT_ETH_ABI = parseAbi(['function encryptETH(address to) public payable']);\n\n/**\n * ABI for wrapped ETH encrypt with WETH\n */\nexport const WRAPPED_ETH_ENCRYPT_WETH_ABI = parseAbi(['function encryptWETH(address to, uint128 value) public']);\n\n/**\n * Map confidentialityType to shield ABIs and function names\n */\nexport const SHIELD_ABIS = {\n dual: {\n abi: DUAL_SHIELD_ABI,\n functionName: 'shield' as const,\n },\n wrapped: {\n // TBD - needs approval flow and underlying token reference\n abi: WRAPPED_ENCRYPT_ABI,\n functionName: 'encrypt' as const,\n },\n} as const;\n\n/**\n * Map confidentialityType to unshield ABIs and function names\n */\nexport const UNSHIELD_ABIS = {\n dual: {\n abi: DUAL_UNSHIELD_ABI,\n functionName: 'unshield' as const,\n },\n wrapped: {\n // TBD - needs claim flow\n abi: WRAPPED_DECRYPT_ABI,\n functionName: 'decrypt' as const,\n },\n} as const;\n\n/**\n * Map confidentialityType to claim ABIs and function names\n */\nexport const CLAIM_ABIS = {\n dual: {\n abi: DUAL_CLAIM_UNSHIELD_ABI,\n functionName: 'claimUnshielded' as const,\n },\n wrapped: {\n abi: WRAPPED_CLAIM_ALL_DECRYPTED_ABI,\n functionName: 'claimAllDecrypted' as const,\n },\n} as const;\n\nexport function getTokenContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n return CONFIDENTIAL_ABIS[confidentialityType];\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useCofheContext } from '../providers/CofheProvider';\nimport { useMemo } from 'react';\nimport { ETH_ADDRESS_LOWERCASE, type Erc20Pair, type Token } from '../types/token.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport type { Address } from 'viem';\nimport { useCofheChainId } from './useCofheConnection';\n\nexport { ETH_ADDRESS_LOWERCASE, type Token, type Erc20Pair };\n\ntype TokenList = {\n name: string;\n timestamp: string;\n version: {\n major: number;\n minor: number;\n patch: number;\n };\n tokens: Token[];\n};\n\ntype UseTokenListsResult = UseQueryResult<TokenList, Error>[];\ntype UseTokenListsInput = {\n chainId?: number;\n};\ntype UseTokenListsOptions = Omit<UseQueryOptions<TokenList, Error>, 'queryKey' | 'queryFn' | 'select'>;\n// Returns array of query results for token lists for the current network\nexport function useCofheTokenLists(\n { chainId }: UseTokenListsInput,\n queryOptions?: UseTokenListsOptions\n): UseTokenListsResult {\n const widgetConfig = useCofheContext().client.config.react;\n const tokensListsUrls = chainId ? widgetConfig.tokenLists?.[chainId] : [];\n\n const queriesOptions: UseQueryOptions<TokenList, Error>[] =\n tokensListsUrls?.map((url) => ({\n cacheTime: Infinity,\n staleTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: ['tokenList', chainId, url],\n queryFn: async ({ signal }): Promise<TokenList> => {\n const timestamp = Date.now();\n const urlWithCacheBust = `${url}${url.includes('?') ? '&' : '?'}v=${timestamp}`;\n const res = await fetch(urlWithCacheBust, { signal });\n if (!res.ok) {\n throw new Error(`Failed to fetch token list: ${res.status} ${res.statusText}`);\n }\n return await res.json();\n },\n select: (data: TokenList): TokenList => {\n // filter only tokens for the current chain (some lists contain multiple chains)\n return {\n ...data,\n tokens: data.tokens.filter((token) => token.chainId === chainId),\n };\n },\n ...queryOptions,\n })) || [];\n\n const result = useInternalQueries({\n queries: queriesOptions,\n });\n\n return result;\n}\n\nexport function selectTokensFromTokensList(tokenList: TokenList): Token[] {\n return tokenList.tokens;\n}\n\nexport function useCofheTokens(chainId?: number): Token[] {\n const tokenLists = useCofheTokenLists({ chainId });\n const tokens = useMemo(() => {\n const map = new Map<string, Token>();\n tokenLists.forEach((result) => {\n if (!result.data) return;\n\n result.data.tokens.forEach((token) => {\n const key = `${token.chainId}-${token.address.toLowerCase()}`;\n if (map.has(key)) return;\n map.set(key, token);\n });\n });\n return Array.from(map.values());\n }, [tokenLists]);\n return tokens;\n}\n\nexport function useCofheToken(\n { chainId: _chainId, address }: { chainId?: number; address?: Address },\n // TODO: after adding this functionality, don't fetch if not enabled\n metdataQueryOptions?: Omit<UseQueryOptions<Token | undefined, Error>, 'queryKey' | 'queryFn' | 'select'>\n) {\n const cofheChainId = useCofheChainId();\n const chainId = _chainId ?? cofheChainId;\n\n const tokens = useCofheTokens(chainId);\n const tokenFromList = useMemo(() => {\n if (!address || !chainId) return;\n return tokens.find((t) => t.chainId === chainId && t.address.toLowerCase() === address.toLowerCase());\n }, [address, chainId, tokens]);\n\n // TODO: fetch from chain (metadata) if all the token lists have been loaded but token is not found\n\n return tokenFromList;\n}\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheAccount, useCofhePublicClient } from './useCofheConnection';\nimport { type Token, ETH_ADDRESS_LOWERCASE } from './useCofheTokenLists';\nimport { ERC20_BALANCE_OF_ABI } from '../constants/erc20ABIs';\nimport { assert } from 'ts-essentials';\nimport { useInternalQuery } from '../providers/index';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\n\nexport function constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId?: number;\n accountAddress?: Address;\n tokenAddress?: Address;\n}): readonly unknown[] {\n return ['tokenBalance', chainId, accountAddress?.toLowerCase(), tokenAddress?.toLowerCase()];\n}\n\nexport function constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId: number;\n accountAddress: Address;\n tokenAddress: Address;\n}) {\n return constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n });\n}\n\ntype UseTokenBalanceInput = {\n /** Token contract address */\n tokenAddress?: Address;\n /** Account address to check balance for (optional, defaults to connected account) */\n accountAddress?: Address;\n};\n\nexport type UseTokenBalanceOptions<TSelectedData = bigint> = Omit<\n UseQueryOptions<bigint, Error, TSelectedData>,\n 'queryKey' | 'queryFn'\n>;\n\nexport type PublicTokenBalanceSource = {\n address: Address;\n decimals: number;\n};\n\nexport function getPublicTokenBalanceSource(token: Token | undefined): PublicTokenBalanceSource | undefined {\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n const underlyingErc20 = token?.extensions.fhenix.erc20Pair;\n\n const tokenToFetchBalanceFrom =\n confidentialityType === 'wrapped' ? underlyingErc20 : confidentialityType === 'dual' ? token : undefined;\n\n if (!tokenToFetchBalanceFrom) return undefined;\n\n return {\n address: tokenToFetchBalanceFrom.address,\n decimals: tokenToFetchBalanceFrom.decimals,\n };\n}\n\nexport function createPublicTokenBalanceQueryOptions<TSelectedData = bigint>(params: {\n publicClient: ReturnType<typeof useCofhePublicClient>;\n accountAddress?: Address;\n tokenAddress?: Address;\n queryOptions?: UseTokenBalanceOptions<TSelectedData>;\n}): UseQueryOptions<bigint, Error, TSelectedData> {\n const { publicClient, accountAddress, tokenAddress, queryOptions } = params;\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions ?? {};\n const baseEnabled = !!publicClient && !!accountAddress && !!tokenAddress;\n const enabled = baseEnabled && (userEnabled ?? true);\n\n const queryKey = constructPublicTokenBalanceQueryKey({\n chainId: publicClient?.chain?.id,\n accountAddress,\n tokenAddress,\n });\n\n return {\n queryKey,\n queryFn: async () => {\n assert(tokenAddress, 'Token address is required to fetch token balance');\n assert(publicClient, 'PublicClient is required to fetch token balance');\n assert(accountAddress, 'Account address is required to fetch token balance');\n\n const isNativeToken = tokenAddress.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n const balance = isNativeToken\n ? publicClient.getBalance({\n address: accountAddress,\n })\n : publicClient.readContract({\n address: tokenAddress,\n abi: ERC20_BALANCE_OF_ABI,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n\n return balance;\n },\n enabled,\n refetchOnMount: false,\n ...restQueryOptions,\n };\n}\n\n/**\n * Hook to get ERC20 token balance and return normalized display value\n * @param input - Token address, decimals, and optional publicClient/accountAddress\n * @param queryOptions - Optional React Query options\n * @returns Query result with normalized balance as string\n */\nfunction useTokenBalance<TSelectedData = bigint>(\n { tokenAddress, accountAddress }: UseTokenBalanceInput,\n queryOptions?: UseTokenBalanceOptions<TSelectedData>\n) {\n const publicClient = useCofhePublicClient();\n\n return useInternalQuery(\n createPublicTokenBalanceQueryOptions({\n publicClient,\n accountAddress,\n tokenAddress,\n queryOptions,\n })\n );\n}\n\n// ============================================================================\n// Unified Public Balance Hook\n// ============================================================================\n\ntype UsePublicTokenBalanceInput = {\n /** Token from token list */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UsePublicTokenBalanceResult = {\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Hook to get public (non-confidential) balance for a token.\n * Handles both dual tokens (balanceOf on token address) and wrapped tokens (balanceOf on erc20Pair or native ETH).\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenPublicBalance(\n { token, accountAddress, displayDecimals = 5 }: UsePublicTokenBalanceInput,\n options?: Omit<UseTokenBalanceOptions, 'select'> // disallow passing 'select' because it's harder to type\n): UsePublicTokenBalanceResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress || connectedAccount;\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const tokenToFetchBalanceFrom = getPublicTokenBalanceSource(token);\n\n const { data, isFetching, refetch } = useTokenBalance(\n {\n tokenAddress: tokenToFetchBalanceFrom?.address,\n accountAddress: account,\n },\n {\n enabled: userEnabled,\n select: (value) => {\n assert(\n typeof tokenToFetchBalanceFrom?.decimals === 'number',\n 'Token decimals must be defined to format public token balance'\n );\n return formatTokenAmount(value, tokenToFetchBalanceFrom.decimals, displayDecimals);\n },\n ...restOptions,\n }\n );\n\n return {\n data,\n isFetching,\n refetch,\n };\n}\n","import { parseAbi } from 'viem';\n\n// ============================================================================\n// Standard ERC20 ABIs\n// ============================================================================\n\n/**\n * Standard ERC20 balanceOf function ABI\n */\nexport const ERC20_BALANCE_OF_ABI = parseAbi(['function balanceOf(address owner) view returns (uint256)']);\n\n/**\n * Standard ERC20 decimals function ABI\n */\nexport const ERC20_DECIMALS_ABI = parseAbi(['function decimals() view returns (uint8)']);\n\n/**\n * Standard ERC20 symbol function ABI\n */\nexport const ERC20_SYMBOL_ABI = parseAbi(['function symbol() view returns (string)']);\n\n/**\n * Standard ERC20 name function ABI\n */\nexport const ERC20_NAME_ABI = parseAbi(['function name() view returns (string)']);\n","import BigNumber from 'bignumber.js';\n\nexport type TokenFormatOutput = {\n /** Raw balance in smallest unit (bigint) */\n wei: bigint;\n /** Numeric balance value */\n unit: BigNumber;\n /** Formatted balance string */\n formatted: string;\n};\n\nexport function formatTokenAmount(amount: bigint, decimals: number, displayDecimals?: number): TokenFormatOutput {\n const amountBN = new BigNumber(amount).dividedBy(10 ** decimals);\n return {\n wei: amount,\n unit: amountBN,\n formatted: displayDecimals\n ? amountBN\n .toFixed(displayDecimals)\n // remove trailing zeros\n .replace(/\\.?0+$/, '')\n : amountBN.toFixed(), // the only precise way, without parseFloat\n };\n}\n\nexport function unitToWei(amount: string, decimals: number): bigint {\n return BigInt(new BigNumber(amount).multipliedBy(10 ** decimals).toFixed(0));\n}\n\nexport function formatUsdAmount(amount: number | BigNumber, displayDecimals: number = 2): string {\n const amountBN = BigNumber.isBigNumber(amount) ? amount : new BigNumber(amount);\n return `$${amountBN.toFormat(displayDecimals)}`;\n}\n","import { QueryClient, type QueryKey, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { DUAL_GET_UNSHIELD_CLAIM_ABI, WRAPPED_GET_USER_CLAIMS_ABI } from '../constants/confidentialTokenABIs.js';\nimport { useInternalQuery } from '../providers/index.js';\nimport { decryptionAwareReadContract } from '@/utils/decryptionAwareReadContract.js';\nimport { useIsWaitingForDecryptionToInvalidate } from './useIsWaitingForDecryptionToInvalidate.js';\nimport { assert } from 'ts-essentials';\n\nexport function constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number | undefined;\n tokenAddress: Address | undefined;\n confidentialityType: string | undefined;\n accountAddress: Address | undefined;\n}) {\n return ['unshieldClaims', chainId, tokenAddress, confidentialityType, accountAddress];\n}\nexport function invalidateClaimableQueries({\n token,\n accountAddress,\n queryClient,\n}: {\n token: Token;\n accountAddress: Address;\n queryClient: QueryClient;\n}) {\n console.log('Invalidating unshield claims queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress,\n }),\n });\n}\n\nexport function constructUnshieldClaimsQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number;\n tokenAddress: Address;\n confidentialityType: string;\n accountAddress: Address;\n}) {\n return constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n });\n}\n\nexport const DEFAULT_UNSHIELD_CLAIM_SUMMARY: UnshieldClaimsSummary = {\n claimableAmount: 0n,\n pendingAmount: 0n,\n hasClaimable: false,\n hasPending: false,\n};\n\nexport function isTokenConfidentialityTypeClaimable(type: string | undefined): type is 'dual' | 'wrapped' {\n return type === 'dual' || type === 'wrapped';\n}\n\nexport type FetchUnshieldClaimsSummaryInput = {\n publicClient: NonNullable<ReturnType<typeof useCofhePublicClient>>;\n token: Token;\n accountAddress: Address;\n confidentialityType: 'dual' | 'wrapped';\n queryKey: QueryKey;\n signal: AbortSignal;\n};\n\nexport async function fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress,\n confidentialityType,\n queryKey,\n signal,\n}: FetchUnshieldClaimsSummaryInput): Promise<UnshieldClaimsSummary> {\n if (confidentialityType === 'dual') {\n const claim = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: DUAL_GET_UNSHIELD_CLAIM_ABI,\n functionName: 'getUserUnshieldClaim',\n args: [accountAddress],\n },\n });\n\n if (claim.ctHash === 0n || claim.claimed) return DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n\n return {\n claimableAmount: claim.decrypted ? claim.decryptedAmount : 0n,\n pendingAmount: claim.decrypted ? 0n : claim.requestedAmount,\n hasClaimable: claim.decrypted && claim.decryptedAmount > 0n,\n hasPending: !claim.decrypted,\n };\n }\n\n if (confidentialityType === 'wrapped') {\n const result = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: WRAPPED_GET_USER_CLAIMS_ABI,\n functionName: 'getUserClaims',\n args: [accountAddress],\n },\n });\n\n const claims = result.filter((c) => !c.claimed);\n\n const { claimableAmount, pendingAmount } = claims.reduce(\n (acc, claim) => {\n if (claim.decrypted) {\n acc.claimableAmount += claim.decryptedAmount;\n } else {\n acc.pendingAmount += claim.requestedAmount;\n }\n return acc;\n },\n { claimableAmount: 0n, pendingAmount: 0n }\n );\n\n return {\n claimableAmount,\n pendingAmount,\n hasClaimable: claimableAmount > 0n,\n hasPending: pendingAmount > 0n,\n };\n }\n\n return DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n}\n\n// ============================================================================\n// Unified Unshield Claims Hook\n// ============================================================================\n\n/**\n * Unified unshield claims summary - works for both dual and wrapped tokens\n */\nexport type UnshieldClaimsSummary = {\n /** Total amount that can be claimed now (decrypted and not claimed) */\n claimableAmount: bigint;\n /** Total amount pending decryption */\n pendingAmount: bigint;\n /** Whether there are any claimable amounts */\n hasClaimable: boolean;\n /** Whether there are any pending (not yet decrypted) claims */\n hasPending: boolean;\n};\n\ntype UseUnshieldClaimsInput = {\n /** Token object with confidentialityType */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsOptions = Omit<UseQueryOptions<UnshieldClaimsSummary, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Unified hook to fetch unshield claims for any token type (dual or wrapped)\n * @param input - Token object and optional account address\n * @param queryOptions - Optional React Query options\n * @returns Query result with UnshieldClaimsSummary\n */\nexport function useCofheTokenClaimable(\n { accountAddress: account, token }: UseUnshieldClaimsInput,\n queryOptions?: UseUnshieldClaimsOptions\n): UseQueryResult<UnshieldClaimsSummary, Error> & {\n isWaitingForDecryption: boolean;\n} {\n const publicClient = useCofhePublicClient();\n\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token?.chainId,\n tokenAddress: token?.address,\n confidentialityType,\n accountAddress: account,\n });\n // is waiting for decryption finalization -> once Unshield tx mined, but before Decryption result available\n const isWaitingForDecryption = useIsWaitingForDecryptionToInvalidate(queryKey);\n\n const result = useInternalQuery({\n queryKey,\n queryFn: async ({ signal, queryKey }): Promise<UnshieldClaimsSummary> => {\n assert(token, 'token is guaranteed to be defined in query function due to `enabled` condition');\n assert(confidentialityType, 'token.confidentialityType is guaranteed to be defined in query function');\n assert(account, 'account is guaranteed to be defined in query function due to `enabled` condition');\n assert(publicClient, 'publicClient is guaranteed to be defined in query function due to `enabled` condition');\n\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType is guaranteed to be claimable type due to `enabled` condition'\n );\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: !!publicClient && !!account && !!token && isTokenConfidentialityTypeClaimable(confidentialityType),\n ...queryOptions,\n });\n\n return {\n ...result,\n isWaitingForDecryption,\n };\n}\n","import { type QueryKey } from '@tanstack/react-query';\nimport { type Abi, type Address, type ContractFunctionArgs, type ContractFunctionName, type PublicClient } from 'viem';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore.js';\nimport {\n maybeWaitUntilRpcAwareAndReadContract,\n type ReadContractResult,\n type WaitUntilRpcAwareAndReadContractOptions,\n} from '../utils/waitUntilRpcAwareAndReadContract.js';\n\nexport const BLOCK_AWARENESS_POLLING_INTERVAL = 3_000; // 5 seconds\n\ntype Input<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> = {\n publicClient: PublicClient;\n queryKey: QueryKey;\n signal: AbortSignal;\n readContractParams: {\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n };\n};\nexport function decryptionAwareReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>({\n publicClient,\n queryKey,\n signal,\n readContractParams,\n}: Input<TAbi, TfunctionName>): Promise<ReadContractResult<TAbi, TfunctionName>> {\n const decryptionWatchersState = useDecryptionWatchersStore.getState();\n\n // if there was a tx previously, which caused the need to invalidae this query upon decryption observation,\n // and if decryption has been observed for it, use the block hash to ensure RPC is aware of it\n // so that readContract can read up-to-date data\n const blockHashToBeAwareOf =\n decryptionWatchersState.findObservedDecryption(queryKey)?.decryptionObservedAt?.blockHash;\n\n console.log('Tracked decryption block for unshield claims:', blockHashToBeAwareOf);\n\n const rpcAwarenessOptions: WaitUntilRpcAwareAndReadContractOptions = {\n signal,\n pollingInterval: BLOCK_AWARENESS_POLLING_INTERVAL,\n onSuccess: () => {\n // once we have successfully read decrypted data, remove the invalidation tracking\n decryptionWatchersState.removeQueryKeyFromWatchers(queryKey);\n },\n };\n\n return maybeWaitUntilRpcAwareAndReadContract(\n publicClient,\n {\n blockHashToBeAwareOf,\n ...readContractParams,\n },\n rpcAwarenessOptions\n );\n}\n","import type { QueryKey } from '@tanstack/react-query';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { TransactionActionType } from './transactionStore';\n\nexport type DecryptionWatcherStatus = 'scheduled' | 'executed';\n\nexport type DecryptionWatcher = {\n key: `${TransactionActionType}-tx-0x${string}`;\n createdAt: number;\n triggerTxHash: `0x${string}`;\n decryptionObservedAt?: {\n blockNumber: bigint;\n timestamp: number;\n blockHash?: `0x${string}`;\n };\n chainId: number;\n accountAddress: Address;\n queryKeys: QueryKey[];\n};\n\ntype DecryptionWatchersState = {\n byKey: Record<string, DecryptionWatcher>;\n\n upsert: (input: Omit<DecryptionWatcher, 'status'> & { status?: DecryptionWatcherStatus }) => void;\n setDecryptionObservedAt: (params: { key: string; blockNumber: bigint; blockHash?: `0x${string}` }) => void;\n findObservedDecryption: (queryKey: QueryKey) => DecryptionWatcher | undefined;\n removeQueryKeyFromWatchers: (queryKey: QueryKey) => void;\n};\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<DecryptionWatchersState>(() => localStorage, bigintJSONStorageOptions);\n\nexport const useDecryptionWatchersStore = create<DecryptionWatchersState>()(\n persist(\n (set, get) => ({\n byKey: {},\n\n upsert: (input) => {\n set((state) => {\n return {\n byKey: {\n ...state.byKey,\n [input.key]: input,\n },\n };\n });\n },\n findObservedDecryption: (queryKey) => {\n return Object.values(get().byKey).find((item) =>\n item.queryKeys.some((key) => JSON.stringify(key) === JSON.stringify(queryKey) && !!item.decryptionObservedAt)\n );\n },\n removeQueryKeyFromWatchers: (queryKey) => {\n set((state) => {\n const updatedByKey = { ...state.byKey };\n // remove the queryKey from all scheduled invalidations\n for (const [key, item] of Object.entries(updatedByKey)) {\n const matchingIndex = item.queryKeys.findIndex(\n (keyInItem) => JSON.stringify(keyInItem) === JSON.stringify(queryKey)\n );\n if (matchingIndex !== -1) {\n const newQueryKeys = [...item.queryKeys];\n newQueryKeys.splice(matchingIndex, 1);\n updatedByKey[key] = {\n ...item,\n queryKeys: newQueryKeys,\n };\n }\n }\n\n // if any invalidation has no more queryKeys, remove it entirely\n for (const [key, item] of Object.entries(updatedByKey)) {\n if (item.queryKeys.length === 0) {\n delete updatedByKey[key];\n }\n }\n return {\n byKey: updatedByKey,\n };\n });\n },\n\n setDecryptionObservedAt: ({\n key,\n blockNumber,\n blockHash,\n }: {\n key: string;\n blockNumber: bigint;\n blockHash?: `0x${string}`;\n }) => {\n set((state) => {\n const existing = state.byKey[key];\n if (!existing) return state;\n return {\n byKey: {\n ...state.byKey,\n [key]: {\n ...existing,\n decryptionObservedAt: {\n blockNumber,\n blockHash,\n timestamp: Date.now(),\n },\n },\n },\n };\n });\n },\n }),\n {\n name: 'cofhe-scheduled-invalidations',\n storage: bigintStorage,\n version: 1,\n }\n )\n);\n","import { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useMemo } from 'react';\nimport type { QueryKey } from '@tanstack/react-query';\n\nexport function useAwaitingDecryptionQueryKeySet(): ReadonlySet<string> {\n const { byKey } = useDecryptionWatchersStore();\n\n const cacheKeysAwaitingDecryption = useMemo(() => Object.values(byKey).flatMap((item) => item.queryKeys), [byKey]);\n\n return useMemo(\n () => new Set(cacheKeysAwaitingDecryption.map((key) => JSON.stringify(key))),\n [cacheKeysAwaitingDecryption]\n );\n}\n\nexport function useIsWaitingForDecryptionToInvalidate(queryKey: QueryKey): boolean {\n const cacheKeySet = useAwaitingDecryptionQueryKeySet();\n\n const result = useMemo(() => cacheKeySet.has(JSON.stringify(queryKey)), [cacheKeySet, queryKey]);\n\n console.log(`isWaitingForDecryption for queryKey ${JSON.stringify(queryKey)}:`, result);\n\n return result;\n}\n","import { useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransactions<T>({\n chainId,\n account,\n filter,\n reducer,\n}: {\n chainId?: number;\n account?: string;\n filter?: (tx: Transaction) => boolean;\n reducer?: (txs: Transaction[]) => T;\n}) {\n const transactions = useTransactionStore((state) => state.transactions);\n\n const transactionsAsArray = useMemo(\n () =>\n Object.values(\n chainId\n ? // if chainId provided -- will filter on chain's txs first\n transactions[chainId] ?? {}\n : // if chainId not provided -- will filter on all txs\n Object.values(transactions).flatMap((chainTxs) => Object.values(chainTxs))\n ),\n [transactions, chainId]\n );\n\n const filtered = useMemo(\n () =>\n transactionsAsArray.filter((tx) => {\n if (account && tx.account.toLowerCase() !== account.toLowerCase()) return false;\n\n if (filter && !filter(tx)) return false;\n\n return true;\n }),\n [transactionsAsArray, filter, account]\n );\n\n const reduced = useMemo(() => {\n return reducer?.(filtered);\n }, [filtered, reducer]);\n\n const uniqueHashes = new Set(filtered.map((tx) => tx.hash));\n\n assert(\n uniqueHashes.size === filtered.length,\n 'There should be no duplicate transactions with the same hash in the result'\n );\n\n const filteredTxsByHash = useMemo(\n () =>\n filtered.reduce<Record<`0x${string}`, Transaction>>((acc, tx) => {\n return {\n ...acc,\n [tx.hash]: tx,\n };\n }, {}),\n [filtered]\n );\n return {\n filteredTxs: filtered,\n hashes: uniqueHashes,\n filteredTxsByHash,\n reduced,\n };\n}\n","import { TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useStoredTransactions } from './useStoredTransactions';\n\nconst filter = (tx: Transaction) => tx.status === TransactionStatus.Pending;\nexport function usePendingTransactions(): Transaction[] {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs } = useStoredTransactions({\n chainId,\n account,\n filter,\n });\n return filteredTxs;\n}\n","import type {\n OpenPortalModalFn,\n PortalModal,\n PortalModalPropsMap,\n PortalModalState,\n} from '@/components/FnxFloatingButton/modals/types';\nimport { create } from 'zustand';\n\ntype PortalModalStore = {\n modalStack: PortalModalState[];\n};\n\ntype PortalModalActions = {\n openModal: OpenPortalModalFn;\n closeModal: (modal: PortalModal) => void;\n clearAllModals: () => void;\n};\n\nexport const usePortalModals = create<PortalModalStore & PortalModalActions>()((set, get) => ({\n modalStack: [],\n\n openModal: <M extends PortalModal>(\n ...args: PortalModalPropsMap[M] extends void ? [modal: M] : [modal: M, props: PortalModalPropsMap[M]]\n ) => {\n const [modal, props] = args;\n const onClose = () => get().closeModal(modal);\n const modalState = { modal, onClose, ...(props ?? {}) } as PortalModalState;\n set({ modalStack: [...get().modalStack, modalState] });\n },\n closeModal: (modal) => {\n set({ modalStack: get().modalStack.filter((m) => m.modal !== modal) });\n },\n clearAllModals: () => {\n set({ modalStack: [] });\n },\n}));\n","import { useMemo } from 'react';\nimport { create } from 'zustand';\nimport { usePortalStatuses } from './portalStatuses';\n\nconst ANIM_DURATION = 300;\n\ntype PortalUIStore = {\n portalOpen: boolean;\n statusPanelOpen: boolean;\n contentPanelOpen: boolean;\n contentHeights: Array<{ id: string; height: number }>;\n\n openTimeoutId: ReturnType<typeof setTimeout> | null;\n closeTimeoutId: ReturnType<typeof setTimeout> | null;\n};\n\ntype OpenPortalArgs = {\n onOpenBegin?: () => void;\n onOpenEnd?: () => void;\n};\ntype ClosePortalArgs = {\n onCloseBegin?: () => void;\n onCloseEnd?: () => void;\n};\ntype TogglePortalArgs = OpenPortalArgs & ClosePortalArgs;\n\ntype PortalUIActions = {\n clearTimeouts: () => void;\n openPortal: (args?: OpenPortalArgs) => void;\n closePortal: (args?: ClosePortalArgs) => void;\n togglePortal: (args?: TogglePortalArgs) => void;\n\n setContentHeight: (id: string, height: number) => void;\n removeContentHeight: (id: string) => void;\n};\n\nexport const usePortalUI = create<PortalUIStore & PortalUIActions>()((set, get) => ({\n portalOpen: false,\n statusPanelOpen: false,\n contentPanelOpen: false,\n contentHeights: [],\n\n openTimeoutId: null,\n closeTimeoutId: null,\n clearTimeouts: () => {\n const { openTimeoutId, closeTimeoutId } = get();\n if (openTimeoutId) clearTimeout(openTimeoutId);\n if (closeTimeoutId) clearTimeout(closeTimeoutId);\n set({ openTimeoutId: null, closeTimeoutId: null });\n },\n openPortal: (args = {}) => {\n const { onOpenBegin, onOpenEnd } = args;\n const { closeTimeoutId, statusPanelOpen } = get();\n\n // Open portal\n onOpenBegin?.();\n set({ portalOpen: true });\n\n // Cancel closing timeout\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n set({ closeTimeoutId: null });\n }\n\n // Open status panel immediately\n set({ statusPanelOpen: true });\n\n const hasOpenStatus = usePortalStatuses.getState().statuses.length > 0;\n if (statusPanelOpen || hasOpenStatus) {\n // Open content immediately if status panel visible or statuses exist\n set({ contentPanelOpen: true });\n onOpenEnd?.();\n } else {\n // Open content after delay\n const id = setTimeout(() => {\n set({ contentPanelOpen: true, openTimeoutId: null });\n onOpenEnd?.();\n }, ANIM_DURATION);\n\n set({ openTimeoutId: id });\n }\n },\n closePortal: (args = {}) => {\n const { onCloseBegin, onCloseEnd } = args;\n const { openTimeoutId } = get();\n\n // Close portal\n onCloseBegin?.();\n set({ portalOpen: false });\n\n // Cancel opening timeout\n if (openTimeoutId) {\n clearTimeout(openTimeoutId);\n set({ openTimeoutId: null });\n }\n\n // Close content immediately\n set({ contentPanelOpen: false });\n\n // Close status panel after delay\n const id = setTimeout(() => {\n set({ statusPanelOpen: false, closeTimeoutId: null });\n onCloseEnd?.();\n }, ANIM_DURATION);\n\n set({ closeTimeoutId: id });\n },\n togglePortal: (args) => {\n get().portalOpen ? get().closePortal(args) : get().openPortal(args);\n },\n\n setContentHeight: (id, height) => {\n const existing = get().contentHeights;\n const updated = [...existing.filter((h) => h.id !== id), { id, height }];\n set({ contentHeights: updated });\n },\n removeContentHeight: (id) => {\n set({ contentHeights: get().contentHeights.filter((height) => height.id !== id) });\n },\n}));\n\nexport const usePortalUIMaxContentHeight = () => {\n const { contentHeights } = usePortalUI();\n return useMemo(() => {\n return contentHeights.reduce((max, height) => Math.max(max, height.height), 0);\n }, [contentHeights]);\n};\n","import type { FnxStatus } from '@/components/FnxFloatingButton/types';\nimport { create } from 'zustand';\n\ntype PortalStatusesStore = {\n statuses: FnxStatus[];\n};\n\ntype PortalStatusesActions = {\n addStatus: (status: FnxStatus) => void;\n removeStatus: (id: string) => void;\n hasStatus: (id: string) => boolean;\n};\n\nexport const usePortalStatuses = create<PortalStatusesStore & PortalStatusesActions>()((set, get) => ({\n statuses: [],\n addStatus: (status) => {\n // avoid duplicates\n if (get().hasStatus(status.id)) return;\n\n const existing = get().statuses;\n set({ statuses: [...existing, status] });\n },\n removeStatus: (id) => {\n const existing = get().statuses;\n set({ statuses: existing.filter((s) => s.id !== id) });\n },\n hasStatus: (id) => {\n return get().statuses.some((s) => s.id === id);\n },\n}));\n","/* eslint-disable no-redeclare */\nimport {\n FloatingButtonPage,\n type FloatingButtonPagePropsMap,\n type PageState,\n type PagesWithProps,\n} from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { create } from 'zustand';\n\nexport type NavigateParams = {\n // When true, do not append to history; override current page instead\n skipPagesHistory?: boolean;\n};\n\nexport type NavigateArgs<K extends FloatingButtonPage> = {\n pageProps?: FloatingButtonPagePropsMap[K];\n navigateParams?: NavigateParams;\n};\n\ntype NavigateToFn = <K extends FloatingButtonPage>(\n page: K,\n ...rest: K extends PagesWithProps ? [args: NavigateArgs<K>] : [args?: NavigateArgs<K>]\n) => void;\n\ntype PortalNavigationStore = {\n pageHistory: PageState[];\n overridingPage: PageState | null;\n};\n\ntype PortalNavigationActions = {\n navigateTo: NavigateToFn;\n navigateBack: () => void;\n replace: NavigateToFn;\n clearNavigationHistory: () => void;\n};\n\nexport const usePortalNavigation = create<PortalNavigationStore & PortalNavigationActions>()((set, get) => {\n function clearNavigationHistory(): void {\n set({ pageHistory: [{ page: FloatingButtonPage.Main }], overridingPage: null });\n }\n\n function warnIfAlreadyOnPage<K extends FloatingButtonPage>(page: K): boolean {\n const currentPage = get().overridingPage ?? get().pageHistory[get().pageHistory.length - 1];\n const onPage = currentPage?.page === page;\n if (onPage) {\n console.warn(`Attempted to navigate to page ${page} but already on that page`);\n }\n return onPage;\n }\n\n const navigateTo: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n const args = rest[0];\n const props = args?.pageProps;\n const skipPagesHistory = args?.navigateParams?.skipPagesHistory === true;\n if (skipPagesHistory) {\n set({ overridingPage: { page, props } });\n } else {\n const existing = get().pageHistory;\n const updated = [...existing, { page, props }];\n set({ pageHistory: updated });\n }\n };\n\n const replace: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n clearNavigationHistory();\n\n navigateTo(page, ...rest);\n };\n\n return {\n pageHistory: [{ page: FloatingButtonPage.Main }],\n overridingPage: null,\n\n clearNavigationHistory,\n navigateTo,\n navigateBack: () => {\n if (get().overridingPage !== null) {\n // if currently there is an overriding page, just remove it\n set({ overridingPage: null });\n } else {\n // otherwise pop last page from history\n set({ pageHistory: get().pageHistory.slice(0, -1) });\n }\n },\n replace,\n };\n});\n\nexport const usePortalCurrentPage = () => {\n const { overridingPage, pageHistory } = usePortalNavigation();\n return overridingPage ?? pageHistory[pageHistory.length - 1];\n};\n","import { TbAlertTriangle, TbInfoCircle, TbCircleCheck, TbX } from 'react-icons/tb';\nimport { motion } from 'motion/react';\nimport { HashLink } from './HashLink';\nimport { cn } from '@/utils';\nimport type { FnxToastVariant, FnxToastImperativeParams, FnxToastInjectedProps } from '../types';\n\nexport type ToastPrimitiveProps = FnxToastImperativeParams & FnxToastInjectedProps;\n\nconst variantIconMap: Record<FnxToastVariant, React.ReactNode> = {\n info: <TbInfoCircle className=\"text-blue-500 size-5\" />,\n success: <TbCircleCheck className=\"text-green-500 size-5\" />,\n error: <TbAlertTriangle className=\"text-red-500 size-5\" />,\n warning: <TbAlertTriangle className=\"text-yellow-500 size-5\" />,\n};\n\nconst variantClassNameMap: Record<FnxToastVariant, string> = {\n info: 'bg-blue-50 border-blue-200 text-blue-800',\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n};\n\nconst variantProgressBarColorMap: Record<FnxToastVariant | 'base', string> = {\n base: 'bg-gray-500',\n info: 'bg-blue-500',\n success: 'bg-green-500',\n error: 'bg-red-500',\n warning: 'bg-yellow-500',\n};\n\nconst ToastCloseButton: React.FC<Pick<ToastPrimitiveProps, 'onDismiss'>> = ({ onDismiss }) => {\n return (\n <button className=\"self-start\" onClick={() => onDismiss?.()}>\n <TbX className=\"text-gray-500 size-5\" />\n </button>\n );\n};\n\nconst ToastActionButton: React.FC<Pick<ToastPrimitiveProps, 'action' | 'onDismiss'>> = ({ action, onDismiss }) => {\n if (action == null) return null;\n\n return (\n <button\n onClick={() => {\n onDismiss?.();\n action.onClick();\n }}\n >\n {action.label}\n </button>\n );\n};\n\nconst ToastDurationIndicator: React.FC<\n Pick<ToastPrimitiveProps, 'duration' | 'remainingMs' | 'paused' | 'variant'>\n> = ({ duration, remainingMs, paused, variant }) => {\n if (remainingMs == null || remainingMs <= 0 || duration == null || duration === 'infinite') return null;\n\n const progress = remainingMs / duration;\n const progressColor = variantProgressBarColorMap[variant ?? 'base'];\n\n return (\n <div className=\"absolute bottom-0 left-0 w-full h-1 overflow-hidden\">\n {paused ? (\n <div className={cn(progressColor, 'h-full origin-right')} style={{ transform: `scaleX(${progress})` }} />\n ) : (\n <motion.div\n className={cn('h-full origin-right', progressColor)}\n initial={{ scaleX: progress }}\n animate={{ scaleX: 0 }}\n transition={{\n duration: remainingMs / 1000,\n ease: 'linear',\n }}\n />\n )}\n </div>\n );\n};\n\nexport const ToastPrimitiveBase: React.FC<\n FnxToastInjectedProps & { variant?: FnxToastVariant; children: React.ReactNode }\n> = ({ id, duration, remainingMs, variant, paused, children, onPause, onDismiss }) => {\n return (\n <div\n className={cn(\n 'flex flex-row gap-3 p-2 relative items-center justify-start pb-3',\n variant != null && variantClassNameMap[variant]\n )}\n onMouseEnter={() => {\n if (id == null) return;\n onPause?.(true);\n }}\n onMouseLeave={() => {\n if (id == null) return;\n onPause?.(false);\n }}\n >\n {variant != null && variantIconMap[variant]}\n <div className=\"flex-1\">{children}</div>\n <ToastCloseButton onDismiss={onDismiss} />\n {duration !== 'infinite' && (\n <ToastDurationIndicator duration={duration} remainingMs={remainingMs} paused={paused} variant={variant} />\n )}\n </div>\n );\n};\n\nconst ToastContent: React.FC<\n Pick<ToastPrimitiveProps, 'title' | 'description' | 'transaction' | 'action' | 'onDismiss'>\n> = ({ title, description, transaction, action, onDismiss }) => {\n return (\n <>\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-sm font-medium\">{title}</h3>\n {description != null && <p className=\"text-xs\">{description}</p>}\n {transaction != null && <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} />}\n </div>\n <div className=\"flex-1\" />\n <ToastActionButton action={action} onDismiss={onDismiss} />\n </>\n );\n};\n\nexport const ToastPrimitive: React.FC<ToastPrimitiveProps> = (props) => {\n return (\n <ToastPrimitiveBase {...props}>\n <ToastContent {...props} />\n </ToastPrimitiveBase>\n );\n};\n","import { useState } from 'react';\nimport { LuCopy, LuCheck, LuExternalLink } from 'react-icons/lu';\nimport { cn } from '../../../utils/cn.js';\nimport {\n truncateHash,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n} from '../../../utils/utils.js';\n\nexport type HashLinkType = 'tx' | 'address' | 'token';\n\ninterface HashLinkProps {\n type: HashLinkType;\n hash: string;\n chainId?: number;\n className?: string;\n copyable?: boolean;\n iconSize?: number;\n /** Use extra short truncation (5...3 instead of 6...4) */\n extraShort?: boolean;\n}\n\nexport const HashLink: React.FC<HashLinkProps> = ({\n type,\n hash,\n chainId,\n className,\n copyable = true,\n iconSize = 14,\n extraShort = false,\n}) => {\n const start = extraShort ? 5 : 6;\n const end = extraShort ? 3 : 4;\n const ellipsed = truncateHash(hash, start, end);\n\n const getHref = (): string | undefined => {\n if (!chainId) return undefined;\n switch (type) {\n case 'tx':\n return getBlockExplorerTxUrl(chainId, hash);\n case 'address':\n return getBlockExplorerAddressUrl(chainId, hash);\n case 'token':\n return getBlockExplorerTokenUrl(chainId, hash);\n }\n };\n\n const href = getHref();\n\n const handleClick = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {copyable && <CopyButton text={hash} size={iconSize} />}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={!href}\n className={cn(\n 'flex items-center gap-1 font-mono text-xs hover:underline',\n 'fnx-text-primary opacity-60 hover:opacity-100 transition-opacity',\n !href && 'cursor-default hover:no-underline',\n className\n )}\n >\n <span>{ellipsed}</span>\n {href && <LuExternalLink style={{ width: iconSize, height: iconSize }} />}\n </button>\n </div>\n );\n};\n\ninterface CopyButtonProps {\n text: string;\n size?: number;\n className?: string;\n}\n// TODO: This will be replaced with the new copy system from another PR\nexport const CopyButton: React.FC<CopyButtonProps> = ({ text, size = 14, className }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 800);\n } catch (err) {\n console.error('Failed to copy address:', err);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn('fnx-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer', className)}\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <LuCheck style={{ width: size, height: size }} className=\"text-green-500\" />\n ) : (\n <LuCopy style={{ width: size, height: size }} />\n )}\n </button>\n );\n};\n","import { ToastPrimitive } from '@/components/FnxFloatingButton/components/ToastPrimitives';\nimport type { FnxFloatingButtonToast, FnxToastImperativeParams } from '@/components/FnxFloatingButton/types';\nimport { isReactNode } from '@/utils';\nimport { create } from 'zustand';\n\ntype PortalToastsStore = {\n toasts: FnxFloatingButtonToast[];\n};\n\ntype PortalToastsActions = {\n addToast: (toast: React.ReactNode | FnxToastImperativeParams, duration?: number | 'infinite') => void;\n pauseToast: (id: string, paused: boolean) => void;\n removeToast: (id: string) => void;\n};\n\nexport const usePortalToasts = create<PortalToastsStore & PortalToastsActions>()((set, get) => ({\n toasts: [],\n\n addToast: (toast, duration = 5000) => {\n const content = isReactNode(toast) ? toast : <ToastPrimitive {...toast} />;\n const existing = get().toasts;\n const updated = [\n ...existing,\n {\n id: crypto.randomUUID(),\n duration,\n startMs: Date.now(),\n remainingMs: duration === 'infinite' ? Infinity : duration,\n paused: false,\n content,\n },\n ];\n set({ toasts: updated });\n },\n pauseToast: (id, paused) => {\n const existing = get().toasts;\n const updated = existing.map((t) => {\n if (t.id !== id) return t;\n if (t.paused === paused) return t;\n\n let remainingMs = t.remainingMs;\n let startMs = Date.now();\n if (paused) {\n const elapsedMs = Date.now() - t.startMs;\n remainingMs = Math.max(0, t.remainingMs - elapsedMs);\n }\n\n return { ...t, paused, startMs, remainingMs };\n });\n set({ toasts: updated });\n },\n removeToast: (id) => {\n const existing = get().toasts;\n set({ toasts: existing.filter((t) => t.id !== id) });\n },\n}));\n","import { usePortalToasts } from '@/stores';\nimport type { DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport type { Transaction } from '@/stores/transactionStore';\nimport type { TransactionReceipt } from 'viem';\n\nconst TOAST_DELAY_MS = 10_000;\nfunction useTransactionGlobalToastsLifecycle() {\n const { addToast } = usePortalToasts();\n return {\n // 1.tx is submitted\n onTransactionSubmitted: (transaction: Transaction) => {\n console.log('____ Transaction submitted:', transaction);\n addToast(\n {\n variant: 'info',\n title: `${transaction.actionType} Transaction Submitted`,\n description: `${transaction.actionType} transaction has been submitted.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n onTransactionSubmitError: (error: unknown, transactionType: Transaction['actionType']) => {\n console.error('____ Transaction submission failed for type:', transactionType, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transactionType} Transaction Submission Failed`,\n description:\n error instanceof Error ? error.message : 'An unknown error occurred during transaction submission.',\n },\n TOAST_DELAY_MS\n );\n },\n\n // 2.a. tx is mined (could be success or fail)\n onTransactionMined: (transaction: Transaction, receipt: TransactionReceipt /* could be fail or success */) => {\n console.log('____ Transaction mined:', transaction, 'with receipt:', receipt);\n if (receipt.status === 'success') {\n const descriptionPostfix = transaction.isPendingDecryption ? ' It is pending decryption now.' : '';\n addToast(\n {\n variant: transaction.isPendingDecryption ? 'info' : 'success', // if pending decryption, show as info\n title: `${transaction.actionType} Transaction Mined`,\n description: `${transaction.actionType} transaction has been mined.${descriptionPostfix}`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n } else {\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Failed`,\n description: `${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n }\n },\n // 2.b. tx receipt fetch failed\n onWatchReceiptFailure: (error: unknown, transaction: Transaction) => {\n console.error('____ Transaction receipt fetch failed for tx:', transaction, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Fetch Failed`,\n description: `Fetching ${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n\n // 3. tx is decrypted (if applicable)\n onTransactionDecrypted: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => {\n console.log('____ Transaction decrypted:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n addToast(\n {\n variant: 'success',\n title: `${decryptionCausingTx.actionType} Decryption Succeeded`,\n description: `${decryptionCausingTx.actionType} transaction has been decrypted.`,\n transaction: {\n hash: decryptionCausingTx.hash,\n chainId: decryptionCausingTx.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n };\n}\n\nexport function useTransactionGlobalLifecycle() {\n const {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n } = useTransactionGlobalToastsLifecycle();\n\n // You can add more lifecycle handlers here in the future if needed. For now only toasts. Cache invalidations are built-in in other, lower-level hooks.\n return {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n };\n}\n","import { TransactionStatus, useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { useTransactionReceiptsByHash } from './useTransactionReceiptsByHash';\nimport { assert } from 'ts-essentials';\nimport { useCofheReadDecryptionResults } from './useCofheReadDecryptionResults';\nimport { useInternalQueryClient } from '@/providers';\nimport { useDecryptionWatchersStore, type DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle';\n\nfunction useHandleInvalidationsAfterDecryption() {\n const queryClient = useInternalQueryClient();\n return useCallback<UseTrackDecryptingTransactionsBaseInput['onDecryptionResolve']>(\n async (tx, decryptionWatcher) => {\n console.log('Invalidating queries for decryption watcher:', decryptionWatcher);\n for (const queryKey of decryptionWatcher.queryKeys) {\n console.log('Invalidating query due to observed decryption:', queryKey);\n // query invalidation will cause __decryption-block-aware__ readContract calls to wait until RPC is aware of the decryption block\n // and on successful read, the queryKey will be removed from the decryption watchers store,\n // and then if a watcher doesn't have queryKeys anymore, it will be removed entirely from the store\n // which ends the tracking lifecycle for that decryption event\n await queryClient.invalidateQueries({ queryKey });\n }\n },\n [queryClient]\n );\n}\n\nconst filter = (tx: Transaction) => tx.isPendingDecryption && tx.status === TransactionStatus.Confirmed;\ntype UseTrackDecryptingTransactionsBaseInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\nfunction useTrackDecryptingTransactionsBase({ onDecryptionResolve }: UseTrackDecryptingTransactionsBaseInput) {\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n // step 1: get all mined txs that are pending decryption\n const { hashes, filteredTxsByHash: minedTxsPendingDecryptionByHash } = useStoredTransactions({\n filter,\n account,\n chainId,\n });\n\n // todo: first check if pending queries cache already has that, might spare a request\n // step 2: get their receipts (to parse logs and find ciphertexts to watch)\n const { receiptsByHash } = useTransactionReceiptsByHash({\n hashes,\n });\n\n // step 3: from receipts, find ciphertexts to watch\n const minedTxsWithCiphertextsToWatch = useMemo(() => {\n return Object.entries(minedTxsPendingDecryptionByHash)\n .filter(([, tx]) => receiptsByHash[tx.hash] !== undefined)\n .map(([, tx]) => {\n const ciphertextToWatch = findDecryptRequestLog(tx.account, receiptsByHash[tx.hash].logs)?.ciphertext;\n assert(\n ciphertextToWatch,\n 'Ciphertext to watch should be found in the transaction logs if a tx that isPendingDecryption and has a receipt'\n );\n return {\n tx,\n receipt: receiptsByHash[tx.hash],\n ciphertextToWatch,\n };\n });\n }, [minedTxsPendingDecryptionByHash, receiptsByHash]);\n\n const ciphertextsToWatch = useMemo(() => {\n return new Set(minedTxsWithCiphertextsToWatch.map(({ ciphertextToWatch }) => ciphertextToWatch));\n }, [minedTxsWithCiphertextsToWatch]);\n\n // step 4: use decryption results polling hook to watch for decryption results\n const decryptionResults = useCofheReadDecryptionResults(ciphertextsToWatch);\n\n const queryClient = useInternalQueryClient();\n\n const { setDecryptionObservedAt } = useDecryptionWatchersStore();\n\n // step 5: when decryption results arrive, update store and and set decryptionObservedAt info to trigger invalidations\n useEffect(() => {\n const txsWithDecryptionResults = minedTxsWithCiphertextsToWatch\n .filter(({ ciphertextToWatch }) => decryptionResults[ciphertextToWatch] !== undefined)\n .map((item) => {\n const decryptionResult = decryptionResults[item.ciphertextToWatch];\n assert(decryptionResult, 'decryptionResult must be defined here');\n return {\n ...item,\n decryptionResult: decryptionResult,\n };\n });\n\n for (const { tx, decryptionResult, receipt, ciphertextToWatch } of txsWithDecryptionResults) {\n // update store\n useTransactionStore.getState().setTransactionDecryptionStatus(\n tx.chainId,\n tx.hash,\n false // no longer pending decryption\n );\n\n console.log('Decryption completed for tx, invalidating relevant queries', {\n tx,\n decryptionResult,\n receipt,\n ciphertextToWatch,\n });\n // before cache invalidation, make sure the request that follows will use up-to-date block number\n setDecryptionObservedAt({\n key: `${tx.actionType}-tx-${tx.hash}`,\n blockNumber: decryptionResult.observedAt.blockNumber,\n blockHash: decryptionResult.observedAt.blockHash,\n });\n }\n }, [decryptionResults, queryClient, setDecryptionObservedAt, minedTxsWithCiphertextsToWatch]);\n\n // step 6: invalidate relevant queries when decryption is observed\n useOnDecryptionCallback({\n onDecryptionResolve,\n });\n}\n\ntype OnDecryptionInput = {\n onDecryptionResolve: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => Promise<void>;\n};\nfunction useOnDecryptionCallback({ onDecryptionResolve }: OnDecryptionInput) {\n const { byKey } = useDecryptionWatchersStore();\n\n // step 1: get all query keys that need to be invalidated due to observed decryption\n const watchersWithObservedDecryption = useMemo(\n () => Object.values(byKey).filter((item) => item.decryptionObservedAt !== undefined),\n [byKey]\n );\n\n console.log('All observed decryptions:', watchersWithObservedDecryption);\n\n const handleDecryptionResolve = useCallback(async () => {\n const transactionStore = useTransactionStore.getState().transactions;\n for (const sch of watchersWithObservedDecryption) {\n const tx = transactionStore[sch.chainId]?.[sch.triggerTxHash];\n onDecryptionResolve(tx, sch);\n }\n }, [watchersWithObservedDecryption, onDecryptionResolve]);\n\n const stableHandleDecryptionResolve = useRef(handleDecryptionResolve);\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n\n useEffect(() => {\n stableHandleDecryptionResolve.current = handleDecryptionResolve;\n }, [handleDecryptionResolve]);\n\n useEffect(() => {\n if (watchersWithObservedDecryption.length > 0) {\n console.log('All observed decryption query keys subject to invalidate:', watchersWithObservedDecryption);\n stableHandleDecryptionResolve.current();\n }\n }, [watchersWithObservedDecryption]);\n}\n\nfunction findDecryptRequestLog(account: string, logs: { topics: string[]; data: string }[] = []) {\n for (const log of logs) {\n const result = safeParseDecryptRequestLog(log, account);\n if (result) return result;\n }\n return undefined;\n}\n\nfunction safeParseDecryptRequestLog(\n log: { topics: string[]; data: string },\n account: string\n):\n | false\n | {\n ciphertext: string;\n } {\n const topic0Correct = log.topics[0]\n ?.toLowerCase()\n .startsWith('0xe9de54a3e7ddf0c48cc6e1134185300d5a71acbf2d8c21fcdefa9d9dd9e20ac1');\n const topic1Correct = log.topics[1] === undefined;\n const strippedData = log.data.startsWith('0x') ? log.data.slice(2) : log.data;\n const dataAsWords = strippedData.match(/.{1,64}/g) || [];\n\n const word1IsCorrect =\n dataAsWords[1]?.toLowerCase() === '00000000000000000000000000000000000000000000000000000000000000a0';\n const word2IsCorrect = dataAsWords[2]?.toLowerCase() === account.toLowerCase().slice(2).padStart(64, '0');\n return topic0Correct && topic1Correct && word1IsCorrect && word2IsCorrect\n ? {\n ciphertext: '0x' + dataAsWords[0],\n }\n : false;\n}\n\nexport function useTrackDecryptingTransactions() {\n const handleInvalidationsAfterDecryption = useHandleInvalidationsAfterDecryption();\n const { onTransactionDecrypted } = useTransactionGlobalLifecycle();\n\n useTrackDecryptingTransactionsBase({\n onDecryptionResolve: async (decryptionCausingTx, decryptionWatcher) => {\n console.log('Decryption resolved for tx:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n handleInvalidationsAfterDecryption(decryptionCausingTx, decryptionWatcher);\n onTransactionDecrypted(decryptionCausingTx, decryptionWatcher);\n },\n });\n}\n","import { useMemo } from 'react';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { TransactionReceipt } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\n\ntype TxReceiptQueryKey = readonly ['tx-receipt', number | undefined, `0x${string}`];\n\nexport type UseTransactionReceiptsByHashInput = {\n hashes?: Set<`0x${string}`>;\n /** Defaults to the connected chain id. */\n chainId?: number;\n enabled?: boolean;\n /** Additional TanStack query options applied to each receipt query. */\n queryOptions?: Omit<\n UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>,\n 'queryKey' | 'queryFn' | 'enabled'\n >;\n};\n\nexport type UseTransactionReceiptsByHashResult = {\n queriesResults: UseQueryResult<TransactionReceipt, Error>[];\n receiptsByHash: Record<`0x${string}`, TransactionReceipt>;\n};\n\n/**\n * Fetch receipts for a list of already-mined transaction hashes.\n * Uses the internal TanStack QueryClient via `useInternalQueries`.\n */\nexport function useTransactionReceiptsByHash(\n { hashes, chainId: chainIdInput, enabled: enabledInput = true, queryOptions }: UseTransactionReceiptsByHashInput = {\n enabled: true,\n }\n): UseTransactionReceiptsByHashResult {\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const chainId = chainIdInput ?? cofheChainId;\n\n const enabled = !!publicClient && !!chainId && enabledInput && hashes !== undefined && hashes?.size > 0;\n\n const queries = useMemo(() => {\n if (!hashes) return [];\n return Array.from(hashes).map((hash) => {\n const queryKey: TxReceiptQueryKey = ['tx-receipt', chainId, hash];\n\n return {\n queryKey,\n enabled,\n queryFn: async (): Promise<TransactionReceipt> => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n // The caller guarantees these txs are already mined.\n return await publicClient.getTransactionReceipt({ hash });\n },\n notifyOnChangeProps: ['data'],\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n ...queryOptions,\n } satisfies UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>;\n });\n }, [chainId, enabled, hashes, publicClient, queryOptions]);\n\n const queriesResults: UseQueryResult<TransactionReceipt, Error>[] = useInternalQueries({\n queries,\n });\n\n const receiptsByHash = useMemo<Record<`0x${string}`, TransactionReceipt>>(() => {\n console.log('useTransactionReceiptsByHash - receiptsByHash recalculated');\n if (!hashes) return {};\n return Array.from(hashes).reduce<Record<`0x${string}`, TransactionReceipt>>((acc, hash, i) => {\n // skip those that don't have receipt data yet\n if (!queriesResults[i]?.data) return acc;\n\n acc[hash] = queriesResults[i].data;\n return acc;\n }, {});\n }, [hashes, queriesResults]);\n\n return { queriesResults, receiptsByHash };\n}\n","import { useMemo } from 'react';\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { TASK_MANAGER_ADDRESS } from '@cofhe/sdk';\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n// function getDecryptResultSafe(uint256 ctHash) external view returns (uint256, bool)\nconst TASK_MANAGER_ABI = [\n {\n type: 'function',\n name: 'getDecryptResultSafe',\n inputs: [\n {\n name: 'ctHash',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [\n {\n name: 'result',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'decrypted',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n\nconst DECRYPTION_RESULT_POLLING_INTERVAL_MS = 5_000;\nexport type DecryptionResultWithObservedBlock = {\n result: bigint;\n decrypted: true;\n observedAt: {\n blockNumber: bigint;\n blockHash: `0x${string}`;\n };\n};\nexport function useCofheReadDecryptionResults(ciphertexts: Set<string>) {\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n\n const queries = useMemo(() => {\n return Array.from(ciphertexts).map((ct) => {\n return {\n queryKey: ['decryptionResult', chainId, ct] as const,\n queryFn: async ({ signal }: { signal: AbortSignal }) => {\n if (!publicClient) throw new Error('PublicClient is required');\n\n // Keep the query in-flight until the decryption result is available.\n // This way `isFetching` reflects the real \"waiting for decryption\" period.\n while (!signal.aborted) {\n // Try to fetch (1) decryption result and (2) latest block header together.\n // If the transport batches, these should go in one JSON-RPC batch.\n const [res, block] = await Promise.allSettled([\n publicClient.readContract({\n address: TASK_MANAGER_ADDRESS,\n abi: TASK_MANAGER_ABI,\n functionName: 'getDecryptResultSafe',\n args: [BigInt(ct)],\n }),\n publicClient.getBlock(),\n ]);\n\n if (\n res.status === 'fulfilled' &&\n block.status === 'fulfilled' &&\n block.value?.hash &&\n block.value?.number\n ) {\n const decoded = res.value;\n const result = decoded[0];\n const decrypted = decoded[1];\n\n if (decrypted) {\n const data: DecryptionResultWithObservedBlock = {\n result,\n decrypted: true,\n observedAt: {\n blockNumber: block.value.number,\n blockHash: block.value.hash,\n },\n };\n\n return data;\n }\n }\n\n await sleep(DECRYPTION_RESULT_POLLING_INTERVAL_MS, signal);\n }\n\n throw abortError();\n },\n enabled: !!publicClient && !!chainId && ct !== undefined,\n };\n });\n }, [chainId, ciphertexts, publicClient]);\n\n const results = useInternalQueries({ queries });\n\n const isDecryptedByCt = useMemo(() => {\n return results.reduce<Record<string, DecryptionResultWithObservedBlock | undefined>>((record, res, index) => {\n const ct = Array.from(ciphertexts)[index];\n\n record[ct] = res.data;\n\n return record;\n }, {});\n }, [ciphertexts, results]);\n\n return isDecryptedByCt;\n}\n","import type { CofheClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport type { CofheConfigWithReact } from '@/config';\n\nexport const useCofheClient = (): CofheClient<CofheConfigWithReact> => {\n return useCofheContext().client;\n};\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { FheTypes } from '@cofhe/sdk';\nimport { type Token } from './useCofheTokenLists';\nimport { CONFIDENTIAL_ABIS, getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport { assert } from 'ts-essentials';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport { useCofheReadContractAndDecrypt } from './useCofheReadContractAndDecrypt';\n\n// ============================================================================\n// Unified Confidential Balance Hook\n// ============================================================================\n\ntype UseConfidentialTokenBalanceInput = {\n /** Token from token list */\n token?: Token;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UseConfidentialTokenBalanceOptions = Omit<UseQueryOptions<bigint, Error>, 'queryKey' | 'queryFn' | 'select'> & {\n enabled?: boolean;\n};\n\ntype UseConfidentialTokenBalanceResult = {\n /** Raw balance in smallest unit (bigint) */\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n disabledDueToMissingPermit: boolean;\n};\n\n/**\n * Hook to get confidential (encrypted) balance for a token with convenient formatting.\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with raw bigint, formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenDecryptedBalance(\n { token, accountAddress, displayDecimals = 5 }: UseConfidentialTokenBalanceInput,\n options?: UseConfidentialTokenBalanceOptions\n): UseConfidentialTokenBalanceResult {\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const contractConfig = token && getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n\n const {\n decrypted: { data: decryptedData, isFetching: isDecryptionFetching },\n encrypted: { isFetching: isEncryptedFetching, refetch: refetchCiphertext },\n disabledDueToMissingPermit,\n } = useCofheReadContractAndDecrypt(\n {\n address: token?.address,\n abi: contractConfig?.abi,\n functionName: contractConfig?.functionName,\n args: accountAddress ? [accountAddress] : undefined,\n requiresPermit: true,\n },\n {\n readQueryOptions: {\n refetchOnMount: false,\n enabled: userEnabled && !!token,\n },\n decryptingQueryOptions: {\n refetchOnMount: false,\n select: (amountWei) => {\n assert(token, 'Token must be defined to format confidential balance');\n if (typeof amountWei !== 'bigint') {\n throw new Error('Expected bigint from confidential decryption');\n }\n return formatTokenAmount(amountWei, token.decimals, displayDecimals);\n },\n },\n ...restOptions,\n }\n );\n\n return {\n disabledDueToMissingPermit,\n\n data: decryptedData,\n\n isFetching: isDecryptionFetching || isEncryptedFetching,\n refetch: refetchCiphertext,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address, type Abi, type ContractFunctionName, type ContractFunctionArgs } from 'viem';\nimport { FheTypes, type UnsealedItem } from '@cofhe/sdk';\nimport { useCofheDecrypt } from './useCofheDecrypt';\nimport {\n useCofheReadContract,\n type UseCofheReadContractQueryOptions,\n type UseCofheReadContractResult,\n} from './useCofheReadContract';\nimport type { CofheFirstReturnFheType, CofheReturnType, EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\ntype SupportedFheTypeFromReturn<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> =\n CofheFirstReturnFheType<TAbi, TfunctionName> extends FheTypes\n ? CofheFirstReturnFheType<TAbi, TfunctionName>\n : FheTypes;\n\nfunction isEncryptedValue<TFheType extends FheTypes>(value: unknown): value is EncryptedReturnTypeByUtype<TFheType> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'ctHash' in value &&\n 'utype' in value &&\n Object.values<unknown>(FheTypes).includes(value.utype)\n );\n}\n\nfunction convertCofheReturnTypeToEncryptedReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes,\n>(value: CofheReturnType<TAbi, TfunctionName>): EncryptedReturnTypeByUtype<TFheType> {\n if (isEncryptedValue<TFheType>(value)) return value;\n\n // TODO: convertCofheReturnTypeToEncryptedReturnType -- support for mixed return types (e.g., structs with both encrypted and plain values)\n throw new Error(\n 'Auto-decryption now only supports a case where the contract function returns a single encrypted value'\n );\n}\n/**\n * Generic hook: read a confidential contract value and decrypt it.\n */\n// TODO: useCofheReadContractAndDecrypt only works for a scenario when the contract function returns a signle plain encrypted value (i.e. not struct etc)\nexport function useCofheReadContractAndDecrypt<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes = SupportedFheTypeFromReturn<TAbi, TfunctionName>,\n TDecryptedSelectedData = UnsealedItem<TFheType>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n\n {\n readQueryOptions,\n decryptingQueryOptions,\n }: {\n readQueryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n decryptingQueryOptions?: Omit<\n UseQueryOptions<UnsealedItem<TFheType>, Error, TDecryptedSelectedData>,\n 'queryKey' | 'queryFn'\n >;\n } = {}\n): {\n encrypted: UseCofheReadContractResult<TAbi, TfunctionName>;\n decrypted: UseQueryResult<TDecryptedSelectedData, Error>;\n disabledDueToMissingPermit: boolean;\n} {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const encrypted = useCofheReadContract({ address, abi, functionName, args, requiresPermit }, readQueryOptions);\n\n const encryptedData = encrypted.data;\n\n const asEncryptedReturnType = encryptedData\n ? convertCofheReturnTypeToEncryptedReturnType<TAbi, TfunctionName, TFheType>(encryptedData)\n : undefined;\n\n const decrypted = useCofheDecrypt(\n {\n input: asEncryptedReturnType,\n },\n decryptingQueryOptions\n );\n\n return {\n encrypted,\n decrypted,\n disabledDueToMissingPermit: encrypted.disabledDueToMissingPermit,\n };\n}\n","import { useCofheContext, useInternalQuery } from '@/providers';\nimport { CofheError, FheTypes, type UnsealedItem } from '@cofhe/sdk';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { assert } from 'ts-essentials';\nimport type { EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\n/**\n * Hook to decrypt a ciphertext using the Cofhe client.\n * @param input - Ciphertext and FHE type\n * @param queryOptions - Optional React Query options\n * @returns Decrypted balance as bigint\n */\nexport function useCofheDecrypt<U extends FheTypes, TSeletedData = UnsealedItem<U>>(\n {\n input,\n }: {\n input?: EncryptedReturnTypeByUtype<U>;\n },\n queryOptions?: Omit<UseQueryOptions<UnsealedItem<U>, Error, TSeletedData>, 'queryKey' | 'queryFn'>\n): UseQueryResult<TSeletedData, Error> {\n const { client } = useCofheContext();\n const isCofheErrorActive = useIsCofheErrorActive();\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions || {};\n const enabled = !!input && BigInt(input.ctHash) > 0n && !isCofheErrorActive && !!client && (userEnabled ?? true);\n\n return useInternalQuery({\n enabled,\n queryKey: ['decryptCiphertext', input?.ctHash.toString(), input?.utype],\n queryFn: async () => {\n assert(input, 'input is guaranteed to be defined by enabled condition');\n return client.decryptForView(input.ctHash, input.utype).execute();\n },\n meta: {\n persist: true,\n },\n ...restQueryOptions,\n retry: (failureCount, error) => {\n if (error instanceof CofheError) return false; // don't retry decryption errors\n\n // default retry behavior - 3 retries\n return failureCount < 3;\n },\n });\n}\n","import { type Address } from 'viem';\nimport type { Token } from './useCofheTokenLists.js';\nimport { TRANSFER_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { type EncryptableItem } from '@cofhe/sdk';\nimport { useCofheEncryptAndWriteContract } from './useCofheEncryptAndWriteContract.js';\nimport type { useCofheWriteContractOptions } from './useCofheWriteContract.js';\nimport type { EncryptionOptions } from './useCofheEncrypt.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\ntype TokenTransferExtras = { token: Token; amount: bigint; userAddress: Address };\ntype UseCofheTokenTransferOptions = Pick<\n useCofheWriteContractOptions<TokenTransferExtras>,\n 'onSuccess' | 'onError' | 'onMutate'\n>;\n\ntype EncryptAndSendInput = {\n input: {\n token: Token;\n to: Address;\n amount: bigint;\n userAddress: Address;\n };\n encryptionOptions?: EncryptionOptions<EncryptableItem>;\n};\n\nexport function useCofheTokenTransfer(writeMutationOptions?: UseCofheTokenTransferOptions) {\n const { onSuccess: passedOnSuccess, onError: passedOnError, ...restOfOptions } = writeMutationOptions || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n const { encryption, write, encryptAndWrite } = useCofheEncryptAndWriteContract<TokenTransferExtras>({\n writingMutationOptions: {\n onError: (error, variables, onMutateResult, context) => {\n if (passedOnError) passedOnError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.ShieldSend);\n },\n onSuccess: (hash, variables, onMutateResult, context) => {\n if (passedOnSuccess) passedOnSuccess(hash, variables, onMutateResult, context);\n\n const extras =\n typeof variables === 'object' && variables !== null && 'extras' in variables ? variables.extras : null;\n\n if (!extras) return;\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: extras.token,\n tokenAmount: extras.amount,\n chainId: extras.token.chainId,\n actionType: TransactionActionType.ShieldSend,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account: extras.userAddress,\n });\n },\n ...restOfOptions,\n },\n });\n\n return {\n encryption,\n write,\n isPending: encryption.isPending || write.isPending,\n data: write.data,\n encryptAmountAndSendToken: ({ input, encryptionOptions }: EncryptAndSendInput) => {\n const { token, to, amount, userAddress } = input;\n\n const { input: _ignoredInput, ...encryptionOpts } = encryptionOptions ?? {};\n const contractConfig = TRANSFER_ABIS[token.extensions.fhenix.confidentialityType];\n\n return encryptAndWrite({\n params: {\n address: token.address,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n account: userAddress,\n chain: undefined,\n },\n args: [to, amount] as const,\n extras: {\n token,\n amount,\n userAddress,\n },\n encryptionOptions: encryptionOpts,\n });\n },\n };\n}\n","import type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n WriteContractParameters,\n WriteContractReturnType,\n} from 'viem';\nimport { type CofheInputArgsPreTransform, extractEncryptableValues, insertEncryptedValues } from '@cofhe/abi';\nimport type { EncryptableItem, EncryptedItemInput } from '@cofhe/sdk';\nimport { useCofheEncrypt, type EncryptInputsOptions, type UseCofheEncryptOptions } from './useCofheEncrypt';\nimport { useCofheWriteContract, type useCofheWriteContractOptions } from './useCofheWriteContract';\n\ntype NoInferLocal<T> = [T][T extends any ? 0 : never];\n\ntype ConfidentialityAwareAbiArgs<TAbi extends Abi | readonly unknown[], TFunctionName extends string> = NoInferLocal<\n Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n>;\n\nexport async function _encryptAndWriteContract<\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>({\n params,\n args,\n encrypt,\n write,\n}: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n // Don't let args participate in inferring `TAbi`/`TFunctionName`.\n // Otherwise, an incorrect args shape can cause TS to widen TAbi to `readonly unknown[]`\n // (and then args become `unknown[]`, silently accepting anything).\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>;\n write: (\n writeParams: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >\n ) => Promise<WriteContractReturnType>;\n}): Promise<WriteContractReturnType> {\n const transformer = constructEncryptAndTransform<TAbi, TFunctionName, TChainOverride>(\n params.abi,\n params.functionName,\n encrypt\n );\n const transformedArgs: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'] = await transformer(args);\n\n // You can’t fix that spot “purely” (no as … and no any) while keeping this wrapper fully-generic over TAbi/TFunctionName.\n // Reason: viem’s WriteContractParameters ultimately includes a conditional type that depends on:\n // readonly [] extends ContractFunctionArgs<TAbi, ..., TFunctionName>\n // Inside a generic function body, TypeScript must typecheck for all possible TAbi/TFunctionName, so it cannot prove which branch you’re in. That’s why it rejects constructing/passing newParams as WriteContractParameters<...> even when your runtime object is correct.\n const newParams = {\n ...params,\n args: transformedArgs,\n } as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >;\n\n return write(newParams);\n}\n\nfunction constructEncryptAndTransform<\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>(\n abi: TAbi,\n functionName: TFunctionName,\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>\n): (\n mixedArgs: Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n) => Promise<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args']\n> {\n // encrypts inputs that need to be encrypted and transform them\n return async (mixedArgs) => {\n const extracted = extractEncryptableValues(abi, functionName, mixedArgs);\n const encrypted = await encrypt(extracted);\n const merged = insertEncryptedValues(abi, functionName, mixedArgs, encrypted);\n\n // TODO: mismatch between CofheInputArgs<TAbi, TFunctionName> and WriteContractParameters<...>['args'] types\n return merged as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'];\n };\n}\n\nexport function useCofheEncryptAndWriteContract<TExtraVars = unknown>({\n encrypingMutationOptions,\n writingMutationOptions,\n}: {\n encrypingMutationOptions?: UseCofheEncryptOptions;\n writingMutationOptions?: useCofheWriteContractOptions<TExtraVars>;\n} = {}) {\n const encryption = useCofheEncrypt(encrypingMutationOptions);\n const write = useCofheWriteContract<TExtraVars>(writingMutationOptions);\n\n const encryptAndWrite = async <\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n >(args: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n extras?: TExtraVars;\n encryptionOptions?: EncryptInputsOptions;\n }) =>\n _encryptAndWriteContract<TAbi, TFunctionName, TChainOverride>({\n ...args,\n encrypt: (encryptableItems) =>\n encryption.encryptInputsAsync({\n items: encryptableItems as readonly EncryptableItem[],\n ...(args.encryptionOptions ?? {}),\n }),\n write: (writeParams) => {\n const vars =\n 'extras' in args ? { writeContractInput: writeParams, extras: args.extras as TExtraVars } : writeParams;\n\n return write.writeContractAsync<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride\n >(vars);\n },\n });\n\n return {\n encryptAndWrite,\n encryption,\n write,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport {\n assertCorrectEncryptedItemInput,\n EncryptStep,\n type EncryptableItem,\n type EncryptedItemInput,\n type EncryptStepCallbackContext,\n type EncryptedItemInputs,\n isLastEncryptionStep,\n} from '@cofhe/sdk';\nimport { assert } from 'ts-essentials';\nimport { useStepsState, type EncryptionStep, type StepsState } from './internal/useStepsState';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheContext } from '../providers/index.js';\nexport type EncryptableArray = readonly EncryptableItem[];\nexport type EncryptionOptions<T extends EncryptableItem | EncryptableArray> = {\n input?: T;\n account?: string;\n chainId?: number;\n securityZone?: number; // TODO: potential conflifct/ambiguity with createEncryptable arg - figure it out\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\ntype StepConfig = { label: string; progress: number };\nconst STEP_CONFIG: Record<EncryptStep, StepConfig> = {\n initTfhe: {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n fetchKeys: {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n pack: {\n label: 'Packing data...',\n progress: 40,\n },\n prove: {\n label: 'Generating proof...',\n progress: 70,\n },\n verify: {\n label: 'Verifying...',\n progress: 90,\n },\n};\n\nconst DONE_STEP_CONFIG: StepConfig = {\n label: 'Encryption complete!',\n progress: 100,\n};\n\nexport function getStepConfig(step: EncryptionStep) {\n if (isLastEncryptionStep(step.step) && step.context?.isEnd) return DONE_STEP_CONFIG;\n\n return STEP_CONFIG[step.step];\n}\ntype EncryptInputsResult<T extends readonly EncryptableItem[]> = EncryptedItemInputs<[...T]>;\n\nexport type EncryptInputsOptions = {\n account?: string;\n chainId?: number;\n securityZone?: number;\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\nexport type EncryptInputsVariables<T extends readonly EncryptableItem[] = readonly EncryptableItem[]> =\n | T\n | ({\n items: T;\n } & EncryptInputsOptions);\n\nfunction hasEncryptInputsOptions<T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n): variables is { items: T } & EncryptInputsOptions {\n return typeof variables === 'object' && variables !== null && 'items' in variables;\n}\n\nfunction assertEncryptInputsResult<T extends readonly EncryptableItem[]>(\n inputs: T,\n encrypted: readonly EncryptedItemInput[]\n): asserts encrypted is EncryptInputsResult<T> {\n if (encrypted.length !== inputs.length) {\n throw new Error(`Encryption result length mismatch (expected ${inputs.length}, got ${encrypted.length})`);\n }\n\n for (let i = 0; i < encrypted.length; i++) {\n const encryptedItem = encrypted[i];\n const inputItem = inputs[i];\n\n assertCorrectEncryptedItemInput(encryptedItem);\n\n if (encryptedItem.utype !== inputItem.utype) {\n throw new Error(`Encryption result type mismatch at index ${i}`);\n }\n }\n}\n\nexport type UseCofheEncryptOptions = Omit<\n UseMutationOptions<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: encrypt a list of EncryptableItems into encrypted input structs.\n *\n */\nexport function useCofheEncrypt(options?: UseCofheEncryptOptions): UseMutationResult<\n readonly EncryptedItemInput[],\n Error,\n EncryptInputsVariables,\n void\n> & {\n encryptInputsAsync: <const T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n ) => Promise<EncryptInputsResult<T>>;\n encryptInputs: (variables: EncryptInputsVariables) => void;\n isEncrypting: boolean;\n stepsState: StepsState;\n} {\n const client = useCofheContext().client;\n const stepsState = useStepsState();\n const { onStep: handleStepStateChange, onSetKey: handleStepSetKey } = stepsState;\n\n const mutation = useInternalMutation<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'encryptInputs'],\n mutationFn: async (variables) => {\n assert(client, 'CoFHE client not initialized');\n\n const key = crypto.randomUUID();\n handleStepSetKey(key);\n\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n // SDK expects a mutable array type; copy preserves runtime value while satisfying typing.\n const mutableItems = Array.from(items);\n\n const builder = client.encryptInputs(mutableItems);\n\n const externalOnStepChange = hasEncryptInputsOptions(variables) ? variables.onStepChange : undefined;\n\n const combinedOnStepChange = (step: EncryptStep, context?: EncryptStepCallbackContext) => {\n handleStepStateChange(key, step, context);\n externalOnStepChange?.(step, context);\n };\n\n // Always set callback so we can track steps consistently.\n builder.onStep(combinedOnStepChange);\n\n if (hasEncryptInputsOptions(variables)) {\n if (variables.account) builder.setAccount(variables.account);\n if (variables.chainId) builder.setChainId(variables.chainId);\n if (variables.securityZone) builder.setSecurityZone(variables.securityZone);\n }\n\n return builder.execute();\n },\n });\n\n return {\n ...mutation,\n encryptInputsAsync: async <const T extends readonly EncryptableItem[]>(variables: EncryptInputsVariables<T>) => {\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n const result = await mutation.mutateAsync(variables);\n assertEncryptInputsResult(items, result);\n return result;\n },\n encryptInputs: (variables) => mutation.mutate(variables),\n isEncrypting: mutation.isPending,\n stepsState,\n };\n}\n","import { EncryptStep, type EncryptStepCallbackContext } from '@cofhe/sdk';\nimport { useCallback, useMemo, useState } from 'react';\n\nexport type EncryptionStep = { step: EncryptStep; context?: EncryptStepCallbackContext };\n\ntype StepWithOrder = `${number}_${EncryptStep}_${'start' | 'stop'}`;\ntype CompactSteps = Partial<Record<StepWithOrder, number | undefined>>;\n\nfunction validateAndCompactizeSteps(encSteps: EncryptionStep[]): CompactSteps {\n const result: CompactSteps = {};\n encSteps.forEach((encStep, index) => {\n const postfix = encStep.context?.isStart ? 'start' : encStep.context?.isEnd ? 'stop' : null;\n if (!postfix) throw new Error('Invalid step context: must be start or end');\n\n const idx: StepWithOrder = `${index}_${encStep.step}_${postfix}`;\n\n result[idx] = encStep.context?.duration;\n });\n\n return result;\n}\n\n// Key is identifier for each encryption mutation call\nexport type StepsState = {\n onStep: (key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n onSetKey: (key: string | null) => void;\n compactSteps: CompactSteps;\n lastStep: EncryptionStep | null;\n};\n\nexport function useStepsState(): StepsState {\n const [steps, setSteps] = useState<Record<string, EncryptionStep[]>>({});\n const [currentKey, setCurrentKey] = useState<string | null>(null);\n\n const onStep = useCallback((key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => {\n if (step === EncryptStep.InitTfhe && context?.isStart) {\n // init with a single-element array\n setSteps((prev) => ({ ...prev, [key]: [{ step, context }] }));\n } else {\n setSteps((prev) => ({ ...prev, [key]: [...prev[key], { step, context }] }));\n }\n }, []);\n\n const onSetKey = useCallback((key: string | null) => {\n setCurrentKey(key);\n }, []);\n\n const compactSteps = useMemo(\n () => validateAndCompactizeSteps(currentKey ? steps[currentKey] : []),\n [steps, currentKey]\n );\n\n const lastStep = currentKey ? steps[currentKey][steps[currentKey].length - 1] : null;\n\n return {\n onStep,\n onSetKey,\n compactSteps,\n lastStep,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n Hash,\n WalletClient,\n WriteContractParameters,\n} from 'viem';\nimport { assert } from 'ts-essentials';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheWalletClient } from './useCofheConnection.js';\n\ntype WalletWriteContractParamsAny = Parameters<WalletClient['writeContract']>[0];\n\nexport type WalletWriteContractInputWithExtras<TExtras> = {\n writeContractInput: WalletWriteContractParamsAny;\n extras: TExtras;\n};\n\ntype WalletWriteContractMutationVariables<TExtras> =\n | WalletWriteContractParamsAny\n | WalletWriteContractInputWithExtras<TExtras>;\n\nfunction hasExtras<TExtras>(\n variables: WalletWriteContractMutationVariables<TExtras>\n): variables is WalletWriteContractInputWithExtras<TExtras> {\n return (\n typeof variables === 'object' && variables !== null && 'writeContractInput' in variables && 'extras' in variables\n );\n}\n\nexport type WalletWriteContractParams<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n> = WriteContractParameters<TAbi, TFunctionName, TArgs, Chain | undefined, Account | undefined, TChainOverride>;\n\nexport type useCofheWriteContractOptions<TExtras = unknown> = Omit<\n UseMutationOptions<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: call `walletClient.writeContract`.\n *\n * Unlike `useCofheWriteContract`, this accepts viem's full `writeContract` parameter type.\n */\nexport function useCofheWriteContract<TExtras = unknown>(\n options?: useCofheWriteContractOptions<TExtras>\n): UseMutationResult<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown> & {\n writeContractAsync: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => Promise<Hash>;\n writeContract: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => void;\n} {\n const walletClient = useCofheWalletClient();\n\n const mutation = useInternalMutation<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'walletWriteContract'],\n mutationFn: async (variables) => {\n assert(walletClient, 'WalletClient is required to write to a contract');\n\n const writeContractInput = hasExtras(variables) ? variables.writeContractInput : variables;\n return walletClient.writeContract(writeContractInput);\n },\n });\n\n const writeContractAsync = async <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutateAsync(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n const writeContract = <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutate(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n return {\n ...mutation,\n writeContractAsync,\n writeContract,\n };\n}\n","import {\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token, ETH_ADDRESS_LOWERCASE } from './useCofheTokenLists.js';\nimport {\n SHIELD_ABIS,\n UNSHIELD_ABIS,\n CLAIM_ABIS,\n DUAL_GET_UNSHIELD_CLAIM_ABI,\n WRAPPED_ETH_ENCRYPT_ETH_ABI,\n WRAPPED_ENCRYPT_ABI,\n WRAPPED_GET_USER_CLAIMS_ABI,\n ERC20_ALLOWANCE_ABI,\n ERC20_APPROVE_ABI,\n} from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation, useInternalQuery } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UnshieldClaim = {\n ctHash: bigint;\n requestedAmount: bigint;\n decryptedAmount: bigint;\n decrypted: boolean;\n claimed: boolean;\n};\n\ntype UseTokenShieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to shield (in token's smallest unit) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenShieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseTokenShieldInput>, 'mutationFn'>;\n\n// ============================================================================\n// Shield Hook\n// ============================================================================\n\n/**\n * Hook to shield tokens (convert regular balance to confidential)\n * - Dual tokens: calls `shield(uint256 amount)`\n * - Wrapped tokens: TBD (needs approval flow)\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenShield(\n options?: UseTokenShieldOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenShieldInput> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseTokenShieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token shield');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token shield');\n }\n\n // Only dual and wrapped support shielding\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Shield not supported for confidentialityType: ${confidentialityType}`);\n }\n\n let hash: `0x${string}`;\n\n if (confidentialityType === 'wrapped') {\n // Check if this is a wrapped ETH token (erc20Pair is ETH_ADDRESS)\n const erc20PairAddress = input.token.extensions.fhenix.erc20Pair?.address as Address | undefined;\n const isEth = erc20PairAddress?.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n if (isEth) {\n // For ETH: use encryptETH(address to) with value\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: WRAPPED_ETH_ENCRYPT_ETH_ABI,\n functionName: 'encryptETH',\n args: [walletClient.account.address],\n value: input.amount,\n account: walletClient.account,\n chain: undefined,\n });\n } else {\n // For ERC20 wrapped tokens: need to check allowance and approve if needed\n if (!erc20PairAddress) {\n throw new Error('erc20Pair address is required for wrapped ERC20 tokens');\n }\n\n if (!publicClient) {\n throw new Error('PublicClient is required for allowance check');\n }\n\n // Check current allowance\n input.onStatusChange?.('Checking allowance...');\n const currentAllowance = await publicClient.readContract({\n address: erc20PairAddress,\n abi: ERC20_ALLOWANCE_ABI,\n functionName: 'allowance',\n args: [walletClient.account.address, tokenAddress],\n });\n\n // If allowance is insufficient, request approval\n if (currentAllowance < input.amount) {\n input.onStatusChange?.('Approval required - please confirm in wallet...');\n // Request approval for the exact amount (or max uint256 for unlimited)\n const approvalHash = await walletClient.writeContract({\n address: erc20PairAddress,\n abi: ERC20_APPROVE_ABI,\n functionName: 'approve',\n args: [tokenAddress, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n\n // Wait for approval transaction to be confirmed\n input.onStatusChange?.('Waiting for approval confirmation...');\n await publicClient.waitForTransactionReceipt({ hash: approvalHash });\n input.onStatusChange?.('Approved! Now shielding...');\n }\n\n // Now call encrypt\n input.onStatusChange?.('Please confirm shield in wallet...');\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: WRAPPED_ENCRYPT_ABI,\n functionName: 'encrypt',\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n } else {\n // Dual tokens: use shield(uint256 amount)\n const contractConfig = SHIELD_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for shield: ${confidentialityType}`);\n }\n\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Shield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token shield');\n assert(account, 'Wallet account is required for token shield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Shield,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type MutationFunctionContext, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { UNSHIELD_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, TransactionStatus, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useOnceTransactionMined } from './useOnceTransactionMined.js';\nimport { useOnceDecrypted } from './useOnceDecrypted.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Unshield Hook\n// ============================================================================\ntype UseTokenUnshieldMutationInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to unshield (in token's smallest unit, uint64 max for dual) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenUnshieldMutationOptions = Omit<\n UseMutationOptions<`0x${string}`, Error, UseTokenUnshieldMutationInput>,\n 'mutationFn'\n>;\n/**\n * Hook to unshield tokens (initiate conversion from confidential to regular)\n * - Dual tokens: calls `unshield(uint64 amount)`, then need to claim\n * - Wrapped tokens: TBD\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nfunction useCofheTokenUnshieldMutation(\n options?: UseTokenUnshieldMutationOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenUnshieldMutationInput> {\n const walletClient = useCofheWalletClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n\n const { onSuccess, onError, ...restOfOptions } = options || {};\n\n return useInternalMutation({\n mutationFn: async (input: UseTokenUnshieldMutationInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token unshield');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token unshield');\n }\n\n // Only dual and wrapped support unshielding\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Unshield not supported for confidentialityType: ${confidentialityType}`);\n }\n\n const contractConfig = UNSHIELD_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for unshield: ${confidentialityType}`);\n }\n\n let hash: `0x${string}`;\n\n input.onStatusChange?.('Please confirm in wallet...');\n\n if (confidentialityType === 'wrapped') {\n // Wrapped tokens: decrypt(address to, uint128 value)\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n chain: undefined,\n });\n } else {\n // For dual tokens, unshield takes uint64\n const amount = BigInt.asUintN(64, input.amount);\n\n hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [amount],\n account: walletClient.account,\n chain: undefined,\n });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Unshield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token unshield');\n assert(account, 'Wallet account is required for token unshield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Unshield,\n isPendingDecryption: true, // is tx that requires decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n\ntype UseCofheTokenUnshieldInput = {\n onUserSignatureRequest?: (variables: UseTokenUnshieldMutationInput, context: MutationFunctionContext) => void;\n onTransactionSubmitSuccess?: (hash: `0x${string}`) => void;\n onTransactionSubmitError?: (error: Error) => void;\n onceMined?: (transaction: { hash: `0x${string}`; status: TransactionStatus }) => void;\n onceDecrypted?: () => void;\n};\nexport function useCofheTokenUnshield(input: UseCofheTokenUnshieldInput) {\n const unshieldMutation = useCofheTokenUnshieldMutation({\n onMutate: input.onUserSignatureRequest,\n onSuccess: input.onTransactionSubmitSuccess,\n onError: input.onTransactionSubmitError,\n });\n\n const { isMining: isTokenUnshieldMining } = useOnceTransactionMined({\n txHash: unshieldMutation.data,\n onceMined: input.onceMined,\n });\n\n const { isPendingDecryption } = useOnceDecrypted({\n txHash: unshieldMutation.data,\n onceDecrypted: input.onceDecrypted,\n });\n\n return {\n ...unshieldMutation,\n isTokenUnshieldMining,\n isPendingDecryption,\n };\n}\n","import { type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransaction(txHash: `0x${string}` | undefined) {\n const filter = useMemo(() => {\n return (tx: Transaction) => tx.hash === txHash;\n }, [txHash]);\n const { filteredTxs } = useStoredTransactions({ filter });\n assert(filteredTxs.length <= 1, 'There should be at most one transaction with a given hash');\n\n return filteredTxs[0];\n}\n","import type { Transaction, TransactionStatus } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when transaction is mined (i.e. goes from pending to final status - confirmed/failed)\n// i.e. it wont fire again if component re-renders or transaction status changes again (which shouldn't ever happen unless exception, as it's final data from the chain)\n\n// use this hook for ad-hock UI effects that should happen once tx is mined (e.g. show a toast, navigate, etc)\n// DO NOT use this hook for balance invalidation as it's handled in useTrackPendingTransactions\nexport function useOnceTransactionMined({\n txHash,\n onceMined,\n}: {\n txHash: `0x${string}` | undefined;\n onceMined?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange: onceMined\n ? (prevStatus, newStatus, transaction) => {\n if (prevStatus === 'pending' && (newStatus === 'confirmed' || newStatus === 'failed')) {\n onceMined(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isMining: transaction?.status === 'pending',\n };\n}\n\nfunction useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange,\n}: {\n txHash: `0x${string}` | undefined;\n onTransactionStatusChange?: (\n prevStatus: TransactionStatus | undefined,\n newStatus: TransactionStatus,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onTransactionStatusChange) return;\n\n // if status changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.status !== transaction?.status && !!transaction) {\n onTransactionStatusChange(previousTransactionRef.current?.status, transaction.status, transaction);\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onTransactionStatusChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import type { Transaction } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when a transaction enters \"pending decryption\" state\n// i.e. it won't fire again if component re-renders etc\nexport function useOnceDecrypted({\n txHash,\n onceDecrypted,\n}: {\n txHash: `0x${string}` | undefined;\n onceDecrypted?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange: onceDecrypted\n ? (prevIsPendingDecryption, newIsPendingDecryption, transaction) => {\n if (prevIsPendingDecryption === true && newIsPendingDecryption === false) {\n onceDecrypted(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isPendingDecryption: transaction?.isPendingDecryption === true,\n };\n}\n\nfunction useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange,\n}: {\n txHash: `0x${string}` | undefined;\n onDecryptionPendingChange?: (\n prevIsPendingDecryption: boolean | undefined,\n newIsPendingDecryption: boolean,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onDecryptionPendingChange) return;\n // if flag changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.isPendingDecryption !== transaction?.isPendingDecryption && !!transaction) {\n onDecryptionPendingChange(\n previousTransactionRef.current?.isPendingDecryption,\n transaction.isPendingDecryption,\n transaction\n );\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onDecryptionPendingChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import { type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { CLAIM_ABIS } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\n// ============================================================================\n// Claim Unshield Hook\n// ============================================================================\ntype UseClaimUnshieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount being claimed (for activity logging) */\n amount: bigint;\n};\ntype UseClaimUnshieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseClaimUnshieldInput>, 'mutationFn'>;\n/**\n * Hook to claim unshielded tokens after decryption completes\n * - Dual tokens: calls `claimUnshielded()`\n * - Wrapped tokens: calls `claimAllDecrypted()`\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenClaimUnshielded(\n options?: UseClaimUnshieldOptions\n): UseMutationResult<`0x${string}`, Error, UseClaimUnshieldInput> {\n const walletClient = useCofheWalletClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseClaimUnshieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for claim');\n }\n\n const tokenAddress = input.token.address as Address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for claim');\n }\n\n // Only dual and wrapped support claiming\n if (confidentialityType !== 'dual' && confidentialityType !== 'wrapped') {\n throw new Error(`Claim not supported for confidentialityType: ${confidentialityType}`);\n }\n\n const contractConfig = CLAIM_ABIS[confidentialityType];\n if (!contractConfig) {\n throw new Error(`Unsupported confidentialityType for claim: ${confidentialityType}`);\n }\n\n const hash = await walletClient.writeContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [],\n account: walletClient.account,\n chain: undefined,\n });\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Claim);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for claim');\n assert(account, 'Wallet account is required for claim');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n\n token: input.token,\n tokenAmount: input.amount,\n\n chainId,\n actionType: TransactionActionType.Claim,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type QueryFunctionContext, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { type Address } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport { useNormalizedList } from './useNormalizedList.js';\nimport { useIsWaitingForDecryptionByAddress } from './useIsWaitingForDecryptionByAddress.js';\nimport {\n constructUnshieldClaimsQueryKey,\n DEFAULT_UNSHIELD_CLAIM_SUMMARY,\n fetchUnshieldClaimsSummary,\n isTokenConfidentialityTypeClaimable,\n type UnshieldClaimsSummary,\n} from './useCofheTokenClaimable.js';\nimport { useStoredTransactions } from './useStoredTransactions.js';\nimport { TransactionActionType, TransactionStatus } from '@/stores/transactionStore.js';\n\nexport type UnshieldClaimsSummaryByTokenAddress = Record<Address, UnshieldClaimsSummary>;\nexport type ClaimableAmountByTokenAddress = Record<Address, bigint>;\nexport type BooleanByAddress = Record<Address, boolean>;\n\ntype UseUnshieldClaimsManyInput = {\n tokens: Token[];\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsManyOptions = Omit<\n UseQueryOptions<\n UnshieldClaimsSummary,\n Error,\n UnshieldClaimsSummary,\n ReturnType<typeof constructUnshieldClaimsQueryKey>\n >,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\ntype ClaimableToken = Token & {\n extensions: Token['extensions'] & {\n fhenix: Token['extensions']['fhenix'] & {\n confidentialityType: 'dual' | 'wrapped';\n };\n };\n};\n\nfunction isClaimableToken(token: Token): token is ClaimableToken {\n return isTokenConfidentialityTypeClaimable(token.extensions?.fhenix?.confidentialityType);\n}\n\nfunction claimableDedupeKey(token: ClaimableToken): string {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n return `${token.chainId}:${token.address.toLowerCase()}:${confidentialityType}`;\n}\n\nfunction claimableSort(a: ClaimableToken, b: ClaimableToken): number {\n if (a.chainId !== b.chainId) return a.chainId - b.chainId;\n return a.address.toLowerCase().localeCompare(b.address.toLowerCase());\n}\ntype CombinedResult = {\n summariesByTokenAddress: UnshieldClaimsSummaryByTokenAddress;\n claimableByTokenAddress: ClaimableAmountByTokenAddress;\n isWaitingForDecryptionByTokenAddress?: BooleanByAddress;\n isUnshieldingInProgressByTokenAddress?: BooleanByAddress;\n isClaimingByTokenAddress?: BooleanByAddress;\n queries: UseQueryResult<UnshieldClaimsSummary, Error>[];\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n totalTokensClaimable: number;\n error: Error | null;\n};\n\nconst pendingClaimsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Claim && tx.status === TransactionStatus.Pending;\n\nconst pendingUnshieldsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Unshield && tx.status === TransactionStatus.Pending;\n\nconst asBooleanByTokenAddressLowercase = (\n txs: { token: { address: string }; actionType: TransactionActionType; status: TransactionStatus }[]\n) => {\n return txs.reduce<Record<string, boolean>>((acc, tx) => {\n const key = tx.token.address.toLowerCase();\n acc[key] = true;\n\n return acc;\n }, {});\n};\n\nexport function useCofheTokensClaimable(\n { tokens, accountAddress: account }: UseUnshieldClaimsManyInput,\n queryOptions?: UseUnshieldClaimsManyOptions\n): CombinedResult {\n const publicClient = useCofhePublicClient();\n\n const normalizedTokens = useNormalizedList(tokens, {\n filter: isClaimableToken,\n dedupeKey: claimableDedupeKey,\n sort: claimableSort,\n });\n\n const enabledBase = !!publicClient && !!account && normalizedTokens.length > 0;\n\n const waitingEntries = useMemo(() => {\n if (!account) return [];\n return normalizedTokens.map((token) => ({\n address: token.address,\n queryKey: constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress: account,\n }),\n }));\n }, [account, normalizedTokens]);\n\n const isWaitingForDecryptionByTokenAddress = useIsWaitingForDecryptionByAddress(waitingEntries);\n\n const chainId = useCofheChainId();\n\n const { reduced: isUnshieldingInProgressByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingUnshieldsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const { reduced: isClaimingByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingClaimsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const combined = useInternalQueries({\n queries: normalizedTokens.map((token) => {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType,\n accountAddress: account,\n });\n\n return {\n queryKey,\n queryFn: async ({\n signal,\n queryKey,\n }: QueryFunctionContext<ReturnType<typeof constructUnshieldClaimsQueryKey>>) => {\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType narrowed by token guard'\n );\n\n assert(account, 'account is required to fetch unshield claims');\n assert(publicClient, 'publicClient is required to fetch unshield claims');\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: enabledBase,\n ...queryOptions,\n };\n }),\n combine: (results) => {\n return results.reduce<\n Omit<\n CombinedResult,\n 'isWaitingForDecryptionByTokenAddress' | 'isUnshieldingInProgressByTokenAddress' | 'isClaimingByTokenAddress'\n >\n >(\n (acc, result, index) => {\n const token = normalizedTokens[index];\n if (!token) return acc;\n\n const summary = result.data ?? DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n acc.summariesByTokenAddress[token.address] = summary;\n acc.claimableByTokenAddress[token.address] = summary.claimableAmount;\n\n if (summary.hasClaimable) {\n acc.totalTokensClaimable += 1;\n }\n\n acc.isLoading = acc.isLoading || result.isLoading;\n acc.isFetching = acc.isFetching || result.isFetching;\n acc.isError = acc.isError || result.isError;\n if (!acc.error && result.error) acc.error = result.error;\n\n return acc;\n },\n {\n summariesByTokenAddress: {},\n claimableByTokenAddress: {},\n totalTokensClaimable: 0,\n queries: results,\n isLoading: false,\n isFetching: false,\n isError: false,\n error: null,\n }\n );\n },\n });\n\n return {\n summariesByTokenAddress: combined.summariesByTokenAddress,\n claimableByTokenAddress: combined.claimableByTokenAddress,\n totalTokensClaimable: combined.totalTokensClaimable,\n queries: combined.queries,\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n isWaitingForDecryptionByTokenAddress,\n isUnshieldingInProgressByTokenAddress,\n isClaimingByTokenAddress,\n };\n}\n","import { useMemo } from 'react';\n\nexport type NormalizeOptions<T, U extends T = T> = {\n /** Optional filter; can be a type guard to narrow the output type */\n filter?: (item: T) => item is U;\n /** Optional de-dupe key function */\n dedupeKey?: (item: U) => string;\n /** Optional deterministic sort */\n sort?: (a: U, b: U) => number;\n};\n\nexport function useNormalizedList<T, U extends T = T>(items: T[] | undefined, options?: NormalizeOptions<T, U>): U[] {\n return useMemo(() => {\n if (!items || items.length === 0) return [];\n\n const filter = options?.filter;\n const dedupeKey = options?.dedupeKey;\n const sort = options?.sort;\n\n const filtered = (filter ? items.filter(filter) : (items as unknown as U[])) as U[];\n\n const deduped = (() => {\n if (!dedupeKey) return filtered;\n const seen = new Set<string>();\n const unique: U[] = [];\n for (const item of filtered) {\n const key = dedupeKey(item);\n if (seen.has(key)) continue;\n seen.add(key);\n unique.push(item);\n }\n return unique;\n })();\n\n if (sort) deduped.sort(sort);\n\n return deduped;\n }, [items, options?.dedupeKey, options?.filter, options?.sort]);\n}\n\n// Compatibility aliases (internal/private helper; keep naming flexible)\nexport const useNormalizedItems = useNormalizedList;\nexport const useNormalizedTokens = useNormalizedList;\n","import { useMemo } from 'react';\nimport { isAddress, type Address } from 'viem';\nimport { assert } from 'ts-essentials';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { useAwaitingDecryptionQueryKeySet } from './useIsWaitingForDecryptionToInvalidate.js';\n\nexport type IsWaitingForDecryptionByAddress = Record<Address, boolean>;\n\nexport type WaitingForDecryptionEntry = {\n address: Address;\n queryKey: QueryKey;\n};\n\n/**\n * Given a list of entries and the invalidation-store snapshot, computes whether each address\n * is currently awaiting decryption invalidation.\n */\nexport function useIsWaitingForDecryptionByAddress(\n entries: WaitingForDecryptionEntry[]\n): IsWaitingForDecryptionByAddress {\n const awaitingDecryptionKeySet = useAwaitingDecryptionQueryKeySet();\n\n return useMemo(() => {\n const map: IsWaitingForDecryptionByAddress = {};\n\n for (const entry of entries) {\n assert(isAddress(entry.address), 'address is valid');\n map[entry.address] = awaitingDecryptionKeySet.has(JSON.stringify(entry.queryKey));\n }\n\n return map;\n }, [awaitingDecryptionKeySet, entries]);\n}\n","import { useMemo } from 'react';\nimport type { Address } from 'viem';\n\nimport type { Token } from '@/types/token';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport {\n useCofheReadContracts,\n type CofheReadContractsContract,\n type UseCofheReadContractsQueryOptions,\n} from './useCofheReadContracts';\n\nfunction asCtHash(value: unknown): bigint | undefined {\n if (typeof value === 'bigint') return value;\n if (value && typeof value === 'object' && 'ctHash' in value) {\n const ctHash = (value as { ctHash?: unknown }).ctHash;\n if (typeof ctHash === 'bigint') return ctHash;\n }\n return undefined;\n}\n\nexport type UseCofheTokensWithExistingBalancesInput = {\n chainId?: number;\n accountAddress?: Address;\n};\n\nexport type UseCofheTokensWithExistingBalancesResult = {\n tokens: Token[];\n tokensWithExistingEncryptedBalance: Token[];\n ctHashByTokenAddress: Record<string, bigint>;\n\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n error: Error | null;\n\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Returns tokens whose confidential (encrypted) balance handle exists for the given account.\n *\n * This does NOT decrypt balances. It only checks if the encrypted balance return value (ctHash) is non-zero.\n */\nexport function useCofheTokensWithExistingEncryptedBalances(\n { chainId: _chainId, accountAddress }: UseCofheTokensWithExistingBalancesInput = {},\n queryOptions?: UseCofheReadContractsQueryOptions\n): UseCofheTokensWithExistingBalancesResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress ?? connectedAccount;\n const currentChainId = useCofheChainId();\n const chainIdForTokens = _chainId ?? currentChainId;\n\n const tokens = useCofheTokens(chainIdForTokens);\n\n const contracts = useMemo((): readonly CofheReadContractsContract[] => {\n if (!account) return [];\n\n return tokens.map((token) => {\n const config = getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n return {\n address: token.address,\n abi: config.abi,\n functionName: config.functionName,\n args: [account],\n };\n });\n }, [account, tokens]);\n\n const read = useCofheReadContracts(\n {\n contracts,\n multicallOptions: {\n allowFailure: true,\n },\n },\n {\n refetchOnMount: false,\n ...queryOptions,\n enabled: (queryOptions?.enabled ?? true) && !!account && tokens.length > 0,\n }\n );\n\n const { tokensWithExistingEncryptedBalance, ctHashByTokenAddress, error } = useMemo(() => {\n const map: Record<string, bigint> = {};\n const filtered: Token[] = [];\n\n const items = read.data;\n if (!items || items.length === 0) {\n return {\n tokensWithExistingEncryptedBalance: filtered,\n ctHashByTokenAddress: map,\n error: read.error ?? null,\n };\n }\n\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index];\n const item = items[index];\n if (!token || !item) continue;\n if (item.error) continue;\n\n const ctHash = asCtHash(item.result);\n if (ctHash == null) continue;\n if (ctHash === 0n) continue;\n\n map[token.address.toLowerCase()] = ctHash;\n filtered.push(token);\n }\n\n return {\n tokensWithExistingEncryptedBalance: filtered,\n ctHashByTokenAddress: map,\n error: read.error ?? null,\n };\n }, [read.data, read.error, tokens]);\n\n return {\n tokens,\n tokensWithExistingEncryptedBalance,\n ctHashByTokenAddress,\n\n isLoading: read.isLoading,\n isFetching: read.isFetching,\n isError: read.isError,\n error,\n\n refetch: read.refetch,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { assert } from 'ts-essentials';\nimport type { Address } from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useIsCofheErrorActive } from './useIsCofheErrorActive';\nimport { useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi } from '@cofhe/abi';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContracts';\n\nfunction serializeIfBigint(value: unknown): unknown {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n}\n\nfunction serializeBigintRecursively(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(serializeBigintRecursively);\n } else {\n return serializeIfBigint(value);\n }\n}\n\nexport type CofheReadContractsContract = {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n};\n\nexport type CofheReadContractsMulticallOptions = {\n /**\n * When `true` (default in viem), returns per-call status objects.\n * When `false`, throws on any failed call.\n */\n allowFailure?: boolean;\n /** Optional viem multicall options (kept loose to avoid coupling to viem's internal generics). */\n [key: string]: unknown;\n};\n\nexport type CofheReadContractsItem = {\n result?: unknown;\n error?: Error;\n};\n\nexport type UseCofheReadContractsQueryOptions = Omit<\n UseQueryOptions<CofheReadContractsItem[], Error>,\n 'queryKey' | 'queryFn'\n> & {\n enabled?: boolean;\n};\n\nexport function constructCofheReadContractsQueryKey(params: {\n cofheChainId?: number;\n contracts?: readonly CofheReadContractsContract[];\n allowFailure?: boolean;\n enabled?: boolean;\n}): readonly unknown[] {\n const { cofheChainId, contracts, allowFailure, enabled } = params;\n\n const serializedContracts = (contracts ?? []).map((contract) => {\n // Avoid putting non-serializable values in queryKey.\n // `abi` is typically a plain JSON array, safe to include.\n return {\n address: contract.address,\n functionName: contract.functionName,\n args: Array.isArray(contract.args) ? serializeBigintRecursively(contract.args) : contract.args,\n abi: contract.abi,\n };\n });\n\n return [QUERY_CACHE_PREFIX, cofheChainId, serializedContracts, allowFailure, enabled];\n}\n\nexport function getEnabledForCofheReadContracts(params: {\n isCofheErrorActive: boolean;\n publicClient: unknown;\n cofheChainId?: number;\n contracts?: readonly CofheReadContractsContract[];\n userEnabled?: boolean;\n}): boolean {\n const { isCofheErrorActive, publicClient, cofheChainId, contracts, userEnabled } = params;\n\n return (\n !isCofheErrorActive &&\n !!publicClient &&\n !!cofheChainId &&\n !!contracts &&\n contracts.length > 0 &&\n (userEnabled ?? true)\n );\n}\n\nfunction isViemAllowFailureResult(\n value: unknown\n): value is { status: 'success' | 'failure'; result?: unknown; error?: Error } {\n return !!value && typeof value === 'object' && 'status' in value;\n}\n\nfunction transformResultForContract(contract: CofheReadContractsContract, value: unknown): unknown {\n // `transformEncryptedReturnTypes` expects Cofhe ABI & function typing, but multicall contracts can be heterogeneous.\n // Runtime transformation still works; we keep types intentionally loose here.\n return transformEncryptedReturnTypes(contract.abi, contract.functionName, value);\n}\n\nexport function useCofheReadContracts(\n params: {\n contracts?: readonly CofheReadContractsContract[];\n multicallOptions?: CofheReadContractsMulticallOptions;\n },\n queryOptions?: UseCofheReadContractsQueryOptions\n): UseQueryResult<CofheReadContractsItem[], Error> {\n const { contracts, multicallOptions } = params;\n\n const isCofheErrorActive = useIsCofheErrorActive();\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n\n const enabled = getEnabledForCofheReadContracts({\n isCofheErrorActive,\n publicClient,\n cofheChainId,\n contracts,\n userEnabled: queryOptions?.enabled,\n });\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return useInternalQuery({\n enabled,\n queryKey: constructCofheReadContractsQueryKey({\n cofheChainId,\n contracts,\n allowFailure: multicallOptions?.allowFailure,\n // Same rationale as in `useCofheReadContract`: guard against a blank screen when CofheError is active.\n enabled,\n }),\n queryFn: async () => {\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(contracts && contracts.length > 0, 'Contracts should be guaranteed by enabled check');\n\n const raw = await publicClient.multicall({\n contracts,\n ...(multicallOptions || {}),\n });\n\n // When `allowFailure: true`, viem returns per-item { status, result?, error? }.\n // When `allowFailure: false`, viem returns an array of results (and throws on failure).\n return raw.map((item, index): CofheReadContractsItem => {\n const contract = contracts[index];\n if (!contract) return { error: new Error('Multicall result length mismatch') };\n\n if (isViemAllowFailureResult(item)) {\n if (item.status === 'failure') {\n return { error: item.error ?? new Error('Multicall call failed') };\n }\n return { result: transformResultForContract(contract, item.result) };\n }\n\n return { result: transformResultForContract(contract, item) };\n });\n },\n ...restQueryOptions,\n });\n}\n","import { useMemo } from 'react';\nimport type { Address } from 'viem';\n\nimport type { Token } from '@/types/token';\nimport { useInternalQueries } from '../providers';\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport {\n createPublicTokenBalanceQueryOptions,\n getPublicTokenBalanceSource,\n type PublicTokenBalanceSource,\n type UseTokenBalanceOptions,\n} from './useCofheTokenPublicBalance';\n\nexport type UseTokensWithPublicBalancesInput = {\n chainId?: number;\n accountAddress?: Address;\n displayDecimals?: number;\n};\n\nexport type UseTokensWithPublicBalancesResult = {\n tokens: Token[];\n tokensWithPublicBalances: Token[];\n publicBalanceByTokenAddress: Record<string, TokenFormatOutput>;\n\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n error: Error | null;\n\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Returns CoFHE tokens which have a non-zero public balance.\n *\n * Public balance source:\n * - `wrapped`: underlying `erc20Pair` (or native ETH)\n * - `dual`: token contract `balanceOf` (ERC20)\n * - `pure`: skipped (no public balance)\n */\nexport function useTokensWithPublicBalances(\n { chainId: _chainId, accountAddress, displayDecimals = 5 }: UseTokensWithPublicBalancesInput = {},\n options?: { enabled?: boolean } & Omit<UseTokenBalanceOptions, 'select'>\n): UseTokensWithPublicBalancesResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress ?? connectedAccount;\n\n const currentChainId = useCofheChainId();\n const chainIdForTokens = _chainId ?? currentChainId;\n\n const publicClient = useCofhePublicClient();\n\n const tokens = useCofheTokens(chainIdForTokens);\n\n const entries = useMemo((): Array<{ token: Token; source: PublicTokenBalanceSource }> => {\n const out: Array<{ token: Token; source: PublicTokenBalanceSource }> = [];\n for (const token of tokens) {\n const source = getPublicTokenBalanceSource(token);\n if (!source) continue;\n out.push({ token, source });\n }\n return out;\n }, [tokens]);\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n const enabled = userEnabled && !!publicClient && !!account && entries.length > 0;\n\n const combined = useInternalQueries({\n queries: entries.map(({ source }) =>\n createPublicTokenBalanceQueryOptions({\n publicClient,\n accountAddress: account,\n tokenAddress: source.address,\n queryOptions: {\n enabled,\n ...restOptions,\n },\n })\n ),\n combine: (results) => {\n const out: Token[] = [];\n const balanceMap: Record<string, TokenFormatOutput> = {};\n\n let isLoading = false;\n let isFetching = false;\n let isError = false;\n let error: Error | null = null;\n\n for (let index = 0; index < results.length; index++) {\n const result = results[index];\n const entry = entries[index];\n if (!result || !entry) continue;\n\n isLoading = isLoading || result.isLoading;\n isFetching = isFetching || result.isFetching;\n isError = isError || result.isError;\n if (!error && result.error) error = result.error;\n\n const wei = result.data;\n if (typeof wei !== 'bigint') continue;\n if (wei <= 0n) continue;\n\n out.push(entry.token);\n balanceMap[entry.token.address.toLowerCase()] = formatTokenAmount(wei, entry.source.decimals, displayDecimals);\n }\n\n return {\n tokensWithPublicBalances: out,\n publicBalanceByTokenAddress: balanceMap,\n isLoading,\n isFetching,\n isError,\n error,\n refetch: async () => {\n await Promise.all(results.map((r) => r.refetch()));\n },\n };\n },\n });\n\n return {\n tokens,\n tokensWithPublicBalances: combined.tokensWithPublicBalances,\n publicBalanceByTokenAddress: combined.publicBalanceByTokenAddress,\n\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n\n refetch: combined.refetch,\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\n\nexport type DurationUnit = 'hours' | 'days' | 'weeks' | 'months';\n\nexport interface UsePermitDurationOptions {\n onDurationChange: (seconds: number) => void;\n initialSeconds?: number;\n}\n\nexport interface DurationPreset {\n label: string;\n seconds: number;\n}\n\nexport interface UsePermitDurationResult {\n durationSeconds: number;\n customCount: number | '';\n customUnit: DurationUnit;\n presets: readonly DurationPreset[];\n units: readonly DurationUnit[];\n selectPreset: (seconds: number) => void;\n setCustomCount: (value: number | '') => void;\n setCustomUnit: (unit: DurationUnit) => void;\n applyCustom: (count: number | '', unit: DurationUnit) => void;\n unitSeconds: Readonly<Record<DurationUnit, number>>;\n}\n\nexport function usePermitDuration(options: UsePermitDurationOptions): UsePermitDurationResult {\n const { onDurationChange, initialSeconds = 7 * 24 * 60 * 60 } = options;\n\n const presets: readonly DurationPreset[] = useMemo(\n () => [\n { label: '1 day', seconds: 1 * 24 * 60 * 60 },\n { label: '1 week', seconds: 7 * 24 * 60 * 60 },\n { label: '1 month', seconds: 30 * 24 * 60 * 60 },\n ],\n []\n );\n\n const unitSeconds: Readonly<Record<DurationUnit, number>> = useMemo(\n () => ({\n hours: 60 * 60,\n days: 24 * 60 * 60,\n weeks: 7 * 24 * 60 * 60,\n months: 30 * 24 * 60 * 60,\n }),\n []\n );\n\n const [durationSeconds, setDurationSecondsState] = useState(initialSeconds);\n const [customCount, setCustomCountState] = useState<number | ''>('');\n const [customUnit, setCustomUnitState] = useState<DurationUnit>('days');\n\n const selectPreset = useCallback(\n (seconds: number) => {\n setDurationSecondsState(seconds);\n onDurationChange(seconds);\n },\n [onDurationChange]\n );\n\n const applyCustom = useCallback(\n (count: number | '', unit: DurationUnit) => {\n setCustomCountState(count);\n setCustomUnitState(unit);\n if (typeof count === 'number' && count > 0) {\n const computed = count * unitSeconds[unit];\n setDurationSecondsState(computed);\n onDurationChange(computed);\n }\n },\n [unitSeconds, onDurationChange]\n );\n\n const setCustomCount = useCallback((value: number | '') => applyCustom(value, customUnit), [applyCustom, customUnit]);\n const setCustomUnit = useCallback((unit: DurationUnit) => applyCustom(customCount, unit), [applyCustom, customCount]);\n\n return {\n durationSeconds,\n customCount,\n customUnit,\n presets,\n units: ['days', 'weeks', 'months', 'hours'] as const,\n selectPreset,\n setCustomCount,\n setCustomUnit,\n applyCustom,\n unitSeconds,\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useCofheCreatePermitMutation, type CreatePermitArgs } from './useCofheCreatePermitMutation';\n\nexport interface UsePermitFormOptions {\n isDelegate?: boolean;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UsePermitFormResult {\n permitName: string;\n receiver: string;\n error: string | null; // global/submit error\n nameError: string | null; // field-specific error for name\n receiverError: string | null;\n isValid: boolean;\n isSubmitting: boolean;\n durationSeconds: number;\n handleNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n handleReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n setDurationSeconds: (seconds: number) => void;\n handleSubmit: () => Promise<void>;\n reset: () => void;\n}\n\nexport function usePermitForm(options: UsePermitFormOptions = {}): UsePermitFormResult {\n const { onSuccess, onError, isDelegate = false } = options;\n const [permitName, setPermitName] = useState('');\n const [receiver, setReceiver] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [nameError, setNameError] = useState<string | null>(null);\n const [receiverError, setReceiverError] = useState<string | null>(null);\n const [durationSeconds, setDurationSeconds] = useState(7 * 24 * 60 * 60);\n const { mutateAsync: createPermitMutateAsync, isPending: isPermitCreationPending } = useCofheCreatePermitMutation({\n onSuccess,\n onError,\n });\n\n const recipientAddressValid = isDelegate ? isValidAddress(receiver) : true;\n const isValid = !!permitName.trim() && recipientAddressValid;\n\n const handleNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setPermitName(e.target.value);\n if (nameError) setNameError(null);\n },\n [nameError]\n );\n\n const handleReceiverChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setReceiver(e.target.value);\n if (receiverError) setReceiverError(null);\n },\n [receiverError]\n );\n\n const handleSubmit = useCallback(async () => {\n if (isPermitCreationPending) return;\n const nameToUse = permitName.trim();\n if (!nameToUse) {\n setNameError('Permit name is required.');\n return;\n }\n if (isDelegate) {\n if (!isValidAddress(receiver)) {\n setReceiverError('Valid receiver address is required.');\n return;\n }\n }\n try {\n const expirationSeconds = Math.floor(Date.now() / 1000) + durationSeconds;\n const args: CreatePermitArgs = isDelegate\n ? { name: nameToUse, isSelf: false, receiver: receiver.trim() as `0x${string}`, expirationSeconds }\n : { name: nameToUse, isSelf: true, expirationSeconds };\n\n await createPermitMutateAsync(args);\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n } catch (e: any) {\n setError(e?.message ?? 'Failed to create permit');\n }\n }, [isPermitCreationPending, permitName, isDelegate, receiver, durationSeconds, createPermitMutateAsync]);\n\n const reset = useCallback(() => {\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n }, []);\n\n return {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting: isPermitCreationPending,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n reset,\n };\n}\n\nfunction isValidAddress(address: string): boolean {\n const a = address.trim();\n return /^0x[a-fA-F0-9]{40}$/.test(a);\n}\n","// Persisted store for long running flags / settings / etc\n\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\n\ntype PortalPersistedStore = {\n hasCreatedFirstPermit: boolean;\n};\n\ntype PortalPersistedActions = {\n setHasCreatedFirstPermit: (hasCreated: boolean) => void;\n};\n\nexport const usePortalPersisted = create<PortalPersistedStore & PortalPersistedActions>()(\n persist(\n (set, get) => ({\n hasCreatedFirstPermit: false,\n\n setHasCreatedFirstPermit: (hasCreated) => set({ hasCreatedFirstPermit: hasCreated }),\n }),\n {\n name: 'cofhesdk-react-persisted',\n storage: createJSONStorage(() => localStorage),\n }\n )\n);\n","import { usePortalPersisted } from '@/stores/portalPersisted.js';\nimport { useInternalMutation } from '../../providers/index.js';\nimport { useCofheClient } from '../useCofheClient.js';\n\nexport type CreatePermitArgs =\n | {\n name: string;\n isSelf: true;\n expirationSeconds: number; // unix timestamp (seconds)\n }\n | {\n name: string;\n isSelf: false;\n receiver: `0x${string}`;\n expirationSeconds: number; // unix timestamp (seconds)\n };\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport const useCofheCreatePermitMutation = ({ onSuccess, onError }: Input = {}) => {\n const cofheClient = useCofheClient();\n const { setHasCreatedFirstPermit } = usePortalPersisted();\n\n return useInternalMutation<void, Error, CreatePermitArgs>({\n onSuccess,\n onError,\n onSettled: () => {\n // Mark that the user has created at least one permit\n // After this, we will show him warnings and notifications accordingly\n setHasCreatedFirstPermit(true);\n },\n mutationFn: async (args) => {\n const { name, isSelf, expirationSeconds } = args;\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n\n if (isSelf) {\n await cofheClient.permits.createSelf({\n expiration: expirationSeconds,\n issuer: account,\n name: name.trim(),\n });\n return;\n }\n\n await cofheClient.permits.createSharing({\n expiration: expirationSeconds,\n issuer: account,\n recipient: args.receiver,\n name: name.trim(),\n });\n },\n });\n};\n","import { useCallback, useMemo } from 'react';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useCofheActivePermit, useCofheAllPermits } from '../useCofhePermits';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { useCofheNavigateToCreatePermit } from './useCofheNavigateToCreatePermit';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/FnxFloatingButton/modals/types';\n\nexport type PermitStatus = 'active' | 'valid' | 'expired';\nexport type PermitActionId = 'generate' | 'delegate' | 'import';\n\nexport const usePermitsList = () => {\n const allPermits = useCofheAllPermits();\n const activePermit = useCofheActivePermit();\n const { navigateTo } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const activePermitHash = useMemo(() => {\n return activePermit?.permit.hash;\n }, [activePermit?.permit.hash]);\n\n const selfPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'self');\n }, [allPermits]);\n\n const delegatedPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'sharing');\n }, [allPermits]);\n\n const importedPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'recipient');\n }, [allPermits]);\n\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n const handlePermitAction = useCallback(\n (actionId: PermitActionId) => {\n if (actionId === 'generate') {\n navigateToGeneratePermit();\n return;\n }\n if (actionId === 'delegate') {\n navigateTo(FloatingButtonPage.DelegatePermits, {});\n return;\n }\n if (actionId === 'import') {\n navigateTo(FloatingButtonPage.ReceivePermits);\n }\n },\n [navigateTo, navigateToGeneratePermit]\n );\n\n const handleOpenPermit = useCallback(\n (hash: string) => {\n openModal(PortalModal.PermitDetails, { hash });\n },\n [openModal]\n );\n\n return {\n activePermitHash,\n selfPermits,\n delegatedPermits,\n importedPermits,\n handlePermitAction,\n handleOpenPermit,\n };\n};\n","import type { GeneratePermitPageProps } from '@/components/FnxFloatingButton/pages/permits/GeneratePermitPage/types';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\n\nimport { useCallback } from 'react';\n\ntype Input = {\n cause?: GeneratePermitPageProps['cause'];\n};\nexport const useCofheNavigateToCreatePermit = () => {\n const { navigateTo, navigateBack } = usePortalNavigation();\n const { portalOpen, openPortal } = usePortalUI();\n\n return useCallback(\n ({ cause }: Input = {}) => {\n if (!portalOpen) openPortal();\n navigateTo(FloatingButtonPage.GeneratePermits, {\n pageProps: { cause, onSuccessNavigateTo: () => navigateBack() },\n navigateParams: { skipPagesHistory: true },\n });\n },\n [openPortal, portalOpen, navigateBack, navigateTo]\n );\n};\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../../providers/CofheProvider.js';\nimport { PermitUtils, type RecipientPermit } from '@cofhe/sdk/permits';\n\nexport type UseReceivePermitReturn = {\n importedPermit: RecipientPermit | null;\n permitData: string;\n setPermitData: (v: string) => void;\n permitName: string;\n setPermitName: (v: string) => void;\n isSubmitting: boolean;\n errorMsg: string | null;\n successMsg: string | null;\n submit: () => Promise<void>;\n};\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport function useReceivePermit({ onSuccess, onError }: Input = {}): UseReceivePermitReturn {\n const { client } = useCofheContext();\n\n const [importedPermit, setImportedPermit] = useState<RecipientPermit | null>(null);\n const [permitData, setPermitData] = useState('');\n const [permitName, setPermitName] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n\n const submit = useCallback(async () => {\n setErrorMsg(null);\n setSuccessMsg(null);\n if (!permitData.trim()) {\n setErrorMsg('Please paste permit data.');\n return;\n }\n\n try {\n setIsSubmitting(true);\n // If user provided a name, override the incoming permit's name\n let importArg: any | string = permitData.trim();\n if (permitName.trim()) {\n try {\n const parsed = JSON.parse(permitData.trim());\n importArg = { ...parsed, name: permitName.trim() };\n } catch (e) {\n setErrorMsg('Invalid permit data. Expected JSON.');\n setIsSubmitting(false);\n return;\n }\n }\n\n await client.permits.importShared(importArg);\n\n setSuccessMsg('Permit received and set active.');\n onSuccess?.();\n } catch (err: any) {\n const message = err?.message ?? 'Failed to import permit';\n setErrorMsg(message);\n onError?.(new Error(message));\n } finally {\n setIsSubmitting(false);\n }\n }, [client, permitData, permitName, onSuccess, onError]);\n\n const handleSetPermitData = useCallback((v: string) => {\n setPermitData(v);\n try {\n const permit = PermitUtils.importShared(v);\n setImportedPermit(permit);\n setErrorMsg(null);\n } catch (e) {\n console.error('Error parsing pasted permit data', e);\n setImportedPermit(null);\n // TODO: Improve error message, we have the error message in the caught error but its a zod error so its messy\n setErrorMsg(`Invalid permit data. Expected JSON.`);\n }\n }, []);\n\n return {\n importedPermit,\n permitData,\n setPermitData: handleSetPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { zeroAddress } from 'viem';\nimport { PermitUtils } from '@cofhe/sdk/permits';\nimport {\n useCofheActivePermit,\n useCofhePermit,\n useCofheRemovePermit,\n useCofheSelectPermit,\n} from '../useCofhePermits.js';\nimport { useCopyFeedback } from '../useCopyFeedback.js';\nimport { formatExpirationLabel, truncateAddress } from '@/utils/utils.js';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\n\nconst COPY_KEY = 'permit-details-json';\n\nexport const usePermitDetailsAndActions = (permitHash: string) => {\n const permit = useCofhePermit(permitHash);\n const activePermit = useCofheActivePermit();\n const { navigateBack } = usePortalNavigation();\n const { isCopied, copyWithFeedback } = useCopyFeedback();\n const { addToast } = usePortalToasts();\n const selectActivePermit = useCofheSelectPermit({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit selected',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to select permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n },\n });\n const removePermit = useCofheRemovePermit({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit deleted',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to delete permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n },\n });\n\n const isActivePermit = permit != null && activePermit?.permit.hash === permitHash;\n const expirationDate = permit != null ? new Date(permit.expiration * 1000).toLocaleString() : undefined;\n const isShareablePermit = permit?.type === 'sharing';\n\n const permitLabel = useMemo(() => {\n if (!permit) return undefined;\n if (permit.name?.trim()) return permit.name;\n const fallbackAddress =\n permit.recipient && permit.recipient !== zeroAddress ? permit.recipient : permit.issuer || zeroAddress;\n return truncateAddress(fallbackAddress, 4, 4) ?? fallbackAddress;\n }, [permit]);\n\n const expirationInfo = useMemo(() => formatExpirationLabel(permit?.expiration), [permit?.expiration]);\n\n const permitJson = useMemo(() => {\n if (!permit) return undefined;\n return PermitUtils.export(permit);\n }, [permit]);\n\n const handleBack = useCallback(() => {\n navigateBack();\n }, [navigateBack]);\n\n const handleCopySharablePermitData = useCallback(() => {\n if (!permitJson) return;\n copyWithFeedback(COPY_KEY, permitJson);\n addToast({\n variant: 'success',\n title: 'Permit data copied',\n description: 'Share copied data with recipient.',\n });\n }, [copyWithFeedback, permitJson, addToast]);\n\n const handleSelectActivePermit = useCallback(() => {\n selectActivePermit(permitHash);\n }, [selectActivePermit, permitHash]);\n\n const handleRemovePermit = useCallback(() => {\n removePermit(permitHash);\n }, [removePermit, permitHash]);\n\n return {\n permitExists: permit != null,\n permit,\n permitLabel,\n permitJson,\n expirationInfo,\n expirationDate,\n handleBack,\n handleCopySharablePermitData,\n handleSelectActivePermit,\n handleRemovePermit,\n isCopyComplete: isCopied(COPY_KEY),\n isActivePermit,\n isShareablePermit,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * useCopyFeedback\n * - Copies provided text to clipboard and exposes transient \"copied\" state per key.\n * - Useful for lists where each row has a copy action and needs quick feedback.\n */\nexport function useCopyFeedback(defaultDurationMs: number = 2000) {\n const [copiedKeys, setCopiedKeys] = useState<Set<string>>(new Set());\n const timersRef = useRef<Map<string, number>>(new Map());\n\n const isCopied = useCallback((key: string) => copiedKeys.has(key), [copiedKeys]);\n\n const clearTimer = useCallback((key: string) => {\n const timers = timersRef.current;\n const existing = timers.get(key);\n if (existing) {\n window.clearTimeout(existing);\n timers.delete(key);\n }\n }, []);\n\n const copyWithFeedback = useCallback(\n async (key: string, text: string, durationMs?: number): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text);\n\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n\n clearTimer(key);\n const timeout = window.setTimeout(() => {\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n timersRef.current.delete(key);\n }, durationMs ?? defaultDurationMs);\n timersRef.current.set(key, timeout);\n return true;\n } catch {\n return false;\n }\n },\n [clearTimer, defaultDurationMs]\n );\n\n // Cleanup timers on unmount\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n for (const id of timersRef.current.values()) {\n window.clearTimeout(id);\n }\n timersRef.current.clear();\n };\n }, []);\n\n return { copiedKeys, isCopied, copyWithFeedback };\n}\n","import type { PublicClient, WalletClient } from 'viem';\nimport { useCofheClient } from './useCofheClient';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { useCofheConnect } from './useCofheConnect';\n\ntype Input = {\n publicClient?: PublicClient;\n walletClient?: WalletClient;\n};\nexport const useCofheAutoConnect = ({ walletClient, publicClient }: Input) => {\n const client = useCofheClient();\n\n const connectMutationFn = useCofheConnect().mutate;\n\n const supportedChainIds = useMemo(() => {\n return new Set(client.config.supportedChains.map((chain) => chain.id));\n }, [client.config.supportedChains]);\n\n const disconnectIfConnected = useCallback(() => {\n if (client.connected || client.connecting) {\n client.disconnect();\n }\n }, [client]);\n\n useEffect(() => {\n // Keep COFHE connection in sync with the upstream (wagmi) connection.\n // - if wagmi disconnects, it stops providing clients -> disconnect COFHE\n // - if wagmi provides clients -> ensure COFHE is connected\n if (!publicClient || !walletClient) {\n disconnectIfConnected();\n return;\n }\n\n const chainId = walletClient.chain?.id ?? publicClient.chain?.id;\n if (chainId !== undefined && !supportedChainIds.has(chainId)) {\n disconnectIfConnected();\n return;\n }\n\n if (client.connecting) return;\n connectMutationFn({ publicClient, walletClient });\n }, [publicClient, walletClient, client, connectMutationFn, supportedChainIds, disconnectIfConnected]);\n};\n","import {\n useQuery as rqUseQuery,\n useMutation as rqUseMutation,\n useQueries as rqUseQueries,\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useInternalQueryClient } from './QueryProvider';\nimport { isPersistedQuery } from './queryUtils';\n\nfunction applyPersistedDefaults<TData, TError, TSelectedData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryOptions<TData, TError, TSelectedData> {\n if (!isPersistedQuery(options as { meta?: unknown; queryKey?: QueryKey })) return options;\n\n return {\n ...options,\n // Persisted results are typically deterministic. Default to not refetching on mount/focus/reconnect.\n // Consumers can override per-query when needed.\n staleTime: options.staleTime ?? Infinity,\n refetchOnMount: options.refetchOnMount ?? false,\n refetchOnWindowFocus: options.refetchOnWindowFocus ?? false,\n refetchOnReconnect: options.refetchOnReconnect ?? false,\n };\n}\n\n/**\n * Internal wrapper for TanStack's useQuery that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalQuery(options)`.\n */\nexport function useInternalQuery<TData = unknown, TError = Error, TSelectedData = TData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryResult<TSelectedData, TError> {\n const qc = useInternalQueryClient();\n return rqUseQuery<TData, TError, TSelectedData>(applyPersistedDefaults(options), qc);\n}\n\n/**\n * Internal wrapper for TanStack's useMutation that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalMutation(options)`.\n */\nexport function useInternalMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(\n options: UseMutationOptions<TData, TError, TVariables, TContext>\n): UseMutationResult<TData, TError, TVariables, TContext> {\n const qc = useInternalQueryClient();\n return rqUseMutation<TData, TError, TVariables, TContext>(options, qc);\n}\n\n/**\n * Internal wrapper for TanStack's useQueries that always uses the module's QueryClient.\n * Typing mirrors `rqUseQueries` so all generics and inference are preserved.\n */\nexport const useInternalQueries: typeof rqUseQueries = (options, _ignoredQueryClient) => {\n const qc = useInternalQueryClient();\n if (options && typeof options === 'object' && 'queries' in options) {\n const typedOptions = options as { queries: Array<UseQueryOptions<any, any, any>> };\n return rqUseQueries(\n {\n ...(options as any),\n queries: typedOptions.queries.map((q) => applyPersistedDefaults(q)),\n } as any,\n qc\n );\n }\n return rqUseQueries(options as any, qc);\n};\n","import { type QueryKey } from '@tanstack/react-query';\nimport { persistQueryClientRestore, persistQueryClientSubscribe } from '@tanstack/react-query-persist-client';\nimport { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister';\nimport { useEffect } from 'react';\nimport type { useInternalQueryClient } from './QueryProvider';\n\nexport function isPersistedQuery(options: { meta?: unknown; queryKey?: QueryKey }): boolean {\n const meta = options.meta as { persist?: boolean } | undefined;\n return meta?.persist === true;\n}\nconst persistenceConfig = {\n storage: 'localStorage' satisfies 'sessionStorage' | 'localStorage',\n key: 'cofhe:react-query',\n maxAgeMs: 86_400_000,\n};\n\nconst BIGINT_SENTINEL_KEY = '__cofhe_bigint__';\n\nfunction serializeWithBigInt(value: any): string {\n return JSON.stringify(value, (_key, v) => {\n if (typeof v === 'bigint') return { [BIGINT_SENTINEL_KEY]: v.toString() };\n return v;\n });\n}\n\nfunction deserializeWithBigInt(serialized: string): any {\n return JSON.parse(serialized, (_key, v) => {\n if (\n v &&\n typeof v === 'object' &&\n BIGINT_SENTINEL_KEY in (v as Record<string, unknown>) &&\n typeof (v as Record<string, unknown>)[BIGINT_SENTINEL_KEY] === 'string'\n ) {\n return BigInt((v as Record<string, unknown>)[BIGINT_SENTINEL_KEY] as string);\n }\n return v;\n });\n}\n\nconst storage = persistenceConfig.storage === 'localStorage' ? window.localStorage : window.sessionStorage;\nconst persister = createAsyncStoragePersister({\n storage,\n key: persistenceConfig.key ?? 'cofhe:react-query',\n serialize: serializeWithBigInt,\n deserialize: deserializeWithBigInt,\n});\n\nexport function usePersistentQueriesSubscription({\n queryClient,\n overridingQueryClient,\n}: {\n queryClient: ReturnType<typeof useInternalQueryClient>;\n overridingQueryClient?: ReturnType<typeof useInternalQueryClient>;\n}) {\n // IMPORTANT:\n // Do NOT use <PersistQueryClientProvider>.\n // It wraps children with TanStack's <QueryClientProvider>, which overrides any external provider\n // the consuming dapp (e.g. Wagmi) sets up. Instead, persist/restore imperatively against *our* client.\n useEffect(() => {\n // If the consumer explicitly provides a QueryClient do not attach persistence to it.\n if (overridingQueryClient) return;\n\n let unsubscribe: (() => void) | undefined;\n let cancelled = false;\n\n const options = {\n queryClient: queryClient as any,\n persister,\n maxAge: persistenceConfig.maxAgeMs ?? 86_400_000,\n buster: 'cofhe-react-query-v1',\n dehydrateOptions: {\n // Persist only queries that opt-in via meta.persist.\n // Backwards-compat: also persist decrypt results by queryKey prefix.\n shouldDehydrateQuery: (query: unknown) => isPersistedQuery(query as any),\n },\n };\n\n persistQueryClientRestore(options)\n .catch(() => {\n // Ignore restore errors (e.g. corrupt storage); we'll simply start fresh.\n })\n .finally(() => {\n if (cancelled) return;\n unsubscribe = persistQueryClientSubscribe(options);\n });\n\n return () => {\n cancelled = true;\n unsubscribe?.();\n };\n }, [overridingQueryClient, queryClient]);\n}\n","import type { PublicClient, WalletClient } from 'viem';\nimport type { UseMutationOptions } from '@tanstack/react-query';\nimport { useCofheClient } from './useCofheClient';\nimport { useInternalMutation } from '@/providers/internalQueryHooks';\n\ntype ConnectVars = { publicClient: PublicClient; walletClient: WalletClient };\n\ntype ConnectMutationOptions = Omit<UseMutationOptions<void, Error, ConnectVars, unknown>, 'mutationKey' | 'mutationFn'>;\n\nexport const useCofheConnect = (options?: ConnectMutationOptions) => {\n const client = useCofheClient();\n return useInternalMutation<void, Error, ConnectVars>({\n // spread user-provided options first; enforce critical keys afterwards\n ...options,\n mutationKey: ['cofhe', 'connect'],\n mutationFn: async ({ publicClient, walletClient }) => {\n await client.connect(publicClient, walletClient);\n },\n });\n};\n","import { useEffect, useRef } from 'react';\n\n/**\n * A reusable hook to schedule a timeout that can be rescheduled and safely cleaned up.\n * Useful for auto-clearing messages, debounced effects, or any delayed callback.\n */\nexport function useReschedulableTimeout(callback: () => void, defaultTimeout: number) {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const schedule = (timeout?: number) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n callback();\n }, timeout ?? defaultTimeout);\n };\n\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n return { schedule, cancel };\n}\n","import type { Address } from 'viem';\nimport { ETH_ADDRESS_LOWERCASE } from '@/types/token';\n\nexport const DEFAULT_COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3' as const;\n\n// CoinGecko \"platform\" ids used by /simple/token_price/{platform}\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 10: 'optimistic-ethereum',\n 56: 'binance-smart-chain',\n 100: 'xdai',\n 137: 'polygon-pos',\n 250: 'fantom',\n 42161: 'arbitrum-one',\n 43114: 'avalanche',\n 8453: 'base',\n} as const;\n\n// CoinGecko \"coin\" ids used by /simple/price?ids=...\n// Note: Many EVM chains share native ETH pricing (L2s etc.), but we keep a minimal mapping.\nexport const COINGECKO_NATIVE_COIN_ID_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 10: 'ethereum',\n 42161: 'ethereum',\n 8453: 'ethereum',\n 100: 'xdai',\n 137: 'matic-network',\n 56: 'binancecoin',\n 43114: 'avalanche-2',\n 250: 'fantom',\n} as const;\n\nexport function normalizeCoingeckoContractAddress(address: Address): string {\n return address.toLowerCase();\n}\n\nexport function getCoingeckoPlatformId(chainId: number | undefined): string | undefined {\n if (!chainId) return undefined;\n return COINGECKO_PLATFORM_BY_CHAIN_ID[chainId];\n}\n\nexport function getCoingeckoNativeCoinId(chainId: number | undefined): string | undefined {\n if (!chainId) return undefined;\n return COINGECKO_NATIVE_COIN_ID_BY_CHAIN_ID[chainId];\n}\n\nexport function buildCoingeckoSimpleTokenPriceUrl({\n apiBaseUrl = DEFAULT_COINGECKO_API_BASE_URL,\n platformId,\n contractAddress,\n}: {\n apiBaseUrl?: string;\n platformId: string;\n contractAddress: Address;\n}): string {\n const contract = normalizeCoingeckoContractAddress(contractAddress);\n const url = new URL(`${apiBaseUrl.replace(/\\/$/, '')}/simple/token_price/${platformId}`);\n url.searchParams.set('contract_addresses', contract);\n url.searchParams.set('vs_currencies', 'usd');\n return url.toString();\n}\n\nexport function buildCoingeckoSimplePriceUrl({\n apiBaseUrl = DEFAULT_COINGECKO_API_BASE_URL,\n coinId,\n}: {\n apiBaseUrl?: string;\n coinId: string;\n}): string {\n const url = new URL(`${apiBaseUrl.replace(/\\/$/, '')}/simple/price`);\n url.searchParams.set('ids', coinId);\n url.searchParams.set('vs_currencies', 'usd');\n return url.toString();\n}\n\nexport function parseCoingeckoSimpleTokenPriceUsd({\n responseJson,\n contractAddress,\n}: {\n responseJson: unknown;\n contractAddress: Address;\n}): number | null {\n const key = normalizeCoingeckoContractAddress(contractAddress);\n const obj = responseJson as Record<string, any>;\n const usd = obj?.[key]?.usd;\n if (typeof usd !== 'number' || !Number.isFinite(usd)) return null;\n return usd;\n}\n\nexport function parseCoingeckoSimplePriceUsd({\n responseJson,\n coinId,\n}: {\n responseJson: unknown;\n coinId: string;\n}): number | null {\n const obj = responseJson as Record<string, any>;\n const usd = obj?.[coinId]?.usd;\n if (typeof usd !== 'number' || !Number.isFinite(usd)) return null;\n return usd;\n}\n\nexport function isNativeTokenAddress(address: Address | undefined): boolean {\n if (!address) return false;\n return address.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n}\n\nexport const TMP_WBTC_ON_MAINNET = {\n chainId: 1,\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n} as const;\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { Address } from 'viem';\n\nimport { useInternalQuery } from '@/providers';\nimport {\n buildCoingeckoSimplePriceUrl,\n buildCoingeckoSimpleTokenPriceUrl,\n DEFAULT_COINGECKO_API_BASE_URL,\n getCoingeckoNativeCoinId,\n getCoingeckoPlatformId,\n isNativeTokenAddress,\n parseCoingeckoSimplePriceUsd,\n parseCoingeckoSimpleTokenPriceUsd,\n} from '@/utils/coingecko';\n\nexport type UseCoingeckoUsdPriceInput = {\n chainId?: number;\n tokenAddress?: Address;\n /** Defaults to true. */\n enabled?: boolean;\n /** Defaults to https://api.coingecko.com/api/v3 */\n apiBaseUrl?: string;\n /** Optional override when chainId isn't in our mapping. */\n platformIdOverride?: string;\n /** Optional override for native token lookup (ETH_ADDRESS). */\n nativeCoinIdOverride?: string;\n};\n\nexport type UseCoingeckoUsdPriceOptions = Omit<\n UseQueryOptions<number | null, Error, number | null>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Fetches a token's USD price from CoinGecko.\n * - ERC20: uses /simple/token_price/{platform}\n * - Native token (ETH_ADDRESS): uses /simple/price?ids={coinId}\n *\n * Returns `null` when CoinGecko has no price for the token.\n */\nexport function useCoingeckoUsdPrice(\n {\n chainId,\n tokenAddress,\n enabled: enabledInput = true,\n apiBaseUrl,\n platformIdOverride,\n nativeCoinIdOverride,\n }: UseCoingeckoUsdPriceInput,\n queryOptions?: UseCoingeckoUsdPriceOptions\n): UseQueryResult<number | null, Error> {\n const platformId = platformIdOverride ?? getCoingeckoPlatformId(chainId);\n const nativeCoinId = nativeCoinIdOverride ?? getCoingeckoNativeCoinId(chainId);\n const effectiveApiBaseUrl = apiBaseUrl ?? DEFAULT_COINGECKO_API_BASE_URL;\n\n const baseEnabled = !!tokenAddress && (isNativeTokenAddress(tokenAddress) ? !!nativeCoinId : !!platformId);\n const enabled = baseEnabled && enabledInput;\n\n const queryKey = [\n 'coingecko-usd-price',\n { chainId, tokenAddress, apiBaseUrl: effectiveApiBaseUrl, platformId, nativeCoinId },\n ] as const;\n\n return useInternalQuery({\n queryKey,\n enabled,\n queryFn: async ({ signal }) => {\n if (!tokenAddress) throw new Error('tokenAddress is required');\n if (typeof fetch !== 'function') {\n throw new Error('Global fetch is not available in this environment');\n }\n\n if (isNativeTokenAddress(tokenAddress)) {\n if (!nativeCoinId) return null;\n const url = buildCoingeckoSimplePriceUrl({ apiBaseUrl: effectiveApiBaseUrl, coinId: nativeCoinId });\n const res = await fetch(url, { signal, headers: { accept: 'application/json' } });\n if (!res.ok) throw new Error(`CoinGecko request failed: ${res.status} ${res.statusText}`);\n const json = await res.json();\n return parseCoingeckoSimplePriceUsd({ responseJson: json, coinId: nativeCoinId });\n }\n\n if (!platformId) return null;\n const url = buildCoingeckoSimpleTokenPriceUrl({\n apiBaseUrl: effectiveApiBaseUrl,\n platformId,\n contractAddress: tokenAddress,\n });\n\n const res = await fetch(url, { signal, headers: { accept: 'application/json' } });\n if (!res.ok) throw new Error(`CoinGecko request failed: ${res.status} ${res.statusText}`);\n const json = await res.json();\n return parseCoingeckoSimpleTokenPriceUsd({ responseJson: json, contractAddress: tokenAddress });\n },\n // Reasonable defaults; consumer can override via queryOptions.\n staleTime: queryOptions?.staleTime ?? 60_000,\n refetchOnWindowFocus: queryOptions?.refetchOnWindowFocus ?? false,\n ...queryOptions,\n });\n}\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { Address } from 'viem';\n\nimport { useInternalQuery } from '@/providers';\nimport {\n DEFAULT_COINGECKO_API_BASE_URL,\n getCoingeckoPlatformId,\n normalizeCoingeckoContractAddress,\n} from '@/utils/coingecko';\n\nexport type CoingeckoMarketChartPoint = {\n /** Unix ms */\n ts: number;\n /** Price value (e.g. USD) */\n value: number;\n};\n\nexport type UseCoingeckoContractMarketChartRangeInput = {\n chainId?: number;\n contractAddress?: Address;\n /** Defaults to true. */\n enabled?: boolean;\n /** Defaults to https://api.coingecko.com/api/v3 */\n apiBaseUrl?: string;\n /** Optional override when chainId isn't in our mapping. */\n platformIdOverride?: string;\n /** Defaults to 'usd'. */\n vsCurrency?: string;\n /** Defaults to 24 hours. */\n rangeMs?: number;\n};\n\nexport type UseCoingeckoContractMarketChartRangeOptions = Omit<\n UseQueryOptions<CoingeckoMarketChartPoint[] | null, Error, CoingeckoMarketChartPoint[] | null>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Fetches contract market chart data from CoinGecko using:\n * /coins/{platformId}/contract/{contractAddress}/market_chart/range\n *\n * Returns `null` when CoinGecko has no data or request fails.\n */\nexport function useCoingeckoContractMarketChartRange(\n {\n chainId,\n contractAddress,\n enabled: enabledInput = true,\n apiBaseUrl,\n platformIdOverride,\n vsCurrency = 'usd',\n rangeMs = 24 * 3600_000,\n }: UseCoingeckoContractMarketChartRangeInput,\n queryOptions?: UseCoingeckoContractMarketChartRangeOptions\n): UseQueryResult<CoingeckoMarketChartPoint[] | null, Error> {\n const platformId = platformIdOverride ?? getCoingeckoPlatformId(chainId);\n const effectiveApiBaseUrl = apiBaseUrl ?? DEFAULT_COINGECKO_API_BASE_URL;\n\n const enabled = !!platformId && !!contractAddress && enabledInput;\n\n const queryKey = [\n 'coingecko-contract-market-chart-range',\n { chainId, contractAddress, apiBaseUrl: effectiveApiBaseUrl, platformId, vsCurrency, rangeMs },\n ] as const;\n\n return useInternalQuery({\n queryKey,\n enabled,\n queryFn: async ({ signal }) => {\n if (!platformId || !contractAddress) return null;\n if (typeof fetch !== 'function') {\n throw new Error('Global fetch is not available in this environment');\n }\n\n const now = Date.now();\n const from = Math.floor((now - rangeMs) / 1000);\n const to = Math.floor(now / 1000);\n\n const contract = normalizeCoingeckoContractAddress(contractAddress);\n const url = new URL(\n `${effectiveApiBaseUrl.replace(/\\/$/, '')}/coins/${platformId}/contract/${contract}/market_chart/range`\n );\n url.searchParams.set('vs_currency', vsCurrency);\n url.searchParams.set('from', String(from));\n url.searchParams.set('to', String(to));\n\n try {\n const res = await fetch(url.toString(), { signal, headers: { accept: 'application/json' } });\n if (!res.ok) return null;\n\n const json = (await res.json()) as { prices?: Array<[number, number]> };\n const prices = json.prices ?? [];\n if (prices.length < 2) return null;\n\n const points: CoingeckoMarketChartPoint[] = prices\n .map(([ts, value]) => ({ ts, value }))\n .filter((p) => Number.isFinite(p.ts) && Number.isFinite(p.value));\n\n return points.length >= 2 ? points : null;\n } catch {\n return null;\n }\n },\n staleTime: queryOptions?.staleTime ?? 60_000,\n refetchOnWindowFocus: queryOptions?.refetchOnWindowFocus ?? false,\n ...queryOptions,\n });\n}\n","import { useCofheActivePermit } from '@/hooks';\nimport { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\nimport { truncateHash } from '@/utils';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useEffect, useRef } from 'react';\nimport { FloatingButtonPage } from '../components/FnxFloatingButton/pagesConfig/types';\nimport { usePortalPersisted } from '@/stores/portalPersisted';\nimport { useCofheIsConnected } from './useCofheConnection';\n\nexport const STATUS_ID_MISSING_PERMIT = 'missing-permit';\nexport const STATUS_ID_PERMIT_EXPIRED = 'permit-expired';\nexport const STATUS_ID_PERMIT_EXPIRING_SOON = 'permit-expiring-soon';\nexport const STATUS_ID_PERMIT_SHARED = 'permit-shared';\n\nexport const showMissingPermitStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_MISSING_PERMIT,\n variant: 'error',\n title: 'Missing permit',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\n\nexport const hideMissingPermitStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_MISSING_PERMIT);\n};\n\nexport const showPermitExpiredStatus = () => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRED,\n variant: 'error',\n title: 'Permit expired',\n description: 'Select or create a new permit',\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiredStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRED);\n};\n\nexport const showPermitExpiringSoonStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_EXPIRING_SOON,\n variant: 'warning',\n title: 'Permit expiring soon',\n description: `Expires at ${new Date(permit.expiration * 1000).toLocaleTimeString()}`,\n action: {\n label: 'FIX',\n onClick: () => {\n usePortalUI.getState().openPortal();\n usePortalNavigation.getState().replace(FloatingButtonPage.Permits);\n },\n },\n });\n};\nexport const hidePermitExpiringSoonStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n};\n\nexport const showPermitSharedStatus = (permit: Permit) => {\n usePortalStatuses.getState().addStatus({\n id: STATUS_ID_PERMIT_SHARED,\n variant: 'info',\n title: 'Imported permit active',\n description: `Viewing ${truncateHash(permit.issuer, 4, 4)}'s data`,\n });\n};\nexport const hidePermitSharedStatus = () => {\n usePortalStatuses.getState().removeStatus(STATUS_ID_PERMIT_SHARED);\n};\n\n/**\n * Watches the user's active permit and displays statuses if:\n * - Warning - permit will expire in less that 1 hour\n * - Error - permit has expired\n * - Info - using a shared permit\n */\nexport const useWatchPermitStatus = () => {\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const activePermit = useCofheActivePermit();\n const connected = useCofheIsConnected();\n\n useEffect(() => {\n const updateStatuses = (permit: Permit | undefined) => {\n const hasCreatedFirstPermit = usePortalPersisted.getState().hasCreatedFirstPermit;\n const missingPermitStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_MISSING_PERMIT);\n const expiredStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRED);\n const expiringSoonStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_EXPIRING_SOON);\n const sharedStatusShown = usePortalStatuses.getState().hasStatus(STATUS_ID_PERMIT_SHARED);\n\n if (permit == null) {\n if (hasCreatedFirstPermit && !missingPermitStatusShown && connected) {\n showMissingPermitStatus();\n }\n if (expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n if (expiringSoonStatusShown) {\n hidePermitExpiringSoonStatus();\n }\n if (sharedStatusShown) {\n hidePermitSharedStatus();\n }\n return;\n }\n\n if (permit != null && missingPermitStatusShown) {\n hideMissingPermitStatus();\n }\n\n const timestamp = Math.floor(Date.now() / 1000);\n const expiration = permit.expiration;\n\n // Expired status\n const isExpired = expiration < timestamp;\n if (isExpired && !expiredStatusShown) {\n showPermitExpiredStatus();\n }\n if (!isExpired && expiredStatusShown) {\n hidePermitExpiredStatus();\n }\n\n // Expiring soon status\n const isExpiringSoon = expiration - timestamp < 1 * 60 * 60;\n if (!isExpired && isExpiringSoon && !expiringSoonStatusShown) {\n showPermitExpiringSoonStatus(permit);\n }\n if ((!isExpiringSoon && expiringSoonStatusShown) || isExpired) {\n hidePermitExpiringSoonStatus();\n }\n\n // Shared status\n const isShared = permit.type === 'recipient';\n if (isShared && !sharedStatusShown) {\n showPermitSharedStatus(permit);\n }\n if (!isShared && sharedStatusShown) {\n hidePermitSharedStatus();\n }\n };\n\n updateStatuses(activePermit?.permit);\n intervalRef.current = setInterval(() => {\n updateStatuses(activePermit?.permit);\n }, 2000);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n };\n }, [activePermit, connected]);\n};\n","import { usePortalNavigation, usePortalStatuses, usePortalUI } from '@/stores';\n\nimport { useEffect } from 'react';\n\nimport { useCofheClaimableTokens } from './useCofheClaimableTokens';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\n\nexport const CLAIMS_AVAILABLE_STATUS_ID = 'claims-available';\ntype Input = {\n onClick: () => void;\n};\nexport const showClaimsAvailableStatus = ({ onClick }: Input) => {\n usePortalStatuses.getState().addStatus({\n id: CLAIMS_AVAILABLE_STATUS_ID,\n variant: 'info',\n title: '', // TODO: no title per design\n description: `You have unclaimed encrypted tokens`,\n action: {\n label: 'VIEW',\n onClick,\n },\n });\n};\nexport const hideClaimsAvailableStatus = () => {\n usePortalStatuses.getState().removeStatus(CLAIMS_AVAILABLE_STATUS_ID);\n};\n\nexport const useWatchClaimablesStatus = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n\n useEffect(() => {\n const claimsAvailableStatusShown = usePortalStatuses.getState().hasStatus(CLAIMS_AVAILABLE_STATUS_ID);\n if (totalTokensClaimable > 0 && !claimsAvailableStatusShown) {\n showClaimsAvailableStatus({\n onClick: () => {\n openPortal();\n navigateTo(FloatingButtonPage.ClaimableTokens);\n },\n });\n }\n\n if (totalTokensClaimable === 0 && claimsAvailableStatusShown) {\n hideClaimsAvailableStatus();\n }\n }, [navigateTo, openPortal, totalTokensClaimable]);\n};\n","import { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { useCofheTokensClaimable } from './useCofheTokensClaimable';\n\nexport function useCofheClaimableTokens() {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const result = useCofheTokensClaimable({\n accountAddress: account,\n tokens: allTokens,\n });\n\n return result;\n}\n","import { cn } from '@/utils';\nimport fhenixIconBlack from '@/assets/fhenix-icon-black.png';\nimport fhenixIconWhite from '@/assets/fhenix-icon-white.png';\n\nexport const FhenixLogoIcon: React.FC<{ theme: 'dark' | 'light'; className?: string }> = ({ theme, className }) => {\n return (\n <img\n className={cn('w-10 h-10', className)}\n src={theme === 'dark' ? fhenixIconWhite : fhenixIconBlack}\n alt=\"Fhenix Logo Icon\"\n />\n );\n};\n","import { type ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { usePortalUI, usePortalStatuses } from '@/stores';\n\nexport const StatusBarSection: React.FC<{ children?: ReactNode }> = ({ children }) => {\n const { isLeftSide } = useFnxFloatingButtonContext();\n const { statuses } = usePortalStatuses();\n const { statusPanelOpen } = usePortalUI();\n\n return (\n <AnimatePresence>\n {(statusPanelOpen || statuses.length > 0) && (\n <motion.div\n className=\"relative flex flex-1 h-12 items-center justify-between\"\n initial={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n animate={{ opacity: 1, x: 0 }}\n exit={{ opacity: 0, x: isLeftSide ? -10 : 10 }}\n >\n {children}\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineSettings } from 'react-icons/md';\nimport { IoIosCheckmarkCircleOutline, IoIosCloseCircleOutline, IoIosTime } from 'react-icons/io';\nimport { useMemo } from 'react';\nimport { cn } from '@/utils';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { FloatingButtonPage } from './pagesConfig/types';\nimport { FhenixLogoIcon } from '../FhenixLogoIcon';\nimport type { FnxStatus, FnxStatusVariant } from './types';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { usePortalNavigation, usePortalStatuses } from '@/stores';\nimport { useCofheConnection } from '@/hooks';\nimport { CLAIMS_AVAILABLE_STATUS_ID } from '@/hooks/useWatchClaimablesStatus';\nimport {\n STATUS_ID_MISSING_PERMIT,\n STATUS_ID_PERMIT_EXPIRED,\n STATUS_ID_PERMIT_EXPIRING_SOON,\n STATUS_ID_PERMIT_SHARED,\n} from '@/hooks/useWatchPermitStatus';\n\nconst ConnectionStatus: React.FC = () => {\n const { theme } = useFnxFloatingButtonContext();\n const { navigateTo } = usePortalNavigation();\n const { connected } = useCofheConnection();\n\n return (\n <div className=\"fnx-panel w-full h-full flex px-4 items-center justify-between\">\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status */}\n <div className=\"flex items-center gap-1 ml-auto mr-2\">\n {connected ? (\n <>\n <IoIosCheckmarkCircleOutline className=\"text-green-500\" />\n <span className=\"font-medium\" aria-live=\"polite\">\n Connected\n </span>\n </>\n ) : (\n <>\n <IoIosCloseCircleOutline className=\"text-red-500\" />\n <span className=\"font-medium\" aria-live=\"polite\">\n Disconnected\n </span>\n </>\n )}\n </div>\n\n {/* Settings Icon */}\n <button\n onClick={() => navigateTo(FloatingButtonPage.Settings)}\n className={cn('p-1 rounded fnx-hover-overlay transition-colors', 'fnx-text-primary')}\n >\n <MdOutlineSettings className=\"w-4 h-4\" />\n </button>\n </div>\n );\n};\n\nconst statusTextColorMap: Record<FnxStatusVariant, string> = {\n error: 'text-red-500',\n warning: 'text-yellow-500',\n info: 'text-blue-500',\n};\n\nconst statusBorderColorMap: Record<FnxStatusVariant, string> = {\n error: 'border-red-500',\n warning: 'border-yellow-500',\n info: 'border-blue-500',\n};\n\nconst ActiveStatusContent: React.FC<{ status: FnxStatus }> = ({ status }) => {\n const { theme } = useFnxFloatingButtonContext();\n\n return (\n <div\n className={cn(\n 'fnx-panel w-full h-full flex px-4 items-center justify-between',\n statusBorderColorMap[status.variant]\n )}\n >\n {/* Logo Icon */}\n <FhenixLogoIcon theme={theme} className=\"w-10 h-10\" />\n\n {/* Status Info */}\n <div className=\"flex flex-col ml-2 mr-auto\">\n <h3 className={cn('text-sm font-medium', statusTextColorMap[status.variant])}>{status.title}</h3>\n {status.description != null && (\n <p className={cn('text-xs', statusTextColorMap[status.variant])}>{status.description}</p>\n )}\n </div>\n\n {/* Action Button */}\n {status.action != null && (\n <button\n onClick={status.action?.onClick}\n className={cn('p-1 rounded fnx-hover-overlay transition-colors', 'fnx-text-primary')}\n >\n {status.action.label}\n </button>\n )}\n </div>\n );\n};\n\nconst STATUSES_ORDER = new Map<string, number>(\n [\n // first always goes \"claims available\" as claiming doesn't require a permit\n CLAIMS_AVAILABLE_STATUS_ID,\n\n // next goes all permit related statuses\n STATUS_ID_MISSING_PERMIT,\n STATUS_ID_PERMIT_EXPIRED,\n STATUS_ID_PERMIT_EXPIRING_SOON,\n STATUS_ID_PERMIT_SHARED,\n\n // next everything else can be sorted by time or just left in the order they were added\n ]\n .reverse()\n .map((id, index) => [id, index])\n);\n\nfunction sortStatuses(a: FnxStatus, b: FnxStatus): number {\n const aIndex = STATUSES_ORDER.get(a.id) ?? -1;\n const bIndex = STATUSES_ORDER.get(b.id) ?? -1;\n\n if (aIndex === -1 && bIndex === -1) {\n // If both statuses are not in the predefined order, keep their original order\n return 0;\n }\n if (aIndex === -1) {\n // If only a is not in the predefined order, b should come first\n return 1;\n }\n if (bIndex === -1) {\n // If only b is not in the predefined order, a should come first\n return -1;\n }\n // If both statuses are in the predefined order, sort by their index\n return aIndex - bIndex;\n}\n\nexport const StatusBarContent: React.FC = () => {\n const { statuses } = usePortalStatuses();\n\n const sortedStatuses = useMemo(() => statuses.sort(sortStatuses), [statuses]);\n\n return (\n <AnimatedZStack>\n {/* Connection status showing connection state and chain */}\n <ConnectionStatus />\n\n {/* Active errors or warnings to be resolved */}\n {sortedStatuses.map((status) => (\n <ActiveStatusContent key={status.id} status={status} />\n ))}\n </AnimatedZStack>\n );\n};\n","// eslint-disable-next-line no-redeclare\nimport React from 'react';\nimport { cn } from '@/utils';\nimport type { ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\n\ntype AnimatedZStackItemProps = {\n children?: ReactNode;\n stackOffset: number;\n stackScale: number;\n index: number;\n length: number;\n className?: string;\n};\n\nconst AnimatedZStackItem: React.FC<AnimatedZStackItemProps> = ({\n children,\n stackOffset,\n stackScale,\n index,\n length,\n className,\n}) => {\n // Primary item is always index 0, and does not translate on entry/exit\n // Additional items animate in from the bottom and out to the bottom\n // All items animate opacity\n const isPrimaryItem = index === 0;\n const entryStyle = isPrimaryItem\n ? {\n opacity: 0,\n }\n : {\n opacity: 0,\n top: stackOffset,\n scale: 1 + stackScale,\n };\n\n // invIndex is the depth of the card in the stack\n // As the length of the stack increases, the depth of the card decreases\n // Deeper items scale down and move up\n const invIndex = length - index - 1;\n const animStyle = {\n opacity: 1,\n top: invIndex * -stackOffset,\n scale: 1 - invIndex * stackScale,\n zIndex: index,\n };\n\n return (\n <motion.div\n className={cn('w-full h-full absolute origin-top', invIndex === 0 && 'events-none', className)}\n initial={entryStyle}\n exit={entryStyle}\n animate={animStyle}\n >\n {children}\n </motion.div>\n );\n};\n\ntype AnimatedZStackProps = {\n children?: ReactNode;\n stackOffset?: number;\n stackScale?: number;\n itemClassName?: string;\n};\n\nexport const AnimatedZStack: React.FC<AnimatedZStackProps> = ({\n children,\n stackOffset = 8,\n stackScale = 0.05,\n itemClassName,\n}) => {\n const filteredChildren = React.Children.toArray(children).filter(Boolean);\n\n return (\n <AnimatePresence>\n {filteredChildren.map((child, index) => (\n <AnimatedZStackItem\n key={index}\n stackOffset={stackOffset}\n stackScale={stackScale}\n index={index}\n length={filteredChildren.length}\n className={itemClassName}\n >\n {child}\n </AnimatedZStackItem>\n ))}\n </AnimatePresence>\n );\n};\n","import { useEffect, useMemo, useRef, type ReactNode } from 'react';\n\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport { pages } from './pagesConfig/const';\nimport { type PageState } from './pagesConfig/types';\nimport { type PortalModalState } from './modals/types';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { AnimatedZStack } from '../primitives/AnimatedZStack';\nimport { modals } from './modals';\nimport { usePortalUI, usePortalCurrentPage, usePortalUIMaxContentHeight, usePortalModals } from '@/stores';\nimport { cn } from '@/utils';\n\ninterface ContentSectionProps {\n overriddingPage?: PageState;\n}\n\nconst MeasuredContentRenderer: React.FC<{\n children?: ReactNode;\n id: string;\n isModal?: boolean;\n onModalOverlayClick?: () => void;\n}> = ({ children, id, isModal, onModalOverlayClick }) => {\n const { setContentHeight, removeContentHeight } = usePortalUI();\n const contentRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!contentRef.current) return;\n\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const height = entry.borderBoxSize?.[0]?.blockSize ?? entry.target.getBoundingClientRect().height;\n setContentHeight(id, height);\n }\n });\n\n observer.observe(contentRef.current);\n return () => {\n observer.disconnect();\n removeContentHeight(id);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n return (\n <>\n {isModal && (\n <div\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onModalOverlayClick?.();\n }}\n className=\"absolute flex w-full h-full bg-[#0E2F3F]/30 origin-top translate-y-[-8px] scale-[0.95]\"\n />\n )}\n <div className=\"relative flex w-full h-full overflow-y-hidden pointer-events-none\">\n <div className={cn('fnx-panel absolute flex left-0 w-full p-4 top-0 pointer-events-auto')} ref={contentRef}>\n {children}\n </div>\n </div>\n </>\n );\n};\n\nconst ContentRenderer: React.FC<{ page: PageState }> = ({ page }) => {\n const content = useMemo(() => {\n const PageComp = pages[page.page];\n const props = page.props ?? {};\n return <PageComp {...props} />;\n }, [page]);\n\n return <MeasuredContentRenderer id=\"content\">{content}</MeasuredContentRenderer>;\n};\n\nconst ModalRenderer: React.FC<{ modal: PortalModalState }> = ({ modal }) => {\n const content = useMemo(() => {\n const ModalComp = modals[modal.modal] as React.FC<typeof modal>;\n return <ModalComp {...modal} />;\n }, [modal]);\n\n return (\n <MeasuredContentRenderer id={`${modal.modal}-modal`} isModal onModalOverlayClick={modal.onClose}>\n {content}\n </MeasuredContentRenderer>\n );\n};\n\nexport const ContentSection: React.FC<ContentSectionProps> = ({ overriddingPage }) => {\n const { isTopSide } = useFnxFloatingButtonContext();\n const { contentPanelOpen } = usePortalUI();\n const { modalStack } = usePortalModals();\n const maxContentHeight = usePortalUIMaxContentHeight();\n const currentPage = usePortalCurrentPage();\n const pageOrOverridingPage = overriddingPage ?? currentPage;\n\n return (\n <AnimatePresence>\n {contentPanelOpen && (\n <motion.div\n className=\"relative flex w-full z-50\"\n initial={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n animate={{ opacity: 1, y: 0, height: `${maxContentHeight}px`, maxHeight: `${maxContentHeight}px` }}\n exit={{ opacity: 0, y: isTopSide ? -10 : 10 }}\n >\n <AnimatedZStack>\n <ContentRenderer page={pageOrOverridingPage} />\n {modalStack.map((modal) => {\n return <ModalRenderer key={modal.modal} modal={modal} />;\n })}\n </AnimatedZStack>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n","import { MdOutlineAccountBalanceWallet } from 'react-icons/md';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { AddressButton } from '../../components/AddressButton';\nimport { ConnectedChainIndicator } from '../../components/ConnectedChainIndicator';\n\nexport const WalletHeader: React.FC = () => {\n const walletAddress = useCofheAccount();\n\n return (\n <div className=\"flex items-center justify-between\">\n {/* Left: Wallet Address */}\n <AddressButton address={walletAddress} icon={<MdOutlineAccountBalanceWallet className=\"w-4 h-4\" />} />\n\n {/* Right: Network Selector + Settings */}\n <div className=\"flex items-center gap-2\">\n <ConnectedChainIndicator />\n </div>\n </div>\n );\n};\n","import { useState } from 'react';\nimport { MdContentCopy, MdCheck } from 'react-icons/md';\nimport { cn } from '../../../utils/cn.js';\nimport { truncateAddress } from '../../../utils/utils.js';\n\ninterface AddressButtonProps {\n address: string | null | undefined;\n className?: string;\n icon?: React.ReactNode;\n showCopyIcon?: boolean;\n}\n\nexport const AddressButton: React.FC<AddressButtonProps> = ({ address, className, icon, showCopyIcon = true }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopyAddress = async () => {\n if (!address) return;\n try {\n await navigator.clipboard.writeText(address);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy address:', err);\n }\n };\n\n const truncatedAddress = truncateAddress(address) || 'Not connected';\n\n return (\n <button\n onClick={handleCopyAddress}\n disabled={!address}\n className={cn(\n 'flex items-center gap-2 px-2 py-1 rounded fnx-hover-overlay transition-colors',\n 'fnx-text-primary text-sm',\n className\n )}\n >\n {icon}\n <span className=\"font-mono\">{truncatedAddress}</span>\n {showCopyIcon && address && (copied ? <MdCheck className=\"w-3 h-3\" /> : <MdContentCopy className=\"w-3 h-3\" />)}\n {copied && !showCopyIcon && <span className=\"text-xs opacity-70\">Copied!</span>}\n </button>\n );\n};\n","import { getChainById } from '@cofhe/sdk/chains';\nimport { ChainIcon } from './ChainIcon';\nimport { cn } from '@/utils/cn';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\n\nexport const ConnectedChainIndicator: React.FC = () => {\n const chainId = useCofheChainId();\n\n // Get network name from SDK chains\n const chain = chainId ? getChainById(chainId) : undefined;\n const currentNetwork = chain?.name || 'Eth';\n\n return (\n <div\n className={cn(\n 'flex items-center gap-1 px-2 py-1 rounded fnx-hover-overlay transition-colors',\n 'fnx-text-primary text-sm outline-none border fnx-dropdown-border',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n >\n <ChainIcon chainId={chainId} />\n <span className=\"font-medium\">{currentNetwork}</span>\n </div>\n );\n};\n","import type { SVGProps } from \"react\";\nconst Svg11155111 = (props: SVGProps<SVGSVGElement>) => <svg id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlnsXlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 1920 1920\" enableBackground=\"new 0 0 1920 1920\" xmlSpace=\"preserve\" {...props}><g><polygon fill=\"#8A92B2\" points=\"959.8,80.7 420.1,976.3 959.8,731 \" /><polygon fill=\"#62688F\" points=\"959.8,731 420.1,976.3 959.8,1295.4 \" /><polygon fill=\"#62688F\" points=\"1499.6,976.3 959.8,80.7 959.8,731 \" /><polygon fill=\"#454A75\" points=\"959.8,1295.4 1499.6,976.3 959.8,731 \" /><polygon fill=\"#8A92B2\" points=\"420.1,1078.7 959.8,1839.3 959.8,1397.6 \" /><polygon fill=\"#62688F\" points=\"959.8,1397.6 959.8,1839.3 1499.9,1078.7 \" /></g></svg>;\nexport default Svg11155111;","import type { SVGProps } from \"react\";\nconst Svg84532 = (props: SVGProps<SVGSVGElement>) => <svg width={256} height={256} viewBox=\"0 0 256 256\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"M256 128C256 198.692 198.592 256 127.777 256C60.5909 256 5.47394 204.417 0 138.759H169.482V117.24H0C5.47394 51.583 60.5909 0 127.777 0C198.592 0 256 57.3074 256 128Z\" fill=\"#0052FF\" /></svg>;\nexport default Svg84532;","import { cn } from '@/utils';\n\n// The icons probably needs to be part of the SDK chains package\n// Import chain icons\nimport sepolia from '@/assets/chains/11155111.svg';\nimport baseSepolia from '@/assets/chains/84532.svg';\n\nconst chainIcons: Record<number, React.FC<React.SVGProps<SVGSVGElement>>> = {\n 11155111: sepolia,\n 84532: baseSepolia,\n};\n\ninterface ChainIconProps {\n chainId: number | undefined;\n className?: string;\n}\n\nexport const ChainIcon: React.FC<ChainIconProps> = ({ chainId, className }) => {\n const Icon = chainId ? chainIcons[chainId] : undefined;\n\n if (Icon) {\n return <Icon className={cn('w-4 h-4 flex-shrink-0', className)} />;\n }\n\n // Fallback icon\n return (\n <div className={cn('w-4 h-4 rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0', className)}>\n <span className=\"text-[8px]\">⟠</span>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { TokenIcon } from '../../components/TokenIcon';\nimport { CofheTokenConfidentialBalance } from '../../components/CofheTokenConfidentialBalance';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { DEFAULT_TOKEN_BY_CHAIN_ID } from '@/types/token';\n\nexport const AssetCard: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n\n const pinnedToken = useCofhePinnedToken();\n const chainId = useCofheChainId();\n const fallbackToken = chainId ? DEFAULT_TOKEN_BY_CHAIN_ID[chainId] : undefined;\n const token = pinnedToken ?? fallbackToken;\n\n const handleClick = () => {\n if (token) {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: { token },\n });\n } else {\n throw new Error('No token found for AssetCard. No pinned token and no fallback token for current chain.');\n }\n };\n\n return (\n <div\n onClick={handleClick}\n className={cn('fnx-card-bg p-4 cursor-pointer', 'hover:opacity-90 transition-opacity', 'border fnx-card-border')}\n >\n <div className=\"flex items-center justify-between\">\n {/* Left Side: Icon, Ticker, Privacy Metrics */}\n <div className=\"flex items-center gap-3 flex-1\">\n {/* Asset Icon */}\n <TokenIcon logoURI={token?.logoURI} alt={token?.symbol} size=\"md\" />\n\n {/* Ticker and Privacy */}\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-lg font-bold fnx-text-primary\">{token?.symbol}</h3>\n\n {/* Privacy Metrics Placeholder for future implementation */}\n {/* <div className=\"flex items-center gap-2 text-xs fnx-text-primary opacity-80\">\n <div className=\"flex items-center gap-1\">\n <VisibilityOffIcon className=\"w-3 h-3\" />\n <span>{asset.privacyHidden}%</span>\n </div>\n <span>|</span>\n <div className=\"flex items-center gap-1\">\n <VisibilityIcon className=\"w-3 h-3\" />\n <span>{asset.privacyVisible}%</span>\n </div>\n </div> */}\n </div>\n </div>\n\n {/* Right Side: Balance, Change, Arrow */}\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-col items-end\">\n {/* // TODO: add suport for displaying native token balance if no pinned address */}\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"xl\"\n decimalPrecision={5}\n className=\"font-bold\"\n />\n {/* <div className=\"text-sm fnx-positive-change font-medium\">\n {asset.change}\n </div> */}\n </div>\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60\" />\n </div>\n </div>\n </div>\n );\n};\n","import { useState, useEffect } from 'react';\nimport { cn } from '@/utils';\nimport defaultTokenIcon from '@/assets/default-token.webp';\n\ntype TokenIconSize = 'sm' | 'md' | 'lg' | 'xl';\n\ninterface TokenIconProps {\n /** Token logo URI */\n logoURI?: string | null;\n /** Alt text for the image */\n alt?: string;\n /** Size variant */\n size?: TokenIconSize;\n /** CSS class name for the container div (overrides size if provided) */\n className?: string;\n /** CSS class name for the image */\n imageClassName?: string;\n}\n\nconst sizeClasses: Record<TokenIconSize, string> = {\n sm: 'w-5 h-5',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n xl: 'w-16 h-16',\n};\n\nexport const TokenIcon: React.FC<TokenIconProps> = ({\n logoURI,\n alt = 'Token',\n size = 'sm',\n className,\n imageClassName = 'w-full h-full object-cover',\n}) => {\n const [iconError, setIconError] = useState(false);\n\n // Reset error when logoURI changes\n useEffect(() => {\n setIconError(false);\n }, [logoURI]);\n\n const containerClassName =\n className ||\n cn(sizeClasses[size], 'rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0 overflow-hidden');\n\n return (\n <div className={containerClassName}>\n <img\n src={iconError || !logoURI ? defaultTokenIcon : logoURI}\n alt={alt}\n className={imageClassName}\n onError={() => setIconError(true)}\n />\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\n\nexport interface LoadingDotsProps {\n /** Size variant for the dots */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /** Custom className for the container */\n className?: string;\n /** Color variant - defaults to primary text color */\n variant?: 'primary' | 'secondary';\n}\n\nconst sizeClasses = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n};\n\nexport const LoadingDots: React.FC<LoadingDotsProps> = ({ size = 'md', className, variant = 'primary' }) => {\n return (\n <span\n className={cn(\n 'fnx-loading-dots',\n sizeClasses[size],\n variant === 'primary' ? 'fnx-text-primary' : 'opacity-70',\n className\n )}\n >\n <span>•</span>\n <span>•</span>\n <span>•</span>\n </span>\n );\n};\n","import { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nimport { cn } from '@/utils';\nimport { LoadingDots } from './LoadingDots';\n\nconst sizeClasses = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-xl',\n xl: 'text-2xl',\n};\n\ntype TokenBalanceViewProps = {\n className?: string;\n size?: 'sm' | 'md' | 'lg' | 'xl';\n formattedBalance?: string;\n symbol?: string;\n isFetching?: boolean;\n hidden?: boolean;\n};\nexport const TokenBalanceView: React.FC<TokenBalanceViewProps> = ({\n className,\n size = 'md',\n formattedBalance,\n symbol,\n isFetching,\n hidden,\n}) => {\n return (\n <span className={cn(sizeClasses[size], 'font-medium fnx-text-primary', className)}>\n {hidden ? <ConfidentialValuePlaceholder /> : isFetching ? <LoadingDots size={size} /> : formattedBalance}\n {symbol && ` ${symbol}`}\n </span>\n );\n};\n\nconst ConfidentialValuePlaceholder: React.FC = () => {\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n return (\n <span\n className=\"cursor-pointer hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n navigateToGeneratePermit({\n cause: 'clicked_on_confidential_balance',\n });\n }}\n >\n {'* * *'}\n </span>\n );\n};\n","import type { Address } from 'viem';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { TokenBalanceView } from './TokenBalanceView';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\n\nexport enum BalanceType {\n Public = 'public',\n Confidential = 'confidential',\n}\n\ninterface TokenBalanceProps {\n /** Token object from token list (for non-native tokens) */\n token?: Token;\n /** Account address to fetch balance for */\n accountAddress?: Address;\n\n /** Number of decimal places to show (default: 5) */\n decimalPrecision?: number;\n /** Whether to show the token symbol */\n showSymbol?: boolean;\n\n /** Custom className for the balance text */\n className?: string;\n /** Size variant for the balance display */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nconst DEFAULT_DISPLAY_DECIMALS = 5;\n\nexport const CofheTokenConfidentialBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n // Determine which account address to use\n const effectiveAccountAddress = accountAddress ?? account;\n\n // Use unified hook for confidential balance fetching\n const {\n data: { formatted: confidentialBalanceFormatted } = {},\n isFetching: isFetchingConfidential,\n disabledDueToMissingPermit,\n } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: effectiveAccountAddress,\n displayDecimals: decimalPrecision,\n });\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n hidden={disabledDueToMissingPermit}\n isFetching={isFetchingConfidential}\n formattedBalance={confidentialBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n\nexport const CofheTokenPublicBalance: React.FC<TokenBalanceProps> = ({\n token,\n accountAddress,\n decimalPrecision = DEFAULT_DISPLAY_DECIMALS,\n showSymbol = false,\n className,\n size = 'md',\n}) => {\n const account = useCofheAccount();\n\n const effectiveAccountAddress = accountAddress ?? account;\n\n const { data: { formatted: publicBalanceFormatted } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance(\n { token, accountAddress: effectiveAccountAddress, displayDecimals: decimalPrecision }\n );\n\n return (\n <TokenBalanceView\n className={className}\n size={size}\n isFetching={isFetchingPublic}\n formattedBalance={publicBalanceFormatted}\n symbol={showSymbol ? token?.symbol : undefined}\n />\n );\n};\n","import { useCofheContext } from '@/providers';\nimport { useCofheChainId } from './useCofheConnection';\n\n/**\n * Hook to get pinned token address for the current chain\n * @returns Pinned token address for current chain, or undefined if none\n */\nexport function useCofhePinnedTokenAddress() {\n const widgetConfig = useCofheContext().client.config.react;\n const chainId = useCofheChainId();\n const pinnedTokenAddress = chainId ? widgetConfig.pinnedTokens?.[chainId?.toString()] : undefined;\n return pinnedTokenAddress;\n}\n","import { useCofhePinnedTokenAddress } from './useCofhePinnedTokenAddress';\nimport { useCofheToken } from './useCofheTokenLists';\n\nexport function useCofhePinnedToken({ enabled }: { enabled?: boolean } = {}) {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const token = useCofheToken(\n {\n address: pinnedTokenAddress,\n },\n {\n // only fetch metadata if pinned token address is defined\n enabled: enabled !== false && !!pinnedTokenAddress,\n }\n );\n return token;\n}\n","import { cn } from '@/utils/cn';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { IoMdKey } from 'react-icons/io';\nimport { AiOutlinePieChart } from 'react-icons/ai';\nimport { TbShieldPlus } from 'react-icons/tb';\nimport { FaBug } from 'react-icons/fa';\nimport type { ComponentType, ReactNode } from 'react';\nimport { FloatingButtonPage } from '../../pagesConfig/types';\nimport { useCofhePinnedToken } from '@/hooks/useCofhePinnedToken';\nimport { assert, type ElementOf } from 'ts-essentials';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\nimport { Button } from '../../components';\nimport { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { DEFAULT_TOKEN_BY_CHAIN_ID } from '@/types/token';\n\nconst iconClassName = 'w-4 h-4';\n\nconst ShieldIcon = () => {\n const { totalTokensClaimable } = useCofheClaimableTokens();\n\n const badgeText = totalTokensClaimable > 99 ? '99+' : totalTokensClaimable > 0 ? `+${totalTokensClaimable}` : null;\n\n return (\n <span className=\"relative inline-flex items-center justify-center w-6 h-6 shrink-0\">\n <TbShieldPlus className={iconClassName} />\n {badgeText && (\n <span\n className={cn(\n 'pointer-events-none',\n 'absolute top-0 right-0',\n 'translate-x-[35%] -translate-y-[35%]',\n 'min-w-[18px] h-[18px] px-1',\n 'rounded-full',\n 'flex items-center justify-center',\n 'text-[10px] leading-none font-semibold',\n 'bg-[#6EE7F5] text-[#003B4A]',\n 'outline outline-2 outline-[var(--fnx-button-bg)]',\n 'shadow-sm'\n )}\n >\n {badgeText}\n </span>\n )}\n </span>\n );\n};\n\ntype PagesInBottomMenu =\n | FloatingButtonPage.Send\n | FloatingButtonPage.Shield\n | FloatingButtonPage.Portfolio\n | FloatingButtonPage.Permits\n | FloatingButtonPage.Debug;\n\nconst baseNavItems: {\n id: PagesInBottomMenu;\n label: string;\n icon: ReactNode | ComponentType<{}>;\n}[] = [\n {\n id: FloatingButtonPage.Send,\n label: 'Send',\n icon: <GoArrowUpRight className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Shield,\n label: 'Shield',\n icon: ShieldIcon,\n },\n {\n id: FloatingButtonPage.Portfolio,\n label: 'Portfolio',\n icon: <AiOutlinePieChart className={iconClassName} />,\n },\n {\n id: FloatingButtonPage.Permits,\n label: 'Permits',\n icon: <IoMdKey className={iconClassName} />,\n },\n] as const;\n\nconst debugNavItem = {\n id: FloatingButtonPage.Debug,\n label: 'Debug',\n icon: <FaBug className={iconClassName} />,\n} as const;\n\n/**\n * Checks if we're in production by checking multiple environment variable sources\n * Supports: process.env (Node.js/webpack), import.meta.env (Vite), and other common patterns\n */\nconst isProduction = (): boolean => {\n // Check process.env (Node.js, webpack, etc.)\n // eslint-disable-next-line turbo/no-undeclared-env-vars, no-undef\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n return false;\n }\n\n // Check import.meta.env (Vite)\n if (typeof import.meta !== 'undefined') {\n // {\n // \"BASE_URL\": \"/\",\n // \"DEV\": true,\n // \"MODE\": \"development\",\n // \"PROD\": false,\n // \"SSR\": false\n // }\n const metaEnv = (import.meta as any).env;\n\n // ONLY if ALL flags indicate development AND prod flag doesn't indicate prod, treat as development\n if (metaEnv && metaEnv.MODE === 'development' && metaEnv.DEV === true && metaEnv.PROD === false) {\n return false;\n }\n }\n\n // Default to hiding debug in library context\n return true;\n};\n\nconst navItems = [...baseNavItems, ...(!isProduction() ? [debugNavItem] : [])] as const;\n\nexport const BottomNavigation: React.FC = () => {\n const { navigateTo } = usePortalNavigation();\n const { openPortal } = usePortalUI();\n const pinnedToken = useCofhePinnedToken();\n const chainId = useCofheChainId();\n const fallbackToken = chainId ? DEFAULT_TOKEN_BY_CHAIN_ID[chainId] : undefined;\n const defaultToken = pinnedToken ?? fallbackToken;\n\n const handleNavClick = (page: ElementOf<typeof baseNavItems>['id']) => {\n openPortal();\n\n if (page === FloatingButtonPage.Portfolio) {\n navigateTo(FloatingButtonPage.Portfolio);\n return;\n }\n\n if (page === FloatingButtonPage.Send) {\n assert(defaultToken, 'No pinned token available for Send page');\n navigateTo(FloatingButtonPage.Send, { pageProps: { token: defaultToken } });\n return;\n }\n\n if (page === FloatingButtonPage.Shield) {\n assert(defaultToken, 'No pinned token available for Shield page');\n navigateTo(FloatingButtonPage.Shield, { pageProps: { token: defaultToken } });\n return;\n }\n\n navigateTo(page);\n };\n\n return (\n <div className=\"flex gap-2\">\n {navItems.map((item) => (\n <Button\n key={item.id}\n onClick={() => handleNavClick(item.id)}\n icon={typeof item.icon === 'function' ? <item.icon /> : item.icon}\n iconPosition=\"top\"\n label={item.label}\n className=\"flex-1\"\n />\n ))}\n </div>\n );\n};\n","import { cn } from '../../../utils/cn.js';\nimport type { ReactNode } from 'react';\n\ninterface ActionButtonProps {\n onClick: () => void;\n disabled?: boolean;\n icon?: ReactNode;\n label: string;\n className?: string;\n variant?: 'default' | 'tab';\n pressed?: boolean;\n}\n\n/**\n * Reusable action button styled like the bottom navigation buttons with sharp edges.\n */\nexport const ActionButton: React.FC<ActionButtonProps> = ({\n onClick,\n disabled = false,\n icon,\n label,\n className,\n variant = 'default',\n pressed = false,\n}) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'w-full font-medium flex items-center justify-center gap-1',\n variant === 'tab' ? 'py-2 px-2 text-sm' : 'py-1.5 px-2 text-xs',\n 'fnx-nav-button',\n pressed && 'fnx-nav-button-active',\n 'transition-all',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n >\n {icon}\n <span>{label}</span>\n </button>\n );\n};\n","import { sanitizeNumericInput } from '../../../utils/utils.js';\n\ninterface AmountInputProps {\n value: string;\n onChange: (value: string) => void;\n onMaxClick: () => void;\n placeholder?: string;\n className?: string;\n}\n\n/**\n * Reusable amount input with max button for token operations.\n */\nexport const AmountInput: React.FC<AmountInputProps> = ({\n value,\n onChange,\n onMaxClick,\n placeholder = '0',\n className,\n}) => {\n return (\n <div className={`flex items-center gap-1 w-full ${className ?? ''}`}>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={value}\n onChange={(e) => onChange(sanitizeNumericInput(e.target.value))}\n placeholder={placeholder}\n className=\"flex-1 min-w-0 bg-transparent text-sm font-medium fnx-text-primary outline-none placeholder:opacity-50 text-center border-b fnx-card-border pb-1\"\n />\n <button onClick={onMaxClick} className=\"fnx-max-button text-xxxs font-medium px-1 py-0.5 rounded flex-shrink-0\">\n max\n </button>\n </div>\n );\n};\n","import { cn } from '@/utils/cn';\nimport type { ReactNode } from 'react';\n\nexport type ButtonVariant = 'primary' | 'default' | 'error' | 'warning' | 'ghost' | 'outline';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Button variant style */\n variant?: ButtonVariant;\n /** Button size */\n size?: ButtonSize;\n /** Text content (alternative to children) */\n label?: string;\n /** Icon component to display */\n icon?: ReactNode;\n /** Icon position relative to text */\n iconPosition?: 'left' | 'right' | 'top';\n /** Override default className */\n className?: string;\n /** Button content (alternative to text prop) */\n children?: ReactNode;\n}\n\n/**\n * Reusable button component with support for light/dark mode, multiple variants, and sizes.\n *\n * @example\n * ```tsx\n * <Button variant=\"default\" size=\"md\" text=\"Sign\" />\n * <Button variant=\"error\" size=\"sm\" text=\"Cancel\" icon={<Icon />} />\n * <Button variant=\"outline\" size=\"lg\">\n * Click me\n * </Button>\n * ```\n */\nexport const Button: React.FC<ButtonProps> = ({\n variant = 'default',\n size = 'md',\n label,\n icon,\n iconPosition = 'left',\n className,\n children,\n disabled,\n ...props\n}) => {\n // Determine content - prefer text prop over children\n const content = label ?? children;\n\n // Determine if layout should be vertical\n const isVertical = iconPosition === 'top';\n\n // Base classes\n const baseClasses = cn(\n 'inline-flex items-center justify-center',\n isVertical && 'flex-col',\n 'font-medium',\n 'border transition-all',\n 'focus:outline-none focus:ring-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n 'transition-colors duration-200'\n );\n\n // Size classes - adjust gap for vertical layout\n const sizeClasses: Record<ButtonSize, string> = {\n sm: isVertical ? 'px-2 py-1 text-xs gap-1' : 'px-2 py-1 text-xs gap-1.5',\n md: isVertical ? 'px-3 py-1.5 text-xs gap-1' : 'px-3 py-1.5 text-xs gap-1.5',\n lg: isVertical ? 'px-4 py-2 text-sm gap-1.5' : 'px-4 py-2 text-sm gap-2',\n // xl: isVertical ? 'px-6 py-3 text-base gap-2' : 'px-6 py-3 text-base gap-2.5',\n };\n\n // Variant classes for light mode\n const variantClassesLight: Record<ButtonVariant, string> = {\n primary: cn('bg-[#80E6E6] hover:bg-[#6DD5D5]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#80E6E6]'),\n default: cn(\n 'bg-white hover:bg-[#6DD5D5]',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n error: cn('bg-[#FFB399] hover:bg-[#FF9F80]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFB399]'),\n warning: cn('bg-[#FFD699] hover:bg-[#FFC966]', 'text-[#003366]', 'border-[#666666]', 'focus:ring-[#FFD699]'),\n ghost: cn('bg-transparent hover:bg-gray-100', 'text-[#003366]', 'border-transparent', 'focus:ring-gray-300'),\n outline: cn(\n 'bg-white hover:bg-gray-50',\n 'text-[#003366]',\n 'border-[#666666]',\n 'hover:border-[#4A4A4A]',\n 'focus:ring-gray-300'\n ),\n };\n\n // Variant classes for dark mode\n const variantClassesDark: Record<ButtonVariant, string> = {\n primary: cn(\n 'dark:bg-[#2E9D9D] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#2E9D9D]'\n ),\n default: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#268585]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n error: cn(\n 'dark:bg-[#D9532E] dark:hover:bg-[#C0441F]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#D9532E]'\n ),\n warning: cn(\n 'dark:bg-[#E67E22] dark:hover:bg-[#D35400]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:focus:ring-[#E67E22]'\n ),\n ghost: cn(\n 'dark:bg-transparent dark:hover:bg-[#374151]',\n 'dark:text-white',\n 'dark:border-transparent',\n 'dark:focus:ring-gray-600'\n ),\n outline: cn(\n 'dark:bg-[#595959] dark:hover:bg-[#4A4A4A]',\n 'dark:text-white',\n 'dark:border-[##858585]',\n 'dark:hover:border-[#9E9E9E]',\n 'dark:focus:ring-gray-600'\n ),\n };\n\n // Combine all classes\n const buttonClasses = cn(\n baseClasses,\n sizeClasses[size],\n variantClassesLight[variant],\n variantClassesDark[variant],\n className\n );\n\n // Icon wrapper classes - flex container that doesn't constrain icon size\n const iconWrapperClasses = 'flex items-center justify-center flex-shrink-0';\n\n return (\n <button className={buttonClasses} disabled={disabled} {...props}>\n {icon && iconPosition === 'top' && <span className={iconWrapperClasses}>{icon}</span>}\n {icon && iconPosition === 'left' && <span className={iconWrapperClasses}>{icon}</span>}\n {content}\n {icon && iconPosition === 'right' && <span className={iconWrapperClasses}>{icon}</span>}\n </button>\n );\n};\n","import { useId, useMemo } from 'react';\nimport {\n Area,\n AreaChart,\n CartesianGrid,\n ResponsiveContainer,\n Tooltip,\n type TooltipContentProps,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport { cn } from '@/utils/cn';\n\nexport interface TokenPriceChartPoint {\n /** Unix ms */\n ts: number;\n /** Price in USD */\n value: number;\n}\n\nexport interface TokenPriceChartProps {\n points: TokenPriceChartPoint[];\n className?: string;\n height?: number;\n}\n\nconst formatTime = (ts: number): string =>\n new Date(ts).toLocaleTimeString(undefined, {\n hour: '2-digit',\n minute: '2-digit',\n });\n\nconst formatUsd = (n: number): string =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n\nconst CustomTooltip = ({ active, payload, label }: TooltipContentProps<number, string>) => {\n if (!active || !payload?.length) return null;\n const v = payload[0]?.value;\n if (typeof v !== 'number') return null;\n\n return (\n <div className=\"rounded-md border fnx-card-border fnx-card-bg px-2 py-1 shadow-sm\">\n <div className=\"text-xxxs opacity-70\">{typeof label === 'number' ? formatTime(label) : ''}</div>\n <div className=\"text-xs font-semibold fnx-text-primary\">{formatUsd(v)}</div>\n </div>\n );\n};\n\nconst themeClasses = {\n /** Used by the chart line + area fill via `currentColor` */\n accent: 'text-teal-500 dark:text-teal-400',\n /** Recharts renders grid lines as SVG paths with this class */\n gridLines:\n '[&_.recharts-cartesian-grid_line]:stroke-slate-400/25 dark:[&_.recharts-cartesian-grid_line]:stroke-white/10',\n /** Recharts tooltip cursor is an SVG path with this class */\n tooltipCursor:\n '[&_.recharts-tooltip-cursor]:stroke-current [&_.recharts-tooltip-cursor]:stroke-opacity-35 dark:[&_.recharts-tooltip-cursor]:stroke-opacity-45',\n} as const;\n\nexport const TokenPriceChart: React.FC<TokenPriceChartProps> = ({ points, className, height = 150 }) => {\n const gradientId = useId();\n\n const { start, mid, end } = useMemo(() => {\n if (!points.length) {\n const now = Date.now();\n return { start: now - 24 * 3600_000, mid: now - 12 * 3600_000, end: now };\n }\n const start = points[0].ts;\n const end = points[points.length - 1].ts;\n const mid = start + (end - start) / 2;\n return { start, mid, end };\n }, [points]);\n\n return (\n <div\n className={cn(\n 'w-full',\n // Tailwind-driven theming for Recharts (SVG) using `currentColor` + nested selectors\n themeClasses.accent,\n themeClasses.gridLines,\n themeClasses.tooltipCursor,\n className\n )}\n >\n <div style={{ height }} className=\"w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={points} margin={{ top: 10, right: 10, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"currentColor\" stopOpacity={0.5} />\n <stop offset=\"100%\" stopColor=\"currentColor\" stopOpacity={0} />\n </linearGradient>\n </defs>\n\n <CartesianGrid vertical={false} strokeDasharray=\"3 3\" />\n\n <XAxis dataKey=\"ts\" type=\"number\" domain={['dataMin', 'dataMax']} hide />\n <YAxis dataKey=\"value\" domain={['dataMin', 'dataMax']} hide />\n <Tooltip content={CustomTooltip} />\n\n <Area\n type=\"monotone\"\n dataKey=\"value\"\n stroke=\"currentColor\"\n strokeWidth={2}\n fillOpacity={1}\n fill={`url(#${gradientId})`}\n dot={false}\n activeDot={{ r: 4, stroke: 'currentColor', strokeWidth: 2, fill: '#ffffff' }}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n\n <div className=\"flex items-center justify-between text-xxxs opacity-60 mt-1\">\n <span>{formatTime(start)}</span>\n <span>{formatTime(mid)}</span>\n <span>{formatTime(end)}</span>\n </div>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { type ReactNode } from 'react';\n\ninterface PageContainerProps {\n /** Whether the page is a modal */\n isModal?: boolean;\n /** Optional header component that will be fixed at the top */\n header?: ReactNode;\n /** Body content that will be scrollable if it overflows */\n content?: ReactNode;\n /** Optional footer component that will be pinned to the bottom */\n footer?: ReactNode;\n}\n\n/**\n * PageContainer provides a consistent layout structure for pages with:\n * - Optional header (fixed at top)\n * - Scrollable body content\n * - Optional footer (pinned at bottom)\n * - Max height of 500px, but shrinks to fit content when smaller\n */\nexport const PageContainer: React.FC<PageContainerProps> = ({ isModal, header, content, footer }) => {\n return (\n <div className={cn('flex flex-col max-h-[500px] w-full gap-4', isModal ? '' : 'h-full')}>\n {/* Header - fixed at top, doesn't scroll */}\n {header && <div className=\"flex-shrink-0\">{header}</div>}\n\n {/* Body - scrollable middle section that fills available space */}\n {content && <div className=\"flex-1 min-h-0 overflow-y-auto\">{content}</div>}\n\n {/* Footer - fixed at bottom, doesn't scroll */}\n {footer && <div className=\"flex-shrink-0\">{footer}</div>}\n </div>\n );\n};\n","import { formatUnits } from 'viem';\nimport { cn } from '../../../utils/cn.js';\nimport { GoArrowUpRight } from 'react-icons/go';\nimport { TbShieldPlus, TbShieldMinus, TbShieldCheck } from 'react-icons/tb';\nimport {\n type Transaction,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n} from '../../../stores/transactionStore.js';\nimport { formatRelativeTime } from '../../../utils/utils.js';\nimport { HashLink } from './HashLink.js';\n\ninterface TransactionItemProps {\n transaction: Transaction;\n}\n\nconst ActionIcon: React.FC<{ actionType: TransactionActionType }> = ({ actionType }) => {\n const iconClassName = 'w-5 h-5';\n\n switch (actionType) {\n case TransactionActionType.ShieldSend:\n return <GoArrowUpRight className={iconClassName} />;\n case TransactionActionType.Shield:\n return <TbShieldPlus className={iconClassName} />;\n case TransactionActionType.Unshield:\n return <TbShieldMinus className={iconClassName} />;\n case TransactionActionType.Claim:\n return <TbShieldCheck className={iconClassName} />;\n default:\n return <GoArrowUpRight className={iconClassName} />;\n }\n};\n\nexport const TransactionItem: React.FC<TransactionItemProps> = ({ transaction }) => {\n const statusColorClass =\n transaction.status === TransactionStatus.Pending\n ? 'text-yellow-600 dark:text-yellow-400'\n : transaction.status === TransactionStatus.Confirmed\n ? 'text-green-600 dark:text-green-400'\n : 'text-red-600 dark:text-red-400';\n\n return (\n <div className=\"fnx-card-bg p-3 rounded-lg border fnx-dropdown-border\">\n <div className=\"flex items-start gap-3\">\n {/* Action Icon */}\n <div className=\"w-8 h-8 rounded-full fnx-icon-bg flex items-center justify-center flex-shrink-0 fnx-text-primary\">\n <ActionIcon actionType={transaction.actionType} />\n </div>\n\n {/* Transaction Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold fnx-text-primary\">{actionToString(transaction.actionType)}</span>\n <span className=\"text-sm font-semibold fnx-text-primary\">\n {formatUnits(transaction.tokenAmount, transaction.token.decimals)} {transaction.token.symbol}\n </span>\n </div>\n\n <div className=\"flex items-center justify-between gap-2 mt-1\">\n <span className={cn('text-xs font-medium', statusColorClass)}>{statusToString(transaction.status)}</span>\n <span className=\"text-xs fnx-text-primary opacity-60\">{formatRelativeTime(transaction.timestamp)}</span>\n </div>\n\n <div className=\"mt-1\">\n <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} copyable />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { WalletHeader } from './MainPage/WalletHeader';\nimport { AssetCard } from './MainPage/AssetCard';\nimport { BottomNavigation } from './MainPage/BottomNavigation';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const MainPage: React.FC = () => (\n <PageContainer header={<WalletHeader />} content={<AssetCard />} footer={<BottomNavigation />} />\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useSettingsStore, ShieldPageVariant, SHIELD_PAGE_VARIANT_LABELS } from '../stores/settingsStore.js';\nimport { usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const SettingsPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { shieldPageVariant, setShieldPageVariant } = useSettingsStore();\n\n const variants = Object.values(ShieldPageVariant);\n\n return (\n <PageContainer\n header={\n <button onClick={navigateBack} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Settings</span>\n </button>\n }\n content={\n <div className=\"space-y-3\">\n <p className=\"text-sm font-medium\">A/B Testing</p>\n\n {/* Shield Page Variant */}\n <div className=\"space-y-2\">\n <p className=\"text-xs opacity-70\">Shield Page</p>\n <div className=\"space-y-1\">\n {variants.map((variant) => (\n <label key={variant} className=\"flex items-center gap-2 text-xs cursor-pointer\">\n <input\n type=\"radio\"\n name=\"shieldPageVariant\"\n checked={shieldPageVariant === variant}\n onChange={() => setShieldPageVariant(variant)}\n />\n <span>{SHIELD_PAGE_VARIANT_LABELS[variant]}</span>\n </label>\n ))}\n </div>\n </div>\n </div>\n }\n />\n );\n};\n","import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\n// ============================================================================\n// Shield Page Variants (A/B Testing)\n// ============================================================================\n\nexport enum ShieldPageVariant {\n Option1 = 'option1',\n Option2 = 'option2',\n}\n\nexport const SHIELD_PAGE_VARIANT_LABELS: Record<ShieldPageVariant, string> = {\n [ShieldPageVariant.Option1]: 'Modern UI',\n [ShieldPageVariant.Option2]: 'Classic UI',\n};\n\n// ============================================================================\n// Settings Store\n// ============================================================================\n\ninterface SettingsState {\n /** Selected shield page variant for A/B testing */\n shieldPageVariant: ShieldPageVariant;\n\n /** Set the shield page variant */\n setShieldPageVariant: (variant: ShieldPageVariant) => void;\n}\n\nexport const useSettingsStore = create<SettingsState>()(\n persist(\n (set) => ({\n shieldPageVariant: ShieldPageVariant.Option1,\n\n setShieldPageVariant: (variant) => set({ shieldPageVariant: variant }),\n }),\n {\n name: 'cofhe-settings',\n }\n )\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { FaKey, FaDownload, FaPlus } from 'react-icons/fa';\nimport { type ElementType } from 'react';\nimport { Accordion, AccordionSection } from '../../../Accordion.js';\nimport { PermitItem } from '../components/PermitItem.js';\nimport { usePermitsList } from '@/hooks/permits/index.js';\nimport type { PermitActionId } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer.js';\nimport { useCofheActivePermit } from '@/hooks/useCofhePermits.js';\nimport type { Permit } from '@cofhe/sdk/permits';\nimport { Button } from '@/components/FnxFloatingButton/components/Button.js';\nimport { InfoModalButton } from '@/components/FnxFloatingButton/modals/InfoModalButton.js';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/FnxFloatingButton/modals/types.js';\nimport { PermitCard } from '@/components/FnxFloatingButton/components/PermitCard.js';\n\ntype PermitActionItem = { id: PermitActionId; label: string; icon: ElementType };\n\nconst permitActions: PermitActionItem[] = [\n { id: 'generate', label: 'Generate', icon: FaPlus },\n { id: 'delegate', label: 'Delegate', icon: FaKey },\n { id: 'import', label: 'Import', icon: FaDownload },\n];\n\ntype Args = {\n generatedPermitsCount: number;\n receivedPermitsCount: number;\n activePermit?: Permit;\n};\n\nfunction computeDefaultActiveAccordionId({ activePermit }: Args): 'self' | 'received' {\n if (activePermit?.type === 'recipient') {\n return 'received';\n }\n return 'self';\n}\n\nexport const PermitsListPage: React.FC = () => {\n const { activePermitHash, selfPermits, delegatedPermits, importedPermits, handlePermitAction, handleOpenPermit } =\n usePermitsList();\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const { permit } = useCofheActivePermit() ?? {};\n\n const defaultActiveAccordionId = computeDefaultActiveAccordionId({\n generatedPermitsCount: selfPermits.length,\n receivedPermitsCount: importedPermits.length,\n activePermit: permit,\n });\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-3\">\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={navigateBack}\n type=\"button\"\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Permits</span>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitInfo)} />\n </button>\n {activePermitHash != null && (\n <PermitCard\n hash={activePermitHash}\n className=\"-ml-4 -mr-4\"\n header={<p className=\"text-sm font-semibold\">Active Permit:</p>}\n />\n )}\n </div>\n }\n content={\n <div className=\"gap-4\">\n <Accordion defaultActiveId={defaultActiveAccordionId}>\n <div className=\"flex flex-col gap-3\">\n <AccordionSection\n id=\"self\"\n renderHeader={() => (\n <>\n <span>Self: ({selfPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'self' })} />\n </>\n )}\n >\n {selfPermits.length === 0 ? (\n <div className=\"pl-4 text-xs p-2 px-4 italic\">No self permits.</div>\n ) : (\n <div>\n {selfPermits.map((permit) => {\n return (\n <PermitItem\n key={permit.hash}\n activePermitHash={activePermitHash}\n permit={permit}\n onClick={() => handleOpenPermit(permit.hash)}\n />\n );\n })}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"delegated\"\n renderHeader={() => (\n <>\n <span>Delegated: ({delegatedPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'sharing' })} />\n </>\n )}\n >\n {delegatedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No delegated permits.</div>\n ) : (\n <div>\n {delegatedPermits.map((permit) => (\n <PermitItem key={permit.hash} permit={permit} onClick={() => handleOpenPermit(permit.hash)} />\n ))}\n </div>\n )}\n </AccordionSection>\n\n <AccordionSection\n id=\"received\"\n renderHeader={() => (\n <>\n <span>Imported: ({importedPermits.length})</span>{' '}\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: 'recipient' })} />\n </>\n )}\n >\n {importedPermits.length === 0 ? (\n <div className=\"pl-1 text-xs p-2 px-4 italic\">No imported permits.</div>\n ) : (\n <div>\n {importedPermits.map((permit) => (\n <PermitItem\n key={permit.hash}\n activePermitHash={activePermitHash}\n permit={permit}\n onClick={() => handleOpenPermit(permit.hash)}\n />\n ))}\n </div>\n )}\n </AccordionSection>\n </div>\n </Accordion>\n </div>\n }\n footer={\n <div className=\"grid grid-cols-3 gap-2\">\n {permitActions.map(({ id, label, icon: Icon }) => (\n <Button key={id} onClick={() => handlePermitAction(id)} icon={<Icon />} iconPosition=\"top\" label={label} />\n ))}\n </div>\n }\n />\n );\n};\n","import { cn } from '@/utils';\nimport { createContext, useCallback, useContext, useMemo, useState, type ReactNode } from 'react';\nimport { Button } from './components';\nimport { FaChevronDown, FaChevronUp } from 'react-icons/fa6';\n\ninterface AccordionContextValue {\n activeId: string | null;\n toggle: (id: string) => void;\n}\n\nconst AccordionContext = createContext<AccordionContextValue | undefined>(undefined);\n\ninterface AccordionProps {\n children: ReactNode;\n defaultActiveId?: string | null;\n}\n\nexport const Accordion = ({ children, defaultActiveId = null }: AccordionProps) => {\n const [activeId, setActiveId] = useState<string | null>(defaultActiveId);\n\n const handleToggle = useCallback(\n (id: string) => {\n setActiveId(activeId === id ? null : id);\n },\n [activeId]\n );\n\n const contextValue = useMemo<AccordionContextValue>(\n () => ({\n activeId,\n toggle: handleToggle,\n }),\n [handleToggle, activeId]\n );\n\n return <AccordionContext.Provider value={contextValue}>{children}</AccordionContext.Provider>;\n};\n\nconst useAccordionContext = () => {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('Accordion components must be used within an Accordion');\n }\n\n return context;\n};\n\ninterface AccordionSectionProps {\n id: string;\n renderHeader: (isOpen: boolean) => ReactNode;\n children: ReactNode;\n sectionClassName?: string;\n triggerClassName?: string;\n contentClassName?: string;\n}\n\nexport const AccordionSection = ({\n id,\n renderHeader,\n children,\n sectionClassName,\n triggerClassName,\n contentClassName,\n}: AccordionSectionProps) => {\n const { activeId, toggle } = useAccordionContext();\n const isOpen = activeId === id;\n\n return (\n <section className={sectionClassName}>\n <Button\n variant=\"ghost\"\n className={cn('!justify-start w-full text-md py-2', triggerClassName)}\n aria-expanded={isOpen}\n onClick={() => toggle(id)}\n >\n {renderHeader(isOpen)}\n <span className=\"flex flex-1\" />\n {isOpen ? <FaChevronUp /> : <FaChevronDown />}\n </Button>\n {isOpen ? (\n <div className={cn('relative', contentClassName)}>\n <span\n className=\"absolute left-0 top-0 bottom-0 border-l border-[#0E2F3F]/30 dark:border-white/40\"\n aria-hidden\n />\n {children}\n </div>\n ) : null}\n </section>\n );\n};\n","import type { PermitStatus } from '@/hooks/permits/index.js';\nimport { ValidationUtils, type Permit } from '@cofhe/sdk/permits';\nimport type { FC } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nconst statusStyles: Record<PermitStatus, string> = {\n active: 'bg-[#01D082] text-[#0D3547] border border-[#068571]',\n valid: 'bg-[#247AFF] text-white border border-[#247AFF]',\n expired: 'bg-[#F0784F] text-[#4A1004] border border-[#A1421F]',\n};\n\nconst statusToLabel: Record<PermitStatus, string> = {\n active: 'Active',\n valid: 'Valid',\n expired: 'Expired',\n};\n\ninterface PermitItemProps {\n permit: Permit;\n activePermitHash?: string;\n onClick?: (id: string) => void;\n}\n\nexport const PermitItem: FC<PermitItemProps> = ({ permit, onClick, activePermitHash }) => {\n const status: PermitStatus = ValidationUtils.isExpired(permit)\n ? 'expired'\n : permit.hash === activePermitHash\n ? 'active'\n : 'valid';\n\n return (\n <Button\n variant=\"ghost\"\n className=\"flex flex-row w-full items-centera !justify-start gap-3 p-0.5\"\n onClick={() => onClick?.(permit.hash)}\n >\n <span\n className={cn(\n 'inline-flex items-center justify-center px-1 py-1 text-sm font-semibold h-6 w-24',\n statusStyles[status]\n )}\n >\n {statusToLabel[status]}\n </span>\n {permit.name}\n </Button>\n );\n};\n","import { FaCircleInfo } from 'react-icons/fa6';\n\nexport const InfoModalButton: React.FC<{ onClick: () => void }> = ({ onClick }) => {\n return (\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick();\n }}\n className=\"inline-flex self-center\"\n >\n <FaCircleInfo />\n </button>\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport { zeroAddress } from 'viem';\nimport { cn, formatExpirationLabel, truncateAddress } from '@/utils';\nimport { useCopyFeedback } from '@/hooks/useCopyFeedback';\nimport { type Permit, type PermitType } from '@cofhe/sdk/permits';\nimport { PermitStripedBackground } from '@/components/StripedBackground';\nimport { useCofheActivePermitHash, useCofhePermit } from '@/hooks/useCofhePermits';\nimport { useMemo } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst CopyButton: React.FC<{ hash: string }> = ({ hash }) => {\n const { copiedKeys, copyWithFeedback } = useCopyFeedback();\n\n return (\n <button type=\"button\" onClick={() => copyWithFeedback(hash, hash)}>\n {copiedKeys.has(hash) ? <FaCheck /> : <FaRegCopy />}\n </button>\n );\n};\n\nexport const BasePermitCard: React.FC<{ permit: Permit; className?: string; header?: React.ReactNode }> = ({\n permit,\n className,\n header,\n}) => {\n const activePermitHash = useCofheActivePermitHash();\n const expirationInfo = formatExpirationLabel(permit.expiration);\n\n const metadataTags = useMemo(() => {\n const isActivePermit = permit.hash === activePermitHash;\n const tags: string[] = [];\n if (expirationInfo.expired) tags.push('expired');\n if (expirationInfo.expiringSoon) tags.push('expiring soon');\n if (isActivePermit) tags.push('active');\n return tags;\n }, [expirationInfo.expired, expirationInfo.expiringSoon, activePermitHash, permit]);\n\n return (\n <div\n className={cn(\n 'relative gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n <PermitStripedBackground\n variant={expirationInfo.expired ? 'error' : expirationInfo.expiringSoon ? 'warning' : permit.type}\n className=\"absolute inset-0 z-[1]\"\n />\n <div className=\"relative z-[2] flex flex-1 flex-col gap-3\">\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left\">\n <b>-- {PermitTypeLabel[permit.type].toUpperCase()} PERMIT --</b>\n <br />\n Name: <b>{permit.name}</b>\n <br />\n Issuer: <b>{truncateAddress(permit.issuer, 6, 6)}</b> <CopyButton hash={permit.issuer} />\n <br />\n Expiration:{' '}\n <b>\n {permit.expiration} <i>({expirationInfo.label})</i>\n </b>\n <br />\n {permit.recipient != null && permit.recipient !== zeroAddress && (\n <>\n Recipient: <b>{truncateAddress(permit.recipient, 6, 6)}</b> <CopyButton hash={permit.recipient} />\n <br />\n </>\n )}\n {permit.validatorContract != null && permit.validatorContract !== zeroAddress && (\n <>\n Validator:\n <br />\n {' '}Contract: <b>{truncateAddress(permit.validatorContract, 6, 6)}</b>{' '}\n <CopyButton hash={permit.validatorContract} />\n <br />\n {' '}ID: <b>{permit.validatorId}</b>\n <br />\n </>\n )}\n {metadataTags.length > 0 && <br />}\n {metadataTags.map((tag) => (\n <b key={tag}>\n -- {tag.toUpperCase()} --\n <br />\n </b>\n ))}\n </pre>\n </div>\n </div>\n );\n};\n\nexport const PermitCard: React.FC<{ hash: string; className?: string; header?: React.ReactNode }> = ({\n hash,\n className,\n header,\n}) => {\n const permit = useCofhePermit(hash);\n\n if (permit == null) {\n return (\n <div\n className={cn(\n 'flex flex-col gap-3 border border-[#0E2F3F]/15 bg-[#F8FAFB] p-3 py-4 font-mono text-xs text-[#0E2F3F] dark:border-white/10 dark:bg-[#121212] dark:text-white/80',\n className\n )}\n >\n {header}\n <pre className=\"whitespace-pre-wrap break-words text-left italic p-10\">Permit not found.</pre>\n </div>\n );\n }\n\n return <BasePermitCard permit={permit} className={className} header={header} />;\n};\n","import { cn } from '@/utils/cn';\nimport { type CSSProperties, useMemo } from 'react';\n\ntype StripeProps = {\n /** CSS color for stripes: \"#f00\", \"rgb(...)\", \"hsl(...)\", \"currentColor\", etc. Use \"currentColor\" with Tailwind text color classes. */\n stripeColor?: string;\n /** Background/base color behind the stripes */\n baseColor?: string;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nexport function StripedBackground({\n stripeColor = 'rgba(255,255,255,0.18)',\n baseColor = 'transparent',\n className,\n style,\n children,\n}: StripeProps) {\n const bgImage = useMemo(() => {\n // 2px stripe, 2px gap, repeating at 45 degrees (positive diagonal)\n return `repeating-linear-gradient(\n 45deg,\n ${stripeColor} 0px,\n ${stripeColor} 2px,\n transparent 2px,\n transparent 4px\n )`;\n }, [stripeColor]);\n\n const mergedStyle: CSSProperties = {\n backgroundColor: baseColor,\n backgroundImage: bgImage,\n ...style,\n };\n\n return (\n <div className={className} style={mergedStyle}>\n {children}\n </div>\n );\n}\n\ntype PermitStripedProps = {\n variant: 'self' | 'sharing' | 'recipient' | 'error' | 'warning';\n className?: string;\n children?: React.ReactNode;\n};\n\nconst PermitStripedVariantColors: Record<PermitStripedProps['variant'], string> = {\n self: 'text-blue-500',\n sharing: 'text-green-500',\n recipient: 'text-purple-500',\n error: 'text-red-500',\n warning: 'text-yellow-500',\n};\n\nconst PermitStripedVariantOpacities: Record<PermitStripedProps['variant'], string> = {\n self: 'opacity-15',\n sharing: 'opacity-15',\n recipient: 'opacity-15',\n error: 'opacity-30',\n warning: 'opacity-30',\n};\n\nexport const PermitStripedBackground = ({ variant, className, children }: PermitStripedProps) => {\n const color = PermitStripedVariantColors[variant];\n const opacity = PermitStripedVariantOpacities[variant];\n return (\n <StripedBackground stripeColor=\"currentColor\" className={cn(color, opacity, className)}>\n {children}\n </StripedBackground>\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport type { GeneratePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nexport const GeneratePermitPage: React.FC<GeneratePermitPageProps> = ({\n onSuccessNavigateTo,\n onCancel,\n onBack,\n cause,\n}) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n error,\n nameError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: false,\n onSuccess: () => {\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Create Self-usage Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n {cause === 'clicked_on_confidential_balance' && (\n <>You are trying to view a confidential balance, which requires a permit to access the encrypted data.</>\n )}\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form creates a \"SELF\" permit, which only grants access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitIcon = (props: SVGProps<SVGSVGElement>) => <svg width={19} height={22} viewBox=\"0 0 19 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M16 19V21.97H14V19H11V17H14V14H16V17H19V19H16ZM18 10C18 10.9 17.9 11.78 17.71 12.65C17.13 12.35 16.5 12.15 15.81 12.05C15.93 11.45 16 10.83 16 10.22V5.3L9 2.18L2 5.3V10.22C2 14.54 5.25 19 9 20L9.31 19.91C9.5 20.53 9.83 21.11 10.22 21.62L9 22C3.84 20.74 0 15.55 0 10V4L9 0L18 4V10Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitIcon;","export type NameSectionProps = {\n permitName: string;\n error?: string | null;\n onNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const NameSection: React.FC<NameSectionProps> = ({ permitName, error, onNameChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Name:</span>\n </div>\n <input\n id=\"permit-name\"\n type=\"text\"\n placeholder=\"Human readable name\"\n value={permitName}\n onChange={onNameChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Permit name\"\n />\n {error && (\n <p role=\"alert\" className=\"px-4 pt-1 text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {error}\n </p>\n )}\n </div>\n);\n","import { Button } from '@/components/FnxFloatingButton/components';\n\nexport const ExpirySection = <U extends string>({\n presets,\n units,\n durationSeconds,\n customCount,\n customUnit,\n selectPreset,\n setCustomUnit,\n applyCustom,\n}: {\n presets: ReadonlyArray<{ label: string; seconds: number }>;\n units: ReadonlyArray<U>;\n durationSeconds: number;\n customCount: number | '';\n customUnit: U;\n selectPreset: (seconds: number) => void;\n setCustomUnit: (u: U) => void;\n applyCustom: (count: number | '', unit: U) => void;\n}) => (\n <div className=\"flex flex-col w-full gap-2\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Expiration:</span>\n </div>\n <div className=\"grid grid-cols-3 gap-3\">\n {presets.map((option) => {\n const isActive = durationSeconds === option.seconds;\n return (\n <Button\n key={option.label}\n variant={isActive ? 'primary' : 'default'}\n onClick={() => selectPreset(option.seconds)}\n label={option.label}\n />\n );\n })}\n </div>\n\n {/* TODO: Re-enable custom duration input */}\n {/* <p className=\"text-base font-semibold text-[#0E2F3F] dark:text-white\">- or -</p>\n <div className=\"flex flex-row w-full items-center gap-3\">\n <div className=\"flex-1\">\n <input\n id=\"custom-duration-count\"\n type=\"number\"\n min={1}\n placeholder=\"#\"\n value={customCount}\n onChange={(e) => {\n const raw = e.target.value;\n const v = raw === '' ? '' : Math.max(1, Number(raw));\n applyCustom(v, customUnit);\n }}\n className=\"border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Custom duration count\"\n />\n </div>\n <div className=\"flex items-center gap-2 rounded-xl border border-[#0E2F3F]/40 px-3 py-2 text-base font-semibold text-[#0E2F3F] dark:border-white/40 dark:text-white\">\n <div className=\"flex-1\">\n <label htmlFor=\"custom-duration-unit\" className=\"sr-only\">\n Custom duration unit\n </label>\n </div>\n <select\n id=\"custom-duration-unit\"\n value={customUnit}\n onChange={(e) => setCustomUnit(e.target.value as U)}\n className=\"bg-transparent outline-none appearance-none pr-5\"\n aria-label=\"Custom duration unit\"\n >\n {units.map((u) => (\n <option key={u as string} value={u as string} className=\"text-[#0E2F3F]\">\n {u}\n </option>\n ))}\n </select>\n </div>\n </div> */}\n </div>\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePermitDuration, usePermitForm } from '@/hooks/permits/index';\nimport PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport { NameSection } from '../components/NameSection';\nimport { ReceiverSection } from '../components/ReceiverSection';\nimport { ExpirySection } from '../components/ExpirySection';\nimport { FloatingButtonPage } from '@/components/FnxFloatingButton/pagesConfig/types';\nimport type { DelegatePermitPageProps } from './types';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components';\n\nexport const DelegatePermitPage: React.FC<DelegatePermitPageProps> = ({ onSuccessNavigateTo, onCancel, onBack }) => {\n const { navigateBack, navigateTo, pageHistory } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n } = usePermitForm({\n isDelegate: true,\n onSuccess: () => {\n // TODO: also add toast here in any case\n // by default navigate to permits list, but if arrived here from elsewhere, go back where we came from\n onSuccessNavigateTo ? onSuccessNavigateTo() : navigateTo(FloatingButtonPage.Permits);\n addToast({\n variant: 'success',\n title: 'Permit created',\n description: 'Copy and share data with recipient',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to create permit',\n description: error.message,\n });\n },\n });\n const { presets, units, customCount, customUnit, selectPreset, setCustomCount, setCustomUnit, applyCustom } =\n usePermitDuration({ onDurationChange: setDurationSeconds, initialSeconds: durationSeconds });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={onBack ?? navigateBack}\n >\n {(pageHistory.length > 0 || onBack) && <ArrowBackIcon fontSize=\"small\" />}\n <span>Delegate Permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Permits are used to authenticate your identity when accessing encrypted data.\n <br />\n This form generates a permit that can be copied and shared with \"recipient\". Recipient will be granted\n access to the signer's (your) data.\n </p>\n\n <NameSection permitName={permitName} error={nameError} onNameChange={handleNameChange} />\n <ReceiverSection receiver={receiver} receiverError={receiverError} onReceiverChange={handleReceiverChange} />\n <ExpirySection\n presets={presets}\n units={units}\n durationSeconds={durationSeconds}\n customCount={customCount}\n customUnit={customUnit}\n selectPreset={selectPreset}\n setCustomUnit={setCustomUnit}\n applyCustom={applyCustom}\n />\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {error && (\n <div role=\"alert\" className=\"text-error\">\n {error}\n </div>\n )}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button onClick={onCancel ?? navigateBack}>Cancel</Button>\n <Button\n variant=\"primary\"\n disabled={!isValid || isSubmitting}\n aria-busy={isSubmitting}\n label={isSubmitting ? 'Creating...' : 'Create Permit'}\n onClick={handleSubmit}\n />\n </div>\n </div>\n }\n />\n );\n};\n","export type ReceiverSectionProps = {\n receiver: string;\n receiverError?: string | null;\n onReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport const ReceiverSection: React.FC<ReceiverSectionProps> = ({ receiver, receiverError, onReceiverChange }) => (\n <div className=\"flex flex-col w-full gap-1\">\n <div className=\"flex items-center justify-between text-xs font-semibold\">\n <span>Receiver:</span>\n </div>\n <input\n id=\"receiver-address\"\n type=\"text\"\n placeholder=\"Receiver address (0x...)\"\n value={receiver}\n onChange={onReceiverChange}\n className=\"w-full border border-[#0E2F3F]/30 outline-none p-2 placeholder:text-[#355366] dark:placeholder:text-white/60\"\n aria-label=\"Receiver address\"\n />\n {receiverError && (\n <p role=\"alert\" className=\"text-xs font-medium text-[#F0784F] dark:text-[#F0784F]\">\n {receiverError}\n </p>\n )}\n </div>\n);\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport PermitReceiveIcon from '@/assets/fhenix-permit-receive.svg';\nimport { useReceivePermit } from '@/hooks/permits/index.js';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { Button } from '@/components/FnxFloatingButton/components/Button.js';\nimport { BasePermitCard } from '@/components/FnxFloatingButton/components/PermitCard.js';\n\nexport const ImportPermitPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { addToast } = usePortalToasts();\n\n const {\n importedPermit,\n permitData,\n setPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n } = useReceivePermit({\n onSuccess: () => {\n navigateBack();\n addToast({\n variant: 'success',\n title: 'Permit imported',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to import permit',\n description: error.message,\n });\n console.error('Error importing permit', error);\n },\n });\n\n return (\n <PageContainer\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n <span>Import permit</span>\n </button>\n }\n content={\n <div className=\"flex flex-col w-full gap-3\">\n <div className=\"flex items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <div className=\"flex items-center justify-center rounded-lg border border-[#0E2F3F]/30 p-2 dark:border-white/40\">\n <PermitReceiveIcon className=\"h-7 w-7 fill-inherit\" aria-label=\"CoFHE import permit icon\" />\n </div>\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n This form importes a permit that has been shared with you.\n <br />\n Paste the permit data into the input below to import it.\n </p>\n\n {importedPermit == null && (\n <textarea\n id=\"fnx-permit-data\"\n rows={8}\n placeholder=\"Paste permit data\"\n className=\"w-full border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitData}\n onChange={(e) => setPermitData(e.target.value)}\n />\n )}\n\n {importedPermit != null && (\n <>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"fnx-permit-name\">\n Imported Permit:\n </label>\n <BasePermitCard permit={importedPermit} />\n </div>\n <div className=\"gap-2\">\n <label className=\"text-sm font-semibold text-[#0E2F3F] dark:text-white\" htmlFor=\"fnx-permit-name\">\n Name override:\n </label>\n <input\n id=\"fnx-permit-name\"\n type=\"text\"\n placeholder={importedPermit.name ?? 'Permit name...'}\n className=\"w-full rounded-xl border border-[#0E2F3F]/30 bg-[#F4F6F8] px-4 py-3 text-sm text-[#0E2F3F] outline-none transition focus:border-[#0EA5A7] dark:border-white/30 dark:bg-transparent dark:text-white dark:placeholder:text-white/50\"\n value={permitName}\n onChange={(e) => setPermitName(e.target.value)}\n />\n </div>\n </>\n )}\n </div>\n }\n footer={\n <div className=\"flex flex-col w-full gap-2\">\n {errorMsg && <div className=\"text-red-600 text-sm\">{errorMsg}</div>}\n {successMsg && <div className=\"text-green-600 text-sm\">{successMsg}</div>}\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <Button variant=\"default\" onClick={navigateBack}>\n Cancel\n </Button>\n <Button variant=\"primary\" disabled={isSubmitting} onClick={submit}>\n {isSubmitting ? 'Importing...' : 'Import Permit'}\n </Button>\n </div>\n </div>\n }\n />\n );\n};\n","import type { SVGProps } from \"react\";\nconst SvgFhenixPermitReceive = (props: SVGProps<SVGSVGElement>) => <svg width={21} height={21} viewBox=\"0 0 21 21\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}><path d=\"M8 12C9.1 12 10 12.89 10 14C10 15.11 9.11 16 8 16C6.89 16 6 15.11 6 14C6 12.89 6.9 12 8 12ZM16 0C13.24 0 11 2.24 11 5V7H2C0.9 7 0 7.9 0 9V19C0 20.1 0.9 21 2 21H14C15.1 21 16 20.1 16 19V9C16 7.9 15.1 7 14 7H13V5C13 3.34 14.34 2 16 2C17.66 2 19 3.34 19 5V7H21V5C21 2.24 18.76 0 16 0ZM14 9V19H2V9H14Z\" fill=\"currentColor\" /></svg>;\nexport default SvgFhenixPermitReceive;","import type { Token } from '@/types/token';\nimport { useCoingeckoContractMarketChartRange } from '@/hooks';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { usePortalNavigation } from '@/stores';\nimport { sepolia } from '@cofhe/sdk/chains';\nimport { TMP_WBTC_ON_MAINNET } from '@/utils/coingecko';\nimport { useMemo } from 'react';\n\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\n\nimport { Button } from '../components/Button';\nimport { PageContainer } from '../components/PageContainer';\nimport { TokenInfoBalanceChart } from './TokenInfoBalanceChart';\nimport { TokenInfoTransactionHistory, TokenInfoTransactionHistoryHeader } from './TokenInfoTransactionHistory';\n\ntype TokenInfoPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.TokenInfo]: TokenInfoPageProps;\n }\n}\n\nexport const TokenInfoPage: React.FC<TokenInfoPageProps> = ({ token }) => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n\n const { data: chartPoints } = useCoingeckoContractMarketChartRange({\n ...(token.chainId === sepolia.id\n ? {\n chainId: TMP_WBTC_ON_MAINNET.chainId,\n contractAddress: TMP_WBTC_ON_MAINNET.address,\n }\n : {\n chainId: token.chainId,\n contractAddress: token.extensions.fhenix.erc20Pair?.address,\n }),\n rangeMs: 24 * 3600_000,\n });\n\n const priceUsd = useMemo(() => {\n const lastPoint = chartPoints?.[chartPoints.length - 1];\n return lastPoint?.value;\n }, [chartPoints]);\n\n return (\n <PageContainer\n header={\n <>\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <div className=\"flex flex-col leading-tight\">\n <p className=\"text-sm font-medium\">Tokens list</p>\n </div>\n </button>\n </div>\n\n <TokenInfoBalanceChart token={token} chartPoints={chartPoints ?? []} />\n\n <TokenInfoTransactionHistoryHeader token={token} />\n </>\n }\n content={<TokenInfoTransactionHistory token={token} priceUsd={priceUsd} />}\n footer={\n <div className=\"flex gap-3\">\n <Button\n variant=\"primary\"\n className=\"flex-1\"\n label=\"Unshield\"\n onClick={() =>\n navigateTo(FloatingButtonPage.Shield, {\n pageProps: {\n token,\n defaultMode: 'unshield',\n },\n })\n }\n />\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n label=\"Send\"\n onClick={() => navigateTo(FloatingButtonPage.Send, { pageProps: { token } })}\n />\n </div>\n }\n />\n );\n};\n","import { useMemo } from 'react';\n\nimport LockIcon from '@mui/icons-material/Lock';\nimport PublicIcon from '@mui/icons-material/Public';\n\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { useCofheTokenDecryptedBalance } from '@/hooks';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\n\nimport { TokenIcon } from '../components/TokenIcon';\nimport { TokenPriceChart, type TokenPriceChartPoint } from '../components/TokenPriceChart';\nimport { LoadingDots } from '../components/LoadingDots';\nimport { CofheTokenConfidentialBalance } from '../components/CofheTokenConfidentialBalance';\n\nimport type { Token } from '@/types/token';\n\ninterface TokenInfoBalanceChartProps {\n token: Token;\n chartPoints: TokenPriceChartPoint[];\n}\n\nconst money = (n: number) =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\nexport const TokenInfoBalanceChart: React.FC<TokenInfoBalanceChartProps> = ({ token, chartPoints }) => {\n const account = useCofheAccount();\n\n const { data: publicBalance, isFetching: isFetchingPublicBalance } = useCofheTokenPublicBalance({ token });\n\n const { data: confidentialBalance, isFetching: isFetchingConfidentialBalance } = useCofheTokenDecryptedBalance({\n accountAddress: account,\n token,\n });\n\n const isFetchingBalances = isFetchingConfidentialBalance || isFetchingPublicBalance;\n\n const balancePercents = useMemo(() => {\n if (!confidentialBalance && !publicBalance) return;\n\n const confidentialUnit = confidentialBalance?.unit ?? null;\n const publicUnit = publicBalance?.unit ?? null;\n\n const totalUnit = (confidentialUnit?.plus(publicUnit ?? 0) ?? publicUnit)?.toNumber() ?? 0;\n\n const confidentialPct =\n totalUnit && totalUnit > 0 && confidentialUnit\n ? parseInt(confidentialUnit.div(totalUnit).times(100).toFixed(2))\n : 0;\n\n const publicPct = 100 - confidentialPct;\n\n return {\n confidentialPct,\n publicPct,\n };\n }, [confidentialBalance, publicBalance]);\n\n const price = useMemo(() => {\n const lastPoint = chartPoints?.[chartPoints.length - 1];\n const firstPoint = chartPoints?.[0];\n\n if (!lastPoint || !firstPoint) return;\n\n return {\n valueUsd: lastPoint.value,\n changeUsd: lastPoint.value - firstPoint.value,\n changePct: ((lastPoint.value - firstPoint.value) / firstPoint.value) * 100,\n };\n }, [chartPoints]);\n\n return (\n <>\n {/* Token summary */}\n <div className=\"p-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <TokenIcon logoURI={token.logoURI} alt={token.extensions.fhenix.erc20Pair?.symbol} size=\"md\" />\n <div className=\"flex flex-col leading-tight\">\n <p className=\"text-sm font-bold fnx-text-primary\">{token.extensions.fhenix.erc20Pair?.symbol}</p>\n <div className=\"flex items-center gap-3 text-xxs opacity-80\">\n <div\n className=\"inline-flex items-center gap-1\"\n title=\"Confidential balance percent\"\n aria-label=\"Confidential balance percent\"\n >\n <LockIcon style={{ fontSize: 14 }} />\n {isFetchingBalances ? (\n <LoadingDots size=\"sm\" variant=\"secondary\" />\n ) : !balancePercents ? (\n <span>--%</span>\n ) : (\n <span>{balancePercents.confidentialPct}%</span>\n )}\n </div>\n\n <div\n className=\"inline-flex items-center gap-1\"\n title=\"Public balance percent\"\n aria-label=\"Public balance percent\"\n >\n <PublicIcon style={{ fontSize: 14 }} />\n {isFetchingBalances ? (\n <LoadingDots size=\"sm\" variant=\"secondary\" />\n ) : !balancePercents ? (\n <span>--%</span>\n ) : (\n <span>{balancePercents.publicPct}%</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col items-end\">\n <CofheTokenConfidentialBalance token={token} size=\"lg\" decimalPrecision={5} className=\"font-bold\" />\n {price && (\n <div className=\"flex flex-row\">\n <p className=\"text-xxs \">{money(price.valueUsd)}</p>\n <p className=\"text-xxs fnx-text-primary\">\n <span>\n ({price.changeUsd > 0 ? '+' : ''} {price.changePct.toFixed(2)}%)\n </span>\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Price + chart */}\n <div className=\"space-y-2\">\n {price && (\n <div className=\"flex items-end justify-between\">\n <div></div>\n <div className=\"text-xxxs opacity-60\">Last 24h</div>\n </div>\n )}\n\n <div className=\"p-3\">\n <TokenPriceChart points={chartPoints} />\n </div>\n </div>\n </>\n );\n};\n","import { useMemo } from 'react';\n\nimport { formatUnits } from 'viem';\n\nimport { HashLink } from '../components/HashLink';\nimport { cn } from '@/utils/cn';\n\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { actionToString } from '@/stores/transactionStore';\n\nimport type { Token } from '@/types/token';\n\ninterface TokenInfoTransactionHistoryHeaderProps {\n token: Token;\n}\n\nexport const TokenInfoTransactionHistoryHeader: React.FC<TokenInfoTransactionHistoryHeaderProps> = ({ token }) => {\n return (\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-sm font-bold fnx-text-primary\">Activity</h3>\n <HashLink type=\"token\" hash={token.address} chainId={token.chainId} extraShort />\n {token.extensions.fhenix.erc20Pair?.address && (\n <HashLink type=\"token\" hash={token.extensions.fhenix.erc20Pair.address} chainId={token.chainId} extraShort />\n )}\n </div>\n );\n};\n\ninterface TokenInfoTransactionHistoryProps {\n token: Token;\n priceUsd?: number;\n}\n\nconst money = (n: number) =>\n n.toLocaleString(undefined, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n\nexport const TokenInfoTransactionHistory: React.FC<TokenInfoTransactionHistoryProps> = ({ token, priceUsd }) => {\n const account = useCofheAccount();\n\n const { filteredTxs: tokenTxs } = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter: (tx) => tx.token.address.toLowerCase() === token.address.toLowerCase(),\n });\n\n const activity = useMemo(() => {\n return tokenTxs\n .slice()\n .sort((a, b) => b.timestamp - a.timestamp)\n .map((tx) => {\n const amountToken = parseFloat(formatUnits(tx.tokenAmount, tx.token.decimals));\n const amountUsd =\n typeof priceUsd === 'number' && Number.isFinite(amountToken) ? amountToken * priceUsd : undefined;\n\n return {\n kind: actionToString(tx.actionType),\n amountUsd,\n amountToken: Number.isFinite(amountToken) ? amountToken : 0,\n };\n });\n }, [tokenTxs, priceUsd]);\n\n return (\n <div className=\"space-y-2\">\n <div className=\"p-3\">\n {!activity || activity.length === 0 ? (\n <div className=\"py-6 text-center\">\n <p className=\"text-sm fnx-text-primary opacity-60\">No activity found</p>\n </div>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {activity.map((item, idx) => {\n return (\n <div key={idx} className=\"flex items-start justify-between\">\n <div className=\"flex items-start gap-2\">\n <div\n className={cn(\n 'w-8 h-8 rounded-full',\n 'bg-cyan-200/70 dark:bg-cyan-900/40',\n 'flex items-center justify-center'\n )}\n />\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-bold fnx-text-primary\">{item.kind}</p>\n </div>\n </div>\n\n <div className=\"flex flex-col items-end\">\n <p className=\"text-sm font-bold fnx-text-primary\">\n {typeof item.amountUsd === 'number' ? money(item.amountUsd) : '--'}\n </p>\n <p className=\"text-xxxs opacity-70\">\n {item.amountToken} {token.symbol}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { useState, useMemo } from 'react';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { isAddress, maxUint128 } from 'viem';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { useCofheTokenTransfer } from '@/hooks/useCofheTokenTransfer';\nimport { cn } from '../../../utils/cn';\nimport { truncateAddress, sanitizeNumericInput } from '../../../utils/utils';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { unitToWei } from '@/utils/format';\nimport { assert } from 'ts-essentials';\nimport { CofheTokenConfidentialBalance } from '../components';\nimport { useCofheTokensWithExistingEncryptedBalances, type Token } from '@/hooks';\nimport { getStepConfig } from '@/hooks/useCofheEncrypt';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PageContainer } from '../components/PageContainer';\nimport { PortalModal } from '../modals/types';\nimport { BalanceType } from '../components/CofheTokenConfidentialBalance';\n\nexport type SendPageProps = {\n token: Token;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Send]: SendPageProps;\n }\n}\n\nexport const SendPage: React.FC<SendPageProps> = ({ token: _token }) => {\n const [overriddenToken, setOverriddenToken] = useState<Token | null>(null);\n\n const token = overriddenToken ?? _token;\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const account = useCofheAccount();\n const {\n encryptAmountAndSendToken,\n data: txHash,\n isPending: isEncryptingOrSendingTx,\n write: { isPending: isSending },\n encryption: {\n stepsState: { lastStep },\n isEncrypting: isEncryptingInput,\n },\n } = useCofheTokenTransfer({\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to send tokens';\n setError(errorMessage);\n console.error('Send tx submit error:', error);\n },\n onMutate: () => {\n setError(null);\n setSuccess(null);\n },\n onSuccess: (hash) => {\n setSuccess(`Transaction sent! Hash: ${truncateAddress(hash)}. Is being mined...`);\n setAmount('');\n setRecipientAddress('');\n },\n });\n\n useOnceTransactionMined({\n txHash,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setSuccess(`Transaction confirmed! Hash: ${truncateAddress(transaction.hash)}`);\n } else if (transaction.status === 'failed') {\n setError(`Transaction failed! Hash: ${truncateAddress(transaction.hash)}`);\n }\n },\n });\n\n const { data: { unit: confidentialUnitBalance } = {} } = useCofheTokenDecryptedBalance({\n token,\n accountAddress: account,\n });\n\n const encryptionProgressLabel = useMemo(() => lastStep?.step && getStepConfig(lastStep).label, [lastStep]);\n\n const [amount, setAmount] = useState('');\n const [recipientAddress, setRecipientAddress] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [success, setSuccess] = useState<string | null>(null);\n\n // Validate recipient address\n const isValidAddress = isAddress(recipientAddress);\n\n // Validate amount\n const isValidAmount = (amount.length > 0 && confidentialUnitBalance && confidentialUnitBalance.gte(amount)) ?? false;\n\n const handleSend = async () => {\n assert(isAddress(recipientAddress), 'Recipient address is not valid');\n\n // Check if amount exceeds uint128 max value (2^128 - 1)\n // Convert amount to token's smallest unit (considering decimals)\n const amountWei = unitToWei(amount, token.decimals);\n // TODO: Does this need to be different if the confidential token uses euint64 for the balance precision?\n assert(amountWei <= maxUint128, 'Amount exceeds maximum supported value (uint128 max)');\n assert(account, 'Sender account is required');\n\n // Use the token transfer hook to send encrypted tokens\n await encryptAmountAndSendToken({\n input: {\n token,\n to: recipientAddress,\n amount: amountWei,\n userAddress: account,\n },\n });\n };\n\n const handleMaxAmount = () => {\n // Calculate available balance for MAX button\n if (confidentialUnitBalance) setAmount(confidentialUnitBalance.toFixed());\n };\n\n const { tokensWithExistingEncryptedBalance } = useCofheTokensWithExistingEncryptedBalances();\n\n return (\n <PageContainer\n header={\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shielded Transfer</p>\n </button>\n }\n content={\n <>\n {/* Asset Section */}\n <div className=\"fnx-card-bg p-2 border fnx-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Asset to be sent</label>\n </div>\n <div className=\"flex items-center gap-3\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"md\" />\n\n {/* Amount Input and Symbol on same line, centered with logo */}\n <div className=\"flex-1 flex items-center gap-1 min-w-0\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n value={amount}\n onChange={(e) => {\n setAmount(sanitizeNumericInput(e.target.value));\n }}\n placeholder=\"0.00\"\n className=\"flex-1 min-w-0 bg-transparent text-2xl font-bold fnx-text-primary outline-none placeholder:opacity-50\"\n />\n <button\n onClick={() => {\n openModal(PortalModal.TokenList, {\n balanceType: BalanceType.Confidential,\n tokens: tokensWithExistingEncryptedBalance,\n title: 'Select token to transfer',\n onSelectToken: (token) => {\n setOverriddenToken(token);\n },\n });\n }}\n className=\"flex items-center gap-1 text-2xl font-bold fnx-text-primary hover:opacity-80 transition-opacity whitespace-nowrap flex-shrink-0\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60 flex-shrink-0\" />\n </button>\n </div>\n </div>\n <div className=\"flex items-center gap-3 -mt-1 text-xs opacity-70\">\n {/* Invisible placeholder to align with icon above */}\n <div className=\"w-10 flex-shrink-0\" />\n\n {/* Available text and MAX button */}\n <div className=\"flex-1 flex items-center justify-start min-w-0 gap-2\">\n <span className=\"text-xs opacity-70\">Available </span>\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={true}\n size=\"sm\"\n decimalPrecision={5}\n className=\"text-xs opacity-70 font-medium\"\n />\n <button\n onClick={handleMaxAmount}\n className=\"fnx-max-button text-xxxs ml-1 font-medium px-0.5 py-0.2 rounded\"\n >\n MAX\n </button>\n </div>\n </div>\n </div>\n\n {/* Down Arrow */}\n <div className=\"flex justify-center\">\n <div className=\"w-8 h-8 rounded-full fnx-icon-bg flex items-center justify-center\">\n <span className=\"text-lg\">↓</span>\n </div>\n </div>\n\n {/* Recipient Address */}\n <div className=\"fnx-card-bg p-4 border fnx-card-border\">\n <div className=\"flex items-center justify-between mb-2\">\n <label className=\"block text-xs font-medium opacity-70\">Recipient Address:</label>\n </div>\n <input\n type=\"text\"\n value={recipientAddress}\n onChange={(e) => setRecipientAddress(e.target.value)}\n placeholder=\"0x...\"\n className={cn(\n 'w-full bg-transparent fnx-text-primary outline-none border-b pb-2 px-2',\n 'placeholder:opacity-50',\n isValidAddress ? 'border-green-500' : recipientAddress ? 'border-red-500' : 'fnx-card-border'\n )}\n />\n </div>\n\n {/* Error Message */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-3\">\n <p className=\"text-sm text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Success Message */}\n {success && (\n <div className=\"bg-green-50 dark:bg-green-900/20 border border-green-200 dark:border-green-800 rounded-lg p-3\">\n <p className=\"text-sm text-green-800 dark:text-green-200\">{success}</p>\n </div>\n )}\n\n {/* Encryption Status */}\n {isEncryptingOrSendingTx && (\n <div className=\"bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg p-3\">\n <p className=\"text-sm text-blue-800 dark:text-blue-200\">\n {isEncryptingInput ? encryptionProgressLabel || 'Encrypting amount...' : 'Sending transaction...'}\n </p>\n </div>\n )}\n </>\n }\n footer={\n <button\n onClick={handleSend}\n disabled={!isValidAddress || !isValidAmount || isSending || isEncryptingInput}\n className={cn(\n 'fnx-send-button w-full py-3 px-4 font-small',\n 'flex items-center justify-center gap-2',\n isValidAddress && isValidAmount && !isSending && !isEncryptingInput\n ? 'fnx-send-button-enabled'\n : 'fnx-send-button-disabled'\n )}\n >\n <span>Send</span>\n <span className=\"text-lg\">↗</span>\n </button>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport { TbShieldPlus, TbShieldMinus } from 'react-icons/tb';\nimport { LuExternalLink } from 'react-icons/lu';\nimport { useState } from 'react';\nimport { parseUnits } from 'viem';\nimport { useCofheAccount, useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokenDecryptedBalance } from '@/hooks/useCofheTokenDecryptedBalance';\nimport { type Token } from '@/hooks/useCofheTokenLists';\nimport { useCofheTokenShield } from '@/hooks/useCofheTokenShield';\nimport { cn } from '../../../utils/cn';\nimport { getBlockExplorerTxUrl, truncateHash } from '../../../utils/utils';\nimport { ActionButton, AmountInput, CofheTokenConfidentialBalance, TokenIcon } from '../components/index';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { formatTokenAmount, unitToWei } from '@/utils/format';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport {\n useCofheTokenClaimUnshielded,\n useCofheTokenUnshield,\n useCofheTokenClaimable,\n useCofheTokensWithExistingEncryptedBalances,\n useTokensWithPublicBalances,\n} from '@/hooks';\nimport { useOnceTransactionMined } from '@/hooks/useOnceTransactionMined';\nimport { useReschedulableTimeout } from '@/hooks/useReschedulableTimeout';\nimport { assert } from 'ts-essentials';\nimport type { BigNumber } from 'bignumber.js';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { BalanceType, CofheTokenPublicBalance } from '../components/CofheTokenConfidentialBalance';\nimport { useIsUnshieldingMining } from '@/hooks/useIsUnshieldingMining';\nimport { PageContainer } from '../components/PageContainer';\nimport { PortalModal } from '../modals/types';\nimport { CopyButton } from '../components/HashLink';\n\nconst AUTOCLEAR_TX_STATUS_TIMEOUT = 5000;\nconst DISPLAY_DECIMALS = 5;\n\ntype Mode = 'shield' | 'unshield';\n\ntype LifecycleStatus = { message: React.ReactNode; type: 'info' | 'success' };\n\nexport type ShieldPageProps = {\n token: Token;\n defaultMode?: Mode;\n};\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Shield]: ShieldPageProps;\n }\n}\n\nfunction useLifecycleStore() {\n const [error, setError] = useState<React.ReactNode | null>(null);\n const [status, setStatus] = useState<LifecycleStatus | null>(null);\n return {\n error,\n setError,\n status,\n setStatus,\n };\n}\n\nfunction TxHashWithActions({ hash, chainId }: { hash: string; chainId?: number }) {\n const href = chainId ? getBlockExplorerTxUrl(chainId, hash) : undefined;\n const ellipsed = truncateHash(hash);\n\n const handleOpenExplorer = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <span className=\"inline-flex items-center gap-1.5 align-baseline\">\n <span className=\"font-mono\">{ellipsed}</span>\n <CopyButton text={hash} size={14} />\n <button\n type=\"button\"\n onClick={handleOpenExplorer}\n disabled={!href}\n aria-label=\"Open transaction in explorer\"\n title={href ? 'Open in explorer' : 'Explorer not available for this chain'}\n className={cn(\n 'fnx-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer',\n !href && 'cursor-default opacity-30'\n )}\n >\n <LuExternalLink style={{ width: 14, height: 14 }} />\n </button>\n </span>\n );\n}\n\n// Reusable hook to safely auto-clear a status message after a delay\n// (moved) useReschedulableTimeout is now in '@/hooks/useReschedulableTimeout'\n\nfunction useClaimUnshieldedWithLifecycle() {\n const { setError, setStatus, error, status } = useLifecycleStore();\n const chainId = useCofheChainId();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const claimUnshield = useCofheTokenClaimUnshielded({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing claim transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Claim transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n },\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to claim unshielded tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Claim tx submit error:', error);\n },\n });\n\n const { isMining: isClaimingMining } = useOnceTransactionMined({\n txHash: claimUnshield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Claim transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Claim transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n return {\n claimUnshield,\n isClaimingMining,\n error,\n status,\n };\n}\n\ntype ShieldAndUnshieldViewProps = Omit<ShieldPageViewProps, 'token' | 'mode' | 'setMode'>;\n\nfunction useShieldWithLifecycle(token: Token): Omit<ShieldAndUnshieldViewProps, 'setToken'> {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const [shieldAmount, setShieldAmount] = useState('');\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const tokenShield = useCofheTokenShield({\n onMutate: () => {\n setError(null);\n setStatus({ message: 'Preparing shielding transaction...', type: 'info' });\n },\n onSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Shield transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n setShieldAmount('');\n },\n onError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to shield tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Shield tx submit error:', error);\n },\n });\n const { isMining: isTokenShieldMining } = useOnceTransactionMined({\n txHash: tokenShield.data,\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Shield transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Shield transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n scheduleStatusClear();\n },\n });\n\n const handleShield = async () => {\n const amountWei = unitToWei(shieldAmount, token.decimals);\n await tokenShield.mutateAsync({\n token,\n amount: amountWei,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: publicBalanceUnit } = {}, isFetching: isFetchingPublic } = useCofheTokenPublicBalance({\n token,\n accountAddress: account,\n });\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n\n const handleShieldMax = () => {\n if (publicBalanceUnit) setShieldAmount(publicBalanceUnit.toFixed());\n };\n\n const isValidShieldAmount = (shieldAmount.length > 0 && publicBalanceUnit?.gte(shieldAmount)) ?? false;\n\n return {\n status,\n error,\n isProcessing: tokenShield.isPending || isTokenShieldMining,\n inputAmount: shieldAmount,\n setInputAmount: setShieldAmount,\n onMaxClick: handleShieldMax,\n isValidAmount: isValidShieldAmount,\n sourceSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n destSymbol: token.symbol,\n sourceLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n destLogoURI: token.logoURI,\n handlePrimaryAction: handleShield,\n primaryLabel: 'Shield',\n primaryIcon: <TbShieldPlus className=\"w-3 h-3\" />,\n };\n}\n\nfunction useUnshieldWithLifecycle(token: Token): Omit<ShieldAndUnshieldViewProps, 'setToken'> {\n const account = useCofheAccount();\n const chainId = useCofheChainId();\n const { setError, setStatus, error, status } = useLifecycleStore();\n const { schedule: scheduleStatusClear } = useReschedulableTimeout(() => setStatus(null), AUTOCLEAR_TX_STATUS_TIMEOUT);\n const [unshieldAmount, setUnshieldAmount] = useState('');\n const tokenUnshield = useCofheTokenUnshield({\n onUserSignatureRequest: (hash) => {\n () => {\n setError(null);\n setStatus({ message: 'Preparing unshielding transaction...', type: 'info' });\n };\n },\n onTransactionSubmitSuccess: (hash) => {\n setStatus({\n message: (\n <>\n Unshield transaction sent! Hash: <TxHashWithActions hash={hash} chainId={chainId} /> Waiting for\n confirmation...\n </>\n ),\n type: 'info',\n });\n setUnshieldAmount('');\n },\n onTransactionSubmitError: (error) => {\n const errorMessage = error instanceof Error ? error.message : 'Failed to unshield tokens';\n setError(errorMessage);\n setStatus(null);\n console.error('Unshield tx submit error:', error);\n },\n onceMined: (transaction) => {\n if (transaction.status === 'confirmed') {\n setStatus({\n message: (\n <>\n Unshield transaction confirmed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} /> Now\n waiting for decryption...\n </>\n ),\n type: 'success',\n });\n } else if (transaction.status === 'failed') {\n setError(\n <>\n Unshield transaction failed! Hash: <TxHashWithActions hash={transaction.hash} chainId={chainId} />\n </>\n );\n setStatus(null);\n }\n },\n onceDecrypted: () => {\n setStatus({ message: 'Unshield decryption completed!', type: 'success' });\n scheduleStatusClear();\n },\n });\n const handleUnshield = async () => {\n const amountInSmallestUnit = parseUnits(unshieldAmount, token.decimals);\n tokenUnshield.mutateAsync({\n token,\n amount: amountInSmallestUnit,\n onStatusChange: (message) => setStatus({ message, type: 'info' }),\n });\n };\n\n const { data: { unit: confidentialBalanceUnit } = {}, isFetching: isFetchingConfidential } =\n useCofheTokenDecryptedBalance({ token, accountAddress: account });\n const handleUnshieldMax = () => {\n if (confidentialBalanceUnit) setUnshieldAmount(confidentialBalanceUnit.toFixed());\n };\n const isValidUnshieldAmount = (unshieldAmount.length > 0 && confidentialBalanceUnit?.gte(unshieldAmount)) ?? false;\n\n return {\n status,\n error,\n isProcessing: tokenUnshield.isPending || tokenUnshield.isTokenUnshieldMining || tokenUnshield.isPendingDecryption,\n inputAmount: unshieldAmount,\n setInputAmount: setUnshieldAmount,\n onMaxClick: handleUnshieldMax,\n isValidAmount: isValidUnshieldAmount ?? false,\n sourceSymbol: token.symbol,\n destSymbol: token.extensions.fhenix.erc20Pair?.symbol,\n sourceLogoURI: token.logoURI,\n destLogoURI: token.extensions.fhenix.erc20Pair?.logoURI,\n handlePrimaryAction: handleUnshield,\n primaryLabel: 'Unshield',\n primaryIcon: <TbShieldMinus className=\"w-3 h-3\" />,\n };\n}\n\nconst shieldableTypes = new Set(['dual', 'wrapped']);\n\nexport const ShieldPageV2: React.FC<ShieldPageProps> = ({ token: _token, defaultMode }) => {\n const [mode, setMode] = useState<Mode>(defaultMode ?? 'shield');\n const [overriddenToken, setOverriddenToken] = useState<Token | null>(null);\n const token = overriddenToken ?? _token;\n\n return mode === 'shield' ? (\n <ShieldTab token={token} mode={mode} setMode={setMode} setToken={setOverriddenToken} />\n ) : (\n <UnshieldTab token={token} mode={mode} setMode={setMode} setToken={setOverriddenToken} />\n );\n};\n\ntype ShieldPageViewProps = {\n error: React.ReactNode | null;\n token: Token;\n mode: Mode;\n status: LifecycleStatus | null;\n setToken: (token: Token) => void;\n setMode: (mode: Mode) => void;\n\n isProcessing: boolean;\n inputAmount: string;\n setInputAmount: (value: string) => void;\n onMaxClick: () => void;\n isValidAmount: boolean;\n sourceSymbol: string | undefined;\n destSymbol: string | undefined;\n\n sourceLogoURI: string | undefined;\n destLogoURI: string | undefined;\n handlePrimaryAction: () => void;\n primaryLabel: string;\n primaryIcon: React.ReactNode;\n};\n\nfunction ShieldTab({\n token,\n mode,\n setMode,\n setToken,\n}: {\n token: Token;\n mode: Mode;\n setMode: (mode: Mode) => void;\n setToken: (token: Token) => void;\n}) {\n const shieldViewProps = useShieldWithLifecycle(token);\n return (\n <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} setToken={setToken} {...shieldViewProps} />\n );\n}\n\nfunction UnshieldTab({\n token,\n mode,\n setMode,\n setToken,\n}: {\n token: Token;\n mode: Mode;\n setMode: (mode: Mode) => void;\n setToken: (token: Token) => void;\n}) {\n const unshieldViewProps = useUnshieldWithLifecycle(token);\n return (\n <ShieldAndUnshieldPageView token={token} mode={mode} setMode={setMode} setToken={setToken} {...unshieldViewProps} />\n );\n}\n\nfunction ClaimingSection({ token }: { token: Token }) {\n const account = useCofheAccount();\n const {\n data: unshieldedClaims,\n isFetching: isFetchingClaims,\n isWaitingForDecryption: isWaitingForNewClaimsDecryption,\n } = useCofheTokenClaimable({\n token,\n accountAddress: account,\n });\n const {\n claimUnshield,\n error: claimingError,\n status: claimingStatus,\n isClaimingMining,\n } = useClaimUnshieldedWithLifecycle();\n\n const pairedSymbol = token.extensions.fhenix.erc20Pair?.symbol;\n const handleClaim = async () => {\n assert(unshieldedClaims, 'Unshield claims data is required to claim unshielded tokens');\n claimUnshield.mutateAsync({\n token,\n amount: unshieldedClaims.claimableAmount,\n });\n };\n\n const isUnshieldingMining = useIsUnshieldingMining(token);\n\n return (\n <>\n {/* Claim + pending (same logic as ShieldPage) */}\n {unshieldedClaims?.hasClaimable && (\n <ActionButton\n onClick={handleClaim}\n disabled={\n claimUnshield.isPending ||\n isClaimingMining ||\n isFetchingClaims ||\n isWaitingForNewClaimsDecryption ||\n isUnshieldingMining\n }\n label={\n claimUnshield.isPending\n ? 'Claiming...'\n : `Claim ${isFetchingClaims || isWaitingForNewClaimsDecryption ? '...' : formatTokenAmount(unshieldedClaims.claimableAmount, token.decimals, 5).formatted} ${pairedSymbol}`\n }\n className=\"mt-1\"\n />\n )}\n\n {unshieldedClaims?.hasPending && token && !unshieldedClaims.hasClaimable && (\n <p className=\"text-xxs text-yellow-600 dark:text-yellow-400 text-center\">\n Pending: {formatTokenAmount(unshieldedClaims.pendingAmount, token.decimals).formatted} {pairedSymbol}\n </p>\n )}\n <StatusAndError status={claimingStatus} error={claimingError} />\n </>\n );\n}\n\nfunction StatusAndError({ status, error }: { status: LifecycleStatus | null; error: React.ReactNode | null }) {\n return (\n <>\n {/* Error */}\n {error && (\n <div className=\"bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-2\">\n <p className=\"text-xs text-red-800 dark:text-red-200\">{error}</p>\n </div>\n )}\n\n {/* Status */}\n {status && (\n <div\n className={cn(\n 'rounded-lg p-2 border',\n status.type === 'success'\n ? 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800'\n : 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800'\n )}\n >\n <p\n className={cn(\n 'text-xs',\n status.type === 'success' ? 'text-green-800 dark:text-green-200' : 'text-blue-800 dark:text-blue-200'\n )}\n >\n {status.message}\n </p>\n </div>\n )}\n </>\n );\n}\n\nconst ShieldAndUnshieldPageView: React.FC<ShieldPageViewProps> = ({\n error,\n token,\n mode,\n setMode,\n status,\n setToken,\n\n isProcessing,\n inputAmount,\n setInputAmount,\n onMaxClick,\n isValidAmount,\n sourceSymbol,\n destSymbol,\n\n sourceLogoURI,\n destLogoURI,\n handlePrimaryAction,\n primaryLabel,\n primaryIcon,\n}) => {\n const { navigateBack } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const isShieldableToken = shieldableTypes.has(token.extensions.fhenix.confidentialityType);\n\n const { tokensWithExistingEncryptedBalance } = useCofheTokensWithExistingEncryptedBalances();\n const { tokensWithPublicBalances } = useTokensWithPublicBalances();\n\n // TODO: probably can be refactored into a view with more stramlined logic\n return (\n <PageContainer\n header={\n <div className=\"flex items-center justify-between\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Shield / Unshield</p>\n </button>\n\n <button\n onClick={() =>\n openModal(PortalModal.TokenList, {\n balanceType: mode === 'shield' ? BalanceType.Public : BalanceType.Confidential,\n tokens: mode === 'unshield' ? tokensWithExistingEncryptedBalance : tokensWithPublicBalances,\n title: mode === 'shield' ? 'Select token to shield' : 'Select token to unshield',\n onSelectToken: (token) => setToken(token),\n })\n }\n className=\"flex items-center gap-1 text-sm font-bold fnx-text-primary hover:opacity-80 transition-opacity\"\n >\n <span>{token.symbol}</span>\n <KeyboardArrowDownIcon style={{ fontSize: 16 }} className=\"opacity-60\" />\n </button>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {/* Tabs */}\n <div className=\"flex gap-2\">\n <ActionButton\n onClick={() => setMode('shield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'shield'}\n label=\"Shield\"\n />\n <ActionButton\n onClick={() => setMode('unshield')}\n variant=\"tab\"\n className=\"flex-1\"\n pressed={mode === 'unshield'}\n label=\"Unshield\"\n />\n </div>\n\n {/* Two-panel layout */}\n <div className=\"space-y-2\">\n {/* Source */}\n <div className=\"fnx-card-bg border fnx-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Asset to be shielded' : 'Asset to be unshielded'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={sourceLogoURI} alt={sourceSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <AmountInput\n value={inputAmount}\n onChange={setInputAmount}\n onMaxClick={onMaxClick}\n className=\"w-28\"\n />\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{sourceSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Available{' '}\n {mode === 'unshield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-center text-xl opacity-80\">↓</div>\n\n {/* Received (read-only) */}\n <div className=\"fnx-card-bg border fnx-card-border p-3\">\n <p className=\"text-xs opacity-70 mb-2\">\n {mode === 'shield' ? 'Shielded asset received' : 'Unshielded asset received'}\n </p>\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <TokenIcon logoURI={destLogoURI} alt={destSymbol} size=\"sm\" />\n <div className=\"min-w-0\">\n <p className=\"text-lg font-bold leading-none\">{inputAmount || '0'}</p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{destSymbol}</p>\n <p className=\"text-xxs opacity-70\">\n Balance\n {mode === 'shield' ? (\n <CofheTokenConfidentialBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n ) : (\n <CofheTokenPublicBalance token={token} size=\"sm\" decimalPrecision={DISPLAY_DECIMALS} />\n )}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Primary action */}\n <ActionButton\n onClick={handlePrimaryAction}\n disabled={!isValidAmount || isProcessing || !isShieldableToken}\n icon={primaryIcon}\n label={primaryLabel}\n className=\"py-2\"\n />\n <StatusAndError status={status} error={error} />\n <ClaimingSection token={token} />\n\n {/* Not Shieldable Token Warning */}\n {!isShieldableToken && (\n <div className=\"bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg p-2\">\n <p className=\"text-xs text-yellow-800 dark:text-yellow-200\">\n This token does not support shielding/unshielding.\n </p>\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import { TransactionActionType, TransactionStatus, type Transaction } from '@/stores/transactionStore';\nimport { useCofheAccount } from './useCofheConnection';\nimport type { Token } from './useCofheTokenLists';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { useCallback } from 'react';\n\nexport function useIsUnshieldingMining(token: Token) {\n const account = useCofheAccount();\n const filter = useCallback(\n (tx: Transaction) => {\n return (\n tx.token.address === token.address &&\n tx.actionType === TransactionActionType.Unshield &&\n tx.status === TransactionStatus.Pending\n );\n },\n [token.address]\n );\n const allPendingTxs = useStoredTransactions({\n chainId: token.chainId,\n account,\n filter,\n });\n\n return allPendingTxs.filteredTxs.length > 0;\n}\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useCofheChainId, useCofheAccount } from '@/hooks/useCofheConnection.js';\nimport { TransactionItem } from '../components/TransactionItem.js';\nimport { usePortalNavigation } from '@/stores';\nimport { useStoredTransactions } from '@/hooks/useStoredTransactions.js';\nimport { PageContainer } from '../components/PageContainer.js';\n\nexport const ActivityPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n\n const { filteredTxs: transactions } = useStoredTransactions({\n chainId,\n account,\n });\n\n return (\n <PageContainer\n header={\n <button\n type=\"button\"\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity mb-2\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Activity</p>\n </button>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n {transactions.length === 0 ? (\n <div className=\"py-8 text-center\">\n <p className=\"text-sm fnx-text-primary opacity-60\">No transactions found</p>\n </div>\n ) : (\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\n {transactions.map((tx) => (\n <TransactionItem key={tx.hash} transaction={tx} />\n ))}\n </div>\n )}\n </div>\n }\n />\n );\n};\n","import ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { ToastPrimitive, ToastPrimitiveBase } from '../components/ToastPrimitives.js';\nimport { useState } from 'react';\nimport { PortalModal } from '../modals/types';\nimport { usePortalNavigation, usePortalStatuses, usePortalModals, usePortalToasts } from '@/stores';\nimport { PageContainer } from '../components/PageContainer.js';\nimport { useCofheClient } from '@/hooks/useCofheClient.js';\nimport { privateKeyToAccount } from 'viem/accounts';\nimport { createWalletClient, http } from 'viem';\nimport { usePortalPersisted } from '@/stores/portalPersisted.js';\n\ntype Tab = 'modal' | 'status' | 'toast' | 'permit';\n\nexport const DebugPage: React.FC = () => {\n const { navigateBack } = usePortalNavigation();\n const { statuses, addStatus, removeStatus } = usePortalStatuses();\n const { addToast } = usePortalToasts();\n const { openModal } = usePortalModals();\n const [modalSelection, setModalSelection] = useState<string | undefined>(undefined);\n const [activeTab, setActiveTab] = useState<Tab>('modal');\n\n return (\n <PageContainer\n header={\n <div className=\"flex flex-col gap-2\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <span>Back</span>\n </button>\n <div className=\"flex gap-2 border-b\">\n <button onClick={() => setActiveTab('modal')} className={activeTab === 'modal' ? 'font-bold' : ''}>\n Modal\n </button>\n <button onClick={() => setActiveTab('status')} className={activeTab === 'status' ? 'font-bold' : ''}>\n Status\n </button>\n <button onClick={() => setActiveTab('toast')} className={activeTab === 'toast' ? 'font-bold' : ''}>\n Toast\n </button>\n <button onClick={() => setActiveTab('permit')} className={activeTab === 'permit' ? 'font-bold' : ''}>\n Permit\n </button>\n </div>\n </div>\n }\n content={\n <>\n {activeTab === 'modal' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n openModal(PortalModal.ExampleSelection, {\n onSelect: (selection: string) => {\n setModalSelection(selection);\n },\n });\n }}\n >\n Open selection modal: selection: {modalSelection}\n </button>\n <button\n onClick={() => {\n openModal(PortalModal.ExampleInfo);\n }}\n >\n Open info modal\n </button>\n </div>\n )}\n\n {activeTab === 'status' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-warning-status');\n if (isPresent) {\n removeStatus('test-warning-status');\n } else {\n addStatus({\n id: 'test-warning-status',\n variant: 'warning',\n title: 'Warning status',\n description: 'This is a warning status',\n });\n }\n }}\n >\n \"test-warning-status\" (toggle)\n </button>\n <button\n onClick={() => {\n const isPresent = statuses.some((status) => status.id === 'test-error-status');\n if (isPresent) {\n removeStatus('test-error-status');\n } else {\n addStatus({\n id: 'test-error-status',\n variant: 'error',\n title: 'Error status',\n description: 'This is an error status',\n });\n }\n }}\n >\n \"test-error-status\" (toggle)\n </button>\n <button\n onClick={() => {\n addStatus({\n id: 'test-status-with-action',\n variant: 'warning',\n title: 'Warning status',\n action: {\n label: 'RESOLVE',\n onClick: () => {\n removeStatus('test-status-with-action');\n },\n },\n });\n }}\n >\n \"test-status-with-action\" (open)\n </button>\n </div>\n )}\n\n {activeTab === 'toast' && (\n <div className=\"flex flex-col gap-3\">\n <button\n onClick={() => {\n addToast(\n <ToastPrimitiveBase>\n <div>Custom content</div>\n </ToastPrimitiveBase>\n );\n }}\n >\n Custom content toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'info',\n title: \"This toast won't go away on its own\",\n description: 'Click the X to dismiss it',\n },\n 'infinite'\n );\n }}\n >\n Non-expiring Toast\n </button>\n <button\n onClick={() => {\n addToast(\n {\n variant: 'warning',\n title: 'Warning toast',\n description: 'Take the action',\n action: {\n label: 'ACTION',\n onClick: () => {\n alert('Action taken');\n },\n },\n },\n 'infinite'\n );\n }}\n >\n Toast with Action\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"info\"\n title=\"Info toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Info Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"success\"\n title=\"Success toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Success Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"error\"\n title=\"Error toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Error Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast(\n <ToastPrimitive\n variant=\"warning\"\n title=\"Warning toast\"\n description=\"Triggered with component\"\n transaction={{ hash: '0x123', chainId: 1 }}\n />\n );\n }}\n >\n Warning Toast (via component)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'info',\n title: 'Info toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Info Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Success toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Success Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Error toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Error Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'warning',\n title: 'Warning toast',\n description: 'Triggered by function',\n transaction: { hash: '0x123', chainId: 1 },\n });\n }}\n >\n Warning Toast (via function)\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'error',\n title: 'Permit invalid',\n description: 'Unable to decrypt data with this permit',\n action: {\n label: 'OPEN PERMITS',\n onClick: () => {\n alert('open permits');\n },\n },\n });\n }}\n >\n Invalid Permit\n </button>\n <button\n onClick={() => {\n addToast({\n variant: 'success',\n title: 'Permit created successfully',\n });\n }}\n >\n Permit created\n </button>\n </div>\n )}\n\n {activeTab === 'permit' && (\n <div className=\"flex flex-col gap-3\">\n <FirstPermitDebug />\n <CreateSelfExpiringPermitButton />\n <CreateAndUseReceivingPermitButton />\n </div>\n )}\n </>\n }\n />\n );\n};\n\nconst FirstPermitDebug = () => {\n const { hasCreatedFirstPermit, setHasCreatedFirstPermit } = usePortalPersisted();\n return (\n <div>\n <p>Has created first permit: {hasCreatedFirstPermit ? '[Y]' : '[N]'}</p>\n <button\n onClick={() => {\n setHasCreatedFirstPermit(false);\n }}\n >\n Reset first permit created flag\n </button>\n </div>\n );\n};\n\nconst CreateSelfExpiringPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const create = async () => {\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n const expiration = Math.floor(Date.now() / 1000) + 2 * 60;\n await cofheClient.permits.createSelf({\n name: `Exp ${expiration}`,\n issuer: account,\n expiration: expiration,\n });\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={create}>Create self permit (expires in 2 minutes)</button>;\n};\n\nconst CreateAndUseReceivingPermitButton = () => {\n const cofheClient = useCofheClient();\n\n const receiveAndUse = async () => {\n const { account, publicClient } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n if (!publicClient) throw new Error('No public client found');\n\n // Create account to create the sharing permit from private key\n const sharingAccount = privateKeyToAccount('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80');\n const sharingWalletClient = createWalletClient({\n chain: publicClient!.chain,\n transport: http(),\n account: sharingAccount,\n });\n\n // Create a sharing permit with account {sharingAccount} and recipient {account}\n const sharedPermit = await cofheClient.permits.createSharing(\n {\n name: 'Sharing permit',\n issuer: sharingAccount.address,\n expiration: Math.floor(Date.now() / 1000) + 120 * 60,\n recipient: account,\n },\n {\n publicClient,\n walletClient: sharingWalletClient,\n }\n );\n\n // Receive shared permit\n await cofheClient.permits.importShared(sharedPermit);\n usePortalPersisted.getState().setHasCreatedFirstPermit(true);\n };\n\n return <button onClick={receiveAndUse}>Create and use receiving permit</button>;\n};\n","import { PageContainer } from '../components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { type Token, useCofheTokens } from '@/hooks';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { TokenRow } from '../components/TokenRow';\nimport { useCofhePinnedTokenAddress } from '@/hooks/useCofhePinnedTokenAddress';\nimport type { BalanceType } from '../components/CofheTokenConfidentialBalance';\nimport { Button } from '../components';\n\nexport const AddCustomTokenButton = () => <Button variant=\"outline\" size=\"sm\" label=\"Add custom Token +\" />;\nexport const TokenListModal: React.FC<PortalModalStateMap[PortalModal.TokenList]> = ({\n tokens,\n onClose,\n title,\n onSelectToken,\n balanceType,\n}) => {\n return (\n <PageContainer\n header={\n <div className=\"flex justify-between flex-row\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">{title}</p>\n </button>\n <AddCustomTokenButton />\n </div>\n }\n content={\n <TokenListContent\n balanceType={balanceType}\n tokens={tokens}\n onSelectToken={(token) => {\n onSelectToken(token);\n onClose();\n }}\n />\n }\n />\n );\n};\n\nexport const TokenListContent: React.FC<{\n tokens: Token[];\n balanceType: BalanceType;\n onSelectToken: (token: Token) => void;\n}> = ({ tokens, onSelectToken, balanceType }) => {\n const pinnedTokenAddress = useCofhePinnedTokenAddress();\n const normalizedPinnedAddress = pinnedTokenAddress?.toLowerCase();\n\n const pinnedToken = normalizedPinnedAddress\n ? tokens.find((t) => t.address.toLowerCase() === normalizedPinnedAddress)\n : undefined;\n\n const nonPinnedTokens = pinnedToken\n ? tokens.filter((t) => t.address.toLowerCase() !== normalizedPinnedAddress)\n : tokens;\n\n return (\n <div className=\"fnx-token-list-container\">\n {tokens.length === 0 ? (\n <p className=\"text-xs opacity-70 py-4 text-center\">No tokens found</p>\n ) : (\n <>\n {pinnedToken && (\n <TokenRow\n balanceType={balanceType}\n onClick={() => {\n onSelectToken(pinnedToken);\n }}\n key={`pinned-${pinnedToken.address}`}\n token={pinnedToken}\n topLabel=\"Pinned\"\n />\n )}\n {nonPinnedTokens.map((token) => (\n <TokenRow\n balanceType={balanceType}\n onClick={() => {\n onSelectToken(token);\n }}\n key={token.address}\n token={token}\n />\n ))}\n </>\n )}\n </div>\n );\n};\n","import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight';\nimport { cn } from '../../../utils/cn';\nimport type { Token } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from './TokenIcon';\nimport { CofheTokenConfidentialBalance, BalanceType, CofheTokenPublicBalance } from './CofheTokenConfidentialBalance';\nimport { useCofheTokenDecryptedBalance, useCoingeckoUsdPrice } from '@/hooks';\nimport { sepolia } from '@cofhe/sdk/chains';\nimport { useCofheAccount } from '@/hooks/useCofheConnection';\nimport { formatUsdAmount } from '@/utils/format';\nimport { useCofheTokenPublicBalance } from '@/hooks/useCofheTokenPublicBalance';\nimport { TMP_WBTC_ON_MAINNET } from '@/utils/coingecko';\n\nexport const TokenRow: React.FC<{\n token: Token;\n onClick: () => void;\n balanceType: BalanceType;\n topLabel?: string;\n}> = ({ token, onClick, topLabel, balanceType }) => {\n const account = useCofheAccount();\n const { data: confidentialBalance } = useCofheTokenDecryptedBalance(\n {\n token,\n accountAddress: account,\n },\n {\n enabled: balanceType === BalanceType.Confidential,\n }\n );\n\n const { data: publicBalance } = useCofheTokenPublicBalance({ token, accountAddress: account });\n // tmp: TODO: for testnet, fetch the price of WBTC on mainnet to display in the UI\n const { data: price } = useCoingeckoUsdPrice(\n token.chainId === sepolia.id\n ? {\n chainId: TMP_WBTC_ON_MAINNET.chainId,\n tokenAddress: TMP_WBTC_ON_MAINNET.address,\n }\n : {\n chainId: token.chainId,\n tokenAddress: token.extensions.fhenix.erc20Pair?.address,\n }\n );\n\n const usdValue =\n balanceType === BalanceType.Confidential\n ? confidentialBalance && price && formatUsdAmount(confidentialBalance.unit.multipliedBy(price))\n : publicBalance && price && formatUsdAmount(publicBalance.unit.multipliedBy(price));\n\n return (\n <div\n onClick={onClick}\n className={cn(\n 'flex items-center justify-between px-3 py-2 rounded-lg',\n 'fnx-hover-overlay transition-colors',\n 'cursor-pointer'\n )}\n >\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {/* Token Icon */}\n <TokenIcon logoURI={token.logoURI} alt={token.name} size=\"sm\" />\n\n {/* Token label */}\n <div className=\"min-w-0 flex-1\">\n {topLabel && <div className=\"text-xxxs opacity-70 fnx-text-primary leading-none\">{topLabel}</div>}\n <div className=\"text-sm font-medium fnx-text-primary truncate leading-tight\">\n {balanceType === BalanceType.Confidential ? token.symbol : token.extensions.fhenix.erc20Pair?.symbol}\n </div>\n </div>\n </div>\n\n {/* Balance and Arrow */}\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n <div className=\"w-24 text-right whitespace-nowrap tabular-nums\">\n {balanceType === BalanceType.Confidential ? (\n <CofheTokenConfidentialBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium inline-block w-full text-right\"\n />\n ) : (\n <CofheTokenPublicBalance\n token={token}\n showSymbol={false}\n size=\"sm\"\n decimalPrecision={5}\n className=\"font-medium inline-block w-full text-right\"\n />\n )}\n </div>\n\n <div className=\"w-24 text-right whitespace-nowrap tabular-nums\">\n {usdValue ? (\n <span className=\"text-sm opacity-70 fnx-text-primary inline-block w-full text-right\">{usdValue}</span>\n ) : (\n <span className=\"text-sm opacity-0 select-none inline-block w-full text-right\">$0.00</span>\n )}\n </div>\n\n <KeyboardArrowRightIcon className=\"w-5 h-5 fnx-text-primary opacity-60 flex-shrink-0\" />\n </div>\n </div>\n );\n};\n","import { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { PageContainer } from '../components/PageContainer';\nimport { FloatingButtonPage } from '../pagesConfig/types';\nimport { useCofheTokens } from '@/hooks';\nimport { AddCustomTokenButton, TokenListContent } from '../modals/TokenListModal';\nimport { usePortalNavigation } from '@/stores';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { BalanceType } from '../components/CofheTokenConfidentialBalance';\n\ndeclare module '../pagesConfig/types' {\n interface FloatingButtonPagePropsRegistry {\n [FloatingButtonPage.Portfolio]: void;\n }\n}\nexport const PortfolioPage: React.FC = () => {\n const { navigateBack, navigateTo } = usePortalNavigation();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n\n return (\n <PageContainer\n header={\n <div className=\"flex justify-between flex-row\">\n <button\n onClick={navigateBack}\n className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\"\n >\n <ArrowBackIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Tokens list</p>\n </button>\n <AddCustomTokenButton />\n </div>\n }\n content={\n <TokenListContent\n balanceType={BalanceType.Confidential}\n tokens={allTokens}\n onSelectToken={(token) => {\n navigateTo(FloatingButtonPage.TokenInfo, {\n pageProps: {\n token,\n },\n });\n }}\n />\n }\n />\n );\n};\n","import { useCofheClaimableTokens } from '@/hooks/useCofheClaimableTokens';\nimport { PageContainer } from '../components/PageContainer';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { usePortalNavigation } from '@/stores';\nimport { useCofheChainId } from '@/hooks/useCofheConnection';\nimport { useCofheTokens } from '@/hooks/useCofheTokenLists';\nimport { TokenIcon } from '../components/TokenIcon';\nimport { formatTokenAmount } from '@/utils/format';\nimport { useMemo, useState } from 'react';\nimport { useCofheTokenClaimUnshielded } from '@/hooks';\nimport { cn } from '@/utils';\nimport { Button } from '../components';\nimport type { Address } from 'viem';\nimport { assert } from 'ts-essentials';\nexport function ClaimableTokens() {\n // TODO: or show multichain, with switching?\n\n const chainsClaimableTokens = useCofheClaimableTokens();\n const claimableByTokenAddress = chainsClaimableTokens.claimableByTokenAddress;\n const unshieldingInProgressByTokenAddress = chainsClaimableTokens.isUnshieldingInProgressByTokenAddress;\n const waitingByTokenAddress = chainsClaimableTokens.isWaitingForDecryptionByTokenAddress;\n const isClaimingByTokenAddress = chainsClaimableTokens.isClaimingByTokenAddress;\n const { navigateBack } = usePortalNavigation();\n\n const chainId = useCofheChainId();\n const allTokens = useCofheTokens(chainId);\n const claimMutation = useCofheTokenClaimUnshielded();\n\n const rows = useMemo(() => {\n const byLower = new Map(allTokens.map((t) => [t.address.toLowerCase(), t] as const));\n // TODO: show those that have zero claimable right now but is maybe ongoing unshielding/decryption?\n return Object.entries(claimableByTokenAddress)\n .filter(([_t, amount]) => amount > 0n)\n .map(([tokenAddress, claimableAmount]) => {\n const token = byLower.get(tokenAddress.toLowerCase());\n return token ? { token, claimableAmount } : null;\n })\n .filter((x): x is NonNullable<typeof x> => Boolean(x));\n }, [allTokens, claimableByTokenAddress]);\n\n const handleClaim = async (tokenAddress: string) => {\n const row = rows.find((r) => r.token.address.toLowerCase() === tokenAddress.toLowerCase());\n assert(row, 'token not found for claim');\n\n await claimMutation.mutateAsync({ token: row.token, amount: row.claimableAmount });\n };\n\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-3\">\n <button\n className=\"flex items-center gap-2 text-xl font-semibold text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n type=\"button\"\n onClick={navigateBack}\n >\n <ArrowBackIcon fontSize=\"small\" />\n </button>\n <span>Claimable Tokens list</span>\n </div>\n }\n content={\n <div className=\"flex flex-col gap-4 pr-1\">\n {rows.map(({ token, claimableAmount }) => {\n const isDecrypting = waitingByTokenAddress?.[token.address] ?? false;\n const isUnshielding =\n unshieldingInProgressByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n const formatted = formatTokenAmount(claimableAmount, token.decimals, 5).formatted;\n const isClaimingThis = isClaimingByTokenAddress?.[token.address.toLowerCase() as Address] ?? false;\n\n return (\n <div key={token.address} className=\"grid grid-cols-[1fr,auto,auto] items-center gap-4\">\n <div className=\"flex items-center gap-3 min-w-0\">\n <TokenIcon\n logoURI={token.logoURI}\n alt={token.name}\n size=\"md\"\n className={cn(\n 'w-10 h-10 rounded-full',\n 'fnx-icon-bg',\n 'border border-[var(--fnx-button-default-border)]',\n 'flex items-center justify-center flex-shrink-0 overflow-hidden'\n )}\n />\n <div className=\"min-w-0\">\n <div className=\"text-xl font-semibold fnx-text-primary truncate\">{token.name}</div>\n </div>\n </div>\n\n <div className=\"text-2xl font-semibold fnx-text-primary tabular-nums\">{formatted}</div>\n\n <Button\n type=\"button\"\n onClick={() => handleClaim(token.address)}\n disabled={isUnshielding || isDecrypting || isClaimingThis || claimMutation.isPending}\n >\n {isDecrypting ? 'Decrypting' : isUnshielding ? 'Unshielding' : 'Claim'}\n </Button>\n </div>\n );\n })}\n\n {rows.length === 0 && <div className=\"text-sm opacity-70 fnx-text-primary\">No claimable tokens.</div>}\n </div>\n }\n />\n );\n}\n","import type { FC } from 'react';\nimport {\n ActivityPage,\n GeneratePermitPage,\n MainPage,\n PermitsListPage,\n SendPage,\n SettingsPage,\n TokenInfoPage,\n DebugPage,\n ShieldPageV2,\n DelegatePermitPage,\n ImportPermitPage,\n} from '../pages';\nimport { FloatingButtonPage } from './types';\nimport { PortfolioPage } from '../pages/PortfolioPage';\nimport { ClaimableTokens } from '../pages/ClaimableTokens';\n\nexport const pages: Record<FloatingButtonPage, FC<any>> = {\n [FloatingButtonPage.Main]: MainPage,\n [FloatingButtonPage.Settings]: SettingsPage,\n [FloatingButtonPage.TokenInfo]: TokenInfoPage,\n [FloatingButtonPage.Send]: SendPage,\n [FloatingButtonPage.Shield]: ShieldPageV2,\n [FloatingButtonPage.Activity]: ActivityPage,\n [FloatingButtonPage.Permits]: PermitsListPage,\n [FloatingButtonPage.GeneratePermits]: GeneratePermitPage,\n [FloatingButtonPage.DelegatePermits]: DelegatePermitPage,\n [FloatingButtonPage.ReceivePermits]: ImportPermitPage,\n [FloatingButtonPage.Debug]: DebugPage,\n [FloatingButtonPage.Portfolio]: PortfolioPage,\n [FloatingButtonPage.ClaimableTokens]: ClaimableTokens,\n};\n","import { PortalModal, type PortalModalStateMap } from './types';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleSelectionPage: React.FC<PortalModalStateMap[PortalModal.ExampleSelection]> = ({\n onClose,\n onSelect,\n}) => {\n const options = ['1', '2', '3'];\n\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">Select an option</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n {options.map((option) => (\n <button\n key={option}\n onClick={() => {\n onSelect(option);\n onClose();\n }}\n >\n Option {option}\n </button>\n ))}\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Close</span>\n </button>\n </div>\n }\n />\n );\n};\n","import CloseIcon from '@mui/icons-material/Close';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { PageContainer } from '../components/PageContainer';\n\nexport const ExampleInfoPage: React.FC<PortalModalStateMap[PortalModal.ExampleInfo]> = ({ onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <CloseIcon style={{ fontSize: 16 }} />\n <p className=\"text-sm font-medium\">More info</p>\n </button>\n }\n content={\n <div className=\"flex flex-1 flex-col gap-3 items-start justify-start\">\n <p>Cofhesdk is complex, so we have created this modal to help you understand.</p>\n <p>\n You probably clicked on a ? button next to some functionality. And in this modal you'll get your information\n or explanation.\n </p>\n <p>This is another paragraph of explanation.</p>\n <p>Now that you're done reading, you can click \"Got It\" at the bottom to close this modal.</p>\n </div>\n }\n footer={\n <div className=\"flex flex-row flex-1 justify-end items-center mt-auto\">\n <button onClick={onClose} className=\"flex items-center gap-1 text-sm hover:opacity-80 transition-opacity\">\n <span>Got It</span>\n </button>\n </div>\n }\n />\n );\n};\n","import { FaCheck, FaRegCopy } from 'react-icons/fa6';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { usePermitDetailsPage } from '@/hooks/permits/index.js';\nimport { PageContainer } from '@/components/FnxFloatingButton/components/PageContainer';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { Button } from '../components';\nimport { InfoModalButton } from './InfoModalButton';\nimport { usePortalModals } from '@/stores';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { PermitCard } from '../components/PermitCard';\nimport { truncateAddress } from '@/utils';\nimport { useCallback, useState } from 'react';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nconst NoPermitFoundModal: React.FC<{ onClose: () => void }> = ({ onClose }) => {\n return (\n <PageContainer\n header={\n <div className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\">\n No permit found\n </div>\n }\n content={\n <div className=\"flex flex-col gap-3\">\n <p>No permit found</p>\n </div>\n }\n footer={<Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />}\n />\n );\n};\n\nexport const PermitDetailsModal: React.FC<PortalModalStateMap[PortalModal.PermitDetails]> = ({ hash, onClose }) => {\n const {\n permit,\n expirationInfo,\n isActivePermit,\n isShareablePermit,\n handleSelectActivePermit,\n handleCopySharablePermitData,\n handleRemovePermit,\n isCopyComplete,\n } = usePermitDetailsPage(hash);\n const { openModal } = usePortalModals();\n\n const [confirmDelete, setConfirmDelete] = useState(false);\n\n const handlePermitSelect = useCallback(() => {\n handleSelectActivePermit();\n onClose();\n }, [handleSelectActivePermit, onClose]);\n\n const handlePermitShare = useCallback(() => {\n handleCopySharablePermitData();\n }, [handleCopySharablePermitData]);\n\n const handlePermitDelete = useCallback(async () => {\n if (!confirmDelete) {\n setConfirmDelete(true);\n return;\n }\n handleRemovePermit();\n onClose();\n }, [confirmDelete, onClose, handleRemovePermit]);\n\n if (permit == null) {\n return <NoPermitFoundModal onClose={onClose} />;\n }\n\n return (\n <PageContainer\n isModal\n header={\n <PermitCard\n hash={hash}\n className=\"-mt-4 -ml-4 -mr-4\"\n header={\n <button\n className=\"flex items-center gap-2 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n onClick={onClose}\n type=\"button\"\n >\n <CloseIcon fontSize=\"small\" />\n <span>Permit</span>\n </button>\n }\n />\n }\n content={\n permit != null && (\n <div className=\"flex flex-col gap-3\">\n <p className=\"flex flex-row gap-2 text-sm\">\n Type: <b>{PermitTypeLabel[permit.type]}</b>\n <InfoModalButton onClick={() => openModal(PortalModal.PermitTypeInfo, { type: permit.type })} />\n </p>\n\n <p className=\"text-sm\">\n Expires in: <b>{expirationInfo.label}</b>\n </p>\n\n {permit.type === 'self' && (\n <p className=\"text-sm\">\n To select this permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is active, you\n will be able to view your own encrypted data.\n </p>\n )}\n {permit.type === 'sharing' && (\n <p className=\"text-sm\">\n To share this permit with <b>recipient</b>, click the <b>\"SHARE\"</b> button below to copy the permit\n data to your clipboard. Share the copied permit data with <b>recipient</b> to grant them access to your\n encrypted data.\n <br />\n <br />\n <i>\n <b>Note:</b> The copied permit data is not sensitive and can be sent to recipient via any\n communication channel.\n </i>\n </p>\n )}\n {permit.type === 'recipient' && (\n <p className=\"text-sm\">\n To select this imported permit for usage, click the <b>\"SELECT\"</b> button below. When this permit is\n active, you will be able to view <b>issuer</b>'s ({truncateAddress(permit.issuer, 4, 4)}) encrypted\n data.\n </p>\n )}\n </div>\n )\n }\n footer={\n <div className=\"flex flex-row gap-3 w-full\">\n {isShareablePermit && (\n <Button variant=\"primary\" onClick={handlePermitShare}>\n {isCopyComplete ? <FaCheck /> : <FaRegCopy />}\n {isCopyComplete ? 'COPIED' : 'SHARE'}\n </Button>\n )}\n {!isShareablePermit && (\n <Button\n variant=\"primary\"\n label={isActivePermit ? 'ALREADY ACTIVE' : 'SELECT'}\n onClick={handlePermitSelect}\n disabled={isActivePermit}\n />\n )}\n <Button label={confirmDelete ? 'CONFIRM' : 'DELETE'} onClick={handlePermitDelete} variant=\"error\" />\n <Button label=\"CLOSE\" onClick={onClose} variant=\"ghost\" />\n </div>\n }\n />\n );\n};\n","import CloseIcon from '@mui/icons-material/Close';\nimport { PageContainer } from '../components/PageContainer';\nimport { Button } from '../components';\n\ntype Props = {\n header: React.ReactNode | string;\n content: React.ReactNode;\n onClose: () => void;\n};\n\nexport const BaseInfoModal: React.FC<Props> = ({ header, content, onClose }) => {\n return (\n <PageContainer\n isModal\n header={\n <button\n onClick={onClose}\n className=\"flex items-center gap-1 text-base font-semibold tracking-tight text-[#0E2F3F] transition-opacity hover:opacity-80 dark:text-white\"\n >\n <CloseIcon style={{ fontSize: 16 }} />\n {typeof header === 'string' ? (\n <p className=\"text-base font-semibold tracking-tight text-[#0E2F3F]\">{header}</p>\n ) : (\n header\n )}\n </button>\n }\n content={<div className=\"flex flex-1 flex-col w-full gap-3 items-start justify-start\">{content}</div>}\n footer={\n <div className=\"flex flex-row\">\n <Button onClick={onClose}>\n <span>Close</span>\n </Button>\n </div>\n }\n />\n );\n};\n","import type { PortalModal, PortalModalStateMap } from './types';\nimport type { PermitType } from '@cofhe/sdk/permits';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nconst PermitTypeLabel: Record<PermitType, string> = {\n self: 'Self',\n sharing: 'Delegated',\n recipient: 'Imported',\n};\n\nexport const PermitTypeInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitTypeInfo]> = ({ type, onClose }) => {\n return (\n <BaseInfoModal\n header={`${PermitTypeLabel[type]} Permit`}\n content={\n <>\n {/* TODO: Improve copy */}\n {type === 'self' && (\n <p>\n \"Self\" permits are created by a user to access their own encrypted data. The provided signature is\n verified on-chain by the ACL (Access Control List).\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'sharing' && (\n <p>\n \"Delegated\" permits are created by a user (Issuer) to share their encrypted data with another user\n (Recipient). Both Issuer and Rceipient must sign as a handshake. Issuer's signature is verified on-chain\n by the ACL (Access Control List) and grants access to Recipient, and Recipient's signature applies and\n verifies the re-encryption key.\n </p>\n )}\n {/* TODO: Improve copy */}\n {type === 'recipient' && (\n <p>\n \"Imported\" permits are imported by a user (Recipient) to access encrypted data that has been shared with\n them by the permit's Issuer. Both Issuer and Rceipient must sign as a handshake. Issuer's signature is\n verified on-chain by the ACL (Access Control List) and grants access to Recipient, and Recipient's\n signature applies and verifies the re-encryption key.\n </p>\n )}\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import PermitIcon from '@/assets/fhenix-permit-icon.svg';\nimport type { PortalModal, PortalModalStateMap } from './types';\nimport { BaseInfoModal } from './BaseInfoModal';\n\nexport const PermitInfoModal: React.FC<PortalModalStateMap[PortalModal.PermitInfo]> = ({ onClose }) => {\n return (\n <BaseInfoModal\n header=\"Permit\"\n content={\n <>\n <div className=\"flex flex-col w-full justify-center items-center gap-3 text-[#0E2F3F] dark:text-white\">\n <PermitIcon className=\"h-7 w-7 fill-black dark:fill-white\" aria-label=\"CoFHE permit icon\" />\n <div className=\"text-lg font-semibold\">CoFHE Permits</div>\n </div>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n CoFHE permits are used to authenticate your identity and grant access to your encrypted data.\n </p>\n <p className=\"text-sm leading-relaxed text-[#355366] dark:text-white/80\">\n Generating a permit requires a signature, which will open your connected wallet to sign a message (EIP712).\n This signed message contains only info used to authenticate and grant access.\n </p>\n </>\n }\n onClose={onClose}\n />\n );\n};\n","import { ExampleSelectionPage } from './ExampleSelectionPage';\nimport { ExampleInfoPage } from './ExampleInfoPage';\nimport { PortalModal, type PortalModalStateMap } from './types';\nimport { PermitDetailsModal } from './PermitDetailsModal';\nimport { PermitTypeInfoModal } from './PermitTypeInfoModal';\nimport { PermitInfoModal } from './PermitInfoModal';\nimport { TokenListModal } from './TokenListModal';\n\nexport const modals: { [M in PortalModal]: React.FC<PortalModalStateMap[M]> } = {\n [PortalModal.ExampleSelection]: ExampleSelectionPage,\n [PortalModal.ExampleInfo]: ExampleInfoPage,\n [PortalModal.PermitDetails]: PermitDetailsModal,\n [PortalModal.PermitTypeInfo]: PermitTypeInfoModal,\n [PortalModal.PermitInfo]: PermitInfoModal,\n [PortalModal.TokenList]: TokenListModal,\n};\n","import { isValidElement, cloneElement, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\n\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport type { FnxFloatingButtonToast } from './types';\nimport { cn } from '@/utils';\nimport { usePortalToasts } from '@/stores';\n\nconst ToastClearer = ({ id, paused, remainingMs }: { id: string; paused: boolean; remainingMs: number }) => {\n const { removeToast } = usePortalToasts();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (remainingMs <= 0) {\n removeToast(id);\n return;\n }\n\n // Clear the timer if the toast has been paused\n if (paused && timerRef.current != null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n\n // Start the timer if the toast has been unpaused\n if (!paused) {\n timerRef.current = setTimeout(() => removeToast(id), remainingMs);\n }\n\n return () => {\n if (timerRef.current == null) return;\n clearTimeout(timerRef.current);\n timerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [remainingMs, paused]);\n\n return null;\n};\n\nconst ToastComponent: React.FC<FnxFloatingButtonToast> = ({ id, duration, paused, startMs, remainingMs, content }) => {\n const { isTopSide } = useFnxFloatingButtonContext();\n const { pauseToast, removeToast } = usePortalToasts();\n\n const handlePause = (paused: boolean) => {\n pauseToast(id, paused);\n };\n\n const handleDismiss = () => {\n removeToast(id);\n };\n\n // Inject id and paused into content if it's a React element\n const injectedContent = isValidElement(content)\n ? cloneElement(content, {\n id,\n paused,\n startMs,\n remainingMs,\n duration,\n onPause: handlePause,\n onDismiss: handleDismiss,\n ...content.props,\n })\n : content;\n\n return (\n <motion.div\n key={id}\n initial={{ opacity: 0, y: isTopSide ? -4 : 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: isTopSide ? 4 : -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n className={cn('min-h-8 bg-white border items-center justify-start w-full max-w-full')}\n >\n {injectedContent}\n {duration != 'infinite' && <ToastClearer id={id} paused={paused} remainingMs={remainingMs} />}\n </motion.div>\n );\n};\n\nexport const ToastsSection: React.FC = () => {\n const { toasts } = usePortalToasts();\n return (\n <div className=\"flex flex-col gap-3 w-full max-w-full\">\n <AnimatePresence>\n {toasts.map((toast) => (\n <ToastComponent key={toast.id} {...toast} />\n ))}\n </AnimatePresence>\n </div>\n );\n};\n","import { cn } from '@/utils';\nimport { FloatingButtonComponent } from './FloatingButtonComponent';\nimport { StatusBarSection } from './StatusBarSection';\nimport { StatusBarContent } from './StatusBarContent';\nimport { ContentSection } from './ContentSection';\nimport { useFnxFloatingButtonContext } from './FnxFloatingButtonContext';\nimport type { FloatingButtonPosition, FnxFloatingButtonProps } from './types';\nimport { ToastsSection } from './ToastsSection';\nimport { usePortalModals, usePortalNavigation, usePortalUI } from '@/stores';\n\nconst positionStyles: Record<FloatingButtonPosition, string> = {\n 'top-left': 'top-4 left-4',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n};\n\nexport const FnxFloatingButtonBase: React.FC<FnxFloatingButtonProps> = ({\n className,\n testId,\n zIndex = 9999,\n positionType = 'fixed',\n overriddingPage,\n}) => {\n const { effectivePosition, isTopSide, isLeftSide, theme } = useFnxFloatingButtonContext();\n const { togglePortal } = usePortalUI();\n const { clearAllModals } = usePortalModals();\n const { clearNavigationHistory } = usePortalNavigation();\n const darkMode = theme === 'dark';\n\n return (\n <div\n data-testid={testId}\n className={cn(\n 'fnx-floating-button',\n darkMode && 'dark',\n positionType,\n 'flex gap-3',\n positionStyles[effectivePosition],\n // bottom-* opens UP (popup above), top-* opens DOWN (popup below)\n isTopSide ? 'flex-col-reverse items-start' : 'flex-col items-start',\n `z-[${zIndex}]`,\n className\n )}\n >\n <ToastsSection />\n\n <ContentSection overriddingPage={overriddingPage} />\n\n {/* Button and Bar Row */}\n <div className={cn('flex w-full gap-3 items-center', isLeftSide ? 'flex-row' : 'flex-row-reverse')}>\n <FloatingButtonComponent\n onClick={() =>\n togglePortal({\n onCloseEnd: () => {\n clearNavigationHistory();\n clearAllModals();\n },\n })\n }\n />\n\n <StatusBarSection>\n <StatusBarContent />\n </StatusBarSection>\n </div>\n </div>\n );\n};\n","import { FnxFloatingButtonBase } from './FnxFloatingButtonBase';\nimport { FnxFloatingButtonProvider } from './FnxFloatingButtonContext';\nimport type { FnxFloatingButtonProps } from './types';\n\nexport const FnxFloatingButtonWithProvider: React.FC<FnxFloatingButtonProps> = (props) => {\n return (\n <FnxFloatingButtonProvider>\n <FnxFloatingButtonBase {...props} />\n {props.children}\n </FnxFloatingButtonProvider>\n );\n};\n","import { z } from 'zod';\nimport { type CofheConfig, type CofheInputConfig } from '@cofhe/sdk';\nimport { createCofheConfig as createCofheConfigWeb } from '@cofhe/sdk/web';\nimport { getAddress, isAddress, zeroAddress } from 'viem';\n\n/**\n * Zod schema for react configuration validation\n */\n\nexport const addressSchema = z\n .string()\n .refine((val) => isAddress(val), {\n error: 'Invalid address',\n })\n .refine((val) => val !== zeroAddress, {\n error: 'Must not be zeroAddress',\n })\n .transform((val) => getAddress(val));\n\nexport const CofheReactConfigSchema = z.object({\n shareablePermits: z.boolean().optional().default(false),\n enableShieldUnshield: z.boolean().optional().default(true),\n autogeneratePermits: z.boolean().optional().default(true),\n permitExpirationOptions: z\n .array(\n z.object({\n label: z.string(),\n intervalSeconds: z.number().min(0),\n })\n )\n .optional()\n .default([\n { label: '1 Day', intervalSeconds: 86400 },\n { label: '1 Week', intervalSeconds: 604800 },\n { label: '1 Month', intervalSeconds: 2592000 },\n ]),\n defaultPermitExpirationSeconds: z.number().optional().default(604800), // 1 week\n pinnedTokens: z.record(z.string(), addressSchema).optional(),\n tokenLists: z\n .record(z.string(), z.array(z.string()))\n .transform((lists) => lists as Partial<Record<number, string[]>>)\n .optional(),\n position: z.enum(['bottom-right', 'bottom-left', 'top-right', 'top-left']).optional().default('bottom-right'),\n initialTheme: z.enum(['dark', 'light']).optional().default('light'),\n});\n\n/**\n * Input config type inferred from the schema\n */\nexport type CofheReactInputConfig = CofheInputConfig & {\n react?: z.input<typeof CofheReactConfigSchema>;\n};\n\nexport type CofheConfigWithReact = CofheConfig & {\n react: z.output<typeof CofheReactConfigSchema>;\n};\n/**\n * Creates a CoFHE client plus React configuration with reasonable defaults.\n * @param config - Cofhe client input merged with a `react` object (fheKeyStorage defaults to IndexedDB when omitted).\n * @returns The combined client configuration with a validated `react` section and Web defaults applied.\n */\nexport function createCofheConfig(config: CofheReactInputConfig): CofheConfigWithReact {\n const { react: reactConfigInput = {}, ...webConfig } = config;\n\n const webClientConfig = createCofheConfigWeb({\n environment: 'react',\n ...webConfig,\n });\n const reactConfigResult = CofheReactConfigSchema.safeParse(reactConfigInput);\n\n if (!reactConfigResult.success) {\n throw new Error(`Invalid cofhe react configuration: ${z.prettifyError(reactConfigResult.error)}`, {\n cause: reactConfigResult.error,\n });\n }\n\n return {\n ...webClientConfig,\n react: reactConfigResult.data,\n };\n}\n","import { useState, useRef, useEffect, useMemo } from 'react';\nimport type {\n BaseProps,\n DropdownOption,\n ComponentSize,\n EncryptionProgressData,\n EncryptionResultData,\n EncryptionStartData,\n} from '../types/component-types.js';\nimport { cn } from '../utils/cn.js';\nimport { debounce } from '../utils/debounce.js';\nimport { FheTypesList } from '../utils/utils.js';\nimport SecurityIcon from '@mui/icons-material/Security';\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { Encryptable, type FheTypeValue } from '@cofhe/sdk';\nimport { getStepConfig, useCofheEncrypt } from '@/hooks/useCofheEncrypt';\n\nexport interface FnxEncryptInputProps extends BaseProps {\n /** Placeholder text for the text field */\n placeholder?: string;\n /** Initial value for the text field */\n initialValue?: string;\n /** Dropdown options for encryption types */\n options?: DropdownOption[];\n /** Component size */\n size?: ComponentSize;\n /** Whether inputs have errors */\n hasError?: boolean;\n /** Error message to display */\n errorMessage?: string;\n /** Whether the component is disabled */\n disabled?: boolean;\n /** Whether to show the progress bar during encryption */\n showProgressBar?: boolean;\n /** Debounce delay for validation in milliseconds (default: 300) */\n debounceMs?: number;\n /** Callback when text changes */\n onTextChange?: (_value: string) => void;\n /** Callback when encryption type selection changes */\n onTypeChange?: (_value: string) => void;\n /** Callback when encryption starts */\n onEncryptStart?: (_data: EncryptionStartData) => void;\n /** Callback for encryption progress updates */\n onEncryptProgress?: (_data: EncryptionProgressData) => void;\n /** Callback when encryption completes successfully */\n onEncryptComplete?: (_data: EncryptionResultData) => void;\n /** Callback when encryption fails */\n onEncryptError?: (_error: string) => void;\n}\n\nexport const FnxEncryptInput: React.FC<FnxEncryptInputProps> = ({\n className,\n testId,\n placeholder = 'Enter number or address...',\n initialValue = '',\n options = FheTypesList,\n size = 'md',\n hasError = false,\n errorMessage,\n disabled = false,\n showProgressBar = false,\n debounceMs = 300,\n onTextChange,\n onTypeChange,\n onEncryptStart,\n onEncryptProgress,\n onEncryptComplete,\n onEncryptError,\n}) => {\n const [textValue, setTextValue] = useState(initialValue);\n const [selectedType, setSelectedType] = useState<FheTypeValue>(options[0]?.value || 'uint32');\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [showProgress, setShowProgress] = useState(false);\n const [encryptedResult, setEncryptedResult] = useState<any>(null);\n const [copySuccess, setCopySuccess] = useState<boolean>(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const {\n encryptInputsAsync: encrypt,\n isEncrypting,\n stepsState: { lastStep: lastEncryptionStep },\n } = useCofheEncrypt();\n\n const { progress: encryptionProgress, label: encryptionProgressLabel } = useMemo(() => {\n return lastEncryptionStep\n ? getStepConfig(lastEncryptionStep)\n : {\n progress: undefined,\n label: undefined,\n };\n }, [lastEncryptionStep]);\n\n // Debounced validation function\n const debouncedValidation = useRef(\n debounce((value: string) => {\n // This will be used for validation logic if needed in the future\n console.log('Debounced validation for:', value);\n }, debounceMs)\n ).current;\n\n // Handle progress bar visibility with animation\n useEffect(() => {\n if (showProgressBar && isEncrypting) {\n // Show immediately when encryption starts\n setShowProgress(true);\n } else if (!isEncrypting) {\n // Delay hiding to allow fade-out animation\n const timer = setTimeout(() => setShowProgress(false), 500);\n return () => clearTimeout(timer);\n }\n }, [showProgressBar, isEncrypting]);\n\n // Handle progress updates and call onEncryptProgress callback\n useEffect(() => {\n if (isEncrypting && lastEncryptionStep && encryptionProgress && encryptionProgressLabel) {\n onEncryptProgress?.({\n step: lastEncryptionStep.step,\n progress: encryptionProgress,\n label: encryptionProgressLabel,\n });\n }\n }, [encryptionProgress, encryptionProgressLabel, onEncryptProgress, isEncrypting, lastEncryptionStep]);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsDropdownOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n // Size variants\n const sizeClasses = {\n sm: { input: 'px-3 py-2 text-sm', dropdown: 'px-2 py-1 text-xs', button: 'px-3 py-1 text-sm' },\n md: { input: 'px-4 py-3 text-sm', dropdown: 'px-3 py-2 text-sm', button: 'px-4 py-2 text-sm' },\n lg: { input: 'px-5 py-4 text-base', dropdown: 'px-4 py-3 text-base', button: 'px-6 py-3 text-base' },\n };\n\n // Input container with integrated dropdown\n const inputContainerClasses = cn(\n 'relative flex items-center bg-white dark:bg-gray-800 border rounded-lg transition-colors',\n 'focus-within:ring-2 focus-within:ring-blue-500 focus-within:border-blue-500',\n hasError\n ? 'border-red-500 focus-within:ring-red-500 focus-within:border-red-500'\n : 'border-gray-300 dark:border-gray-600',\n (disabled || isEncrypting) && 'bg-gray-100 dark:bg-gray-700 opacity-50',\n className\n );\n\n const inputClasses = cn(\n 'flex-1 bg-transparent border-0 outline-none placeholder-gray-400 dark:placeholder-gray-500',\n 'text-gray-900 dark:text-white',\n sizeClasses[size].input,\n 'pr-20', // Make space for the dropdown button\n (disabled || isEncrypting) && 'cursor-not-allowed'\n );\n\n // Dropdown button inside the input\n const dropdownButtonClasses = cn(\n 'absolute right-0 top-0 bottom-0',\n 'flex items-center gap-1 px-2 rounded-r-md border-l border-gray-300 dark:border-gray-600',\n 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600',\n 'transition-colors duration-200 cursor-pointer',\n 'text-xs font-medium text-gray-700 dark:text-gray-300',\n (disabled || isEncrypting) && 'cursor-not-allowed opacity-50',\n isDropdownOpen && 'bg-gray-200 dark:bg-gray-600'\n );\n\n const dropdownItemClasses = (isSelected: boolean, isCompatible: boolean) =>\n cn(\n 'px-3 py-2 text-sm transition-colors',\n isCompatible\n ? 'cursor-pointer hover:bg-blue-50 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-300'\n : 'cursor-not-allowed opacity-50 bg-gray-50 dark:bg-gray-700',\n isSelected && isCompatible\n ? 'bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 font-medium'\n : isCompatible\n ? 'text-gray-700 dark:text-gray-300'\n : 'text-gray-400 dark:text-gray-500'\n );\n\n // Progress bar styles\n const progressVariantClasses = {\n primary: 'bg-blue-600 dark:bg-blue-500',\n success: 'bg-green-600 dark:bg-green-500',\n warning: 'bg-yellow-600 dark:bg-yellow-500',\n error: 'bg-red-600 dark:bg-red-500',\n };\n\n const progressContainerClasses = cn(\n 'w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1 overflow-hidden',\n // Debug: Add border to see container\n 'border'\n );\n\n const progressBarClasses = (variant: 'primary' | 'success' | 'warning' | 'error' = 'primary') =>\n cn('h-full transition-all duration-300 ease-out rounded-full', progressVariantClasses[variant]);\n\n // Check if a type is compatible with the current input value\n const isTypeCompatible = (typeValue: FheTypeValue, inputValue: string): boolean => {\n if (!inputValue.trim()) return true; // Empty input is compatible with all types\n\n const typeInfo = FheTypesList.find((type) => type.value === typeValue);\n if (!typeInfo) return false;\n\n // Boolean type validation\n if (typeValue === 'bool') {\n const lowerValue = inputValue.toLowerCase();\n return lowerValue === 'true' || lowerValue === 'false' || lowerValue === '0' || lowerValue === '1';\n }\n\n // Address type validation\n if (typeValue === 'address') {\n if (!inputValue.startsWith('0x')) return false;\n\n const addressPart = inputValue.slice(2);\n if (addressPart.length !== 40) return false;\n\n const hexRegex = /^[a-fA-F0-9]+$/;\n if (!hexRegex.test(addressPart)) return false;\n\n return true;\n }\n\n // Numeric type validation\n if (typeInfo.maxValue) {\n try {\n const numValue = BigInt(inputValue);\n return numValue >= 0 && numValue <= typeInfo.maxValue;\n } catch (error) {\n return false;\n }\n }\n\n return true;\n };\n\n const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n setTextValue(value);\n onTextChange?.(value);\n\n // Clear encrypted result when text changes\n setEncryptedResult(null);\n setCopySuccess(false);\n\n // Trigger debounced validation\n debouncedValidation(value);\n };\n\n const handleCopyResult = async () => {\n if (!encryptedResult || copySuccess) return;\n\n try {\n // Custom JSON serializer that handles BigInt\n const textToCopy = JSON.stringify(\n encryptedResult,\n (key, value) => {\n if (typeof value === 'bigint') {\n return value.toString();\n }\n return value;\n },\n 2\n ); // Pretty format with 2 spaces\n\n await navigator.clipboard.writeText(textToCopy);\n console.log('Copied to clipboard:', textToCopy);\n\n // Show success indication\n setCopySuccess(true);\n\n // Reset after 2 seconds\n setTimeout(() => {\n setCopySuccess(false);\n }, 2000);\n } catch (error) {\n console.error('Failed to copy to clipboard:', error);\n }\n };\n\n const handleTypeSelect = async (type: FheTypeValue) => {\n setSelectedType(type);\n setIsDropdownOpen(false);\n onTypeChange?.(type);\n\n // Auto-encrypt when type is selected (if text field has value)\n if (textValue.trim() !== '') {\n try {\n console.log('Auto-encrypting value:', textValue, 'as type:', type);\n\n // Call onEncryptStart callback\n onEncryptStart?.({ value: textValue, type: type });\n\n // TODO: Try to create non-blocking encryption call that doesn't block the UI\n // Not really work, need to improve cofhejs side to make it non-blocking\n (async () => {\n try {\n const [encryptionResult] = await encrypt([Encryptable.create(type, textValue)]);\n\n // Store the result for the copy button\n setEncryptedResult(encryptionResult);\n\n const data = { value: textValue, encrypted: encryptionResult };\n\n // Call completion callback\n onEncryptComplete?.(data);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption failed';\n console.error('Encryption failed:', error);\n onEncryptError?.(errorMessage);\n }\n })();\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Encryption setup failed';\n console.error('Encryption setup failed:', error);\n onEncryptError?.(errorMessage);\n }\n }\n };\n\n const toggleDropdown = () => {\n if (!disabled && !isEncrypting) {\n setIsDropdownOpen(!isDropdownOpen);\n }\n };\n\n // Material Icons components\n const ShieldIcon = () => <SecurityIcon sx={{ fontSize: 14 }} />;\n\n const ChevronDownIcon = () => <KeyboardArrowDownIcon sx={{ fontSize: 14 }} />;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex items-start gap-3\">\n {/* Input with integrated dropdown - this will determine progress bar width */}\n <div className=\"flex-1\">\n <div className={inputContainerClasses} data-testid={testId}>\n <input\n type=\"text\"\n className={inputClasses}\n placeholder={placeholder}\n value={textValue}\n onChange={handleTextChange}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-input` : 'fnx-encrypt-input'}\n />\n\n {/* Encryption status indicator */}\n {(isEncrypting || encryptedResult) && (\n <div className=\"absolute right-16 top-1/2 transform -translate-y-1/2\">\n {isEncrypting ? (\n <div className=\"bg-blue-500 px-2 py-1 text-xs text-white rounded animate-pulse\">Encrypting...</div>\n ) : encryptedResult ? (\n <button\n onClick={handleCopyResult}\n disabled={copySuccess}\n className={`px-2 py-1 text-xs text-white rounded flex items-center gap-1 transition-all duration-300 ${\n copySuccess ? 'bg-green-600 cursor-default' : 'bg-green-500 hover:bg-green-600'\n }`}\n title={copySuccess ? 'Copied to clipboard!' : 'Copy encrypted result to clipboard'}\n >\n <>\n {copySuccess ? <CheckIcon sx={{ fontSize: 12 }} /> : <ContentCopyIcon sx={{ fontSize: 12 }} />}\n Copy\n </>\n </button>\n ) : null}\n </div>\n )}\n\n {/* Integrated dropdown button */}\n <div className=\"cofhe-dropdown-container\" ref={dropdownRef}>\n <button\n type=\"button\"\n className={dropdownButtonClasses}\n onClick={toggleDropdown}\n disabled={disabled || isEncrypting}\n data-testid={testId ? `${testId}-type-selector` : 'fnx-type-selector'}\n >\n <ShieldIcon />\n <ChevronDownIcon />\n </button>\n\n {/* Dropdown menu */}\n {isDropdownOpen && (\n <div className=\"cofhe-dropdown-menu\">\n {options.map((option) => {\n const isCompatible = isTypeCompatible(option.value, textValue);\n const isSelected = option.value === selectedType;\n\n return (\n <div\n key={option.value}\n className={dropdownItemClasses(isSelected, isCompatible)}\n onClick={() => isCompatible && handleTypeSelect(option.value)}\n data-testid={`${testId ? `${testId}-` : ''}type-option-${option.value}`}\n title={\n !isCompatible ? `Value \"${textValue}\" is not compatible with ${option.label}` : undefined\n }\n >\n <span className=\"font-mono\">{option.label}</span>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n {/* Progress bar section - shows immediately when encryption starts */}\n {showProgress && (\n <div\n className=\"mt-3 overflow-hidden\"\n style={{\n animation: isEncrypting\n ? 'slideDownFadeIn 0.5s ease-out forwards'\n : 'slideUpFadeOut 0.5s ease-out forwards',\n }}\n data-testid={testId ? `${testId}-progress` : 'fnx-encrypt-progress'}\n >\n <div className=\"flex justify-between items-center mb-1\">\n <span className=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\n {encryptionProgressLabel || 'Processing...'}\n </span>\n <span className=\"text-sm text-gray-500 dark:text-gray-400\">{encryptionProgress || 0}%</span>\n </div>\n <div className={progressContainerClasses}>\n <div\n className={progressBarClasses('primary')}\n style={{\n width: `${Math.min(100, Math.max(0, encryptionProgress || 0))}%`,\n transition: 'width 0.3s ease-out',\n }}\n data-testid={testId ? `${testId}-progress-bar` : 'fnx-encrypt-progress-bar'}\n />\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Error message */}\n {hasError && errorMessage && (\n <p\n className=\"mt-2 text-sm text-red-600 dark:text-red-400\"\n data-testid={testId ? `${testId}-error` : 'fnx-encrypt-error'}\n >\n {errorMessage}\n </p>\n )}\n </div>\n );\n};\n","// Styles\nimport './styles.css';\n\n// Providers\nexport { CofheProvider, useCofheContext } from './providers/index';\n\n// Hooks\nexport {\n useCofheConnection,\n useCofheActivePermit,\n useCofheAllPermits,\n useCofheRemovePermit,\n useCofheSelectPermit,\n useCofhePublicClient,\n useCofheWalletClient,\n useCofheEncrypt,\n useCofheWriteContract,\n useCofheClient,\n useCofheTokens,\n useCofheTokensWithExistingEncryptedBalances,\n useTokensWithPublicBalances,\n useCofheTokenLists,\n useCofheTokenShield,\n useCofheTokenUnshield,\n useCofheTokenClaimUnshielded,\n useCofheTokenClaimable,\n useCofheTokensClaimable,\n useCofheTokenDecryptedBalance,\n useCofheTokenTransfer,\n useTransactionReceiptsByHash,\n ETH_ADDRESS_LOWERCASE,\n type Erc20Pair,\n type UnshieldClaim,\n type UnshieldClaimsSummary,\n type UnshieldClaimsSummaryByTokenAddress,\n type ClaimableAmountByTokenAddress,\n type UseTransactionReceiptsByHashInput,\n useCoingeckoUsdPrice,\n type UseCoingeckoUsdPriceInput,\n type UseCoingeckoUsdPriceOptions,\n useCoingeckoContractMarketChartRange,\n type CoingeckoMarketChartPoint,\n type UseCoingeckoContractMarketChartRangeInput,\n type UseCoingeckoContractMarketChartRangeOptions,\n} from '@/hooks/index';\n\nexport { useCofheEncryptAndWriteContract } from '@/hooks/useCofheEncryptAndWriteContract';\nexport { useCofheReadContractAndDecrypt } from '@/hooks/useCofheReadContractAndDecrypt';\n\n// Components\nexport { FnxEncryptInput, FnxFloatingButtonWithProvider } from './components/index';\nexport { MainPage, SettingsPage } from './components/FnxFloatingButton/pages/index';\n\n// Utils\nexport {\n FheTypesList,\n fheTypeToString,\n encryptedValueToString,\n getBlockExplorerUrl,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n formatRelativeTime,\n truncateHash,\n isEthPair,\n isWrappedEthToken,\n} from './utils/index';\n\n// Stores\nexport {\n useTransactionStore,\n TransactionStatus,\n TransactionActionType,\n actionToString,\n statusToString,\n type Transaction,\n type TransactionStore,\n type TransactionStatusString,\n type TransactionActionString,\n} from './stores/transactionStore';\n\nexport { createCofheConfig } from './config';\n\n// Types\nexport type { CofheContextValue, CofheProviderProps, CofheClientConfig } from './types/index';\n\nexport type { FnxFloatingButtonProps } from './components/FnxFloatingButton/types';\n\nexport type { FloatingButtonPosition } from './components/FnxFloatingButton/types';\n\nexport { createCofheClient } from '@cofhe/sdk/web';\n\nexport { useCofheNavigateToCreatePermit } from '@/hooks/permits/useCofheNavigateToCreatePermit';\nexport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\n\nexport type { CofheConfigWithReact as CofhesdkConfigWithReact } from './config';\n\nexport type { Token } from './types/token';\n\nexport { useInternalQueryClient } from './providers/index';\n"],"mappings":"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","names":["assert","createContext","useContext","useMemo","useState","createContext","useContext","TransactionStatus","TransactionActionType","useMemo","useMemo","import_ts_essentials","useMemo","useSyncExternalStore","DEFAULT_SNAPSHOT_GETTER","useMemo","useSyncExternalStore","useContext","useMemo","useInternalQueries","useMemo","parseAbi","import_ts_essentials","create","createJSONStorage","persist","bigintStorage","createJSONStorage","create","persist","useMemo","import_ts_essentials","queryKey","import_ts_essentials","useMemo","filter","create","useMemo","create","create","create","useMemo","create","jsx","jsx","jsxs","create","jsx","useInternalQueries","useCallback","useEffect","useMemo","useRef","import_ts_essentials","useMemo","useMemo","useInternalQueries","import_ts_essentials","useMemo","abortError","sleep","useMemo","useInternalQueries","useCallback","filter","useMemo","useEffect","useRef","import_ts_essentials","FheTypes","CofheError","import_ts_essentials","CofheError","FheTypes","import_ts_essentials","useCallback","useMemo","useState","import_ts_essentials","import_ts_essentials","import_ts_essentials","useMemo","import_ts_essentials","filter","useMemo","useEffect","useRef","transaction","useEffect","useRef","transaction","import_ts_essentials","import_ts_essentials","useMemo","useMemo","filter","import_ts_essentials","useMemo","useMemo","useMemo","useInternalQueries","queryKey","useMemo","import_ts_essentials","transformEncryptedReturnTypes","QUERY_CACHE_PREFIX","serializeIfBigint","serializeBigintRecursively","useMemo","useMemo","useMemo","useInternalQueries","useState","useCallback","useMemo","useCallback","useState","create","createJSONStorage","persist","useState","useCallback","useCallback","useMemo","useCallback","useMemo","useCallback","useState","useCallback","PermitUtils","useState","useCallback","useCallback","useMemo","PermitUtils","useCallback","useEffect","useRef","useState","useMemo","PermitUtils","useCallback","useCallback","useEffect","useMemo","useEffect","useInternalQueries","useMemo","useCallback","useEffect","useEffect","useRef","url","res","json","useEffect","useRef","useRef","useEffect","useEffect","useEffect","jsx","createContext","useContext","jsx","jsx","jsxs","motion","jsx","motion","useMemo","AnimatePresence","motion","jsx","Fragment","jsx","jsxs","useMemo","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","jsx","jsxs","jsx","__default","jsx","__default","jsx","jsxs","jsx","jsxs","useState","useEffect","jsx","useState","useEffect","jsx","jsxs","sizeClasses","jsx","jsxs","sizeClasses","jsx","jsx","jsx","jsxs","GoArrowUpRight","TbShieldPlus","import_ts_essentials","jsx","jsxs","jsx","jsxs","jsx","jsxs","sizeClasses","useMemo","jsx","jsxs","useMemo","start","end","mid","jsx","jsxs","jsx","jsxs","iconClassName","jsx","jsxs","TbShieldPlus","GoArrowUpRight","jsx","create","persist","ShieldPageVariant","jsx","jsxs","ArrowBackIcon","createContext","useCallback","useContext","useMemo","useState","jsx","jsxs","createContext","useState","useCallback","useMemo","useContext","jsx","jsxs","jsx","zeroAddress","useMemo","jsx","useMemo","Fragment","jsx","jsxs","CopyButton","zeroAddress","Fragment","jsx","jsxs","ArrowBackIcon","permit","ArrowBackIcon","jsx","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","error","ArrowBackIcon","ArrowBackIcon","jsx","jsxs","jsx","jsxs","error","ArrowBackIcon","ArrowBackIcon","jsx","Fragment","jsx","jsxs","ArrowBackIcon","sepolia","useMemo","ArrowBackIcon","useMemo","Fragment","jsx","jsxs","useMemo","useMemo","formatUnits","jsx","jsxs","money","useMemo","formatUnits","Fragment","jsx","jsxs","sepolia","useMemo","ArrowBackIcon","useState","useMemo","ArrowBackIcon","KeyboardArrowRightIcon","isAddress","import_ts_essentials","Fragment","jsx","jsxs","useState","error","useMemo","isValidAddress","isAddress","ArrowBackIcon","token","KeyboardArrowRightIcon","ArrowBackIcon","TbShieldPlus","TbShieldMinus","LuExternalLink","useState","import_ts_essentials","useCallback","filter","Fragment","jsx","jsxs","useState","LuExternalLink","error","TbShieldPlus","TbShieldMinus","ArrowBackIcon","token","ArrowBackIcon","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","useState","Fragment","jsx","jsxs","useState","ArrowBackIcon","create","ArrowBackIcon","KeyboardArrowRightIcon","sepolia","jsx","jsxs","sepolia","KeyboardArrowRightIcon","Fragment","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","jsx","jsxs","ArrowBackIcon","ArrowBackIcon","useMemo","import_ts_essentials","jsx","jsxs","useMemo","ArrowBackIcon","AnimatePresence","motion","CloseIcon","jsx","jsxs","CloseIcon","CloseIcon","jsx","jsxs","CloseIcon","FaCheck","FaRegCopy","CloseIcon","useCallback","useState","jsx","jsxs","PermitTypeLabel","CloseIcon","FaCheck","FaRegCopy","CloseIcon","jsx","jsxs","CloseIcon","Fragment","jsx","jsxs","PermitTypeLabel","Fragment","jsx","jsxs","Fragment","jsx","jsxs","useRef","useEffect","useMemo","AnimatePresence","motion","isValidElement","useEffect","useRef","motion","AnimatePresence","jsx","jsxs","useRef","useEffect","paused","isValidElement","motion","AnimatePresence","jsx","jsxs","jsx","jsxs","isAddress","zeroAddress","import_ts_essentials","jsx","jsxs","createContext","useMemo","useState","useContext","useState","useRef","useEffect","useMemo","KeyboardArrowDownIcon","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","sizeClasses","errorMessage","ShieldIcon","KeyboardArrowDownIcon","createCofheClient"]}
|