Remake stock Phaser Module in Scriptnode
-
@Christoph-Hart ok please advise me on my fumblings around with this
HiseSnippet 2213.3oc6ZsDaiabFlTRiesa1toYaPOJf1CNMKLrrjs2E8fjsrkWgXYoJp0YCJPclkbjDgI4vRRYuJEEH.8R5odN2J5sdonWaOsmBPOTfhlq8POUfda68.j7ObHoHEornkkc8tXsAL773m7a99eNblVVTYhsM0RPbkNCMIBh2EIMzvoe09XUCg56IHdOTCrsCwJOuqcGZhssIJBhhYOf0g3x4Db+4Uk2EqgMjIi5RP3XppL4PUcUmQ81pxGopoUCqP5npGZ1kpTWlZTkpQG.3IKZcASr7o3djivrokAI7DrceAweB5wcK93Gs053hJORlHKWp6lauUIbgRE2DSdbwt3Bxjs2bCY.jKruhpC0RxA6PrEDysKUYnTe54F7Wvwp1pOWivZTPPBdy7tqQ0TXKQ1+KTsuplRKehxVPPD0ZDskkSaO.0PUQMn+Qz28cGH+HIBSfhYhBurQfWgIAuDfjXHHkiCo2EIIaoZ5LZDFdtCptAnM6hA8TXnvmqf3KQUovDLbVSGeJolEzHPfU2Z80eXd3OevOs6.CYGUpQdpwQTGRSiU+fU9Uqr7J+5UxO9Pc6l3XrWiEUSiXk3vLSCqKRvUMFn+bh0CyeFVa.IXhvxOJmtP53TY9pNzDoF0MTcZZR7ZOxnnPBZ.AOZC9umVeOrCloT75ClmIwxQkAGw8HmAtDbUzxn8H1m5PMAmhX5OvxgpLPC6D0bh4z4M.vGQzgLEkgspyvvNkiaikax7w5I5Bj3pMkv8cQsTcj6mLdyj.dAV65FuddruCZ+tcIxNi.aNTsmcgtm4RmozThdjMN2shmqJ79Y.4tdMyW6YERzI8KPibHLsHlXKRGZKM7vUsw5lZj1.deX9mqQkOUR8yHw8hL4PXW1LVUtO1vfnYOKNaKLmBfIzlNvQ0nWCrik5KfPrGMPWBxCHSp5gNnOwLL+Ld60YsY1KRDCE2FeK7i2fEXsE8Frf+fgbQOh3bN05T2Hmd+uf3hLt+cPsdxNR629jN6K0QXGMM54Uo5lpdlufRvsuVTsgl8oFpxrt3yvGp6nSG.uEO7B4r5fU0X16RCrgnIJMMjfI6lnTL6wDKa2G7hn0WC9Er+Ohp.CsXMrLvrCagc5ybjXAn.KUh0ZxAVrQAaXKEdJyniydt9YW4bGfacFgvxsxzZsvVfbPzdVfpLtVp9At3oXXs.u0Lbqz51GyFUFqIbLytfIj6agyqtKiEXScQjsoFTBvDWR7giu.7E7hgdTfFffLQP.m0lBolDB3ibYPvkkpxEBnKirHxD0yHiCUKtCxZ9CGGpiDcJfMSD5JjRmgb+VvRugpgGXGEdtA9Ei02qJK4PLYwYBOOoSImyWAgmIaEtBpFgn7bnzNgfmz27G+e+yF69eJuGoKdflSr2pPHFZItFYiKutLPxqSkIxy8kW6rYerM4DEBDadqn.99ntuXsPCmn6a3wuXP6mzgk0Jcp2khqdKUIl58K95Jiod+8e4W9WJGS8V42n+2KyKvrlE4WN.huMTHzi5GscwS97JIqeGVYmANTcHEhR.UlDCt4MCCl4MWFr3aYvqHCV5sL3UjAK7VFLkLXXHGNC3BHanLxnz38BJPvcr3jnmPWlRCRH0GTBsAwcyAAKpfpNRBuKxK9pGj1cL89cfD1Vj05Moxt3hLOT1YuXk8m7x30z.0ujFk8K68m+AU3ZD2uEVrmxjpmYB54zVyUkeW5LF+z2auu1yXTRmRc5C1GBwr0SFjkpLEbMO3s6hZSrIdu5TydSzPyq.uBW9RCQnF0eV5Kw5JUgXlHEy9htXEfgGKlnLee2q4MZR0x5MzkpV1LigzuGae1gXSOvx24pvXSdA1W3IPMgPsaHA56yYefmNXqdDG22P3N79FXdQLri1ziHpy9Jstd6iTq79bcoDlkmmeziDefWlDAyi86rHZLy6ewes9cy7g+gxoK3Pj398hsG1KNLpmDy99Aeary2nicNwFhKFdAvMiq0d+eVAg4uSRLQSF6up7XN+BICwMtMCwbnZ6daFe77f2d.3DBvGj8KRDd+HswVUKgNr4IUeZmayL+RnmT+1NFAqil6ccBvu5i192tym+uRs0AJQqiw9raQrQBusLgoK8lWIoKdkjtzUR5BWfz6RompicO+iq7oUtTv8FPkczSGL5dCv6H+AtkhE9b+hduA9jWtm695CYk7wpJrZaBlQkDtYA0MNCPYKpF1Z7SPL675T0yk5i4jsjx+Zywx98QtT9qS.10j30G.eeTK7sAChahiUMDkrnejhVr.QdGm8c3sF+zryDDPpP.O7o8qDz6FA8tvWUI3HiBJM9uUtAaEEh.ydMdYZlfUIegcMoluD2ofvH99bDiPGVqomsH7e4CvegoCxQoJB57eWlcgspaDdeTeL9LRWpktmROP7CI8fWT3d5PzMoRCMjiTKf+1phdMvdPkCoTy8Mv.MnD9g3R1M61E1zSjGC7X6P4WRsprKzPjrD8LfsGyuhRg6u5.aXWj9K.9AfCkq3lJT7mi1pzZvOc+P1eebU3OEaNeZKL+txWYRoU564p9CzyLCga4AO4HNvH7+mH9FN9483rxcfZmLHtWDSWB48cammYtl+.hAwJtebzZp9Go8tXZl56hYSYG302wBaXaRsiVTOQWsC0fw5i57oP7ePC1lEWLhmGEak3PPXGXQlnLRXmAVtAX8uaMtik+Ocv+MVX+TFPM50nKz7mRYfy0664MbIIW0qNX1zA2ojeZYeLx2ev9Pc7ZvNNBJL0cme98F0HuA0f5eqqFYczl.Nm85Qh9kWSZAsiiCNb9gGToMQifCaM+iqbHXEhsb+T2yFWLmpt3Gh3vMOyyL+aFW4yruAckOukkE4l3cniksnm3c1TLa4kb6AV2Fd2.sFr14KHb13efHcHp3IxxQeTwDbiYUvhypfklUA2bVEbqYUvsmUAezzEjkzx6fUXtrBBMZsOuXXwfJwEyJ7c.VqTbL
-
@DanH There you go:
HiseSnippet 2642.3oc6a0DaaibElTxibri2zr6lVrG5AAz8P1tAFVxxNwnGr7exQnVwpVJYy1BTuSHGIQXRNpjTNV8Gf.zK6sdduUzSs.EE8Z6obZQWTTfhcurWJPOUf8V54Vf12vgjZnHkL0uwsvN.NlyLugeuel26MONSUKpBw1lZIIub8tsIRxqfp00zo0dsvZlRk2WR9VnJXaGhUVdS61sM11lnJIKm9PVCxKsfj6OuZ6cw5XSERuljjdBUSgbjlglSuVqV76poqWBqRpqYHL5BEKqPM2ipS6.3IMZMo1XkyvMIOByFVJjzCw1sjj+1nMxutRA06qlO+FasoBdSxVMvMZjac0BE17Aaka8svEdvlj01PRNyApZNTqZNXGhsj7B6RU6VqE84l7WvSzr0dlNg8PNoZval2bIptJiEYsJsWKMc0p9BJaIIYT0dhszbw1cPUzT0BZum361tcjsGEhBP4TggW5PvKmH7VS.dw.IYAHs.GRuIplhkVamd8vvyMQkMAsYCLnmDgBerRxuDsGEFfoypF3yHkrfGBH3tat1Z2KK7q266zniohiF0LK07QTGxwl288V9mr7RK+yVNa+c0nQr8wdMVTcchUrcyLMrFFg20riwyHV2K64X8NjfABreXYJZvxTQUtBmqEFH0rrolywsIlCxPPxSTA+0iKuO1AyTDdsAiqMwxQiAA48ImCKC3pkkP6SrOyg1FVHDQmAVKT0N5XmvlPrEZdc.xfP5MlxwzVyoq3BwolcURg3ahpp4nzJdLlJFLBRpYAF8VM9FnCZzfn3zCfKfJ8zYzRuzQkQK6szCdmrW9JdOlszSyE6htOF0y.usEoM1hTmVUG28t1Xi15jS.LdurOSmpbVMseLI5ph1bHrKaD2UoE1zjnaONKdxjXoRtgqTNg1wQyrYErik1EvpvG0wnF3WWgrmG5f1jSwVCwedM1yL6hZDSU2G9OvOdcli8rrWm476TX42iHNOmZclqmPu+VRdQlr+MPUe3N0N3jSqePs5R6nqSe9dTi1ZdlofRvsspT8tsaQM0TXMwGgOT2wf1AdKd3EhAUGqoyrqq0wF7NndrYMXvtA9jS+Dhks6DuHZsUg+A14OhpBcsXIrBHY6VE6zhsfg4vArNIVqpDXkFFrhVJ7Pfg6mMu9QK4xN.2FLABKVISqUEaAzAduYNgR4Zo56ThGxf8DrpLE2Jsr8SX8pf0kdBytfQj6agKWcYiL7bBZvl37m5ZRJEhydGANKznhxN8MMCmelLzmR.82.4JwWW5RzHQAb.kyKntLxfpxQSHvdGAvFLhn3Uf7YIhSKf3UPTaEH8NV7gnBXKxpBcGEvgndTfLqKvQ4E9Qg2WytM3+b2NPb.dBRgZgwWlpjK7ckb.3MTER4ykbe2KBqd.lK3IXobEMSOoPu3YUvWzWa2tXMGRalCawXy0Ni7btbQrUlnKCKxJQJxLuOoAtitSj1kFcH8tw.Ivq5.gzMQkrH+nNfyst8iq+91whqWbVwKAWuZ6n3ZsQTTshKtxdByItTj4OdA1q1dLDX.HFQc3gPjy4NjFlNbQT0VX6Yqc0nhoLtozNBhIAOLKgr0ZlGbrE18xsPFv+upeeQ8szitKwwRpPNVB4EPddnt3SPxUWBxlLn1DbeAjuI2uqaGQkJdTbIhjEBIR5klecrUShis29dLIJ7jpbCgUVkEvzPyz.eQOoHqUeVbV6zN7Cgx.vCVgDT21MnJjc7pd8FWB.dcMRwlhSdkIV40sPsYqUOUk.b8lgkZh9hktbp2Xhnd8Ih5BSD04lHpyODpGXD8aLmVK+a+lee0+0m8kaOn0x6zwgBtw3aaVZ3.rPwH.7i+hDDe+O+S+p6+yM9Kay8kByqlQGCoHS9UHHhuHFHBSzfhVLPH1uK6e4m7I+gsG6rjd4Ru3y8hlw56JUPe.Rv3m6w7GVpQKifMYisXkAZLfUedvWDAAFzbF7V33cG0CtOgijC731Z1hnX1WVR1DoOgyxcjsPn7krHJDsyI8CUKdIZV0u63RYxuuoSJSyH2rKiJQHpOCqbVOKq+8u4e94U18ejPOsQqNP9wt5.4mAZ1zAZ1LdUShWFlPYKzWxLMtXUgtisZRh8ObP6+EQXENcr00IJbfqO4H55h9gCFvNR+V2e8Sew.BHzsXbJ6nRvMtVBNgRv0uVBNgRvBWKAmPIXtqkfSnDL+0RvDJAGT1oYP1DyH0mxOeK29hqRLtcLJYZESxCBaP1G7AIwEGdWjmKaSHwkbwV2nlCJKVNISCkc5gqr+vWFMEQHcvjnreYye+Wu3fK33f23Qh2BY7ovV7WjLiwO5s2+K7LFqYPoNs.6ijtU7BWVg1mFxsUPmPrINiZIIGjglWJx4F8jqQnJkeZxs1lhervKZfUIVCpTgd8F2tA75Zj1MPp9P5Wi8gyEjldfk+onk5avg+.RHzIUpA56myNYF8J7XJwFBW31AWG2Ltq1CWYMukTRiy7468H1Ibdu8wHUo6G9GKuRp2+WM56czSLMBtQ8nX72d809N++ZemI6A4EE4FtMcoSN36kSZ5WS1vj9QsFXUXSlmf3+BQ8pKsT7bV9YNm8Ve5rhy7JmcDNaATockl9t3BH8OoU+c+0a921dxXqdoSFhuDpAWDFiG6dFxYWVA2SpByKhc7erx94pafN53S26w0uBwXwfwGV9pNFAqii2e1CvA4wMJ.2kROy.6dZBm3y06MBNU8ZrO08g8NU87FxdnadPhmV1vmp9O7k66toZA93CzTYIVDLhhwbt6KadNfxfO3h34tM8T5Hd5dn.R1gClwRYuRe.leKjqX9pNHcU8WsA4sQUwutT1yiCcrfXXQ+U9tGvJuC68M4O0+Y8NUPwlxIl7TPq4CZMymVLHTZPdle11UXbjfPapsLVNwVebFaFoZGATdaNJQniJcrmMG7WYCvbtKGX8J8mvAZjckjJaJtQjO.eNoA0xvSQGP9QjlvKRrk5Di1zZcMUBEXxeeIgunS2o3QTZ6CLw.qqJNItB3iaz.10PnoAl15T90vZO2iJsnm9llv9K4WBGw12qiMrMLeFfejvgXm7CK0O.sYgUgeZ79reu0dvuV+3oyyRSOcdpDZY91tp+.8LyPXzMMWHYdcF9UCSZjPbfQ3qSDOm8YdKtTA1ytlIw8pF5JP9FtOmkYtl8PhIwJ553v4E8WS5sMrchusgGq3.u95VXS61T6vYXRLzpSMYR8dM9XvmOnA4GBYwUdTrUrcAtc.lLVZpgc5X45T0+1l31W1e2geUDW8KjrETWxkXbgY0kXbttP503ciKTHok7wHOs9Cfzu0gMJDjao6NO7aMrccEpI0+pG0yf3DBrdrYSR3pUFGCsiiCVLjvcJdBQmfsCcf1NBL7vVtkGdlGddX5q2AwgaV1hwIJUh4pY1PueioSz8abpi2w+tN9+NANlGuCCrhE8TuumCyV9Fts.7so2gfqB64r4jNu+JJX.dEOUQI7TEgv7iKgqOtDVXbIbiwkvMGWBu+3R3CtbBYAs79XDrkrRRUpd.O+W4fjukSK8eAHF1RaK
Some notes:
- you need to use frame processing for the modulation source (or if you're relying on outside modulation, use a smoothed parameter that smoothes the frequency modulation for each sample, or you'll get zipper noises. This makes this a prime example of an effect that should be compiled to C++ before shipping.
- I did some quick & dirty A/Bing and somehow the feedback value needs to be twice as high as the HISE module one. Not sure why though...
- Remember when I said, you need 5 phase delays? That was a really funny prank from my side, you actually need 6.
- going from there you might apply some skew factor to the frequency range and other tweaks
- I haven't investigated the mix parameter, but the combination of RMS with a skewed gain range looks off to me (the original one uses plain linear 50%/50% mixing without any skewing).
-
About frame processing, why do you recommend it here? I've yet to find many use cases for frame processing aside from cases where you need access to both channels simultaneously to process each sample... You said something to do with smoothing? I'm just curious
The default c++ node has frame processing set up, same as the snex node. Yet I always end up just using process in 95% of my dsp because I can vectorize each channel and do things much more efficiently when not interleaving them.
-
I've yet to find many use cases for frame processing aside from cases where you need access to both channels simultaneously to process each sample...
As soon as you do modulation that should be sample accurate (delay line modulation or FM), you absolutely need to do frame processing. You might get away with a small fix_block container (eg. fix_block8 or 16) for slow modulation changes.
Most of the delay modulates are not smoothed by design so that you can implement these effects properly, but they rely on a smooth modulation signal which will get zippered if you're resorting to block-based modulation.
-
@Christoph-Hart oh and also when you use the routing nodes you'll introduce a latency of the current block size so in order to get that down, you also need frame processing.
-
-
Ah yeah yeah.
That's fine then, it's not an issue in my designs I don't think. I end up creating systems for the sample accurate parameters which smooth and then update the internal variables of the dsp. And sometimes I create per sample paths for when modulation is happening.But that's very interesting, i never thought about it that way, you could process left and right in one iteration if frame processing. For sample accurate changes that indeed is more efficient. I never thought of that.
Edit: oh that latency thing is interesting though I'll have to investigate. Although I've never used a routing node.
-
Usually as soon as you're doing more than just trivial stuff, the overhead of interleaving and deinterleaving the signal becomes irrelevant compared to the actual DSP workload and if you can't vectorize the stuff then operating on a per-sample basis is more straightforward.
So if you eg. have two rampers that smooth out the values for each channel, using one ramper will compensate the overhead of deinterleaving the channels.
-
- you need to use frame processing for the modulation source (or if you're relying on outside modulation, use a smoothed parameter that smoothes the frequency modulation for each sample, or you'll get zipper noises. This makes this a prime example of an effect that should be compiled to C++ before shipping.
- You can also play around with the clone container there to increase the amount of phase modules or introduce spreading
Ok going to dive into Cloning which I've not done before, but a couple of questions first:
- I'd prefer to modulate the Phase Delay Frequency via a Global Modulator once the effect has been hardcoded. Is this possible with clones?
- Do I need to compile the network as a node and put it inside of the clone container? If so do I do this via the export to cpp class option from the freeze icon?
-
@DanH said in Remake stock Phaser Module in Scriptnode:
I'd prefer to modulate the Phase Delay Frequency via a Global Modulator once the effect has been hardcoded. Is this possible with clones?
Yes, but you need to connect the global modulator output to the clone cable's value parameter that connects to the cloned nodes, you can't directly connect this.
Do I need to compile the network as a node and put it inside of the clone container?
No, in fact I would recommend desigining the entire network without compiling and then compile the entire thing when it's done.
-
@Christoph-Hart ok great, I'm not entirely sure where the best place to put some of the nodes are, like the minmax for example. Via my method the effect doesn't seem to be processing!
If you have a moment could you please take a look?
HiseSnippet 4697.3oc6c1DaiibkGmx1ze0t6o6McBxgr.BXygdRFXX9g9B4fU6u5wXZ01wxSOc1EX6vlpjEgoHUHo51NYWfA6dI2xk4RtsH2FfEA4Z18vNm1fff4RlK4Xtj.jaSNm.LoJ9kHknknzS1lbxqCPmlrXQ8p+UUu5U+dkzbrkoJw11zhqv5mdYOBWgM3adogSmc6nnYvc3dbEtGeCEaGhUQuasyk8TrsIs3JTXwmvtQg0Vhy8Oe916nnqXnRFbKNtmapoRdpVWMmA2835umlt9AJsHmp0MxSKW+PUSicM0M6SsmE42hqmh54JmQdlB6wVfm6cUr6vU3awWqsTspk2RQpUUUhppb6RUJKqHHKURgTSpshfJoRIQUpQt79szbLsZ5n3Pr4JrzNlstrYGy2X38A7bMasWoSXWHv0j9I6c6CL0awZhr6xsaGM8VGGHT1bbE3Odfrsnmr8P9FZszBu+.469tETbPMhJfEVHt4sXLySHp4sUDyKASpPDSZIOS5A7MUsz54LnDl8bG9CMn8lsUn8SQMEumkqvmvuqI8ALb1rqx4jCrnWDVgGUdqsdmhz+5s+Ns6an5nYZTzz3YlNjiLdzau9OZ80V+ee8hCWT61IVF6iwxTWmXkXwrgFViqhOxne2WQrdmhuVQuOI7AoM+3ZJ+UqoQ6xU8Z0QdPSiCMzbNpGw3pFHv4KUz+06e3dJNJrNB+6QetdDKGMlITXOxqoSC75VVieOh84Nl8nSDFoOiNZwrUecEm3CgXSz7KfpAw52XcNF1ZNWFch3babUZMwGverliZmjswERvFoJ00gM5Oa7t762tMQ0YfAtD+Au3ZZp2hipQq6O0i9Yx9v2v+xhG7BgDmz8i4GL.umEomhE4Tyi0Ut7Q1Jc6oSNgZiuSwWoapddSseHYzYE87LgcXOwiT6nXXPzsmkIOKmZUQX7cJmX12Qy3rFJNVZWPmE9r9caR8qqR1025n2qvBr4PdWuE6Z13hlDiVtW7Ez+3Wn.65B9EJDTXjoeOi37FSqyc8D5+u4JrBS6uK+wu6iat+Iu7z8adJ2i00Meytlc6o4OLk1I3duiM0urWGSCMU1s7dh.S8wcM6S+T7sW5ZPmpnoyFW2ruM06PqiLZReX2E9Jr3yIV1tu3U32ZS5+iNN+YlsnEsxAJpTk8xiUb5vlvvb3PGcRr1TMbTZbiM5HEuk.iWN68FrZom1Qs6tLAgsVIqW6XEKZ8nduYNgVvcjZfSIukLXWQmUtf2nzCseNqTUEctmyFWvpj6mhmt51LV1Klf1rWr3KcGRxEqk80izxh8Ti1bF50L91CLqOnSf8nqx6p3RbSnGYTCNrli2TCBef5kAjQubDIec9tls7rqXl8CiX1gOwnVdjpecJyKFwh2f2zVkFnGakhQkZKxlQJdTCNVsmFSlUD0k4EAqGumlcOpmzc5SWQvKToX2g0tLZQtHvox9T+hsn8dtUOvQSj4QzFW3UzwSMzL7UgAqr0P4hgt28q2zgzi45N5pzMOm7FOcI5cYR2xr0XIbi7l2izVoutyH2ma5MouYBlD0+5UZR2g+.KxOnO0M2kCaW+9sSzt9vyqOA65y2dT6ZqoTp1v0tJdBycN2Hu+jErOe6YPvnFwT1G9D5Zn23lz35CWg+3NJ1WuiqlVaZY2famBYJhGl03s0NSj5XKt6k6w2k9+uYPYi5aYP8lfikEh4XIlWfB2DcWdufz2cEQaVluGQYnkluimeW2BFUU7qwDjjkhIICB3+TEqyHN196.xfn5Edk65tG1x8s2UQZfFxtWPC751kc7KhDI.OynhqQ20c8TZHxaxJZTU5NrpTj4yQHsQALTfWSgnsJeWMitJWDW1VimNdSqa+tCMjbwHCIWMiLj7w8cLoyF8zgIsbv+GbCbc9FTyPqm9kyMOuyCyhm+wsZM0SjWwehbWEgYcPp3s3fTkKvAo+8zfTwoaP5Jr5bvNW+CPWi2hnRzdMI9Hz04OfPZ8JE5NOwgn+cxPTooaH5FtCQotQaLwXEup87OEiSoVitoA4kpJLDaIGoDNP8KyCTW1CBXzgAwFu9UCGuF8QRhSXzxAA7INJhU4a1yhnzBd7ASdD80Dvf6vPQuKSdr4F4UklQL4wYZyGC7IJcotIS4zrj210xduI5t4zbtZ9qdEmTHCdkLU7.GBAruEj.J0zP.Nnh2.PTW02PYCUGig5VbhFpaISNIA9yEX4yXtjxfECaH2OIuZrLEM85d7pGsQs1xezG8Qew7sGXoHFdn6qX178C8D6WZRIKvunoZzZR9UWNQ+p2iuGil2KaQzUtrbbuqQo0xM4ZWBTsk.UaYP0V.TsEGSsuRl+2T9++u+F+ys9K+5e21Ss++DLP45iXf+3OKEY.327u8mp7e18S21i1Z.1oQd4YHSzG5vHunqZk8TuJ5+0O8m9K2dlyixmr1G9a84cyJaf88sJ8S9G4z9zayzBPMI5yeimUfwEj157GapqXwNxHyTLzC1x+PqzX4crD1Ln3jRNPPYymjCbM4tHB8hv2ze8i+y+1F67GSoGiXqw4ttq3LmQbwqg.hVb37fuh2QOH1pdCsnb6K1LRwIFGQzxS8V5m895T4Vy02xH800CbqcE4d8ephzK+vqvw1k0SpydTErDpf.UPITAApfxnBBTAEPEDnBJhJXJUvqBpyx71DiQNIFAwa4VVRm4.2BllHsRH3gHazKv3CChahGD.+CzXD7BB4I7Dq4SYPHaymnBn8oWETsqMs09sh4acKXUW.V0mIDEqjQPTLgcJdKQk3lwplVPDH6gujvdX8f0dDt8gOrR1A9PB7Fjya7FpfQIBLN6pnBBTAqgJ3zqfCGQGJg.kPj3.XIDQN.E4vJtzCDxHLGhD22L.cPLOBcPLyAcH9TLIX68VFV0KAq5kgU8JvpdUj6.xc.4NjG4NHhbGFO2gR4.tCCuPFFqHvvswrLCVBwCKBXIDOwRfkPDBKXIDovNePOHl0POHNKnGjxinGjx3nGfcnCDgcnCDgcnCDEgUcXXWDkQzCH5AD8PdD8fDhdX7nGJm6POf4aFZ31hX9lAKgX9lAKgX9lAKgHFVvRHhgc9fdPJqgdPZVPOHmGQOHmsQOHB6bGHB6bGHB6bGHVEV0ggcQZKD8.hd.QOjGQOHinGFO5gJ4MzChX9lAGtMluYvRHluYvRHluYvRHhgEpDJgXXmOnGjyZnGjmEzCkxinGJksQOHA6bGHA6bGHA6bGHA6q6gDLrKRkQzCH5AD8PdD8PID8v3QOTMugdPBy2L3vsw7MCVBw7MCVBw7MCVBQLrfkPDC67A8PorF5gRyB5gx4QzCky3nGfctCjfctCjfctCjg808PFF1EY72XRD8.hdHWhdnLhdX7nGpk6POf4aFb31X9lAKgX9lgJgxX9lAKgHFVvRHhgc9fdnbVC8P4YA8Pk7H5gJYazCxvN2AxvN2AxvN2Axv95dHCC6hL9yLIhd.QOjKQOTAQObk+WeT20RG92Y9rO6AYLgyfi2FS3LXIDS3LXIDS3LXID4vBVBQNryG1CUxZrGpLKrGplGYOTMiyd.1AOnDrCdPIXG7fRv99dTBF2kR3uyjH6Aj8Ptj8PUj8vDXOHj6XOfYbFZ71kvLNCVBwLNCVBwLNCVBQNrfkPjC67g8P0rF6gpyB6gZ4Q1C0x1rGJA6jGTB1IOnDrSdPIXegOJAi6RY7GZRj8.xdHWxdnFxdXBrGDyarGJgYbFb71XFmAKgXFmAKgXFmAKgHGVnRXYjC67g8PsrF6gZoj8vaEkcvrbNPu8fOrtOBAgsx1zGJC6rGTF1YOnLrydPYXemOJCi7RY72ZRj9.ReHOQe3NAq.M5hIH9ggvOHk2vOTFS5L3PtwjNCVBwjNCVBwjNCVBQTrfkPDEKT7Cq5BRX3Xst03ODM5uYA.gPtD.gPFG.ArCfPYXG.gxvN.BUf8E+nBL3KUvewIQ.DH.h7I.BAD.wD.PHm6.PfYdFbP2XlmAKgXlmgJgUvLOCVBQXrfkPDF6bB.gPlC.gvLAfPLWBfPLaCfnBryfPEXmAgJvNCBUf8s+nBL3KUve2IQ.DH.h7I.BQD.wD.PTJuAfnBl6YvAci4dFrDh4dFrDh4dFrDhvXAKgHL14D.BwLG.BwYB.gTtD.gTFG.AryfPUXmAgpvNCBUg8E.oJL3KUwe7IQ.DH.h7I.BID.wD.PTN2Af.y8Lzftqh4dFrDh4dFrDh4dFrDhvXAKgHL14D.BoLG.BoYB.gbtD.gb1F.QUXmAgpvNCBUgcFDpB6K.RUXvWpg+BTh.HP.D4S.DxH.hI.fnRdC.QUL2yfC5Fy8LXIDy8LXIDy8LXIDgwBUBqgvXmS.Hjyb.HjmI.Dkxk.HJksAPTC1YPnFryfPMXmAgZv9BfTCF7kZ3OBkH.BD.Q9D.QID.wD.PTMuAfnFl6YvAci4dFrDh4dFrDh4dFrDhvXAKgHL14D.hRYN.DkFG.hXc.KL9.197Hg9yW39r.ylp.ZuC+y52cWFiB6gincq5ywX+4pOc10c4a1SWyoo1YFCBBavibEwQVO9+APQUmnXEuueCd5nlNa5URjd9E754CpSlN.6Q1pcJ2AxJdU9LVv0wUk6Pis1hr4YIGUcPUlG9SVb79S9deRBCc3Rk+jO4rewWst21FeBqcjZ04Jbkj1tu5+jz4u66+U16y7mx0rqooSGpCnzxkPt9Drq4gtsA+IDahyzN1JAeuq3460aabS+t334ab3KR+nMPHSWH1pEWzVoEw5p.l5WZRa6zunoZamKLjk9VLWwQTyPu5K3Jywe3k4avL7fmg+jFMo82uQyQsy.7qKD8FLsYvRR1wuLBhwkcmsGmrn+TJtY48E38HwW3zDqw0hqy+0+mC2Xgu8Oa6z4bHxfEeYZJbi5WiYeoEz24Wp8clx.BWIZqwaL8Amr+2Ufa9SqNrpeve9ydfvuR6JCHLcdB3460UIteff4ibI2nDuNaT+7u2+6qKdzOCXiZYViRHkspk3OXGt4umsvp9j8+OduU+l+gsmCMIwT1j7Vr9ZrMM9P9SaaJbI5z0pVk+oG8xce+SyPMrDrw28vrtMRGcbzdW+F3U4hcTCbGSyy6pXcN6e+9Gtmhih+PFG5JvQV5sPg8HuVSkb5k8by7xdD6ycL64FGlJw1lYNq5U3F7M051Sm3txIqQeO+aT7ItA9DcWltOSjUd1yETSj1wGn0hEIQ3STeGEcEC0Xs0CMdM0JCSDUjRJr39sznRUSG5ZxzFwh6X15xlcLeC8CcQdAtmqYq8Jch2EMoAgv9WaQi.gc7DBaYtGkfHsyk7Zm2m2OE+lV61Ins9.2.FJNH4+wB74PlrZGyHocIKjZibqwZjbozF+G3ck4rtQ510msMx6yerxsUm8IdL6Zn3XocA0yBcyRMoAQqRnlGcFttcvVk7udqfvqaRLZ4dwWP+iegBrqK3WnPPgQkgUBl4eLin5AufyK7S2qJdvKhOsNDfoPXa+62od3cECu6x++0CSNZXfk+5savZQQDs41z3BodzmWC6VoqMlUdeOqjm+oGbj+XN5+pXnMKLYCa.N4va9629.5p+GZDcmGefxqIsMs552QGV8mRNi9AE8NmR51yr4kFpwVXJXiHmp0MR8eX8mZZ1aeCEZSuUzWhq.eT61zsID60PesmZ1Pwltn4t5lgiK77zelAcCkOyzgbjQz6uaea59tBZ.tabjs1o6xYE9W3KKuI8Os+1r+t1tz+R5n4y0bSQe9DFYtPJGY9Ub69C6mYCDxfNF8rxvAd2zV4Mruw64oDzMiqYPnCfoQrvDgul60EYCKK9DhAwZz4qQi+4s+3Od6Dht44lzvtdpVWsHSS5U+8zz0YSgiOYSt9gplFAzTXhyQpNzO9SsTLr6YZGORRRWsScSzQja99Te6zdsSX97hMCyTwJwhntWnMxDqSSEm9VtNOebWy9FA1ewe9S9Si3ReozMwI.yI6tSHJsE85TdHeCsVZg2O5Z2rBJNnFQ6WFdn3Roan33MuzGUAaXws+ROqEXidguuOMLac5FBBigzcGFA2M935FlFl85XZnEaIhSHz4imcFINFxjZPO1wQIpq+GV+DhNQwN1A56ozAdJVtbemMsXNErvWm2ybKxlLBJjgazgYOf+XF85zaubbW61q+j16xue61zMoNvXWhmFx40+LzahENtI9L5pnZY9R+D0vFKup6cnsaC+iNYC10EE3d8vjC5R8J9RU03upQpn3rVQoYshxyZEKMqUr7rVwJyZEqN4JxVzxOKCrorbbMNdeu3bKDFjcgE49aToCLlC