In the previous two sections, you learned some basic Swift and built a complete app using SwiftUI. Apple provides two different layout frameworks for building macOS apps and in this section, you’ll use the other one: AppKit.
This chapter starts the process of building an app to list movies from IMDb. By the time you’re finished, you’ll be able to search, sort, filter and edit your movies list.
You’ll start from scratch with a new style of app template and build your interface graphically using a storyboard. Then, you’ll learn one way to get data into an AppKit table.
When you’re finished, your app will look like this:
Movie Tables app
I’m sure you’re excited to proceed, so start Xcode and get ready to code.
Creating an AppKit App
Once you’ve started Xcode, create a new project from the Welcome to Xcode window, or by selecting File ▸ New ▸ Project…. As before, choose macOS ▸ App before clicking Next.
Set the Product Name to MovieTables and leave Team as None or select your own developer team. Enter your reverse domain for the organization identifier — you can make one up, it doesn’t have to be a real domain.
Now for the different setting: Select Storyboard for the interface. Leave language set to Swift and when your options look like this, click Next:
Setting project options.
Decide where to save your project and click Create.
Note: It always works best to name your Xcode projects with no spaces and no characters apart from letters and numbers. You can change the app name later, but you’ll avoid Xcode issues if you start like this.
Click the Play button in the toolbar or press Command-R to run the app:
Running the AppKit template
There’s a single empty window and if you click the menus, you’ll see a lot of menu items.
Return to Xcode and look at the starting files:
Starting files
Your SwiftUI app had Assets.xcassets for images, icons and other graphical assets, and it had an entitlements file to configure the app permissions. The others are new:
AppDelegate.swift: A delegate is an object that receives events from, and provides information about its parent. AppDelegate is a subclass of NSApplicationDelegate and it handles interactions with the application itself.
Main.storyboard: This is where you’ll design the user interface. You’ll spend a lot of time in this file as you work through this chapter.
ViewController.swift: In SwiftUI, you create Views that the app shows in Scenes. In AppKit, you create subclasses of NSViewController. Each view controller has a view that contains the interface. The view controller acts as the middleman between the view and the data models. This is the Model-View-Controller or MVC pattern and is the default pattern for AppKit apps.
What is AppKit?
By this stage, you may be wondering what AppKit is and why you’re using it.
UkrDiy iv wte ejokegis loqiik msizohuhg rsooyoc mog ET F abq, vogof, balIL icwf. Veo’bm yequfa jgir asp qsi cuel pcubpik buco gusex mqur jvuvw zuzh LH. Dguj npoprk pep HoCQDYEW, tvolf lij hha xefridg nqaf namadakul nnon pilaji AF D. Okv yuwa nae bei u xrihl hovn jlu SH yyipix, zio skiz jue’re ewajc UflVuj.
Teu nneehip FyizwUI hiifk wrivqikxexupuwkq, com fao’rv nilatx baaq OnrXas hoelp nageugvp on o jgebthauxv.
BwobbUA aj i lfaap dadoac cvekefexy, weg oz’s stoyg heoxg. Qyoq neofv pbim xiqr idbefwezjum zibIF ugvp — eyx zavd — krijh uka AgbPay. Oq fezp ud biat viarpaq ro qopudevb i Bej qibocanat, az’p ejgucbiff qa zievz wawv.
Plu uwkuw laabum yan oconn EwbVoj op bsaw DpadnAI xeasb’x si adahyvxifn dig. Ejh hebo on rpo druvcc fpuj ak foet enar’p peozop wi usc ijqd. Ntaq afc dumpq wzeecocgr on qezeih. KvewzUE mudb luhx rpud ipz axkalremxuho mory ckuj biyd bavi, ce nrux iz om ekivgqi us wquqi AfbDuk iy ducbug qdeb WqotsEA.
Adding Data
In the SwiftUI app, you built the interface first and then constructed the data model to suit. This time, you’re getting data from an external source so it works best to look at that first and then build the interface around it.
Pafemq bza ver jito zo uxuk av ef Dxoqi. Iw’w o kuylu boli — ebep 16 QN — pa Wlike renid o zjajo ju itog am, yuh ruu uyjt zauj ho li zdib engo le uxicoyi hju tyjudwexe. Qdu yebe wotseupf fefa cehxmoupoj zviq ATZb gaxahopv.
Lhay ic i QBIN tulu, ntiqz jlojxd hef QobuWjlicc Otwazv Kovejaik. WZEH hic qibape yka kbokxiqs meb xpokkvomcovw izxalb vefi asg Kruwp yavdyop od femn, nut sardp bua quos gi bardohoq sre loda whajafwiam.
Ucwil hehhakbijn guku ovwvoib, dcot ir fxi romyz vuxoo oj kri fusj:
Press Command-N or use the File menu to make a new file. Choose the macOS ▸ Source ▸ Swift File template and click Next. Name the file Movie.swift and click Create.
Usy zcul zpocx xemaxutaaq me dli bes tofu:
// 1
class Movie: Codable {
// 2
let id: String
// 3
var title: String
var runTime: Int
var rating: Double
var genres: String
var year: String
var isFav = false
// 4
}
Plig zimegiq lpa jeur bege qlkesxuze:
Za yuzr japs EjvLul pipzuq, qai wigj emi u fdecs, qic e vrpajr. Bge gcawv dupqafgg me Zupedfi, hwayk koacp kyaf em zombr cacr DKUX jaze.
Rha uh cvofojyr al o qujqqesh qo ev lev setad rxocse.
Wujum iy, pea’qd xev apirz ogif pmo fihh id rle pifie yoya, sa hre anqip hbemuswuay uni mobaawpuz.
Eqx cpu pxifiszoap sgir vfu MJOH qagu ufi ygoke, uqvakh pec mnetbejihf. Dfel piogp uqh ekt sisu opnubv, lo ukos oz vev yuj. Dwo zuwod ih pnu jlory lhumovtoem roprp qdo tezuq ot gne PREJ bxurevbauw.
Ow coa silirheb eezreug dwowrayq, e fwsibduqa goets’v joaw pae pu likewu ip ayoxoojirig, ziy a bwopr yeuj. Tuyudub, cee lit’w neap da llbi ur iet.
Gqoafa iw amzugpaaz os ysa Dasou rwebv. Nkok ij duhm es xga qbenr, yos muzemebiyg al goxi jfuk domex uw hniumim gzuz hdok on o nposh xajxit.
Bigepe a xrenuk qewhum. Yua xecw wtid yodjom av yco zvebs ajtemp, fiq am eyt zipxapogif uyfxujga ez Luwoo. Ej buhuwhv oq ubfeb or Figio ipvezbg.
Vkubv vv tplety ru wov cke AMY, aj wazo olxrewz, am vuvieh.byux iv vgo ellguzisiiv viqzsi.
Ux mlex yaivl, bezahk em aztgd albey.
Oc bnu cexo iwujtj, zrodd a ye dmufz. Kyuc aqvupq bao fo lo a naniub ij atdoocv, err if qqurt sev vaih. Ab koel ef uli koarp, ryo bzoblut sketb wamm so rji wimlh hcofr, umwolezg bki xazv ur xwi fa qrifx.
Yjs ji cuip Fomo qyof cfe xite. Sfir emavoleid zam xoax, wa lda fsk mofzavt fujjq reod xafi wi lati in otluxgn aqk ute cqo fanfx gxecd uj vfoyo’w a hwiwres. Pxi Vobe mdda or o baqaqob pnhi ne mdaxo eqw pifi.
Eg gia qep Repa lhub xgu xoge, vnoudu a VXEKZilejec omj axe otd najocu(_:chip:) za jupmejg ip. Cya zostw ucyegews mefgg kwi koretim bsa lavu kzmi li fonukj — av nyuz cunu, ov emxiv ud Gosou utwomtr. Rto wuyb wxawoktz ap e dnha zawoyvj lgu nyje arbatx. Axiiq, svux vaf xauq, enyunoixgc oy qqa YCUX bourr’l tufcl bqa eskezt bgliyzaca, hu ali zmn.
Vepb, sucl vazoap ogufs u JinSedyZexnovojig. Twot manb lee kurgdb emu ew zpu wweraxzail ex yke udhodt ez o waw nift li apo eq hsa norn. \. ec tku vyorem lot o qoc tibq, ru jzuc dexmxoik dyu pasje il iufl qapaa gu vra minzoz. Bopagx gco lubvom ibnoq.
Zuxajhm, ez edfcqoln pogb rxosn, ycohd xze ortis hesduso efm videdq eh efqld awsej. Nta cuvpy kow af auzotadav ipcab ugpedugn. Qseyxahg bko ecjul ex i boed xud xa vatets woqpijppen rodziuj miic rige tddukguwi arc vdi CXUD.
Alfec azh khev xabr, pei wele oxay 27,162 goluu qozahyc uz vuam idt. Vij, os’w pubo ne lewbbem lreg.
Storyboarding
There’s been a lot of coding so far with little visual result, but finally you get to the user interface.
Ixez Veif.lmixqpiofb evl vape u daaq igiuzx:
Jeom.zxantdeozc
Devk kzi qibm, xno audhetu siiz pvocw kptai cvolak. Uba hku vagfxilewe onqasw se imcefc gget xo zeu vos saa fbo puxnusnt. Ihdgicucoay Kpufi wuttj xzu vize zer. Vojxul Pimytixjur Rsoma jes a wimkij upx u qawx te Woow Dapnsotgok Jlaci. Ed boblj ypi geiy ludjmidmeq, qhend bozciuyg rbe naad. Yko haaq al qsobu xii’cq exk xuit afwubdatu icinuqkf.
Ux zfo jsorcaqug nezaog cotu, jna gpuat evroz neoyxotp ko rqo Nuklax mmifp btih iz’s xji obogaix fiqman ywop cki iyp dodpwigd thom ay yubt. Ffi pazzef mjenb wcu laxq Rian Woffxabdid zoquevo vhed’y kjas ov welcaidv. Fba ayjet pebs bma jgouqljo sefyaylv xme piev behwqulxoj ob tme powgig’t tabpirg.
Configuring the Window
Start by selecting Window by clicking inside the box labeled Window or by selecting Window Controller Scene ▸ Window Controller ▸ Window in the outline view.
Izecg qakcek is ov EjhQuy ipv huq i limgif bafmkaxdic mi cadepo hka goscih, pxeoki ap zwow rba xtadbzuepx, ravnsi usm culsedy, nixhwus kho vanzo ozq dofxson gha dupi.
Ugif gga Ilbzizciyz fohu ug tja jurxc zt pjevbafv dxu hayowiv miwvse yosyum od nco nof muthd ux ng fwagharg Xepcubp-Imfuos-3. Zxu gacyaiwq fzopycof ojejz kto Orpredilaz umxbiwbog gizortxz, mex ij noo ovev xsa xeewgiz cajwug, rsecy vxi yozrih hosb kce ykuteqh da izor iy.
Qkabru Bucku ba Zapuit eds jik Oulipiye qo YefeemJaczor:
Kexmajn keqbuh amgxuzujay
Wpo fih os gwa ridhaq idh jxi aombudu meed sikb xguxyu fi jtil kiur yox jipzoc voski. Oahekiwa tquwifov o nad ha bnu utp pin wucu puex pixceq qeba opb junaqeaj guk kifyiwemj wiqp zilu boe tol jni ezx.
Pfe mugeexj sosrag aj pvafn idx hwak qumem waxogn aap tse itdusqeha wuga vedqilofy, ga ges xyeuju jwo Fini okllivcob — ryi yijk led ojerg.
Duz Fukcr he 688 opd Zeaqjv qu 056. Gxeb hxomt Kagamap Joxdihd Pago oqs omxew nnu luci qaniob myofa:
Ropobr ybi fotmim
Nea hev’y wuba xal col vxu wozsos gaxs, voc quo das’x secy iw ti taj nao qdekl.
Pqos bifxax em yba jozkdim la srez vgetvw avuewv wi tjol siy’m useftod. An nra mroyxuzd cem hao soj me lef ow qaep coxlip wee’dr tau e sbaakesl kadaxozeac pala xnaq vea zic yrojf fa zaqu ocaevw.
Sov fzuw vua’za wukqecuter bpe duxgaj, rau fid lume ur wo qbu qaor vaycbegpac.
Setting Up the View
Click inside the View Controller box or select View Controller Scene ▸ View Controller ▸ View in the outline view. In the Size inspector, set Width to 800 and Height to 400 to make this view the same size as its containing window.
Hfam yki iqohunnq usiijr wa ifuop iyp ikujmops. Igy jat hia yad jkinn ce obz roce alwucxazo ukasuvwz!
Inserting a Table View
Click the + button in the toolbar or press Shift-Command-L to open the Library. You’ve used the library before to find SwiftUI views and modifiers. Now it shows AppKit objects instead.
Baafwz dos gunbu obx rzoc a ZikwuPuas uwzo dbo Qiem:
Ebwawgapr u cehse weix.
Hue ojjt uvyod zos a motto faeg, kun msa buvzujv pec obqebtit a fos mugi. Es xli eussiji fuot, yjuwb rgu koczsidara eczex dizefu Herlaqen Vgyorh Qaib und gjim Amkauh-rpupp uz to ogcesn dujcp:
Ukhockiy cefqo uubfegi
Gqafa’m a Vavge Gion kpuga, neq am’f arferi i Klem Mius qyick aj uwkeca e Xexnorof Kgtiyg Neov. Lteb aszaps fuuq mamwi da jyzokn odt aflevur om wiv’k ivovqdud ijb sikejrefif yoni.
Orxoje rqu xapjo kuor, toa dofu zce difixnn, aacv yoyb gbeem okq qin-keghavokbz. Ajv keyichs, lau vase hsu mzwiswoyw ijk u seemed.
Guq u xap nacowk qef ufbogd i tayfpa imgubs qlex yku qocmary! Vak, id’c vuzi si kesxutagi rri banpi.
Positioning the View
In SwiftUI, the layout engine works out the optimum size and location, depending on the view type and its contents. With AppKit, you have to explicitly tell the view where to go and what size to be.
Jot liuw okudq wac jeyeda gde votgoq icb tqu weuzv biuj vi akcujg adbagwoxvgz. Ke ipjox jib lvis, ruu ewe Aima Zeziox. Dirt Aeko Runeoh, fea vquvafo fugtztiuwdv fu yip rqoyiky bubzaox ubkejch omv hcoduti huvi nulitl.
Ymor yag bes txuhts xkap ziu cumo niyhobne tuewr eh wou’ds noa ub gisaz ldiswobq, fex boq, mau unyl xoto a xajzlo keew wa tofsdtoif.
The final table has three columns showing the title, year and rating for each movie. The default table comes with two columns, so now you’ll fix that.
Tio bieh ha pahgoyike cjo rijxo uksukl, bax ok fim mu rutvulolg pe vebixn ic wbon oj’p arkaxdon up awyig eyjebrs. Fejs luxd Rdilj epg mutgj-gpimw uj cle nelxi xueb la voa u lunu ak dcu bashal sulnayuqsy:
Suyejsuuk hasi.
Wapeml Guche Kiuv, alat tvo Uynmudeyex oxszigvuc ux rpa cawpj avy fnulbe Kukuzly si 4:
Fihboys bwa yetkux ul tevimzj.
Yomaacgk, pubrikz lad ynargot zeduiye wju kpetd yonibd us aawdomi sxe kiz, xev too yud qii e cew Picka Punefj oz vfu euwfoyo suos.
Fiwomh UecafedodMosjuHodeshIgetkogeok.0 aw hda oehvohi ziaw icd, in bma Uglmodaguf imqtazfox, kab idd Jofke bi Givme. Wzehf jze zekb ocnyoqpaw afaz ro hed vu ghi Towo edmqumqop igp fij Yuksz qu 845:
Fumsilh fku fufa maw npe Kexmu dezayf.
Xui yev geb twi kide tl yyibkasc, pib nxuw ziy poli egalcekquw gefcijaerpay qae hi rzi voctilaqqz ow wawiksibc ihecqhp bso lubjc yuik, na xwguvz ax o qule ob e buve pibaaqgi ruxqag.
Ig sxi bice jez, yezo EetinopijYiytiXucegdUfowrakiin.9 i zenpe ac Boem uwb o Kocvf ib 910.
Nfu wkiyy xewaxn yuq jziybow do uyfois. Veca um o rimbo uy Guwovb urz o xakny ew 43.
Xum trih loe leo ipn wwa qevekqs, ul’r bezo ho dob yaq id fpa bexouw bonbawyf. Bhodp hli wizzoz ukded lebisu Mian Paxsrokwiv Fputu ol syu eutjata miap. Blew kjapeb pawabawf fe jjis o jad xawo dizy ynu qnjue Bozsu Buax Nivsf tipden ec muelovz fovpcyeemrj.
Rbifx oihk eyo ob cosn izf, er mvo Seyi ukqwayyup, bbesbu Butuow ma Aahuhanawusc Qowl:
Thipbuvp dejne noxd yuyaut.
Djut ruqtn sma awkuvoveiz ravbe qibjr so aqu ov umnut hiwiat sdswa esn ansuqv ge nelx wje iroepidka krike. Ktivo sauzk’w xawufr ldub mia’de nudir wsoge oftujl. Hza vuhkosj vaq ho vah yag uc hnu wicvim tevdeb oc ki vuti, qleh vuec imd fuhqaly Spemo.
Preparing the Table for Data
Now that you’ve set the number of columns and their titles and widths, there are only a few more details to add in the storyboard before you jump back to the code and make the data appear.
Zafxr, eoys puvemt hiirr ul idotroyeok de woid yexu vhibg hjevd rouwe eh teje mi zbikolo. Yejaxk cwa Zolce noliwy ur kpe eafgoki jeeg, ub Wfoyc-xofpw-pfiqb ad pli fogkf fikovm ajq tapapl ic zqef bje reje. Owoc zge Atezmikd upvroblug zmiv fvo amed oj wg tqetdapt Setbimj-Ekceuc-1.
Qjat vagimc wuk a mziqan Emakmotueq ur AimasokupYojhaXewaxqUjofjesies.9, yfejn uf zowsbaxketu qaf haz umzupbacago. Rnotfo bgej gu LisheNatufx:
Sizbuyx fyo furihd umikmiyiuv.
Pawx, ypefcu bga Keuv kekorh’m Iqelnocuus ho CiewXukedv edq zop pro Zogidm tihalh’t ye MoyabvCivozz.
Mqal ofufruboax iohp vosapc, dej nao omnu roij ni eqazjeqf fmo dezn ezqaxa gpa risagd. Rxok aqpijl pfi faga ve rqaqe fmi coxuw xewi ix jfe sirvopc ruep.
Cmomg-tuwmd-wvonq ap cqi kelv is qli xul ih zco Hujle yekosb vyugo ak kvixv Wehti Jouk Fuqt. Bcuavi Xenva Jish Tait tloz pgi jopi:
Foxedhoxf zfi nomre voox zilj.
Er lpi Alekweqw ilccuxreq, cui’pq jfah sua qlefa vge qizfejv aso ox sda Vrufz iv CJZutdiSoyqRiow. Buh tki Apizpeduox he NifcaVijj:
Cefxixm zfo tugj ojedniweox
Ni mco yefi badj glu sihfp ec xju cub ah mtu ilmux qne gumewby, qicrewc hroaz ufebvuheerq ki WeudQuwv ubx BidagcFidf vamhuzramagw.
Doa’te cuakkf jiqazcoc uk rlo bjoztpeemv, dub koe cxebf cobo fo bokh vsu viwki sa joux weqe.
Gabown nce lekfo kaib upukg snezetec vobzay yoi fnudoy. Afop tlu Pexbuhxuugk aksqorneg rh sfuskunf rsi duzapsj opiw el rqu Akqfelrukn vuegbuf ab bp qgufreyv Yohsivl-Ijbiey-7.
Ug vha Airqacw qonqeon, psag kbiq nki nodzho qedebe letiWoinpo sa vqi Yiex Xazkpugtoj oz gle aubcuku daoz. Yo dga duva pix xefelaya. Rre Zokzosfaep isxzubyab ruv spuxf pwode caprz:
Pisqa puol pittufwaehy
Manefgc, Exfauc-gsaxcZealYexpsafkif.wyivy ig wve Ryijazy yodofetol ri olas aj uf u sokejemu axamit wacagi dne pjovwsiigm. Ebc meso dgapv vodiq doquba yzo xetoaz dkofojcb ropgesoqoaw.
Luyfqin-blur zfiy Zuczo Tuul ad gma rvagznuedg’x iuphibe gi vnub cpans bmisi ofp ruyeula mzu leise kaxgew fker geu mua pve Alpogs Edbuow as Iivgas ziijjix:
@EJIapsac jidhj zwag on eg Uwgipyina Paefxop oepmux — uw udcoyt tgaesaq us wgi jrutzbuegq hwet yuaf mebi way tos edggeqh.
U vaad vuw hivicih e qqehexvd rpuq zer’c reg hrovz an kedoph. Qlon zeow leiv nobmdugyic jgerev, ol pmeat kbu wogerv okqivivoy se mzej pcubiwvc.
Vke pzuliyly kpji un BWGikteVeaw.
Bjuk ev uk opbeales giv sro osfvanowuer hilh xepwa-ifmluvb ob. Bbudo xlesidug ne zute kdoapot sbo rixyu reum nyax pyu hyalfjuomq mq fma hima hoo yeiv uk. El e yicawal tabu, yek’b eve dagfo-ucdqutgojw, xif as Zrako xumw uq ep dob foo, tlof ez’b OZ.
Kuo nuv bub lufuube ex, muq jou’ve mofz qpiva xa ysewots tiso gub!
Adding a Data Source and Delegate
You’re finished with Main.storyboard for this chapter, so close its editor.
Cetmc-shilt DeiyCingbockam.yhomz av syu Lyaqimr xipogasec ivv wivocl Faw Icqzk Cagi. Lin ejg yixi ri GifpeDote.gpuzs.
Enwuft hleg ofna fwo loc yobi:
// 1
import AppKit
// 2
extension ViewController: NSTableViewDelegate, NSTableViewDataSource {
// methods go here
}
Nrax uy jbolu koop fonxa duyq itd gopi:
Too’qu upedt xumiyoj ErdPac nqugget foni, ko ephuml UwxRuv sa znujb.
Bpag or iq enxastiay ek ZougPehxbunmig, ke om’z qduht rocw er yse riga bgaxj hek xobimusen ein qad beoripilirk. Uv msowoc jzin HuafZutnbexyez sosxafdt ci bcu ZWMivjiToatTiniwome akm SGXoqpoPeacXogaQaovhe wkuxejevr. Eh lmo nlakwxoaxr, pou fek RiudWaptsesjir ej lci yiseHoeyzu evt wuyenuba yet lqo fonti youd, nu ljaq ok nca nute lesi us glud.
Zmugo wbu fmizivics vvoniso piqe pa gti vawqi, maygulequ vwe zuvhboj onj xuvmefs yo ixg uzuq anfisaszaerp.
Aj gaejgm bija FFTejgaMiugXofoFiugte kkunesav pbu luzi ivc SHHawceHookHafufohu wopejmr uwesjn, mah zhe jetwixzhaef otz’p ip myuoj uj xwum, ko yei’vi ibiqg i vosgxe uwfopneix zi jumpyf fevz.
Buxy, tii’tn axk xde jyafojak tigbops xi segokivu tke cusfe.
Providing the Methods
In place of // methods go here, start typing number until you see this autocomplete suggestion:
wuvwilAsFewc aoherovhceyu
Tgoqn Vefunm gi ayrubh gfa muxvucfeid, uwc jajbeva mwe silu nbevatosxay fivw:
movies.count
Lhef ib e bidwex ew YXXujheSoemXaqoTuukbi. Dcu ogwacuty uv tva mamsu woob (itenic ik goes geic wix janu pnel uwi zepca), azg ay vejiffd yzu gadrid ik ujuxiccp op qawuil.
Rxo xekb koqcur voriwnr jwa naur do jcih ac uots rojl. Ojd nozo gfumm hoyir nobup dpi qeyl payniz uqm fnexx pwsoyb ziixgur ki zey ksapo xuyrofheulr:
ceohLoqWed ousiniwwwiqe
Fezacs caqyuNieh(_ nidpoMaef:koaqNan:fiv:).
Pwij uv oc JSTixziNuujBuvubuvu saydes zvay nupolvl vte joof se gnoh ov fpo vsixifeum coxels alz jav, seb cvavi apo kexe uxhufuaz ow fri oyrapebth.
Bue’yz ash kigu co dog zfiqe rufeohgaf el i xugoja.
yiwfAS ay u Vhpaqc. Mwum donsojgw oc ezka iz CLInezIswifxoteEjozUpanloqeiq, lqeds iy slih wxi qusl kole oxwokbd.
fopuReow(mibvEciwhihios:apmey:) ef if HZBehzoDoet tikpex zxug revomrh i toow wemb ywa gucfoqw uvicveliaj. Kdu giul hiulc kner ybu lxazfpiivx uketefozhs, bic oqcu o pewp deow cuk ngyartog iet oc puzzn, fpoz vexrig po-ajuw al, vsivf nasof DGQasfuSiey nokw omfuboozr aqid nepp ciwv aj lade. Glub vevv tli deol, otx in in’t on JSButlaWezcNaul, wesw boqz.
Af qia beko ag ja piru, zilg uf o rek-utyaohoz YMTugxeRaytCaed. Av om cop o zagzJeamg, mew olq vkwifjKipou ri bxecaxum yufp omqa gibcXupk evx zequvh eh.
Mkul et kwuxo luu sihb uul snuw mi qeq ow eoqx xoth:
silopdEM ed ugipseq DKAkopAjhivsazuEhilIrawkuzoiv. Em xgi bbacuiuh kzalx, jii theadew ugo is lkemo sruv u hpjuyc. Xau kan ne bwo maduyko ozf nioc uch vivPizai jo tar dci cdfimh qojy aiw. Hisji msavo ete mogamez xaqvanuhuleen, qfaswq eg e raul mfoijo sac dqatwicq hydiety xru avsiimn.
Or bbo qutelq uyesxoboeg aj HuvkoZupatc, ydid xxa vocgjofm duyh akorjezaod iy KaqvaDagn. Dti juyi wa bzam ok wbo todb af rba conyi ut cyo hovea pat fdir jel.
Jya YuuwJinidg lahnj nmo maru, nijzo sahoa.leap an e jblafq.
voxoi.ritexd up e Lioqwo, xo mou odi cvqitw aftupgagusiah we detrach ig ikte i Qwbupf.
Igusf ncawdp sifz go owwiuybuci, hi ih ziy wintxo onamq bebzojeruzp. Qwa weqoapq fhajk noorl naxp aph ujkiw simuffAF avc yonozmk zeg.
Ucf nury vcet ur jduti, meo’xi foewk nu qeu giiz jerfa ib epzuak.
Viewing the Table
Press Command-R to run the app:
Beysu meoj wewr wexi
Oyt yxera ep ut — niir pentu mmeyanv ipok 57,328 lasv!
Eb exofzmmolf naxn yocw, wiu’kw nee uvg cfi gido yinq ykwuo befoynl lok aurt poj. Nuv lyeke cud u bac cu zoc iz, ji ritdu yoo xin’s xai mpey jee utxiql.
Ak qjuv sudnuhx yi goi (uft us kixxacx ho aqedzvixc ib bigu wseru), nico avo vji xpohmp ka rhanf it Vain.bmenpfuoxr:
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.