From 641d4145ba7a7d9afca649cb533dde021bfa8ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wxcaf=C3=A9=20=28Cl=C3=A9ment=20Hertling=29?= Date: Fri, 28 Jul 2017 02:27:16 +0200 Subject: [PATCH] hmm I might have forgotten to publish the source for this for a while --- content/add.sh | 2 +- content/ipv6_at_online.net,_with_libvirt.md | 78 ++++++++++++++ content/mastodon.md | 81 +++++++++++++++ content/pages/about.md | 108 +++++++++++--------- content/rpg,_démontages,_....md | 46 +++++++++ content/so_i_got_an_iphone.md | 91 +++++++++++++++++ pelicanconf.py | 1 + pelicanconf.pyc | Bin 1929 -> 2055 bytes 8 files changed, 356 insertions(+), 51 deletions(-) create mode 100644 content/ipv6_at_online.net,_with_libvirt.md create mode 100644 content/mastodon.md create mode 100644 content/rpg,_démontages,_....md create mode 100644 content/so_i_got_an_iphone.md diff --git a/content/add.sh b/content/add.sh index 5f5441d..4e331b2 100755 --- a/content/add.sh +++ b/content/add.sh @@ -13,6 +13,6 @@ echo "Title: $title" >> $filename.md echo "Date: $(date -Iminutes)" >> $filename.md echo "Author: Wxcafé" >> $filename.md echo "Category: " >> $filename.md -echo "Slug: " >> $filename.md +echo "Slug: $filename" >> $filename.md echo -e '\n'>> $filename.md vim +7 $filename.md -s <( echo -n A) diff --git a/content/ipv6_at_online.net,_with_libvirt.md b/content/ipv6_at_online.net,_with_libvirt.md new file mode 100644 index 0000000..0cee68b --- /dev/null +++ b/content/ipv6_at_online.net,_with_libvirt.md @@ -0,0 +1,78 @@ +Title: IPv6 at Online.net, with libvirt +Date: 2017-07-14T00:21+02:00 +Author: Wxcafé +Category: tutorial +Slug: ipv6_at_online.net,with_libvirt + +So, I have this server at [Online](https://online.net), a french hosting +company, part of Illiad. They do an all-around amazing job hosting servers, +their interface is great, they datacenters are top-notch, etc. + +But like every other hosting company out there, IPv6 isn't yet a first-class +citizen. Oh, it's supported all right. The official way to make it work involves +not one, not two, but *three* configuration methods: + +- The address must be configured statically, manually +- They use Prefix Delegation (PD), so you have to run a DHCPv6 client to get the + prefix delegated to you +- And then you need to get a default route, and since they don't implement the + DHCPv6 extension for this (yet?) so you have to accept SLAAC (stateless + address autoconfiguration) Router Advertisements (RAs). + +So, generally, on Linux, this is a bit of a hassle. You come and configure your +static address, the kernel accepts RAs by default so that's taken care of, and +then you configure a DHCPv6 client (they have a nice tutorial for that) and +you're good to go. + +Of course, there's a catch: the title of that post says "with libvirt" and +I wouldn't have written a blog post to tell you "they have a good tutorial, just +follow it!". + +So libvirt is a common interface for a bunch of virtualization technologies +(Xen, Qemu/KVM, bhyve, virtualbox, etc...). It also does a bunch of nice stuff +for you, like set up a SPLICE or a VNC server for each VM, handle the resource +management in a standardized way, all that stuff. But it also handles the +network stuff for you. Which is really nice in a way, since it sets up a bridge +for the VMs to communicate, firewall rules for forwarding and stuff, a DHCP +server for the VMs, etc. And you can configure it however you want! I can just +bridge out to the NIC, or setup a v4 NAT, or whatever. It's really nice. But +then you turn on IPv6 on your libvirt network config. And just like that, poof, +your host v6 connectivity goes down. + +That's weird. Reboot, the v6 connectivity doesn't even go up! Even tho you have +an address and ... wait, the default route is gone? + +Yeah, so *here's* the catch. libvirt, when it starts up and one of the +configured networks has v6 enabled, launches a Router Advertisement daemon +(radvd) and starts sending RAs to *all host interfaces*. **TO ALL OF THE HOST'S +INTERFACES!!** But it doesn't know any default route to advertise to the egress +interface, so it just sends a RA without a default route. And, of course, Linux +sees that and overwrites the old default route it received from the older RA, +cause *of course* a newer RA would have better information, *even* if it says it +has no route. + +Anyway, so now there isn't an easy answer to this, so I went the cheap and +dirty route : I disabled the libvirtd service, and wrote the following into my +`/etc/network/interfaces`: + +``` +iface eth0 inet6 static + address 2001:bc8:30b9:/64 + accept_ra 2 + post-up ip6tables-restore < /etc/ip6tables.conf + post-up sleep 30; \ + echo $(ip -6 r | grep default | cut -d ' ' -f 3) > /tmp/v6_route ; \ + systemctl start libvirtd; \ + sleep 10; \ + ip -6 r a default via $(cat /tmp/v6_route) + pre-down ip6tables-save > /etc/ip6tables.conf +``` + +(yeah, I know the code block is ) + +So, okay. Please, consider this. Yes, this is absolutely disgusting. But it +*works*. + +Please don't hit me + +Anyways if you were looking for a way to make this work, here it is. diff --git a/content/mastodon.md b/content/mastodon.md new file mode 100644 index 0000000..324c70e --- /dev/null +++ b/content/mastodon.md @@ -0,0 +1,81 @@ +Title: mastodon +Date: 2017-05-20T18:18+0200 +Author: Wxcafé +Category: +Slug: mastodon + +... + +So. What have I been up to these last weeks, you ask (or maybe you don't care, +in which case I'm gonna tell you anyway, cause it might still be interesting to +you). + +Also, why am I writing this blog post? Why, you see, I made a promise of some +kind (I'm also kinda cheating here, but whatever). I have a patreon now +([here](https://patreon.com/wxcafe)). I ask for money to fund the Mastodon +server I'm running, [here](https://social.wxcafe.net), that has almost 900 users +at the time of writing. I say *server*, but it's actually **servers**, since I'm +also hosting [this one](https://imaginair.es), less generalistic and more geared +towards creators and people who enjoy what we call "les cultures de +l'imaginaire" in french, which loosely include SF/Fantasy type settings, role +playing games, TCGs, etc. More on that one soon, but for now let's stay on +subject : why am I writing this blog post? Well, enough people were nice (or +foolish, depending on your opinion of me) enough to give me money that now +I have to keep my engagement to write a blog post a month (which means you'll +see way more posts since the last one is from... february (and I had to check)). + +Anyway, yeah. That's mostly what I've been up to these last few weeks. I've +started hosting a mastodon server on social.wxcafe.net about a month back, I've +spent a while working on the mastodon codebase and issue tracker (I haven't had +time to do that as much as I'd like lately, I've been working on other project +with more urgent deadlines...), and the imaginair.es project started developing +with the help of [Ekzael](https://imaginair.es/@Ekzael) and +[Eutrapélie](https://imaginair.es/@Eutrapelie) about two and a half weeks ago. +I then worked a bit on automation and stuff (more on that soon) and the +imaginair.es mastodon instance was launched about a week and a half ago. + +So, about imaginair.es. The idea with this is not to make it a single mastodon +instance, but rather to have it be a nebulæ of mastodon instances. Basically, +the main domain is to be an open discussion board, with creators and people +interested, as I said before, in SFF, etc. But then, seeing how mastodon could +be amazing for role playing, subdomains are available for, well, roleplaying +groups. Meaning you can get your own mastodon instance for your RP/RPG group, +and play online through that. I don't know about you, but I think that mastodon +would be a pretty nice medium for that. Anyway, I'm going to talk about the +technical details now so if you don't care skip the next two paragraphs. + +So, how do I plan on running that many mastodon instances (ah, the rethorical +question, best friend of bloggers)? Well, that question requires a bit of +insight into how Mastodon works. First, Mastodon is comprised of three services: +web workers, a sidekiq process, and a streaming (websocket) server. Combined, +without much activity, these use up about 1 gig of RAM. I rent a [Dedibox Classic +2016](https://www.online.net/en/dedicated-server/dedibox-classic) at Online.net, +a french provider. That server has 1 Xeon (6C/12T) at 2.2Ghz and 32 Gigs of RAM. +That means that I should have enough memory to run 32 low-activity servers, +which typically RP servers should be. That would be if I did traditional +virtualization (Xen, etc), but not with KVM/Qemu, because Linux now has +a feature called KSM (Kernel Samepage Merging), that allows it to merge memory +pages that are the exact same. Meaning if I run 10 mastodon instances on that +same server, that are all copies of one another, it **should** use only 1 gig of +RAM. Of course, since users are present and different from instance to instance, +since the content they post isn't the same either, and since the system (like +all systems) isn't perfect, its not 100% efficient. But I can envision hosting +at least 100 instances on that server, for about 30€/month. + +"But isn't that a security problem?" I hear you ask. Well, yes and no. Yes, it +could be a security problem, it *sounds* less secure than strictly separating +each VM and never letting them interact through the hypervisor. **But** given +the number of high-profile providers who use KVM/Qemu with KSM, I feel pretty +secure using it too, and we've seen more bugs in Xen than in KVM/Qemu (I'm talking +about KVM/Qemu specifically here, not about the kernel itself...) in recent +years. Anyway, if someone manages to get a shell on one of these and then gets +root and then uses KSM to jump between VMs and/or escape the VM entirely **AND +THEN** gets root on the host, well, I can only pray they're not pissed at me +enough to fuck with my other machines. + +Anyway, so here are the projects I've been working on these last weeks. I'm +gonna continue working on these, of course, even tho I have some more pressing +projects right now, and I hope then can be useful to some people. If you'd like +to join either, feel free, of course, and if you'd like to get a private RP +instance, HMU at [@wxcafe@social.wxcafe.net](https://social.wxcafe.net/@wxcafe) + diff --git a/content/pages/about.md b/content/pages/about.md index 94c1798..59f61ef 100644 --- a/content/pages/about.md +++ b/content/pages/about.md @@ -1,73 +1,81 @@ Date: 2016-04-08 01:43 -Title: A propos +Title: About Slug: about Author: wxcafé -Category: Perso - -Wxcafé, c'est moi. ------------------- - -Je m'appelle Clément Hertling, je suis né en 1995 (oui, ça m'évite de devoir -mettre à jour cette page régulièrement), et je suis étudiant en DUT à [Paris 12 -(UPEC)](http://www.u-pec.fr), après un an de prépa integrée -a [Épita](http://www.epita.fr). Je vis actuellement a Villejuif, près de Paris, -en France. - -Je suis enthousiaste dès qu'il s'agit de jouer avec des ordinateurs, que ce soit -avec des systèmes d'exploitations (et particulièrement les UNIX-like : Linux, -\*BSD, OS X, Plan 9, ...), mais aussi avec le réseau et son administration -(principalement couches 2 et 3, routage et commutation). -Bref, j'aime les systèmes : les observer, les démonter, les remonter, et les -comprendre. Ça s'applique aussi bien aux systèmes d'exploitation ou au réseau, -comme dit plus haut, mais aussi à la sécurité, ou bien même à des systèmes non -électroniques : je suis aussi très intéressé par l'horlogerie, par exemple, ou -par les jeux de rôles, qui sont aussi en quelque sorte des systèmes (de jeu, -mais des systèmes quand même). -Je suis aussi intéressé par le hardware, que ce soit de l'embarqué ou bien des -serveurs, et dans une moindre mesure par l'électronique. Je fais un peu (et de -plus en plus) de programmation, principalement en python et en Rust. Je -m'intéresse beaucoup a la théorie de la programmation, toutefois, et j'aime -beaucoup la programmation fonctionnelle. -J'aime aussi écrire a propos de ce que je fais, et de mes pensées sur la -technologie en général, et c'est ce que je fais (parfois) ici (et a d'autres -endroits sur d'autres sujets.) - -Vous pouvez aussi me lire sur Twitter, c'est un moyen de communication que -j'utilise beaucoup. Les liens sont dans la barre a droite. Si vous voulez me -rencontrer IRL, vous pouvez m'envoyer un mail. - -*-- Mis à jour pour la dernière fois le 2016-04-08 01:43* Wxcafé, that's me. ------------------ I'm Clément Hertling, I was born in 1995 (this is totally a trick not to have to -update this page regularly), and I'm a student in a technical +update this page regularly), and I'm a student in a technical formation at [Paris 12 (UPEC)](http://www.u-pec.fr). Before that I did a year of preparatory school at [Épita](http://www.epita.fr), a engineering school. I live in Villejuif, near Paris, France. +You can find my resume in english [here](https://pub.wxcafe.net/resume_en.pdf). +I try to keep it up to date, and it should be most of the time. The code is +[here](https://git.wxcafe.net/wxcafe/resume) (might be a bit slow...) + I'm pretty enthusiastic about playing with computers, whether that means operating systems (and more specifically UNIX-like OSes : Linux, \*BSD, OS X, Plan 9, ...), or networks and their administration (generally speaking, -layer 2 and 3, routing and switching). -Well, I like systems : watching how they work, tinkering with them, and in the +layer 2 and 3, switching and routing). +Well, I like **systems** : watching them work, tinkering with them, and in the end understanding how they work. This means OSes and networks, as I said before, but also security, or even non-electronic systems : I'm very interested in -watch-making too, or by pen and paper role playing games, which are also -systems, in a sense. Game systems, but systems nonetheless. +watch-making too, or lockpicking, or even pen and paper role playing games, +which are also systems, in a sense. Game systems, but systems nonetheless. + I'm also interested in hardware, be it embedded systems or servers, and to a -smaller extent in electronics. I also do a bit of (but more and more) -programming, mostly in python and Rust. I'm very interested in CS theory, -though, and very much so in functionnal programming. +smaller extent in electronics. I also do a bit of programming, mostly in python +and Rust. I'm very interested in CS theory, though, and very much so in +functionnal programming. I also enjoy writing about what I do and about my ideas on tech in general, and that's what I (sometimes) do here (and in other places, but on other topics). -You can also read my thoughts on twitter, it's a communication medium that I use -a lot. The links are in the sidebar. If you want to meet me, you can send me -an email. +You can also read my thoughts on Twitter and Mastodon, I use those +a lot. The links are down in the footer. If you want to meet me IRL, hit me up +by email. -Sorry all the posts here are in French, btw. I'm thinking about starting to post -in English, but for now it's all in French. Maybe try Google Translate? +*-- Last updated 2017-05-23* -*-- Last updated 2016-04-08 01:43* +Wxcafé, c'est moi. +------------------ + +Je m'appelle Clément Hertling, je suis né en 1995 (oui, ça m'évite de devoir +mettre à jour cette page régulièrement), et je suis étudiant en Licence Pro +à [Paris 12 (UPEC)](http://www.u-pec.fr), après un an de prépa integrée +a [Épita](http://www.epita.fr) et un DUT Réseaux et Télécoms. Je vis +actuellement a Villejuif, près de Paris, en France. + +Vous pouvez trouver mon CV en français [ici](https://pub.wxcafe.net/resume.pdf). +J'essaie de le tenir a jour, et ça devrait être le cas la plupart du temps. +Le code source est disponible [ici](https://git.wxcafe.net/wxcafe/resume) (ça +peut être un peu lent...) + +Je suis enthousiaste dès qu'il s'agit de jouer avec des ordinateurs, que ce soit +avec des systèmes d'exploitations (et particulièrement les UNIX-like : Linux, +\*BSD, OS X, Plan 9, ...), mais aussi avec le réseau et son administration +(principalement couches 2 et 3, routage et commutation). +Bref, j'aime les systèmes : les observer, les démonter, les remonter, et les +comprendre. Ça s'applique aussi bien aux systèmes d'exploitation ou au réseau, +comme dit plus haut, mais aussi à la sécurité, ou bien même à des systèmes non +électroniques : je suis aussi très intéressé par l'horlogerie, ou le +crochettage, voir même par les jeux de rôles, qui sont aussi en quelque sorte +des systèmes (de jeu, mais des systèmes quand même). + +Je suis aussi intéressé par le hardware, que ce soit de l'embarqué ou bien des +serveurs, et dans une moindre mesure par l'électronique. Je fais un peu (et de +plus en plus) de programmation, principalement en python et en Rust. Je +m'intéresse beaucoup a la théorie de la programmation, toutefois, et j'aime +beaucoup la programmation fonctionnelle. + +J'aime aussi écrire a propos de ce que je fais, et de mes pensées sur la +technologie en général, et c'est ce que je fais (parfois) ici (et a d'autres +endroits sur d'autres sujets.) + +Vous pouvez aussi me lire sur Twitter ou Mastodon, j'écris (bien) plus sur ces +médias qu'ici. Les liens sont dans le footer. Si vous voulez me +rencontrer IRL, envoyez moi un mail. + +*-- Mis à jour pour la dernière fois le 2017-05-23* diff --git a/content/rpg,_démontages,_....md b/content/rpg,_démontages,_....md new file mode 100644 index 0000000..644966b --- /dev/null +++ b/content/rpg,_démontages,_....md @@ -0,0 +1,46 @@ +Title: RPGs, teardowns, ... +Date: 2017-06-16T21:52+0200 +Author: Wxcafé +Category: +Slug: RPGs,_teardowns,_... + +It's starting to look more and more like a real blog here, I make less posts +about a specific thing and more about what I've done recently. I mean sure it's +only been two months but still. + +Anway. What'd I do this past month? Well, not much. I didn't get much time, +cause of school work. Thankfully tho I'm done with that for a while. + +Anyways, here's what I *did* do: + +- First, I made a bunch of posts (in french) abour pen and paper RPGs on + [that hashtag](https://imaginair.es/tags/unjourunjdr). These talk only about + indy RPGs that I like, and there's like 6 of them. I stopped doing them when + I started working on the school stuff, but I might start again (not once a day + tho, but still) in a while. +- I also moved social.wxcafe.net from a VPS on Vultr to a VM on the same server + that hosts imaginair.es +- Since this, I also moved that server to another one, still at Online.net, + taking advantage of the summer sales. I've been having some issues with IPv6 + recently for some reason, but I'm still debugging that for now. It's not that + much of a blocking bug, as I can just reboot and that fixes it, but it's still + 2-5 minutes downtime every time the IPv6 disconnects, and it's a bother. + I didn't have that problem on the older server for some reason, with the exact + same configuration. But yeah IPv6 with Online.net has always been finicky, so + I guess it's to be expected. I'll try to spend some time fixing this in the + next month or so... But it might just end up working fine on its own after + a while. IDK. +- uh I guess that's pretty much it? I've painted some miniatures at + https://imaginair.es/@wxcafe, too, and I'm pretty excited for HOU prerelease, + but that's beyond our concern here I think. + +Hmm. That doesn't feel a lot like a real blog post. I might just do another one +in the coming days, but that's all I got for you for now. + +See ya... + +P.S.: +Oh wait I said I'd talk about teardowns! I'll do that in that next post then. +Not only does that clearly separate concerns, it also makes this post have +a great misleading title, which is perfect. + diff --git a/content/so_i_got_an_iphone.md b/content/so_i_got_an_iphone.md new file mode 100644 index 0000000..bd9cf0f --- /dev/null +++ b/content/so_i_got_an_iphone.md @@ -0,0 +1,91 @@ +Title: So I got an iPhone +Date: 2017-02-11T17:38+01:00 +Author: Wxcafé +Category: misc +Slug: so-i-got-an-iphone + +So I've been using an Android phone since I got an HTC Desire HD, I think in +late 2010, so for a little over 7 years. I went from 2.2 Froyo to 6.0.1 +Marshmallow, and used basically all of the versions in between except +Honeycomb (3.x). + +Before that, I had an iPhone 3GS, which I had a great deal of fun jailbreaking +on iPhone OS 3.1.2/3.1.3, and gave up at the end of iOS 4. + +Of course, I had a lot of fun playing with the android phones too, flashing the +bootloaders, installing "custom ROMs", and even different OSes on some of them. +That was all fine when I was looking to *play* with my phones, I had *time* to +do so, and it didn't really matter to me if things were broken half the time. + +I'm not in that situation anymore. As sad as it makes me to admit it, android, +or at least the experience I've had with it, doesn't work consistently. There +are always small things that are broken that you have to constantly fix. There's +always that *thing* that should work fine but doesn't. And then there's the +security aspect, which, I'm not even going to *try* going in there. Go look at +the list of CVEs on Android, look at those that are over severity 9, and have +a good laugh (or a good scare I guess). + +Anyway, my phone (a Moto X Play, so supposedly a pretty flagship, not too +modified android phone) was starting to require a reboot a day to keep on +receiving texts, which was /a slight problem/ to me. I couldn't fix it by +installing a clean "ROM", because for all the ones I've tested with this phone +either the radio (so 2G/3G/4G) OR the wifi stops working, which is, as they say, +not optimal. I tried to fix it, nobody had the same problem, I couldn't figure +out where it was coming from, whatever. + +So I got an iPhone. Of course, another part in this is that I now have a regular +income, so buying an iPhone doesn't mean eating pasta for two or three months +anymore. + +Anyway. I bought an iPhone SE, because I want a headphones jack, and it was +cheaper. I can't just churn out 770€ for a phone, even when I have regular +income. My first impression of that phone was that it was very lightweight, the +screen was pretty small, and it looked and felt very good. Everything looks like +it makes sense, on that phone. + +The "first time on" experience is very good, with everything working fine, no +popups interrupting you from typing, the importation of data from your old phone +(be it an Android phone or an iPhone) is very easy and works perfectly. The +settings are all in one place, the third-party software works generally better +than on Android (okay, my bank's app doesn't work that well, but what do you +expect from a bank...). I have working push notifications in all my messaging +apps. My emails are not in an app called "Gmail", but in an app called "emails". +I don't need a google account to use my phone. I *need* an apple account only to +get apps, but since that's all I do with apple they have far less information on +me than google has in the same situation. + +For some reason, even though the screen is smaller, the soft keyboard seems to +work better for me, I hit the keys that I want more often, which is a pretty +important thing because autocorrect doesn't always work for me, since I type in +two languages using the same keyboard. AUTOCORRECT WORKS FOR MULTIPLE LANGUAGES +OUT OF THE BOX! You don't need to download a recent update to Google Keyboard to +be able to enable it in a submenu of the settings, you just get the dictionary +and it starts correcting in multiple languages. + +Okay, let's talk about things I miss: + +Firstly, I miss having [Twidere](https://github.com/mariotaku/twidere) with an +official twitter API key. Being able to have all the features of the official +twitter client in an app that doesn't suck (and Twidere is actually amazing). +I use [Tweetbot](https://tapbots.com/tweetbot/) instead, and it's great, but +since it doesn't use the leaked official Twitter API keys, it can't do what +Twidere does. I guess that's on twitter being assholes. + +Secondly, I miss being able to copy files from my computers to my phone. Android +phones use MTP, which is a shitty protocol but works with Linux and Windows (and +very badly with OSX). iPhones use the iTunes sync thingy, which works for OSX +and Windows as long as you have iTunes installed, aaaaaand doesn't on Linux. +Well, there's [libimobiledevice](http://www.libimobiledevice.org/), which at the +time I was using an iPhone 3GS was described as "teaching penguins to talk to +fruits". It works, but the version packaged on debian is not the latest one, so +it can't talk to iOS 10. I tried installing the latest one manually, which +worked, but for some reason the desktop still can't detect the iPhone, so I can +mount it with `ifuse` but I can't do anything with it since none of the software +that could use that mount actually detect it. Anyway. + +Third, I miss... wait, no, actually, I think that's it. Everything else works +just the way I want. + +Anyway, that was the story of how I got an iPhone. I won't be jailbreaking it, +but I'll be posting stuff here if I find out how to make that thing work with my +Linux computers. diff --git a/pelicanconf.py b/pelicanconf.py index 53919f9..dc316c7 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -37,6 +37,7 @@ MD_EXTENSIONS = [ # Social SOCIAL = ( ('twitter', 'https://twitter.com/wxcafe'), + ('pencil-square-o', 'https://social.wxcafe.net/@wxcafe'), ('github', 'https://github.com/wxcafe'), ('envelope', 'mailto://wxcafe@wxcafe.net'), ('key', 'https://pub.wxcafe.net/wxcafe.asc'), diff --git a/pelicanconf.pyc b/pelicanconf.pyc index 5f87413ce501c84158ca1bc5ddee2acba2e74c63..07df2a59267fc85c347b877eb4db97b18f41b6ec 100644 GIT binary patch delta 250 zcmeC=Zx@he{>;mjd(|>BnE?tofV2Yx6GQQtiPCk!DhyE~3@JcT6ikYNNpXf0VTKf- zxF|z9GeeXFLy9UxiW)fO f`VO0)GwCyurICxpnwimQvKzZS8#5y(3mYQ;mD@oH>DG6NK_18D~aCWhjZ6Q%0{lo+B!7*c?wD3}xjlj001!VD=u zaZ!eJW`-yUh7@In6cvUPRfZHbh7@&%6b*(nHijrkhEyqrC~1aN8HOlXkj7vQ&5dtZ enI=zS(O4YJ%(!_Hi#{`>!{kHk_AHz%Y>WW-5*$|m