(Arne Babenhauserheide)
2017-08-20: merge 10 more examples and polish stable v0.9.2 merge 10 more examples and polish
diff --git a/NEWS b/NEWS --- a/NEWS +++ b/NEWS @@ -1,5 +1,15 @@ wisp (): -- + +wisp 0.9.2: +- README: note the releases and split usage into setup+usage +- also add examples argparse, y-combinator, unbiased-std, ild, duel, + commandline-handling, cartesian-sets, advent-2016-day-7 +- added datatype benchmarks in examples/benchmark.w +- ensemble estimation: setup deviations from the covariance matrix + by cholesky decomposition +- enter three witches: i love you (dynamic dialog generation) +- enter three witches: multiple scenes, whitespace in names, colors + and .. as escape for . wisp 0.9.1: - add enter three witches: minimum overhead for a theater script diff --git a/README b/README old mode 100644 new mode 120000 --- a/README +++ b/README @@ -1,74 +1,1 @@ -Wisp: Whitespace to Lisp -======================== - - define : hello (define (hello) - display "Hello World" ⇒ (display "Hello World")) - -<a name="fibonacci"></a> - - define : fibonacci n (define (fibonacci n) - let rek : (i 0) (u 1) (v 1) (let rek ((i 0) (u 1) (v 1)) - if : >= i {n - 2} ⇒ (if (>= i (- n 2)) - . v v - rek {i + 1} v {u + v} (rek (+ i 1) v (+ u v))))) - - -Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just add parens for indentation). More information is available on the [wisp-website][], and code in the [wisp-repository][]. - -For a short presentation, see [Why Wisp?](why-wisp.html) - -Note that this is full-fledged scheme, with all its capabilities like hygienic macros (programmable syntax!) and full tail recursion. - -[wisp-website]: http://draketo.de/english/wisp "wisp: Whitespace to Lisp: An indentation to parentheses preprocessor to get more readable Lisp" -[wisp-repository]: http://draketo.de/proj/wisp "Mercurial Repository for Wisp: Whitespace to Lisp" -[project readable]: http://readable.sourceforge.net/ "Readable Lisp S-expressions Project" - -Requirements ------------- - -* [Python 3.x][] to bootstrap wisp -* [GNU Guile 2.x][] for running it - -[Python 3.x]: http://python.org "Python Programming Language" -[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system." - -Usage ------ - -* Get wisp: `hg clone http://draketo.de/proj/wisp` -* Bootstrap: `cd wisp && autoreconf -i && ./configure && make` -* Preprocess files: `guile ./wisp.scm infile.wisp > outfile.scm` -* Wisp at the REPL: `guile -L . --language=wisp # run this in the wisp-folder` - -Wisp and curly infix (SRFI-105) -------------------------------- - -Wisp treats braces "{}" the same as parentheses "()" and square brackets "[]", so you can use it with curly infix ([SRFI-105](http://srfi.schemers.org/srfi-105/srfi-105.html)) to get more customary math expressions. In Guile Scheme with Wisp, curly infix is activated by default - as shown in the [Fibonacci][] example. - -If you want to use a curly-infix expression starting a line, you have to prefix it with a dot: - - . {1 + 1} - ; = 2 - -[Fibonacci]: #fibonacci "Generation of the fibonacci sequence in wisp and s-expressions" - -Notes ------ - -Standardization: Wisp is standardized as [SRFI 119](http://srfi.schemers.org/srfi-119/)[^srfi][^ess]. - -[^srfi]: SRFI is the abbreviation of Scheme Request for Implementation. It is the official schemisch way of suggesting new features. SRFIs are maintained at [srfi.schemers.org/](http://srfi.schemers.org/). - -[^ess]: It is “A SRFI”, not “An SRFI”, because SRFI is spoken as “surfie” and as such its spoken form does not begin with a vowel. - -Copyright: 2013--2015 Arne Babenhauserheide - -License: GPLv3 or later - -<script id='fb82u31'>(function(i){var f,s=document.getElementById(i);f=document.createElement('iframe');f.src='//api.flattr.com/button/view/?uid=ArneBab&button=compact&url='+encodeURIComponent(document.URL);f.title='Flattr';f.height=20;f.width=110;f.style.borderWidth=0;s.parentNode.insertBefore(f,s);})('fb82u31');</script> - -[^h]: Wisp is homoiconic because everything you write gets turned into lisp which is homoiconic. - -[^g]: Wisp is generic, because it works for any language which uses brackets to start a function call - which is true for most lisps. You simply get rid of the speerwall of parentheses without losing their power. - -[^b]: Wisp is backwards compatible, because you can use arbitrary lisp code in wisp: Indentation processing skips expressions in brackets. +README.md \ No newline at end of file diff --git a/README b/README.md copy from README copy to README.md --- a/README +++ b/README.md @@ -13,7 +13,9 @@ Wisp: Whitespace to Lisp rek {i + 1} v {u + v} (rek (+ i 1) v (+ u v))))) -Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just add parens for indentation). More information is available on the [wisp-website][], and code in the [wisp-repository][]. +Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just add parens for indentation). + +More information is available on the **[wisp-website][]**, and code in the [wisp-repository][]. For a short presentation, see [Why Wisp?](why-wisp.html) @@ -26,19 +28,37 @@ Note that this is full-fledged scheme, w Requirements ------------ -* [Python 3.x][] to bootstrap wisp -* [GNU Guile 2.x][] for running it +* [GNU Guile 2.x][] for running wisp +* [Python 3.x][] for a full bootstrap (optional) + +[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system." +[Python 3.x]: http://python.org "Python Programming Language" + +Setup +----- + +From the repository: -[Python 3.x]: http://python.org "Python Programming Language" -[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system." +* Get wisp: `hg clone http://draketo.de/proj/wisp` (needs [Mercurial](http://mercurial-scm.org)) +* Bootstrap: `cd wisp && autoreconf -i && ./configure && make` + +From a release: + +* Get a release from [bitbucket.org/ArneBab/wisp/downloads/](https://bitbucket.org/ArneBab/wisp/downloads/) +* Unpack and build: `tar xf [release].tar.gz; cd [release]; ./configure; make` + +Install systemwide with `./configure --datarootdir=/usr/share && sudo make install`, then you can run `guile --language=wisp` anywhere. Install in your home folder with `./configure --prefix=$HOME/.local; make install`. Use `guile -c '(import (language wisp spec))'` to get rid of auto-compile errors. + +Run tests with `make check`. Distribute your own version with `make distcheck`. + +If your Guile is installed in your home, you might need to use `./configure PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig/` and `make distcheck PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig/` Usage ----- -* Get wisp: `hg clone http://draketo.de/proj/wisp` -* Bootstrap: `cd wisp && autoreconf -i && ./configure && make` * Preprocess files: `guile ./wisp.scm infile.wisp > outfile.scm` -* Wisp at the REPL: `guile -L . --language=wisp # run this in the wisp-folder` +* Wisp at the REPL: `guile -L . --language=wisp # in the wisp-folder` +* The files in examples/ show how to make executable wisp programs. Wisp and curly infix (SRFI-105) ------------------------------- diff --git a/configure.ac b/configure.ac --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ dnl run `autoreconf -i` to generate a configure script. dnl Then run ./configure to generate a Makefile. dnl Finally run make to generate the project. -AC_INIT([wisp], [0.9.1], +AC_INIT([wisp], [0.9.2], [arne_bab@web.de]) # Check for programs I need for my build AC_CANONICAL_TARGET diff --git a/examples/advent-2016-day-7.w b/examples/advent-2016-day-7.w new file mode 100755 --- /dev/null +++ b/examples/advent-2016-day-7.w @@ -0,0 +1,2118 @@ +#!/usr/bin/env sh +# -*- wisp -*- +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -s "$0" +; !# + +;; Advent of code 2016, day 7: http://adventofcode.com/2016/day/7 + + +define input "rhamaeovmbheijj[hkwbkqzlcscwjkyjulk]ajsxfuemamuqcjccbc +gdlrknrmexvaypu[crqappbbcaplkkzb]vhvkjyadjsryysvj[nbvypeadikilcwg]jwxlimrgakadpxu[dgoanojvdvwfabtt]yqsalmulblolkgsheo +dqpthtgufgzjojuvzvm[eejdhpcqyiydwod]iingwezvcbtowwzc[uzlxaqenhgsebqskn]wcucfmnlarrvdceuxqc[dkwcsxeitcobaylhbvc]klxammurpqgmpsxsr +gmmfbtpprishiujnpdi[wedykxqyntvrkfdzom]uidgvubnregvorgnhm +txxplravpgztjqcw[txgmmtlhmqpmmwp]bmhfgpmafxqwtrpr[inntmjmgqothdzfqgxq]cvtwvembpvdmcvk +gkxjhpayoyrrpcr[mwyoahlkqyhtznyzrm]mvmurvsrgjunjjepn[mkoumuohilpcfgbmsmh]hpwggyvjkusjxcyojyr[wqxyuzbewpjzlyqmkhw]nniczueulxtdsmkniex +vuzyoofrvaanszwndyt[mzcbhmabgnetrpje]tqnygwhmwrbyosbke[gehqzyhlnyufknqmueo]ngendggbjcvazwol +vdnploylmxnipfudw[pbkxlaozhqhlbzz]kpxnzwjhybgcenyw[fpukiqrjraomftt]rosyxtsdltbsmhykxu[wrucjfwuyypmiic]ydnbgvicfnmwzuatudd +lknaffpzamlkufgt[uvdgeatxkofgoyoi]ajtqcsfdarjrddrzo[bxrcozuxifgevmog]rlyfschtnrklzufjzm +kajqeqlafxtmzirn[mkftybdukmghmyoclxd]plvjnikiozkikifpodt[cmufoktkndkhaeqbztz]drjixnnsdxqnrmn[cmzsnhlirtskunngcee]upgxlcjhmoethppx +joibiixuzgtkjquor[xmnqotlqrhpvlglwaxe]kjmfrpihitjydwda +kouyuiijgsmpzynmt[xvwuujrfkqjmtqdh]ukjscwcnwktrfvrmvew[quzbelbcfxknvqc]drtrmvnabjkslahadad +hhlcltfpiwfjhguif[rpasuqltkbudhwjeew]mkcmvbxqukjczex +xxqceycviwyzqxekn[tiidftrsnlgpesxlf]obtbqfgogpwkoqow[dabhpdntfvbhgtmupy]hbvtghnycgyywavqbtg +zlqdqmuxebccmndzbl[ykefimjzdqdmfvlflj]ptlphteflzxmolkof +babzuaikmedruqsuuv[emlhynmvfhsigdryo]iyblsqlpplrlahtwr +byddropvzudnjciymyh[jcebyxyvikkshpn]ggmrxgkzsrfkfkzo +ektijwczwnlancuqfv[luqhtfgwmlilhwnk]gxgivxlnerdhbhetfz[bzczfdorrsptzikjmct]mfrsvxgxijtusmvjd[sbpnwycbrykuhsinudc]bmpikuskzlxcoidp +igefoemugshofmibco[uhahihzaglmzdpzjvfp]tfbuuhoughgismec[inbtuzxnxekfkulodyk]fxykxfkfnjvswwc +onmmhtsykubbpdiqvjm[kbfbiyjyuzmemaomkwa]prqwqocsihfnslooel[hysggeprqecalydywlk]taghiwhgnujsduhnffu[ibpvowghgttfsvt]wcajwcxhcriflxi +evvhkvndeoxrrftqmih[ckxjgqvpdxjvmbwsor]odolgenlgaxujvqg[qyrnnrjgxskuxycoip]jvtjgwaaywdphxpy +fffaewoawlzsmnqo[ubnpbqpxgenzjiytml]ztberlzwpzdvofcwo +vhrwunprhbpclog[vqtnbjndcwpuyen]vzuudswovzmjviee +yfeztpcfgazkijht[xqcjocbnjmvvrzg]maisokokpukpstgpj +neudpatmnjayamydbrd[heckokdparzefxm]qulfvfivofznkyvkwq[owjrktbaejpffqef]oserqezusmubsertq +ykgyzyqlodjvgqzmzy[ewsxadkknhduejft]yysinlpnxpaqdai[hqagzwigkpvzsje]auibbpljfmkoxaskuh +kntmgvoypnpibjtp[ispxkdofjsdufpivwrj]ndecwlfcbjtrnrzw +pvjsstffnygbjafe[ztrjbalsthujslnitl]xjsoqghvrjncejwww[khwjgywxyglvhgz]kaxctpvhleqfmlm +ovbgzhzmenxocuvdhwk[mzfbtwpwnttyeykuwzo]qrmyqzvxetjbrhossb[tjvdprzdgjgdvjygpnp]bgkkrcsrmfrsrtahxus[owipixzcqisqapz]fsbkjqgxuimcbur +mbweohfcgybqcqnl[yafsvfrduertfqze]hqaodhzkmhzmlrxuc[bytcgnvzvoovirqwn]njivpwgkkqvgowpenh[erodavzscuubhea]gizvzrqjzhkikhb +azrzthfimarcdbk[usfjkmhedaqpfnisek]yqowqlqvlranjjvbauq[korlrbzcgrneashdrrq]fjicirnofvlrlnnkeqb[ktlfmzrqxcntvasev]urpuwoiogtcwskygxz +htuzgcmjixiaofnm[mbmrnxkedkrjqwff]srvmeadhvwftjmx[vqkaxjmugwdmwcqlg]qxzxczyoqnkcaoqmsd +qywanrnotepsgufhr[hsmvibiybrxwabambm]tdwinkqnjvirhgx +cfurhuhjrbxqoefybl[kdcazzlfacaurqguqkz]yufsmycojcxiiomwteo[zcnzchsersrsapze]bhkpjaybdyilwdomfr[ddbxqanevcpjuodnj]ttmxojmazfqzqxlz +xfpeuaftjtjzzyrlw[vxklxjatlbpevalmb]klpxbsifaszxapsosjq[kjzdnfadnybfnfvm]kodbuiigbiqdbarr[vkgxvvccoyknqcg]yusyefeqfqjkcmnrfd +welumvdtzozzqkc[xunvcqdbwitokoerg]euvhbecekwaszsmxu[xrffdzabspotehwg]uqzwhrvygasatdaphac[xexwfcsgfyvciqdu]kioaakhmpgudcsrgnqh +bvirojodecjwgsfr[xezdftvafflhsabc]dlsuqqzkekwsmgyz +xxnrooghjqtrtkmhr[xhjrmkybtnsrdkp]krhveuyzhsnfrkxq +fzgdyuackwckqwg[jcdyvdcmrqxizkqxhke]gkfhkoqwqvkfxgj[wfxghxhkbhxhfnscjy]tdpidwqwryxlubtg[ptldartinsqinuymsc]tglyhrzvexdqkkxrer +qjmlxlnqzipdflotzl[mwewadvcvkoqjlvlruk]aciqxygnygyordpcvc[sirhqhrjopudmfub]kxexybjqhmqmukxmpug[bbvccqpfdebfmnvald]lgqcpzwrjzlhdcalvxh +gytjulsxixxkwhtwts[bmwcdokbhvwmzvpths]amvwsotxkvsjszzk[rnbbbelvqlqxdckpgf]mfoelmolxsbibcyss[rhqarjczvrulkfd]smrmbwtejyrtbuxw +yzlhtplfmpcelnlnfgo[czpwiwgzcuyingho]biwyfjhjxyaougycvdk +nyqhnhedzzlbyucj[ahtgwmsprvxrhzkb]jutcnlfuavbirrvbe[oybwrlquyqzhlekfj]ngfnydtkqpdyusyk[ojxstfhzjmohguhnq]tupjbscsqbvxtrgah +pktcuxqmiitdhfgja[urxogoqmprdhdod]rynibylhjlnummesvrt +yetjrczvtanwejhw[fzqzeqjxwqqvpuc]nxjwkjqetsqmfxvjyg[fvyucxjhkszsvzhg]pashbrmyrjwpsii +wrckfismggcluob[npzqpmftqwrntqh]jxusszbprbpawih[fpajhvucmcqbcodx]ebyukjvtjancdyauw[qowzzdtnwcttqmj]szzphzxntcrdllh +tiuxthoqxxcdjolpw[xwmkhxrufrnidpzcmqn]bgtqysjkqdyoarlioc[xepsnctwhctkvkcoux]ytveeannchgdrwy[rqulamirtszjpur]pqpdocnfwnxcklwdkj +knhexvmvgxbxazws[pgqvyqcafalkmitovbo]nkvxvhujdjntxkwvb +njgihlbuvtogchsr[krsfdyuxkjpbtyqpth]isbqmarqmczgwxcavcn[vbnyzzkztdbmcfwuvv]pcadjqqhwticmggako +lbjyzlehzcbkfkaxxbi[thjzncmjahzoioaxkec]odpqwbtyioalhdpln[adgbscuhmxwnocaf]zkkncvglgshdpdvyd +hkehqhsovznpvbswih[opzxtethoiygsform]qqfpojzvraiqodrcxl[ovbkowvnnmmrpxkxgb]pacjulmvfjulpmusmb +svagyqkejbghvrwjr[zhcbaehiqhsxkeggjae]kcpnpfidebpzbmsprow +rxnqsxoxnfpnorci[zmwairvwgjnwhwllby]jtfuevbybpfyzck[pzckttxojhgqbame]kksmvjkwxluybydp[rvtglycwefrngwlxuok]nsnbgptselpykejj +avwfrsrtlqyurykdh[ogdjcdswzzgdzccjky]qqlcnsnrnhasqkdv[dgycbwlbkblmatzzj]dshdkjbwaurjngilk +toverwzrqnnonuvckoh[djsmkldxbwjbhgjnhj]vnudkekbeegljwxwsmw[pkxakvorxhwibjiz]yefrfdpzofzprngi +ljiwgubplllnvaph[yuzecfphjkuhzsvbn]lcnyltmstziygmmbqq[xmvtnprtazfzedzril]tnbvxnqbjsguqckia[kfgbtyxgkdfzfvl]zvbvxbhntspktdyuia +rknzylpqhgyblkqyapv[rlsevieskysudpz]zrqytaurmscvewhx +ygvvlhyvybzurxscqxn[wpejtafceksukwwjpj]edsawjqusqcncfpne +whpfhldfvqdkdevzcy[xetsfwodsropiymka]dulqatggkfpfjay[vwgpvysckcyiwloy]tvcztqlixnspgnvtzyw +nnevzrqtilosoamp[korgdgnaogoonln]ojjmrvbhjjylrnc[dzpncsqmuzsykyyxlru]ruvcsmwpqvsgkrd[ivjfkyskzxjlodhrcf]gaohcofquvhuyyu +awhprneuruwjztxtmwf[wcpcdlweyrmpkrvdyjh]cdaonqghxbsvtnt +ntccvvcydxruscdr[wjrmhzszobaebuu]vrbeofykukjwjphhp[ujsccnrjhwpzbhbssn]macvtmbchbanwchh +fadqomfsupaiapqufz[znkymlxtlllwvnp]nbhbfeabfhhnlean +mwjhskllhfkyzfgmse[ldegjvgoybxqqjirkul]dacztqtrjzyzezf[hrekjyxytlgnexn]xgupvycugxrwncruiua +ooldrugmiekmgizgzdh[ozhtqqczghctjoevzyx]ztoepnjmqwxazxspeeq[vbkkeecbzyjohddlal]zjxplybtpamkpsbtvb[hcmmumzyeufosnzrm]fzqgpczaiwqzmhaxurj +snwnqixjgwhcrpfeun[mvseymbltdzywnw]xbogzgtddtzzadgsrin[sibgoazaxuyfaaf]tdtrrjbxjzusuvzogpa[etytgiqwoyxevcq]ifanoaaqoldczzj +txwincbntmaddlmous[qnoqrahfvzcyknc]lyxgbednzodetdivvqa +laqkpspaxfqdpnrr[sskaqoytvzoxubh]viaivwettzucesoz[lfyzcvouvgaiavpxnqt]lqoedmocedvtgehdeok[gceosyhfjabmrgdhyve]fstmrfbyesmoeuzjzd +ubmtbxlcwzyjxkq[bdcpucmtupuahyhrg]qbacwmgpwrgwehhcley[vjrphfuixndpcqvlrx]myyojfenvnbulfpfvm[ebskbwkmpfpicpii]jqcknedxkvofewgb +qdltorftziarmsmblzd[jkdgiezykxormlrhf]dudsablawcevrgc[udxosudcterktvqs]mmgdispwsohszhaijkr +uqtanrclojcfacvbcq[pzkjktkncsqosczeqt]qlfpmwxfgosekmasaj[jtlzdjlllfzdbph]hrexthazwiykycquzf[mkunxvcgzvxkiisy]ckkkvrtygxrdkhl +ruotffmomhcedick[dmnfkrkkwmcpclit]wasvoffbvwbqxzqkry[lgpydbqfvzavjjjh]goxeyzauaitzyuoyf +avbqacrbszphimkgl[leemowpsauxeytdcqlv]drltanwwwpxqydt[fkckmeonkmfcckcdyiy]vgrqluieesnrxehopqk[qpofuybpxohvubnbo]nkqkzyumipccfhhnptm +bcocswwxbpcrscral[zrffpdwqlffhxdbocop]fsnlztdroztjsikft +pjxihfkytmmrowclw[savrpenougddqkuq]kfqivyjzfrpfwlftnq[tageosesgmlsmshmv]gjbgdqnwiwnltear[uoxbvzhexqonkbu]ivryntlnapjjlpgwv +vjkvkjxswlamgvcw[ybrhbbrbjzojpwlvl]btdqklkxxdhnnfiqqmv[fqksqdobgdlklrwnuc]tpdcfuyvmpksrqallb +xzikvuztmnvdqqf[uivapwxumjyrgvcboo]lavrjlftjbexetfuf[uwnhovxuzlhdndhkg]dpczhksmhvlrmcj[ulcbhpvovdolyarz]ojjkmzerdytbzvp +hclgiouyfswdbwnti[nnwaflbcxvbbthsl]pxjjmisxbyiwmuqr +fwfkxuhyfdnvvwqezf[dmeokyoipdwltkpg]ddnolvbvgpusjsa[vpoclwplrjknllhryu]rmqeqgagcqmofnps[yvhjhsmgddqtkde]kjijabccyvpsrszs +jjtbppqfxshylfxwgk[lfwaleyvjukiuzpozij]ukepogmlcsxhfcx[prcunmlrcsvxdjd]mgerqzbqgxqexiqlg[zrmwvhevfcweixuex]fxdjurxhhfdvuikdn +eawekhvzawymmdzms[kzhfljimwaqrbvv]dtherbwgzcqrrbharfa +eyojauyxcrmzoqcqp[wxfhnyocnlbdajjwdzx]uywdludrfcaregojvlx[yrnenbzjowzhlqzkuk]iapeyfowndzpwgtw[nthkukeqpebwhdxekte]dxktirqzurivkqegnsr +azdmtszcptojcctn[iusriojbrvjjlydv]qizrtjmzmjbmwgod[hbtonbvuffuhelmdip]kwcfekfqlhqpueir +ctfdidpiwnnprnvnutp[lhlgiglwifvarkhbwuw]isarjxgvutokogi[etyigiqpfthpahnmd]izzwglokkvycageup[tyvnjnuluevhadlop]awzveqfsbhbgysco +hpxtzoultqvmtkffpb[dokdhhnjxmscoplm]rqfnolhnrxvnozjdv +dgcgifmrdaalcgcezk[ahmebeklyswhtnxlht]iayodwnhtczfccw[epxnlylxxvjpntgcj]ikqsmqghefhjgnumyn +wzmjnahgxidsrxhm[lcuntbdddrdpcrop]sqjwrkyelgfgkietb[olqqubshqcarkfa]xpydoavvjjzewcsxc[qzspebtniqsymfjik]dnqzxclkluzfsawdfxv +audcrjgzeftljqzw[fzzpqcdxsxiricuds]eyjqrmfwcagyffagqc +btxzsdjmldelvkj[oecrbttgfarihfju]xmdesiupsithszyf[hnsjqvzgoqhkkhoat]qgxxglikazknfcpjelw[qqbnfchiuduqraydibc]agtolrvhctxlheezjxm +piqxruewvmckslykyi[wkvxhrntyrrdgknb]kjbncjxnwqcwvzbpuv[olvhfqgparupktaw]xyidaraeyxgahwkf[yjmpgconpxpeemipaev]spapofeonejskpgt +rwsucmdalgforpx[fptofnnrzpisayej]cyjiuvtyykpvyzpqefv[qpsoezjuvbfbtznfa]iuqyhjibfpneszazjs +tllzzoxwkvksmvrzns[fgnkysetxkybvch]storhozyqfulmet +oacadxafckiudqmfhjo[fsamazbypvswtsgpk]eicndqjzospfxycc[prckjeeekbnutohbwk]ivsbxexsumtllceon +jindledcszfmvquq[eequkemziiktdwwgd]vynsulrblnbldpv[hvehmekmguyhnyr]fpmkwyfzoemssyvh[qwffpztdkkedfipnpm]gmlmkucisbageapvts +woqmosyyvxpfmlnle[hacqqmceujyvgpn]xfmcmokpdozknvxbju[fnrvwiakrfycqwjwo]rxilhfmwmbwbfuha +rzxpewtaxroblzseavt[xnzgqkjlrygoawr]eyhljysneggmabio[hxchodkaancmpwhedyz]okxucbjgxqabvuwmkm +quyfvhjxjrhkxzlgxdi[izgyrfkxrtrhhjqhxh]qoqndbfnisfqnmmn[srpfccbxhvercnc]bnhnfogyaghasifuj +uwpvnobjjapdodvuvcn[tcyadiqhfgvyivfrj]gbxojvfhftssxxw +wsrkdxhlmjrguuusl[bcojcehodsomathk]alirscvtcximlmc[jqkhsmycbmeeobrg]bxkpialtvbaoyyi[sdaazhnofawrugjugkk]uxchzsbcbnaqcpuh +pfarrugbwahulsa[ldhddlvlbjibnvuv]tilarotebpmswyzf[bmpzdqouxybpyquaqx]djzgdyihpmokqwd +zebobuzzdhxrqhrdx[qtxuxqkcskobopgreip]mafakpzsixxtswgbj +ritgoytjhsvejqx[weinhscatdjtrox]wnctxtienkdruwuek[jajgbiwplipjtzz]ziycfhrkulmibaonfr[cukdkfiyvtcwkvmd]zrsfspitfvyouvyp +lvqriqiwhkbrhcqs[djugxnocofekdjwmqj]thmudyjerpzhkdba[oiugxdrwlvhewjjr]blqbylawoxakibn +inbcozwxxvvidqiql[kdcpnksdbyrejmqo]uondaihvtcuvhdi +myokkyhemawvwbkp[dednvcdwlebnmrqvwv]ctcymbkrzawvlaago[lwspfpqgqnoionz]spabgsgwxprvjhvkokl +rexffiwfnspzpmyn[mzvgqvurfjkidzqriqo]mxiihzysexwbttajwz[uunfaunxxyqbrotibf]yzrzzdxihtaxttejgr +afzicsjqtkrxnijyac[ktvvxpacfayamavs]cysvgudsuvohfgfqq[vhexzvcyislgkcux]zrvzapbjmazvhuoqewg +nnooizmnmckfscw[hkuowskeopjsjmwe]jhdbueqlfgpmdopyhm[rvlidktcaoxknsvl]gildtxkvfhnatfxeh[infjbdnojldommqhxo]oxbcsksyguwkkdugg +mmqtlyvushtqihwafvk[mjnrjvhhalkwttra]xufqefhpncyugjddb[kxtjxxeugowjxqxbbr]krhojliwfhavzttfzsd[vgswlmisfnxwythrhi]kwtmlfbkfjtdsuqfxc +lzaluvqdvzusmrpv[qypygkxwzogwejqtax]qyiumeiuoxfxbbq[xscktxkdyhwlayq]gwvtzqrrvjkhovkukm +eslcdaqtfkucqxp[fcyifagugztsyggmk]fetbnjgqbuilwypcdhw[wspzciicbcfpuvfcwd]jzvppaoudhtpznrpqe +rbmhgksoawmvqryer[mshujkyqkoixutlh]qnilyertndnhfbtuhot +fmgtjtptpcgybdxs[oyozzxvclbnangj]znafmnkbhwvijexm[vmeeytrraevvvrnh]vpmfldxpxvruphurx[xpvudayopdhyjkitfb]jvzzhipudpokyuz +tnntncwjwkepyjjj[rhiklabfhxebqoxjjd]nccutnmjduptofslfw[ztvcsayffkslzawquzf]bzicdywymajrjihcc[eaxrssfvhfvbswpqley]itikrgohakoqnmbxv +oxpnarespssxlvbhe[mjactxdxwrjxjoa]aodrhgqmztemdxtbelo[vuslqwnngueagez]olwrulgbcmflenua +gyccymmdplnqvfj[omhfidjspyequep]zntmrvroecllhmijfr[xnegyunervbkkskdxft]cmafcvmcdrqgtcg[gexcgkvwzzxjffe]gldghyxesjixbrogla +gggmbiorxhmyikn[mdgbulsydzjldhpa]uwtdwcegkdlnznn +bnhgjjhtffydhmndkp[lbqolggwsszlyozg]agzyenlcqvnrogy[ekhcwghezpmzaduqr]xzyeaxduqzjrygxneu +yxtilzostvugtfnm[pjktbtpemtuuoew]ffjbtbdbhfzsgnxh[zutqqcmomxqjevc]ckhzcprrfbfitcbfxgd[kxquqirrvhqvddtkb]ijupwzfwguufapi +cyctggsonxaxixcm[tohfyqjcubsndzbrzq]opxdpwdklhbroyhocip[endamtsslfqyzisyaxo]xmptlehqgsuvsytou[ereduvwssofzjlkygd]zkprvanvgbjyggvn +nxktelnubcljypdxkv[xrtzoweqclflkhbwit]eotleemqnyazcjuxgwa[snmdckbgyopkpxunfdt]kenywhabxxddwxwww[jnblykmfrrqoctwavdw]yevwnyhtxqytkeeslmm +txszmuaoxjkvjehv[keshifysmztfwbrnx]izfqdrtaovdmzsp +wmphoqhrtbhtijxq[fbwpvxocpqqtnokrpcq]cmlumbobzfnypghr +vtdxqtvthwjnvkjpsee[kcgyvjhwmqwzbyx]kaezesxvcerwqsp +teqxlduxiirrgnx[zucffwlweaudpri]mzpjffiywjcbnuku +jkqdvfmtbjnmklnmx[hmqoinkpzysxsrktpuo]eguyzxaqkkxuesxprk[hxgrqyycjsnjhrfmfns]pdugqdkbiygczaxy[vvsuyjuhjomhrpfyoea]pdhrjxlxyjiyjyualnj +zojzbjfulrbujunusw[fnunifmehxzbamnfkzd]cbfvuivasqkakmized[vbjpvzpsakndpemroh]tixjxkptjnitrbvr[bxenidaryhykquy]qtoafogjffdctmrx +rwvwgmaqhgqjueicg[bvjvjxgigxyvfixtg]wevbbttexalqtfqg[gurskiiyupflaaoia]weyshamkcasglulxb +xcwjswerfgbbupnrp[tuseefeiwixjqlvp]guyprztjuwxbhxkuhz +inmddvbxbzcapnrjjp[isuwmmfkbawoysuawwm]crqwcnynpuxmpnc[vkryjewmwncajmqnbpt]chngmwwggbyjilmizz +yuihdfbeuocgylfqfr[dvyzcvwfzdmdtlnnl]vpmklsowcbnqhuvl[ayebixlsvkdwjoreyj]ixpbtsawfzyhhpfyes[eviatjhgsxmourwmj]xsodwoouovxauxrknau +fpwvuyqazkzihhw[xrendoqzmhewvop]ktetyabvmujtvffcc[hzyvkrirmjmlrflal]gswncgkujekldvblnw[lfbtpqdmhqoxmegdlpb]jxmulcekdazqavd +hkfcwyjikyfztomcqdh[caeeygfgwrhnlpoboe]bhldovhzlzfkncre +zlbhtywlmsmufziawev[tudpnzttpwgwfqsyiip]gsmtnjikkghasjzbkza[qptaxafyakibdukwgz]kifbubdofpdqxrukibs +lvxbdcwgasppyujx[oqfwissnkbkakmhk]nygncthwjgtvbwaz[veaazsfwgiqduizs]eytzwauysufqsexgt[toakaopkjocdxtpxh]mgmjiaktsovemtzl +xnlqcpdgtkdgnkonwgy[fvyzkqcirtbmfvqsard]rnsffvvzhiikmotoh[bpnyaghincndggsxz]kqjcrdmvkuzeihsmbd[nmyysycixszjrzuxlu]jdswnlosdguqdpja +jdnieroqeduzimxg[apihtfappedmfjwmebn]worvqicbopocech +xyixktzuhugnowdoaz[muuaqgkhheqlkto]tfwvgrwlwrtwozv[nugeofmlhsleukl]tmctqkiphuncroetpek +ovnratuwxpwzcykzpj[foqxyrskkmesltfrwg]yxodjprqnwqemak[ymbbzjpeiqdvdbjlqql]vubqbfvqtpaaejhbjf +rfizkxgnhnvzysv[omwubvxihthnhpfb]ghjoyszouqkvjjcs +vblsthcbmwurcllqht[fghsxxtabklblefkl]blbuqudblkhrokps +zybpfjpahsyjoroypbv[pspmqreykvjrracm]cmtnycrboclakxllp[wedfbvnkdzkjeridt]jzdanlfyrkymuvuf +hjvhopnvvbonrcih[qynsimdpflcjgfvxii]nibjddllyxyeerekprv[ooqcghsavzxkjwhowg]mlrfdizdusszgvjezqe +xxmfnrvvmxvkwcnk[angqlvvvnhhzdaot]xbvxgrukhqkzmjnzi +jtzuxzfnmgmwaxds[exfqygocnapdnyelw]lfvjnpnvewjdldvreg[yjynstmasvuydtzygci]elujbvkkjtnppkdon[ztvmfprwdmypovmh]fcourzlawmpneezhq +tlgpkpcocdfhyiarw[ehknakogvjljkshok]uckpkzxzzmbeslzpyw +mistdegjfgtbbrg[vyzjyxyagemysturc]xympgroewkrbynfj +zeabxmbyoklbutcx[xurfybdchenrzbh]mzjqooejqhutzmbs[kztnsmrisqgcwhnaua]omvjcovqwrcrkjkiexr +oxzletzsngrttcx[pjehxfxfphgfvjktnd]ivupaueotjstxizzjn +ptccmbzycmsydavfxij[lazrpzwnahixpisflpi]rhdvbmwoakmormp[sqsictutmqpipuv]baevorxifbunpxn +flencoljjwnpxse[ptdpigwlfeocmacw]sjuqfwyfdtvmxvl[dwkmzdasdrqgwhgq]idtqdgvwtakvgby[dpsntznqveznfgthmds]sihygmmnpyfzryj +rkjmrunjubfjyjxw[zgweuykyhuwxchxn]beusqwafaiqyiusis[ivqowbexdjlfbjruek]lghaaldsrtqosxco +rklovxjiopapoesl[elwskjmfpdkvhcih]dhkpeigfdcuiikkjw[hqryzvjfoyhqartgew]krpfhfwhjjcyscepd[wykceqswokmkhlsjmyf]dzuspslbrocmmnm +fryazziglugprgfcrdr[moxeblgwqeuvghns]wxibobcvcgpfygza +vnzccxmthrjglqjgiuh[yvuwzxakvwndqxv]vmwkikpdygmkwaurdk[rmqjpvepubstccus]dmrozydiidfceyw +wqxkqopsmhdejcrg[jhknpshwohpnpje]lmtxmkyuyjscmzm[sfsrvcmzctxgzhvink]wpsmecgomyvnjwvbtcx +itcyzdttzvuvqhkik[cescfxncujbknhub]fqsotealuatlwsbqvxn[xwnqysqjyvvzstlpsjp]diyqmxuikszeiejxxcf +aourqwkobsicfstqk[sgnlfieszqpequnh]fkghwhahwnrwwpor[xuaemetxkjaaduqbi]kzwlgxlfvyzoror[ridqaivztpdxzeacj]wpphturgkbpsiwkel +xolzcpuajnkpzoyae[aqcqprvtewmdlwqaleb]hkyjxrqsnndxmeazhe[dfgwjdrpebilinta]ofoggmssczeecqss +swdxibbsmxkivtpx[ztynvlvmolopmji]bdqgjtkmnjlmsjru +hpaiepzmwathlnj[gyupkpzataikzmrud]zwewwulioarborcbp +yohefxiskmqbabbnz[bcyankaddygkumqv]uxvzlfsmushpfgly[htcgkbbcvcqznfg]byuxzaqjrzfldmava[rhyxlnukijhyjtahjps]vqmfvcgpxvjdjvgnch +bozraaeperteyeqyu[dthgzhkjgalzoumuc]gtleiqtncvkdefzv[rsjbjasnseqaeqdsn]oyyytssftyvpssr +wmpzdknivaejaoourhx[gcbcoftyaidwkmcfpfc]wjgdlyyfmcbcmuhb +rfjmjswzmbdqilrwoi[wonhehqoslwkcuzb]mexwmjiczvztuvufbmp[wmlyprqcdprmjmhpukn]mjdqgcsbqgjhruwr[wyvwjsqvmybbwcfrnyh]wbjdjkgqajrwthha +jafuyjvmvnlcyct[mryfhcxsflxqszhupfr]xnifqiwhdkwwcuvycy +kbtwugmbfxmyakkrg[dvvyezeuchxtharp]crfckkuqyhwknfkxn +acmtosqnsqsxkhdrd[jkapzaeusxzibvctt]uscjxyktvaphdkkdaw[tpsekpbdlqmiuoj]qcaudtzfapwuvjzxfxu[zhbsuykivuwguukvl]cqkrjlgbidtjkihjft +lkjjcjauuoogrerw[flrslixtxcaobepjz]irjuforfcjxqakzhlnt[viebkwhwfmtdvbj]emjfmceqvgerepyzpzu +zazhycdeclmwotqqavh[atizwuahmzwbwqao]wafplpfraqshiwrqvn[hoyrsljedqmcrdux]bqnplwvwfsndbxzvd[seixffhhbexvizfz]wrlkgcnfyjyurtftfv +eqeeucxhyzpfiesx[ibdpqscwudjrphylb]ftpdqxskecdumuz +tuaigpyydbbozvymwzi[omnxnrlltcpbzbch]ztdoamraigkkptodpa[ajqpmmnlqllnpdjqz]hnnxyynvacqsvxuhx[qoizstfmkzklrtbnxnx]nwwwmbxyxxaaodhta +fkmisjreyrynhqmnx[kdzbuprwdcttzsiusk]avrtoelpvextcly +dcejlfebrjejetdjmzf[ebtugaezmdvkxdl]babbgplruqqghxseeuj[kdjgtrnnzwffvxa]cevstjlmpskjzeeidz[gjckmdhojxehxuc]nqrngirtlagbwojukb +falbwekyijnufsyrgqm[lgwnlauxjymmzavcws]davusoovwxmwgjo[gzvhlcaikjbuttssdq]wpdnbuvbqozxqvua +jmhaipdyjojoexmgaf[yzeoffzdsyntjpawdah]eknpywjbojoskyiura +peipgvusywbfkfb[dpdvkejzvcnfxubljtf]sjyxhekgywleihjz[xpebncztvxxonwuqt]eitivylwufensob +xaeemympdbdanfy[zqxxxfkqlmqymzx]ssixxpwgisvxftal[twffyxxxzzfwejdo]gawoyoyptgwsuncuds[tnpwtclzavxnshge]rxiwzaghvviuddux +ndmojeftchotsyrui[onrnsftjvrfnxdub]bjbtbwpaxunibohp[vobbfwfgnztwfwk]sakgxnmssejznuym[lrkjfeagimaksllzkw]tzjhoqgstnhiwtfwxv +mkimrczxipnfjoenfyn[cthpigbgurreqaqm]bgvcttpetrjjcrn[wghqiaakyxmldcp]urwutrvkaukluecpf[vcrgtzezdvtjdaqn]avbpyjtujtvmsbkl +kffuasdfmyyckbvcpi[mtlwqooxmdztgraecr]nxxxmblqjctmimlvxyj[kbuygkhxdjcpceg]ezcpukzxpntqfrbwf[lhldwijzzcqidqamcb]bjlitvbbanxtbiu +ktlvgmzwavemrvzlc[guvmortwepibtzbvoe]iomcuyiybkjctwmk[mpaujwsppiwqfnpczk]anomefvhsofxngylnj[kvfesmnytlnjpxldqiw]bpxaqmkkjkqedkjinf +aycmquumrixcpyhx[iglewlmfellbvdk]zqfiuckeyjomazh[wdtngaffbtofmbva]ayjshpmiazzlcjowue[xhwfuanyynpdsezcodq]okoqtpvoyxfqiutag +kxymotzfhlhhbdl[tsbdokfypokswqetm]cxjtuubnqttfiapsbfy +hqjrvqgcycvhzdtfc[gshyzjzeiuyrrfiluow]vufgsnuaifsevwbts[zkzfgyckxtaorpldyls]hvjyzbdfqyykluj[pfpowxclncoirdu]ymoaujufohlhrawpmz +ldyqqxpficsgnsm[rvnztmernrjmvhls]ttduhtgvvmjkiil +zwmxvgenqqbbqihujd[oxtwuouobesowqrao]gnnxgbmaeijeyeh +khkdmxhvmdwdglpqjnq[zpcmwmjvuinqcim]ffzjfwsoxavawvusc[bentinefxinnuqkv]szerswbequtjacvwu[qttnymrwpyhamlubtl]vqnaphbflnmzjqei +fhqsbeixwxbkrnyx[tjmtuauoufrvtmsnvod]znpzvpuvhncqtjt[icgckqkrkwgojirrq]ckxpkdfotnzrfzyldrc +urwjarigxmgmgswtn[xjrjsopzksvzmgjhlrn]pwjsqoxtlshyaxf[axporznuyfctqhi]gvhznwrjrxljgmotleh +quiqiilyzwmxyzbfgux[ocyzjvkyqaqfjoqag]wexivvgdhmslykwwgp +bgsppuopeqshvdhrxt[yfblnbsqkjjueioisq]lwvpnboqojguqaulrlo[wnhlxlfouoglnqxgnev]iyqqhnmakvoxztpxnp +ofswixrurgvazkn[jukbphamobnvueqdqnt]adfjlvakayvrgkmtwka[gmxkfhlglhaeznpff]rrwqdermdneysymehpc +nazzydfglbansumot[ncsbwulgursrszyknha]urighqhhyroexekp[szxbjnxkasvwpwua]hdnzceosfcqebtprxxo[zwnkfvufmgdtvez]rrlcqspkcptjvulsfng +vsodrkskysfmohw[hwrjtzyduqodkdjgj]xhiosvwdwuwvqwwqm[bwfslhlgujojxxsrhys]micvbxdgzihqzltzje[tggikdhiylakwufw]nntlstxdwwmxmjz +ggwsdmfoilqmywvyktv[nqrfwjbmiipttqre]dpfehnkwftmeabpk +idetgmlzizlewzpligc[xskqctlxfifwpgtxje]lymzlbqpnmeylzwrq +wsnxdpcqyfleebzsp[jtdmlqmyetpcpqjzsyi]pitazjxjvewnjho[gqesisudfglpdolhn]jfaziwwwlpxwxhqfynx[cxwejyufcjbnvkz]ywcyufkunkitefy +zoabcbmpdbfhiyzzrb[lindkrkqwhhouvhhvfn]qlmljywcpqtuytbydxz[ktyjpegljuoftdwcbza]mcgddpemsqxvicvm +mxgthmyaupkuhkaolg[wiakwqprrxxrmuilza]pmuhwmouewzzxkq +jdbxzpohbifmjlbesm[vqetjjqcvlniokar]pkdspazyhqfyvovxhmc +aistnzrazhwdybv[ujwpnuzlxujgyijesso]tijdkwuxuyaotgi +mvgtsndmrheqjrwhip[ohfummqvupizjumgvv]kczjngcfeuwozis[izjdzfhsafujllbgqz]smvuowfxvapaqhrm +pcuiwlviqnyoachj[dlgxxylhzwhuvowtr]piyiyrxcvrbtcdn[kcegjaozyiyibnh]uwlkvkmzywsidhgcej[mqgatgmrdlffpjvp]ybsaqisekhdzkgzj +voqzvcjzjclcqqiqqov[wzvjezqkeougixj]vqhvqanaiolmhkfpy[cgjtaytywwwoclclru]lrmisugdvvvkfsspfi +xqkhogolmkblkxxje[kaejzosqwxresbgogo]ggddspicalpocithils[pztbyhclifuodlwhxda]cauqeecfiwpvyvzehjk[ufzlxamwsmaxvsol]mljctouodsupchz +kcepuqpreuovyraar[aiwdwtperlwlvbqdxi]yqavrluyhkhupxxz[vlxuuotzuvlfvirqo]vaewvboqoxfnggrrnw +gxeijqyqnnjzxvigef[prwrvyqyvxzojonqm]grlrsdpfhvpfjwrxr +yytzwymxwisswxc[terkcypwqvvmdnirqph]xdsjnlpajeicsqd[mvawtnvvnbocxhdx]gbzyqvwonlpeuzrstep[unrdpcwvbnhnhjsr]hwuzwmraiplzplhb +lavqcyjhwczvpyzipl[iqiuwaywidvolykuaq]nbgqhocjmvsbivzt +wdwtvakvxdapqpaqwpw[tbhryfzypcqkmvl]qkocobnvijyumdif[tgzmvdqrflqpajv]iztejfulutergziy +ksvcpqqpigrddnva[fvmdashpahovucg]faznkbnixlfjvjyhg[klrcqpbyyqexneuw]ogvdntbaxvikxut[pgbnoqdsjbhnnfsglz]vgmdegzvdtyirxq +zrqbhwbscinzviqqbvw[igtgietobqjhjgu]jljelzghzqbmlkehrbq[tvrrrmcbuigfcfff]vfwgfvlphnwunvair +wubsdikgqcdnnxao[fyobcpzfxepbhmtz]lgicisnssdefoquygr[uodoaghwyeovgwqd]qkaorrcwuumonbh +kzjnwgqelqkmltc[mfqrapsousyrctoxlpl]khapytvlssxxwgblc +oemekhuucnnkpglqn[grxxusqubxdzqyl]kjdmapmhyszfhemkjdv[feawbayehptooegn]kgdwtwvnavtiduqxwo +royijobmlxsglmfotr[uazprkxsqtgqbdeb]zztikniqfvaxifmhupo[uqtzaxenoirdmlyhwp]htfohllugfrwalhn +bgwuvkhyegrmdoffuw[uslzpejoesttiegxavn]ebebdisdaubdhbebp +aggmxhtosvempmory[yxtlfxfztmwdrvxtvi]celvnswiplhcbolxw +irgchekfpygvtxnu[rkmlwzeasngauzubwax]ujxwybzbmghcbglye[ryciioqcnrvzfoj]tsfhnuhouhepozzjabr +nugltbtwohjpvwm[qumtmfynkzltsysg]hrrhwgzkohqiqaa[atmtoaosvluzogrsk]rewpjesmmmiengjek +dfwxiypyrodbpyp[bcmienuitbibjciawg]wetmqwsernpjyzfiqg +agxpdoozggfgqhpkups[wczujtsywkrldyoxdu]stxeteqmxajruxhxxhd[bqvzcgcflltfgfulcp]vdagkanezojneoe +dvqelzyssahitfpag[grtomzhszpfebiev]kccedawmhuqkcrcrk +xdiqoofhceqxmqs[ujdcazesabclofy]azfztgulqnhfzfcfc +dlkchoeimefcrsuay[zopdjifnlcgnmbcdu]qdtevsrixomqydittn[ethvxsxqsiduxvzp]ufcyoijlrdwjiqy +avzbzzdookhhinbstmt[hbetohoiyzeetxtjwwh]muuhqqyoenknrosqc +ziaoosrpsgpmwdigl[fmgyicpxugwcenlnnia]ygcbciigvnqojgkrq +eeclprewfejnypima[wuxinonqndaynnneh]warzohigntoyvbhdb +bsscuanhtqgprwnq[sramwctkwarfhzewlyr]nqjbqlpohnbaqkxacfm[tfhsdqtivgdnvplvigp]jbhxkufifdlzppfso +afkhlbzuvhwkqgtu[xljjasobpexxunibvi]zwsvpnaotvaghchckmt +mmuvtymmslzxuxsl[bersttslewqgxvjgo]ipahuxiewzsnyhcgm[klpdvclduqwuaqzmda]xfgdcmvzzkyyhslmh[syfmraupugxlkobew]zxgbdgwwjnoietp +srithuoihefavsxwgny[onounhtrnonigjpukmi]ucbyzheogikvqdhh[eqhrgtujasnhhkoobni]epijlgdvxvymfgrv +ntbtfdqgcridugyoj[slmqwvjooruxoayeuya]elddyfwmkdaqrvj +eagpolfqlnjahgrp[tntebocuegsbsjgkf]sixfopuzjvwqbhatmn +zatwudnjplfwjaorjw[jqcqbirzvohixpl]fmlqzcprruflyfnxk +fjbespfptraaisobk[dehykwsvkxiiehy]owzcfcbzmuszaui[vxtmjuyctrexdcai]gtafjdieoegejbbxx +uznhobovgxlnclgsb[sgkamllpdkleossp]qwpimmrdmsizeea +ommachltlnpcqsk[bcgqymqekxeduyteuc]sqqksjfqwcelmvxvmil[ivologuudhoyoljbpgc]jxuxubuvsocambjwrxl +xigypxktvvgvvzpsmws[fefhqqoqufcqiicnj]nrvcqtvpvsyoefeyob[kpvzkboogiefpjei]yvmewqmkwqivsdfl +bxfnfdxahjhmlyhviht[yagrdqoiwsjheeta]dbmekzhawtetapagtn[mwsgphhxnszvddmmmuu]myknrzpfuzigvva[rubuxbozbbkjbfmr]ekgepgpnlzjbrhux +pxgynehaeperkzswyp[ctfzqifislcdqhign]kwjhjhadvkqfoprosyn[bxbjfjduweqqxshqrw]uaznlkxmssfmfzm[xbxwdysgytptaphpwse]ugekghaaepncbpgckzj +fkznfudbiblxhhze[vacqcynzyiecofd]gxiktkcknhldckcp[hcouamymtafatmirx]xteiephuffemzeel +oyokrsrvnjyehtinvg[wjwwwnyeucvpgszc]odoytwhhglrdodya +ouasmyefboyrhlawsju[vvnkfdgkrzdizes]pusbufkrcycpnfrtm +ljqkshuoyqbvfza[awtsydwgfkavhcjmpx]ujlnzhofnfrecdqnrd +msexjvtxzrrrpxltxy[hpwhplpjyxwwjstedb]lpluzxqfapmpwfncv +uzdzpjkqdjwtzflxaur[kjsxmwxaswopwyxw]lpztuktpdibkbhtqs +bsghlbjkrmiwwrzfzzq[whofvbzzqaacwztf]ikkrevvznotvczoqnei[xzvrgqliulervgi]yseqpdruqmaiouwkj[jlczdjfmsjpgvzguh]waxydchzmoughmr +iitiwhnalnlosnc[xpmwkcmbgrwisvoy]tfctoedzsmboegtjo +ttqdrjzymuagqqiz[ckecwxlvhltgosighl]oiknxwhvpoefazvvkn +dgzigyfngxcqwapqbfr[peyzbevhfbkconp]bbhycxlmzysynrcdij[qqsodhjuujzkehoeawm]gnlyrbnlgybeaaqyrzg[pouqbmatsfczqqrrkep]mdqnfjizjuaydagu +nzojrnbfrxvappppu[gbhscjbspyjsviyhv]crhdedgpszdouzio[unnohemwxlecqsrhtez]blgpnlvjkmvznlm[edemkrkixzunqjbbw]wrofffrmxakiqwt +hshucyqrhhwjdbyvil[rgqywsctjhucvsvsymw]xujmtuifweuvktqc[qwbxmhqfespgrzho]goevsvgqvbskpciebr +dvdjksdazrasbbmdp[ramiuseukzwtkycxgc]ycppxvaitmsvdoy +xtxspkgfoepqquwnf[viivstflpbvqrhmyt]gormtajywcijwfbpmo[jnkgkcuhodivxggiw]fdpkuzlipozqwtiwiq +kidemeuvfksjsfhy[ocwffrbmscxzyyax]yuljtvukgbwalmfsfc +fahhvpvwkkvltklj[jxnxhkvasjqewonzi]ttivuutjsoyjvfcpj[hpthotkiyjsyfhvk]kzendnponmwgjpyz[cruaaebmvuijcothir]cjqnlrjthvxeqdndpc +tsgjzunbkpizyqeqr[wqaqjinfxbszyik]iwbntvvubmiilra +dwiccjrwocgangcqdy[artytxoxbrrodhnrzmq]ohajkaeutwggiventwt +ibtdoaidcrtbsmhvksf[akuyowgcojzfdwraota]haaqsvxhxaixwpuhck[mpwpofhciwnjzqatql]krgajuglqvrzbprtta[xeehypsucuajhon]pqqtmsrbsbdiwtxnpv +baslapqsocqdaquvh[pjlzuqnuzytylre]gprhwiieirqfbbb[ytvearxznsjbbxhlf]mnwxjcfrvimrjpu[cvimuirdapiosohzulh]wmthcardkqnwpnypl +dmpkayksbmxaxlrur[eeswdwprkphnaqd]eikxmwafysjqxxszjl[plcixcgmkbxzwzuhkp]hqoxumhablcnmoip[bptiogxgjindjhfrn]xxwatfkthcjwqyhnkje +uhetvfadhbxpshtnf[maihnisbzjjddvdbh]khnxpuugcpiiaxdtl +ehfeojfzbyhhvhm[dnztraunljulvhnzfo]zlqarmjvifwxevhv +onjqzuwqztqelqhq[wwnytdpcnjphrjetxxa]gqbvuasgighpykjg[jrrtrvhhjtuzxiekcoq]rybavgoltejwzpx[uamnezcvwqhbtnpv]gfwaifghpqmdbtuh +zbvlbzrwsnqtmxvevvs[akxdycrntehyhlsikqs]nqmrgxvxheqeinnb[tcaxyyaxqqyavodvqmj]vsllwhiddpqnylo +zgegaqeqwyrhclzdlv[yhtevctgruszsqbcb]vygeingtolabpgyojf[bqsvkrlaqaughbr]zspqjczelulswra +yeunxsaihaavuoavjp[frtgjtmwotxdxcapfsh]pagxqknufbkcxlnsyv +vbvnrdomobobrkd[bfluwdqgdzzswav]ydzrlrtgohvqbwoto[czodsaxtotxohnje]nqgrqyggewjmklzthpm +gkhqhprnmrtdejox[bvuuhvpvdylnnpbc]spjvarmyzcxldjf[vjotgcqnfrkofqfpju]rakmxvjrrocsemy[wclvowuqivvtshwlvl]vlbhrxnfadktffqwdts +eieofbvelgfaaif[szerphlnujlfnltmlp]uczsdquecftuxywcon +fjikwtjhppqemms[drckbokfgrthhjj]eccmyomrlztemnjlli +ycvyiclwfsqfimqbqhr[salbqbgedsalzeukosi]vsnlwynocjtwfwykobz[gigasolhbyirzzgl]nlzlwbirifimfjs +xgtkwdpokjwzsxmpgl[yfafhfdemntzpbf]xqqpbpmldbmxqkgzepg[fuouzqrvwysplja]jpvejlwtvcepklabv +wwdngfpfaihzehky[ezwobhuctncfsxw]ujzubptpqmfbmtptv +oqwujxuxffauxup[mnhbivdelqlevvxgvyj]xmgntwppomdgploofgc[hcgxkkuysqfsjek]bufawargqfsvcxqor[vjzndzuanzasgnkpn]svvtfrrflvtvndqliy +sxxmkxkpzxtirrrkdu[sboyccxldcpclvtf]ygzlasdynwvphqjps[hpicrvgduavhjhi]vfdlyivngovuvzd[nqqzqbitpvgzlopktun]bayteidfcirbklhufdi +bepcfmlepfsqmtpzypy[alucbktkeotktgnwi]xuurpicvnelquvcxpr +igeoujaqikqpdbqhiz[pefrnbgmefclodb]lbxfyjpyvtwjsoe +npfgcmpnsucijsoq[iczfocvqgerjglu]gniihzzfdbddgfvwopy[chvpghdnjjzqblg]lgdxocvckvfckxgjkj +bvbuayzjrgreniq[vvkhefnfscetxxbpsk]mmvivsvdwravbvtrt +xuglkaojzufpbpondc[twaikvgetnyzpiavz]saqkbnxkrbpbyfsc[qxztmpswmpvpvisgv]anzhylixdnapsmiyik[hgwnmcxtzpksgqeuurn]yzhtwfrdfyuvsjmjpa +jtwxrqqqyluqufdf[tvkwjeghpejhivekqx]dcucgeqebqyhbshshm +ahhdycrszsrwjjcvojz[fmrmjimjzxnpqiybvp]ltbfzymjiujtryu[mxwaqromkutcwbwcg]hasstnwcybuhlbmp +hylwpmuxubrhdotqr[luufwrmuemdaqekttwi]ucyndgpufbbqbbsq[lzdvdhdfbvgakrqbi]tnciwujbyekicxguct +elcdjqojmcwqmlb[lvvuaudbokptcauadl]qmuukgwvvfpipmtd +ydpbccscfptppbic[phdmkbviawxqqyqevaz]oekifajbuhythyqyxt +evbrgexbagkpwtf[ywfmvfpvkfgvwwpf]ktbfwirdfcftcxbqw +tvkdxorbjljqdcsbp[anhtdvpapvcztmuybpi]igbiinywiyrlgunyvjb[evwzsfjmtgrzxnzkxmp]ycxgvldadmkdukwni +fxuwajvzdihghvdn[xexunkfzvyhstbz]piyivjleyasndgnny[pdakxjkrgcpejwnnujm]wdzqcrxrzpauwfmq[nuxflgndvxrxtrnjw]dkaggsnracnbfamlb +eqzmvcfzysxuymgypzw[dawchbjtjthjrwuc]onmnmwdlhucoaisobj[olpmwxvcemhndym]rhrzrnsqnmcqvoa[fbjcmnqxoclntvcvf]cjbvqfninuppvovkmqr +pzcplrtxsmrrnkdhb[fsfhbmpmoltsrazzmsc]lqxfdwwrojxmcppnck[jwmdfvhfkirltazsho]bupaelpproqgqltj[hwuvzedqqeozddnmdkf]mmppkwlljdxrupt +vdjlufjqpvyqgjx[omlvdzxsozlbrbkklh]avuprbrimlvpsfljr +ygbspsbxxswmsnm[xfqgducuqczosts]rcrilaqyhaqdzms[cnwbokkgnuqyybrtnh]lujwyrdmobhojwyss[qulylkekdvrzrdbrbz]siwhfcfwuijumpal +njzcgzhcswskgakj[yylntuikiucfrhp]umnlawqvcmsumomzor[wbkwjwbuinyfhcl]tdpughwogvaadspwsp[kybtdwntcawcvgg]xgmyammydawidxd +ofoexaumaogmrvfxva[ythshgunuchzyqnz]myhfbnqhkusbyaujqfp[ydqvapsxvatmnsqnotl]jsjxikgtoscfartj[rijtqnjlysmylrpe]jehdtbtjovixxcynhbo +ydfknwggrlosjxqy[cyhmgbqtompgkdoy]gqieuwyrjlbwxeyn +qnsrnssvsajezhc[modvjehlkjvwncl]optcxoazpnhamypkhj +optmucfvseahsayg[szijefttdjukyusqmz]xvdbredkrvydzjsbzhm +pklknlqabxqxkvs[zmcklqcmqysvjltw]sdfkabzheilcunm[woirucskjhwztjwa]avgmygopoubvkavsk +ulmcnycaeendwbjh[kbndrebyibzcijvgdk]ovyfstjzcawsgxjabc[wdtmeoiuiwkdfprpbf]vguvqkvghenzvvfi +khtrfyldigxwnrked[vmiucwzgenhgmchjz]ronhhmptnvkesvj[riapvohhcegxukqfklj]bvbujrwmkmnvbjmwi[vhheuhbyrifhvbvhmr]elejjwfebkwsgasxu +unjjhnpqehrjjcpzit[teuannuieyuxhrnpwt]eqmvmacjgajwwguysyk[nmmptfvozrpcnkiizs]jwrrglfbjgmampxzcxt[zksvtcdsnmceaghvco]pcxxattwhdmbhnkph +borbdeklgxlodif[giciuekdouebfugvuu]jwnlmqbvdxdhylnfk[asjceksckpbptsuj]btiwucqbgxqsphyj +pyuiibzuklinyxdxg[prbgjhutocdedjn]tvyzieshpeeluitw +mvrpsasuenekvzdu[djydvckfgunrkzgkqv]jhpxgayasabadnezx +rojzzwfajnxyfiima[qmcqljyjvpeccoemb]fnabwwocvkdbnymxzvl[uyooigklptdmxde]yeezkyxrmkoyqmxm +abtrnotnozgmsiene[rvywymbjmrszznl]tsqcnkliijzsataue[jrhatzsogcwhymmq]dczjarobvhaucwaltmi[zqwdgmjdumbadsjmqrm]aphemnpmxcaosmmbap +pqfeteyvtwhdxtr[yirceemqqrnkyfz]finsowielugfjti +xvzclksfiyvugkjty[xiufmgdubbhqoqkuip]qntnenloqobxvrfjfim +appwubxanahxahxqufu[lyujclxejirymgf]pgltzcbuirjhdndtsy[sxqixopfuviugyixptr]jdmjidcsiwbhkbn[zqdccjffpzqhaeow]bpyxcppnvfardsolbwg +zwsdevjtorapcmdkmqs[entskvcteinmrfm]dyxljfompsvnhnrsfoy[skzzszqseguhsajvj]uzscvlvhvjvzezqiy +enfsjrgrrbzhwkrrdb[baghohbyndbmgeta]vaekgqhilbkmxqfr[xzsirhckgfgtofahx]qkylgrvrqyknaju +ricdzabzcnzvtkxjigx[ahylbnwxznaqhjicslf]ujhbdkubrzyxuvagpkr[sauwmblnmphxaltcgan]ljculzlcjdhkhrjhy[krtwaopxtqcjcquq]gslqucmuqlkcwmibtb +rwagfoioguhsuxmnb[oqlchsmzdbbdiqs]itdkdkowiytntppqbpl[dkhveketihenwpjm]edkkekflzcsxrtbkoa[gcgunowkivsaizrergr]aykccxvaazjttbix +ydonpbxrsrisnwzezj[tvrolgecurxoaqygrq]elczpgdzfqzbxcjdfas[bkcwijdelhknclfzsu]dgrvkzdsngxaetjoi +nilekuwvaoeaohrbuq[tmmlftxmdyjgjwlcje]gnpgjgowjlkjvdxaaq +wyurocurtxvudii[boyyycdxrqrfebzxtsk]zybwccrrhhygcicgxtg[chcumobehmqmtdc]avlvrqrttfvsrpyqux +ukixopxocpvmxvkshjq[ilowajeaebgshbmcwc]vkgphlquuttcjdcaeaq +hhqnyfyenekjnnzh[nzsivysdmzlxujnen]tpxgxxovrrctyzo[hxooqqzuwyezujqff]ufzjddsqmdynyxktvc +aqgjlpapbewblghv[adxjmrbdowkfeuk]xwacrdlhqqisjbwgs[kmqrxtckdseljyzd]wywbycffohlnrpz[fgbdpzjxfjslaqeyvb]lzdfadvckypyddtrj +ynscfejmfrmwegxawe[wwavlkfjotnrilho]intmsmrthguxgbts[gjyywgijvhtlcuslhh]suvzwdlryrrqoukv[dvbgyhfbogftrzkof]ttxugypmjcpwwrj +glveidwbskfsjrpeivl[pntgsktknixclajqmli]vpxhkfquuqueaetktv[atrmrgcsygulmewp]tbhyqvdbmmqmjfp +asmieghesyynwrr[kwhopbocvxcctveyo]tyutaxdxwlljoau +hjxpjbafextgvdwyc[nubigljeloajrggv]uhnsrxgsxuyresxxtj[mhmgvlgvahmzdpxq]iiwirmqjgsfmaya +eezdjzjjufxtobmln[jfhatwrfnoxnubhvz]nqmgjykvaaskoobuspz[eyzdfdrftbmhtsqvb]daqsijtchmoaemot +cjrqdikuxpdlnjuw[kglodmoueecqfilsbc]kqppmkhtyvhbtedew +lelpkfweqesqgosa[wyjxoguthueknybtks]cfprlrhaaevwnhk[jdjgafghmtpklneklt]answcorhdeoofdxokhq[kwjmwtzeztdxpwo]ryengohbsahkqaqaa +gvtxfgnkdfhcpvpbqfw[fgullkfpxeqpxfeikv]pazghcjqpedihht[lpbmxqpmtsmhhvcftfe]cvuibwkuvzlyktklddy[nfxhoodduthgnhouwfc]hfcmvjxjvgdrriqzi +nmnznunznzhpiqf[kzrnoanvyrslaiwesyu]ztlqljtilulefcfw[ocgvakqhpjrmhqrpx]vsplhxhzslknsqx +bgzebaklxfotapk[qpkeedrozcythyekej]kchtifarcnclbdoey +rhpspwhbsfjhdgnmbx[gvmhqbwispuioyaadyd]aqfkmehrkqucpmckl +tnkbbytrqdxplxc[jrwexnliwrdpjxsbxs]pkatqnffpinqugyemu[eprydvhoczrmzsoov]edyqemyeqhauvmz +nmnoyjnhhpjzofxr[rhbzfdxnkxkmytszl]idjiytwayqhqpsto[lwomwdehcsadyzonfv]fsqqortykpqakaylth +bmcsapzfpbxulpxy[qyswwftkevpybymc]xyqgfdfoubxdnvsiuh[vwtoqdicblmfkdmkgmc]dkkfvbjicanywmqcryb[xnrvwydbdyssdwuog]zxaoerbwmuckyvijjl +ekknhqyoxhdxdhoizw[ohhmxdxypqgovswjxle]gghvnqbvfolthycesco +mwscyrzzomgdszdp[gaxvhxahstexdkuzal]hovwgjwfeuasvkgefjg +ycbhyiqhyaxieqyn[xsezcmhvbgccguwf]xmxfqnvysvmamhh[uxazcglqdthhxpzp]osyxegeblucpdglg[aamfejvkyvnalveud]xqflvtznebofhwf +gnzdxwwwisiqjsis[rdsyakldyidetzsaj]qocedtmvtnfsaol +zirxvihavvvjmxlk[eavxbjgywyjaccuy]fwckhphelbffbpsrwqn[rcnwurjglsqhaqxhx]tcgwbzmxszrspwbpn[nnaiywfuvjmnnjbngrx]nnwzgnsynyjhodjjal +yaklwokpliqzznn[voahnvbkbhdcrta]zpsfblandylkwetzblm[cviucbjqjxojxvfrbh]wxnmcgyslfyhjbb[xoeohbbquuflfczzrfx]huozeoewsqiqizrkg +qqezbweffsvlhdv[nrwlstjmcfdeoknejxa]bjbzwhrpzwhdplgpxzg +geqomfoxmohwtay[htuvkkoolcdjuwfkfi]ufnbtalpwnzxwawdo[wljakfwmzpzfawazm]glsmrgivnyqbvze[dypzcqcwpnnuuio]asqkiocooybnwotvhxv +qfveyucsvamopzcevpj[jhontypcjxiqmok]ztqopuugothlvqkyjr[gtwslgehaoefonk]gbzpfggosbzbwbwfnj +qgbbllwmdxvjbbdc[wilthdtqsnyidowz]fvsgrterxkfxytjo[vfbhaunwhnkucaa]nrmiutcaqjmmlvf[lslzfrijvupqytfsps]faoczeuslsurgnnj +mghuczcknredmulpm[kxyvogjbjkmfhvs]xuuugkpxisrmoqzrktn[kkjpjmjafktnbfsu]iixqcqwjcusrddz +acqlidiaismzjcv[krxwrizrblelrinmqt]dnhtoxugsddidzjpv +ruihphiefqxdtzoilo[harngompsprwsrfv]rrdsqrfrwmwwtxfdanq[ufqijmrzriucjhzjovp]tuptegnjeqzjxcqp +tdwxbgepspoqbphu[mvxrguzfqwbklaj]vrmibeoheitbarzdtw[piisgameaaskvbp]kouiijuqjufvhmyx[jwpqpekhyvbdvoyh]ivcmbeitdnzxalei +wvwhsvattcfkxsjbif[bkesznrpxrlcnsmhbxv]rdycrgrtwazfqlx[genmoutcoedshrn]ucufntphttrvzmgt +zbjsdpihltflxiyza[chbfofonfnheqku]lttrtaddrmooyaftzom[rpzbfrevbvvnqsoqta]vxqkgztdjwnyttshfq +blsbpkqkhwimfjxa[tysyypqpwfsihvpumwk]adivipxtgjemvvvdgip[etebetmijxhanxcndzx]bswwmsrqqpdrvovbopg +wljuhpitnutdkehqaqy[dudxaqawkozvbzjnl]oxcprdaaoaqrmku +tsvqtnchyztmsrkepo[sbykwhwpipjcnmsny]jkbriyxmedpdpxakjvq[hdbpjwvsmeagsnqf]fovyworeftotyou +tfgcfmqoawapbyqm[ezjehtzzfrelhfu]awpuzstowgckfmgrbh +uovjidiphghdzzjb[dtdrzwcusjtvukuw]ulkcrugzaophsdkgp[rovxtnfmskkldle]vdbtxyoyinruobcdfbw +ivdfqkjxsocxzmixvki[zbuuqoctjufuuge]xpllugxiqunyuelezg +oxzelsopvmbaskzk[qjidgldtzyxafqk]yruckjcrisxaytxie[migurcagcnpcxysz]mmbalecstoccvznciuz +kgtvaeutmykftmfxq[qkixsghbrdvmdxdfds]xcgrbqxjovoxdocf +hugtmltsmyjidfr[qvvenxersilqpddsa]rlxwylthrhpizeawuj[jdspbsvecihzguv]sudnxjqwbctujnisgm[pwesrolivyjummxqe]yxmwuojvnocdfgfdt +cngbxpbauezgfsoew[joasdwsddgnfaxy]qofsdoatlhczeekcaoh +rtzafrvbouppejhjya[pernxzuagmhlccktw]htuaplcqixyrpiobrc[kovyuqunaiajujoom]rbkzijvudwqfhgam[hhnhqfqzaaocgkt]swpxpivnbadljnibjpc +ervsgqmmagakjqslfzy[uvmkslgagnkyvxszev]eceaiknzayfbftt +zwzczkexxkvpobp[fbkdnsksmqwjqev]molinnmafhfqgbc[xokcwrgmanamiher]ymvfovgayderspzxqxi +ihpvknksyabxkbl[xrutpjyzjkmmglvvu]qjpmwlweqpzbuwwa[rcptostzorolknz]vsvkprnzbsbkkah[kppazroehhzhamfdeb]mfzzvblmbedqeui +xtliiwhelmircssh[blziuctnlnbddxzgryi]ndebxzkwjrwvlnlo[zzmptzhnmcvgmqkfive]ldkndptftrgskfi +vmcxolggxdtaawl[jrsapvcqpvpwzeyo]lsvrlnyqstxynwoluww[loswyflsrvkjqgjmyji]hvbkkapyfytegkbcvob[udbougwmipihlbqeyf]pyomqdbaiyqfwdngddp +fsckaqoorayphqddex[gdhcfnmxahimfrk]pscnlqroybeacmzl +faksrtkmppleuteolp[arpyspgdmmikuaxhf]qlfkpqvqsrthgsaa[isronuepalcjkfcsi]xoizuyhsovksivz[hctljitxdpncenbya]xcdavkilyghdcuhm +sdeqalvkcrkrinxry[xezvqhybsiwnncuafq]wgmtvsnsbilzxdd[exabnsnnyiyrxkdd]wmtluopjkaunmyyogc[mcecujbnhewtxxny]fasqbsmncghkmvv +imjsjagosjsapla[tulnvdectjfkpgfv]cycdjsngozzmkznmjro +yzrtsvldibvyyvtrh[wsessluyckcgokgkqb]zhmcpufpsxctxoyag +ptgavebppcdhrnhq[tttuwdmggqvjsyvqncy]watzcvwamwzegnlqyvr[xjgmshogcojhnjv]xltnwtmlptyidcevaw +pzgrqoktlayqnrett[hjjxrqhsnzoyccaaq]brpjabtdfxnygqiaarg[rkqavgkgubozgownwml]wjxgbervjemzngf[sjvmflnoffnnefafiw]qyjfcbbzkfpxjeiijwf +nfcostvpmrtsmxgi[mpsolgbkhgeaqxr]odzagbxqorrcvgbtqn[fflhwjduymmupdqtrzz]wckttgyhhfqroael +cmbteyhpmjucbdu[pwwwivojyyhfhuxrem]bwkmgeggapphrfd +kvqmdfjgukadbshzs[fdbbocfncwrodlocm]lvaxzdlzjfqguetpn +oxsxjgrrwiwscddy[cejrtbzlcfjvfawlck]wcbfearmyztejbvphuc[qiubscyfrbvlkuptpf]zrpobbrogzuycnopoit[enphqttsdcbavwzu]clrymfxpyjrbbbjor +hhkbpgfivocwsgt[ibvjydpzawdkukunm]gurrtsurksvdcmtim[sorhhoidukufzlzwc]iwioespgpdqtnroyq +iamtdgvqmstvcco[hkpcvfwrobdkuxoc]mvhkxcbpjljjqdo[jycwjtxuauhgwwr]wdaorllxaauagld +pbrmiwsixlfmsdwd[eogkhrzicmhfgpp]vynfbrwtkfevbzbske[jevcdynwfstxudo]qrvvassoiwkskcwrh +eurmgfnrxqchakry[xaketetlgzadzwpzm]eypyfdyrnmlevmikrkn[suyrnrkrprufjpxro]mekswuvazvujealz +mbrseqfrpnyimus[jzjzsthgcwtrzyc]fdrztnqjfeqfqutk[fvhqfugjkfthjoffols]iuydpdexhtvrhbthmn +wpdjebvrzmivunrvwwu[wtvseusrowyuezwouf]qhrauglncxcamzwfjz[vcobhfnmhhhhpftxx]rrqqlthgismiahcrm +qeljpmnlnlgfbwlw[gzrcgmwqbugtmvc]mveuxatewhiuxxy[hdazkerrbjavygs]hmoechcirywzjscbgs[eunkjyiyldyrnzz]kqceecablooujyhpo +pvttquyqcivwqyb[qdewyprgoyjzstop]rniodvvcjaprzwhrugj +yoqoqchbjoxlaujxal[qiovqowowzwjnqjnmv]zeujymywxrcdyxt[biudovwqwilssftvaji]cvllvfrnzvbpwqoq +dfdmogzbwoqcxxjt[wjkxgbiadsjhasw]nahghhzvcmxzsuezbd[xldtozzfdfibzyfir]naoyetzdxxhsuayxhdv[bgnjxcjigctspvtphi]ofqodixdyoyllqwmm +whnoowlrfbusppnmx[iqkoqqwuwpjymrfgmef]mwbcxqkekmkjuyec[ehjhwneoswbhfistr]dgimikumgypgcfgkhud[wcfspumwevprqkdkra]lkrqeomimrcuuutma +cwfwtigiptyuoscgqjl[xfsopbkdejtqyfqcr]xgoctctnbrpgdpetx[jrvsqxlosucawqmm]xybgpxudsdlmuzkkk[pvmkpymwtmsvblad]tuadmrxepxtcfxnj +hcrioqzpglfeqhk[atmukocquibjcdk]zevfvsavtdplmavzv[tqgaubxkybftifxnox]uzekdndrbdsgpuqdpc[ivnsdltuqiukdag]zujjefxyclbusavtb +rubuyuyswgsvuryuhg[bggufeqnvnmcltkxdn]pdixuunidafnnzmvy[qmewpxbpqxfakkpjq]khvqslqcodcifoku[vgvnbaunegtxgdogryr]uyvkemhfsxruwonkyy +wavmxyhhhthnxbqeu[zbvfbagorkymbgt]cxdkxjdiwemkbqcfs +qcynqcmhyzosgclnlj[dkwoyvtlgqwferyplhs]ixqnfkjsytvyhwk[mskihexwsrthrwoxlkq]ybcepjxrwbfpwbrj[jtikhwoljzhnhxtd]bmbaqxydzmnsbbui +tikuebtrsggwohnoc[gmsyovowwveyivxom]loedcvovnwjlxrin +fkabwdkuftcibicsnpy[chlyzxtachvkcehii]efjkasydyavlmogrn[ljdwiemzattmpezhrk]hfvbegnrtuvvxrfpmu[iobgqgzwgicgdljml]sxehdovgegoxgfuoz +jpxfbgmxcedzrhcw[awblqyolqotobty]zghskkdwhirzeabi[bpfnymgupwpyvtqno]rzxgvoakkarqzckqlm +tpriezzqcwdapzmqi[uhbvdbykbjjugwx]updunlgopgmpuxhz[ppvimkoubpzdrdpnqs]nznhmtrcebortfmub +yvhtcgpickhpkugv[peidlppzxitabkhqxqk]tewdgsemxtpdzlbp[cqlkzgucaeogcphup]sowzdzofzfxmuqm +obsasbvikoqimtvhwig[zvnaytcddqphbstv]tfeurtvgujjmdqt[cjlpuwqhembtpto]qtgtjmciifvrjqvpl +qqdcyxwbsygmkhe[bohkfvniilpcnylq]jsxsgqfvkcqgtlx[coqishgebcdedju]mvgfzpuqgdqqmlrahuo[skcrnqfagotgitdh]edhqioatknhvqgtksj +ybmxgdftqlhmytcftg[leyqniwliccsyildw]mgwbzvbnxtmpeeh +dldzrldldtqrrgeyy[gkwkejjgjmkasiszp]weovrlqtdhoefbf +dcqsumoaiclldoocbu[rxmnzngtpqbvoaekut]qucfneogbyxmtnzjjs +snvaekazpxnocmvoblf[ahgpcmeawumtzplcib]qvhpmwsttfbqebklb[kunfihiwmtokswlzbe]bjecsktfdhzxuzsekj[bkgmlzkpwrmuacgdbqo]nubfdchpgxxdron +mshnjuzlppnyjksh[xkxximnofpivappllvw]qtjwjjyhubwlnjac +ckilmywqvmrrrygjg[xvwolhywbdouyxttxlz]bwkzfunrjefbxctn[azmsxgpkdmcycberi]bdvvzbhvykxyyle[dkaxgvdfddserbyfii]juehqvwzulaosay +dgrdibnxjppdktgoit[vvozfezhcvfpzpb]ympljeoeowdprztyw[ggojctjisspsgwkboj]gkmmhteczsojypwqf[tyqjmwiqzswilwt]ohwnrsiggvwhsxqrpd +tnvdozwrubciyrdex[niwiaiphjxqouxf]uotsxpehznazjut[kyutlrycvciunrehme]sndicjrgcqnujkq +wehiywednvqcusqc[edielesexiqqlslgq]xgmuihvoesidict +jqdnckyvwyiermwlxu[hmaepthcfvaggphmk]ybzjbirijyxypoatll +pxwtrngnidzoikjacbr[hmzpszagpflytcnl]nzbzixygkdfeyxcvnb +exmklubmftcstgfar[rvqpqfvlepfefek]kujnqogijggldwbdhld[coinyznostzlfsppvqk]kseichzhzxmxvyhrfqt +lstwjvommzlmudvdq[iemnxpjcvfmcdmsjglg]iozkhciriurjusbkwk +vlzeeygnjpkujryahx[mmzjlmzzcnioefctryn]njdpfoaoawffveissqo[jdtrzsflacqptpj]hosvbnjbhkcrndipsbv[bzexrmoxyqlxeqhrj]mrhwasnckclqoeqkj +pwpdkauxzallkcbpo[qpuxtpxjqpjpsurunws]hrzxcfelkqidswszccx[fuhnomwpwgiakrkt]omgjstlmqqeqpngtt[iyqymggrzzleeody]blvqxngiwkntvocjmo +wnwvwnqfjujvwvk[lexdnhmrokvkufsnqmo]xpfgqupyzrotwim +nbynnmofuvgajvkuwxl[tphszshufggusga]llbdbageokodcaoqehm[reiislkltazqdwkeedw]ruuynjfntbplyyx[vawvqtvxkqjzkqktoh]tjxdobeddpkmlhtx +miahcruksdynhluwp[ytjrkwguartqhts]acubeswyhngxcuongsm[qieirczwzpogxrgsq]pkjvlwwoigzbdetcxom[girgybnrihgankqadyn]iinsphjfseslwef +zsukwqwfvhamtzv[odtezxdtbxbbjxizth]knevuvdvkhhoxxvhqeq[dcuzmnxphpypagsip]midveqcwlvktcaa +kzxcbzdabbovirtmgau[uswizwfejwhehvr]klbqftcmdrqefgel +zgqspbdsiaworwaddt[xobuokktkigliim]kznrswhwmzuxpfesmd[wvemizuoujudbnvub]urjofqtkkuzkytpfsrz +tevwkvcsisbfatbi[zbfthmfwgqkdqgpomwb]azkhhgkithojbelrs +btbwjpqtashnwizlfq[xhjvuaewdpuetpqi]gzshtumvqhkszakb[rqjnrhvvpgqkquwzz]bghhfjxukqknaxtnn +ianvqljsgiwwwpygbj[scrhaeddnjvtginln]jlhwjpdlnfeveigqprl +jtsgfzkpclhjbovpi[ixaehuixnpbzgmtmm]pvrxiwkyrvbajrb[cjlelxhejwwnseumy]ikdowirllxmuglwdz[lzovvdawkjnghbyehh]cngbbbeqmaaqokewt +qgdsbxninirijouefg[klekiewvjtcdxfdila]kzfwzfhzfoujtmrcuje[llkqwuyfoqjysyyc]wsmwhuxbtzurkeid +txhobmmzrqlghsu[pakgwjuydphidahute]crrzoeehbiysjafngkv[luptkawydmuztmcblfz]kprmziqnzkhpxfabhb +rvufkiktbvnotod[jphkdlpkjeigxjqgjn]bmknabjinjeuiki +zwwxudbvwcsaruswt[zfjkmmbzxajtwbdj]eepmwkbkpmbkbxovhia +ayzjygofeezlymze[ajmtrzvtwrplgzk]vwgedbdzfcdvlbdbd +kyaahofyiptqlrdvo[nksbtkzihbjrafkedjr]xybomxqdnsfmxtelvzh[oaapzcjzmyhpqai]qbskvazcpbvjnfdhn +zzddqjgykejlqow[surormryamavdrflsu]ovbhbhiofkemrmbq[zuxaxjaolswrzcglt]plirqfvhirouawm +aigjnupodnwbobzvn[mmmbzvkaqyljfdso]udnugxtjwkzrqgxie +ogwauwxanzadkougje[eqkqpzxvqvjoouh]lfkrkwwpjipktlcgvxs[guxerxzsvgztktamj]ggvheernrbzepvlheex +zrpijmmyxifndxz[edeqiujkuymqywq]oxvkgxekhxlsvrrivvg[oehkqqldmldngnq]nokjsnpbyixvzimmbw[vfzdizgbrtprjkh]eeaxrkybwtpnfcyq +pgmrgxidmtrmoqxnrv[bwwiifqqpkvpnqsrt]xymvgstorhhhlzhukfv +nhhmhupflojxmwnh[xzlsoqntfifjcapmwn]rpviveyvhkhswito[ryeeofttqkhkbmokmi]ebsnrkidkxzrwwbf[lizqaxlfqjlrglxg]gdpmskujkulqitskwfz +limvjkmdnvycrab[urpwsqwsfgftgidxbc]yfgcsvgurtsvkjqvxp[cgnqmeswvibvvoqbn]vnykqwjdflasldqdtri[pfbtzcegiuitkjopm]udmsysvgvmtdebl +copajvuuvljurswjhlv[yrmkyjydqjdysdkldln]wgzfebnjrmuaxbqhr[myrpufkfkowxvwbt]htntuquzgxqmwnjetpf +ohtwpsadxznphxkjidu[bdpmoqxtfwehcigpw]ztrgpyoxyuwugnqdwh[axurupvztacpqrourzd]ixcwkdcvbdijyhz +guqlgnplqehqvzldn[sswhwgukeunvezgbws]clkdyxiebcedrnhrb[slmbnjtbhdnjqkb]kdhitjgvqotodlgqus +zbqynkvuyzsrnaycxa[xicrbiytzgwnrzg]bnchnjvqnvvamulteym[vyobaxgfdudkusb]utjdxdutkirbrcnru[nziciprzormocagfd]bhewqskrdgmwxke +qxrmuodvindqvno[tadfrqogkqjqhzx]yinnblpurapwhewsown +cjxdkqnspksopxpkee[knvnqkjekmtdnazd]sihvdgnuujsadypbjfu[hpxlankhthglgho]pofexznitmwezidwupm +kvnnkdxlqbpnjph[qrgzlftpjiehardjfcp]davsfmgnxtfqbiwrou[pvtpamwiamcejklvb]vchjfnblkxebwsbqqlq[jeeggmzmoogpujvnwpc]rsqkrddlpieuthtjk +syuaknunjsepwcxotfy[zujyunuzyvehhqjf]wyfoxvcfmhqxhvgjn +utkiczwafvwtqukzo[difdyqhszswzosvyqb]lhkisgbqynprsae[veibfwkkeyjcaxth]uxdekjckzkifulxs[jrjgwyduwrlgddnw]qdyhsivqjprjbstf +ulpgdxuwfjglisvwhgf[evlwiyunqxabguz]wkgdyfouunklxvcom +xxcuqshmfgedytfdt[whavzobglhuethmyjtb]htuhmvdgyvcswufnixa[cbkipdlosqgamuz]fbxdzemkfnaofqhy +fmnzrstzqotjqfpswhs[vbqaazsgdkzowgy]hljkdlhlivihlhww +vxnvfwncvtddmxn[qdztvykawmixzsmhbf]hrummwvapcqokkxtyva[dlxuybkyamqjorwk]yhecpgjzirblrgpi +vrbwcrefbfeyheckd[tfuieucjwqdsyhbhq]nbvhmebepywyrkmto[rncncajyznsqjmvsv]tfxqlxrorzfnapste +vmemxnbmynxzogwcd[qbvahclyysulqgltzeq]ujwzxcermwzdixhxzhv[ovrdvzwzaowbpqha]xoabyrojezmgwaqd[todpqenmramguxrjwi]sabztynxcjgbuqxmr +lcksticedysidnlkxq[bfltyxyfbfvdmrjajpc]puqmhazeoztndtjlfw[iqpueljanqxaepulk]rydqkyqdiaiicrmerda +vuobbnewwsdcmeu[ufsyoetyczrvixkmxqk]byuxuqzwryfgjtfdx +iprsucnzcpjjcwxb[roawxineaovtmlc]thtfcccdiryzdxc +clnftfuslfkusrc[jdjlerrcdkdroeua]dwnvmspacjkuubvuu +frdnlaqcbvkvyggwbzl[kybcvggyflcwlitzxo]zthkkszsnajwtfdw +fvqsnmfgbpixbyryp[eadgyuttmxhlptccb]phksccteigdnbldmtsb +tiaezunggkakzbv[tkmctgtihulchag]bkiatejazgeozzfih +ckqpdxyowthtfkrqhma[sicmvwqvsnoftvte]lcosjiegmeilkkzwcj +nvazrbkmooazozl[jeznxzzyxhmnopr]bxltiqjuxqjcunb[aixtzkozgngkwhlrj]frctkysebyvixjadkv +tstprjkgjvpbqptc[xthwfmchopcfzrjin]lyyobeeuqgoevymyzd +vzqsdhcylskoxrip[gjgzmmhryphljuzbxzv]lqhdhhelntgqsjyj +drkktrcuclelctvphj[lgvizjvqzcpdlvtgvn]houegqpucrquzdp +bjryqckxvymkcdydn[nqivnqzbjhreueaajna]fxpfigwhtxixllsir[pkushhryhehrccy]xishkltxvbfsxhkling[kulvofivcvexawp]soiyukxfuwwdgccug +kmailxqkywaagznq[kdwonyaofeekdeppdtv]pnthputkjvdbgyru[lpiwcpmcudqzcbvzggl]pbznywxvbckrvapuql[rbfkbmejtuayrlh]fykknsratzeksdgm +vsvtjxjkmzzcqsiu[pwsgmqzkemnofmlsqz]rbmcsnujrpgnpao[intigncrzlaxkbbnvzv]jdpakshhywqkdtpzsfg +fqlxdtfrxlbrastov[sidhdltoumwhntbjbb]xxpxptxxuenjeqexgn[niaxbptapvcsoax]mwfkjhzdxsfmpdd +zwjiosjujxsundbpr[qtakztwdxjnsnbj]hstbhwdwjkfujcl[zlavkjuknwcrshv]azyjashinydxtglzap[soonufsmdppzwxws]eulwduyyqxwxwtxvf +euixknsdzvnvairuenb[lriewvmalbssnurfbva]dvkofaligokdhjdfhmc[cegqoaqltfwtkexh]jcpdqbzoykxsaewvkle +jlvzlamdbscjkfim[nogqesekrawfckn]pedfdrkstthxprlzhqp[mgkxjaxugoyetlbybky]owtfewvpbwmiobnt[gsmtvavsebjcytbl]gldttejkthcainnw +vleehsdlxbcduyk[epbegqkqvpbetnqqur]utbvntyotvbehdw[wokifkvqmwgzhqi]gshozqmbybvdpzw +psberheospownrstmdb[hobixrwwbcjzlkrhyg]uusuyjsjdbjdipw[zfcosustjcjhunt]azpzempiylqhxzfdgd[okrowkogfwtccgrot]ezvgnigzhusxnyb +cawisrurjjercfxhg[anmauekxeejeiximk]qxxixahhioggyzxgt[ckrftztwxaprurc]cqgqlcuaxlsqrslm +mztqprjejzrfqcknl[hgvormumunnhyinact]oqmfdxtlqwvkcbnjq +ddqxshliyzpwmxfz[efqwuxzhnnnwvmae]jsnnwmmkbppdxqzuebu[tuqnsjbhkznrjeaewy]qgxdbtoafuaopmrrc[rrztddfevqzsszvama]laovqbyjxvhpqei +jftpvubbjalxusud[gixzcxhftfszswi]pzsztljzizffceb +hnqlzwizmeivopno[ybdwictmpmudjoelhe]tmqlhikpqeasdgikoiz[ooksfcddcpwmdbr]ickslqdrtjybyhooipk[mqbxxbyvktocntv]kbecbfiqbywiclxoa +mxaocnceliygtnt[chgbrdkhugvdfvt]bsscipyhkcfsekr[nuzlhwyhkmxuxclzwk]nuwnoksstdpfemu +yuptzkxnywmlcstq[azizdckkaibnwtjh]kesoaxduowrjwnnuuhl[mtzhwqznjijbgfmncgm]adqfnionvyioeoh[rgctldknwjmedqrxfof]wujfhdmcxyoudxjew +aojnbfwkkmhzkrlvmls[bnydjrladlbfsjm]ppferzjwrjmvgdq +pvbkgycmswoaofxzt[jqpftuvzelyrqiur]jtvbpwgglokuycce[odeunkfjfnhsdgk]xaphgtoqxoxeiaprz +hiykncscrcsfznwlsa[idrrvtjpeljmnuzcwg]tjlkziajdeqsakkao[xuojrksmvmablcz]jafrcrvnbkhyjjng +yuykiwvwvugeegtbkx[gtfoajutbcxcorxnp]stupzwvwhfaloddsotp[gqurzoxqyhksfkie]itbshgnwomnxpqz +vbpomdpserlvmieask[tqjuggfhprmneivw]djxlzdgolqmhkao[cpiglqvurgbaxadba]cwyeykmfnszwyhlaf[teqhpayrwdnxagiidq]ptvnkeifvimgqbfqj +wnnkshlawsyprxvsgy[bvhyqlvxtgwttgvgmb]ajkhvejrdevvilqvm[ujtzkisrhcwjawkpp]prfxzvzmtcccialpo +uyhofsbngqurnhro[plqzlpngwhzhfiarqz]xqajzmywhyiqamuyhof[zbgmoktjsjelnkb]xfypsqvgzjtgzbyubbo +svtvybgrxkankzx[fuvinmadnipjxrtj]whnciqgscsntbktd +ogmihypeokevbjqtvb[cuogkytvglrpvpkcl]cpfkxrmfqcejxjazd +enskyoaaijegndjox[flvbziostlkjvowo]oskdogvvipfdkvwxus[rhhyxymeviwltjpnws]nwvpwwvxzxnngtn +kegxoylxvwpmgdrin[mmmvlxpcthmodjykqvg]gpyysciahkottruuy[hswsbitgguxjpzi]zdforhdaexvaskgkxud +qeezojkbjgqstiyvtkl[ubhdzobsjvakjhri]krfizmrhuqhwkzzl[kkrkurrvbsjbzru]rdedxlmltkbyrfl +jbdkqtpbpekdupxqmz[emavdfxjrmcupcagh]hucmtkkzbozsefonohh[gykdmwpdwcggqozmf]xypzhnaejxoovwmey[ygpjhlilnooukjlpie]qbnlaggaqpfazbzcz +mrxhbcizrazzesmtn[nkskrvdwnxhsksugs]dhsgjqblxzzvfehk +mgriwdwzebmpsyeisz[iyfhezgmcpwvqmng]jfdmdkcnpmfaxdwdv[jnatlhvlqgotxfoet]toyymdknbbiljioo[endxmgmktdygkbem]xtxirnbghkbhgyt +iwkcwctaiifccyvx[dhreuhwgdcxdoaesacj]krojhzfgsypullwh[auulusartlbzxww]wvtmyrlsuoaqshxs +qwlajgzkuijkxyyobu[gbblqehetozmviszvb]itpdcmwthdsvqebfwig[odigspkfzgljypqzck]hhekbpjywzgbutrsmjh +cynmrmkfvmoebkgez[jzaybzotjlunvvfqot]tiocypxzwggoxmcmx[gwcvebutfmbpxuqh]ggqtjzmrjurxqcdxivu +agxxvohnbvmcjufyjdk[qlqeonouztkfircb]wggnpwpnjbhmdsdy[omrwycukclrnonoo]cqfgbcjzejfbiozco +drrgfvmqoumkispbtyp[iufgziylbvyleequkcc]rmukeddqyhuqevq[ruluasxbpvhpooctqf]jkjotjldovfjhsvtc +xxlahrtevhandbwroy[pcraznkocuurcgsj]pjajsaxktcpdvsbyyzp[tgmvgtqdcjkqsiqhi]meyzuvytavmvqvwkbt[lzpuiedmvmzcttntk]wlvylpwgbphxadzzw +dvuxzjrjwvnmblmj[vfbseaawbpftutnh]nzvmqwsnulncdxujiy[scainwpdjofjqjtoaaj]vhtwsvzjcxkcriev[hwxjhdlcsoosbgei]znobbrjigcpnsekcp +aohprtieaesusqzct[rxeifkybhndprydjfd]krwfcrwdefuwhwl[qncjqacmkmuxnwhpgjf]cyrismwksodxfswc +wmcyfvxwfnhneauhgge[jrvogoqcmfoltzs]qbaegqpmphkondsxcvh[ahxrnnjutnixwos]exmftfnqdjormjpl +nleqavohxgdpbxemz[ieaoydhnfcxrcnaea]cfnacaezpqaxeaef +uzqtoyqmvlugqwlyitr[sgxfuoyuymvktnvbj]xcyadfqmlxgmzqasbp +vwtwrwthqnkdhjlq[ilrhmekzbibtyrdzefw]oflmshlxwclsrsn[betodlpmjiqvzkmxaj]pnwzfzthqidonyx[swqvtscumgjohkuy]yiiohppikeskcygdht +zpmeptspcezjvhak[uyjaxzismpxzmqs]acvugzigemnoelhes +eefdpemsqjhxthkhbfj[gsvbehxnyhhoehtmala]cwqtbyqnndgjfdab[snsdcfxtdcpmocaig]lbzzubcayijfxjvq[nnglxyyepowuzcfxfc]exftztcstqqkjzxgcfl +kbfpnwnlptrkchm[jvgtlrciswdwjpmre]otpqukbkhqgxzhl[xfygtxgedseyctuf]sywdtsfgzwqtzipzujy[rigonhegruewmqqknj]hqqjsjjilqwbcgjz +sgnkiiabcovqzfpnn[vkygnyxpngrdlzkcy]dfgbiqmwnuixulrubdm +vacsabexiddvjpae[uvxtrszpciapnxshb]ghuwfleiiwyxvnfh[nlyyctrjyodrltml]oddtljkktizflewj +sjagfvgzfirwgzfncvi[escyvycktqqteujdf]tzscvdivppgiunla[gnmeersqdxblaqxdxx]orweuxmleakfshe[cnagekzxxornsztbjb]yzvsmxolljxxxtabjd +jyrxuhirgsjwvdb[cgyfsvjjyjtgbfh]mtefdrhxxvxhzdfzvt[ftlnxxaroyqzurox]yeeggfwhkkdqdmwdjq[qojfuvhtfvbyiiqzjs]tzpetihzcsaqmpqrfa +bjaexsnawropmbsyqah[axjgbptxigrrcqefs]pbizjcylfxsjztupl +mkfwnwfmaxjfvbd[tbdqrfncqhqfolrohlh]vufbysbumanpwsvplk[hgccgaugrrifthwqmn]jqfuefpubmxlljqwasj +sxlxlxhmodwwwlxld[emazxtunmycokpo]zmtpdjhowqqognt +tsqdulffcaxdqzhreo[dhxegtmgfyqeggmanm]cbfkamkmmudpqqe[lguxotzyuadywbg]bopsbcslvtkabqmly +iqvjzuupdyywqsnfml[wmrdmfcjcvntngbbw]ctoelddeeyheejp[mvdgitdtomshgeyfrl]cqxjyvfoikwebiho[rkltpvwgobbhvocruq]xdkwjfechyvrlbpxet +xdoqpyeckdlaiszs[rukukzfdtfzmmnk]aqpqwackscsqlml[xakkukhjyrloxombkn]ocqtwftdgowrrtr +miavqilsngerosmmlh[yqnwyxkptnrgwuh]zmacdwkbtmeiogmw +tirgarumxgeguzenzic[bnvitcpldegejsk]ncqjdmckryasjokmrr[wokprgiunqngvojn]srqqnuyooampjrzwo +wsqnzcgeghjpegehafn[khldptwssfvljpvt]etwlcnkuxlbzymrlsmb +kiquxnadzdgxxpex[eynkhbuajcefvhzxc]bjcsllfwpvuymnbiqr[roiyobkmmfomhnflpr]wftiprlltbfjjxckzhh[dpehbckgfqksmudek]hyiqoytirusiqmkjqio +galgxbwpysunvtadi[tixmvajxwyaqbkkbrtn]wiqwynobloyzexeb +klujuavsjcsvjju[wewpoytrayrqrhsqnm]tcrlmzsqhdoqlnyann[gfnbvifqypvxipyoun]dilnsipmuhjesppqju +ddesjlkpijlflrolxrj[mtouorsfscxfdyrwac]ppyvpitgkmchfjhgup[qtunszixycukqwhmycc]bqoxbvbpayesttsz[mynsuxmrxhmhjuupfp]bpvlqetvfwvddhh +niibfqknwxomycwayj[uwpbncnbnbjdktrfp]xticnctzogcgummf[uymncaoblvekoeq]kycgfcxwpluejthfigz +zvdnfqgnpxzckphgak[cikazwnixzopcdu]kqghwzhlhshodbgwyaf +dlmkotqywgjhwbx[xbmqztdikktzmoop]iqzahqdnhrjsscw[vtbnldlnlyiemtkh]zgubuvnujaavugb +gukffymwcehuzqmm[whsnyfteuuztughezd]unjohwlbznalhzziio[vtuadjvxthrwsvbumqp]vnialcxezvuolabtlq +pwkslkjhgcpcwehque[xrjuhatdqjzppuz]mjwsyqiidzbigcjkqc[nluvxxbfpmaljcjfygd]naiapmpcpdqatidqrv[uffwdvbvthmlhcfkkge]cnlmdjwaoubyedma +ehnjnlgljdsybmrkvha[jqaqcxtwzfbynxfzlry]kknsqtggstgkonnwqbw[zfhbcthldvkqzeeamv]ztsziucppbuckie +vbfpxyrslfviwjasotr[igcqcyzanjkknjrtec]kvvpsdwqsdmeophr[nbaybnnckjgjvzpqbz]wjfvxaecmhtxpbrild[fyulyzxzafftwhpz]unojeclbmzclhzx +pkgmdwbjrzzgicfpsc[mqfflkezdwpwykan]ochvvwteukpmhrhxjdx[fcskceneoiiylbmn]ixkkydgafasxxogq[erqgeoxbdrizkacisih]pcbrdfjopcdentkhyht +yfywjwtlknqfoubst[xzlppjcjwgkncwa]sbsifrdawjsphpziem[xmxeveuycvhurgnf]hntcfimfscaohlvwpu +ngarjrzglcxqbjqxo[qyybkrmiohhwlalfm]evhremxjrjsorhhsm[csawqocrcoxsupodwd]lnwsrxgoexppbnmlt[frvavptmamvyqclcwwu]uxbegecmhuoipnlvux +gwlyylsyblqqnvbj[jzzagfujmvwcvhlnhm]bgqddudaiuchcfh +mvijkuegdrpnmnb[fibqrzhhvjjaleraa]fcjabpshhhkbcmcr[yodmibpoadyyjevu]orjjwjrplvsitmbdca +tddarkqzgzcroswo[yiizkkpjcrnwlagt]qnbzxxdgzgnxygowzw[tghcmhqbbtkddvp]runjmyflfgzyjajg +znkhgknlwpazsethi[amnxbwdzvbtckymm]fuagoeyfosfplnvdxy +exrrjmkvsiplddrfk[lirnsrcctykvjrgu]dgwbrkchnkuochq +rpsoyrvptolnlxr[xalcytpzlzithaaujb]ihcahmluroytiem +hzhjvwoiwyajqkwkmks[fpmzbcuxxqarjimbpbm]fholbzryqsprgswx[tslkyxnthjytovov]tlgcsrdfeyhbfdei +ogfidlqvtruzlqiqx[cqknmhfmkbzdzdnrn]ubszlidbpcietcbpib[pdcpbucpspopdcgmn]ohhqskqdwcahmkslps +pzorygrmbbofzzzlhr[djxceuyvowbcbyrrp]cokaahrpabxwqccqaw +wqkcjtsnsnrnoguze[qtkujvopoiwnsnyj]wjpnbkzsrkdmjwhk[myorbznqrnieutxbt]bivalvvdqsjssmgoin +gvswtukculoxwywlgvc[rxhwthbnvgiszqj]dlxlwsnngfxtxaxra[mmibrdioonvaptadxnq]zblqqlhosassxdsmj +njwxcxsbmlqnujsv[zrpjfusprxajnokgam]gpohycqghidttoylbyu[jvqgapignxfrqlo]lfrmfxebbwhrukamfc +gkbgeoxxwwajzwloo[wglhbpldleateucgvnp]gebfovxsodntrawztcu[luvrntxtspjxpci]qutrtvabsfmedptbwld +walfhzzejzgjfpsx[yikqqzzxxwcvmsrpi]mokawvbvxfshenhrgyl[qzhowtlxzlhjnrvos]uzedstyhtxyodwfxngz +awoizwpnpjoinkj[vrqxkukowgftublkxq]ojorrutzzusfsiq[jfpjktqlszpktiaz]eknozpphyjgvjock[nblfkbhtcbiywbgqx]ybfsrfiqqhuwwfizjpn +kzimhyucwdjwzsxueb[ihapqjxphsmmxpx]rezebnatvsijssj[avjsvhfagnqhqda]wdropwgmvfbdhxkyz[bxstvyjafvdzzhhj]mwioxpzxyxdycwmotv +wdgbhmdblqkfgcbkqij[yecckefvryjvkdimdj]owpkgnzzbkmirdvij +vvtclwrmitixpftahev[qpwnsefletbjzuayn]fdpsflowuakwchowud[ilsvarhwqwjncud]tdabbnvupamppngbxet +yajftdfqbdgelonjdak[cruzjzvtanizzvynbw]vkxpoufluztpjhb[znuobtwgeitdmkclh]fyagithnpbhoypm[dftlbnxeuoasdurqbk]rpyzntgwhlojjxuj +ozyzmowqiyoztwjqign[repdsdluemsybnljcsc]qvpndzlnkqibgxtxt[vvktkdwnendwgsmmaeo]klrmgwgzfhttmbhs +nkuebzwzjkpebvqhbm[pffmbiwfocdszvehp]mvlvhepzzgqzegswk +jrcergxhhyywczqsiml[jvqkldlewhqxtqyxlje]tjxhzshbfycmdsdld[lazzgyvnsjasozw]ewmpsrjofcfvzyws +jmdoaouxainwodpyklc[qduttzgoerzgvkhdah]xbhooltfzxprajhre[ahtslpntzsaogqegun]dmcgjgeqiiiuzkydjap[vqwgftbjdxftggd]qbovldiitpdlythgrq +essziziabrdbohunp[ipgvyhitrfwkdon]obxpjfscqsxzznfk +swwyhoqigjoshxypupr[ljqjnmcmfoznekdz]vlfdlqwurtizditszb[hnmvrsihruqihuyjxm]kakjymekxbirxmf +qjfyellapmwfmyly[kunxkuvvwdgxsefm]sdpzdyvpapvnfybmkrh +yofobbkttxblpfbuyee[pfpmckdnyfrownjfup]siyloupsjrixrhwl[wyhppbrjcvlqzhgtg]zvtbzjswfqjtikkpdlh[rfphcxkyguxdyje]yillsqvxrnswpwzau +lpxrtppstnwbkugxfj[gmioyrpgnsqtrkh]cqvxtvzwgvaotzwjij[yqqrhqvlqeupibi]tzkunpenomvrkwpbfd[nngwswtnogzzuwb]vvfadzquqbhqgrh +jkujtmmvicmjbxukil[bafidxizxrpnanagh]ysakzpjpkpmyqpotfgw[zbpeepkvzafmbnf]fjssjhkidnseugzc +mlyzeywblxtjlvw[ghktomogaldxwtljod]ijjkbhgjvsorjqh[sbtijfnepdpmzskwzrq]bkwjgvhycaitsow[zvvorhjhrttukklnyq]ejyrfajqucpjfky +fzobxvurbcyszmbvb[ndqmlifmppvhmcfjmhp]ecuketkngdpmhqdnte[uwhufpdalnwarrqqnmw]wcgemlenpitwqztxgd +uybidfvdwsftvochwe[sfehkmzqoqiadkky]ytfxldmshamrzftqlba +eikkyfkguyhyghs[bacnjyjwhljzbtfrejv]hwiyjtsgncwtvqqf[avhvopepuinywcbw]yqlwlhnpevxqseqawt[tlkkrddoxbowvgpsxy]iencigijldepvgsbv +nbflbqiqkunampmoo[rnmxqissfolgstsska]kjrmmogbujwwefrxng +tuqhrszpjlxatqml[hxdnhgixlavniikr]sdwonwuqfyfdtukyvcr[skyxxmuzalmqetltb]ubhcvwrpqkfagxqddxc[otpczwgqjycfcjkbn]mgvwealiwijddyw +xtfpwupdjzgbiguw[ilxpnxsmicnhciwzed]sxujrtrobjxzbnl[utaftqrponqfxollpo]umcdnurpmduumbiqw[fsiplgyzeygxdam]lrcidphtbpgeioifwa +hwcoshevixvzeohpnnj[omkygcmnmivmzxtul]vmagndyfccnvivsj +dadyrmuqtnaavsg[bonytbjlittroyfwdkm]tuqrsrjkovehrcuoq[nzxtnakmzxfxpjqs]pcvsvijqxlhcxxfe +fubygknvjuwgvgshymj[puqpnkunirqntid]dmbnbjrijwpphajnwa[wlzffvubhjxaimienv]rhmuvzdefpbvinbn[zebucojhlguuusjmc]vlfivdncfjszmtglnq +hnpjvwcaeveaegzetm[yfhawojltwnwkwlphlr]hybipxasndfbtyqz[lvcbmzffftidyscecvh]vaxlwmjbxmsawhq[etkzvjppzikagthunsc]yeoxhcxatwxwynsomaw +ebzcmhhycomllbjvvw[ginoigaubpravsyzv]qsjnhtstgukhonvnrj[ddhwvakrvrngudjyk]govlhgeseypwdml[upamuhmwxzyechcxsae]adgykulqufpnvyhkoz +dsjnuwymuydynpsbx[srhehfurrxstlvh]aizdwywdkydydqhrrm +whnypyswxdvibuaf[jprrzmmgtuapbsq]fnezzlbhdnyyzyfsgdo[zbkrotmyfemqlfhj]motfxyxhhfcvbsmqth[haplhxagaiyfbbvw]mqvuamzczqzzutalvm +qejybnzauvklezaxat[lvcyutafowlbxiyjvry]nlrivlmlsrwpmymaki[pqynpncxdmchcdlcey]kivqpctoajqprslcya +bbqtegzobdomeyp[moubpdrdmsilsvduug]kmpsljwwlfsfnxisn[jupswttsazzstqcxnns]besgduewpkaxdgfpy[sfsshbcwxpznogtpl]ggdynqzbpgfkdna +pchcgopdpykzejlzet[jnemalefeqibkwkztf]jcbzvnhvgvsqrnc[krgonprelrikhqbm]avtigocdwcmhqlanl +igkahohuybjjdsvk[ddpqgrxwizhtypk]chtowtzshvlozhf[xrolpgignxavtcjmaxk]buxbbdgppyjqurfit +qyegpxetuwnvtxjcl[haodzsylpffsytbkbgd]duofhwftoyanbkrikbk +bxjuktpoqhnzhapoboa[ijejsuzsaamipeuqe]ugfhuvymiejnoyglivi[nlfenjfnxuofpsqv]gmsgugkqcnenabl[ruapmdnisfjitrzmnr]jxojarsmfmrtmcc +hzkmfirdfdhysgbag[glregrenstflcrd]dczcchuaisyvpofbdm[ofnuphddpiimwtljk]eamhpkkwyyjcudoqjlp[iqxmnhhruhvwykr]yghmonjhccqlbwqfjp +coksvymgefyduvwqyb[omlsfgbrafolaxqrarl]ztlchazfvqvofntyqn +kojebokyfqpifeqr[waveewleyvhyyxbbwi]rlftzvgorbwdeboixif[lqiyszzbjnbllhmn]lprxnkmtivebztmvha +ugmzrcwbhsctsaetwa[yoydtlzukeyfxiojis]zaddblqtllumigpup[fpgfbpoemablmbovgai]lxvlbchpysxadxy +dbuzmvrmwlyahqjxd[ysbljqipyhbtfxfsz]zzbmobgoogmmqfxuw +aofdjmsgbgwrrbfe[vcnkrktlkrjgpqwo]crnyyvrifvccdsffj[sivwwrcsqlsncytebdj]zxwovtacgykwcqu +xtimiqzhzrpmdzoeu[dumiqkncikqwlpbzuwc]ijgoorzwtoyogahbzw[sndiwpejqbzbksi]bqissljfewmhthzfr[fhfvptvkrwmsvxembv]bmcylnvgczaoykwxto +smbefwqfowpnjrvj[jsrmqvxzrlockwrfdkn]xzbebsvxickulfvcc[bgqnrsyhahbwlkglwx]zcqswywwfxsgdytwwrc[kbjybpynqssoype]kuvceztxgdxfzef +zptgyycvygzcpqyr[zopbfyswmfcyqnzw]czjhcywofjoemnmgk[hkfjofyhiklfjtys]cgguodgbyzgilgjr +azebcnxvrxgwqftti[jbjfvarjyawqoms]iumqfeogzuwcdsipoj[zqbzgzdbrhoahav]rpbmxhvdzkvffnegip +rnkbchnaplcaugzser[qqnwunmwppjnnzuw]frhraurwhtayoegoa +djdnoqvailodztt[priqsqdrtywaxmepuvp]lbflkgxysuxjammwj[vgxrcsygyqnaaxso]nrfpdwfnmzznmvigdzj[vxindvfzagauwfaflar]cxemhrdhcsbnuanr +kxryribjlgxthbcrd[occbuoecgilmgfcrotq]dnrojjqevzdxplwizr[xeytpiswulytyma]ppjdfxllbqsijgg[nmjjllckovlktab]slbrqhmiouzuqqdsyi +ojnsmjuloqvprufj[tkpxxbbgmagiatfiwvt]ddgixitcijsibqydznl[pcugesshfvmbqlshpr]ecdnyhjksojvcbwjmwz[orcodadsxpbwlqpjy]bxrtwpebbnalwwaajzm +jdvdquoycomtlulxi[vilkkewafttknrz]unvacfrcqrhhguidtl +abudfhatbaveagp[uwlypdgoikgmwvqly]djhbjwumcgercmstac +owtnzftxhxmhdol[nctmtlusvapfjbmj]hsulaqofhhlydjdbrq +oyijndyohfltcvf[lbupfppgfpfvhcarwjr]tseynqkdfvlkzjcwfhy +fdtdkedwxvfnnodin[beafbnlmeuzyeghzlnd]rpxwxuejmkfvafyzkfi[drhznurgrbstytrnirr]egmxcqmbxkhisxp[dtgdbnxelpnefhoi]fhecbdfkbdrgrgmyx +gzlnfqowkbyqmibsg[lzywadxodwavkhtxu]wpccrmtyleifychjr[spglwgrhypdouknj]sndgxjpilgsfyxedpw[uafazaaiwyzyhxrinje]mpfezcobffuqliauwnc +ufrgsazkacoofwcupij[asrwuqgfertmqhum]tufxgwsknrocnry[kpwnjrbysrpfexnh]uiyxwhevpcsahwrpt +mwpyjvycgsamjfo[llbftirpmajykidf]xbplgjaytbanccwggq +zhnceamqyoqjxafvep[kmvpoihyjubmolutkba]shdkiobkihapietwdln[rzsvvyriruxubmzw]lnjwcdewziosfrh[yyfcxuivqytghxbans]cgruobtjvdavlyaswzv +yfaeecsnjninyyq[izsyflxexjsfczjw]ajzghdmkbqourodqkd[efbiapsnvvshxkszvv]ahyleppbvgepnpsndws +nvaxrowtfoihltgbnh[oicqahjzhoqawldc]xjmimdfpycnfabpsmi +ecbzvkvwejugizqkkau[ilkbcblyfmwyerln]ikxgldlxptakjstofw[lpplocnwmlkwzxj]flyizzmlmwycjyid +rxizygcwbwfmudujg[adxdzbnomnidudamavv]yqcigoejcfahjqioc +oplxtbvzxwqmldl[nzhtesvtcuuhnuodbek]xyywwnhnfprudxp[qurogpiljgrtzlseble]garylcclffgnjoabqny +axstkggsonlnbwali[blveytyeyryrrmeyenh]xcgepcxzqgkrnovmw[rfgktkfrsvorqbinnc]atmhkdbxvrsnyix +emawdiuxcsjsczh[xxemsxaurgebphwq]siacfvvocetalrm +hoqezcmfxcbyldzbdgj[ncczfgmdqzsslvwuw]wbywkeznhcuvhyxis[giyuqsdztfjzibzuu]iicxqdsgpkzuwouu[fbbiakfcdmatawdhu]rnfjechuwuvbkjes +pxlkjszedeyandtg[vzmztqfouhicjgyhn]ghdgurhvaqyjvwfzoi[hdunjbenuuwsxgoh]jgzxuctibegtzxrdi[vtkikughinykgouumj]lwkhwpgybfxftojc +inkbtzwtccdnerpdx[mzwxeqyfiflhakjodsj]mnsglzqiugdvutbs[dxcjbamluuvpfajhbk]durhitycearjavxqbo[boldvrkzywpxpwacs]tjgqrsxrpmaaqzn +zetkijkpzfjwtkl[patsujyyufdjfjdlyin]crskagradcyyupn[qmfftenpdtzmolxplis]hwdllotorjkqtag +gfsmrmrrhmhumyqjsp[otatbgppuxthhvoviri]ydqdfbezsnbqiulb[ryqfalrmrxsencrv]cobkfmwofrhzaofnwu +extvjeumduqukszdj[qqvnhgfrlpwquqoqim]aqopphxuenwysihpqes +bkfftlgxbfywpkzn[stxjgnocrsxcnxnl]rmauhhaigkbagyiw[wqjohxfdiwvoebtpzf]aqypecqnfkrapjq +vfisywjwfomqnxdyt[tflglumsfyusvtsu]cjelvptmnjpamqfdoj +vpzyomkkfpuizfab[nymsqhheiemwakf]nlsaqwycgasqvto +kfsphnukvapezubfa[rvpcbqzzfmhfoafgg]thmzksirdnczecb[idnjlzzhtswtdkpjkj]laekyuhoaphgcxiavs[bsnaphjpbybtsccdtv]aejpyabhmmijvspvl +wplvbgumtphjdcyoz[itxailnslkhdprewbx]uciulwglmwuhmbiai +ktksdqvsrshsvggve[grfqzwaqjzafpouzx]erfxekjmzygkxknwpd[bebppmnerartdednzxd]bdtlnylaxjkdiuz +ixjuswimkhrepohn[llzfpekerkwbmbdjx]wfencfejxqugytmc +vzofsqoquvdpcmd[zrzxijrndisptemytlz]lucezitrkbsuxtfcsxn[rhcovsvwnjqsycbblp]nsgbadwkfbyomsyufn +opxoxtwdyxabcjqlsp[jsbryhbfmhvtjciohd]bqwushnbkblygsnugyl[xigxexrxyphtraydo]xdbmkyrxlyoboshb[antssfzqawswqovigu]dnxnfgaerzwlippmc +dukgppmqemezybpyj[dzewikpugbtdzixqjc]mqeinaonmeaisbfsr[hmjrbimmfceegblerib]agmofjqzwimbwqja[odsegwxtsuasjpkqn]wikmfsuuhxcshqmf +pwvqcqktvvsfwzoskb[ijshyeopqvhobqwvnj]txalkphvegektizxygy[daifwzdfnajqdifjsm]jnqzrunzmgzpeqwvvl[gzncgfsgqltttcvedxa]cbfuzivokyoadqac +gsgjuwftbhhfikewzd[nzsndocppxqeccyxhwj]kfqzfilqmjpkpersl[iqydsbvxstcexvu]ltownmcrtkdleeqit[axjmjeddwjwwkajy]bunnjmdtrwdckohsbh +vhukbemzjwjjywbv[ueidxjmdurwauemunrz]amqiepbhdmmdzxhzs[ysrgfjmdlkrycxx]qevervspvsigsjafp[ylfhzzhmpbvfwlqwppw]jixmhgnhstfzqem +bjakgnakukatldw[iwlecbanzufuuhfpv]rftfqqralrxmruo[awkuqaoypgaatlz]ayfnqvewpbtkqfrmzph +wtngccotjxnlpag[zzzqkhkhspyqswml]rdhwakgcytjxptgeno +qdsjlfoqdstuwmize[wgchicxbtioiuywxubv]ocaxcmnefuyrocckw +jxdgkwiboqykzgpl[sylyvaoismnuimyms]yjeljspizddmqrts[eddmtxaxjayqyldrkab]kknnogloewbujcwwqsn +xeszwcfrudkhwgvhlz[gfzrcibirbunjbftwj]ngkygalyrekcbduhltv +vbugbnooeufxostaeg[kqkrqzrfsppmkyhht]zdcedlpugauoquq +ewpjlfbltsqhfpxgm[fvmecdntimvzdbnpin]biasqqndykbxhormg[tmexezovdnezsjdpu]tetcfwyrwtrqluenrr[pqdwbntptnnjzagxvfd]cakfqmnzrchyjif +btfpfterlwsvxom[shuzfmaoxfjtkes]yvsxvqtlkryepfpz +jcghfctceivcaiweue[eftngalnwvhjjsmznr]fawobojxajdxwqqzs[ooswxgrpxwyohdyruo]nmtyadyigbjerrgww[kawttctyrgxigajaicc]hmwgzbdzmeoyths +xgztroshpxqwqrsig[albtlndeyhthxeysq]xssxdcyjkygctnmt[kusgxaspwbcwxdiwanr]qgxqzkufuibdvexiqlw +aupdftbvutytjjx[jgqshwanddjcznrt]bjiwzvzrgpjhphjmazs[zxqiwfrsraampecpqr]trtnmysitgttyqibzpu[egnarxlbujtfwducwub]kpooslliceekqkjspg +nrltgwhurffmbzkvik[pfytsodylbargsdnkfg]cyftawynysetaggk[tusfvggrehkdyqynsn]fsdzpvhetavusseeep +rishwwchkjtvjkgcvym[clboufuojnycwdykmng]nrzsdoqccrzoqosytw[mhacptzinfmyruq]ruobszhillkzobd[vwgzdvemczewlfdape]jpjduefvxvkgdku +upnzmqxezzcuzpzi[sfbzitvncxzvdsan]bxhuatpfqfbbymcaqg[itxiiqrgfdiqhqfqkgs]gpykhbwfsnltkghfxh +bxjrsxeqhqtlklmzwr[okufumtxukxzjmrfmyw]vxgitxdacjxfufuujg +adiajjvqyjwyntoub[wcxqhnhrnuztvwqlm]erfjdukzqyrszhtax[kzrmzsgszhjkgfkmvg]tutivtoomopkzuhz +jmfdcptafqhalvgp[acykarxccznwnon]qljwybbiabdhpyf[bzdebbpnzrhbxng]fuxeqebhacjqgono +qdclvvpmahtnmubxknd[olhalegsarjferqax]qprlwnitnszmduzhu[qctlsakxesqxuczbqj]yteehljxvedbtiex[dwigqthtobxjrdcgtgw]thbbpflwfpvcxvskpix +awrnjmsqjoktdahkeqz[grzlijsrdqkvxmoa]wzgzmyxsiqybpsrxyjy +sinwoqzusuveolw[gmiafnhtabdkfxyfwz]kwcyzjfxiznfzlmfsd +crmcidayayyyyioqinz[azvxsonkimgggddb]yorlkxpvolfjbglxvzw +pknzemrnlhfrajkog[frkiaelszmelrcgc]bsqoeaktflqoflqz +bvhbloqmuktajazwuk[yulzhoaebdclieex]rqtszqjfacjvsjq[vrybeabdclrxhxp]cmvixojwapyymzqa[wsgbuxnmfkfvdgdf]uhxbtdorobyjptfx +vmadexpdpxtzmepfrh[ztavnqbmxjvtmhjb]lukmdktfzxmduxk +cjfvizczqyqtyzswz[tmlhxvszektensftbc]eavgloujdjdrksy +ceuagjmntpsfznxkei[ydzsscglmaefrglzqw]rgbhuylnwnlthnmm[bkwhkcvwglgvlqsqzez]kckzcvjoakdtivghu +mxiknolwiwwkfxzq[ecpirmmrhbcnsel]mwoacrqwpkzjgrukydd[ckrpozlopnumxau]zlujhgccbrayveinccc[apicjpatyfymmqpm]yvxsjjrfhjhrbgqm +kdagqbilqlgxsqsydu[bjurycpobwakkhdynbm]oiigpwlkpppteqlqph +upfwmcrlhwbjrpspnb[qdhwjtfplxjlgshw]apoxxaxjxnikymhmavb[qbmshekxmrypwmnftyk]hraxfltpaxhwphiw +byigpthtxeetehtygs[dyjvyqzjnitdakuqdx]hfesbffgslbplwug +xdgznsxshfuvvhy[gwlfajmssomjseg]unlmteiufthtldgxw[xsvoroqswoitjkdlool]bvpsmfjevwvsdzryycz[rfajwhdmwspvwpy]zizcfstjmmrkyga +iuywcnjjgghpmpj[cnccavsvbpousjxxu]hncnlufnqhnkyfdbzbj +thjipbjkfgddudxs[spfbsnppzkkrjocz]rhjypobsmegxjxbnz +yiniphjdjqyhbwcqumk[vxctujvgetvbnin]oznxmbhfgorugvnbqhm[tpneajssmiyyciuv]doipfgzftkcpfgkqjg[ntoauuoaetjmwcdgl]muvskibkdazqpzle +zatpeicrnqvfwhzevir[achkrxpoddhoouvw]zqomirycphnjvvnnmrq +gyewjnzbzlphmcl[goentnfvtqkjbhengqk]issvkihotsdxrtrcge[pjjynwjxqbgdazrar]vfdodmebolxxrtblp[rnafaodqrqgyudz]bokbyzqkrlatadrafic +fcrqnhiztsbrqbfpmu[fekxlgvgnvdrgpewsh]mlvilpahenxjdnkfd[ekrovnfkukxcttdybv]igiafsaabmjtesxoez[poymdoqpgmvklnplxs]qvfvnidapmufkipfcaa +dcemjkltlvmtwmofo[kyaudzwtxgzgmfmxzm]yghjbhjodvfcesp[jwnfoviyntxidpqlnpj]mqlrvdrlysriwcvkx +vziylsyzlvipnsh[cqfgzfmbmnmpgebrbh]vkrxdbgfihqjbka[egmgpijxkmdpabo]blbwhpvabwahytns[tsrrxdxqiyuiysi]hwrcfdlrnlrqogzjphb +rkgwphaqmotuuygbi[bpbbruvyanbcjfhfp]aanaxgqysluifteswxr[fbkbtztunqaeegygqua]ssyhyfmomjjvgao[snutrvblikqraplvqpc]aqmgbfijmnrlazy +qyxtxwfuyatwfkk[miumakzwpbjaxrqssh]lxzwtxthscuobcmqdo[imxykzorfeucoihmte]xxfwdpaeravliey +vunybsvbkzmwaqulat[uensrnacojplrywisqd]ivuvkgwszkrlrkfnne +otlulepkuriopamwh[enqkhypbjtxousmlvtf]atumpzporzbmfxc +axcaovnvmcsghqylwi[ruleoatoxsimpta]hlhbkpdtzetwpdsmrh[dzhszusmrmytlspbf]wugvqdtzbapnfnqmj +inhfttxwgfttwid[elrhovmfckezycyi]orzwappwaaqffsetsc[veggwpvoxfubwplaqb]indtxjyutvbzuulrw[btlasmpvwtjhpwhu]sxogdkhsqgtdleenjn +vpwaegumvoaxdvx[xzzubnmcxpipvhqdcc]deqghyudmqkokmasp[fovrmnguzanmxhuaw]hthncgthtpecouvybk +scixwaywmasqlyl[orceqekzfxviuhkaad]qpqjnkswbgoztrreipf[ylmiivwsnskbpquahom]qazoofovxvylyzov[aigwlcvwrhyelwwunw]masxonmxibbgdpnx +tsddqheerfdpyey[xwfsqaquovppcqej]tahlfpvdmdwugtef +eixnvtawreuhmftwc[evyrbnlbkghbgcdh]rcepebeinmlmxuu[djpjavkjyzstzysv]nhbwbzyobrsjzeer[gnmuhoyckprysxjoabe]mbznbasseysitcdsl +ayerjogfkvbtcmgaq[ypxqrsfznolrfwfjlyi]pxycrizrpgzrymalj[lptbdsejlsfritmojo]gqfsrlirmuvqmcffvit +gwsubtcbyclfsrzrqwe[ozgxofiupxoobtettqg]jcfmhhbeqwttvotop[ytegfilkxzpbnnmxvl]engbwytwqgfnscmuet +dtbijivxxdayheh[oysdmyqutgglmhs]pshfpdqvzmkyttsztp[bruwawtcymsqtpixsy]vajcsjaelcehuha +hrowrexwdkjaxuu[edhgxzoepzajwcwxvie]goqjmpzfnhapvckyad +klkfnhbjcsvetmgls[ogbrnnzixyzwsul]epnzozjdzuffrtuipyy[ohjtzufdgczsegdop]iwlwgkhuwektdgkqb +exgfmperyunkktocei[ajenbklubiwdguvzay]dqfcyrzkxrlarscihrd +amwaprqbaslfaemba[vrybktqzolkxsykmb]uppwjsgamzzzzdr[hmawicwlazgpebkfmj]vqbzilrohqhydvrdlyd[fsocktbxlwkkqlrvcq]ebhizjlhessodzfcumv +bwsdcvuawqxzlfr[xumvqamkhmeaojhmz]tfljemjnnswaexn[zjobasyqwzlyrvr]ciqqmfkvbtrfmvaib +ljimrxzjagtjkono[gqqmbamscacuaxfg]okynonzqyielzjbyj[dfqemwwhgzaeihmpqg]uqphfysvmmjgszshcx +erhewvsixvvxcjrz[eyfritdtwjtdehuhsi]rpjpspqqejjjqnqx[cemzcwmjisxnepo]thkimqfwnfqxteknhu[kzbbxfyrvdqcrzway]hnbffqdyclalrqrbz +wwderlwkzxrftov[zrizcsrhfncxxhipgmq]evrhodzsbqxtqtsdxp +mrpnopyfrbcspgrly[ooyfmuwumbdlamnpeed]zorwgbsvgwmfupfmd[xfvegbcyklqjzodcv]xujauhxtvanvrivzmme +egyjwwzzdhjpwanajg[vnanejmhmsxfuqx]kapnbrddoomlbvel +yfyhrkxnnoanzrlcdjk[qbuntlfyfapkyzmjzp]darztduyenjxyhum +jnonzlgpufyjnmamixf[ilkmivptsamagfx]rvqfxkybopuhwajawqc +rjomaggyirzljvf[xueoknoqfpbfyrp]vcsijujfuhtxyiz +buzpfyqcgoaoqfjeflj[pahnywsxbhzyurcch]oshukcataepznwjjton[vnumrerfgrawvok]qyywuqlucfzwpnunhdb[avdwhfwkjowovjgtkct]iperivwvqtuepmsj +elziwqlyknthlsh[qrkhzurvujgpcml]szsdkjevjgxkffjhbxo +svkvkdnnljqwwoda[xwznynicehzqeeurqbm]xcdbvrwhslvqnbwtkab[nwvkvkvlfbljzkuvixy]pauwjcnjdiaaxihkan +drywhovxupgktbdzbho[npczquslwmmbtfqdkmv]xnqswspesaincxxaw +tidyrfvdudmssoznady[krjhxhuyysnzclehaha]qvqakaxmebzqeckrtt[rjllwmvyrloyfyvyo]nwawencbmnhjuoulnp +twthnuwmlfzvujyqx[ojbeeirfxaxwqwpp]fttuhnhfcpftnkhyd +vlwukqnxcgvqvuxfkqu[qvqzcsatchyeejylo]bqsuzlobnqtzwlfeub +ceeceksffqchnmvj[izuzaozpvkmrndrc]uzubqdxupnjukurd[vuozmmzihsdnvvknl]ejerkicmcnifawbqju +ayekndnigdqycrpnlx[xxykzedhqwwnckaqu]yphmzyprhhzeowdaoqw[irmlnpnugysdornrtdu]njtkadbeifdveunhpfz +cpeszbxnhskirxolfov[rqxzblndfgzvcast]fhwjntsvomzhpms +iqekaxrwfpgllwdgbvy[wexszmqervjoletnghi]jdcrafwyovopiurtsnf[odjyasbfoogcbvfvzzx]itngdpzcuibvjac[cceirisjlxqbfxk]ogyythcefijdyfiymv +kjilxivdlgapzubqvv[kdflzpupfrwemledtt]mazidupukldqsfbnzo +gkdgwdphyrnqcciqx[xyrdtyvqjpyqzqne]rxczahyeiwdopuik[azamosvzssaydnafs]cijixpozetemnhf +gsbgcxxrcsfhzbnrzc[fqbsuahvhspgbco]ijeencjmsbpozedvkxp[ogxizvbeztjbxjmrz]qszpgaqlqaniqmr +xojjfjndicsbfkuk[fuixcydcggzgkupbumc]pdmagdpsiiilbqzp[grppnkoycvmqsbetpi]xrrdnfessbzbkyjczu +pvxxauchqzwtppcbna[jyxogwglsdoqqbx]tiashymveuqfzqdsyi[fdkkrkhptxwyqkr]jqlvtibdwcxmwdfojnj[agoafviidlyogjezhkt]oeipjirampmhhgm +scdzytmxeoaepuxr[urolfouojzzrhmon]frebdwuouxgsqtqw[sgdlyvwltjrgtwhsp]xbjfuzrxrdlecygz +otgklupktkmwbtavac[wyvprsjidzacbdtwgb]ktrzyvbzsnveqhr +oepabzcnimrxthgu[ebsvaioyvpgawvxwlv]gsyvwsmuadcmjfta[subtakwszcanhdsstd]otmqooxijiyokuu +tumtmxzsvomlsgstv[gdjdgawczfzbzwt]ajcpjdjlvrvlivvb +leygxteqdwiqyxf[xswsevnmiejuyzpwf]ufuucwyuoggkkggm[yxkivwuqyqzcuuspecj]zlxqdstoausbpeki +iikdzjucbifeolwply[mmtddfoasesrcmxc]tddkgqcvngvdvek +vnfqehrouoftynm[syrugqbozyvlzlq]ytuuouulpavbrfq +ausrmizadkahfrh[beowyvexfyonqjtstme]celvylbfdvpqpqkreb +ytptllepvyoythdr[estilqmvzfdodmmybk]buehrbcawkbmemftkw[izepojfemxcrvucath]gjfaesekjmixzrcdrh +evdtdmaowwmfwpwulz[bwrggzenbjnqsyku]qgwcrqfgfnfjhyjyn[ayqqzteezuhmsfoz]joqsyzyllhqzlkrebaf[aahixqinyxxycwcy]kxcsoruengmnfzuj +yeadegkqhjjdeyeg[dvrhwoumlkbffoca]vqrrypwcbymobavcl[qccxmwheinlwnxqprop]phtvdrzuntnzeqp[fjdaddrcssrzlokngyw]rtsmqlzjpordish +gtdwlzyrtbnirzqgijn[qbjuhyhlzxciwzihtn]vgfezhcijflxugrod[amfxfhfpiaqeegvk]sujqwinnjojjjkveufj +mjrvqtjwmmnjifhjj[jywhwpwuhwhjuhozphc]vkyewhwcvwlilsxiy +ouyfkgjxhdictfuoim[vnwqzszsvlucdhhtvtt]mlyaasjkojbxosartom[iopppsiygmpiceaoii]plzvnvscipkkyhvyma +xfhwixrqfffxynxmb[nzxstdnckwqfeytf]hpndwxudqblkjnqhgzs[kvmiharowcqigkgz]jcvujbhlqglxgkcgv[cmuxxdzwwavcujsbxl]aphgbxkiomeyzcrz +trhkvukqejwkgbjz[hlljygrisvqzdgln]ffruvyhhxzxpbtkzou[ljfckzfabfallju]cfbupnmggpzxzklfdox +wbqwyyrcpigsaergmh[zaapwugxhbjnrjlz]srbswjghfprtpbteb +gvqstfxraflbmnizmtp[vqqpwxrbfaglxpwzafq]cphvveovkynmudsnl +yzymzczvyvccvgsex[enwyuawiydvyvydy]ywmzufzgdvszexk +thtrxdiihhwqgrnkwt[trgnqhnfwkwmttxlu]owngvlipscuztlgi[ciurpcebccvhkyk]lnuyoiyzbgwobagu +psttgjvwniwynersrs[oamyvshfynaslrqu]lhidxwfyxnteooqqzs[pnxwfetkofgdgeigll]skkakydgcmfyfuwyfpi +mylmuolvzqegvsrys[slsfmaklnwmlbaqqib]ilutpaqqvgbkexrhksq[qnouzvltrmjvtstaubv]ystsornebtqdepbfn[rwzptvhlfmsvjgp]vqdaqpbjownbtlz +xfugcgbismoojdaiw[nuwyrjiqrcddsckgka]rmwpvltwfpxcuoq +trmkejgqteugbyplxr[jxnfhdtqduoudilvo]gfhvptjfzqolpzn +brxbyjkpskhyxelqzc[eherfigxymatyzc]uhnpycfyhuexifmhw[mqtufbhlvchtjfyqrie]wstbnihxfestirjqg +gmsfaffefdwpylycgu[ycffvzzgcpfnnevwvl]fxaevbvraehcyaxkjhi +wsqshnuceysksrqsp[azogmtnfebuahmqf]ovupfnvnzrdeljgict +gproaacfmidokatbox[ngntwrnzmhuqttk]ertfafnfchokaiuf[lbacfbidrxjrayell]fwzbaikmpnudlqwgwak +csqccwbysdzhoiwq[kqmxkcgwmkhsaraadtl]twmikglnikmbbvulgam +xmikhqxprkkpbrbm[fcwmsjyxoigmdezpgr]qvoohhzozfllrxrmvw[uldnkzvdedrczko]eoqubtfldrkdokd[exvlggwmmfnavdyjq]wcdyuriygbvdtsmwx +yzwaojjbgvqouerlqj[wupouzamjgcxelugdwz]gudoblwwedojufgbl[hlnmcvdsgitydqaergz]liauykhyeanfbqnz[kxznetqxvuxlzovyqx]fthhvuyqixukncruvxd +pljzzzfwedxoctvarjf[preuhfwjhyatfkeepbl]oqvbccylyczavpve[jttaesjxfofxudw]syndrygyumrahgypl[xtyiwwkrtspyhkppx]xfixdfntvxpdsqqryrm +iibobxpwfctxezwbyhl[pxqibtdzredjukbs]xspxwfxzwkmtbqbpp[qtoqwbdslluvfxxrte]rztobibnpprgbkvd +fzycsudjxxyqsebqnf[xdhyyrilwqhohrjop]qjoukdgrtogqcjvi[ujgpjsfipgxsdkajlmj]ugeeytrhbcaqjvfys +rjnxaitoquekpqa[hizdsfyfinelugp]uzilarrjtcouqxw[cxouglsexamjmfxkem]ugfeendmvhsamxdsbkc[jevmalycyvinoivws]mrchcvmadwlpyym +cxgdigdcavedxkwoz[ixkshnjpohrhzgclk]ljfstqblntfdwxxr[nktbospjrfsmodi]pmvdcbwwsuvfvhkdc +xihpbgawtsjdaemqsi[exappnkwhzpuxbtabo]asygirvecghmzwek +agsrysnebomkidgddk[scnqmapfnvzwdldlj]foufoyrxgsrxphsmg[ekpyrgsshqxveoui]igrrpyodnkfuszvphq[ldvwvfmkzabivyqida]tqgcqaqhiugqginmgdg +ftalokkmwvnmychcxe[qmkmclrthtqvrzpbbnl]sebxgmjvtzpgwwa +sflfifzvrstqwxv[ehloimnuhsnlfzclo]pidzhpgnlvmeouhdblh[bymcgygrripjvluh]qwtfcwpwyjjzsdbg[gsieausklaxbhvv]mbwcknsmekbsvzxy +tcqwxtntpnjmyde[tzvwggjvmousnkgr]vqcrulftlhwcxax +vaxpbeuoxndqnqfqfrw[zgmekxeilvdxhis]kdjynxgskvfsllrlrk[adbeyrhbylvxmauf]gujqnzsnrapkcugkh +zyaiyhzzabwxdktkcak[gvocmwficgznesg]syhzrwxfixdzdcn +kdvtcvgdauvuzuoaqjk[bllhxeuwtzeumulkr]xfehllnbstqtnpi[tszagvpenbqdvjfymzn]jnmvkrfkdugqvrk +fbuyhgbwosevmlfzfa[dumgjdlumtridjl]ipaiotiwbvovrhfci[rtzswwdbazbrtzunsv]kcfoduojhpbocsaocd +zbrdkpydedtihdrwth[mtmszuqzjkbiqoi]cxvnykrffutmlpv[mhenchsemaqeakeh]blxmgldcgsedeyerdc +rfybjscluiprxixzds[owvvwlwspqmwwgzqe]suohwxrmpgtwvkn[bhkujnvspuwsortys]thwttaamaopsuynnvxy[vscgitzsyujngksy]sxyttonsquzryswvjye +pvdgotkcfqvayxluj[bzefwpnkonqpbzshl]tuhxhtjtcxdybbi[vgivnvqwthkppdhjo]xthnruhpxrvubxpc +kmevercvnugttmuxejw[pgkmrkfsppeomnpj]axdiwgeroyrbnnamw[cdjxejxqcvciydtlowb]hcqdkovuniidorztqb[ckexdghbagizrztvkct]brrudblfaephsdveu +tcnppvakkkcvlyadeh[afjjeqqnialrfdapylb]upgmkjuhcdqmxbtf[hztsvlwpihcduoxd]incybyshqjvmqia +ftxxajvfagituqlel[wxzqvpqjzkbagapyi]rhmjkhphhyogbhvhhk +lbaxvfkxgpjlgnbiv[epnghhcmzmlribr]bzfkgixukpjlkivvvx +kqhfbwargcfljca[dajwcxdpnzupgtj]omzbajtlbnvzsfl[lgthltbhsaymfcbyjio]lgcriypdynwkmaxg[zrveyqlcymzdaokxmcx]xrvsydzwqcyopjjkhz +zlmqfywvqzlvhdjx[opyzjeyvgrpuficjptx]yekbdsloensbtwcji[zzdmocooaokswkhoh]xbeqovknhbymfkwoils +zlmikilitbrphmeql[fvwagtsyxxlefxij]lnrbggidsccigwmavw[nvwngkikedakbjsqg]rcsrtdkiulovdlybyt +evfbszgzwvopjmrw[apfxqhohwsuyqqndos]mbbrkclcwcxyasw[vcebwhalumupkiixf]zsjlvlvifmyslpo[wornduwuvfwacvyt]orhbyltvlclyqtzh +wwiwutciwsouadnf[fcixatjbhsjkvqyqhan]zavxccqxwbzukmrtf[uzzmdfqjktviijwx]bxelmiwiltaouycvz +uxhnypkqwipstnqlpx[pfmrltrkbxxjrohon]qcsudiligpjjnuzz[dgwmslhoedycdih]klilxgivqifiyrxmdj[rafcmynfdpuaarugr]wzlinkrbastxbytrqwv +gwcazcrtdocwtnxpw[uyrnqhfkhknvpvqk]lxctiwkoxodvsoxont[gxcdvbggzpkaynquk]tybqiclmwidzuiheat +bycgcwgekvhhvrrv[yhbjxdhpvjxvfvnxgye]zvvgshtnnkfybapoptj[arjnewupuqezonqpnan]mjrpprtoiciensf +dqktatenwybipsoxyrt[alessjzyowtyhmt]rvtajbosmcsskpwkxf +lhagnapuxhiursmf[zthearqsonwszumpkwu]oefbbresvhnetbr[vuqhwuumioepvchm]habghujmnhqwojlbvw[gdxupjwwasidgxe]xyvxxbxukvlsvys +wsjmynhruoauandx[nmacrlctobhycjl]odtmnavnougxrqowzgp[vhfdmwhldzrsccqh]kzghmvmscrxeqamakod[wsjsdpifbcprlmrkeqe]tbuiskombxnobrr +rsfuxbdhguqrrje[lzmgnijeavfojttt]tvugblvtyuqohoink +okydhbqlqxqojgnis[ebtctoijhlkrfbfggs]bvduavhztxbswbdtvz[kvaqznxwglyszfwvl]rirzscsulgfrlwki[nmpygrvpsbulgnzdolb]ubayxfezziquxwm +epgceboifjuwmbtkx[mxsfqiocoaleeng]ihrcmuloriwkcahbaov[evwextxmoifutiu]ddjqvwbhontlwzmhg[cckszbzdjrwbkxnj]mkffonctplrjpiqve +mzkqsihkkedzlvju[xyjsjvzuhhkruyg]pvqumdhbbzmmcmlw[pjzhzzmtpldqcowxi]ociobpshmzbqflbgxo[hcwbiqmukroioqjxs]bczktiepzmlaaeku +gamdwrspfolycty[tktugqpvahqrxmfhu]jrzxddrtbixcdqlqplm[vkowvisvfyatzyom]jdxopjmaxksqyknrtbr +godrfhnofdwcebpjwr[keiatgzgdqjbtfr]uqadhoarbsbdrevh[tusewuvtmgaiafj]qkumgsziwtssnsyjct[gmnefsbeuqiacdsdllh]zrzhjvphsxsucwcd +afcgjmwkvdmckrklma[cnhrelyjocpgqpsni]rdkjzzbvwfzophp[cynhzryouowuuiy]jhdacyayikwftlmreg +mmmxtororwxeiudhzh[unnuvhoroijqxsnhzg]ouimxyccojgnskozz +xvjgurxzdtbaiul[zrmxlqiwyvfowgndigr]wbpakpahulbkvnweala +pddiluioyvdczutysfr[dwcqglpljdixcntp]mezezfcpwvlzrsslah[ikozwlohjgwdsvwaf]lajbzlbaklmgaluaio +qnetjiacxiotczgrlqm[rccudkslumutqlqk]naqwcwlrtkqcwcjc[bdedocqcutdkkbg]zrktdueobyofamj[vhwwecprhkldysvmka]vhpfiiadtjiegkprmw +jwpmijanukxpafd[mgouzietwniuyoeozh]ojchhetiwykmxcu[msesxkispnyyhthat]gkclrzdrfdhfgnieke[qubdzcgsnogzgrrhr]tozejglmfonjlmghsn +fmbbyrmspjegfiko[sczruvfxgqvogvvrr]mmthznzttuudwccw[nlugietncjawardjjio]pdjbzwndmymhedtzgp[fmcknqodbiisnzndwo]wnschxicvsccasmxbnm +tjshdtqixcnucvkhgc[mxoyuobnokjhede]qhqoqocyqutowhqh +ojqhxwnehyfhdvr[zwolerhoxwbjqdwyv]iwzswaejrzxowgmgqu[sfszzoxjmdqxkikleoq]nartznqpcaoncpzz +wrzjdrigefohesrxdkq[pzxvrzhkohgqabojcrv]tottapfprfycyjoi[qldiorpimokqzoimuj]rlogwbnqbnqrydjp +qhczurgopvddfumdkwh[dxzqerqfzfvclmpd]bexascwtlizoacpdrks[eqkdhaazxiyhisbjhkz]shwvmbnwoqbqqgjr[gqwhrpwehpqbqwtrnz]rskgbfaeulbtkuxzij +ojqzacqecvtaikbi[dqfouvlvmbnqfpg]udjpahuaagajsslu[hnphkiftfddfjrkasm]mdwjcylvlvophtv +flvgaovkteagpynv[szzperfoebcvyfkdmi]siwkxshdixitmgudlcj[cjaclojgffilrfk]wlfygguppsesoqqd[syxnwdheseoirapzsq]gtqcgykzckvsuobv +mdiwtzfahcfddvqvjil[vgejbnbfzjgjqvqjguh]xlgwswsnxqrrikunty +dmibswyxlxxadenxit[indzvmfqlsazkqpwler]zfgzmwfrysljdinb[zchkubvcqkchuhqqozq]fdxxvatlwlynvpcc[jpdqlqfzwikvmuuvvif]qxayqjtamrjkmmajfw +cvuhsnxjwqqvqnktov[isynyancutzzaegsu]wafqfzxamdssndcezf[mlcqpcptyvzubjsjjtw]ttwxrnsjspbgfpdpuyj[vcbtyvnkxvhjxqxpnrz]cejbiqkdgdoocfp +xmrgmkkhncmoxsuhwxt[knratlhklaubcmanoe]kwvoawpghbndceos[rpgghgrmzrvproskz]ililcrocksgedhjuhjr[osfcbrqhtkhyktkfxk]itklpoezpplrenxtqv +mznmrotthwphvnqgrca[lzmbkodxnyqcihjwsp]tzgxczqosvxpfwlrc[hbedolihyyunfwj]izdaufruczpkxqj +bzaknsueaptjdcsw[mfyqvkzdxuhedeo]khaxflvucwkbzgutsge[yqjpgywasndedvwsd]zmivwoqmrqjfkvmhr[asmmexyekrgrfhnfm]ggjhdjwdeczhoiipfz +zirtgiiqekqpqny[gmyxihpinxlvrahsuj]hvgcviarxrtsofvcf[akymzspsfehurnuz]kitiugedgszjjnq +oemqvouptnqauewn[chwelvewqnrwatnami]vsxhrtilwgaulrhrzq +qpncwiwclnvcawai[gjrsbjrryhbwoviv]estrqlcofuysayrezlq[zmoixozgmgsncdalu]lnfbogvznfmxcuju +dwfjbqqfnwsdodul[ehyolwsgpgsdxyitjqd]bqxqcfhexqxphqmxk[nxsjycrzzkicjqb]pcflghwqinnnpxruuqv[ownihwpcnizyyifkihv]cexjgqqhswpnrujgj +ruugwpvhjyjwecfchn[ihtbgcwirdnuyjbx]jckbhwdmpsyquwckj +eshkwnhkunybxdctmj[dkefiycsvmzhnjfea]knmcagrgdhctbzuj[weikvdezylymclftryg]wnvhotwryuerqui[epyensfacxyegnzdvz]wlgztwudoejbtqyu +avuqgnzautxxbrteabq[ybapddktmqsaijqx]pccadttkazpdxub +tvejinpchgummbg[uahhifivytznhms]xbsdcxyaiceykgjqjsd[npkermlinikufcunxro]fkbdthtbgjtorrkjpcw +guswezvvjvnrgcqnb[ovvonjqfigdbfwchq]rdkjkwyvkalcjqnj[awcsmucmugnmeiugm]ugdrjtgsrgppconirkz +zahfosuxhtuqptoaz[qhsqtkyovsddgol]kxgccetcutyrcethsil +ytuxuxgzsvcecwamt[lovvgqqzfybywhcqfce]juvhcgndgfkwoynthrh[ruloprfijalospov]gdcheafirlvghthb +jxethomfiwzhksww[vzcelvyiqjxayxifjkc]gnzrlibobanzorykii +pjlywpqlpzjdabozer[lrehazdewzhixga]zdvzuirkyorztrwy[fikcexbaiwtnqbt]fobmkmgnxfmaftk +taagvqjyhughwmkkvl[hkuztqckzdhnktvn]gsabfglsywphugckyd +oshqjstzujgpiwczrj[hduptjzmswqkhbdqgov]hqmsoxukrfovbeopbg +xgsjpvidzwicmsb[bunafjgrbtvqbapoopk]mqfyvvahpjyfoalzozh[mmfptgqrojhicfncbmd]saxxjfzzjihfmllsgcs[wyqlxccerdjykocqy]hzuwvusymrxywetmna +lgieqmfglevrbdvnn[yuezptfbplhkimfq]rvwssgzdwlgpfqf[qkegiqztcofvvtrqzcd]wqfawsobdysrfqfqbv +ccauaprhxrjdsbrqzz[sskvkaaspuldccrg]wjortlhzgsgpwesga[waszszzivlptpedsdx]iaklpnaaeiswyzgza +mskrfzoumbmanthiths[jcbxermcqmrlsoe]dmiodqzankfosysgbpu[hqzvulbmguyvsqhvjuf]yiqcoarpbavqxsiwtv +cknpfcczfjvmuifaii[oygofisiwuhemyz]tedofahngltwsufvwe[leioechdfhojycsimh]padlduabrmtbncr +glqxkbujgswoysb[fimbwphbpeelcwdi]vpzolyuuqulcdplfr[psxblsccqodbrbs]jhrmzsgdemycrhzsm[gmdvsnwufhcgjqvof]psvervlisrluzisrw +cxrafoyokflthjcy[wupjgniyzvgwnbgseu]jayoymnavgydhkpc[yyfumpawulrxokrcxw]ggfmtwrbqvjhecmn[zwtrupxseojrhqtwe]szlvbhlihmzeemcdvs +zkbhccweyvajikkoxfy[fszqezsvtctafsv]vqumsjdlyznmzrwib +fnzpumsusucgyjyqe[fcfhmlxixcswtijzx]elgibjruhpsnyeikpev[cxasrzvzoqqamrwxeyb]hvqjlnkfttgveuxzoa +aqdyrsuxpeazhvpmv[oudjrdigbhovgnproor]zoqmqtismbzypyrssu[mmjhslzqmbfrzoez]pavcrhmjsnjudxk[usqrdmdxetgysgrnyt]tmhronwzwrzadepjt +oxjgsxwdkvbtwun[voxemrcenvrllxim]xqpqvkzffsowfrxcvt[vuhmfghljhheozjp]iagixberjizzwukbb +hhmnefofdypbkgy[piopbixdrssyawazfc]vfvwwevieiyevhciymp[tibldfadnlohqub]ifcjdjqmznrpnez +idzefrctgukgftpkvt[xhfjwjaifgstqulkjsg]eppjpjpgvlurphg[ljzttsfemjpjlgmhnqq]gxuregbxdtglnnc +swtdvbcjngxrzsqvmya[oscfcdxmjandmsdni]xlvamtsetxkjlmafuq[ndkesmiexgmkuyemqy]tjnsiobklvqxvkfg +ciyxyauiynetvuysnqs[ovngnnbrpiavswcek]rnaeejyiqnynqkpyloz[mccrpfjqimexuyd]nnbignqcpdpisjkzdsz[vrvsahyhkexkxutcgmo]kctxzgiznbtghfsyl +hpkxpqeyumhouklxoai[qxmisohfibgoaqnkcu]czzpaxszfcimeqjjk[grwuxysxuwxcwftda]spkpkckuiswehsh[itrxjgkpkowcbilvtgp]guumzewmubuuyfafli +rivqomdhbrkecpbb[wdohqrdyvioabfbf]dbllzrwwbfbgdqktj[dxvafeshpdywcxl]uzstsjlisdrnfisduck[cjazhqptbxcixsf]nslumhmpbmqpivn +qtjhnrwzpqaqpkdz[iocymnvkcvemkfiyt]qwrvnjzeopltnpytb[trvortqtdqfpmrwbcb]cxsunonoahemdaoywu +eghqxxqrjofvlwtclmt[czflqhgwqesbeja]dkempvjqqctfbjtqr +scoquhherndelmwbo[sshazaphvblvxlvcvi]wcvdremsljdidzbfo +hrveibqmirdtsfvvp[phsldxexzafxwfyync]sotdtqgujticqic[osvepfuzgbcarhiupj]ydjbylbekezrtykjysb +nlgdecifcwmuayibgrh[kasewwljltuzeobe]rmiyqugsqioouoxmbc +hivavjyoxnbcjqgfkcu[vsgnoayjlewjsmfoge]rqctposdtaxiabiaps[uovebqmxopsmbzmbljz]ltpiruahxuaubqzsa +pkpapgycinrwpglmkx[payhdtzrixoyoeti]vvudfhjejwfzqbv[udswjrppbnpeojfbxi]arkpkevytpytwlrzblc +lxtzohxiknrbiydkuq[tjzcjzgasuadhqmrenb]dwleahtmccflund +biokgvnjswuselhtuzi[comxhmihobxmgfua]elbjwejsnosujshbqd[tkwacudvjplpqaicmb]zadsfcvcemamozlimw +pnqaihstdftozsriips[lkhdtkwnqrypfpi]peindlywisgzfcfry +fkdpjbqytvzvjnws[slqefmhqexwhkkdhv]jjzqnutkhosrpvj[wjvzprupaavpuzmc]cqkdwaosyntbuyxhk +oevqjtpbljycelre[qsjbtmwnxmimbtaf]simiksrgdafhjktu +appbdxfomrzhtlb[njqrhqbvqvdvgackwi]cngofyjrrwisczz +xucncimruxvabncx[gbubelyrtgutkqlsh]lfneuteufvnubxnnnce[spsauokwxkzlghxsvj]ticuuxutrlrqmlqo +suzaytczxhxstoqodm[efhicwilrikymrvbe]diqcwvsagtjadurtkft +escgmnsjlkclmkff[anasojtvnzzmawcboha]quxaypktxokdtjtvw[nnansptoensuvdqbqh]bwrvzncyicnclmkv[zklwtdlwbciplfuts]qsslygkcepyvfmrivlv +kqdcsjdbvgzfpolkvr[nzfpjesnxmhradmeqh]xekfptpbnohnrdwe +ytrjotkxynxsdlfdood[gfgsticgrqrefsbhd]dqrqmdqfitiqafmp +dkcpuvmrctwtwtjveoz[hvqpvkumjmhbvtvnoy]ppvruhonlhfwltmp +igkkzzqtjaczvwimgs[nxzvgepflgmumbr]xwbqpfpndyvaxfufwj[dylxopnrjlxdtvhoj]keepzdtkjrcszilhk +kudscwhbhmiqkyu[npsoiozwddcysbw]qontovsowstkobmfx[vpypckodavrypggo]utmevbjiupwbqimzixo +rexmfqfertkdkgyw[fazktroqmzuqnws]ssxqlyuuizozyafaa +spaelxckytsjxewny[frhpgodqzkobawpe]urcygtcihbnpayer[ndhguaxbiqxmfgu]gyqdqofuhthgqmqu[xplcrhabqrvxtixlk]xuclgwuisbehygf +nepcketqyhmbolu[klkpcndcxovtxgenahq]khcemvzgfitmgwboe[adgtmqlirrrclbpmimx]sgepebeedqtakqjg[wrdclimitkqejwwt]wcjuedbmdejtknxo +poikpbptymruxwyo[vfhtxmdcfhmqvkbhfi]bestifhuiokqtqqzy[ewngjbizxocmhgf]bttdzjlguaddgmktnb +hikyosezhctnprla[hnfrgdaujrsamhbfpo]wdpzglchlcxleofyqqu[yrpkmzeqrspoqfx]rfskxkbijoxsgucfpb +zkkfdqkjmmxurilkrka[rijqjdcohanebspyh]srjevlnrwkaghovhus[kgrgzuklkakvzlexl]tgnqewvicnfyocaxfu +bafjxjjsbkvwpbbu[ytnoocrzdceohcjzsmb]tfxyycvigweydqtt[fzgbgfqzlbdngjhfko]xxytzvgkqwrjpmwnqrj[hsclxpgznrwxorrf]jnjjvlzeymalkrw +pvdeombqyhdeuracbsw[ogombzjnxmptwfwe]jwhfzfxjfwfkersx +oqdoxgqsnzsyoiozcv[njjfqdqpljgsqjteq]xzyxqhzwulwjggwr[vftspkxrvlidhxpz]wsluksmzthfzialzbn[rnpnecucmnumicphp]iucuubcmodrgbezfi +fhqgtjwndbvxhjnay[zhjyasrxjhshaibeee]gpnknolvzigrufpsy[uvkhwcshsalizlhln]miqggogcoalsnsg +kbaefnclkfuaacyaqw[kvxkjtmhrpmfybabmrn]bfcgpluqgcvcywfilgu[itxwxuzuhirpwzjn]sqssnjplrwtusvkoq[xtswpgursrnfolfp]msgvzgspshljqvy +fmtectsgyckgsxhtq[tolibcypycluxqggvf]ahsxzidiygtnpqth[fnxqvonhogepgcnm]qalfxkdyvzzwqav +ivjntbzpeqkwncmju[tduwafmzuadkrarv]codtenbkheubswo[imscmiquwvjkktoqwhs]gxcioexacilhqpbgu +nrxlalqatettzodgrs[zmscgfitelxpimva]ddcjrltymmxjejsdjb[yxfjgjwdazvgldbsl]xsqeusulfsqplrpet +yachjgxyuilhkuxfy[cbmlgjovjsjscrb]qqhzalwoyrshsmaejb[jfwwyvjdgqpjunys]kbrfaibdtcknzue[jguruergvdgbjkv]tgsuseeylzhplgrpg +haobgfarfwwsnsmt[ebkldjwmfkmsyjl]nvlelqzqjlqqplbrtwd[qvitfazopoylebv]jidnhpalxguenkeons[syannxpoqdjlsehj]nyoqfdaqlfexszfaf +lkblrelkqvilunrpz[pqzkriftkhwruzxjp]uthvsrxlswtiuej[rqxmpszqrwyrrpj]idshhewuwwdgdys +jtxtiohfhiutnkxrw[xpxcqczqpekfmusvwr]sbqsrjpvimcbpapxp +cgbufgextzfgphjmpa[jhcpgxakwxrbedf]jdckfachzooibtpgde[upjxjgkbcocrtcel]zfuntskkkaqoaawlft[atvbrjlpzjmpqla]zkznozcvzbtilaqu +npxehvadmrbadkjf[udleiusfgbphbicllz]hcffuslnycbpubqfmbj[omluucjltknwiebdefp]gbmwvqgieonzfwrclse[oelxxcfbljsyeijeefl]jofvmydknyufeyi +xsusetwokemyldccer[lptgydchemsqljaxypo]ejtlagjmhaszjzqsnn +sgodqumychhkvnk[roubwxyrgybcnaqv]rzlmvxkwxfhzhrgvjra[kwvngfedqvvuishjoji]qppuwczsfqqxxqsepu[zmdxnkvlrnkfssv]afnapqutdqznltezah +pcnanwdmzpshbmyw[patcrbtvevbtanaxovb]stuyxlurceqhactp +aivddjfrbkpvmlsooj[hvrvynurbxihuelkjl]rpixqxbknnktowmkdo[pkmxpdasehhkpyy]odwdkfrroynzswerbs[mfvmvxovfqegtnxllpa]ufboctmqfwfehmfebkf +rtbhehgjnevzmmqgep[yzodzcckeqmwpbook]mldhiwfaxrnljjovg +xzycdgrfzcgzuebvi[hugmldunkbtdxeli]qugxgdvvfygluodabgq +uiocwjcjawkezsthdj[azmygforvoiglqaobez]xliasvcjctalzfdr +svtsxepnrxkgyomsjt[dglqtylczubhqapb]kzyrpfjigqwaeavrus[wizgslqvgqbogptg]sdufetznpmxchfpy +aqkjwedsgvucjvbu[kjcxtyswlcfkgimqqmo]cefzpwaqfbyvfcqc[dfjrksosggnnulxe]joaumybazgctrshh +whzvbjllsrxgfnqi[jhgsvmmydwgwdjglx]ebshecvmjodytfhpsw[nmcgzfhovcwodbtif]ulsnbqybdkszugxd[yfocxkmabsdnelad]wggxekhcisugatilgp +muqhaqwwzuoaqfyonl[cdiyytjrutnggkpfc]cwpbjzjinvmcfxilx[krzhyrpnexotxhapzkk]ljkitrakpbxghpweviv +tqwtflnxvucqsgmd[fzflzmpqlsnmpjixres]ipfqmaohkqstxofevcb[gmgkfolwwihufdpze]owpyncadwgzzmqyv +ixbexcxmoqpehwqabi[txmhelnipufwbwjzzj]mvmhtepvmvxpssr[wydqdqbtpbkrrexe]fqlkemrbdtpswbcqy[butplvsurilrgfawgco]tavqvajtocbvjevsil +vwfkoxvaofxskyhbjqm[puvnruashljbsqbscf]taievkrmmgnxdpa[xrnlbvjmvidvnkv]gxudgkdjkszrjyfuy +itnjahxgfxgjnslbe[hbwbbpvylfbyqbgfpvz]suqdsbpmptbrujuf[yfkvqhmseaimirlwamb]svktdnbormbmbsnilnk[xlybsibrczhbpnphw]vcslptwylljzxjlvcn +lccctefsdrcdlkw[hnwxoelaqsswnrlipk]dxslofpdnwpdqqtyqk[lcptfiqjgjaakmshdu]ypnniarllzpkrinfo[zyrdjbowiiytfhb]qstsanwuwunmeytkmk +wtxasrkodazruvnr[bewsicxijbwjblgjj]hnhtxsccchhcycbt[gycsmvclfyjlraerprl]wowibzopjcibenefiti[uuxeudxwqtrswbxuhxb]ttsgxsgkbamcaocut +ntvwumbkdxpduiy[zkhhxzidmtujaytpsnc]hzzwgoqlwyadsvaejhy[bvbtzbhaqgusces]zfllkpmjpdddzkqdm +vzwgoqznxdvefgbqkjs[swckbsoabtxlkhbksg]zqjsgiodujmdfxfhiax +movhrjexteijabgzjtt[qmriigrpvzoanmnmvsw]nwmdizazbepnduo[qxezsdcvcwdfhfmna]igkggjfjshvekgaapss[weeuzvhhvucaytq]pwwxdlihtxesiffju +xkluztptozcnbvh[btptpdpiztmrhfijfk]ffjcwrplvkhuuxugg +hhfzzjrspqcimcn[kjdhabulyhfjytno]tcbttnaialvktxqqsfn +xwrxducaozrhxme[magpnshvryqtljmijqs]oxusvmrtigxebedfk +fzuvuhajudnlxscbofd[otmsbqkykhucrldvttx]blmfnsqkwlndpjqf[yqpwlhlpykachcqeesu]injosnmllqisgwqxfuo[vsbfohlfrptrxib]zqamtnzifmehdxxoh +rperdjgiisvvnnkqa[wtgzipvjvnuyvtqt]llbszshmkckrtmk[qlidltzjvjtueyy]vaqxlpwkvspahufb[oatmkdkqqwucfodoilu]axluymagirjmerkhzu +whferflocizjrokfcay[mmwecazbfcqkomqmtte]xzzqnxyjleqvfhdollz[qefcdifayasgncsitrx]eqcqtehhaetqlkl +punmackiplnvsvaibb[duepoewfezjbmiprz]xeqtdtxsgdpjgquefny[enprhqhpeyfvjodhg]dqcbffvaeznzycitoz[gilxojkhxhttizc]canikhdckixnlnhm +eiphpmokjfcyqttz[gtmpkvnsrbwqrdgkhw]gaedvjkebfmagujj +vyrzozjvlflremttj[fmzcdwwhgxetugth]pahbkmcxhcuuexrqo +izzyhwipmlykvvvmcr[fewicghbzxsojowdhg]mrzrbqtuvxaxzef[zbgnaaslocwtcne]mbzxovudbgkiwpdevin +usxkkeufvdoggas[dswwfmzmseduqxhtvwx]zgqaeauwnbvslksyovd +glfrqjuwkvdohyiwdt[pvjouwyzevujmgejnf]lrbkapwbsrreomofbo[wkjravacdyfclczuosc]mwmhplddwqgreyyzcko +dkfnlleylbdaajb[yyintvqizzzxrfcpi]tngxominnsczlht[upwicgefegpbmnrr]fxfefjvyqvdcrmglrx +rshswtpuebrupwdzqd[ksbhjfdzcolihpty]vxmdecfcljflahiuy[fdyfjnsmcpxgnbhzz]abuwcdidsndgdnsy[wpaglfwmquxtdvcq]odgxpvmwhlwzudtqpnz +rplrsndfombfrzzlc[uiugcytieaoqilk]ntvrfovdvzuuonp +mqzpzeudnxiqahnska[llussgmurjghbnnoole]eusafrqscbpinpaov[msdqfnpwmvegogpxo]inyrlydjdbqpztebbib +qmmliykhvnkulamtuiw[udnzzpmmswzcavkuxv]gcewrmlypdeocvbyjj +uiqhaiqjwqofbgqto[gkakppyupbxwnno]lcwfhzqpmowkejj[rtandvdifasfywsle]rlfkhnelytlzutfnv[fuoanrlavgjygzqhsde]dwfddcgrxzkgtcm +bzgyinxpqvasnlb[hvsierfmklqiivawit]sqkqdyuvutegxzrkgyd[mvittbxhbtklpuh]afvaocxcbvrivxvuv +rlpdcdvetmwhoeh[ustdwsmbojqbqwc]bbqvzwlscykctcgoho +tahntlhdicpdnnalpp[fnmwvddaoxkmjqst]xixbiyqgxypqaedxnem[smuvqxwgwfubhmuw]lthrcrcxoimmqgk[ezaxxdumdwigkvu]crowudsyxfforlrayi +hpvryeheavhrkjloujx[mhehgywzdejsbfuwey]pkrgqmqmudayqmyv +umowweqsyinygfe[grtfniugpboogtgpv]ttgtktqopjsywulprqx +csjlkynrlvbgwlzg[nsvnttchrhqipcn]xariwkhwfjfwehfswp +cacydzczdaqfshhr[jzgqrfcnbqshdzqfnmo]dnlkizppyuvnyrkuxce +kangosnlzmgeaiknm[bfajqjeohycglxswlra]tkqftnbkfagagcjvi[ovdubgbwoeqefrw]qvklbmsmtzwxwpuywel[usjzhltvradirrddsf]jmxnrjffssgjlfivba +snomixyfcqkpwktt[iyxjqorsjqjuunteqt]tdbqjkrsdgdlyelcw[cfebyskawmwkgraytn]gsqrexnbkrwpcmyrft +rafnquyxsuwvjgoah[bhcqlwyxonwuqowofp]mtdaordhobwntkco[rtyupdiocyhxkfsbv]cunuqryocxscununa +dexyukhtvmozlth[omyonfjhuzikquoivfa]abyszyboigekahfgl +cfaamntsdtevtoou[amuzpgjthvqzhdqn]cyadiddxurfpdakbwk[uyqjkkyhdalczourhr]zxhnnyzahmknirc +zoqdnxwmhiwrqaejekb[qglzymehadgnhyoaf]whivbjvmjxrrrcju[xsiczgkcermegfxz]yrqdhyqsitcbuwat +terznkuheuiksxrak[mvnbiknrfabvjwdkxn]cwddjxvgmetzjrkzea[xziqxlxbnvhkmqbos]fhxfhmqgpuadsubh[zeqlrmsxwvjemyw]nsfzmxgouassmcs +ybeezzeojemnmzgcpdl[rjzpwdnraffmmqenf]bmsevuoarcwfysmav[yzvllscuulqatcxvl]vlmyukjcnfybkwdwp +fnoorwmtmzwvwktqbo[ajydafoskqgtidoz]rkvcabzlcpxvxkjlu +faikhkzhlrclghufqs[flkmuovmqyqnkfaf]asunufsqzdxoudiaxxb[hadjusanacyvrjedrms]kecxdaaazmwrysfyqml[egajblaxnaynubwlkzq]wmjxhcmohmeoyoukz +lifjpuhsmpcwminulbp[ogsqhmitayjkvhxn]tpyrwhmddljxsuf[yvbworbmupysruqu]xcibjyvqwkwawzdfm[euriftllunddsasont]wnpqnncbbjrnzzwd +dtwtsjecebuxxscwdej[gxutszjzoexdwwpxfxh]qfskmyjabemuxxl +fjqeekfbyxrfxhqj[udaboiljhhoqfgv]vuoyvxfoxuqtrfyu[gdykotdfbbpwmie]rgszrfktcxyuhvkv +xyqqdpygmeowmpkzxdd[bjxnjajhhffgsjtf]beeakoraqizrvllo[ttbjhpxiaijuyfunqd]hbxswggfvnjhzyymmxg +srtnhdjdniufgyhgehw[vribdcfzbbuksonm]zyhzrsjuveucsawn +uaolqhuxfyolzyzxesi[olnhuxcyyzywhqjkgcp]lhwtpfmegcpmuohh +ztblwjazkufcifqu[gqwhahvnajlciqlab]yhloiuhbkwzmynun +fylubozznhbgqgl[jhujcfrttvwsynxbv]baddxoctavloxqy[ymvtyrqgqmuedvtviis]iunkknlhgoauhckknz[qluvgkvaqhrawtvvl]gbjvfrdirkhuifrss +xqujempeigpgeyifi[gmuequihzfuppqz]vtejaedoorvisdogx +fdmbfvtxctvlsqpdg[ppfydrwmxhonatvil]jswiuniywrjammkuq[tcggdwprsapeogozg]gkaplvlfqulngueiprd[jvdyisxwrzgzanqjnby]soovzbtczxxxfzpj +mlmotkwsacuwslthc[dopkkfjvrkqlmluai]ziyyyuqwvtjieocc +unqckrsxtyadoeup[rcbvmphhdlbwbgzti]nxtsjyxkihfnxzgx[jeznsoqhajzekppvfgl]xhvbdrqswazjzsr +qzonssvnqehuodjm[owetefyiumtshqqa]garcprzmvvujvlu[ufjepcondnxhcraknvp]sdwmafrnzdhabbr +htlwjrpzxlqzaqyhhj[bhnrcyoqmpxkcwtoem]mwvnohqdiiyjgmr[vpmbiueqcsixwyxvqbr]ddqbaqtkoeiepkx[kjvlejrlcgogwewymqy]azlvqkhibkvpvgts +fasqsusdjdurhzhmxy[beuhgugmlbobevxa]rkszfjsnzbqweycv[pobeqlhcuytqqgtkbp]ugmqmvhkunncokeqv[xjhcfliwmotyktlqaz]kjkawayleopewbhamo +gjukuffemjaastxdtl[enqvehxspvgyaxtqo]fjtzivcxhwmgsgcf[eldofthqgeifmmjpqvp]pzmrzoktfngiatmaasl +evswvustuzguawqg[eekvvswhthiuitu]gnkkxsqwsofsoioaan +slbvgfuwwxdaekfjdz[nesgfzgxxsnrgedtlbr]csmhdgvsclsflwxq[phukwbprlliaewbqjrq]qqnfatzpalhuuchdl +fcichhbnervkoyzgou[jqivwhooetniapnts]cmlbezxzjrgotgrkv[jwtovryqdnyurgdlh]iqrnakzkquqvlud +twywruqrxmlimxi[cmbuaiyisjfucji]hnmqevywynqocxi +uensckwobqnhwpmy[laeyyzcrkqwjwwtb]ztujdcvfodwlakjxa[hsnxusbqwxwijgveqo]dsflajtdxnptmvnm[zvrmewhwiyqzrdsri]udvmuglxpkdnmzbbkj +jzgevefvzpmbnmwbuzk[iyncfkotavwinyt]efxtuwuclegiaksqhw[drfnvjygczdpflhr]ecjtnayoruhczrtiwa +qxchkvrkswtdgxesbq[zozvdyjglsajwsymn]flxwmludxuuufikvwcm +bvkauvycxhsfedi[etgucuislswuesfqudn]rxppectbqdozxmjlcy[bmqpcoljmvtifmx]dbdtweevpzvskqyefwl[uqczspdraplmucwfyp]bpufbddjskedwxltqgx +lsccsgszfttmtbm[gicwhuzfyjzphptd]mktodtjlpwawglphs[dfsjbfnwfxxinue]nldonynzupojalctsds[hbimwpgmfhkdtedtig]oxxqsccdbnpzeikwj +tlmxbhbpdjnagkuuurd[fxcuxmpnkvimfevb]fmtxsequpqgukvgo[cvrjsgzyirrqvgag]losjdyginsppgle +acealhqzrrbnskwla[kpxiuidwwzswvvt]tlehlrejjirrpelcpvs[hicuazvidjdnuozqg]pljbbpztpxzqubh +qvgvyjzkfkqecyfi[mtsswvgnyvbjkbdd]rcfpqdgxtcexwcgevf[jnutyvnxznanmkwbor]uitbdmbrvsczrqtlzb[deiyfcsvhwqkjyyraoh]mgsivfzvqzwerra +xldbwzdplokritegpot[dkilyibmiqqhittcbe]dvolajbquiegpyzm[tiwarbemwlmwpty]nsknuzyyjfhrmaf[yrutylvvvkxpleg]dempcoygehabakatfsw +xdtbsxcmwlyyewdci[qxtgtieblptxcrxjc]lfnfzcyzctxxwpxanp[zakzzhdzbgdmsuhu]gtrnswhdqhuhmkb +jiwoxrumnfbjlwkmhr[puvnrkflogcazwtbc]zlebejqrzictznzjhj[hxbveahojvbdqaa]etrqwrobjqrxdyqzdw[qpkcavbviaajsbzw]yybkscfwkadoysg +eteufxuerkogooqtds[tatatmxkqhdvvwwe]noedcedzspeyqfmmd +cthiztqbwlgffekx[btugyjtwojnqocop]cpfwsoehhnfftbkup[rrcurvtjybfngzr]bftefflqsiacppggg +cpbomncsxcooaynbyb[nmnxjillbkzozriaic]foyuenlrilyaaiavd[dilsdxhwvvuiyrpoe]jlnmynnwhggznnly +emnwagolpfpzcpps[uedrxoasfqlnnynlhtb]didvjcpvkjnxeyxtvv[xvrtztsajljmixymooz]zuayhoxmtftlkidfrz[rwmzeoprmwvixth]occafpfaspkktqvsdo +lodlbpyfqlpambnb[ujkoamorycpjdahia]fzcrwltfqghqbhvxn +nizwzpivrpafchpsxh[onyomxlcatphdydyb]ydydlvlpsnrpfeyz +bbnkumpfxywuaju[urgqyoeidnzcrhebv]ilnwwmvvjgpoyvno +spdalcbxoljjsnnp[fztxwiuercdzikbbk]akolwywqiysxpubgu[zbwzwtpyfmicoch]bpzsdwoconslujf[uiizmxhuylhilnor]uhrqppehrrcztkfmkv +rgddxscswnskqpxpan[mffqrbysmfatawfmxg]nbkentnrqlfynyy[voxcdqkhylzufrjekdd]voveqepyrzidwkscp[nfjvzhhaapnsvlgvq]vexwngjkdcxbwkidns +jpntpuayoxlduqww[ezrqmpfomsfilulevvy]cjrjefmcnbswkrn +mjfyrlfzelvjonnn[ulcbojuiaahlopwk]idenqpkorklddbnaz +bhgshnxhcgbestmfnxv[mvebmbvioqohanjpog]mntsrtzfzurcnqxpk[bdcahsyheihtumq]eickztygasboinu +zlplqtceqgefnke[gmqhyjmtykiyxnz]ipfqojghtbsioksptem +lbbcqgzfdgerelg[wwfafbqlxcfomqyu]watztxtiqwqrgqzjxan[gxntmrjphcqsuvbygab]wirbojjuorwzwudlblj +gjlljqgroftymgt[qbgnlxbwcxykipz]iihojyaziefwjyy[jnsmszgytndqggahn]qzgxgpudmhmyktg +mzujymrvymlfuefmc[lowenpwwbljiuaex]zdoohchvifnhbln[kmmdgmmzpajpbpses]begvpvufpiiknphagyl[sblceylkgsmpmkkptpj]igmhiscbofjridkibs +evlnogsloknvghdj[yxdrizzmnnpledj]mdphafqgsjokxfxv[jbjwluoucouakaef]iddlilvtxhmmzvhecf +xkifittdfqhyilxath[qutqagtwjergmpzwozk]ommacqhnpzvalxyyowc[hotsxrwsqfgvvzpvn]xjpysvdceyiarwla[pcmqagoxtbiqvnk]xjyqptmlcqppwvun +fsnqlrxepbchttru[wtbshrnrkwfipibyd]ugokorswuuvhmionq[tgbjfinuwfidoojqcb]dhrycpbrbgvwkqoa[aedbxtjjmhbplwhtkp]dipkjoflmykyisfwh +qjzrvokvqtakxgqlhcr[xcsezvnaaqddnscyx]yphwgbeecgofsdoqkj[nzexfrstzntliwfk]nmjjavothhltpfzl[tqhxmitysrnznelkr]xzrteqpmzxxwfjmlm +pjuefjhjpzypafnrz[icmlfeeurgsdrgpher]filoaxijpcrlhahuro[zldzwqaxyaazvbxnqp]tkomnofolyeclyxbfk +ypcbanszbtapwax[yubwfxyblmrciwhvnvw]bgjciiddgwsgzqnzaue[qronyqcvzbelsywyl]luzqvtdkvasryrk +pazfsvlvzjrhffpsckz[ymankdoapvwotrpjm]hygkvlsmknzdzwe[nmmponlmpmyecec]xlyouznwjdsvfve +yoktdgyjyjmxoppisp[stjvdedbirzwqtpkb]qoqkdqwkpprxztgfc[tzahjyjnmnekwyokbn]mkcaateraenzzfs[cpgyhilznfdeyxrbtf]iylvsbxcjpflwyaqjde +rvdotzpukiohsaz[coziezujbxmihzmjetw]loneukwuckqfvqkk[ynlwusyvfxkihdo]lezljajvdrepwjtxrzf[pzaxvbabpytdtedu]kzypirxlfccdorpe +wncchvvpgqpgsfwtkx[jgxqaowxpuyccvaof]suhckeyiuukphsc +bmmddzmbntvifwvjqke[kthmploktlagqdcp]yshronrwwxaumtezdwy[wyayyzswlygqljv]cpipupwpvtulpwmhfi[nbyjveyambtrzyg]taywpwuagvmzbyea +dlzkgjhjrxhnvcu[lqykoztnlcoimougo]ijbtwesjymwjwtbbp[efdwxnuattyhuhy]zgsccjbflsvyskyjd[hndrparcadyfdmr]pkwhspnypwejvpbb +yrudnkhmryctzxj[myculukcorfjveashn]nwqjutgwzwtrhywn +sirwvtfdtmwlslskjqq[umfkwtinqleedyjk]krukyaewjyaxeddj[houzkplzbpbwyondki]vlcccazbpfsahmklsn[bcmdxhwrdchlquvvxtm]nfqvtnzbgotzxntk +jlmjrojhqjwsjjlfx[yfpgrcpmohvwhkehp]xynfpofzesitrdia[juhtudcvapywgbirah]yabzjurgykvqxngvd[dustqrmgsyxfflxddxg]moqtjnsqgjzkqne +jjcphhlctetsmrzqsdx[ptzjefvylkgmgdx]xjdygmcoebrmuqimky[gdzcbodwmtanfpjv]yljqodfuxztqciwxlkb[qehknsdvgdaugohfbrv]uvnjkrhhqhdgolm +suabenrfopqsqowfvb[lhtpqqyzelakwktkvvp]dfpptubztvqslbifnht[rygoefoqzmcwipmedoq]fgluhxtmnxivcjb +ekrrmuecrgdhpeotivv[kxkzwxjbtaizqpapb]hkxxbqllizgoifd[ndwtymhzmjkwhfsqr]tkjeezcokycysbq +vahyryyfiekzmnaghy[dunuoyampibhomw]fuaolgtksarnxqzgoat +opqrpddoyrgpvkt[xtylkrcogeirwiwjff]qddhfndaqfjyccjsasl[kdwqztteysjdealp]jvpfwepmuknsuvj[osyjycjxyxxhgwtozzu]auholwpmxhgvqhl +finznvwrtmxdkynqq[znzojlzkdfoyeqkb]fnjmchixkxmxnyb +gncexwppmxqmkhbhzw[tgqrfrdtfrfmfwegl]frqkfwbxrdlfcnfaf +mgnaaimzjhippkz[afphuskevlwqzleiodn]emvyyesllcpoexkxwkm[zvfxpqmdtquznpumg]iegbxiqmjunxkqmwgjh[vmyqsqvwmbrpyoqyeo]yddgqlqdekpjdamz +sqnxywmlpdbbuzqdny[tnljzbvgduiqwtkopc]cgjtjcdqvcrhnlrr +pwktmqciycemwmznvg[hondgdpjvhllgez]zivqgvlldyvgdggevtr +mnjcsuljiknowfdt[tnqyexaahpngwzxd]vbvowakfzaiwvmvmr[quqcepdcnxpfdymyby]iosgerilxasxtlfo[vgmkhzudwsahzfhlz]sfyqfjweawnpedhpa +auzadgvorufbggazq[wtmlikewnvpjxwl]pzwshvhfhmvhpzn +chzpyezzzomccxuy[klzfwlherejbxiknft]mepqrextkfdsymvehyf[wntgvziaxrikkmpe]vhkrbfpcwxiruuunmog +fdhxyylnqyvixokzws[rznpbyrsiqveane]awaconkatxjrzoyqny[zubifcnqbeguvdb]pnfgvufswpgouet +gdplslxmkeqrgpxmz[jytqvvijffchjzdwio]lkoyipmcdnvrobi[odvxcudnmizlalllpk]ndzooooetllelopjq[yxswnbybqkmogpxqxi]hhsiadkfchzmirqbe +nasgwopoiadqpopnrhm[zddbvnqepjjpvyns]aygazvcnfsahyeia[qyxrvgubcntrfyb]dvbcycyrjglftqip +scxtjmiyswclsrpfei[evcovzgqegkabyoj]oawbgsmtomjgrti[xewhzbgjxcnziin]vrfyzfdadraakih[veeypcuhjtrlqfowk]oyyftetquzaitaoaaw +csjixpasemetnrfr[kttugethsxnxfvx]yfvtbjpvereefqqk[ejitlxyidfdanuhn]gnolniwucdhifqwmwhj +ctrzppadihbcdxudtac[pivsitnhbimfsmou]jtyycbiaszrwrdjs[hyewishwbdqkztij]vhbnhuxwwswyhfeo[gxnszwutoqkeqrf]ldrzkosuqpzdbwtvfnl +oyvvyenuvstzikxbjce[xzcmihyeisrgffhni]ahxuncdxhwfyrjmwgg[ndrpukceoakygxmx]ihiodqfxvxdovqjz[krbqfwgtncvhlqohl]oyvbwcqvcmnjnayq +hstvsaoodhudeeraito[tqjnoxrjifgfniwsgns]jjqyywgpzztmfuyufgk[eegjtcvpnwbtxdlhxs]diraujizuvxirqg[avmxgioohhmrvbdfexf]hcicgciithjpfab +guvkwabdcrjmfosxrrr[rwzlclrvprmdczgn]fiajsksyzvriefwxnon[crkryjxcpfwkdiay]ktmmtsjuktyxezk +lqhqiadjoeveajfow[piesytfyuypdnupgkbu]bcxjuyihjoupntop +lvcibleskyhgtpjok[kocymbjktkqgknggsa]dbhuuykasimgnmboohv[okarperllvkzvumc]ceyyisdbguwrmoqeynj[fdanqvyulqipsrheik]ikptohkxtqtzvjmgu +siewppymykincvgi[qziquwvqdandeqs]zklhkhtusfbxcfke[jninzudoqzyohyjnnb]jnpphpcygdyeapndhph +mqqkmtrfuxsrblh[fgjebegbyiskwwreznr]ejnuhhgmcpecrdozqk[fpalqibdtrcsfwrzwcq]kqpfqmuniiqfodatmq +ghvwdujlylpycugan[eizafobyeauiaah]yaovrefpkcwrzialc[isvfdvszbgotqlh]twwumygawmuvgdq +huzpfcgpkjqriwgw[wwfnkoxpidpovtfqqms]ezwghdwtxviubpttfz[esnueoxpiupdnfch]qedrgftkgeajzihb +eylwwmjbkagljlls[wehomzjfgwrnqkso]ihgiziijkisblrjlj +cjrqkcwraqtnqzpqhe[rlfsrayecejbfutd]diyzyuauaykhkicopz[lbnawmlieyiheut]wawrxpverseykyblnmj +tyhvcqtbzdnwnuswbtb[brbsvmujllkoygmcrf]ssuklhhyuxxpnrsot[ilrnjgerrsibiahxb]dxsfzuyxtbtuqhcfk[jtfttgsgymzuaytbczs]bzkhccldohcveqxkxg +wmxhvjtzrqofvqyq[gtqsuhzwzcenscxy]tiijmhjktmwptpl[xkjvinezorywsvgd]ourhlioqvpbruqgqwbm[ripdkceifjkebzzxrmz]vyejqgupwfzqlzk +pzkxeampgfrxvkjwmvx[saxmfjcbvylcmpohx]dtbrookfdueiaiaa +haibhyxjmwuvaqsqi[mqpydjhhspstfsik]kyhqgiczyzsjdizggfo +hyutrxovudlcgtqaasl[kvdhdnugzqqgqrtsy]wjkjumtxyjtbqheviy +ruhifdjnynmaztrd[umltrgurecjqdispa]jziknahqzbwnfaf +vmftilsfiabxujkooz[vhuwubvqoswquse]kqrncdsyxwcqswtt[fsfotdrzanwngvf]vmcgykukxchqvbzqy[xamdrmnawmxwnnh]gemqmkhhygpnesfq +tpfqkyiuhgsltihph[kpmygovubzuigsb]lnebyuiwfqmmqse[jutxvzssuzgrawpgg]nzvgiiwwbohkmcfuwa +qqzgpzdgqomdudpe[doaqydguparcbevug]bdthytdnxltpngtxs[yyfajendprpdsrz]xvbnyllrvrbhtrrm[fhgitqxewvntdqaje]nddihvrjhegbvvn +pinazwykcazurbz[sshvvraelgtrfgf]sesgkbttlqdppow[xbviulglabpfqjxix]qbepfhuupbjfhtrtgb +nyyyfbgdbctjxrlsm[qnkjtwxapqfahaxfz]ynhenrdnuiygrsi[acibrssqmqnuijw]gkktazvrgsbcfkrgnlv[heqzhxymrbkyatmmp]npwpezwbiozxuwj +jqdfkwpptvhyadpunwv[ifslbloolcaxrmewt]rzxpslpcbwdwnjgjmwa[eudjhujzjvwwpxhre]zssncqczbrorpihra +wgrqmickpndzcsxnpsy[orymsnwemgvgdvqc]zddumfflitisvohyx[lhobkuefqssrljzsxzz]nckmxedsmroyysnrn[zccppgwxrxxhaunb]uyjmcppwnakgxtjroh +xuirxfixfstoyav[txtxtanvbjlwzhjy]tzxucltxuiqiucmzob +hqbnuolwklisljo[ccppvwpiymlirnpkbr]pnckxiikjkmguai[yzynhfcpxpaazwrkt]bxwzqcnfyzsqinty[fiochkeecjbsjckgt]gwebbynmsanvompl +laadegnpzyzcuihz[zfattroimshqjstf]khfqzmasvpzehsd[ngwosqahikiqbbnv]sbmdllqrgaiwplbffb[ethsxhjrrlupxsgmm]vqywfmdgzdvsion +nuttuucwnbwhyoousle[xoqhacnfwnnjopnhy]shxrsrcumxshluuj[opehhbczseexgtyrgqs]olbetjgecbsrytnzjsr +wpkkpcplocnofso[xossadjiikfergczau]qiwuqiphcppdsrutxp +okzxvxmfocsyoybgvs[zusjjfchztcjrcy]vpiipcrozcdvszecivv[kkglnuxxxpurhihbhxr]mmqtmmbuprnemdrpbdq +niphkdkxnrcxhtmnr[jryypjuaaorivctdt]ovrwgrysibigupzm[rxvrnwosskfagouo]grctrjnateekgzt +feecsvzxdnklcxlfy[bryrwvhvpgqdecftxhj]dsplaxuyxllravxac +lfgubkzkoardzdf[qiagyqufzaggyaqb]yppfmghzluleefukte[jvaxizomwbofkvledjk]svdgdodidnfctqbj[ztgyesrfvsdhpgx]vurzpbpadhrdrrdiza +urbxbghjweuedbtoo[ylydpscyumfpxuore]ssbkrwxjmwfwjqaljt[uwlwfrvqhozzerhtoeh]cgnzbzgqozoiyta +hienhuwpcwfzagmibf[khfdoplbvoapbgbj]uqtsfqxtpasqtuwuc[fguibihgiebfiftg]jgcqyaeharvpvyy[cxqfeehtfnfokke]ihtuaduxkbjugie +vwbsvafxdlwwrizvqo[uhzrldkjlgudrtjorlr]azplsihnwmvcusfh[ososullwghqsuxm]uhwdrftzhfnmrroqp[rdjlbrqexvdjzol]sjmefswddwxnnmnwi +pjdujpcohrebenyig[dmaoaiofisjxiedobgj]bddiakgyfryqnye[aeppppahgwqdgulj]iucspvoyfouwezd +zhkzmzxbizaiadjmohb[lujcebxtusmzjnfggsc]tjlquxvqzaqzpcynsc[yvcpypqprtubhiskq]aeunhwiwlifwsiddtdd[ybtelokgzqtdnvbzh]rsysmzmnehjxazr +ciqrfxmwewtudofpi[pqwishdwbtrjostexu]vkygjcmbnllgtnmyjfs[zaptpojmomjsvqkme]jyrfxswxmmmhdyn[ruprqcsvyzmkeeu]upmqkqfsyquakoltryp +ptvvimfpvxpdvqxnr[cbayjdthgudlsfqv]brgbpugjpulmcet[vzxqjdzvvujbumsr]qscfpzftpppwfibgs +pmpcdmrdmricooy[wyopcogjkngqewnyzh]cpcirvlqmtgrjoso[gzpklputpgckxfzuwx]eilnrzxsajqinlxpzy[igkgvmaezsyfoukgkjz]vwrrhaemgouxydcmrom +fbwnbgvlxrdsxcyzvey[uweuxgyvdzucqbpee]xiayhjagtdzgtxlhge[ldcgqzmbaevwqkvut]ztivhyevetijjby +iwtqydhqswrbcqvkxqk[ytzedtgeyocjray]kctyawpureoyejf +urbtdgykoerwhomda[tcfwziwvqgccvskcxnb]fevulnobgppmxruzw[vwbgppwwwqshlko]ioatlnhkosliptztwoa[aeavbhpnhgdlemsox]owabiqszcligpdbz +tplrqokukffrtmlcga[jyuxtvhfudogzqx]gjugdhbfmwxnjtmrh +swbwpexnuxtttzhh[xspyigzqwuafmarjin]qellirwonukbbvdizi[rkkwqekeufbvhzu]kwuzsqbisvinzxq[nfgwvgerkfwmgqgyy]ozjbmbifoxiqrgemvv +geibbiqamcspqflbo[vbdzzyorxegvqrx]rktukmmbrdynjrnvfkp[djqcdeqfeydxadzbkj]hqijcjkzfbturfhy[xlmbymbynvokjtjrclw]ssbgszeektjtjabcp +zaqgfhshahrzkbf[gwgqdumlqyhzbhbfoxr]bxsxoyjbvcxqjnfhwp[kxchpftippbfhmtmoi]ecozcxdwhecuexkf[ojtinjhzgcvxuxen]chgufqbtfczbvqh +uwjbtudngtnhenh[xmszyblpzsxgwirizr]qrlknnfyxgttgzlsux[egetldzejvwkagyk]dcapecjizydleytc[ohboyhszqajjzudxfbx]qavyxwvktwjjmyx +srpwicpxcbrydmvhvxl[zcoxgycbwkpxoyuy]yfblbajikrltjcm +biqevzvvrqzgaffnhv[dsqfbbwkjeczlbrnt]kztaqzzzzlxvaqhcv[mcaircppwyjpyondde]yqsxkrbdcdxrwvjsgo[fvtjtxwmxlnadeu]bqhllahkduvydrvb +ukbmjszvndgzbuq[ckmrzogujmemwsfwh]wdscgknyvtgsegsfuaw[mugogalgcsllfilvfv]zshfxqsdnmjebzgdbcg[erkesgwdhfgpfgrxhro]yezguyhbkkcdnphtn +lmcmocgheniqfzeh[qomoqrujzxhiicet]qplxjgcfhyhmrzsnif[jodkvnzlkjtimlkr]gevkbeqeoxpbmompr +fkitsqnkdbckyose[rnjpqsplojfzysplipn]tgjlgivockfzsnu[qmwmetgfapieyyij]gzhptamokjfcgxwr +nhaccjkfkzhqjxlevlp[ztqkwewvjykqsmsq]qmvkyshwzjuqeqgv[vlggwfdxikilhmmyz]ogfjuhopnhsomtuupn[ctyoshqlieonmdainlb]yugmxswctqtktale +yxbeuvultfhddgfxmkd[auylpdijopmthrq]dxoibfjfqgkvjui[vxbyklblajmpuvftws]dyfpmoiwlgpdzft[hpkzbkcigqespcnmby]fvvzvkzvcrynkwkhxo +jjshxelsbssojrjj[ivrjrnasyhnoxmy]xkpwivngxdpbfkel +tyfsedpncmhyrqtfgz[yjeggvuxhkgyfqxkotv]bkmhwmqbdhbjbpbya[hzxelmrqeehnyiot]chumeedtoybuadxhjx[bhskcnreqqkzriifpak]raipqqoxsewtwfbf +vvlpzpyycntnurr[jthqurhuorgdlgmtcfo]mflrxkepbinrwldxkt[mutqsvtyzainkzl]oghwiiyeejukmsbdivn +yunriwucdmubfnb[chsacprfyhickht]wiwxpaiqouzqbqn[pivpthswenluzhuv]qgzsiwitybdzyha +wzekjsiosuxisuogprm[gsczvyeycmgtppfofp]wcjsdjdvukwitiiqswe +xcexnnqlzutjelywcl[jqmgzsbaonjghgdqes]euslsftzmsrewvtygv[qljfgeahxazzlokiol]jrmgipsfxcxdlpkvmq +aukotsjedvizsvki[pbzfgdfkdkipigwmtjs]uduwxmhfhbgmpcllnf[xqqxhnslpvmuxoldolm]wxsdpxxmcaljhxz[emxctxhghajgmeeqk]ztpoznxoqsqidohorpm +pguuvxbikezqidtdurn[yxdjeqvznowhulg]muodbbbogoowckahla +okojbvhagwjqahgrrdg[hycsxepwykzdypwi]yomtukpjmggiphyjk[culvswlfcoeuaqcimfq]wdrtcuygpmobnbwyoqj +mzujjrundkzwnbj[qxnoeqduajlbzgahwb]ydeomokobxpwkyrzxf[gpildviabamrzjdgl]elokpqxifyyffld +mpdksivufhrmiftntyc[klohhshgiajnhyolcm]dxojhbryrmjdrbqf[achjadgbqremfnln]esfqacvhywzqvlgo +dwdewjxlordmximnhc[yhpwdgvfznbqjug]qefwqjonyclxccnhxn +ssnfdxtouzqeruefim[ptumstdxyfllldiu]otfigtytzmgyvqsxe[vgtvvclfpidmglgzcup]njpcrqwyskhajmb +wxrleulxjbkjssjns[yrvfgegncmwvdgfrpl]vtavixuclgdhjhwhmsh[rtqlhysweljhuqet]kvzabqkrvpaqegu +tzdyticygcaeykyetwl[cxmigrcjvrnhnewd]udfdtdieexkukpkzy[zawjrmdumuqqcoou]osrlhnhlhmqvhxg +rclvqrclhowiewpb[afudkrtbhzghwbcvkr]qdjjbvapbhksrjxt[atcxukkeqxgbwsfsem]vthozywiqhoyozw +fcvwlbrcafnwtfkwl[bsutzlujekojshbsah]wpxtndvqbcwrahxiosq +utckybdjhftkvzuk[qlponosvenyinmpil]mkmpnlhjwkquokgf[ogtzeotwzkmjdhoz]ehpcitmbqyahzdij[agqojjcxeartdrsncnf]dqhohvvtpgakncpl +kzysopdelhivngw[trvtmyvevtslrvp]qphggcnojdcxper[yrpxdwqkodqwwfpquhc]ikrvkfrlvdvqzkhnvop[qwscaveveqqeolhu]fmathufisqcrzzvqkw +spcwfvqrcdbrkzha[aacdfqguimzfxnuqc]vfjayebjpgkyarfwuod[ooejtemreiraorzuvkw]sbrgkqfyzrmowee[jguejbpfuatokoot]uyffbleqofaudlj +iuiivvjgrowzxjzdwe[tipvsdrrvbmrnkqnq]wpxqhpqjejxviejj +gpjhvftuuheinlmsk[yfgionxdgbfqodg]uvlgolalqmssslrqrn[xupwjjmnkisumruwg]ujpdcjhxrwuqryfp[dloaihpfoadfqpdo]ahuhpmtxnyibkaahe +fybvgfiffkvwwycnivk[dwdzeostavtfscfi]unnydzkcjwijumjdbvn[pomamdfqmhocxigktg]iaejpuirmpkkfvkejj[pivxukllzqqugad]bxouayahmwtxkqut +xdiuvigyctdfeaejx[rjyvmnwzclqxyhnno]rptychqruugkewjlbr[ttbftbvtxgjbqkx]mrylgxklxlalaeuvz +pvzfosmraqanadbjzzh[tpdyvjvjytynaonz]xyceynlcrcoamkoyggl[beyogipinpnhdbwegxk]nltqaqbofjfihfo +gfzfnhdazwovhqic[fbucazkpmigvubskbo]tfingbmegctkxbnei[qzzdlcbsvanckje]ydfrszjgtczjfwvfbzh[soizdivaorxfooy]ykibkbgwiurbmdvbbr +myghtswolcjafngtf[zutfrslrmtbxdzpzrbr]lqwqsdxcbzmfdhebdt[eaphviremcedoopgotr]klqdporitfjgvfdcng +zmpfcgnflxuqojtdzz[npdnxrmuyupjonu]dapxpbmmdmgibovzotm +hsjsadzjikypnqwl[vrftvjdeihxpipdi]fuxpptfybkuqfyjh[srrqywcihpnwwipix]eldexczjxodugqk +movlksoriejyxitxg[iaknxaszidebdyfxw]yysakcbvsslkhvwb +rmbwwdeselsgwowqdtu[wlmcyaelhocbtxv]yqimqwiydexdpyoy[oezsqbrkwrxxzti]rphzznfghptscxc +wjrkcdugygvotpovl[bifcvrbecoinaniafdp]gpwjewmcfaefgxlghsm +qthtijcolamzmodd[gfdgnvtlfuftsthhb]kyueaoppjvhsmmcpwn[iydmuycwkbmgwgf]bpdtbvrsxighdlqyzi +crtynoguhgrudlds[ijazuftctmjhihyg]zulfosdztpdpcsg +toqrbpaosoikfdj[guigmlanmpgxecbf]wslmvwzngiqhpovwzl[bzkjldxxciuinqxuaxl]pmafduqjiwelgrgqbf +vmqbwevkxcdbgrmtga[cshtkthlkgkqprzj]vbnpasrruwnckpirekk[egnsvjilwzsigenp]boqzfygrbptkyyvsy +cfndlwialijdidbo[ncypuoyqemkzhwoio]mebhpaowwzrzfarmrw[wgjkjwbohgrovurdcf]tdaitjcszcmisetz[esfxareaykafawe]achdtioidaxwmeguzu +dwelecgxyuvkntw[hcojsvpvyhsjezu]ytdjhxbjjjzmoxl[ntxoufciycjooraylrw]jsguitaddluldwku[ashlhstdjokagrfpcjv]qhkzhcdlqtgibdlzaxu +prhhogdhsokjknsxoio[fykuuabtpuqrbalv]vvyhpipdwddipihiz +xevwylfessbnioftxs[cvlubehyimgfkojldu]elqdlwnniimpsdbonu +wbfbgkeoweyrwisjx[hypdbiwtphepkmbdns]kvzvbqoouuwqfafc[butwiexkmurmlqxnlxp]vriycrdqonbbniewds +hjjreepqrxmrqbru[ipklhtqsevrqhilueo]vjkuyooudgwwdgpsj[bvtocxerejwvjyiply]atrkpzpzwoeoepnfj[dskzailalbbwgpx]qsqithvqbksqsss +rmicaeebjkhedguaifc[ibtqvtfcjjxidapofor]tknwydhzhvxnlmzkuzc[tapzhzqftotqrxupea]oqmetuqhmbbayqk +tsisneonoiivusbbr[yyjkxfjhhcexydhzgy]ksawozycbypmfwaqrmj +dbhzicyfmcmemujkavv[cyyzbusshtktlxuytjq]jqvoffeifohsjljfw[ftmvnjkjszltbksva]scbbarilanrtgbqgp[xcswrqudixdbfetmd]oerxhemedytqribhj +hnvwwadnhpiqzpkv[zozlerifsscpzjnqys]cysfhjxrfjvdzwwp[trflckrkwxugpwsyw]vltvkkfzqjwzpyk[qlxpwwgtqkqdpkdkqza]jkhoecssazokxfmb +qruxwdxoktymrlkoduy[znhmihomcayftfi]iawvdksycxnufbjrct +xkoknpwqhxiwcyskvn[pelivfbuweedqcuq]aanztpskjvvzlza[bjxzezpsagcgeyxifa]snqbrmqezeryvdb +jvodylhbqwwiijcnymx[iivesedjbqrdqqhqvpn]jtgdnsvhdqknztknb +mkdlnadkgkbtgvp[nnkhnvbpxoufuacfig]jqiilqtzqropmlxsc[kqkhzwgjpzpinaetnl]zozxleefishfngcut +plpqlkcayycnmqgg[srqmqmdornbtapklsa]odegnymijiqxfilwkm[dtdaizmqpvdwwrtc]hgquqndfvfhihcu +giejjddslecykts[ghjozfrjgyhmabf]lsiybqrbkmcqyefhv[pzmshjajpjgcbhneq]ljuhamojviphgceydd +crqbdqgrbqtgzhe[dpsviouwumjphhygivq]ugpkrsusfgbvzckzxra[izanoqmcpbrqlbwb]uqieftfzzafyhav +scdhccmlmbtewnhk[ujyejnmxsxvwqiz]ffzgxtmsuvhllqosd[xyluxilcsxgvcieiaz]ljohpjpzvfynvpk +brcgbwwhkwsvvpxxssk[euzdkcxqaptnxnrvavi]qzxjsccldyywodhie[kcyaexzhlocdbqwvnov]ckecckpbgdynsowa +jkxcumgjssmfevqfjyh[awomrgxjdcsmundgax]vbukfdztnqmipzx +pqjjqvhovocfxvtf[ygrdhpwgfcjsadv]kituhoohxudiehn +pbfgqgpgmkhchvh[aamlyufgsiqomrqd]ijpgkdykzqtvvjwog[hthjnricdullzfmpasi]rtkatzcpgsuxdqgfz[qudiysxyalvwskxxyo]qkzageunrxavmzjvj +xychyhexbshcocf[bcllbjrhshfpjdn]kqmvakytshsxiww[rcxmrqbahpuufrejx]bbsdzdqgawawxgzpo +srjbwqvczzuazrukca[rlcrsgjwunveouh]qzdpjacdwfzlssyxs[zhdfdosmhidpshy]zoedlfourwcznkg[irkyiphmiftygrvywx]mvzarvhbbezltccnr +jgqzrsqsbaeukqkzgu[yrsxgxriwpyrjlpvlk]yerlfdummxyjxyhjogs[srtpykziynkajtcp]spostopwxfdpasgv[wyxnlteivwelaysj]nilrixjiorcdoujxd +vtfrshcfcxnqjxt[qkqubplofpdttcpz]uvqsxsmaeswbmflq[pmqoilwznuphmnohg]wbowwnpffruiwxsxt +hcxmpqwbwnuddxrkx[abqlynebkursbfmez]aakfxjescmydauthh[zbzjjailduwjhce]esjveeultejuzcuqgzy +wyinzojxabrhxfrng[begmgspqgszayonfel]xbshjcyftuqfdhdgpv +vuyhwnwrhhghobnmsso[ypxmxcajtvwbzqd]mxmglbocflgqykybs[vroinedksynhimkfhec]vtiiamzjlkuyytijwsx +gucgfzgzaxpbfgrvrb[vzdpfjzluengblwm]valkcmtjmckwcif[qfddnijruoxnmvsqwb]hocgykbffrppoimgum[vkezmfvuejeykmuhsve]lugcuflbptxqinw +qiyibgazdkkqfobirh[aszmrilbdvrvijmz]smojvlwxevizbbnf[shfjrfteigwnaiqkp]bgkrdeuduyafdvklqd +euxkocmwyevgmpflmxh[yakuknewnjdpnhdbwo]rhqabxhqikqgekoiyi[kqgtjqrfsbfhfwtthy]dhjlubwnkogyqqeiva +ymkslptxydufplr[giqbnlqqatbetodn]ompzqbzmjrtruuxkxlj[jhtnsfsnukqcpgvcw]mafbvhnkkfjzpwttq +esksbtqfptuausafh[izxuyluohauavcizl]tujhzjaelyhxbabqr[jcteeownyxliuzkej]elzhopaawvtxacfocde +tszapaduhtauqdfvf[xowocbwbgyqyevuym]fongzlnggdhnhqla[ulapnnawghssfirg]ekgcajislaflfkila[rmmkmlsexgtgxlqbpym]ffqzfzcnmuifxybwsmd +uvtutbniagbgxyelg[zqfuzzanfygdqab]utuvbyknohhkgyfer +acqjbcjhbbrpjkpm[whoaesoequjoguzcz]alusmcqapkcgsbkref +rzuwgnempzphmgnh[lkundnoojtdrkti]xxvspbgofdndkrx[hgfxulqnzphcikwe]tmyxnsphrrngczazivi[wgtqdnjtltyjppzck]wgbdjvlzooehfdvv +lopvvqqhsgahpzi[ppmazimecryovnvxm]ttkkqyvsrwtayjo +zvfttfwzyzswyodn[dudhsomamquabhgy]ghamazncxlbnklaaobg +cblrbaialhexeka[rafddyqfimdmsawwue]nqfmlmidvhbpdake[jvczldxdtinugiizhfh]rprwwgnzrelfwixrw +tjbvzxfyokuidnlttlf[wsrdswnysiffeztzlv]ftuhyupciyzhcmold[tkphlnqiubjhxfmlvx]yezxjbnhqlpzhojdt +cvzxdelnjskzuaj[yrvavspquyeuvnkm]dokeeqzqpgrzhkfg[jkjvoaajttsrgzgqdhr]ngpbpvrzwefnskvvjp[hwmxtnmjsovbtfslro]qcyeeupaeuvnpqeaq +rosnzzjlyykxaumax[mtgxhoxetcskqfezo]teeffdnqgiznghb[ewspwrjvfhrnpvjhb]obzkpfqoexkbmxqzg[jrsmxennifwruawr]dxephcphlpxfexlde +tvybshujicnmxpgkw[liwvwvadpytofvtzmpy]gxiskdumjsbdoij +evohohxokbgyiqofbp[qluawmvnvrryhhsdrp]varshohxapbfbmkcdy +vfdixowzcmduksfbi[vodkriidjctnhkcswl]fwmbsatwpslxgpsf[slfpoidaqgbpemyap]jwawlwemapeplxhxiy[nbksmqpfqjdojzhorhz]tsjjvjucdmvkfjhlk +gvbegqsytohfannfonj[wnrhcgdhbeusykvxp]agoufxlccgsxbpuwzo[wvxazyhfneyocjtllv]geitasndyjkjpmnynbq[yghoooleyzscxpthkm]zpnikfbcjvnbwalmd +noeqmknutcmwwmtk[hpfdivjpmbdwtrd]klmldkobucpwfrwsv[iotftpgwaksfazjeqy]ncdrncsgmjwqmmjlsy[qwcpmhndndiltvi]cbpgvhlrizoebrrgg +zhdejtnnzgmzgyn[npxauoqmjbyviwhqw]rcsyhvgbblnwosstr[yacocdndvalyrug]zabsoslxjggivnnp[pzpjpxztpiijeoloon]jbgkfygdrwqvbuxlwqn +wycbzoymtglyaqpk[pvfqpjodiuhufhkfje]gmmpbbyayhlytpce +gwllhhyjfqdxindt[ujepssulchcxjwbcduv]raslrbcyvxgueavlmkb[woylgjdprggsgzwuct]eiknvynbmazkxyny[yfialkiqtlmqulr]asgswneidhdmgfiknbv +kjxsymaugpdzjnnn[kqttktvhxwntaoq]cqmiytzlkquqoma +iwzchfytihnzqhrihf[mfhgrsnvlvdywbkhdjd]oohqjzdjtvgaalomndy[udfkusdurmalgyhp]frbxekqhjnlctfzdyu +hwcjiwcxcssnmnme[xlzppuxcxdpbvewby]pqdeqfmdyqmmbxqiupc +xwuvppawdzrjisb[bmpeccjqsctvwyi]gwqpfhtubqauxqhfzxk +ugyyhsvvvfczgel[cvyerwshlahgplax]oekcilkxiqatczwzhy[aipcdcarnifhyuf]rlgnwufaczioikwpqsf[fpxepwhtkqwtukh]caswtmvcnphxrazer +vmsvqoheidspuinpzqg[rpozdnxdpfwuwlrm]vyjsktiqrpenvwaavmh +sjmvrmdtbmhmphcjwb[eeqqallxlkskzbs]udgtfrihnhybypsihmh +afdmxqobrfgjfwk[vpvemtovoprafzppvpl]qxrlubsqyijakdp[wupygbbbynslvmvli]qrzyjxhogpqqtjd +tihxbrlnfmzegwy[qdijbejptemrzytqfbo]lrvnawdgjwfnvtyx[nglkdhpoevpcrpah]qwykwzxclrohynz +sryakekpkeydjxueul[oiaglqlttnpiarl]esmhduixwxcfaoehxt +jypdpivjwglmavgez[wqspyqitwljcriwndi]myarfryqmdrzqsgwfl +kfnlvqfrqzfbevhr[eczqsuhqdwgozvytuef]hwbunynrglbixofeaa[pozsocjodzutnrtc]pfeercwfapxajkkgydm[msmxhohyjfovluc]kdrxkwutbveelpl +secojqrvaqrthax[eszcgtimvyvmdsftmti]jfjikyfoabrqdmfd[ohksaqmuinkzsppw]dxklblmhezdfhmxbv +jltltxwwktjfkuv[wjnkvtgzgmvdhbktnf]gnzjwbisstyuqckkmx +czcaualhufbajyo[fqfnrhjlrfruhgdenz]pmlkiidyhzlhomh +xjgjmbjsriykobqn[pwibijybuywbibhz]nziviewoncbghhtfcf +oamkezqllrxnhhzs[befbgrgnjxtojus]qkwusccnfhdbsst[naqbibvvapqhkriss]abihzpaqtolpkvow[xnefxrlcnsyhxlhcnv]pmtpryhgsotfxcdtilm +hvtrenjknsviucseda[bclufjqrovzyhiemnoj]gvgrolegqzonfkujsd[unnphajlgnfmzehlm]zksbscjjarexejpudv[nhpboqyxtdzxqvxt]iexgbhlrmcciitj +ctmjaphrgijhgtfw[gouchexnzedcdwhem]gxvcsadlmroasxo[qfxzjndjcapxptsfm]jqfovcprndleoqq +wlhykxnpzshszjne[bfqnfsstqeoahjdx]lolxbkosqsvolonmoj +sthlhcsbauaebww[kuuxmhityeazoeqfhc]eysvldhkkkbyeozxop +sdwfqlcpqeylhfwtf[nmbkqzjwbanvtxr]qiopzigqsdswvdvdxfc[gxpudnbbhnhkcrxdc]hdsdmzihjurcpbddz[rkeuoskwvfjeefu]cdbhfvxomytiopjumrf +synqjoeasvoyswgv[kqoftptbgzckmmsks]lgajmrcctdzjjfyxqys +trtvrdtpbtyxvqsbt[fibknusbgvujcxsov]tjqcrwopxytmxebqb +sspdfvcppmtdurf[ivsjharmnrdpvcoriy]ubgfhohkvsszhabmet[djncvfojgzdpybwdz]rwldjpfzsnejcuhkbms[xjaqwrcprvqumkdqo]xirjztxykkxjwqyx +viczzsntavwxmwjown[mhpxdxrklaskfrgbq]samdpaxsnttamvrmpx[czewaevsqkbaenhm]edkmgtvpcxtuscxmcqp +vefxgudwkxtjokrfuss[rgffrfokbymuwum]cjzqxxfduznbqbt[cydcmvouabvvxuxxx]irucyonzfvxscofisbg +jpeckcersibodzh[yxprjgczoerndzm]qzzqftprfevzozuyrj[eguuaxgzgttuvzli]fwtgwhdhlejjqvc +gadnesbuiuzqiafjcc[kwctfzdkxtdliuixxom]arycduudngofnpj[rmqwuilezdfcxtofsk]segxynmaclycgpsqag[hzptpxllgogeyvszlr]nyrltuncqkfwiiskkg +ijlecxcuexxcxunh[lqoxywueqpvhkri]hqbihfwtfloctkab +ftgauixyucigpbe[iluiajlhofsvzljeprf]aqkwgegblbxawmhof +xtxoyldwnvehxonytcn[sxrvbegltpbzztuc]xagvhzvpzpnxliwvdnn +tsophvuauhabzfv[ceqxhicnzewigcdis]iabyzmhhebvptodqcm +alirhzyoxvgxxtova[vudatqllgaqymtty]nivykkvsdolxggbuds +uruwjwtifwljtsu[aybwraplpezehiju]oryubhjzxyqdwwrb[lxtqbcoumimcvewzly]basnbsekbxxaqfjbvs +kmtekihebcvsgty[pwnqwysyzlkahwyj]dsysyduxqgefmlnqc +dsunyioeihjynhnxryj[dlfwakjnireptem]btowzqrniwbcpsviq[yynburxyzuktrnhb]eqrpujiikkrxhmzbc +chebtohanjhqlfrqf[idrxikrjujqopjynn]kbdsvjfvtzlcznr +papbfwmccibasmwyr[ifrhfmbbnvcenimx]mplwskzzmfxksnjehv[wallxrhfuqevmidd]hwcoktxdlzboxrjix +eptjqtxdsztdzdvkiv[vencdxzwnxxhvcmu]gdddumdnqzoxbzacf[xollkibylumzxclui]wuwybwkxkcvbzfdrfu[jvpshkdkgqqhazptcq]fiwvrgahpcruykbmowl +osetyjfvtypylkwao[ccxfjjipcwnjyryku]olmxupovwwllxewrh +lzocwgmaoypsigv[fzpaozucgautadgrru]hcakeugllheavbhiz[lgdupssdzzqrpaioj]opbyxmvortwdyktt +vvsldrdbnolxydxoqz[uixwbpbqrdstyzc]mhoawiztewjblvq[xkwujyclunjamftlq]eldrjkncwnehqmaike[cwsnbvecidbdelw]xjvnnvpbpadhqeob +jelludsopkopxvdhckj[vooyfpbhxotclgekyt]ombahlkfktpojjrn[rlbogijavtumxfvipv]ciihylgccmvjcfa +zflbtdvqtyigiwzb[ysoyrcmpuvprtgfjltt]ftpvlqunjqdweqjx[hzvvdkudxouqatuzy]kalrxusgoqzcbiahvca[tfglytzetcfthioytfb]deexdgigqceflidj +oaykrymajqyffwqfk[hlfppkcubhcbgvz]yejxoeldvtgitful +vmcfqulheyfuvbaa[vkrpgbwdyjvrjuet]gtfmaldbjcaiaguy +bdslurdjqrpwlmyy[iovfvvvqnsjqttjqgeu]ympnvldmmihjjkymcty[pqfnjveswpdougyxlg]pakkytgqzecydexh +fsglfnqwtydvgxmq[vkcclnxeshpvejzyhzr]xvlfwbnamjzqmzrrmxr[jbuonpvqbqtiqek]eknuvcuvmnkeprjf +nhfknvbxgvyyekeq[djldkdfocjbdaofo]fvvyptzxmpliiwkdkc +vdpjbeluhukxzcc[oewefpztueezwwhb]pxxbnmsfcgoxzmqyhl[aqubfnabwmguqovi]nappxjrsgdfqlmdpiy +pjnndvlkbgnbwarutny[jmklxmqttqpaijkmf]pqnqhvnsewmcfadxdd[uzwiexbboyfcflst]jsqwngfxfdmsxdxiobj +jhkcbwhnfsgpaqqynvd[abninwnkumrjgpmoaoj]zliimvruxwmauyy +lqqnummvihrlqxplx[zjdekkaigooxbjnga]tbizdcplonpsodwuep +jjgkskszndlsflsiku[lwkwgieeyzicudn]utxrgdosycuhgqyeo[sanykskfeywnenzsm]dgnlnzwavpmubah[qyizyckdbvmfnqx]gbzgzwnlyuscspgw +xnekvtdeeyskkpswfnn[kfnzkzkhcpmhwhpqsh]pfigokjarcfxlosd[cenibdbpdrsumbtt]lipwsaactrshnyybdjc +dmojhtkuzejsgcyedbl[cymlvwmnwbbmbgo]ipsqvepupkyccqwnd[ysyhuposaefopyfk]txytximedsqwqoaitxd[vcwwpyvatzbzyakij]xxdnjorbgakbuetl +ipgxfxvgslnignagep[tmuifmchyffcplvnolx]oojmnrsgotdeklm +ugzbprvzfnfhehgfttf[tzptnsaefdshjek]tvqsmmpsphudpqd[bzglrjcbbpfpplyian]umjzaxrazbajsapqnhg[ipufrslijiqrwlbgmk]kzkpbixdegebrhieeoe +hxmlffverhgfxwwaroa[fxkztuifvrvdruf]jexsfnykyaxftdbgbpj[xvshcnxickqwcefi]hchqbvhclinuowa +vynqcfbrogqaznjlll[kcskfyibyiadaie]otkjiwdfxbdcestcatb[uiyegmmwupcjzyonei]llibnymxwmwzzxlnz +bdjiutxtmtkzncrfbxw[wzdoeugxoqrhwug]jzqfkihcxqhszuuhoeq[rtvsfnykpwwiwohmh]rrxrwrcaqbfvtrie +kmqmgmcggamtiyhlo[utsphbkqmqkyzcwyic]pjbmuokwcjdqlrhtu +xpypokpqfoqocohrw[nvgryrwayzoilmftwm]nrsbscypdtewdapxg[vqkjvvmcrsrqiuuk]qwsphmcdaooxtyn[fvpdehayvcilrlpu]gstiqzpmufzxujacy +tczqngmfcptykxkfy[qfivbtyjlyfjeqj]iffrsjemxkfenqmzn[nzaheesungxbpxszdq]bdsoysfandtdhpc[cjisndnfnfuoqiqwym]cltzpdhbtiybhxyl +hnmvpwrgegmsdomih[wrnfmvvvwiyxghulre]zfxzgodlssnsusg +colpncvdwwypholo[wnxyprbzhmywlolp]jipzcbvsklxbkat[bsiwaewerxxrneg]bcutnstrcvyuzewzqbs +otzyetewozofrkx[thtnuafiqrakyzcpbm]ekylimlvvtqhhar[ycerkqaazvdcaszh]zrevfexceptxskn[xetwzbpmhdtdzian]fukjjozvlqluxrb +gkywwkcjseoagrwk[kufpsjbvwjewvbx]kyckxktuxshyxwih[iiuoznpdootgptb]jduitjfkvxwllgicy +uqmwvyplzgytbgqjq[loqigrwbnnimqcektx]spnuxxtllykkojh[mydgfcvvaxvvgsxzhjb]lwgulsodpyaltymasd +fksodinyocwxnnkaebe[nmcqsirsfcrhkmey]xgkiwrxkvbqywwkxzts[vfizjjizxofrzltpl]memfyylffvmevcrwkh +uchxcfotfekjecgy[ytrnfdhkjzdahluuz]imgbprgwvdldeixbt[zromhgwteoyuzcl]shdtontjnejkdljleq +ulvelydmjmeicpcdo[fqlwmnhxsgjhugftais]zgrnkcmorycyslps[oxapavnxbkowooiol]pdicbxawyqmqtyzgq[oxgjkmbusdblnqbmzqi]unuvfzeeobmpqynunqo +omrmyxygfmlnlpd[mvszaozmwrfqpup]zqdogulmykihlubuv[xdmdckgkvqmnetqlab]xmpghceghczgavrrv +yoatzqilyyuivop[ykxyngmmcmotrjlkymi]yzsqqgxjtsuavagzznr[smtoxkxsmqjlxmdzmb]cmcobacpxmkwbywd +fglceilfzoyffdjlfe[kezklbpwgpmhxuiq]setlktchqpqxxrnzxpu +ntbuvzwoqchmnvafgvc[zlauayjbtjhfywop]crqfjqrgxqymacsgxnv[azuwpicqgavrqhgt]znatfrjfqxwxhgzs +elzqwwboqgfxfnyfrsi[vzhksunahhykcdfswh]qrsqjbhxkrsmeszni +sdiicfwffazszasltbt[tznbxqxeqtlryipaxz]qgbmitrvubbsmhtws +mqkteepllctzakpkbu[gqsiyydzbwfqmjigtc]bbbxhitwhdwkkugm[muxdddndjbxhywyw]eqbarakixmyxhmv +pocaqbemhftjejzvx[usknxixfuklqkan]miaichlaiabgvnfgqz +rirrbedwvrscctg[icfecwbutkswyiri]knghflubjptlmwdr +mjfwnobmyoythiyje[sssepkvlhhrvhxors]zlzpxjhhxxgjnazcfvj[ulqbynzrmjexgadwj]spleenuncdpsrqwq +eoithdxjbgnbyyc[fkjnxenvoismcfuyysb]umbsyqabwxjkvqifbv[ymrqiqjoefnppoez]honsgygxslvsizfhamp +ffjdubxyvazkwhvsby[krkpanuzuuxikpia]dptftdylturndqhy[gdqlzihoqfwdpaqc]eoicjxresawqsmftfxm +cwcgopdynopgwfvgrbp[ikkdjijguwezycqbmw]egdllmqiilawuvz[bxilxeolqwdqmmuacoy]mgdvomzddskafqk +eiiutongpvrxrkpyji[ykswsksoqhqbvgnl]yquftkxgwginbemff[mrwvbtwcnuacsfw]ykskpjofajoangpf +rahyjyeezsvfqkm[zscuytqgfwahxdvp]okryildyuyjsmmvvr +xpthozpeiuyqbalwlq[tdzyiluslgrohvirzra]cnjwxduhfoodixkpeog[xebrsoiwtjrewzh]nzrzyfybbfvpxvsr +skslvtagmulcodbdab[egdeugynmziawpgrebr]ytyuxecnlihllqbw +tdiajsypamyewbeufoz[moewrbzuqmctgvqmr]icnkdhxomhvzgedkat[afztmmsqfznglpop]hahfonuommldeqg[wohkagbtdsmxwby]eyxdtuxeyfvrfdcnbjv +xjqnucbfimkvifudj[xtshlnaobzuyebfimex]ebhbavaeefqcvvavjd +vuhaiiuaohbmegfvhhf[nguvmuqeupygtvctfkh]extrclsbdamvglnxo +ysdrhjalujfvnrgcwq[bieoqkzejcsgmhu]obmmuqhrmjnpunpgeq[oskawgrrorijvmxpqoo]nfvocegjoslsnzzvdo[xnwcxjpqdeasuxuwn]mjkcuhwgktvchsd +vykfhogyisfyumjt[eutrkfoumrjyqgzj]ptlytdgrzrtshiy +ebsxgomqvzaaaprfmcb[cueqlexewblreiuzs]lzraiyzopnxupisokfj[rpdtjkxjepzfqwpga]guhftswcatwtqqz[fheshslcsaadmplqph]bqccysnlnabptrtls +eboueezomzzsgxbvf[utawwotuztbgpxpmq]aeehegeusiwdfjlfsz[ziejqsczbebkaozpte]mwkqbfxlklbvijtl +dovncfknhbcjicefn[heqnvtpizggkgudnm]nejfcqtstvzwatzeaj[iwdagahyrthvrqnaymz]nmznolwojrtdesddma +gnkxpvhbdibupxna[lxssiiqgycrdiikw]fpbcfcgaqrnobaodbpb[svzdlwqhmlflwui]yexwgwfkgzkejwvmag[ghflfwssaoeooakxxpk]nkvnowymdpgsiguwyuz +jheoazphamrwluf[lckkorhbrbrrxqm]ptwpouvktkwceornry[mojtegrvqcqmkdd]kfbowsycbpyiehrowk +qufdawcohwrknqb[mgpcppsvpiacqbzrwh]ixvpwtbgaexthqwe[slxovbgdrlesgrtm]dhddpmqwxxplbqvxad[lryxhwvmnhoywds]qkrhdumjzxidmutx +yusdbapezozrhjsrd[mfnmoctnmhdmefkpqbs]lqdxhxaxvswynqyx[ewzhsaccykeqjtfvq]dckqgmdjsrhuvsnoau[gercfplhujwazygnf]rcjpktzjjkohghwsqmd +oimpphfxsruowxoq[ncdlctncjgujpaauw]oxafycborpayqzil[huzidruieieskxfjvyb]jfdollmeywtmtej +fbdexkvmkvbsmytfqkr[hkvsnarsgpopkfqihco]witphhpuduxpbrmgij[agalckecqyjyyrvs]frxdfnybnlawmsrcsc[pnstdicnjramcps]gleulepthdwtaix +aneanigfwrkzohkxxh[ucuiwsuzthliyodypo]waogofulqnjdpbep[zvmbrrcppbiscclczac]fwctpdnlzzrrijh[oqhyuaklrgpsiotuv]wazemeupvyrihlxzbu +ckdyyvglbalddaq[yhhnqrttyjjakqid]jlhmafpnqupxrbqo[qefhpvcinhyzwtvzf]ulhrtasbwtkugjoipzh +nwvrsbzowmjhivq[wzyhjoehewgxppg]ilurfrdhmalyobr +qmrlrhbmhyegvyobjsg[deqoctrkekususgjm]fhxydpcmqstrssd[zpzkryziyeeuagp]vfllzbrkzqysusj[fgzaapjznvxkkijhfne]xgslyehnivgjwlacf +kbtwkduqpvmbmuhgw[zdzjxyujptsnaadgns]ldnvtcvnqcrrgdmifs[svvtvwhewsdazxgsi]zyxyrocrxzeacrdqe[vbvjsjdskdsxtefnnd]wddyjjxkgmsbwfx +xdapmrzaxqkjuoz[ahldgkmozbjwmztlt]euedbnamzopbnpt[pcmucmomozgealw]mgnqarjicsyvjfprl[swyhhdquxgsyyym]cdhvjmetmtkmpzycx +pbjjgieinycscdiobs[fyqreavhvawquxnxpxu]aazgdyvkdvlsjyfqf[yrnwyrfmqgcwmlzhv]zbzntnpmfzhauaca[qgefeedmgiwkuglwtnt]koefqstfjnjvlfl +pgbthpazqbeprmkylv[futhxbgmnyhrnobwi]snygyhmmpzrojekxg +qozuzjwhthxbsevql[jbciuqxcimcokzkuzcs]kqocmrrdmekowfkcf[nfjmyfiavwewgsbnjz]xoiowsvpahmijohcqf +ntutqubuhxoxgnf[kfvmpjlfxoddjayycx]gcdnaqzocopwfagqaw[fjlxtzmovoxonva]igucqjnidmvownm +ozulmmhllvwdvwp[aoqfeopspzpxjwr]tzbmlyrtbfueqhemg[jghoksscgrempcubnio]twnzcjioicyzpdquwqv +xmvyepyjxwyswemplmh[bdcwdpksksxpcos]nruigcwtbupuwix[eirujsaryrnafokvx]cmlzpxvgrjtrzued[bqohejpipkenwvhtaze]dovbgmthgpkhqrvomqz +ysbyfzubhzlfakjf[bbpybxuuimeoikuv]qvfceoexeaggllol[itoqxzuykwetgjx]vmiiwpdaesonetk +wrjfoblpjaaisaq[pcidvtrbpyywwfo]tnmtphgtitwlafajifk[xljzrwpjxjefxhkwmfq]fjesctkzoigeylcnbat[ftchankacrqowoc]fpbstrsmzodksjy +ogllmkbpstadkigydev[fjdeezqpidvenougw]uzltqjlanxvmjbfc[djxjjgymiahdsrguqtc]uhjzbbgmhcdvolvggur[ioaatnmlfejotuw]mrhmijqjyxeioib +gkmvnwoebeoquyzddrv[qsiediridzjhoxqsgyo]hsrevlgzioovmcp +ldzfrxxxxpqqajwe[qfbwtgkbpfftykwor]qsrsfypomvqozrihw[jgvxztruoxayecoiom]wptkpgvyrrbzvrxlr[inzygbyafndrmdjhwo]atavhspuuhjakoscder +assvouxaowizazddz[mplcyrqagrfmhayalce]qumunneqmgcqjumlyyr[nbdtvazalavaphpbkdl]ifhwfyhtoluqhduhk +jvdbnhpclubnbuwd[pzrffqsvzwsdmmiox]oxncblupxgcgizxzwqk[uzzeupzxlntouaxjqd]eiujtlsizaptbprwluf +xkqjkvmbkohqbqpl[fzjikqzfckhqjqa]euhqcdvcejpxzih +ttnzbewupzwmegpg[rwmfymeikipraohixzp]cqizvjgmnfpvozqlyw[aotszpssukxnowbsq]cjqezsjomiuwozfq[uudmrnbsgwpjxhhklom]qhykiktusplvbtjznc +hoveagrldomfoze[ywmtdjjqopenmqm]qvpjicyeznlfeym +uevhmwoihdeptrrbuwu[aicgbidnmgmreid]gmggvetrrwmcokjys +yrqrmaofofelmoxpewg[wmofoarjyntpilizux]bobughtzaqqrpdd +ougekdkucjsgirpulu[qlullmdjnkzkimvvlkj]jqhjyswrljnfkswi[mcjvxpehvshbmtwnj]yackiargospshqt[wnmbjhzaediycalz]klzlghrqnxqltkbpg +mvscfnpfptogupbtfkh[vvbcypopvppclyyjs]rghxlhkkskwxjegk[txbwshyykittluy]wiwedogmzwdxrlfl[iespheudeafnxmu]sopbobqnhcpeqrka +vppjnarghjumornanod[iruvsxbssvyeokpsd]fgvxooooasjpcniyrt +docrqvrgzaskdje[rlrjjojqowjgahz]ywzbjlysunkcajriaj[smlrlubjvujffejkl]yahnzgcldvxqugxu +mxhhowgjvvhisjxieu[yaadtkrdtxuxeld]uxudxctvuuwkjzhny +akauiqiexienuidqzps[npxzqticzqaizfqbwm]jsesrfmbdzcftaxlz[rvhfqiblhebjwepojcc]vjgzyhmlrxzpisjjdo[rdxcqiqtiqibdbpb]upycfngdlyklyvngtm +iukhpogyqbukfrc[omtwrciodyertinicyu]tjahyvgwceuqiiyjoei +ajiqhepodfuziofn[nuweilbnkfmnsrib]pfiwusvwdbuogbt[djnfwsynglfgcajflaa]erghhmedobvaltvjfb +qubbxpwzwudaijxyav[kbhadxlkqwyzhxwb]cdukwdsqzxgceire +dyoipoyihskswsmsa[cqrfmlmegzngpxfwvoo]ujurjagbwkbcjco[orukolmlyutjisrltfh]wcbxwkrynjqdbhil[rjmvkwhsbbuvvac]hhrcfuszusxhnsxavnz +mfacicwuyblqlcrbma[neamcnnqrldslsm]gtyuiwxmpkxtbijvyu[xybupqxpakbqngpwh]ucalmrhghtprxxube[efbigcwynmrsodjfxv]nhzmqjvfwmiovbvt +keejntcdhfyeawuxr[xkyziglybojfbeoez]twuleomhkjboapgbmg[bcbwbcykirbykzyxepc]fqwedycmvrqyovoiqqj[kgeospmsdtxiobid]eazviyzmzkgtcywc +odzricjacwsewcjd[vjypaumdqwkgmngyj]bwfxysqxlicvqojr[gyixcgtfturmeydy]rhoreeupdydkevr[bhpmatygcagiztnwtc]apzgavbokckosesptz +ijzusubrburbuqzrxyx[niesciebzmeqptjyuo]vmwqdsmavggtmojubo[uwlrhyhxupudswamjn]swxcpgbrgfgfkbxdr[hbiirasahgzdlorpzh]gyafmcksvzplopbqpim +sxzmflhsbatcmaeorvd[wgzptiosahebcdkri]nfmlzngrnvbncvnf[qzevmspvdoesophb]xwrsfymjufcjouj +prenzyptlpatdtl[owbjqoywsxinwdx]bgdxmckkyzjwfhx +yjytemvncachepdpp[ajkdubkmjfucaij]vzcyjqjnvtuorox[audqoozyhnawqow]cnpwcdjckzqjqvxpwq +hzvseyalkoukfinolf[mxfgpgohmghwjccoz]epnawldqhzzfyqzfpp +atbabqgavyqjunxx[csqttgezpjviqso]emshshcecmudfjmdpxf[qldxfxekfxfkzpfui]ezttimakrqzpfhcwe +oqasignmlcndcvxbp[bxwbzczioiafidkle]bmcmgkvoklibhutok[lfyyhxczcgxsqvu]dlotdyqpgqhpxadcl[yezngymyoxwjvsffsj]sotoucrcwsubsboyztj +ktzqueeahqrxgao[jngvjanyqsoegvdnqeo]fmvtmptipadxmdh +rebkyxyfcdnlwbsj[xlxsghzcrgcvposspy]urwgtqawynbfzjvjjon +jguufdsodnlxuagnrik[viuyxczwtweybtbblz]hspnzxfffjslsxwbkyk +ojkowvbqnnvkegqf[hfyjtfomnelqcznfwu]rtcfwigqcfxbpapt[yuwiygjwkgzopbo]rzqhloromfhbemgxtr +zsisflucwgbzergujp[jqsyvmevlczujkgya]jfpdsrlhydgwmmznb[hzzuuwruhanrlacxjhu]ytfzjlcelnmpmisixl +cjabzidrccarvsjw[gbitdfulhoasybqhf]cebzwvqlrdbzlxbldqq[pvftfahcvgbaoubs]kyzrynaxalqvazsryvp[drjarcxgvmitnpb]yrcopiziynsmtmyljuh +pnvzdxszavvtxxqzu[mthhvsdtderjjwsxsye]jzhdepcliphabkirqj[crabarxvdvkkxoen]axcdjyxgbwxkjeuygry[wevvugzspmmgbnn]pkjlcvgpffsluejumnn +uhwirqdlrbhktcedft[lvswaaqbaakyzwit]ufghayuaxgdcwff +xhnnziwzhekpwyxxlfe[zffeuqksqcywznifqrl]gddhmdlzydwdidcn +xrfwpuhachqutrwcqy[albdixdvplyvteboa]dzhcxxpqrzfehjh +dedxzededczqrhpbbc[ctsvvgtqggfrpjeq]auijpocqkgbnjnf[ufpihbtafflvjbav]msvyrkwhmxlujtrpa +vrfonzibtnkzotwr[zpqmjwxgrswxwvahtmz]nusxjvmmdexnxekq +cytbfblpyyujruaxifw[exowaoxwzyvrtyfma]ipbuuiopdxiopznxv[jyykfklmsilaxznxh]pvkugaxufjdwuan[npuehzrqfjixjekz]fuzuqrmjkkjiokcw +bjzdldvfwxxxefgtii[rwwaxdrvsjqctemv]hjilyebcdlurqbffj +bnkigptbdgiisws[nlczvjmonksbiyk]bfymuwukbkqkvhyo[vejoxoqhxognrgc]bpzlhxupauzewxvuqvl[netcbnacylnyltcqc]beslyhhwheplirltas +pgxzyeykndmxntip[dvlngmgydirkyojcl]hevogchhvwlumduamn[njefbfyhnppjoofp]jivtguydwpcfockqurc +bskokeuunevhkbiwggj[hkwauozybrrwhfitnfq]airyuqgrnuokbzsyclk[oypotznidcpxkhwhj]tvjlkqqzxgebvam +mkzhjtzjtzcddndrx[iuksqclypaohlzbkznc]ikpzdcmcvxotkdrxfq[wnynwueczbuctbeaf]zfcbatppugrpbwyx[mivcpesqgerjjcuqe]dsrdmzugwbepgbcqqq +mnzvtidskweiychtc[wurejipylmzbwmwkl]xgdgccxgpallpbhyg +ypomeqwcacphpqm[ofscrybteawrbvqhtxs]lpsimhrenerojoghoh +nuzlbjqzbnxmomrjlpb[ztyepzctslllsmma]uwesrgzxvgepmzrbnz[lvkavpaohbgsdzvpp]dsmeiyrlkpfrahq[pzvjsgsikunmeseey]pfplecnjxgjfxvcqzln +mcsalggrfrurkxsfufp[bdufquaaorjupnjtr]kyemyqkytctsbpsasyh[fkllkidmdhqhqsfnar]mtycxvanrloifsucae[lqayzpjtgmxvtaskzq]plpvcleipsxfsfjhmmj +qewoofcsqvfeqiulfum[fsbdmgmrlbrcxqbltgp]vsavhutuqxqqyguivfc[avtvqpcbkjaxsdwcif]qrlumtxtbcirpfwxe[ergapjfseuqeueuse]jhxdqaoociqplgjxfc +atyiwanxdchkpaorygi[zyjqciasgrjecnz]xojylxzsxvjfgqjft[iinfzfudroehnmbyr]blinjcdzwsghrddzqx +sucnrmwljzsvipqfcsu[ccxjjvekhikxdgq]gvgrvgljgbbbnqfsh[zyxiohdkgvwkoxzhky]jicebgslukbzhdji +mnbaiffupkfxpemr[uyzufdzkfvngnoogpb]sssjqfesnoegngu[pxoxygfniklvhwgfcp]kydobvhxtomntdmwp +hzpelembrwbqphxi[qtatymcowjkgpiw]qipzlxwanhtwkkyut[pgcazmneiprepkrs]qsylhoplelkxxtn[ojoblpesurwcjkzmw]ybnygyagneroitehq +qdnwpyegdrbmfqo[mpyvghubxywxodn]pdkygcgvqbigkxjln +tbmxtcbosbngtpijv[efwxjziaiumatly]uvivkwastbzmmtunox[kyffxqqzpvpafqlf]cchjkiksobzfspeij +orlelitjeeleenqlp[aymprhcrqopmcqpzyu]bxrezgoauocsjkhvzme +cxdedomcafoqgxw[fdhzlcuebxoykssqp]thbzytmnhjdmlcpwtrx +cumdrbdcvlcivlruu[sokvdlqnoepnxojo]iaeigxckpehotfixc[nqoqbomvzvvitunbfn]kdufmsqqqzebnrueau[pltgnudqherpyedgrp]mkglrgvgbxbggzmmqcu +nsikjklxfeoitvqob[vmbxlzqgdqmynzp]bplnmqtnnhvpvff[nmlhjuneukjvjkjgzj]xmbqpenxqpfxvhbwb +zlddovbifjiezsqz[crhesriswhownhf]clabhuqqnketuyv[vhtixbfjfdhmial]achmqaiunmuesmkkdkc +gmsuhcgelhdspxj[sybzfmauqlgkjogzrb]mgzajsyejptvpsusds[covquenstvxpnnlbc]tadiwlnreyzgxcsgmbn[nfcpdnvcjuyldtoh]pqfmdmbmcnkdisfmys +tjxmyqictefdozfmefx[fcgobkpwbcnpzgomkw]fspophklvonvlcbtid[mkfrgrxovqpbqoqkziw]ibgxvxumwutcsugay[jiaoeloiaxgxbfh]jykbetswjtedltzjnf +fbsmekoosbvkognn[dfxqpqajgzhaimtyoo]pftspxmsqteibgjm +pbgxdmfrqnwvdhxsfg[usrfcijvtrekavr]gwscetktrkspodldf[pnhvtgrgcppmuvl]spjltqxvvmlubbkf[ajpmhfmyqjobqoow]lswnfnklfdyfuqvbk +cawugksswvlgxdstzn[ezfehjoeipttibvlx]npuswjpyatbrelllxfy[fdbjnnocpzatmflw]pexjyhnbuuqwamxhz[vigonxrdzipivgdji]dnfcyndhowhjzbyijay +pdrksarqjvlrrcwov[tduyidcjcnzstoqka]umsllhkjhrlwvyrrbx +hhkxhaghfxwpweaye[zhxivrocojhgwgd]omomgwxksxanqhomg[tmvbqezeztbytpyk]qvlolqozfbbkebwr[ytpjmiaqomipdmgmt]wbwqtuozsvnodxsgy +petkkoaleoybvha[cedybeqszffnzygzu]falsgqmlztvovgxrc[bpbzewfubwshlvfou]unjsadlvpyibplqejoh[etkoencdmenqdxjn]pnpyohnpslrouhee +tjifcboldeelxcaa[irfakfvczturdsi]ptyfvbsxqidcarakplu[fzjzyxwmkpvczwhmrp]pkfjobrepwrniaip[pywzpfjvifhgxgbzh]xagnarcjotulvac +gszqyloltjqtzfbhich[qgshjjzqmjhzycjfkps]djlbecwdccxctkaaku[imybifywfkwtdzxa]xweatffhbsilhfdkyxa +xulziztgnwdhcydxzsv[nwmualmytxsvfaef]lfnpclsvannzeyxowic[lnmesizizcaeghofyz]tldjkalslgsebiahzme[bwteirgjsnquwgpupjg]rwzvvwdgezrfprexsm +kzfdabhpzfuvqzpvia[qrmffavoapeocslqef]cibfbrcmvckywojotp[fzqatyzbgmhjlgg]qjhlfaclhllzupcb +htzlnnigoezmmmfxuvz[tayvpakyoxxtzyltn]dtdujuuutdvtrnjue[lcoegvnmayglhdgrwc]ilmabhmhbplhvatdtz[jzpbyzbxnpvdmalyk]ysuewcjqjctwobo +mvjirrnzzluxqmdk[reykaseaqevebtkrc]jkfgzowvutbuckxxhwk +vgterkzfbcmcesethyb[utqbftidqiicchbhm]kzfeujqxamtqftih[eoarrtyorhyhnpvtmga]ylcodxbpupdfrute +jzgzqqllmuvggwwyv[tzyitevulcwevyata]iypnebqihjvscadoxm[mvnrcboulcmyotqqki]tueesgkaidhjeidrzre[zhtdipjtdehbxtntdjz]ibgvnjerjoxpyrcin +qbkppwaozkpalvyvf[eslfeupnrsraqxhlh]vfvgdbmkspbwwiilhl +ggppkguhwfodnfc[oicyrgagmmafiglul]vhglsdulvvkfrtydral +kicuvlrhdillifbezq[xgyxwritxmvnmzsclzi]vwbemwvsfahknqebvw +vboegzomiuaieemt[zhhquhjuaaazkhweo]ymvmrednlydsalr[otpjbvyujrtuxxplpuq]xjowlanxaqfphfbnrid +ukkzmeacfkcpwico[tainlxdpkjmedeyh]aloiqpxevbitamsi[topflwgohkxlaetas]andrdhnpgvoifqrdrha[lchoadqizskorafwot]ouoxmcmjdaxnofddqko +pnnepgtfvzijvvxcbk[vudouvjqfhnmocalmrf]ovlwvfwxryudapicoui +rkxvyikqysdqwztrwwk[iczynwoubxdxwbwnw]oxdcxqabwbdlxxghnaw +mnyqkobolicsbibrxvk[duytuwjunbqbmwf]byrnbtbzttduovxvbau +fofdxbknsklhtxlncbp[xxkpqekrnoikzisdzd]sxtseawjlqnpcmt[vmdpbdnomdzoqtirusk]cejmchbtghptuxvlmme[sspxdpjrfotirejw]hbecxttpcplbprhgnqu +fqbkapadvoyuujytwt[shtzysumpigydmcwkss]nqceoupxklfyswp +dbhrlyowzywvydold[jvffjbezzdmlfvwkfwk]dtdhnwdejeffgaw[emsqelshiiuklgozvm]qfnocnyxwolkenaaoq[jkiwedcexufqwth]qkzulubbrauzistyn +kfvnwyoxswzgegno[dbikkhvqdsegehty]jykwesaprpfogcz[etrqyxauilhcmeoubro]pdbgsjhckpzvbpkuv +vjcrfqndpcisqrbjn[udbrvriucsdujetfntn]oztgeynclidukwo +vysvtqeithvqslpk[thrgywribedmldzul]zifxqenfdqyuhwal[zbwvycvqgjutypqx]oaxgzslvhhiitcacvkc +vmyizqxdhnhkrarb[dmdytoynjtesktjmtd]muvbmtrhwcononlv +gczqehfmimgqsqc[imqplcuenfcvklaol]pvuchxxlhtkomyc[xlnhxnvtikshzqixhyc]gvrmejmkdtdjutnauk +lodynussigujruayais[ktzzractmievvkmhjyz]zbqxkpvmnrsegwc +nvdexfytibypqtq[gmjkkwpxbkrskcolj]whfkfuugcopbyboz[ialwkdpgfyodwta]nlwbvqltnhdnxpykl[fexwnkfjfynznmcf]fekphgzbosgluwstbim +lpmgreadxvlituqykg[cjtmfajbwsjohwovk]jdijgoqjbcjnuowrq[unzekrelkbjpmzpqs]ravapumgbazyscnzzl +bcvowpbqpmkgslvzgls[rmlllcjmnknhpfkncn]ezbxhnqcjdxoxia[ifkhknkieonsicgby]hatevlmiulgappqkzdf[jvwxtvtexujxxgdxanl]wcvstocdshkuybyg +dbhllvhwblqoorvnopl[nnmamtezbloieops]brqypzbcxxlfcqvgws[jmbqogkabmtjkwiy]lhrouaarouwbspentkd +zxrxfiadhqxnwoibkb[adpiddkbttradecy]eozpenaylhjtqlwo[qtogkzpyvazzeinpxxw]mjozglsnbnskvjgbnb +zlrexphchavfoxs[xkchcuxvaopujja]bkdxsliitppkzdiilyr +egizwfqcttdeamzotj[rcecwdldxvzitssmy]dphvxfiibhjbwjce[tsknmztgewuvcmai]lrrvupcgegnyhkrwnmp[rsxdxfckwdmmnbiaupf]efpgqegecmjqonko +ikdnhbshmkoxydhi[igxtbmlowljhwzvfrz]vfjleyvxsebiiwshc[fedmlcegwiimlpenksd]xofxlghgkfdbmhqdsy[arfcqdwqjqfaysgwdmr]gyrzltwzjqjlgwoe +dodoxezhtjlmdjgjd[nwymvwzmkvwrhfq]yawxmozgawmgvseotxq +osrppxcaroupzotjnc[ihgsbwgihjxyhdt]rglspvnkdzzavyuoyyc +tesoxodlthgyjlko[kdevzcptgfsnqlbp]rucwudduatnmdyo[exicgpzxonzphks]dogbplhjnywstfjruz[qjomksffyuhhiqnzkb]ymeobdgtcsblxpoebn +wuarhtarirxliwrzcvz[unefpvwrqsnzlqiyme]serzxynljgcmkmnbbeh[ibxgiwqnqnzszec]wvbtpzaquvylychx[oynbqmhbmvdwbzwpag]kzejxwtngvayeglocqr +hyjjgytpckgliajy[dwfofthghxucnptv]biobdtckvjbmofoo[grpvjhgzqqqpkoehk]wvkwkavjrcmawnzzk +epqetfblxhozpueih[bnecsbzyoqeuyxnhuc]kxgpnameztkuffn[mjaxorphexetglamhhb]srhzqpfrdqkpuaxex +xzahgksigbgoeycd[pbbgbjtxjfkrptf]bitjutwxsausvhtfy[emvnlpxrcgnlaosu]sgblxqbkfzzdfjqlat +drqmaccamxdulrhug[cxriqysutqqetqogmn]ntlhqnkrfkduxikxae[zzzfapmviisfyytu]dekxbweansnlrrhjhpr +cohsgbtzkuorrnym[euzrixwxznkzrgs]zkrzdjwridpourjhx[nsgrhgodwjtrxihe]fyhqouxlvnkqovbv +eudnjsokyjpqopqmspo[lygdzuqvmwqvsaz]qsfdvzufzfnjxzflkdj[rkwpjvhqwhoobkrb]kyyqnkhztwpjfko +ibksqrkftyysxggx[jfkwjuzaakymykesbpv]hrqkwwyvvzpyiuoaxrc[zqxyrgulrcixmdocv]radohjbdggmlzrbr +gjeuzydlizovnfjtqc[mmqykhbhxztcmycgkgo]cyfymkpciprsryxfz[zmdewigwxrkuqeuyio]xfyfbmtbssfcscst +quytjjbfdxlywabykqw[wrytqtdyeuzpwnaydcb]gdmsgkuwqkhlbfbiubl +hcaltnxoualjwaibig[klhpumuywjmgoeklbov]najjmwgvwcaqloi[plcsefenjborwnjlw]snremuqxieoucfuaikn +nnbgetxpcfabihc[zztuumdsokfgtof]nacllhfjauhywiay +biywdxyloeifpkfitw[syqupakwarykmnpg]qajyfrfcrcqqjeq +vmqqgxgubafggkfyjv[samgegnuzwimpfibe]wedvmxriezwrzvwu[cpbfohmvckgcrtfu]lxzynmskwpdnzwa[lwqrgdcvcwytlakeb]govnzecdihclqlnm +gzvexxzzfhfhvyv[gsqyprtywhxcmqi]jwgvbqynppmhonofkor +cinylclsqpelaftk[frijsczdbzkbrahsejw]gsfqcywfnpjhhxgrgu[tpxavuhzotceuxwbin]jsdaoqdvxkgarlw[kzfndalmklujzld]libylenfcnucwdq +djnlfkxyvgcciygavgr[sbgddpmauvhoevarmt]zoadbqgmvljbnvzhf[xqrcnrarvzvdatewr]ddbkmgdmvzwqscvvld[pepjqizjdutkvwulr]mqhlspenmgnamam +akmlmngwegfvpxpfc[khelhwvodxwvxgfhujm]loohnxfrcrfhunehf[aytqodcdwbjowoobql]tmjkmxpjvxxgilkq[aamongigaintswehsyn]obgraeifzqpfavxorz +qwuiuwfuzeugzisgdiv[buhztxtutnsjqvznpco]zchcuxagskaiuigtc[bpxjwcknmopwieo]hbetzzhqbcetcktckfl[seykohqtrrugiwlxo]miqgbifchozmawrbnj +gokmvmnenjhnlfsab[pyyxwdixtewgjgij]zifzpdbscpxkqed +gvomkacoxqruraj[chbvfmlpzvwkdbxszzv]yqqblegkxznmjwny[zhakhxejpshkllocloz]zejncsowxmyjfsu +kmzmakoecdeuwphlyq[bxkmcbxxqxbjxzvgcoq]wujgjsskyulinwafw[vrdhgjirbmpiimj]kdagywkfxucdqrqiof +rkncghhmksarghy[cfgmtyveyfgjikcukdk]jmuflspuchuqxmp[dvhjanbripgblqgnr]pituzbqsqolglxrprii[pvexlzrdlvxsmab]qsldfnauwajhmea +usomxhvbqmriwtturd[oudaimrmsngypdwgtv]ttiylejjeixntwle[mtantpbhnfnbqhums]wqqimtspbpwcwgkj +msngkjkenyzsuvs[qtvlzgsmbvcnuvn]wfsuejzjpshjwek[zehjcjehpqofzkvru]cumensmiwaqjbakgdml[ptzvzzowsxwhrno]qiuhenzhdaaigllcuu +tnkmbepgvirhbvhi[hsexgrjitwrdksqwg]tmtsljflseutvri +exwijntpbtlxfix[htpkfyxechripaeuq]xvwfuyghxwxtbrvp[futepqkjvqjgcmaie]cltxnelzeixkgoazvye +wxtniufytvnvfoi[lxoffaansaxwsvv]exyiiicouqllwtesv[cqjrccuswyqqscktks]rhxsosoakppbahngu +osponabdzzpakjywk[hizagebrkdhzgvfvxwn]yfzjcsylumdlfhybo[qnajgrkojgnyejot]qkjtwjxpzvqwpqmc +rzxmmbmmctzbvehcdoi[tmcjnprzcpovugdlvse]syprasycsjmvxassbn[cwoagxqnsmvchtybuod]ukdkctwlywpofoxjv[vjdkgcebgshzqchavu]tyoertdjnsrifeqcj +djntcedqzjhhzvwbbc[gvmvlzrakynemvmg]oyadknsynzeppoifc +zrzqcasptpgzkzo[ffriajdplzmjeaunm]cdmoajgelziwxhy +hzagilfpwcxkdqenlt[pfnqxpllbzquoolcf]uzjuhczilfhsagj[ziueohgoduamdfd]ttawzghdavserflte[prieusxxbeogytknpol]ifsqydaoickejjhfcpm +rtqyvbvkuhzobmmf[ceitppxyeeofhbihwmt]igkwtqtuspoesuid +pcesitgxkjevqvivvz[hsmjxsuljwddfrua]ihnilctbdzmqsiaval +vnauzswyqqcqxfp[rhmkxukgswpymqaccui]alnfshblhwmliptv[isrbkoxgplmzubfoarf]cfsbnqbfstksmyj +jarrciiedilomtu[vqmrvshnqymuafkghj]sywvhqlonkyeicqihj[tgsipywkjfcntsui]krjeevotdoupwxggg[lacpflaydmuexswx]eyqiazqhrfidzoyjv +tbumulwhnlrvcvo[dewrkdykuewgbmyv]irqalghftktpetbabmq[jhphvjrddugyhkzhdk]qlswcjdjiagwnzmt +jykxdypogkguezgcgp[aeqqsfoolhjpjpzoztd]ftypflejbcgcrumx +mccspzcjyjoeahapjhj[psodqsplydofbvvrlej]dfbbyflojtbjsdqi +gmtoktgpbyaljwygh[eznlivsdfskxwhqyvi]qfzpnnsismbslpse +lmfidqkfidudgvyfz[epwcdvjwuaevvavr]mzekkgdhqgdrqhbply +wtbxbqefbzxbxrhazgo[wmasevszdflflcbz]cgkzpwjfxkjjiznjgz +gwamjnltiyjwsqi[etpmmdxdyskalha]ijcwjhlkfvpmytrgki[znfqhfprcsifllp]eetiigtwrcijdonaga[jabwgtqxgnhamouzrrf]mgtwhdhoohpfjdwm +ftcvaxemmkhcgisxd[lfchmpvdygikmivv]xipougvfmwaipvymhci +dvbygqliriwcakpmata[wodhnceybjxjisagg]tvefxxirirlndlfiyyh +mznolsiotpeszsn[vxuljfxlmbembsn]ypswpswzasktioilmf +gyhdxvpctmlqklm[mggbzkyztsaeeanvq]osybcvddwhfrxpo[miqkvnbrkrpvdkw]bktmkbbyhpgkeygd[yujtsessfgstxaop]odzhouvvlceuftordp +ojudzvhrgmufnjvnc[kawgqqjkegurfckbhjk]yqescbxwuytnknp[vmpspiisssjvjrjc]gajimhovnrwrtzoj[qzifmjawuzgjittfe]luzzohfgmwpgtjegno +yrlihwonhunhiiizrm[hazgovkcfkwepjj]hylctefspjioxwpq +mygugbmyasgwwtuet[sqisgkhcxqxozcgcuek]txribhuweqphrccp[rgirvganjngcgmxcrq]cyzhzifqeqmohmxs[zbhizuadkcuqvku]otcbkjlcvrbrgci +yphtqkibqbtcwskaiy[ncztpmnmazsqtrpgipt]ubywagmohqvweqnr +ltkacxcgeuzgqwndmc[fgqftqheajrmxmwkl]pzguyzrannpdkmoiiw[rumhgicakfauwdr]xxrotzzxlznkviqssoe +kdteqbiezzcogrm[uyulaxnacehgkqi]vvgjxojcvaeuwse[lrbvujwaidbhupqqp]qzprzviadblrdjytct[ihixbmyzlchvqzok]ovatwjszinstkvkcwrk +rvcpwirzvmxgipx[ngyuzdsgjvtodxa]aqjkwdlltcbxmbky +nrfbnpazhvqoxufoil[atazhehzfbphvmmfmd]xavgaapdaangfvse +fltumienffdqrogcz[colltugqcbqjhaqovny]hxsyqefqrjpfvtyo +vdwliiyhqqneegueto[wromxahmpgxkedvg]vszttwnombqsvcpc[xnbuhhageytxqvz]vkqbzxqswjeqjebdkgz[itopywuifvgcuuthau]nwxlokywcfdmrmyf +lnxfcfoxpklsxhnad[tvttrczwyrwrfsldkv]xvoyvjxkqmfstppn[kyeclggkmleveqlw]vtvsxvvrprmxvdxll +bfbrujzleisjxfxu[drnbnoglwrlyiaj]pqmefgvscemrqgttdr +abezbjfpqbrtkpugs[iskmwsrwcenfqfcq]bpghsuqvcoraihs +lpmefpenkbzmlqgmq[avphunzetxfjsmmjdxs]aionmjdvqicrkkuhqkg +oovycvpryzdfxqe[citmqfwvesbtemv]dpskdbxenzvkmdq[cxebfoqzbkridgsxa]mdvbrwsutplcwvkv +xoagoeyhlcfwjijvv[vhtyjwosozccevd]yygksnlkcsulkxwnn[xjxhtcibykdzzito]vhpzqcjyngshmxvqfpx[nxmbzwbqntpjbly]nkrlhmjwwnisoslom +bngreaenftyseubam[isooaeaaujjugyacg]prqqjctbrrvwlknev[hsudwgxcmeoeklchs]uyrmhtzwgbwqowwk[durtalssedcdpbpj]afxgbeoposqwbjj +uegnvefthogmdrk[rfegmijatgpkzwygepn]rxrgtdntpivcexrghp[otrcktlhkoiuhzzmjrq]elltyvnqdnnttmxafr +ecfvyjfcoogbbhcfcgv[amtrrevlpkabhaqbyzp]njmrtansamwlnlr[nnxrbkalmzfustv]yzfqdnnicgniytkxv[hhyhbujjwtdwgfx]oayimcktqrvayqr +shkthohfaiuffqja[kypzkqszyejltld]zlptltkzsntvjftooga[nrevhlgxlxrdhfp]ntoiugoblmiyblfgz[etmdfpjnkssxxmflzgq]uameicduzizvskxt +zkbwjiaiaapwrtl[zmdjoypqpcoohwiai]zhutipipeeoaggj[ipicjufclvyscnyhyf]vjbdthqyehomdvj +edlvyecttfrivrrxx[zbxdriofrvcdvqxhtou]veptmlsgqmnmgydziyr[kqaicxgbpdvicogbiq]icpqpaeawkuqjpawg[anpqidabaxviwwnc]qdrhnbnwtfoshew +rfivrodvhzbdcbrbdg[xepcryrugrdvdvu]oktqcihzwmkigwdif[utknwrvopeqnznelzsu]jhlayryeovpwlqqq +kzpqjwynohsmyefwbun[uqijmrinjbfzhxx]jdmvhjadchyqzjtmk[fnvvjifdteoppkvwa]gvqtikxjgoxdqlm +vrmlvtiqtmnkhzxjlk[pimbbahsqeuifhipra]exmvxfelanrjzqzq[jhqavhbsdzglohcyvd]vdmxeuuxbceyuajxyb +qlzyhenvpnqlhftocwv[fgxvjjpwadeflhq]omyqdbxvdqvqwcwj[pvqpclzgyuxqsozsoiv]rbftgqwizitdviltxdz[twhkknisnspuzizics]yshtpvvilxzynzx +scjtcmszrcywnorrt[csccijdirjkusdd]ixqwjxqgigntissnu[cfvfxijajdfxian]mpzfpsctcrzteay[cqzwbtfbqscsgoulqv]qiajsnvyhuocfbs +auipynpqbrwjzlmzl[aujvitfxniudypagrvo]pssylomazqmizwlwi[csdigjqelfgzraldhzz]euqvrminyahycqtss[jeitaccwvctalfrl]igykfetkzrysfwudo +eqyjthcldnhfkmrs[vokkahiukvtrqhh]yaeqjcljcbefdbdvga +ffnlotzrjimasdesyvq[tdjiwphyoudihpfxcht]tryyqdjlcuqrvnqich[pbqacbutcqblosh]kwjtegfgffjejcs[cfpgdaeyjttqflljug]mmqqvplbayzjgljlkv +fmedyfuhqjbpgdn[zgrnmpzjzltwzzrul]rwbaljlzamjxeyoh[ujapzqljttupqeq]srsnomadmxvnplt +sdmsvobzqyyimoqxp[dlxsrcwlcliplma]ggjcgvaptysicxrf[nzbfjguguhgdbnkavi]cdwiukrzcdafcwvau[redyhialkkakkdw]tshgrsyjyhrdrgxfazc +statywcdcubhgql[dxaddykuzlbwbncgm]xvbcrhfffhovlkjwc +xwrjsohnxwhuxxgkal[drdarprpdqlmrnyyl]lcxqhtifgvumxhyfg +dceusydtgvoidiwvr[xwxdkrpqztimdqcli]isbrbjqiotgrgpyesct +dfcoyiynyqguhlvqps[ixywuqsjvkcvdgvtir]xjvatxxvkqxswffdvg[wgdvusxfyposefy]zsyoekezyjzgogrztv +boxxwcovmrwtvpc[wvswxxwkgrfjzspxk]tcupcgnxuowpndaycqh[vykbdrgegnzsqlcxfru]aaldggnttnpoufwstkb[rrepursbaqqdznt]yupovasycjtwuysfxtv +aferniqruinktcmafzd[zwmijickemmrgtqgl]pabcgqclmnkelnd[rnylsjpdxphsetesnsb]oansnqzlrsdzsoxufj[ygbbwrrxuceezoxmjlt]cdhxylrchoniesm +zujuchvijhqnzbnncbc[sedjhgvmlhzzembtlxx]ofwmzrlmdabvkfqc[uxmleezwssylqghgo]okpqtbroeqklmxntgk[ddzdtvmgfbrdwfp]omsfvtbuqcxuhjd +pkcrwivfpomxfofcqe[xrmhrperqofodgfdlt]dphiiahoqqquedgjrio +kqdjfvkupfhlary[rvlklzcmhrhrkrlb]ttzeslijskqjeeru[nduifadlvotzxlvmfzq]rjgajfgfcmxfuhh[rmrkzsmkejolrjgjnn]xosjsaspfjqyfrsrw +dlhzwfvcekvrggzv[ofqvnzupatpgzfahy]ftacvsvkgqxrqtanhs +owtfabwcaygijoy[nosyvwsgkpyfesucm]esecvhmcjzycmsesybc +paczhwhkhytwllmc[dxtpbrtkeekvoqqkvno]zjuyuhpzbsvzodpbrnv[ozdaihegoqeuihco]pxptnsdupkfgvmhruf +fkxezddxwnlzlarhk[mswldjncrtgjijeo]ioddubxtscouxucy[qunukqpvvgzpxukwn]fsjmsbjibbbeccux[fomhpmrdrozafwvs]izzildhimulujdo +cmoxgmdxxduzdczqoim[dyjnrdkyixdcdyqqz]ywngnwwpbamtjuhj[cyfwletseqzeesmxlz]olarxthcpvophvbc +jihdvvjpiawlurkpna[rozyjywumsckmzsmv]rhppipwcrnrqnqymjm[cjozbldvixcbzgtdni]nhgtgqgnwkgvtqxcbq[ndpdpvdwyhckolnoiia]nrpriclcqejmjblaoca +mqrofejeandcwdb[euzfcxvwvjgjsrjejm]zvialbaxczkcbamow +lpjkrutazbxjrsh[aaokpurkwyqmqcj]ldlutqskisfsjehus[rwswxgrjiajnzmyva]kpxjkjranacklquuilh[qswseahkaawgoqbwoba]powmdzttqqgnwoz +mtrgomgkttblalylml[fczsdkxnnhxkjvoxyp]qhcdlqnkhlqkume +ejaxgxfqzttfjro[nbudxjzmewgejjr]yettpxcyntlbldt[ecxxeskbvsmevezs]mwwceidvokbtuji +bajbfwkcbptthrpz[oxibvttbgfxxoydzozx]qyikbmrtebdqcxew[ezfeuqfqpkghozohpr]sjtwsvtsiuvulesw +pkcglwyjkpslkzfbbkv[kzaxrqlcpdoafrhw]crsuleuevkueuhu +yzvbeybjoiiawarzk[pchearjoaubhjushnuz]fnovtxneceajvroio[jjltmacrhiepqmd]bjwpzdgdusdlpon +ntcswtooxfxewxfqs[whcrtyxxvojtbhvcwya]othglptbiumercc[zjvappnrruptaqcnhtk]vervxzljrmrfdmgepx +mxylkjghptnxmngpxt[scnxrqcdftpsmfttyt]iqccdcdjhcdculfaxv[oypotbnuowotmgnutn]sqtevrkuolowyagy +ilzgxgodlembephhrox[ficbjdyoqsontgftgjo]eoaksyzlqwolxcwxt +azuhgtygltvpqybiuhf[aabjtnyzrjmxggpflz]dfbhxzxopayawmrehf[bfxaxfuuxmaiygdpohs]hjlapbinhdphibdz +rbwahitvgoeoydvuuwi[ipgxmdggicierzxfl]kfvwfixdztoxdsju[nmmixwldeahcoszjyw]exlnyfffpmrqmapdzqh[deqslgzpznbktvn]dalcyomluamkjamhmcv +clasxatlmbbhmpbe[fxjhfcsoxdrmjlhemjl]hiihjdiuandtorus[kkktqqtmzdzvonws]diaqvpvnyfndpukqtm +oshcmchulrthjugf[hhkphbgxvavkutm]emqhtezcshpfezmun[xmizipuebzhdblrn]btiszwdiyykvovlhjs[kgbllnxkvfymsqp]kordlzgacffdjyes +syfytdnzapvppsxwvuk[hssgmdjumfwcuahbzu]tjmijmhyixegulhwjda[obvfnrbrdefnkkxmy]iqfdmokbfvubkyv +ooyhsaozcfvzbligkh[aezppzdmnnebgew]rjipwlwyzcadfrcm[ucpdhklscwpzzhmx]rcplkjidmzwgldmbxnh +usgwebqpguedtwal[ucahxntpxjzwlkyks]rtkegixncuempbik[eqoxdwxwbougjjet]waqfnsxnwgbzhjas[rdjdmnzmkcoskhwmwp]lmndepamkrbrezgo +lzexedsejjsovjhhmzq[xdzmigtseqsprybxex]ctqumfhtaatrinmk[dfqxslvuwdnqimy]ilfphdggfbvvmuuox +ejomxwuqpakxbggi[tyaxtcrupbficckkic]hixqaeblbratemmv +brcadksonvcvrovnlcv[xqxceanurghlxoop]tkjynckrlxjcwxcws[iwjtchdptjhnvfefujw]bpibnujwktpnkwal +ozpqshbippcazgbjwsf[eeiatzwmxezmsphxag]wbmhjqnracacplsd[qqqskczuqsmsaffnqvy]rwexxbhvanycinne +qjcbuqeoxvfzgzkjx[nmjdpsmgekqtgrz]psffzoymswjccwlvk[pzayorfnkpiqsiwdksr]dqjsdpxbdypbofvjd[rteibgexrljensnsfbv]ywtfitjjgcqjqdqnai +eqctvrzmizmzadiv[nfkcjhlffxwichh]owulkigprckljfa[xwiexfzduspgkmamyz]dslflydyueutucbz +gaptucbphbcauhpb[inmcacncuhnijxba]wojvrbwisnpqgom[lholtuvxkozwvqicgqc]yfqvzhaxgbtrtpt[lfwlypvzebajjcrfg]jptstikegtittkncnp +rdmqymmuuvlqlifp[tunrfdqlqcskqzfn]mznubonmfmnddggsl +bpfzfmjrnvvwock[jfgazbkopygtwbeyfb]zxilzgfaykfbfloqe +jgoiehvyjxuigojewgr[wpejfaphlaoasct]abvacgtlnghcwjhu +givjipvjxzexjhw[xhnibqkmqkccsqvdbmt]axhurinkxnjahjqrpf[kpuvbutiwegcyjcmhs]xvpeggiwqjftpkbc[elnyvjrckkoudanf]rbetfdgudyurbhjg +llwritpzvxwzjcou[kywjmlrdgbptakqh]pjpxwtjfyvshsaof[fajaogkpjxnklwjm]tubchodcesdoseiyc +jthqitsqmtsorji[xbpqxddyptkjplwkirj]yatiinytqnkxblve +wwmxeeruhuctslt[eeolefqgiexdnepz]wtaprpghficxxhuhw[qivyocneharsphhqhe]wkjbvcfoalkjwbmf +mmcrhrvyfzqlcrwhhce[tmreurytppiemvporrr]qjcivrzqwlbravpsra[zilvcfakxnllharqhi]hqztgurarfrpmtxvdwk[aybsiaabiqtxvegkfol]rdposwuhdwgdiqdnd +bxxqkcnpyjrhckwg[ndxfglcetarccwax]ekgmeuxdzsevypla[lkyczdaqbgeusesaqpo]ycagugbwbyytiqqww +zyjztilqxzyqhnsxri[eqdxnwvdejxnxhkl]jxvbrnndhkizjqpudnb +jvjvdwddugygslqxxlh[khubfdbygyumlsz]klhfsjpeedjxsxbugq[zgyevzlwzhypnsjw]uqsfyxqdhtyhhqp +cwuvzqzxwsptjpi[ydwizxalwppbndoy]doilzhmzzclxyolblo +hvyktbbtisuoixxlbp[ielefwdbakmijesfd]ygoplccrqumknyeyba +byxuiqrkocycxolu[keirspyapzwoeqsioyx]uqbfvwfyrigpovez[bexwlugermolrvyhajs]baxemomocyoxynb[xmuyqtsyflylfxuopf]rjboetafmjgrpsm +tdklkptxgstlhke[rdmlbgaqzezppltw]mmmgqwlhurtjqygissa[mrbfvjpirijwrirqsjv]cxbsbwsckpmuelsrx +zvltaytdxmaumarpia[bczfhpdfxomflhqmy]sqijqpemvyephhbi +qmxcgorfdqsuiudpa[heapfprpzjujgtbg]mngqrqyywqrispeh[pgrhcnjpcunepjj]habgqhnhgbbqdptbo +blfcfwbcvxfvhxav[hgaehlcybapzhxu]wkcghbrtkkwvjyzqlr +knxtxqrxtialzcb[wnbtaiesijtoxcpa]bwxxslcjmzlmaccropd +xsuneruvwxpqovsx[qoyrvfdonvtegja]osapkfmwfyoyfbomx[dngezvkrojaiypd]iheegrvjogprspujlk +ezcdwtmyvgaqnwvir[blmpcywkvmzsuyo]zwisjrxqeselwsnbf[bmxecxmhgvutavznsxd]afuyhzbtlovctkvmppw[etavleaprramiwi]odmsaglweilbnemynpz +pyrbvyndildippd[hfbkkwkkenhpegzd]glkplukxdjodpmndp +rbnxzhtibohbvjbtlpk[eevybrbygduikemgg]vtkdqwgrzfmkgdpoz[zjcxbexbxmncrbrvlc]ezqsyjlbwumelgih[tselcvyztrdlkugvx]vgqjdcgybgbsddtaxaa +conkuduwkjlgrfc[evbshdudauhmqhejp]vgshestjrgoxjmtedf +qayvcfewuveyogr[hyenmhabxswictfv]golqmoruooihgeelk[kfizdlmpmizsnsdvcnm]dzbneckijzdnadazot[yfxhyaecuwdkwvzr]qhkicwsrsbzjwpota +lcztngoqsiwvfqhnwmk[zvfkipklnsakhcpzgtc]vyesgzpglksagzezcfb[zgyhivlzfzatvqlk]autcwwoipxmtamazxcw[efvcjwlrypkqgap]hcvafpyqabhqrgklyll +zedcfrhfzqxfsge[scfaefxzwalnttqmkwu]qtilslwpcadwvaj[npftppifpxpnvqtvetm]jiqtmeqjghuwqpsfd[txhrtyrvwdrazlnfu]nkzjxxiplnewcjv +gjmomiqzzhsrnbo[jwhqsbyluqjjletch]crvorftrpojbbsd[znqatuxgxrclcss]rfjdcsjwsqmvuphcvxp +mzjqzmseuxltakor[rjfzudufbzhemipao]vtzsxumzviwiqog[etectpaoshwzlut]osqieltnflfqdnksdce[lbueyqxlfuwefsuue]qybniqnpkdsmirlo +flqybxwhijhdqba[hdzrbuxakxxrdbkset]qtxkjzatvekzawmt[koxwjtmbgymuqxggz]auwejfcoiofibpgtkr[lsbcavrwgygsuqlksef]tgqgzvxnthlpacbz +eqtjkpttgwtnelvbwhn[hzjyymxntkqquur]qcoxaiyffkkitjn[wbywpfremnqzvepiqu]knvvkbrdfojkanufw +ezacebuuwsjurgex[mlvnrrlipcdywriyatd]zlexrnirycvouts +gimhfftrumsmvge[fkaxvinxrtcncwycj]lrnulsujawsmjsd[wgfadsurmhiydflwk]uyzksqugvstnkkybp +wbjxgkmxhkqyypyfha[sepuyxyvgozypvacar]xbgdthsqwooasishixf +tijyosliiskkmuwpy[cjqnhwnzbekvhlw]kltiqunfyjrtocv[aqtrefpxkelrjchy]vurioaurakqrwnre +kupcmifhcvjbkuhydkh[rvanehtiejcvbiholi]qcaksnuoycdanmx[zeoogomzpdwezmugl]nlcgeroxhtitayvctx[ogvmluodhaqxnrhenx]zjjfjsgyfglhacjnrhg +mcrxrkwvqoctzkthwzs[wxgrtuvzcyprxrxyu]xlbiinpyuhhzyxrppup +rnxjtuzfichyyrkpj[rhirkzutlarvceqy]hpylofjvreuibpvr +aucrxigpotylwkz[yxfeikktjcxbvnjo]prpnuvlyybvecrvxc[xtydsqbcxsadlfijqdd]abmuipmottbbcvcrfus[hbeqwrliqlaednpcbo]hlqboxsmzxdndwsgc +rxcqvrkeazdwlrum[txghdyqabezfzxngb]uhphklwpwfwlohasmth[rxixwgamovwkutpysew]nmvnrdggfypawtro[qwikkddzvvvigqllnru]idezdxcxzczrmzscsk +bvkryndkaaypctgubsc[oeagmbkzrpajjazm]oumyivtormkblitv +uponvppnjwuqdzutdsf[cysewmcnwvxemsqnu]trfjheetuwtyugt[iqgjwbyeyxrncynfuo]iayzdndfzhuvgfn +bbmyqlzefpudqwfrw[rdmdrgxiooxyvihppgh]ounosrgyslweaogvj +emuuaxuvfmiwomd[gdovbgoyoyafbeggh]swiemcjscimazwbcqa[wsrjizehkfpeimwo]lgvmmtgzqtqhgvuru +ufroikrhavhrurk[vbxpjvirmrjsvlu]voejxnvidkqgetnksnv[dbhrcnaybfatbip]wjpafyfywyqmsugaeag +klsplmpgaxtpylszp[pasiteibxnjmtzbokc]xpadcdaechphntvdxv +ykhxmwleggpiyzbu[zslsjywxxtxviladgg]txteqpaaovqculopkrz[awtygoizdamiaglxv]dbicgkaacrvfgyv +xzriccfleusulnlvvt[vtsussorofvupuwrat]idoigjzaiabmlbwhcas +mziqkskltbhvghsfuyu[aculbnusbqlnhnwpwt]nbmpwptnavupjxs +rldmlvadnumupyxqm[gzzzjbieaiupkytkb]vibwqcvqvybamco[jnitcmgcxonojznec]qsaxoelsuixechvn[bxxubbxveflcfed]pabprztdqxmocfkqt +xmpazxprwkwbasghfb[nuhgoguvmloomlgqyj]vtnakhlizbmtiqfqudc[ijjevcorrrjzangjc]eyasctcswtctxnu +mvdiopzywfanaqy[hjvcxnznslqhcqrkec]khqxiuhqkvzbfkog +ltrzictithutitxt[ghgxcrairpbnnoemvso]ekjiysoqubdndgkw[qipmdfcfxuqmolkxe]kxpapsvkobzmmbfiw[udpdrxeozgjdjhhnkm]mrpflzzjawefwpzeb +fdyukyewblhyjyx[jopwomhiisxnuerpi]glsaylkpbyxllgwmfv[rueojdekuaimcvkniv]witrkqkmzkyxxwlspe +uvfhyswjtnyhqobzfpd[nhgpmqskcogyceairy]xowcrcyirmuruxtckh[sxddnsiedqedpfiykji]kpbzbugmaleqxyl +vqqimxfbueniooe[lzxzfjihkygecvzvv]flcrirjngewtumxzs[yandwyszuzlcubt]dvhbxvnywsqjyqhqo +lunihongrpvpalzq[tkzljqepunhqznyptpj]wkipnucjkldgsubida[tdetpgexmnviwswpt]pimhitvqrrjvoqwis +lvaekzofnqvdubfrsk[lvtmacbdzydqabjkgxb]jbxaasjiawptstqogi[yaenwdrdllrltchumxl]mbpslcugeuhqzgqz[uzducptflfkjdrgwrm]unxbcxdgnoykefjtzbe +eukrbtlorkrtqfab[lekqnqbejpjadne]aelfusrvaapcnpjxb[wqqogplrxvgemxek]pwvvamjmbsszdamm[heouyapzgvjlotyuhxw]cbpecxzwilyxwhez +pggpeuuyirrouzm[llkjbvwilxuvtyeiit]gupoanjhyesnwhpltp[ofhibtfooiebglzhday]yvjyvndeuucjrimrxr[yeylaewmxyfcyuic]csntkkssbctgwdwjvw +nlytteqqgkalpmrc[sbpxcsqbctzpuaakx]bsddanjfxabwiljmlxd[ruegjrpgrmhyfoaz]onwknfhnjitgtubtckf +csaiacfvzsbxgthemo[npnzkvvtguwizylow]htwpxuzhyqiukmldt[yhdfdlhdjhkcrlg]ipoknipafbwgxytfpoy +xwfcctwnwjeskqag[lftxxdyrypdbyeey]mmkwkojnqpaohjijh[rpsfpligfoulumlq]yrosewdrqkbgicvsrmn +vgmwxvnqhyblfpka[qnmplnesqondpvjxd]xkjprddmfvabofu +btynuvvabcnisxbqvx[xlnbrzabytflrxd]fjphbndajvoiwisptv[mxqpntetsskqjij]hzhipxqihobzzzq +xehxreqkkfjxipbdc[sxcdjlkmlhoxvdy]gahtakcbmopomka[dqxdvispmbnwwzhc]ypvvjdrhxypkpqyq[ibpufwgxwhokarghroa]gajqcodcioqeicayace +qelkhkmkmustwwbgnk[uvppfsvufazoogql]rigakcrbqudgyvrm +vclqaggfqozeeylqr[ozvvsgmagqdrieg]kwdavlebaonurwu +cospfllecgkgqtzpoda[ygnwzkxglcitxfbpojp]fmjziwhwyfmlgymin[oxzpbbrgubhmnhepmeh]dtgwodfoyponzkgkq[uyruiqiqeiosqrgpd]vzqywdxoywfzagvlvgz +wmpnhrjhmrljibaol[lkgtlecrklokuufgref]fpbroqptvihmmvlapv[kqyhpvvnziiatpmysj]ihgvfldqjawqblllm +epmrcmqegwfrwduzatk[bwvgebhmynydytly]qkuxfjmlityuqpiuz[mrcbeojpwfmogyqtx]fcuwcopogsuxrwcmpd[fdjccinxufucskung]djrvwtngllkdkzpskbt +ioysscombikdlfl[rgvssthnjkjyqbus]rxxgsfkzthnelrlqi[fmouezssntzpkpvoz]xpedmurwcxbmrogmqc[muvshqttktmhppw]bcaksnqurrkzfuvsy +yrlqwmybuzttmta[wduvgviyivhsbsfoaj]xapgyafdheaypmliw[wzkgiqrgjgybkqlqtw]klbbzruoorgsbgnoh[fcztvzhzdcvytmx]xfuwxklasmlzdpmd +hmlxxegorjkxmwub[szfpjebirhpctwhqjo]jhmflkbfjehpcmmjmc +izroszkaqdimvccaj[hxneogylklgpkhnm]gxjrzoymwdorjxfbnfd +zkcdwfzlffkzejmpz[wacjjgvdswnetpj]olypdweadesbolvc[rtyiqvmqmwlyirldxl]dshmdsgmhyvljdzucnm +ckbqoxrgztxewnlzt[xmndrwzvoououidh]natgwmoyjmlqxspdouo +swhnzjzdspsfdfe[emfqxuzpzupyqefdh]oqzqhvhkedpagibvkae[rzlobzqrpuvpkicb]bzoliytdrdroreles +iztvetvxjqpltvkvsud[zhifpxvnvfweeau]fdfztegddzegjltcfo[cjapyvcsmyppiovo]zidpbkafpcfkzxdwv[moqbrmegacmdotcm]hspyralgfmhiyvxa +jdafqreeawkefqtdyl[xoaybwduvbepfdfvz]gvqpeyxvzvulrjt +pddpgibqytztkbgsuq[ymujijikkoudcngw]beufjijpbvnumuim +ucxbhtwexygmrcg[uqurbfgrteletvvkqon]dubwuxxfagugtxsnrg +wjsyuzatnltcqwfim[kbcgsyuzgxxjjvb]lilpvgkqxyzrpaj[dewurgblijpigaz]prryhpooioetvovtskj[uoskeykuyinefrz]dyyodskolistloiwsje +vjdndymndnmoekurc[jhrgpcevpktrczlt]xwmyfsfdmppvxmrh +ncotkjbzckbxpvdynq[jeagqygsdeylrzqct]putohmklmktyecovyk +htryepnqeptnntbvy[ruetrynxkllonponrzp]uimyvygbbjskgfuuu[gossoavktylxmncyyfs]yotrlpozunzomjtc[tgoikyfrrmlvyvoe]rlnwzyigyvkhequuh +quaqpykfzgcsvjvktt[uewzjdwgvbqsjjqorhi]jqpqlbvwatrkjwuefhj[qbnjoafobpfminlswxz]motffatnypzjzimkskx[znplbzndpvqyhyiuxjn]euozgurjumhmbsksaqn +oqwcdtnqratojpa[tjzkliezitfoeej]jcmjzggnpndrbcdt[vmqdzdcmnaukaulpxrh]jvhftmpjndinconrd[jabrequmwzqgkflxe]qfbpwimzbdaedtyll +dmojpwvuihorsnuuntz[jdyqngvtlytqqbgkhii]cregynlhfgjwcnep[rtumpjtsmrbrblxlt]fwweoejcozelkas[qjirbrbultjnrwxqgnw]crarxbqyfrflijjqvcy +qjjmiujbippvbplba[rgwtrkyumzpcfeli]wzcernyldinuinn[vkckrhdnarhuete]lbxndnnigssqlvtd +nnqvkwawhoswydu[vyogzkuofpiahaccjmt]iqmnxjlbjavnuyfupx +ucnygbobqgvuyiuhxje[fuobokgfwbvpqbfiyj]jxcvhlictpfkaour +rhuckpaaqppfdoo[wioieplfptapozwb]uoiohcdkyohvsjiis +ewqoemggcqdhnrmehqg[mnekdxnxneimqudm]sjjhuhuphhusqtmt[mpbvgfwbhdiedzh]qsixlalnrwrbgjvi[ncuapspdwulmdwqva]uueriochuuievfzbt +jsuomvkrvqofxwtl[nyuglrpjfuonsdktpz]mgejjewvakggbzr +nuagdeojtvcbcoethg[dfrjdlokuqvyzoccyd]jybqgicldznxesoalgz +drmtftzvxarkzim[eqfezqeviirhllnne]qedeseblbyjtwswj[rpsjqjbxrtzfazlikux]mxwswjacngrjggmpjjz[rrhkcjlsogctsnm]eaaugmowojdgcclp +tbzffdcdmjlvzjo[xejdjrwbyqiocuxeiq]oghxfuptfdpnxcoluz[mrampxwfbmsssheliu]hfvydfhchubogir +juvhuklkygekzbznki[wiykilvlzxkfuqvo]lzcvkmzznkwauzrh[jrhmbyqljqnyijio]yrrxyxcjlyeratxp[fvpuvopxdcpjjqdlez]adqimncfauwosnuu +ukltbucihswauod[bhqaeqkxbwivywmt]qitkxnmylbyavvizdhl[tldglmhmjviujxhmqf]tpejtzahvavzgxdbuj +fqtildszglpqzzjl[dgbnuttrslrulraavu]adjaybskolsnapzmuj +goaoupqphzoejsqpqd[kmcnaedqlpiihaft]cffsimwkqvusstdj[jnkdxgldkvfyrux]ygigbtjpwzzuyzzpjm[tklflcorajolsxozxr]oguklnturjdlgnzokbc +ewgkzbnemxmcxgkqigj[dzacevlmkuiyxlgqnkz]oxvvktrcmrahcvmlnbp[otrfgbaaqmkofacmrlw]etrmldlvsnhehvjk[ldvcxxpdqmgmnmrw]lqyafdemdlqcriwh +psonarhezabpfsifv[uaqwtwobaexigqnc]fuqrrfgtwtqvbnjjx +jzegdhrxnytavmx[kdldajeatgbqscvf]bprcipjdemanmczkt[piosrwzmzmqnwkh]hvcpvmuoblvumniat[exkpmlxhaynhxvrdmgz]vmuoxjinapzklxaru +ovgbmdielzykiofb[oiujujsxewzjczsowk]ptlvujuolzevdlij +ixubgymonljdliwyflg[naxmhtywscwdgncnhkq]zikafaodhrbjpslz[ofvxmfbsoijfofozrwi]ieymceoceiohwaxs +kyindqkvkdulbxbu[twxhaiaixtafaydx]iwbaxohuhfafreuc +sirqeuilhguzjwoildl[ddldmsqqierffbvftq]xniqqnqutqzclhoj +uyjikikqsxdnvvqptpz[ymhsvvjxoijzkftht]hmcmhhdmmxkuzhfcifq[dwoqersxcrtdzdwa]rfxvekmjgrdfutfyrc[xhbfbjylhvtptculh]lbbwcmukfgskjvhyrf +ohiiukzjxgigfnurxv[tqsjmkobruzafjl]nbsznnqdcaxetyxegku[ngbuxgnqpxnweesoxuf]xlzokactshqnwjbpzw +xpixpwufmmfestlf[chjkyywtsoksgcffe]xyhkqtytuuazytydyw +mjeioloitmqjfxpxk[jrrpevldwlolkfoaur]ozkxincwxwnrtwqaoqj[bowfbswohzbtdojftd]coiebgoxmwyvcsd[utolilugilysyjfi]ivzfjbjdkrldfxv +yoydqexqgijzgbxns[klmoyhlynafcjwhgllz]lmblxlcbdxnzpdyfxuo[uqzaoedsewctgaplxay]acoovzqekxxjgrh +iinmymsvhmzyqnss[buxwtdshunlxlfjbhvx]tymymgtvwiyirdt +jslqipxcivbgifjpn[qkvesxvurjlxpxoi]uiskmkydgjuwipynyhw[ehwnfnirchutzod]hwyrmbmspvyxxcsbz[iblijoorvduvtrbtdfx]vmkmogtwknogvxheid +ygamayhzabvmjweoojx[iuihqamxpamebyihhcy]shltbfotaolqije +zfqtclfvfqqbztnch[mllzuqutsrywfxdahle]aivazuuusuunrnwoxj[zhqqwnbilfzqmow]smfhaitcdivwbhqsfc +yyfiotslsucmofojc[xejwcsxptsxvlpik]rlslgphlgfxydgu[knmtespszyxpghrw]gmbmvaozgrvqqeeqg +pqbjbexaeyakyaaxi[omgcbnluzwoklnv]ofuzblenimvaqtxjez[vcxbplpfqwpzkftml]cejegegtppicmmbu[yluyvzthmacplsvwpvf]layvotzubjmgejnz +ljuprbgycxrhdmghqqc[nlrcynvlolnnqssdg]xhonbxirrxorjuzpujg[qlvlvpqpqtwjuneh]vikbwqmgwisndlqrmcg[xhethlrfkbthdmu]dckjqdbrblnojcrzurr +mqutqmdwozuhzwqqxq[dzwzteljtplitdhar]rxghimhyqxowhlxv[mlyoqapnlnyyfocn]vivneyldkjcptbqhp +sjhqaabpeywbipcxpnq[gowomrhpsyrbprhgy]epfpwebswptfcwghpus[xtyuymkaubtsklja]ymflhwvugjqzjro +aozxxdegoqmyscxet[ssyqfwkxxcuazrt]jmzkmoouxevdffhmv +egqxowrobuloznoyf[hgzcdrutkfegvbwehj]sbqgbkajfdvhylhy[pbyjyysgfabkqqlklz]bmgtcrxghywvnlfvgx[ufqpfqavzhnvbxqjnb]axmsnnumwpxscjufqp +tgexouwlvezphimqk[akxteehqejbqofh]gqaqxpqtutrxjdwh[mgkvyppcynonofl]mvhwhpweeutuwoh[ykvtgfumeptgawckn]vbxioamtwgayepi +ehwlukysindvrores[bmlmhiwontkxtkvr]qdadhkvcrvpfwewnt[qqrjjvoffqmwzmnkeve]iylhaugqsafcgfkzuqg[qlghikpisieuexn]encddrspyqffsprdz +emhhugkpxoaimgd[gatktshudmjikpvm]hmdwdegfbdunpzqy[kqmktubpxtauvts]eixsnjdzhdqllhdo[ohpbpjtlcocmboouaq]gwkzaltcrojxdxfkr +gyiflvcgrvflnqsfua[govhyextdputygvvn]mpazvdcrlxrozfyfcsr[lktddzwjgtvycwryw]jhexlibwfeiohlfjfom +wvnbjqwykgnpujeos[bgpgcsvbguimschbxzk]fxlofwgixrlscmgdpa[rxjjosjniqheyesyyf]fbuovdpuwhognclgw[ftpcohfizteexczkrca]caihefjjiqvypct +znsokldvcjpxjog[mmkosmhdjarmlpvp]rckhnldzjkcyxhpe[hxpzqoeheamnyjb]xpwcusvvjufgmqpjd +wnfvoxftftdasxxvwzf[shljlydeedkfkwjzrjn]zoiutacwoqmzrtft +aavzczotsjkzjqd[spctqczcqcyjbch]abwtqpotbsyxnqm +psaxaferpdjkycbefq[xqgdjlcktplyirogu]ayvzfrwshchgkwk +nqezrycwcuqadjxgygz[cqgfbndiaxmcigiglf]miznonmaygbxduatm[ytssutmaudrdfnaje]vwvblylaxpzyuqokqw[jkbbsvkgmwqibzp]rphvqqzskkjjykrlrl +aastgvboysnlkxeq[amoiceiqwyyzwizpra]xvnidsjvbgmwndyvqup[fqmasljimjciejz]vsuaqkawwzcdegslhw +kroepfhjfbtngclblv[nmqbwnzlppwwogx]tcmygfjunqozmnwhv[gnykhdptiycroiq]ejwqgdblbwxhprzuwww[tnfzvhsfvbgpnjdn]dxamipqvqyycujyqlg +nmczyoxdczyqdnyzlo[iudpmifsntjgaakwxj]lbhyrfcescrxaabp[zpzkolmrfnnqgrlkj]vxrynwlcrmuqomi +ozzsbixefedyqugctr[ehzredumaoouoqmob]ajhvlcgqyqgpphtwhxv[tnvtgncjfzpsgewcd]bwolubbkpwqqeoayo[ugtsozzakczenvgjtg]cxtduivacbeypub +vjkbvjmsmwjqofeiq[qvwfansyyzzoxti]zuaejbqegivwayycbpw[eeiahaseruwjsqfbqpk]ikghnvcjvtxtgcd +vivrgfiukxnbynsqp[cyuxfqupotifxozqnc]iobeautkmsbtwovbrdb +gmswnmzxtlgkskz[ilsfgpqvhfczowcgy]jgbfasfqdxeckkl[bkknioqgtrirutu]mnwvreyzozmwsikmrq +xvcbxpcxcekdkzjg[xhaezauemdknbbihbzk]tuuyyrxavoectcoudg[jpatgaisirkdlyuzul]ddafnkyfhdaazptd +wjuuzneefhlnvmesby[zxqqpbcrljufssq]mehwiypnradpyar +gejmupwxgpbfiugsx[gssvhpgjkbgyqdgvpx]phhxtbgfniztdxs +tbcbksrhfnvybudmqsa[janytibukbknmcv]bnvnzoiztqsxnxvery +zmcrbfzmzecldlunt[nizsuoobvamfrlu]pegsxhninuqxufq +owgmknvhkuwplumklyv[tpcacgallsjgeuf]estbhqisggkmxcrxt[cecydypetuklwahrxs]okdiwhdydchkjhei[tpunnntujbzwjwrq]bcpxsvagbvvxiissg +zlcfrdllydptpnljo[ysyvwymstsmbjoy]ukwowlyltntxpnvp[hfvczmmzgyhvpfvph]yssagzxajdthcxea[uixmfqtqbguxqsk]gfuddvwyinlvxcq +ifwsawgrffgimlcwqz[gttlydqxzgwcfng]uezrozxqsrgoxnf +sdzmakebdnqjulckb[kpeetbjmqnjsxypx]fattzpkviicgbzxhtad[dnnceupusnyubcrwoa]dwicwgfuccxltygmxe +bhvftjhxhpxomsyawu[wszezzsyswrdrlqr]rhvaknuzoopejwnmq +iddffrsryqmuvyrsyd[klvpmmknqkqbnxuew]wnsuskrkejoyetzlaij[mbxwmnqnrfqexoeaml]spyxfzlrewhwzeo[hogofwwdkwvyswdcey]edmmnhtfauckalllsib +sicisnsqujdgmbdk[pjgkpjtwtzacufridds]xnoqmobgoaojxuccvi[akyizulhrpqvdzl]nuoxcrdvuxdtcwu[ejfydgnmckcjqhmbsx]lwbbrynehycwqui +mmhwekjgjfjmmimta[gctswyndsthdyhire]baajrssklpzxqmlvke[ltkglmlowvpviklmnzp]xqgdcynvulmhzani +fcwuhpcmcmusmcmzsk[daajoebedzmqrvtbpg]cmubtjbrxkumvect[swemlhyklrgynkae]msxqqcdegnmfewkn +ohnbhxtnlvqsttsis[xibvstjbtnheqqqshhj]nlmikiiylisznwcq[dizyuuiuwhkhmtrzzg]fjgbjwxwlkcoqcgogq +gkxejlwkxayppjevu[rlwqikjiqcxcvgw]zkcjcopkwedfihrqzke +gcakbrxzymhacsg[edvagfjmxhrrytuxthe]mojwznzdsgxznkl[asvccotlewjfzypkiex]gdfoemtsozpsiayo[ryiippkmjzthrvwl]popxgzxfogjvgxry +cjbixfgchamiiqvfk[gwxgfniaznjuurx]dszifvjwbmjffzn[dntqokjkwmynchvwx]lcxwmevpndfqswnin[jpwcnfxgzfdwcgsx]hxrfqzflyvumwksagie +ptyeunotosvcwam[oimxlvevjqkzxlucnx]kzfesplnuzsakqhl +zwhvoxdolwwwvxtprp[mskfzikftyxuifscxsz]poodydwynngwieq[onntfnfnhsbstcccye]fydyxjpspwpwuqx[cckukovhxxcxrkd]dpcuytdrvsgrsbfjrwi +mgvvtoestsdfrrkqdp[jsgddzbtstbtgwcz]wbewvyvzgfcitls[byvjjhihwocudzfpw]uvswjmgdmezggeklden[zomsrocssnjxwxunet]gexqvwznakldhnds +msfnmrvwrghyzjkgzfu[odljvajkagpzgmfrkyx]aggpfmghrovrwyknxw[ngqglnuypmgejixww]twcvrjddnhduugpxcvg[wiacotdtiglghlma]evtvmgrrqafpaxu +qblqternpbrtiuh[fapmkfrpbuzhwcfnybk]ardetkryijgtjmdj +agnvlcifudtpkskhz[ssksropazylummmbch]zjssxslmlnmjoxxf[wmedjpjwjtijfmucv]frmxcjyvhtnyglrkgxq[immpojsucooxlbdwz]jiqurgdnrjejroukde +oieagfvbgeblwzzzm[lngokglaibefcvenlwn]fdsqzeblukuhfzyhf[twfxwotgbbehlaxntq]qydpgasujdlhkmhlb[tygpnjusvpadbkayoba]ntdupgbgwtyasupw +nkhamuohfhcavwbv[hfugoocbsqqsdxmfc]vgkzdlkydwyqjyn +gdoccbczcjldspfueoc[duqmkqhvplsatlhz]iafuyzmppcxzrtiir[qbxmjbnnzrvararuvhr]uipvgmhashuevyl +tvrgoqgjslpixzd[dvcgrtjbyihdxvlginb]iyppczuwpewlklk +mnlitvdbejsrnywrqw[jkjhnxyadzqdamvb]xywotroqfapnbhndpf[mhzstybvhusjhspfyyw]ctbjwfigduuutxu[wokoleeyoutpzcha]gpjmqufzmyldciqtn +azzofyumdbjdfaoxzrg[qmdsebebhkhhdpt]ygyshnczkxlcruxjz[fwxrkvqhhlyuqvxhdcu]liavngiqxieczgjqa[jvptolwhlncroasmr]kancigwgphwgwxb +mkqtbfxzplgmsslvne[vjgztezntbnrrptsabt]bnvqdmfenlchukjgi[ieavsusemvkjepivnej]gbyeowflyuuvgsowctc +iddhnstlrmffvsaz[xnejqqslbnbgnmlyu]eujdrqjvxlpovzxwqmb[oqgwexhdhjujitcwy]dphgwjcaxssylcb +pipmxilwapisesgun[ktzmndpffhnsfnchc]yljnipppqujqevubxg[rorbgmlkbhjoxbryo]ondmcsehqvvexnghqpm +lktmrzrxpluntju[nljelzujtjzunkezb]ozrmieeacpmaqghf[jaexvmneyluaohiju]xtuzedgcugczrzle +izpcfmamliqncmcgaw[rfyjbmvbiopojxxb]nogrshoiyvmxyzjyn[jegqvdtkcqhidepcda]sgdnnctcbmvtqsbwt[rtmyhffobmfvwcl]krvynuqvannkyicot +dewutxcsanjdlmchu[wcicioikzjdejoulljj]bqxeefxgedpsavlw +asfkiixaolgtwtjw[hdkpghivmztxiisb]wtwrflrthfrcattgar +gvgvnlrikbfepogjf[ipgxrlfaltggvmkfiht]votekpzvkopkujkufl[iyhdgdagzhnrawet]ajhduyaxppxwgvgujmd +tiebcylayagfdqw[lkftgyduvzdzpsjkcr]mqrdayvtvywsquj[xectwtbhvpnymjcmgon]sweddpysjrwgssll[lgzhfkzexgtxamjbmgh]zvlhicbqqvmwngosysq +oewghkhhldonunufju[olrpkibylltmvokyjna]eedjithbjuymlzq[gomlxncpbgzolpm]qmxofuwfegkikwfihck[wudvrycglrxlypz]lsghgmgcidcxvws +dzisgzrxauzpmmq[ehrywgvtnvhkvin]clqsfudqvcnwwxru[vzeqaaheyudnqgdfb]lmasdsjzekcpjht[gboxhzpaguxuvyha]ipqozarhswigzeqzdom +dyyqwcghdabypdkgndn[kmnrezvgzkfmxyopiin]vbxvpeyeqncygca[biypmucmnkcqvqfjgyz]wqwfitifrfckzzhftkf +ffrywmbbpzparzz[silwmcdyckltvwu]syphmujhpatfkccz[kagdkkcnnoxwtxfe]bbxheegelkvftabcky[mbuxajqsttmhnmfeobw]smploudflhpjbxgpnev +qzqdfxgjmnrbltg[fnfbksredcpkbqtp]ncrdcfskzzqztrm +uvfviatjevwnmugvgk[jwpgxsfvfkijpdxo]wpdwqxjmxddyigesygp +qjsbieiciaeemfblfac[jjudeshcfzeiezuepgg]ktjghduwspdhkldzjyn +usxxvmwheuvgleswoo[irucqcgtsjgxeqwur]pkjsipvxxkjoqqp[osjgklsxyryzoxkfnm]xqocoktbrletccuw +jiirthsyxhzgjcrx[yfuorkbrffeseaakcr]amzdbwfoaioblppammo[pbrbaxhfftauuxvo]gpnsbsppifolsrra[kntharjptgxiztu]qatjusqejmdzaqycw +ssyfomequfwxahvfvy[kctdlusjzhgntjy]zvtmizweshgffnlh +pzfvptwkkdectmi[koencyjqifclilknecd]wctndrlxwbwkxqazsj[jklzmkhlqwwpvxv]mazihpfxewkjypfth[vannhyvviuyjhivwco]qghwmufezcwrxtuvx +dltmdrlzeauhhwsom[naqwzhfcgzictvbsswp]rtlevxtzzviqkabimc[dafvtawzxjabdtx]kfuyxbmqrkqemkeetoq[dmalddncrdzuslnpovt]ufzjluhczhxmnanov +xioeqonkswrhfwqt[hmpztzezyzpqafedtpr]wmwezeoixeriejbskie +asocnxlrbkkafwscv[ouuntljnzdspcxxub]wzqnqrvlwoccjagszr +scrsvkbwabaqpjs[xiijpmbiflmxyxwkfn]iysftpuvocbtwaggugf[yrqyvyoqxniqxcxmbqq]gixcxmltuozcxcqehl[kutzmitklfdfouflbh]xdozmussjlcttdf +apnolukxcjppvyhjenn[ktziuhqmkbjuqffimzn]essdusalxlbxvbsva[skvzdkvwpchapohlyq]mgcfirbsdbqomtxmxi +xxfucigatkfvpubv[yrpoezyzhwkpkkkmot]vapkpzcbwhacbrp +itcqefgdapiuzqtdzm[vvcaufavmazjpfirrto]hbrtkmfzxjewtaswfm[xtuzqidapfxvuzgqm]xhpufritjjxpdlx +nfeskfxpmbdjrhgusld[vkbvbootlttpfkt]nlsmsujsgjnjigxlpm +lbindwpgcwkdslufzsd[pvxblmfzbdbtwihu]zmrgvwliqftoxtsaxg[pyldqlarmljuuzaj]cgzueqqndeotcvsnv +xedaztzmryqxwnb[uhqpmhywmsnsyiq]ysaelvgeordrthhdtkw[jdnpojewrrdeotk]ynbkvsnjoxwgwxe +vkfmkgsnqpgareui[lfezzjgbdptknrxfq]aatkorgxlumdhvjay[ngkudbpkmdvdskihzh]nyhmsgfgpuzhzkbh[vuejragqqtizjmqeqdo]ascjasathqvncdnkd +cvotsugnqushbrpprhk[totbjscfphjjmur]rrxgqtuyulqpmywjz[nejrzhylbilebdtqvm]hlsppreuytghvew[bwooimafehcdzhmyp]qnowsbfdbeupqtila +nykwyqwbrhifjickcwr[bkwtqhihmczedyoubdj]jjwfyabbyjjqihit +dmpuzthecwjclvd[lxhxcrnhvdpijjuypu]wbwmabirpitypyjqk[ywytahvxbsnntgskdj]nmgcaavgvyndrcq[grkvyncdwfbmfdb]odnojfyxxgzspzuk +cxguqyufjifeyzgkw[otebhoxdrvumjpzgb]svtkxxqnblsmaodb[mnfwxqqdwqotjbg]fcvefinmmnutloh[ljkeuuuxicazbuzlfx]qhrjvfrcqxsizjhn +yuhhdmuebufhyly[llyllkurxorkwlx]tbpgsrxtmztlofcobjs[mqoepigsswhitdcnd]gxjxulsmxzqjnyx +nuiovuspjehxkpv[qsyjmiietfwvqzj]ekuzppxgppqkpve[ozfsqvrxfeumsigv]xdzyqybyucoxdoklj[crnwzfdarswufanfljs]vsbixgjpzbdddcbe +jmvfqdzgsklcrslovql[gjhklxyugbfvnqz]pzitsmcqszousne[ynlltwcmydmhewn]otvtxsxrrnmwswnje[aegqtdvcxhorjaof]hbekoaqmdlkljjuufj +qqtgcjcihigaujbt[xqlhtduvqwoxtos]vpuvpxdusalphiafnq[jmwiomadjxspohwrxi]zjymzmygsnzzulziln[vqgdgsqkzgzbzbcsxd]xitnhrochbzbthxnzkr +jrwchpzsztpxhvph[iqangpgvkiylfxnlvjn]dhnfjcukccyzjmw[gjugzeqyqfofstyg]vhkwihbkrhpnoplbksl +jxegyldqmsgxgxfbu[laousqjpancokjp]uzcekpbvslycdabm[itwqqjmxywnpmlfhfq]lmzuyvovezbnoscoeog +tlhzhxqkdcxilhio[dgocupjdlzogjwdxh]azfvreuwrvquptrlf +llvukyljihylpgiq[rbdleeyvacbovvwrqt]khplkmlyeccipwqwoz[whvvhrzdwiecqbeb]hmkgsugxhfukfzg +gqxtomykiwexvcyy[gennwfyucypiyhw]djjiwcipnaoakagmlw[mjoyxpjjsrzurtaozkn]xocuerjupzzlmbnshb[erhtdqhgsvjsczmzba]adbruotfkowmvwugbr +dpxyxexpdkdtrcxr[jnzrmfjuxhkqvaj]vbzavumhudmpvccqsej[whqvbyszqaovrgmstr]ybockttkvclvxwx[nhowunciatmmsjsc]ohqeflsduaoelvu +boajjbclanzyjge[pcviglbztbaqfvxfe]rnurgxjnrmwciev[psitzaorpbtywmor]duvoistyxrzdovakb +ixnydttxbafquyvu[vuoyofxakqeocdu]uukrnhkrwvzbpyemn[cqndyeyyplkdvgkhaf]qtchwgkqvcrmsax[crqkwmpcxgvuhcepoe]huheekppokbwogmfw +ltgsblvagefbohc[jqcolroyboslyuljw]hkdfbyjxzkkhglu +iduenjlchukmkmkcyiw[hefkxhfefqcxtfgw]zmxzdcvoiaexqfxmy[zzunhvsdkcmwrtomxx]ftpbizjapbhzzpmjo +yadqdnkbvrzyesp[qfectyenugkfoednlh]hetoqjdjygpjgpdo[coclcclcgbmjuqsolon]pvzoqiwtwwrlhrefxfq[fweutmyirwounikbbe]avwxlrppqyipxzbqsye +hvzyppakbpizzqtzylj[fglenofdnkakgscsit]dtmyozwhcamapqzhmqq[mzwsceguaunjdqgzy]oqalbiyxztbhzcj +kidpcgqijppstmrk[bvrxisbchiudttb]pxtcpbmjqnuzdnrrj +vbbwnaciqnnywtdapbd[nxsuwwtdaezftmimh]hpfbjpprqiqstff[wblblaaxwoxhiui]ookdivqptkooppc[rfykjlavjvqshrc]udqozimcxwxvexdsodg +ikoiloawdwwukhyog[wldmblycrwkogqdkmd]nonshrrxzgdyitowef +iwxcdvpwurlwoua[bplgjzqiufihbpkr]vbznjwpmurnncebwqjl[mggntaecbkaivkc]foyyhitpcozlohpye[wmnupcvcxkkjrtwob]fehfpqrzptnjdbrjqm +kqgccpaxaiawhlxwvao[jwqdyozkwlkjxaxeae]pmzegiqggikntebuqdf +dinkcecgpjkucufxmmx[kghamrhzvzkmkvzvf]fsijghkzvcnruuch +gqpmoujcqbjmbkw[wklovtupjtpakkr]bszxogslsmsuvdc[bzamfeevwtkxiaqmq]whvpwuqqpetbmxcxfei +rzprsbmijwurxdper[stcbtzdffxiikekwkdm]ecsvpslvgzqdkmcmg[dubrkljphbedinwakza]tmuaknuopyvuuvb +jejqpwjnjgswlpdw[bmlmhbehrgdhrfpn]bgcavfaqrbusgmdol[wcnqvfviopfafsh]qxbdmorlqqhziovvtsd +gfkacbhzzuupzdciobw[apugufbmkzdcuvyz]rxxvujlycyyauho[jcgviszjgfrqvqddqbe]evzoharbjafyqtvpw +lkhvmxrbbthjzsqn[vrsinufxgtdplcziyi]udnwpmlftjjyiyr +bgbpjlqndbevlrx[uuzlxehnzsmjszt]mafmvjrgaehcflm[uysuexeaoyrfqiqoe]eogngphvosbbkbcbx +biqleovznpnvlgbtgq[rflcogyjfnjnvrz]qjxffnzysxpsxxo +nghkeaqqxrczcohg[bfqguyypsfcksjhz]ijcgbkcgogmyrih +ajncuvxcuwllizxkfjl[iggocdpbmhuujlfukl]mpoulqjowqkzeebf +qqqoxjvsvbiiaytvwu[aiwjzpwlfgalktoy]vbwyiusngxwciune[lkawkiqvzrgksyyz]pjokuzxjurxligex[alhahiygubefaljtv]azmhwehqgrglebxosta +jtoauqvnncjmeigaamx[kfymrhjevoyhepqnc]ihlwiegxzchevpf[zxjjidnncpzbzaw]ebixvaawkwocytx[qlxbemucbynolblv]bzbjrtnghmcdkscxx +mbtokokyfqfdhmxwhb[qgazmvdcwebeifi]rsntzgeqyfvjftliwa +yuwtphemsequwdirfmd[icnjausljalhzphpy]cfzystpixjcmrrs[xywzdfebzgtzelgl]xswnagiklvbjxlfnpq[akxuhgxhpkdwmwigca]vinsbilqirohswgipe +bqbosglgnqwsfbxddw[emjzxcffmxkqlmn]wfgjtfdvhemhejpmxa[zfxoffptksgmnlbntx]otneelfhzpamjmzwqg +ushngvjtmvypcadpd[arcpanyyoceyyaee]udvkmybxmgahfle[jbalikfwxmcgtiurjcc]llxqjcpwoboxhaivwdm[crozklzdqjlrrhu]hojkvvqissprjoqwfo +ofwpbcnnyzbqqvkes[peogfvfpyvbnydj]xvtiykidzuxltuxxp[tojcelfsgwxvwqhg]jpmadadkgfrumezy[monrbqpsppiaaifxz]kylmdiorjlsovny +hnbxabeskhcgpoaexi[thvxentmengrzgkjuwi]mhxhszvkflnnftd[twqccachbgauoscdol]vvfcqjzsrwjvkwfsw +bkjhqcswrncpikvpm[shqohewbmungadi]hcrqtimandhfbso +amfxjvxvdmerqowdnxe[cumwepdamezeecnq]lkezawesphsybimf[lapqafmfsivtmytdoda]vmfmejuxoigyexwwyo +ezvclrwlggiosvdqxer[kwumjgmaayygippb]zqwtdswaxmydbiihi +lmandocgeressmfxga[cijznnpfcbsdystlges]fkllytsytcvvcnxl +enbwhqlzytjctefqwhr[zoqcmvgpsfndvfvy]zlwqhyoulrcveni +zwucvenctpqzlxeadn[toegrygcfpfkafgxs]axvqswugizubynzsb[luvlrbwplytdwlheaxi]nposqrfedyuugpjnik +ymdzrqgulicxzfuf[twglxtaryubspobxclc]vucpqrzzyadvoiteqle[xbsxohuegxwudsrfw]axpmobgigohcmagr +esgnejqywqqsywkg[hryixrmpqepyrovv]gqjccwoanbzljsf[maaujjtokmjpppsgk]qcvrrtrrxwevbvovo[xoymwepaurypzvpth]qmlqfhvovyowpdwz +qksxeymivlzuscgsl[vjcwfdvybvoiahv]otcgndvvjerofpx +ryxelxmxsrhtmsqvxff[wxblvfrersnfcyvvpv]rbxocxhparlhcaqexny +ehvjcabqtmabutiu[ovzwhfvgwqxefpay]nzszulqbxsksloc[rgdlusvaoksgywaexk]xcwytqehromugefg +svfhxiqruxzcjqlb[dkfccqvvehkwwfjmth]lvkfctbpueegqdfb[miffoptlmgzzses]yochzabyqkmnheasfl +icdcifhjwhiqzqyu[wgzmgznoewglpcvgow]eujehgisllhkzmmivhq[exesoswhvvsthcso]pjcmtknevqdvmmamejh[ylqwwcuycvpofgqwqf]fyxecpnvxzecnzqew +fdmskgwxwrznenwsp[qzplbuzhacotyil]plorkkwrjamagmzil[niohlobikfzfyqk]bmxmlxozzwbkrrhnce[xxcczenzizachda]hloxeszindohsfsnqx +zqsfgmjarzxabud[sqbwrxrtfgydkkwsekm]tovzszloireanluvx[zrdwqaaruhiabxfjow]djnrprliuoenkrxkt[lojfktjsdwdjycamlzd]qlgczlpoxptsjooi +gjwuximhfklvnyver[urndgjzxbrreido]eowyquwgvnxbsmb[dbigflhjsrccqacr]lhxcuzlmzdopnfluwm +dnmbsutzllsxouvh[tqykceyhjdfisrswht]ufkpseiwzfjbtpkc +madjaycornkcpolglq[vvnpkdstjgxcjsf]kvejknagbwlxtxbrbvi +fufmmdtydxyrclcrqx[nrjdoldmmxxfhncdk]hdbebtjtcvcfqmw[rhfbbtfhhsqiwbtnlrz]kihpdnvnacqqosnhpa[gndixqjiyvfmvrgjrzo]fxwjbxmicjjyvepuzpb +vyblgyhujolwblvys[zapkgjwxfsivrxdfr]wtqlezngwqoktfhiegh[ecalvtwzjxbqfrcbwvv]tvzxgabmyuvlztgux +dnqbpkwbdwbfbyoz[mjnprwkicaftsgm]qvtafasppyrbtuqvn[pdlcgrzteozofjkfo]cevpxzfqcrroinmxy +pdpjqznbmahueoc[ecsdszaxvxzuhamxqq]lyusvisydqemnslw +phxrfpqtrkqzdtgwetm[muonzqrbiyeetiqxu]rwhbzxkfwcchkpumq +ltvxqmlcrivtcytk[vcfeszakkcrjslo]tybwtklhhxsvhzxuio[tpcsmftwasalxhe]ivhbtyfxeknudns +blotcckbcsxnxkbd[ijibgeakkajijumjeiv]svfnhnnkaqfnzpqdox +zpesktqlipowpsmqubf[vjnynvphcvmazjotxm]bjdrheobrnylbebw +ftoxxvywsxkptnvz[qcotxazjsqbnflu]xgmfsauvpibkozp[yzpsqrudrnbayikuau]vgtgzdoxpsonwmse +dqamsxipelobmbtxs[slvyfkooyzbcuxo]dthowqdeedprlmyg +ltozqbvhvyqclav[noavoyiuiyamvcanqoc]dkragjcbgfqhmujqkvs[pnzefpolsmchtkula]ihwxogvjbctklkk +vtewmubtnbmusat[rpjmicrcyzajgpzo]khkjajkxflvurcsmd[gumvdiloapvorhmn]somhrdimswsyeeq +zfrvenflhmjgoesmax[pgqxadyxekpnwwnckin]kqqmdrmcgyweogyfya[wbwicwmfsbthzmrfe]wbstpswtzaitlwbcv[nhialwkwamoawjq]usgyumpojqmvdxhzlat +kztexifpjlasulbd[gplrmaltusmjvgovnq]yejlzyghxccxtnvihx +liuvjttbtfsawbpfi[wtezrsztlnzmeaxu]ciolgkqyxkxxvwtblo[dtlfmyfrmfxdcikrb]kmerspmgttnjucijg[wdzyrbvslhkzqocimee]lrrvtrxcydogapi +bbfeqegoyoyektexr[wceufdsxjpughajipa]lmnlqkrztzbtkwcbxhz +ypwocnxnpuqetxgb[faqgbonmbihohshmtdo]cpjhlgocldldshzy[uhwgnkdervikvatfpav]semfeosdiynzoomskf[yvczydmxhxcaowkwg]kkwxeutjaronwowi +rgvuclhfrvlkxiqo[qeywgwrafcswqya]xppwskysvkvseiltg[bykdhqgbgzjhgoungi]invxesxqmtohbmjllh[fuejhljykbpzxdykgj]xwnyayrfadhdwyds +fbwwaocsouhupdi[efqzvlecvhwinsjeywg]lbjmwdbdjfnmtsaka +gqvsxigtgoafmvbekhx[sjgsrwdtqwqqylakvbb]kqrtyagzfrqrvlfkumr +xfuxljcwxkiomhkepi[iaprxlbtpvrvlsig]leqnifsqjfqalkgafib[rfxqsfemmpvfhmrjn]gbqvgdcfcjlcmnxkljn +veiqbspjrjymoalmtrt[okpsiscbptuumxisiv]yrhuahhkvbigdlko +uhhwsbsmsbklwewfc[dhnisoxocvomjaay]wouhbmhzfyighaufn[durxoxeyxjhvkwyjfx]novsbfibzjulaxzuesx +kcfxkxnznogyvymzcbm[mkgpejhpbyziksgv]yvzndwangiuuzwvkv +orkzkmqdeumjzdda[nsbmhjdjxqfnkkxto]goeaunixhitoaiog[nospihuvybakztioqip]vjzyxpmmezlnaumym[nwxvmqhsprcinifl]uvwjnqwjvuyjjpugj +mfrhagodpscknas[sbrtzvfrqcxsufv]czqpqctptdlhmytumos[vnyckhoptjkjxuqa]pmooukcidyyvwqtgohu +resxynlcutzggmtczo[nmmabdsbvwktiykqonp]gmelhvutrvcrgdna[obdmwoxrrlntfejymf]hdxasucdibwwxgot +mnrhbocsgkfthhvnuke[egdgbouacqxndelu]ajtnqlomsyixsehntrn[mpprufbezhacatf]qeuwsfcjtkpzfbz +logpvbfpghznuvcgwj[poykcbzvdrpbrlqzlxp]jctrzpridwbvgpvv[nihdkrnanrgbdqaaf]wrzphhqbpznufcxa[gjhuobpheguxqwut]xlxxdfunzjoknpa +xckjcbxewjcqegrm[bksphbygnxtbklur]bnawweidbrdpfsw[uoyymiftyibdhjc]lpyeqreaxmmjquc +hnhempuuiakcvgkv[ykdxjfqspjlwdamqd]nlyuylqcjgacgbtaq[swmlxfpggzcagkysuj]syrldafxedcddhhwddz[zgighmpfjmwajrcwihv]atdkrfhvjyqojist +fkrrirhpatymfnakjpo[sxyemqclncjkjmmfncx]gvewmatlydgleqm[sgdeklgyvflcufvtplq]dundmukthwoddhaxw +ibhwnndalipgwboov[oetxmvnstllojrpjggr]raawxffqpbwaoafsvfa[voaodafksfxrkimxfac]mrklxyjcdcfbsmpp[ojavtfuwkeogikk]exijoqwqduzdnvpf +fvjerjfawdvkbzkke[ekoozekkfayzwzjgix]ysjkrywjcqpwoguoh[ykjvlzirmpjxbzpxtz]njyukqukczggofql[jkliiyuolnqdhdbvqae]kpsfxwfkweeexjxlsn +hocvxscrqarpnhiyizi[edzlzfxffzfmxmssq]gqlnxmmhcmsabueqxaz[mpxvrwpnncxgddguygj]fwhbjqrziztgrkmx +mdhjmsdwdhyhrqzucp[zuswgksuugzizfo]ekgygmdfansrlvzyt[efhwmzbpzwywckakd]xvwmsbwppzjvwuuqakl[igcjlcbgovpdyssmqc]lcumchflakunifgeg +mplyixtwewxpmgxnmgi[ngrpejtnvrgwtupvr]kesjeqyleotfmggcea[zzokvnfeweaduwzfhrw]obyjyyqjkucokbu[snbyhfbchhqxknu]fivmakraikkuetpria +xqgkoczxlgmlffarh[pqiqruxadypdionbepo]fxskihkjyfzlcoomvl +afohxmbrfvqlacrf[imutjpvzzgvzgcjerck]lerhcxzrzkqlwumny +yqjwgatgqryemqsp[bwzbdayfxdumyfojft]dfbuzmuzgxmnzqgshfi[pakwsmfbtitkiqvanoq]xuawmajdiicregkpm[kqpfntzvovcmfsxqmnq]ghppydhrurfeiuac +kfhvgwfuqjsfepj[sncjjxefsdbvjumyo]remoooxfyjmsskyds[jtjwfchkozxniiy]jgfaixubqjcrtvh[npxegekihcqiurb]dvtfybcjyaoushdagr +fkfbhopbvmmqxthr[kfkibyedkqhtkdu]fntaxfihxuwwpnxe +sfpdwtxasoodsvwclzn[lroruhvvtivzyzydac]tmwhjsyqjqlpwzv[esrzuwvtzwvnitsuf]efviugvdcoegmashh[gvpwpimfmjnfuncw]fbfppbsyymzfazivsz +amthppeoesqlfwc[kkasghvolqvbcbdeczz]onknhfpsjzvpvkegny[gxwbzdipdgehnryyj]jodjkpmhcwwszfbggsv[qfutgdlyxkdpbpcc]oadwfqaipddbwssib +fqibujqjzfiraeobjzl[mtvzbskboukcyjenxrv]qjqwxujlhqrxyzmytd +cwvxqqouchaqwkhpcfz[elwmjtglbrbyxnyoyyd]nccylfdoyorjbdi +jcbygfuxandbdexnhc[jyhbtswhegyhooolh]aniljkdxybbdbsm[afokcqicbhltcge]omjynmdbdgknpxhjm[wkgmjtmhnrpamkfncx]skpgvvjpnmhwkcgomcg +sacklxtvscuxwmhvtw[bahodhuctayhpnt]qicatycoooyspis +mhexuvtezfzxnevd[drllkjffzfmmukleut]soquupmvgilyzsr +hmhdovlwwfwcuikdx[qbkapgzxphauqrmjat]jqadlkhlgqfiacaepvm[ahqwowftcseuqezn]yltcacnflbfskajvakx +dhnspqvpwgsexlwwrsz[xpowmglcpasxvuk]vbahprxinxmsxglxvgd[ukvfffwqirhekvl]pvbdddgneqxoqjp[rmkfpyqmzjpdderhme]svtqppchbmdqvldgyih +agqlrgzefrrkrmdw[pqxuhlyvhdbcuvd]zyaedppqqpcyonyme +rsvoaesmgxsttbl[gzleqcjyweilywpb]wuzskljcawklfng[ojzyojtotmukhfnjanu]aosalbogciawswglkw +yochyqaasxdyfmegyac[okjzywgsmktayhmujpj]xgjqazwjvzhdleuhz +psmnnwiolxpqymly[fcrevcjztuteryp]nnacfwnqwxbrfqhyuke[kudikhthknlfvqbm]kridanxqomwtelxk +ppjowileomfhohmpcoa[euqrvizdyhubfilt]rbnwiaxaqveirvoeb[vbsvlpraulqyevyje]azqidrepohooimob[xlcvqhwzwdxluywoqks]mvgewzixvecqcqlmkzg +ncepobognelfiytdx[ekvxtlhjnamkonm]pizszllzfgumulkys[xgpudqjkjzpilks]xirarekiuvcivtjju[wjflckjkfvvbkgxmp]rpvriqsyglljrskx +odrrepfcxtyriobvz[kxiwrsavktuyjke]wnwydovrxmmuzehfm +mfdxppslkzpwvwr[mavnyeavcuoywuv]vspiiafyboscewkcsmq[pyevwvptadphrskuivp]tekdmxlgmnwjgcs[aewugqwpbpvyrmqmyyi]cuedkzylgatqgpdc +piufuojcfshdstw[udvhfbgmvpxffwr]doagyxjdtibmgoobq[fikftfravgtrtwni]wpuqessshgkrupqe +elfwnlaowbgexiajkyt[eswlunregcncpmeqoca]kqquvoocucglemrhjc +uzkfrwhffmydgqqzkl[trvjzqqorsdiimpk]znflqdahqdhvhlaa +rjcogeolejfldwmoqhz[cloemdcanqiplavw]vpsyimqbgtwcxgyd[kakuadbjenwdiicq]exfcsokofcjmwseo +qazslzzayvzvtbixrd[nofwkmnhotfyfptto]irajxlrmeszmibhk +wirtatnszvxmlnkvjvv[btvgpyqdeiidexdeapn]unlvcnygttuetqfg +bhdesglwqnjvgpovm[joeuqfahjhgmrth]jtzjppcucapkyzcpei[idqjrcxyjlupzjhx]kqljgcmnpjnswef[cszkdkqnmbsrxykt]ykkbwmiclaqwbpon +zkptfvsmlnzuoryqz[uhbusiqtctqdtfma]ubdrujhmnyvflnvs[yovgsoipmkxmrtw]suwzspemdtfiojr[vsrttosqlvmzwoqmlyq]nnsnkiyhxjecfvkhxf +gqrxyvtuvcyqvarsuv[dlulhvxsijobenjo]pqglecsfwgnuhelsh[rqouyrnjtlxfowp]nowkcfckezryxxg +aqmbikwcxxevjbw[zwxktjxquhloozfgizr]ffpzrapawfkrsny[qqekkqexjyoghfnaxrm]uylkkxyxqlrjgbowycw +ghesvpyxqricmgcmj[hvfcvovijglkxubrfqf]lbknfpyahabpypl[gashwurszsmlhfui]rsyxunohtmwvqfqslr +ylpuzunivhaylsrfz[kieununfecpxgzhk]pbnqrgyrgymuimsgfa[duxocpauqtfctrpreji]gdtcugdjxbzmffq[hviaibmwbutaiatf]tutsegblquetvfomynh +mgwtwourfjwmtws[ooawaihqxwinzat]fjallnmkhzbzfsx[rloquuqpzsnagpt]spehwxbmjexygksvt[xljdtevbvhddzwnoaar]auqtaqupgumspzpb +yfdfpclchklypaljq[bmkgewuljfpwpgrrg]ovkpfmumrmlybqyumux +wrftrzlpyrptwmj[penvkoodhzmwwzbya]itmeejhjetfomdla[aeilgulmlisvzluc]zkqdzajjhxkhows +zmgmnslhogyzitpirm[mknytoayplqwltdh]gmgpnzmipdkegoxao +uebarfghvpmgzhx[iuabicjfokgnybpb]swhnalbokpyqdrmaxd[tjsaihsqayjaywac]ywzuozbyvtsofvkiqj[afjkdhpemqsoivr]grtkptncyinxlfgdjgm +riqkipsgbptayuab[bcwdvfvzxiaidpiok]xdssawxxjavachfzpf +ypponvgfxgwquzkyu[vfbaoxpirtcgklminil]bbdxfwwptedctcm +zwmwdfwutuaoqyq[orzmkmmagojdfhkry]oegdfradzppwqwjm +fihqtfiaszddkwtozc[ggzvtiwjpuehpfvzev]sksgdqwtghgmavktpu[vovmwdwckbdggsuy]catvlusjdruqlgowf[bawanswujqcoxfzxbpl]sjmisqghvzvlpmvwuf +bthfaqnohcrtyvcevz[shahnffqoqjxmsaskyl]hjtecdroaharoqqlwme[xoknhnevqdeypythrj]pcsqbcykpskqvofn +qwrarlbyivqfsodi[ngpyxyllcdqmduhgx]hrqdfjoxtiuyqrcu[evlkctrqtadjostj]mthgbwnsfdkemvjlyb[bobjvmuycmotqja]wugdihgnugrqtcvv +ylhkvimzlxrkvqinx[umqrxhhwphpigynkl]bzdbjvsmxzsrvotag[sucrmnnwziscfbuldhc]xwqxczdtomfyutk[wxytdduimznbnnelpt]tgsdbftehkvmdetx +psavwiadlsloigorknn[yqsrbqsbzhogkdynyz]urgruwqpmycyslsj[ofdbbtooimzgubl]lbbisonaxmyudybcwm +arehddcepyoemixmskt[wopnathzlqxnnoiu]mymgjthqiaunymyes +pxfwbzbltiadcmh[lrdbtyxqdvcesyntzjf]jranlgsxskjjgfvhea[ytbmxhfejbdgcdtnul]zibykmovsdmyouxpj[fmfkhcfzstqapgjz]wnpjnohtpadnnlu +nckwcvncimsthnlu[rfyyazzgngkygfm]hlpxvutwpmaggblg[qrexhoxbnoyaszjk]ahenipwwckpoqhpe[hknngnrucfiftgo]yssifrkfyaldeaa +lrrhukctkbgoukeptxr[bzxzooiqwnebllazdhz]xjlbolmtakxdgnnjdeb[botuufiokrpddif]hbnqkqlyqamdugef +vlhwjvmrmqjdhrzlrb[sifgbytoqrokxfbvzev]dhdnsqteiomronz[wboyewofjqjmwzq]tqdhhaysrgexceeofe[dnvowqfgopopoqstvhk]npxeihgajbtqnhqg +cremegzznkdkyxj[mfuzjsratdlqxbgedy]zqrblvedvkrfgazq +ckqzaquqgfbmjan[qjpbtrzoerbtibp]wcpozsyvrchscndex[mvknznmotgjrfgv]canwkxntkzmszwlov +iqvyswlmcvrlgrh[cuexdiquljbdyzencz]omngyigmhnwisrohd[uejvjjgmlndhmtxzp]ucrwarxsiqtjmaddb +ivzrwlxpxgzuuuqmtru[czyxcfcxribjycj]pntvptdzblfosriqk[lojzoiluavlebquqtex]sxfcfejktdlltmx +tjppxfesnuonvyj[kmevdokeodpvknr]fesmrhpgdyxguvuvyiu +leftawcmocfkpdmzdt[xmlgielmatgwhdnqzsv]jiwfzhxvzxqhhpizv +xesonxwclvyetdcr[dvjijcenufeabkxnqyw]ogsuoydbnqoekzznh[dvsecdihbpfgacac]srwcmhiiwxtualx[bpemagylqzyxqoaa]kcuegvlpfzcwaker +tffukwerhhsbvwnhhk[dgymmmsmogyrmpd]fihstccnovmeipbf +njvhmuumwzwfzigojn[znpdqbjmfyuziavjv]hdnemtbdvbuxkkpkf[pbcvqwnquhbmugept]wseocpmukxsonkomrsk[nicixvgreikvvrat]fmvqxgrjzuspfyuqou +hcysmytbwutfeit[lyimkduppuazwyarp]scmqvuzhptpjenj +pbwoaecjkbbhcuiiv[znfkivdlaohkhmujeay]khezajqvgquousnjab +ujzussbupuiluxxsluu[afziojarfxhlounm]rkeysyrwsheuxaj +bobowsdmpdtlzzyjk[vhcmcwztdinxrzzqim]ooazeqoxyqipupm[kzbaizssrlwawrh]rwzglobtwokunia[aijrdsjpseqcsxds]otpxblmqfrdojgwndi +ejxvdwerghueasxes[dfbujbubdntkmli]fruzltpmrrlxjtlnvt[humnridbnputqpu]dsembdskqhnrtzesh[bzeltfmllnaegsmi]pgldmpkdpimgxjcge +cfommkiravpmqflvfg[mxrtecpvyrjkazvxuse]uqhkabaiqrafotd[tbyvblbmumrwdwovg]nfgbczychazchst[wfuotesxrieykalsd]uohrkgematczlrityxj +qztosgsqradmgybxrga[hlejicgvaqzhkfbhbb]cgsgwzckhygbszdvi[njpxihtzdyryavflj]icnxdwnruwwyzsk +uxyvrlyggnaviay[qwthehqgvglktqhqu]ksgnoxqxgkjmwuethng[sbbsvqnisduagslb]cuaobhmvuaqvvvnqfe +erymnlrruxlqjcmkn[mevvbnpbexblndj]gfgvnksluyipaykfde +dxscmhdmjkdhtudsqvi[gvrtwolegaemtia]opywqbkjbfndypc[oekozzbeqwfiflasv]yfgsbitixwbjtoi +ysxudmuqzgoloqnykt[fcgtxmhrrcecqmddrj]qtrozsbcpficfquvkpj[cgqpatemexjkefdbe]ohnpfhftbocgsxzpumr[eiqhsgwotemjlnnqefk]gfaoeohysayszml +cevcyseikybcbnmn[jpmyfkdmnmrhyakru]dxlrbhtjtuihtsdde[wvcrjtitpvlnyppnc]lcnpitcbcmfxhkrrjew +qdaeiqosdnatmbdxwj[atfzmwbrygimubjbi]eqmwenccfvvdyyhd[yaumggrlwxuimpbjhj]opojnvgqlddssgz +fiilqdyckyxglumal[mcmerdidyzyvolqlsu]tybpakjvysehukdzfs[hkquimszsyiivblq]ifkovlrqhlnvdcmctpw[bbfmqiuidwwtvxcyxsh]rxbulmjkszwcujvoxx +ejnjgazbggstrokfiqn[hwchebnufwvztstxxk]knrowqqjlpkeaogreh[ispqgesjsangcoygvpi]limwwxptqsggumpkav[affknwmlnzrbabg]tupfguyoxwpoiatebzu +qiapnmpiekmqwaxk[vfasdzfzabwydicao]togthxpkeucrpjuzq +bqzmyqagrliazan[exfepmvuswdztkgzk]oitrytelbuvpmfix[fzcpqdblgkioqnm]xtzynyytsasaiajhtpt +opicwmmyrisxmoj[owhsmoigdsolqmjd]pmgsqqwwjqvqobueh[zfcjdlleobetagnzt]mwckfcohdalqzeodptb +ejzvbutzumjnzzfgnoe[ixayktiqmcngbks]jrfufjnbcocgaufucy[ryglzpvuwtgohxtw]fszrmyqiiikxktye[vnvfudzvmseqhzlfq]syipqltfrymgbgmqxyi +fguhalhxpswuhwjmn[anqihfnbgmkkttimvl]hvkgwincfxssrnnzn[dmpiagbxeztyycsr]ufwamkmhsqvabiddztf +urstysgnriccvbkiwp[yffbbcipbgnlhnx]voloohtrdgtmuosuj[sjkbdbvpbcnleib]nucopgkgenowcccvgqx[rjopvaiewdvgmumr]yxzxryntexnuhgrvdes +yjkmxwouqlmohkv[mjogakueojtohoo]qobrjdolakkvxjbxb[qnerargpebiqxhkqawg]vhklgbktomjutbtm[islelkygphlpagjqij]xbtwafadjphpzhz +pczqpuroxpifexe[uqcqtneiektkmrb]nyoakxnlgrxobwlduux[dhhfoxkqvnvcchsct]cqcouyerjxmkbkjccg[idyikrwqdreiyhsxdcj]xlzoyafazrrbdwljnd +mpmjnhjgnmnqwowd[lfanwgamnmdxwiqe]npfvhehcxtlgcrzid[chzvtakthbbfgaamref]oaxeaktsxndsanlhxze +pvfcksodcgsmjiqwszc[lpixtwnyrpkjsmui]bvjpqhqzesvyyjlogw +ifzbfcvdoxkdzhrq[bxzpnkgzmjoocojqi]sihxbegqwropinnqu[uuemfqzpcjaegexhz]arbzkkywynrjjis[fhjxmtljhjhcexhjh]lectilzbsefciuxmj +epgzlimhfeamgbakeje[movhrjjqpkxnjzmn]ujjejiojoiqyiyuvb +kgyplkvxedlrivba[rrvhbjuukauesywzgi]sefglvbqrbfpwjpbndf[lxpmdnklhlnpooeq]cseosnrqjchpeicy +hzxrpcnfcuvytvptmlr[xkqdzxmqajoisgy]itvqxuzohywmwuvlrm[unurstpskieknsp]xfxutqlwgxbkszbp +nzyehlmbirflrigh[xkcxkxpmbzzlwnzbj]vtiuialppefxqhcuc +ihggeghdsdhixvlbmr[csjfaddciewuprmr]kkfiuczfhmrmgolb +ztiyoyrgufqxkfk[hsftvmvfjwplrbxum]xdeuxodxrcfwsvr[ifkfgxpuoehydemf]rqcnabfgqyrbtoxkp +ygpwvcpcshyjslrm[ccytynfblnccxbstzuh]gjpwxmciaenmcizexf[bldgazexvgyaovzywi]wtynmfiznxylzzhsgwz[qaxcfaazazxsaozyks]odryojvivbgnachz +xhlfqbqoatmvrfpe[wrfmrapwuzhqmqmzmy]wkmqmtbyshkyfwzo[zcifoyozwurqexe]pysjwmlknukydpnrzan +elexrwwnwmearzxuzi[ajkpdbxrtpnwngx]raybcmpouawjfqlujp +bdjnunqhhwlpeumihz[ytxkjsuighhjzfu]qeqjvpmmzpsfnus +vupxgfyaxnciedexmom[fvqffpkeurmvxvopmx]dzlsrwjfphehbkyum +ckzmymusejzabvuyb[wxbswbalirmbjumhxnb]hovexlwnzdbytmp[ulxyngaxvhwhcjlt]xfgofykhgqxxqbogmn +xlgtwmtszopnrfpg[zcjobnutrnmuslxya]ouxjiahawxovbbhahcp +bbezpvhanriufkcof[lspgjssrxkwcdyx]snwkrsinhjurvhicn[wyimmtkjbnxudgxx]fvhiaurorkxhogbown +owjicopdgvoloyswyiv[wqqpvlolkvkeyljrxd]dtnqlobojrurxvhmoig[cwiehwzvrmhtqyfmlvo]ztvfpgydalzyzky +akkrhttulhpzlyulceg[sosggqltgzfydzpco]tgefhbejbxfsxejsbgb +rhaynhcvrkoikpbamh[tbgjdaikneziopop]czthnlotpopwgdvcl +wscoyqvflhwskcjdf[mwpcrduwevtcjduw]uybsbwdhtlnwhvw[nukfdjraoqoaxyeuix]darwzmggglgaesyg[ryapeobwugpoohzy]ozudeagtfhlksnnrw +nrkiszjbkgclvxgwfs[bclhxtwvelakriyxwv]daaunctownhuodswuc +rqsftpfsggukeqa[czvrpfljtsdpbgzoqit]omksopmvqgdyhfvfiuc[ineryoovupytgix]ywfytjoppwkszftm +sjtoqcuwwnmnklb[pmzwkeqnsgnhthww]zkootlimihbctpalhcc +boewgrjfdxkepnlxo[jgcxotrswrdequngh]iwikkhflekspxykgiv[nelzixyahwsrtusfi]ictmunxrofoeccjtd[qeqijxvqhglwamdjcvc]mldxwzgrycapaexur +gwswqgnbmgrekfoqgq[gvdnmnkwqfutvfaa]ivqlohrmbqsoineq[jjgcegcdnjzuigbjze]gyhjcoqoqxqwxouc[xgseyypojrsnohnrica]umzfkjzjdsvsodl +zxamezowxmpjvvwz[cbdeavssccpvrznloem]ibjdhheoubjrhqu[nxvnyftysyuggqwr]mjbtcxyosolkeaahft +rfwgmpzvpchijrhqfj[xjdrxfgheiyijhc]rbcfdtctoouponvr +nqrslruljwsphkvf[dvlnrokayixcmgf]rsfivpietxptzwl +yeqmixesucwapviz[mppclaadstzosfpay]ycztjinsvvywrevju[pigptwaieiahxpzcas]odlsffjpdacydqapjgm[zetjlzxbchwdopgd]lndltscdjxyfgxihbrc +flsctoizaxydslw[grxlmkgckzdfxag]xarpwhhahlpvccry[vienektyecnyvagq]aavbdkiqjofyekil[rkaxahbatmfpimqj]qgkpebxjhwkpodufo +ucckvtbprcmdjvmf[eeqvgsvkvyzhjluexx]gplguxddsudjqlmrdr[xlnqtzhxcbpbdqp]uuqkodbvgxekmeoa +ophlkphyoqamwbu[nbsurlakpxxgyrf]xerxknhcyewzddcle[ydzhegufxmghoneeq]fwybaueovkjhkphx +geawkbpklybiwrncbky[hftcemyhbxsjjdfur]vqnbxghowdbsesops +vcdhlrxvycnvsizqop[fprxccobdsrfwhy]wdbvkhaosqznbtt[dmzbzdelxmitmje]whoekteomhigpjkwruu +iqzznislctfbjfwqsy[tynnrwpeemglajphxg]gfzmrhextughasosati[qsejecgbbetmnzzydyq]ddiskcrtxfguwkly[xpkmunwhccmwkjapp]cdnlcbhhxuplehasn +bmfhrhdtmvimxlmesez[lqmxqpdlqghxlevd]neolsesusvaxzdvx[irnrgqbigwlnzsuk]hrhxoxubvzkipgqfc[cjcvorvhyrvmfll]npkmtfxysboydkden +nbmqatjicimprrcici[tbblcdhcvcupgvxibxz]ccslwipzsuyihkng[sbgzshzorysqctaaacq]dyssqkfywggiaaqu +pcvyyabqmeryplh[jbqynrzyjkhwwgj]etwzjlszjzdbkkewtv +bubxbqqbnbouodcgxzw[dowpsrdjpuuouuh]rhnrizcztkilhuuwhbh +sbqkzpwosgujeovz[japgfjauipufpmlvn]ivnwbyatyuesvvrov +joeqayhdcwcrvbnf[vqfpuvxduqotkdy]kuavekugumzajaxfw[scyzqisremjpsdcmuo]bjpynpdzyzrbmmg +gwdqyqclwdfzpquzc[ozbvuwsgkcexhgsy]kdwdrqopthygiwdwm +tvlczfnrbnpmoyp[wcnstymqrvfoqqosw]sjmunjohxbrybmnm[bnzbnogdxaffnvpjowf]waiaapexfkufpazqn[hodebokzgpbbtdewpb]qzbomhrouunriuxanta +xcvjzwaytzttyobv[bzpagodqlpmmsgy]xpdfkpgsmkgpvkxumlu[chfejuaglsrkruoa]nagzgkrkpyxvjvlr +bnrxwwtsvorohyu[pupbgwrkyqhkbgho]tffqsororwpcdlaphc +riryuebgtvdzxdla[jtcopgrqurtfigfnrq]ovetktdsbrjpvgfg[xtsbnkxsdznzlwx]ftmymefonptpdbzsge[xjqgxcqpkqtvbmul]ztizzeufautgupcqelt +bmlmvylfslqqicwviq[nvxmszbqlexbcef]rqkawnbpuelvwki[bwapsyibuhuopujwmm]yoojkyaudzhoddrmvg +pjdpdxvrbbxxfwpeust[wztobueipqiaaicduq]onogsdcpainijdpz[basykjybxwuwjvxytb]mfxuzylepdplppj +noixgkmkngsjnwwhm[lgcpbkrpmkxxeidim]augzuhmkhdatdrhnr +xncybroqvekbvocdhm[ahxhavcyzvvnwwnfsf]eegitlwvzoqznxuktn[zjwkrbrjofgvedjuf]ujupljhpjfhtoddgqp[jwqpvwwjoaxbwkfj]strlqdkexjcnxwahdxz +ucyrdkrbgaamnaoez[cnumtrblnknjveyjgwv]vrlouyjivhweembem[izybbytphodmvvonvz]iqnendwvqwwpbwpstuq[jilkvguqvtgjpetbkma]kgttxqsamveamxb +ighlrtyekigrpbcx[uospnwlmvlhuujiro]jyrbqcrxoklegsmpeub[ferotpqcwlrfylet]vocevqkkydwdxzqavfq +vreeihsrnbdaduky[uidmukwdoghwycpxzl]hvapmkokuoljwyxi +zywvzrdkcvqbmwsbkuo[hipsuufkkjiunlqu]uhisdpbjcvkpunlayhr[iethrnmpmidjjrnnv]qnwoxpmbpmpnilkbq +ussacrkglqvwqawhxvo[uqdvxdgtawrfdjc]cduwaedcvfpeolqr[nlyblneokgmpfelr]yerzpiiwkwuiwilt[hgekbtoncoseaug]kmdjmalprlowtbrav +owhtgwpvffgjcletp[adgnkwibobvkgfkxale]jgqziknoasxylvw[mocmthhqcjfwjuuiuu]qlgqtnaljwdiejweksm +vxmbqzeafbwvozvsm[jtyqkvagfwyfvuvay]ailxefllrxesazxlv[odmoxgdiadiaetdyvdt]tiavxclhxfqtbvbu +jnfimlvvjtvtzajw[acyjznnyspczqvjf]ozltqkyrqtfrgpva +lrqapqafjqfroqz[zenrntyrnrjtuij]kaewwkrjpcmeylerv[camcigwjgpyeaqg]wpkzihyjlcquzrg[ttfagxotubvfeiqkg]amqnhawihumfajhvd +lvxcwtjjgsxodivad[gfigqaiqkxfcpmj]yaqjmrkuidrdwvviohz +qbceftsjjcumflk[uucxifoxdpecfndprsf]gqthbmmgbbakgrlsm +fsxulvnzmjywovnhat[bthhpzjyawpycgsuxbt]qbqbpjefdcfsfsqbe[uizjjjshwqgccitr]kiehvhvpwhfsasftyu +bkojzixxqjfcftla[glqknzmobetfwsnafev]ratttzyklaxfmfufyv[muwgybxllocskzecx]wyfwhiljpcfcwbhjlt +fcuieutbdlmwmpprjk[nkpbsvtngzrdxgwf]qmnuuepgdlzkolbcm[rjezaqbmfjycxai]paejktmptuiftsl[cbgxlqzqpflvskdmvy]aygzfhlhsqdcquut +rxmngytsppvfcpcscx[phvvbrmqmyequosdztu]vchpgerlpizjwcwkumf[lbjjftbncxuvwdaud]rxfbttgxfwxudhkk[jjzqmfcswwkxsmsluwg]nnjbbkpqankgskjrad +hlbdbzhwzlnpzurrg[rymtuuyqupqdpexefk]tukjhqaedzhzxsqz +fpryuguzmsoizmyp[xtootqplumygzizsqye]abwsvuvxyxwwasvuc +mtabpldrsqsirtega[hgbyvgmmoxihgzulnl]txvozvllasypksvhwhz[poeqvukgvlnbbbbk]lamyuvjvubyqvijesgr[ascxlaksbqqnrrqejx]guetmwzxqjlxjvdm +duxjzazmbyqzxmntnn[mjguwpucpwblyypmkj]csgnjihsjwrwjjj +pushontjgkevnlrkvn[dcibcdsbuftswnqifr]nneewpdmoaahwpt +okcmoevreebuujjdl[nzonouoydhqlmxbyb]kzleqfmoglkipweur[rrtypikbmtkzegy]cmehcxntlavmojfw[tvvcithufoahlxby]odnzrzscwjvxtcpdh +cxszxofnlpxzzurgqxd[islclvtnwrvxiqvybzp]agikgpscjwfvjrp[xfyvjgtigxamybfcxb]juslmurkvwlapendag +zeoxbnfdtlgkqzsig[cyrzkztphbnutuie]otzkrrqohznqwhx +yrsqyknrqcdvbdfcvie[uoikxvuzzihiihn]tdrrmpyisukewgxtz[pcdyynkvijsjpzelypx]axztekjsveddcukyu +bvublvqfqtrxxxtj[vyyxbnmmsmwhmvwywz]zqnifammxhjjcdczxt +iuhhzaiwcucvrrpcqi[cmqxwhpbiozhcjiew]thvzbxjvisbolbddky[tomeprddcnfanklkqq]fralaioewzbgbxxyad[zjgnnnznwqccfjyichm]rptkbqzdwmvjwarnuwr +tfeyzjqxrymktfvj[rmtbxgyrpznwmdvxbdf]mlxqqrocxuzklptmiwc[qdjbddpsonpejdxmpoi]pusiuffhdzpemzd +yclhxrtfzcdhrtm[hcoqrqbulbeziclq]xdlugofehqtqjonj[wcssoobwocoyxvdwq]lypemphdykevdonct[fuaunzhmdchbahgq]qfkfdkmmaxkewddwpmj +lnlskpioicgxmxel[umysskqmyzaxfjeh]cpqruxvbujqkmdhnuev[rqwsypedhnfkfqebtr]cyvrdyivrmvznpcc +shbqidoghlpjpxj[vmwwenaxupuvvptfp]yvjsbdunidbbkjnwpm[gwfgkpizyrvwzhaualv]tevcvdkhzjvniuut[sgmjeiemomrljvnlxu]cypgquavpduminrxlzb +uropacyqybozvyr[eqrnjuuhlopqyqh]rvznyebhzjhjxkuels[iepxmgnogtcfiwcfx]gxszowxzwkrdjvohtk[uegnjpnkrqqmnnmxjjm]lvxhojwlawuzsszq +cpeabckktwlhmnhj[tprdlautoabcpkronhu]jvmhenjwvhauljuid +pthfhbxzjbvghynkmm[vpzaeaijtgtixhitqim]fsaypthcfkzrxtnwr[xzkggwpgnxnfgnvawq]uvjmfmxdcdrkanecd +rxjlrkaudbmetnyrrin[jrjjzactumkuwruckg]vwzkipklzcprfquld[dfjpumtbhydndawlbp]cxwuyyzmhkhmyoaziwv +bumtfjdmmowvduukwaw[ukzkunqpgzgahea]kgmtyvromleqoow[jcszbzaxnyacfyc]fcrzscgevcehniswrxt[mpuxkyphidwhukm]vwskwkgmcrmijtujpba +qkupefsfxnqknoxrk[lvnnuhetjviiioxtp]pjtucqwmybjxnqoviyq[ylzusbponqrkwxll]kovqwsqvwscflkrcwn[zgefedeguzltsmlopj]navdwikahjyvimsnukl +grckowghnjntaxdp[dnelxhpxwzyeggptoa]coenxbdzrpydaqwa +lksmpxtjhpanwbuufn[snfzvkkfhiyibfgmtox]rpbqpzxkiwpxnsrie[datbzytabaylvvhek]uqvxzkzegrrxfcxinw[tmpqywtelhqohkmzuvi]fkwbbzvyzzkohjgz +zyzsrrzsfdlvntmed[utfrddkienuaqcvz]amncxndkvsufgxsu[vpyegmaxvugmdehma]kmeyojxpoluetkqeky[fezcwvaxbuyqttz]mwaklylrcpgnxuw +lkdzsmlnhsfwkmgftm[bpesperctavrfcn]wgzsbkjyyrbcjzghvlo[gixpfkuukvaoecc]zrvymealuxycdlse[cnmjogkfmapiwvkbk]vcgzczxskqenrst +mpeadvyrbgymqhl[razwybnbnxlpdqdtp]imkqmksortpqdqmka[ykbtopscgbsursrwj]evdetgtlaoimeqemyq +qoxokykipszydrgci[mykmfccqtwdxixqiig]iadoxhgcoxnhhliqvr[ttvqbebxyxnwndtz]aasvecaltuqijjmxx[lzovzwzsnwkglorhe]urcmgffjdzouaac +gywgdpzjikpouyzhhx[fznqxhtzozbzijwjvk]ivvlsbwjwxhymwpmdsw[fehugmercmvunun]tltuczprzfvplhqcpi +tgljlexexeebootoyce[pnrvcajzvoefxboyncd]snsnpsjxiyrdmgt +buinlwzbaqgpuoot[pjdralopgcrobfpyl]tttsbhburbjfbtegc[zwdoqaxyubvarmisox]emdozhtvjfcmranqm[kcygeikmvgptspj]pezznfpmodndwvm +xidbntshgqdckieib[urwkpgpqlzuroemjp]srfwixbhqgbnfpsgkpl[uygjtjaixctjtnanuf]qdloyaplyovscng +qundlfpfexfkrmpcd[vukdaxqgqvrcqerbf]dehpfpgaymhudzz[vkqfgcllumlbuszz]eizntkyxsysnlfy[sdvnheddugqdagh]yicuzmoifivylgwmipz +zzgzmnbevlvdlpv[bhoezbdqoelbzmft]bnfeqbplxfvydhluug[kjwpseyayhovkds]aqirzcbxtxginpmjn +xwkvxxptyfibxunjdv[eigrywezdgwtwfzli]fbfurspemrezjyuhsqf +yvnhkuzvtnirdxmxmd[vijtjbffcfxtnmxdh]untbfzmjmhmlfeyixu[edlyghinlksfxoikq]ixrupxdicymsuvkhvk[srnptcdcaczhrvqjq]wrqrzomktabfuupccbc +ipwwgkvjagdlqkoxlat[widqrotdnywnnbdn]rtviotwkbdqpggscdt[jzbcukafvquuxiu]ctmziuyofwucvdvjom +advbztpxdzdhyncuzz[ivjohzdjgqefgcr]nlqmqaenjzacgyaf +knotcnkidizcpveacjg[vajecumyblgcfpy]biedjbtbahcygvsdax[odhgbqawgonxvlu]emxplzktdwcitdioi[wcmtnnqctaowoxwgjn]dgcgmhvajmoouri +uumyvgqczjaadkspfu[cmacsgwkvcivtsn]cpefaqmflxkfmlkp[mfsvltdmnyzxqcrlxk]ykmjlnxxmsvfuqf[bciddbscmtyduhrwvy]cxwohnzlgzbtflqerlr +klioqytpqhkxqiriz[rjgrssxpxozhzbc]fysfmaiblgqhkeue[bycqedeolknahiy]pdusnyfxfcgodvj +sgjjqocmmcccpem[odeofpebaahroicm]pluzqzwkdzcovxic[zmyulzpuuiabvykn]ylxzlyooxnlibiy +btrucplpxrokmcts[gytdxlzkfakenliallw]qhxznozsjsvhvnzhf +nefefqadkmytguyp[ucqagcoyxinbrvbw]neksoxgtnnfojobtx[bxhdwvwfhybtbzkijj]poayieifsaocrboesfe[tnggfefcucifowqp]olmjwaqlaiwkkbtruw +tivudfusgnewzshs[mausfjbgxmyibin]yponuityptavbhekrlg[qeyafuevtlqemtfa]owtdxadrwwbxbrkl[obfcyxbifipwhduubu]mjocivgvrcbrllso +" +import : ice-9 rdelim . +define lines : string-split input #\newline . +define line : car lines . + +define : extract-hypernet line + let extractor + : l line + hypers '() + inhyper #f + if : = 0 : string-length l + . hypers + cond + : and (equal? (string-take l 1) "[") (not inhyper) + extractor (string-drop l 1) (cons "" hypers) (not inhyper) + : and (equal? (string-take l 1) "]") inhyper + extractor (string-drop l 1) hypers (not inhyper) + : not inhyper + extractor (string-drop l 1) hypers inhyper + else + extractor (string-drop l 1) (cons (string-append (car hypers) (string-take l 1)) (cdr hypers)) inhyper + + +define : has-abba? string + if {(string-length string) < 4} + . #f + let abba? + : first : string-take string 1 + second : string-take (string-drop string 1) 1 + third : string-take (string-drop string 2) 1 + fourth : string-take (string-drop string 3) 1 + s : string-drop string 1 + cond + : and (equal? first fourth) (equal? second third) (not (equal? first second)) + . #t + {(string-length s) < 4} + . #f + else + abba? (string-take s 1) (string-take (string-drop s 1) 1) (string-take (string-drop s 2) 1) (string-take (string-drop s 3) 1) + string-drop s 1 . + + +define : extract-supernet line + let extractor + : l line + hypers '("") + inhyper #f + if : = 0 : string-length l + . hypers + cond + : and (equal? (string-take l 1) "[") (not inhyper) + extractor (string-drop l 1) hypers (not inhyper) + : and (equal? (string-take l 1) "]") inhyper + extractor (string-drop l 1) (cons "" hypers) (not inhyper) + inhyper + extractor (string-drop l 1) hypers inhyper + else + extractor (string-drop l 1) (cons (string-append (car hypers) (string-take l 1)) (cdr hypers)) inhyper + + + +define : count-transport-layer-snooping lines + let snooper + : l lines + count 0 + if : null? l + . count + if : and (member #t (map has-abba? (extract-supernet (car l)))) (not (member #t (map has-abba? (extract-hypernet (car l))))) + snooper (cdr l) (+ 1 count) + snooper (cdr l) count . + + +display : count-transport-layer-snooping lines . +newline + + +define : extract-abas string + if {(string-length string) < 3} + . #f + let aba + : abas '() + first : string-take string 1 + second : string-take (string-drop string 1) 1 + third : string-take (string-drop string 2) 1 + s : string-drop string 1 + cond + : and {(string-length s) < 3} : equal? first third + cons (string-append first second third) abas + {(string-length s) < 3} + . abas + : equal? first third + aba (cons (string-append first second third) abas) (string-take s 1) (string-take (string-drop s 1) 1) (string-take (string-drop s 2) 1) (string-drop s 1) + else + aba abas (string-take s 1) (string-take (string-drop s 1) 1) (string-take (string-drop s 2) 1) (string-drop s 1) . + + +define : supports-super-secret-listening line + let ssl + : hypers : extract-hypernet line + abas : apply append : map extract-abas : extract-supernet line + if : null? hypers + . #f + if : member #t : map (λ (aba) (not (equal? #f (string-contains (car hypers) (string-append (string-take (string-drop aba 1) 1) (string-take aba 1) (string-take (string-drop aba 1) 1)))))) abas + . #t + ssl (cdr hypers) abas . + + +import : srfi srfi-1 +display : length : remove (λ (x) (equal? #f x)) : map supports-super-secret-listening lines . +newline diff --git a/examples/argparse.w b/examples/argparse.w new file mode 100755 --- /dev/null +++ b/examples/argparse.w @@ -0,0 +1,42 @@ +#!/usr/bin/env sh +# -*- wisp -*- +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples argparse) main)' -s "$0" "$@" +; !# + +;; Argument parser +;; +;; Status: draft (basic interface works, but does not do something useful yet) +;; +;; plan: +;; - simplest usage: (import (examples argparse))(let ((args (parse-args))) (write args)) +;; - with setup: (import (examples argparse)) +;; (let* ((parser (setup-args #:help "foo")) +;; (args (parse-args #:parser parser))) +;; (write args)) +;; - implement -h | --help | --usage and -V | --version, set up automatically and improved via setup-args. + +define-module : examples argparse + . #:export : args-parse args-setup + +import : ice-9 optargs + +define* : args-parse #:optional args #:key parser + if : equal? #f args + command-line + . args + +define* : args-setup #:key (help #f) + . #f + +define : main args + let : : args : args-parse args + write args + let* + : parser : args-setup #:help "argparse" + args : args-parse #:parser parser + write args + let* + : parser : args-setup #:help "argparse" + args : args-parse args #:parser parser + write args diff --git a/examples/benchmark.w b/examples/benchmark.w new file mode 100755 --- /dev/null +++ b/examples/benchmark.w @@ -0,0 +1,665 @@ +#!/usr/bin/env sh +# -*- wisp -*- +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples benchmark) main)' -l $(dirname $(realpath "$0"))/cholesky.w -l $(dirname $(realpath "$0"))/ensemble-estimation.w -s "$0" "$@" +; !# + +define-module : examples benchmark + +import : statprof + ice-9 optargs + ice-9 format + srfi srfi-1 + srfi srfi-42 ; list-ec + srfi srfi-43 ; vector-append + ice-9 pretty-print + system vm program + + + +;; stddev from rosetta code: http://rosettacode.org/wiki/Standard_deviation#Scheme +define : stddev nums + sqrt + - + / : apply + : map (lambda (i) (* i i)) nums + length nums + expt (/ (apply + nums) (length nums)) 2 + + +define : stddev-unbiased-normal nums + . "Approximated unbiased standard deviation for the normal distribution + + 'for n = 3 the bias is equal to 1.3%, and for n = 9 the bias is already less than 0.1%.' + - https://en.wikipedia.org/wiki/Standard_deviation#Unbiased_sample_standard_deviation + " + sqrt + - + / : apply + : map (lambda (i) (* i i)) nums + - (length nums) 1.5 + expt (/ (apply + nums) (length nums)) 2 + + +define : running-stddev nums + define : running-stddev-2 num + set! nums : cons num nums + stddev nums + . running-stddev-2 + +define* : benchmark-run-single fun #:key (min-seconds 0.1) + ;; trigger garbage collection before stats collection to avoid polluting the data + gc + let profiler : (loop-num 4) + let : : t : get-internal-real-time + with-output-to-string + lambda () + let lp : (i loop-num) + : λ () : fun + when (> i 0) + lp (- i 1) + let* + : dt : - (get-internal-real-time) t + seconds : / (exact->inexact dt) internal-time-units-per-second + ;; pretty-print : list dt seconds loop-num + if {seconds > min-seconds} + / seconds loop-num ;; this wastes less than {(4 * ((4^(i-1)) - 1)) / 4^i} fractional data but gains big in simplicity + profiler (* 4 loop-num) ;; for fast functions I need to go up rapidly, for slow ones I need to avoid overshooting + +;; Define targets for the data aquisition +define max-relative-uncertainty 0.3 ;; 3 sigma from 0 +define max-absolute-uncertainty-seconds 1.e-3 ;; 1ms, required to ensure that the model uses the higher values (else they would have huge uncertainties). If you find you need more, use a smaller test case. +define min-aggregated-runtime-seconds 1.e-5 ;; 10μs ~ 30k cycles +define max-iterations 128 ;; at most 128 samples, currently corresponding to at least 1ms each, so a benchmark of a fast function should take at most 0.1 seconds. + +define* : benchmark-run fun + ;; pretty-print fun + let lp : (min-seconds min-aggregated-runtime-seconds) (sampling-steps 8) ;; start with at least 3 sampling steps to make the approximations in stddev-unbiased-normal good enough + let* + : res : list-ec (: i sampling-steps) : benchmark-run-single fun #:min-seconds min-seconds + std : stddev-unbiased-normal res + mean : / (apply + res) sampling-steps + ;; pretty-print : list mean '± std min-seconds sampling-steps + if : or {sampling-steps > max-iterations} : and {std < {mean * max-relative-uncertainty}} {std < max-absolute-uncertainty-seconds} + . mean + lp (* 2 min-seconds) (* 2 sampling-steps) ;; should decrease σ by factor 2 or √2 (for slow functions) + +define loopcost + benchmark-run (λ() #f) + + +;; TODO: Simplify #:key setup -> . setup +define* : benchmark-fun fun #:key setup + when setup + setup + - : benchmark-run fun + . loopcost + +define-syntax benchmark + ;; one single benchmark + lambda : x + syntax-case x (:let :setup) + : _ thunk :setup setup-thunk :let let-thunk args ... + #' benchmark thunk :let let-thunk :setup setup-thunk args ... + : _ thunk :let let-thunk :setup setup-thunk args ... + #' benchmark thunk :let let-thunk #:setup (lambda () setup-thunk) args ... + : _ thunk :setup setup-thunk args ... + #' benchmark thunk #:setup (lambda () setup-thunk) args ... + : _ thunk :let let-thunk args ... + #' let let-thunk + benchmark thunk args ... + : _ thunk args ... + #' benchmark-fun + . (lambda () thunk) args ... + +define : logiota steps start stepsize + . "Create numbers evenly spread in log space" + let* + : logstart : log (+ start 1) + logstep : / (- (log (+ start (* stepsize (- steps 1)))) logstart) (- steps 1) + map inexact->exact : map round : map exp : iota steps logstart logstep + + +;; interesting functions to benchmark: +;; - TODO: add to set/alist/hashmap +;; - TODO: retrieve from alist/hashmap +;; - TODO: sort +;; - ... see https://wiki.python.org/moin/TimeComplexity + +;; operation benchmarks +;; - TODO: or #f #t +;; - TODO: and #t #f +;; - TODO: math + +;; List benchmarks: +;; - list-copy (py-copy) +;; - cons (py-push / py-append) +;; - car (py-pop) +;; - list-ref (py-get-item) +;; - list-set! (py-set-item) +;; - take + drop (py-get-slice) +;; - take-right + drop-right (py-get-slice) +;; - last +;; - append (py-extend) +;; - delete (py-delete-item) +;; - min (py-min) +;; - max (py-max) +;; - member (py-in) +;; - reverse (py-reversed) +;; - length (py-len) +define : bench-append param-list + . "Test (append a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (append a b) :let ((a (iota N))(b (iota m))) + zip param-list : map f param-list + +define : bench-ref param-list + . "Test (list-ref a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (list-ref a b) :let ((a (iota (max N m)))(b (- m 1))) + zip param-list : map f param-list + +define : bench-car param-list + . "Test (coar a b) with element A and list B of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) + benchmark (car b) :let ((b (iota N))) + zip param-list : map f param-list + +define : bench-cdr param-list + . "Test (cdr a b) with element A and list B of lengths from the param-list (note: this is really, really fast)." + define : f x + let : (N (list-ref x 0)) + benchmark (cdr b) :let ((b (iota N))) + zip param-list : map f param-list + +define : bench-sort param-list + . "Test (sort a <) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) + benchmark (sort a <) :let ((a (iota N))) + zip param-list : map f param-list + +define : bench-cons param-list + . "Test (cons a b) with element A and list B of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (cons b a) :let ((a (iota N))(b m)) + zip param-list : map f param-list + +define : bench-copy param-list + . "Test (cons a b) with element A and list B of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) + benchmark (list-copy a) :let ((a (iota N))) + zip param-list : map f param-list + +define : bench-set param-list + . "Test (cons a b) with element A and list B of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (list-set! a b #t) :let ((a (iota (max N m)))(b (- m 1))) + zip param-list : map f param-list + +define : bench-copy param-list + . "Copy a list of length N." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (set! b (list-copy a)) :let ((a (iota N))(b #f)) + zip param-list : map f param-list + +define : bench-getslice-left param-list + . "Get a slice from left." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (take (drop a b) b) :let ((a (iota (max N (* 2 m))))(b m)) + zip param-list : map f param-list + +define : bench-getslice-right param-list + . "Get a slice from right." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (take-right (drop-right a b) b) :let ((a (iota (max N (* 2 m))))(b m)) + zip param-list : map f param-list + +define : bench-length param-list + . "Get the length of a list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (length a) :let ((a (iota N))(b m)) + zip param-list : map f param-list + +define : bench-reverse param-list + . "Reverse a list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (reverse a) :let ((a (iota N))(b m)) + zip param-list : map f param-list + +define : bench-member param-list + . "Check (member b a)." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (member b a) :let ((a (iota N)) (b (- m 1))) + zip param-list : map f param-list + +define : bench-last param-list + . "Get the last element of a list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (last a) :let ((a (iota N))(b m)) + zip param-list : map f param-list + +define : bench-max param-list + . "Get the maximum value of a list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (apply max a) :let ((a (iota N))(b m)) + zip param-list : map f param-list + +define : bench-min param-list + . "Get the minimum value of a list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (apply min a) :let ((a (iota N))(b m)) + zip param-list : map f param-list + +define : bench-delete param-list + . "Check (member b a)." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (delete b a) :let ((a (iota N)) (b (- m 1))) + zip param-list : map f param-list + +define : bench-delete-smaller param-list + . "Check (delete b a <)." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (delete b a <) :let ((a (iota N)) (b (- m 1))) + zip param-list : map f param-list + +define : bench-delete-larger param-list + . "Check (delete b a >)." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (delete b a >) :let ((a (iota N)) (b (- m 1))) + zip param-list : map f param-list + +define : bench-delete! param-list + . "Check (member b a)." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (delete! b a) :let ((a (iota N)) (b (- m 1))) + zip param-list : map f param-list + + +;; TODO: VList benchmarks + + +;; String benchmarks +define : bench-append-string param-list + . "Test (string-append a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (string-append a b) :let ((a (make-string N))(b (make-string m))) + zip param-list : map f param-list + +define : bench-append-string/shared param-list + . "Test (string-append/shared a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (string-append/shared a b) :let ((a (make-string N))(b (make-string m))) + zip param-list : map f param-list + +;; Vector benchmarks +define : bench-append-vector param-list + . "Test (vector-append a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (vector-append a b) :let ((a (make-vector N 1))(b (make-vector m 1))) + zip param-list : map f param-list + +;; Map/set benchmarks +define : bench-assoc param-list + . "Test (assoc a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (assoc a b) :let ((a m)(b (reverse (fold (λ (x y z) (acons x y z)) '() (iota N 1) (iota N 1))))) + zip param-list : map f param-list + + +;; opertations +define : bench-operation-+ param-list + . "Test (assoc a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (+ a b) :let ((a N)(b m)(c 1)(d 2)) + zip param-list : map f param-list + +define : bench-operation-+++ param-list + . "Test (assoc a b) with lists of lengths from the param-list." + define : f x + let : (N (list-ref x 0)) (m (list-ref x 1)) + benchmark (+ (+ (+ a b) c) d) :let ((a N)(b m)(c 50)(d 100)) + zip param-list : map f param-list + + +;; prepare a multi-function fit +import + only : examples ensemble-estimation + . EnSRF make-covariance-matrix-with-offdiagonals-using-stds + . standard-deviation-from-deviations x-deviations->y-deviations + . x^steps + only : ice-9 popen + . open-output-pipe close-pipe + +define-syntax-rule : or0 test c ... + if test : begin c ... + . 0 + +define-syntax-rule : oror0 test1 test2 c ... + if (or test1 test2) : begin c ... + . 0 + +define-syntax-rule : define-quoted sym val + ;; set the value to true using eval to break the symbol->variable barrier + primitive-eval `(define ,sym val) + +define* + H-N-m x pos #:key all const OlogN OsqrtN ON ONlogN ON² + . Ologm Osqrtm Om Omlogm Om² + . OlogNm ONlogm OmlogN ONm + . ONlogNlogN Omlogmlogm + . "Observation operator. It generates modelled observations from the input. + +x are parameters to be optimized, pos is another input which is not optimized. For plain functions it could be the position of the measurement on the x-axis. We currently assume absolute knowledge about the position. +" + let : (N (first pos)) (m (second pos)) + + + oror0 all const : list-ref x 0 ; constant value + ;; pure N + oror0 all OlogN : * (list-ref x 1) : log (+ 1 N) ; avoid breakage at pos 0 + oror0 all OsqrtN : * (list-ref x 2) : sqrt N + oror0 all ON : * (list-ref x 3) N + oror0 all ONlogN : * (list-ref x 4) : * N : log (+ 1 N) + oror0 all ON² : * (list-ref x 5) : expt N 2 + ;; pure m + oror0 all Ologm : * (list-ref x 6) : log (+ 1 m) + oror0 all Osqrtm : * (list-ref x 7) : sqrt m + oror0 all Om : * (list-ref x 8) m + oror0 all Omlogm : * (list-ref x 9) : * m : log (+ 1 m) + oror0 all Om² : * (list-ref x 10) : expt m 2 + ;; mixed terms + oror0 all OlogNm : * (list-ref x 11) : log (+ 1 N m) + oror0 all ONlogm : * (list-ref x 12) : * N : log (+ 1 m) + oror0 all OmlogN : * (list-ref x 13) : * m : log (+ 1 N) + oror0 all ONm : * (list-ref x 14) : * N m + oror0 all ONlogNlogN : * (list-ref x 15) : * (log (+ 1 N)) (log (+ 1 N)) N + oror0 all Omlogmlogm : * (list-ref x 16) : * (log (+ 1 m)) (log (+ 1 m)) m + + +define : interleave lx lz + cond + (null? lx) lz + else + cons : car lx + interleave lz : cdr lx + + +define : print-fit x σ + . "Print the big-O parameters which are larger than 2.6σ (2.6 times their standard deviation, roughly 99% / p 0.01)." + ;; see https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule#/media/File:Standard_score_and_prediction_interval.png + let : : number-format "~,1,,,,,'ee±~,1,,,,,'ee" + let big-O + : names : list "" "log(N)" "sqrt(N)" "N log(N)" "N^2" "log(m)" "sqrt(m)" "m" "m log(m)" "m^2" "log(N + m)" "N log(m)" "m log(N)" "N m" "N log(N)^2" "m^2 N" + x x + σ σ + cond + : or (null? names) (null? x) (null? σ) + newline + : > (abs (car x)) (* 2.6 (car σ)) ;; 99%: 2.6 times standard deviation as significance level + format #t : string-append number-format " " (car names) " " + . (car x) (car σ) + big-O (cdr names) (cdr x) (cdr σ) + else + big-O (cdr names) (cdr x) (cdr σ) + + +define : flatten li + append-ec (: i li) i + +;; TODO: add filename and title and fix the units +define* : plot-benchmark-result bench H #:key filename title + let* + : ensemble-member-count 32 + ensemble-member-plot-skip 8 ;; must not be zero! + iterations 4 + y_0 : apply min : map car : map cdr bench + y_m : * 0.25 : apply max : map car : map cdr bench + nb : apply max : interleave (map car (map car bench)) (map car (map cdr (map car bench))) + ;; "const" "log(N)" "sqrt(N)" "N" "N^2" "N^3" "log(m)" "sqrt(m)" "m" "m^2" "m^3" "log(N + m)" "N log(m)" "m log(N)" "N m" "N^2 m" "m^2 N" + x^b : list y_0 (/ y_m (log nb)) (/ y_m (sqrt nb)) (/ y_m nb) (/ y_m nb nb) (/ y_m nb nb nb) (/ y_m (log nb)) (/ y_m (sqrt nb)) (/ y_m nb) (/ y_m nb nb) (/ y_m nb nb nb) (/ y_m nb nb) (/ y_m nb nb) (/ y_m nb nb nb) (/ y_m nb nb nb) (/ y_m nb nb nb nb) (/ y_m nb nb nb nb) ; inital guess: constant starting at the first result + x^b-std : list-ec (: i x^b) (* 2 i) ; inital guess: 200% uncertainty + P : make-covariance-matrix-with-offdiagonals-using-stds x^b-std + y⁰-pos : map car bench + y⁰ : append-map cdr bench + ;; several iterations to better cope with non-linearity, following http://journals.ametsoc.org/doi/abs/10.1175/MWR-D-11-00176.1 (but globally) + y⁰-stds : list-ec (: i y⁰) : * (sqrt iterations) : min max-absolute-uncertainty-seconds {max-relative-uncertainty * i} ; enforcing 20% max std in benchmark-run + R : make-covariance-matrix-with-offdiagonals-using-stds y⁰-stds + optimized ;; iterate N times + let lp : (N iterations) (x^b x^b) (P P) + let : : optimized : EnSRF H x^b P y⁰ R y⁰-pos ensemble-member-count + cond + : <= N 1 + . optimized + else + let* + : x-opt : list-ref optimized 0 + x-deviations : list-ref optimized 1 + x-std ;; re-create the ensemble with the new std + list-ec (: i (length x-opt)) + apply standard-deviation-from-deviations + list-ec (: j x-deviations) : list-ref j i + P : make-covariance-matrix-with-offdiagonals-using-stds x-std + lp (- N 1) x-opt P + x-opt : list-ref optimized 0 + x-deviations : list-ref optimized 1 + x-std + list-ec (: i (length x-opt)) + apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i + y-deviations : x-deviations->y-deviations H x-opt x-deviations y⁰-pos + y-stds : list-ec (: i y-deviations) : apply standard-deviation-from-deviations i + y-opt : map (λ (x) (H x-opt x)) y⁰-pos + x^b-deviations-approx + list-ec (: i ensemble-member-count) + list-ec (: j (length x^b)) + * : random:normal + sqrt : list-ref (list-ref P j) j ; only for diagonal P! + y^b-deviations : x-deviations->y-deviations H x^b x^b-deviations-approx y⁰-pos + y-std + apply standard-deviation-from-deviations + flatten y-deviations + y-stds : list-ec (: i y-deviations) : apply standard-deviation-from-deviations i + y^b-stds : list-ec (: i y^b-deviations) : apply standard-deviation-from-deviations i + + ;; print-fit x-std + when title + display title + newline + print-fit x-opt x-std + ;; TODO: minimize y-mismatch * y-uncertainty + format #t "Model standard deviation (uncertainty): ~,4e\n" y-std + newline + ; now plot the result + let : : port : open-output-pipe "python2" + format port "# encoding: utf-8\n" + format port "from __future__ import unicode_literals\n" + format port "import pylab as pl\nimport matplotlib as mpl\n" + format port "y0 = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰ + format port "ystds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰-stds + format port "ypos1 = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : first i + format port "ypos2 = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : second i + format port "yinit = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x^b i + format port "yinitstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y^b-stds + format port "yopt = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x-opt i + format port "yoptstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y-stds + ;; format port "pl.errorbar(*zip(*sorted(zip(ypos1, yinit))), yerr=zip(*sorted(zip(ypos1, yinitstds)))[1], label='prior vs N')\n" + format port "pl.errorbar(*zip(*sorted(zip(ypos1, yopt))), yerr=zip(*sorted(zip(ypos1, yoptstds)))[1], marker='H', mew=1, ms=10, linewidth=0.1, label='optimized vs N')\n" + format port "eb=pl.errorbar(*zip(*sorted(zip(ypos1, y0))), yerr=ystds, alpha=0.6, marker='x', mew=2, ms=10, linewidth=0, label='measurements vs N')\neb[-1][0].set_linewidth(1)\n" + ;; format port "pl.errorbar(*zip(*sorted(zip(ypos2, yinit))), yerr=zip(*sorted(zip(ypos2, yinitstds)))[1], label='prior vs. m')\n" + format port "pl.errorbar(*zip(*sorted(zip(ypos2, yopt))), yerr=zip(*sorted(zip(ypos2, yoptstds)))[1], marker='h', mew=1, ms=10, linewidth=0.1, label='optimized vs. m')\n" + format port "eb=pl.errorbar(*zip(*sorted(zip(ypos2, y0))), yerr=ystds, alpha=0.6, marker='x', mew=2, ms=10, linewidth=0, label='measurements vs. m')\neb[-1][0].set_linewidth(1)\n" + format port "pl.plot(sorted(ypos1+ypos2), pl.log(sorted(ypos1+ypos2))*(max(y0) / pl.log(max(ypos1+ypos2))), label='log(x)')\n" + format port "pl.plot(sorted(ypos1+ypos2), pl.sqrt(sorted(ypos1+ypos2))*(max(y0) / pl.sqrt(max(ypos1+ypos2))), label='sqrt(x)')\n" + format port "pl.plot(sorted(ypos1+ypos2), pl.multiply(sorted(ypos1+ypos2), max(y0) / max(ypos1+ypos2)), label='x')\n" + list-ec (: step 0 (length x^steps) 4) + let : : members : list-ref x^steps (- (length x^steps) step 1) + list-ec (: member-idx 0 (length members) ensemble-member-plot-skip) ; reversed + let : : member : list-ref members member-idx + format port "paired = pl.get_cmap('Paired') +cNorm = mpl.colors.Normalize(vmin=~A, vmax=~A) +scalarMap = mpl.cm.ScalarMappable(norm=cNorm, cmap=paired)\n" 0 (length member) + list-ec (: param-idx 0 (length member) 4) ; step = 4 + ;; plot parameter 0 + let : (offset (/ (apply max (append y⁰ y-opt)) 2)) (spreading (/ (apply max (append y⁰ y-opt)) (- (apply max member) (apply min member)) 2)) + format port "pl.plot(~A, ~A, marker='.', color=scalarMap.to_rgba(~A), linewidth=0, label='', alpha=0.6, zorder=-1)\n" + . (/ step 1) (+ offset (* spreading (list-ref member param-idx))) param-idx + format port "pl.legend(loc='upper left', fancybox=True, framealpha=0.5)\n" + format port "pl.xlabel('position (N or m) / arbitrary units')\n" + format port "pl.ylabel('time / s')\n" + format port "pl.title('''~A''')\n" : or title "Operation scaling behaviour" + format port "pl.text(1, 0, '''fit: ~A''', horizontalalignment='right', verticalalignment='center', transform=pl.gca().transAxes)\n" : with-output-to-string : λ() : print-fit x-opt x-std + format port "pl.xscale('log')\n" + ;; format port "pl.yscale('log')\n" + if filename + format port "pl.savefig('~A', bbox_inches='tight')\n" filename + format port "pl.show()\n" + format port "exit()\n" + close-pipe port + + +define : main args + let : : steps 25 + when : member "--quick" args + set! max-relative-uncertainty 1.5 + set! max-absolute-uncertainty-seconds 1.e-1 + set! min-aggregated-runtime-seconds 1.e-7 + set! max-iterations 16 + set! steps 5 + let* + : H : lambda (x pos) (H-N-m x pos #:all #t) + H-const : lambda (x pos) (H-N-m x pos #:const #t) + H-log : lambda (x pos) (H-N-m x pos #:const #t #:OlogN #t #:Ologm #t) + H-lin : lambda (x pos) (H-N-m x pos #:const #t #:ON #t #:Om #t #:ONlogN #t #:Omlogm #t #:ONlogNlogN #t #:Omlogmlogm #t ) + pbr plot-benchmark-result + let lp + : N-start `(1 1 1 100 ,(* steps 1000)) + N-step '(1000 1000 0 0 0) + m-start '(1 100 1 1 1) + m-step '(0 0 1000 1000 1000) + cond + : null? N-start + . #t + else + let* + : N : car N-start + dN : car N-step + m : car m-start + dm : car m-step + param-list : zip (logiota steps N dN) (logiota steps m dm) + define : title description + string-append description + format #f ", ~a ~a" + if (equal? dN 0) N "N" + if (equal? dm 0) m "m" + define : filename identifier + format #f "/tmp/benchmark-~a-~a-~a.png" + . identifier + if (equal? dN 0) N "N" + if (equal? dm 0) m "m" + pbr (bench-operation-+ param-list) H + . #:title : title "+ N m" + . #:filename : filename "operation-plus" + pbr (bench-operation-+++ param-list) H + . #:title : title "+ (+ (+ N m) 50) 100" + . #:filename : filename "operation-plus3" + pbr (bench-ref param-list) H-const + . #:title : title "list-ref (iota (max m N)) (- m 1)" + . #:filename : filename "list-ref" + when : equal? dm 0 ;; only over N + pbr (bench-car param-list) H-const + . #:title : title "car (iota N)" + . #:filename : filename "car" + pbr (bench-cdr param-list) H-const + . #:title : title "cdr (iota N)" + . #:filename : filename "cdr" + pbr (bench-sort param-list) H-lin + . #:title : title "sort (iota N)" + . #:filename : filename "sort" + pbr (bench-copy param-list) H + . #:title : title "list-copy (iota N)" + . #:filename : filename "copy" + pbr (bench-length param-list) H + . #:title : title "length (iota N)" + . #:filename : filename "length" + pbr (bench-reverse param-list) H + . #:title : title "reverse (iota N)" + . #:filename : filename "reverse" + pbr (bench-last param-list) H + . #:title : title "last (iota N)" + . #:filename : filename "last" + pbr (bench-max param-list) H + . #:title : title "apply max (iota N)" + . #:filename : filename "max" + pbr (bench-min param-list) H + . #:title : title "apply min (iota N)" + . #:filename : filename "min" + pbr (bench-append param-list) H-lin + . #:title : title "append (iota N) (iota m)" + . #:filename : filename "list-append" + pbr (bench-set param-list) H + . #:title : title "list-set! (iota (max N m)) m #t" + . #:filename : filename "list-set" + pbr (bench-getslice-left param-list) H + . #:title : title "take (drop (iota (max N (* 2 m))) m) m" + . #:filename : filename "list-getslice-left" + pbr (bench-getslice-right param-list) H + . #:title : title "take-right (drop-right (iota (max N (* 2 m))) m) m" + . #:filename : filename "list-getslice-right" + pbr (bench-member param-list) H + . #:title : title "member (- m 1) (iota N)" + . #:filename : filename "member" + pbr (bench-delete param-list) H + . #:title : title "delete (- m 1) (iota N)" + . #:filename : filename "delete" + pbr (bench-delete-smaller param-list) H + . #:title : title "delete (- m 1) (iota N) <" + . #:filename : filename "delete-smaller" + pbr (bench-delete-larger param-list) H + . #:title : title "delete (- m 1) (iota N) >" + . #:filename : filename "delete-larger" + pbr (bench-delete! param-list) H + . #:title : title "delete! (- m 1) (iota N)" + . #:filename : filename "delete-bang" + ;; strings + pbr (bench-append-string param-list) H-lin + . #:title : title "string-append (make-string N) (make-string m)" + . #:filename : filename "string-append" + pbr (bench-append-string/shared param-list) H-lin + . #:title : title "string-append/shared (make-string N) (make-string m)" + . #:filename : filename "string-append-shared" + ;; vectors + pbr (bench-append-vector param-list) H-lin + . #:title : title "vector-append (make-vector N 1) (make-vector m 1)" + . #:filename : filename "vector-append" + ;; maps + pbr (bench-assoc param-list) H + . #:title : title "assoc m '((1 . 1) (2 . 2) ... (N . N))" + . #:filename : filename "assoc" + pbr (bench-cons param-list) H + . #:title : title "cons m (iota N)" + . #:filename : filename "cons" + lp + cdr N-start + cdr N-step + cdr m-start + cdr m-step diff --git a/examples/cartesian-sets.w b/examples/cartesian-sets.w new file mode 100755 --- /dev/null +++ b/examples/cartesian-sets.w @@ -0,0 +1,39 @@ +#!/usr/bin/env sh +# -*- wisp -*- +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples cartesian-sets) main)' -s "$0" "$@" +; !# +;; Implementation of the cartesian product over a list of lists, building on http://stackoverflow.com/a/20591545/7666 + +define-module : examples cartesian-sets + . #:export : cartesian-product + +import : srfi srfi-1 + +;; original +define : cartesian-product-lambda . lists + fold-right + lambda : xs ys + append-map (lambda (x) + (map (lambda (y) + (cons x y)) + ys)) + . xs + . '(()) + . lists + + +;; easier to understand +define : cartesian-product . lists + define : product-of-two xs ys + define : cons-on-each-ys x + map : lambda (y) (cons x y) + . ys + append-map cons-on-each-ys + . xs + fold-right product-of-two '(()) lists + +define : main args + write : cartesian-product-lambda '(1 2) '(3 4) '(5 6) + newline + write : cartesian-product '(1 2) '(3 4) '(5 6) + newline diff --git a/examples/cholesky.w b/examples/cholesky.w --- a/examples/cholesky.w +++ b/examples/cholesky.w @@ -6,41 +6,105 @@ exec guile -L $(dirname $(dirname $(real ;; Cholesky decomposition, following https://de.wikipedia.org/wiki/Cholesky-Zerlegung#Pseudocode define-module : examples cholesky - . #:export : cholesky! + . #:export : cholesky! matrix-ref matrix-set! matrix-transpose matrix-multiply + +use-modules : srfi srfi-42 ; list-comprehension + srfi srfi-11 ; let-values -use-modules : guildhall ext foof-loop +define : ->exact-matrix list-of-lists + . "Turn a list of lists into a matrix" + map + λ : x + apply list : map inexact->exact x + . list-of-lists + +define : ->inexact-matrix list-of-lists + . "Turn a list of lists into a matrix" + map + λ : x + apply list : map exact->inexact x + . list-of-lists + +define : matrix-ref X row col + list-ref (list-ref X row) col -define : matrrix-ref X u v - list-ref (list-ref X u) v +define : matrix-set! X row col val + let : : sublist : list-ref X row + list-set! sublist col val + list-set! X row sublist + +define : matrix-transpose X + . "Swap columns and rows of a matrix" + list-ec (: outer (length X)) ; outer + list-ec (: inner (length (list-ref X outer))) ; inner + matrix-ref X inner outer -define : matrrix-set! X u v val - list-set! (list-ref X u) v val +define : matrix-multiply X Y + . "Calculate the matrix product of X and Y" + list-ec (: row (length Y)) + list-ec (: col (length X)) + sum-ec (: inner (length (list-ref Y row))) + * : matrix-ref Y inner col + matrix-ref X row inner +define : mostly-exact-sqrt n + . "Calculate an exact sqrt if possible, else use a good approximation" + inexact->exact : sqrt : inexact->exact n define : cholesky! a - . "Modifies the square matirx a to contain its cholesky decomposition. + . "Modifies the square matrix a to contain its cholesky decomposition. sets a to g with a = ggT, a is represented as list of lists." let : : n : length a - loop : : for i : up-from 1 : to n - loop : : for j : up-from 1 : to i + do-ec (: i n) + do-ec (: j (+ 1 i)) let : : sum : matrix-ref a i j + ; format #t "n: ~A i: ~A j: ~A\n" n i j when : >= j 1 - loop : : for k : up-from 1 : to {j - 1} + do-ec (: k j) set! sum : - sum : * (matrix-ref a i k) (matrix-ref a j k) cond : > i j ; lower triangle matrix-set! a i j - / sum : matrix-ref a j j - . a + / sum + matrix-ref a j j : > sum 0 ; diagonal element - matrix-set! a i i : sqrt sum - . a + matrix-set! a i i + mostly-exact-sqrt sum ; preserves the exactness, since the result is an exact number, though not an exact result else - throw 'matrix-numerically-not-symmetric-positive-definite + throw 'matrix-numerically-not-symmetric-positive-definite a + do-ec (: i n) + do-ec (: j (+ 1 i) n) + matrix-set! a i j 0 + . a define : main args - display : cholesky! '((1 2)(2 4)) + let + : X : ->exact-matrix '(( 1 -1 1) + (-1 3 -.5) + ( 1 -.5 4)) + L : ->exact-matrix '(( 1 0 0) + (-1 1.41421356 0) + ( 1 0.35355339 1.6955825)) + format #t "X\n" + display : ->inexact-matrix X + newline + format #t "cholesky\n" + display : ->inexact-matrix : cholesky! X + newline + format #t "L\n" + display : ->inexact-matrix L + newline + format #t "L·Lt\n" + display + ->inexact-matrix + matrix-multiply L : matrix-transpose L + newline + format #t "X·Xt\n" + display + ->inexact-matrix + matrix-multiply X : matrix-transpose X + newline diff --git a/examples/commandline-handling.w b/examples/commandline-handling.w new file mode 100755 --- /dev/null +++ b/examples/commandline-handling.w @@ -0,0 +1,203 @@ +#!/usr/bin/env sh +# -*- wisp -*- +guile-2.0 -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile-2.0 -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(examples commandline-handling)' -s "$0" "$@" +; !# + +;; This is an example for complex commandline handling for a tool +;; which takes a list of tasks to run as arguments. + +define-module : examples commandline-handling + . #:export : main + +import + ice-9 format + srfi srfi-1 + srfi srfi-37 + ice-9 popen ; for pipe-open* + ice-9 rdelim ; for read-string + + + +define : runcommand cmd + let* + : port : open-input-pipe cmd + output : read-string port + display output + newline + + +define : run-my-shell-command + . "Run a predefined shell command" + let + : + cmd + string-join + list "for i in {1..5}; do echo $i; done" + when : debug? + display cmd : current-error-port + newline : current-error-port + runcommand cmd + + +define : help . args ; args used for simpler option parsing + if + and + >= (length args) 3 + third args + member (string->symbol (third args)) : task-list ; help got an argument + let* + : fun : string->symbol : third args + mod : resolve-module '(examples commandline-handling) + doc : procedure-documentation : module-ref mod fun + format #t "~a\n\n~a\n" fun doc + format #t "Usage: commandline-handling.w [option ...] [--] [task ...] + +Run the selected tasks given on the commandline. + + -h [TASK] --help[=TASK] + display this help or infomation about the task and exit + -V --version output version information and exit + --tasks list all available tasks + -d [LEVEL] --debug[=LEVEL] + set logging to debug or to the given level + +Defined tasks: + + ~a + +" : string-join : map symbol->string : task-list + exit 0 + + +define : version + display "commandline-handling 0.0.0 + +Copyright (C) 2016 Arne Babenhauserheide, for IMK-ASF at Karlsruhe Institute for Technology +See the file COPYING. There is NO warranty. +" + +define help-option + option '(#\h "help") + . #f #t help + +define version-option + option '(#\V "version") + . #f #f + λ : option name arg operands + version + exit 0 + +define : debug? + equal? 'debug : assoc-ref %options 'log-level + + +define debug-option + let + : required #f + optional #t ; can take an argument + option '(#\d "debug") + . required optional + λ : option name arg operands + if arg + set! %options : alist-cons 'log-level (string->symbol arg) %options + set! %options : alist-cons 'log-level 'debug %options + format : current-error-port + . "debug: activate log level ~a\n" + if arg arg 'debug + . operands + + +define utility-procedures + ' parse-args main run-task task-list runcommand debug? + +define debug-procedures + ' tasks help options version + +define : task-list + let : : mod : resolve-module '(examples commandline-handling) + delete #f + module-map + λ : x y + if + and + procedure? : module-ref mod x + not : member x utility-procedures + if : equal? 'debug : assoc-ref %options 'log-level + . #t + not : member x debug-procedures + . x + . #f + . mod + +define : tasks . args + map : λ (x) (display x)(newline) + task-list + +define tasks-option + option '("tasks") + . #f #f + λ : option name arg operands + tasks + exit 0 + + +define %options + ' + log-level . info + +define : options + format : current-error-port + . "Currently active options: ~A\n" + . %options + +define %option-list + list help-option version-option debug-option tasks-option + + +define : run-task task + let* + : mod : resolve-module '(examples commandline-handling) + t : string->symbol task + var : module-variable mod t + cond + var + let : : T : module-ref mod t + if : procedure? T + T + format : current-error-port + . "Not a procedure: ~a refers to ~a\n" task var + else + format : current-error-port + . "Unknown task: ~a\n" task + + +define : parse-args args + let + : + tasks + reverse + args-fold args + . %option-list + λ : option name arg operands + format : current-error-port + . "unrecognized command line argument name: ~a arg: ~a operands: ~a\n" + . name arg operands + exit 1 + λ : operand operands + cons operand operands + . '() + for-each + λ : task + if : and (equal? task "help") (not (null? (delete "help" tasks))) + map + λ : x + help #f #f x + delete "help" tasks + run-task task + . tasks + +define* : main args + if : null? : cdr args + help + parse-args : cdr args diff --git a/examples/doctests-test.scm b/examples/doctests-test.scm new file mode 100755 --- /dev/null +++ b/examples/doctests-test.scm @@ -0,0 +1,25 @@ +#!/usr/bin/env sh +exec guile -L $(dirname $(dirname $(realpath "$0"))) -e '(@@ (examples doctests-test) main)' -s "$0" "$@" +; !# + +(define-module (examples doctests-test)) + +(import (examples doctests)) + +(define (foo) + "(test 'foo + (test-equal \"bar\" (foo))) + " + "bar") + +(define %this-module (current-module)) +(define (main args) + " Testing doctests + (test 'mytest + (test-assert #t) + (test-assert #f)) +" + (doctests-testmod %this-module)) + + + diff --git a/examples/doctests-test.w b/examples/doctests-test.w new file mode 100755 --- /dev/null +++ b/examples/doctests-test.w @@ -0,0 +1,25 @@ +#!/usr/bin/env sh +# -*- wisp -*- +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples doctests-test) main)' -s "$0" "$@" +; !# + +define-module : examples doctests-test + +import : examples doctests + +define : foo + . "(test 'foo + (test-equal \"bar\" (foo))) + " + . "bar" + +define %this-module : current-module +define : main args + . " Testing doctests + (test 'mytest + (test-assert #t) + (test-assert #f)) +" + doctests-testmod %this-module + diff --git a/examples/doctests-testone.scm b/examples/doctests-testone.scm new file mode 100755 --- /dev/null +++ b/examples/doctests-testone.scm @@ -0,0 +1,16 @@ +#!/usr/bin/env sh +exec guile -L $(dirname $(dirname $(realpath "$0"))) -s "$0" "$@" +; !# + +(import (examples doctests)) + +(define (foo) + "(test 'foo + (test-equal \"bar\" (foo))) + " + "bar") + +(doctests-testmod (current-module)) + + + diff --git a/examples/doctests.scm b/examples/doctests.scm new file mode 100755 --- /dev/null +++ b/examples/doctests.scm @@ -0,0 +1,118 @@ +#!/usr/bin/env sh +exec guile -L $(dirname $(dirname $(realpath "$0"))) -e '(@@ (examples doctests) main)' -s "$0" "$@" +; !# + +(define-module (examples doctests) + #:export (doctests-testmod)) + +(import (ice-9 optargs) + (ice-9 rdelim) + (ice-9 match) + (oop goops) + (texinfo reflection)) + +; define basic dir +(define* (dir #:key (all? #f)) + (if all? + (map (λ (x) (cons (module-name x) + (module-map (λ (sym var) sym) (resolve-interface (module-name x))))) + (cons (current-module) (module-uses (current-module)))) + (module-map (λ (sym var) sym) (current-module)))) +; add support for giving the module as argument +(define-generic dir) +(define-method (dir (all? <boolean>)) (dir #:all? all?)) +(define-method (dir (m <list>)) (module-map (λ (sym var) sym) (resolve-interface m))) +; add support for using modules directly (interfaces are also modules, so this catches both) +(define-method (dir (m <module>)) (module-map (λ (sym var) sym) m)) + +(define (string-index s fragment) + "return the index of the first character of the FRAGMENT in string S." + (let loop ((s s) (i 0)) + (if (= 0 (string-length s)) + #f + (if (string-prefix? fragment s) + i + (loop (string-drop s 1) (+ i 1)))))) + +(define (doctests-extract-from-string s) + "Extract all test calls from a given string. + + This is an example test: + + (test 'mytest + (define v (make-vector 5 99)) + (test-assert (vector? v)) + (test-eqv 99 (vector-ref v 2)) + (vector-set! v 2 7) + (test-eqv 7 (vector-ref v 2))) + (test 'mytest2 + (test-assert #t)) +" + (let lp + ((str s) + (tests (list))) + (if (string-null? str) + (reverse tests) + (let ((idx (string-index str "(test"))) + (if (not idx) + (reverse tests) + (let ((sub (substring str idx))) + (lp ; recurse with the rest of the string + (with-input-from-string sub + (λ () (read) (read-string))) + (cons + (with-input-from-string sub + (λ () (read))) + tests)))))))) + +(define (doctests-testmod mod) + "Execute all doctests in the current module" + (let* + ((names (module-map (λ (sym var) sym) mod)) + (filename + (if (module-filename mod) (string-join (string-split (module-filename mod) #\/) "-") + (string-join (cons "._" (map symbol->string (module-name mod))) "-"))) + (docstrings + (map (λ (x) (if (procedure? x) (procedure-documentation x))) + (map (λ (x) (module-ref mod x)) names)))) + (let loop + ((names names) + (docstrings docstrings)) + (when (not (null? docstrings)) + (when (string? (car docstrings)) + (let* + ((name (car names)) + (docstring (car docstrings))) + (let loop-tests + ((doctests (doctests-extract-from-string (car docstrings)))) + (when (and (list? doctests) (not (null? doctests))) + (let* + ((doctest (car doctests)) + (testid + (if (not (list? doctest)) + #f + (string-join (list filename (symbol->string name) (symbol->string (primitive-eval (car (cdr doctest))))) + "--"))) + (cleaned + (if (not (list? doctest)) + '#f + (append + (cons 'begin + (cons '(import (srfi srfi-64)) + (cons + (list 'test-begin testid) + (cdr (cdr doctest))))) + (list (list 'test-end testid)))))) + (when cleaned + (let () + (eval cleaned mod)) + (newline)) + (loop-tests (cdr doctests))))))) + (loop (cdr names) (cdr docstrings)))))) + +(define %this-module (current-module)) +(define (main args) + (doctests-testmod %this-module)) + + + diff --git a/examples/doctests.w b/examples/doctests.w new file mode 100755 --- /dev/null +++ b/examples/doctests.w @@ -0,0 +1,118 @@ +#!/usr/bin/env sh +# -*- wisp -*- +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples doctests) main)' -s "$0" "$@" +; !# + +define-module : examples doctests + . #:export : doctests-testmod + +import : ice-9 optargs + ice-9 rdelim + ice-9 match + oop goops + texinfo reflection + +; define basic dir +define* (dir #:key (all? #f)) + if all? + map (λ (x) (cons (module-name x) + (module-map (λ (sym var) sym) (resolve-interface (module-name x))))) + cons (current-module) : module-uses (current-module) + module-map (λ (sym var) sym) (current-module) +; add support for giving the module as argument +define-generic dir +define-method (dir (all? <boolean>)) (dir #:all? all?) +define-method (dir (m <list>)) (module-map (λ (sym var) sym) (resolve-interface m)) +; add support for using modules directly (interfaces are also modules, so this catches both) +define-method (dir (m <module>)) (module-map (λ (sym var) sym) m) + +define : string-index s fragment + . "return the index of the first character of the FRAGMENT in string S." + let loop : (s s) (i 0) + if : = 0 : string-length s + . #f + if : string-prefix? fragment s + . i + loop (string-drop s 1) (+ i 1) + +define : doctests-extract-from-string s + . "Extract all test calls from a given string. + + This is an example test: + + (test 'mytest + (define v (make-vector 5 99)) + (test-assert (vector? v)) + (test-eqv 99 (vector-ref v 2)) + (vector-set! v 2 7) + (test-eqv 7 (vector-ref v 2))) + (test 'mytest2 + (test-assert #t)) +" + let lp + : str s + tests : list + if : string-null? str + reverse tests + let : : idx : string-index str "(test" + if : not idx + reverse tests + let : : sub : substring str idx + lp ; recurse with the rest of the string + with-input-from-string sub + λ () (read) (read-string) + cons + with-input-from-string sub + λ () : read + . tests + +define : doctests-testmod mod + . "Execute all doctests in the current module" + let* + : names : module-map (λ (sym var) sym) mod + filename + if (module-filename mod) (string-join (string-split (module-filename mod) #\/ ) "-") + string-join (cons "._" (map symbol->string (module-name mod))) "-" + docstrings + map (λ (x) (if (procedure? x) (procedure-documentation x))) + map (λ (x) (module-ref mod x)) names + let loop + : names names + docstrings docstrings + when : not : null? docstrings + when : string? : car docstrings + let* + : name : car names + docstring : car docstrings + let loop-tests + : doctests : doctests-extract-from-string : car docstrings + when : and (list? doctests) : not : null? doctests + let* + : doctest : car doctests + testid + if : not : list? doctest + . #f + string-join : list filename (symbol->string name) : symbol->string : primitive-eval : car : cdr doctest + . "--" + cleaned + if : not : list? doctest + . '#f + append + cons 'begin + cons '(import (srfi srfi-64)) + cons + list 'test-begin testid + cdr : cdr doctest + list : list 'test-end testid + when cleaned + let : + eval cleaned mod + newline + loop-tests : cdr doctests + loop (cdr names) (cdr docstrings) + +define %this-module : current-module +define : main args + doctests-testmod %this-module + diff --git a/examples/duel.w b/examples/duel.w new file mode 100755 --- /dev/null +++ b/examples/duel.w @@ -0,0 +1,68 @@ +#!/usr/bin/env sh +# -*- wisp -*- +D="$(dirname $(realpath "$0"))" +W="$(dirname $(dirname $(realpath "$0")))" +guile -L "$W" -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L "$W" --language=wisp -l "$D/enter-three-witches.w" -s "$0" "$@" +; !# + +import : examples enter-three-witches + +set! *random-state* : random-state-from-platform + +Enter : Galtag Nimbleday + Lowlife Pirate + choose your answer + +define challenges + ` + : You fight like a Dairy Farmer! + How appropriate! You fight like a cow! + And I've got a little TIP for you, get the POINT? + +; write answers +; newline + +define : random-challenge + list-ref challenges : random : length challenges + +define : list->textline L + string-join : map ->string L + . " " + +;; TODO: define-syntax define-interaction +define : duel me other + let* + : challenge : random-challenge + tease : car challenge + answers : map list->textline : cdr challenge + say-name other + say-words + : ,@tease + say-name ' : choose your answer + ;; TODO: shuffle the answers, check whether the right one is given + ;; (the first answer in the original ordering is the right one) + say-words + : ,(let ((counter 0)) + (string-join + (map (λ (x) + (set! counter (+ 1 counter)) + (string-append (number->string counter) " " x)) answers) "\n ")) + let + : answer : list-ref answers (- (string->number (format #f "~a" (peek-char))) 1) + drain-input (current-input-port) + say-name me + say-words + : ,answer + + +define-syntax-rule : Duel fighter1 fighter2 + duel + quote fighter1 + quote fighter2 + + +Duel + Galtag Nimbleday + Lowlife Pirate + diff --git a/examples/ensemble-estimation.w b/examples/ensemble-estimation.w --- a/examples/ensemble-estimation.w +++ b/examples/ensemble-estimation.w @@ -1,10 +1,11 @@ #!/usr/bin/env sh # -*- wisp -*- -exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples ensemble-estimation) main)' -s "$0" "$@" +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples ensemble-estimation) main)' -l $(dirname $(realpath "$0"))/cholesky.w -s "$0" "$@" ; !# ;; Simple Ensemble Square Root Filter to estimate function parameters -;; based on measurements. +;; based on measurements with uncertainty. ;; Provide first guess parameters x^b and measurements y⁰ to get ;; optimized parameters x^a. @@ -33,7 +34,15 @@ exec guile -L $(dirname $(dirname $(real ;; x'^a = x'^b - αK·H(x'^b) define-module : examples ensemble-estimation + . #:export (EnSRF H standard-deviation-from-deviations + make-covariance-matrix-with-offdiagonals-using-stds + x-deviations->y-deviations x^steps) + use-modules : srfi srfi-42 ; list-ec + srfi srfi-9 ; records + oop goops ; generic functions + ice-9 optargs + examples cholesky ; cholesky! for random variables with covariance use-modules : ice-9 popen . #:select : open-output-pipe close-pipe @@ -49,8 +58,46 @@ define : make-diagonal-matrix-with-trace list-ref trace i . 0.0 +define : make-covariance-matrix-with-offdiagonals-using-stds stds + . "this is a dense covariance matrix with (√1/N std_i std_j) as the off-diagonal elements, with N the number of elements in the stds." + let : : dim : length stds + list-ec (: i dim) + list-ec (: j dim) + if : = i j + expt (list-ref stds i) 2 + ; add smaller off-diag elements + * (sqrt (/ 1 dim)) (list-ref stds i) (list-ref stds j) + +; TODO: Allow for off-diagonal elements +define-class <sparse-covariance-matrix> () + trace #:getter get-trace #:init-keyword #:trace + zeros #:getter get-zeros #:init-keyword #:zeros + stds #:getter get-stds #:init-keyword #:stds + . #:allocation #:virtual + . #:slot-ref (lambda (o) + (map (lambda (x) (expt x 0.5)) (slot-ref o 'trace))) + . #:slot-set! (lambda (o m) + (slot-set! o 'trace (map (lambda (x) (expt x 2)) m)) + (slot-set! o 'zeros (list-ec (: i (length m)) 0))) + +define-generic list-ref +define-method : list-ref (M <sparse-covariance-matrix>) (i <integer>) + let + : trace : slot-ref M 'trace + zeros : slot-ref M 'zeros + append + list-head zeros i + list : list-ref trace i + list-tail zeros : + i 1 + +define-generic length +define-method : length (M <sparse-covariance-matrix>) + length : slot-ref M 'trace + define : make-covariance-matrix-from-standard-deviations stds - make-diagonal-matrix-with-trace : map (lambda (x) (expt x 2)) stds + ; make-diagonal-matrix-with-trace : map (lambda (x) (expt x 2)) stds + ; make <sparse-covariance-matrix> #:stds stds + make-covariance-matrix-with-offdiagonals-using-stds stds define : mean l . "Calculate the average value of l (numbers)." @@ -78,19 +125,26 @@ define* : write-multiple . x ;; Start with the simple case: One variable and independent observations (R diagonal) ;; First define a truth -define x^seed '(0.5 0.6 2 0.1) ; 0.7 0.9 0.8 0.4) +define x^seed '(-2 3 -1) ; 0.7 0.9 0.8 0.4) +define x^seed-std '(3 4 2) ; 0.2 0.2 0.2 0.2) ;; The size is the length of the seed, squared, each multiplied by each define x^true : append-ec (: i (length x^seed)) : list-ec (: j x^seed) : * j : list-ref x^seed i ;; And add an initial guess of the parameters -define x^b : append-ec (: i (length x^seed)) '(1 1 1 1) ; 1 1 1 1) ; initial guess -define P : make-covariance-matrix-from-standard-deviations : append-ec (: i (length x^seed)) '(0.5 0.1 0.3 0.1) ; 0.2 0.2 0.2 0.2) +define x^b : list-ec (: i (length x^true)) 1 ; initial guess +;; set x^b as x^true to test losing uncertainty +; define x^b x^true +define x^b-std : append-ec (: i (length x^seed)) x^seed-std +define P : make-covariance-matrix-from-standard-deviations x^b-std ;; Then generate observations -define y⁰-num 1000 +define y⁰-num 80 define y⁰-pos-max 100 +define y⁰-plot-skip : max 1 : * (/ 5 2) {y⁰-num / y⁰-pos-max} ;; At the positions where they are measured. Drawn randomly to avoid ;; giving an undue weight to later values. -define y⁰-pos : list-ec (: i y⁰-num) : * (random:uniform) y⁰-pos-max +define y⁰-pos-sorted : list-ec (: i y⁰-num) : exact->inexact : * y⁰-pos-max : / i y⁰-num +define y⁰-pos-random : list-ec (: i y⁰-num) : * (random:uniform) y⁰-pos-max +define y⁰-pos y⁰-pos-random define : H-single-parameter xi xi-pos pos . "Observation function for a single parameter." @@ -103,6 +157,15 @@ define : H-single-parameter xi xi-pos po * xi pos exp : - : expt xi-posdist 2 +define : H-single-parameter-sinx/x xi xi-pos pos + . "Observation function for a single parameter." + let* + : xi-posdist : abs : / {pos - xi-pos} {y⁰-pos-max / 26.4} ; for (2 2 2 2) this just barely does resolves the two central values + * xi 15 + / : sin xi-posdist + . xi-posdist + + ;; We need an observation operator to generate observations from true values define : H x pos . "Observation operator. It generates modelled observations from the input. @@ -112,19 +175,18 @@ x are parameters to be optimized, pos is let* : len : length x ystretch y⁰-pos-max - x-pos : list-ec (: i len) : * ystretch {{i + 0.5} / {len + 1}} - apply + - list-ec (: i len) - H-single-parameter - list-ref x i - list-ref x-pos i - . pos + x-pos : list-ec (: i len) : * ystretch {{i + 0.5} / len} + sum-ec (: i len) + H-single-parameter-sinx/x + list-ref x i + list-ref x-pos i + . pos ;; We start with true observations which we will disturb later to get ;; the equivalent of measured observations define y^true : list-ec (: i y⁰-pos) : H x^true i ;; now we disturb the observations with a fixed standard deviation. This assumes uncorrelated observations. -define y⁰-std 10 +define y⁰-std 30 define y⁰ : list-ec (: i y^true) : + i : * y⁰-std : random:normal ;; and define the covariance matrix. This assumes uncorrelated observations. define R : make-covariance-matrix-from-standard-deviations : list-ec (: i y⁰-num) y⁰-std @@ -134,24 +196,43 @@ define R : make-covariance-matrix-from-s ;; The actual observations ;; define y⁰ : list-ec (: i y⁰-num) : + y⁰-mean : * y⁰-std : random:normal +define : matrix-times-vector X y + . "Calculate the matrix product of X and Y" + list-ec (: row (length X)) + sum-ec (: i (length y)) + * : list-ref y i + list-ref (list-ref X row) i -define : EnSRT H x P y R y-pos N - . "Observation function H, parameters x, + +define x^steps '() +define 1-AK '() + +define* : EnSRF H x P y R y-pos N #:key (penalty-function-of-x (λ (x) 0)) + . "Observation function H, parameters x, parameter-covariance P, observations y, observation covariance R and number of ensemble members N. +TODO: PENALTY-FUNCTION-OF-X is any function which takes the +parameters X and returns a penalty. + Limitations: y is a single value. R and P are diagonal. " + let* + : P_copy : list-ec (: j (length P)) : list-ec (: k (length (list-ref P j))) : list-ref (list-ref P j) k + L + cholesky! P_copy let step : observations-to-process y observation-variances : list-ec (: i (length y)) : list-ref (list-ref R i) i observation-positions y-pos x^b x - x-deviations + x-deviations ; multiply the sqrt of P (L with LLt=P) with a vector with random perturbations list-ec (: i N) - list-ec (: j (length x)) + matrix-times-vector L + list-ec (: j (length x)) * : random:normal - sqrt : list-ref (list-ref P j) j ; only for diagonal P! + . 1 ; sqrt : list-ref (list-ref P j) j ; only for diagonal P! + set! x^steps : cons x-deviations x^steps cond : null? observations-to-process list x^b x-deviations @@ -160,12 +241,12 @@ Limitations: y is a single value. R and ; newline let* : y_cur : car observations-to-process - R_cur : car observation-variances + R_cur : * 1 : car observation-variances y-pos_cur : car observation-positions Hx^b_i list-ec (: i x-deviations) H - list-ec (: j (length i)) + list-ec (: j (length i)) + (list-ref x^b j) (list-ref i j) . y-pos_cur Hx^b @@ -182,7 +263,7 @@ Limitations: y is a single value. R and list-ec (: j (length x^b)) ; for each x^b_i multiply the state-element and model-deviation for all ensemble members. * {1 / {N - 1}} sum-ec (: i N) - * : list-ref (list-ref x-deviations i) j ; FIXME: this currently does not use j because I only do length 1 x + * : list-ref (list-ref x-deviations i) j list-ref Hx^b-prime i K : list-ec (: i PHt) {i / {HPHt + R_cur}} x^a @@ -199,6 +280,11 @@ Limitations: y is a single value. R and * α list-ref K j list-ref Hx^b-prime i + if : equal? 1-AK '() + set! 1-AK : list-ec (: i K) {1 - i} ; init + set! 1-AK : list-ec (: i (length K)) : * (list-ref 1-AK i) {1 - (abs (list-ref K i))} + ;; display 1-AK ; TODO: What does this actually signify? + ;; newline step cdr observations-to-process cdr observation-variances @@ -207,36 +293,80 @@ Limitations: y is a single value. R and . x^a-deviations +define : x-deviations->y-deviations H x-opt x-deviations y⁰-pos + . "Calculate y-deviations for each measurement from the x-deviations. + + return ((y_0'0 y_0'1 ...) ...) + " + define (~ li i) (list-ref li i) + ; for each ensemble member calculate the y-deviations + let* + : y-opt : map (λ (x) (H x-opt x)) y⁰-pos + y-ensemble + list-ec (: x-dev x-deviations) ; x-dev has one number (x'_i) per x-parameter + let* + : ; calculate x-parameters for the ensemble + x-opt+dev + list-ec (: j (length x-opt)) + + : ~ x-opt j + ~ x-dev j + ; calculate all y-values for the ensemble + y-opt+dev : map (λ (x) (H x-opt+dev x)) y⁰-pos + ; calculate all differences + map (λ (x y) (- x y)) y-opt+dev y-opt + ; reshape into one ensemble per value + list-ec (: ensidx (length (~ y-ensemble 0))) + list-ec (: obsidx (length y-ensemble)) + ~ (~ y-ensemble obsidx) ensidx + +define : flatten li + append-ec (: i li) i + define : main args let* - : optimized : EnSRT H x^b P y⁰ R y⁰-pos 40 + : ensemble-member-count 32 + ensemble-member-plot-skip 4 + optimized : EnSRF H x^b P y⁰ R y⁰-pos ensemble-member-count x-opt : list-ref optimized 0 x-deviations : list-ref optimized 1 - ; std : sqrt : * {1 / {(length x-deviations) - 1}} : sum-ec (: i x-deviations) : expt i 2 - format #t "x⁰: ~A ± ~A\nx: ~A ± ~A\nx^t: ~A\nx-t/σ:~A\ny̅: ~A ± ~A\ny̅⁰: ~A ± ~A\ny̅^t: ~A\nnoise:~A\n" + x-std + list-ec (: i (length x-opt)) + apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i + y-deviations : x-deviations->y-deviations H x-opt x-deviations y⁰-pos + x^b-deviations-approx + list-ec (: i ensemble-member-count) + list-ec (: j (length x^b)) + * : random:normal + sqrt : list-ref (list-ref P j) j ; only for diagonal P! + y^b-deviations : x-deviations->y-deviations H x^b x^b-deviations-approx y⁰-pos + y-std + apply standard-deviation-from-deviations + flatten y-deviations + y-stds : list-ec (: i y-deviations) : apply standard-deviation-from-deviations i + y^b-stds : list-ec (: i y^b-deviations) : apply standard-deviation-from-deviations i + σ + list-ec (: i (length x-opt)) + apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i + Δ/σ + list-ec (: i (length x-opt)) + / : - (list-ref x-opt i) (list-ref x^true i) + list-ref σ i + format #t "x⁰: ~A\n ± ~A\nx: ~A\n ± ~A\nx^t: ~A\nx-t/σ: ~A\n√Σ(Δ/σ)²/N:~A\n√Σσ²: ~A\ny̅: ~A ± ~A\ny̅⁰: ~A ± ~A\ny̅^t: ~A\nnoise: ~A\n" . x^b list-ec (: i (length x^b)) : list-ref (list-ref P i) i . x-opt - list-ec (: i (length x-opt)) - apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i + . x-std . x^true - list-ec (: i (length x-opt)) - / : - (list-ref x-opt i) (list-ref x^true i) - apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i - * {1 / (length y⁰)} : apply + : map (lambda (x) (H x-opt x)) y⁰-pos - apply standard-deviation-from-deviations - append-ec (: i (length x-deviations)) - let* - : - x-opt+dev - list-ec (: j (length x-opt)) - + : list-ref x-opt j - list-ref - list-ref x-deviations i - . j - y-opt+dev : map (lambda (x) (H x-opt+dev x)) y⁰-pos - y-opt : map (lambda (x) (H x-opt x)) y⁰-pos - map (lambda (x y) (- x y)) y-opt+dev y-opt + . Δ/σ + * {1 / (length Δ/σ)} + sqrt + sum-ec (: i Δ/σ) + expt i 2 + sqrt + sum-ec (: i σ) + expt i 2 + mean : map (lambda (x) (H x-opt x)) y⁰-pos + . y-std ; list-ec (: i (length y-opt)) ; - (list-ref y-opt+dev i) (list-ref y-opt i) ; apply standard-deviation-from-deviations : map H x-deviations ; FIXME: This only works for trivial H. @@ -245,18 +375,31 @@ define : main args * {1 / (length y⁰)} : apply + : map (lambda (x) (H x^true x)) y⁰-pos . y⁰-std ; now plot the result - let : : port : open-output-pipe "python" - format port "import pylab as pl\n" + let : : port : open-output-pipe "python2" + format port "import pylab as pl\nimport matplotlib as mpl\n" format port "y0 = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰ + format port "yerr = ~A\n" y⁰-std format port "ypos = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰-pos format port "yinit = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x^b i + format port "yinitstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y^b-stds format port "ytrue = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x^true i format port "yopt = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x-opt i - format port "pl.plot(*zip(*sorted(zip(ypos, yinit))), label='prior')\n" + format port "yoptstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y-stds + format port "pl.errorbar(*zip(*sorted(zip(ypos, yinit))), yerr=zip(*sorted(zip(ypos, yinitstds)))[1], label='prior')\n" format port "pl.plot(*zip(*sorted(zip(ypos, ytrue))), label='true')\n" - format port "pl.plot(*zip(*sorted(zip(ypos, yopt))), label='optimized')\n" - format port "pl.plot(*zip(*sorted(zip(ypos, y0))), marker='+', linewidth=0, label='measurements')\n" - format port "pl.legend()\n" + format port "pl.errorbar(*zip(*sorted(zip(ypos, yopt))), yerr=zip(*sorted(zip(ypos, yoptstds)))[1], label='optimized')\n" + format port "eb=pl.errorbar(*zip(*sorted(zip(ypos, y0))), yerr=yerr, alpha=0.6, marker='+', linewidth=0, label='measurements')\neb[-1][0].set_linewidth(1)\n" + list-ec (: step 0 (length x^steps) y⁰-plot-skip) + let : : members : list-ref x^steps (- (length x^steps) step 1) + list-ec (: member-idx 0 (length members) ensemble-member-plot-skip) ; reversed + let : : member : list-ref members member-idx + format port "paired = pl.get_cmap('Paired') +cNorm = mpl.colors.Normalize(vmin=~A, vmax=~A) +scalarMap = mpl.cm.ScalarMappable(norm=cNorm, cmap=paired)\n" 0 (length member) + list-ec (: param-idx 0 (length member) 4) ; step = 4 + ; plot parameter 0 + format port "pl.plot(~A, ~A, marker='.', color=scalarMap.to_rgba(~A), linewidth=0, label='', alpha=0.6, zorder=-1)\n" (/ step y⁰-plot-skip) (+ 80 (* 60 (list-ref member param-idx))) param-idx + format port "pl.legend(loc='upper right')\n" format port "pl.xlabel('position [arbitrary units]')\n" format port "pl.ylabel('value [arbitrary units]')\n" format port "pl.title('ensemble optimization results')\n" diff --git a/examples/enter-three-witches.scm b/examples/enter-three-witches.scm new file mode 100644 --- /dev/null +++ b/examples/enter-three-witches.scm @@ -0,0 +1,267 @@ +#!/usr/bin/env sh +(# -*- wisp -*-) +(guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))') +(exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples enter-three-witches) main)' -s "$0" "$@") +; !# + +(define-module (examples enter-three-witches) + #:export (introduced-names ->string show colortable color say-words say-name say Speak Speak-indirect Enter Scene)) + +(use-modules (ice-9 optargs) + (srfi srfi-1) + (system syntax)) + +;; FIXME: This version currently does not allow using the same first +;; name several times. It will need a more refined macro generator +;; which first gathers all the necessary definitions and then builds +;; them. + +(define introduced-names '()) + +(define (->string x) + (cond + ((symbol? x) + (symbol->string x)) + ((number? x) + (format #f "~a" x)) + (else + (format #f "~A" x)))) + + +(define (show str) + (let lp ((chars (string->list str))) + (cond + ((null? chars) + #t) + (else + (display (car chars)) + (usleep 60000) + (lp (cdr chars)))))) + + +(define colortable + `( + (#f . "\x1b[0m") + (black . "\x1b[1;30m") + (red . "\x1b[1;31m") + (green . "\x1b[1;32m") + (yellow . "\x1b[1;33m") + (blue . "\x1b[1;34m") + (magenta . "\x1b[1;35m") + (cyan . "\x1b[1;36m") + (white . "\x1b[1;37m"))) + + +(define (color col) + "helper function to colorize the input" + (cond + ((assoc col colortable) + (format #t (assoc-ref colortable col)) + #f) + (else + (format #t (assoc-ref colortable #f)) + #f))) + +(define-syntax say-words + (lambda (x) + (syntax-case x () + ((_ (((word words ...))) (() lines ...)) + #`(begin + (let ((w `word)) + (cond + ((equal? w #f) + #f) + ((equal? w '..) + (show ".")) + (else + (show " ") + (show (->string w))))) + (say-words (((words ...))) (() lines ...)))) + ((_ ((())) (() lines ...)) + #`(begin + (usleep 200000) + (newline) + (say-words (lines ...)))) + ;; lines of form ,(...) + ((_ ((unq (word words ...)) lines ...)) + #`(begin if (equal 'unquote `unq)) + #`(begin ; add an extra level of parens + (show " ") + (say-words ((((unq (word words ...))))) (() lines ...)))) + ((_ ((word words ...) lines ...)) + #`(begin + (show " ") + (say-words (((word words ...))) (() lines ...)))) + ((_ (() lines ...)) + #`(say-words (lines ...))) + ((_ (lines ...)) + #`(begin + (newline)))))) + + +(define (say-name nameparts) + (let + ;; symbols starting with : are not treated as part of the + ;; name. They can be used as actor instructions + ((pure-name (remove (lambda (x) (string-prefix? ":" (symbol->string x))) (remove pair? nameparts)))) + (if (not (member pure-name introduced-names)) + (error + (format #f "Tried to use ~A who did not Enter. Introduced names: ~A" + pure-name introduced-names)))) + (format #t "~A\n" + (string-join (map symbol->string nameparts)))) + + +(define-syntax say + (lambda (x) + (syntax-case x () + ((_ nameparts lines) + #`(begin + (say-name nameparts) + (say-words lines)))))) + + +(define-syntax Speak + (lambda (x) + (with-ellipsis ::: + (syntax-case x () + ;; Support form for modifiers: enclose by double parens (used later) + ((_ (((name :::))) ((mod :::)) (word :::) line :::) + #`(begin + (say-name (quasiquote (name ::: mod :::))) + (say-words ((word :::) line :::)))) + ;; extend mod keywords + ((_ (((name :::))) ((mod :::)) modifier line :::) + ;; extend the modifier keyword list + #`(Speak (((name :::))) ((mod ::: modifier)) line :::)) + ;; say form without modifier + ((_ (((name :::))) (word :::) line :::) + #`(Speak (((name :::))) (()) (word :::) line :::)) + ;; first modifier keyword after the name + ((_ (((name :::))) modifier line :::) + ;; append to mod helper form + #`(Speak (((name :::))) ((modifier)) line :::)) + ;; Strip the name from lines with empty arguments + ((_ (((name :::))) symbol :::) + #`(begin #t symbol :::)))))) + + +(define-syntax Speak-indirect + (lambda (x) + (syntax-case x () + ;; Adjust name and lines for Speak for the case where I + ;; cannot match for the whole name. + ;; input: (((name1 name2 ... (word ...) ...))) + + ;; grab the lines one by one from the back + ((_ (((symbols ... (word ...)))) lines ...) + #`(Speak-indirect (((symbols ...))) (word ...) lines ...)) + ;; start with the last line + ((_ (((symbols ... (word ...))))) + #`(Speak-indirect (((symbols ...))) (word ...))) + ;; no more lines remain at the end: the rest must be the name + ((_ (((name ...))) lines ...) + #`(Speak (((name ...))) lines ...))))) + + +(define-syntax Enter + (lambda (x) + (syntax-case x () + ((_ (name more ...) b ...) + ; new binding: only create it if the binding is not already a macro + (not (eq? 'macro (syntax-local-binding (syntax name)))) + #'(begin + ;; process the name: define special syntax for this name (only + ;; for the first word of the name, the correctness of the rest + ;; of the words is checked at runtime in the say procedure) + (define-syntax name + (lambda (y) + (with-ellipsis ::: + (syntax-case y (more ...) + ; just forward matching rules to Speak + ((_ more ... symbol :::) + #'(Speak (((name more ...))) symbol :::)) + ((_ symbols :::) + ; this does not correctly make the second name part of + ; the name, preventing differentiation between name and + ; modifier + #`(Speak-indirect (((name symbols :::))))))))) + ;; process the rest of the names + (Enter b ...) + ;; record that the name was introduced. I do not see a way to do + ;; this directly in the compiler, therefore it is checked later + ;; during runtime. + (set! introduced-names (cons '(name more ...) introduced-names)))) + ;; add debug output, must be added it here, not in front + ; write + ; quote : list Enter (name more ...) b ... + ; newline + ((_ (name more ...) b ...) + ; existing binding: Just allow using this. + #'(begin + (Enter b ...) + (set! introduced-names (cons '(name more ...) introduced-names)))) + ((_ b ...) + #'(begin #t))))) + + +(define-syntax Scene + (lambda (x) + (syntax-case x () + ((_ thisscene args ...) + (with-syntax ((c (datum->syntax x (module-name (current-module))))) + #`(begin ; FIXME: this currently requires the Scene identifier to be a valid symbol -> cannot use "Scene 1" + (module-re-export! (current-module) + (module-map (λ (x y) x) + (module-import-interface (current-module) 'Scene ))); ensure that all symbols remain available + (define-module (scene thisscene)) + (import c) + #t)))))) + + +(define (main args) + (Enter (First Witch) + (Second Witch) + (Third Witch) + (First Eldritch)) + + (First Witch + (When shall we three meet again) + (In ,(color 'cyan) thunder, ,(color #f) ,(color 'white) lightning, ,(color #f) or in ,(color 'blue) rain? ,(color #f))) + + (Second Witch :resolute + (When the hurlyburly's done, (we ,(+ 1 2)) ); inline-code is allowed! + (When the ,(color 'red) battle's ,(color #f) + lost and won. )); ,(read-char) ; and executed when the word is shown + + (Third Witch + (That will be ere the set of ,(color 'yellow) sun ,(color #f) ..)) + ; .. can be used for a . without preceding space. It MUST be + ; used to get a trailing . + + (First Eldritch :crazy + (,(color 'magenta) gnignigni! ,(color #f))) + + (Enter (Second Eldritch)) + + (Second Eldritch :quick + (,(color 'black) Guh!) + ; . :goo ; invalid ⇒ would be an error + ; . foo ; invalid ⇒ would be an error + (Moo ,(color #f)))) + +;; Making the name longer throws an Error, but only at runtime: +; Second Eldritch shoo +; Guh! +;; ⇒ ERROR: Tried to use (Second Eldritch shoo) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch)) + +;; Adding one who did not enter throws an Error, but only at runtime: +; Third Eldritch +; Guh! +;; ⇒ ERROR: Tried to use (Third Eldritch) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch)) + + + + + + diff --git a/examples/enter-three-witches.w b/examples/enter-three-witches.w --- a/examples/enter-three-witches.w +++ b/examples/enter-three-witches.w @@ -1,49 +1,309 @@ #!/usr/bin/env sh +# -*- wisp -*- +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples enter-three-witches) main)' -s "$0" "$@" ; !# define-module : examples enter-three-witches + . #:export : introduced-names ->string show colortable color say-words say-name say Speak Speak-indirect Enter Scene use-modules : ice-9 optargs + srfi srfi-1 + system syntax + ice-9 rdelim + +;; FIXME: This version currently does not allow using the same first +;; name several times. It will need a more refined macro generator +;; which first gathers all the necessary definitions and then builds +;; them. + +define introduced-names '() + +define : ->string x + cond + : symbol? x + symbol->string x + : number? x + format #f "~a" x + else + format #f "~A" x + + +define : show str + let lp : : chars : string->list str + cond + : null? chars + . #t + else + display : car chars + usleep 60000 + lp : cdr chars + + +define colortable + ` + #f . "\x1b[0m" + black . "\x1b[1;30m" + red . "\x1b[1;31m" + green . "\x1b[1;32m" + yellow . "\x1b[1;33m" + blue . "\x1b[1;34m" + magenta . "\x1b[1;35m" + cyan . "\x1b[1;36m" + white . "\x1b[1;37m" + + +define : color col + . "helper function to colorize the input" + cond + : assoc col colortable + format #t : assoc-ref colortable col + . #f + else + format #t : assoc-ref colortable #f + . #f + +define-syntax say-words + lambda (x) + syntax-case x (fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0) + : _ (((word words ...))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...) + ;; TODO: move out to a helper macro + #` begin + let : : w `word + cond + : equal? w #f + . #f + : equal? w '.. + show "." + else + show " " + show : ->string w + say-words (((words ...))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...) + : _ ((())) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...) + #` begin + usleep 200000 + newline + say-words (lines ...) + ;; lines of form ,(...) + : _ ((unq (word words ...)) lines ...) + #` if : equal? 'unquote `unq ;; FIXME: This guard seems to not actually work + #` begin ; add an extra level of parens + show " " + say-words (((unq (word words ...)))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...) + : _ (((unq word)) lines ...) + #` if : equal? 'unquote-splicing `unq ;; FIXME: This guard seems to not actually work + #` begin ; include the unquoting without extra level of parentheses + ;; TODO: clean this up. This duplicates logic in the first case, and duplicates it again internally. + show " " + apply + λ (unq x) + cond + : equal? 'unquote-splicing unq + map (λ (x) (show " ")(show x)) + if : pair? x + map ->string x + . x + : equal? 'unquote unq + cond + : equal? x #f + . #f + : equal? x '.. + show "." + else + show " " + show : ->string x + else + cond + : equal? unq #f + . #f + : equal? unq '.. + show "." + else + show " " + show : ->string unq + cond + : equal? x #f + . #f + : equal? x '.. + show "." + else + show " " + show : ->string x + list 'unq word + say-words ((())) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...) + : _ ((word words ...) lines ...) ; start of a line + #` begin + show " " + say-words (((word words ...))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...) + : _ (() lines ...) ; finished showing the line, show the next one + #` say-words (lines ...) + : _ (lines ...) + #` begin + newline + + +define : say-name nameparts + let + ;; symbols starting with : are not treated as part of the + ;; name. They can be used as actor instructions + : pure-name : remove (lambda (x) (string-prefix? ":" (symbol->string x))) : remove pair? nameparts + if : not : member pure-name introduced-names + error + format #f "Tried to use ~A who did not Enter. Introduced names: ~A" + . pure-name introduced-names + format #t "~A\n" + string-join : map symbol->string nameparts + + +define-syntax say + lambda (x) + syntax-case x () + : _ nameparts lines + #` begin + say-name nameparts + say-words lines + + +define-syntax Speak + lambda (x) + with-ellipsis ::: + syntax-case x () + ;; Support form for modifiers: enclose by double parens (used later) + : _ (((name :::))) ((mod :::)) (word :::) line ::: + #` begin + say-name : quasiquote : name ::: mod ::: + say-words : (word :::) line ::: + ;; extend mod keywords + : _ (((name :::))) ((mod :::)) modifier line ::: + ;; extend the modifier keyword list + #` Speak (((name :::))) ((mod ::: modifier)) line ::: + ;; say form without modifier + : _ (((name :::))) (word :::) line ::: + #` Speak (((name :::))) (()) (word :::) line ::: + ;; first modifier keyword after the name + : _ (((name :::))) modifier line ::: + ;; append to mod helper form + #` Speak (((name :::))) ((modifier)) line ::: + ;; Strip the name from lines with empty arguments + : _ (((name :::))) symbol ::: + #` begin #t symbol ::: + + +define-syntax Speak-indirect + lambda (x) + syntax-case x () + ;; Adjust name and lines for Speak for the case where I + ;; cannot match for the whole name. + ;; input: (((name1 name2 ... (word ...) ...))) + + ;; grab the lines one by one from the back + : _ (((symbols ... (word ...)))) lines ... + #` Speak-indirect (((symbols ...))) (word ...) lines ... + ;; start with the last line + : _ (((symbols ... (word ...)))) + #` Speak-indirect (((symbols ...))) (word ...) + ;; no more lines remain at the end: the rest must be the name + : _ (((name ...))) lines ... + #` Speak (((name ...))) lines ... + define-syntax Enter - syntax-rules () - : _ (name) b ... - begin - define-syntax name - syntax-rules ::: () - : _ (c :::) d ::: - format #t "~A\n ~A\n\n" - string-join - string-split (symbol->string 'name) #\_ - string-join - map : lambda (x) (string-join (map symbol->string x)) - quote : (c :::) d ::: - . "\n " - : _ c d ::: - ;; allow for modifier keywords after the name - begin - format #t "~A:\n" : symbol->string 'c - name d ::: - : _ c ::: - begin #t c ::: - Enter b ... - : _ b ... - begin + lambda (x) + syntax-case x () + : _ (name more ...) b ... + ; new binding: only create it if the binding is not already a macro + not : eq? 'macro (syntax-local-binding (syntax name)) + #' begin + ;; process the name: define special syntax for this name (only + ;; for the first word of the name, the correctness of the rest + ;; of the words is checked at runtime in the say procedure) + define-syntax name + lambda (y) + with-ellipsis ::: + syntax-case y (more ...) + ; just forward matching rules to Speak + : _ more ... symbol ::: + #' Speak (((name more ...))) symbol ::: + : _ symbols ::: + ; this does not correctly make the second name part of + ; the name, preventing differentiation between name and + ; modifier + #` Speak-indirect (((name symbols :::))) + ;; process the rest of the names + Enter b ... + ;; record that the name was introduced. I do not see a way to do + ;; this directly in the compiler, therefore it is checked later + ;; during runtime. + set! introduced-names : cons '(name more ...) introduced-names + ;; add debug output, must be added it here, not in front + ; write + ; quote : list Enter (name more ...) b ... + ; newline + : _ (name more ...) b ... + ; existing binding: Just allow using this. + #' begin + Enter b ... + set! introduced-names : cons '(name more ...) introduced-names + : _ b ... + #' begin #t + + +define-syntax Scene + lambda (x) + syntax-case x () + : _ thisscene args ... + with-syntax ((c (datum->syntax x (module-name (current-module))))) + #` begin ; FIXME: this currently requires the Scene identifier to be a valid symbol -> cannot use "Scene 1" + module-re-export! (current-module) + module-map (λ (x y) x) + module-import-interface (current-module) 'Scene ; ensure that all symbols remain available + define-module (scene thisscene) + import c + . #t define : main args - Enter : First_Witch - Second_Witch - Third_Witch - - First_Witch + Enter : First Witch + Second Witch + Third Witch + First Eldritch + + First Witch When shall we three meet again - In thunder, lightning, or in rain? + In ,(color 'cyan) thunder, ,(color #f) ,(color 'white) lightning, ,(color #f) or in ,(color 'blue) rain? ,(color #f) + + Second Witch :resolute + When the hurlyburly's done, (we ,(+ 1 2)) ; inline-code is allowed! + When the ,(color 'red) battle's ,(color #f) + . lost and won. ; ,(read-char) ; and executed when the word is shown + + Third Witch + That will be ere the set of ,(color 'yellow) sun ,(color #f) .. + ; .. can be used for a . without preceding space. It MUST be + ; used to get a trailing . + + First Eldritch :crazy + ,(color 'magenta) gnignigni! ,(color #f) + + Enter : Second Eldritch - Second_Witch - When the hurlyburly's done, - When the battle's lost and won. + Second Eldritch :quick + ,(color 'black) Guh! + ; . :goo ; invalid ⇒ would be an error + ; . foo ; invalid ⇒ would be an error + Moo ,(color #f) - Third_Witch - That will be ere the set of sun. +;; Making the name longer throws an Error, but only at runtime: +; Second Eldritch shoo +; Guh! +;; ⇒ ERROR: Tried to use (Second Eldritch shoo) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch)) + +;; Adding one who did not enter throws an Error, but only at runtime: +; Third Eldritch +; Guh! +;; ⇒ ERROR: Tried to use (Third Eldritch) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch)) + + + + + diff --git a/examples/evolve.w b/examples/evolve.w --- a/examples/evolve.w +++ b/examples/evolve.w @@ -7,8 +7,6 @@ exec guile -L $(dirname $(dirname $(real ; TODO: genetic with mutate+combinate, population which keeps the best and directed which only keeps improvements -; NOTE: This only works after preprocessing to scheme. - define-module : examples evolve . #:export : main @@ -156,7 +154,3 @@ define : main args newline -define : main - display "foo" - newline - run diff --git a/examples/ild.w b/examples/ild.w new file mode 100755 --- /dev/null +++ b/examples/ild.w @@ -0,0 +1,16 @@ +#!/usr/bin/env sh +# -*- wisp -*- +D="$(dirname $(realpath "$0"))" +W="$(dirname $(dirname $(realpath "$0")))" +guile -L "$W" -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L "$W" --language=wisp -l "$D/enter-three-witches.w" -s "$0" "$@" +; !# + +import : examples enter-three-witches + +Enter : Dr. Arne Bab. + +Dr. Arne Bab. + Hallo Liebste, + ,(color 'red) Ich ,(color 'yellow) liebe ,(color 'red) Dich ,(color #f) + Dein Arne diff --git a/examples/map-product-sums.w b/examples/map-product-sums.w old mode 100644 new mode 100755 --- a/examples/map-product-sums.w +++ b/examples/map-product-sums.w @@ -2,9 +2,9 @@ exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples map-product-sums) main)' -s "$0" "$@" ; !# -use-modules : (srfi srfi-42) +define-module : examples map-product-sums -define-module : examples map-product-sums +use-modules : srfi srfi-42 define : list-product-sums list-of-numbers . "return a list with the sum of the products of each number with all other numbers. diff --git a/examples/unbiased-std.w b/examples/unbiased-std.w new file mode 100644 --- /dev/null +++ b/examples/unbiased-std.w @@ -0,0 +1,31 @@ +define-module : example unbiased-std + . #:export : std + +define factors⁻¹ + ' ;; from https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation#Results_for_the_normal_distribution + 2 . 0.7978845608 + 3 . 0.8862269255 + 4 . 0.9213177319 + 5 . 0.9399856030 + 6 . 0.9515328619 + 7 . 0.9593687891 + 8 . 0.9650304561 + 9 . 0.9693106998 + 10 . 0.9726592741 + +define : std . vals + . "Calculate the unbiased standard deviation of the values (the biased std for more than 10 values)." + let : : len : length vals + if : < len 2 + . +inf.0 + let + : mean (/ (apply + vals) len) + factor (or (assoc-ref factors⁻¹ len) 1) + * (/ 1 factor) : sqrt : * (/ 1 (- len 1)) : apply + : map (λ(x) (expt (- x mean) 2)) vals . + +;; quick test +let : : res : std 0 0 3 + when : not : > 0.01 : abs : - res : * 1.129 : sqrt 3 ;; calculated by hand + format #t "Bug: (std 0 0 3) gives ~a instead of 1.995\n" res + +write : std 5860.16 6141.81 6088.67 diff --git a/examples/unicode-math-fun.w b/examples/unicode-math-fun.w --- a/examples/unicode-math-fun.w +++ b/examples/unicode-math-fun.w @@ -1,4 +1,7 @@ -#!/home/arne/wisp/wisp-multiline.sh +#!/usr/bin/env sh +# -*- wisp -*- +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -s "$0" "$@" ; !# ;; Having fun with unicode and math :) @@ -6,6 +9,9 @@ define : Σ . n apply + n +define : Π . n + apply * n + define : ∪ . lists apply append lists @@ -27,6 +33,8 @@ define : ∩ list1 list2 display : Σ 1 2 8 0 5 7 59 12 5 newline +display : Π 1 2 8 0 5 7 59 12 5 +newline display : ∪ '(1 2 3) '(4 5 6) newline display : ∩ '(1 789 7 897 89 78 78 97 89 2 3 6) '(4 5 6 2 8 7 879 879 879 879 8797 97 97 987 89789 7 7897 987 897 987 87 897 896) diff --git a/examples/with.w b/examples/with.w --- a/examples/with.w +++ b/examples/with.w @@ -13,27 +13,44 @@ define-module : examples with import : oop goops -define : enter thing +define : enter thing state . thing define-generic enter -define : exit thing +define : exit thing state . thing define-generic exit define-syntax with syntax-rules : as : _ thing as name thunk ... - let* - : name : enter thing - res : begin thunk ... - exit thing - . res + let + : name #f + state #f + res #f + dynamic-wind + λ () : set! name : enter thing state + λ () : set! res : begin thunk ... + . res + λ () ; : exit thing state + . res -define-method : exit (thing <port>) +define-method : enter (thing <port>) state . "Ensure that a port is always closed at the end of the with-block." + when : not : equal? #f state + set-port-column! thing (car state) + set-port-line! thing (car (cdr state)) + . thing + +define-method : exit (thing <port>) state + . "Ensure that a port is always closed at the end of the with-block." + set! state : list (port-line thing) (port-column thing) close-port thing define : main args with (open-file "with.w" "r") as port format #t "~a\n" : read port + format #t "~a\n" : read port + format #t "~a\n" : read port + + ;; TODO: test-continuation diff --git a/examples/y-combinator.w b/examples/y-combinator.w new file mode 100755 --- /dev/null +++ b/examples/y-combinator.w @@ -0,0 +1,85 @@ +#!/usr/bin/env sh +# -*- wisp -*- +guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))' +exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples y-combinator) main)' -s "$0" "$@" +; !# + +define-module : examples y-combinator + +;; Poor mans y-combinator from William Byrds talk: https://www.youtube.com/watch?v=OyfBQmvr2Hc&t=2844s +define fac-pmy-zealous-wisp + : + λ : ! + λ : n + : + ! ! + . n + λ : ! + λ : n + if : zero? n + . 1 + * n + : + ! ! + - n 1 + +define fac-pmy-pragmatic-wisp + : + λ : ! + λ : n + (! !) n + λ : ! + λ : n + if : zero? n + . 1 + * n : (! !) {n - 1} + + +;; Poor mans y-combinator from William Byrds talk: https://www.youtube.com/watch?v=OyfBQmvr2Hc&t=2844s +define facres-pmy + . (((λ (!) + (λ (n) + ((! !) n))) + (λ (!) + (λ (n) + (if (zero? n) + 1 + (* n ((! !) (- n 1))))))) + 5) + +;; from rosetta code: https://rosettacode.org/wiki/Y_combinator#Scheme +define Y + λ : h + : λ (x) : x x + λ : g + h : λ args : apply (g g) args + +define fac + Y + λ : f + λ : x + if : < x 2 + . 1 + * x : f : - x 1 + +define fib + Y + λ : f + λ : x + if : < x 2 + . x + + : f : - x 1 + f : - x 2 + + +define : main args + display : fac-pmy-zealous-wisp 5 + newline + display : fac-pmy-pragmatic-wisp 5 + newline + display facres-pmy + newline + display : fac 6 + newline + display : fib 6 + newline diff --git a/racket/parse.rkt b/racket/parse.rkt new file mode 100644 --- /dev/null +++ b/racket/parse.rkt @@ -0,0 +1,836 @@ +#lang racket + +;; Scheme-only implementation of a wisp-preprocessor which output a +;; scheme code tree to feed to a scheme interpreter instead of a +;; preprocessed file. + +;; Limitations: +;; - only unescapes up to 6 leading underscores at line start (\______) +;; - in some cases the source line information is missing in backtraces. +;; check for set-source-property! + +;; Copyright (C) Arne Babenhauserheide (2014--2015). All Rights Reserved. + +;; Permission is hereby granted, free of charge, to any person +;; obtaining a copy of this software and associated documentation +;; files (the "Software"), to deal in the Software without +;; restriction, including without limitation the rights to use, copy, +;; modify, merge, publish, distribute, sublicense, and/or sell copies +;; of the Software, and to permit persons to whom the Software is +;; furnished to do so, subject to the following conditions: +;; +;; The above copyright notice and this permission notice shall be +;; included in all copies or substantial portions of the Software. +;; +;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +;; BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +;; ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +;; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +;; SOFTWARE. + + +;; Helper functions for the indent-and-symbols data structure: '((indent token token ...) ...) +(define (line-indent line) + (car line)) + +(define (line-real-indent line) + "Get the indentation without the comment-marker for unindented lines (-1 is treated as 0)." + (let (( indent (line-indent line))) + (if (= -1 indent) + 0 + indent))) + +(define (line-code line) + (let ((code (cdr line))) + ; propagate source properties + code)) + +; literal values I need +(define readcolon + (string->symbol ":")) + +(define wisp-uuid "e749c73d-c826-47e2-a798-c16c13cb89dd") +; define an intermediate dot replacement with UUID to avoid clashes. +(define repr-dot ; . + (string->symbol (string-append "REPR-DOT-" wisp-uuid))) + +; allow using reader additions as the first element on a line to prefix the list +(define repr-quote ; ' + (string->symbol (string-append "REPR-QUOTE-" wisp-uuid))) +(define repr-unquote ; , + (string->symbol (string-append "REPR-UNQUOTE-" wisp-uuid))) +(define repr-quasiquote ; ` + (string->symbol (string-append "REPR-QUASIQUOTE-" wisp-uuid))) +(define repr-unquote-splicing ; ,@ + (string->symbol (string-append "REPR-UNQUOTESPLICING-" wisp-uuid))) + +(define repr-syntax ; #' + (string->symbol (string-append "REPR-SYNTAX-" wisp-uuid))) +(define repr-unsyntax ; #, + (string->symbol (string-append "REPR-UNSYNTAX-" wisp-uuid))) +(define repr-quasisyntax ; #` + (string->symbol (string-append "REPR-QUASISYNTAX-" wisp-uuid))) +(define repr-unsyntax-splicing ; #,@ + (string->symbol (string-append "REPR-UNSYNTAXSPLICING-" wisp-uuid))) + +; TODO: wrap the reader to return the repr of the syntax reader +; additions + +(define (match-charlist-to-repr charlist) + (let + ((chlist (reverse charlist))) + (cond + ((equal? chlist (list #\.)) + repr-dot) + ((equal? chlist (list #\')) + repr-quote) + ((equal? chlist (list #\,)) + repr-unquote) + ((equal? chlist (list #\`)) + repr-quasiquote) + ((equal? chlist (list #\, #\@ )) + repr-unquote-splicing) + ((equal? chlist (list #\# #\' )) + repr-syntax) + ((equal? chlist (list #\# #\, )) + repr-unsyntax) + ((equal? chlist (list #\# #\` )) + repr-quasisyntax) + ((equal? chlist (list #\# #\, #\@ )) + repr-unsyntax-splicing) + (else + #f)))) + +(define (wisp-read port) + "wrap read to catch list prefixes." + (let ((prefix-maxlen 4)) + (let longpeek + ((peeked '()) + (repr-symbol #f)) + (cond + ((or (< prefix-maxlen (length peeked)) (eof-object? (peek-char port)) (equal? #\space (peek-char port)) (equal? #\newline (peek-char port)) ) + (if repr-symbol ; found a special symbol, return it. + ; TODO: Somehow store source-properties. The commented-out code below does not work. + ; catch #t + ; lambda () + ; write : source-properties symbol-or-symbols + ; set-source-property! symbol-or-symbols 'filename : port-filename port + ; set-source-property! symbol-or-symbols 'line : 1+ : port-line port + ; set-source-property! symbol-or-symbols 'column : port-column port + ; write : source-properties symbol-or-symbols + ; lambda : key . arguments + ; . #f + repr-symbol + (let unpeek + ((remaining peeked)) + (cond + ((equal? '() remaining ) + (read port )); let read to the work + (else + (unread-char (car remaining) port) + (unpeek (cdr remaining))))))) + (else + (let* + ((next-char (read-char port)) + (peeked (cons next-char peeked))) + (longpeek + peeked + (match-charlist-to-repr peeked)))))))) + + + +(define (line-continues? line) + (equal? repr-dot (car (line-code line)))) + +(define (line-only-colon? line) + (and + (equal? ":" (car (line-code line))) + (null? (cdr (line-code line))))) + +(define (line-empty-code? line) + (null? (line-code line))) + +(define (line-empty? line) + (and + ; if indent is -1, we stripped a comment, so the line was not really empty. + (= 0 (line-indent line)) + (line-empty-code? line))) + +(define (line-strip-continuation line ) + (if (line-continues? line) + (append + (list + (line-indent line)) + (cdr (line-code line))) + line)) + +(define (line-strip-indentation-marker line) + "Strip the indentation markers from the beginning of the line" + (cdr line)) + +(define (indent-level-reduction indentation-levels level select-fun) + "Reduce the INDENTATION-LEVELS to the given LEVEL and return the value selected by SELECT-FUN" + (let loop + ((newlevels indentation-levels) + (diff 0)) + (cond + ((= level (car newlevels)) + (select-fun (list diff indentation-levels))) + ((< level (car newlevels)) + (loop + (cdr newlevels) + (1+ diff))) + (else + (throw 'wisp-syntax-error "Level ~A not found in the indentation-levels ~A."))))) + +(define (indent-level-difference indentation-levels level) + "Find how many indentation levels need to be popped off to find the given level." + (indent-level-reduction indentation-levels level + (lambda (x ); get the count + (car x)))) + +(define (indent-reduce-to-level indentation-levels level) + "Find how many indentation levels need to be popped off to find the given level." + (indent-level-reduction indentation-levels level + (lambda (x ); get the levels + (car (cdr x))))) + +(define (chunk-ends-with-period currentsymbols next-char) + "Check whether indent-and-symbols ends with a period, indicating the end of a chunk." + (and (not (null? currentsymbols)) + (equal? #\newline next-char) + (equal? repr-dot + (list-ref currentsymbols (- (length currentsymbols) 1))))) + +(define (wisp-scheme-read-chunk-lines port) + (let loop + ((indent-and-symbols (list )); '((5 "(foobar)" "\"yobble\"")(3 "#t")) + (inindent #t) + (inunderscoreindent (equal? #\_ (peek-char port))) + (incomment #f) + (currentindent 0) + (currentsymbols '()) + (emptylines 0)) + (cond + ((>= emptylines 2 ); the chunk end has to be checked + ; before we look for new chars in the + ; port to make execution in the REPL + ; after two empty lines work + ; (otherwise it shows one more line). + indent-and-symbols) + (else + (let ((next-char (peek-char port))) + (cond + ((eof-object? next-char) + (append indent-and-symbols (list (append (list currentindent) currentsymbols)))) + ((and inindent (zero? currentindent) (not incomment) (not (null? indent-and-symbols)) (not inunderscoreindent) (not (or (equal? #\space next-char) (equal? #\newline next-char) (equal? (string-ref ";" 0) next-char)))) + (append indent-and-symbols )); top-level form ends chunk + ((chunk-ends-with-period currentsymbols next-char) + ; the line ends with a period. This is forbidden in + ; SRFI-119. Use it to end the line in the REPL without + ; showing continuation dots (...). + (append indent-and-symbols (list (append (list currentindent) (drop-right currentsymbols 1))))) + ((and inindent (equal? #\space next-char)) + (read-char port ); remove char + (loop + indent-and-symbols + #t ; inindent + #f ; inunderscoreindent + #f ; incomment + (1+ currentindent) + currentsymbols + emptylines)) + ((and inunderscoreindent (equal? #\_ next-char)) + (read-char port ); remove char + (loop + indent-and-symbols + #t ; inindent + #t ; inunderscoreindent + #f ; incomment + (1+ currentindent) + currentsymbols + emptylines)) + ; any char but whitespace *after* underscoreindent is + ; an error. This is stricter than the current wisp + ; syntax definition. TODO: Fix the definition. Better + ; start too strict. FIXME: breaks on lines with only + ; underscores which should empty lines. + ((and inunderscoreindent (and (not (equal? #\space next-char)) (not (equal? #\newline next-char)))) + (throw 'wisp-syntax-error "initial underscores without following whitespace at beginning of the line after" (last indent-and-symbols))) + ((equal? #\newline next-char) + (read-char port ); remove the newline + ; The following two lines would break the REPL by requiring one char too many. + ; if : and (equal? #\newline next-char) : equal? #\return : peek-char port + ; read-char port ; remove a full \n\r. Damn special cases... + (let* ; distinguish pure whitespace lines and lines + ; with comment by giving the former zero + ; indent. Lines with a comment at zero indent + ; get indent -1 for the same reason - meaning + ; not actually empty. + ( + (indent + (cond + (incomment + (if (= 0 currentindent ); specialcase + -1 + currentindent )) + ((not (null? currentsymbols )); pure whitespace + currentindent) + (else + 0))) + (parsedline (append (list indent) currentsymbols)) + (emptylines + (if (not (line-empty? parsedline)) + 0 + (1+ emptylines)))) + (when (not (= 0 (length parsedline))) + ; set the source properties to parsedline so we can try to add them later. + (set-source-property! parsedline 'filename (port-filename port)) + (set-source-property! parsedline 'line (port-line port))) + ; TODO: If the line is empty. Either do it here and do not add it, just + ; increment the empty line counter, or strip it later. Replace indent + ; -1 by indent 0 afterwards. + (loop + (append indent-and-symbols (list parsedline)) + #t ; inindent + (if (<= 2 emptylines) + #f ; chunk ends here + (equal? #\_ (peek-char port ))); are we in underscore indent? + #f ; incomment + 0 + '() + emptylines))) + ((equal? #t incomment) + (read-char port ); remove one comment character + (loop + indent-and-symbols + #f ; inindent + #f ; inunderscoreindent + #t ; incomment + currentindent + currentsymbols + emptylines)) + ((or (equal? #\space next-char) (equal? #\tab next-char) (equal? #\return next-char) ); remove whitespace when not in indent + (read-char port ); remove char + (loop + indent-and-symbols + #f ; inindent + #f ; inunderscoreindent + #f ; incomment + currentindent + currentsymbols + emptylines)) + ; | cludge to appease the former wisp parser + ; | which had a problem with the literal comment + ; v char. + ((equal? (string-ref ";" 0) next-char) + (loop + indent-and-symbols + #f ; inindent + #f ; inunderscoreindent + #t ; incomment + currentindent + currentsymbols + emptylines)) + (else ; use the reader + (loop + indent-and-symbols + #f ; inindent + #f ; inunderscoreindent + #f ; incomment + currentindent + ; this also takes care of the hashbang and leading comments. + ; TODO: If used from Guile, activate curly infix via read-options. + (append currentsymbols (list (wisp-read port))) + emptylines)))))))) + + +(define (line-code-replace-inline-colons line) + "Replace inline colons by opening parens which close at the end of the line" + ; format #t "replace inline colons for line ~A\n" line + (let loop + ((processed '()) + (unprocessed line)) + (cond + ((null? unprocessed) + ; format #t "inline-colons processed line: ~A\n" processed + processed) + ; replace : . with nothing + ((and (<= 2 (length unprocessed)) (equal? readcolon (car unprocessed)) (equal? repr-dot (car (cdr unprocessed)))) + (loop + (append processed + (loop '() (cdr (cdr unprocessed)))) + '())) + ((equal? readcolon (car unprocessed)) + (loop + ; FIXME: This should turn unprocessed into a list. + (append processed + (list (loop '() (cdr unprocessed)))) + '())) + (else + (loop + (append processed + (list (car unprocessed))) + (cdr unprocessed)))))) + +(define (line-replace-inline-colons line) + (cons + (line-indent line) + (line-code-replace-inline-colons (line-code line)))) + +(define (line-strip-lone-colon line) + "A line consisting only of a colon is just a marked indentation level. We need to kill the colon before replacing inline colons." + (if + (equal? + (line-code line) + (list readcolon)) + (list (line-indent line)) + line)) + +(define (line-finalize line) + "Process all wisp-specific information in a line and strip it" + (let + ( + (l + (line-code-replace-inline-colons + (line-strip-indentation-marker + (line-strip-lone-colon + (line-strip-continuation line)))))) + (when (not (null? (source-properties line))) + (catch #t + (lambda () + (set-source-properties! l (source-properties line))) + (lambda (key . arguments) + #f))) + l)) + +(define (wisp-add-source-properties-from source target) + "Copy the source properties from source into the target and return the target." + (catch #t + (lambda () + (set-source-properties! target (source-properties source))) + (lambda (key . arguments) + #f)) + target) + +(define (wisp-propagate-source-properties code) + "Propagate the source properties from the sourrounding list into every part of the code." + (let loop + ((processed '()) + (unprocessed code)) + (cond + ((and (null? processed) (not (pair? unprocessed)) (not (list? unprocessed))) + unprocessed) + ((and (pair? unprocessed) (not (list? unprocessed))) + (cons + (wisp-propagate-source-properties (car unprocessed)) + (wisp-propagate-source-properties (cdr unprocessed)))) + ((null? unprocessed) + processed) + (else + (let ((line (car unprocessed))) + (if (null? (source-properties unprocessed)) + (wisp-add-source-properties-from line unprocessed) + (wisp-add-source-properties-from unprocessed line)) + (loop + (append processed (list (wisp-propagate-source-properties line))) + (cdr unprocessed))))))) + +(define (wisp-scheme-indentation-to-parens lines) + "Add parentheses to lines and remove the indentation markers" + ; FIXME: Find new algorithm which mostly uses current-line + ; and the indentation-levels for tracking. The try I have in + ; here right now is wrong. + (when + (and + (not (null? lines)) + (not (line-empty-code? (car lines))) + (not (= 0 (line-real-indent (car lines ))))); -1 is a line with a comment + (throw 'wisp-syntax-error + (format #f "The first symbol in a chunk must start at zero indentation. Indentation and line: ~A" + (car lines)))) + (let loop + ((processed '()) + (unprocessed lines) + (indentation-levels '(0))) + (let* + ( + (current-line + (if (<= 1 (length unprocessed)) + (car unprocessed) + (list 0 ))); empty code + (next-line + (if (<= 2 (length unprocessed)) + (car (cdr unprocessed)) + (list 0 ))); empty code + (current-indentation + (car indentation-levels)) + (current-line-indentation (line-real-indent current-line))) + ; format #t "processed: ~A\ncurrent-line: ~A\nnext-line: ~A\nunprocessed: ~A\nindentation-levels: ~A\ncurrent-indentation: ~A\n\n" + ; . processed current-line next-line unprocessed indentation-levels current-indentation + (cond + ; the real end: this is reported to the outside world. + ((and (null? unprocessed) (not (null? indentation-levels)) (null? (cdr indentation-levels))) + ; display "done\n" + ; reverse the processed lines, because I use cons. + processed) + ; the recursion end-condition + ((and (null? unprocessed)) + ; display "last step\n" + ; this is the last step. Nothing more to do except + ; for rolling up the indentation levels. return the + ; new processed and unprocessed lists: this is a + ; side-recursion + (values processed unprocessed)) + ((null? indentation-levels) + ; display "indentation-levels null\n" + (throw 'wisp-programming-error "The indentation-levels are null but the current-line is null: Something killed the indentation-levels.")) + (else ; now we come to the line-comparisons and indentation-counting. + (cond + ((line-empty-code? current-line) + ; display "current-line empty\n" + ; We cannot process indentation without + ; code. Just switch to the next line. This should + ; only happen at the start of the recursion. + ; TODO: Somehow preserve the line-numbers. + (loop + processed + (cdr unprocessed) + indentation-levels)) + ((and (line-empty-code? next-line) (<= 2 (length unprocessed ))) + ; display "next-line empty\n" + ; TODO: Somehow preserve the line-numbers. + ; take out the next-line from unprocessed. + (loop + processed + (cons current-line + (cdr (cdr unprocessed))) + indentation-levels)) + ((> current-indentation current-line-indentation) + ; display "current-indent > next-line\n" + ; this just steps back one level via the side-recursion. + (values processed unprocessed)) + ((= current-indentation current-line-indentation) + ; display "current-indent = next-line\n" + (let + ((line (line-finalize current-line)) + (next-line-indentation (line-real-indent next-line))) + (cond + ((>= current-line-indentation next-line-indentation) + ; simple recursiive step to the next line + ; display "current-line-indent >= next-line-indent\n" + (loop + (append processed + (if (line-continues? current-line) + line + (wisp-add-source-properties-from line (list line)))) + (cdr unprocessed ); recursion here + indentation-levels)) + ((< current-line-indentation next-line-indentation) + ; display "current-line-indent < next-line-indent\n" + ; format #t "line: ~A\n" line + ; side-recursion via a sublist + (let-values + ( + ((sub-processed sub-unprocessed) + (loop + line + (cdr unprocessed ); recursion here + indentation-levels))) + ; format #t "side-recursion:\n sub-processed: ~A\n processed: ~A\n\n" sub-processed processed + (loop + (append processed (list sub-processed)) + sub-unprocessed ; simply use the recursion from the sub-recursion + indentation-levels)))))) + ((< current-indentation current-line-indentation) + ; display "current-indent < next-line\n" + (loop + processed + unprocessed + (cons ; recursion via the indentation-levels + current-line-indentation + indentation-levels))) + (else + (throw 'wisp-not-implemented + (format #f "Need to implement further line comparison: current: ~A, next: ~A, processed: ~A." + current-line next-line processed))))))))) + + +(define (wisp-scheme-replace-inline-colons lines) + "Replace inline colons by opening parens which close at the end of the line" + (let loop + ((processed '()) + (unprocessed lines)) + (if (null? unprocessed) + processed + (loop + (append processed (list (line-replace-inline-colons (car unprocessed)))) + (cdr unprocessed))))) + + +(define (wisp-scheme-strip-indentation-markers lines) + "Strip the indentation markers from the beginning of the lines" + (let loop + ((processed '()) + (unprocessed lines)) + (if (null? unprocessed) + processed + (loop + (append processed (cdr (car unprocessed))) + (cdr unprocessed))))) + +(define (wisp-unescape-underscore-and-colon code) + "replace \\_ and \\: by _ and :" + (match code + ((a ...) + (map wisp-unescape-underscore-and-colon a)) + ('\_ + '_) + ('\__ + '__) + ('\___ + '___) + ('\____ + '____) + ('\_____ + '_____) + ('\______ + '______) + ('\: + ':) + (a + a))) + + +(define (wisp-replace-empty-eof code) + "replace ((#<eof>)) by ()" + ; FIXME: Actually this is a hack which fixes a bug when the + ; parser hits files with only hashbang and comments. + (if (and (not (null? code)) (pair? (car code)) (eof-object? (car (car code))) (null? (cdr code)) (null? (cdr (car code)))) + (list) + code)) + + +(define (wisp-replace-paren-quotation-repr code) + "Replace lists starting with a quotation symbol by + quoted lists." + (match code + (('REPR-QUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'quote (map wisp-replace-paren-quotation-repr a))) + ((a ... 'REPR-QUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ); this is the quoted empty list + (append + (map wisp-replace-paren-quotation-repr a) + (list (list 'quote (map wisp-replace-paren-quotation-repr b))))) + (('REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'quasiquote (list 'unquote (map wisp-replace-paren-quotation-repr a)))) + (('REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'unquote (map wisp-replace-paren-quotation-repr a))) + ((a ... 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ) + (append + (map wisp-replace-paren-quotation-repr a) + (list (list 'unquote (map wisp-replace-paren-quotation-repr b))))) + (('REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'quasiquote (map wisp-replace-paren-quotation-repr a))) + ((a ... 'REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ); this is the quoted empty list + (append + (map wisp-replace-paren-quotation-repr a) + (list (list 'quasiquote (map wisp-replace-paren-quotation-repr b))))) + (('REPR-UNQUOTESPLICING-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'unquote-splicing (map wisp-replace-paren-quotation-repr a))) + (('REPR-SYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'syntax (map wisp-replace-paren-quotation-repr a))) + (('REPR-UNSYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'unsyntax (map wisp-replace-paren-quotation-repr a))) + (('REPR-QUASISYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'quasisyntax (map wisp-replace-paren-quotation-repr a))) + (('REPR-UNSYNTAXSPLICING-e749c73d-c826-47e2-a798-c16c13cb89dd a ...) + (list 'unsyntax-splicing (map wisp-replace-paren-quotation-repr a))) + ((a ...) + (map wisp-replace-paren-quotation-repr a)) + (a + a))) + +(define (wisp-make-improper code) + "Turn (a #{.}# b) into the correct (a . b). + +read called on a single dot creates a variable named #{.}# (|.| +in r7rs). Due to parsing the indentation before the list +structure is known, the reader cannot create improper lists +when it reads a dot. So we have to take another pass over the +code to recreate the improper lists. + +Match is awesome!" + (let + ( + (improper + (match code + ((a ... b 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd c) + (append (map wisp-make-improper a) + (cons (wisp-make-improper b) (wisp-make-improper c)))) + ((a ...) + (map wisp-make-improper a)) + (a + a)))) + (define (syntax-error li msg) + (throw 'wisp-syntax-error (format #f "incorrect dot-syntax #{.}# in code: ~A: ~A" msg li))) + (if #t + improper + (let check + ((tocheck improper)) + (match tocheck + ; lists with only one member + (('REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd) + (syntax-error tocheck "list with the period as only member")) + ; list with remaining dot. + ((a ...) + (if (and (member repr-dot a)) + (syntax-error tocheck "leftover period in list") + (map check a))) + ; simple pair - this and the next do not work when parsed from wisp-scheme itself. Why? + (('REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd . c) + (syntax-error tocheck "dot as first element in already improper pair")) + ; simple pair, other way round + ((a . 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd) + (syntax-error tocheck "dot as last element in already improper pair")) + ; more complex pairs + ((? pair? a) + (let + ((head (drop-right a 1)) + (tail (last-pair a))) + (cond + ((equal? repr-dot (car tail)) + (syntax-error tocheck "equal? repr-dot : car tail")) + ((equal? repr-dot (cdr tail)) + (syntax-error tocheck "equal? repr-dot : cdr tail")) + ((member repr-dot head) + (syntax-error tocheck "member repr-dot head")) + (else + a)))) + (a + a)))))) + +(define (wisp-scheme-read-chunk port) + "Read and parse one chunk of wisp-code" + (let (( lines (wisp-scheme-read-chunk-lines port))) + (wisp-make-improper + (wisp-replace-empty-eof + (wisp-unescape-underscore-and-colon + (wisp-replace-paren-quotation-repr + (wisp-propagate-source-properties + (wisp-scheme-indentation-to-parens lines)))))))) + +(define (wisp-scheme-read-all port) + "Read all chunks from the given port" + (let loop + ((tokens '())) + (cond + ((eof-object? (peek-char port)) + tokens) + (else + (loop + (append tokens (wisp-scheme-read-chunk port))))))) + +(define (wisp-scheme-read-file path) + (call-with-input-file path wisp-scheme-read-all)) + +(define (wisp-scheme-read-file-chunk path) + (call-with-input-file path wisp-scheme-read-chunk)) + +(define (wisp-scheme-read-string str) + (call-with-input-string str wisp-scheme-read-all)) + +(define (wisp-scheme-read-string-chunk str) + (call-with-input-string str wisp-scheme-read-chunk)) + + +;;;; Test special syntax +; ;; quote the list +; write +; wisp-scheme-read-string "moo +; foo +; ' bar +; baz waz" +; newline +; ;; quote the symbol - in wisp, whitespace after quote is not allowed! +; write +; wisp-scheme-read-string "moo +; foo +; 'bar +; baz waz" +; newline +; ; ;; quote the list with colon +; write +; wisp-scheme-read-string "moo : ' foo +; foo +; ' bar bah +; baz waz" +; newline +; ; ;; syntax the list +; write +; wisp-scheme-read-string "moo : #' foo +; foo +; #' bar bah +; baz waz" +; newline +; +;;;; Test improper lists +;;;; Good cases +; write +; wisp-scheme-read-string "foo . bar" +; newline +; write +; wisp-scheme-read-string "foo . +; . bar" +; newline +; write +; wisp-scheme-read-string "foo +; . . bar" +; newline +; write +; wisp-scheme-read-string "moo +; foo +; . . bar +; baz waz" +; newline +;;;; Syntax Error cases +; write +; wisp-scheme-read-string "foo +; . . ." +; newline +; write +; wisp-scheme-read-string "moo : . . bar" +; write +; wisp-scheme-read-string "foo . +; . . bar" +; newline +; write +; wisp-scheme-read-string "moo +; foo +; . . bar baz +; baz waz" +; newline +;;;; stranger stuff +; write +; wisp-scheme-read-string "foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo \"\n\" \n___ . goo . hoo" +; newline +; display +; wisp-scheme-read-string " foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo" +; newline +; write : wisp-scheme-read-file-chunk "wisp-scheme.w" +; newline +; call-with-output-file "wisp-guile.scm" +; lambda : port +; map +; lambda : chunk +; write chunk port +; wisp-scheme-read-file "wisp-guile.w" +; run all chunks in wisp-guile.w as parsed by wisp-scheme.w. Give wisp-guile.w to parse as argument. +; map primitive-eval : wisp-scheme-read-file "wisp-guile.w" ; actually runs wisp-guile.w with the arguments supplied to this script. +; uncomment the previous line, then run the next line in the shell. If 1 and 2 are equal, this parser works! +; guile wisp.scm wisp-scheme.w > wisp-scheme.scm; guile wisp-scheme.scm wisp-guile.w > 1; guile wisp.scm wisp-guile.w > 2; diff 1 2 + + + diff --git a/racket/wisp.rkt b/racket/wisp.rkt new file mode 100644 --- /dev/null +++ b/racket/wisp.rkt @@ -0,0 +1,25 @@ +#lang racket + +;; Implement wisp in Racket +;; +;; -Author: Arne Babenhauserheide + +; adapted from wisp-in-guile and algol60.rkt + +(require (for-syntax "parse-base.rkt")) + +(provide literal-wisp) + + +(define-syntax (literal-wisp stx) + (syntax-case stx () + [(_ strs ...) + (andmap (λ (x) (string? (syntax-e x))) + (syntax->list (syntax (strs ...)))) + + (parse-wisp-port + (open-input-string + (apply + string-append + (map syntax-e (syntax->list #'(strs ...))))) + (syntax-source stx))])) \ No newline at end of file diff --git a/wisp-reader.w b/wisp-reader.w --- a/wisp-reader.w +++ b/wisp-reader.w @@ -1,7 +1,4 @@ -#!/home/arne/wisp/wisp-multiline.sh -; !# -;; -;; Implement wisp in guile +;; Language interface for Wisp in Guile ;; ;; -Author: Arne Babenhauserheide