Created
October 29, 2025 22:21
-
-
Save joric/a51f95ae79b89bb69a67035eba0a9177 to your computer and use it in GitHub Desktop.
petersalomonsen-veronikaswaltz.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <html><head></head><body><h1>Veronika's waltz</h1><p><em>Copyright (c) 2022 - Peter Salomonsen</em></p><p>Physical modeling synthesis implemented in a WebAssembly binary, compressed as a PNG image and embedded in one HTML file.</p><p>Play directly or export wav, you can't do both at the same time (reload the page if you need to start over)</p><button onclick="play()">play</button> <button onclick="exportwav()">export wav</button><p>Current time: <span id="currenttime">0.0s</span>, Total length: <span id="totaltime"></span> secs</p><script type="module">const e="Peter Salomonsen",t="Veronika's waltz";const a=async e=>(await WebAssembly.instantiate(await async function(e){const t=new Image;t.crossOrigin="Anonymous",t.src=e,await t.decode();const a=document.createElement("canvas");a.width=t.width,a.height=t.height;const n=a.getContext("2d");n.drawImage(t,0,0);let s=n.getImageData(0,0,t.width,t.height).data;s=s.filter(((e,t)=>t%4==0));const d=s[0]+(s[1]<<8)+(s[2]<<16)+(s[3]<<24);return s.slice(4,d+4)}("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAB9CAAAAABo0uIRAAAAAXNSR0IArs4c6QAAPXVJREFUeNrNfQ18VMd178z92F3prtAFY7MgAXc/hPmyEQZkIVZaXWklJAthDMLYMbEhBhIjsA2WbZyAtRj8QUKS1e5KQSlNZOIk/qAJAdfGNTHYcVK7IS15L3lNGl7rtm5C2iSPvLpt3NDw/mdm7t0VH46b5vfes63dOTNnzpw5c+bMOfOxZndtZ4ytvW8zxxd/nE9Yo/XvYPjoFx+8fw2nDyYSbA3fwXes0fupFPk71jDCknk7RLXtstqONdoODxVVzX4Uo9zA5w4Bq4SuvvqpUYYKRr+ooVVxa/3dD9y19Z67N6+/u698hdu9bEnbcrenTd/B9K/zl7n4R+NhpjNm6IYeDASMQCCgmdxkzGac6RVGma6jlCGDPkyma7Ia143AGFYpkkwbq4XDhh5g43RuaHpQC2rsCsMwNIPRH9O0gKaND1yJ2pqhlWn6VUFNK6swQ6y8nJeXl5XxymDQ4CYvC5p6qDzEQuWBQMgM4b9AuWmioXDQtKygFbDMoG4GQ1aZYfB7WdjUOeOBl/nUHbyVOLT6uVv6sZ2nmfqHMviF5ZdC+h0+3hdiaTOl6eCrvNzecNemTSvWbr530/qW+zdsWL+VPc7D9wn4QwLWx1trN21aek/f+vtu3LCBPYHSj9yztW/z+vvuW/vh9Wwvn/zh9X3unX13PbD+5nvuunP9fSv61vbdf9+Ku9feC8Q+9klu3Ld+fS/7NJ9876a1D7U9AI24z717XfuF7Q7wsXfev3Urinvu2ry+G8V33adPveK+9X3dd627a9narX0r7vzI+nX3b1rPcjywef3me7Y+pDEW0v6El43lDCK2blj5gXUfuat309b77i9/6RXoWRlzmMPrNGZ5KcNPhfxU2E/Z1lc5D/Q7zP3Z+fPn9S6jmVkagfbGmO6e8/PietSM666xMaY5unvFRvfeLa7RGwsAK8Vihmv3uZWUGQsC3TEc3Qn2uqi80c1ktm9x7QdiQeQGb6hqZi7rAEpQJZhlWY6e0B3TCdjM0YiqbrnM5miH2WjN4baOT2YbKLU3WmwG5/0Oj2p6s6OBEotB2zZG0R2XNTAiwXujWhjSUb1cqEdUqh4934Ta7mw3YJsx7rA6bTrVs0VttMlFm1LD7ZAADaeoQXawBFioOw5IHKVMSEzro5oOn66FUMskkn6zzE8Z1hRiIOQGwQCT7ZQ7KmE5zEpQ7xhkd/48E6IXpGPMLZcc2wEirIiUXYZIBVpzx/dO12xXe8CaBMiudHi3IMdBzmEbHY205GuGrvdr2/WHHXYsprlTH4hyCJAaD24B/Feff+rfdVRDXiaTOal3Gs1oJJOqRCMvxwzHOCA+oqZjpHfeHv6P8+f/5vgBJaCzqRHHTLc0mH+7YuUXUwcAABN4dy37xVst+XebDqSvnlJ55vETNx8fOTDyAiiKNs4Fb6QxdVi+khRRc3/0+ad+YXRS3sv4L73rjTc3s9o73k4d+FzMoJaW/Tr6burAkyB854cmrX3evqnpwJMJyzGehQag+oT73X0cKuWmthyMBqFTgftdvc/NhKC5M/RQNJSOXJPuAY1FoP4l2Xd9C3FibD0YCzhAYk7wMSfUcgLfO57Y/bATbHFuNh52QpTY8Rhh2C1vyUITeA6lLCfwcIvzxPZYoEV7LBZ86UACOu0EWpqeQK3UE9u/HNN6HahLlRXlcSsKHXP5FmMH5ogQqikla6YP//ruPfbYnakD6QcPfrtn5cpvkrAchiLHPHAACF9uX7T38e98C9Ls+8mf/d27bKaQpun8PsfGirG9pL2YZq62pcr6MimN/p9RGodJjSGuIVTzQJR6YDiBy3QQJU4A/Qtcpn/sP6Muv6u2hC7WlrL31Jag1JbQY04ZaUtIaEtIaksZJUq0JSS0pQzaEiJtCUptCZK2hJS2BElbQpfWFuary+9tlM33qXy/Tfd8bSFV+THXQvCvXNsNwVQFhaUNCksbFJY2aI+xdTdj2xVRE/acI0mrgwmjP8a2hcpFOdlyJ+iYoq4l6mbYIW5X2JrLomgoGkBdEyYusNRoRpauQP0GARoAAy6/3zEA22OwhBmHW39U+eaJghM4PBgL2WNhPTUnZI+D8eQwtdSoE4QhRz80sGFQjiHY0J3AxqgukiDZFw1I5qxh+Fs79H6aESbNCEjJmxGme+oHfzJokKKaUme71Iww3X1vf1OWGKL0j//++BCBwpJXWqa06f2FSlolBfa/6KKyYzI391zhHCC02bro2aOpAqGmHLYv97TpcuK5r9eK6Ydb2da5qUIeawfSn3rl+IJCTMtHmSmZeQMUdjhMtpRJ5SqhYhZNKPq3EMNH65XLF7xcaP30szObciDDRDtgIT/oaHmH52Q9rL86COnueXYDEZR8Uy5yaEbJ/CIkkh1VUd3DBQvosO4+0t+hCGTCksCPGTkjMr8IMYF7g0cByJICo1EC7Y3uhL5XRJ7VxDlR3PXugSZ06VMYXOhnPia7jJ7Ifm7YsKG5gM/25lxB6fDTmGZVVphKoS+pnH2lFb3UYjpdYzHWJldrge6wmZqx17as8WLdn6mJBZoSBjL36VpZP7GEetAUfBlRaFOUQ1ENIg49JfXqxbTmsKj8fqHScIioQAdT5OWwvq1RDaMo0HSBRMqIsQ/0IRMabfbBHktqsBn2BIgK3/jT7Amk1kDRbdJ5f5qp+aQrRnQ5n0wFmnI+BQQvmE8BSRmuG/xCkCcfTxRoGwGFJO80l9DDcKyMvkKi7Ymwh2UQSqzcCeGrQIBBSaOQh6DKnHIJ+PmskAOfWHJRNegEkYEiprEcsAVsCFSJFJLFGiNaApSleVtM2o1q0sLn3Bg1ZZKmsl7iM9b73nI9fOR/16FAYk6ShRSJD1aR0B1NTDqaEh9N52PG7WSTkW+RujQXHG0wqmnN3r8k594xBuOablgkjAgGQJPzZzAmE8Qylfi+nMCyq0oyQ8U0s6vDOhYu+0oMrWZfBX2QFagU5o3cahO0ddlIzBgskofm63kHOVZJjpaPqS5RSZXHJNKhEsqytDqs/X6a9mRwqab3Xq5tWq9t9lsa9wjrgzFjVPOwXProngPFEzN03WvRri5qxHg/airGExFrH6LyfgqZMP3darfCNqPCClzslctElZcIeYlqLzEF9ceQl+/V5V5d7tUtRiYywaq91BQv4RBn9lSwUM3ExPNsFZkZYbA2YmpYv+Sa2a/tcA2sqGiSVmb3XAgGCToau1T8UQk0jeIPWBBIHuaK6c2yiiPsEhfWzD2LjhENzY5FTQEhEYAHEAYBiumiNnPkN1ffmvpGnEcMaHG4yq3/bCxI2ZMpJ3RRjuHqyDGRw7yssJ8lcpRtc8RizsQk59arumbA7gqcBI+zZxIg3Pqdk0uaCs9Mck82JeCKZEDbNhNG+uaXXlumfcBpTpD1YyjgcCvjhhDHxrj5AqK6uJnuGTfU9UN+NnUgYZa0hd6aFJoJf4cJf4cJf4c+ddehABEydyBMGiyhTALH8XDipBPNwrJ0tNDnOy2DzySC8aBdlgiJzzI7nCi3r2CJsByKeBiysytdbTMZfyZMtcN6D8v+2eNb2Yn+dAHUzU2H7asKUUNUwOhMcGilEpCigWqUS0rrd0nMkng4pgmMGD88iLFm1DAxT06bpsjZkVKpa/aky6J5yRgGnmy2UYDSi7RB6dLm7XiiAn9jLo6Pmaeg470AGSM9VWIVNzAAjC0pv2yUbZQgeZP8I35qjZ9aZ9WrZf4j9LHJXwdYKlewZ6gi5WCgPC8RCvZMn8QmP7XNCkkV8PwFZRxQl+dhgo5rXJPegsOuYRlu7BCFJlHeFmWcvrdbmHHXykmuEkRojpr2MhHyisJeIuQVhb2E7RWN9xK2VzTeS0S8omovEfGKqr2E4xUlvITjFSW8xHSvaLaXmO4VzfYStV7RfC9R6xXNlwmk6r2ypJeo95CSlPBFvd0qFzOyAWL0M/usD9F+yng34pnC92F6q2nXxy7zcFMX4aY83BThij2ZIw4/UoizwWf8paS4qFT7KcdPJfzUdD8120/VWpOIbUzDiUW+PZ6sv9OpcCd3JwhLdDoU1+wF9nxhkHyAbM7LZQog0/OUB8CrdgvlCiCr9x9eSR2Av/dKsM64Jz3gegBftBRQD+BTHrAQwD96QAOA/+4BiKTdg2EFJAEMKqAOw8vcMz5E9L7rQ4R50BBQY51G8Yj7DR9MA3pJ96AOQKd8aAmg72setIx2Pn2oB9Dfcg+6BdCvfGi1t0rP8BIzvcR0LzFbJeq1e72seV7iGi8xFyN0nQCam6mqPUuWpKi6AMhgE75dC8Bdsz4l6tT69TIpIksZ1lc0Tes3YRsQd3LEnRRBYwnr3GoIb7OvTW7YHRfR3GAlufpTH1A7JoId5LkfJveJoCWFY1FuShpqZ6XSA/V2PyyltdT95L8+p21Em3IH5J/3fO9dfeMr0oWlbR4RJMIDE1EkTHohCovqTniA4j+EB4djRuuPru5ZUCBHTWLDsTMLMTN/zM2s2fJKLJh3zDwFuhRyt/7ipwNNhdZnn50J60p7Q63TPrcNGVf8+UkEpTn8h/jLCeZaf/iPxtFCjnqz5q+bkAh6CaM143wWCevXhqFvN/q1hxF/8U8INu8gYYnUbVI0hUo1l1MiY4DQMv1S9udXV6nSzPHb1Haowwa9PFnDq89u8zdML86hllbTjvHqrSLvRD/lHYuFMEQQIQqyt22R8ZfiphCzHCu72p3ah1CL7SVHkx+DYEMYBSb2GkLeWPVT4jdBCSLqkXsRcmDbHXNrlemEjH4npHKAz2QSuFMfQKnpkTC17Q57+eux8pbv/Nu5Iz/OP/3PqR0t8x+PUpBW1jL/sR3HY5q/4fSkU0yPfAH+onYgqvs75g5/mSIeRz/g6Onr3K8+/eXhN1MH0v/rz35448qV30+NIPcz1WzRhjmvILf23taHPtn6GuWiwoGRAyPp3zwya/3iK4PNB5yyl0YOeM2e/fSJOyvYJOY13O/zkG3egAJq8nMx/Um5UaZRCJce+NgPg68c/3M0c8Nr57TWa3+MZoz0v37lp8nPHd6F3PWTzp38140HkavRlld6XUf9lDfaEyj5/NNta/ecXUklKANbxf5+3dEPQSDbj1svHLMstddD274kUdol2vqKVYdBj3M1nnmEiZ3NBTW23B6LpWpcnpwggSNhuBOW9QvOdT/KcFzbizLcDLenKR+T/ACCa8iQ22Fb7os4buu0fGfKTlFaeJIj7qDdrKIOlD7+jbWNF5VOcUPulVg3DC8UMbz10JC2yoX2GsL6ZzT7alh+XupMUZQRM9wrQMEEGnm5pk27G1zsyUmfBPxRBA0/ZSxcSpuCcG9rzTsvaWCGnzL9VMBP2X5qrLWEMU9A49xxvoA8D7xVfKbFZxs++z1PW3y2kzPI7MWeO25tpcUz4lZfXga0zhueT2B4PoEBD7JOgGQW4jC6qiL5cgK0PFAXYEhsx4CU1cYQ/02y4dXZHVGGAai62Bsh9rD+tpb/ZTwp8gQpAdqdNpvqS26hHvJTtnU19Sbsxi59XOQHptYNhJdwo97hmOMdjhVPwLp84GzKXlIMOrndTVoA5q8W7sd4RrESlbYWnvGCTs/hqrb2cFZUZ+ei0aLYkMXVYnfj4NP2UjVcUaXWo+JmL0EWVaaWUTtyO4C2cDttEQobIpDUvRiRNLj6vY7cEhcFAw1stvVZmovufHcquOaI9OIUGKu4VlO8a55MNd9rBBvwSREFL4c3xAVeg/heoYRYT45t6z3jdjW0fvq1+xuR90aL9AVuEjuDiK8TFJupWDsBxrovjHDZfMSQ7hSpRBhrQe1j469tknpCKQgDGmT30OTFJ3w26RKL40JrAgVkN/tbBg7f6GgNjFmRy2x7Wj/jTMUa7nm+JUbdXFWy4XWCLRauSLC9gk5Xf8TaKzR8l7dX6GGDjlxQCUidYp3j8ghAhIkqNrmlJBnT5BarZh/hKhPiG7V/aTHaD5OWzdGO4Ps3LYMX2z7aufptSFNoi0nGOh6Ka1lrSL41o+UrRLthw4ZU62eHh5V8XX+OjritLBNJty4/+nDKvkmYzFFlrMovo7GYwIqhn3IpcrAh1q1co6k5nQySq0OJ6mE4hGVo3t8OkdwkjjmM6Uxz1MkHAExgXSiJSk6gNpvt20ptrYHgR5CeKcxNQJDm4PALi4T2oYHqdkqlinrolOiho/RQJamJe100MUovy8m2XWubdtTaQa1Nd68pbc2+neYEpKkvgu7/S6PYT239xfb+990mhKDaZF6jmCKu3EfpaPWmPLfSZOIcdzZN2tYJL363Xg6f+PjOyZNy+DT7DgwUfV7vaHKowWS7ML9YI7w+1F6yD9CIzw5PbBI8tT74yvvvA6u9UG7FLgyli13wrKjjjdx1gg9DjRwTLKAvJMaRFrlev18WRi4aun/QWXELe/RWdkhsZZuBYMiCSK8WW5cXiXSJFClv/dIfpJPSskE8KXs1JHyJTLmGQODua3JZfk0sy5XUwgzRgtBM6pTsoz/nuP1BIml/kJUQaRI0mnwSs34Lk2pCM5rLt3pMXpRZpP+6ZPJ1xSSSrzJ7jUh8w0t800v8qUhgwOaUctHc7LGCgFB2ZK3oyFpqR64fH/IbfFM2+KYnlYQ796IujdJlbt8pqN15KWpJQSwplLpd3imZrzYuo6VLsdqWpXnZ5i+fah8WmVf5E6y4xk/3U7Ol1VxQYjX1RaOnXaNvNT0bkKT506bmj7Kaly4jq5km+1LnN8CKdvlSLaBMGWBYhmIL1mSmzjbx9fHX6GSzmZYCfJ9uLVgvcmrketUIJ61pvEQb6Gn9qL3fUb7Mxvfty5S4MqNYZsx393yfZpSNY60zVrNPH1cbVBh66+uC84bLca7I1UGXFr0PzmHodFVsvDfbStneF/8lKgT+9h6nAw3F/mXuL9G1qs9o3OiX11BobwEOiIHPdiBS84m+TnG0Oyiui/A+GMlM9snPPNQtwnwFLD5S8G6TZLZtoSNSo3/0zQ6TKpOb7pb1fbg3ZvT2WfKo1s2Js1UQeuNU8EZUk6l2o1l1XmwkiLxexPAWnTKKk/ledZvAq9n8XjXpQJ4ObkJ9H45pvXT7w9FEV8BbL6hN6NtK5tgxeh8AxG6ocnQEmmwmiwfcn+8f/pSxyX3pLbZRbQEkAvHAYftuIZxBGYX6E3W+9U2uaXQqVO82Cqui5pEjt35KDOWoK3G+VXHL6mhzV7qqV5N/6yUXFZNJ5dbY93pmiJY5bfNhcewsN4xVkDidguzDji72qpoLFMHvLdjj7c3envE9VNBWQIY4adZU9BhAh5i9RdqdJt8sKA28pFXAqpJU6zb5HrecL7E7wuQoXwh2RzAv7c4NMkw8Qec5F8QrJVPot5/8gdSDzJ3tpnxeL5ijRc/S7hOeex+1LxkWnNHy6WHVw4y/ytilw0faiq2mVdUUEQizRkx4EfFKF+y65W623G6xbQLtCW4QrsXzXAHl1E0f+hHDSiEgLuqd9epxUa9RlY2qx2U9RVPD2EyzTbfMzVqqribq/kqhaxL9WxJESFzrzgN+wD0E/Bi31wu3a71wu0QHN3iJD6OPsFFcENUF0ZmSpj6KIV228KoCMXvA1SmPG0NU/CuvcFRNQ9YcLyETFbl71qtoiopTVJmod10RQLXpEgpAAgvRI+5mw6pqQFQ9pVoJiLrfKoF+RKu1Esd0JOUQR0VoSd8UWla6h8IkIIoFiqu20I3J0qe8MJO5mMWi/aBoXzYhgGKXg6NGL4Qum+4pj++QqKf6FRL1nCJQ7HKZVBavWpmoNleVjWquTNb7NoHWxNFH2cIjMTZeg8B0L+cmHd18g6nzaUME4TIUZ1x8aeKTrIuGGFfQkTdZdHU7zL/0ReWg8SCdgLMtjtHn6BtpSXCDG+miDmLTLRXMuzoCUeve9TTNMbEqataTxA7Ns75YgE556c5pjBvkMgeiIScY0x3eXkGbE3QuiaZDdKMnZop4DHwYkg/TMdA5us4cotUiRG2YCptyYiEwBiKhjRJNxL507gybSHsWwTqKyJ0gq6PDPydQR8Ey7eig69Y4VnIXQN4DrrncVYFRN5vmyG2kP/VEzelSopIuo3QcFs3+GAhtJNjaX04VaKZ/k2zhQ2TpjUlkF92fk9V4nbnZCvshe5v9UYo53LdDMnOk0s/U3O8pzJGIn6m7f2Go6pP8TMP9hMrMTPUzTeZ+V+WOxP3cgPsGU/Wn+5lB2ESZebaYGXJpB5cyT83wM8vc50yZ+dZcP7PcPegxer2fabk/Vq2/Ve9nhsUkoLxGP6/CjSnem/y8MR7eCT8vUU2wJtgfJU6Ctyspcj+t4V/mATqAEzUKgNflZr7tFZlUdNaDAlQ2xBUUpLKXPShEZX/rQWVU9pimoHI6QjjoQXB2SqAw1fOhCjBThMaAmyJE2nLiux5kU71/86CxVLZfV9A4KnvNg66gsp940Hgq+6RBEK3DV1LhYUMVXkWM/sCDJhCjPhShij40kRj1oUkQVBGqgqCKUDUEVYQmU3v/4UFTiOYXTAVNpbI3PMihsl94UJTK8gEFxajsJQ+KU9lfe1CC+rA7qKAawvShacS1D11N41sEp2MMi9AMjGERmokxLEKzqMFnPGg2mWYfuoYa/AsPupbq+dAcqveOB9VSPR+aS/U+G1LQdVTPh+ZRveMeNJ/q+dACqvcPHlRH9Xzoeqr38TIF1VM9H1pIusUOeWAD1DLjQ4uglkUoCbUsQo2ATnzfg5qo7NcelKKykXIFnSB9znzLA18l8MQ/eeBronTAUuA3SN1PvKDAxORL76vSVvl4fy+7uFVv2WqvVax+hFVXmiFemkjbTbujrtEr4gkyAdx0VLRlbLSxViTFjVhR185wMuYzNbtAnyH6CBdy8i6cuFCgMg1k7oTJp9OEHV5VefPO32xPSRy+19Fy1hGd6+raCt2AFbdfc7TZkxQt9RVimv2I9NhydItXXl3xc8QJkbyz8gjPibur6uYKgarUHl06fnRpRIFMFVePLnZGV06MLp0+unT26NLa0aXzR5fWjy5NKlAIC+u9vYvLDqdRsEsJsaMkf0lJ/rKS/J6S/FtK8ld7+Zzan6mtKThiTNcVckL24jrSvQW6LstlyZqCxFQYhodgWZvV8EZo3HlBJcNCD+hsXYC2UhMFCvqskFegIfUlT4yKehTzwFWokqAMRTS6dW/dioCT75CBH80ETd4pFlqj0dUw0gC6Figu+YnLfyD0aPE/90QZEGMFkn1JEGhYfx/QAv0GSMfHIRoE2Ti5drfEuHRnuP3H3OiP296LLXptIA8FyQMTtbisREcPuqyky/uIvNfW4uJ5Qi/dMhRJNuq9QnwcyhLjxFVIuoPu76jGrxTEr3J4l3BBmeSvyJ7Xkv0CL71RqO7QufQ+Il4pbs0ZdKvauzonlfthGmGZljZjs3efjslcEIyZhGZJNFOh+Ru7hhvqJafPdOctFm8SFtLJjelOo4Mb002qgxvD/iIP61a8PF6umg/Tfe6AY5AhAReyhB7yqByLDl0U3iSVMCbRIYtKU3jeSPdExGGFwpSZGGa6XE5TNEBpgRN2grKzYWSK+9yeJIRCimZLLhQyQ6mmKrAoMR6kqDQajE+gaytUkaiQGAVoOEGSlaAQKAAtUoqGrAsxiR+7v2Tk4hPjEXs3j08ASpwYyEUD8UkxOREol1Euy+XECwEmGgKh+CRkRkP0ZUTL4iHYWhGtQUDxsiIQjIecgBgDMrzxMicoxC6ACidEpB6DvOJjnDK6IAOg9TsnwymqOMkJyDQGaxJkicEE41w0TAuJSBn1WsaIT7D70Yn++CSbtsa0jWRosJKoM7eZXOu/UIv9SXakVIvVAgazcg0zxdndWb1k/hveyZW8H0AqDp1uJZlihi41+ikqMuVJYzvqW2juCvH8M3GFeOGgizPdPdwxKq2SM674uLhtV7YzmnCVgETcpxXb1Pw2NTmtQm5/u2zNlq11i9ZEzliZc6Nq34Z+GeIxhQ6bMI54GQemmMcU3TAw5P6jMk3UtnqkdLk+Oxq1JRY7fCxBdGi9H3aqolrpyZ524aEqWdQXuLqlSfuhukzr9sNiaaX5Rtt8Dj8sdtyShZgJBd+ssMh2XFTDcHwU0vsSC+iPjKZGRsPIgCtrjLzjmhZZbdaPuTx/r6TNV0RffAukl+Xt6nCYLd4iLB5EQ6ub/XEE63L/FrVf5JYp8ehOByptEUF6+1avSpSVDjWTY62VjLZe1Cg5CAxeyc3w6qRHprnNvQixAd/on0QTMpl9Ex9HuCWfDorR1aDidA/8EG1B+zxrtIOBf/q5TvPE9l74cFffFGVygfEXGnnGHR9LwrmGGfYqSrp0DA9GFaQJKGCvMgXIfCQ/qYlk6cl4fCztTTDaLffvo0uX0NNEsTGiC/HQnTO1NaLLNzy+s/UgYLE14ga39AlJiK0QtUOieTsktIVBwtwYk5OLngzQfR9Xhw6ROwqxtHsFJglOCM96XGxAb3fYi4mpkNVkb7MmPhnS+RikVS1H8mNRLT5VtPDieqziIhl6cYOclA7KYsYf0NpYcjPN8CH2VurJDVXPijq99qe4KXYwPsVH3SR4jYujBTHiN0g/2rvMLzdSNSk9rUR62oXS02JiPmpSejqkp3sbS6Vi0y8Wm95RweRyLbaETF/+MmF4CdN+0N5LD9p0IWDaSIICcynNx7gmnneXCJJpRVkqqd1ZcSmxxqeMrP/tohwlyWxRgtS8/TiPTwWZxFQrwdAosz8Wo/HWvOcOIE7XxdWGkbgE7+p2nbiPAl/eNdqtL3P/9Fnk0fMpXdMtuVQKLxQrX7UAxE75GnWEkqFb15gTICduexTRjbzCF57pHfLKJ/mohK8RPi/FD+eL5Bm7wz+hEegG0C1Rak1TIdVMP2jKizDHyMmHRXS9H8avRhi7WXroWeXx3hNVFlnd2H/YHuLWQo1vJzyBWXK/csTuIvd9lm6PFOvrsir9UsJm688xgXZo/a1s2TcWixgnBjcnvNduppMncnnCrPXXhpuKs8GcHbLvgYdPdyK9dzeGdPrFTYCc/5hGOuNwvDilpQMu2Q7Zn5FhhwrNHkWU413OkUGlvY+rYx1vpeMy2BLGEZ2lCqV3/+QjgEfF3YBFBWuFL9fxfijCRwcedkm4AmkXxIj5gYofwsA8oWiKwzTrbehQPz0zPUYTUhyMibVz6gP0oMx9/ez/2Cue5WqjH+zq6jq1WM8/Q293uzx9EI90kVt8o+uKbvX1Xvw+F2ji8W5nVYwfjrHWzBbxQpfeX7PW7/7bhOsLMSMfY3nHyEcNUzKxz3tHb4mLAt5Vt1QhFiiIC9d27V80FFo/8kTo67mCevYWhH+ah4drOkjRin6C6gUKLD8o7mO3Sd1HjmPm8+JGMjxrqK1Bl6/FrxL0SyNt5EseuOTF2ST3Diszr3xQhmzy9UtevsET1Ax1cOe9Laa1Uz7MFbvnrAMf9TdsLTZBXIOjnJQo2bOCcF7aq+TV8kpLTW56Qcx7iZKUk7wyBSZyeVQY31GVQ1Xr81zj4qHtMe8xNn+FtJW533vl8K/E02dxjroH46geeGqDkg3Tv0zRTP5Yzv4Dru605y3i/Vcf/8Q7goAqjMmnnISgrsxDgXZ4LxIFwt4SDLKP0AXrIY3v4P1yKg+KGVNdiHI5Lbn3dudRf6rlomoyOSVuK21jyKkkfoiheA4qX/V8ll88I+mG5m3qUdF4NCzDLHpdFDhCo3XWHVRvKu0/BE3FS7UC5J4PRZ+evSsJXjTaQ8Ay/v+kX97rIliPNz/1yYWFyzLC/i9ycsvC55MF66dc5zA55NtImRPqfCHMWXoE0xGgM8k7AZdPwJXdH2k+4L17evjlA97rqIdfHqHTJfmML3io5Xzlri/bFE/S4wFX2/yiv0SPvFCQW1HCi5hO/mcvuxjDKP29BbH0RPyFJ85e/sKIHbxw4GEsCyVjbwjQsq7zdwg/wz0hCwMORfGEpVbJsBAWt+aw1ueenZmij+Pq1wcc8VsDzc2DeTnpj3+wSs3+26vE/qi38+ltCFnH4LPt8AKTqNjnmh7V5ZdRGuIg6GVfEIOpoC9wb69qunqqRuYSBU+B5Q2yZLbaJCwp+bC3AQJbn/Pu8UsdKNkDwfrqFWpeoa885d7SaYknhb/Lu2Erh+VsB92nJtH6ts4gK/S2oX4hZbVcPlr/qvLNlMP3VVowuYTwb2JhMUb9VovbHzWhK5+ISpy3sFTRy3YkT7wrkspGwyJLJsimuTzq/YxE3vs5iUHLFNXOZgxUczWFcUJhnEippQG19aipnioNWpa4Du4/HdLkSwFIvubg9sZCa8W/jG3CIvfMs8/iS+QvHvdXXy+07vuzJa/kCrmC+FkE8TNTsOf0yzClNxdN7wV+K6u/8+dNqHzX9Qfngp98PsrCBgmoM4Xcj0Rj87xc3Wq9fd/HKPf5yvF+rqaESbgH/FxuyYvT+6y3Na73j3rlQyovlkFyO7xXVfCLv8zFfsWUB1xtC/kkBhwR+nEHwx/KNsPjX2sjC9S+tU24Jxrtzmmu3l6hiZvPlZZ4UyK/TsBboO1mj4reVkEhmHryA1fm7W9f1UyIKaKE8ipRWS6EepVUCqBWyZ/D0OjXMMColy1+7QHJM2xj11aiLEsIdJmgWKVWVTp94IOfQD8xsiVjoRV/DYFW9r2Ke+jGtV9/+Yh0SWRS5ANm4qcVjouf45AMWT/gPCiayWDSit9dgG8b0/KIM8dC39QKHDMABeB0jiO54hO2jH5BAm6CVEG19QYHknROmjdNevBOELn0JDkXDalgQZgu2vqQ/idVM1W1sKpmi2oaVXNCg7EAuVka4WBKFPKUpZG5HBAv9jUnYD8t2R/cGydpFTCvN4hgweH77SVq10b4/k++QJd0AfumwU9btIAAxdFeXKf2M4pbwaUrl3+Bi9ld1n769RrZFD1HOGKrgN+hpeSoj1r6w0LaUQ9qaj7wAqRb5e0lhxyTLP+XuPiWUcXoeMKkUFOWezdIT7eUXCsNi0rwsdimI+L6ea60kI51dPsZYWaRWi12ubRijOEt2nScQ1eaMy56JG/wizvWiAFu88uxWHqG1vTfbIxa4KcTp/QtfmBAF7fGSGW01lFcKawQ4Qx6fGLJy79sP0vxpLhnKm/RidS8efNSjvxxDBsrXKz4wyJIEMbtVSKKwVDKwJgh1PwaFwsr9ZuvlptgpD1KYvLGuXzVIAbdcT8oXqAg+/YjxxCLuFqv+5vz5x/sroppinnmy5QLmfqMSw3w+iXGi4LAKV4v+aCji84JJVNLkuee0/VPUoKD3Prfgmfadj7pLY7VHu8Cy/6deZc9p2FR7yNbPzb+7lI18bpkXwioYJKQyC/Jje6sfWGnnffX6Q/5nb6eqQ3KT3DvN0b+tk2+UniJe9N1dM54qjdNTXjU/KMSP1RXv/ujYmRrFz371UX4+l9/9ft7e/bLfF9AGEu5dpt+ZEj+XIzOR83Rz3kpeL3gOS89Fb7ffyqsy5g4R2Epy2HSiHg5R1e/5Gywi7OhuuRO8fvVKHaBShml2mKUzgZfIeTheKlCWHIfm7ap1Akad6e0VzD/vUSNfAjV1I6PBe10ZbeOkte3b6V0A6WvFtmzKDkX2QTMIGCOyJ9NyUbKryBPPSVfVE3yVn7SoLzUNlJNuj8qf8amejRIpQqxWiYr2ajqDmXJp08qRU8mK30c6wrm9XGS0tVbrZ+8R+d/X91Hx00hAtHxlHxJNkkdSArmCmrLVvSxwNUpiddTmVHp4xZTTGI5o1AiCgUxcVsR1Xq6TDN2UF/f/7+eVNxJvWOmVdq2zWzxD7eDdrkdCtu2ZZcB1g3TtgO2XaGNsS0vTJTRUsQe5nKrTsThEuDhsVYxmpSxO91xLnh1jpbWOarqXEz6qHzDRyg5sV3mbQNgybxMhRI0eWxb2sjoEh4e894EYD2aRqOJ29iKZiRmqtjdHL2JYPqhu+mH7pT0I3JTRuSmiMj3c8SZo5uIlzTBim0476MNu6SNsLcdWmxvvNdeBdqzPyfUSH2p1qc++k9Nwkt0xGCJlJSHSOYlezn7Q+FgsZJYQi8cnUCxXFnZ305UDsLnS7WDfV6px8X0RHveyI2UVhpRdUzq35Ol/RN7t7LOdAhTTK5BLg7yvd/qkq5EtZeI2Ae4R/eAutYithq883bYbrrkXiiqaMwoPX6Hb12CQEXeXBcadETGBqRt1xfsK8UlW5EvasexKFLR4kLuGfrh4i3yt1SIrcFRmur1atT2l/I+xC8txWgzDBJhlr9/VhSYBOTD0lIKGtXRrEvtq4VLsJUouIgwBEuiNU8CXHVZBi0EWV8MiR3Q92Ol2O9opkr9HJF+zjtiFulwKY4ILQz1K2vC4/1oW4Hc8w0bvkR+sOcdXa4wXPmexBy3cAEFJnLEvL9ktdZvOhn6SblWjCyTrcH2jGZFuOMK50IUMcMvz9C/S/zPDv/Qww+/B/7PbjraJJ6bbWgtwP8LW+9Jm6UE7khLwf4KD5d7uF/llZdIen7ohwMfTdNz0lb7kPJDh999yMthXFibCxzXr6I48xfpEse1mCOsRSl+3DuVMBDh3EfbOyU+L9jesOGxYqawG6NbO/TZdtJs232V9VLQ9tFWmnVvpHPF5k/94eVRhCdAd+x9muRWO/4LI+8ny/TpWq33EJbSxAaMJDtMRwli2crZG+lWQ/ElrK5eZWMcxHO7/OBeuXFg33tppUzIX1BTvzB4XDljJWk5kMIm218jG/Lv6YJ9uKi+ucuVTlf+bXWbfDU7ubSjDr4vGPbxxNWNipnRxZ7JRuzxFa5xdoFn4/tzmjt1sbg4obnTe8dYGjMYC9D/p0BnllACuCRilfvDS319Xn6NqObe75HAe+6vcytetFjXtftXQg4Vu/dH3HqEc63fTtAt3avEY5kT4uccEpWuY9ckbPctZk9LjBU/YpIYHx+fYFfGx7sZY2PiKjucmIC/iN2UmIjvSfKJT5ndkqgadREvXjXqRxjsB+wdcmOk+Xwz7ZonpljW0PwUczMhy5lxZXrp3bvePXDif87/l++uuvqcm21NDg9+6Edrv/nyXz93502/Ye7BkMVnM/dYyBpvy81/l34CkB5I0qyh3+4SCGdC1pW6+AlItGTIP0obzN1bZvFq5u4vs+ywIJFJ+X/uwTJR/WhZsfqIIf8IGXnuaVn/TJlVNhlZIfp/bTD3nMx9oryYC8HvL7d4krlPl1s19P/kmIK/+9ndbD3bxu7F552sD5/rMFB3I38T/nVPl0vqJXR0UJe5T1jFXPRkvyVyny7JNSEbmftGSW4AdGXumZLcIOjK3CfCxdwQ6IYl3ZLcMtAVuSBckl0OwhL5TEmuBcJhSwtDLHsrrLP85+LJ5sSbDlXtnsh6Ck7n2eBuh8G9bN5WiLWx3VH2RlXBmRPZHWMdKIgUpqQPlRWcDrZ7CjtWJVG7z4SA11GINT1VBbxEwamtRcm2wpSlp0IFpzkM3KNjkRMu1NTv5rtrQGb22kzZ7tnAja4AvVhLGBQy41A7XJjcvqYQ60jsnszWAH6bF2LN+/SCkw4D2qeDTKIwpTvjMfEUMTGhUDN/W2E2WxUG8X1EuKJQ05IZV3DqGXI6RNsTb3pnLDrp7q20tO00RJXWT0LroD2JrNvNsjWLE4ea+49qGZclswumvaNlGyec0TKNLJJZwMJZN1Wgom3ZBbG9erbROa1RNornZF13p55dMLk2U8MsoLxEJZFsY/QER/HT/FAzq82mFrOsU1eLFk5r2XnObg6NDmcchsQ8EE3OzOjAC2eSaKqxkWVjdZuAe44oJLILnLM8E2P7ebZh2hmiXpttbApnGtg7xF84u+BqsNQQPaUxKkM+Wm/4BHiaRfV/QjVqsg0zTmlogqG4IztlIcumblLs1CUSmSlsRANLHUBLZOrYQU2gNTYR1x2oRtzsJ2qQzSy0Vj/tdSLbIRipZ68TIx3ZBXOoqEbwmEA2+Kg/RUW1qtbcNegzCTSC0rdJNJFssiOcjc7vkd1NooHa2c/zTC0kl4lSxdosR4WThJzMNjZDNtN6xEhl50YjQsKZuezbPLugOqOTACZCgKdlo3OnnaVCCG6BFFwi27hI8NqDysiZS9KdTQwlM6Rr2braJNpJZKfMYhBDOJtq65Bt1dX0QD5gbArrQEky2zALfDV4fLkpSKqWcL+hZesdDj0gNZn0vzg6ulnIzb0eQ1I/YyWKQK8xMQcl3xUKBg0i4ZBOuTS2NbWQEiMugfKEGLVsqglSaroDDRwEM9YvhXDA0Rww05hN1u5Da3Usy2LzI2KUk2wXOOv/YxqzRej+J6EhNc+RDNZkG2uJ8x9R243ZBTWkPDPEcJLuTIDugNiCKlJuKHZD7R0oqYB4zlEtqDImy5RaamUbGvg1ZDZzJRhBnxpmWeCmAiJ6nfRnDlAqhDY78wn1B0p/pgklERMIA1pXKzqJohXZBTM/Sar1IhX1QHcqUPQTTc4BUXQtScZCaSdKznIxVMmkJ3qocJKm87zJaKFuXhhTKwF8aGAdqSLEU1Pj8X2SS7Wk2Vwf3U0q9gRGpZbUtkBNroEIMrqY+/Uz9+rIxsy89nmq9pc8W5/IUBa6NwsJYtC9XhiIXgwfOHUXzUHuH3LYhDByTxCr7t6IxX8GwxOx/pJ/TzwVSa5juZZ1B7VcS/m6XEs8q+Nj3SMtTPxR5iPoENIs1yQw3+AA3uAK60+RKF8vicRV0SOsSdWQtO9Eer1HTTRBJEuauZNoXLaZMBKr8PcmNUXALSrzGM8lkZFkq3LJKfR96yOyYffcREvbhAV27yTrvxk3alidBxbMZQM1C8ID7qz415r7/2jCTpeFdy6AydlZw37AB+oXsYFUgzWAkRxw5u7nX2tmr+IDtmlnPcvynSlm7Uyynp0O+w4fWACkhiY20Dg/PBCDbQDysTIgn6sAxfDOGNrb2cCSOxuxWAw0tIFyU3igLs0GZtatAe5ndOA+qQElsbOO1YL2tp0zBRMNoFkHXpPWwOzaWqB+n8j+gMj27sSKAl4SoPqONrAAzV8DnpOpJNB+RRR/YACtduc1LDGwQGPgNjJwbY010DALRGckgPXmOGAd04EVR9sVO69lc0DsbWOgDsQa0HaqfuLAzNl3APUZA6jHOdhjQI2AxbVg8SRYTFkDLtptxN/s+ROBurscqN8YA3lGQI2DxT/gO9lsklOy2xpILaoYuGYOdfsJDYhnTGIQzCUHGtss0OUDDR1s4Nq6DmC8Qb09Y6HFDjAXBrkRc6BhATEG+TVGBmbO6fDk9x0uRFwnmAuDuTOaGBdMMcgxMjB71hyg/pKY20sDjTFsRGfqYYkhSUiwDs06oJvsIJoZogllSIoxiWCcT4MeaDXWRgZqppGQjyVAJgJ1Icbcn02xtGqo2Lkp1qcMuPQsO3Go86Ysf6yT1Q519bBtj3WxFUNdyzcPdXdbSH/HeKybTRjqqtsEIDzUvbAHMB/qWrJNwJ3pY2FU/V54qOumDlSJIHcTMHqGlt0GostgSoeWtdUMLV9yB4BHjceWo9IyEFmG7+Ur7hha1lKBvMWAK4a6m7ehagRVD5UhY2/l0DIQXZ5KANgGrDVDK2/fzR9byTYNrer+lf7YKljOoVW3dQzdujwCoGNoVUfisVuBugrEV65+JzS0vIEBHdSWs6cqkbUGUM/QyjVATYeRXgPUxNDKVZuQ3gaiHUPs1roOZJ7kIBQZWn0rEquRuHVRJoyctwJDq+YuHrrVrQDOiqFVbdReEumJQys7ssRa7dCqRU+YyHmaD916fS+gGqDcMbSyM4zMtwll7tDya58YA5bOhCAbISWIziXBZrnsclsYmUfNoWXzwsDrABBB5qahZakI4J6h7kUMeafHo8ru4FDXog45OG4HMjAU3QRHhjpXdGBsIkNdN39PR8Z+DFs9WkqFAfQMdXUy0SKN2FBnw7mrgOvujTNpgvbHre8ZN0E/IsPLusPDK5ez4Vu7wsOd9cmXmvvfmbRnJQvv6WTh4VUd4eGeVWw43cT23Mo6XsISAYTnjT09rGPPMpbYAwHvSWMSDa/siQx3d7Hh5Tex4fb0pzlQB66QuGB6z3LgEdF2KPnwqlvCw8tvZsNLbw4PtyztAerf6ED9JQdaZM9SoLYAdRXWJ0Fy5RIwgL9lPWGggjvq13DbjWx4FfjuWcqGu5cSdQZOasHV6dBw+zLJycoVbE8baK7CXw87NxFVMUrDS1HvAyhuWV4Ljo6A2f6f62i4Z88HIEfBxUqWBBf7+fCyTpDZwIZXt4GLzqepY8f04Vuvi6DSvnGiUxhhks6e1TDc4OEEH/7gLRDoqgnDba1g8PYBqvT31ArK21jNng8yC+xwVAKp22+PABeN3AbJ3bQGqCevIto6iqlbtXtuB2PtLCHYuH09WL8drDfRaLxFcntdA1YEWAzsM3BdwHDcZgmiq2+qGG6sSwB1t7EH6/pwE6tM7Gliz5mo+L1KNFGDygcxJisw0qCbboEKwLdA8atcyY0Euxi9G9aHV2LISCKdi8LQGGL2VBz9F9oihuBWGJ+rLb4ayjbd6uqgn2wd1HKLV/U8sph15Bav6MA3lvXF68JInDVybc09j7Sxnlzb2g58H9VybR94XUOqN9e67pT2SCtbmXPXjmiPIFY/PV3Q/dl0qw0rMvubL2q5zgnrHulkPNc5eV2uM8aQxvd09X2t+p5P33fmOhs4fT/CRIVmqugem4GQDyHPyRnW+eA5ip6z3TcmhS+Z6WbxbDoFl6VztpVJs59qmU54M91NR6moJ5uugdfameAoOk9FE7PdyVNUlMymEXEge1G2M9qDkl/ybEtNnHy+TAsodC2l8OKUlm2ZFc50wcYj18p2zDojo5AONjfbmVoMlD1Edk3Wrf2Jlm2f3QlvCW5qOyKWzrozkhmX4pv2ma+Tf9WDonC2c9EpKoJTXQ3XDN5Etn3eJpQ8T35WONvS2IPW4PN1rQgLJsCAlW2ZcYiYINw1wP0l4XagpwkRBqFLYfT2jJbtnHaU+pWUgnDBOex5Nk1OZefMHpQcpLYj2e60KJqQTUdIfE4cRXCYu9Jh0UN0Sjq9XfAz2+rgU3fMZZk2uK3ofFb6rp2LeqTfKrpJQWc7gjEKEMAgiuedpqKOrBvbp7o54zQV1YKT06pWTYaKItn2uXBO2ylSA9CyqDbDWtgiUGfZrsVCAhXZlnl7lQSmkbQOytAiXRmh7qKrERkBd4NsOkrdnbafBh6BTieGuXvWCJV1ZtOItLKdtWEUnZHD0J0URduy6QRaSNMI1Z2gWidkjLdUhFHw8pcCaKsDxzBX2Y461OogMbHFoNcIlDfgOlcdoZor1bCe0eSI1ydouIBSoCZrs65zhqSVBNophbJAceNOFpFUhEFpsiSTbVIm82hAGAQAxVh8hkQCVanBwLTPptyzhLpGhHOd9Ypf0dJspWNpDBA6B+E3vSNVwEXcnk3PIhc/o/tFGBMa/r1yXNL1WRLiCbkR0JGUASX6jVAKo5ltmUvbW2J+dKguIhBtnPkWRHG1CC5AoyEitSJNYaUbF9oA/WgSqribIwv56UgtskcUjwtf14iLFVl3gtCQimy6dhuKSI7uybmWdgwr5Om51lfM57BCHgvn3fRJnk+n2C6XHef59ubGXWn24K52NjHf2YSSdrd2Vyc7ZSJnQj7dcpKjmOfd1g7g70bF1m359nQEmecMFCeAdkYDFMm7bXuvBM7P9HyqfT/flWK1+cb62l2NWHbyqda9OnIOavnU/B4kwIXbA+RIPtWxDfDifOPszfmGlkVA37wLTnu+vu30mF31sBGoWwOeJwBrp55vaYnsIk3Iu81sVwt8/3yqJbyLuTAJQPgBWkp15N2WWgAjGjDD+VTTHWiMSjvyqbSFvEcJSOYbm9620dzRUD7Z8TTflQRuckEC3+A7vZujaEI+ecPEfEOnhcx/MPLJdgbWnuZ5OObIQSI1LwG0LNHblnc7D47JpzuJv00QyJp8enFPvv2GBNId+fQNJKkTRr59MWU8z/OdHWHkoJ1O1pPv6uzZ1QXdyXctWpPv7grnl1QyZER2LUHskO9qDu/qZh2Uke9OJ/NdLQLOdy4mpG2gAIG1wzvLd85iIPo2EQ3n21NvjMunl7J849Ja5B6lYWLgl4ZqE7g8i9FM9+Rbulm+vbsWhadNZIQhViKyJt/exGQ/6on3HqRr8/VphsE4diWGhqnBXpJVg10phZFvRL9TN7B8PdiGfE2UMuD35N3kpnyqO4x6SaEDjfXb8g3NESCFpWDnzgazdb+6ctdcwai793qLH4N/d731VX5QRNKd10Ww0hWwVpZToivXGafvd5mmUn7Rksvi/nbUJQrjV/8VVPdkvaVtp8lXb/3U2EARcrZxYTjrJlm2Zi7LLlhAm4H9T11JRkdsIMidxqyRrZsdzqamhbPONJZNzqKtKtpEowXEwXpFW4p1+E6yp/RsY3Uku2Ay7QhNC4tFsWFCZhyRFXsamRhW0gZWC7Kvm8I61qHlBvylaiPZKYmnDaCeoN2uCO2DATUs93gaa1i2PsGyzgwwHLcOUWR7iCJb2onM1NOlRXDgsEwgm7yeZdsWAG1uOBudQ2bnHBfGLRNlCSwAYrcT6LvRFm07TZoIgwebPdnKxib9dCxQ/0kHn4/SZtqDID8X5pkcgVqWbUzAnM+szc6s3KQ2Jw+KZZEWN9qNycxkj5vgVazEWOFmVWRnXJW9QuxXiS3dNPu+npkBpcy2gbuFcyLZFDrmzmLZa6bAbxHbtrThuRA028RGG3GKjGsYlqhGi0xuBMvTHGoB/Fb8nKTwzxr4fYisvmikHbLNti8Eu3NJpjRch3RPrmFaszK0nyDE3wiZpqdGsjVTIbDIOWL1LR2Dv01Ro8X2qCkG0pkJXwZBdXL2ozRKn+bk60CWc8Vel1hl3BhGqTqcnRjZF80wV43MRKheozgSON1ohcvkvElmq0knf9YojkPONVo1MVHgrtsGb/TMWJUYsXOLy5NwZqfn2qYn4bm6B5sEqWNNHil33aGyR8SN7f/P/vk/OPoy2k/UJrEAAAAASUVORK5CYII="),{environment:{SAMPLERATE:e}})).instance.exports,n=e=>{document.getElementById("currenttime").innerHTML=`${e.toFixed(2)}s`};document.getElementById("totaltime").innerHTML=`${192..toFixed(2)}`;const s=()=>document.querySelectorAll("button").forEach((e=>e.disabled=!0));window.play=async()=>{s();const e=new AudioContext;e.resume();const t=await a(e.sampleRate);let d=.2;const i=6400/e.sampleRate;for(;t.currentTimeMillis.value<192e3;){const a=e.createBuffer(2,6400,e.sampleRate);for(let e=0;e<50;e++)t.playEventsAndFillSampleBuffer(),a.getChannelData(0).set(new Float32Array(t.memory.buffer,t.samplebuffer,128),128*e),a.getChannelData(1).set(new Float32Array(t.memory.buffer,t.samplebuffer+512,128),128*e);const s=e.createBufferSource();s.buffer=a,s.connect(e.destination),s.start(d),d+=i,n(e.currentTime),await new Promise((e=>setTimeout(e,i)))}for(;e.currentTime<192;)n(e.currentTime),await new Promise((e=>setTimeout(e,i)))},window.exportwav=async()=>{s();const d=48e3;const i=36915200;var r=new ArrayBuffer(36915244),u=new DataView(r);function m(e,t,a){for(var n=0;n<a.length;n++)e.setUint8(t+n,a.charCodeAt(n))}m(u,0,"RIFF"),u.setUint32(4,36915236,!0),m(u,8,"WAVE"),m(u,12,"fmt "),u.setUint32(16,16,!0),u.setUint16(20,1,!0),u.setUint16(22,2,!0),u.setUint32(24,d,!0),u.setUint32(28,192e3,!0),u.setUint16(32,4,!0),u.setUint16(34,16,!0),m(u,36,"data"),u.setUint32(40,i,!0);const o=await a(d);let l=44;for(;o.currentTimeMillis.value<192e3;){for(let e=0;e<100;e++){o.playEventsAndFillSampleBuffer();const e=new Float32Array(o.memory.buffer,o.samplebuffer,256);for(var R=0;R<128;R++){const t=e=>{var t=Math.max(-1,Math.min(1,e));u.setInt16(l,t<0?32768*t:32767*t,!0),l+=2};t(e[R]),t(e[R+128])}}n(o.currentTimeMillis.value/1e3),await new Promise((e=>setTimeout(e,0)))}const c=new Blob([r],{type:"application/octet-stream"}),A=URL.createObjectURL(c),q=document.createElement("a");document.body.appendChild(q),q.style="display: none",q.href=A,q.download=`${e.toLowerCase().replace(/[^a-z]/g,"")}-${t.toLowerCase().replace(/[^a-z]/g,"")}.wav`,q.click(),window.URL.revokeObjectURL(A)}; | |
| </script></body></html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment