@txnlab/use-wallet 0.1.21 → 0.1.23

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.
Files changed (80) hide show
  1. package/dist/cjs/clients/algosigner.d.ts +1 -1
  2. package/dist/cjs/clients/base.d.ts +4 -4
  3. package/dist/cjs/clients/defly.d.ts +1 -1
  4. package/dist/cjs/clients/exodus.d.ts +1 -1
  5. package/dist/cjs/clients/kmd.d.ts +1 -1
  6. package/dist/cjs/clients/myalgowallet.d.ts +1 -1
  7. package/dist/cjs/clients/perawallet.d.ts +1 -1
  8. package/dist/cjs/clients/walletconnect.d.ts +1 -1
  9. package/dist/cjs/hooks/useWallet.d.ts +2 -2
  10. package/dist/cjs/index.d.ts +2 -0
  11. package/dist/cjs/index.js +1967 -327
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/providers/index.d.ts +7 -7
  14. package/dist/cjs/store/state/walletStore.d.ts +17 -1
  15. package/dist/esm/clients/algosigner.d.ts +1 -1
  16. package/dist/esm/clients/base.d.ts +4 -4
  17. package/dist/esm/clients/defly.d.ts +1 -1
  18. package/dist/esm/clients/exodus.d.ts +1 -1
  19. package/dist/esm/clients/kmd.d.ts +1 -1
  20. package/dist/esm/clients/myalgowallet.d.ts +1 -1
  21. package/dist/esm/clients/perawallet.d.ts +1 -1
  22. package/dist/esm/clients/walletconnect.d.ts +1 -1
  23. package/dist/esm/hooks/useWallet.d.ts +2 -2
  24. package/dist/esm/index.d.ts +2 -0
  25. package/dist/esm/index.js +1943 -300
  26. package/dist/esm/providers/index.d.ts +7 -7
  27. package/dist/esm/store/state/walletStore.d.ts +17 -1
  28. package/dist/index.d.ts +65 -3
  29. package/package.json +10 -10
  30. package/dist/cjs/base-9794b627.js +0 -174
  31. package/dist/cjs/base-9794b627.js.map +0 -1
  32. package/dist/cjs/clients/algosigner.js +0 -144
  33. package/dist/cjs/clients/algosigner.js.map +0 -1
  34. package/dist/cjs/clients/defly.js +0 -159
  35. package/dist/cjs/clients/defly.js.map +0 -1
  36. package/dist/cjs/clients/exodus.js +0 -118
  37. package/dist/cjs/clients/exodus.js.map +0 -1
  38. package/dist/cjs/clients/kmd.js +0 -140
  39. package/dist/cjs/clients/kmd.js.map +0 -1
  40. package/dist/cjs/clients/myalgowallet.js +0 -128
  41. package/dist/cjs/clients/myalgowallet.js.map +0 -1
  42. package/dist/cjs/clients/perawallet.js +0 -169
  43. package/dist/cjs/clients/perawallet.js.map +0 -1
  44. package/dist/cjs/clients/walletconnect.js +0 -199
  45. package/dist/cjs/clients/walletconnect.js.map +0 -1
  46. package/dist/cjs/constants-e76d1f05.js +0 -63
  47. package/dist/cjs/constants-e76d1f05.js.map +0 -1
  48. package/dist/cjs/constants.js +0 -22
  49. package/dist/cjs/constants.js.map +0 -1
  50. package/dist/cjs/providers.js +0 -81
  51. package/dist/cjs/providers.js.map +0 -1
  52. package/dist/cjs/store/middelware/immer.d.ts +0 -10
  53. package/dist/cjs/utils.js +0 -74
  54. package/dist/cjs/utils.js.map +0 -1
  55. package/dist/esm/base-71089716.js +0 -152
  56. package/dist/esm/base-71089716.js.map +0 -1
  57. package/dist/esm/clients/algosigner.js +0 -142
  58. package/dist/esm/clients/algosigner.js.map +0 -1
  59. package/dist/esm/clients/defly.js +0 -139
  60. package/dist/esm/clients/defly.js.map +0 -1
  61. package/dist/esm/clients/exodus.js +0 -116
  62. package/dist/esm/clients/exodus.js.map +0 -1
  63. package/dist/esm/clients/kmd.js +0 -138
  64. package/dist/esm/clients/kmd.js.map +0 -1
  65. package/dist/esm/clients/myalgowallet.js +0 -108
  66. package/dist/esm/clients/myalgowallet.js.map +0 -1
  67. package/dist/esm/clients/perawallet.js +0 -149
  68. package/dist/esm/clients/perawallet.js.map +0 -1
  69. package/dist/esm/clients/walletconnect.js +0 -179
  70. package/dist/esm/clients/walletconnect.js.map +0 -1
  71. package/dist/esm/constants-49b44514.js +0 -53
  72. package/dist/esm/constants-49b44514.js.map +0 -1
  73. package/dist/esm/constants.js +0 -2
  74. package/dist/esm/constants.js.map +0 -1
  75. package/dist/esm/index.js.map +0 -1
  76. package/dist/esm/providers.js +0 -77
  77. package/dist/esm/providers.js.map +0 -1
  78. package/dist/esm/store/middelware/immer.d.ts +0 -10
  79. package/dist/esm/utils.js +0 -70
  80. package/dist/esm/utils.js.map +0 -1
package/dist/cjs/index.js CHANGED
@@ -1,70 +1,103 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var constants = require('./constants-e76d1f05.js');
6
- var react = require('react');
7
- var base = require('./base-9794b627.js');
8
- var utils = require('./utils.js');
9
- var providers = require('./providers.js');
10
- require('./clients/perawallet.js');
11
- require('./clients/myalgowallet.js');
12
- require('./clients/algosigner.js');
13
- require('./clients/defly.js');
14
- require('./clients/exodus.js');
15
- require('./clients/kmd.js');
16
- require('./clients/walletconnect.js');
17
- require('@json-rpc-tools/utils');
3
+ var require$$0 = require('react');
4
+ var utils = require('@json-rpc-tools/utils');
5
+
6
+ exports.PROVIDER_ID = void 0;
7
+ (function (PROVIDER_ID) {
8
+ PROVIDER_ID["KMD_WALLET"] = "KMD Wallet";
9
+ PROVIDER_ID["PERA_WALLET"] = "Pera Wallet";
10
+ PROVIDER_ID["MYALGO_WALLET"] = "MyAlgo Wallet";
11
+ PROVIDER_ID["ALGO_SIGNER"] = "Algo Signer";
12
+ PROVIDER_ID["DEFLY"] = "Defly";
13
+ PROVIDER_ID["EXODUS"] = "Exodus";
14
+ PROVIDER_ID["WALLET_CONNECT"] = "Wallet Connect";
15
+ })(exports.PROVIDER_ID || (exports.PROVIDER_ID = {}));
16
+ const NODE_SERVER = process.env.NODE_SERVER ||
17
+ process.env.REACT_APP_NODE_SERVER ||
18
+ process.env.NEXT_PUBLIC_NODE_SERVER ||
19
+ /** @todo deprecate this env var */
20
+ process.env.NEXT_PUBLIC_NODE_URL ||
21
+ "https://mainnet-api.algonode.cloud";
22
+ const NODE_TOKEN = process.env.NODE_TOKEN ||
23
+ process.env.REACT_APP_NODE_TOKEN ||
24
+ process.env.NEXT_PUBLIC_NODE_TOKEN ||
25
+ "";
26
+ const NODE_PORT = process.env.NODE_PORT ||
27
+ process.env.REACT_APP_NODE_PORT ||
28
+ process.env.NEXT_PUBLIC_NODE_PORT ||
29
+ "";
30
+ const NODE_NETWORK = process.env.NODE_NETWORK ||
31
+ process.env.REACT_APP_NODE_NETWORK ||
32
+ process.env.NEXT_PUBLIC_NODE_NETWORK ||
33
+ /** @todo deprecate this env var */
34
+ process.env.NEXT_PUBLIC_VERCEL_ENV ||
35
+ "mainnet";
36
+ const KMD_HOST = process.env.KMD_HOST ||
37
+ process.env.REACT_APP_KMD_HOST ||
38
+ process.env.NEXT_PUBLIC_KMD_HOST ||
39
+ "http://localhost";
40
+ const KMD_TOKEN = process.env.KMD_TOKEN ||
41
+ process.env.REACT_APP_KMD_TOKEN ||
42
+ process.env.NEXT_PUBLIC_KMD_TOKEN ||
43
+ "a".repeat(64);
44
+ const KMD_PORT = process.env.KMD_PORT ||
45
+ process.env.REACT_APP_KMD_PORT ||
46
+ process.env.NEXT_PUBLIC_KMD_PORT ||
47
+ "4002";
48
+ const KMD_WALLET$1 = process.env.KMD_WALLET ||
49
+ process.env.REACT_APP_KMD_WALLET ||
50
+ process.env.NEXT_PUBLIC_KMD_WALLET ||
51
+ "unencrypted-default-wallet";
52
+ const KMD_PASSWORD = process.env.KMD_PASSWORD ||
53
+ process.env.REACT_APP_KMD_PASSWORD ||
54
+ process.env.NEXT_PUBLIC_KMD_PASSWORD ||
55
+ "";
56
+
57
+ const getAlgosdk = async () => {
58
+ return (await import('algosdk')).default;
59
+ };
60
+ const getAlgodClient = async (algosdk) => {
61
+ return new algosdk.Algodv2(NODE_TOKEN, NODE_SERVER, NODE_PORT);
62
+ };
63
+ class Algod {
64
+ algosdk;
65
+ algodClient;
66
+ constructor(algosdk, algodClient) {
67
+ this.algosdk = algosdk;
68
+ this.algodClient = algodClient;
69
+ }
70
+ static async init() {
71
+ const algosdk = await getAlgosdk();
72
+ const algodClient = await getAlgodClient(algosdk);
73
+ return new Algod(algosdk, algodClient);
74
+ }
75
+ }
18
76
 
19
77
  function n(n){for(var r=arguments.length,t=Array(r>1?r-1:0),e=1;e<r;e++)t[e-1]=arguments[e];if("production"!==process.env.NODE_ENV){var i=Y[n],o=i?"function"==typeof i?i.apply(null,t):i:"unknown error nr: "+n;throw Error("[Immer] "+o)}throw Error("[Immer] minified error nr: "+n+(t.length?" "+t.map((function(n){return "'"+n+"'"})).join(","):"")+". Find the full error at: https://bit.ly/3cXEKWf")}function r(n){return !!n&&!!n[Q]}function t(n){return !!n&&(function(n){if(!n||"object"!=typeof n)return !1;var r=Object.getPrototypeOf(n);if(null===r)return !0;var t=Object.hasOwnProperty.call(r,"constructor")&&r.constructor;return t===Object||"function"==typeof t&&Function.toString.call(t)===Z}(n)||Array.isArray(n)||!!n[L]||!!n.constructor[L]||s(n)||v(n))}function i(n,r,t){void 0===t&&(t=!1),0===o(n)?(t?Object.keys:nn)(n).forEach((function(e){t&&"symbol"==typeof e||r(e,n[e],n);})):n.forEach((function(t,e){return r(e,t,n)}));}function o(n){var r=n[Q];return r?r.i>3?r.i-4:r.i:Array.isArray(n)?1:s(n)?2:v(n)?3:0}function u(n,r){return 2===o(n)?n.has(r):Object.prototype.hasOwnProperty.call(n,r)}function a(n,r){return 2===o(n)?n.get(r):n[r]}function f(n,r,t){var e=o(n);2===e?n.set(r,t):3===e?(n.delete(r),n.add(t)):n[r]=t;}function c(n,r){return n===r?0!==n||1/n==1/r:n!=n&&r!=r}function s(n){return X&&n instanceof Map}function v(n){return q&&n instanceof Set}function p(n){return n.o||n.t}function l(n){if(Array.isArray(n))return Array.prototype.slice.call(n);var r=rn(n);delete r[Q];for(var t=nn(r),e=0;e<t.length;e++){var i=t[e],o=r[i];!1===o.writable&&(o.writable=!0,o.configurable=!0),(o.get||o.set)&&(r[i]={configurable:!0,writable:!0,enumerable:o.enumerable,value:n[i]});}return Object.create(Object.getPrototypeOf(n),r)}function d(n,e){return void 0===e&&(e=!1),y(n)||r(n)||!t(n)?n:(o(n)>1&&(n.set=n.add=n.clear=n.delete=h),Object.freeze(n),e&&i(n,(function(n,r){return d(r,!0)}),!0),n)}function h(){n(2);}function y(n){return null==n||"object"!=typeof n||Object.isFrozen(n)}function b(r){var t=tn[r];return t||n(18,r),t}function _(){return "production"===process.env.NODE_ENV||U||n(0),U}function j(n,r){r&&(b("Patches"),n.u=[],n.s=[],n.v=r);}function O(n){g(n),n.p.forEach(S),n.p=null;}function g(n){n===U&&(U=n.l);}function w(n){return U={p:[],l:U,h:n,m:!0,_:0}}function S(n){var r=n[Q];0===r.i||1===r.i?r.j():r.O=!0;}function P(r,e){e._=e.p.length;var i=e.p[0],o=void 0!==r&&r!==i;return e.h.g||b("ES5").S(e,r,o),o?(i[Q].P&&(O(e),n(4)),t(r)&&(r=M(e,r),e.l||x(e,r)),e.u&&b("Patches").M(i[Q].t,r,e.u,e.s)):r=M(e,i,[]),O(e),e.u&&e.v(e.u,e.s),r!==H?r:void 0}function M(n,r,t){if(y(r))return r;var e=r[Q];if(!e)return i(r,(function(i,o){return A(n,e,r,i,o,t)}),!0),r;if(e.A!==n)return r;if(!e.P)return x(n,e.t,!0),e.t;if(!e.I){e.I=!0,e.A._--;var o=4===e.i||5===e.i?e.o=l(e.k):e.o;i(3===e.i?new Set(o):o,(function(r,i){return A(n,e,o,r,i,t)})),x(n,o,!1),t&&n.u&&b("Patches").R(e,t,n.u,n.s);}return e.o}function A(e,i,o,a,c,s){if("production"!==process.env.NODE_ENV&&c===o&&n(5),r(c)){var v=M(e,c,s&&i&&3!==i.i&&!u(i.D,a)?s.concat(a):void 0);if(f(o,a,v),!r(v))return;e.m=!1;}if(t(c)&&!y(c)){if(!e.h.F&&e._<1)return;M(e,c),i&&i.A.l||x(e,c);}}function x(n,r,t){void 0===t&&(t=!1),n.h.F&&n.m&&d(r,t);}function z(n,r){var t=n[Q];return (t?p(t):n)[r]}function I(n,r){if(r in n)for(var t=Object.getPrototypeOf(n);t;){var e=Object.getOwnPropertyDescriptor(t,r);if(e)return e;t=Object.getPrototypeOf(t);}}function k(n){n.P||(n.P=!0,n.l&&k(n.l));}function E(n){n.o||(n.o=l(n.t));}function R(n,r,t){var e=s(r)?b("MapSet").N(r,t):v(r)?b("MapSet").T(r,t):n.g?function(n,r){var t=Array.isArray(n),e={i:t?1:0,A:r?r.A:_(),P:!1,I:!1,D:{},l:r,t:n,k:null,o:null,j:null,C:!1},i=e,o=en;t&&(i=[e],o=on);var u=Proxy.revocable(i,o),a=u.revoke,f=u.proxy;return e.k=f,e.j=a,f}(r,t):b("ES5").J(r,t);return (t?t.A:_()).p.push(e),e}function D(e){return r(e)||n(22,e),function n(r){if(!t(r))return r;var e,u=r[Q],c=o(r);if(u){if(!u.P&&(u.i<4||!b("ES5").K(u)))return u.t;u.I=!0,e=F(r,c),u.I=!1;}else e=F(r,c);return i(e,(function(r,t){u&&a(u.t,r)===t||f(e,r,n(t));})),3===c?new Set(e):e}(e)}function F(n,r){switch(r){case 2:return new Map(n);case 3:return Array.from(n)}return l(n)}var G,U,W="undefined"!=typeof Symbol&&"symbol"==typeof Symbol("x"),X="undefined"!=typeof Map,q="undefined"!=typeof Set,B="undefined"!=typeof Proxy&&void 0!==Proxy.revocable&&"undefined"!=typeof Reflect,H=W?Symbol.for("immer-nothing"):((G={})["immer-nothing"]=!0,G),L=W?Symbol.for("immer-draftable"):"__$immer_draftable",Q=W?Symbol.for("immer-state"):"__$immer_state",Y={0:"Illegal state",1:"Immer drafts cannot have computed properties",2:"This object has been frozen and should not be mutated",3:function(n){return "Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+n},4:"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.",5:"Immer forbids circular references",6:"The first or second argument to `produce` must be a function",7:"The third argument to `produce` must be a function or undefined",8:"First argument to `createDraft` must be a plain object, an array, or an immerable object",9:"First argument to `finishDraft` must be a draft returned by `createDraft`",10:"The given draft is already finalized",11:"Object.defineProperty() cannot be used on an Immer draft",12:"Object.setPrototypeOf() cannot be used on an Immer draft",13:"Immer only supports deleting array indices",14:"Immer only supports setting array indices and the 'length' property",15:function(n){return "Cannot apply patch, path doesn't resolve: "+n},16:'Sets cannot have "replace" patches.',17:function(n){return "Unsupported patch operation: "+n},18:function(n){return "The plugin for '"+n+"' has not been loaded into Immer. To enable the plugin, import and call `enable"+n+"()` when initializing your application."},20:"Cannot use proxies if Proxy, Proxy.revocable or Reflect are not available",21:function(n){return "produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '"+n+"'"},22:function(n){return "'current' expects a draft, got: "+n},23:function(n){return "'original' expects a draft, got: "+n},24:"Patching reserved attributes like __proto__, prototype and constructor is not allowed"},Z=""+Object.prototype.constructor,nn="undefined"!=typeof Reflect&&Reflect.ownKeys?Reflect.ownKeys:void 0!==Object.getOwnPropertySymbols?function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:Object.getOwnPropertyNames,rn=Object.getOwnPropertyDescriptors||function(n){var r={};return nn(n).forEach((function(t){r[t]=Object.getOwnPropertyDescriptor(n,t);})),r},tn={},en={get:function(n,r){if(r===Q)return n;var e=p(n);if(!u(e,r))return function(n,r,t){var e,i=I(r,t);return i?"value"in i?i.value:null===(e=i.get)||void 0===e?void 0:e.call(n.k):void 0}(n,e,r);var i=e[r];return n.I||!t(i)?i:i===z(n.t,r)?(E(n),n.o[r]=R(n.A.h,i,n)):i},has:function(n,r){return r in p(n)},ownKeys:function(n){return Reflect.ownKeys(p(n))},set:function(n,r,t){var e=I(p(n),r);if(null==e?void 0:e.set)return e.set.call(n.k,t),!0;if(!n.P){var i=z(p(n),r),o=null==i?void 0:i[Q];if(o&&o.t===t)return n.o[r]=t,n.D[r]=!1,!0;if(c(t,i)&&(void 0!==t||u(n.t,r)))return !0;E(n),k(n);}return n.o[r]===t&&"number"!=typeof t&&(void 0!==t||r in n.o)||(n.o[r]=t,n.D[r]=!0,!0)},deleteProperty:function(n,r){return void 0!==z(n.t,r)||r in n.t?(n.D[r]=!1,E(n),k(n)):delete n.D[r],n.o&&delete n.o[r],!0},getOwnPropertyDescriptor:function(n,r){var t=p(n),e=Reflect.getOwnPropertyDescriptor(t,r);return e?{writable:!0,configurable:1!==n.i||"length"!==r,enumerable:e.enumerable,value:t[r]}:e},defineProperty:function(){n(11);},getPrototypeOf:function(n){return Object.getPrototypeOf(n.t)},setPrototypeOf:function(){n(12);}},on={};i(en,(function(n,r){on[n]=function(){return arguments[0]=arguments[0][0],r.apply(this,arguments)};})),on.deleteProperty=function(r,t){return "production"!==process.env.NODE_ENV&&isNaN(parseInt(t))&&n(13),on.set.call(this,r,t,void 0)},on.set=function(r,t,e){return "production"!==process.env.NODE_ENV&&"length"!==t&&isNaN(parseInt(t))&&n(14),en.set.call(this,r[0],t,e,r[0])};var un=function(){function e(r){var e=this;this.g=B,this.F=!0,this.produce=function(r,i,o){if("function"==typeof r&&"function"!=typeof i){var u=i;i=r;var a=e;return function(n){var r=this;void 0===n&&(n=u);for(var t=arguments.length,e=Array(t>1?t-1:0),o=1;o<t;o++)e[o-1]=arguments[o];return a.produce(n,(function(n){var t;return (t=i).call.apply(t,[r,n].concat(e))}))}}var f;if("function"!=typeof i&&n(6),void 0!==o&&"function"!=typeof o&&n(7),t(r)){var c=w(e),s=R(e,r,void 0),v=!0;try{f=i(s),v=!1;}finally{v?O(c):g(c);}return "undefined"!=typeof Promise&&f instanceof Promise?f.then((function(n){return j(c,o),P(n,c)}),(function(n){throw O(c),n})):(j(c,o),P(f,c))}if(!r||"object"!=typeof r){if(void 0===(f=i(r))&&(f=r),f===H&&(f=void 0),e.F&&d(f,!0),o){var p=[],l=[];b("Patches").M(r,f,p,l),o(p,l);}return f}n(21,r);},this.produceWithPatches=function(n,r){if("function"==typeof n)return function(r){for(var t=arguments.length,i=Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];return e.produceWithPatches(r,(function(r){return n.apply(void 0,[r].concat(i))}))};var t,i,o=e.produce(n,r,(function(n,r){t=n,i=r;}));return "undefined"!=typeof Promise&&o instanceof Promise?o.then((function(n){return [n,t,i]})):[o,t,i]},"boolean"==typeof(null==r?void 0:r.useProxies)&&this.setUseProxies(r.useProxies),"boolean"==typeof(null==r?void 0:r.autoFreeze)&&this.setAutoFreeze(r.autoFreeze);}var i=e.prototype;return i.createDraft=function(e){t(e)||n(8),r(e)&&(e=D(e));var i=w(this),o=R(this,e,void 0);return o[Q].C=!0,g(i),o},i.finishDraft=function(r,t){var e=r&&r[Q];"production"!==process.env.NODE_ENV&&(e&&e.C||n(9),e.I&&n(10));var i=e.A;return j(i,t),P(void 0,i)},i.setAutoFreeze=function(n){this.F=n;},i.setUseProxies=function(r){r&&!B&&n(20),this.g=r;},i.applyPatches=function(n,t){var e;for(e=t.length-1;e>=0;e--){var i=t[e];if(0===i.path.length&&"replace"===i.op){n=i.value;break}}e>-1&&(t=t.slice(e+1));var o=b("Patches").$;return r(n)?o(n,t):this.produce(n,(function(n){return o(n,t)}))},e}(),an=new un,fn=an.produce;an.produceWithPatches.bind(an);an.setAutoFreeze.bind(an);an.setUseProxies.bind(an);an.applyPatches.bind(an);an.createDraft.bind(an);an.finishDraft.bind(an);
20
78
 
21
- /**
22
- * The immer middleware turns the `set` method into a proxy for the immer `produce` method.
23
- * https://immerjs.github.io/immer/
24
- *
25
- * The TypeScript magic is taken from here:
26
- * https://github.com/pmndrs/zustand/blob/main/tests/middlewareTypes.test.tsx
27
- */
28
- const immer = (config) => (set, get, api) => {
29
- // see https://github.com/pmndrs/zustand/issues/449#issuecomment-873777576
30
- api.setState = (fn$1) => set(fn(fn$1));
31
- return config((partial, replace) => {
32
- const nextState = typeof partial === "function"
33
- ? fn(partial)
34
- : partial;
35
- return set(nextState, replace);
36
- }, get, api);
79
+ const immerImpl = (initializer) => (set, get, store) => {
80
+ store.setState = (updater, replace, ...a) => {
81
+ const nextState = typeof updater === "function" ? fn(updater) : updater;
82
+ return set(nextState, replace, ...a);
83
+ };
84
+ return initializer(store.setState, get, store);
37
85
  };
86
+ const immer = immerImpl;
38
87
 
39
- function createStore(createState) {
88
+ const createStoreImpl = (createState) => {
40
89
  let state;
41
90
  const listeners = /* @__PURE__ */ new Set();
42
91
  const setState = (partial, replace) => {
43
92
  const nextState = typeof partial === "function" ? partial(state) : partial;
44
- if (nextState !== state) {
93
+ if (!Object.is(nextState, state)) {
45
94
  const previousState = state;
46
- state = replace ? nextState : Object.assign({}, state, nextState);
95
+ state = (replace != null ? replace : typeof nextState !== "object") ? nextState : Object.assign({}, state, nextState);
47
96
  listeners.forEach((listener) => listener(state, previousState));
48
97
  }
49
98
  };
50
99
  const getState = () => state;
51
- const subscribeWithSelector = (listener, selector = getState, equalityFn = Object.is) => {
52
- console.warn("[DEPRECATED] Please use `subscribeWithSelector` middleware");
53
- let currentSlice = selector(state);
54
- function listenerToAdd() {
55
- const nextSlice = selector(state);
56
- if (!equalityFn(currentSlice, nextSlice)) {
57
- const previousSlice = currentSlice;
58
- listener(currentSlice = nextSlice, previousSlice);
59
- }
60
- }
61
- listeners.add(listenerToAdd);
62
- return () => listeners.delete(listenerToAdd);
63
- };
64
- const subscribe = (listener, selector, equalityFn) => {
65
- if (selector || equalityFn) {
66
- return subscribeWithSelector(listener, selector, equalityFn);
67
- }
100
+ const subscribe = (listener) => {
68
101
  listeners.add(listener);
69
102
  return () => listeners.delete(listener);
70
103
  };
@@ -72,170 +105,588 @@ function createStore(createState) {
72
105
  const api = { setState, getState, subscribe, destroy };
73
106
  state = createState(setState, getState, api);
74
107
  return api;
108
+ };
109
+ const createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;
110
+
111
+ function getDefaultExportFromCjs (x) {
112
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
113
+ }
114
+
115
+ var withSelector = {exports: {}};
116
+
117
+ var withSelector_production_min = {};
118
+
119
+ var shim = {exports: {}};
120
+
121
+ var useSyncExternalStoreShim_production_min = {};
122
+
123
+ /**
124
+ * @license React
125
+ * use-sync-external-store-shim.production.min.js
126
+ *
127
+ * Copyright (c) Facebook, Inc. and its affiliates.
128
+ *
129
+ * This source code is licensed under the MIT license found in the
130
+ * LICENSE file in the root directory of this source tree.
131
+ */
132
+
133
+ var hasRequiredUseSyncExternalStoreShim_production_min;
134
+
135
+ function requireUseSyncExternalStoreShim_production_min () {
136
+ if (hasRequiredUseSyncExternalStoreShim_production_min) return useSyncExternalStoreShim_production_min;
137
+ hasRequiredUseSyncExternalStoreShim_production_min = 1;
138
+ var e=require$$0;function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k="function"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c});},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c});})},[a]);p(d);return d}
139
+ function r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return !k(a,d)}catch(f){return !0}}function t(a,b){return b()}var u="undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement?t:q;useSyncExternalStoreShim_production_min.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;
140
+ return useSyncExternalStoreShim_production_min;
141
+ }
142
+
143
+ var useSyncExternalStoreShim_development = {};
144
+
145
+ /**
146
+ * @license React
147
+ * use-sync-external-store-shim.development.js
148
+ *
149
+ * Copyright (c) Facebook, Inc. and its affiliates.
150
+ *
151
+ * This source code is licensed under the MIT license found in the
152
+ * LICENSE file in the root directory of this source tree.
153
+ */
154
+
155
+ var hasRequiredUseSyncExternalStoreShim_development;
156
+
157
+ function requireUseSyncExternalStoreShim_development () {
158
+ if (hasRequiredUseSyncExternalStoreShim_development) return useSyncExternalStoreShim_development;
159
+ hasRequiredUseSyncExternalStoreShim_development = 1;
160
+
161
+ if (process.env.NODE_ENV !== "production") {
162
+ (function() {
163
+
164
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
165
+ if (
166
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
167
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
168
+ 'function'
169
+ ) {
170
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
171
+ }
172
+ var React = require$$0;
173
+
174
+ var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
175
+
176
+ function error(format) {
177
+ {
178
+ {
179
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
180
+ args[_key2 - 1] = arguments[_key2];
181
+ }
182
+
183
+ printWarning('error', format, args);
184
+ }
185
+ }
186
+ }
187
+
188
+ function printWarning(level, format, args) {
189
+ // When changing this logic, you might want to also
190
+ // update consoleWithStackDev.www.js as well.
191
+ {
192
+ var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
193
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
194
+
195
+ if (stack !== '') {
196
+ format += '%s';
197
+ args = args.concat([stack]);
198
+ } // eslint-disable-next-line react-internal/safe-string-coercion
199
+
200
+
201
+ var argsWithFormat = args.map(function (item) {
202
+ return String(item);
203
+ }); // Careful: RN currently depends on this prefix
204
+
205
+ argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
206
+ // breaks IE9: https://github.com/facebook/react/issues/13610
207
+ // eslint-disable-next-line react-internal/no-production-logging
208
+
209
+ Function.prototype.apply.call(console[level], console, argsWithFormat);
210
+ }
211
+ }
212
+
213
+ /**
214
+ * inlined Object.is polyfill to avoid requiring consumers ship their own
215
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
216
+ */
217
+ function is(x, y) {
218
+ return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
219
+ ;
220
+ }
221
+
222
+ var objectIs = typeof Object.is === 'function' ? Object.is : is;
223
+
224
+ // dispatch for CommonJS interop named imports.
225
+
226
+ var useState = React.useState,
227
+ useEffect = React.useEffect,
228
+ useLayoutEffect = React.useLayoutEffect,
229
+ useDebugValue = React.useDebugValue;
230
+ var didWarnOld18Alpha = false;
231
+ var didWarnUncachedGetSnapshot = false; // Disclaimer: This shim breaks many of the rules of React, and only works
232
+ // because of a very particular set of implementation details and assumptions
233
+ // -- change any one of them and it will break. The most important assumption
234
+ // is that updates are always synchronous, because concurrent rendering is
235
+ // only available in versions of React that also have a built-in
236
+ // useSyncExternalStore API. And we only use this shim when the built-in API
237
+ // does not exist.
238
+ //
239
+ // Do not assume that the clever hacks used by this hook also work in general.
240
+ // The point of this shim is to replace the need for hacks by other libraries.
241
+
242
+ function useSyncExternalStore(subscribe, getSnapshot, // Note: The shim does not use getServerSnapshot, because pre-18 versions of
243
+ // React do not expose a way to check if we're hydrating. So users of the shim
244
+ // will need to track that themselves and return the correct value
245
+ // from `getSnapshot`.
246
+ getServerSnapshot) {
247
+ {
248
+ if (!didWarnOld18Alpha) {
249
+ if (React.startTransition !== undefined) {
250
+ didWarnOld18Alpha = true;
251
+
252
+ error('You are using an outdated, pre-release alpha of React 18 that ' + 'does not support useSyncExternalStore. The ' + 'use-sync-external-store shim will not work correctly. Upgrade ' + 'to a newer pre-release.');
253
+ }
254
+ }
255
+ } // Read the current snapshot from the store on every render. Again, this
256
+ // breaks the rules of React, and only works here because of specific
257
+ // implementation details, most importantly that updates are
258
+ // always synchronous.
259
+
260
+
261
+ var value = getSnapshot();
262
+
263
+ {
264
+ if (!didWarnUncachedGetSnapshot) {
265
+ var cachedValue = getSnapshot();
266
+
267
+ if (!objectIs(value, cachedValue)) {
268
+ error('The result of getSnapshot should be cached to avoid an infinite loop');
269
+
270
+ didWarnUncachedGetSnapshot = true;
271
+ }
272
+ }
273
+ } // Because updates are synchronous, we don't queue them. Instead we force a
274
+ // re-render whenever the subscribed state changes by updating an some
275
+ // arbitrary useState hook. Then, during render, we call getSnapshot to read
276
+ // the current value.
277
+ //
278
+ // Because we don't actually use the state returned by the useState hook, we
279
+ // can save a bit of memory by storing other stuff in that slot.
280
+ //
281
+ // To implement the early bailout, we need to track some things on a mutable
282
+ // object. Usually, we would put that in a useRef hook, but we can stash it in
283
+ // our useState hook instead.
284
+ //
285
+ // To force a re-render, we call forceUpdate({inst}). That works because the
286
+ // new object always fails an equality check.
287
+
288
+
289
+ var _useState = useState({
290
+ inst: {
291
+ value: value,
292
+ getSnapshot: getSnapshot
293
+ }
294
+ }),
295
+ inst = _useState[0].inst,
296
+ forceUpdate = _useState[1]; // Track the latest getSnapshot function with a ref. This needs to be updated
297
+ // in the layout phase so we can access it during the tearing check that
298
+ // happens on subscribe.
299
+
300
+
301
+ useLayoutEffect(function () {
302
+ inst.value = value;
303
+ inst.getSnapshot = getSnapshot; // Whenever getSnapshot or subscribe changes, we need to check in the
304
+ // commit phase if there was an interleaved mutation. In concurrent mode
305
+ // this can happen all the time, but even in synchronous mode, an earlier
306
+ // effect may have mutated the store.
307
+
308
+ if (checkIfSnapshotChanged(inst)) {
309
+ // Force a re-render.
310
+ forceUpdate({
311
+ inst: inst
312
+ });
313
+ }
314
+ }, [subscribe, value, getSnapshot]);
315
+ useEffect(function () {
316
+ // Check for changes right before subscribing. Subsequent changes will be
317
+ // detected in the subscription handler.
318
+ if (checkIfSnapshotChanged(inst)) {
319
+ // Force a re-render.
320
+ forceUpdate({
321
+ inst: inst
322
+ });
323
+ }
324
+
325
+ var handleStoreChange = function () {
326
+ // TODO: Because there is no cross-renderer API for batching updates, it's
327
+ // up to the consumer of this library to wrap their subscription event
328
+ // with unstable_batchedUpdates. Should we try to detect when this isn't
329
+ // the case and print a warning in development?
330
+ // The store changed. Check if the snapshot changed since the last time we
331
+ // read from the store.
332
+ if (checkIfSnapshotChanged(inst)) {
333
+ // Force a re-render.
334
+ forceUpdate({
335
+ inst: inst
336
+ });
337
+ }
338
+ }; // Subscribe to the store and return a clean-up function.
339
+
340
+
341
+ return subscribe(handleStoreChange);
342
+ }, [subscribe]);
343
+ useDebugValue(value);
344
+ return value;
345
+ }
346
+
347
+ function checkIfSnapshotChanged(inst) {
348
+ var latestGetSnapshot = inst.getSnapshot;
349
+ var prevValue = inst.value;
350
+
351
+ try {
352
+ var nextValue = latestGetSnapshot();
353
+ return !objectIs(prevValue, nextValue);
354
+ } catch (error) {
355
+ return true;
356
+ }
357
+ }
358
+
359
+ function useSyncExternalStore$1(subscribe, getSnapshot, getServerSnapshot) {
360
+ // Note: The shim does not use getServerSnapshot, because pre-18 versions of
361
+ // React do not expose a way to check if we're hydrating. So users of the shim
362
+ // will need to track that themselves and return the correct value
363
+ // from `getSnapshot`.
364
+ return getSnapshot();
365
+ }
366
+
367
+ var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
368
+
369
+ var isServerEnvironment = !canUseDOM;
370
+
371
+ var shim = isServerEnvironment ? useSyncExternalStore$1 : useSyncExternalStore;
372
+ var useSyncExternalStore$2 = React.useSyncExternalStore !== undefined ? React.useSyncExternalStore : shim;
373
+
374
+ useSyncExternalStoreShim_development.useSyncExternalStore = useSyncExternalStore$2;
375
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
376
+ if (
377
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
378
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
379
+ 'function'
380
+ ) {
381
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
382
+ }
383
+
384
+ })();
385
+ }
386
+ return useSyncExternalStoreShim_development;
387
+ }
388
+
389
+ var hasRequiredShim;
390
+
391
+ function requireShim () {
392
+ if (hasRequiredShim) return shim.exports;
393
+ hasRequiredShim = 1;
394
+ (function (module) {
395
+
396
+ if (process.env.NODE_ENV === 'production') {
397
+ module.exports = requireUseSyncExternalStoreShim_production_min();
398
+ } else {
399
+ module.exports = requireUseSyncExternalStoreShim_development();
400
+ }
401
+ } (shim));
402
+ return shim.exports;
403
+ }
404
+
405
+ /**
406
+ * @license React
407
+ * use-sync-external-store-shim/with-selector.production.min.js
408
+ *
409
+ * Copyright (c) Facebook, Inc. and its affiliates.
410
+ *
411
+ * This source code is licensed under the MIT license found in the
412
+ * LICENSE file in the root directory of this source tree.
413
+ */
414
+
415
+ var hasRequiredWithSelector_production_min;
416
+
417
+ function requireWithSelector_production_min () {
418
+ if (hasRequiredWithSelector_production_min) return withSelector_production_min;
419
+ hasRequiredWithSelector_production_min = 1;
420
+ var h=require$$0,n=requireShim();function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q="function"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;
421
+ withSelector_production_min.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f;}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return [function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);
422
+ u(function(){f.hasValue=!0;f.value=d;},[d]);w(d);return d};
423
+ return withSelector_production_min;
424
+ }
425
+
426
+ var withSelector_development = {};
427
+
428
+ /**
429
+ * @license React
430
+ * use-sync-external-store-shim/with-selector.development.js
431
+ *
432
+ * Copyright (c) Facebook, Inc. and its affiliates.
433
+ *
434
+ * This source code is licensed under the MIT license found in the
435
+ * LICENSE file in the root directory of this source tree.
436
+ */
437
+
438
+ var hasRequiredWithSelector_development;
439
+
440
+ function requireWithSelector_development () {
441
+ if (hasRequiredWithSelector_development) return withSelector_development;
442
+ hasRequiredWithSelector_development = 1;
443
+
444
+ if (process.env.NODE_ENV !== "production") {
445
+ (function() {
446
+
447
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
448
+ if (
449
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
450
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart ===
451
+ 'function'
452
+ ) {
453
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
454
+ }
455
+ var React = require$$0;
456
+ var shim = requireShim();
457
+
458
+ /**
459
+ * inlined Object.is polyfill to avoid requiring consumers ship their own
460
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
461
+ */
462
+ function is(x, y) {
463
+ return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
464
+ ;
465
+ }
466
+
467
+ var objectIs = typeof Object.is === 'function' ? Object.is : is;
468
+
469
+ var useSyncExternalStore = shim.useSyncExternalStore;
470
+
471
+ // for CommonJS interop.
472
+
473
+ var useRef = React.useRef,
474
+ useEffect = React.useEffect,
475
+ useMemo = React.useMemo,
476
+ useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.
477
+
478
+ function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) {
479
+ // Use this to track the rendered snapshot.
480
+ var instRef = useRef(null);
481
+ var inst;
482
+
483
+ if (instRef.current === null) {
484
+ inst = {
485
+ hasValue: false,
486
+ value: null
487
+ };
488
+ instRef.current = inst;
489
+ } else {
490
+ inst = instRef.current;
491
+ }
492
+
493
+ var _useMemo = useMemo(function () {
494
+ // Track the memoized state using closure variables that are local to this
495
+ // memoized instance of a getSnapshot function. Intentionally not using a
496
+ // useRef hook, because that state would be shared across all concurrent
497
+ // copies of the hook/component.
498
+ var hasMemo = false;
499
+ var memoizedSnapshot;
500
+ var memoizedSelection;
501
+
502
+ var memoizedSelector = function (nextSnapshot) {
503
+ if (!hasMemo) {
504
+ // The first time the hook is called, there is no memoized result.
505
+ hasMemo = true;
506
+ memoizedSnapshot = nextSnapshot;
507
+
508
+ var _nextSelection = selector(nextSnapshot);
509
+
510
+ if (isEqual !== undefined) {
511
+ // Even if the selector has changed, the currently rendered selection
512
+ // may be equal to the new selection. We should attempt to reuse the
513
+ // current value if possible, to preserve downstream memoizations.
514
+ if (inst.hasValue) {
515
+ var currentSelection = inst.value;
516
+
517
+ if (isEqual(currentSelection, _nextSelection)) {
518
+ memoizedSelection = currentSelection;
519
+ return currentSelection;
520
+ }
521
+ }
522
+ }
523
+
524
+ memoizedSelection = _nextSelection;
525
+ return _nextSelection;
526
+ } // We may be able to reuse the previous invocation's result.
527
+
528
+
529
+ // We may be able to reuse the previous invocation's result.
530
+ var prevSnapshot = memoizedSnapshot;
531
+ var prevSelection = memoizedSelection;
532
+
533
+ if (objectIs(prevSnapshot, nextSnapshot)) {
534
+ // The snapshot is the same as last time. Reuse the previous selection.
535
+ return prevSelection;
536
+ } // The snapshot has changed, so we need to compute a new selection.
537
+
538
+
539
+ // The snapshot has changed, so we need to compute a new selection.
540
+ var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data
541
+ // has changed. If it hasn't, return the previous selection. That signals
542
+ // to React that the selections are conceptually equal, and we can bail
543
+ // out of rendering.
544
+
545
+ // If a custom isEqual function is provided, use that to check if the data
546
+ // has changed. If it hasn't, return the previous selection. That signals
547
+ // to React that the selections are conceptually equal, and we can bail
548
+ // out of rendering.
549
+ if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) {
550
+ return prevSelection;
551
+ }
552
+
553
+ memoizedSnapshot = nextSnapshot;
554
+ memoizedSelection = nextSelection;
555
+ return nextSelection;
556
+ }; // Assigning this to a constant so that Flow knows it can't change.
557
+
558
+
559
+ // Assigning this to a constant so that Flow knows it can't change.
560
+ var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot;
561
+
562
+ var getSnapshotWithSelector = function () {
563
+ return memoizedSelector(getSnapshot());
564
+ };
565
+
566
+ var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () {
567
+ return memoizedSelector(maybeGetServerSnapshot());
568
+ };
569
+ return [getSnapshotWithSelector, getServerSnapshotWithSelector];
570
+ }, [getSnapshot, getServerSnapshot, selector, isEqual]),
571
+ getSelection = _useMemo[0],
572
+ getServerSelection = _useMemo[1];
573
+
574
+ var value = useSyncExternalStore(subscribe, getSelection, getServerSelection);
575
+ useEffect(function () {
576
+ inst.hasValue = true;
577
+ inst.value = value;
578
+ }, [value]);
579
+ useDebugValue(value);
580
+ return value;
581
+ }
582
+
583
+ withSelector_development.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector;
584
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
585
+ if (
586
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' &&
587
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop ===
588
+ 'function'
589
+ ) {
590
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error());
591
+ }
592
+
593
+ })();
594
+ }
595
+ return withSelector_development;
75
596
  }
76
597
 
77
- const isSSR = typeof window === "undefined" || !window.navigator || /ServerSideRendering|^Deno\//.test(window.navigator.userAgent);
78
- const useIsomorphicLayoutEffect = isSSR ? react.useEffect : react.useLayoutEffect;
79
- function create(createState) {
598
+ (function (module) {
599
+
600
+ if (process.env.NODE_ENV === 'production') {
601
+ module.exports = requireWithSelector_production_min();
602
+ } else {
603
+ module.exports = requireWithSelector_development();
604
+ }
605
+ } (withSelector));
606
+
607
+ var useSyncExternalStoreExports = /*@__PURE__*/getDefaultExportFromCjs(withSelector.exports);
608
+
609
+ const { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;
610
+ function useStore(api, selector = api.getState, equalityFn) {
611
+ const slice = useSyncExternalStoreWithSelector(
612
+ api.subscribe,
613
+ api.getState,
614
+ api.getServerState || api.getState,
615
+ selector,
616
+ equalityFn
617
+ );
618
+ require$$0.useDebugValue(slice);
619
+ return slice;
620
+ }
621
+ const createImpl = (createState) => {
80
622
  const api = typeof createState === "function" ? createStore(createState) : createState;
81
- const useStore = (selector = api.getState, equalityFn = Object.is) => {
82
- const [, forceUpdate] = react.useReducer((c) => c + 1, 0);
83
- const state = api.getState();
84
- const stateRef = react.useRef(state);
85
- const selectorRef = react.useRef(selector);
86
- const equalityFnRef = react.useRef(equalityFn);
87
- const erroredRef = react.useRef(false);
88
- const currentSliceRef = react.useRef();
89
- if (currentSliceRef.current === void 0) {
90
- currentSliceRef.current = selector(state);
91
- }
92
- let newStateSlice;
93
- let hasNewStateSlice = false;
94
- if (stateRef.current !== state || selectorRef.current !== selector || equalityFnRef.current !== equalityFn || erroredRef.current) {
95
- newStateSlice = selector(state);
96
- hasNewStateSlice = !equalityFn(currentSliceRef.current, newStateSlice);
623
+ const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);
624
+ Object.assign(useBoundStore, api);
625
+ return useBoundStore;
626
+ };
627
+ const create = (createState) => createState ? createImpl(createState) : createImpl;
628
+
629
+ const devtoolsImpl = (fn, devtoolsOptions = {}) => (set, get, api) => {
630
+ const { enabled, anonymousActionType, ...options } = devtoolsOptions;
631
+ let extensionConnector;
632
+ try {
633
+ extensionConnector = (enabled != null ? enabled : (undefined && undefined.MODE) !== "production") && window.__REDUX_DEVTOOLS_EXTENSION__;
634
+ } catch {
635
+ }
636
+ if (!extensionConnector) {
637
+ if ((undefined && undefined.MODE) !== "production" && enabled) {
638
+ console.warn(
639
+ "[zustand devtools middleware] Please install/enable Redux devtools extension"
640
+ );
97
641
  }
98
- useIsomorphicLayoutEffect(() => {
99
- if (hasNewStateSlice) {
100
- currentSliceRef.current = newStateSlice;
101
- }
102
- stateRef.current = state;
103
- selectorRef.current = selector;
104
- equalityFnRef.current = equalityFn;
105
- erroredRef.current = false;
106
- });
107
- const stateBeforeSubscriptionRef = react.useRef(state);
108
- useIsomorphicLayoutEffect(() => {
109
- const listener = () => {
110
- try {
111
- const nextState = api.getState();
112
- const nextStateSlice = selectorRef.current(nextState);
113
- if (!equalityFnRef.current(currentSliceRef.current, nextStateSlice)) {
114
- stateRef.current = nextState;
115
- currentSliceRef.current = nextStateSlice;
116
- forceUpdate();
117
- }
118
- } catch (error) {
119
- erroredRef.current = true;
120
- forceUpdate();
121
- }
122
- };
123
- const unsubscribe = api.subscribe(listener);
124
- if (api.getState() !== stateBeforeSubscriptionRef.current) {
125
- listener();
126
- }
127
- return unsubscribe;
128
- }, []);
129
- const sliceToReturn = hasNewStateSlice ? newStateSlice : currentSliceRef.current;
130
- react.useDebugValue(sliceToReturn);
131
- return sliceToReturn;
642
+ return fn(set, get, api);
643
+ }
644
+ const extension = extensionConnector.connect(options);
645
+ let isRecording = true;
646
+ api.setState = (state, replace, nameOrAction) => {
647
+ const r = set(state, replace);
648
+ if (!isRecording)
649
+ return r;
650
+ extension.send(
651
+ nameOrAction === void 0 ? { type: anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction,
652
+ get()
653
+ );
654
+ return r;
132
655
  };
133
- Object.assign(useStore, api);
134
- useStore[Symbol.iterator] = function() {
135
- console.warn("[useStore, api] = create() is deprecated and will be removed in v4");
136
- const items = [useStore, api];
137
- return {
138
- next() {
139
- const done = items.length <= 0;
140
- return { value: items.shift(), done };
141
- }
142
- };
656
+ const setStateFromDevtools = (...a) => {
657
+ const originalIsRecording = isRecording;
658
+ isRecording = false;
659
+ set(...a);
660
+ isRecording = originalIsRecording;
143
661
  };
144
- return useStore;
145
- }
146
-
147
- function devtools(fn, options) {
148
- return (set, get, api) => {
149
- var _a;
150
- let didWarnAboutNameDeprecation = false;
151
- if (typeof options === "string" && !didWarnAboutNameDeprecation) {
152
- console.warn("[zustand devtools middleware]: passing `name` as directly will be not allowed in next majorpass the `name` in an object `{ name: ... }` instead");
153
- didWarnAboutNameDeprecation = true;
154
- }
155
- const devtoolsOptions = options === void 0 ? { name: void 0, anonymousActionType: void 0 } : typeof options === "string" ? { name: options } : options;
156
- if (typeof ((_a = devtoolsOptions == null ? void 0 : devtoolsOptions.serialize) == null ? void 0 : _a.options) !== "undefined") {
157
- console.warn("[zustand devtools middleware]: `serialize.options` is deprecated, just use `serialize`");
158
- }
159
- let extensionConnector;
160
- try {
161
- extensionConnector = window.__REDUX_DEVTOOLS_EXTENSION__ || window.top.__REDUX_DEVTOOLS_EXTENSION__;
162
- } catch {
163
- }
164
- if (!extensionConnector) {
165
- if ((undefined && undefined.MODE) !== "production" && typeof window !== "undefined") {
166
- console.warn("[zustand devtools middleware] Please install/enable Redux devtools extension");
167
- }
168
- return fn(set, get, api);
169
- }
170
- let extension = Object.create(extensionConnector.connect(devtoolsOptions));
171
- let didWarnAboutDevtools = false;
172
- Object.defineProperty(api, "devtools", {
173
- get: () => {
174
- if (!didWarnAboutDevtools) {
175
- console.warn("[zustand devtools middleware] `devtools` property on the store is deprecated it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
176
- didWarnAboutDevtools = true;
177
- }
178
- return extension;
179
- },
180
- set: (value) => {
181
- if (!didWarnAboutDevtools) {
182
- console.warn("[zustand devtools middleware] `api.devtools` is deprecated, it will be removed in the next major.\nYou shouldn't interact with the extension directly. But in case you still want to you can patch `window.__REDUX_DEVTOOLS_EXTENSION__` directly");
183
- didWarnAboutDevtools = true;
184
- }
185
- extension = value;
186
- }
187
- });
188
- let didWarnAboutPrefix = false;
189
- Object.defineProperty(extension, "prefix", {
190
- get: () => {
191
- if (!didWarnAboutPrefix) {
192
- console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
193
- didWarnAboutPrefix = true;
194
- }
195
- return "";
196
- },
197
- set: () => {
198
- if (!didWarnAboutPrefix) {
199
- console.warn("[zustand devtools middleware] along with `api.devtools`, `api.devtools.prefix` is deprecated.\nWe no longer prefix the actions/names" + devtoolsOptions.name === void 0 ? ", pass the `name` option to create a separate instance of devtools for each store." : ", because the `name` option already creates a separate instance of devtools for each store.");
200
- didWarnAboutPrefix = true;
201
- }
662
+ const initialState = fn(api.setState, get, api);
663
+ extension.init(initialState);
664
+ if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
665
+ let didWarnAboutReservedActionType = false;
666
+ const originalDispatch = api.dispatch;
667
+ api.dispatch = (...a) => {
668
+ if ((undefined && undefined.MODE) !== "production" && a[0].type === "__setState" && !didWarnAboutReservedActionType) {
669
+ console.warn(
670
+ '[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.'
671
+ );
672
+ didWarnAboutReservedActionType = true;
202
673
  }
203
- });
204
- let isRecording = true;
205
- api.setState = (state, replace, nameOrAction) => {
206
- set(state, replace);
207
- if (!isRecording)
208
- return;
209
- extension.send(nameOrAction === void 0 ? { type: devtoolsOptions.anonymousActionType || "anonymous" } : typeof nameOrAction === "string" ? { type: nameOrAction } : nameOrAction, get());
210
- };
211
- const setStateFromDevtools = (...a) => {
212
- const originalIsRecording = isRecording;
213
- isRecording = false;
214
- set(...a);
215
- isRecording = originalIsRecording;
674
+ originalDispatch(...a);
216
675
  };
217
- const initialState = fn(api.setState, get, api);
218
- extension.init(initialState);
219
- if (api.dispatchFromDevtools && typeof api.dispatch === "function") {
220
- let didWarnAboutReservedActionType = false;
221
- const originalDispatch = api.dispatch;
222
- api.dispatch = (...a) => {
223
- if (a[0].type === "__setState" && !didWarnAboutReservedActionType) {
224
- console.warn('[zustand devtools middleware] "__setState" action type is reserved to set state from the devtools. Avoid using it.');
225
- didWarnAboutReservedActionType = true;
676
+ }
677
+ extension.subscribe((message) => {
678
+ var _a;
679
+ switch (message.type) {
680
+ case "ACTION":
681
+ if (typeof message.payload !== "string") {
682
+ console.error(
683
+ "[zustand devtools middleware] Unsupported action format"
684
+ );
685
+ return;
226
686
  }
227
- originalDispatch(...a);
228
- };
229
- }
230
- extension.subscribe((message) => {
231
- var _a2;
232
- switch (message.type) {
233
- case "ACTION":
234
- if (typeof message.payload !== "string") {
235
- console.error("[zustand devtools middleware] Unsupported action format");
236
- return;
237
- }
238
- return parseJsonThen(message.payload, (action) => {
687
+ return parseJsonThen(
688
+ message.payload,
689
+ (action) => {
239
690
  if (action.type === "__setState") {
240
691
  setStateFromDevtools(action.state);
241
692
  return;
@@ -245,69 +696,60 @@ function devtools(fn, options) {
245
696
  if (typeof api.dispatch !== "function")
246
697
  return;
247
698
  api.dispatch(action);
248
- });
249
- case "DISPATCH":
250
- switch (message.payload.type) {
251
- case "RESET":
252
- setStateFromDevtools(initialState);
253
- return extension.init(api.getState());
254
- case "COMMIT":
255
- return extension.init(api.getState());
256
- case "ROLLBACK":
257
- return parseJsonThen(message.state, (state) => {
258
- setStateFromDevtools(state);
259
- extension.init(api.getState());
260
- });
261
- case "JUMP_TO_STATE":
262
- case "JUMP_TO_ACTION":
263
- return parseJsonThen(message.state, (state) => {
264
- setStateFromDevtools(state);
265
- });
266
- case "IMPORT_STATE": {
267
- const { nextLiftedState } = message.payload;
268
- const lastComputedState = (_a2 = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a2.state;
269
- if (!lastComputedState)
270
- return;
271
- setStateFromDevtools(lastComputedState);
272
- extension.send(null, nextLiftedState);
699
+ }
700
+ );
701
+ case "DISPATCH":
702
+ switch (message.payload.type) {
703
+ case "RESET":
704
+ setStateFromDevtools(initialState);
705
+ return extension.init(api.getState());
706
+ case "COMMIT":
707
+ return extension.init(api.getState());
708
+ case "ROLLBACK":
709
+ return parseJsonThen(message.state, (state) => {
710
+ setStateFromDevtools(state);
711
+ extension.init(api.getState());
712
+ });
713
+ case "JUMP_TO_STATE":
714
+ case "JUMP_TO_ACTION":
715
+ return parseJsonThen(message.state, (state) => {
716
+ setStateFromDevtools(state);
717
+ });
718
+ case "IMPORT_STATE": {
719
+ const { nextLiftedState } = message.payload;
720
+ const lastComputedState = (_a = nextLiftedState.computedStates.slice(-1)[0]) == null ? void 0 : _a.state;
721
+ if (!lastComputedState)
273
722
  return;
274
- }
275
- case "PAUSE_RECORDING":
276
- return isRecording = !isRecording;
723
+ setStateFromDevtools(lastComputedState);
724
+ extension.send(
725
+ null,
726
+ nextLiftedState
727
+ );
728
+ return;
277
729
  }
278
- return;
279
- }
280
- });
281
- return initialState;
282
- };
283
- }
730
+ case "PAUSE_RECORDING":
731
+ return isRecording = !isRecording;
732
+ }
733
+ return;
734
+ }
735
+ });
736
+ return initialState;
737
+ };
738
+ const devtools = devtoolsImpl;
284
739
  const parseJsonThen = (stringified, f) => {
285
740
  let parsed;
286
741
  try {
287
742
  parsed = JSON.parse(stringified);
288
743
  } catch (e) {
289
- console.error("[zustand devtools middleware] Could not parse the received json", e);
744
+ console.error(
745
+ "[zustand devtools middleware] Could not parse the received json",
746
+ e
747
+ );
290
748
  }
291
749
  if (parsed !== void 0)
292
750
  f(parsed);
293
751
  };
294
752
 
295
- var __defProp = Object.defineProperty;
296
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
297
- var __hasOwnProp = Object.prototype.hasOwnProperty;
298
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
299
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
300
- var __spreadValues = (a, b) => {
301
- for (var prop in b || (b = {}))
302
- if (__hasOwnProp.call(b, prop))
303
- __defNormalProp(a, prop, b[prop]);
304
- if (__getOwnPropSymbols)
305
- for (var prop of __getOwnPropSymbols(b)) {
306
- if (__propIsEnum.call(b, prop))
307
- __defNormalProp(a, prop, b[prop]);
308
- }
309
- return a;
310
- };
311
753
  const toThenable = (fn) => (input) => {
312
754
  try {
313
755
  const result = fn(input);
@@ -333,18 +775,19 @@ const toThenable = (fn) => (input) => {
333
775
  };
334
776
  }
335
777
  };
336
- const persist = (config, baseOptions) => (set, get, api) => {
337
- let options = __spreadValues({
778
+ const persistImpl = (config, baseOptions) => (set, get, api) => {
779
+ let options = {
338
780
  getStorage: () => localStorage,
339
781
  serialize: JSON.stringify,
340
782
  deserialize: JSON.parse,
341
783
  partialize: (state) => state,
342
784
  version: 0,
343
- merge: (persistedState, currentState) => __spreadValues(__spreadValues({}, currentState), persistedState)
344
- }, baseOptions);
345
- if (options.blacklist || options.whitelist) {
346
- console.warn(`The ${options.blacklist ? "blacklist" : "whitelist"} option is deprecated and will be removed in the next version. Please use the 'partialize' option instead.`);
347
- }
785
+ merge: (persistedState, currentState) => ({
786
+ ...currentState,
787
+ ...persistedState
788
+ }),
789
+ ...baseOptions
790
+ };
348
791
  let hasHydrated = false;
349
792
  const hydrationListeners = /* @__PURE__ */ new Set();
350
793
  const finishHydrationListeners = /* @__PURE__ */ new Set();
@@ -354,27 +797,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
354
797
  } catch (e) {
355
798
  }
356
799
  if (!storage) {
357
- return config((...args) => {
358
- console.warn(`[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`);
359
- set(...args);
360
- }, get, api);
361
- } else if (!storage.removeItem) {
362
- console.warn(`[zustand persist middleware] The given storage for item '${options.name}' does not contain a 'removeItem' method, which will be required in v4.`);
800
+ return config(
801
+ (...args) => {
802
+ console.warn(
803
+ `[zustand persist middleware] Unable to update item '${options.name}', the given storage is currently unavailable.`
804
+ );
805
+ set(...args);
806
+ },
807
+ get,
808
+ api
809
+ );
363
810
  }
364
811
  const thenableSerialize = toThenable(options.serialize);
365
812
  const setItem = () => {
366
- const state = options.partialize(__spreadValues({}, get()));
367
- if (options.whitelist) {
368
- Object.keys(state).forEach((key) => {
369
- var _a;
370
- !((_a = options.whitelist) == null ? void 0 : _a.includes(key)) && delete state[key];
371
- });
372
- }
373
- if (options.blacklist) {
374
- options.blacklist.forEach((key) => delete state[key]);
375
- }
813
+ const state = options.partialize({ ...get() });
376
814
  let errorInSync;
377
- const thenable = thenableSerialize({ state, version: options.version }).then((serializedValue) => storage.setItem(options.name, serializedValue)).catch((e) => {
815
+ const thenable = thenableSerialize({ state, version: options.version }).then(
816
+ (serializedValue) => storage.setItem(options.name, serializedValue)
817
+ ).catch((e) => {
378
818
  errorInSync = e;
379
819
  });
380
820
  if (errorInSync) {
@@ -387,10 +827,14 @@ const persist = (config, baseOptions) => (set, get, api) => {
387
827
  savedSetState(state, replace);
388
828
  void setItem();
389
829
  };
390
- const configResult = config((...args) => {
391
- set(...args);
392
- void setItem();
393
- }, get, api);
830
+ const configResult = config(
831
+ (...args) => {
832
+ set(...args);
833
+ void setItem();
834
+ },
835
+ get,
836
+ api
837
+ );
394
838
  let stateFromStorage;
395
839
  const hydrate = () => {
396
840
  var _a;
@@ -407,16 +851,24 @@ const persist = (config, baseOptions) => (set, get, api) => {
407
851
  if (deserializedStorageValue) {
408
852
  if (typeof deserializedStorageValue.version === "number" && deserializedStorageValue.version !== options.version) {
409
853
  if (options.migrate) {
410
- return options.migrate(deserializedStorageValue.state, deserializedStorageValue.version);
854
+ return options.migrate(
855
+ deserializedStorageValue.state,
856
+ deserializedStorageValue.version
857
+ );
411
858
  }
412
- console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`);
859
+ console.error(
860
+ `State loaded from storage couldn't be migrated since no migrate function was provided`
861
+ );
413
862
  } else {
414
863
  return deserializedStorageValue.state;
415
864
  }
416
865
  }
417
866
  }).then((migratedState) => {
418
867
  var _a2;
419
- stateFromStorage = options.merge(migratedState, (_a2 = get()) != null ? _a2 : configResult);
868
+ stateFromStorage = options.merge(
869
+ migratedState,
870
+ (_a2 = get()) != null ? _a2 : configResult
871
+ );
420
872
  set(stateFromStorage, true);
421
873
  return setItem();
422
874
  }).then(() => {
@@ -429,15 +881,18 @@ const persist = (config, baseOptions) => (set, get, api) => {
429
881
  };
430
882
  api.persist = {
431
883
  setOptions: (newOptions) => {
432
- options = __spreadValues(__spreadValues({}, options), newOptions);
884
+ options = {
885
+ ...options,
886
+ ...newOptions
887
+ };
433
888
  if (newOptions.getStorage) {
434
889
  storage = newOptions.getStorage();
435
890
  }
436
891
  },
437
892
  clearStorage: () => {
438
- var _a;
439
- (_a = storage == null ? void 0 : storage.removeItem) == null ? void 0 : _a.call(storage, options.name);
893
+ storage == null ? void 0 : storage.removeItem(options.name);
440
894
  },
895
+ getOptions: () => options,
441
896
  rehydrate: () => hydrate(),
442
897
  hasHydrated: () => hasHydrated,
443
898
  onHydrate: (cb) => {
@@ -456,6 +911,7 @@ const persist = (config, baseOptions) => (set, get, api) => {
456
911
  hydrate();
457
912
  return stateFromStorage || configResult;
458
913
  };
914
+ const persist = persistImpl;
459
915
 
460
916
  const walletStoreSelector = (state) => ({
461
917
  accounts: state.accounts,
@@ -465,7 +921,7 @@ const walletStoreSelector = (state) => ({
465
921
  addAccounts: state.addAccounts,
466
922
  removeAccounts: state.removeAccounts,
467
923
  });
468
- const useWalletStore = create(devtools(persist(immer((set, _get) => ({
924
+ const useWalletStore = create()(immer(persist(devtools((set, _get) => ({
469
925
  accounts: [],
470
926
  activeAccount: null,
471
927
  setActiveAccount: (account) => {
@@ -499,28 +955,1215 @@ const useWalletStore = create(devtools(persist(immer((set, _get) => ({
499
955
  })), {
500
956
  name: "txnlab-use-wallet",
501
957
  version: 0, // increment to deprecate stored data
502
- }), { name: "local-storage" } // prefix in Redux DevTools
503
- ));
958
+ })));
959
+
960
+ const icon$6 = "data:image/svg+xml;base64," +
961
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzcgMTg3Ij48cmVjdCB4PSItMTEuMzgiIHk9Ii0yNS45NyIgd2lkdGg9IjIwMC4wMiIgaGVpZ2h0PSIyMzEuNTMiIHN0eWxlPSJmaWxsOiNmZTU7Ii8+PHBhdGggZD0iTTk0LjA1LDU5LjYxYzIuMDUsOC40OCwxLjM2LDE1Ljk0LTEuNTUsMTYuNjYtMi45LC43Mi02LjkxLTUuNTctOC45Ni0xNC4wNS0yLjA1LTguNDgtMS4zNi0xNS45NCwxLjU1LTE2LjY2LDIuOS0uNzIsNi45MSw1LjU3LDguOTYsMTQuMDVaIiBzdHlsZT0iZmlsbDojMWMxYzFjOyIvPjxwYXRoIGQ9Ik0xMjcuODUsNjYuOWMtNC41My00LjgxLTEzLjU1LTMuNS0yMC4xNSwyLjkxLTYuNTksNi40MS04LjI2LDE1LjUtMy43MywyMC4zMSw0LjUzLDQuOCwxMy41NSwzLjUsMjAuMTUtMi45MXM4LjI2LTE1LjUsMy43My0yMC4zMVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTkxLjc5LDE0MC40N2MyLjktLjcyLDMuNDktOC42LDEuMzItMTcuNjEtMi4xNy05LTYuMjktMTUuNzEtOS4xOS0xNC45OS0yLjksLjcyLTMuNDksOC42LTEuMzIsMTcuNjEsMi4xNyw5LDYuMjksMTUuNzEsOS4xOSwxNC45OVoiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTYyLjIyLDcxLjNjOC4zNywyLjQ3LDE0LjQ4LDYuOCwxMy42Niw5LjY3LS44MywyLjg3LTguMjgsMy4yLTE2LjY1LC43My04LjM3LTIuNDctMTQuNDgtNi44LTEzLjY2LTkuNjcsLjgzLTIuODcsOC4yOC0zLjIsMTYuNjUtLjczWiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48cGF0aCBkPSJNMTE2LjU0LDEwMy43NGM4Ljg4LDIuNjIsMTUuNDEsNy4wNywxNC41OSw5Ljk0LS44MywyLjg3LTguNywzLjA4LTE3LjU4LC40Ni04Ljg4LTIuNjItMTUuNDEtNy4wNy0xNC41OS05Ljk0LC44My0yLjg3LDguNy0zLjA4LDE3LjU4LS40NloiIHN0eWxlPSJmaWxsOiMxYzFjMWM7Ii8+PHBhdGggZD0iTTcxLjY0LDk3LjcxYy0yLjA4LTIuMTUtOC44OCwuOTgtMTUuMiw2Ljk5LTYuMzIsNi4wMS05Ljc2LDEyLjYzLTcuNjksMTQuNzgsMi4wOCwyLjE1LDguODgtLjk4LDE1LjItNi45OSw2LjMyLTYuMDEsOS43Ni0xMi42Myw3LjY5LTE0Ljc4WiIgc3R5bGU9ImZpbGw6IzFjMWMxYzsiLz48L3N2Zz4=";
962
+ const PERA_WALLET = {
963
+ id: exports.PROVIDER_ID.PERA_WALLET,
964
+ name: "Pera Wallet",
965
+ icon: icon$6,
966
+ isWalletConnect: true,
967
+ };
968
+
969
+ const icon$5 = "data:image/svg+xml;base64," +
970
+ "PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHZpZXdCb3g9IjAgMCAzMiAzMiI+CiAgPHBhdGggZmlsbD0iIzI0NUVDNiIgZD0iTTE2LDMyYy0zLjIsMC02LjItMC45LTguOS0yLjdjLTIuNi0xLjgtNC43LTQuMy01LjktNy4yQzAsMTkuMi0wLjMsMTYsMC4zLDEyLjlDMC45LDkuOCwyLjQsNyw0LjcsNC43IEM2LjIsMy4yLDcuOSwyLDkuOSwxLjJDMTEuOCwwLjQsMTMuOSwwLDE2LDBzNC4yLDAuNCw2LjEsMS4yYzEuOSwwLjgsMy43LDIsNS4yLDMuNXMyLjcsMy4zLDMuNSw1LjJjMC44LDEuOSwxLjIsNCwxLjIsNi4xIHMtMC40LDQuMi0xLjIsNi4xYy0wLjgsMS45LTIsMy43LTMuNSw1LjJjLTEuNSwxLjUtMy4yLDIuNy01LjIsMy41QzIwLjIsMzEuNiwxOC4xLDMyLDE2LDMyTDE2LDMyeiBNMjAuMiwxMS4ybDAuMSwwLjVsMi42LDkuNWgyLjEgTDIxLjUsOC45bC0wLjEtMC4zaC0xLjlsMCwwLjFsLTEuNywzLjFMMTYsMTQuOWwwLDAuMWwwLTAuMWwtMC4yLTAuOGwtMC42LTIuNGwtMC4xLTAuMmwtMC43LTIuNmwtMC4xLTAuM2gtMS45bDAsMC4xbC0xLjcsMy4xIGwtMS44LDMuMkw3LjEsMThsLTEuOCwzLjJoMi4xTDkuMiwxOGwxLjgtMy4ybDEuOC0zLjJsMC4zLTAuNWwwLjEsMC41bDAuNSwyLjFsMC43LDIuNmwwLjIsMC45TDE0LjIsMThsLTEuOCwzLjJoMi4xbDAuOC0xLjMgbDEuMy0yLjNsMS41LTIuN2wxLjgtMy4yTDIwLjIsMTEuMkwyMC4yLDExLjJ6Ii8+Cjwvc3ZnPgo=";
971
+ const MYALGO_WALLET = {
972
+ id: exports.PROVIDER_ID.MYALGO_WALLET,
973
+ name: "MyAlgo Wallet",
974
+ icon: icon$5,
975
+ isWalletConnect: false,
976
+ };
977
+
978
+ const icon$4 = "data:image/svg+xml;base64," +
979
+ "PHN2ZyB3aWR0aD0iMjM4IiBoZWlnaHQ9IjIzOCIgdmlld0JveD0iMCAwIDIzOCAyMzgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik01MS43MDUgMTQ1LjA0MkgxMTYuNzA1TDEwNy43MDUgMTU1LjA0Mkg1MS43MDVWMTQ1LjA0MloiIGZpbGw9IiNENjQ1MDAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNDcuNTE5IDE5MS41NTdMMTI5LjU3NyAxNDQuMzk0TDE0Mi40MDQgMTI3LjExMkwxNjcuODc1IDE5MS41NTdIMTQ3LjUxOVpNMTEwLjkzNiA5NS4zOTMyTDEyMC42MTMgMTIwLjgzMUwxMzMuMzU5IDEwNC4yMjhMMTE3LjQ3NSA2NC4wNDIyQzExNS45MjggNjAuMTI4IDExMi4xNDYgNTcuNTU2NSAxMDcuOTM4IDU3LjU1NjVDMTAzLjcyOSA1Ny41NTY1IDk5Ljk0NzQgNjAuMTI4IDk4LjQwMDMgNjQuMDQyMkw2Ny45NjU5IDE0MS4wNDJIODcuNzgwN0M5NS40MTUzIDEyMS4wMTEgMTAyLjg5MyAxMDEuMzk5IDEwNS4xOTggOTUuMzU0MUMxMDUuNjQxIDk0LjE5MTIgMTA2Ljc0MyA5My40NTk5IDEwNy45ODcgOTMuNDU5OUgxMDguMTMyQzEwOS4zNzggOTMuNDU5OSAxMTAuNDkzIDk0LjIyOTMgMTEwLjkzNiA5NS4zOTMyWk04MC45MjEgMTU5LjA0MkM3NC45Mjg5IDE3NC43NjggNjkuODY2MSAxODguMDYzIDY4LjU0NDcgMTkxLjU1N0g0OEw2MC44NTE0IDE1OS4wNDJIODAuOTIxWiIgZmlsbD0iIzIyMkI2MCIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTE3Ni4wMjYgNTQuNzUwOUMxNzcuOTk3IDUyLjA4NzIgMTgxLjc1NCA1MS41MjU3IDE4NC40MTggNTMuNDk2N0MxODcuMDgyIDU1LjQ2NzggMTg3LjY0MyA1OS4yMjUxIDE4NS42NzIgNjEuODg4OEwxMzAuMDEzIDEzNy4xMDdDMTI5LjcxNCAxMzcuNTEyIDEyOS4zNDEgMTM3Ljg1NyAxMjguOTEzIDEzOC4xMjNMMTE3Ljg1NiAxNDUuMDEzQzExNy4wODcgMTQ1LjQ5MyAxMTYuMTI4IDE0NC43ODMgMTE2LjM2MSAxNDMuOTA3TDExOS43MTggMTMxLjMxOEMxMTkuODQ3IDEzMC44MzIgMTIwLjA2OCAxMzAuMzc0IDEyMC4zNjcgMTI5Ljk3TDE3MC42NyA2MS45ODlMMTY5LjkyOSA2MS40NDA1QzE2OS40ODUgNjEuMTEyIDE2OC44NTkgNjEuMjA1NiAxNjguNTMgNjEuNjQ5NkwxNTIuMzExIDgzLjU2ODhDMTUyLjU4NiA4NC4yMDIzIDE1Mi41MjQgODQuOTYxMiAxNTIuMDg0IDg1LjU1NjJMMTQ5LjExIDg5LjU3NTVDMTQ4LjQ1MyA5MC40NjM0IDE0Ny4yMDEgOTAuNjUwNiAxNDYuMzEzIDg5Ljk5MzZDMTQ1LjQyNSA4OS4zMzY2IDE0NS4yMzggODguMDg0MSAxNDUuODk1IDg3LjE5NjJMMTQ3LjY3OSA4NC43ODQ3TDE0OC44NjkgODMuMTc2OUwxNjcuMzA4IDU4LjI1NzRDMTY4LjYyMiA1Ni40ODE1IDE3MS4xMjcgNTYuMTA3MiAxNzIuOTAzIDU3LjQyMTJMMTczLjY0NCA1Ny45Njk3TDE3Ni4wMjYgNTQuNzUwOVoiIGZpbGw9IiNENjQ1MDAiLz4KPC9zdmc+Cg==";
980
+ const ALGO_SIGNER = {
981
+ id: exports.PROVIDER_ID.ALGO_SIGNER,
982
+ name: "AlgoSigner",
983
+ icon: icon$4,
984
+ isWalletConnect: false,
985
+ };
986
+
987
+ const icon$3 = "data:image/svg+xml;base64," +
988
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij4KICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDI0IiBoZWlnaHQ9IjEwMjQiLz4KICAgIDxnIHRyYW5zZm9ybT0ibWF0cml4KDEuNjgyMDksMCwwLDEuNjgyMDksMjI2LjM2OCwyMTIuODE4KSI+CiAgICAgICAgPHBhdGggZD0iTTMyNy4wNDksMjgwLjE5MkwxNjkuNTI0LDEzTDEyLDI4MC4xOTJMMTY5LjUyNCwxODkuMDg0TDMyNy4wNDksMjgwLjE5MloiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJtYXRyaXgoMS42ODIwOSwwLDAsMS42ODIwOSwyMjYuMzY4LDIxMi44MTgpIj4KICAgICAgICA8cGF0aCBkPSJNMjk5LjU0NiwzMDdMMTY5LjUyNSwyMzguNDczTDM5LjUwNCwzMDdMMTY5LjUyNSwyNjQuNjdMMjk5LjU0NiwzMDdaIiBzdHlsZT0iZmlsbDp3aGl0ZTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==";
989
+ const DEFLY = {
990
+ id: exports.PROVIDER_ID.DEFLY,
991
+ name: "Defly Wallet",
992
+ icon: icon$3,
993
+ isWalletConnect: true,
994
+ };
995
+
996
+ const icon$2 = "data:image/svg+xml;base64," +
997
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjUuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMDAgMzAwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAzMDAgMzAwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6dXJsKCNTVkdJRF8xXyk7fQoJLnN0MXtmaWxsOnVybCgjU1ZHSURfMDAwMDAwNDM0MjYxNjcxNDAxMDY1ODIyNzAwMDAwMDIxMzA3Njg5MDYwNzMxMTM0ODRfKTt9Cgkuc3Qye2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEwMjUxOTMxNjAxNTI3NjU4MTY0MDAwMDAxNjI3NDExMjM4MzE3NTY0MTc1OV8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTt9Cgkuc3Qze2ZpbGw6dXJsKCNTVkdJRF8wMDAwMDEzODU2MzM4MjQ2MjA4NjAyMDM1MDAwMDAxNDg3ODQ5MDI3MDc4MjA3MTIwN18pO30KCS5zdDR7bWFzazp1cmwoI21hc2swXzE2NjFfMjk1XzAwMDAwMDg4MTMyMjUxNTk3NDQxNTczNDkwMDAwMDExNjkzNjEyMDE4NTA2NjgxNDgxXyk7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMDAwMDAxMDYxMjA2MzI0NjE3OTI4NzExNjAwMDAwMDc0MzM5MTMwMzgzMzc3NjY1NzZfKTt9Cjwvc3R5bGU+CjxnPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8xXyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIyNDYuNjAzIiB5MT0iOS4yMjEyIiB4Mj0iMTc0LjE1OCIgeTI9IjMwOC41NDI2IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xCgkJTDI3NC43LDkzLjl6Ii8+CgkKCQk8bGluZWFyR3JhZGllbnQgaWQ9IlNWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1XyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSIxMjkuMzUxNiIgeTE9Ii0xOS4xNTczIiB4Mj0iNTYuOTA2NiIgeTI9IjI4MC4xNjQxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQkZCRTAiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMDE4MjI4MjM3MTUxMjM5MTUxMzIwMDAwMDE3ODM4NjY0MjU5NzY2MjczOTI1Xyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCWw2OS4yLTQ1LjFWMjNMMjUuMyw5My45TDQzLDE1MC4xbC0xNy43LDU2LjJMMTMzLjcsMjc3di0zOS42bC02OS40LTQ1LjFMNzIuNSwxNjYuNHoiLz4KCTxkZWZzPgoJCTxmaWx0ZXIgaWQ9IkFkb2JlX09wYWNpdHlNYXNrRmlsdGVyIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ij4KCQkJPGZlQ29sb3JNYXRyaXggIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIxIDAgMCAwIDAgIDAgMSAwIDAgMCAgMCAwIDEgMCAwICAwIDAgMCAxIDAiLz4KCQk8L2ZpbHRlcj4KCTwvZGVmcz4KCQoJCTxtYXNrIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjI1LjQiIHk9IjIzIiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0IiBpZD0ibWFzazBfMTY2MV8yOTVfMDAwMDAwODgxMzIyNTE1OTc0NDE1NzM0OTAwMDAwMTE2OTM2MTIwMTg1MDY2ODE0ODFfIj4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iMjQ2LjYwMzgiIHkxPSI5LjIyMTQiIHgyPSIxNzQuMTU4OCIgeTI9IjMwOC41NDI4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIC0xIDAgMzAyKSI+CgkJCTxzdG9wICBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOiMwQjQ2RjkiLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0JCRkJFMCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJPHBhdGggc3R5bGU9ImZpbGw6dXJsKCNTVkdJRF8wMDAwMDE2NTkyOTcyNDMwMzE2NDIwMzAwMDAwMDAwNzEwMTkwNDk4NDUxOTkxNTE2Ml8pO2ZpbHRlcjp1cmwoI0Fkb2JlX09wYWNpdHlNYXNrRmlsdGVyKTsiIGQ9IgoJCQlNMjc0LjcsOTMuOUwxNjYuNiwyM3YzOS42bDY5LjQsNDUuMWwtOC4yLDI1LjhoLTYxLjJ2MzIuOWg2MS4ybDguMiwyNS44bC02OS40LDQ1LjFWMjc3bDEwOC4yLTcwLjdMMjU3LDE1MC4xTDI3NC43LDkzLjl6Ii8+CgkJCgkJCTxsaW5lYXJHcmFkaWVudCBpZD0iU1ZHSURfMDAwMDAxMTk4MTE3MDc2MjE0NzI4MTQyNzAwMDAwMTA4Mjk2NTkzODM4NTEyMDI0OTFfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEyOS4zNTIxIiB5MT0iLTE5LjE1NzEiIHgyPSI1Ni45MDcxIiB5Mj0iMjgwLjE2NDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSAwIDAgLTEgMCAzMDIpIj4KCQkJPHN0b3AgIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6IzBCNDZGOSIvPgoJCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojQkJGQkUwIi8+CgkJPC9saW5lYXJHcmFkaWVudD4KCQk8cGF0aCBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTE5ODExNzA3NjIxNDcyODE0MjcwMDAwMDEwODI5NjU5MzgzODUxMjAyNDkxXyk7IiBkPSJNNzIuNSwxNjYuNGg2MXYtMzIuOUg3Mi4ybC03LjktMjUuOAoJCQlsNjkuMi00NS4xVjIzTDI1LjMsOTMuOUw0MywxNTAuMWwtMTcuNyw1Ni4yTDEzMy43LDI3N3YtMzkuNmwtNjkuNC00NS4xTDcyLjUsMTY2LjR6Ii8+Cgk8L21hc2s+Cgk8ZyBjbGFzcz0ic3Q0Ij4KCQkKCQkJPGxpbmVhckdyYWRpZW50IGlkPSJTVkdJRF8wMDAwMDEwOTAxOTkxODU1Nzc3MzA1MzQyMDAwMDAxNzYwMjQwNTkwODA2NzEyMDMwMF8iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iNDYuNDY2MiIgeTE9IjIyOC43NTU0IiB4Mj0iMTcxLjg2MzgiIHkyPSIxMzUuMTAzOSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAtMSAwIDMwMikiPgoJCQk8c3RvcCAgb2Zmc2V0PSIwLjExOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiM4OTUyRkY7c3RvcC1vcGFjaXR5OjAuODciLz4KCQkJPHN0b3AgIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6I0RBQkRGRjtzdG9wLW9wYWNpdHk6MCIvPgoJCTwvbGluZWFyR3JhZGllbnQ+CgkJCgkJCTxyZWN0IHg9IjI1LjQiIHk9IjIzIiBzdHlsZT0iZmlsbDp1cmwoI1NWR0lEXzAwMDAwMTA5MDE5OTE4NTU3NzczMDUzNDIwMDAwMDE3NjAyNDA1OTA4MDY3MTIwMzAwXyk7IiB3aWR0aD0iMjQ3LjYiIGhlaWdodD0iMjU0Ii8+Cgk8L2c+CjwvZz4KPC9zdmc+Cg==";
998
+ const EXODUS = {
999
+ id: exports.PROVIDER_ID.EXODUS,
1000
+ name: "Exodus",
1001
+ icon: icon$2,
1002
+ isWalletConnect: false,
1003
+ };
1004
+
1005
+ const icon$1 = "data:image/svg+xml;base64," +
1006
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDkuODMgMjEwLjMzIj48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDE2MS4zMSkiIHN0eWxlPSJmb250LWZhbWlseTpJQk1QbGV4U2Fucy1NZWRtLCAmYXBvcztJQk0gUGxleCBTYW5zJmFwb3M7OyBmb250LXNpemU6MTkwcHg7Ij48dHNwYW4geD0iMCIgeT0iMCI+S01EPC90c3Bhbj48L3RleHQ+PC9zdmc+";
1007
+ const KMD_WALLET = {
1008
+ id: exports.PROVIDER_ID.KMD_WALLET,
1009
+ name: "KMD",
1010
+ icon: icon$1,
1011
+ isWalletConnect: false,
1012
+ };
1013
+
1014
+ const icon = "data:image/svg+xml;base64," +
1015
+ "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIKCSB2aWV3Qm94PSIwIDAgNDgwIDQ4MCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDgwIDQ4MDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiMzMzk2RkY7fQo8L3N0eWxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMTI2LjYsMTY4YzYyLjYtNjEuMywxNjQuMi02MS4zLDIyNi44LDBsNy41LDcuNGMzLjEsMy4xLDMuMSw4LDAsMTEuMWwtMjUuOCwyNS4yYy0xLjYsMS41LTQuMSwxLjUtNS43LDAKCWwtMTAuNC0xMC4yYy00My43LTQyLjgtMTE0LjUtNDIuOC0xNTguMiwwbC0xMS4xLDEwLjljLTEuNiwxLjUtNC4xLDEuNS01LjcsMGwtMjUuOC0yNS4yYy0zLjEtMy4xLTMuMS04LDAtMTEuMUwxMjYuNiwxNjh6CgkgTTQwNi43LDIyMC4ybDIyLjksMjIuNWMzLjEsMy4xLDMuMSw4LDAsMTEuMUwzMjYuMiwzNTUuMWMtMy4xLDMuMS04LjIsMy4xLTExLjMsMGwtNzMuNC03MS45Yy0wLjgtMC44LTIuMS0wLjgtMi44LDBsLTczLjQsNzEuOQoJYy0zLjEsMy4xLTguMiwzLjEtMTEuMywwTDUwLjMsMjUzLjhjLTMuMS0zLjEtMy4xLTgsMC0xMS4xbDIyLjktMjIuNWMzLjEtMy4xLDguMi0zLjEsMTEuMywwbDczLjQsNzEuOWMwLjgsMC44LDIuMSwwLjgsMi44LDAKCWw3My40LTcxLjljMy4xLTMuMSw4LjItMy4xLDExLjMsMGw3My40LDcxLjljMC44LDAuOCwyLjEsMC44LDIuOCwwbDczLjQtNzEuOUMzOTguNSwyMTcuMSw0MDMuNiwyMTcuMSw0MDYuNywyMjAuMkw0MDYuNywyMjAuMnoiLz4KPC9zdmc+Cg==";
1016
+ const WALLET_CONNECT = {
1017
+ id: exports.PROVIDER_ID.WALLET_CONNECT,
1018
+ name: "Wallet Connect",
1019
+ icon,
1020
+ isWalletConnect: true,
1021
+ };
1022
+
1023
+ const providers = {
1024
+ [exports.PROVIDER_ID.PERA_WALLET]: PERA_WALLET,
1025
+ [exports.PROVIDER_ID.MYALGO_WALLET]: MYALGO_WALLET,
1026
+ [exports.PROVIDER_ID.DEFLY]: DEFLY,
1027
+ [exports.PROVIDER_ID.ALGO_SIGNER]: ALGO_SIGNER,
1028
+ [exports.PROVIDER_ID.EXODUS]: EXODUS,
1029
+ [exports.PROVIDER_ID.KMD_WALLET]: KMD_WALLET,
1030
+ [exports.PROVIDER_ID.WALLET_CONNECT]: WALLET_CONNECT,
1031
+ };
1032
+
1033
+ const audio = "data:audio/mp3;base64,SUQzBAAAAAIYBlRJVDIAAAAWAAAAMTAgU2Vjb25kcyBvZiBTaWxlbmNlVFBFMQAAABIAAABBbmFyIFNvZnR3YXJlIExMQ1RBTEIAAAAMAAAAQmxhbmsgQXVkaW9BUElDAAIPAgAAAGltYWdlL2pwZWcAAwCJUE5HDQoaCgAAAA1JSERSAAAEOAAABDgIBgAAAOwQbI8AAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAACD0AAAg9AQWVVbYAAAAHdElNRQffCgsFHDEDbwR2AAAgAElEQVR42uzde5RVZd0H8N8wDDcBAS8o6oCJVyxTsDSxojJvgVYq3jVNUQgzaZWmpqh56+ItNa+kr4Cay9Q0DQ1DWb2WeSm8pGRy0RAEgRFhuIzz/tFbC5yZc86eOWfmPDOfz1rvemvvZz9779+zz3DOt2fvXRER9QEAAACQsE5KAAAAAKROwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8ABAAAAJE/AAQAAACRPwAEAAAAkT8BBq9pss81i4sSJMXToUMUAAACgaCoiol4ZaA177rln3HzzzdG/f/+oqamJww8/PGbNmqUwAAAAtJgZHLSKk046Ke67777o379/RET07t07pk6dGtXV1YoDAABAi5nBQcmde+65MW7cuEbXvfjii3HIIYfE2rVrFQoAAIBmq4yIC5WBUqioqIgf/ehHceqppzbZZosttohevXrFk08+qWAAAAA0/zdomMFBCVRWVsZPfvKTGD16dEHtjzrqqJgxY4bCAQAA0CwCDoquU6dOccMNN8SoUaMK3mbOnDkxYsSIWL16tQICAACQmVtUKLoLL7wwjj766Ezb9OnTJz788MP44x//qIAAAABkZgYHRXXyySfHxRdf3Kxt16xZEyNGjIg333xTIQEAAMjEa2Ipmv333z8mTpzY7O27dOnSou0BAADouMzgoCh23333uO+++6J79+4t7utLX/pSvPLKK4oKAABAwczgoMW22mqruOOOO4oSbkREjBs3TlEBAADIxAwOWqRTp05x3333xV577VW0Puvq6uIzn/lMzJ8/X4EBAAAo7PepEtASp59+elHDjYiIysrKOO200xQXAACAgpnBQbPtuuuu8cgjj0RVVVXR+66trY0999wzlixZotAAAADkZQYHzdKtW7e4/vrrSxJu/Kf/r3/96woNAABAQQQcNMv5558f22+/fUn3MWrUKIUGAACgIAIOMvvCF74Q3/jGN0q+nz322COqq6sVHAAAgLwEHGRSVVUVl156adH7Xbp0aaPLzeIAAACgEAIOMjn22GOLPqvimWeeic997nOxaNGiBusOOeQQRQcAACAvAQcF69GjR5x55plF7fOhhx6KI488MhYvXhxTp05tsH7IkCGx3XbbKT4AAAA5CTgo2De/+c3YbLPNitbfM888E+PGjYs1a9ZERMTkyZOjvr7hW4vN4gAAACAfAQcF6dOnT4wdO7Zo/S1dujTGjh0bdXV1/1321ltvxaxZsxq0HTFihAEAAAAgJwEHBfnWt74VvXv3Llp/Z555ZrzzzjsNlj/++OMNln3iE5+Irl27GgQAAACaJOAgr/79+8dJJ51UtP5uu+22RoOMiIhp06Y1WFZVVRWf+MQnDAQAAABNEnCQ19ixY6Nbt25F6evdd9+Nyy+/vMn1s2bNanRmx5577mkgAAAAaJKAg9wXSKdOMWrUqKL199Of/jQ++OCDnG0am90h4AAAACDn71clIJe99tor+vfvX5S+3njjjZgyZUredo0FHMOGDTMYAAAANEnAQU4jR44sWl8/+tGPYt26dXnbPf3007Fq1aoNlm2yySax7bbbGhAAAAAaJeCgSZWVlXHwwQcXpa9nn302HnvssYLarl69Ol588cUGyz/1qU8ZFAAAABol4KBJe++9d2y66aZF6euiiy7K1P6VV15psGyPPfYwKAAAADRKwEGTDjnkkKL088gjj8Rzzz2XaZuXX365wbKBAwcaFAAAABol4KBRnTt3joMOOqjF/axbty4uvfTSzNs1NoNjq622MjAAAAA0SsBBo/bZZ5/o27dvi/v5n//5n3jzzTczb/faa69FfX39BssGDBhgYAAAAGiUgINGFeOBnitWrIirrrqqWduuXr063n///Q2Wde/evSihCwAAAO2PgING7brrri3u46abborFixc3e/ulS5c2WOY2FQAAABoj4KBRQ4YMadH2a9eujV/+8pct6mPZsmUNlrlNBQAAgMYIOGigT58+LQ4SHnrooViyZEmL+mgs4DCDAwAAgMYIOGhg8ODBLe6jpbM3IiI++OCDBssEHAAAADRGwEED/fr1a9H2s2bNiueee67Fx9HYA0UFHAAAADRGwEEDLX1TyaRJk4pyHJtvvnmDZZ7BAQAAQGMEHDTQkhkcy5YtiwceeKAox7HZZps1WNazZ08DBAAAQAMCDhro06dPs7e9++67o7a2tsXH0KVLl+jdu3eD5Z07dzZAAAAANCDgoIHKyspmbVdfXx933nlnUY5hu+22K+qxAQAA0L4JOGhg5cqVzdpu+vTpMWfOnKIcw/7779/ocgEHAAAAjRFw0EBzA45ivBr2Pw488MBGl7tFBQAAgMYIOGjggw8+yLzN3Llz48knnyzK/rfaaqv4+Mc/3ug6AQcAAACNEXDQQHNmcEyePDk+/PDDouz/oIMOanKdW1QAAABojICDBpoTcDz22GNF2XePHj1i7NixTa4XcAAAANAYAQcNZL1FZc6cOfGPf/yjKPseP3589O/fv8n1Ag4AAAAaI+CggawzOKZNm1aU/W699dZx2mmn5WzjGRwAAAA0RsBBA1lncDz++ONF2e95550XXbt2zdmmWM/5AAAAoH0RcNBAlhkcNTU18ac//anF+9xzzz1j1KhRedstWrTIAAEAANCAgIMG3nnnnaivry+o7fTp02PdunUt2l9FRUVMnDixoLb/+te/DBAAAAANCDhoYPXq1bFw4cKC2hbj+RuHHXZYfPKTnyyo7YIFCwwQAAAADQg4aNScOXPytlm3bl1Mnz69Rfvp0aNH/OAHPyi4vYADAACAxgg4aNTcuXPztvnzn/8cNTU1LdrPuHHjcr4W9qMEHAAAADRGwEGjCgk4Xn/99RbtY6uttorTTz890zaewQEAAEBjBBw0qpBbVJYvX96ifVx55ZXRrVu3TNuYwQEAAEBjBBw0at68eXnbtCTgOO6442LEiBGZtxNwAAAA0JjOSkBjCpnBsWzZsmb1PXDgwLjgggsyb7dmzZp47733DA4AANCqKioqmr0sa9tCt1+3bl18+OGHBmc9Ao717LTTTrHjjju2yoVbqu1b+mFaf3ltbW3OW0h233336Ny5c6Z9VVRUxJgxY6JHjx6Zx2fBggVx4oknluRcy2Vcy+EPain2laVdSuea0nWVyjXoXNvn562tx6pcz7UUY9Xevos4V99FfBfxXaRcPgPl6OSTT45HH33UD/n1xzQi6pXh3yZMmBATJkxQCAAAAMraKaecEo888ohCrMcMjiJZvHhxo7ds1Nc3nh9lWZ61j6Zk7bu6ujp69+7dZH8LFiyIxYsXF3yM3bp1ix122KHZSens2bPj/fffb9b5t8U4pDDG5VyTVMcy6z6LcZ4pjHG51NvnNYyxz6ux7EDfF4yxsWwP36E68vf7Aw44IMaNG9fk+k6dPFJTwFEi1113Xdxyyy3t6py+973vxZlnntnk+nvvvTeuuOKKgvqqqqqK3/72t80ON9asWRNf/vKXY/Xq1S42AACg3dtpp51yrk/9FptSEPnQpL/97W851/fp06fgvs4666wYMmRIs4/lL3/5i3ADAADoMPI9QNQMjkZqogQ0ZdasWTnX9+3bt6B+9thjj/jWt77VomP54x//aEAAAIAOQ8CRnYrQpLfffjvna1kLmcHRrVu3uPbaa6OysrJFxzJz5kwDAgAAdBj5ntch4GikJkpALrlmcVRXV+fd/rzzzouPfexjLTqGVatWxQsvvGAwAACADsMMjuxUhJxyPYejuro6unbt2uT64cOHxze+8Y0WH8PMmTNj7dq1BgMAAOgw8s3g8JDRhgQc5JQr4OjUqVOTszM22WSTuOaaa4ryobvzzjsNBAAA0KHkm8HR0scAtEcCDnLK96DR7bffvtEP2o033hhbbrlli/c/Z86cmD59uoEAAAA6FLeoZKci5DRv3rxYvnx5k+sbCzjOOeecGD58eFH2f8cdd+SdmgUAANDeeMhodipCXrlmcXw04Dj44INj7NixRdnvqlWrYurUqQYAAADocMzgyE5FyCvXczjWDzgGDx4cV111VdH2e//990dNTY0BAAAAOpx8AYeHjDbUWQnIJ1fAsd1220VlZWV07949br/99ujZs2fR9jtp0iTFBwAAOiQzOLJTEfLKFXB06dIlqqur46qrrorBgwcXbZ9/+tOf4pVXXlF8AACgQxJwZKci5DV37tyct4pcfvnlcfDBBxd1nzfeeKPCAwAAHZaHjGanIhT0wXrppZeaXL/vvvsWdX9PPfVUTJs2TeEBAIAO/Tss5495AUfDmigBhch1m0oxrVu3Ls4//3wFBwAAOjS3qGSnIhQk16tii+n222+P2bNnKzgAANChCTiyUxEK0hozOBYvXhw/+9nPFBsAAOjwBBzZqQgFefPNN2PFihUl3cell16a82GmAAAAHYWAIzsVoeAP18svv1yy/l988cW45557FBoAACA8ZLQ5VISCvfLKKyX74J533nl5P8AAAAAdRb4ZHBUVFYr0EQIOCjJkyJA47LDDStL3TTfdFM8//7wiAwAA/D+3qGSnIuQ1aNCgmDJlSvTq1avofb/44otx2WWXKTIAAMB6BBzZqQg59e/fP+65557YbLPNit73+++/H6effnqsXbtWoQEAANYj4MhORWjSxhtvHFOnTo1tttmmJP1/73vfi7lz5yo0AABA1h/zAo6GNVECGtO9e/e46667YqeddipJ/1OnTo0HH3xQoQEAABphBkd2KkIDVVVVceutt8bQoUNL0v/rr78e5513nkIDAAA0QcCRnYqwgYqKirjmmmtixIgRJel/9erVcdppp8WqVasUGwAAoAkCjuxUhA1ccsklceihh5as/3PPPTf+/ve/KzQAAEAOAo7sOisBEf+euXHppZfGCSecULJ93HjjjTFlyhTFBgAAyCNfwFFRUaFIHyHgIDp16hQ//elPY/To0SXbxyOPPBKXXHKJYgMAABSgvr4+7+84NiTg6OgXQOfOce2115b0tpTnn38+xo8fn/cDCgAAwL+5RaUZv2+VoOOqqqqKG2+8MQ466KCS7WPevHlx4oknRm1trYIDAABlpbHbPJq69aNYywtt27lz7p/rAo6GBBxFMmzYsFi9enWbfwgKXV5VVRWjR4+OHXbYoWQ1qa2tjYcffjgOP/zwZp9j1vMs5R+jch3LcqxJKc+znGpVLv9QpjrGqX5e29sY+7waS2NsjP0b4zthR/hO2B4JOAQcJTNy5MgYOXKkQqynW7duMXbsWIUAAAAoMgFHQwKOIlm8eHEsW7aswfLGnjvR1LMoWtq2Keu3raioiIEDB0aPHj1KWo958+bF0qVLS16HLLVpzbEo13Mrh/PNcm6pjaVza/3jNZbOrb2dm3/v2te5+Qym9z3FZ9C5ldP3lL59+8a9994r4BBwtL7rrrsubrnllrI+xt69e8eUKVNKHm5ERBx88MGxZMkSFwYAAEAzbLLJJjnXCzgaqYkSdAz9+vWL++67L/bYY49W2V9r7QcAAKA98haV7FSkA+jdu3fce++9seuuu7baPocPH67wAAAAzSTgyE5F2rlu3brFHXfcEbvsskur7lfAAQAA0Hz5ni3Skd4YUygBRzvWuXPnuOmmm+LTn/50q+97p512ik033dQgAAAANIMZHNmpSDtVUVERP/vZz2K//fZrs/2bxQEAANA8Ao7sVKSduvDCC+Owww4r6T5mzpwZNTU1Ta7fd999DQQAAEAzCDiyU5F2aPz48XHKKaeUdB/PPfdcnHjiifHXv/61yTYCDgAAgObJF3BUVlYq0kcIONqZL37xi3H22WeXdB+vvvpqHHvssbFy5cp4/vnnm2y39dZbx6BBgwwKAABARh4ymp2Aox0ZOHBg/PznPy/phT537tw4+uijY/ny5RER8cILL+Rs7zkcAAAA2blFJTsVaSe6desWt956a2y88cYl28eiRYviqKOOioULF/53Wb6Aw20qAAAA2Qk4slORduLyyy+PIUOGlKz/mpqaOOqoo2LOnDkbLH/33XfjrbfeanK7ffbZx9QpAACAjPLdoiLgaKQmSpC+448/Po444oiS9V9bWxvHH398vPrqq42uzzWLo1+/fiUNXgAAANqrXLM4BByN1EQJ0rbHHnvExRdfXLL+161bF6eeemr8+c9/brKN21QAAACKL1fAYaZ8QwKOhHXp0iWuvfbaqKqqKkn/9fX1ceaZZ8YTTzyRs12uN6lEeNAoAABAc3+TNflj3gyOhjVRgnSNHz8+Pvaxj5Ws/x/+8Idx//335203a9asWLduXZPr99prr5KFMAAAAO1VXV1d0z/mBRwNa6IEadp2221j/PjxJev/5z//edx2220FtV21alW89tprTa7v3r17DB061KABAABkkOsWlcrKSgX6CAFHoq644oro0qVLSfr+/e9/H5dffnmmbfLdpuI5HAAAANl4Bkc2nZUgPV/72tdK9lyLN998M8aNG5f3ncsf9fzzz8dxxx3X5Prhw4fHj3/844iI2GSTTWLPPfeMXXbZJfr16xd9+/bd4P/36dMnVq5cGUuWLInFixfH4sWL//uf586dGzNmzIhly5a5EAAAgHbNW1SyEXAkpnfv3nHhhReWpO8PPvggvvGNb0RNTU3mbV988cWc63fbbbf42c9+Fp/61KcKem5Iz549Y/PNN290XV1dXTz77LPx+OOPx7Rp0+KNN95wYQAAAO2Oh4xmI+BIzLnnnhubbrppST44Z5xxRrz++uvN2n727NmxYsWK6NmzZ6Pru3TpEkceeWRRjrWysjL22muv2GuvveL888+PN998Mx577LG4+eabY+HChS4SAACgXTCDIxsVScigQYPimGOOKUnf11xzTTz66KMt+uDlm8VRKttuu22cfvrpMXPmzBg/fnzJnk0CAADQmgQc2ahIQk455ZSSXMRPPPFE/OQnP2n29hUVFXHEEUfE4MGD27Q+G220UZxzzjkxY8aMOPDAA10wAABA0gQc2ahIIjbeeOMYPXp00ft9880341vf+lbmh4r+xy677BIPPvhgXH311bHFFluURa0GDhwYt912W9x7772x8847u3gAAIAkeYtKNgKORBx33HHRo0ePon9YzjjjjGY9VLRXr15x8cUXx+9+97sYNmxYWdZs+PDh8dhjj8URRxzhAgIAAJLjIaPZqEgCqqqq4uSTTy56vzfffHM899xzmbf76le/Gk8//XScfPLJUVlZWfa1u/rqq2PChAkuJAAAICluUclGRRJwyCGHRP/+/Yva5z//+c+48sorM21TWVkZl156aVx//fVNvsK1XE2YMCGuuuqqqKqqckEBAABJyBVwlPv/2NwWBBwJGDNmTNE/JN/5zneitra24G169+4dd911V5x44onJ1nH06NFx1113Ra9evVxUAABA2fMMjmwEHGVu+PDhMWTIkKL2efvtt8ezzz5bcPuBAwfGb37zm/jc5z6XfD333XffeOCBB4o+IwYAAKDY3KKSjYqUua9+9atF7W/OnDlx2WWXFdz+05/+dDzyyCOx/fbbt5ua7rzzzvHLX/4yunXr5gIDAADKloeMZtNZCcpbsWdNfPe7341Vq1YV1PaTn/xkTJ06tV0GAbvttltcddVVcfrpp7vIAICSa2oqeTGWZ52mXoy+2+J8inGe5XTcxTjPFI67PV2zbTGWuZ4hKOAQcJTMgQceGNtss01RPwQbb7xxDBgwoGjHOH/+/Bg1alSMGjUq77H07NkzDjjggHY9y+GQQw6JwYMHx9///vd2/Y9WOf3x949W+/likuoXLWNsjP0w8m9MW/2NACg2AUcjf5cjojspCGQAACAASURBVF4Z/m3ChAleJwoAAEDZW7hwYey+++4KsR4zOIrk1Vdfjblz5zZY3tg9U03dR/XR5cOGDSvawzDnz58fL7zwQt5jiPj3cze22GKLDjN2a9eujccffzyWLVtWlHErZdumlOIYWvt8s9SgXMfHuXXMczOWzs25Ff/flfb8GfT3xbm5Tp1blrZPPPFEbLfddo22N4NDwFEyd999d9xyyy1F66+qqipeeeWVov2AP/zww2PevHl5206cOLFDhRv/qfWuu+4aX/jCF2LlypUuZgAAoCzU1dU1uU7A0UhNlKA8DR06NDbaaKOi9HXXXXcVFG7svffeccopp3TIeldXV8cZZ5zhwgMAAMpGrtfEVlZWKtBHCDjK1Gc/+9mi9LNy5cq4+uqr818InTrFxIkTO3TNTzvttBg0aJCLDwAAKAteE5uNipSpYr0e9t5774133303b7vRo0fHrrvu2qFr3qVLlw4f8gAAAOUj1wwOb3JqSMBRpnbaaaei9DN58uS8bXr27Blnn322okfEfvvtF1/84hcVAgAAaHO5Ag4zOBqpiRKUn169ekX37t1b3M9f//rXePnll/O2+/a3vx2bbbaZwv+/iy66KKqqqhQCAABoUwKObFSkDG2++eZF6WfKlCl522y55ZYd9sGiTdl2223j1FNPVQgAAKBNCTiy8ZrYMtS/f/8W97Fy5cr49a9/nbfdqFGjokuXLm1ynq+++mrceuutUV1dHQMHDozq6uqorq6OTTfdtM3HYMyYMXHzzTfH2rVrXZAAAECbEHBkI+AoQ8W4XeShhx6KFStW5G138MEHF/346+rq4sknn4y+ffvG0KFDm2zXp0+fmDp1aoPlgwYNimOOOSZGjx7dZmHHpptuGgcccED85je/cUECAABtItdbVDxktCGRTxkqxgyOQn6Y9+/fP2cAkdW8efPiyiuvjD333DOOP/74eOyxx3K233LLLaNnz54Nls+ZMyd+9KMfxdChQ+PUU0+Np556KucHu1SOO+44FyMAANBmzODIRkXKUEufwbF27dp45pln8rY76KCDipL6zZo1K4488sjYe++94+qrr4533nknIiJef/31vNvusMMOOc/j4YcfjiOPPDI+85nPxOOPP96q47DPPvvEoEGDXJAAAECbEHBkoyJlqKUBx1/+8pdYtWpV3nYHHnhgi/ZTU1MT5557bhx00EGNzrJ47bXX8vax/fbbF7SvuXPnxoknnhgTJ05stediVFRUxLHHHuuCBAAA2kSugCNCyNGgHkpQflp6i8rTTz+dt02/fv1i7733bvY+fv/738dnP/vZmDRpUtTV1TXaZv78+bFy5cqc/eSawfFR9fX1cdNNN8UhhxwS8+bNa5WxGD16tFfGAgAAbULAkY1qlKGWzuAoJODYb7/9orKysln9X3vttXHCCSfEokWLcrarr6+P2bNn52yTJeD4jxdffDG+/OUvt8oDQDfZZJM44IADXJQAAECry/csQg8a3ZCAo515//3348UXX8zbbtttt83c99q1a2PMmDFx+eWX500S/yPfbSrNCTgi/n17zJgxY+Luu+8ueU332WcfFxYAANDqzODIRjXK0OLFi5u97d///vcmbxlZX9++fTP3feGFF2aeNZHvQaNbb7119OjRo9nne/bZZ8dzzz1X0vHYY489XJQAAECrE3BkoxplaMmSJc3e9o033iioXZ8+fTL1e++998akSZMyH0++GRwVFRUxePDgZp/vmjVr4pvf/GYsXLiwZOOx0047Rffu3V2YAABAqxJwZKMaZaglAcc//vGPgtplmcHxt7/9Lb7//e8363gKeZNKc29T+Y+FCxfGySefHGvWrCnJeHTu3Dl22203FyYAANCqBBzZqEYZasktKsUOOJYsWRInn3xyrF69ulnH8/bbb8cHH3yQs01LA46IiOeff77ZIUwh3KYCAAC0Ng8ZzUbAUYbK6RaVCRMmxNtvv92iD2S+53AUI+CIiLjnnnvi97//fUnGRMABAAC0tnwBR3PfjNleCTjKUHNncHz44Ycxd+7cgtr27t07b5t58+bF448/3uLzKdWbVBpz0003lWRMdt99dxcmAADQqtyiko1qlKH58+c3a7sVK1bEunXrCmq7dOnSvG2mTJmSNzEsRL6Ao7q6Orp27VqU2s2cOTNefvnloo9J1oeyAgAAtJSAIxvVKEMvv/xyQQHERy1btqzgtvPmzcu5ft26dXHPPfcU5XzyBRydOnWK7bbbrmj1K8Usji5durgwAQCAViXgyEY1yvQifvrppzNvt3z58oLb5psl8sQTTxTt1aut8SaV9T344IPxzjvvFHVMKisr3d8GAAC0Kg8ZzUbAUaZmzJiReZssAUe+Z3X89re/Ldq5LFiwIN5///2cbYoZcKxduzZuu+22oo+JWRwAAEBrMoMjG9UoU80JOIp5i8qCBQuKej6t9SaV/5g8eXJRnh+yPgEHAADQmgQc2ahGmfrXv/4Vs2fPzrRNXV1dwW3z3aJS7Fs85syZk3N9MZ/BEfHvsKclr7dtTLEehAoAAFAIAUc2qlHGss7i6NevX8FtZ8+enfONK4sWLSrqueS7JWabbbYpev0KefZHpg+LPx4AAEArEnBk/M2mBOXrySefzNQ+S8BRU1MTzzzzTKPrVq1alfeZGVnluyWmR48esckmmxR1n8UMONatWxeLFy92UQIAAK3GQ0azEXCUsaeeeirTbRZZAo6IiGnTprXahyTfDI6I4s/iyPfcjyzeeuutnDNeAAAAii3fDA5vetyQgKOM1dXVxR133FFw+6wzIJoKOLp16xabbbZZUc+lkICjurq6qPss5gyOfM8QAQAAKDa3qGTTWQnK25QpU+K73/1uQW/w6NKlS2y00UbxwQcfFNT3vHnz4tVXX42dd965wbptttkm3n333aKdx8KFC2PNmjU5z2Prrbcuau1mz54d9fX1RZmR8uabb7oYAYAWaew7SVPfU4q1vFR9l/K4i3GOKZ9Pa49lW12brtnC2vfp00fAIeBofQceeGCjt1gU4wMzb968GDx4cEHHcfXVVzf5rIjG+m7qtouzzz670VkLLTmf2tranAHHkUceGdtvv31RvySsXLkyNtpooxaP79ChQ+P6669P8o95Of2R78hfQFI+n478BcQY+5Lph1HH+jem1NcVQLH5O/SRekREvTL824QJE2LChAkKAQAAQNnbb7/94uWXX1aI/2cGR5G89NJL8cYbbzRY3thTb5t6Em6utiNGjCjoIaJLliyJ6dOnZzqGvfbaKwYOHLjB+qVLl/73GR3NOd7Glu+5556xww47NHnsNTU18dBDDxWtZhERhx12WPTs2bPF43vPPffEihUrilKH1mrblHI93izbZ6lBSufr3NI9t/b6Gcxybq5T5+bc0vn7Yiydm3Nr23PLsv1ll10WJ5xwQpPH4hYVAUdJ/OpXv4pbbrmlZP1/9atfbfIWifX17ds3Lrjggli2bFnBfe+4444xffr0DaY39e3bN3784x/Hv/71r6Kdw5gxY+KCCy5ocn3Xrl3j+9//fqY/LvmMHDmyxQHH66+/Ht/5zndc5AAAQKvykNFsVCMRDz74YLz66qv5B7RTp/jsZz+bqe/XXnstHnvssQbL999//6KeQ743qXTt2jU233zzou6zR48eLe5jxowZLkAAAKDV5fsffwUcH6mHEqThww8/jIsvvrigtiNGjMjc/9VXX91g2UknnVTU9yoX8qrYYr5JZcCAAdG9e/cW9yPgAAAA2kJdXV3uH/QCjg3roQTp+MMf/hBPPfVU3nb77bdf5h/2s2bNismTJ2+wbLvttotDDz20aMc/f/78vG2qq6uLtr/dd9+9xX2sWbMm/vd//9fFBwAAtDq3qGSjGom56KKL8l7k/fr1i+OPP75Zfb/99tsbLPv+979f0MNNC7FixYpYsmRJzjblFnD8+c9/jlWrVrnwAACAVifgyEY1EvPKK6/Efffdl7fd6aefHt26dcvU9/vvvx/f/e53N1i29dZbxxlnnFG04583b17O9dtss03R9lWMgOP+++930QEAAG3CMziyUY0EXXHFFVFbW5uzzeabbx7HHnts5r5nzJgRt99++wbLli5dWrRjzxdwFGsGR/fu3WO33XZrUR+LFy8WcAAAAG3GMziyUY0ELViwIK677rq87caNGxddu3bN3P8Pf/jDuOeee/773996662iHXu+B40W6yGjX/nKV1r8BpU77rgj1qxZ44IDAADaRL5bVCoqKhRpPQKORF133XXxt7/9LWeb/v37xzHHHNOsD9GECRNi0qRJsWbNmgbP5WiJfAHHVlttVZQU8sgjj2zR9mvWrIk777zThQYAALQZz+DIRjUStW7duvj2t7+dd4bB+PHjY+ONN27WB+ncc8+NIUOGxAsvvFC04853i0pVVVVsscUWLdrHoEGDYq+99mpRH7/+9a/j3XffdaEBAABtRsCRjWok7LXXXosrr7wyZ5v+/fvH1Vdf3ex9fPDBB7F69eqiHXO+GRwRLX8Ox+jRo1s0VWvt2rVxww03uMAAAIA2JeDIRjUS94tf/CL+8pe/5Gyz//77x6mnnloWx7tgwYJYu3ZtzjYteZNKr169mnVbzvp+/vOfx+zZs11cAABAmxJwZKMa7eCCP+OMM2LVqlU525177rlFeW1qS9XV1eV9pkdLZnBMmDAhNt1002ZvP3v27BbNeAEAACjm772cP+gFHBvWQwnSN2fOnDj//PNztqmqqopf/OIX0bt37zY/3nzP4Wjum1R23HHHOOmkk1r0x+Oss87KO8MEAACgNXhNbDaq0U5MmTIlJk+enLPNNttsUxazE/I9h2PAgAHN6vfiiy+Ozp07N/u4Jk2aFM8995yLCQAAKAv19fW5f9ALODashxK0Hz/4wQ/i+eefz9nmgAMOiEsuuaRNPwj5Ao7m3GIycuTIGD58eLOP6aWXXorLLrvMRQQAAJQNt6hkoxrtyNq1a+Ob3/xm3tebnnTSSXHjjTdGly5d2uQ4892istlmm2Xqb8cdd8z7Nplc5syZE8ccc0ysXLnSRQQAAJQNt6hkoxrtzDvvvBNjxoyJdevW5Ww3cuTImDp1aps8kyPfDI5+/foV/EHdaqutYurUqbHxxhs361gWLlwYRx55ZN5QCAAAoLXlm8FRUVGhSOsRcLRDzzzzTJxzzjl579fae++949e//nVsscUWrXp8+QKOTp06Rb9+/fL207dv35g6dWqzj7+mpiaOPvrovDNKAAAA2oJncGSjGu3U5MmT49xzz83bbuedd46HH344dthhh1Y7tpqamli+fHnONvluU+nevXvceeedMXjw4GYdw4oVK+KEE06IV1991cUCAACUJc/gyEY12rFf/vKXBYUcAwYMiN/85jcxZsyYqKqqapVja8mDRgcMGBBTpkyJoUOHNmvfc+bMia985Svxpz/9yUUCAACULc/gyEY12rlJkyYVFHL06tUrLrjggpgxY0bsv//+JT+ufAFHUzM4Dj300Jg+fXp8+tOfbtZ+Z8yYEQceeGC8/vrrLg4AAKCsmcGRjWp0AJMmTYrzzjuvoLaDBg2KSZMmxa9+9avYZZddSnZM8+fPz7n+ozM4evfuHTfccEPccMMNzX4w6k033RTHHnts3ttjAAAAyoGAIxvV6CBuv/32OP/88wtuv88++8S0adPiJz/5SebXthYiywyOz3/+8/Hkk0/GoYce2qx91dTUxPjx42PixIl5p3gBAACUCwFHNp2VoOO47bbboqKiIi666KKC2nfq1CmOPvro+PrXvx5PPfVU/O53v4snnngiFi1a1OJjyRdwDB48OE477bQ46qijYvvtt2/2fh544IG48MILi3LMAAAArUnAkY2Ao4O59dZb4/3334+LLrooevXqVdA2Xbt2jf322y/222+/qK+vj+effz6mTZsW06ZNi9dee61Zx/Huu+/mXL///vu36Fkg//znP+Pss8+OmTNnGnQAACBJAo5sBBwd0D333BNPPfVUXHHFFfGlL30p07YVFRUxdOjQGDp0aJxzzjkxZ86cePzxx+Oll16KOXPmxNy5c/POlqisrIyuXbuW5NxWr14d1157bVx//fWxZs0agw0AACRLwJGNgKODWrBgQRx//PHxta99Lb73ve9FdXV1s/oZNGhQnHLKKRssW7lyZSxYsCBWrVoVq1evjtra2qitrY2qqqqorq6Orbbaquivo62trY2pU6fGjTfeGG+99ZYBBgAAkpcv4KioqFCk9Qg4Orj7778/HnzwwRg5cmSMGzcuhgwZ0uI+e/ToEdttt12rHH9NTU1MmjQpbr311liyZIkBBQAA2g0zOLIRcBB1dXXxwAMPxAMPPBCf//zn49RTT43hw4dH587le3ksXLgwbrnllrjzzjtjxYoVBhEAAGh3BBzZCDjYwB/+8If4wx/+EP369YsDDzwwRo4cGZ/5zGfKIuxYsWJFTJ8+PR599NF49NFHPWMDAABo1+rq6nKuF3BsSMBBo957772YPHlyTJ48+b9hx7777hvDhg2LAQMGtNpxLFq0KH73u9/FY489FjNnzoy1a9caHAAAoEMwgyMbAQd5rR92RERsscUWMWzYsBg6dGgMGzYshgwZEt26dSv6fi+++OL4xS9+EfX19QYBAADocPL9FhJwbEjAQWbvvPNOPPzww/Hwww//d1m/fv1iyy23jAEDBsSWW2753//cs2fPqKura/T/dtxxxxg2bFiT+6mtrRVuAAAAJdPUW0iKsTzrG04aa58vwBBw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AAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAe4IDAAAA2BMcAAAAwJ7gAAAAAPYEBwAAALAnOAAAAIA9wQEAAADsCQ4AAABgT3AAAAAAewHYlw7VcO6u1QAAAABJRU5ErkJgglRDTVAAAAACAAADMFRQRTIAAAASAAADQW5hciBTb2Z0d2FyZSBMTEMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+MYxAAIa2IMCACNax9X////////yEJ/V0ACEIyMhCEZTkZ0+5O7LJ88LsHC9jof+v/t/////m9ZUXPM5zoxUO7kVVIcPMLk/+MYxBkIs2YkCACNasYgJMCyKdDVhy4f/6rr/dq/2/////9Nf6vVHdjFKKVSsZxLlOEspJ5spV3g3Rqm6h+3/Yn+jvv31Sis/+MYxDEJU14gCACNTbovf6f//TqsjrdFOxChUR5qsFMld3kDguZF5yJxwqof//7//v///b937f78l2bIZqq2dGS3Qx7mbWcY/+MYxEYKU2IcCACNTXb03HJB7boPk1lbWt7Ofl/+Z1////+1tzRbCMAU1YCPZLAI6B6QEbBsMRoXsb/sybvZelHZlVztof0+/+MYxFcIo2IkCABNZ9///6Nm6b2otZgYgczwEZ2p2LSzE8rNIgaREYoB/5/l+X31+v+X////L6BPh5zAzIvSIyK0RoqaaYWD/+MYxG8JO2IcCABNTWjJCNJ06gO8v//X///////+3/+Vm+u8a5NskpCto+I56a50cyF6hrgHrgfP/0Tv+jehmbfu6+qSqzMy/+MYxIUKm2IYAACNTf007df/p//9r9kUkWQDUmHDKRT0tjhYfEEUfKKLKgGp9NVfKm2tdNe//1r////9aMz3ViOoM8450Lhx/+MYxJUJE2okEABTTIfFk4wF5autKThAMqQflQBbv1mxs2Xb+synaSnLpek2JsN1aS5OzPCAUMaFjBAq+Cr/TrR9syzb+zOz/+MYxKsJe1ooEABNSWjlUZHQMhiqUOyVIoOyod7Rpy2e5ezG5d/7fLd/rdnK99U9hSnvYVOOpZKSky5AycYkjlERorFZpz6q/+MYxMALC2YYAACNMARJ5/l/1tbPN/l/////q+n6tvMg1GVzjrCqTdRaMComMIGR08aF3TPkwwCxKgHWCZm16gO/+cjZXL39/+MYxM4K224cEACTTBvP6Efy////hCMbYrxjGdooKYmWPlHkNMEKEVFZEJ+B05oeC6rI+NYKUQkUAAVJ//+lz8gzIB9Tljss/+MYxN0IS2pgGAGTokIlM/50vGPZv9K8TKVKUJKstKE6PDZsLMqLtSFLxAyJZISgAghBaFkexwBZ+/36z9ra9i7pReoA6ZZS/+MYxPYRI2IIAACTEWYFmMXs6W6/Uk8McGNWTEFNRTMuOTguMqqqqqqqqqqqqqqqqqqqqqr1R/23KVXmSmS3dwbdCmaHtMJr/+MYxOwMk2IoGABTSXdXapSMpZTuc5Aw6au+ddmtX8jXLN+23KnY15r4xkU0XjjCBcVSiPM2LPyIYLAcwhEaIRSSxFUD/9dx/+MYxPQNQ2IcEABTSfnX5c/n/f///+Hj9rbpjbvzVpVRhOsPMpObUYe+kbi64rIDCBR4dErKdJUH/ov18JSOWv0Us4ucJ/k//+MYxPoOA2IgGABTSf13S90jlDau7RIS5tTYuisOSfSIECkm5jgqQgcwhKhiAaRqHKA4WTH/2/dirvfsyNelnI0+ZXDOhJ2Y/+MYxP0Hw2JcGAAMv0mZSEScqeiUd6vZUd63dfp+nvtttmevPexF0OU+ObqNXtJF6GzGXzYpo2RJb45u+XQgZsx6K///usIH/+MYxP8SS2YIAACTEEToCx1n//yP///v9799VbUJeql4pw429VgnNkiNFJlslPoiYUHJtNHSXIX/97No7ITqzd1OY2ZGTeyg/+MYxPALo2IgEABTSNgiMRgSOyKQxUYxbIh2mmYiHOr9PnZf3/xjKdqOY9yduI7g1BiCOiqPcFRNrCA0QilQEDoVBeZQ1KsD/+MYxPwNs2YcEABTSEX+tZP4KKcrLVn8//////87Z/dlugZoWuhCj1IB5NvNBhxKZ2LXY1AXiSIIRGIXy/79JyXRUPZqkYyH/+MYxP8R624MAACZEMyg1hXOx6MMCqzs6/S7r2f1WmS5Vl3KvD3mJxUYky04oj5XFVDzQVktSKYRKhW5GSVSzxOjqv/L/v5n/+MYxPIMO2IoEABTSaORi0aUwmzP0RDU0uKYaAzPXc0ROf////b//xeT3yFasgVF/VqCZxLB2BASWwhYVYeisiTFPfln+H/m/+MYxPwSg2IIAACTEcr6P5e9f//3p4/13SqHrSA4p4LNgAjRYTBIIhWundYhZIWiWsSRZWoTUNnV9lkZUe575EZ1RTUkTMiM/+MYxO0Lq2IgEABNSc6ShpSK6Kf5nVJe3v/pG0pelJM3OKOVypAihMwyTI0tOJxKntMISAjRrrcHBYnKJFxIQbUbj//9/LO4/+MYxPkQo2oMCACTLLuulzbiIs+X/n/wj8h2PWX3xb9Yo9ldUSygeQNFowRSZQiKSA2yYUR4PRt6m/vX8JlFxCmyKdGB+Zsn/+MYxPEN82YQAABNEFZLLvTxuF1V+pbW7T20iQ8koqgFCZ5KSZGOUuycUONtmUqTYWcm+kzvX2/9mRGlL0VkOpsxCHIdy2dG/+MYxPQL02IkGABNSTERVmXYIQmRX2KVlZHV1s03TWjtXjDXZ7jvlTRRJpG//WWyYgjJWDYoqPFBMtjgsIUIICQ0hCUHvH/7/+MYxP8Rm2oMCACTLP7935FXnl////+X89/GL22sZapNljUSFE5X20iHGNlUC2XS4s6B5vFqF/r2WSunLOU7rY72leh2GfRV/+MYxPMMM14kEABTSTvVjXQjqxiHroermO1n0tf//c8hDbYZ3xfFBMy3OcFXnWWkcjD2Vl1kbZG4PJ6EB1DE2aGWrhcMv8vz/+MYxP0OA2ocEABTSIucBhaZMpyNak47////X035kZMsXM0WpgfZPPHxBhM5Ml43jEGEmILMQdamN//eZF/M7zJzOCM3lkog/+MYxP8Sc2IIAACTEXMiYC8mFmKIzYRmNDmyJ2XT5ePz7t35S8FYlsSjXmTQniBcjV8EFtUgbPkM0BYPqkZhSdVyV/2CU/qI/+MYxPALG2IgEABTSGIyAa4fPpOqP///zL/9ozHRbDah+3IoJFmIZqIAZadplRNoZGMeJMC6BynF9fr1/e/9Uvr9FK87KHrl/+MYxP4R82oMCACTENvbZ1+rq5dyesLxgq2KKTaixiizRYieOIROo7HxJFmVzhxNeKGc6YpuVsRf6TwGZtBfqBkhmZjGifFb/+MYxPEMQ2YcEABNSEKT+Xz779da9mcwqH7HDQfLQHaWTK0AgvCx9nJYekVVGjAcWArJiDUbasRbf7NW8c0plV6o61NpSxGb/+MYxPsQi2oQCABTEHu7JZm3ak70avcshLJee3jdia0koI15kKaysTMSVZssoRJj5IhOmyC0RtmlBj/95dY7yOzs1ymZHVti/+MYxPMMQ2I0GABNSWCABWx70I1AuSpO5rkvRWUrjJ+bs6drbzqY1NWyVm1SJVNNEOIZCRhjZokDPUQuPqipN8V+/2b2+6T9/+MYxP0N22IkGACTSSykYc9FzqRV0S/dt//eX+Mjcf4zflHwtNu02tFixT5rQTIqowqx4cdBWgD/t1TvYtKyMiIKKzkVFNPW/+MYxP8OG1osGABNSfMKcwqRGIZXY9XWd0SYTMzlPRzTU7///N8OnXxlimpJwtFkWJvfPUhTElMFllElgDdEqhIUBNEfb7n8/+MYxP8Ps2IYEACTSV/9JZ2juWM8u8CUn6+/79+38M2/XLb/ZuIlRp5HgBkrK5pgIheqKxPbSmuy+9pbkFHWKR8gDuBGxiPO/+MYxPsQs2oQEABTEN50rF/67/M+R31q6LUgfJVEC1piYKQQLtAUNTGEWNMHBlitCDExBTYCf/UpcUmecR0FFR/mAYpGMExA/+MYxPMMe14gCACNS5JujnEgB6Mj5HzmXL89wjCUcYvcxEXwiM3s5ylRLptIRhFQUxOFWGAiRkBIPhpATFy55Lb6/3/100VH/+MYxPwR+14IAACTEZzTNvMWh2scTLK5VKhGQ1TaO1zURSEPJ3/a7Ub96jDH6EZh4qdhUccMOS4UixnG6ZOKVBADgZk3NuoW/+MYxO8LG1IoEABNST8s/PnFbpkQ7LelB8kfW5b/y/e7M3NxJ83eUdjYPpd9WJKaybmbb940m9FrLbr/9PalKzKlNzndT2JZ/+MYxP0Nc2YgEABNSJaEepB3rKy3Sr1MWpURUfkZGlrT01b/b96v9miGSZ26k3WhEoHDQSwaHNkmYsgaFpipAaEODcSrB0XV/+MYxP8Rs2oQEABTELppPumv/r6//Wz5m3rMztHhcFUXBukcLICQKkkSyRSKdVNo4StCEypvv5T+9dwEBKsBOeW6chNHun85/+MYxPMQE2IMAAFTFX/L/KrdlPJr+DEIoEDMSRzjrMCz/GRpp0CIqwHrMOQRKv1MQU1Fqqr//Pnn/6c6peTlOO8rJY5Wv7W9/+MYxO0Lo2IcEABNSUVyzPHrcLItWPJzjmUNHKf+eX+t//zzv5bMmV5a1bFK501X6vyImXIyPRcpKyILli6YBuD5tFUbPf3z/+MYxPkQc2IMAACNEbqR0Xlu7pF5nfns3P+j2tnj3/WVuF0fsGwoDJ21qJKOjTnPb6zfIgifEqr7nb086Z1Oj3V2yzEdleWW/+MYxPILE2YsGACNZFSVakYh7Hn1R8Ehr0RG0qvrzN3W/r3LLknlZHai6NKtuaFbbL9TnNlA8ekfQGDyaEIEJEsQ5LUXvCUy/+MYxP8NQ2okEABTSK9qSshSwCV0mTQymSoBniZzmKyM9f/l2/e33WnSy8i/J9PpKCkmMi2FkClQ2lQTQCXlEFSFqiuPcRmr/+MYxP8SS2YIAADTEDyTiOWRV7//xf/McTjtqg6oPOQl2NMBoEZaUQH9IKCmUZFu5YoUYNWqf3uecP8i/4+iAGHimDZggiCg/+MYxPALi2IgEABNSUsEucZiQz3JCUjhl35f88vnqqzIWvZ9Srimia1gqiJSUgRBU5NHIpMhUmv1mjq80RjFVWuLQeZVMhXp/+MYxPwRm2IIAACTEdDMzRMm4UY3g0MIiRYt/vv88/bLX1bQjHIaHtSQKEU4LBOgufRvVWTQqgcihNSqKUeX+P/dkANzmZ5H/+MYxPAOS2IUCABNLSMR2ZED+v//uKfKkstutsbVdylKosQkBa9Rj7K0lkcWle8kkI3ESQpYhRf9f2tmTtYhrOcrIUNZFrZC/+MYxPELU2IkEABRZSlkUjHMl0Qh3KZVZ2Kvq1kpM82u1m75ZtR+odzxXXUmzsEzltrI2VsYTnWubegOtidCnFU4D4viF/1L/+MYxP4RC2IcEADTSOXZoSoJvXVLyRTLy2u1HynL//n+d0qeml8SPTZ8Nd5PNKcxYzoEDEY/alKPJmheZyVDkf6z06L8++lN/+MYxPQNm2IgEABRSZ5EjQ2Q2+spLP+5cmGHKTlGa7C1TgGl4Cpgy2gK1KIpJ707DPaPbXcT6bRA6inEXvykvwkNgFYZm2Ts/+MYxPgNe2IkGABTSXQ+Z1M2Zl5fX/yl5pk52zDT3IuWGbL1HY1x9qwaYT7IH+om+Hnlp/HMb7cSWT/8Py/76///v/Uv61tk/+MYxP0SK2oMCACTELzduxpqqdiZiRog9zWdJolUTCVoToGtMQU1FMy45OC4yVVVVVVVVVU3/f5HzMYKrylIkRHyMZxcgo+R/+MYxO8Mu2IUCABNLZopGo2ABAM4F2ZGjy5/Plzdfr+ErKJ7M9B6zaOWKpa4mJTZuooMiQEtGD63EUeyTcRT84TnLfdRIpDM/+MYxPcN22IgGABTSWRI2OQzyrBzrRf+dd+170JisvW2X12TIM68ck646Cnp7cjB9IGA6eX/6d1ob1pIiGU+6paaRqGdyM5z/+MYxPoOO2YkGABZSFGMUq3O9w7TMNqrFS/2+hGlT8u/OVVtfLUR3dQgsqoktOHVstUyYNk5LZAiMlw2KwHBMsy3qlJHy/y3/+MYxPwJs2ZcGABNZvhkAYsTR1owmWTmv5Z///3+Y3/1k56O9VDp1IneQ63dvfDnkko1RiCT1XJJpDzNDt6XT0pmGwnSNR1M/+MYxP8Qe2oQCABTECkfR3LpOdP6TxO/l/TLzyyd5tS31kO1NXHtmGJN4sSmCMUkrHMIWXGVkaZtESCLrIg6dxVrbUV43WdF/+MYxPgM62osGABNSG4TDEcYYBPDjMAjaa/+f+/W08+iWkj16mmPHWOJMKMJCUXUqyVFBiIHosUccRSFScM9PnYUPqe47b0A/+MYxP8SG24IAACTEDRlP0N4Uj/PrO+qh2ikhiYfIqT1FjbEHFqHuIATi8amsXLJJRUBghy7Tlfn/nMsrTv2PZzKTeHPpTiP/+MYxPELi2Y0GABNSAG1qU2pX+///1925/tuvaikaU81iFyOfXMkHLSNNGHbkE0AYePASzJM2mhGqq+z/pWU7yUiKn9uZRN//+MYxP0RE2ooGADTSPyHqcmsIjMz6dMmqf/OJJZcPeSj8neVaUIuInKzZtAUaXJQ1RdW76jTJE53EoPLzdUaf/9eiS31lDko/+MYxPMNY2IgEABRSEakRJgfq5piOwGv8yN7fn/VVGNVOpRlGScpmDlSFZw4baiHx8lRNPUlJmb5HeRFdSoGH+qd8z9Ndmez/+MYxPgNQ2YkGABRSBrvQ6K9uixzJSj//1b7HKhK6ghjLik9CL0KjKeqSSZHzDRbxsTtEaL4gURHF4JZFzfRz1nrSRWd0sqI/+MYxP4Pi2IoGADTSTFlNkJJBGBnCHViM6lDNs75EZndq/p9NhcqvM+T1uOxQyUvGidw26AEw4UOEQj7ThOjI5GWCZQwDb46/+MYxPoPm2ogEADTSP96/GakZMpJHyLzzVBKCeNGwablOe1//dfP/O/uZUMn8+e12cvLeogoik1hFAhUULasbBw+m6o/5fTn/+MYxPYOm2IYEABTLEmaHoyJANBGewKRERhB/yJDU0bvOl38vv//+/drU2eOYZWKObUTkDO5g6ocUmB8HBiUJGANFNZ0/m/L/+MYxPYOO2YUEACTSEIno76M008xGbOTD7f63//v/vbjsa+blRqj8VNjDzZTmmetldekWE7kE0RAhgGtMJIWP/t+m/5m+r1p/+MYxPgRq2IICACTLUvP2ODUjGGqxBl3mslGZWR9r0ZtWp8j/9oc1pmynQQUdmHZiA90UOaaFqRlKS5b94BSYoHDFbUbedIy/+MYxOwNk2oUAABTLH+uc/rW2b/GrKPB/k+v9v+7Zi8uy290iDI2TzYiGMCFzklWTUSlpquJJC1fmmvLlWwuSMjzdEjITZkq/+MYxPAOK2IQAABNLTidDEI2N32odQfvntSnK72LqjacGUrYRnGS7ZGkKKlKXMKOcdXggNhfSddKJcVbC6TEsy7YL7I3DM0T/+MYxPINq2YUCABTLAVEIEYBMTELZOuWPnHcmnz70L5/eiuUsRohpHIqPdDRg+NNYutKcCahlUWPfAdiQcXqb3clkXityZEz/+MYxPYQG2oUEACNEBjubD7JyDQcKDCW43yDpZ/76vyyGJ1c0V5rlnXJbHoeJoPiwzTUhiSrLESZtNcfbnM77Zt/2Mn9dXNb/+MYxPALs2IgEABNSdRoyEWlIrBIeZJpZCzb+9bz/+/W+NPU+apnxWZO9W10ZBC1JLeZJJn6fZvCD0hqf7g9I3gNkBDYCAIB/+MYxPwO62YcEABTSIJFWgmGmhyOf//P/Md9a/TdF6/lizfkmkkwi9Zl3E9lm0EFrEJhy0zvKurZkNbm6SlulDoVnMzTCCMf/+MYxPsQE2ocGABZSHRGVtCkYzuedujM6U7+0I58yXncN1C3ukiz0sepZslSbxZqIkMbpJ+Ro13iR7YlRXVaCG0akjPldWKx/+MYxPUN+2IgEABTSUzszyOyUbY6HXJDOyMazl2pu/XZKzZRz79dBnJTUc1V3OAisNMWuYKrNIaT1Ri76bBLCdVNxd+uu21f/+MYxPgOe2IgEADNSVzG8azX79n1f//6/+G1y4dn37LHkC7mOOoo0iTgmG0pw4klYaKKFIGK+v7+VvYhDXaqspXgmMrSKqVY/+MYxPkNA2YgEABNSBDIiqhJUBIyslXYaiqxzqlt637//v26/+5GVfd9w15PZEvaJpTrKiMjET0KSMkBsSaYUQBRBlX/g90R/+MYxP8Q22oMAACTLCBlNDIj7Mp57NyBMakmYVFqp9f9f+3VRU+j2t1NIiM9HECJjijROmHhXImEIwKNUD5Vf/rVeZWdKWMR/+MYxPYPU14YEACTSTdM11vY/aMJplbZmnejN9X/p7vuuUyOZCswsNEju1BxQFRxzSRD2TkhWsyRGiMTQIGFGl+/vunrDKgP/+MYxPML214sGACRSe1SERTsjUMhGN1O5VpPvX0bfP3qG8Mxv+4eY3404zRFYASQXKTUxEUOPE8uUSyKWnLpPLyms+w4jkwr/+MYxP4SC2oIAACTEMnFGmYpGZbl6vkf+Qqc98Xm4K52UeUMOTexbQeIbRiAToV6koy1BDJCvFGZFB5KFW+/xT91hSI5meCE/+MYxPANU2YQAABRLIpmnaBeM62B+H+/++/6+atl3Ws+coXE0q2ZVCyJN0IemDiR5ks5UWTLO1UpxFJ6Xd/wjg5yIzkRFo41/+MYxPUOo2YQAAFTMOcxXyHu/9qvuZ5KPl/GbbU3TlEumeXfBt86VnjU0jshdEs3qJJRMQVvvWbnCuW//6nCK1W2g4ymUMs7/+MYxPUOO2oYEACNSImkc8rafnC9rnCz98vOpqXGa6k2bHUKr6ZtEuSqKQtE0wRqVIjR0SCsfDx9SYEECl9/xGfh6ucVzOXg/+MYxPcOm2owGABTSCxmiIzn5HHc5TR1fuq+18knS2r1FtjbNJJszeh4m0x2TsINPgrNEktOKNstxbb1Tv7N3JSUjIZ1EsHZ/+MYxPcNU2okEABTSBkSujqnWmtUX6aePu7teqtekUByzhRIqg5AOQCtLI9sRLRMOEo0SPw0pKYXVdqWyL6GMQjOhIMpyKC1/+MYxPwNc2IkGABTSXDqM52RHU8iy7Mtyzd+9G6aW9qeSipUIbk9aWQLNpMYiibPZJIWNymsxhYiBiDBsoYKCiAIR66AZlxP/+MYxP8Qm2YcEADTSASgAE0mAJYTY2ApRxs6DAC68Xv/+tVUp3/H+9ixP1DMqH8JS5xKCDEKEb5BzCKGGyUUQTfVEEa9CGIJ/+MYxPcNg2YgEABTSGYVW5n////6tOefuxb3RkMjwAS3gwFWM7opwPlXIaJiCmopmXHJwXLz+U1WnMEWV3Kx8NaVSFdcZzWh/+MYxPwOw2IkGACNSScW+0LLcOqH3SVLp1HpNNH/1z3ffFbT1LVKzciZo0cQlc8oPExUaQaIZQnYg0UB49weA4RQgBRJiIon/+MYxPwRQ1oMCACTLf9ekqlzWiNW+/6Ja7zPJETuim////P2/7602/qaaImmw87LCj6T0qcomFAQ0mHIrjX/675d/U+WU5+7/+MYxPIOi2YQAABTLBJL3c7IZDknRCOyuewxhzEtXV+e9Daf1/+f+d+7rrbeNxcg2XXyoxCq2sIiBS5OJOgg5CiJhWji/9P2/+MYxPIJK2ZUGABHZu2nRjPMvaZAnM9XMz2RZJZWOioZkpbm9L/av33sSjOpQkKyCgNxEPV4VihCA52rsHmMim2iE9JprwZ//+MYxP8TI2YIAABRBPv2vn/2rcvw+jB///H/bf3epo9v6fRJpLSJ+aywXXeRLLNFpWQAhEkYAinF/5e6kOFzIErNaLEG0znO/+MYxO0Ma2IYCABNLWMnz9LX8tv5kvdQU7WTtuBVjIwFSbJeR9Co2qsoGl6EFynajKGSYgopxs1te7VVG2ulAGw6e6NoyNMz/+MYxPYQe2oMAACTEN1drq2i2p5a6+7VRVUybl1FChYqITiUlCAyhF4Dw8g/XFKjBAXkRMxkNnMbnf6L90fZfR2TrUroSqs0/+MYxO8O+2IQAACTFeU5bkRqkSIKVd3dTmazsjkoplu78v26Muh5DVzqKmGsJiJTiUBmB5VDq2kCjc0KNgNB5oqIkIpRDFuW/+MYxO4LA2IcEABNSXze0ejzQhkP+8H0cGUiRLl/PlqNeSc76UG7S2mPKKa6IpCK0Cqhm3lcxWWkdrnkepCCWMIbvlo6/54h/+MYxP0Nq2YkGABTSA4lRgEyytxj5MhI0WRkVl5vfCM49dWVUxJt9cp4mEVGyzgwRHSjLSFlGXmiFlmdjyNdueorf//7TYSv/+MYxP8P62YgGACTSJdHaXR/+f/OX////M7XEl/UDiaIGbB1WwtSl0hllGbtQZO3QlLExBoXaV6sWrpyTMtmYorNOpFBndlR/+MYxPoRw2YMAAFTFaiNZpuU6p9UcnanfSf9lOXU+7mvUtlWC6KhpgsjVEsVR4mLipo4ex5kiQWmFGnDa5Zy9RNv8y+Vk3UY/+MYxO4Na2ogEABTSCEFvX0wA3////7fcxelwYsnBJG7OJpkkwMJPg8nZzpl8o76WLJiSWKk+ylFzcXt8dqmJZxlP5wGb5tR/+MYxPMOk2IcEABTSRHX//yrIXbPQUsgwpFNbCPkSR88qwISZDHhZE7sqyXc2iciIyUlPJSVF//b86NrOit0OVMwZJMsqo9X/+MYxPMLI2okEABNSKtIyUdRJAJ7IUqtd92VdKW6f/91WFy8IXO15KtRQbyqlpRRqFTJMgqRVsjLnERAouZNhYltGnDj7/y4/+MYxP8RW2YMCACTLaq6q5HCYZnOMEZ/ty7Rzxrs/93HTpe4xekkSwNFNiBMDVQSdeJjE0+iyJ4WQkAVG2XI++l6amZAe9J8/+MYxPQMg2YcEABNSIphIBjwBQ6dzHn6Lxl5ep0nOK0IKLuRnTRxG2uw0gKspiFdA2u3InVVQidldkmRtxUGc9/f9ojyU/LN/+MYxP0OU2ogGABTSIsilIgColRPMmIHXolrtTPGcaj6vfnUg1qJO0pLDuB+LLujYYOLtyUZHFSFlEgDAiuRZWtz/MH6NtBO/+MYxP4Rs2oMCACTEJnRUK5sgCmiIMpl+f//3/1df41yVpenFk7IBUDSkzJBBXazjP7OKMI25w07Ff/1Qt6p/kur2odnRFq7/+MYxPINE14cEABNSYIzXW101KV2V5qSMXpM72us1/a7I3/+zn1byGbtaYpFFGcqRRdqSqS7LmhjDYUUSZSFa44Kk3xVGk/y/+MYxPgPI2oYEABTSP/8Dt/vrHIxy+f9//+W0v/eOXDej16uUGAkmSpGTjs1DtIgmCIGAzFh2xul2RAD+qx0TBkc97lmEBEQ/+MYxPYPI14UEABTLcHi/91Io3UMn5+XWYjacKRm2k0Vo58TrmxxFjSSLHCgTFrRNigVEZ9PVW++TP1TQu/vz3dXS6Hf81hy/+MYxPQNE2okEABNSLSv09lr6aJzJPIRRA26CYQYTGgYFAMcOvaXbZiyRc7R9cXWdaYgpqoyST4U+Hkp0uZYNi3tME+lzrO5/+MYxPoRU2oMAACTENIrcttGh3caKS59m5eWnwuuZeoRnWQWmlSkPO43PGx1KhKFmiRHwlrBilVCjLa+NkQ04u3JG3z8/MuR/+MYxO8LQ1ogEABNSXbmHPA3Qpwuu+YFr/oP/Pf62mrg1J2uWswigs1JdGJ5JC04zRlZs1FhBBgPxF9Wa4tT99V603ZjM4ys/+MYxP0Ok2ocEABTSE7OTV6bFTdOl7f9PGG7H+OVU3SnHE71lggZlKnkI5FBJY8iPxKiUohIYLFWX3UpRev/8U5BaGhkJ7KP/+MYxP0NS2okEAFTTJEYLINly//r+tb+9I4x9JlL1EnR5jvKfIkRI5CIQfD7gVBMHJ0IZRUJbj+v/J1+rVf1lVFXcrD3QwRK/+MYxP8R+2YMCADTLZnunbRKytn//jOsWzf8753ayJJpdCoaPE6NkjhpYqQr2REliY4nAjpYmSI28QduYr0V6OXuamVpH3KZ/+MYxPINO2IcEABTSJONtUs3P+ApagtCoy3VZTpU+9nlkMRO1ElggRH0Y0trTCOCnZkdRKIFtbty6///qUrf+1ymjv6//3/x/+MYxPgOW2YgEACTSF895e7z75bS3INjKLHucMNG7DGn0uix6JJM3W0xBTUUzLjk4LjJVVX0/17FXBJZNEJQxXVyS3UIOx0I/+MYxPkNE2IkGABNSVOQ7HM+7DuUt3Q7mjpUFmcjr1unl8NuVbD7m6plQSJtQIuLMFbkdTOVo4XNGpkZmZshRj5KVGyRR6oW/+MYxP8P82okOACTLDX0hZ/NMwIyV2MZOyleP56///LM+7JePftrs1g+k+jJlnog5CvNvjmcS3cDTZkDKhtl8r35yOV+jgtR/+MYxPoOQ2YYEABTSKmIjcsiPb5ZfXf7UH8zFxqUaDwmSPCizYFGwQGwyZIIX0pOLKIpjETlo1U/56E0qoAczJRAWM5G8HJA/+MYxPwK8148GABNSUZyKUXZ6Ik9o/PNrPO4Xd3k45s5ZbFOhlkKfJ2SMjFyc9KZLMjQ60Ps1iyQiQycScX711gnjk89MiiI/+MYxP8TC2oIAACTEM0f+Z/SNfy///f9lc5XLIHLMz46Yck2h2K0dtqT0bECVySOS9qTEGr9rfbPd2TQq7VMzuRDg3vYJJEn/+MYxO0ME2YcEABNSJ2RxzMIKcrhC0U0F3kImjyb03for+r/zq1OmMvJ/7vbWJlSA5zVyGFyjBs22U4ODIPh4hDbrVUbv/ln/+MYxPcNW2YcEABNSGWrMglL8cicpXM60b///+8h4bKpxqdMwhMvkpTs/hZPkDJUtJu2TccDTSJKRRGOl+v/1//9Omu/2pdE/+MYxPwPu2oQCABTLHWi9r07yp99tVRSsxysZJwFXKcDYBwxzjoPraIHIgUpiCmopmXHJwp268/L++7oMjOERqsPR/WT59fe/+MYxPgMU1ooGABTSLv/8+5at2WSQuEzX00HAFGyipKM5p5VFojkAmjknWmIKaimZccnBdUObf4ovk//MMX///X/yt/uOXlx/+MYxP8SW2IIAACTEKktqFqTxCJSJF/JNmSImOhln2AosFn0lTEFNRTMuOTguMlVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPAMw2IgEABTSVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OC4yVVVVVVVVVVVV/+MYxPgK215IGACNTFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8MW2I4GABNSFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8Ks1oUGABTZVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxP8AAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVEFHMTAgU2Vjb25kcyBvZiBTaWxlbmNlAAAAAAAAAAAAQW5hciBTb2Z0d2FyZSBMTEMAAAAAAAAAAAAAAAAAQmxhbmsgQXVkaW8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8=";
1034
+
1035
+ const getIsIOS = () => {
1036
+ if (typeof window !== "undefined") {
1037
+ return (/iPad|iPhone|iPod/.test(navigator?.userAgent) &&
1038
+ !window?.MSStream);
1039
+ }
1040
+ else {
1041
+ return false;
1042
+ }
1043
+ };
1044
+ const isIOS = getIsIOS();
1045
+ class BaseWallet {
1046
+ algosdk;
1047
+ algodClient;
1048
+ keepWCAlive;
1049
+ constructor(algosdk, algodClient) {
1050
+ this.algosdk = algosdk;
1051
+ this.algodClient = algodClient;
1052
+ this.keepWCAlive = new Audio();
1053
+ }
1054
+ async healthCheck() {
1055
+ return await this.algodClient.healthCheck().do();
1056
+ }
1057
+ async getAccountInfo(address) {
1058
+ const accountInfo = await this.algodClient.accountInformation(address).do();
1059
+ if (!accountInfo) {
1060
+ throw new Error("Unable to get account information");
1061
+ }
1062
+ return accountInfo;
1063
+ }
1064
+ async getAssets(address) {
1065
+ const accountInfo = await this.algodClient.accountInformation(address).do();
1066
+ if (!accountInfo || accountInfo.assets === undefined) {
1067
+ throw new Error("Unable to get account assets");
1068
+ }
1069
+ return accountInfo.assets;
1070
+ }
1071
+ async waitForConfirmation(txId, timeout = 4) {
1072
+ const confirmation = (await this.algosdk.waitForConfirmation(this.algodClient, txId, timeout));
1073
+ return { txId, ...confirmation };
1074
+ }
1075
+ decodeTransaction = (txn, isSigned) => {
1076
+ return isSigned
1077
+ ? this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))).txn
1078
+ : this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
1079
+ };
1080
+ logEncodedTransaction(txn, isSigned) {
1081
+ const txnObj = this.decodeTransaction(txn, isSigned);
1082
+ console.log("TRANSACTION", {
1083
+ isSigned,
1084
+ from: txnObj.from && this.algosdk.encodeAddress(txnObj.from.publicKey),
1085
+ to: txnObj.to && this.algosdk.encodeAddress(txnObj.to.publicKey),
1086
+ type: txnObj.type,
1087
+ txn: txnObj,
1088
+ });
1089
+ }
1090
+ groupTransactionsBySender(transactions) {
1091
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1092
+ function groupBy(objectArray, property) {
1093
+ return objectArray.reduce(function (acc, obj) {
1094
+ const key = obj[property];
1095
+ if (!acc[key]) {
1096
+ acc[key] = [];
1097
+ }
1098
+ acc[key].push(obj);
1099
+ return acc;
1100
+ }, {});
1101
+ }
1102
+ const decodedGroup = transactions.reduce((acc, [type, txn], index) => {
1103
+ if (type === "u") {
1104
+ const decodedTxn = this.decodeTransaction(txn, false);
1105
+ const from = decodedTxn.from
1106
+ ? this.algosdk.encodeAddress(decodedTxn.from.publicKey)
1107
+ : "";
1108
+ const to = decodedTxn.to
1109
+ ? this.algosdk.encodeAddress(decodedTxn.to.publicKey)
1110
+ : "";
1111
+ const type = decodedTxn.type || "";
1112
+ const amount = Number(decodedTxn.amount) || 0; // convert from bigint to number
1113
+ const txnObj = {
1114
+ groupIndex: index,
1115
+ amount,
1116
+ from,
1117
+ to,
1118
+ type,
1119
+ txn,
1120
+ };
1121
+ acc.push(txnObj);
1122
+ }
1123
+ return acc;
1124
+ }, []);
1125
+ return groupBy(decodedGroup, "from");
1126
+ }
1127
+ async sendRawTransactions(transactions, waitRoundsToConfirm) {
1128
+ const sentTransaction = await this.algodClient
1129
+ .sendRawTransaction(transactions)
1130
+ .do();
1131
+ if (!sentTransaction) {
1132
+ throw new Error("Transaction failed.");
1133
+ }
1134
+ const decodedTxn = this.algosdk.decodeSignedTransaction(transactions[0]);
1135
+ const waitRounds = waitRoundsToConfirm ||
1136
+ decodedTxn.txn.lastRound - decodedTxn.txn.firstRound;
1137
+ const confirmedTransaction = await this.waitForConfirmation(sentTransaction.txId, waitRounds);
1138
+ return {
1139
+ id: sentTransaction.txId,
1140
+ ...confirmedTransaction,
1141
+ };
1142
+ }
1143
+ keepWCAliveStart() {
1144
+ // Playing an audio file prevents Wallet Connect's
1145
+ // web socket connection from being dropped when
1146
+ // iOS goes into background mode
1147
+ if (!isIOS) {
1148
+ return;
1149
+ }
1150
+ this.keepWCAlive.src = audio;
1151
+ this.keepWCAlive.autoplay = true;
1152
+ this.keepWCAlive.volume = 0;
1153
+ this.keepWCAlive.loop = true;
1154
+ this.keepWCAlive.play();
1155
+ }
1156
+ keepWCAliveStop() {
1157
+ if (!isIOS) {
1158
+ return;
1159
+ }
1160
+ this.keepWCAlive.pause();
1161
+ }
1162
+ }
1163
+
1164
+ /**
1165
+ * Helpful resources:
1166
+ * https://github.com/perawallet/connect
1167
+ */
1168
+ class PeraWalletClient extends BaseWallet {
1169
+ #client;
1170
+ id;
1171
+ provider;
1172
+ constructor({ client, id, provider, algosdk, algodClient }) {
1173
+ super(algosdk, algodClient);
1174
+ this.#client = client;
1175
+ this.id = id;
1176
+ this.provider = provider;
1177
+ }
1178
+ static async init() {
1179
+ const { algosdk, algodClient } = await Algod.init();
1180
+ const PeraWalletConnect = (await import('@perawallet/connect'))
1181
+ .PeraWalletConnect;
1182
+ const peraWallet = new PeraWalletConnect({ shouldShowSignTxnToast: false });
1183
+ return new PeraWalletClient({
1184
+ id: exports.PROVIDER_ID.PERA_WALLET,
1185
+ client: peraWallet,
1186
+ provider: providers[exports.PROVIDER_ID.PERA_WALLET],
1187
+ algosdk: algosdk,
1188
+ algodClient: algodClient,
1189
+ });
1190
+ }
1191
+ async connect(onDisconnect) {
1192
+ this.keepWCAliveStart();
1193
+ const accounts = await this.#client.connect();
1194
+ this.keepWCAliveStop();
1195
+ this.#client.connector?.on("disconnect", onDisconnect);
1196
+ if (accounts.length === 0) {
1197
+ throw new Error(`No accounts found for ${this.provider}`);
1198
+ }
1199
+ const mappedAccounts = accounts.map((address, index) => ({
1200
+ name: `Pera Wallet ${index + 1}`,
1201
+ address,
1202
+ providerId: this.provider.id,
1203
+ }));
1204
+ return {
1205
+ ...this.provider,
1206
+ accounts: mappedAccounts,
1207
+ };
1208
+ }
1209
+ async reconnect(onDisconnect) {
1210
+ const accounts = await this.#client.reconnectSession();
1211
+ this.#client.connector?.on("disconnect", onDisconnect);
1212
+ if (!accounts) {
1213
+ return null;
1214
+ }
1215
+ return {
1216
+ ...this.provider,
1217
+ accounts: accounts.map((address, index) => ({
1218
+ name: `Pera Wallet ${index + 1}`,
1219
+ address,
1220
+ providerId: this.provider.id,
1221
+ })),
1222
+ };
1223
+ }
1224
+ async disconnect() {
1225
+ await this.#client.disconnect();
1226
+ }
1227
+ formatTransactionsArray(transactions) {
1228
+ const formattedTransactions = [];
1229
+ for (const [type, txn] of transactions) {
1230
+ if (type === "s") {
1231
+ formattedTransactions.push({
1232
+ ...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1233
+ signers: [],
1234
+ });
1235
+ }
1236
+ else {
1237
+ formattedTransactions.push({
1238
+ txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1239
+ });
1240
+ }
1241
+ }
1242
+ return formattedTransactions;
1243
+ }
1244
+ async signTransactions(connectedAccounts, transactions) {
1245
+ // Decode the transactions to access their properties.
1246
+ const decodedTxns = transactions.map((txn) => {
1247
+ return this.algosdk.decodeObj(txn);
1248
+ });
1249
+ // Marshal the transactions,
1250
+ // and add the signers property if they shouldn't be signed.
1251
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1252
+ if (!("txn" in txn) &&
1253
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1254
+ acc.push({
1255
+ txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1256
+ });
1257
+ }
1258
+ else {
1259
+ acc.push({
1260
+ txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1261
+ signers: [],
1262
+ });
1263
+ }
1264
+ return acc;
1265
+ }, []);
1266
+ // Play an audio file to keep Wallet Connect's web socket open on iOS
1267
+ // when the user goes into background mode.
1268
+ this.keepWCAliveStart();
1269
+ // Sign them with the client.
1270
+ const result = await this.#client.signTransaction([txnsToSign]);
1271
+ this.keepWCAliveStop();
1272
+ // Join the newly signed transactions with the original group of transactions.
1273
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1274
+ if (!("txn" in txn)) {
1275
+ const signedByUser = result.shift();
1276
+ signedByUser && acc.push(signedByUser);
1277
+ }
1278
+ else {
1279
+ acc.push(transactions[i]);
1280
+ }
1281
+ return acc;
1282
+ }, []);
1283
+ return signedTxns;
1284
+ }
1285
+ async signEncodedTransactions(transactions) {
1286
+ const transactionsToSign = this.formatTransactionsArray(transactions);
1287
+ this.keepWCAliveStart();
1288
+ const result = (await this.#client.signTransaction([
1289
+ transactionsToSign,
1290
+ ]));
1291
+ this.keepWCAliveStop();
1292
+ const signedTransactions = [];
1293
+ let resultIndex = 0;
1294
+ for (const [type, txn] of transactions) {
1295
+ if (type === "u") {
1296
+ signedTransactions.push(result[resultIndex]);
1297
+ resultIndex++;
1298
+ }
1299
+ else {
1300
+ signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1301
+ }
1302
+ }
1303
+ return signedTransactions;
1304
+ }
1305
+ }
1306
+
1307
+ /**
1308
+ * Helpful resources:
1309
+ * https://github.com/randlabs/myalgo-connect
1310
+ */
1311
+ class MyAlgoWalletClient extends BaseWallet {
1312
+ #client;
1313
+ id;
1314
+ provider;
1315
+ constructor({ client, id, provider, algosdk, algodClient }) {
1316
+ super(algosdk, algodClient);
1317
+ this.#client = client;
1318
+ this.id = id;
1319
+ this.provider = provider;
1320
+ }
1321
+ static async init() {
1322
+ const { algosdk, algodClient } = await Algod.init();
1323
+ const MyAlgoConnect = (await import('@randlabs/myalgo-connect')).default;
1324
+ const myAlgo = new MyAlgoConnect({ disableLedgerNano: false });
1325
+ return new MyAlgoWalletClient({
1326
+ id: exports.PROVIDER_ID.MYALGO_WALLET,
1327
+ client: myAlgo,
1328
+ provider: providers[exports.PROVIDER_ID.MYALGO_WALLET],
1329
+ algosdk: algosdk,
1330
+ algodClient: algodClient,
1331
+ });
1332
+ }
1333
+ async connect() {
1334
+ const accounts = await this.#client.connect();
1335
+ if (accounts.length === 0) {
1336
+ throw new Error(`No accounts found for ${this.provider}`);
1337
+ }
1338
+ const mappedAccounts = accounts.map((account) => ({
1339
+ ...account,
1340
+ providerId: this.provider.id,
1341
+ }));
1342
+ return {
1343
+ ...this.provider,
1344
+ accounts: mappedAccounts,
1345
+ };
1346
+ }
1347
+ async reconnect() {
1348
+ return null;
1349
+ }
1350
+ async disconnect() {
1351
+ return;
1352
+ }
1353
+ async signTransactions(connectedAccounts, transactions) {
1354
+ // Decode the transactions to access their properties.
1355
+ const decodedTxns = transactions.map((txn) => {
1356
+ return this.algosdk.decodeObj(txn);
1357
+ });
1358
+ // Get the unsigned transactions.
1359
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1360
+ // If the transaction isn't already signed and is to be sent from a connected account,
1361
+ // add it to the arrays of transactions to be signed.
1362
+ if (!("txn" in txn) &&
1363
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1364
+ acc.push(transactions[i]);
1365
+ }
1366
+ return acc;
1367
+ }, []);
1368
+ // Sign them with the client.
1369
+ const result = await this.#client.signTransaction(txnsToSign);
1370
+ // Join the newly signed transactions with the original group of transactions.
1371
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1372
+ if (!("txn" in txn)) {
1373
+ const signedByUser = result.shift()?.blob;
1374
+ signedByUser && acc.push(signedByUser);
1375
+ }
1376
+ else {
1377
+ acc.push(transactions[i]);
1378
+ }
1379
+ return acc;
1380
+ }, []);
1381
+ return signedTxns;
1382
+ }
1383
+ async signEncodedTransactions(transactions) {
1384
+ const transactionsToSign = [];
1385
+ const signedRawTransactions = [];
1386
+ for (const [type, txn] of transactions) {
1387
+ if (type === "u") {
1388
+ transactionsToSign.push(txn);
1389
+ }
1390
+ }
1391
+ const result = await this.#client.signTransaction(transactionsToSign);
1392
+ if (!result) {
1393
+ throw new Error("Signing failed.");
1394
+ }
1395
+ let resultIndex = 0;
1396
+ for (const [type, txn] of transactions) {
1397
+ if (type === "u") {
1398
+ signedRawTransactions.push(result[resultIndex].blob);
1399
+ resultIndex++;
1400
+ }
1401
+ else {
1402
+ signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1403
+ }
1404
+ }
1405
+ return signedRawTransactions;
1406
+ }
1407
+ }
1408
+
1409
+ class AlgoSignerClient extends BaseWallet {
1410
+ #client;
1411
+ id;
1412
+ provider;
1413
+ constructor({ client, id, provider, algosdk, algodClient }) {
1414
+ super(algosdk, algodClient);
1415
+ this.#client = client;
1416
+ this.id = id;
1417
+ this.provider = provider;
1418
+ }
1419
+ static async init() {
1420
+ if (typeof window == "undefined" ||
1421
+ window.AlgoSigner === undefined) {
1422
+ throw new Error("AlgoSigner is not available.");
1423
+ }
1424
+ const { algosdk, algodClient } = await Algod.init();
1425
+ const algoSigner = window.AlgoSigner;
1426
+ return new AlgoSignerClient({
1427
+ id: exports.PROVIDER_ID.ALGO_SIGNER,
1428
+ client: algoSigner,
1429
+ provider: providers[exports.PROVIDER_ID.ALGO_SIGNER],
1430
+ algosdk: algosdk,
1431
+ algodClient: algodClient,
1432
+ });
1433
+ }
1434
+ async connect() {
1435
+ await this.#client.connect();
1436
+ let ledger = "MainNet";
1437
+ if (NODE_NETWORK === "mainnet") {
1438
+ ledger = "MainNet";
1439
+ }
1440
+ else if (NODE_NETWORK === "betanet") {
1441
+ ledger = "BetaNet";
1442
+ }
1443
+ else if (NODE_NETWORK === "testnet") {
1444
+ ledger = "TestNet";
1445
+ }
1446
+ else if (!!NODE_NETWORK) {
1447
+ ledger = NODE_NETWORK;
1448
+ }
1449
+ const accounts = await this.#client.accounts({
1450
+ ledger,
1451
+ });
1452
+ if (accounts.length === 0) {
1453
+ throw new Error(`No accounts found for ${this.provider}`);
1454
+ }
1455
+ const mappedAccounts = accounts.map(({ address }, index) => ({
1456
+ name: `AlgoSigner ${index + 1}`,
1457
+ address,
1458
+ providerId: this.provider.id,
1459
+ }));
1460
+ return {
1461
+ ...this.provider,
1462
+ accounts: mappedAccounts,
1463
+ };
1464
+ }
1465
+ async reconnect(onDisconnect) {
1466
+ if (window === undefined ||
1467
+ window.AlgoSigner === undefined) {
1468
+ onDisconnect();
1469
+ }
1470
+ return null;
1471
+ }
1472
+ async disconnect() {
1473
+ return;
1474
+ }
1475
+ formatTransactionsArray(transactions) {
1476
+ const formattedTransactions = transactions.map(([type, txn]) => {
1477
+ const formattedTxn = {
1478
+ txn: txn[1],
1479
+ };
1480
+ if (type === "s") {
1481
+ formattedTxn.signers = [];
1482
+ const decoded = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64")));
1483
+ formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.txn.toByte());
1484
+ }
1485
+ else {
1486
+ const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
1487
+ formattedTxn.txn = this.#client.encoding.msgpackToBase64(decoded.toByte());
1488
+ }
1489
+ return formattedTxn;
1490
+ });
1491
+ return formattedTransactions;
1492
+ }
1493
+ async signTransactions(connectedAccounts, transactions) {
1494
+ // Decode the transactions to access their properties.
1495
+ const decodedTxns = transactions.map((txn) => {
1496
+ return this.algosdk.decodeObj(txn);
1497
+ });
1498
+ // Marshal the transactions,
1499
+ // and add the signers property if they shouldn't be signed.
1500
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1501
+ const txnObj = {
1502
+ txn: this.#client.encoding.msgpackToBase64(transactions[i]),
1503
+ };
1504
+ if ("txn" in txn ||
1505
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1506
+ txnObj.txn = this.#client.encoding.msgpackToBase64(this.algosdk.decodeSignedTransaction(transactions[i]).txn.toByte());
1507
+ txnObj.signers = [];
1508
+ }
1509
+ acc.push(txnObj);
1510
+ return acc;
1511
+ }, []);
1512
+ // Sign them with the client.
1513
+ const result = await this.#client.signTxn(txnsToSign);
1514
+ // Join the newly signed transactions with the original group of transactions.
1515
+ const signedTxns = result.reduce((acc, txn, i) => {
1516
+ if (txn) {
1517
+ acc.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
1518
+ }
1519
+ else {
1520
+ acc.push(transactions[i]);
1521
+ }
1522
+ return acc;
1523
+ }, []);
1524
+ return signedTxns;
1525
+ }
1526
+ async signEncodedTransactions(transactions) {
1527
+ const transactionsToSign = this.formatTransactionsArray(transactions);
1528
+ const result = await this.#client.signTxn(transactionsToSign);
1529
+ if (!result) {
1530
+ throw new Error("Signing failed.");
1531
+ }
1532
+ const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
1533
+ if (txn) {
1534
+ signedTxns.push(new Uint8Array(Buffer.from(txn.blob, "base64")));
1535
+ }
1536
+ if (txn === null) {
1537
+ signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
1538
+ }
1539
+ return signedTxns;
1540
+ }, []);
1541
+ return signedRawTransactions;
1542
+ }
1543
+ }
1544
+
1545
+ class DeflyWalletClient extends BaseWallet {
1546
+ #client;
1547
+ id;
1548
+ provider;
1549
+ constructor({ client, id, provider, algosdk, algodClient }) {
1550
+ super(algosdk, algodClient);
1551
+ this.#client = client;
1552
+ this.id = id;
1553
+ this.provider = provider;
1554
+ }
1555
+ static async init() {
1556
+ const { algosdk, algodClient } = await Algod.init();
1557
+ const DeflyWalletConnect = (await import('@blockshake/defly-connect'))
1558
+ .DeflyWalletConnect;
1559
+ const deflyWallet = new DeflyWalletConnect({
1560
+ shouldShowSignTxnToast: false,
1561
+ });
1562
+ return new DeflyWalletClient({
1563
+ id: exports.PROVIDER_ID.DEFLY,
1564
+ client: deflyWallet,
1565
+ provider: providers[exports.PROVIDER_ID.DEFLY],
1566
+ algosdk,
1567
+ algodClient,
1568
+ });
1569
+ }
1570
+ async connect(onDisconnect) {
1571
+ const accounts = await this.#client.connect();
1572
+ this.#client.connector?.on("disconnect", onDisconnect);
1573
+ if (accounts.length === 0) {
1574
+ throw new Error(`No accounts found for ${this.provider}`);
1575
+ }
1576
+ const mappedAccounts = accounts.map((address, index) => ({
1577
+ name: `Defly Wallet ${index + 1}`,
1578
+ address,
1579
+ providerId: this.provider.id,
1580
+ }));
1581
+ return {
1582
+ ...this.provider,
1583
+ accounts: mappedAccounts,
1584
+ };
1585
+ }
1586
+ async reconnect(onDisconnect) {
1587
+ const accounts = await this.#client.reconnectSession();
1588
+ this.#client.connector?.on("disconnect", onDisconnect);
1589
+ if (!accounts) {
1590
+ return null;
1591
+ }
1592
+ return {
1593
+ ...this.provider,
1594
+ accounts: accounts.map((address, index) => ({
1595
+ name: `Defly Wallet ${index + 1}`,
1596
+ address,
1597
+ providerId: this.provider.id,
1598
+ })),
1599
+ };
1600
+ }
1601
+ async disconnect() {
1602
+ await this.#client.disconnect();
1603
+ }
1604
+ formatTransactionsArray(transactions) {
1605
+ const formattedTransactions = [];
1606
+ for (const [type, txn] of transactions) {
1607
+ if (type === "s") {
1608
+ formattedTransactions.push({
1609
+ ...this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1610
+ signers: [],
1611
+ });
1612
+ }
1613
+ else {
1614
+ formattedTransactions.push({
1615
+ txn: this.algosdk.decodeUnsignedTransaction(new Uint8Array(Buffer.from(txn, "base64"))),
1616
+ });
1617
+ }
1618
+ }
1619
+ return formattedTransactions;
1620
+ }
1621
+ async signTransactions(connectedAccounts, transactions) {
1622
+ // Decode the transactions to access their properties.
1623
+ const decodedTxns = transactions.map((txn) => {
1624
+ return this.algosdk.decodeObj(txn);
1625
+ });
1626
+ // Marshal the transactions,
1627
+ // and add the signers property if they shouldn't be signed.
1628
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1629
+ if (!("txn" in txn) &&
1630
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1631
+ acc.push({
1632
+ txn: this.algosdk.decodeUnsignedTransaction(transactions[i]),
1633
+ });
1634
+ }
1635
+ else {
1636
+ acc.push({
1637
+ txn: this.algosdk.decodeSignedTransaction(transactions[i]).txn,
1638
+ signers: [],
1639
+ });
1640
+ }
1641
+ return acc;
1642
+ }, []);
1643
+ // Sign them with the client.
1644
+ const result = await this.#client.signTransaction([txnsToSign]);
1645
+ // Join the newly signed transactions with the original group of transactions.
1646
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1647
+ if (!("txn" in txn)) {
1648
+ const signedByUser = result.shift();
1649
+ signedByUser && acc.push(signedByUser);
1650
+ }
1651
+ else {
1652
+ acc.push(transactions[i]);
1653
+ }
1654
+ return acc;
1655
+ }, []);
1656
+ return signedTxns;
1657
+ }
1658
+ async signEncodedTransactions(transactions) {
1659
+ const transactionsToSign = this.formatTransactionsArray(transactions);
1660
+ const result = await this.#client.signTransaction([
1661
+ transactionsToSign,
1662
+ ]);
1663
+ const signedTransactions = [];
1664
+ let resultIndex = 0;
1665
+ for (const [type, txn] of transactions) {
1666
+ if (type === "u") {
1667
+ signedTransactions.push(result[resultIndex]);
1668
+ resultIndex++;
1669
+ }
1670
+ else {
1671
+ signedTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1672
+ }
1673
+ }
1674
+ return signedTransactions;
1675
+ }
1676
+ }
1677
+
1678
+ class ExodusClient extends BaseWallet {
1679
+ #client;
1680
+ id;
1681
+ provider;
1682
+ constructor({ client, id, provider, algosdk, algodClient }) {
1683
+ super(algosdk, algodClient);
1684
+ this.#client = client;
1685
+ this.id = id;
1686
+ this.provider = provider;
1687
+ }
1688
+ static async init() {
1689
+ if (typeof window == "undefined" ||
1690
+ window.exodus === undefined) {
1691
+ throw new Error("Exodus is not available.");
1692
+ }
1693
+ const { algosdk, algodClient } = await Algod.init();
1694
+ const exodus = window.exodus.algorand;
1695
+ return new ExodusClient({
1696
+ id: exports.PROVIDER_ID.EXODUS,
1697
+ client: exodus,
1698
+ provider: providers[exports.PROVIDER_ID.EXODUS],
1699
+ algosdk: algosdk,
1700
+ algodClient: algodClient,
1701
+ });
1702
+ }
1703
+ async connect() {
1704
+ const { address } = await this.#client.connect();
1705
+ if (!address) {
1706
+ throw new Error(`No accounts found for ${this.provider}`);
1707
+ }
1708
+ const accounts = [
1709
+ {
1710
+ name: `Exodus 1`,
1711
+ address,
1712
+ providerId: this.provider.id,
1713
+ },
1714
+ ];
1715
+ return {
1716
+ ...this.provider,
1717
+ accounts,
1718
+ };
1719
+ }
1720
+ async reconnect(onDisconnect) {
1721
+ if (window === undefined ||
1722
+ window.exodus === undefined ||
1723
+ window.exodus.algorand.isConnected !== true) {
1724
+ onDisconnect();
1725
+ }
1726
+ return null;
1727
+ }
1728
+ async disconnect() {
1729
+ return;
1730
+ }
1731
+ async signTransactions(connectedAccounts, transactions) {
1732
+ // Decode the transactions to access their properties.
1733
+ const decodedTxns = transactions.map((txn) => {
1734
+ return this.algosdk.decodeObj(txn);
1735
+ });
1736
+ // Get the unsigned transactions.
1737
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
1738
+ // If the transaction isn't already signed and is to be sent from a connected account,
1739
+ // add it to the arrays of transactions to be signed.
1740
+ if (!("txn" in txn) &&
1741
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
1742
+ acc.push(transactions[i]);
1743
+ }
1744
+ return acc;
1745
+ }, []);
1746
+ // Sign them with the client.
1747
+ const result = await this.#client.signTransaction(txnsToSign);
1748
+ // Join the newly signed transactions with the original group of transactions.
1749
+ const signedTxns = decodedTxns.reduce((acc, txn, i) => {
1750
+ if (!("txn" in txn)) {
1751
+ const signedByUser = result.shift();
1752
+ signedByUser && acc.push(signedByUser);
1753
+ }
1754
+ else {
1755
+ acc.push(transactions[i]);
1756
+ }
1757
+ return acc;
1758
+ }, []);
1759
+ return signedTxns;
1760
+ }
1761
+ async signEncodedTransactions(transactions) {
1762
+ const transactionsToSign = [];
1763
+ const signedRawTransactions = [];
1764
+ for (const [type, txn] of transactions) {
1765
+ if (type === "u") {
1766
+ const decoded = this.algosdk.decodeUnsignedTransaction(Buffer.from(txn, "base64"));
1767
+ transactionsToSign.push(decoded.toByte());
1768
+ }
1769
+ }
1770
+ const result = await this.#client.signTransaction(transactionsToSign);
1771
+ if (!result) {
1772
+ throw new Error("Signing failed.");
1773
+ }
1774
+ let resultIndex = 0;
1775
+ for (const [type, txn] of transactions) {
1776
+ if (type === "u") {
1777
+ signedRawTransactions.push(result[resultIndex]);
1778
+ resultIndex++;
1779
+ }
1780
+ else {
1781
+ signedRawTransactions.push(new Uint8Array(Buffer.from(txn, "base64")));
1782
+ }
1783
+ }
1784
+ return signedRawTransactions;
1785
+ }
1786
+ }
1787
+
1788
+ const DefaultKMDConfig = {
1789
+ host: KMD_HOST,
1790
+ token: KMD_TOKEN,
1791
+ port: KMD_PORT,
1792
+ };
1793
+ class KMDWallet extends BaseWallet {
1794
+ #client;
1795
+ walletId;
1796
+ id;
1797
+ provider;
1798
+ constructor({ client, id, provider, algosdk, algodClient }) {
1799
+ super(algosdk, algodClient);
1800
+ this.#client = client;
1801
+ this.id = id;
1802
+ this.provider = provider;
1803
+ this.walletId = "";
1804
+ }
1805
+ static async init() {
1806
+ // TODO: allow diff config options?
1807
+ const kmdConfig = DefaultKMDConfig;
1808
+ const { algosdk, algodClient } = await Algod.init();
1809
+ const kmdClient = new algosdk.Kmd(kmdConfig.token, kmdConfig.host, kmdConfig.port);
1810
+ return new KMDWallet({
1811
+ id: exports.PROVIDER_ID.KMD_WALLET,
1812
+ client: kmdClient,
1813
+ provider: providers[exports.PROVIDER_ID.KMD_WALLET],
1814
+ algosdk: algosdk,
1815
+ algodClient: algodClient,
1816
+ });
1817
+ }
1818
+ async connect() {
1819
+ // TODO: prompt for wallet and password?
1820
+ return {
1821
+ ...this.provider,
1822
+ accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
1823
+ };
1824
+ }
1825
+ async disconnect() {
1826
+ return;
1827
+ }
1828
+ async reconnect() {
1829
+ return {
1830
+ ...this.provider,
1831
+ accounts: await this.listAccounts(KMD_WALLET$1, await this.requestPassword()),
1832
+ };
1833
+ }
1834
+ async requestPassword() {
1835
+ // TODO: store it locally?
1836
+ const pw = prompt("gib password");
1837
+ return pw ? pw : "";
1838
+ }
1839
+ async getWalletToken(walletId, password) {
1840
+ const handleResp = await this.#client.initWalletHandle(walletId, password);
1841
+ return handleResp.wallet_handle_token;
1842
+ }
1843
+ async releaseToken(token) {
1844
+ await this.#client.releaseWalletHandle(token);
1845
+ }
1846
+ async listWallets() {
1847
+ const walletResponse = await this.#client.listWallets();
1848
+ const walletList = walletResponse["wallets"];
1849
+ const walletMap = {};
1850
+ for (const w of walletList) {
1851
+ walletMap[w.name] = w.id;
1852
+ }
1853
+ return walletMap;
1854
+ }
1855
+ async listAccounts(wallet, password) {
1856
+ const walletMap = await this.listWallets();
1857
+ if (!(wallet in walletMap))
1858
+ throw Error("No wallet named: " + wallet);
1859
+ this.walletId = walletMap[wallet];
1860
+ // Get a handle token
1861
+ const token = await this.getWalletToken(this.walletId, password);
1862
+ // Fetch accounts and format them as lib expects
1863
+ const listResponse = await this.#client.listKeys(token);
1864
+ const addresses = listResponse["addresses"];
1865
+ const mappedAccounts = addresses.map((address, index) => {
1866
+ return {
1867
+ name: `KMDWallet ${index + 1}`,
1868
+ address,
1869
+ providerId: this.provider.id,
1870
+ };
1871
+ });
1872
+ // Release handle token
1873
+ this.releaseToken(token);
1874
+ return mappedAccounts;
1875
+ }
1876
+ async signTransactions(connectedAccounts, transactions) {
1877
+ // Decode the transactions to access their properties.
1878
+ const decodedTxns = transactions.map((txn) => {
1879
+ return this.algosdk.decodeObj(txn);
1880
+ });
1881
+ // Get a handle token
1882
+ const pw = await this.requestPassword();
1883
+ const token = await this.getWalletToken(this.walletId, pw);
1884
+ const signedTxns = [];
1885
+ // Sign them with the client.
1886
+ const signingPromises = [];
1887
+ for (const idx in decodedTxns) {
1888
+ const dtxn = decodedTxns[idx];
1889
+ // push the incoming txn into signed, we'll overwrite it later
1890
+ signedTxns.push(transactions[idx]);
1891
+ // Its already signed, skip it
1892
+ if (!("snd" in dtxn))
1893
+ continue;
1894
+ // Not to be signed by our signer, skip it
1895
+ if (!connectedAccounts.includes(this.algosdk.encodeAddress(dtxn.snd)))
1896
+ continue;
1897
+ // overwrite with an empty blob
1898
+ signedTxns[idx] = new Uint8Array();
1899
+ const txn = this.algosdk.Transaction.from_obj_for_encoding(dtxn);
1900
+ signingPromises.push(this.#client.signTransaction(token, pw, txn));
1901
+ }
1902
+ const signingResults = await Promise.all(signingPromises);
1903
+ // Restore the newly signed txns in the correct order
1904
+ let signedIdx = 0;
1905
+ for (const idx in signedTxns) {
1906
+ // If its an empty array, infer that it is one of the
1907
+ // ones we wanted to have signed and overwrite the empty buff
1908
+ if (signedTxns[idx].length === 0) {
1909
+ signedTxns[idx] = signingResults[signedIdx];
1910
+ signedIdx += 1;
1911
+ }
1912
+ }
1913
+ return signedTxns;
1914
+ }
1915
+ signEncodedTransactions(transactions) {
1916
+ throw new Error("Method not implemented.");
1917
+ }
1918
+ }
1919
+
1920
+ class WalletConnectClient extends BaseWallet {
1921
+ #client;
1922
+ id;
1923
+ provider;
1924
+ constructor({ client, id, provider, algosdk, algodClient }) {
1925
+ super(algosdk, algodClient);
1926
+ this.#client = client;
1927
+ this.id = id;
1928
+ this.provider = provider;
1929
+ }
1930
+ static async init() {
1931
+ const { algosdk, algodClient } = await Algod.init();
1932
+ const WalletConnect = (await import('@walletconnect/client')).default;
1933
+ const QRCodeModal = (await import('algorand-walletconnect-qrcode-modal'))
1934
+ .default;
1935
+ const walletConnect = new WalletConnect({
1936
+ bridge: "https://bridge.walletconnect.org",
1937
+ qrcodeModal: QRCodeModal,
1938
+ });
1939
+ const initWallet = {
1940
+ id: exports.PROVIDER_ID.WALLET_CONNECT,
1941
+ client: walletConnect,
1942
+ provider: providers[exports.PROVIDER_ID.WALLET_CONNECT],
1943
+ algosdk: algosdk,
1944
+ algodClient: algodClient,
1945
+ };
1946
+ return new WalletConnectClient(initWallet);
1947
+ }
1948
+ async connect() {
1949
+ let chainId = 416001;
1950
+ if (NODE_NETWORK === "betanet") {
1951
+ chainId = 416003;
1952
+ }
1953
+ else if (NODE_NETWORK === "testnet") {
1954
+ chainId = 416002;
1955
+ }
1956
+ if (!this.#client.connected) {
1957
+ await this.#client.createSession({ chainId });
1958
+ }
1959
+ return new Promise((resolve, reject) => {
1960
+ this.#client.on("connect", (error, payload) => {
1961
+ if (error) {
1962
+ reject(error);
1963
+ }
1964
+ const { accounts } = payload.params[0];
1965
+ resolve({
1966
+ ...this.provider,
1967
+ accounts: accounts.map((address, index) => ({
1968
+ name: `Wallet Connect ${index + 1}`,
1969
+ address,
1970
+ providerId: this.provider.id,
1971
+ })),
1972
+ });
1973
+ });
1974
+ this.#client.on("session_update", (error, payload) => {
1975
+ if (error) {
1976
+ reject(error);
1977
+ }
1978
+ const { accounts } = payload.params[0];
1979
+ resolve({
1980
+ ...this.provider,
1981
+ accounts: accounts.map((address, index) => ({
1982
+ name: `Wallet Connect ${index + 1}`,
1983
+ address,
1984
+ providerId: this.provider.id,
1985
+ })),
1986
+ });
1987
+ });
1988
+ });
1989
+ }
1990
+ async reconnect() {
1991
+ this.#client = (await WalletConnectClient.init()).#client;
1992
+ const accounts = this.#client.accounts;
1993
+ if (!accounts) {
1994
+ return null;
1995
+ }
1996
+ return {
1997
+ ...this.provider,
1998
+ accounts: accounts.map((address, index) => ({
1999
+ name: `Wallet Connect ${index + 1}`,
2000
+ address,
2001
+ providerId: this.provider.id,
2002
+ })),
2003
+ };
2004
+ }
2005
+ check() {
2006
+ return this.#client.connected;
2007
+ }
2008
+ async disconnect() {
2009
+ try {
2010
+ await this.#client.killSession();
2011
+ }
2012
+ catch (e) {
2013
+ console.error("Error disconnecting", e);
2014
+ }
2015
+ }
2016
+ formatTransactionsArray(transactions) {
2017
+ const formattedTransactions = transactions.map((txn) => {
2018
+ const formattedTxn = {
2019
+ txn: txn[1],
2020
+ };
2021
+ if (txn[0] === "s") {
2022
+ const decodedTxn = this.algosdk.decodeSignedTransaction(new Uint8Array(Buffer.from(txn[1], "base64")));
2023
+ formattedTxn.txn = Buffer.from(this.algosdk.encodeUnsignedTransaction(decodedTxn.txn)).toString("base64");
2024
+ formattedTxn.signers = [];
2025
+ }
2026
+ return formattedTxn;
2027
+ });
2028
+ return formattedTransactions;
2029
+ }
2030
+ async signTransactions(connectedAccounts, transactions) {
2031
+ // Decode the transactions to access their properties.
2032
+ const decodedTxns = transactions.map((txn) => {
2033
+ return this.algosdk.decodeObj(txn);
2034
+ });
2035
+ // Marshal the transactions,
2036
+ // and add the signers property if they shouldn't be signed.
2037
+ const txnsToSign = decodedTxns.reduce((acc, txn, i) => {
2038
+ if (!("txn" in txn) &&
2039
+ connectedAccounts.includes(this.algosdk.encodeAddress(txn["snd"]))) {
2040
+ acc.push({
2041
+ txn: Buffer.from(transactions[i]).toString("base64"),
2042
+ });
2043
+ }
2044
+ else {
2045
+ acc.push({
2046
+ txn: Buffer.from(transactions[i]).toString("base64"),
2047
+ signers: [],
2048
+ });
2049
+ }
2050
+ return acc;
2051
+ }, []);
2052
+ const requestParams = [txnsToSign];
2053
+ const request = utils.formatJsonRpcRequest("algo_signTxn", requestParams);
2054
+ // Play an audio file to keep Wallet Connect's web socket open on iOS
2055
+ // when the user goes into background mode.
2056
+ this.keepWCAliveStart();
2057
+ // Sign them with the client.
2058
+ const result = await this.#client.sendCustomRequest(request);
2059
+ this.keepWCAliveStop();
2060
+ // Join the newly signed transactions with the original group of transactions.
2061
+ const signedTxns = result.reduce((signedTxns, txn, i) => {
2062
+ if (txn) {
2063
+ signedTxns.push(new Uint8Array(Buffer.from(txn, "base64")));
2064
+ }
2065
+ if (txn === null) {
2066
+ signedTxns.push(transactions[i]);
2067
+ }
2068
+ return signedTxns;
2069
+ }, []);
2070
+ return signedTxns;
2071
+ }
2072
+ async signEncodedTransactions(transactions) {
2073
+ const transactionsToSign = this.formatTransactionsArray(transactions);
2074
+ const requestParams = [transactionsToSign];
2075
+ const request = utils.formatJsonRpcRequest("algo_signTxn", requestParams);
2076
+ this.keepWCAliveStart();
2077
+ const result = await this.#client.sendCustomRequest(request);
2078
+ this.keepWCAliveStop();
2079
+ const signedRawTransactions = result.reduce((signedTxns, txn, currentIndex) => {
2080
+ if (txn) {
2081
+ signedTxns.push(new Uint8Array(Buffer.from(txn, "base64")));
2082
+ }
2083
+ if (txn === null) {
2084
+ signedTxns.push(new Uint8Array(Buffer.from(transactions[currentIndex][1], "base64")));
2085
+ }
2086
+ return signedTxns;
2087
+ }, []);
2088
+ return signedRawTransactions;
2089
+ }
2090
+ }
2091
+
2092
+ const clients = {
2093
+ [exports.PROVIDER_ID.KMD_WALLET]: KMDWallet.init().catch((e) => {
2094
+ if (typeof window !== "undefined") {
2095
+ console.info("error initializing client", e);
2096
+ return;
2097
+ }
2098
+ }),
2099
+ [exports.PROVIDER_ID.PERA_WALLET]: PeraWalletClient.init().catch((e) => {
2100
+ if (typeof window !== "undefined") {
2101
+ console.info("error initializing client", e);
2102
+ return;
2103
+ }
2104
+ }),
2105
+ [exports.PROVIDER_ID.MYALGO_WALLET]: MyAlgoWalletClient.init().catch((e) => {
2106
+ if (typeof window !== "undefined") {
2107
+ console.info("error initializing client", e);
2108
+ return;
2109
+ }
2110
+ }),
2111
+ [exports.PROVIDER_ID.ALGO_SIGNER]: AlgoSignerClient.init().catch((e) => {
2112
+ if (typeof window !== "undefined") {
2113
+ console.info("error initializing client", e);
2114
+ return;
2115
+ }
2116
+ }),
2117
+ [exports.PROVIDER_ID.DEFLY]: DeflyWalletClient.init().catch((e) => {
2118
+ if (typeof window !== "undefined") {
2119
+ console.info("error initializing client", e);
2120
+ return;
2121
+ }
2122
+ }),
2123
+ [exports.PROVIDER_ID.EXODUS]: ExodusClient.init().catch((e) => {
2124
+ if (typeof window !== "undefined") {
2125
+ console.info("error initializing client", e);
2126
+ return;
2127
+ }
2128
+ }),
2129
+ [exports.PROVIDER_ID.WALLET_CONNECT]: WalletConnectClient.init().catch((e) => {
2130
+ if (typeof window !== "undefined") {
2131
+ console.info("error initializing client", e);
2132
+ return;
2133
+ }
2134
+ }),
2135
+ };
2136
+
2137
+ const getWalletClient = async (id) => {
2138
+ if (!id) {
2139
+ throw new Error("No wallet provider id provided");
2140
+ }
2141
+ const client = await clients[id];
2142
+ if (!client) {
2143
+ throw new Error(`No wallet client found for provider id: ${id}`);
2144
+ }
2145
+ return client;
2146
+ };
504
2147
 
505
2148
  function useWallet() {
506
2149
  const allAccounts = useWalletStore((state) => state.accounts);
507
2150
  const activeAccount = useWalletStore((state) => state.activeAccount);
508
- const accounts = react.useMemo(() => allAccounts.filter((account) => account.providerId === activeAccount?.providerId), [allAccounts, activeAccount]);
2151
+ const accounts = require$$0.useMemo(() => allAccounts.filter((account) => account.providerId === activeAccount?.providerId), [allAccounts, activeAccount]);
509
2152
  const signTransactions = async (transactions) => {
510
- const walletClient = await utils.getWalletClient(activeAccount?.providerId);
2153
+ const walletClient = await getWalletClient(activeAccount?.providerId);
511
2154
  if (!walletClient || !activeAccount?.address) {
512
2155
  throw new Error("No wallet found.");
513
2156
  }
514
- const signedTransactions = await walletClient.signTransactions(activeAccount.address, transactions);
2157
+ const signedTransactions = await walletClient.signTransactions(accounts.map((acct) => acct.address), transactions);
515
2158
  return signedTransactions;
516
2159
  };
517
- const sendTransactions = async (transactions) => {
518
- const walletClient = await utils.getWalletClient(activeAccount?.providerId);
519
- const result = await walletClient?.sendRawTransactions(transactions);
2160
+ const sendTransactions = async (transactions, waitRoundsToConfirm) => {
2161
+ const walletClient = await getWalletClient(activeAccount?.providerId);
2162
+ const result = await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
520
2163
  return result;
521
2164
  };
522
2165
  const signer = async (txnGroup, indexesToSign) => {
523
- const algosdk = await base.getAlgosdk();
2166
+ const algosdk = await getAlgosdk();
524
2167
  const txnBlobs = txnGroup.map(algosdk.encodeUnsignedTransaction);
525
2168
  const txns = await Promise.resolve(signTransactions(txnBlobs));
526
2169
  return txns.filter((_, index) => indexesToSign.includes(index));
@@ -528,7 +2171,7 @@ function useWallet() {
528
2171
  const getAccountInfo = async () => {
529
2172
  if (!activeAccount)
530
2173
  throw new Error("No selected account.");
531
- const walletClient = await utils.getWalletClient(activeAccount.providerId);
2174
+ const walletClient = await getWalletClient(activeAccount.providerId);
532
2175
  const accountInfo = await walletClient?.getAccountInfo(activeAccount.address);
533
2176
  return accountInfo;
534
2177
  };
@@ -538,20 +2181,20 @@ function useWallet() {
538
2181
  const getAssets = async () => {
539
2182
  if (!activeAccount)
540
2183
  throw new Error("No selected account.");
541
- const walletClient = await utils.getWalletClient(activeAccount.providerId);
2184
+ const walletClient = await getWalletClient(activeAccount.providerId);
542
2185
  return await walletClient?.getAssets(activeAccount.address);
543
2186
  };
544
2187
  const groupTransactionsBySender = async (transactions) => {
545
- const walletClient = await utils.getWalletClient(activeAccount?.providerId);
2188
+ const walletClient = await getWalletClient(activeAccount?.providerId);
546
2189
  return walletClient?.groupTransactionsBySender(transactions);
547
2190
  };
548
2191
  const signEncodedTransactions = async (transactions) => {
549
- const walletClient = await utils.getWalletClient(activeAccount?.providerId);
2192
+ const walletClient = await getWalletClient(activeAccount?.providerId);
550
2193
  return await walletClient?.signEncodedTransactions(transactions);
551
2194
  };
552
- const sendRawTransactions = async (transactions) => {
553
- const walletClient = await utils.getWalletClient(activeAccount?.providerId);
554
- return await walletClient?.sendRawTransactions(transactions);
2195
+ const sendRawTransactions = async (transactions, waitRoundsToConfirm) => {
2196
+ const walletClient = await getWalletClient(activeAccount?.providerId);
2197
+ return await walletClient?.sendRawTransactions(transactions, waitRoundsToConfirm);
555
2198
  };
556
2199
  return {
557
2200
  accounts,
@@ -589,10 +2232,10 @@ function shallow(objA, objB) {
589
2232
 
590
2233
  function useConnectWallet(options) {
591
2234
  const { accounts, setActiveAccount: setActiveAccount, activeAccount, clearActiveAccount, addAccounts, removeAccounts, } = useWalletStore(walletStoreSelector, shallow);
592
- const providers$1 = react.useMemo(() => Object.values(providers.providers)
2235
+ const providers$1 = require$$0.useMemo(() => Object.values(providers)
593
2236
  .filter(({ id }) => options?.providers
594
2237
  ? options.providers.includes(id)
595
- : id !== constants.PROVIDER_ID.KMD_WALLET)
2238
+ : id !== exports.PROVIDER_ID.KMD_WALLET)
596
2239
  .map(({ id, name, icon, isWalletConnect }) => {
597
2240
  return {
598
2241
  id,
@@ -621,7 +2264,7 @@ function useConnectWallet(options) {
621
2264
  });
622
2265
  };
623
2266
  const disconnectWCSessions = async (id) => {
624
- if (!providers.providers[id].isWalletConnect) {
2267
+ if (!providers[id].isWalletConnect) {
625
2268
  return;
626
2269
  }
627
2270
  const wcSessions = Object.values(providers$1).filter((p) => p.id !== id && p.isWalletConnect && (p.isConnected || p.isActive));
@@ -632,7 +2275,7 @@ function useConnectWallet(options) {
632
2275
  const connect = async (id) => {
633
2276
  try {
634
2277
  await disconnectWCSessions(id);
635
- const walletClient = await utils.getWalletClient(id);
2278
+ const walletClient = await getWalletClient(id);
636
2279
  const walletInfo = await walletClient.connect(() => disconnect(id));
637
2280
  if (!walletInfo || !walletInfo.accounts.length) {
638
2281
  throw new Error("Failed to connect " + id);
@@ -669,7 +2312,7 @@ function useConnectWallet(options) {
669
2312
  };
670
2313
  const reconnect = async (id) => {
671
2314
  try {
672
- const walletClient = await utils.getWalletClient(id);
2315
+ const walletClient = await getWalletClient(id);
673
2316
  const walletInfo = await walletClient?.reconnect(() => disconnect(id));
674
2317
  if (walletInfo && walletInfo.accounts.length) {
675
2318
  addAccounts(walletInfo.accounts);
@@ -682,7 +2325,7 @@ function useConnectWallet(options) {
682
2325
  };
683
2326
  const disconnect = async (id) => {
684
2327
  try {
685
- const walletClient = await utils.getWalletClient(id);
2328
+ const walletClient = await getWalletClient(id);
686
2329
  walletClient?.disconnect();
687
2330
  }
688
2331
  catch (e) {
@@ -706,19 +2349,16 @@ function useConnectWallet(options) {
706
2349
  };
707
2350
  }
708
2351
 
709
- exports.KMD_HOST = constants.KMD_HOST;
710
- exports.KMD_PASSWORD = constants.KMD_PASSWORD;
711
- exports.KMD_PORT = constants.KMD_PORT;
712
- exports.KMD_TOKEN = constants.KMD_TOKEN;
713
- exports.KMD_WALLET = constants.KMD_WALLET;
714
- exports.NODE_NETWORK = constants.NODE_NETWORK;
715
- exports.NODE_PORT = constants.NODE_PORT;
716
- exports.NODE_SERVER = constants.NODE_SERVER;
717
- exports.NODE_TOKEN = constants.NODE_TOKEN;
718
- Object.defineProperty(exports, 'PROVIDER_ID', {
719
- enumerable: true,
720
- get: function () { return constants.PROVIDER_ID; }
721
- });
2352
+ exports.KMD_HOST = KMD_HOST;
2353
+ exports.KMD_PASSWORD = KMD_PASSWORD;
2354
+ exports.KMD_PORT = KMD_PORT;
2355
+ exports.KMD_TOKEN = KMD_TOKEN;
2356
+ exports.KMD_WALLET = KMD_WALLET$1;
2357
+ exports.NODE_NETWORK = NODE_NETWORK;
2358
+ exports.NODE_PORT = NODE_PORT;
2359
+ exports.NODE_SERVER = NODE_SERVER;
2360
+ exports.NODE_TOKEN = NODE_TOKEN;
2361
+ exports.getWalletClient = getWalletClient;
722
2362
  exports.useConnectWallet = useConnectWallet;
723
2363
  exports.useWallet = useWallet;
724
2364
  //# sourceMappingURL=index.js.map