{\rtf1 \ansi
{\colortbl;
\red0\green0\blue0;
\red255\green255\blue255;
\red255\green0\blue0;
\red0\green255\blue0;
\red0\green0\blue255;
\red0\green255\blue255;
\red255\green0\blue255;
\red255\green255\blue0;
\red0\green0\blue128;
\red0\green128\blue128;
\red0\green128\blue0;
\red128\green0\blue128;
\red128\green0\blue0;
\red128\green128\blue0;
\red128\green128\blue128;
\red192\green192\blue192;
}
{\fonttbl {
\f0 Arial;}{
\f1 Symbol;}{
\f2 Times New Roman;}{
\f3 Delicious;}{
\f4 Gentium Basic;}{
\f5 serif;}{
\f6 Courier;}
}
{\*\generator Apache XML Graphics RTF Library;}
\fet0 \ftnbj
{\*\listtable
{\list\listtemplateid-723955400\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1155484576}
{\list\listtemplateid-1690734402\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1033096058}
{\list\listtemplateid1327362106\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1557280266}
{\list\listtemplateid502539523\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1930858313}
{\list\listtemplateid-938301587\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1728529858}
{\list\listtemplateid1085665355\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1431162155}
{\list\listtemplateid-1661998771\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1654374947}
{\list\listtemplateid-73789608\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-65105105}
{\list\listtemplateid99135751\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-518907128}
{\list\listtemplateid755814641\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-252332814}
{\list\listtemplateid1344049776\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1180918287}
{\list\listtemplateid1580443894\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid553609048}
{\list\listtemplateid-1266264776\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid629649304}
{\list\listtemplateid5955764\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid99807007}
{\list\listtemplateid39620447\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1946737912}
{\list\listtemplateid-1877116806\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-152527805}
{\list\listtemplateid1086124775\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid448784075}
{\list\listtemplateid1227951724\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1609984092}
{\list\listtemplateid64111306\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1764356251}
{\list\listtemplateid-100082026\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-960731419}
{\list\listtemplateid-1339022546\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-39845375}
{\list\listtemplateid-568315836\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid2092649110}
{\list\listtemplateid-81839914\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1089884900}
{\list\listtemplateid-1846688624\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1146103148}
{\list\listtemplateid55004124\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-784703072}
{\list\listtemplateid1770461755\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-691960657}
{\list\listtemplateid-1177788003\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2032810463}
{\list\listtemplateid-65824064\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-432352882}
{\list\listtemplateid-1949367821\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid575267217}
{\list\listtemplateid798819494\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid356750287}
{\list\listtemplateid1318001577\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid-92022521}
{\list\listtemplateid-1412716779\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid-1192467086}
{\list\listtemplateid276053035\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid-1223932479}
{\list\listtemplateid1542603436\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid615126903}
{\list\listtemplateid1177882237\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid1988388716}
{\list\listtemplateid-1430871151\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid19265476}
{\list\listtemplateid-1333570194\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid307082914}
{\list\listtemplateid-790542135\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960\levelstartat1{\leveltext\'03\'00. ;}{\levelnumbers\'01;}\f0 }{\listname ;}\listid1496453452}
{\list\listtemplateid-1690249972\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1455004595}
{\list\listtemplateid-290476856\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-604059026}
{\list\listtemplateid-1097539750\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-122204761}
{\list\listtemplateid-2002123957\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-576617062}
{\list\listtemplateid193034304\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1663951485}
{\list\listtemplateid1337360486\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid768747578}
{\list\listtemplateid873612482\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid934457803}
{\list\listtemplateid355564760\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-624972850}
{\list\listtemplateid1781447028\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid41547336}
{\list\listtemplateid1081281446\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1321591463}
{\list\listtemplateid-222544851\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-982203381}
{\list\listtemplateid-1331702554\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1233998085}
{\list\listtemplateid206843130\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid907249073}
{\list\listtemplateid1697401307\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-931610657}
{\list\listtemplateid-996341162\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-234791961}
{\list\listtemplateid-1638496702\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid61144662}
{\list\listtemplateid-1667947369\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1693091376}
{\list\listtemplateid105673451\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-627963836}
{\list\listtemplateid-300903254\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-918940699}
{\list\listtemplateid1358495114\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-28037702}
{\list\listtemplateid2056481282\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-502062723}
{\list\listtemplateid617380302\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid731396580}
{\list\listtemplateid818693069\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-162912754}
{\list\listtemplateid-410943565\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1184143835}
{\list\listtemplateid1233308008\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1385753324}
{\list\listtemplateid-1474241772\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-840115328}
{\list\listtemplateid1376826901\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1895913584}
{\list\listtemplateid412901507\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1984652857}
{\list\listtemplateid2025024491\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-632101198}
{\list\listtemplateid-1233011876\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2139603013}
{\list\listtemplateid-1854979571\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-34604646}
{\list\listtemplateid-1866233577\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-131984708}
{\list\listtemplateid1612513822\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1516579035}
{\list\listtemplateid-911714850\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid203005342}
{\list\listtemplateid13453556\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid307621155}
{\list\listtemplateid483675743\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid125015832}
{\list\listtemplateid37011083\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid2077347671}
{\list\listtemplateid2069609186\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-120473323}
{\list\listtemplateid1502566715\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-46741469}
{\list\listtemplateid-1206282339\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-998828580}
{\list\listtemplateid-1550311379\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2141482063}
{\list\listtemplateid1449582151\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1097472880}
{\list\listtemplateid-1105846005\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1327824311}
{\list\listtemplateid-1174121238\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-651630279}
{\list\listtemplateid810978550\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid223701431}
{\list\listtemplateid835843581\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid43703267}
{\list\listtemplateid-772329283\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1519786882}
{\list\listtemplateid-317962831\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid372536197}
{\list\listtemplateid-706495414\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-642907139}
{\list\listtemplateid-1116133237\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid15792134}
{\list\listtemplateid-1231319713\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1322391079}
{\list\listtemplateid1299386162\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2011725892}
{\list\listtemplateid1341976962\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-348690342}
{\list\listtemplateid-262501494\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1190607957}
{\list\listtemplateid-986836170\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-540039728}
{\list\listtemplateid-1948015872\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1675546118}
{\list\listtemplateid638256747\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-392391576}
{\list\listtemplateid-97160665\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid191085745}
{\list\listtemplateid1375971382\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1517309270}
{\list\listtemplateid891811204\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid2133755906}
{\list\listtemplateid2110473668\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2118700536}
{\list\listtemplateid861211557\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2058625827}
{\list\listtemplateid1625767564\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1573507430}
{\list\listtemplateid-1922104200\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid2051434938}
{\list\listtemplateid927536580\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1271440420}
{\list\listtemplateid1184911833\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1386277121}
{\list\listtemplateid-185358571\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid50057146}
{\list\listtemplateid-1025692308\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1284027987}
{\list\listtemplateid-1116573039\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1093701172}
{\list\listtemplateid2068400044\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1686684117}
{\list\listtemplateid-1847249948\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1009668318}
{\list\listtemplateid408998980\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1670927751}
{\list\listtemplateid1439774921\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-380240510}
{\list\listtemplateid-1800042595\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid718930634}
{\list\listtemplateid-1743967552\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid16808464}
{\list\listtemplateid252008887\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1137718941}
{\list\listtemplateid-1053605891\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-460347667}
{\list\listtemplateid947528252\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1278046001}
{\list\listtemplateid1599145891\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1842130704}
{\list\listtemplateid1631478226\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1341955486}
{\list\listtemplateid-1370798799\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1754478786}
{\list\listtemplateid730123440\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1516348954}
{\list\listtemplateid1491046204\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1409786204}
{\list\listtemplateid-656053644\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1114899725}
{\list\listtemplateid-694901410\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-453397258}
{\list\listtemplateid13393714\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1804067552}
{\list\listtemplateid176533870\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2101289195}
{\list\listtemplateid-1511804464\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1339899789}
{\list\listtemplateid-1660688399\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1974699707}
{\list\listtemplateid86156176\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-115501757}
{\list\listtemplateid1775057871\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1659413839}
{\list\listtemplateid-524129043\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid116690193}
{\list\listtemplateid-1387390647\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1335659601}
{\list\listtemplateid1291940779\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1587895448}
{\list\listtemplateid-129016790\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-782382009}
{\list\listtemplateid1369132585\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1111888250}
{\list\listtemplateid1775301948\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1582995723}
{\list\listtemplateid-898816007\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1352452311}
{\list\listtemplateid98890493\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1072231506}
{\list\listtemplateid1763924914\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid816987543}
{\list\listtemplateid-312090222\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid526139168}
{\list\listtemplateid977688068\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1231414341}
{\list\listtemplateid-1465993732\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-287577538}
{\list\listtemplateid-1765140980\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1336202001}
{\list\listtemplateid95008905\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2020641285}
{\list\listtemplateid-1985683736\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid768704422}
{\list\listtemplateid1303323276\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid489119572}
{\list\listtemplateid-869863794\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1357461657}
{\list\listtemplateid-779918512\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1628866452}
{\list\listtemplateid219565529\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1750503926}
{\list\listtemplateid1102069833\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-255081261}
{\list\listtemplateid187633124\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-2000829650}
{\list\listtemplateid-1628224372\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid919959231}
{\list\listtemplateid-2066119013\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1433358016}
{\list\listtemplateid837759872\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1076044702}
{\list\listtemplateid1374513806\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1135845471}
{\list\listtemplateid980775637\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid391471507}
{\list\listtemplateid1920058376\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1136222341}
{\list\listtemplateid1940365237\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid810323999}
{\list\listtemplateid330772320\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid1278875422}
{\list\listtemplateid562086714\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid-1037359638}
{\list\listtemplateid-1255479666\listsimple{\listlevel\leveljc\levelfollow0\levelspace0\levelindent960{\leveltext\'01\u8226\'3f}{\levelnumbers}}{\listname ;}\listid200094072}
}
{\*\listoverridetable
{\*\listoverride{\listid-1155484576\listoverridecount0\ls1}}
{\*\listoverride{\listid1033096058\listoverridecount0\ls2}}
{\*\listoverride{\listid-1557280266\listoverridecount0\ls3}}
{\*\listoverride{\listid-1930858313\listoverridecount0\ls4}}
{\*\listoverride{\listid-1728529858\listoverridecount0\ls5}}
{\*\listoverride{\listid1431162155\listoverridecount0\ls6}}
{\*\listoverride{\listid1654374947\listoverridecount0\ls7}}
{\*\listoverride{\listid-65105105\listoverridecount0\ls8}}
{\*\listoverride{\listid-518907128\listoverridecount0\ls9}}
{\*\listoverride{\listid-252332814\listoverridecount0\ls10}}
{\*\listoverride{\listid1180918287\listoverridecount0\ls11}}
{\*\listoverride{\listid553609048\listoverridecount0\ls12}}
{\*\listoverride{\listid629649304\listoverridecount0\ls13}}
{\*\listoverride{\listid99807007\listoverridecount0\ls14}}
{\*\listoverride{\listid-1946737912\listoverridecount0\ls15}}
{\*\listoverride{\listid-152527805\listoverridecount0\ls16}}
{\*\listoverride{\listid448784075\listoverridecount0\ls17}}
{\*\listoverride{\listid-1609984092\listoverridecount0\ls18}}
{\*\listoverride{\listid1764356251\listoverridecount0\ls19}}
{\*\listoverride{\listid-960731419\listoverridecount0\ls20}}
{\*\listoverride{\listid-39845375\listoverridecount0\ls21}}
{\*\listoverride{\listid2092649110\listoverridecount0\ls22}}
{\*\listoverride{\listid-1089884900\listoverridecount0\ls23}}
{\*\listoverride{\listid-1146103148\listoverridecount0\ls24}}
{\*\listoverride{\listid-784703072\listoverridecount0\ls25}}
{\*\listoverride{\listid-691960657\listoverridecount0\ls26}}
{\*\listoverride{\listid-2032810463\listoverridecount0\ls27}}
{\*\listoverride{\listid-432352882\listoverridecount0\ls28}}
{\*\listoverride{\listid575267217\listoverridecount0\ls29}}
{\*\listoverride{\listid356750287\listoverridecount0\ls30}}
{\*\listoverride{\listid-92022521\listoverridecount0\ls31}}
{\*\listoverride{\listid-1192467086\listoverridecount0\ls32}}
{\*\listoverride{\listid-1223932479\listoverridecount0\ls33}}
{\*\listoverride{\listid615126903\listoverridecount0\ls34}}
{\*\listoverride{\listid1988388716\listoverridecount0\ls35}}
{\*\listoverride{\listid19265476\listoverridecount0\ls36}}
{\*\listoverride{\listid307082914\listoverridecount0\ls37}}
{\*\listoverride{\listid1496453452\listoverridecount0\ls38}}
{\*\listoverride{\listid1455004595\listoverridecount0\ls39}}
{\*\listoverride{\listid-604059026\listoverridecount0\ls40}}
{\*\listoverride{\listid-122204761\listoverridecount0\ls41}}
{\*\listoverride{\listid-576617062\listoverridecount0\ls42}}
{\*\listoverride{\listid-1663951485\listoverridecount0\ls43}}
{\*\listoverride{\listid768747578\listoverridecount0\ls44}}
{\*\listoverride{\listid934457803\listoverridecount0\ls45}}
{\*\listoverride{\listid-624972850\listoverridecount0\ls46}}
{\*\listoverride{\listid41547336\listoverridecount0\ls47}}
{\*\listoverride{\listid-1321591463\listoverridecount0\ls48}}
{\*\listoverride{\listid-982203381\listoverridecount0\ls49}}
{\*\listoverride{\listid-1233998085\listoverridecount0\ls50}}
{\*\listoverride{\listid907249073\listoverridecount0\ls51}}
{\*\listoverride{\listid-931610657\listoverridecount0\ls52}}
{\*\listoverride{\listid-234791961\listoverridecount0\ls53}}
{\*\listoverride{\listid61144662\listoverridecount0\ls54}}
{\*\listoverride{\listid1693091376\listoverridecount0\ls55}}
{\*\listoverride{\listid-627963836\listoverridecount0\ls56}}
{\*\listoverride{\listid-918940699\listoverridecount0\ls57}}
{\*\listoverride{\listid-28037702\listoverridecount0\ls58}}
{\*\listoverride{\listid-502062723\listoverridecount0\ls59}}
{\*\listoverride{\listid731396580\listoverridecount0\ls60}}
{\*\listoverride{\listid-162912754\listoverridecount0\ls61}}
{\*\listoverride{\listid-1184143835\listoverridecount0\ls62}}
{\*\listoverride{\listid-1385753324\listoverridecount0\ls63}}
{\*\listoverride{\listid-840115328\listoverridecount0\ls64}}
{\*\listoverride{\listid1895913584\listoverridecount0\ls65}}
{\*\listoverride{\listid1984652857\listoverridecount0\ls66}}
{\*\listoverride{\listid-632101198\listoverridecount0\ls67}}
{\*\listoverride{\listid-2139603013\listoverridecount0\ls68}}
{\*\listoverride{\listid-34604646\listoverridecount0\ls69}}
{\*\listoverride{\listid-131984708\listoverridecount0\ls70}}
{\*\listoverride{\listid1516579035\listoverridecount0\ls71}}
{\*\listoverride{\listid203005342\listoverridecount0\ls72}}
{\*\listoverride{\listid307621155\listoverridecount0\ls73}}
{\*\listoverride{\listid125015832\listoverridecount0\ls74}}
{\*\listoverride{\listid2077347671\listoverridecount0\ls75}}
{\*\listoverride{\listid-120473323\listoverridecount0\ls76}}
{\*\listoverride{\listid-46741469\listoverridecount0\ls77}}
{\*\listoverride{\listid-998828580\listoverridecount0\ls78}}
{\*\listoverride{\listid-2141482063\listoverridecount0\ls79}}
{\*\listoverride{\listid1097472880\listoverridecount0\ls80}}
{\*\listoverride{\listid1327824311\listoverridecount0\ls81}}
{\*\listoverride{\listid-651630279\listoverridecount0\ls82}}
{\*\listoverride{\listid223701431\listoverridecount0\ls83}}
{\*\listoverride{\listid43703267\listoverridecount0\ls84}}
{\*\listoverride{\listid1519786882\listoverridecount0\ls85}}
{\*\listoverride{\listid372536197\listoverridecount0\ls86}}
{\*\listoverride{\listid-642907139\listoverridecount0\ls87}}
{\*\listoverride{\listid15792134\listoverridecount0\ls88}}
{\*\listoverride{\listid1322391079\listoverridecount0\ls89}}
{\*\listoverride{\listid-2011725892\listoverridecount0\ls90}}
{\*\listoverride{\listid-348690342\listoverridecount0\ls91}}
{\*\listoverride{\listid1190607957\listoverridecount0\ls92}}
{\*\listoverride{\listid-540039728\listoverridecount0\ls93}}
{\*\listoverride{\listid-1675546118\listoverridecount0\ls94}}
{\*\listoverride{\listid-392391576\listoverridecount0\ls95}}
{\*\listoverride{\listid191085745\listoverridecount0\ls96}}
{\*\listoverride{\listid-1517309270\listoverridecount0\ls97}}
{\*\listoverride{\listid2133755906\listoverridecount0\ls98}}
{\*\listoverride{\listid-2118700536\listoverridecount0\ls99}}
{\*\listoverride{\listid-2058625827\listoverridecount0\ls100}}
{\*\listoverride{\listid1573507430\listoverridecount0\ls101}}
{\*\listoverride{\listid2051434938\listoverridecount0\ls102}}
{\*\listoverride{\listid-1271440420\listoverridecount0\ls103}}
{\*\listoverride{\listid1386277121\listoverridecount0\ls104}}
{\*\listoverride{\listid50057146\listoverridecount0\ls105}}
{\*\listoverride{\listid-1284027987\listoverridecount0\ls106}}
{\*\listoverride{\listid-1093701172\listoverridecount0\ls107}}
{\*\listoverride{\listid-1686684117\listoverridecount0\ls108}}
{\*\listoverride{\listid1009668318\listoverridecount0\ls109}}
{\*\listoverride{\listid1670927751\listoverridecount0\ls110}}
{\*\listoverride{\listid-380240510\listoverridecount0\ls111}}
{\*\listoverride{\listid718930634\listoverridecount0\ls112}}
{\*\listoverride{\listid16808464\listoverridecount0\ls113}}
{\*\listoverride{\listid1137718941\listoverridecount0\ls114}}
{\*\listoverride{\listid-460347667\listoverridecount0\ls115}}
{\*\listoverride{\listid1278046001\listoverridecount0\ls116}}
{\*\listoverride{\listid1842130704\listoverridecount0\ls117}}
{\*\listoverride{\listid-1341955486\listoverridecount0\ls118}}
{\*\listoverride{\listid1754478786\listoverridecount0\ls119}}
{\*\listoverride{\listid1516348954\listoverridecount0\ls120}}
{\*\listoverride{\listid-1409786204\listoverridecount0\ls121}}
{\*\listoverride{\listid-1114899725\listoverridecount0\ls122}}
{\*\listoverride{\listid-453397258\listoverridecount0\ls123}}
{\*\listoverride{\listid-1804067552\listoverridecount0\ls124}}
{\*\listoverride{\listid-2101289195\listoverridecount0\ls125}}
{\*\listoverride{\listid1339899789\listoverridecount0\ls126}}
{\*\listoverride{\listid-1974699707\listoverridecount0\ls127}}
{\*\listoverride{\listid-115501757\listoverridecount0\ls128}}
{\*\listoverride{\listid-1659413839\listoverridecount0\ls129}}
{\*\listoverride{\listid116690193\listoverridecount0\ls130}}
{\*\listoverride{\listid-1335659601\listoverridecount0\ls131}}
{\*\listoverride{\listid-1587895448\listoverridecount0\ls132}}
{\*\listoverride{\listid-782382009\listoverridecount0\ls133}}
{\*\listoverride{\listid-1111888250\listoverridecount0\ls134}}
{\*\listoverride{\listid-1582995723\listoverridecount0\ls135}}
{\*\listoverride{\listid1352452311\listoverridecount0\ls136}}
{\*\listoverride{\listid-1072231506\listoverridecount0\ls137}}
{\*\listoverride{\listid816987543\listoverridecount0\ls138}}
{\*\listoverride{\listid526139168\listoverridecount0\ls139}}
{\*\listoverride{\listid-1231414341\listoverridecount0\ls140}}
{\*\listoverride{\listid-287577538\listoverridecount0\ls141}}
{\*\listoverride{\listid1336202001\listoverridecount0\ls142}}
{\*\listoverride{\listid-2020641285\listoverridecount0\ls143}}
{\*\listoverride{\listid768704422\listoverridecount0\ls144}}
{\*\listoverride{\listid489119572\listoverridecount0\ls145}}
{\*\listoverride{\listid-1357461657\listoverridecount0\ls146}}
{\*\listoverride{\listid1628866452\listoverridecount0\ls147}}
{\*\listoverride{\listid-1750503926\listoverridecount0\ls148}}
{\*\listoverride{\listid-255081261\listoverridecount0\ls149}}
{\*\listoverride{\listid-2000829650\listoverridecount0\ls150}}
{\*\listoverride{\listid919959231\listoverridecount0\ls151}}
{\*\listoverride{\listid1433358016\listoverridecount0\ls152}}
{\*\listoverride{\listid1076044702\listoverridecount0\ls153}}
{\*\listoverride{\listid-1135845471\listoverridecount0\ls154}}
{\*\listoverride{\listid391471507\listoverridecount0\ls155}}
{\*\listoverride{\listid1136222341\listoverridecount0\ls156}}
{\*\listoverride{\listid810323999\listoverridecount0\ls157}}
{\*\listoverride{\listid1278875422\listoverridecount0\ls158}}
{\*\listoverride{\listid-1037359638\listoverridecount0\ls159}}
{\*\listoverride{\listid200094072\listoverridecount0\ls160}}
}
\paperw11905 \paperh16837 \margt1440 \margb1440 \margl1440 \margr1440 \headery1296 \footery1296 \itap0
\sectd {\header
{\li0 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0 {
{\trowd \itap0 \trleft0
\clbrdrt \clbrdrb \brdrw10 \brdrcf1 \brdrs \clbrdrl \trql \clvertalt \cellx2989
\clbrdrt \clbrdrb \brdrw10 \brdrcf1 \brdrs \trql \clvertalt \cellx5978
\clbrdrt \clbrdrb \brdrw10 \brdrcf1 \brdrs \clbrdrr \trql \clvertalt \cellx8967
\intbl
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
}
}\f3 \li0 \b0 \ql \fs20 \ri0 \cf1 \i0 \intbl \cell \intbl
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qc \i0
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qc \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Introduction to High-level Programming with Scala
\par
}
}
}\f3 \li0 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \ri0 \cf1 \i0 \qc \intbl \cell \intbl
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qr \i0
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qr \i0
}
}\f3 \li0 \b0 \fs20 \ri0 \cf1 \i0 \qr \intbl \cell \row }}
}}{\footer
{\li0 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0 {
{\trowd \itap0 \trleft0
\clbrdrt \brdrw10 \brdrcf1 \brdrs \clbrdrb \clbrdrl \trql \clvertalb \cellx2989
\clbrdrt \brdrw10 \brdrcf1 \brdrs \clbrdrb \trql \clvertalb \cellx5978
\clbrdrt \brdrw10 \brdrcf1 \brdrs \clbrdrb \clbrdrr \trql \clvertalb \cellx8967
\intbl
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
}
}\f3 \li0 \b0 \ql \fs20 \ri0 \cf1 \i0 \intbl \cell \intbl
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qc \i0
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qc \i0
{\b0 \i0 \ul0 \fs20 \f3 \chpgn }
\par
}
}\f3 \li0 \strike0 \ul0 \b0 \fs20 \ri0 \cf1 \i0 \qc \intbl \cell \intbl
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qr \i0
{\li0 \f3 \b0 \ri0 \fs20 \cf1 \qr \i0
}
}\f3 \li0 \b0 \fs20 \ri0 \cf1 \i0 \qr \intbl \cell \row }}
}}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2667188}{\*\bkmkend id2667188}
\par
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b0 \ri0 \fs20 \cf1 \qc \i0
{\li0 \f4 \b1 \ri0 \fs49 \cf1 \qc \i0
{\li0 \f4 \b1 \ri0 \fs49 \cf1 \qc \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs49 \cf1 \i0
Introduction to High-level Programming with Scala
\par
}
}
}
{\li0 \f4 \b0 \ri0 \fs28 \cf1 \qc \i0
{\li0 \f4 \b0 \ri0 \fs28 \cf1 \qc \i0
{\*\bkmkstart Author}{\*\bkmkend Author}
{\f4 \strike0 \ul0 \b0 \sa0 \sb144 \fs28 \cf1 \i0
Tony Morris
\par
}
}
}
{\li0 \f4 \b0 \ri0 \fs20 \cf1 \qc \i0
{\f4 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Copyright
}
{\f5 \b0 \fs20 \cf1 \i0
{\f5 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
\u169\'3f
}
}
{\f4 \strike0 \ul0 \b0 \sa0 \sb100 \fs20 \cf1 \i0
2008 Workingmouse Pty. Ltd. All Rights Reserved
\par
}
}
{\li720 \f3 \b0 \ql \ri720 \fs20 \cf1 \i0
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ri0 \fs20 \cf1 \qc \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb300 \fs20 \cf1 \i0
Abstract
\par
}
}
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
This document is intended as a guide to a 60 \u8212\'3f 75 minute presentation on introducing computer programming concepts to industry programmers using the
}
{\field {\*\fldinst HYPERLINK "url(http://scala-lang.org/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala programming language
}}}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://scala-lang.org/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
http://scala-lang.org/
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
. Although many of these concepts are general enough to apply to all forms of computer programming, this document also introduces some basic Scala syntax and foundational programming theory.
\par
}
}
{\li0 \f3 \b0 \ql \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
Some of the points made in this document assume an audience familiar with the Java programming language.
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc___id2667188}{\*\bkmkend toc___id2667188}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b1 \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa172 \sb718 \fs34 \cf1 \i0
Table of Contents
\par
}
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#Formalities" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Formalities
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#Formalities" }{\fldrslt
{\field {\*\fldinst { PAGEREF "Formalities" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_Formalities}{\*\bkmkend toc_id2667188_Formalities}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#Formalities_Questions" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Questions
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#Formalities_Questions" }{\fldrslt
{\field {\*\fldinst { PAGEREF "Formalities.Questions" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#Formalities_Objectives" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Objectives
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#Formalities_Objectives" }{\fldrslt
{\field {\*\fldinst { PAGEREF "Formalities.Objectives" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#KeepItDRY" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Keep it DRY
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#KeepItDRY" }{\fldrslt
{\field {\*\fldinst { PAGEREF "KeepItDRY" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_KeepItDRY}{\*\bkmkend toc_id2667188_KeepItDRY}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#KeepItDRY_SupposeWeHad" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Suppose we had...
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#KeepItDRY_SupposeWeHad" }{\fldrslt
{\field {\*\fldinst { PAGEREF "KeepItDRY.SupposeWeHad" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2713438" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
So then we had...
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2713438" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2713438" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2747212" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
But then we also had...
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2747212" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2747212" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2740769" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Refactoring Wizardry
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2740769" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2740769" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2751588" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The DRY Continuum
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2751588" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2751588" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A Brief Introduction to Functional Programming
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BriefIntroToFP" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_BriefIntroToFP}{\*\bkmkend toc_id2667188_BriefIntroToFP}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_YoureDoingItWrong" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Remember this crazy guy?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_YoureDoingItWrong" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BriefIntroToFP.YoureDoingItWrong" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_Fundamentalism" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Fundamentalism
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_Fundamentalism" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BriefIntroToFP.Fundamentalism" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_ReferentialTransparency" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Referential Transparency
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_ReferentialTransparency" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BriefIntroToFP.ReferentialTransparency" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2718881" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
For example
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2718881" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2718881" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_DunnoDontCare" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
To care or not to care
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_DunnoDontCare" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BriefIntroToFP.DunnoDontCare" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2718097" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Which First?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2718097" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2718097" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_SoWhat" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
So what?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BriefIntroToFP_SoWhat" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BriefIntroToFP.SoWhat" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#WhereDoesScalaFit" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Where Does Scala Fit?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#WhereDoesScalaFit" }{\fldrslt
{\field {\*\fldinst { PAGEREF "WhereDoesScalaFit" } }{\fldrslt# }}}}
\par
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Basic Syntax of Scala
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_BasicSyntax}{\*\bkmkend toc_id2667188_BasicSyntax}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax_val_var_def_lazy_val" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
val,var,def,lazy val
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax_val_var_def_lazy_val" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax.val.var.def.lazy_val" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax_if_else" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
if/else
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax_if_else" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax.if_else" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax_FirstClassFunctions" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
First-class Functions
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax_FirstClassFunctions" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax.FirstClassFunctions" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2735725" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Function literal
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2735725" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2735725" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax_OtherKeywords" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Other Keywords
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax_OtherKeywords" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax.OtherKeywords" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax_TypeParameterVariance" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Type Parameter Variance
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax_TypeParameterVariance" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax.TypeParameterVariance" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicSyntax_Imports" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Imports
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicSyntax_Imports" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicSyntax.Imports" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicFeatures" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Basic Features of Scala
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicFeatures" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicFeatures" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_BasicFeatures}{\*\bkmkend toc_id2667188_BasicFeatures}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicFeatures_TypeInference_NoTypeAnnota" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Type Inference
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicFeatures_TypeInference_NoTypeAnnota" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicFeatures.TypeInference.NoTypeAnnotations" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2716811" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Static Verification
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2716811" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2716811" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#BasicFeatures_FirstClassFunctions" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
First-class Functions
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#BasicFeatures_FirstClassFunctions" }{\fldrslt
{\field {\*\fldinst { PAGEREF "BasicFeatures.FirstClassFunctions" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Algebraic Data Types
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_AlgebraicDataTypes}{\*\bkmkend toc_id2667188_AlgebraicDataTypes}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_TheExpressionProblem" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The Expression Problem
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_TheExpressionProblem" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes.TheExpressionProblem" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2728284" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
One or None
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2728284" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2728284" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2730940" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Visitor
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2730940" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2730940" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2727944" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
ADTs Instead
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2727944" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2727944" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_DescribingStructure" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Describing structure
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_DescribingStructure" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes.DescribingStructure" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_List" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
List
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_List" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes.List" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_Option" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Option
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_Option" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes.Option" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_Either" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_Either" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes.Either" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2651646" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2651646" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2651646" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_Others" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Others
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#AlgebraicDataTypes_Others" }{\fldrslt
{\field {\*\fldinst { PAGEREF "AlgebraicDataTypes.Others" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#PartialApplication" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Partial Application
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#PartialApplication" }{\fldrslt
{\field {\*\fldinst { PAGEREF "PartialApplication" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_PartialApplication}{\*\bkmkend toc_id2667188_PartialApplication}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#PartialApplication_ReplaceParameterWithM" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Replace Parameter With Method
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#PartialApplication_ReplaceParameterWithM" }{\fldrslt
{\field {\*\fldinst { PAGEREF "PartialApplication.ReplaceParameterWithMethod" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#PartialApplication_JavaGetsNoCurry" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Java Gets No Curry
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#PartialApplication_JavaGetsNoCurry" }{\fldrslt
{\field {\*\fldinst { PAGEREF "PartialApplication.JavaGetsNoCurry" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#PartialApplication_ConstructorsAsAnExamp" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Constructors as the Example
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#PartialApplication_ConstructorsAsAnExamp" }{\fldrslt
{\field {\*\fldinst { PAGEREF "PartialApplication.ConstructorsAsAnExample" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#PartialApplication_PartiallyApplyingScal" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Partially Applying Scala
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#PartialApplication_PartiallyApplyingScal" }{\fldrslt
{\field {\*\fldinst { PAGEREF "PartialApplication.PartiallyApplyingScala" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#ImplicitArguments" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Implicit Arguments
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#ImplicitArguments" }{\fldrslt
{\field {\*\fldinst { PAGEREF "ImplicitArguments" } }{\fldrslt# }}}}
\par
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#RealWorldSnippets" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Real World Snippets
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#RealWorldSnippets" }{\fldrslt
{\field {\*\fldinst { PAGEREF "RealWorldSnippets" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_RealWorldSnippets}{\*\bkmkend toc_id2667188_RealWorldSnippets}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#RealWorldSnippets_Instinct" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Instinct BDD Framework
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#RealWorldSnippets_Instinct" }{\fldrslt
{\field {\*\fldinst { PAGEREF "RealWorldSnippets.Instinct" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#Formalities_ReductioWebsite" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Reductio Website
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#Formalities_ReductioWebsite" }{\fldrslt
{\field {\*\fldinst { PAGEREF "Formalities.ReductioWebsite" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#WorkingmouseTraining" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Want to Learn More?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#WorkingmouseTraining" }{\fldrslt
{\field {\*\fldinst { PAGEREF "WorkingmouseTraining" } }{\fldrslt# }}}}
\par
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
If we have time but we probably won\rquote t
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart toc_id2667188_IfWeHaveTime}{\*\bkmkend toc_id2667188_IfWeHaveTime}
\par
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_Questions" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Are we still here?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_Questions" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime.Questions" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_WeWont" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
I feel very little right now
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_WeWont" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime.WeWont" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_HigherKinds" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Higher Kinds
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_HigherKinds" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime.HigherKinds" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_LazyAnnotations" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Lazy Annotations
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_LazyAnnotations" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime.LazyAnnotations" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_HighLevelAbstractions" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
High Level Abstractions
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_HighLevelAbstractions" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime.HighLevelAbstractions" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_CodeSnippets" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Some High-level Code Snippets (for fun)
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#IfWeHaveTime_CodeSnippets" }{\fldrslt
{\field {\*\fldinst { PAGEREF "IfWeHaveTime.CodeSnippets" } }{\fldrslt# }}}}
\par
}
}
{\li1440 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#id2748039" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Functors and Monads
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#id2748039" }{\fldrslt
{\field {\*\fldinst { PAGEREF "id2748039" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#Thanks" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Questions
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#Thanks" }{\fldrslt
{\field {\*\fldinst { PAGEREF "Thanks" } }{\fldrslt# }}}}
\par
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#LargeApplications" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A. Yeah but how can we write medium/large applications?
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#LargeApplications" }{\fldrslt
{\field {\*\fldinst { PAGEREF "LargeApplications" } }{\fldrslt# }}}}
\par
}
}
{\li960 \f3 \b0 \ql \ri480 \fs20 \cf1 \i0
{\f3 \b0 \fs20 \cf1 \i0
{\field {\*\fldinst HYPERLINK "#ScalaExercisesForBeginners" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
B. Scala Exercises For Beginners
}}}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
\tqr \tldot \tx8968 {\pard \f3 \cf1 \expnd-2 \tab }
{\f3 \strike0 \ul0 \b0 \sa200 \sb0 \fs20 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "#ScalaExercisesForBeginners" }{\fldrslt
{\field {\*\fldinst { PAGEREF "ScalaExercisesForBeginners" } }{\fldrslt# }}}}
\par
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf3 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf3 \i0
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart Formalities}{\*\bkmkend Formalities}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Formalities
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart Formalities_Questions}{\*\bkmkend Formalities_Questions}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Questions
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls1 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls1 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Questions. Please stop me and ask them.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls2 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls2 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
However, some questions give rise to more questions! These must be deferred due to time constraints.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls3 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls3 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
\rdblquote What do you think about the paint job on Russell\rquote s Teapot?
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
1
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
1
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
\ldblquote If I were to suggest that between the Earth and Mars there is a china teapot revolving about the sun in an elliptical orbit, nobody would be able to disprove my assertion provided I were careful to add that the teapot is too small to be revealed even by our most powerful telescopes. But if I were to go on to say that, since my assertion cannot be disproved, it is an intolerable presumption on the part of human reason to doubt it, I should rightly be thought to be talking nonsense. If, however, the existence of such a teapot were affirmed in ancient books, taught as the sacred truth every Sunday, and instilled into the minds of children at school, hesitation to believe in its existence would become a mark of eccentricity and entitle the doubter to the attentions of the psychiatrist in an enlightened age or of the Inquisitor in an earlier time.\rdblquote \u8212\'3f Bertrand Russell (1872 \u8212\'3f 1970)
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls4 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls4 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
However,
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
please see me after this session, or email me with your question
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart Formalities_Objectives}{\*\bkmkend Formalities_Objectives}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Objectives
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls5 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls5 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
What will you take from this?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls6 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls6 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Depth versus excitement. Not even Gary Kasparov could teach you to play chess in such a short time-frame.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls7 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls7 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
But he could certainly plant some seeds!
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls8 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls8 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Beware of under-qualified internet commentators and snake oil vendors offering misleading advice.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls9 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls9 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
I am more optimistic than Dijkstra.
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
2
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
2
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls10 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls10 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
It is
}
{\f3 \b1 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b1 \sa0 \sb0 \fs20 \cf1 \i0
not
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
an objective to convince you of the importance of the concepts at hand or to present irrefutable and compelling cases \u8212\'3f mostly due to time constraints.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls11 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls11 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Keep thinking. Keep asking questions.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart KeepItDRY}{\*\bkmkend KeepItDRY}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Keep it DRY
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart KeepItDRY_SupposeWeHad}{\*\bkmkend KeepItDRY_SupposeWeHad}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Suppose we had...
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2723927}{\*\bkmkend id2723927}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Iterable convertValueOf(Iterable x) \{ \line Collection y = new LinkedList();\line for(Integer i : x)\line y.add(String.valueOf(i));\line return y;\line \} \line \line ...\line \line Iterable convertForDatabase(Iterable x) \{ \line Collection y = new LinkedList();\line for(Integer i : x)\line y.add(new StringBuilder(i + 7).reverse().toString());\line return y;\line \} \line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls12 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls12 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Duplication! Let\rquote s refactor.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2713438}{\*\bkmkend id2713438}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
So then we had...
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2724873}{\*\bkmkend id2724873}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line interface Stringer \{ \line String stringify(Integer i);\line \} \line \line Iterable stringifyConvert(Iterable x, Stringer s) \{ \line Collection y = new LinkedList();\line for(Integer i : x)\line y.add(s.stringify(i));\line return y;\line \} \line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls13 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls13 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Then we passed in the two differing implementations of
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Stringer
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
for the two use cases.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls14 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls14 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
But...
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2747212}{\*\bkmkend id2747212}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
But then we also had...
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2751966}{\*\bkmkend id2751966}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Iterable convertParse(Iterable x) \{ \line Collection y = new LinkedList();\line for(String s : x)\line y.add(Integer.parseInt(s));\line return y;\line \} \line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls15 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls15 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Uh oh, more duplication \u8212\'3f more refactoring!
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls16 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls16 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
So let\rquote s parameterise over the method types
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2740769}{\*\bkmkend id2740769}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Refactoring Wizardry
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2750115}{\*\bkmkend id2750115}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line interface Mapper \{ \line B map(A a);\line \} \line \line Iterable mapperConvert(Iterable x, Mapper m) \{ \line Collection y = new LinkedList();\line for(A a : x)\line y.add(m.map(a));\line return y;\line \} \line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls17 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls17 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Problem resolved?
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
LinkedList
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls18 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls18 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
What if we want to map something that is not only not
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Iterable
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, but it makes no sense for it to be
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Iterable
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
? i.e. we couldn\rquote t even implement the interface if we wanted to.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls19 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls19 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Should we concede and use dynamic typing \u8212\'3f any object that supports the
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
map
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
method? Or perhaps concede Java\rquote s static type system and use reflection?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls20 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls20 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Perhaps we want to do a bit more, such as remove elements of a certain criteria as we map?
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2751588}{\*\bkmkend id2751588}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
The DRY Continuum
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2715434}{\*\bkmkend id2715434}
{\*\shppict {\pict \pngblip \picw759 \pich294 \picwgoal15178 \pichgoal5879 89504e470d0a1a0a0000000d49484452000002f7000001260806000000e6f5bfac000000017352474200aece1ce900000006624b474400ff00ff00ffa0bda793000000097048597300000b1300000b1301009a9c180000000774494d4507d8071904063633616a24000020004944415478daeddd79b85c5599a8f1f724810408601208a04102320a62abad284383685f15b02f175a70004cc009bda0b6228f4023a03468f755e80605014da370d1b68d7663404807902190009708060844860c2410022109e4643afdc7da75cfaaa2c69373aad6def5fe9ea79e54ed5a95b3eadbbb6a7f7bd51a40922449922449922449922449d220eb31049224491a24f7017b017d09d7b10f5800bcdddd25499224d537274ba053bf3de2ae922449921a7b302709fe5c7795244992d4d8fd3949f01f7557499224498dcdca4982ffb8bb4a9224496a2ec1df9883047f9ebb4a9224496a6c26b03e0709fe9fdd559224495263f700eb7290e03fe5ae922449921abb13e8cd4182ffacbb4a9224496aec0f3949f017b8ab244992a4c66e075ecb4182bfc85d2549922435360378350709fe73ee2a499224a9b1a9c0ea1c24f84bdd5592244952639703ab7290e02f7357499224498d1d01bc928304ff457795244992d4d84ec0cb3948f097bbab244992a4e6bc948304ffe5ec624492244952032fe620c15f41e84e24499224a981177290e0af04ce7157499224498d2dcd4182bf9a30a5a7244992a40696e420c17f95b02897244992a40616e720c17f0df883bb4a9224496a6c610e12fc7526f8922449527316e420c1ef05ee7257499224498d3d433e5af0ef7157499224498d3d9583047f3d70afbb4a9224496a6c7e0e12fc8dc07dee2a499224a9b1277290e0f701b3dd5592244952638fe724c17fc05d254992243536372709fe43ee2a499224a9b13fe524c19fe3ae922449921a7b242709fe1fdd5592244952630f1166a9493dc17fc45d2549922435f6684e12fcb983fdc67bea3cf79ac785948451864092d4066b0af23e4a89f39639a9efe3c0deed48eefb3cc6254992a421f704b0a7c9bd244992540cf381dd4dee254992a462781ad8d5e45e9224492a8645c08481be7898f19324499292f126e0d981bed8967b499224293d0b819d4dee254992a462584c68c937b9972449920a6029b0a3c9bd244992540ccf033b98dc4b922449c5b00cd8dee45e9224492a86e5c0b87a059c0a53922449ca87b1c02ae01c937b49922429ff36030e37b997244992f26d257075bde47e84319224499292b702d80778ae5e21937b499224296d2f03639a2968b71c499224295dcb9b4dec4dee254992a4742da3c1d49726f792244952fa9ea78945ab4cee254992a4b42d057618c80b5da1569224494ac70bc0f881bed8967b499224290dcf6d4a626f722f499224a56121f0c64dfd4f4cee254992a4ce7a06d87930fea37a8b58ad33ce521236330492a436284aeed7076c0446e5a4be4f01bb79f849922449d53d9a25f87d89dfe6bbab244992a4da66016b7390d8cf735749922449b53d9883a4be0f78cc5d25499224d5f6ff4cec254992a4fc7b282789fd5c779524499254dbc33949ec1f765749922449b5fd292789fd1c779524499254dba33949ec1f725749922449b53d9693c4fe017795da69b00e5c15cb68f7af242961f37292d8cf4e3d903dc0828a4a1f55516617600af01cb01e781ab810d8b28beb9672129db7e4de8b11937b49ea469efffacdcf49623f2b0fc13ca8a2d2ff59f1fc3ec0b23a572e5b7769dd4ceefd7233b9972479fedb747fce4152bf01b82f2f013d3faaf846e0ad15cfdfd7e0cd5ed5a57533b9f7cbcde45ed2607f078ef6336d72df65e7bf677290d8af03eeed74a07a5a287b0bf0d7d9fd19c007a2e73e004c6ff0fa52d2fdf810bc8f94ebc6207ea07a06b95e936a6c1f095c113d9edce0f99e367eb9a518c72226f72b8d9794648257b235b0cacf7457eefb6e3cff3d0bec9c781dd711bae21cdce98a8c68a1ec1ed1fd5f573cf7892ae5af27cce9792eb015300c3811386708de47ca75ab961cd7b215f029e07d6ddaff53ea9c08aea853aef2f94ef802d0db64d99109d4b713260df075233d8f4a525226b750766fe074608b82bcf705c084c4ebb896d04be4aff216dcd5f4ffecf0ae8ae72a7f2a59000ccf9efb7ab4fd8e2eac5bb31fc44b8197a9fe33cf4ae0b236d667bf8abf3fa24a72dfe96e39fe24dd5abcecc624f999f6335d6c63b25c625d8dfd3e3787ef6911e977c55903dc9ed7836663f446b68bb6ef58e58d5e193dbf4fb47d6917d6ad96e1c031842e43b50e98a7b30b9037b4b15e5fa8b858ea03c65794d9ba43278a783fbfa1c52fbc784c8689808980e4675a453102380d78b1c6fe7e19f82aadf5d648c1733948ec5f036ecbf3c1f35a8dc4ea882a6ff6e4e8f96da3edbd5d58b75a09f4823a07cb5dc0dfd2ff0b433bec00fcae467d3e5e51f61d1557acedb22afabbbbb5f0ba3da3d7ad3611301190fc4cab203e426891afb69f37023fe1f50d7479b0340789fd6a1a8fe94cdee2e80ded136dbfa0ca1b7e5bf4fc766d48a053ae5b357755a9d75ae0e7bcbe5b513bfc4fe0f93a07f0738401cb2381b754d47f511beb194f81f5c9165e7772f4ba3f9b089808487ea69573fb0037d5d9c7f701efc9e97b7b3e0789fd2ae0f25403d8ca4f3473819db2fb1f041e250c443da6a2dc2acafb75ed12dd7f6588de47ca756bd665d9c5c8cb6dfc9ba3814b80531a94db91302351358fb6b1be8f03bb66f74f076ea071379b11c0973b54df4eebd984e362a5e74e29694e2ad09dc612a6fffe428d1c6e29f04dc2441879bc905b068c4bbc8eab80af00d714e180fafbe88ae525e06bc0cfaa5ccdfcb6e275a747cfdddf8575abe63775ae047f08ecd5a67ad45ae56d6df6e5704f1357afa7b6316e6756fced1f34486087671fbef8357fe7b9a1a9e4de563e293d4e2ad0bd4a0d55cba93dbffaf7816d72fc1e97937e8bfd4a1a3788e6caaed41e811ddf2abb4bc45d387ede8575aba607f81fd9c5c67aaaf793bb09f8501b4f14f168fa7766cfef41ed957dfb08d389b673dac43765171e711d6612a60fdd05d83cbbed46e88af350958b96377b8e3011904cee95338f517fb696ef12a63f6e744bd5cb3948ec5f2eeac1f583066ffca92cb92a39a0e2f9d3bab46ef5bc19f8076a0f1e994bf8f96dcb3624f797f1fa7971f726acb65659f6ee2cd96eb78b37e1837939321190a47c5fd81569bcc54ec08a1c24f6cb8b7c708d026eadf1c67b8143a3b2c3aa24857b7769dd9ab139a105faee1aefe1c521fcb2580c7cb841d9bd816309bf7efc6587e3347d001fccd943748164722f4932b96fdd29846e2ea927f62f74c30136823090e08f846e0e2b085d480ea828b719610ac5d2edd82eae5baa1fca3ec28abee372760c8e224cefd56cdc7e477bd70a90a4a1b435e1d7e65b8025d9f96e35f044f6dd78a02132b94f3cb9bf9cf2e9ad53bd3defa1a7bc7d284fce795cdf0ffc9edae3166612d60b90a4a23884e656edbc0ed8ca7099472498dc4fe7f58b65a6785be261a7bc7f280f254c2db9803038790d308fb0a2effe89c7770c7018e157984f001f209f8b760ca5c3083348fd197835bbcd07ae050e363c522eecd56252348d814f892b0d8519d9f927f5c47eb1bbaa5ccafd753b55b79493fb1ec240da7a7f7703610e7ee5cfa82c816f746c5d43f9807349e9b97e00e78d4f1a3625e276e0b51c24f60bf31ee8110378cd768455cfc611e611af543935e2a48ac75386f0fda45ab7c9091f03df04bed4a0cc30c25a022b817fccd1f1bd137042ceea3cd8ae044e6ca2dcc9d945dce73cff48c9fa60c5e3bb819b09dd073603f6038ea77c1cd529d94581d4497766f959ea8d480be8c229b32fe6f5f38ca7d2b524e5baa59cfcf6b6109f7594afea9ba25184ee3937d1df17bf5b1d3480cfc07b9094aaf81cf7831a65c6020f52beb0a38a256fdd68ef1a84fcac1db767baf1603a8174bb96a45cb79455aef8fa0061b6a178dbd98469a04a8f2f4af4bd1c0c5c45f58530ba55e58c420f11962dff2ca185fedbc0c31565aef2bc29256b61f459ddb54eb9c3299f0a5ac590c76eb4f7d0dc22a39dbe3dd5ad07d58c8413e894eb96b29b299f07bef47359e52a8827468fef6b53dd4ea5f132da1381738127ddaf55cd8b627035d507d60dabb80878ccf3a794ac78fc4cbd298cc745e5e61bb6c238ab857ce68c04ea3b93eab3d9a576ebeacfc88b0927d029d7ad6437e0df082dcbbdc02ce088845a818e8bb65726f713a2c7cbda54b73ec21cb8d750be4ec1d684fee17710a6bbecea55e51a88e7107e4b8363b354ee15cf9f52b2de197def1d59a75cfc9dedcadcc590b76eb4b37290d4f711d686289c5606d4c68b005d007c97309d51a5d184819725ed98862be5ba95be6867523e3de3bb81ff043e4aff7465b3097dc621749ff8b721aed7988a0f622d712cb76de3f1b95596c89f0ccc21b42a7f94c62bcdbe9ac5f67ac2af13dd2a1eb8b4a24eb9f83331d273a894acfd813f1106ce7e0bd8be46b9b7575ce44faa52668ae1cc95932abed31f244c6f1c8fbd3887d0b576bb2cbffb0261d28c769b09bc2dba1849d533c0dedd7e609506436c6c90007462bac994eb06a1f5b9de5563e922636ab4fdb236d42bfeb92c4eda2b5bee3f44fb5bc25bbdfa5e975d249d90d559f05c149f131a9c344ae5161936295983d962a97c49b91bad726c5194406f9558029d72dd2a93ac6ab7d252e193a26d33da50af78f0e99b6b9c40be4979f79d7b133b89dd0d7c316ba950b969519c56017f07ec9cb5e88c04f6240caa8e17c5b9d1b04926f74a4ecadd689563bf8f0e98a3124ba053ae1bf4b7906f00be039c465829b4548f6f64e5f68cb63ddd867acd89fede914d9e40bed5a698ed41989967318d179bb894305b8e2b3196fbec004ef89f316c92c9bd921337c24cac93dc8fa5fc176d4943e4a5ec833635da7620e5ab8342183b10b7b40eb5aba3bff7a3264e204b697f0bf9f0ec826d2a8de7c92d25fa0799e803a1757e5e0b27fbc770955ac9e45e294ab91badd4956ecf3e68ff126deb21cc4cd247587009e08d94cf553bd48e8dfede4afaa756ab76225802bcb7c3711c0f7c1d984b73cb475f9225fadd6c5f1afffa518ad7de7e542529492977a355cea5389d631e7c2efba055cedc525a457076f638bee27ead0df51a49e8973d3dbb1d1d7d596cc8aefa671246e08f4b2ca6ef232cb8f40ab65035b213e1d7a1355562b3268be30e864992929572375ae5d80442b78c6aaba19512fc1ee07ee091ecf6b136d52df59f2537031ecd62f5ce68fb6fb37a3c0cbc89b04473a96ecf7ac835652bc240e43b4dee1bda0238843018eb6384710aa30c8b24252f0fdd689543a94ee79887e47e2075bbc543ae657b0217f3fa6e28925434870237000b080327d710c6d85c49980f5fc592b76eb4ca8954a7732c6a727f4642fbbe53b30c0dd470c262575371b60008abfa9e965d302e210c4c5e9d5d94ff24faec4a4a5f0fa1e1acdef9630361414715479ebbd1aa035f12cd5a9f254d1b0953142e05be0aec9a3d7f26f03d42ebe9e3d9b667289fb2692893e7a17effedacdf32602f867ea4fba416be54ae881e9f985deccda4fa4ac029d9213b56bbd52184d6bd373628773d616cc86abf16a5a49d055cd864d96f00ff68c824d592ea748ea524b5d1edfb51bd2e6f21b11dace4bed9db93c05f2658af6ab7e5d45ff9549db517e5732337ba4dc32944a594ed4498cca29595bb77316c5d691b42571ea9aedb49733ac766ed1ed56b01e5f3c4a670f1f109c20c30c313bde8a8f7f3af7dfbd274fd00f6e7270d9b94ac332b3eaf0f005fa9d87636f042f4f822c3d635f62574e9bd8dfe7561a4ba529dceb159a32abe002f74970eda622837245edf6ef57c451cee22f4c7fc0c702ae117ac651565fecb8f8594ac9ba3cfea6cfa179dab5cc8e8c4e8f17d86adb0b6248c2ffb1161557bcf7f6a5911a6738c0ff8c7dda58396dc3f9b787dbb55bca2ef0f6a94191b5da0f711badf494a53bc40d17135be1b4713a6ae2e3d5e66d80a650fe0cbc0efa9be7689e73f0d7962754bc2ef61bdbbb46995b3e58ca4fce7e15e93fbe413815deb943bbc03fb5252ebe2313413eb24f76329ef77affcbb9430c3592be7be8d86ad3b8d18e2ffffd6c4deeff96d4a40074baa831b7b0953285e9c3d1eee47294933083fcf43181b53cb9c8a0b0249691a19ddaff72bdbbba3fb2b0d5b219cdee4b9f97e420f8abbb39b4cee07d532fa67d049c579eef221b1a24d7f677293e5fe8930cfef4ce0c75dbc5f2e21cc66d44318f4fcbb1ae5b688eedfece12c256b15fd93416c5be3bbf734e04bd1e37986adb09603f764c9fc5d5962efafaf1ab2e47e3ef071867e9e76b5ef8452f92bc2bed1fd456daac79426cb4d04be05bc0bb8a38bf7dbfec09f80fdb2786c5fa3dcdb2bf6f5a44d88bda4a1f30cfdabcfbe8deae39dfea1e2f14d86ad9016121633bb31fb9e97febf56ba7d4c6aa24c2f61c4f62cda3b0de6a62c62359af29f2d7b3a54974ddd3feaf741fabb845d42586cad1b792c4ac57235704a76ff0ac2ac57f53eebcf131a621c545beceff36708eb944c2374c77cd57099dc7773123314c97db58ba0dd09730f037c87f0cb4635a7000713fa405f82ada503752cf0abecfe3cc2624e9e0cfcae908af4ddb68af02be58b353eeb4b81a3817b0d5b211c0a7c9830ddf85fd4f94e5e435897e877d9ed2943a73c2731039d456534433fb3ca65d1ffbf7d9d7247d2bf30d4fe09c72dc51969861366883884302d6ba95e6bfc5c1462ff4a0a036aa701d3b3dbd1d1677d03a12bec4cc27a16e30c5761ed009c045c47f982657e77cb24a68dc9fdfce8ff1f53a7dcf651b96b128e5ba7be400652af157e2e4cee25a9a086116647fa36615634bfbbd5d280da4de9fa32d4266fc26bd76ce2eb9b3121baff36e00f35ca6d15ddff8087e7a098d5c5efddae3492545c6f2174d5f908f07ec28ab5524b6cf11bb8f86afa1e60eb1ae5be4f7b17132a7acbfd06e0300f3f4905b21bf06fc0cbd9796216708461e90a5b6489fc3f13c693353a072e3664dda99596bd945bee53772761a06cc912e097c0e3c05a60c7ec037b6054e64560bb21aed7a441fcbfa6b429b96fd622c2a21fbff6f093541013800780f115db37021f25f4c7ef016603a3b2e7cecf2e06946f371306d58eaa53a637cb377e9fdd1e366c26f726f743e724e05f5b7ccd6f80ff65e85aba18e9234c01f614f010b0de90b11bf05de0af09ad3e73088bb94d333452ee5c039c5ce3b927813db3efc1a9f40fb6bd1cf8df862ef76ae5608f02b764c9fc1d380da618fc79eef7a77f4ef11f66ad07533a78d0a772e1d103fc96d0b2d28cf58415451ff010d526b0954f2a96e708bff4d67210a1ebe724e0a7d9b6db80c30d5de192fb458405cb7e41f8a55f1a32bbd3dfd76b01fdcb64b7e3a04f7d3cc016c04f9aa8d38bc0511dd87787023764fb6d1d61a0f13ce04ada332da706df35758eb327a28bdba9d1f6cb0c9b94acf5f48f27fa0e701af0e7e8f3fb8dacdc9ed1b6a70d5b6192fb6ab78dc063597e710ab00ff698d0201b5571d05d6872ff3aef007e9c7d185f23f4915b425855ee0cda3f37710fe5f3f0d71a987a4122c79883c99af75c83fd5a1ae33129da36c3b049c97a89fe6e372507f2fa2994df106d5b65d80a7561d7cced45e046e09b864d4391683f6e729fbcb35a88d7191daeeb04c2aa8bd52e3e8e882e56ee071ec96e1ff364602b9f5410b7679fd37f89b6f5d03f23db4dd9b637567c3f2affde001c0f5c0b3c6f9ea34e26f7ed1ad038a9c9db32faa7a39ce4ae622742eb77b35f12eb805d3a585fbb99b4c6563ea9583e977d4e6faed8fe60b67d76f6f843d167fa35c35638c380030863a4ee2774cd31b9d7903aafe2965add4a73c8efeaaee2cc8a2f810780af546c3b9bf2e5ad2fea607ded66d29adbb1954f2a92cd08b3a36c00de196dff6df6f97d1878137057f4997ed6b015de8e84c5387f455895dde45e5de583d101ff8321fa1b795a18eae6e86fcd0636aff21e460327468fefebe0feb39b496b6ce5938a6520e7915b0c5bd75d00be1ff84760aee1d060199df055e3b10cfd78803c25f70ba3bf755c8df7309ad0d7bdf4785907f79fdd4c5aff92b7954feaeee4fe0cc3267597110378cd76c07b08b3ba0caff2fcc88ac7932a1e4f69f37b1c4e9892735fcabb09ede2ee674c747f569d72f1a218db76b0be730853762e8cb6cd0456025b13ba97006c193dbf4517efdfb5d1fd6a6b26ec57114b08b338492a8665f4377a485255176709436aadd103a9c78a84ead2a996fb786aad6d6bbc87d19477db58dec1e3cf6e26437f2cdaca2715e333fd24f097864cea3eadb4dc9f4018805914b386e8ff9d5c65dbee8481a910fa8acfaff1da538083092dd497b42106aba2a47edb1a173ca7015f8a1ecfebe03efb296105e4bf2674337930dbbe80b07ec028423793bf8f5ef3821ff3a6d9ca27a56d7213657a09638d66e10079490dcc20ddd6e856ebb00138ac8db18b1789dabe4eb923a3fab56355d83951bd8e6c329edfeae031e860b2a18b97ad7c922415402b2df76f2fc87b5e049c4e9826b05d3e12ddaf37f77fe9d78461c097092df943697674117114f0bb06e59f072ecfd9febeb58b3fdfb6f24992d4657a5a28bb214b3a012e00be4bf940cb92d184018e03f91b0335a9c1f37d595d9f021ea27d8b6bc50954699ac943813fd4283731ab23c033d9e3a1742c615e5c085d74261296adaef60bcb52e068e0de0e1eafadfef2b30cd88bce8e139024494a526920ed465e3f234e6572ef020ae55e89e2710f6166976abe1f95eb6d43bd4602d380e9d9ede82889de9025c533817308b323759add4c86d64e38a0564a599e266c90d421adb4aa2fa27f25cbad81d57592fb76b7dca7ee4ec240d99225c02f0973edaf25ac2ef711fa575885d082be9da12b33a98932763369cda8eca2eed38481cac3fdcc4a4927f79d38ff4b2aa8df4757fc47d529d7c996fb3184d9546e0516036bb2db02e0d75912d3892fb49368bd5565aa879c86d0c1c055c0cbd8a227e529b9b7e55e52e11c41987de632cabb101c46e817dee80b6d0630becd75ee01fea3852fdd75c0bbda5cc70380eb087dfdd7115ac09f04ae262c76a4b49d0a6cd3a0cc44e0dc6cbf7ad2974cee951f3d8486ca781f5636b4ee425828f439c2d8c2a7810b295fd8515d72b0e4cd0dc0f1d9fd2984194126020f137e3568c66ce0a02c896d972d0833cd349ac16439a18bc48d6dacdbf780afd7391ed603e713e6e857ba27fdd5c02f801f03f765dbb7063e961d538734f1997f09186b38a5244d1ac4ff6b8ae1cc958380bba2c737021f8d1eef43e8025c6d7cdcfdc0e19477999692f26074d57a42b6ed870368b5f87c87eaff8e2cf97a8cb07a6a2fa10ffe0cc22f11ed1eb87a4e0b31fb5a0209ac2d54cdc5e6a1ec42787513f1599d95fd1bfa67759224a5e3fce83b7b23f0d68ae7ef6bf03d7f952154cae2ae37a5ee22f32b0ee23b092bc27e86d05de132c2b4887199bb0c253b671717cd26c9ab0933aa98dca79fdc37d3f56b5a76813cda8f822425ed96e8fbfbbf2a9efb00cd2ddeb9976154aad64407eb982adb2eadf1bab194b7fabf622839b7e2c3ff027009e1578d53812b80151565ce34b9cf75727f37f0459c894992f2e4a9e87bfc4b15cf5d5de5bbfe3ae01b84356c4adbec5aab646d880ed452dfe0781ef9ddeabcf6f0a8dcda0ed5ff504217880584d6d335c03ce04afa578b6d97dba278ccad91f04da07c00e67493fb24ed015c449825aa5e2c166617c007e354789294177117cbca09379ea9f89e5f4098d618c278bad2f63b0ca352b5323a50df916dbb33da56afcffab8a8dca236d7bb87d03da8d1cf6617b4b14e4ba2bf7d749d72c744e5967470df4f6af2565a657726833b002d0f86136650984affc2738d12fd834cf42529691ba3efeeb8216ec72adfed5746cfef136d5f6a1895aa27a203f5926cdb29d1b623eabc766254ee3fda5cefb368bea5b95dab84c6fdedeb4d0f3a9eceffe2d18a73a3baeed1c59f95f184569bb94d1c730bb3cfd3417ec54852725e8bbeafdf106d3fa2caf7f9c9d1f3db46db7b0da352f5ef1507f1ff054ea3bf6ff82c6ab7e85e1abdee9a36d679275a1bb8ba8e305f6d3b93fb714d26f7ab73708cc4838b7ee4470680f711664b7805bb314952dec45d2ef789b65f50e53bfc6dd1f3db99dc2b0f3e45fe16f138b3e2ef3e007ca562dbd98401ada5c717b5a15ecf467fef903ae53e1c957b2207c7c8e4a8be4ff99129b35576a17ba7c9bd24e5c6f4e83bfab46cdb30e0918aefef95f4f7b787d03f3f9e34435d60440eebfc0bc208f0fd7354e7f747f7ef27747d580bfc20da7e69966c5f9b3d3ebc0df57a90301d26c067b384af9ad3a3fbb33b18c7494d9499905d3895bcc98f7999d584c56ba6007b127ebe3d89ce4e712a49aaef0ec2afd2105aeb3707fe02d8b7a2dc0cc2f8bd92b8abe533865129db9df2195c526fb95f18fdcde3a2ed715d46678969e9f1b23625cbf1a218d506d54eaea8e7f11ddcef03d9c7cbfcb834349cb0d2e154dabb6ab324a939bb66dfcf8dce799fac78dd5dd1733f378cdd61444eebfd24a1e5feb384995cf6250c30199e687dc744f767d529f76a747fdb36d4eb1784befd3d758e875ec2ca78641700537376acdceac7bca10dc07f66b71d0c872425e729c28c7b5fa953e669e057d1e303286fb9bfcf304a83677d74e51c27ed952df71f8a1e2f376cafd36aabfd4b74f76c3992a4e2184568b0aa76beeb25aca353320cb8b7a2ccde86501a3c2f471fae37d74856bf4979f79d7b13aaff68d21870d96a72ff5e0f3d4952818c20b4deff9130766f057013a1953eb619f0f1e876aca1eb1e2e5cd31e73e81f007c14f0bb2859ade53cfabbc30cb5ed80f710a6c3acd6b569247045f47872c5f353128bf7ddc081c0f584d995244992a4417335d5e75dafd5e2bc94f215e886d2c5345ec9346ff3a27f32aadbfb3cfc244992f2655392d27674393996f23968c7d5a9f712dad79de404f2b55e40b3e245ac7ee9c7439254200700d711a6b65c47e86fff24a121713fc32393fbf624f7238169844528a6d33fe5641f61a692e5c04ce01ceaaf143bd8661434b9ff679c0a5392543cdf23cc5c576f85fb730c53772b4a9ffbbe4d78ffa309ade9458b49335e04c6e6e838babd89321380b7448fd76617579224e5d939c0b79b2cfb75e0ff1832e53db94fb9e53e551ba2f77d3eb0658d72799d2da70f78d48f872429e7762674bf69f6dcb71a571eef5a230af23e266fc26bd76ce2ebf39edc0fcbbe08fe21fbe2289a297ecc254905c873368f1e2f23f4bb7f343b8fbf1df804b04df6fc96c049c0770d9d343452edcbbe28fb3b1b81adea94cb6bcbfd55a4bb6ab12449cdba2d3ab7cda5fa8c7a1308036b4be5a61bb6ee34c21074b547803712faccbf1fb831f1fafe6b13c9ff6b8425b8a765ef4f92a4bcdb27ba7f16d5278b58087c03f8f7ecb133e7a82b74aa05ba28b3d04892a4f68bfbdb8faf536e7c546ead61eb4e4569b99fd464b9ca59c644c77d00000c5a49444154534e009e234c43f9aa878324494adc8626cbad335426f779f6d301beee67d9bf2f01a7033f1fa2fa353360777fe0abd9fd1f02b33d3c25491261e5fa9db3fb6f05eeac51ee9dd1fdc5864d7936180b316da07d2bc356b37b549705c0b609c70dba7b0a514992dae937d1f9f6da3ae5a645e5ae376ceaf6e4be0fb8a183ef6154455d2e34b9f76244922442f7e3d2f96b23fd2bddc726579ce78e376cddc9d972ca1dd8c1bfbda6e2f1df0267bb4b2449ea7abf0076a17f45f86af95b2f61414ab20b80a9864ddda0b2f576247066f4b8d38b38c5755bdfe6bf67cbbd244952ce757bcb7d2ff013e0e2ec71a7173c3abfcd7fcf957d2549920aa4a7cbdeef686065c5fbdf1e783e7bbc1c18e76191ac49037cdd94ec42f6848a6d9224e5c1407f71eea991fb48857618fd5d35fe683824495282c9bddd52a53a7602ce300cafbbc8f919f067c2825eaf02f309536e1d6c78244932b99752320af838701361b0aa07787f5cae6de20be21a60f384ea7d00701df00c6115be5ee049e06a603f77ab24c9e4dee4be1b75c380da83814f031fa33d0b43e5cd95c0894d943b99b0d0d7e712a8f3f780aff3fa7e836fc96e9f260c4efe8ebb579254004e80a1423b15d8a6419989c0b98496dc4657b4ddeca001b402bca7c3753ea785ba7ecd5d2c499294b63e6015a19bc801d1f6ad09adcb7710166f6894f82d3794fca422260f115abc3f4b68a1ff36f0704599ab3a58df9d09dd6f9a4dee5713c65748922429e1e4be3221bd214be49a49f66e00fe86b4fa8f77cabc283657537d7aac611517018f75b0bee756eccf17804b80cf137ed1b902585151e64c77b324a9400ecd7299058431676bb2f3f995c0fe86474548ee1bddd601d308739c8f367c655645717a4b9d72bb45e55ee9607d6f8bea3117d8ae4a99099477c79aee6e962415400f7059839c67037081a1525193fbbb812fd6480015ac8de2552f4edb47e57a3b58df25513d8eae53ee98a8dc1277b324a900ce6a210772ba6fe5ca1ec045c0e20607f642e052c26c39aec656dd7351bc4ea853eea4a8dca20ed637ee6f3fbe4eb9f151b9b5ee664952ceed446b63ced601bb1836e5cd70e028602ae52dd0f512fd834cf4cb4c8b62b40af83bc2a0d511c048604f429ff5783cc38d8924f7e39a4cee57bb9b2549397766455ef300f0958a6d6713c6a2951e5f64d89467e309f39ecf6de26a76216110e641868dcfd2fa1886cf74b0becf46f538a44eb90f47e59e70374b9272eee6e8bc369bfe4941e2f3f368c2ba35a5c7f7193615c5fb08d335be42732bb775b39194cf98d3e8f6189d9d65e837515daead532efe45e27a77b32429e71646e7b5e3a2ed95c9fd84e8f132c3a6a2d90a9804dc69725fd7be341ebf50fac563ef0ed77552549f8d541f543bb9a2dec7bb8b25493917778f9d5827b91f4b79bf7b75a11105ff204cc96e7b1216b83a091735aaf427e05dc077804f115af363bdc0cf082bc32eed705d7f411820d453e7f8ed252cc445760130d55d2c49cab9f8dcfc529d72ef8eeeaf346cea06c3818f66099f57b4afb705a12ffb71c0c708330d8d322c922475d4cbf4b7c8bf39da1eb7dc7f93f2ee3bf71a36759b1d0c812449ca813951d27e648de4bef2f62dc326499224a5e7ea2869ff5113c9fd525cc453ea4a7d03bc4992a4f639363a07afa47fad976ae7e825c07b0d9964726f722f49529a4612a6799e9edd8e8ecee31b80e5c04cc2e417e30c577773b556937b8f1b4992a482186608244992a462186108badae426cbfd13e167be99c08f0d9b244992945fe711baf0f402bb1a0e4992daca31726a9add72d48cbbb27f37074ecf61fd47fb652749924ceea560dbe8fe118643922449ca97e1c058e010e061fa5bbdd7e4f0bdd8722f49ca33bbe5a8690ea8f5cba255bd864d92a4b672020c4943d612706b0edfa72df792a46e701e4e80d1f56cb9572b36021776f0ef4f1ae0eb46baeb24495da072028caf1a12a9bbb4d262bf10382647f5b50fa224a9db1c1b9deb1e371cddc996fbeed6a80f5f1ff02af014f010b0de9049929494e18459edf62574cb29d9c5d074a71e43a01ce9f3b8972479fe6bca2b944f65ad2ee13cf7922449c533cb10482a2a67cb9124e559ab63cb36008719364926f79224e53bb94f61020c7590036a254992d2e604189214b1e55e9224750507d44a922449922449529b1d005c073c03ac037a812781ab81fd0c8fa422db0938c33048920ae27bc0466a0fa65d079c63982415c928e0e3c04d840145f6b1972415c139343f63ced70c97a4bc3b18b80a78b9ca979c244979b633a1fb4db3c9fd6ac2afd792948c53816d1a9499089c4be86b58ef4b4e92a43c3bb7e2bcf6027009f0f9ec7c7905b0a2a2cc99864d524afa8055c03584c143255b0327037750bfdf61e9b6dc504a9272eeb6e8bc3617d8ae4a99099437764d376c92524beee3db43c00d849f1a9bf939f206e06f80cd0da52429e79644e7b8a3eb943b262ab7c4b0494a39b96f745b074c034e202c5a25495251c4fdedc7d729373e2ab7d6b049ca63727f37f045aaff44294952d192fb714d26f7ab0d5b7772855aa56a4fe062e0b906e57601f602f6067a0c9b24a9809646f7df5aa7dc3ba3fb8b0d9ba4140d078e02a6127e62acd78abf10b81438c8445f925420bf89ce75d7d629372d2a77bd619394baf1c0d709330534eaaeb390304dd841864d92947393a2f3db46aa0faa9d5c711e3cdeb075275b379557ef234c89793c617a4c8f734952516d017c233a9f3d02fcaaa2cc27095d5ac92e002ec641b59272682b428bc69db888952449925418a541b88b4dee2549057528612d97058469a0d700f3802b81fd0d8fa4221a0e7c943008779de1902415400f7019f5c79b6d002e3054928a6c074320492a80b3687e0d98330c9724499294a69d285fc8aa9955db77316cddc945ac244992d27612b079f4f841e0ab1565ce019665f747005f306c9252d23788374992f2ece6e89c363b4af4e373dd68e0c4e8f17d864d92c9bd2449e959189dd38eab71ae1c0d4c881e2f336cddc96e39922449691b13dd9f55a7dcabd1fd6d0d9bc9bd244992d23332baff529d72ef8eeeaf346cdd69842150a22657d9b63b707676ff3bc0fc1aaf3d05381898035c6228254939b78afe96f86d811555ca9c067c297a3ccfb0494a5dbc78c7f675ca1d49ff621eaed62749cabb39d1f9efc8687bbdf166df326c9252373ffad21a53a7dcf651b96b0c9b2429e7ae8ece6b3f6a22b95f0a6c67d824a52e5ec0e3afea949b18957bdab0499272eed8e8bcb612185727b95f02bcd79049ca8357a22faf7b80ad6b94fb7e54aed7b04992726e24300d989edd8e8e92fb0dc07260266121ab7186abbbf51802e5c89d8481b2254b805f028f036b811d818f000746655ec49f26254992a4e49c44eb0b584d356c922449527a7a80ff6821b15f07bccbb04992244969da02f8491389fd8bc051864b9224494adf3b801f038f01af1106ce2e01660067e08022499224499224499224499224499224499bce79ee95277d9b709c8f26aceae7b12f49920a6b9821902449924cee2549922499dc4b9224491a6c230c817264f226bc76cd26be5e92244992244992244992244992244952f771ae6fe5499fc7b92449526dce962349922499dc4b92244932b99724499234e89ce75e79d2ec3cf5ff048c0366023f366c922449527e9d47187cdb0bec6a38244952b7186e085440238093b2e3bb0ff8bd21912449ddc03ef72aa26da3fb47180e499224295f86036381438087092df67dc01a43234992ba85036a95270359c4aad7b04992a46e61b71c15dd2c4320499224a5a7afc5db06e030c326499224e53bb95f081c63c824495237e93104ca91494d24ffaf024f010f01eb0d99244992244992244992244992d4ac31c057815b81c584b9ecd7000b805f0347639733499224291947009765b733a2ed87014b693ca0760630de304a9224499d774394a8ff34db36115849f333e6cc0236339492244952673d1825e92764db7e48eb73dd7fde504a92a46e61bf64a56a29fddd6ade063c02cc07768bcadc05dc9c95dd0cd817f838302e2a733770b0e1942449923a670dfdadef63aa6cbbb4c6ebc652deeaff8aa1942449923a6b4394a08fcdb6bd126ddbadce6b0f8fcaad35949224a95b0c33044ad4abd1fd5db27fe744db56d4796d5cee05432949924ceea5ce5a12ddff74f6ef9468db01755ebb7574ff0143294992bac50843a044fd11d83dbbff656007e01e42d79c6d80f3a83d8ffd3ba2fbb6dc4b9224491df6295a9ff6b2d64d92244952078d20f49d37b9972449920a6077e049937b499224a918b624f4b9bf035806ac37b9972449922449922449922449922449922449922449922449922449922449922449922449922469d3fd37f4fdde6b49d939300000000049454e44ae426082}}
\par
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BriefIntroToFP}{\*\bkmkend BriefIntroToFP}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
A Brief Introduction to Functional Programming
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BriefIntroToFP_YoureDoingItWrong}{\*\bkmkend BriefIntroToFP_YoureDoingItWrong}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Remember this crazy guy?
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
If I may loosely paraphrase Erik Meijer at JAOO Brisbane 2008:
\par
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2752248}{\*\bkmkend id2752248}
{\*\shppict {\pict \pngblip \picw180 \pich434 \picwgoal3600 \pichgoal8679 89504e470d0a1a0a0000000d49484452000000b4000001b20802000000c28179cc000000017352474200aece1ce90000000467414d410000b18f0bfc6105000000206348524d00007a26000080840000fa00000080e8000075300000ea6000003a98000017709cba513c000000097048597300000b1300000b1301009a9c180000ff7949444154785eecbd0578155b9aef7def77fdcedc999e999e3bedddc7fde0ee01828540087177777717e2ee1e20c420b84b88bb0709c4dd031c6de1fbd77e93459dbd63e400ddb70ffb799ffdd4ae5dbbaa76ad5fbdb6deb5ea3f3f7ffefc3fbd7dbdbd02b35e01c0f1f6f5f60acc7a05fed3dbebf2f60acc7505dec2f1968d39afc05b38dec2f1168eb70cbcfc1578ab395efe9afd647ef1168e9f4c53bffc1ffdebc3f1edb7df7efffdf77ffef39fff2278b1bf80f5df7df7dd9ffef4a7f9ff147e82df6233bccffa9aebe7d8398e8bd71ffff847fab9d009603db6c18b36989c9c7cfaf429ce8ab6c43bd6d3c9b3cdb0921d8e36a38f58a08dbffefa6bfe7fa423d21ab62cb4f0f26dfaca7ef1d78743e8afd045fce69b6fd87a5c7a5c53acc457b870f88a9a041f455b54f4c26063e28c50c002ad59f012f25b91bf319da128b884cb82340b6dc00768563e163ccfd7b7c19b8363ae3b83ee7bbc84eeb3afbefa0a6d20d442746bd28dcb5eb4cd5c9a63d636662b715c90373131313838d8d3d3d3d5d5f5f8f1e37bf7ee5555555dbb76edf8f1e3c1c1c18e8e8ea6a6a6870f1f969090d8bf7f3f163434345c5c5ce2e2e2727272b0fdf0f030b0a346c20e893fa62df0477008aca48312e2b431fd77b6fc529aeff531c1f6fcd787834e85ee6c765a4c75e32a8f8e8ea2b56edfbe7dead4a9848404333333434343348f9c9cdcc18307c5c5c5c5c4c4b66fdfbe678e97828282a2a2a2b2b2b2aae085057cc44afc6adbb66debd7af5fbe7cf9471f7df4bbdffdee17bff8c5cf7ffef3fffc9ffff3ff2778fd97fff25f68016bf0fa877ff887fff93fffe77ffdafff95259a694bacfcf4d34fb1dbc0c0c073e7ce3535354d4d4de18ff08160ff0b58301ab08cbf0c45484ae865cde24f028e274f9e3c7af4e8c68d1b2929297e7e7ee6e6e64a4a4a070e1c58b972252efa6f7ef39b7ffaa77ffa6fffedbf5193a03dd03c7817ea0a602d4acdc97fb11fa2b1f162bf650d3febaefefb7fffef3ffbd9cffef0873fac59b366dfbe7d3232329a9a9a80d24af0d2d6d6c6cacf3efb0c3ce1e74412ede77ffdaffff5e1871f023b1313132f2faf93274f565656f6f5f5c15f810a79f6ec195f550020acc74a20f2770507bbd1c9fc13c87c5f81a18dcb2174518686866edebce9eeee0e15fdfbdffffefffc9fffc36f21b41fbbd674fbe21d88bcf3ce3b2b56ac806e4753696969595a5a42b77bcebcb037b79997abab2bbea2172c021a55474707ca465d5d1d3fd4d7d7373232c2b6bebebe111111696969f9f9f9972e5dba7efd3aceaaa6a606773f8c054e122d877f276a98b006b73bbe85978a5fc5c7c763ffab57af86e2611cf381fee77ffee7dffef6b7efbffffe071f7cb076eddacf3fff7cf3e6cd870e1d0279f8fb6a6a6a8585854e4e4e161616503fb068d8396953bab0e41af3af2799579c00a9285ce1c578512fab6c7e9459e13be4687ee6ab93b90528744fd039e1be292e2e4613c210fcfad7bf46930308dca074e7e1f2d10d77f4e851349e9d9d5d6868288c3aeebc0b172ee087f7efdf1f1f1fc79ec933e5ff4ff204e7f9e7743ee48de29d7438e9737e7c417ba00d84f6462640d431a23885b6c73b9c8ff2f272d0e6e3e3232b2bbb63c78ef7de7bef7fffefffcd471f66887da48b20f4c235c1a5c00d003d0a4b3a3030402703147005689968e013432b099757f55a3a1c686c3a09ba8d68199e1d4e9a7f71fbfbfb93929260e671df435133a30013be6ad52a3801b9b9b977eedc8127c87e85869cbfb1d97199f7879626af162ffa39d130d77dcfc21cf26df12b16c8b02b4b5fd15d2b141ff1af3e1d88ef66626f744be0e770981e3e7c086500dd00d30927372323a3a0a0e0d6ad5be05e5e5e1ed70170e06ed9b2650b6e1b1853ba61f022dd03ed1215150515453b24a0d9f5a1db4f94e657c2c7d2e1c0e1c90fa7f3601e259d379cff9898186802219301bf0f5a143704f436fd25f81c8c2dfc6d8a33b113aca77f2ee4ded3cd4a2f7e9682453d8c125a10dd8638201b2f6a32848220d1abccc22efe5784299f459c3cdfc526dd43ca1fd70d8d4d6bdadbdbebeaea5a5a5a8827fc0a188106184de0f23ffec7ff2050fee33ffe03e8585b5be34e2b2d2d853aa1336758804238c2e40bbfaad78f820367063818c5b8acf86ff5f5f57a7a7afff22fff0225413701cc2a9424ac3b5c3376de5080687ec616b9f1f3df01d83fff72f32fc15c3909a663445b94d630a4982e59cc95657b2383c5b74d7411a0fff92b49fdd0bf637616ff9d695fac679782192fec07ae3a1c61d8264284cc10defff55fff151116e881e7049b4b4a653167fe52db2c1d0e9c3a1d89b27e6836e8038494e449c085841b0107028e1e6c0dcb0c52680a2ce8b7643b859820b541ca5cd4c398f5561672f5f98d27c4c722af0eb3352c01ca7e483be7ef87f4fc5ca6902e0e8383b522ff5f535e8450c332a0c18bee04bc43af9c3871c2c1c1013e2c988025623e3beec04d9b36151515d1c5fc5bf13970366842ba22f0186c6c6c7ef5ab5f810c9c37fc294471f0f6e9462114c0075d17fe456117949cff59831da1d6c54fb007518bc0cc8450e3f141e137ea82e6430823fefee7228c741b993cdc3ca2493cfa21df91c466ec36e3ef961c265a83bf8c2b431ff15bb072e6cc19f82e886ee0c9e19ac375a32de7d2ac8bbc2584365bbae6a09326440035e93d84a670b5c8f2e15b72a3f0225bcb6f36ba4bc8540b9d13be2275c2da92ee632120849c06d11b9a764b3f5cccd5a1a3900e605686591f216dc1ec20ff3ce73f8ad019f25300ec54f99a92b6c76674fea49ff8b7169611fa4291fcf297bf2433bd98bfb9f86d1605075d08d636f411c7a0b68735213200f2e20ffc76cb1f7905080544f874f11b1a1a7ee40e457fbe301cb3baf4a418c83422a5035382fcf15c1af2959ff4db1d32658cdc2b02195c7ff876d0c142eaed475ea885e110559b3803163820af076cffeddffeadb9b999199a1f794e6f7fbec82b80a6c1cdb96edd3ab8ffc819525a6f91bf5dcc660bc321e4c491a344dec683070f90c64006900c0a79a06f5f6fec0a90ff2e252585fb135d3958feab39a4cc0523ff087ca09f02593cf44ec1f9a0907d91aedf1bbb7c7fdf07a2d488818101e00022affccf2eac39e890a2b1007aa790cfc02b3c3c9c61c13239affc44dfee50f40a90e640c0023890777fb536057b5e141c2c3ca1f383ce80ef89ba0a9cd3b265cba0cac6c6c6b01ec9aeb74df826af001991cb972fa3330ffd56e8c479b5477f6938603800018aa6a80b2d363696b21a58ffcac97db57ff5ef666f749dd9054725143a2b70a3a2fff24d472b380f1623b11322b5816a979191116c00fdf6d6a0bc31f828a3c87c4f68f18d1b37a2c808552c04cdab426461cdc1f26e382a2040260e9ae3dd77df45f78f878787d089be7548df0022142a020eeaaa040ae8e8c6bd8aba08ca32bc3938e8df12a73815f0817a3e9c0a4a10dadada88065686344fe7c81bb86a3fa943500100b50b8c3b5a045595e8d47cd370b01e45ca70a02217a782923b5262ac4c015fbdda38fb27d5d82ffb67e96a533f46454505953ad7d6d6be5138989b096b821342a509c840e28bba89f9c6ef5569b397bd4c3fc1ed8508407922d57ca0baec8dc2c10a52c8f9909696c649ecdebd1bcbacf7959a67ae82869f60e3bdeebf2cd43d0b1582511a6817d4debe5138e87f9233d1d9d9899428fa88b3b2b284e0202df7968fd78d8590b666171c433a905cc0908ebf021ce4782219873e1e94d8a344945570393b3b63308f90f2c04abc84ae142a08b192ba9851620ec258c107b60c0a0a12fd09d60bed4af423f686fb063f2f2b2b136d1bfa8a6e2c3a2e3b5bd18db1736c80010a8b69e379fe0efb9b74507c64a787bf8c93a1bb6bd6b3458f157f3d7aacf05b3a73766264eb61c7590480ea2adcb718baf15780834e0283ca902fc770312cb393a0ebce6f665c356a30fe9fc4e5a02bc57f611bf6435a2f7abd84d6cffa91ed135750a8ff6fd683ced5f6fc8d31ba0e7f64ae2de7ff3b380dd1e3d2bf43d51c7d35ebceb11e28b08362638635e38c2e3ef305a99e12a5edd800a37bf0136c401a8595a22dcd1d5c38cf816350ad36321cd0198083ce9ec14128f06f05ba6ff8f71f9609177645d084b419fbe18f8103e7831da239e9287c3ee6daedacad4e1b43b5b026c1498af6362fe6efd0fee9a6c70d8036a3fd60998e22749eb43dada765d231ec12e123ae152957aa0a23e58165bc5032813c180285eaea6aac67f5a7b4aba5e59f160507b9a2383c4e140e07c684b1423aa14bc0fff34c25b0cb217495f1113bc44dc6ae0bdd5b422fa1d69dff23ddd0fc9b6f0970d00980636a5a3ed3fc3f38ffdfa19d50ebcefa8f8032fbef6c03fed9d2d1b199e835a13b93ef96e2d645e6096e07c601b16a1bc6c4d27cc145c14101cbd9b36771aea83bc24721384855920ec06d27f49768cdac56967f2d16a93970b9f9ae89e8afe6a747f442f3d788ee0d7e0cad64282cf2efcc433c3b0ae0e0738c9fb0afe8920a996676aad4ea2cff446d8fe14fe8ed3a76ec1895c1d2c66450e61ff331d73559180e28283a405858188e8d6e583a3321c7070d46ff84ee15be4125f3316b29d0827090d699eb1af1af26fd43da9e7f47d221f82fd1fb75d61b97ad243ed81dbcc8bfb318384877f26f1b76414805e2d0423e075d0d6a02d6e454bf8ec1416820fc3b2af8a56fe9fd75f91cccf1c1e8f27ffcc77fc499b15e41fe21e163e3bce9c209b5e55c2a812e0d5303b36e463790d0ed35d7bd8e732046457d0e3e1c8b476d566816f977160307b6218f8d45287ca58265b02e14f8d0067c4d805620bb8f924dc0811414a90d6aa6a51994e9939f4ba5b0f5ec3c50420c6f14e3d3a9bf473464221b8997502838d7d524b78edd37748b90b3cd5eb4cd3cc1a750ab0b85c7a2aa65feff3bd7a9f2d72ff2ef2c120e6c86736640b39dcf7a14d28bb8ce3484820e8105eadb4a4d4dc5b718c80fbb0f6268e5ebd51c74781c0cc3ad706c4c6a8035349f8490b222e541bcf3db80d8174a42e0e6261ad85d4eb186906b4231a150e82faa391897af030e0254c8ac2cf877160f07b664c99bf9e1a0bf096533ab3eb878f122bec540437474a075f870bc469f83fe27122cac2870d60e363a7551c79334279f0fa8076a75be4a609b31c54376771e1781af1840a46884b934cdc1b417db275fa52df2efbc141cc407439c3ee2a0ec52b05418dfc2b29b932217aac0422a0cc314b007a16a8a054d84e8060b3ba4041d68c0f814c0813933489708ed6b1eef1aa73e6bca48341fcaae0edf58cca33644db9e1969c6a8a8cd5ed0e7e01f9d968512560bfe1d6c20fa5f8872f2b4f0126d0c76aaf88aa961fec9085d310607a53a50788511a9703bd0fdf686e0a03380cb837e3f508939d49825e3ff3d320ab366fd680ff8b7ec7acd93a2c6bdc2ae1116845c90592fa8a86a41dbb0952cdbc6aef23cee2d36a6dfd2c694e39ff51ce6ff3bb37a91d4b494da9aeb1c487fd0df24ff9ace040ba29d030c0eba81e16a60503536a63dbc0987944e14570d54426b912178a98cdbd2e2a825a8c19fda4f84e0803ac7746a8003335d318f95b879a9f662977161b3429b767777634e08f4baa18a75c907fba935deebfebf7c38688480adad2de0c01816d6ab42702c2da05d180e3a838e8e0e2439506e84198cdec2f1ba5b7d91fbe7c341c5a41843049f03a9523651c7eb8583f68ed989d0a98303373636b2ecdb22ffc3dbcd5ed31510820347c1a4b9d01c989f938a49858ccbcb9ec6c29a833412e040a71fe0686d6d65a58b2f7bb0b7dbbfda2bc0e0603d7098f71270600033260de3975f2dcded5b180efc1fa4ee31728626f8c2b43258f37694caab6de61fb9376a7b6a269a63198355b1869502bdae24188e01ef060a83663ec402ad59fcff591ab68bdfffdb2d2918010a98a391e639455905bf995e171c940cc5c4313437340dc87ca921086fe178ddf8121cb02398f515836601c7ddbb77f970bcae50965413323020036e076a8c5f365a790bc79b81034741868da6ed3b7ffe3c3eb21ef5a535c1c23e07b917e8d4011ca8f4c110097c7ca9832d7e63fc37a14ebbd77d59ff16f68f84e93c19fdc59c21b31a30f728e544c62133339329785cffc53701ff700bc341ee457a7a3ae0f8f8e38fa93b783167ccb611da7e9eca6cd1c216dc04946c9ea75c5bb4908e8ac8f9274965a1b486159dcc55b0ce7e384f7df92b2922a703cdd5d5b2f88bcce080f9f8f2cb2fe100600e6432344b26833bb105cf800e8c67d280c70d1b36d02117fc157f032138e6a9cce657f6f23b9c0891590f2a7a65590f0ebf4f848020b524b467d182753ad0fcf5e5afa488fc15c2c1bc0a3c950170a058103ba7ccd8d21c8e45c1414d8b01f538e4ce9d3bb1fcb2f370cca569442bb3f9cdcf6ff579cc0ded84dfc9ceda9edf0bc8c78bed79ae82759cc682f5e5afa488fc15c2c19407a66340348b612c6f020eaa2e461918e0c04d461f5f49b4326b6536e36391ca965a91d53db07a60fe4aeafe66d64768cfa205eb2f552eff638ac8970687e8cd46ea815e781e0dfe20e64427387e4c466a61b3421c484a4ae29098a9586840c462eccb5c9a63fee65f241c4245a66c2c0c7ece2a89a8f9992211ddb3d09a45d697b35f2db988fc75c0812167383114fc92b7c186b72ca6a584b659180efc00c780b2c221232323f191085dfcc15e2b1ce44390fbc94acf858811525142288816ac2fb2be9c6f9eb0bc8422f2d70187b1b1314e068fa5e25bff976aaf17ca7b316d8c54c7279f7c8243e27157d8fe65676879dd70505be2c4c8a6e0bee7b737555ef1231a3e1cf314ac8b5e9979cae5975644fe3ae040912ffe200a7ef959ecd708079e1e828e3e1c12c51c380cff29218b61eb75c3414568ac2e951f92e0f4c8460839a7c4075e502a8baf49162a9717d2404b28227f1d709087be75eb568283b078d9ecc3f4892dd8bad83b2a5751e9833c07c661c286bdaa68e595f81c387f561dced710a44e1831fcbf49c79da7607d91e5f2a2e7ffb245e4af030e4cca8596c25c7e54d241d1eceb8203fbc5d4fce8ce419e037d7d4b20f1756b0e7e2d2eab4666a5f0c481281ce4a3cc5ab0bec8faf259e15e4211f9cb6648e78f56a0291157fedffffb7f2997bd84f67a399f03bd6ef4ec5dea92c5ebc7f4cace53993d6b132ea8db583d373f2b4aad4e2fa1d25ca146152d58c71117ac2f7f8545e40bfe41a10de68703a61f790e3c1c0e5a936df9ba3407ce0c5d7cd01ce8b247a71f3ebe6ce83c7ffa9c9a4a749802bf0e7bc1cb475957bed7c9ee7eac171d64357fc13a1d6efefaf25758448e7f3a57e7c05c7f9c2cc5ac4d0e354fa357f05cc1a5f9a12fa73970178244940962421ffcf255452b0b36f94f640336ebc6e2ffef3c70c04144b52f2c4b4949094d86b0f8dd0a6db9a83c07fa7f51068687aaa03211bf7f598774c927f7f6874bd01c5069e83c871b8039d1d91c0dafd1ac006df6e80c9ceed2ca8adeb6f42bbc02f3680eb88378c8091c443c5e8dc6bbe3b84bd31f8bd21cb0e550535f7cf105f5d72f39347a8557e727beab795a01da02951580038f27a6ab848d5f231c212121d45fcf267259dac17ee22dfa0afffe3c70a08d30c534da8b9e83f36334fda23487b7b7377c7e313131d6abf2d6b2bcc2965ec2aee681035fad5fbf1e6e809f9f1f199497ea42e79fcca2e040ff2fe0c03c93cc7abd6cbdcf12feffdb9fcc7305e637eec89d23ba44090ef60032961c402c0a0e3c4e1da5c578f63853186f35c75f975d5138c8b1a04997a8be82a6d9a1a4d4d2da6b517060ec364259151515f26e96ecfdfe752fe8dfd3d1e781037f939e17696f6fcfe058da7f5f141c7808391c1c7a38257feecb451e726941f62277fed3dc6c7e3864656501079ee70a5df2b2e9ec97f639503a8a83d153a2d8036016df2a6fe158fcb55ae496f3c341b374e066061c4b763870260b6b0e1c00de2f0e8680163f40eefc65bddfb7702cb2c917bfd93c70a0bde8a95e78de2c791b4bce4b2d0c0750c05471ac5b8be6115cfcdf606eca4bfde4edc6f35f81f91d526d6d6db417de69272f5bd6c90ebd301ca00153c5e16019191964565eb6e5e6d71cfcee53d6c92eb43057a725db6cd609c25ff63cdfc0f6ec847fe4b1e681035fd133aa1140fc98399f166556e0d1e0c97238d88913277030f6a48f1ff9f7d8cfa9c86ffed75cd3c6f17ff5ff041faf0a0ed18bcf42597c4535c6f2f2f23fb2b116d61c94ab47b442b97a9a667b6971b3e85f622344e69f6c741e10a9ae822efa82530fbe2aa097bc9fd70707990f9a123f2020007d2bdbb66da3f304374b6baf85e180cf01cd0138e8d6a4eae2a51d4cf49ab23148f34c60bd604b30c216533243f5a1f33c6507875bcc360b9ed5ac1bbc0138d034081d0007469330385ed64da41f2e0c0748c4d85c1c2c262686c1b1b483895e2f36a87ad6672a2cb201181cb8f40b0ed217b244b36effb2db88dac4b9cefc0dc0013d8151d4b89957ad5a4571e592a3c585e100892b57ae041cd4cb4749955702c78fb729d40634f8805e0b6a20568fce6f51a1499217b3cdfc4ed25c70d0cd205a13b9c8db60fecdc8ac601b38008003fa9e7c8025bf1686837af9f097f0f43f1c866a04970c23ff44f9e35a67bdd60bb6f4b4f6fbe18f17732dc0a56809b1d0c31e16b3cd628ec5df866ae2e79942f96577c8df9ec18159a6517ff3ce3bef905e5c72632d0c07f6be65cb16fc255f5f5f2c2f21949dff369ae7165c8cade15799d3ae16f96c473a2ba15869d6535dcc368b6cd43703079ee4852efb5ffef29754d6b96435bf2838b66fdf8e8beee9e989232178593289fc2bf8aa6c0a3f54213816394b0edf18cd45d53cdb2ccdacbc19380a0a0ad051faeffffeef347465c9d1c3a2e040990fae85bbbb3bc1b1641267b5298bb41db3de9a2c8146710ab314f304238bf12716b3cddf321c2808473d07062992ea7dbd704073c021a5e211322b3fa63b879af995c4296c922032ae8bd146fc4685bd5872b4b2483bf22637633ec7952b57e07360aa5afa776caaeb973d9945690e5416e19aa258100685e0f89195608b69c505ff09531b7cff8e8d809deb292d8bc9612c669b054fefcd6fc0e0c0c37830ae891ed984d35872affda2e0a0c93910ade0f0fcb1db4bfeff8bcc7dcdbfd9ac737fb1a9ba5e5344b0e4bf4c3f647aeb47ee67d69f333860a9e173fcfce73f1f1b1bc3962fdb8bce76be301cd01698851fff0aa91558af5712ad2cd2a6ccbf195d6851086685e67534c612f6f966e0c8cece061cbffded6f3177064e12d02c2d8658180eb81778962cfe555a5a1aeb785bc27579fb93d77d0598e6484e4e46288b24183d5294f858c2d117860359369ad607d1337b44c3128ef4f627affb0a3038a86f05a94b165abe2e38e0d460525cc071e1c28525f7efbdeeebf276ffa41e2850405c89f6c2d387b1fc634287853507b26c48c4e260d7ae5d63066c09366c093f79dbe4f35f01a1921f0607267d64c9c01f937458180e3ca50189581c8c26e287ebbb341df5b6a55fed1510bad9f8c53e5426a8a5a5852076c919302eb65af08c111c62483f83e3c790b8e0b1de6eb0f82b300f1cc002eda5a3a3835e528263696a7b613830610b2698c2c16edfbe8dc35028bb84832de1278bbf523fc12de78203eb310929da4b4f4f8f3d706d69ca7e613890cdfcf5af7f8d83e1a91a6803eab25f82b27a0bc7ab25782e38c081baba3adacbd0d09046472eadbd166556a02a2894a54778bc85e3d5b6f192f7360f1c346ec5c8c808dbd053359670332f0a0eec1af51ca82ca2f439f91c4b50536f35c7923998f587f3981555555506074da9b284f65a141cd8080373d191636d6d4dc5cd4bfb936fe158da759beb57f338a47c387e4c89c5c23e074e0e0743ae5e5757978eb4340cdfc2f1e6e1204dbfb4f65aace6405205e9d8bd7bf7f26d0a3363fc6710cf330be55b385e2d1ca27b63a90ecc8a0fb36269694971e59295fdc29a03dcc1dbc024b53b76ece03328341703f22df337ff5b38de0c1c388a8c8c0cdc000c8a447ba15d969c9a5a180ed41121710e12ffe11ffe616a6a0ac7e617bc437fb09c299667ad2b11caf2beee6bf493dd3f733c313f07ca046920359aef35d673a0c97b7b7b010702968a8a0a1c0f1dc1e0835f698cd39ae70cdec2f166782538f00eb302389004c3719189788df51c38006a467ef18b5f20158612017eed2e1409d51ae1354f6ffe5b38de241c3816bc43dcc9e4732c596d2cca21a56a2214734079fcd33ffd13de6d6c6c80087b240f54083b032a5a147abd85e30dc3b169d32634139e1e0a9df1b213d5f34f75619f83ed1db3f04379206c419511a65e470853555545fb820a796b56de0c01f31c85cc0a7c002ab13873e60cd6bc5e38703614a4203c816240393f1d1b2f74e563e2a97bf7eed119c31799d5317eab39de0c370447616121424bb40e390030f7afd1e76051326bf8b6b6360cd58516c1c808b23540a4bdbd9d4e856645e527f359de8c92fcec74e9cf8846e1b43d2145cb8bf97b145ab39ff023e75957be99067b7d47a13b96ae3375952354c44a3cc11319cb0f3ef880cddcb264b76361b3c2fe1ece803da4942a57518ef6ab5ffd0acf6101aa0874151515f18c0fb63d9c120a7ad1367cbf64d6eb857f85fd936b3dabd7c22821cf97a130d7de7045b0b7b994eadf41d285fe02c141cd4f7904474747dcb1986e9aae18be7abd4930be1a60fa636464844c09e6d8668606a78588067e726969293d62414855e0e7f80f683376c6d84c9489b9fe8f903e60a0607bec043ba74e483e3108f4e910a25fbdbedbfa0dec99fe265d28baa3487fd00cb5f008091aac5cf29db028cdc13713381bbad67436442b7c113cdd03b462141e9ed9431ec9ef7ffffb23478e60def4b367cf62fc19e542586d125d3efe9d8da360cf78d11f26e4454d26ad240b327f1b109a73e9a137d07eaff5104c67101978c71a9aa30b171fcdb118853dff192e0a0e525f42771e0b65715a3827bca04bf08031ccaa8c2e7ecc958e53445c035cf00ebf045312a21e1ade497c7c3cca51bbbbbb4909a1988869235283d4ea04c782de0611c0340d2df3dd9ad7da427fc59db35b88c1819341c12fec3bae7c6565255d40bef579d9b35d180e76f3d1adcf3f00ee7b7815b3dec1f04f012f50c0504a0cda245d82cc0c58a1654c108019cd30e53ec6eee19fd0640178616f5048208ff9a4cc6f251f82391c42ca8369142c908b43578d9617c3d9cb5ebbbfeef6a43ea975e8126101932f50148927bdf123c75935e882e7bf301c42e31fe94e650766a785230194bebe3e0288d4091d1eba010f1fc5946298c4014e2b9ef8447a052f5ac03b86c6888b8b03a68888089821a816446278e18778afadad454ea5bcbc1cae0c1e5d76f5ead55bb76e61246d4b4b0b8e88e3f295071d9468a033e15f0552b64b1e5bbce0057d931bb0a66177028d58c15d87bb8b8060f42ce1c4168683aeafe8acd64c8ba019f8ae033f8ea018847e4ba129391648d4a08de134eddfbf1fd348305648bbe045e8b08ffc35c8c2b16f698a12808529edc0969c9c9ca9a929e668f7f7f70764783633b417eaa2d12504a707ca0967b2a0a7b2848bf8d7fa09bbece4c9e1af4113e35ae10e64a724945678a9535d141c2fb547d18d098bb95e1834555353939a9a8a4a3378daab57affecd6f7e830c0a3a9d1907f8c30008186190047a7900044c15e26766a4800b3d339b7183dfd2cf0110adc4cff17c2b4c1a0f6e3035147a85c031854ecc9c61813c62b26ef45fc8e4090550424e3173b759e445ff975d0d52b17c35461bb0109db61462977d247f53c892e223f593d3a9621009858d986b9a267cc2ebc74cf0f7d78743e8a240c7a0d96032f1f4ebe6e6e6c6c64658162c3c7cf8b0b3b3132a07c133ec14e6ac815b03738366cecfcf47f1b39999193aa951ca80a0091e31265a84df8e8b055f186001117454e29d000237e00c55dae833c2e1281f83a057a86db09e9a93cdbe8a6b8d95fcc142cc05e67340713585d67cef98251e44bd666c0c4c7120ec9c026fa241280ec01a6c43fd15cc3892f34773972148644fe026558d135b5a1eecaf0f07fe18d91d7657d11564d00835180b6768035c3b5c17ea1dc40bbf258f95ae1dda1b3c21a50b7f252f2f0fe6069a03d040e5508e19aff7de7b0fbe0ef39070ddc929a135f3b872386d608a0d10a6a10f01fa0f2ff440c13d826f84700c8706c488f3d19cfcd3e6eb0ce657ce9afda3bf43dcd029f1af06ed937e081b8aff82ff85792b58f727be2585f7ba1c5276432c7981199479f6408cf3ff3fe95b76ed6881b861d1077f8774a72ec6c4a2451f3d7a949e9e0e4d435901a8138cca6197127a0875fd183186a93e8283838114e626c1f650d778c70407304cf06c30e9948282c2ba75ebe0f45000492fb4107608e5441373e129af98c362f3e6cdf08a0e1c38801147189186dfc23d8225454213a9203892616161b8f5a1c9a00ba12ce168cf3a7e0c1781a2395c2b108fe9bf6c6d6d51a447a312f1044f40498686e98c59b15b4c6bbe51cd31eb09b1acfcfce810287cc38f8f040a41c3d734b431dd70a496701468117ee4858b8b3b0ca60ace2c2e6b6c6c2ca91c5c5cb835aca5c99ba1f6e6fb34649b90c2615b6219aed2cf7ef6331832f45ad3f644097f6f732dc3f6b1bdc1fc211cc5dcc0bb76ed024c98e89e18024cd07c9885ebb3cf3ec37e7014f0871f522717b206030303741d607c99b7b134b5819dfcf5e110628274033f46e76f809b5bd42f63f6854fc9aca8b1dc095d2f7cc42d88ee2134213ab8e986c3bbb4b434f2bc40042555982c0f2d810cdeef7ef7bb77df7df7a38f3e42280e6d81821a3cb302cd76f2e4494c4e01330f27093928e824b847088eaaabab615c6edcb871faf469b8db500c98540dfa0603d150a385b002cd8c0349484840a3e05958d8ed871f7e48dd994214ceca130082ba0288e8afc0ae10db939165d3c309d9a0c5a80aa16dfe56e020e3caf7c645bd7da135ec9f900a11fa63cc9609d91a3a10d343303194efc7246bf809596b4c9b8435b829294ea1ee026820bc3345c56c3fbee5378390874467c55c07e6a8ce9a97c34a9c001c6da0060f09c60b73bf624408da1e93abc2d1467704ec1daa78d02b8e6c104064ce16eba2a2f8851d77094cb09ffc4dc021daea44c95c34f02d081f11a6186881ff95a82a2223d5dfdf4fd6baa8a888140feebca6a626aa798332a03885c1479e10ed992c177386f8ae258ece3a0269b7ec3517c4c410fff6a043b03f4bdff2ff1a39ddf44f99674a67cbb7bf4269ccc5e3f23701c7e24ff7156e49ed8df882122148e19392c0d5c7ed08738ef534767c2e1bf70a4f86c898f5459e90e8ebd51e7dd6bdfd74e1a09b120a030e2350a07a36d80e520c6bd7ae0531f4c46fdc9d4219b0d7d1304c530a2dcc05cdeb3807a17dfe74e120cf17ae06204068809c045f21d3dcc8cacaca6f4c73bc81c67ed943fc74e18032803146a00108908a80ef496e23b90b98900fe12b921358f966cccacbb6dc1bd8fea70b07f98f302b0407b29ccceb040de8fb463c896816897c34c38f7caacd1b68c8d771889f2e1c74359190408e0b5d7d6c7416f91c2806a03214a8163237afe3ea2f669f73f9228bf9ed8fdce6a70e07663c03044875101ce48890aaa04710a1736ed6d4c58fbcee8bfff95b38167fad5ed99614ada06b1b7020d5487ddcd47d4f7ca0370e9605b5f58872df9a955776dd8576b4603aeb751d78a1fd52c61313c8a37b02c510fc0e4cca43235f8e3c296219643e487f508705a5957ecc60b2854eed6fe2fb9fae5921df02e96aa807e439902ac5471698905e41ff087a5e900841ef2ba52059cf0591f1f71dc8fc74e1a07b13c5449865153e07ba31091752277041e863747434f5b3a07095f579d2139058fdfddfc46dfe1a4ee2a70b07da1e3602234bd10b0a9f8332a4fc7210280fd213e838051fe89b45971803e835b4c5dfdc2e7fba7090d380dc17cdeceee3e343ca40e88968703e508c08e3826d500e8ded497fc0ca60cb379056ff2b22f3938683ae3baabcd0f0687e8cb6a235687eea9a872221df13457854888a522bd62b8bf54baea3f92b36f9e20ffdd385832ac470f7a381697c294afa0001654ee90a52f2833ea2540cdb20678acc077ec82f9b58fce5fe7f6bcb9f2e1c6456a8b510b3602010da1eba01355a54a1494c506d04990f54d990738ab231e691fcbfd5de2f75b63f693870a5a8fc0c0be895c5e006aa0c45570b6a8c090b2a4465d79418429f5c717131dc0e0a58b020d4adfff79102f9e9c24169507ea72b8611e071bdacba1885c728c5c336540808e7032fe818a083a42ac65ca1581cdf622533439448fdbb09717fba7030bf1294b061928000f108ea34d98c2328dfc58804da186d8f86c728180c1ca2fa311406239621e5814c090144ccbd9402ffdbdcf8a70b8768a08135342404d60485e3185d82de5a3222c8a3a38785d56f62f802253f3030139a06354158c35c54b8b17f1f99d39f2e1c148688262af8373d2a4c31b409cd4f8372e187a2d519041870001383f548c0c3ca24262622734a15437f9b9ae065cfea270d07bb58645958d1062c0b790fa400d0c38267b4a21e1d7a02a301b0065db8b4017e0544d07587de1900846f890c368ef965dbe36f6afb9f2e1cf317ecf32bfdd160a809a2110c7846000d668186c088456a4bcc3f83043cbc540c4a6345437f53cdbcb493f9e9c241d70b6d4c3d6df4911658271c75b0218ac168229081da0ef4c351df3d2915e8092809cc0b826f311092f40a5e7f1f93c3fc74e1a0d685db4139093207e472d23b45a4084668b668ea7f81c3816fe92bfc04d9118c97844d417684225bc26bc9e38896768bbfa65ffd74e16017140d895a1ee66490ff41df2215f6f39fff1c0d8f8e95acac2c522460821bbefdfdf7717171d01634fa19c953628b94cadf479fcb4f1a8e79462ba1993145028d5e479f0bc216c205eb11d3a282907265085210ee821b5242644dde26c15e4293fd6d9609d25dcec69a422bc097247f02f332484a4a52f88ae1cb703cc9e8207f8af1f5580975826f11bf609433fc536081cc29df94fc15abd55fa26116daf4a7ab39583e834c00851e68602806ccf583b68735a14796304d00f7823adea030f050449a2685f99ee8e0253f86e6fefe3b78fd2838e6aa9aff5b5b3f573b31df82dde8984503192d7812302554de412a81fa5630830a521de49ca2fe037607b583f80a2e0b4b6c106a7f1fd5ea3f693868a20e167df8fafad22c3c085991bac0b7a26d8cb43a66cb609d73d0225021d4f74693c1b38efe9f84e660437a44477fd3ff17d51374c5455f7f531a859219f4a21343070acd228700049a03112c62570c7d0325345d1fb6a18c3b2c0812a398b090fc120ca9859b42d12ff5c0fd154722bd422817d61cfcff29d4def4952804544c45afb940e1afe76fffb2bf5dccfee76a2afa2d8e880dd0e4274e9cc0ecece8a98759419323e949d32f413760482db68189c13bf4046d0f63849c18a25c6c866db092cda632eb1159b3bdaa9be46539e01f7731bf5d141ce84b22c1fc4a7ce1af41590c84be9d75b2917956ce05c75c3f990b8897858cb6a77e76a642b000030167028fb283670a13434e063c0c5c5c8a68f0a2614e7861323f24ce11bf001da68db03ceb8df4aab0987f3f4ba350149785e1106282201012ccd6b7184151d5ac32eb3eb172ae7dceb5fd4bed87ae2f0e41bf82e110b0c84d772958c3cdc5003381197031951b990f2f2f2fa02f987b94bb07b0000868623f4c8ecb6e1bc1bce374934cdf2da23715bbdf5ed5022c1e4f960e211f9185e1607f8c2ea26883517be3d12b4c843ef2bf7aadcb73c137d77aca9dd3b7b8d1a993853c0c7c14cc4fc9418f3534e13cfade0004b3a4f815e681a4c8055932842d7471b08dd0555adabdc47622c496e84711c27eaccf47882c0c07f7c7fef4cdf77ffc9ae4bbefbf827cfbdd3326df7cfb14f2f5374f5ec8d798007a5a30106441611b2f7201b340bf94cc4aa4c07be080c685243dc13613cc328d1904b96f310c1fdf228f8e94174c0c3e6225ec0edef16807f8ad28094398838fe89fc3965810c4bddc6f85a05c8c727dd96d84b0631a8b6fe5194c7c6416a35b16864308085114befa7a0af2ecab49264f9f4ef10593959308ad671f9f3dc323ae5f42e6a28d7f0efc653a432181f960fba1ab8646a5e9aab120f8ea2bb437f18ac96291f8e21e55f135feda53bc635217981ba80dc42ce87e6337067ecb96e722f895ab4f3e8573292df205e70914447159180ea6271816ec2abfa0e1d9c493a7e32fe4c9e4d4d40493c9c97112fecac52c33aa8416e6faed0fce81773e4f9f4dcc2e4fb9e9e561448029ff10f82818fa3645c862c40acd607cedda353004571429731aea82d172dcd3ecbe9e822ec13bbea58bc3951be286f921f18cc597ba13b0f13c0a95cf1fdfac132e040ad32ed45f486efeac9408f1b1301cdf7e37f5cd77e35f7d3dfef4d9a840c6c104aef5d493315c5021022626c6902dc4e5137dc177137cf503c1f6829f4ccec8383613bc68fdf4c6f4f1854c8d4eccc8f8e4c80b99181a9f9189c961c8e4d40804a74a323935ca8482d8196aa7705d28a6a577da3f1409d21bf2f2f2e0006a63eae938275353181749210c6a8f690ddeb143da801bf2445b3e9d7cf26c6a16e1df483f8098aeb0887cf5e4e9574f683f5878f6f5d3afbe79066137274724cf7c13317cfdf4fd77df70eee20b505e0482fc8cc352e0f8f6fb89afbf9978f6d518cefbd957b80ba1240417fac9c0c454ffc4e420647c62606c7c10323a363032fa03191ee9271919e56478a48f843e8a48efc82827a3637d73c9c8f8006478ac5f48e80448f894b065a18589a9de590586637c6a988b57a786315730d4065e98a81a6be07360626b4a9421c9810d20134f466695b1c90192f1a941be4c4e0dcd2a421a91695ca19d4f3e1d25e1ab430e94194545da8be91b80f2ddb75f830f9e3a2125f2032dc2cf0712250b6b0ee88c675f8f3c793634f5043722f7af0805b4dcd8783f44d084a0619a80a1a101268383fd03037d90fefe5e082d8b7e1c18ec9991ee81c1eec1a11e92a1e1de596570a457488646fb206839fe0b1ec3ccebc529f14f6f787850580410d3de6887488b01053ced00d70ed664c58a15703e10b6e0a9640014fb17c294c025191d1f61323631ca647c627856211a84d52434e80c5b134f86202f3e4e6b474e1d926a24c30aa5f54460490917281580c2d4890091e917e3830c8d5090b3301cd3643c1de4948440c627fbc6267a47c77bb8eb38dc87cb2d8000afa1fefe4192bebe0192dede7e484f4f1f27dd0324dd5dfd90171f7bfaba67931efc70467ab12b26fd5d7d03dda2d23fd83630f4485406871fcf2e33140e0e757132dc41022b812b85bf8649ef4106d406c6aa20fd85843a253c604d4027d610a303433f90c1e13e12ac67cb5818c2e5128828dcb46668b46b0ee9231dc9b0a38fa31383246393206698cc2bac21bd4f122e8238400411cafc711d8a73a91080b2301cb8ac74b971e9fb071f4ecbd0fdbec17b7d030f21bdfd6d3d7d0f7b7a1f09a41dd2d5fd88496757db82d2d1f58827ed1d5dc2d2d9ddc1978eee36269d3d8f98747575747777427a7aba48e823fad6677d4d6fd6dbd1332deddd3d8f2174c910ce205285f9c0b43e7082f6eddb477e069e82d03bd009a78a7b58dd40272773c0da37d446d23ffc88c9c0c863fec71f2c0f75f60f750e0c77910c8e7493107c7cbca6391bed191eeb1508c70d6365747c680cca49c00ac5012288704f1a6170f011e167991786e35147ede38e0608161e75543feeac79dc59d5de550de9ea2f8774f69575f4949374f656cc235d03359dfdd54cf0715afaebbaa6a5beabff8574f6359074f53792740f34413a7bee43ba7a1f084947671ba4b3eb11a4abfb312d70cb8217fac6845e5d5d3d9d9dddfc951d1d1db864e4ada9a9a901053c6807c6857c52bcf0309ece9e87d019788760b38eee077c40f9cbddbd3db34a574ff7fcc27ed5d3d70be9ee6befe9ef8000c4bec12e9e74f40d7202a466a8ea1918ee1986cf37360844a6291987672d840837529c9e1746d508646684acccc27080868eee86f6ae5ac2e27157657b3708a8eaeaabecec2be9e82d6eef296aefbd4bd2d157d4d97fb76ba06456e91e2ae34bcf7039a477a462462a7b479854f70c57750f5542b000e91da966d237dc3cbb8c54f48f560e8c550d8e57936019323451c3e4075f8d340e8c3433e91f6e22418402f50014e05ec0b740d48a0564c0f0c094aebe568430ddfdf748709fe11d2bf9d2d9db322d3c85c75787ed9d1db30a5f23fe70f95e47f70b61f7460f74b6407a07da498815a66340098132363682d08f87c8531ada49cf3f9cd5c480fbc5c0013d0132aa1e7554b67594b775943eea2c69ef2981c2e8eca9ede8a986001708690e4e97cca53ffa2b3b05d2355005e91eacee19aa81f01bbe77b89656f60cd5750fd642b000e91dae67d23f56cb97bed19a69196a44d3a2b107475b86c65a2158800c8f733234d60c191c6d820c7058340e8e3690d047a2047b80fea081907032f0f41d2c800cf4c3f50db7e23a0e8cde1f1c7b3034fe10948c4c3e1a9d7a3c3cf1806468fc3ec9e0d83dc8c8930626c353f54c469e34cd2aa3536d9091c987246cb783a38f2103238f98d09afea1769ebcb047501eccdd2103340a3ec687c007bc5d0122c8eb3ce1b279f3f2b1301c6d1dc58fbaaa045249f2b8a7a2bdb712d2d157f1b8a70cefb4d0de5b8e86c73211202a6869d81498126a72bc9359012560850898fe6aa4be63b0a677a8b16fb809420bfd2350184d3d830db49209d6cf484bffc8b40c8cb630e91fbf47ebf92b07c75af111ef43e3f70823a20ae92c74c60208f6f8528c3c4061c7e0482b6ea681e196a1d17be4c4010bdc79e06364fcc1c8781b04c408c9f0441b84db4620f491bf86f09a5f469e740e4f750c4e3c860c4d62b98b04eb479e740f4f768f72d231f6e4d1d8d307a34f9b87a71a279e75c2c0f50d2036407cd8cbd91af825a3883107792a84e3835408df0521e302a5b8301cd0138fbbab19198fbacb0107f1b1201ca42118258c06e280a71b383ea033fa461aa6bf1a6de81caa05134c080e082346140eb235020e182edcc2c0682b6d4cebb140c3ea890c2c030ebc4367602525b828258a854f3ef90475c5d86058c0d0c8c4fdd18987021a1ed0cd0d0dc1ad7971bb4f37ffd0d42c28cc90f14231d00fa130d0b4a2884c53f5b47df809b06887801201131c2e330b1c280238dac79eb48d3e691d9e6c1e7fdaf1b8f3013c1bb82f5d3db038d02bc80ef422c01c1d1d869511a810e4303915420f4315b22f8b322beddd658fbbab201c1fdde524d013a433e6d11c44061320421a42a0246a78e6835b9e8163da7cf48c36740dd741ba47ea49b0a66fbca977ac110bd4c0a2ca8335ff0b38461bfb2182eda7d5cf7043df507dff7003ee8cc1f166dc2543132d08db6056b0128fcda20417de51f283a2519898a111ce0b191e855512c031f9605aa6d0ae9c2919152c303e86a61e92b0357c1b019ee823b3410c8ee1276d234f1f41b04032bd9f9995234fdb990017c1968f410964060e10f670f4c9fd89a7dd6dedf7da3b1f0b7c9d47706911f92399c4f1313c083e0426065d1cd3f685f1c157210b6b0e7812edf02a7a396b2220a394c8e0b0e82f7bdc5b82775a68ef2bed1c28c732debb062b66118116118503ac3038a6b9e1c1011a080e90310d87a0c9a166f842104ccb68e3c0581313b6319a1fd23754db3f5c47de0697cf186ba451d428ddf8977ff9179485820c8c7fc473fcc8811f1e6b848c8c370d8d36700b13ada393f798e0e3c8d4bde1c9d6e189fb248393d322ea3dccb826f7a0b1a0b74875e1275c8b022601040c0e226370f2c1f093879091a7d3e8d0061c7c4f89a1c71c284f3ac7a63a05ca83d31f58bedfd6d8f6f8fea3f607502130313d7d9dbd7d9dfd03dd484a8d8c0c09f840ce6d5a7930ff83a910fcf785e180e6200f43604dca38387a4b48e681632e3eb01ec26210168f60016e69df087c4f81521985daa8e91ee1167ac740461d2dd032c7c16c700801d13f5a3f2dc375a08109801818aea16efac1b13a6ec296b17a3cd81153b250d10628191f6f84609bb1b10632c9f8383a312d63932d90d189e6e1f126c8c84433041a08c25122102c0bd409278c1b2ce0e3c0c43d08313434f50042cd4f04b065fa8adbe6c9bde1a7f7057070820d68fdccc61c1f9c4611981b60c12138ded17cafb6f57ed3fdb6e6078f5a1e75dc6f1704f9dd3ded7d7d3d4852237509ef0a3139d31f42f1cba2e0e012187df030ca219cc29826a3a8bdaf787e3866e5830f07914158205845c481188410010404070382f8204193631bbecc702030228c09c102b7d9502d27c3d5fd2335fd43d57d835578874a1819ad191dab856ac53bcacdc9949c3a750ad08c8ed45005e1c87035c8c047c8c478fdd878ddf844fdc464c3e464f3c44413040ba3534d23938d0c94d1492002569aa0516695c1a956b4373539d7eacf1e90302c6841188e996dd8fae1676d434f892a4023b038e48e4cb40d8eb637345735b6d4b6dcafbbf7b0017c3c7cf4a0bde321c7477727f181de008ca8203ea042c8f9a0f885321f0b6b8e8eded21770f0c810c001fd5184775ac09ace8152fa880592aec13226dd433037dcc79ee10a083e9220bd4188101c1c2ba335800322aa39982261ac104010212cb0b7e91077b81a64405b40fa872afb062bf00ead80f6c615191bad85e0238a77f028e8c9d13a6001748008f7ed602584eb841baa9a1cab9d18ad191b05257593130d90a9c9c6a74f9ac7a79ac7269b48af700b608594ca64f3c8540b09fc44b60c20080e213e881526fc6d5e0084df0a340aa76f04700c3e01556471a6f980ff01386a1bca2140a4a9b58653210fefb53dbaf7b8fd4167673b52c3e8ea42728ff10113c39c5316bc2c0c07970025cdd14706858380641e3844f900280407de410680607c6041400ca73c28e5d53d52dd3954290a47df383c8f692b230ac7c05803137e2284b0181ca9860c0c436d547281e858edc8701538c0ed420582687b2ce0fdd9782d95fc3c19ade672e4bdbd4fc76a3881c210f081775a181f135082d071b2014a6564bc0170102858061cc407c820c132b7520007f4c7c0640b6911d21f7c5c8400c2b7a35f3d84f0b5cbd053c0d1063880c88cbf22e063a21359f9ca9a6248755d715d634563735d736bcbfd07cd0fdbf064e436e20383fcc007d777c8b32fccf9c0a558180ece2115d814723c05c2e9068243484855f0e9214a48613055b1d002b0a812c8b4fe60f6652e2b039d012c6041686170a21ecec4e058cdc068f50b19ae1a1caa1c1eaa041334101eb7cbc860193793132098a8a3c4399404f4ea77e3b5348cf6fb89baa783e51c3d1375df4d367c3fd5f8c7274ddf3d6dc2f64f466aa7466b9f8ed7132b4fc6395d02e6487f0c4f3470b666a26168bc1e3eaf4091ccb8ae93cd8353cd03934d781f7cdac264f8ab7b2443cf5a216cfdc8d7f75f7c05b078320c63f48c7c9119cdf114116f67ef485b51d9d5f2aa3be55577ab6acbea1aab1a9a6a9b5b1beedd6f6a6b7bd0defe087ca0bf89e3a37f80f407290fca7c905bba4438a8f999162156182efce505e1407b80154141eff758c0994173601970e0ae253ef870f09d0f2c1310c4c4b45919ab05195c938cd772640c570d21853a58d13b503e3c5205320004c8c07187fb4ac6872a70c4ef9f357f0b4fa2bf64a4f30e64e8d18d4775675aca4fddabcc8134959e6cadc86e6f38dbfbe06a7fdbcd91eea2af466bc00743e4c9581d28011f5024d01f9c1699446853477cc0ca8c3f6d197b7a4f9081e01c55d2282063e8490b7140c22783cf8710347c3804cbe4c952a4c3690ec0d13df4e076d1c5a2d2eb774b6e9456dcadac29ada9abac6fac696ea9bf7fbf95f8407f139422ea2998f2a0e085298f978343e04e725e051f0e664198b7c157277ccf83290c219f833ef284d4068c4b2d91c1c296199b025f645ac8ab80111918afe394079647a0306a41c6c8781db0001c10e88ca1e1cad191ead1a1f2b1c172a88a6fa61ac00414c0d84049f7832b8d6559859762aee5075fc90dcc4f713911639319659593e8783ad5352fd9b920ddfd4ab6ff9df3918517a28aafc6d7dccd78d8706eb0e3ced4600540f9f64923e4abc9c629f822a375f05bc1076474a21e02442050667051c9caf0e1187e3a0b130c17521e7c80a6a18155120883632635c285b5c889750ddebf7efbecadc24bb70aafdc2db9c5f1515d565d5b51df50dddcdc38c3874079f4a0ce862b4c21e5c1f74c170d471f98e012180c8ec7bd77211dfd70424bba06e17bc27c4c0b5632a195d800b27838e0730884c3820fc74c4c8b10978383f5aabcf030108f8c70eec530d43bbc8ad16a688ba1c10a0e8b91eab1e18aa7e3b5df3d6d78325a39d871abe7e1d5a6caecdb17a2ce9cf0cc4ab04f0b374f093585a4869a6644589c8cb139156797156b7b22da1a0b79494eb9494ec0252bceee449c7d7e9afbadf3912d95393df7af8cf572ba047c7c3d590f2d32ce1da80a5a046400509c89c0c071f80a421844bc4d24a2ca43088b19cbd2c4b73e2f9619229c7f4a99b7475c6676aaabbdafe5d2b5bc6b37cf5dbb79e156e1b5a2d2dba5e5451555a535b5150d0d752d2d4de0039354a1471a750d302ee003c68545b6645c160787800c011cd3c1487b5f11c878d4538805e28368a08fb3c221e88fe56213be92105d23f8967348850428f48e4d338185179d6d339a838b4d10928c722d0185310c3e46aa382038ffb17a6abc6672a46a62b8f2e958d5e440695b7dc1dd2bd1f969ae9931d68921c649c1c66911662763ac7312eccf24395dccf0b896e50b399fe65690ec7c21ddfdf2712fc8b954d78234d7ec787bd093186404ed722ed3f36a5e40f1e5d8e68aecbe87d72607cac107fcd9d1818a91fe72eee8e3b593530d134f9a20b02fe8f5800ac1fbd0640364100b4f9a869f360f3de364f82b2889e9e5c1a74d034f1a85641644487f4cc72fd37c0c4e743cec6a28b870f2e295fc4b570baedd84feb8565874abaca2b8aabaacaeaea6a9a9a1b5b519593e3c41a6aba313c6050faa12551e8b8243d4150504c487101c426430bd22501b2f01c78c59a91618170e148283f8203dc1e783bb2f470147653ff4c4680d1218e45e20a000165f4f357c3559ffd544cd785ff183fa33b72f46e4a5baa4475926851825871a67465ae4263a80834bc7dd6f66fbde3d1d587e36bcf27c64e999d05b597eb74ff9979c0e29ce0fbe79d2f766b6ff750131a7a2ad4f44589c88b63a1e65951666961e6101bb73e77c7853f9a9d1aec26fc6eb800814090e0d4383b87762b21e11cdf814fc0fce0be177c9820c128605164086281cb452980f1e1cc8a54ecb44c7bdf6dabc828c82f3a7ce5fcabf7cedfcf55b976fddb95e5c5a585e515c535305e521302ef751e1d6f198332e9cf3c1531ed467bb283828290e990943383248a8f9f9020e8434c78c4d990e62853c0ca1c88534c74cb4c29c8f6a22635638c8c960707036454006d4fbc46815dc8bc9e1f2d1fee2deb66b8d15a7ae9c0ecc88b682ed381e637526d5e57ca6c78d1cdfbb0541c505c12567436a2e45b5dc4a7a549c01797837adf5561249fd9598f28290b202501278f584e79944fb822427d22b002525c4185ae754bcfd8513deb585e9ddf72ec3b7fdf3b3268195a981cf3b3a54c96547261bc0075408fc53f49d1222d3643c69820a9969fef9175e4437d3a050ca84cb99be80a3e55175566e72eee9ccd367c1c7198e8f9b57eedcbd595c72a7a2a28cf8c004029842f3711b675cc087a8f2582c1c023e383f5410a14c6321b430ab16e1391c8b8243c00a0b656781037cf0350797f49c81036a83dc4f32282003a60470f477deba5f77baf04a2c7c8bdc14817799e377f34c50f995a8aaabd1b537e21a6f2536dc4c68bc11db723be15171da83c254485b51fae3924c08b10269bc1e5f7725a6f44cf0f5e39e578e7bdcc24eb2fd618372e3ecf2939dc04746a4e5d9e39e706c6165863b6ec3be4c8d54010e0e53f8aa535c46048e0817bc3c9986034c70584c350e4c363023c2a7842912deca1ff2310307e36360bcbde961656656fcc9ec94ec3cf091033eae5cbb78f3f6b5c2bb374b4b8babaa2a04c6059ec7fd470fdbd0b948910bd21e94f3a0b0656138d055469d6a4c73300f54d4bd2025c18060de286c0ad57dcd885078f2838f945347bf1d158091f9a0cc29052670e510b5d21a04ab703228a50120a030b8db74b01c4d32315436da7b67a0e37a63f9f1a24b9105196e68c29bb97ea0a1a930b9fe5642c3b5b8fb85a9ed65273aca4e404fdcbf9302027a2bb3bbca4e3ebe93f6e8767a7f59ce58edd9d19a82c1aa5c08d63fbc935a77391a5a04a6a7ea4254e9b9f03b7981d732dc2fa7b99e4b74c88fb7cd89b585e372e9944fc5f5b8aefb97877a0a9f8d57c3ae3d9940a03b1deb52fcc2791e0c0bb8204f9afa9e3642f87e06b32fb420303dd3f98f81275c8e04ef0353ad826e1a521b6d9c4c7434dc2f4f3f119b7122e1546ec69973d967cee542795cbb7ee9d6ed6bc5c5776794073c8f564e793c7e0ce5c12c0bc216ea7059180e2e3d3ae3909259a126e7fba144099f094609ad7c2938588120bf428c32a7840b23830b4c66c8e81faee8ef2b051fe32395a3036530255323151df7ce97de4ab8961f70b320b8f84258cdf5d896c29487a599f78bd39b6e27b5de496c2b4a6d2fcde8289b560fdde55983b5f9dd95273b4b4f40fa2af3466a0b46ebce0cd79f1969388daffaaa72b01e4a0502b06a2f47c3d0dc39e55b98ed77f3a4f7e54cf7b3a94e3909b6a7539ca19c8aaec73657e5800fd817383d4884c0b84c09b220f03ce09972e1b7000b483f3ecee2818a9a9859cc8a101cfd638f6b9a8b93d3235333628f67a5e49e3e917b3a8b531e572fdcbc75b5a8a8b0bcbc14caa3bebebeb9b999531e8f1e4179608027b32c2f010705b14c73302c18250c0ea654f87060e5fc70b0d2d11977649a03f23aa95b8ef5df326204d6a41af90c78a020a367a01421ebc04009725c1323e5c3bd77db9ace5415a6202a692dcf6c2e4e6bbc9304f371ef4eca83a294fb779361411ec088dc4ded28c9e82a3b0ee9a938d95f9d3d5497d757930de9adcee9abc91da8cb1f6e2c986c3dfff4c1a5899673634d0583b5b9bd9559d8b8abe2c40368a02b519505c13517c3ab2f84959c0e82adb97cc2e34286ebc5131ee74e78dd38175a5f72a2efd1f5c9e14af81f4f26ea9fc1339da81f9b84675acf253f261be076c0f9e0581181036b441c91d97c8e1f86b280a3b2a1303e393429352afd7862564efaa9dce305e7f32e5d3e07e571e7cead9292a2caca72ccbf0bcb02e501b71461cb74c254605928e1b128cd313f1c2c8e65ce2991c14f7e88288f1fd8115e5d31d7e1c294046e2c3e1fccca70371ce781727d2582a8b56a60b0bcafbf7464a46278a07474b064a4afe841437ed1d598f2eb710f6b723aea721f559e6cbd9b7caf3009aae271493a1ab5e566fcc35bf11d45293d15c7fbabb380c5404dce401d68c8edafe516fa6bf37aaa4049ee68e3d9a97b1700c793fb17410954c850750e2735a77acb33dbef26b7de887f78877bafbb1c597531acfc5c70d199200894c7c5933e57728f55de4e454e052e08675fe0a28e7159548167da44557d24f03c38e7e38788303866d6379341e1673b04a1ec741c8b24187c8eb2da5b31094109c91129e971501e27b333f20bb22f5c2c80f2b875eb062c0b940726fc474723b9a594f3108a591686033ec75c668511306b78b2043898e620f5408e27690ebeff016d016b42ee27f29e80033d26434365c303c593a315084c1e3517d416a73714a7b7d5e474379e7e509206692b498392e8c07b514a1bd4c6cdb8f6bb8968dde1daecc1da6cc02160221f02f331d25030d27476a8feec70c3b989960b53cd17261a39b501e5c16991d60b4fef9d7bda7276b436a7b734a3a72ca3afe23876db723da6e96a0c74c9b42239177e33e7d885e39e57738e21a9dafff8067af280083af0e09f725dff4f9ae099920b822cc8341cf04c79ce29531e8b87033e4751e5b5f068bfd884d084e4a8b4cc84e3596939f927cf9d3f0de571e3c6b5bb77ef08dcd22a6659b89856c4b22c0cc75c3e07190b2240c8335d9ae6e0a7cfa7e118a9415eab77a88a64ba2043e067406da0737570a802704061c0cf406c3236540a32ba1f5e6aadce7e5c9737fcf0d2d0bdf36d65c7071bf33bcb336044eedf887d742be1f1ed44bcb7dd8ced2d4d1bacce1aa9cb81cee8a9caeaadc91d6c3833dc747ef2de95af1eddfca6b3f0ebaebb102c3c79706dacf10274099c0f2032d57c0e703c6b3d37d1903f529935547562b8fa545f19a7451edd4904764d57a31a2e4721b4a9b818712b37e06cba1bd26525d71290a7ff66bce69b278df03f6004b98212645105fd735c2fbf407f70644c36f44f09072f8b84834b924e76de29bb1c12e11d1d171c97c8298fcc93a9d97927ce14e442795cbb7665c6b254d6d5d5c1b2e081cb9410e307b4703b168683fa6367f539168483298f05cd0abfb7e585e3c98383c8c0bb60a18a531b235c7709c21324c52182f0a4a4a7edf2c3fafc8e86d3fdad17069bcf7657654361f4549d78049b723de6e18db8eebb49bdc52978efb81ddf5f7e1c648c37e60fd7e70fd69f1e817a68bb36d57ef3bbfef23f0f57ff65a2f1f954f3f3c9a63f8fd67f3f50f14d77c9938757a61e5c8622196d3c33567f7ab2f1f49386d3937579e3b5a726eab287ab4ff697670091cebb29e00387bb771bc62b11b993eba7fc72121c90902dbb9104fb02fd01e38204dd103a7d90d747fffe040adf05f18b20734a7c100dfcf88592605c84221096e710724801c7cde20b0121ee913181d171f03c62324ea4c0edc83f9d7df65cfe952b976059046e693926248265a19885b91d2c55ba301ca8fea2f22dc84c77eb74a69c462889e6ce99e678293878d9306e2093204cada534065f080e9031385a85ae93d1d14af4a58df497a28b15816bcf834b9d4d67bb9a0adaab4f71be67613254c2c33b8910dcd63d45c9c0a2eb76424f61527f71ea60e54990017f62f2fea5a98757beee2efce320b0a804167f996c7afeecfef36f1e3efffac19f9fb40a28697e3e51f77cb4facf7d455f81a1e673534d67a7eaf3c76b729e34e64180c848d589818accaea2d436383437e2da0ab99409829afa1b89d772fcb3131c0a4e7aa1df6ea8b390ab10f8aa15c12d7a04055520185fb3001cfc0c298363d650163ec7d53b057e812e6191fe11d141f149085b124f9c4acfcdcb2a389b77e9d2055896c2c2db656565703b6059668563519a83ab1bed41044bc5c354c631dd99220a81684c4bd68784c6b7e19ddfa582e5be51a0303dd68d54087de4a90a8c61c170a9d29ec172ea851754f8c1b343c54d15b21ab026e8fd1aefbad5db7abead2aabade2c463380165999c875192d609208aa13092fb8a927b0a133b6fc5038e81928cd1fa5c0e0ed8880757be6abff5556fe9b763757f7adafae7afdafffc4dd7f3ef7a207ff9b6fbcfdf74fce59bc7cfbf7df4e76fee3d7fd2f87cb0fcfbc7379fddbb38d55200b3028332599ff3a43e77a2266ba43c6308a6aa340de475152676e1d0a5e9380d44469c7f7ac21bf62537d9b1e2561afafdfff8550b7ae9e02da1977f7882ab31807da1f7b1672d086104c6a509fdf542da82f5e64ff7d2096ac390e41898b83f30f19093f1f67357b3014750a877546c48546c586a7a525a46f2a95327cf9cc9bf78f13c2c0be0c0b43398cb1b9a83025a643b900a43408b3c3a052c0b6b0e6efcc14c89f93c708886274c6d101673c1011484e07811bcccb81a0215029fa3927a4fd0cfc9d5725251d64815521a48578ff6dced6e39f7b03a1b51ebbd92f447a5c86fa63e2e4ae9443b8189220e8efee2945eb4d9ed84debbc983a599e3f5796375b9e30d67a6ee5dfaaab3f05bd40e3e69f9cb376dcfbfed83fce5bb7e8160018874fee55b1073ef2f13f57fea2bf9b6ed3a7c52c0813d8c569d1aad3e395a798263a22879a03865a42273041150695a77693a8ede5698d2743db6f25264c9b9f0cb593e59b13679e91ef52559e8a5432fff24c25a416901ee84e9caa071ae670ec12dc101dd807748df642384d6889a150119f7fbc71f7032f6b8e072966f807340b0273447447448726a02f8c8ca3a71fa74de850be766dc8e12c0413e29dc8ee94eda9782032309181cccac9029e16b0e212dc2676541388442d9175a64b0127ea8c0a6545126944364104ea8c0a0201f3a58867c1757a4d35dd8d776e57e6516c840f613512b4256f8198820a0e4614a0007d4061a0f70f4dc4eec2b4a011c6375f91084214f1f5eff7ea08cb31ddf3d7efea7aee7df0f43fefcfd08c9f3ef073844beed7efecdfde7e3f57fea29fee6e135688e27ad67a139c6aab3276a4e010e60819de310c365e9c3e599039cc64ae9284c6ebb95d47c2db6f15a5cddf5b8c2fc20f4c5c407199fcbf2bb5f5700e7e3eba7cd086bb96e7dae8a912b53822056e7d21e9ce7c1314164f44e34303e680d21d23fd92228670719f7181cb9e732bcfc1cfc02dc42238e8547052726c7a5a4259e3c793c3f3ff7fcf9b3703b6edfbe89e7265754208f3eed933238900a43f7fda2348768283bab5999e9779df64244e160c3a685cc0a33227c446819892ff23058772b2294aede92debe126863b81a833d45e837197c7cb3f7dec5b6dabca6a2749041a94f241e1038b4df490219dd7712bbef24a0e53832b07027a9ff2e07c770c5a9f19ad30853bfed287c3e5afbfceb87cfffd8f5973ff5704c7c37f6a7efc739f976ec4fdf0d438570eae4eb07cfc7eabe4708f3e02a34c793e60278a36355a7c6abb346cb8f0f96a4d221c007f68f8376dc4aecbc9d8473b87f3dbef14a2c7aefd0bb8b1ebbf800a3e430f3aba7431eb55e9a18ae86f240580b3850130fb302fd41313ce040c147ff0407015f73902279a15466e0e06b8eacd3291e3e76bec75c83427d432302e31363a03c8e1fcfc8cbcb3977aee0f2e58b029fb4086e074b8509c1811e96459915a13c0783833913422a44a86f45243dfac2e7a03263512cd81a581c900187035870655d80a6af842bde19ad44beabfbd1b5c7cde71fd79f7e5895d35c721c9d675cffd9f5f896eb5cb0f0e07aece39bb1f030ba6f2574df8eef8335b915cfc99da481a254c031507a62ac3aff69f3c56fdaeffc69b0e62f4feefff9bbce3ffeb1e74fdf8efef9bbf13f7f3ff5e7ef9ffee9db893f7f33f2fcdbfee7dff73e873b3258f575dbcd272d17e18dc2a670716c49665f6132277793faef24724701227792a09fba6e27750af868bb99d87429aafa4244715ec095740f9483847b6a818fc22bf1dd8f6e206d8a9c3a97c71bac8273ca253cc6eab85e24102328356596e5074c308b238083fa5698cf919993e0e665e3e3ef1210ec0d38e212a2014766667a4ecea98282d3f0496fdebc8e6a7bb81d08581a1b1b294f8a540745b354f8b3283866faeb517d4ec355667148e7322b58cffc50d6f1c61c522138660765a80270089cd06a08c2d70954668c54f675deb9d770a6ae24a3ee4e6afd9d94da5b49c82bd45f8d6db81add7c39baf54ad4c32bd1edd7623a11bede88ebb92990ebb1781f284ce6e028ce182c3b39519bfface5d2578f6e7ddb5bf1c78916ceb7f8531f540534c7f33f3ef9cbf753cfbf1d7ffecd30a736e0a28e35feb1a7ecabfbd7261bce8dd79f862b0ac2faefa6755c8fedbac96107324840060488008ef69bc8a924b65e8dadbb1855821eff0c4f949945796b45f9e89ecef46aa93b83b016c60531394ae4b9f10d33707065d20238847c8e593507c8100c8fe33adee090a69e8c71f1b0f2f6733e16e415121e1013179994129f91914670c02715042c858083e5499708c74c92e30770a0839e5f02f8cae1202f95c3056a63a40a812b9709a5420dccbdd157fce8fec5bad21365d7e24a2e45575c8aaebc1c537b290a5da6c83e355f8aba772912703cbe1add792da6e36a7497403aaf44755f8be9bb9d08b58f461d2a3f3159771a707cdd76ebbbde8abf4cb63effaefbf99ffa9f7f37f4fc3b688bf1e7df4e3eff0e700c3effaae3f9d3077f1eacf9b6bde849cbe5f1ba82d1dabc818a13fdc5e90377524106f8ebba1ec3c1773db6fb06248e83f256029c5f688e47b738cbd27c2d1eddb957d3512b64033ee2030cd222ada03cfabb0abf7ad204c1c03b680e08cfed805bfac21b25ff43088ebe8966680e963e27381233229cdd2d01877fa027e0888a094f488a051cd9d95914b088c2813c18690e540d2e567370132b4c2739383804a39838cdc12a02451111ea9e6533b430fb32abe6e007b1c0823328a3c89a737070ceda288a842b0607ca61539029efeeb8d5d270baea6e7a090cf98588d2f311e51722abce87d75e886cb810d17431f2dec5888797221e5f8e6cbf14f9f86244fb254e1e5f0cefb81cd983bb9c53fbc90308586a7260566029beef2b7f3e798f530f301fdf0f425bfce5eb91e75f8f71887cddfffc69db9fc69bbeed297ffae0d678c3f9d19ad34355d95ce2bc30a5ef56323868bf12d57631ecd18530ee405722f1115c42e079f415a7c32d7d08e5712311677835c33d27d6ee74a253728849848f4e4eba7b73ed69c45cdf7d8dd1fadc681794ad736ea9a04f8e7348c7b99865d66805e6867351057090e6407a1470205a894f0b7372b3f0f275f20bf0080e3b16191d06b7634138f879b0459915ccc4c2cc0aab0463f98c594bc2845c107e10cb9fcd679ef20ee673d05028ccd7d38774487f31b0e032e5c3956d2d172b0bd38aaec4159e0b2f3e1b8eba8ab2f31125b9fe75e7c2a0369ace85369d0d79703112703cba10de763e144c745e8c6c2b08797436b4eb6a0cf8804619284a1faf3cf5b4bee059e3a56f1e15fe65b8e1f9d3477ff9bae3bbaf07fef2edf05fbe1dfccb57f033ba9f3f697f3ed2fa7d6fcdb30737a69a2f0d559fee2bcdea2bce844bf1f86a6cfb35e88cd84797221e9c0db95f10ccbd9f0bb9773ef4c1c5f0b6cbd140102aaaf366f2e31b89e0a3fe5234dc8eb3292e67929cd3c3cd433d3513e1795c4fec7a7403612d8db5e4ba05466a91ede0fa1d271a3987146e07f407967971aca843ca7c8ebed1473149218eaee6ee5ef6d01cc7827c22634263e3a3d2d25290eaa068f6faf5ab77eedc41c0423d2ce87ee367d0a13990ea58d8e76070f0bbec191c54542c542ff8aae0981909c74de604380651bc33caf5a10c74df6da8ca4565d7adb3e137f283d0b9753b37a03027a0a620849333c175a7039bcf853e3c1f81766a3d1dd894ebd77a3a00583c3e17063ed07e6d17c37173a3e5068b8f8f947331cbd396abb02ccf275a9f3f697bfeacfbf9d7c0a2f3f964db5fc6ef3d1f69fa536fe5d78f0a41c658fd395400f5dccdecba93fae86afcbdf3e1908717c25ace0436e6f8d59ff269c8f66dca3fd67236f8fe85b08797a23aaec783a1ae5b298f6f73ca03314be5b930f4b64073a0a83d21d82426d0283fcbafb1261f610b8aa2296ce1ec8b000eaa50e7c3c1cf7c4cab9389e6fef156ca73c02145340b38a21383090e680e82033e29e060a98e570607ab219d199032ed9352b683c121da65cfaa47f93e296f12302e5b4a91ad904de177b5f422af0a192c1b1ea90019486c20022cb99d7c392fe8728effd56c7f9489a3fa17c5c06539fee5b9c7aa4f07d59f096a3a13dc729abb8fdbce87b5e407b4e4f8dfcbe3f8001c4db9fecdb9811c3a17a21e5e8a69bf96d0732763b0226faaf52a0cc7f391fae7a3cdcfc75b9f8fb53c1f6af84b7ff5f79d254fee5d1dad3b0b9dd15f91db5978bcfd66cae36b09f72e4435e40742eab3fd6b4efa54657892549ff0aecb3dd65c10d27236b4f55c185c1f688ecebb69ed8528154845bd59d595d873a96e67d3dd4fa77b4073a4c6d8ddbd91d4df55343c54c58d76c1880a781e702f90fc184727bec02715a810bec3f1c2d608e04092831fca46c40538b898b979229a759f078e9292921fab39c8e7600321858a8a671d88f0c3e12a2f12e73f9c218ec131bd01e366dafa204e1190d13d583a30583a36c6f5b1f5b4dfaa29cbba7636eccc716f14f4221378f58437e0402d56e171cfd253be3579810d6782d036f7cfc20908276bd270d2bb36d3a3e5941f10693ae55f9fe5d79413509f1b52971bd8783a0494b45f4fee2e3a39527316883cbd77fbab07855f3f421fca9d6770329a2ef563c4dbedb48e3b998f6fa5dfbf1cd77c3eaaa9200cbfad3ce95b79d2bb2ccd0d5291e65e99ee81f78a0c0facaccdf1afcf0ba8cb0fc0960faec4b6df49e92a3ede559185bec0a6db2977f2830bcf86dd391b9195e49c14697de174c8c396cb18d18f22532e9b3e86e17af58866a787fecec0c1774859720c3e87281ca1d17e04878fbf5b40b0ef5c9ae3af00072b465fa4e6608e481fccc728d25fd4ff52d6878906a15a907d4795d770f9e4642d7ad7ee379fbd7339e6ec49df3cdc7c191e97323d9139b879c20bb57a25593ee539fe5539c7d024f72f44745f8defb81cf5e0745073b65f75ba5b459253558a4b5d86576da6578de016afcd0eaace0aa8c93ed6901fdc5c10d67c36f2fea584f61b698f6f9f68bf73b2bde85467490ee4f1dd130f6ea4345d8abb7729b6e542746d7e48f909bfb2e3de25e91e77535c3949742c4a722a4b712d4f75c37b69aa6b59a64755964ffde9404ef2839bce853fb89688125474fa0fd49feea93bdd567eaaf16e7ad1856844b3d01cd938a5f21c0e0ef4dd8f625016972ae54add688c27a98d092e7dce97b9cc0a1cd2a0086f7b6753c0e1ede70a3890418759494d4d16322baf060efe106a7e51a068a5a0508d0f654e492588cc2d39bd46489db02d51fc07570306a56fa87464b412c3407a3a6ed4949d804141f7444eb253419adb058c374975437c7823c3a330d3a3e2941f34076e59a88dcecbb15d97a21e9e0986daa8cbf0a84973ab4a01222e65094ea5894e2549ce55c7fd2a327c2a33bdab4ff9d7e60480959a9c90babcb0eafcf0cabc084ece44d59c8bad3f17577736baae20b2ee74685d5e48d971dfdb49aeb7135c6e2538de88b387dc8ab5bf1de75018e7382d094ec5d022277d6b72fd6b7303ebf2821a0a42ef5f4d4081ea28fa721f5efbaeaff869e79df6dafce28b3117b2fc4e24b964a57b94dece18e82f4791183c0f243c10b37003b4c605d38dccb8a54486701e5dc4e7001cfe21ee80033e07e0080cf1e3c3810c3a7348010775cc2ed121e5266f99195fcfefb2e723c22c0bab21e59b15d6f6a21010077c2f848f11c18177a80d41096031a736aec5c1a0e424bba0073c3fd9f96cb2f3a564d7cb189796e07029cef66eba7b65961feedaaae35e75277d5b738f3dc80b6c3ae903382a935d2b129c8b63ed0ba36c0a636c8be31d4a92dc8b13dd8a935d4b333c2b00ca71bfb20cbf9234dfa2749fc254af9b299eb7d3bcef66fa9564fa971ef72fe3c4b734d307645c8db2bb1269cbbd47595f8db6b916690db911697333ca167223da16dc14a5ba15a77b40ca4ff8d4e607355f8c410f3eeacabee9bcf31cf53edd457d8de76a6ea5de2c083b7dc237efa4efddeb293dddc5982984f3394638cb427070ca830707c82099c7acc021f50974011c1ede0e802328d41fdd2b88564873bc16389044170a65f9310b2d939e10322b0bc241a64454bb7005e5c3154899c3154510dbd379b3aeead4a582909c54378c56c568c4dc38fb33898e17939d2e263a16445a5d8cb2ba126b7b33c1f176a2c39d78fbc238fb9204fbca64e77a5461c5d9dd0ab580dc0eb3bc156e793bcaba28cebe28c1157237d1b930d9a538d5b338d5fb4ea2c7f51867ece17a9ce3d53887ebf12e37135c6fc4bb5c8bb6070a3713f09533b0381f6201b9186605b9126e7d29d4fc4ab8e5f5086b8e8c489bab115680e67aacddf5387b48618a6b6576400db4cec5a8ceb2534f1fddf8e340e970cba59efa827be5d92557e22ee4069dcd0dbc7d25b1bbab88ca4b31c5147c52aeb61eb3e3fd5073f0e1202dd23bded437d622e875e33adefac6ee030eef00e73702472f4a85a7677f9b99af677a88db5cbdb27385b2a21a82cf0447d5f0b4674ade86c0a09477f5dd85378aac6847db95db57630bb27c4fc470e39bb3a2acb322acf2a26dcec7395e8875001c97a36cafc6d85f8bb145dbd0ad7c3bd2f666b835f4c48d708b6ba16637c32c40c68d50732cdc8db62d8a752c8cb6bf156d773bc6117223d2ee5ab80d27d18ed7639c2058b812ed7031c2b620d822ef98c9b960f3b3416667024c4e1f33cef737c27b41a029565e09b5b8106c0a4470d08be11667028d201770c4580740762bd9b5e8b84f594e40595e48e3d584beea7c941ec2acdc2fcfaabc9e547c35f15c76c0e9ac805b9713eedfbbcacd133451dfdd538c4e381a7b8d21f97d5cc2039db4d331cb0bb531d10c6f944b82bde87b7bd83fd6d637f2d8c3cfc1de693a94e51cd2e830688ef4f45474cc22cf41251dc873207d8e6885ca8c452b0517ce7360daa7a5c1c11feb36abed108a69b9a2c391e909af090e6445a1367a068a615690e1686d3c732e2f2023defe78b42d86c09f8cb43a1e6a9e1562961b66991f6699136c52106c762ed4e27ca819e46288d9a560b32b416697034daf049b5c0a34ba1c647c3d84e383e00025d7432daf069b739b855a5d0eb1bc18647e3ec0145210680e391b64417226c02cd7d7e8a4975eb6b75e96a7ce0977ade36e9a783fe5a59be7670844ce07999d0b34c5fba5504be082f5d82cd7dff042b815f8001c85195ea5d9c7aa0a225a6fa6f456e58d3fb836f9f8e6c3caec924bb157f243f38ffb9ccb0d29bc91d2d8701e9a03700c200b2cc89352b4023244e1e0d4067486008efe99804550ccd1d63fdaeeee6b0f3828942538e090f2e1a03cc7eb82631eb53157b43297e660a952c041db101c4363d502b7a37474ac6a78b8bcb6322be7b86752a46546a43546301f0fb7480f32c90c303a11609c15607cd24f3fdb97935c5f833c7ffd7c5fbd3c2f9dd39e3a67bc74490abcf5cefb1a5c3a667c25d0f46a901904e85c0a30b9e06f74ee98c9597fe333be86a77d0c2017822ccf075a9c0b303f7bccec8c9f49ae97c17137ed3427753091eeac96e2a09c6caf94e6a40a3e800bf8001967034c0007f40a3e627d869bc6094f6dc07a2ddef14eaafbed348f92530135e7a200c7e3d293bd750503cd175a8a4fde2e083f9de9939be175e94cc4ed6b4975b5054383955caa63b41e3e0797449f7648e784037c4044e170f3b123cd8150160e29a5cf45e14097fdac9a83e6fa7909cd41937308647abe8d798a7d84f21cf31814169b70e1ebe8cc24f982f406d446ff401912a3b0297ddd8545b793b2525c52a3ac8f47da008ecc30f3b440e38c6386c78f199df0373ceea37bd24b074d82bb16f76eb6a7d629378d5c374df0012c201c229e3a67bdf5c007c1711137bd9f21be3aeda997e3a193edae4d92efad9fe7a597eba9cbbd7beb9df2d03eeea29e011a5c35f09e6aaf04c1c24937cd1c280f1f7dc0419a036a03689ef4d0c6699cf2d13b13c2c17123d9f546aac76d38b3f921d5e7a31aae25b4166542ca2ec55dca3e9695e47a22c9ed6c4ef0a5b39180a3bfaf8c1bf28499ab466a0746b8f95e383e04853ffc80763a6099312b7c3806c61f0d8c75387b5a131c14ad3038e09052c71b690e82035df6a2d1caeb82835f57cceacee77738c8ee08c181de79c041a1ca83d68b7045d3626dd3a26db262ec01477a88697a8011e0c8f437ccf0d14bf3d044931cf7d0c28d8be6418be678680108343fd4037100cd71d1df0858dc08b5bc1966058b83afcef91a9cf1d2cf737f0107964fb96965b96ad2fb0967f50c07957447954c6735bca7392843b09ce5ae05740047c13163680ef8227044727cf481458e9f417e8031e03817697d29d6f16a92eb8d74af9bc77dee641fc3cc0e5557e24acf475f3d159097820ca96554b079668a7b5ed6b18af21c2e6019e3340737f1e130e77070038305664534db811a3008332b943ec7fce880c3c1cdc2c1d982452b8003bdb2d01c7c38d065ff63e1e01eaa32583153804eb347be9cb08eb779cc0a674a462b7bc6a63360941845372c4a60e06d205469a8cecbcff20119c7e31d4ec53aa0cb3b39c030c54f3fd5572fdd5b37c54d33c14919ca3cd39df306a0ffd17250006082dc0ee2e0728009c8b8166c7e3dc4027223cc0a820dcefb19333e4043ae9b3680c874542549b7574eb555246d41024542649cf633041624703e605338a376cce87420e700e5079a9d0eb53c1b657b31c1f96a9ac7e534771473dcce09bc7b26f47a4e5041bae7f11887102f1d4f27d5e830cbac0c9f5b37533b3b8a080ecc96cccdb13c1dcace070787c84caa43308a9a83c3d6d9147078fa387af9baa05736222a940f078a7da039080ee43998e678e9621feed1193343136626f85a0a1cf3f8a4f4d52c700c940ff4739d6d43fd25d56559d9991eb02927e31d38cd116e019b02cdc1f91c9c4dd1cff4d6c986d310c8451368a433fe46f0316f47dadf8972b8156143be27314136050b501eb7236c10ce5c0bb1ba14c02152e06d90efa10b3ea02ad2ec948005078723a7360004b4052c0bac09a796bc7441064cc9e530ab0bc1e68859705c90413a0370e03d1b6b82cc4e875b9d8db1bf98e4723ec9f96c92cbe50c4c12e47b3ec33b2bce2129c4c2cf55cdc95a2ed0d72025def9dad5e49eee524c7c2bc87334620e42418694332b0858b8be7b5e0f0b97e7985b73583b1a3bba58a2cbfef5c28168e565e1a0f241a660f8e31266551e73c10132088e81dea2f2a24c381ce8a642814c769c23ea6510c7664758e547581744da9c43ee21cae62a22d224f7c224b71bb18eb7621d4b933d6ad27dabd37c2a533c8ae39c10d602855be1d69cce08b5bc13695b1865571aef5c91ec5e91ec495296e85e1ce77227d6e96a9835bc54b8a880801c0e22030a23db53072ba136c0df45a016617331d8ea5cb025829a1c1f43008aa037d7dff8a4b7fe493fc31c782121e688a74e47dbe645db6647d9e4c5dae72738e7c43ba5849a47f91af8baa83bdbc8fb7a6847e0acaea70e0e543dc1a483c3b504074de4cde0001ffcc230b2299ccca43a9859b1b4372438e073a0d8079a831c52322bf3680e1a6bbfd8621f6448d9a4f78298969b198cc52342332cf087a8f08a02a7c7ad08f91f2c9bce2258a083de79ae831e0bc315c87da18603fd6df046efde4880c3810eee8c58bb9c58875391b627c32d7323accfc1a227badd4af52accf02dc9f0451e93729d9599bed5997e35c7fd2168f5927857a81028925b1176b7c3ed0a231d8aa29d8a639c2b123d2a933ccb13dc8145658a17488294a77a21730a4490f9407c9b0f7de0a50b011910521b7035a039e06dc01545dc9bef0fb3620a384ef918808f2c6ffd6c3f23c071ea1817499d08303911649a15667132dc1a92116e95196593186c1ee8aee966abe0682567632e1d1e6c5e569a333a5207b3420e293725f708d76b4f5368622645521e2f7af0d1192b88639104eb1d6dee1d6d41060c0e69cfc07d5b81e670f5b0f73de6890c293ade129263a89e83e06035a44265824b8183f72c841fc0c1ef5aa3de32a627160f07ab1063412c65c090fb1a1c2c85e678d07ce15c5e1082d8a4708bec14d7ec18fb53d176d01c3991d6e7e39c6ea478161df72fcf0eae3ac5758ed46687549d3c06383849f7a948f346c317c53a030e12200238ee4639020e60519ee4010119b5197e8d270321e0a9f6c431281e24c4609bb8e41834539019b4055142de06340710012b797ec6c0027c101c397e46c73d75a139b2fc8d20b07a197e8619c78c32028d53034c92fd8d92024d52c32ce2024cfc5d341c2d8e5a1a1d32d13f10e06b50535d3081e9f747eb61560686b929dbf1980036d12a1f8e69fbc28343c0070707f21c80c3c6c148140e688e570c078a7da8fa7c66a27b6138f83488923153b1316d6858271cbf1fee45af2c254605644010c4f6a3faabbfa4b9ee4c414e4032eeb63073680e909117ef743adef95ca2f38d74efe2930195b9a135a7236a7343ebf3c3f15e71fc5879ba37a40cdc24b816c639df8a86e761472e08de6f8623736a7b37c6094604e840b5c000d5670536e786b6e687df3b1dd19217d6702a08ba0788702a24da1e7c702189bf111409040a83bc0dacc9f636c842302c208324cd5533d54523dd5327cd4b27d5533bd95327d5573fd5cf28c1473fc6433bca4b27ee9871b49fa19fb3ba9da99489ee7e03ed3d01be460df517263157e970edd010a64fad4328cbe664e66b8ee91e5a6891d9e0e81b7d8807ce010e27572b374f07680eae4c50a0390007d5900a559fd37059141873334fbe94596170cce4496781834f00aff8efc53c4f422322f9dd28cc5185434a0685c18172e2bebe22c0d1da70f6f429fff8308bf810f3cc68fbb329ee97327d2ea47a5e4cf6b879dcb7383ba80c6a232fac2e3fbc41804879a67f499a4f45ba1ff8284e76bf11e1702dcc0e723d1c66c5e10696436cae065b17463bdf8d71b91be75696ec5d95ee5f7f32b8293bac352ff25e7e14e4fee968bc57671cbb15e37c25ccf65a84fde5501b085264488e214586445981bf698ea73ee038e9a1cb21026de1ad7fc24b2fc5593dc95135c9453dd1553dc1593dde5523c1432bc15337ca4d33d45935c8492dd45d2bc45dcbcb5ed9d6e430e030d2dd171a68ded27ce50966d1872919aa1b1ca9e71e3ec79bcd1d36e5854f8aee7b1138fac65a051d2b0f3b7a9a0187b39bf58270205ae10f4d786938f01448d21c8b8163563284cc8d501f1b531be46d3032b8d22fc154e5986dadb6223b35de213ac8e464a2cbd5dc909b792177cf845f3dee7721c9fd66a63fe0283d1504b3527e32b0ec4440719aef2d7821f1ae85491e45891e77e25cc1c4d5505b08217225c4e672b035e0003490dbd1ce25899ee569be9519fe352702eb4f85d41e0f6cce096fca0dc79ae2244fda09e0402afd6298cde5083bbc535a1d06054c4067000e0e0b58132f3d1814d21cc9ae1a496e1a2023c6452dca593dcc4935c84ed1d74ac6cf56d1cf5ec9db56c1d54aceca40d2487baf91ce81f060cbfbf7ae7ffdac6d7cbc7964a4019a03790ec1a3cda693e87c38a6977fa839088ede91078f3a1baced0d5ddc6ddcbd1c497360b82c34071518d3d004f2395e0d1c645304f3b8096b0ebe6f31171c8c0f7e402bf443e80ca63650dd033850688e01b1980db8e8561a6ccaa964b73be7a28b2fc5df3e1d567e31b6302ff4e68963e5a723eb2ec457e58757e486c22dbd99e87e25c6e952843de44a242757c3ed20b8e32f855883898b819617022c209782ac200834a015a01b0ae3ddee26b897247bc124551f0fa8ca3c86eefbd2745f7cac3c1180853b89ee97c26d4106decf8758c1fd041978479c72ca4b3fd31df9379d0c37ad74372d381c8023c35d3bd95d33c95533ce453dca4925cc5e1964f85bc97a991df5b196f7b49275359771303d62ae7b404f7d97bee6deb0208b7b2d37be7afa90c1019f034fc2c3d3a8487f88c2013f838b53a6431590310dc7c3f6bac5c381116f6c50d352340773381603073f1dce674528a0e57fc50d7c12d47d717008bc0dea8fa5271cf4f714a3dfe12492d067232baea75c41a6f9c4b1e282e85bb9c1d7e113e485571544179f0c2acc3c7635defd628ce379345eb8ed853034a1f5b9602bdce2e7032dcf05589cf133cdf336caf6d0cf76d3cbf3343ceb6796ef638c35587f29c4e652385addee46ac0bea39aab382f17e37c5bbf264505d6e38a43e2fa2f17454d3e9287c5594e28d6e7dec39c7c7e8949741aeaf71969741a69b0e24d54923c55923cd552bd54533cd4327d94d0b3625da5125dc5e31d44e0970f859c97b9a4abb9b493b9b1c76303a6c677cd8547b9fb6ca4e1db5dd80a3b5f9fab3270f46471b6156049a837b4e99e0f153c270705561b0327042058f361374d97365a4a4391e3caeb5b23370f5b0f5f07682e6e0c6adc486c52745f3073531cdc1e0101a48fd124313e6d71c5ce6fb87932c88aa90f9e180352138664abfb8f4283744a51f651c852884c94ef3ba7626fcee85d8d3695ee7d27daee7849c4bf53811667526daf17c9c4b01747ea4437eb0f5297fb32c1fc31c7f935c3f13b4d909775d0808c8f134c872d3cd74d24cb5534db55139eea899e3ae7fc245fbb8b3d62977749e211045cf88c51584b829dea519fee5c703f05e98ec854a9fa6b3311d37337aef668d94e577df3ade7639b9f55c5cf5a9901b71aee742accf045ae4f81a9ff4d487a4bb68111c492e1a8023c55d1b7044da2b85da2886d82a7236c552cec3e488bdde011bdd7d367a12d606078d35f7682aedd056dd05b3d2f6e00ecccad85813e0e81fe49e52480fb1a3624116ad3087940b5f6783e3fea31a06875f0037e26d09702c6a2035f73cc7174ff3a3c72ebd980f8e8da0e70d58129a7294eacb7f3045c774011805266cd20e81fe407a8306b771937d0d9462645b4b7d41416e6062b40d6a2d33621dd0197132d6313dc226e1984994bb4e98bd6a88b552b4834692bb7e8abb6e9ca37a94b552ac9d6ab29326da89bb951dd5d31cb5521d3413ac55a2cde4234d64f18e65ac8cb7528eb3544ab0554d75d24a77d1497785d3609ceb6f793ed2f962b42bf4505166407d416ccbc5a47b97531edec8e82dce1dabb930525d305496375c9effe85a2a5c9cdbc99e306179fea6c73df532dc7540468a1b2789ceeae99eba8023dc5621d84a3ed04aced7e2a8bbb1948b81a499da6e0b8d3de69a7bcdb5f71ba889abc96f85e6001cadad37befaaa6d6aea1e72e77d831818ccf9a4703bd8d342888f695332de440f45c4c79954470bd406a4e95e3939a4488ffaf87b60ac6c4c7c045f73b068850652935959e2140caf1b0ed0c6951643fd0c72ae0637b26d081930eec128c88ddebe9610196ce2e3a6e6eba2ea69a7e06c216d6f2061adb3d7427d97a5ea4e4b15313b955d2e5afb7d0d8f04991e0d303e020931950933978bb4908f32978db690030131e60ac02258ef7080f64148a8c1912853b94833b97013990853d9184bc5684be53013b940a3a341c632d136aaa96efa794136d713bdcb73c2eacec6365f4a021c83e56746abcff797e677dc3ed9537caaafe814f868391f5794ee7b29cae1a43722582d280c30418265c01161a708388e59c878994a830c47dd03a62a3b4d5476ea2b6e3750d9a9adb843e1c87a55f9ad302bf75b6f820cceac204e99796221f9a4f4409919cf83f33300042383e0e07c8e51aed8a7b1b5ecef0a0e3c621ea10afc50ae2e50306f24de8707ca6153724ffa7b38aa2093e8602e6da1bbdf44535c477683bad46ad5832b340eaed43eb4da406a9d99cc661b2531178d7d6e5a07bc7525fc0c0ef9eb1f0a104890a15498f1d110c323817a87fcb40ef868ec831cd339186c2015a47fd85f5bd24753c257eba0b7c60167e5ddd647b758486db693dfe9a925196c2697e8a29317627b35d1eb564640515668597668456e78495630fc9bca9c70a893b61b69ad97131be1f464f8e5069983864c6ff4f2e893f248f5d081431aeda81666ab146029eb6972c4494fc24e6baf99ea2e23a51d5a329bb4e5b76a296c973bbc56f1e8c68810ab07f76e4de2b1ea437514ad700ee9600df7a0d3d17af4c0d15338040f329bd116e48d0a04260670800c6448eb9a8a191cf039a039a2e3c2295a111a65ffa635c722f31c5cd8c2332b0363559cdb012774bc066aa3bba708bd2a8853ee355e4888b673b49275b1964332d1d14c1a4e9cbdbea4b9bab8a1c2360399cd06d29b20c647379bc96db357dee5a82a0e44bc740e02115fdd83feba078fe94982005f4d092fb57d1e2a7bdc95c5f18e656ff5fdc0c25d658fa3dc0e1b99ad9647b61849acd3115fa1b9f34bedbd2b215a7b56181c5ce7a0b2c7cf4826c85221d44639dc4625d24e2dce593bddcb283fd4e6569a2f5881d49f8d4616ee729c33f88064fa18c43ba941e090726e879b76b4933a7c0e6fb3a34eba07acd5771b2bed3050d8a621b55ef5c87ac0a128bd414e6a5de831b387f76f3f9dba3f368224692397e71881dbc1210285410ff2c13b96c9cf98f636880c7c1c6deec1e3ba4730dced6155dd1dc08150d6d3c7797e3830671ccdcfb1f4997d5ecaac2c010eca7d91c3814916a03330609a9b0f69b8eae695042f57750bc38336c6879ccc8f7ada29b959c8fad828b99a1eb5d73b68a3bddf56739fb5aab895ca6e1b95ddd68a3ba03fec9476021177cdfd9eda125e5a129e9afbbcd4f7030267859d4ef262787751dc45e2acbcc74e4e0caac2f0c05a60a121f685d2b64f15b77ea2b8ed53d94d1f4aaefaddc195bfc582eaae2fd4f62cd3d8b7c2486aa3f1914db6ca3bbd0c0e875a29257b18e486da9d8f758322813a012b17629ce1179ff03381eb13efa4019b92e8ae93eca917efa61deea0e66f2e0b3870aafa725bf46437ab1d5aab706085ead14d80e388c44a2f17ad87ad3711ca427950c0424f3ae652a5e86ac1d0b71941fc82de3806076753049a0370f40cdfef1eba575e7d93c10187149a030e69624aace8fc1caf110ed691462ee782490e7e61c70f3487408550ad390c0a0a7c90de78faa4e97ed3c5947827076b591b5329a4999d2d64c087b9e61e4bcdbda6aabb70ffc1785baaee867070a8ed011f762ae2105221aeea7bdd6068d4f6ba2aed06130eb2dbed65b641b0406276789389e40690a1bb6795c6eee5aa625fa8ecf85c69fb674a625f2aef5ca6b0fd73f96d9f296cff546eebc747b77e24b7e353ad03ab34f7afd439b8c6f4e8161ba55dce9afbfc4d65629cb5f290ff48f2b89ae285b809cbe95e0631f6aa9058678d240fdd146f83244fbd1857ed601b253703299c27741ee0d03cb2415162a58ad406a5a31ba52556ba3baab7345c7936796f7cb46978b0aebfbf1ac6057cf40b9e9fcd89c0ed101897163c689d7becb2c0f3e0aa8bd13d2be85b21388acbaf121c08650147586410d2e749a9717c3868661f51386812e3c54e18374fb44213b3b0dc3925b896a039a033a89c1866a5a7b7981e88d1fef856416ef0316f5d2f673588b3952c0c8abee236458915d23b3f3db4ed4389cdef496e7efff0d60f65767ca2843bfbe01a58166be55df6aa7b384494763ba8ec061cd01feeea07dcd4f6434fd8caee809e3095dc00313bb4517fdf1abdbdabb5f77264a8ef5aa6b66b99faee9510d55dab5477af50165fa1ba7715445eec0bd9ed9f298b2fd39458a32db90e70e81d5a0743662abb1587f33090021f19fe6679110ea7231cb302ad523c0de31c35236d54e25c34a136527d0c93bd0ce3dc75231cd57d4d651db525e073000e5dd92d6a52eb00879acc6679a975fe9efaad8d579f406d0cd60d0dd4020eca76f40e54bf78beba4079d083b7a9371f0b00053230dad23fd2d23ffc005258720970509ec33fd07b69702c6aaac937000765cd0585e6a598d5097320e1f9078577d22343cc3d9c5543d041e5ae05b3a2afb2436ae7c707b6bcbb6fc31fc456fe72c3273f5bfbfe3fae79ef1f367df4cfbb57fcf2d0a6f7a0fc0d8f6cb45414b356dc6925b703fa03ce4780f1d1286bb5482bd51053052f2d491b99edc612eb0cf7afc1bbc1feb53afb56830c81c2f842456c99eacee5c0426efb97521b3f9658f3dee18d1f1cddfac9a18d1f1c5cffde912d1fcb6eff446ddf4a88c681550407c456551c5626cc5625ddcf3427ccee549075a69f19e2ea187b75680eceac78e9277ae8c7bae9000e7f7379279d83162abbb48eacd791d9ac7e64bdd2a1752ad21ba13cc2032d1e3fb8f374a215708c0e378c0cd573700cd4101cdc2ca5e34d820a0f2e674a99d3e96a0f7a78fb7053df7033c818187978a7f82232a47c3830e26d2ecdc19f306efa799102cdb128387a06aae7f23966352573ada4f52f72e482e5e99e14a81f541ff615c315edeb2df9e6594b6fd7ddac0c6f5707a5a8508bf00013571b795d95ed32fbbfdcb1ea17e2eb7f2bb5e363280f898def6efff2ff6efef867ebdefb87f5efffe38e2ffefdf0ba7794c43ed7935c6f72648bf1e18d1632dbbc750ec7d8a1b6d4b420cc09a1699abb81afee21837dab35777ca9b6fd731df1956adbbf54d8fca9fca64fe4b77caeb0ed4b88d4c64f772fffedae65bfd9f2f1bf6ffce05f377ff4f3ad9ffcdf2d9ffdc7b62f7eb97ff5ef25d6be23b9fe3d859d9feb1edea027b541fff07aa82b3bb53d6e7a87426c5553bc8db282ad73c36db343acd2a0303cf520302b90442fbd180fdd203b6567fd83664a62ba4736684aad533fbc0e318becfe954a52eba3032d3beedd793ad2fc64b4796aac19703c818981561844272da742a89f56d0553b9d399d8663a4b99f1398957b302b901b77ce6114357a653d3c1d03027d42c3026262239253e217342b0c0e7ae4cac2d5e78b81830fc4d2e0e0aa37302bcb643d0c0a26502b2d3aeeeda6e1e6a81c136a09cd81ae4bc543ab766ffcddc6cfff4562eb7b5ad21bd50eae814dd9faf9cfa136367ef84fdb3efbb77dab7e7370f5efa4d6bf0b2f416df7979ae2cb4da436051acb9df4b3bc18e15a96155177260e798b084b2518142db1652a5b3f55dafcb1c2c68f8faefb407afd0747377e7264fd477b57fc5eecb35f030890b1e1fd7f59f7ee3faffff05f216bdfffd9ba0ffe65c7e7ffb17bf9aff7acfc2df890179b3634a6f2dba145a0ae5c752583ac1513dcf54e049a9f0ab6041ce9be46a9023238e5e1a597e06318e1a2e963216baf7dc044613b591643653145c9b51a325b12c2ec86ba2abf1a6b1dedaf1d1fac9f186944d842c6657898d322703e667ae3a6d5065122d0199cdae81b6e2538f0d0500c774312ccd3cb695638683641ccdc22e473bc341cddfdb36448d9c803d1cefa25c0414f4ba1c4175c513c6a2927cbdf586f9f9bbd525cb875a0a78e89f61ef9832b0e8b7d7460d33b2a075759aaef051c501b9fffe23f41367cf07f0eaefb83ca9ee5c0e2e8a60f8eac7fe7e8c6f794b67d627e746b9c83f6f524bfbabcb88edb39530dd7ee5f49cff4327650d805384086cc86f7e5367e2cb3fe43998d1fc96ffde2d0fa0f777efeabad9ffc62d3c7ffb1f9935f6cf8f0dfd7bcfb2f24abdff9d99af7ff151a4562ddfbfbd7bc2bbee2377b57fd4e62ddbbb2629f4285684bae8539b350d8e1a4b52fd0425ea03f2c8f1f3385da80430a32383e7c8c127d8d225db57ccc659cf424a13c0ce4b71a2bef449e54537ab3a1aa7856a2d7938186a9fefa7b75579a6b2f753e2a1aeaab86f3c18217e44cc107571e36544f6605ef9c0c4ddb14c0d137c4c171f5e619213862e322f99a0370d03ca4af000ef65c2d7aea387fccd24ba5cfe7322b80a3bbbf04710a1c0e6e3af0bed2a458073dcd5df04353631c8eb96b9969ef35d310b7339044d619a18ab5e67e1de94d525b3e105ff9ab7d6b7e8b50027e001a496edb4787d6fd7edfb25f1c5cf51b8dddcbfc0d8e5e8cf168bd92d67d3b77a8e2c29f1e95f414e5e507dbc2f3d0d9b5427ec3078757ff5e76c34747d6bd7f78dd7bd01cfb57bd030bb2edd35fee5af1873dabdfdbf1e56fd7bef7afcb7ef78f1090b1e5f35f496dfd427ef7ea23db3fdfbdeaf7625ffc02b27fcd1fe4c4be800ba273689d91f4269818278dbde176aaf03f328f99267ae84240469abf6966a0c5f1204bf011e2a0ea6526eba02361a9b1c746eb808d8e849efc0e7b8323174e8474b7dea92dcacf4b0f4c8bf328c889a8af3e0fff838b5fc69ba13ce07f101fe87381000b5ae06b0ec001c11365ed9c4cb83cc78ce6e0c371f6ec1906077f925a9ade9a9ef4b658b302cdf1bae1804d21cd81f4061e64846e58b81a06dae2e1fe4619f1ce016e5ae8dd3ee6a41eeb6712eaaaed6fa7e266246da775c05451cc5076ab8134f2609b750eadd7d8bb5255fc4ba51d9fca6efe4055ec7327b57da7022c6b0be23aefe6f4dcc91babb9f2fdc3a20757334ef95b041ac99a486c38bae69d43ab7e0738605300c7e1b51fecfae2d7703200c7beb51f486efa74ef9af7d77ff0f3cf7ffdbf3efbd5ff041c3b96ff4e6ed72a95fd1b64772ddfbbf65db1e5bf011cbb96fd0afa032e88eadee5da12ab2148d7ba6a1f8872d44084820816024592ea679211607e2acc362bd426d9df24c85e0d7c38eb1f021c868a3b5425d7596b1f3c1eed7aee6458a49f85ade15143b57d1606479263ddda5a6e227e9982973adc003838e13c8f46c26270b409cb03029f83cc0ac171fe72366a48018797b7339915c0912298a4363737fb15c321ea9032e5c17ad416d3f13697e610ccf7c53d3905ddb0800329f398702b5b0be9f830abd4287bc011e2ae0332e2fc4ca29042f0340875d2f4b5547031386cabbe1726df44660bb43a1a86cb93ca6c85d82b8b47d9ab5f4ff6a93f97d07c21b9fd7ad6b3e6db5fb5dc2a391192e0a81566aee420bf5b16da02aee5e64f15b77c26b7f913e90d1feffef2375b3ffaf71d9fff7affba0f8f6cfbf2f096cfc596fd0e7c407f6cf9f497bb57bfab20be0670c8ed5e21b1f1c3036bdf81f3b1f3cb5fc2c41cd9fc01b220e0437def7224422ce5b7f9991c8d745087ff014410e542679c0cb1ce89b0cf0eb74bf3378f70d5f1b756c2f99b2aef52dab74276d797464abb7c6c549d8ce5540f6d3cbceb4b49b1cf0f8a7d6eaa7ba8f07ae65713f70007fc0f981838a7806370f8051ce06370b445c0470b83038f1ba65096c111171f05384e9cc8a4198c85a6b7e64f8cffd29a63fe0ca95051f1127c0e8283eb4fe92f8337dad9763339ced1c755233ec43231cc3ad4433721c03cdac7083ac3cf4a31c0560557d6d354c6ddf008c242734531c00195ae2bb956e7c06a2431ad14c43c740e2198bc95e65f5f10df7036a1bfe8ccf70f4bfa4bcf9c0d770c335708b750f6d539a2b56bb9c2c60f15377d023814b77d0eb322b1f21df165bfddbbe29da3db3e57deb35a65ef1ad91d5f4a6dfb0c76047254ec4bb5831b340e6d52ddb7567ee7971004b707d6fd5e62fd1fa4b77c88281789106451218647d6c3b8f8181d41ec1aefa17722d82a17e504d14e67625d72239d32022c137c4d821dd4dd8da5a1fce4767fa1bc7fb599ca1e88f2817507377fbc6fe307e21bdfdfb5e13d3989b559a9fea3bd355cf263b881e0e02297a106083487406d709a838363e885e6387dee3842596e5a1f1f17d21ca270e0793ccce7785d70f0a73ce767c3845261ac9863d65016360529739ab71a8fb86a7f701d8951e43600474aa45d8cbf496aa84db8bbaeb39114fc7c2b3571b8fa8647371bc96c41300953a228f6a9caee2ff0aebd7f15e0b055deed67249de16d7c3bfd58d3f9a487d732bf6abcf5c7b6d2d64ba9c7bd4d424ce5a039828d152c8e6c4534abb4f953a5ad9fab892d57dabe4c6ecbe710d96dcbd0fc3a87b7e84a6dc5bbc1d11dc672bb748f6ed73cbc196bf4a5b76b496ed29058a77d68a3eafe95885960534086ccb68fb100cd01d139b8ca5c760bb2ec1e0687022ce591fe4a3f662640c4097222d826c9df0c96059a43ffe8e623db3f563bb8ce54595c69df2a995dcb2192db3eddbdf69ddd1bde93dcf945f831cbd6dacb93a34d5cda63060eaed463b09ef8104813273c38f02cea59e1a089f14973bc1a38682c24d508d2b47f6cc092503a5cd4c488c632d305a4d3f9726e3ea7dec112cee1407ab4bf143e07267a6e6bbd9299ec12e4ab9b106a91146e856161a8d58ef1d4832b87cb6da5b4835090def0aee4ea5f1f5efd1bd98def6aecfec2446a83bda29893caee6346d28857c1c19d340e8edee2fcefef158e555eb89de49be2a4136bad1a61a610642083b4a9e9a14d0868219abb57417f286cfd4c73cf5acdbdebb40f6ed23db405ef5a121bf50e6f051c86326260424f6a3344109eacd33ab816ef5cc2f4d07a9dfd6b34f7aed0d8b39c549785dc7664695db50ffa181d46ad0975daa5a02028c49aec4ba28f899f85a2b1ec36d5bd2bd425566b4aae5514ff527aeb270a7b5640f6ad7b67d7cadf88af79476eef2a771bb5a22b196303754fc7b8cce9405f356759861a86469a7a9162272c66e0e81fb927c890b665e7a6383899bab85943731c0bf00e8f0882e640b402b3029f034f4db87af5eaeddbb7a139f0480d24c1308a9a3d6f05d317d3939a1695e7603685e010c874e58e507ae3e5e1e0a657001c5c0d07262bee2d8659c12ccfad0de7d3121cc3020cd363ec3989b44d0bb54a09308bf3d247f784a7e161180e4bf91d8687d769ef5f6174681d7adad053ef6720052cfc0d8f4459abc0b1c8f233bf95e2d7723165bcf6f2f3c7651dd74fe4075827396825da6ba26e037004e849bbaaec47061dfa4363d74af59d2bd476add0dabb4e63cf5ab5bd9c28ef5ea5b46ba5ea9e354044436203ac8cd6c1f5eafbd7a0450549d2d5e003a0181edd6222cdf93a48cb3aaaef8308c83800b723c05c0e5840509194e0a90f9f3433d08ad31cbea601d62ae68a3bb113ec4a79ef72f4001cdef4e151b1cfe5c5974b6dfb4462e3fbfb377c2023bec24a4fea5c5638f21f8003fa037d2e80036a037020a01582033e07c1712a271970b8badbf8f8bac2ac444406bf393816ec3d11723b984d79316885dfd33654caf5d48f5451373d1cd2faaa7cd47d45879a9d48703e11eb783cdafe4494fdc908bbf4200b98f0087bb5106b15dc91e8f4f201102632a1160ae1564ae8cb8877d00419894eda277dcde05e14650675dc38f9a70745cfbbab1f5e4a3b136883422f947bc558a9449a2b479829f9eb1db5951143f70a52a5da8060ef1a9dfd1bf40f6ed69140ecb35a054ec9ce2f21d4b7823c3af228329b3f94def83ebae254767da97d600d5c602ba59dc002fd70c0c2535fcad758c6db500ae26b2c0d3890f608b45240720c7cc47b20a6358708c1a1b4fb4be96d1f010ea80d5589b5b032705125b77c7274f7725dc55d99719e3d6dc580e3d978eb382294fe9afefe5af8a4b3c2815005709cc84a60700406f9020e0a655f8be6a05096698e59eb43f943dff8439bf8ee2a5925ceb2fc000e9a80b60a89f311f81ce3f595452763c32d1223ac4006d44606463e463b64473b220e444c887e8a542f23f89bb14e5a318e9af14e5ae8e5421779aa9b6e8aab4ebc837a86a7c1f948c7c254dfaaecb0aedb27fff8e0cef3b692ce1b278bd3022e84399ef4324975d64db4d70e3351f0d33be2a17ed04e76a7b9d416e3435b74f7add33db0deece84e4b85dda6323b0ca5b6e81fdaa47d601d7a5b0811e59d5fa8892fd7dabfda00b97979317bf5bd2e3a079138f732380223e2a225e163c40529f16eba7807197e6632dec647f08ece7a3f549d396824fb9824781b27791bfb5b2a99caef50dfbf0a02e5a1b8eb0b1c02ae8ccee14d0647b7c1ff38bcf5d3233bbf543db23925c2b9f37e2172ea80630cdaa21763796a3887832b32fd81599989561ea667c6000e370f5b688ea0603f5138ae5dbb4666059373fc58b322048750d44acdbf201c82cdd06d2b7896db0fe1104cc25109b581212a78ec5979e171c081a95b31434166941d34476eacf3e9785738fce8b9c83c669ee16b9a864becaa8b4a2dd4dd9cf0313eee6d0489b3574b77d33d1766577622a8362fb2fe7434e0f8a6e5c693da2b80a33e2fe666bc174a44b37dcdd35c0c6059fcb40f0718ca407ff8e81ef1d23eeca0bcdf5a6eb7b3da410f5d6917cd434eea0721f66a076c55f6e1dd45fbb087fe91404be54847ed6867dd1857dd3877fd68179d503b147a71ca2cc05ce198993c321c69be268860a1e1e08dc208fa9848fb9a1ef5343c1260ad1c870e5b4fc358373decc746591c66056a03610ef8d096dca08bca1299ed962a7b8d6477a84b6e543fb4c95049fc54922f34c793e1a6a991a6e1fe9abe9e4a82a36f40d8e7607024a746000e77cc502b8023322a047d2b14ca92cff12ae120b743d4e760a18ad06c2dc8a2b219ab79cf7c24b521800381ab60a8f4f46492dcf43d5c060ccf6c9b1aadad2ace422d31e0c88a77ce4e70c94d702d48f23897ec792ec1fd7494534e88ed497ff3ec40abe340c4dd004c9cf435497450e7ca014d654ef99a14a5fbb79c4f68bd90d87a2e61b038efbb969bfd77f39acec4579e0cbb9de803e57126c836c3cd28dc541170041bca869828465b6b24b918c43bea875b6b46d868055b2807992b059a2b8558a946d861e0897ea6bf555eb8f3d9188f0bf1de783f156297e16f91ee679eec651ceba21be5a895e86108416e141e067af0a13ca29d34615000079c6874eb3beb4a7a9bca86396a42d045176cadeaac751089bb431bde850011fd235bc08791cc765bf5034eba52b6da872d350eba9a295e3b1d37d8590138e0960ef65691e680da001c7d434878bc7048191c0949a104071cd2e0107f822355f0182f3e1c3443ed8fd51c4270f01fd1c5af44e7a5d5e783831ebec43d996b060e4a72a09b1ea55f9323358d55a74fa5bac3aca0ca1c70e425ba9d4e703b93e07636d6150513d9c13659c72c20e8254972d68ab15501162e4a6236d21b63ac952e463a56e784038b86fce8fa3ccc4b8fc72865838c3b49beb712bc6fc4795e0c773a1d609deca81b65a102387cb50ef9684a0619c9273aeb1ff7b1caf0b14af7b64cf6304ef13449f336cbf4b3cc0ab22b8876bf99115c9a1b5392137d233da820c6ed44a035b04870378873d583008b345f33a4cc91f582e680c0ac00145813575d0947cdfd0e1afb90af73d13be46b2e0f41c73de070d19684e322befc977b57fe1a39349d431be1ede2dd444ecc59ef889ba19cbd9e74a0b35ee5f593637db580031d72e86d99f63966e078c1c78b50f6615c42b0a3b319e040128cc191969ef4eae180c2e087b2d004a427449f12caa6aa9d4773d0535484e080c38124476f4f31badc00c7fd860b98b73521dc12e30fc0c7a958a7ac487be49e59b5047218f03ae17ba2cadc434ddc546215c44d65578ebf590906139c8eaec90e2f4af5bb9de8559a115098ec732bceeb6cb01db080706ea98751949972a8a11ce07055da632bbdcd5e6e178c4b9c030ac7cd01475e98d39948d773311ee7633d2fc67b5f4f0db89b1551713abee854e4a544dfbc08a7ec50fb934136e083e048f23480aa80c28883d323d019085f11c7fa98c8800c14045928ed44ad9a83d6015482b91b4a1fb35020cd810283bdcb7e7960cdef9023412804e541e2ac2be561ace06a2c1f77ccfa61d525f4c6a12b1f708c0cd40a8ac4900de3521d2083e487798e87b1f1410c0e6656d233925f3d1c7800e03c19d21f4e6f8df949b979a1f8a644d8ac089ec9c5173cedb1af1f0e69755f6f29cacde173f43cba8d7939a383cc12024d8f47da65865aa7059a234f00439ee8a6872a5fc426a166f2a80fb593db6e20be5c7bc7671eaa7b8fbb1b8286ea5361cd0571152782c1c49d24efabd12e90cbe1ce050136f9c7ac804532a2595bad6873953023f96043b900bda34ef2bbd1d56271788b8bf2be4063f90427bd93013680e352820f04705c49f2bb96720c885c8cf73a17e39e1fee743200153d16707dd27da0608cb1001f19e70667192709cd012714d6c4cb481a1e2be040871cd2fca875b5d73ce0a025e1a87d10790e3b8dfdf0460f6f7cefe0ba77e5767caeb86b19f880e6d097deeaa873d8db52d9c3423133caa5b7e5d6b3d1968981fa89a10638a448750c0dd40f235ae13c0f5e9263a8b56ff01ea477f04144d431274ccee16e03b312127a2c3c22387e66e273a4cf058f0ee51c52fec4e794e7a0c734bd449e631e38f83645a0363838486dcc2af4d825cee1109895e965011c7830736f4f09c6b7e1b1237ded85674e0586fa1a446332a4600b083aabb8323b7b3594f5227c45f1b0abea1ecb239bd4b67dacb5fd534fb57d8851afc6b8df887387aa001f77537c6fc67be0e3f950bb8220eb5c1f73a093e9669064af196ba5926caf93e684d1ad086b8d529d0d22cc949d95f69a496e323fb4d959655f80915ca8956abc8bfe8963d639210ef9002bca0d723ac22537d42127c41e6464c0a5f536c53b8abe20278e71a0208082e68875e16a4511a408bc0d29c081523113b96dc6b25bcd1476582aa3dc55dc59f790abbe14e03091db8e3805f56620430905697b56e21d3ea9839e949b899cb7b54a6e92cfd0c3229001cb4266a5b7bb62a00f49f406280fc041b9f381e19681e17b034872701d6f0fc323fd970c07a6f579f57008540847c6827010198c0f688efe817208c1313e5435d45d72213fcc1fb315b86b818f282fbd4837ee8aa31acf5d5b0295c366521b20460756cbaefdbdfede1599ee86d7e14c443843379c0bb13f8f26f435cff631c37b1aa2563b8d045bf5680ba5184be57063055893785bcd935e6667431c4f07dae71db34d7333864d313db8517bf70a13c98d36b2624e6afb7d0c8e86dba827ba19a6fb988392e3fe565848f7310313299ec649ee86102c437f800cc871642f3c0da03390804178e2ae2f0938e084a2621415c5501b827cff5684af664a3ba13ca042dc0c8eb8e81d46c022bde563600141364571f7722bd57d4e06d2767a877d6dd5ce1f0f1e6e2b1eeeae0219c3bdd503085504d10a2c0bf8e81f7c6153fa875a4106049a2334dc177020945d82e6786570b01cc64cb4329fdaa0f8854fc6f4f2204631717ce09901c873008ef181ca6be76330595600e62c7051f7b753f2b75670373a6cafba1b230face4b6e9a3041ce5a2fb57a96efd08c39090fabc10ee84ec05d40304408083386b55e8093011612a1f62207b4c5b2a50571aee2704e9af7457c333410ef90176a7fcacd3dd4d020de58c24d62355aab97399d69e9596b23b1c55f779e91d0934530422318e3a50249038673d48ac934eb4831624de452fd9c3281589132f23d817d81438a1488cbae81c40d50ff840bf20fc0c5813680e03741da3e65451cc5c79978dda5e089c0f2f1359330531b57dabe18ae25d76c7e7c672626e86322e4632e8c4f7b3d7b85d103fdc5e8a6805a1ca485f0da2154192b41e7c70d1ca4043ef6003e7760c36f50db630b31214e2e5e86c41790e38a4302b098931fc59f16156300929ff91090f1e3ca007bcbd2e3844d586a023863331f415999559350737a1f36025a215c031355c8389c0fd5c353089858fad02c6a463f031467c582a6e373dbac95072adb6f897f21bdf5517fb5463c7a7b6b2db929cb961aec87ba2eb24c14e23d21c31aae431ddc3a1c6b281c84ce81f413c02c713e2acb0db4571cf315de9282b7530014971318cb3d3f6d0940416e8c197dffc1186aee84bac333db2c55671b7b3fa0177ed43be8632886cc3acd5422c556071f01e64ae0809b55289b0558fb2d784c02d454c1b6ca58c7c066213e4c7a0330087bde67e8c9c3002d04737131c162a9c6541ee1c66c5c3e82894073c5064d8605090e7f0b354f1b351733696b1d13d14ea6e507b37e7493f6750e07020c90138d0030787039a83cb73cca63960568e05ba3b60865a419e635638ae5fbffea6e1107238e8515cc4071f8e591d528203d10a1f0e4f6b392f6b3957132937a3c30edafb4c6537eb1d5cadbeeb73b51d9f48aff9add2960f74c5974173a06638404f0a82e814794f7f1d290104e29e6a07880927f95d16921b2d24377172780b3c0c74d9879929071a2a0418c87b6a4999486e965efbfe812f7f8377e56d5fa09f16bd2d860737994befb09117775439e0ae25e5a32febad2f0d73038152f1d293f2353cea6f2c1b602a8f94399260a136501b885d25e164203641ec8a3e643b2dc0216e2cbf1d70e8cb6e3552d861a2b413cac3446107ea953c4c503278486dff1a54b72b89af7037928d70370c74d07231917530944e0cb57b547fe5d97003d25f80030e477f77054259181481dae034c774c0f243cde1ebef02383cbcec7dfddc1603074651bf76cd313f1c14c5f4a06b9e17ad701f050e07e0805941b4c23dbe7ba8fafa85581f6735378ba3dc24272652a8d8b651df8d222bcdbdcbe4b77ea0bce563a5cd1f69ed5a8651492808c58014272571d00093e1ad71d04d792fa253bba318b6240626cc24d61bed5da3b9ed731db165a80ed4135f05f7c2526abbbd9cb8b9d436b3c35b75f7ac4199f1e155ef1c5af987a31b3ec418051496820f74d5ea1fd8607278abc551315b853dc89f3aa8ec853b02758277888bc60137ad83eeda924e1afb9141f736e4621354a2a3d818be2717beaaedb1d5dc6fa3b10f3418c86dd393d96220b7c3505e0c6400176001389cf50fdba81f4056d4455f3ac459d7dd54ded352c9cd4cdedd42f14c6660cf833be3bd552083f339fa6b10aa20092670451b7a39e5c199154e061a7b079a7b075a21ddfdf7bc7d9dec1dcd3cbd1d84e0c06c71330f5bf981e66070d08460afc6219ddfe710d21c0c0ec60716080e90816805a12caa4791e78059b97a2edadb49d5d55c1a7070f39ce8ec3753dc863a0975f12fe4b6bc2fbff943edddcb31b4d55a66bb8bca5e57d57d10c0617364abb5d416abc39b4df6af353fb80158686dff5c75d3472a1b3f925bfd8ed2c68fd4b77d0ed1dcb15c63fb322d310c8b5d81a10947d7bc27b9822b260510280993dff2299587a9ee58a625be1a7c18496e3695da062d627e741bdc116b790c8a81eb23662d2f66abb80ba3a7d0eb063e2018728732630c6641ad09fc0c18116b4e7f48a022da58510c9a435f763bc1014502cde16a78e4988dcaa948d7f329c7f2e3bc821cb5b5a436d9ea1e4210eb6ba77efb7ce25047e97067195cd1c1ee4a1acf824a412e54196eeceead26b3c2f7390007a612f4f2715c0c1cec71d480839ea7b10438aab919aefbcbbb07b84948d9fc1c084ff8fe04dfe1a027490b6538a69fff28501b78c2348485b2781439052cdc3c4f23d563839518eb8651904e2647dc2de51c0d0fdbea1c3092db8a5a2fa59d9fa9ecfc1c230f0c3138457283a392b83f54bdb694b7d661778d83b0261c1c47b619a07f75d70abcab6dfd4c61fd07b26bde97fce237073eff95e4b2dfeefef0e78797bf23f6eebf497ef9fb7d9ffc4a62d9eff77dfe9b035ffe4e613354c51ad51d2b94b67e89312c8adbbe54deb11c639c34f7acd693d86020b9c9f0d06653e9ed24181743622cbdc5e4e85688a9cc3673b91df02e119d7295ad325b3827437ebb19c669a28a1815afca1859cf898182188255bd235bb8a844572ac6c3f8eaf1d00b194199e14e5018565a12f043ddcc1592c31deed75e7c3a543f857109c86df4554373a0de4750f283626381591190c1f9a48328f6998e56fa071f22c381620e38a47efeee302b119121704869865a7ad80a7c0e7a903d3d32813407e6b66670605a9fc9c9c985c7adb4f7568ac241b92f217f93d1c0f733664d8209c181c7ec9265a1e9e100c7b9fc50c0817273c061a777d044594cfbf03a4d89d5804359ec335d8935b86b6d64773829ef41cf6a0082117d19c0e1a1ba1fa604bdf0486ac17ce8efe1062f4155c8affbf0f08adf1f5afebb23abded9fbf12f0f2dfbc3b6dfff4cfc935feeffe2b78756be0b915efba1face553a7bd7abed5a0526b8014e5bbf203e50e4a1bd6f2de3038800143d09f4dfaed59158ab7b701d094652e91fd984da0ec4ab4486ee918db023f0304006cae5b1002cf4e577681fdda279703df840efaba7897c4a906d4e9c67418a7f76acc7a9388f8c08a7281fd3085fd33b179246bb2bbe9e68011cc00282f42815834da7470570f0cd0a97018365e9bf0f329c31cfa4872d99153e1c338f4c1086839e55be4438a036f89a83c1c17f002c9f839979e57e10dcb22498101c94ea2038d0f706382e621e272b194bbd035e368a0e068730f2585312e354d7a2060c9a03d5568eaa7b61ef7d116d1ac922100d325140f20a6e26ea77e06f5aa29e6fcf6a280f0db1e55abb56aa6cfd5c76dd07326bdf97dff011d4c6d1751f810cc915ef406d1c5ef59eccfa8f55b62fd73db0114270000bc031c3c7971ae2ab74f6afd33fb811024ad0ad8fca0ff499a9ef598177f4e06bee5b857405aac2f4a43652c80a38f4a437c18ec09ac0a698a989131978d795dda62eb91ee643e3d00604266792fdcea61e3b9de2772e23b0f06c42eded53e9114ec7e3dc1f375d7b3ada383e00235b0f2c880c3e1c943e071c3d03f53dfd0d3dfd4d3dfd2d90eede5690c1e01074d9bfd01caf1e0e2243140e321f7cdf82f1c1e060ddb3f39815680ece2185e721e89845c072ed622caacf31558bb7ad928b8934461eeb4821b5bc0ea36151656e2ebb0d661e708498294658a922e70d093557462e0bf519e003251a9c4dd98e318f5fc2b140a1281c0ba9957f38b2e60330013d012cf08e65ac811d011626477618486e51dfbd9a8363fb328c8bc43027bc2bed588eaa1fd4fea00208587064ec5f8b8f6a184a298ef5023824d6000ebceb486d001c085ca13374119ec86f3352120319a6aa7b0c157742c087c6914d5cb9e8ce2f7464b6a2e21cda223bde3312bdbb7ee6174f865eca0a8b0fb6b9732979e071f1583f5c8df2f1412132b84a30aa21e5c3410e29c747df3d2439280906cdc1e060735bcf6a5696ae39e68163563ee831e314bcb06efa79e0c003ba290f867a1f9815c071e77a32e030d7d907b3e26c2a6dadb54f4f7aa3d6c13520031e1f06d1a34e132353824d15a26cd4c32c54a036a03cfc74a53d3524dd540f382a881b1ed8a0baed0be80c1a0d0b14603e8082d4eaf7a1390ead7eefe8868f8facfb5076d3a7280db490dd6dadb0d7445a4c7bff060cb127382058001c10acd4dcb78689fa9e558003394daa172438d4304183e45ab226d019040737a64d7d9f85c67e53b5bd26aa7b74e5b62b49ac51425674e7e780036399029cb423bc8c7d6cd5bcac55825df5dcad9511c12248e9ef2819eead9cc06cb5bd15a433486d70839a389d21984e6ec6e740b4f22209d67f1fde28e0409e83e0888c0a4d4c8a7d2d7074f657131c3d835c0d2939a4426645487990cff15270205a011c3ddd4594ea28bb7bdcd94e0166051372000eb81d80033e8781d406f473d2240b4833845baa0844157c4458a9a13203fe8797e62157b58388516153d477604cece7b01af03765377c022541264376e3e7729bbe80286f5f6928b9dd4ee9a0adf241331971bd835bd5c5d7296e5fa1b06d39a90d02050b6abb57ab8b737c4073082a49b9d91990d6d438b056fdc05ad57dab2128e582bdd093d98690554f6e3bdc4f131571c202efe61afb8d9477ab4b6d563db45e5d6a2340713691f5b253f3b0510113c6ea7bb5e4b685791b175e4e19edab82ce98e40c0a721b65c86d406850936044240787405e38a48083eb5841dfdbc0033b0753c0813c0739a451d1610c0ecc502b7864c2f40cb5cc215da2e6e81aa80116244270901111b52c4c73800fd21c84cb5c3e07a215f4ca0e0d577577dd45aa033e475d659e8fbba68da124a671c5703758165d994dd01c98e109292673f9edd01c80036a031269ad0e32a21db451b383d4968fee51e4b5ec15f620b5657a688bfebe7506129bb5c4d7aa89add4105f0301108a5b97cb6ffe5269db0af55d6b4d8fee76503b6ca3240138f425b7a9ed5eabb87395fc8e151005b1e5f23b96c96efb02efa837061ceafb5077be5e53621de383b0802097056742fbc866c001f301380c9576190be00013068a3bf1ae2d2fa67070dda1ed9fa923c0c1a453d6aaae96cafacae2280794debbd2c94caee2f6c9c1f69291deca91beaa314c8cdf51dcdb5386dc064654b3e1904406375cf6870e29e53960566ced4df87044c7842725c7d1acf8af180e688eb9e0607d6ca29a035f51272da387a5cf45435938a480038fe9061c4875008e96fa73417e0680c3de44cac34adec3428e9b0a4712b530eb30b80d02b7d452767bb0855222fa3b1c7442cc9450be85a438c1e1ad23eda62ee9a4bcdf5de39083e25e570d295b857dc652db0d0f6dd597d80a20d476ae51d9b14a65e76aad7d1b2de551322e4570181cdaae228ebaf335e043416ca5e07d39c1a122be1ac2c121011db60e3a03b3bba09f0ca28c6e3368911938602f20884ab48e6e011f169a07ccd4f7e92b880108e93d2b76ae7b67cb8a5fcbec5b65a675d0587dbf8ad4a6fd2837dff199a59ed4cdf309ddf76f0f75977f35de0c8332d053dedf873929ca7b7bd1d9c6f13133969a83a367683a5ae13ba4dd7dcd5d3d2d04079260fec73cd0650f38505d4cb3e22f120e4c423a3535b570282b98b578fab9b2fc3c077f5a1ffefc3e542b4a3a66e6c94e2f0ac30823d65f8f2458f740594f7f19f8181baf43bd4f9fc0b23c6cb91c1b618d9917308d2b02164c02069f146399a03c30ab8ebee43ac9d5bfc5687af0e1a72fed6f20833c0782146795031060013820ae1a875cd40fbb691ef1d297b3579180cb69748813edbd1ba11eb4f76fd2dcbb0134582b1e0019780725da07b7a8ee59a72cb6020253026d0120c007a673c1026880c220cd0138000472de0abb9629ee5d09819ba972600d06be6a1cdeac2dbd4d4776879efc4e6805680b23b57d06aa7b3564b7e3dd42f7b0e2914ddbd6fd61e3ca5f6f5dfb7bb18defed17fbccc64caefc6e0ef5ae71153d2831efae10f4ce5743c044576f45670f1286d5989f831b453d58d73380b906c1473de0c0882681438a716ff7dbbbea0107a2154a9f030e322b34f139e5396edcb876f72ef7f43fcc8a4f790e7e128c9ec4b3a83cc78f816306a6695c98826119744a92020e88a0dea70401cbd4781d46441e4ff570b294c1f481de0e2a7e762a18ee86b9e16056d0fd8d68058388d4c597e9ec5ba5b6f30bf51d5f505643477cb5c1fef51647b6dbcaedb691dd850573e99d36f27b4da5c51089700396c4d74354c5562b8badd2d8b35ee7c066c3c33b2ce4f6c2b21849894134f66f84e680fb090f033460d00a540516308085d31c7b56020eb22920030a036a03e32219192a07d7aa496ed494daa22db35d574e0c58000e9061a173484f59dc58e3406aac7b63e5f9bbd73243fdcc8db50f2a486d34d496c8c498deca7320037d2848837269f29ecaae8ed29eae72ae2705100c5477f75542408960fec93a26040792602003d12ccccaa38e5a2138a039f870c0e710820353092e110e9edaf841867441cdc1fadb44ad8f101cc8a077f761442457498ac9ce315c76a0bbf8ea851864d0edcd8e786092465b251f6b454c5b803e0b3bcc01a777084301dc750f611e48cc09899936d0a78ad815bd24c86a40400996b9ecf8b6e5e48d42b8f064edc7d2eb3ea177ce1b1503046b7525b68012bcc3e1001c6a7bd7734ea8405bc86cfd5c71e70ae80f5221004563ff7a88dafe7518e384f1b48abb57caef5c0e3830de15434ea036540f6e503bbc49537a2b3407469de828ec242c741477d99b2bdcbe9cf6fd93b6ef9f3dea6d2fc508fa86aaf3adf55726871bb979163026a5b70a5820190a6d01b581d20dce038559efafe2267f9a26a3a6bbbf066a83733b663407a21590d1dd87f796878fab9706074b82bd84e67829386666b216ae0463bdb2fc809621823c073407c1813c183aee51d881a14d1181a6980a0c93087270d82821896ea3b1d7c3483ac052118300d00b8a1e738c99b694de868127d6323baca5c52c0e6f83136a8cf18c7bd620bd81941772e4c884228245b20b410a446acd47fbbef8bdf8a7bfd9f3c5eff62dfbc3a1351f1e5efbd191f59fc86cfa5c72dd47126b3ec0707b8ca8c6442e3b3efdc581d5efc2e750125f051a340f6e24513f30cd87c29e551874cf698e03ab890ce583eb210849b48e6ed394db09d15114d753de6bac7d2826c4a1a1eae2d3b17bfd9d88441abf7dd68619c030c31368e868bbcb0d3be82a87b61014027213c641b8d8b5bf9a91c13dbb09b370f555830f6659bafbeb28090638e073dc7b588168054952322b1845cd340766a8a527f1ccaa39f870c0e758945999078eb9a697148a62f85df6b3c2c1557820cf81be37c17059f8a4c876f477156567f8608649cc4d1be0ac01cbe268700823d331c43ec25133d80683de54c2edd4e19362d4899bba848bea7e4f8dc3e8858fb4d408355745c002b3a22bbe4e6be76aa80de80fe56dcb14367f09857174fda7922bdf3fb0ec1d90b1ebd35feffce4575bdfff77c88e8f7eb1f1bd7fdbf0eebfaefbc33f6d7cef5fd6bff3cf10804283eea12db40f6dc6885908f8c0887be5fd6b090e90a1825a21c98d2a921b9424d6291e58ab7c78a39af41690a1abb4c740434257759fb5a97ccef1908e0745800310c0b1809e687f5444344049a0538d86d2d3984778a09c8721980a8ce631a6098d0107d446f7a040042aa4abafb6bbaf5ea036c04773cbfd320607425906074d08c67b4cd31d4ceb433e0799158203f34c4273bc1a38e698706196f896a29569215763a6fb1e0b5c9274b88a9bd21a098f9e626e00cb781d4a7ef0cc55781e78169a9f83aaa7851c045330000e8c268a74d0e4aa28ac5450ac850c98270619684b1fd3970b315186f81bc8810f37b5c3aeaa8710adc033b596db637c688781c456ddfd9bb5f66c805b8a1c28e66cd9bffcf7621fffc7f60fff7de727bf80aa000d98c565cff2df4179e0fdf0a68f613ba03630f41e70600a060c3702192a07d629ee5d0d38204406ac09e00019f2126b952437a91dd9a681f9a594c4f5d50fe86b4a783aeb5ebf98dad35e3e39d2024f022e050c071610895002e3f1e3229a3e90e6599899c4e7076460221d0e8ea13a90811403e90f3e1c5dbd4d4dad250407a2158203835610cabe1638661eed4601cb0f9e9ac01ff6f8c331922f72eafceed917e9d41fc28180851bc6325489012c98f6697a8cc2582d9e97901c6be7662be7662deb63a778cc51c5c3fc284a0631c80c83c630e60c43cd04b5585a08653164cd59693f2c8bf1818d46fb37981fda6a2db3d34a7a97f9e11d704bad64c52d65769b1dd96524b95d4b7c3d321c10789d1498c86efe0c93b77073c66dfa04ae061c0e78a05c8663c7973028d0192003ef988581c8509558afb46f8d9cf84af93dab14f7ad8135c1a42b2003060564c81f58af7c68b3aaf43655d91d104d657153fd2349b11e0f9a6f810c0874436767694f4f052673021c5d5d65345f60777739844b69604adae9e9bfa01eaa4873e09d9b9f6da00a70101fe479c0ac30cdd1d9d3d8d05cf4ff2a1cd37cccc041ca83e08065011c98841431cb00c296bed2e1be922be7227c9c55ec8c25014784972ee0c033b080050625e31d43cd50d1093882317c4dffa897a69493e23eb81de0c34462139c0fa3039bf5f6acd7deb30e3daee89157135bad820cd896652003618baec42683435b2de5f798cbee363cbc0db9732ed3b56f1d1b650f9d012ce06140604ab4a4b67093b748ac87da0016b218438bf1d6f828b981c880da90dbbf0e70286233e96dea8abbb454f6e8aaefb73092c9ca081ae8c660cf7bbddd18b25685d98981050433597358f4c1ebaae2661dede51620787a1a94043325645600070603705808f810ccc2c075bc31383aba1bea1a0b913e7f439a8353652c433a50d6d55fda355002c1e32fc8fd64832279ca63ba3a709e310a2c5bcaaa4a4790e7182cc3b8d9b1d11a288faece425485b5d49ecd887774323fe26c2ae5efa01ce8a81ae0a012eeac81395f316134860fa1d037cc5af598a10ca61cc52014e4ce31fc047d2bf60abb11d0a2d60b9d2ce04367f75a4dc42682e04563d76a8ca647700b7502a542c931506224b5ddf8c80e083a59f01151098527b029dcfc0b929b30970bde4973406190da001cd01c023e3629486c001c72d02b8737abc86cd750dca3a5bc4f574dc2d94eebe2f994fedebaa1c1a68ef60a546374f55451de82d3108382996891cce8ab847093b091f99843581cdb832e5981740f409abafa9a7b07ef55d6de669a0349b0b0f04072489959c16c71376fdea407bcd1c356e073b04743d2dcd6989c63510ee93c70d064d6ccb8f0e6b69ebdab56c851fdc1d0a6e14ac081b918b8804530e21e7c70c3147a4baf5d88f27652763092f4b6910719c178bc8db346b4bb4eb48b163736d58a2bf70d309285a0ea0782be3727c53d085ea80a1002fd0131d8b7517fef06689169d9b71e9420a72e28ea59a9b56f3d80303dbad3424e9cc10115c2e5390470407360661fa6398005d486d2feb54406d48692c406c001b5210f5f556a8b9a9c989afc6e3df5836686b2e141f6551517c6465a0751cfd7c3cdbe82529de9184440061f085ae62c485f251ecd09616b6616383f94734ba133a605883477f636f50cb46256fc370707a7df16d21c6c883d29127e6fcb7ccb33c685cccaf018342707078c0bc6cd4286fbca3000ee41d3f994685b6b8303760612703b425d35431dd530a12766dcc24865c4b45c952faa3a8ce5d0eb0638d0658fe18dd6d2db11ad50586b7c60b3b1c416086765f66f848941570b04f10b1409bae9f5608330f382fc1e2b85bd0c0e608124184b69c0b21019f0362080036460162f81b7b14911a604727023c88028496fd754dca3adb2df40f3908db972664ac0e3b6d289f107fd7df51c1fd3b5e3f58485a886203244e198d9922383734511c44e2b8fc6dea1966ef4d70fb49655dd98150e4c2548d1caabd41cf3c04128f01f5d3e576fad2822546c4c32ed90a27010cffd13c08180967b90bd60c68eb1c1f292dba9be4e2ad6bafb7ced14319225c4510d53016316a8631672fea67280039d70c8a363a62fd4fbc0ac000ed483a18a187d6f302b262003c9d0fd9ba03910dcc2f980000e547fe11d64604e0e6bc57d364afbe17cc0b8c0ffc0b44fe47c8009b81d704b89090a4f486790b7c1e0804181e65090041f9b080e23dd233aea12f6566a05a7e3bb3a30576213e0c030b58eae0af0819e77eeee17c0016793f33707ab21dc64f302a18fb3ad99f639181c302b0c8e928a6b8b848366a8fd51660570f40ea1de93f33cd08ae473c0e1e0fb1c6c5c24b1b2a0e698b62f3364e0234c0c078ae089a134ed24e000221803f764ac66b0fbeed582703f67552793c3302e11ae5adc18387b150c49c5a428501e80c353f7b0af1eba5438b3827e16680ef8a4f04c4d0f6e3693dc827784307a7bd76aef5e85610724e4a8020eb81d5018d01cd01f8003b3814138cd21f046f14e4cc8233c115f898569570373c61dda28c87a6d54d8bf4e169bc1ac1cdc0451e4e25871431d296db5035e1ec6e5a56707fae1686322c0265405b77763c6666eae59dcfd08478508e0c381c79543e08432117c5b43d2d9570b3ef0ded18b85469815081e99c0e03816e0c97c0ed21ce878639a833f7df1127d8e79e010d21c4c8b08f9a1b3aa0dd21ca08d1358936154aa7264c0b220db0138a042506f8cb4079e01380156ba0af333bc01070464447be8063ba862aa68c08159533060c4c7401ad12cb2614eca7b31cd28e020209818ee5b8fee7b644e915c4759394477df06581978a3d01c8083ef6d681ed840de06c840060c13d322d985e98b15f7ac55dabf5e1995440737a91eda0c2cc8a0101c7298a55462a32caccc11c4b13bd595f668694884873ab63d2c79fae43146120c0ec3676ce8ec854bc1a528b82ca720ee200818168402531eece3cc062fe080cf0138da7b000a76dbd4d1d378bbe8c29b83030ed1ac9a030f496134601435332e589e6bb8ac50c129332bd81ef3327070081ec9c3612180839bf167b0a2b7eb0e62da67e3b5cd5579c911d65cc2c35e19ca230c69534b393cc10464904073204f6a2bb713023e6c8eee44b603fa83f8801681c0ca18496c3490d888314b7afbd763c1e8f016b3a33bcc64c54c8e6ec73c4fa8e58135011c78873541340b323009a9ccce6598c15869ef3a900181fb4964c8ef5b2b0b7af0be6ffdd17deb64f6af973bb41970c0b228c8eed4523fe8ef63595f77fde9579d83c318b1882426fa441a909c402d04572b330d071e3e5dcf54089f0651e3c234079915bc93e640b402386e169ea35016031498e64012ecb5688e79e060b33df1cd8a60997265f30daae6fb1ce8d9071c5021dcf3bcd0d74fcfd6103c0390f33c064a067b8a46fb4b27facb6aee1e8f0b3673333d82c7c1437f04da2a010e6fe3a3988c8be0c0c046570c74533b00cb82614b76b2bb9de4f6203366756407f21fb02f54018440861b8722bdc3ec08c6196c83184b6f333ab215f380191cde4c70406d28ec5a2127b64c7ac71798aa16ef32622be4d165b31f71ec3aa80a521880e3e8ee953298d176df7ae9bd6bc187fce12d80435e6aaba2dc2e4d35094b0b958b17d28647ef018eaede3ac8f0c47dcc66dfd187a44535040b9ccce673409de0e990421a857ec50912e703f5040785b28fbbeaafdd3a33171c98d687cccaad5bb710cabe1ab342358202b7833304b8c5b9220ce6319023c213d119e568fa517eb674d6b2752eb8153c06906643071f5c55a9e0390a7d9d772706ab3018eecad9287f7b5594ff60da5acc037ccc4a0913e5604022f8c028458c5884dbc11917c53d488891b8281f7090df6309140e6f05165647c5903c8558e25d6eb785ec4e0e0e419283734525b8398a614a20800358609e6b4c897f0825ec302ee2abc187c2deb572a061cf6a19f1554776af96dab5024c40a4008ac406d9439be50e6f5138ba5d497eb7bece1175b503e161ce2df7ee0e0c350f8fdd1f1cc1b8232ead89b437bad0665afa0776e487651278a22a52e61c257817f8a79c59412aaca3b706429e072c0bd40686bb5db892033850cfc1e6b6e68a7d921369e2739aa1167060143566c547df0aa62f664fffa36778d124a48b2af6e1622ac18826e69076f695101f244264705ff1e6e798c739152a4e9e4e8b09e0203e605c6059c0072a80067b4a46072a3018aebe222f31d0c2d3523ec84923dc453bdc492bc85a197c206cc188670c64f5c4b4389a92e0c35545025820a70e3e5035889c989dbc380ac3502106e186372aefc738583be57d9672bb50f30138f425b720e1016b022cc8a64061601e7469b1e547904ddfbd4276f72af00101165018d2a067d72ac91dcba5c4571fd9b386e090c6acfb704b11b0a849686b481e94586f66aa585a7e7e7cb24d30fa080909e4bbb80e33b22c02e1c213be9f4173034ff75dfc307261bf02164486c0f3a813e439ee0bc1410ee9fc7060e6167ae2f052e0e8ec030182116ffda5208384cf84d09af913a3a265a72f8a4c05d9740607b261b02c9d1d77ba3bee20a645420c9a0353bbe42479f8d82987bae97053e5bbebf95928c02d0db4523a66224f7070a2750825618003c2a12060025583a810f3d03e8281d1104f1d69779d23ce1a92368a7bcc6476214ee1d4c69e3528d18035e16ccaee1580437afbb2a33b5730386476714c1cd9b91c7298939580e3d0ae958043fac07a99831b0f4385c0f3804faab4176ec7b6ad9feedbbb3a31d9bfa30b9defe855afe78c8ba05d397961592a088e695004644cf33103c70c439cbea168850470c0b2008eaebed6b317b3f89a0370705309a624cdaa3910cad2c4e78043e8493c8bd51c04874084e160acf0f998070e21a5421f090ece8d15a822d4fec0a6700f20861782353d45501e28f240051046d2626a97d3997ee8a4c584f9f1c7cc223cf4305bbebfa522f4478099a2b7c151779dc380035327a0061d55837877514508b31f0ba0c1d740ce5b4f060b5eba477d0ce5bcf4655cb50e5b2bed4156146a834b968b4f97f0101c7045a1360007dea1393832c4964b892d3b8c39f3f1be733934076759c457c3e1409c227b70b3e49e358760778e6c53533e2025b965e3868fd6ae79cfd44ca5a4f4c2f0d843946c717739279c5d68efa9c69842f81ced28d4982143880f119ff445b4c2940717b070a16c0b66c5c7107bce21153c4f6369702077be1438441586281f739912565b2a3436ae0775e75ca5ea341c543508417918de316a01b3330cf59543be9a6cea7878f3548a97a7ad72a08b5684a74184bb7ea49b5e98b3f6312be563e6d370800f57cd833019104125a9a493aa0437c1a8f61190010113de06b2be46f25870d294c4acb4fa52db50390c5794ab15a5122ff1950407c8801d814139ba73192303701c125b066f0364c8ec5dc7a98dbd6ba1366424361d145f0d38046645f2c0de751f7ff4ef1f7ef06fd247c5525283efb795637ea6ae7e7891dcbd8e167ddc5df5b8afa6139d6a23f542703044581e6c26db31eda9c0a030e102963e18ac16cc8a4f70605a1f4c5fcce0a04948e1735cbd7a99f91ca29a839ec4f31270cca80d4e733061de86101cf8386762430001098020a1e5e99533e3ee39e5d1cfa91008862c60d2b09eeee28991daa7e30d257732033d745dad15c27d8cc23cf5031c35829d10d66afb5b2bfb9ac8791a48bbea1c72d6907054db6fafb21f4cb8691e061658203ea027604a3cf58e423cf48f62ea59cc416b2cbb03592f8a5dc9d540e0ca6121f6a5d4f6cf053a037db0aba4c5be847101163cb5c1c1212dbe069a83733b10b0ecdf4070281cdda1acb07fff9ef5bff9d53ffcea17ff6bb7f85a0b4bcdecbc44d4000f8cdec724f63d838d68d1b69eea47bdd51de88a1b6aa02a0da1dc28d91abc77f455cc8820ba41b03393049b4e75f436b5773765e7a7f2e1c0acf8645678735bbf7e38c827255684f898351211b81ab3c3c19e0425e8c4e1802038e0e5f4c3c918aceaea42e171d593f1a6f687b763c3edf014560b3dc9f8505b0c38f6b452763757f0b250c2cc169825c74953c24e752f2607b6551287a7093e1c540fd82bed232d8235f888d98981085c0d3bd5fd3028c870e059083028e4874240063d63057268eba75298a6013e072c083e6eff02426a43e070703e072c0b7c8e433b571d02257bd7111cb2525b1564f788ef5cfdbbdffc9ffff8f7ffbe79cb17b2727b5cdccd2a6b6e0c8d3f041f4878c3b8008eb61e81f218ac87fe40402b90aacea16a0816da07a6e168ef2d27990e7d61897aaa2960c1c2e3ee6a442b8f3a1b4ee62409c18189cf31e793281c7864c28fd51cc8734073c0ed10781e3f0859f9d10a9f0fde74d8fc610d3407f2f41ab60d95214e4f75cac5443364f495b6f794008e9efe8acecee2c989a6a713cda577b38cf50faef8f46778106b548005c181797030c39a8dd6414cb4c5cda824b7832644809b09b142360c418a32a748ac15c4b1067c38aa496001592fa4374006a60e86da80c26070707ea8400ee3613c3b9671510968d8f699101c404472270296d52043526ca5e4eed587f7ac051c703ba40f6e9139b273ddea0fa036fee91fffd397cb7e7f5072abbad691b8c40060814e54a4ad1ef791e6a881e6e81e6e0416f03c48800591f1b89f0b65497308c880fe98d61c14c792efc2e038919df8e6e0e0fa0679e10901d1898925fb8ae0134078c490d33a5d2338e358b049f539f3d13b528d773625f28c59e1558ecdf400735a043dd708a47b5100513339d9dadd599618ef7e60cf971ffee17f62dc87b1ce81636eba3e0e1aff7f7b6f0125c971e6fbfadd77ee3eaf250d37334ec374f73433333333334cf730a39899992d5b9265d9b22d4bebb5bdb20516f38066466049f61ad60b5edb7bef2ff2ab8ecece6aa891e43d7a671d274e4e764d555666e42fff1f04147cec9d68644aea644bfe7853ee706dc640552a771d4f021aa6ea73c8648008f12a2241d79aee7a65060a95398cd2f5aa7b4fb4078a662012129850453354cdda4884a282949c682a7c94e76c5495b0363fce508ea4ea9294ea8acce8083f3797afad5af1bf9c9dbf161d1358d750b465fbe0f77ef8d0f1532ff3bbe2ef9c7ae1e4c7af50453c341cecc0c4d10f7ec6f6040fcf47d0f0f363a79f9985435172fcd433e2b5203fec9c78ff2546fa30c5fef63baf010e5984547e4f43fd64c22d6a6d6b162165e173c973b03887560e16e79068c5bc08a9e30ea92d769dcb6db082f1e27098fc4dab4eccfa9e7a3175850e73e324e36e7344540f9f2157cc21fed5cb54c64d519ff9e943dbb6b425c6ba47ac5fb92178859a0b3452776447effe4d6d3b86ea58f684f5e459f482df50626a09897050000bd65a113ef8931c282109e33606cbd318f7c534573571cd703fb5074aa64b498591d8b0c08178481532cab3d40e708045597694aab931f061284762557172517e4244a89787dbd92e4e7fefeebe222ccc3b373fb1a3ab66cf81e9d7dffed987bf7ef71803833f791dfd38f1d14bf0f1cea967f13f900d9b7ffac90b273fc157454560e539821a896b5468f3feb3c74effdc0cc7f1d32f329d89e96eb7de7ed57f1f1c274ecfd91473e2cb92ea10cd90b87c76b8b99e2767dbd14ea82cb36f1692398b638473d28b4d0251cdce60cdcd4f5f3d7dfab9bbefbca8b63a25227c5d78d04a4fe7af44ad5fd5d79c0b1cac1e3fd95132c638ef460507bf4a8199c058f0b31800818450d9673bc08fb4152690c990794a900113a434eab322a4f744791bca9444808590a1954393a14c89414659662455ed6447956645524bb237c247691ee2918078e466458706b9a11cceebbeeaea7a7640804b62f286dafac2ad3b47e91e3bfec1eb277ff906701cfff065c4e3f8872f8ae781678a9511e703e578fbd44f45518e7e300787f0219a215b81e3c4c9576fbae572e090454817540e895696558edffffef7cb4f8734c131db896af8a1f3e1982363fe8064030b53f8aea33276c8074b4a98e743efcba07b3540f29397f8dd439245249b7ff3bb775f7fede9fdfb469213fdc342d606787fcdcbe5ff890a5ddbd3927ffe9e61a623f3d313fd7559cc601ea8cb602a337cb07e23bf408057815ad05d42a7092b4723152a52352629018778a08c2216df53f5a10044a6ca94b3d55189d814e0000b830cc54469464449fa86e2b4f0e28c0d0a8bcc88e2f488e2ac28f828c98d858fb2fcf8acf4c8f5012ec8c6dad5ffdbd9f96c6fef75d1b1c195d579bd83cd87cedbf1f3177ff4c1af8e1e7bff95131fbef6eee95f6062de7aefe7f81f8623f21c12a240f9c4460970201ed4396f74168ed9a8f845cc0a70dc70d3a5f67010ad68b36286839f4c2009a6cd8a79b53887e0307c0ef14625896eeb5e31c1318f8cb9bcde7c2c8c187dae9f493a2421802d4f06ad70fa572ff3e3ecfc84ae7426e167e1641d3df1ecaf7ffbee6f7e77f4d1c76e6d6d29080f730e0e5aedeff5353fcfafc6477a0c76965d7678ea82ddc39bfbabc63b8a5934474d5f3616cde9ad488606a90889f22d582841cd61543ffb28a644bb9f12b22a208c5a91b9c116ac1a992e45465e3481095850cbb32220032c0ad3c2a44246517a7851da86a2ccc8e2ace8a26c558b736252934243025ddd5dcf76597796abeb0a0f8fd5c1215ed9b94955b54523e33ddf7bfab18f7e7de2d4c76f9ffce55bc73f781544de3ef93c2a62981842185b7c0b22c73ffc05155d517e89119e488462b81aa4cf5f521d2befbfc4d0f3f74ebdc64f266838e4679ad44f43ce878385cf6541300d87fce2b086833cc7678343459bca275519749b07aa81503bb32353f47026199f32d7236020823cc8af6d0307424a13a0a5340122c9d5920378ffe357f1ea89fafef8e78fdf39f6ecfe0393c9292161a12ea121cec17e2bbc5cff7744f03a465b5d7678fad203137ba6daf74db56ee9e727ab4b581503fd800f96cd5033dfa9c6fa194c6d65deb364324870c9100da964b7540203cd302255713c250daaaa11b2a21960412dcbdc001cd0a0e1403c20a33035bc90d73337166446e56744e6a54525c406028787db394e6bfeded979858bcb4a6f1f97c4a48d55b5253dfd6de75d72e8b9977ffac96f4f9df8e0cd63efbfa6ea87afbef7f11b27f1423e7cf99df79fa7be7dfab9374ffe5c93819c28a784a4aa51050e5a4cc381725c7bfd457af962e0e0c756040e568b138714e530c3c1afffa11cb22afe19c3a1c6b8ce530e63a10e5b86c34e33e68f599acdfb4a6ee705a235cd0134f027d5b0b2aff0b820a754c8e04765480380c56ffef01e3bc74efde2a1876f6e6c2a580f16416b8302d704faad725df3bf827ccf69aace3cbc7bf8c27da307b7f41cdcda45d8c23a7cbb46eb581b7aac258f05818d4884013b9a8c68c97b4206ee852062f81936df5325304c64b00f0d624da8606190118e419907477a8422c380a330232a2f3d222725223b79435cb47f58b0bba7fb8ab5abfebfb56bcf72723ac7c3735d6cdc868aea92c696dadee1ce7b1fbaf3ed13af1e3df5c6fb9f1ca5befbfecbef9c7e89faeefb2f1efde0251039fecb978e7da47c11aa90319f0f0443c181c4e27360568e9d78f9aa6bce070e59bed802078b903a02874cb1ffcccab1081c0b91a1a767693850082e95a741b95d1fbdc8d5be730a138b2ff6f207bf7ee393df1ffbf5ef8f7ff29b77c9213effd2d3dfface3dd7df7cd1f496beb4cc481fdf55de3e2b7dbc56f879af745bfbff86f8afa9af48dbb3a507b7e3c0e66ec4e3c0742b7c1c32d262db07aac65bf3e183a5fbd00c3523de58280120c4f15423bb8c7d3128ca03352291b9042846c4a0013ec4a094a4874915320a5243a9ece06dccc2112570642585672484c66ef4235af1f359ebbcf66b2887120fd755e11b028bcbf26bea2bbafa3b36ef9cbae4aa0bbef3e423c74ebff9f16f4ebeffeba3c73f7aeded532fc28722e323321faf528f7e380707ee88544342302e8a8fa3279fe311c2217df7d88b975f79c41e0ebdf0f9170cc7890f9f91acada47565488124644c635fd5f002ed2b0810d80e158019f61257dcf0c665e7655d89e5f0c530b7bffccdb14f7fffde47ff7c14ebfbca1bcf7cf7070fdd76d7d507cfddb66dd7d8f07867756d01ae9cbfbfb397f72a77d7b33c5cce725ff7555ff7b36b4a530fed1cbe60efd881ad3d3b265af8b96feadef166d21e3b476aa7bb4a5809b4bf56b9204c8167fd0ce090ee129850590d6362123645399b10000719e16ce1401c4f43240c2032c3a9ca9aa48615a6844a2d480ee14f9cd3820cc3c4a42ab7233f2d223b29342d6e7d726c506c845f74b88fafe76a7c0e37b795c0e1eab6362c3c28333badbcb2a4aeb9b6a3b77d746a78f3ae991b6ebffe85d79f3dfde9f17ffeb78f3ef9fde9539fbef3f6a9978f7ef00aa050df38f12cb68647e8ed93cf4ad02b42826088c371f4e40b0cf331ea2b975d7168c7ee4d7b0f6c3f72beac16a77c0ef5334df7dd29caf1fdef3ff1a31ffdc8fc632bb2fe8265557c8794437c089dd837772b0b2292d0958149b69e462322d76228713cc270fad337defbe5ab900113273f7e8d40ffe3df1effe477277ef36fef13d43dfbf28f1e7de2fe9befbaea82cbf7efdc3b3939d3373cde3138daded95b5f54921e11e51f14e41618e4e2ebbddad3f56ce0705ff7770405fbb6f61fd933021cbb37b5ef1e6f028e3d634dc041da745b7f256bc4c207eb0613c2b026138babc004a684aae1a0c744c30119caaccc3a19c0519c164a2d4a57555993d4302adea850c20e7014654568b72337253c33617d4a4c50c2467fe0880af5f2765f89cf217038bbac0e0af64d4a892f2d2faa6fa9ebeceb18991c1a9c18189d1ed97378f76df7ddf8f433df7ff7f46b1fffeed4c94fde3efed11b9081238289810f9e22da90a7cba0443922b0a2a29b53bf78f7bde78fbef722f5dd132f5d78e93e0b1cfc12cf6270308b1a9fe373c1210a61e643889161b1da70e8e1052ad56f180e490f7355d00016e404dffff46d44e2d77f384525907bf3f82f5e78ed278f7dffc13beebffee2ab0eed39b4657afbc8c854cfd044d7f8a65eb623135d6d9d756919b17e01ae5e5eabbdbdd7b8b99f8d72b8aefbaaf3aaff85ebb7774b1f6ec7becd3dfb367791f0103e804389c750cd4c77317c605fe08328869f6c657a81868319062887190e5b0ed48043ec48512af2105298a6aac4ae6c91100965d9024731efcc5496a520250cd9488f5d9f1805193ec01119e2e9e9aa1c5237b7d538a44eceab7cfd3ca26337169716a01c6dddada35323e39bc7072706416478d3c0ae43db6fbfffa6d78fbd847e7cf49bf7de3a0916bff8e8b7c75e3dfaf337df23d67d8e7afad3d7a0042c8cd43bbd33bf403348b99e38fd1a7d2be75db467c7ee19b372d8e0307eab5c2b875ebef873c2a18c886500f4ac66a8e854399b6a18a38aaf24d0c0c134187f99f3a662294e7dfad687bf39fafb3f7df2cbdfbdf7cee9579e7ffd273ffca7c7ef7fe48eab6ebaf8dc4bf76dd93331b6b97f68a2676c7a6062f3d0e8a6fe91a93ef6fb473b7b863aaaeb4a63e23778793b130a7a7aae22d5e8ee7c969bd3df030741c1beed0328c79ee9aebd339da44ae163cf84322b28c7f6a16a960edec46fe1b415901f030ec4434d80361c5235c9c00487b8a25454449c0c2364b59995e20cfc8c50d10c9830e7391431d991e276e42585652586081cd1e15e311b7c23823d510e57a7b33d3cd6babbadc3acf8f8bac727c6955796d5b734d435d7b7f77440c6e8f4e8c496899ee1eee1a9a1f1cd63072fdc77dfc377be7df235f838f1d15bc73e7c1d2b73e2976f2a43f39e7ad26082bc083b6afff4cb54c860a4cff153af9d7be1eef9705c0a1c2c08469e83359f80e3073ff81e66e58b814375ea9cc67ca8c4ad0c5d949e65b05091a7117480022201cb46b24fc5eb9cf4e94fdec26a7cfafb531ffdf6c47b1fbff52e532a7efefd479e78e0863bae3cfff243bb0f6f9bd90513834353bd53dbc747678686a6fa47370d52fb47bbdbba5b1a5aeb9a3aeaaaea2bb2f3d223a3c302023d3dbdd7babbaf22d5081c4a3cd6fc5d4e5ae4aecd7db81dc0b167bae3c0743b7c188834f19325fcd8912c2d3dd959c402b12ce2d65d9dc24c24713598230f1c6c551c8b54d8c1a1b31a8a92ac0df0919fb45e4c89488858163c0f15c1e26d2487e62484605366e1f0890af10e0f74f7f35ae3e9b6cad3739d87bb9387a7b39fbf575c426c594569635b137080485b4f47ef30cfc3d8c826a522fd63fd5d839d5072f3dd373cfbca33273f3e7aea9377a1e4f8876fd286d4378e3df7d68917de3df5124f1d58b0f3cec997d18c13a75f3f7ef28d43e7eedab967b3a11c076485dabf221c18081951a2071de93fc59938f5c9ab3813a481f11b543ef8e3377ff52f273ffcf531d2c3afbef3ec4f9effe1c3dfbd1f202ebcf2c8b67dd353db47476706406162ebe8f89691b1cdc3549e95914dc3e8eac078ffe0587fdf706f6b574b6d534d537b637145516c52ccfad0c080406fe240272702c2bff77039dbcbed1ce7357f979610b269a405b7839865ef4c37a9d283330a11025ae04039b60e946feb2f9fee29653d50595a9ad5dc98ac061f320d9a6d7dde46e974d5190e895024a52115320a526d64689ba211c92721a66423243b7e7d465c485a4c70426400de066484fabbfa79adf37247f3d6797ae050bbf907784745471614e537b436b674b4b7767674f6f7f68f0e8f4c4d50fb470727b76c3a78c1c1999d33135bc68f5c7cf8de6fdef5ec2b3ffde56f4f7ff0ebf78ebe4f47cc1b4719d4f3d19b0021701c3dfdeabba75e79eb381d6f6f02c781c33b8063dfc11d7370dc70dd5f4b39f08020402a0a21957d5e7fff576f82050a8127f1fea7ef72c66f9d78f1e5b77ef6e48f1ffbc663f75c77cb65872fdeb3f3e096cdbb2727b7c1c1e0a61d13000119d040e5e10088a1c9c1a1c9a1bed1beeea1eeaec1aece814e2c71537b338f147c6417e48444847afb7af8f879625970eb302ee41c9556affb2a11c15077f5aee9eefddbfb058e7d332a1bb667a2916c07bf4db1b9af944a660c38e4170b06eab35968053e64b22b7028f1c88f914e5715aacc02a1bd511c521c8efc9460a40232ccbd2ab29f971a86b7919b189a191b0419291b0363c37dc3025d2163bdafb3afe75a2ff7b59815e0f0f67147398023373fa7a6a1bebeb989dadcd9d9d9dfdf3d38d83732d4cb33b2797aefe1fd9bb6cd606bd092b199d1fd17eefbd6938f1efbe0ad0ffff92411cdc98fdfc1d6bc7df2151e3fc8607becf4eb6f9f789978f8f8c9b7c042c371c9a51728e530e0909f4cf882cd0a10e00461e13019c8034050d9c1c1240445e29e7be51f7ff4b3271e7ff2a1bb1eb8e9e22b0fef3a30b379e7d8f84c7fff687bcf487bff78d7c874bf2804d70910d0804e50050b9a40b4b4bdafbda9a3a5a6a9aeacbabca4b2b4bca6a2b4aa2c3d2723280cbbede1ebef85b576c6a7733acbd5f96b5e6e2bb02c2971c1fd1d153b37751ddc39b86ba60b38f66c6ac527dd395ab70d87a3af7caaab50961eb7fd96454bee60430ee2c10468c8a08a6551330c0c38086555b5a5416da10a6ea9f81c1811ed700825d203978b7131e0c88809848ca448ff8d215eebfd9c8023d8c7c9c703b3b2c6dd7d8d97a70b70f8fa7946446dc8c9cbadacada1965555d73435b57475b5f5f4740d0c004a475fcfe8a6490ccdc038518cf245fa267a47b78cdcf1c0adafbefb0bf8a012d1509110348304ebf1f7df2099061c474fbdb5ebc036038e5de75e70d01138f43a939f2594657c91f2283f7ef3835fbd43f0494700f2f0c21b3f7de6c57f78e0e13b6ebcfdca2317eddbbc73026381d33030d1db37d63db9750249943ab56d6a72eb24b79f876064666268d318959de1e9f1bef1a1aee1bef681eed6eeeefad6d6cafadac2f2d2b49caca4b4d4e4f4b4948cf49c82fcd8c484c0d020648366c560bbbaaec2e7a72b0be5c0b2e0f475351713b0ecddda8bdb816c187034ec1ca9de3e54b9a5bf6cbaa71838c6daf2f139900dfda316fc4c3c4b278872a85487a11cb81da21c6806a60426a041d48248353f2544bc0d5bcd882ccd8c2ac950ae687e5288d894d49880e4a88084483fe008f1557004fabaa01c3e9e4e7ede6ede5e6e3edeee4141011b63a2f30af2abebeb6a1a1aabeb1bd836b4605f7a9adabb5a3a7b5091be9191a189b1e1c9f1e1c9d1a1899181b12110c1d09c7fd9798f3ff9ed374fbc76fad3f73034c73f7cf7f563afbcfaf68b273e78f7ed13af43c69bc75eddb26bd3ce3d5b81e3c879072fbef4822baebadc508e3beebb8f4548bff9f8e38fcb0fbcb138077d2b2fbdf492fd2ff19c418694c8938a33f1fad1e79ff9c553df7dea9b77de7fe3c5571fd973642b610521063145df4817588c4c0f622c20c310c331ae87ca0eae965c24400c4c8ef48c0eb4f577d5773497d557155496e49517155756169495e59796e61617a6e766a76565a66767515333332263a2fd82fd312b586be02020840f3797b3c82c79bbaf88d9e0dddd52b27fdbc0811d0344b39041c5e1d83f45285bbf63b86aa6b76482dfdf6bcd1338648b672a706059b4436a4e7588cfc156b21a0287ca84ce862aca9a646da40207de86862325da1fd9888ff08f0cf658efb32ed8df657d80bbe2c3cb39c0d7c3dfcf2bc0df1b3862e3e38a4a8a312be5d53525159595b50df5cd6d2d1ddd90011f0dad1de8072a32383e2a8ec8e0f830b577a417a1dd7570e715d75ffeed271f7de7d49b1ffef3e9f77e790c2c80e3d8697e4ee7f5378ebeb2e7106645c171eef98780e3caabafb8f146d6b63e333818e9e35012ecedf75efaf94bff402ae29a9b2ed97764dbd6dd13d33bc727b60e632c46a606c6a68726b78c0284540102af0a1460826dcfd0407b6f775b4f17db96de9ea66eb068af6e818cbaa2eaaac2aa4ab690915b5c4ccd2b29c92ecccfcecf4333d8c62727854546f804fa7af9e07028381067f8c0e71038508e8ec6421cd2833b860e6ceddbcdcf074fb598e14039c6db6d64808518178183b0c5460603388c50c566530cb32219529dd8503df2192a420114db0030635c2070605088530862095552a3838003872322c83dd8775d909f6b58b0574880979fb78b9faf4760804f60902f7044c7c61870349656561596969555d556d737d53612a07536b6755141a4adbbaf676868606cac7f74747c66d3d8f4048d091cc353ca1c6fddb3e5b26b2f7dfa9f9e3af5f1c95fffe1571ffdea83931f9e387efae8dbc7dfdcba6bf3cedddbf61dd86d86e3ce3bef14e5f8ce77bee38872380ac7dd0fde7ad935e7ed3f7727198881b1aec1c93e155fe0574e8f8c631167702dc7318d04eb7d23033d435c525ff7603f4c706d2824d6b4a1ad0dabc1b6a9aba7a1a3abaeada3bab9b5a2a1a9acae81ca4e455d5d514505ca011c394545b98545f9c5457945853109f1211bc2bdfdfdbcc1c3d7c3d3cbc5cd75ad4a423b11ade0739cbd21d8bda1227bc75437e2a19463aa1d38f0460955b02cdb062b0cb352a49543cc4a6f6d9ad8140b1c6253945b6af4c4c28774cd2b3b9219a16a3a8a420f1cddf7315579711a0e838f707c0ebcd1a48d01711bfc22d67b84f8b904fbbb85aff70e0df609f0c5a0b8f9fa78f8fbfbae5f1f149f905458545251535b5c5e915f5c565456595e555f534f80d6d1dcd1d7de33d0dcd103226c3b7a07ba0786473701c71456063ec667948d86121afcf04587ee79e8ee1ffdec1fde3cfec6879fbe7ffa9727df39f1d6f4b629131c178972b0b635abe23ffcf0c3c0f1e4934f92e7c0ac3cfffcf39815fbe58b65e173879483cea1e1c97eaa1289ad139bb64fa10d9c19c1053450719dba077bbb0614135dc3033da3d898818ebe3ed86fed22285515c16ceee86eeaeaad6fefaa6969af6e6eab6c6c29ad6d28aeae2baaaa2dafa92f28adc8295464641514e41414e61515b3dd18171f141ae2e9eb8372e0c77979bbbabaac59b776050947521dd4107fe7cac2949991d63d9b7b774f75ed9bee54966542c5b1b36e077c946a87143254346b643b246051dea811caea496c381fba6f45653f19ce031f99110cf79a2323578d35070edc0e321c05292439c2497f014762940a5522d7ab383624d06343884fd87adf207f2f1c0e0f77673f3f9f8888f0acecdca2e2d2e2f2aa8292f2bca2d2bcc2b292f29abac6b6bae6cea6f65e2a3b358ded0809a0740f8c8008fa31383e4e3883ad818f89cd530833770150761fda7dc3ed37fce4b99f7cfadb4f3efad5875b76a21c3bf61dd87beef9472ebe7451389845fd05c041f2bf7fa497f483f228378de03d60ff7091a8d0408c8ebdc0a3a4b6f4f4b5f6f6b7f50d740c0cb1834e3476763777f7511b3bd18c6e61a2a2a159b665758d90515859535259935f529e4b3315978148767e41565e7e5a56f6868dd1fec1eb3d7cbc67e17033c1710eca011c2539f193038dbb677a8063efa60ec40338488f1a7cd412cd32b694b1c784b2f24349920a235a810c8143cd633326beea81c492e490413de27e32d68b51c4320b81ad1a54cc58f39c18dc0e1c526c8a0a55e242085570383686799318dd10a4c88808f1078e403f4f4f0f173777276c4a42425c764e5e5e7e3158201bf945e539f925f05156d950ddd05659d75255df0a1c2d9dfdb8725412643c545d432383939b86364d0d4c4ef44f8c520726c7b805a39bc6a928cac1f30f3ffdd31f3df7d2f333db37efdab373ffc17de75d70ee25975d7cd53557de74d30da21c8f3cf2c877bffb5d510e0b1c96156a1d558e8919653520145a398f81b11162f1ee91c1deb1e1dee1616c073ad1ded36f9031d0de3fd43938d2dcdd3b6b413ad189aa268c4873797d133b60419557908dfcf2aadcd28a92ca5a94033ed88248565e615a566e525a7a68442470a01c98155f5f6f4f2f5765569c56d103eee5b60ab7835c427176dc785fbd0a58a67b8003b743e0a002874a921a2380100f8959f819949e1ae570e838d60c8774d9eb711b92ef520345733656e5c742865481a33c3b1ae5103870380cd9f08f09f3c1a62832823c22427d23c303312bd81464c3dbdb13d9c8c8c8c8cacecfce2948cfcecb208d935f925b509a5f54595c564b3b149655156365f148fb467a06c7d9b6750fb6f5a9da3534da3736d13f3e3938353932333d3233451dda241eeb28cabd79e7f6fde71e9edebe75d79eddfb0f1e30c3c152821a0e594a50e0586cf96247e120da462d24e2800c9c09d4a26370a06b18e518ece4bc11863605416d6b07f2d0d23d58d9d85cd3d2866fc18b3021b6832d7604b510e510d928a8a8a6169557e7169581053533af90564bc9c84e485170048684fa0606f805f8028787a70bcaa1aad3d9240f027cd6711b8ab26281039f74ffe6befd338678cc2a077930f8d8315c031c781e88077ce0763094903c98a43ac873a83c98b19e8288077cc8881ea31a64e067e4c5a8396d322d762138c4a610c446877a83053645e088da101412e44de2dccd755d40805f5c5c4c766e4e615119ca91949619139f929c968d6c945735d636b44b3be4159757d635615c108fd62e1ebca1e6ae015ab56360183e7a46c6040eb6c3d380320e19e445b82f181db47c6a2bca21709caf95c31138648abdac6ded281c4313f8c913b8cde88412895eec482f5241ede81dc428b674f6621d6b1a5bab1b5aea9adb9bdabb019f8a7b854e56d43697d734b1e582cb6a9be5cfb2eac6d2aa061e94e28a1acc6d69551d2d42bb641714a766e64046727a464c4262f886c8f5216181c1417e01fe3e3e5ec04113bbbaac7559770ebd153e1eab508ea29cb891dedaed935ddb273b540fcb54fbaec9e65d63f554b12c24d1351c78a6eac73b593eb632552d553eeb791879d23938085b84093d3945b0c0a0081c15d9d1c846454e5c6966340e47766278564218702857d43028f8a154646343a87f60803782e7e2ba165734252d950c076424a764c4c527c725a6a566e4221b15d54d9535cd88876a968ac68292dac2d2bacadab6c6d6bec68e01f4034404145c9081d1c9e189e991c99991c9e9e1894d54dc9191a9a9b1a9c99d7bf76cdab279fbee3dfb0e1d3ef7bc0b2ebef492abafbde6a65b6ebee3ae3b1ff8fa8398158956c4ace885cf59104c7e7158e0903cc7bffccbbf2c3ffa9c840c3490bf23eec0a9a4e25dceba99fdd00de30dad3620d8e1cfb6ae61ae0a978a5adf42e0decd0e581457358085ae30011fa515b565d5f5c09153589a9d5f24706053f04643c336040587d0ba3e7ebe5e5e1eae6eeb9c9d56af5bbbd2dd6595bb0b7db3e704fa3ae5a46dec6a2a9d1a6cda32d6ae0296e9ae5d13ad3bc619f5a3e040368c247ab9f0219e2919747e1245a259d10fe57c98c4c38c858e4d084fc08269b135f9f16253341c9091191f9ab23118d94033946c84f84486f90107b2814d71777322891713b3312b273b373f0f9b121b97141e15031cc80658a01c79851550525856535cde5054569f5f5c031f5575edf56d7d2221d817e0c005e9ea1fee1dc2079c181a9f820fb6fd23e3e33333db76ed3e72c1f9db76eddcb1672f709c77fe8502c78d37df041cf73fc8b23e0a0eed737c0170a01084dd546cc76c140e1f889ef2ab1bdb7ab8f71020957d2a7034b4f456d777182eb77a0509e199c8e7ca2b00a29e7d433c141c28075b6403eb9b995b60c84656626a5a644c6c48683870201bbe44b3de9e38740207d96837e7950caf028eecd4a8d6da82b1fefa6d139db81d26381a49a203c7963e5261653638da8b475bd4240632e8dab2a8e5668dd59bb02cd203278221f90ce584e6c7536b0a12d454fac2447600a532379e8a7230f40b32e889a5b38ddc1759510952a2c2fd8183dc17b281371a1aba3e2d23b5a0a810e5c8c92d8c8c890f0c09df101597969957525e575a510f1c699905e939c4f0d5e5d52db41eca5156d55c52dd4c0312e20a1f8288f0c16828f4637c7a8be8c7f8a6e99d7bf7810870ec3f7c04382eb9f47281e3f63bef581a0eb3437a06ca411cd5d60db9f0dbcb294aac25b5b97d0085a86feea96bea662b3bb58d5dd49a864e2e8f8aef8d078e298189dc92aa82523c0c3c2fc5879895e2b2eaa2d22a9c32e0c8c8c94f4ccdc0db884f4e898c8a563625683dca011f04818643aac4c39627753e27c8cf392369437d65f65057ede6f1f61d46dd3edeba6da471db68fd8e91faad8335333d15539da5134ca56f2da48e34e7cfc291263f7f01191a0ea62018a3cc6d55c19117070d30a1ab014742795e7c596e5c51464c6e7244465c586a6c08710a0685f40659516c4a445840784800de868bf36a7a62918dccec2ce0c82f28c2dd068ea0d00dc1a19151315c717e4e2156b542490826b8a695d6e3e992b6ad6aec64dbd4d6dfd2318884888aa01fdd03639d7d433d83a3989889996dc0d13b3832323139b36dfb3c38aeb94ecc8a050e59f3491c52e6427e4638c0135401967312389421342aa7cb496b38b81ef6210331143214fe0619624a8043c966451d64081cb860904125a2830f5cd1b8a4d484446a327004af0f0d080c5664cc8783e65679529755de1e6ba223fc4bf2923a1b4bc6fa1a49786c196bdd36d6b265a461cb50fdf6e1862d03b553dd154c6961d6d3700b3fd1983fd45cd0df90db5d93d9559dc1cac3ac08c8ba806a51c0d2245604548b29309fd180c3a61cb370d41525810512225894e6c41667c6e6a5446253d2e30d382203496f201baa067953e969735ab792388520252525253d33832096fc0dd7181ab131382c2262637c42327d4845d484d46c3c0f94b8bd7b8486d58d595ed74693f2d4f10aadcd03297cd87c5595341b1a1c9b1a9dda3c32b16974727af3f65d6638aeb9f6fa9b6ebef5cebbef129f4387b20287ac506b0f070ea9433e07f2c5797042163238517c252c626d4b0fb5aeb5977db635cddd4a30eada5145a9781b90815a6056b46c98e1c0b2141457607d81233e2145c38159b12807de2866659dd34ab49a4e163c8f9040b7cce488c6eadca19e3af13cf04c6de231d2b875b06eba57cd77028b81c63cb0a0f6d6f1b3d00a0e1612550b521b64187024091c363fc348834a15f1a82e4aae2c48848c92ec18c828c88866fe414642785a5c68724c485c4400e109f9f2f5815e817eeef4b4ad5d730e678bcb9498180f19a9d895cc2cd431262139607d986fe0fae8b8e482d24ada27bba02c222629263e8d1d5a0c1478f6b0ce3472457d7b79755b454dbbf23f9a7be0067aa8fc2fa06843437030c460e5b14d061cfbb559018e9b6fb9edcebbee79f0ebdff8e2e16835fc64214339102dbda2789c374c800255e0103290412103c329b5b4b209b54033cc70c00a3605e5282ca914b392955b84b7011c49c9e949c9a9511b63b443aa2c8b9f0fdd2b9815a775abd6ac3d8791bac0e1e1ba92809699ecc5b9899dcda5031dd5f0b175bccd108fa6adc34d9b071b667a6b27bbca475a8b040b1b1955595d5559fc2a8ac0a17eeaa024992544f12a885a252a119db0c0816ca8396d193190919b1a9999b841c848880a8a0e5364d09302193e9e2ec81ba74a376c5454444a4a12710a7060507800a2e393fc8242bcfd83302938e3a805ed139f92051cb14919f1c9b8e444bbf570d03330d9d13f5e55d7091c6555ad581c54042680a3b3778c3774f58d53797471f83a7b06bbfb8667b6eedab9f7c07efcd10b2ec2e758100ef21c2887ac6d2d0b8259cc8aa3cad164881870700d9c0101aaa89c610edba5d690ee6deeac6eeaa8a86f255e35486f153ef0bd09cc2436cb2bad0611c483b6a04206cf0d9a814d211d94929e939894468097929a493b46c7c4897288432a70e0f6e373ace689745a49c28341343e9e6be1236163607921cbd1170cb6579330ddd45f3fd55f3bdd5f479deca99eeeaf19eb2c1b682ee8a9cfe9aecbeeaacde9acc9a6765467c087fcd4815a79b83499a59b4876118c8085f63de183fdbad2346403cd28488f040ba62d4106d624393a18831213eeb721c84bf5c12acd50f998d5abce828c0de1eb939212a8f1890969e999e4f7508eb0c868e0403ce25332b0ad84fd58de8cdce2f8a4cc98c4f488e8146a5c12314d251adcd08e2919aa6dec29ad6c2928a9a719695b9ecfd6ce21f8801276c4eef70dd2453eb275c75ee03870e4fcf32fb8e4d2cbaeb09995bbee79e0c187b4722c0d87e4391c322b2a1869eb938a425437755536741855399e22123850ec8b35a112a4e06a604a44307042a512c71795d61496283f43fc506443bc0d45464a26c618e5c8c8cccecccad9181dbb3e3424687d704050a03f1d56be4634ebeaece4b41638100f1e4d35bcca6d8db7fb6acc7ce2c6e0f2c2d48ea6b2d1fec6919efa81ceca91ee9af1bedad19eeac9dedab1aeaac1d6d2eefafcceda5cb068afca6cad486f2e4f6fabca6aadcc6c2c4dad2f4e6e2849c1b1102362d4a4eafcc48afc045dab0a52d08c9c24c888ca4a8a488a5e8f29a1aaa8358c449d9b316e4369c68a73be8a4d21431397109f9c9a92989c84174587007d46c4ea7ec1619e7e41a1913109a999d9f4af187920ec2c3e694a663ece47626a5e4c42e6868dc9d1f1191939a5c42c6268686a79d2e08357204339aa9dfd1daaa36bb4ab77a8af7f64f3969dbbf71c3870f05c81e3ea6baebbf9e65befbefbee071f7cf0d1471f259435ffd8caabfcead71b6f88725892600ec18160882a8085540c873284756dd0c059220f0a08233ce1ec9537dad0c60543467e49555e71255b9b601870185539a19a0ce214e0484acd8a4f4ec3e148cfc8a246446eb4c0e1e9e90e1cebd6ad71a6fbcd69257974dc520fd7d51e2e2b18a789a4a7c6879615a4c0c760772df10b7c0cb4570c76940f765442465f53514f43017c74d5e5c14473596a4b45063b6c050bb620021612a66241a42a27234b55fc0cc8402da829b1a108c6c6501f9c5004036b021904d83843740d4206de68e4c6a8a494640c0a5b04113848e4109c7807acf7090cd9189fcc7026123c4686b0852da6362bbf34354b05b46959c50929b920129b98c50e40c8b3c756dc52945b250b1a3a55476ed7207c74740ff40f8c6eddb67b093870489786835fe23903e5c0944006b6a3b2a10d2c040ec820fe56ce447903153eb493012e84af02076a0119221b2a4e29ab9dadd53c2ff0814d116f43c1919649108b65417e69c9b0f008e0080e59af95033858cf40e058b376c5ea3567c38782c375355d2df041644bf0529493d05c5bd8d154829569adcb63c047674361477d417b5d3e1532e0a3a32607c168afcea5b656663796a6d717a73694a451eb8a523416157949e5b989f4ed898741548211210d8a7ba1b108f071c6ba319c87d3705ebb42c8205f17bcde1f53826c404622d398925348fbe273e07078f9070785452667e44006b655948346436b7996487ce0966253d00c240438c2a392d8820b2fa222c081378ac381785055a2bdbdaf8dc1b73d830383635bb6ee72040ebdb6b55939584af0cce0905cb8a4c3c5e100586820cb8bfd239107d4ecf30ae74d55a018e12b3a69f3434baa104c2e188322159b2266650e8e0cb4145f2c0d5714870311c61b153810e78000d5b9825961251467b4c369d5aad567538183e13f5816b2e98cf0767362e0f1eaf0f59e2909e1053ceb790974e8d795654aad2dcda82d49c57568acc86ca9ce69adc96daeca6687ca2bf565e9fc574d714a55a102825a96a76a696e4261664c7672248e2769aef80d01601116e0c6580dc6f2f87b3bf18dae4e2b3c5cd7ba290f74254ea893f36af2a11191a109498918142c4b6c62525c52321788c7bd312ed17f7d78444c42567e312e173d6d92f5d186183ed00f110f3cd3e4f402fc8fa8d8342aac64e696e51656f158824547cf286e4757ff686b477f735b6f5b679fc5ac5c76f99516b322caf1e31fff58e060718ec5e0f8c31ffeb07cfa1ce5800c4980b223a64465eee802308401490079d8972ab2a11d0e2e950c0f57cb0351500c0daa6250a89a0c498c221bf81cc091929a1e179f181a1e2670e07604062ab74375af80879b8be80788d061c14c21191e46755e7b361db646b7dc2a10498a0926459695b221373d3a2f23263f7da33892ec20061505c9e5f9495545a93525e970c3169240819e3c2a40146410acc6929e4f4f0cc7e165d62b58a019f49e30f28f9e3f6f0fe61cac45305c9d5681059a41e08aaa7192c1c1814c6b4339e29212e924820c2a17081c2807de466c12516b0979e1fc920af1d08143baecd9a7ad703e9233f292d27301024ad826a5e5a7679750c18557782cb12c78a374de62539a5a7b9ae902c521ddb67bcfde83070f11ad5cb2201c2ceb6386c3bcf0b959391c8243facfd8ca081495ebac68c494b0159742e0e0aaa4ca15f228f03a8221b93ff13cb4432a6490d8c8ce2b264ec181070ec8a01d6d7024c4874728e5b0f1c138888000e0c0b2b8e378b83aa31fdc06e0707357d3c8040e3537c46d0ddd72eb567f1547042bc3f2188c026780053313e322fd9982c63eb7393ec297215b880111476eea46e1202f2d1a3713dbc18b0091961096121792181d44240210eb039867e08a60283be2b68a6fa10a1604506b569fb37ad5d96bd7ade4f4f09e23a222910d46b2c104b2814d4114518ea4f4aca8b8c448864da76666e61551e14362371eaadaa6363a2f1112110fe217f820b8153eb2f32b302b5979e55476c8b2232120c20359dfd48959218e1d1a9ed0705c70e1a5c041b472cb2db7dd73cf3de290a21cf670b038872c7c7ec67070d20287adf3cc70336da16971a5c00131922667cbdbc47c0a1c54de6fcb7d55d4d38f60042cb6202533a7303d2b1f071e872336310538908dd4f434a498f65d0c0e6559508e756b1070f85070b8af73735fc3384dd5cbe5aef890a1845437a7af31e78c5e1858a132b4135c18254425db8d3b8918e05a92a820ee10674289449837f3d5543a3c10f3e1ecefbd96e1230047c57821514e6bcec2b758b3fa6c2a82b16ae559c450a81a21374bcc30be9c4b888e4f484849850cb6caa66464a764e6605070457138302b19b985c061a47c141c55f5aaefbabc46a58f7985b64dcb2e24ff8159412d7041e00320b0e69815cc377c6065c0084b5d53dfd6dad12b0ea928c7e7818331820e2987102dfac12dc794c82d1731507a302b89bc0132101809cc54d6cb90169b374a62c38863e97b4433f0434536e8b3367adae8a3570f99ca1465a4d3b2b8fab4b2560ecc0a7d6f28368fa6d28d756bd6ae5dcd936af081845057316b88be0c0c0d528f1742721dfb42651e83aedc63f22220a2aa8f1395de107acb702354b788af3335c87b5da0d7da004ff57119ac4a0f30d5856536d6fcfdbad55f030ed10ce103cd58b9e26bc4d890111a1a0ad60c21860f2e87ee653a117145c182a12ad010159744ee2b352b8f5e6894039f143878780cdd6d4239443fc439c5f310cb42c0929aa9fae4488e0107ca4d0480ffa73249157539f96519d9453469734be7f61d7b1783e35bdffa9683cae1381ccd9c2ee7cdfde61ab8e5528512b65c1b1726eeaab629bc936bc30985ebdc827280c0d530cc8acd09557db0398504292a42315c5186dd5281833c07ee3da12c3ea9f021433abc7cbc3dbc3cdd3ddd4439d6ac594595e0c5d08f753cbb062eabd01228115654d797cb4ad2a94646554183eb0a37544fd795c6a02184c149cd4be3bf408aa98b6e2af76a74fc62a1be2634f0a7a0b076cd0aec08501231f1752aaee61c5c9d3cbdbd385598906a381c4cc0611a8e8ac25047025704232e391d9b826c8005159f94bb0b0a349d211e4aa7c5fd478f850f825ba51fc99908096d4ee3732f785b239d594dddd575ad74ead2c2648c5a5abb74b462af1cc0f1c4134fb0e6d34f7ef213c990ea9f4c903c872c7cce8fad380a071457d4aaee75733a4ba253f1463951435d94dd61478ddb3082588950cc7018dea872354436341c90814d898d4b5099223a210c38e87863b04fd886703c530968c993c207b3df7846918dd5ab5752d98115c8a0439f1bc6ad62dfdd4331212a42e241cd7097390d2eab542ac2f99cd9ba5285c1ee6aba22ff45d031eb49ace06dfc29e683eab28e3fc5eb54f1888bb3b2680207deb1abbb0b0319719cd10ce6a4c4c4c546c5c6e08a0a1c823e3ba845621af7389d2d9a81726053885668406d97c569930840c639d092f86d921c634b93cea935690f555ba9f4e856d634f6f40eeddcb59f50d6deac7cfdeb5fffe2e15023b8aaeb6578a34e5acc253d2beab830ed94483c06313a48e162b47208dd1a0ebc0d06c989720007b281c3c1c86cd2a3c041fa7c03f3062323e003fdd07c701ba041e058b56a05e2012bea0ea9050e1422ee1ece54e585e0ae4a386354e9e837baeb54050bd9e2c3b2159d80032515ebce66fd2ea9460cb2022cc87bc20495ce3f49b4ac5c790edfce577bfbfaa01951e8451c84c76f5470c419e16b2ab2c1d5b16378a3d9680670a464e6a21c02070d2b493089f2a8ec8b7556b1a1e1dd23c3c42fd817fc53840456c49457d247a16a73556d4b15138beb5b8063dbf63ddaac5c7ec555da21058ec71e7b6c31e51087f4e38f3f3e33e5e0ec4d7028574357e97fe7dac4db90cb037621032c5432a7101ad418272382c5e150c972b129781ba4cc050e1c0ec257d5fb909d4b7a14508003cb021c842d12d6f268aaf1827ede442c84b3f0011c221ef00131625c0c32142b12e82ab3e2aa469e1a7777353b2aaf4adeddd3068d0d1d46f2213c863c60987425154b154da26787aa06a439afe37b810383821b84d543332003d9888e8f830c625546b211b57269b6fc4d5aa6c0417f0af60532b029c4b148b2b6263a1d207ce8f4018d4c4b221b896939f04114032ebc01d9000b46916156482a32f9a5b3ab7fcbd69d6638aebdee865b6fbd9d68c50c87fc8697362b12ad98d7b676d4ac18e3a17132702d8d917c052a7f27557597ccc221c345c52fd16428d9205a518261abdaa00819f149e9c0011911d17174a610c74206e9d198d8787a65510ec810cb82780007ddb3befe3edede8a0f2727271e5c8143452ef0e1eae4e2c694493509400b891a966c80c2dde59673fb6d8840920c5736aa1a0360eca8ff7563c827aecc6a5229180e2a3bf04108cdc1a57f4788c4cf800cce10270338941f1a17afe1888aa567254de8c7e7c0acc0073645b2e634290e07cf9ea885f81c92479757c48d03029a9466c4e1000e3c0ff840c2957762181446814006016059655d4fefe0ce5dfb048e0b2fba0ce51038eebdf7debf0a1cd2772a642086184b431255f642bc51497c8941e132386fde603054627b3e8a70489535c9ce2b253cc19a30368e9e144650c62610e991fb4bd8b031d60c072a42636b9f43e0c0b2d8e0f0f571f7f4608815339cd6ac5bbdd669cd3ae7b54e2eeb2003f3efe6e14a442388a0220287e6034a5476c4a8e0a2aba88eaefc090d6081f910cf5710d4958809ef185ed136022b714223a263840c760c4a944f2ab92f7aeac521858f34a67acec241f3d2869228122c2478612b5646b2cc883182011caa4f3f250b4f4e25556b9a8960a968061967b6bd7d43bb76ef078e4387cfb7c0f1d043acbf60332b5fa472309dc4986ea4e01063296e36272d7048be5c4273c3095570884d4539a5535e0df4ca52a6442ab2c150978db1f41aa4905166d81c6a817260592443aae1e0b914f1c0b2186e29d3587cb831ce187f276ed75a131caec28742c4cd054454f570e645f5baabb3c52f1150cc55bc9659995134a880996e60830f4d09a2059d9c0c6448d4ca162620032620834ace0645840c8183449f190e5a8606a47164a28aa020090f731828323cfbc895625920034454bab9b49a79509815c443e060ce6d77cf801a24b8ef90c071c595576be5580c0e59a1d6f293098e9a15e302b88c39e5e0c6cb5571d2f02b70881f0a1900aee110b3aa231406d00a1928077040466474829021660526541f554212fbc886362b625cc4b2d035ce60740b1cc207e34b91136d5c040e956e37e030f32142a270312a4ea54ab9e2b5e0d89246510648590d5d8512f913cdc0a8113a893551e14942bc51137142a920428d4f559a214362714b510e0443cc0a3bf2d8887ec08488876806d2abe355fea449851876b02cd814225b9443858a258a0fc8905eccf2ea3a9463c7cebd6638aebbfec6db6ebb03b3b2041ccc4bf88c7010734a7c8117a98d853107499db4c021ddcd92f4056ab6f06ee4be9459e59d920d8409c8c0ac50312ba82ec3f331286ca9c4ae30817eb025c3e1e71f28bd6e32d8478df709f0c7aca87920be3e187b579c4317ccc93a5db12c54e0a0cabe088986c3ba63a060460438a4e346d4c26c47949fe1b48663c225e7c0b921661b36468105692ea92443c58e881f4ab29c1a8f78e07364e58acf4195c4288d633c60d5f8fb54635c1c33ff540a40670ef953928dbc48ab0a1c29e94c9523e5558e9fc1c40e8143d58aeac1a13143390e306de5c28b2e99f5396e658a3d7010ca7eef7bdf237d4e9e43163e673c8728877648a55716e5f8d77ffdd7e53bdec485a40287580ab6e2996ab3a2e1800c94434528465a5d8d02343c59de8cb322de8654e0c099473340442b870a041392e043e00002d41bf38124b0654a214cf0a2243cd40c43576ea633953718ef9957850f8d8bfe5f8dc8ac1228c130572303abb26cb89dec506407ff86cff2ed183864830885a8352125999c166335d8324e894e22fae59511c9ce235f4e050e2a1952e0c0e7208e952e15350aaeb49226226031d2482a9bac7d7941443aa7743f2d9aa1e12006449281a3a2ba01571444302bc0b16dfb6e0d879895db6e63cda705e0608afde78583c1164206948860e82ad18af69bb812e02010b705296a24c79c27cbe342f82ae24162943805830219b2850f9c0cc8c0ed505db2611bbc7dfcc476ac5e8bb5c7eb5c070d181499e324cac1ff4a551316d6aeb1080334606b662d8ef258adac984c89d9be10270b10e6c22b50089490211e283247bf1a40a467e750e1830a168ce8c929a09f8c31e5f94c764c4c237c4d4742c41b05119c0f9de7103ed81ad9741e21551109c902484f059556c5e1000ec334e767e620e71512a154d735534972b0c8c7f0c884593980c3302b0a8e6f7ce31ba21c922195657d3e2f1cdc51b12950c20da62203e29042b4f8d532e88b8b1138c4ac18eccb2447251b7c9023201e2a659e9c81378a9f814d11d9c0acd0dec0411c0b1c4c4af060014f35355dcd54e1aeb0cf238bcfc1bdd18a0216bc41de0340ec400c0c51d9e1cf5969b16161e183ee5d0a28e88266e06c8a14e1ea0a97822647e37b25a5819f81c671b698122d1bb2c3f083dcc2122a7c64e5d3ef5a886660568caa921cf00125b81d922415b78c1d8851f73e9b162624b4f1a1f543e0c09a80856c81033f03e5103258c1a1a6a17964741238f6ed3fc89ca68b2ebe745938e4c7562c0ee9199815b129d27d8a2452b90cf149676d87f2a1440fc5e710e5308ca5e2436c908a740c38248865328fb81a542671ac0f57eea7c0817161a29b9bbb9a1a2bb71f9d2034000be96a118754b010142472e18eca2b902470082b5a51b465114aa4ef1f18942acc1665450c23c5018163e5ea556c390e5f0a9ada09556430c62b5dcd3610cdb08783a9bf54110fe02037ca300ee103fd301b1781439c4d99c642355c7bdb63a6ec757651566e09e900c860079f03387035c89a931ead6d68adaa6b1c1a1e5f020e4259ad1cb23887190ecb2ff138e47328c160c88551e15d5451532f2e95781512be1a5b251b469fed3c3854efbc11c492de000e510e2a6430c30738e85ba1e30de5000e770f2f6e397785e715ef8fe7158795b0857d0d873822a0601060d3188146a323ff2b5a22c4087352b5bf628439b6178533f92ff6d99173501e686484ca77211df1c6d0938c4c21432ac605e54033c4ac887dc1d0480f8be475504d02169e31714ba589787268550142aaf0214f1a22010a74bd420658081cf9f9e5908159810cc443e0c0ac9004d3ca71e555d760566ebf9dc539eec7ac7cf170a01954f13cc43a28ef210fc74219173565cd80437c55b1236638e642956c6550e84c113888637135c4a0846c88820f6e3eb221b9732642e2798a078a9263e3e9e4a482083709fb22ca21f4b0cfdbf42be2a2ca7f0916ba9af93053a21548e81132b4f0886e49ae8533810c2af2867288c39191939b99cb00be3c638795670ac142b6d8175e51f37192d358700163aa92c2a92a952e96c5e6aae7a8070f9d10e9b5c0219d532002166a3e6d56616e6e694181f246f143850c2a0bcf0107bd6e6638aebfe126818305c180e3fbdfff3e3e074930ad1cac8a6ff999267a65197aee907288b7a1e1300057caa1e130965e518ea74a69183ba6d11eca9af266ae9c67058342e5d1010e9a4912a3d8142a7c10c192fea24b16fd000e1c521e7a1c40c49c87558dee4f4a040e58916856c480f7b08f966862c42898efb7050e4144ab884060961fc98a609ff07b088dfc0382381ff22ec0a146f1c42742067c2823989e011c2c45c424472a3b5a30840c96ef010ef21c84b8ea798849e4da510eed99d298a2c76cb566e079887db10d36ce2fa3674a665a27a5e6a4a7e70b1c24bee043badca8e4398856508efd44b286cf81727c6638feeddffe6df950b6a0b00c11c3e07166125e8bd9636b7437ab300c2c74b2dcf055d5587319ec2369311149d507abc98849840ca6f75021836d0cb9d2d474b3722006dc75a482e755bac28143526112adf006a313df8bb7018d7654b5ff2110c88dd74c6877d5fcbac97b55c2c39ffc2f87c5c591ce3f1976a4c2d798687c67e0109da3a21960c13a77a00010600110842a6a4b409bce50ae54c9f5b1256daadd0e98d0958747f6a1441e3fc9471b19459b33a7dcd2f4bce4b45c6e04ac9490f8423cf0496b1ad99694568e8e4da11cc071e4dcf32fbee4b22bafbeeafa1b6fd066854548f1395884547e1a129f437ec34b92609fc5e7c82f0005c31b4dcfc163605ffc0f1445fa8da81a0e8972454274facbf0c3d5654b1f3dba2a6645e0106f94adf4adc007ed8ecfc16dd7771d49870f2af749f2e8dc366e9e54097125b9ce0e7f6acba23d0fad130bca865948641fe6c8b9412158e0ebf0bd9291139f030b48870ab1372a229dc90c33800fe62cb1cc975a03cea0449628820caca708a4ea42820f668aa76642837020ed430823557b75926836fab3547cab9eb1ac42c8a0f270626880a38ca56fcaaa2b2aebd8670a25d18a312fc158b9e592cbaebae66ae0601152312bc08159d13f99202bd40207237d64f962566ed15df60e99157a00b9a9ca1bcd5477577215eca865ce4c3e8738a452658c933822382872e5caca1ab92fe0c0fa4a7a14cd108783159e8003838221670738f0395002ee10b7841b0f13dc27ee8d763b4047625ddc0beea50432f0c1bef80d923a333ba1665fd5ec5b685754d448d25c7c97ee54133838b8b08289e10c5901008be34b3edf2f80699be46658e18eeb22b9873c50c5a98209565ba072a5fca9fed7804338800f312bd2449225332b87e1e7195eaa21de1a0e0c8dc8067cb02da2c1f38bc727a68d2ed9b9c5396eb8e946e078e08107649d4959d647d69964fd0559bed80c078b73c848728509200000242d494441543087e0c8cd03d87c7c0ec983b195a0835748ab93a4231523e3c8c53591d7a51b562db921a344d3b2c162ceacc427d14c62508c1a11c6421546c71b9527524212797c81833f850f5175fed4a306e5decb701b1950c83e2f4aa021e18cbef7961da147a759b560c099a4b964a8916cd5f419c32d55a62d349c042e1e09e811cc9c75f68a735630958634aa33fd784e6eaca6ebe5e2e1ede517c86c6966d3fb0787128e71bde082f194a610f75cf45872833a7d2c0fa134a6040422d8bc413ec2eb45c5153081660047199968e280dcc2a94d5b8c2e59e6425ea426ca5e772d2bb7b0422d43cfcd1365ed578b43392c6b3e390a076766cb901aa974b9d9921c0302e97195cb10bfd53cdccb0c87cd1b4d4c91c4b9d814c31b8d088fa23b9394925aa700f74267bab8d3dc12e45dd25fa2ea72aba4874542155c54d091018570c32b92f9c0be4894abab4641c723a23dbc0dc1e0e3129540002221ce2f5f2db2c19f70a3ba0043c3910d7c55e26df85a4d5edda8f0710e035957af610cc8aa7564eebcdcbc7c418469d32a56376c0a707077a5d28c548d851ecfa0455a924cf2e0091c7c2a3d2337c78003836298952abc8d021cffacbc99cddb8143adea7301a339ae040e566eb9ebaebb18cc618143afdc8272d0b162bf2098437030d99bbbaecf8f2bc1a9e4368b4248d5118d2ca9a96543b25e922f576d91ceb4cf74e9a3a7a5d00c9a6c7df806aa8683a1e7c0c1cd90de13493d714ba40207aa4ee50dd2712feac29f6274341f581c110fc1c2ec6ae8ee18c9b049c42bda2307d13448879f4897b9422b70604d040e1b70ceac0fc1fa21ce0c126160881aabe8eee5eae9e3eeede713108c59e192b976d5279792290220b2213d91dc7881433aaecd6a2dcf9efc571abf239199071c8545e5302164149754e41794a467e448c70ade28bd6e2a3d7ac3f537df7a0bb3a8e97563d20a630459104c6634e9955b582d4ec341af9b5ef3c92138f84ace260b27940e33ae87703499e73b1b5fc43c54980b1381c1d098272cc965cb05db724149a92887e4be8242c3a8c021668539c70207b7871bafcdbf0ce9108597be5b2090de5a1e686e9b3cd0e2390a1f50654e9bea9c073be60c9844bc1006013230801db168543319a25e32ce99301b9748a5e95cdca08114aa31ec489915255644c2ee1eae9e5e625c100f8c0b70604965a4b184f4221b4a090c38681fd1060d873c93f2bcc9a84a910d86ae030751244c0819c8063625352d6bd7eebd78a36aa938bcd1abafc5e1b8f5767ec0eb5e9d01632ea41e7a4ec70a8b730007a18a9ed174667010cbf3ad20a22beb67b08ffba3c7fc69f0050e3c767c75b2406a104356aeae0c9513f190718138a1221be273e06a18c14a9a190e08902e50517bee9fcc0a0102809094a5849a12d1e801c97c100ea4375fcb830e62b59591540ab6439c09be8b3f0520b6d29b333b3c51a988d832826398a2c281cac31b1977112425242e8c2534461c7978a31c1e3efeb81d6a91a768461d33c1295d6eb3185954847df136b45911e590e78d0a1cec2b9252b9110a0e1c41a248fc0c2a9a0119d814dc3581e302d860a9b86baec3e1b8ed8edbe975c31bfdf6b7bf4da8427f3d1930e258dd5fcffa0b9f1d0e5048630802e95ebc687a8cd2b3d9b2062f70489258baa7d57abc39f90021c963d5ed642c54021930212bdaf0598e066db8173cfe0428dc6decb7d80b9850cbdf1870f0e8730f3c3d3d99cb141646bb46848787b3c3967d2090f157dc51c96af30ab2c17f45474747454585848430f1dac3c383ae1346a9b3a51b8559b632d1963f29ecf0ac234ee2494884ccbdd77974895c6484005a62c3c28893757e5d44c8966c355267300134d083aeb8f1b3a1de6ad976312b5a39d47852a34d24732a4381545b65e689df2612a2e1c0b2d3e0720b64f563a9080664c8dde101e6c1020e15c45e7cf1e5975f7eedb5d7de7cf3cd78a3842a381cc4b1d8144972487ad4fc43e57a74b1acbfc07437879260a0904bff215973e30ce8a2e606b3cf2b12cd6b85902b94fc31555240a2165cbfd28c44b5360be9454442a6a5a8694b061c3cb5f473625364ba1bb75c799a061ccc21db305b222323b9fd32fe0a1a78a625fdc5be9acf4e5f6942426c6c2c0c31b79671c8d0209defaaabd528428686838f8b26211e121b8b019220481268c64c2a954d91c859fa5cc49f956a4bb7ccca89fa0cb36ba8fce0b0af9fb73f3ed17a1c2c196fac26b018704816c40c87f633b4772f3bea39a44f9bfcba4106fb5421865b232f420689001c0e12a3975c72c995575e79fdf5d7df7aebad78a3e6655b248e156fd4fca3a1e6a1e7670007d1d1f0c858ffc05047677753736b5d7d634d6d3db5b6aea1a6b6b18a514ce5d5983df40d90a5cad9cbf5cc42cd921b19acbdc105c8f850e0c042a01cf021164116c1a19209958798c23d460644336cb2a13a6136aa750de2e3a04aee284644c59f919131a42e6363453c582a0a3818b303195a3ca49bde26241eeee0c5570307d644644077ea6a55d0d97773579c30218ed15cc7deac66a80c9e970f9a23d97702ad4872bc092922c3f00116f2e4e84184a2b2967e3b79c684008b7260470417760cb3823b982e412cb271f5d557df78a3ea726352820c10948990b2eab9ac06469243d62e268eb5cc4bc01bfdf77ffff7e5d3e7f7ddffd07df73f78d7ddf7de72ebed74f191aec79e7106b8c48c7fdf7fe0082939ba89992e411c353db36dd3f45692b854b275f4200f0c8ef6b1a22a2b66f60ef6f4f677f7f47575f7c2595b7b674b6b7b534b736373536d7d5d1dbf86d7d8c03e95fdcaeaaad2f2b20284b3b0b088a8adb898ad2ed9d9d9fc177f666565c5c7c7830265a351108fa42496c5480411ac4c707030f685219f981874882dfb625f2890217e8ceee995dbac2544621c79516443c73e4286b27dc6e0347160d59f5eac5de6ab32783e7e904144031ca823691384d358ee4ce92870d8468b194222bd747a1499a82f5ba9e2521891412e22a1bc3d43cbf34884e0aca466a531c1d8a817b268f1a597231bdaa6c8301f1c0edd59af978a63f105e090a5e2243daa7fc0cb51381e7ee4dbf7dc7bff1d77de0d1c37dc7833c3ce8891d02e5c62838f23f40162eab6efd8b575db8ecd5bb64dcf6c99da343339353d3e01221323a3e308cfd0f0287590df8598ad0383c303438352874686078787f49fecf40f0ef40df40f0f0f0f1965707070c028fd4661475e67bfb7b7b7c728ecf0babc535e97c27fc9a7287d7d7dfafdbcdec62f77b6b735b7b640246802259856d7d6945756945594979495169796f0934a85c5456a71d9c2025699a5d297c2944d2a16100f093f49fa7d708394df13a506a6a8a1d1c60069aa24dac9fcaa484cf5c5a8475c32ee543571dc98cac53ef71e08b424683b2264686f0f32341cb9b9f9d9d9b9786a09cc174c493bf7dcf3afb9e6ba6baeb9e6861bd4e84082584b6ed4ec8dea1548cdab81b1eab9a4471d528e6f7ef31196b0bcf7be07e083152d850ff483041c5e31ee0f52464f0f2b2a0b22dbb6efdcb2753b946c9ade2c94489d98dc042e737572627cb68e4df00b3363f6756c6c6cd4282346917dfd0ae8f022ef191f1f672bc5fc7ef9082ff24e291a3518a200a5aed049e5cfe151f529f946f98846533e25980a82429b861ba605ebbefe415507f8c5d8bedebe01f67918e4c1608757a8586a5e47475153fe648ba0b67774a1a95251d6d6b60e765adbba5a5a3b9b5b3ad8b6b5777774f67676f551dbdb3ba95d5d3d6c5b5adad85e78e185575d7515de86b8a27ae828190e590a4cbc511c0e9942ad8716eb953964497c47e178fcf1ef3efcc8b7e0e3ee7beebbedf63b590e17e34298847e605fb484800841140e1188ece077a4b6ef1421a1ce6cde8a9cc08a6c559d999e9ade34b9694a2afbbca22b7f4a3597a9a929f9737a7a9afdc9c949fd0afb663ed8e715fd22775afea44c4c4ce87d76e060640c751b173ad9670bb2661035769a3cfd0a5f2465560d1558523994aefc29c2a9e51335655f0455a061075638157951b60213fbfa89e201e379a31969559ec07dfb0eecd9b3ef20dd6ce79e7f3eb98d8b2f46332837dd7413b2210bb6d0df864da14b45868e9a970223372a0e073645cfaf974526cf008e6f3efce8d71ffa26e2c142b89a0f66e832f21dfd800f5c102484acadf0818af0a30e50b273d71e40118bc3c5b095ba6dc776fbba75fbb62ddbb64a655fbd61b66cddba75f36cd96214fed23b333333eccb7be5bfcc8557780305aaac65f38c5038bd7986cacec4d424d5fc7e4d249f1534e515d09c2b86380ae87c5c1411e0b434aa1d4335b9bb54b1b952158cc62bb2c356d16abc53de20ba2b4cf098d18cb4276d4b23efe757550e1c828c0b2eb88882665030280429f273909235d7bf94203df56438900d713824376aeeac3f333870641e7bfcdb8f7cebd1af7fe3a1fb1eb8ffee7bef6109fe5b6ebb95040bd95916e5bffcca2b2eb9ec5202a80b2fbee8fc0b2f38f7fcf30e1d397cf0f0a103870eee3bb07feffe7d7bf6ede55aa4f23b310bd45d0b979d6758762c59b6cf16cddc623ba02955c36adb111ee71733a6162e79c27515fe6c75660b775aaa4d4a0d4185005de575790fe4f3b86cdfbe730758ecda835aa0199071f8f0e1f3ce3b0f2c2ebdf4d22baeb8425c0d0c0a6488b721a3bf64ae8af9d799748683f41770201b7a7ebd8e63ffe33ffe63f968055bf59d27be0b1f0f3ffac8830f7d5df3415e964e1d860bd0bbc3a01210b9f4f2cb40e4a24b2ebee0a20ba1845f0a3a72deb987cf3d22ac2c566148ca01bbc2a3e178a1c1eccbde850aadbb44d94db1e378e7ee5d54733173cbeb0b62ccddd4759e526edf89d995aad5d47e47de804eecdc699cd32c13d891c3581225182adf75d96597211884279071cb2db748f82a834665291ff98115714575978ab62904b1c021a18a5eb6850c9843709053fbc10f9f7ce2fb4a3fe0e3a16f7e83f5f7efbdffbebbeeb9db2c2120828a5c71d5955072d91597030a720228c889b0426547aafc3957b19846e139b02f34c312e5c84285c6339743f38bfe2fcbebfc69c3f4d04190958a72cf55c75135de29aaa9ab964f6cae8315dba1cdc7211e328389f358ee8b66656573c25623a571dd75d791d5800cd10cc810832243bf648538fd5ba132e29cacb9d9a6e82e3799254ba8e2101c1c175f06faf078716de8dc2351cf77a35af4e8702a9c10468e33c30f025e4e54dc224e9a801bb9e302a07b89c24552c8ebd9179e0cfba20cec42055f7dc1c213b644992573ee5f33a08b71696652bfc702ead28c9ad19477ca2b362165c8ce6ce1b00a0a5633bf002c94e32958d0bcb433b1092d2f64a019e26a8841d1b281b7417a036f437e4343725fd2a522c3381800a6172e166fd42138f06f3157f081c70b1f78377c2b54f2f5a4def087391bce094a889d7092394bcc1ea70bcbb0c2a9830ba267290290b90093a58887655f6814fb02859642f3d917473015582dbc2e88e9622f9ad1b5f02a37d8718879274713203879618286122c44303025a4c979567962b929dc1d4d06c22fddb0e60856163b97c4a804b1f636e58f7ffce3f23e07f3e6e08e2fe06bf03f0411f4ca8208a7259470965042e18c6145444588b114005ab070c1f605ceec0bad635f6071b1a201b54753bfe220a020bb20a3229652cc682e0de562ff2b47e0501c966fe4dcb804ae8ea610b5a085696a110c1e54fc0cc840e0d10c095fb541916e589d32175754c729c8866438a4cb0dd970080ef2f040077a783448088860c3b032f4ffa2229c075e0f2784ade1ccc4dc50307b9c2e2c8ba848819b058bc0a40bf2685f406d89421bd917b8b42f42aa3daf6744aa995d8decd298da6be7b2a4ca1b04740e2e40f080091334112d46ab0a1608065acebde08ef0f40a1992f5c20fd59d297a4ebd960ded8a9a8358e0f8cffffccfe595032b057478b9f0211262418453815301453c12299c2bb870d210c3d953d891227fea223c0952f6858b5fba80a07d014a5d349db2a35fb740b9e09f0b922a2f6a5817e3525eb700caad9557ec19d5808ac4ca1be49d6cf93a0d04d74b9bd056a216b4362d2f828107caa32b9a612683f09594a80429e26d886cc89a0b3a4e118703d970080e0e0a1f245cb584e0f78208df4d80c449606b4448382d0d0a768773c5f450c099c2d94b4166162b1a2cfb1d50d385e6d005f874111675d12c9a772c5c3acea868a1234593ba04a0165e17535633cd6620b8222e9356a225452d3416e83af7851bc46d92d855e6c4e2874286fe51266d50a4b3cd221b8ec2811061a80411be0644f0425011be5b844428c1dc6850d0348ac64588d1058d71b04098b9d0049622f0d917c1d1be684085d13385753140978075595eed61d53aaaff4b50a088480810c2042d49f3d2d43c9f828508868c2fe766e96e1422147a52b41f6a0e52a4b34dbc0d8953908d3ffde94fcb9b150e0a7128128800a0b6322062a6048f4440c1e86856c08533465acc85cbb014fdbff6ff259c69da6805fb82624991ffd27f8a922d58968655aca47d598c540b9d1a4a41d9fcbf665ecda42e86a9bccea7e4204203a7c745c9f5d232b41eedacb110c1800c095c75a65c26c4e28412a1408618140952b46c081c221b0ec18189e2b8208284204d48084e2f3ca2227cbdd81a28e1849013801545a1685c84180a3b7a5f5e59ba70c152902573a12d1c2ca0695fec593423c8be66d4f2bae54f8da919473391faf5cf00a8a029100b0a661ae4a268049a8536e4b114b5102c4430b84ddc2cb126a219f8193a1faac9b0978d338003d6208e43f305582cbe49530295665084158c1ce767260668ec0b574291d765df5c20cc5c8436cd9ce54f285cbad07696e238a61ad025761c0177414ced65551c38291a62fd24f0459c863c665c11572d4cd0863c9fb43cb740d6ebd1eea758134986da6b86264327be34197ffef39f97372b1c91e312f9f0052082906844b035a2255022a088eb2abaa2a505622c85cbd0c5cc9350652962bfa4f064c8c3617ed1f2bff21e296628ed115c904b11bf058b194a33accbc1a90caeb9089ae6b284820a07528406ce4dae850be4da452ac042d4427e7c49e61c70a7b85f663274ca4b121bb81ad241af731b670607f6093e5024414454446c0ddf2de68653115028e2bd9a89e18ccd05802c45785aba086d4b171a68c12220da33aa5f31c36ade5f02537b3acd50daef2f289f4b08a746597f508e2934c8498a4ed06eb4a73622dc08ee88763f2143521a163f434728663fd44c8643ca419204e705e2087e2c94000adf2da06856c48115eba3b9117a344082917d012c73d1b4995fd4d8895c39522c74ea3fed31d5cab71cab73ea68e17531401743d3fc7e798f5953e515fd1ef92ea14180109da0a1cc4c702f2499011692cf10c1a0481f8a9021b2a1e11032c415858cbffce52fcb9b150e47e1b882889912be5b8a5082a248e1cca46868d0189199058bc0f4d98a20b87471844b0779b5606ad64833a68bbdaeedaf006aa1d3fe4533d6f2598eaccf4180a0ddc48288d7c98dd0589805839b486cb22019922cb7c886437070380e2a7ca022222468143c4ae10cb4a2607ac481d58573d5dcc8be7dd154d9ef68ce2c3b829d053ef38b0bbe41a329b02e5616c454b47ab1ff5a904ead97e61d0b8516a5b468a7560539827c8b3e07cd048da3b1905b208221a64412e492065d50333e3b1ce80f47e4b842891914be58cb09e76126464323dc2c51e4621c2f5aaeb4689959b4e7529e244da434e21901aab5d02c8a6658178372414097e6d2a2af5a71f5a7e498f2ed669d100b426bcb13abb13087ac6653224ea8a4bcccb2a16d8a43ca8159c238092242890645e4448a288a142d30667ab0470290b968f95970c742db126f16f5d2c5cca28470fa1579aaa4089116daf8733152eddf697ec59e510bbe9ac8050936f32a0a6a065affa93f2be72940081334970cf8935ba0ed884e738987215898f35de26a98bd0dc870080e8ec51105112980a2e544b3a27545a4c55c34408bed084c8b15cddcb23b6640b5a4e9f632bf222fdac3ba348e6744b6593b3fa77c0aca1a7df34322404891a4a7b4bcc58e08169a0c04436b86c64234435c51ca7ffdd77f2def90721428134474d172a24131eb8a10a30bdc483193a45f345325666bd962816fb13f358bdaa75e1a534da74502eda95d1653fb37e85bb8a0822ea6a6fa75f3c7cd07e7dccc976961c21292984d895813510b2916321c8283a35004115db49c408914b3aee87db3d20846ba084c9fad58e05bec4f3394661617dc3713294f9e7db1a7d0429be50dfa089f4d4a1743591f4d8e6fbe4cf1373513663ba2d5624127c39e0c87e0106f85228848112dd1fb020daf48316b8c596c3449961d0b4cf67f5ac05af0cfcf791033a60bd2a6fd2d07d15ce26dcb92bad81bec8f29a7ad1b44521752c48858d4420b86d9c91032cc0605321c8203c1d17c684a444eccc42c283066b131d3a331fa627716847289171783f533436c71cb16e3d51e6ecb3d5ee261301f536bb619083313e2758a7ba13be2b51d310726e26458caf23e87f958ec0b71665ccca088bac82b9fbf68a17270c7c2a2d9089e11858bf1e4f841ce08d3651935eb81762dedbfc2ac13f646c4e261683f43dccfcf08c7fff95bf99fda02cb2bc7ffd496f9db75ff9fbfc1f13708166d81bfc1f13738feff000719409682631de8656b5949f99ffef34f4bdf5532c8fcd02f074c884d522bcc193b7abfaaa27ad923c8f1091ceeb9fb5ed6eee057111c3c3d7dfebcbfb8a064ebe66d3ffec71f2f76b69ce7dd77ddd3df3bc0f13746442f7bede637707c9a82e3d387ffd760fc4ba41cdf7be2fbacdc69544fa32eb8a35ea429976d0ba6f7cf1ec47c4c560bf4e2f50da191f8f6cb1ee4997f7a06c266cf449f8f9cde82557f97ecd83ec2973ef6adc7ecbf8e813cf03aff7ae5237a6bfe53378bf54c7cbdfc1995beece59ce91bbe44705c70de85f35bdcd2d0d264aade75e7dd4b5f277dd9ac286b6a742b673c7f1f7df8d1d207e1ced1e8f33135536bcfae3e430b37ea9da8022264fe46e464f62417c3cef2150bfe69a327327ca3e5f8678a82fdfbbf44704c8e4f2d04c7bc479037f0142eaba2d75e739d4978cc0f9cad7db9eb278e9f58baf958f267fe412c4fb39900f3499a6fe1bc8fbcf5e65bfa1bfff2973f637116d448d1363bfdb07f54e621e8ede9bbec159d292e5f22388cc65aac65e79e2d7478698bc00394149fbc8455e2bfb801afbdfada128d8503141cb05e6b95c942e95b320f08e38e5a4cc03c73c6cd43cff437323e8357e66bdb12fa61f92ff3916dfbe04e6ffe99defea5dfff6581833b0a1c2cefcb4f714a651f876bbedfa0daa8bbb367e94bbaeacaaba5d1676f983d70ea7ff12796380e735ce793617b94b9a39c959c9e54f309f32706cbec6a682dc4cba167447fe39db7dfb9a00de5f8d0af8f2f3be6af308e6fef9379588eff8550f265810399257cb0d46f3cf4cdf9ae997a4a30194b5c399e04d677216f71de73cc1bf07f97380e08da3b86cd8d2d3cfde896fda9ea57883e0c7b6476a8d5bdac28ab327f5d7757b79de1f3c4b0727cba1d96383e17883f6e7f7cc2962f0408f341be2c702c7861d75f7b833d1c4b3ff1b7dc7ceb42b6c9de91f4f8fa830f2dd69adcfe59d19a332216bbb0c49d2030b1b747870e1cd61fb13bbed2368ebfac8f2c4758f0f8fbf71df89f0507d985f98f88072d88b55eac1578e04c5e9eedd99df5efacc1c54d37debcd8717078ed4c9227a911075bdf60da12b978984359dc1dbbb3b24acb12df6517d62982170c951d3ce1c5def6e5550eeeb49d5fe9b174c06632e416df708180e5e28b2e59ac51eebfef017b87e3f2cb2e77b0ad776cdb393f61e3896f8b87ab3f7edbadb79b8e6fa37689f3b17c2f16caf2714262f3f11d3ccf65dff6e58563417fbebaaa66095b80ef669746335362f6f93d58e86fb143c1817de8f1d40f9f5eb635e50d0d758da6d3505f4a260da74a7fdc08daadb1c90f7ff89423c7c7732765628975c9ae9a8fefc8711c79cf97178e07ee7fd0e457da9a12455decaa7490323fc0f18498d95cd6bcc4c0d4c4a6c50e6598b379378f1881c1798e34286f33072c72096dcdedfab32822d187c5ee387e7c9219f36360757cb4ca91733bd3f77c79e1a0cbc02e8bbc54886112db392f123dc7f134253ae7b2528b85c43c8246ca7c5e8e8b47d3c19625af6a910d0ec5b5e88fcfd263ce97783a1e6bcc1e7f5e8a7d09e7dac1d35ef06df3e0f8e39f7ef7ce2f1f78f9d4d58bd58f7ff7fce7f932c73fcbe3c56fa9cc0f2695e526505cf020b8630ba5a13c91138cf1eca3a6725ffaae2f66a10826ed1f4df3a3bff455cc17301b01e69b479ed438febc1c1a3d410e368e717c73e2551de785e75f70f0e367f4b6393878621e7fa5eebaa7ce59aa3ebdf2577f582ab17846dfbdc49b99b063f43bcc4b0512892cf8915992cccdadee0ae12839835938ac798ec58e460f965d16c183e5881dbc342341322fd56d8981e71fdf769b1d8f3566133073c139c7ffc273a372b17370a016cb906170c3db1c6ca6cff336bc33f31d92277ef7cedd0b1ed3f04eccf7c3d670870f1ee1fd240f4c9d7073c6025f64c15e7bfb5863d98c993e2b1218a65e569bf2e36198bfc838be397a526f73f0d15ff0f85c08cfc0e769edc53e3b07c7bd3f8b76040eecce5fe33c2cc7a4dfd53e985cecf1c24058bc77fec406213f1c16f7de9433d5eae281ae2cd847837b61e997812d07d3532448e63bd1eaeb706fcd57373f13a32871fcf8b3099279391bcbf1bfc0bb6383e30ffff1c12dffe8b13c1cff5d6685877e7e30e9815379fcd871fb2bc74133b9087362abad384f9511e2eaac944d63164c990081d1df36e72d225a8e7ba3b34ccffb2eb22ffab4678f6f761a3c1d0f441976649f5ea31be80b04c27c281b1ce8c1f2643c750eeaf2d788a7edaf8d74e4fc78c113b95e503c8d20c57c33d47d257b665605537fef9c722c183d3ef1ddefd9391c8b9a33fbd39e4d60cc3dd9b0f5fa6bafeb779a0634cd85ca8b994bfbe3cf4f19ab23588effc5526283e3b913e75ef7f44a1b1f7ac7ce39fdc1ebcbf4887e212747efa5a9ef51dd6c9a6041fff1c91f3c696f50901cf13674a1c3cc3ee98442d81b8b0533d38e0fb232be685e9069315ec6f1e7e5e278bf83c75731b62d82b3b509875acc387e2137c206c78fdfd9ec8872fcf7381c2c9e6769625a8187d2fe826725615e24427b59c644cd0edb9997d7c2d2b3ae81e598a60e4fdb9b799b83b1c042d92d0f4bc03cab88b6879eebc25c8a6fb46c994d19cf8be01c1931b9ec919771481f7db1d81138fe7bf21c46f6da62293cec2d2b090323bb65c9437b6080483a01935432a14646d29247577d78e6d137d240f3bb2dd4038abfe2a025e51ecf9ecfdcfd1b1e1cd14d8f2232eac2d2ed62c9ac2f71238d6766ce2cca152d3d80e13363211f54cae1a0378ac74a96ec737e9f231f9f15e7b9786fc1815bf3875cccb9a20b191a4be8689365f3b83d4e6cf6e699dfec41478923e7cc7be6f7a4dbf8a087567ffcc55fbc681f829993a74b7fd17df7de6f09a3b8d225c6b53b78da4bbc4dc171fa9f9f724436f046fffc973f7efeaf5cfa0858041e2fcb384a7b6f747e16d9fc3c69936fc6c52a1ba24c96b1a8c631e7790cfcb9a0395bf012661318f3be8b63ea371bdeaed5e1200071b049f15b2d70d04a16be1d3c94836f5370286f74e9c428fffbf44af2a7faa0f0f4cd17f2c045b638aa5f1437863f6f7dd0193765b99e591fd32ab396a4aadd9f734930fecb326e6836f36d8e333d1c4c6cd36332db593a67532cd1f2fce3db28c4a776e456c9f1cde97f5ae9af31e2dc7c320a8ee5b3e676b951cb47961015dc3407a7db73fd88a4e190cfbb3db482599c39e159eb6e8d60ed7200f350989f9e529ffdcee3df35b745677b97690c8eed1cf079c9af10182f7615fc17be0b9fb5f77e20d87c7cfbcc3aa7c48bcb1e9fdcd7fc80cbc69fe326cf11feecdff315dc0887d25f4f9df3c16ffe513ecf472ce9d4c5425cee37191e8c0289079970b66095ff959e6edd7fa6ef139ea33955c0099832d03aa853c3ec169b2e363faf35677718d4a35b048867736556f70537930868c14be0451e68ddb167717bcddee26c2c332fb0125e39fe624d24c75f68a4b4ba0aa4e8b3dd75073ff5150290e56dca53e798bd51fb8f609816fc3e747bfed3acad80c570e82633779cdacc330d648e17788cec06f5ab9622c6596c311d0cf3ec3c83b90c012776e30d37e9d336f5a42fedc1cc4b6e2e64b6e66260738c4a7ff2ec380f7b3e2cc651fb258b3597ba5e1a8145341dbccd9fed6d5f71b0bf8d58577f81fd4716cb7fd8f5702e0bc70286c0327476364b689bd8280f2bf77e89293db3037a6d8dae2db779649e1d1cf636cb1a33cff75ecd9eacdab76420e60fe3b0d84dcb91d5c74d2310e6454ffa4b1df7943f1b197cea2b58044794c3dc196bfdc8e21d2eb4be25acb7cf6ecd97628ba47b300ac69c08e7f9b3f47dc8c7971e80393b7ec7f2c87a98f3d6bcc7d481a7195dec2ece49ddfc74bbed752c85fdb4bcd9e39b85c11c5b59422a0b6db69611681c1f39f699c9507038921bc5a6900bd15f438432c7d3d32bf9dfc54215690e8b8f6de736daaba87a05d9e4e396d13d0cf0b7775771dacdf385166c0e73e259474396879bf5e78d886381e7d89c7d9a3f70dcde2278e0bb2c38e01477db348bceac7c662cac919afdf990d37bfaa97ff83c77ddc1cf7e85bb8e1270bf311c6ced2bff6b498cc2937e333b8bd914dc7b4c0063a8cea89252247a643a138e8225350901dc4efba3393252864e0dfb0fdaeb0d2c124bf3664ee38c4e9b134387584c01c15862b626238f383e17f8198ecf886892221cffaf347ac39e98ff0b18a3bc79e26e6c430000000049454e44ae426082}}
\par
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BriefIntroToFP_Fundamentalism}{\*\bkmkend BriefIntroToFP_Fundamentalism}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Fundamentalism
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls21 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls21 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
Fundamentalist
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
3
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
3
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
Erik Meijer, JAOO Brisbane, 2008
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
functional programming is founded on eschewing side-effects or impurities.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls22 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls22 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A side-effect is any function which acts on unstated free variables e.g. iterators, loops, uncontrolled I/O.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls23 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls23 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Consider
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
java.lang.String
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, which we say is immutable. Really, we are saying all of its methods are
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
referentially transparent
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls24 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls24 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Referential transparency (or purity) is the anti-thesis of side-effects (or impurity).
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BriefIntroToFP_ReferentialTransparency}{\*\bkmkend BriefIntroToFP_ReferentialTransparency}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Referential Transparency
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls25 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls25 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Not to be confused with
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
idempotence
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
4
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
4
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See
}
{\field {\*\fldinst HYPERLINK "url(http://blog.tmorris.net/idempotence-versus-referential-transparency/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
Idempotence versus Referential Transparency
}}}
{\f3 \b0 \fs16 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://blog.tmorris.net/idempotence-versus-referential-transparency/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
http://blog.tmorris.net/idempotence-versus-referential-transparency/
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \fs16 \cf1 \i0
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls26 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls26 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The litmus test.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls27 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls27 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
If:
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2737169}{\*\bkmkend id2737169}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line g(f(args));\line g(f(args));\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is equivalent
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
5
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
5
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
has an indistinguishable program outcome.
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
to:
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2716970}{\*\bkmkend id2716970}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line final T t = f(args);\line g(t);\line g(t);\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
for any function
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
g
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and any arguments to
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
f
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
(which we have called
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
args
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
) then we say that
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
f
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is referentially transparent.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2718881}{\*\bkmkend id2718881}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
For example
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls28 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls28 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
For example
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2742239}{\*\bkmkend id2742239}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line g(s.charAt(i));\line g(s.charAt(i));\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is always equivalent (regardless of
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
g
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
) to:
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2728115}{\*\bkmkend id2728115}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line final char c = s.charAt(i);\line g(c);\line g(c);\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Therefore,
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
charAt
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is referentially transparent.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls29 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls29 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Bad news;
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
new
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is a side-effect. Ever wanted to hide that constructor for your immutable type?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls30 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls30 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
More bad news; Java makes it extremely difficult to be rid of impurity.
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
6
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
6
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "url(http://functionaljava.org/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
Functional Java
}}}
{\f3 \b0 \fs16 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://functionaljava.org/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
http://functionaljava.org/
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
-
}
{\f3 \b0 \fs16 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
Quod Erat Demonstrandum
}
}
{\f3 \strike0 \ul0 \b0 \fs16 \cf1 \i0
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BriefIntroToFP_DunnoDontCare}{\*\bkmkend BriefIntroToFP_DunnoDontCare}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
To care or not to care
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2737709}{\*\bkmkend id2737709}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line String s1 = ...\line String s2 = ...\line method(s1.charAt(x), s2.charAt(y));\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls31 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s1.charAt(x)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
executes first, then
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s2.charAt(y)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls32 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s2.charAt(y)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
executes first, then
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s1.charAt(x)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls33 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Dunno which executes first \u8212\'3f better find out.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls34 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
I might know which executes first but I don\rquote t care.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2718097}{\*\bkmkend id2718097}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Which First?
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2732032}{\*\bkmkend id2732032}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line char charAt2(int index) \{ \line writeFile(this, index);\line return this.charAt(index);\line \} \line \line method(s1.charAt2(x), s2.charAt2(y));\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls35 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s1.charAt2(x)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
executes first, then
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s2.charAt2(y)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls36 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s2.charAt2(y)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
executes first, then
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
s1.charAt2(x)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls37 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Dunno which executes first \u8212\'3f better find out.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlbody \ilvl0 \ls0 \pndec \pnstart1 \pnindent \pntxta. }\ls38 {\pntext \f1 \'b7 \tab }
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1200 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
I might know which executes first but I don\rquote t care.
\par {\pntext \f1 \'b7 \tab }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BriefIntroToFP_SoWhat}{\*\bkmkend BriefIntroToFP_SoWhat}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
So what?
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls39 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls39 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Pure code produces composable units or \ldblquote gluing smaller components to make larger components\rdblquote ,
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
7
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
7
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
}
{\f3 \b0 \fs16 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
(paraphrase)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
}
{\field {\*\fldinst HYPERLINK "url(http://www.math.chalmers.se/~rjmh/Papers/whyfp.html)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
Why Functional Programming Matters
}}}
{\f3 \b0 \fs16 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://www.math.chalmers.se/~rjmh/Papers/whyfp.html)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
http://www.math.chalmers.se/~rjmh/Papers/whyfp.html
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
, John Hughes
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
while impure code produces endless repetition and poor abstraction.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls40 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls40 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Pure code permits higher (much higher) levels of abstraction and is the
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
essence
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
of eliminating repetition. Purity is DRY and more.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls41 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls41 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Pure code is significantly easier to reason about.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls42 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls42 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We want fewer bugs, higher abstractions, lesser hindrances to approaching purity, all within a flexible type system. Must we abandon the JVM or legacy Java code?
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart WhereDoesScalaFit}{\*\bkmkend WhereDoesScalaFit}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Where Does Scala Fit?
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls43 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls43 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Impure by default, pure with great difficulty (Fortran, Modula-2, C, Java, C#).
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls44 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls44 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Pure by default, impure if you choose (
}
{\f3 \b1 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b1 \sa0 \sb0 \fs20 \cf1 \i0
Scala
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, SML, F#).
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls45 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls45 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Pure by mandate (Haskell, Clean).
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls46 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls46 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala is developed by the EPFL
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
8
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
8
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
Ecole Polytechnique F\u233\'3fd\u233\'3frale de Lausanne
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
in Switzerland and is an open source project.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls47 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls47 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala appeals to OO and functional programming, while also catering to existing legacy Java. Scala is
}
{\f3 \b1 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b1 \sa0 \sb0 \fs20 \cf1 \i0
not
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
a functional programming language in the true sense, but is in the popular sense (i.e. first-class functions).
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls48 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls48 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala compiles to
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.class
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
files and transparently uses
}
{\f3 \b1 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b1 \sa0 \sb0 \fs20 \cf1 \i0
any
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Java-compiled library or jar file.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls49 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls49 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala will not force us to divorce side-effects so be aware!
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax}{\*\bkmkend BasicSyntax}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Basic Syntax of Scala
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax_val_var_def_lazy_val}{\*\bkmkend BasicSyntax_val_var_def_lazy_val}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
val,var,def,lazy val
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls50 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls50 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
var
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
declares a mutable cell. Analogous to a non-
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
final
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
in Java. Avoid the use of
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
var
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
unless in exceptional circumstances.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls51 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls51 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
val
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
declares an immutable cell that is evaluated at its declaration point. Analogous to a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
final
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
in Java.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls52 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls52 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
def
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
declares an immutable cell that is evaluated upon each use. An argument list may follow. Analogous to a method in Java.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls53 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls53 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
lazy val
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
declares an immutable cell that is unevaluated until first use.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls54 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls54 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Example
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
(welcome to the Scala interpreter)
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2734162}{\*\bkmkend id2734162}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> val a = 7\line a: Int = 7\line \line scala> def b = 8\line b: Int\line \line scala> def c(n: Int) = n + 42\line c: (Int)Int\line \line scala> var d = 9\line d: Int = 9\line \line scala> lazy val e = 10\line e: Int = 10\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax_if_else}{\*\bkmkend BasicSyntax_if_else}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
if/else
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls55 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls55 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala\rquote s
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
if/else
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
combines Java\rquote s
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
if/else
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and only ternary operator
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
?:
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls56 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls56 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Example
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2739548}{\*\bkmkend id2739548}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> val t = if(true) 7 else 8\line t: Int = 7\line \line scala> if(false) println(\rdblquote foo\rdblquote ) else println(\rdblquote bar\rdblquote ) // side-effect\line bar\line \line scala> println(if(true) \ldblquote foo\rdblquote else \ldblquote bar\rdblquote )\line foo\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax_FirstClassFunctions}{\*\bkmkend BasicSyntax_FirstClassFunctions}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
First-class Functions
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls57 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls57 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala has
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
first-class functions
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
. Very similar to the
}
{\field {\*\fldinst HYPERLINK "url(http://javac.info/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Java 7 BGGA
}}}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://javac.info/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
http://javac.info/
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
proposal.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls58 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls58 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Java doesn\rquote t but we emulate it with interfaces \u8212\'3f often with extravagant identifier names:
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2727388}{\*\bkmkend id2727388}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line interface Function \{ \line B call(A a);\line \} \line \line interface DatabaseWalloper \{ \line Walloped wallop(Connection a);\line \} \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2735725}{\*\bkmkend id2735725}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Function literal
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls59 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls59 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
In Scala, instead of passing a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Function
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, we pass
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
String => Integer
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and instead of
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
function.call(a)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
we write
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
function(a)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls60 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls60 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2734761}{\*\bkmkend id2734761}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> def reverseParse(s: String, f: String => Int) = f(s.reverse)\line reverseParse: (String,(String) => Int)Int\line \line scala> val c = reverseParse(\rdblquote 5632\rdblquote , Integer.parseInt(_))\line c: Int = 2365\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls61 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls61 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Since functions are first-class we can do other clever things with them, like compose them.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2723152}{\*\bkmkend id2723152}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> def compose[A, B, C](f: B => C, g: A => B): A => C = (a: A) => f(g(a))\line compose: [A,B,C]((B) => C,(A) => B)(A) => C\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax_OtherKeywords}{\*\bkmkend BasicSyntax_OtherKeywords}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Other Keywords
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls62 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls62 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
trait
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is like a Java
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
interface
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
but allows
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
mixin composition
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2738234}{\*\bkmkend id2738234}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> trait Foo \{ def bar(n: Int): String \} \line defined trait Foo\line \line scala> trait Bar\line defined trait Bar\line \line scala> trait Baz extends Foo with Bar \{ val baz: java.util.LinkedList[Int] \} \line defined trait Baz\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls63 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls63 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
class
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is similar to a Java
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
class
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, however
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
case class
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
has no Java equivalent.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2746498}{\*\bkmkend id2746498}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> case class Person(name: String, age: Int)\line defined class Person\line \line scala> val p = Person(\rdblquote Bob\rdblquote , 42)\line p: Person = Person(Bob,42)\line \line scala> val z = p.name\line z: String = Bob\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls64 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls64 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
sealed
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
class
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
or
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
trait
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
restricts possible subtypes to the declaring source file. Java has an obtuse equivalent by exploiting the fact that only nested classes may subclass a class with an inaccessible constructor.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls65 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls65 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
sealed
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
types and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
case class
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
are used to denote
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
Algebraic Data Types
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax_TypeParameterVariance}{\*\bkmkend BasicSyntax_TypeParameterVariance}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Type Parameter Variance
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls66 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls66 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
In Java, a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
List
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is not a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
List
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
even though a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
String
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
CharSequence
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2734930}{\*\bkmkend id2734930}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line void m1(java.util.List s) \{ \} \line void m2(java.util.List s) \{ m1(s); \} // bzzt!\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls67 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls67 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Java\rquote s type parameters are always
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
invariant
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, but would be nice if they were
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
covariant
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
9
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
9
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
This is not entirely true in that a weak form of covariance can be represented with
}
{\f6 \b0 \fs16 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
T extends U
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
and contra-variance with
}
{\f6 \b0 \fs16 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
T super U
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
.
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls68 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls68 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Covariance doesn\rquote t mix well with side-effects
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
10
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
10
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
For example, side-effecting on a covariant Java array results in an
}
{\f6 \b0 \fs16 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
ArrayStoreException
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
.
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls69 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls69 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
But we aren\rquote t married to them anymore! We can have covariance, at a small cost \u8212\'3f since we are still dating them. We use
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
+
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
to denote covariance
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
11
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
11
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
And
}
{\f6 \b0 \fs16 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
-
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
to denote contravariance; another matter.
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2746578}{\*\bkmkend id2746578}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> trait List[+A] \{ val head: A; val tail: List[A] \} \line \line scala> val x = new List[String] \{ val head = \ldblquote abc\rdblquote ; val tail = null \} \line \line scala> val y: List[CharSequence] = x\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicSyntax_Imports}{\*\bkmkend BasicSyntax_Imports}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Imports
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls70 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls70 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
import
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
keyword is used for importing packages.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls71 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls71 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Packages are hierarchical;
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
foo.bar
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
has access to everything in
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
foo
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
. This also applies if adding to existing Java code. e.g. your Scala source file in
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
java.util.concurrent
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
has access to Java collections (
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
java.util
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
) without importing.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls72 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls72 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Imports may contain multiple entries
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
import java.util.\{ LinkedList, HashSet\}
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls73 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls73 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Imports may wildcard
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
import java.util._
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
or
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
import java.util.Collectons._
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls74 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls74 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Imports may appear anywhere in a source file and are scoped accordingly.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicFeatures}{\*\bkmkend BasicFeatures}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Basic Features of Scala
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicFeatures_TypeInference_NoTypeAnnota}{\*\bkmkend BasicFeatures_TypeInference_NoTypeAnnota}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Type Inference
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls75 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls75 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We don\rquote t have to explicitly specify type annotations.
\par {\pntext }
}
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2651587}{\*\bkmkend id2651587}
{\*\shppict {\pict \jpegblip \picw180 \pich166 \picwgoal3600 \pichgoal3320 ffd8ffe000104a46494600010100000100010000fffe003b43524541544f523a2067642d6a7065672076312e3020287573696e6720494a47204a50454720763632292c207175616c697479203d2037300affdb0043000a07070807060a0808080b0a0a0b0e18100e0d0d0e1d15161118231f2524221f2221262b372f26293429212230413134393b3e3e3e252e4449433c48373d3e3bffdb0043010a0b0b0e0d0e1c10101c3b2822283b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3bffc000110800a600b403012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00f64a5a28a004a8dbeef079c7e752d336f4e471d38a6bb81c0e97e3392d3c557da66ab32f966e59607e7e41b8800fe95dd44e8e8ac98653c823a579b7c40f068b7f3f5ab3dcc5d8bcb184e99e4b67b0ea7a55af87be2a79946917b2ee31ae6191db97e7ee8cf53c9fcab5945495d1ebd7c2d3ab4557a3d3747a29e452124018a0d21c363d2b0ea78fa2383d57c6b71a378d26b4bc40b62a8a14ed3962429cfe1c8aeea3916450ea72187045705f13b4569eca1d4e342cf09d8e1573f29c9cfe82bb6d32dcdbe9d14458b155c6e23ad6b2b58efc44693a109c77ea715f152e5e2d3ed201205491d9993fbd8dbfe35d478667927f0f59c93aec72b8da3ea71fa0acbf16f86e4f106ada4ab0cdb40ced31db9c82538fc706ba5b7b74b6b74862c04418031d2893bc2c2a9387d5a105b9628a4a3bd66710b4520391d314b4005145140051451400514514005145140051451400533d8d3eb2b54f10693a28dd7f78b112bb847c96c67190a39a045fb8892788c6ea1d581054f71debce3c47e05beb1bff00ed3f0f903072b09272a7be320f7f5f5ad797e2a785541fb3dc5c5c15241096930dbf9aff009c5320f8b5e1695b64b35c467deda56fe4b551958e9a1889d17eeec6df867c4b6fe20b3f323ca48a70ca456dfd3835ca68de28f065fdf4b75a6ea100b897efb3a98cb7fdf4057476f7f65707743731c833c6d7069377d8caab83937156259e08ae6368a640e8df794d4a0000014c33c7bb01d73fef0a556047ca3f5a445f41588c8e6938e4507af238a64d3456f134b2c8b1a28cb3b9c0140993554d4351b4d36d5ee6f2e5208a304b3b76c57956b3f11b5cf14df3e91e0ab4775271f6b20a9e392549202f031cfbfad6c683f0d06f8754f134f36a5a891b8c4eca514f523a75cf7cd26ec34777a6ea769ab5925dd8dc09e07240703d091fd2aed518d05bc49146a228907cabd6aca37abe6b3552eca7125a2901cf4a5ad490a28a2800a28a2800a28a2800a42707da96908cf5a00090072715c65dc9a7cbf12858ea1636b7124ba7ab40d2c2ac77069090091e809ae9b598e7974ab84b53894afca6b8cf195d8b4d57c3de28b78c3243318e46ee55c141fabd007491e9da744ce22d2ec5370cb6db741b8fbf1cd56beb4b3b7b392e2c7c3ba7de5d2fdd88c489bbf10a7f9547e2bb9bad37489b53b45dff00639167913fbd1a92cdfa0a66a5e26b7d3e1d26f1e3c58ea0cb1b4c3fe59bb02debe8a680393b2d5a6b8d44590f855a6dbcfb772899553239e9fb9e7a1aec6ce3ba5b2df268365a5b8206c85830ff00d045676bde2cf0de9dadc226b9f3353b542220b9c65b72e0faf53593e20f185d691a7412dec264bfbedde45a2f4078e0ff00df428358c14b7376eef05ab6644b891f3d2088b1fd2a81f193dbbed8f49d72471fc1f64715c74c9aecb1ff006b78b3583a459ca36c56f12a997db1f2918c03d4e6a5b0d77c497f65f64f09e952476b9c7daae082e0fe24f6c7e7414a9c51dadb78afc4fa8ef4b5f0c9b54c6166bc9d90f3df694e7f3ac9d72d3c69ab69b73693eaf65e5c83061102e3fefacff4aad65e1ef1ecea0ea9e258a3888e52245de077fe0c568e99a447a3abaa5ccb76f21f9a59cf4fc07141bc69459c4c9e15f1d69f23269b3c300eac6c1cc5bbea107356b4ff00893e2bf0cdf25a789ad259ad09085994a300382c188f9bd6bb8cf752df514e7b5b7d42092deeedd2685d0abb49d811cf3eb49ab8a58756ba3774ad5ac759d3a2beb19c5c4120e4abe767b1c77e2b4637872368ebd09e86bc2f43f13da780bc65736f63732dee86df2baed07613b4923a743915eafe2bf14697e12b16b9bf24b49c470275739ea3ff00d7dab070716733becce8d1d587cb83f43c53eb8bf01f89f55f15bdcdfc9642d74d50ab013d643ce7d7a71f9d6878c3c6369e11d2d6eee94bcaed88e25ea7afbfb56c990ce8f70f43d338a14861915c37c3fd5b5ff105bdd6b7ab4822b599f6db5b2a8c2f039ce33dfb9ed5d7a4b374232475a994ecc762de714b51a1623e615255a77426145145310515cfe9be39f0deab288adb56b63296dab1b4aa19be8335bd939e9400eaf3dd5ac06a7f0feff4585bf7da7b88f3fc40a1492bd00bf5c0c91d40ae23555fec6f1edbb8056cb5888c720ede6a8762df880a29a027f0adf5bf8afc071dbbbe59acbec776a7ef07f2f637eb9ae6b42b0ff849fe1dea3e1474c5e6993bac5e61e725d994f3fecb62a968d792f81fe27dcd8dc3b47a6eb53968b230aac58edc67818de338ad98187873e334aaccc2d75bb702051c2f9804633eff0075bf3a9d80e27e17e95a5ea33c776d1fefec647790120e53cbe0f4fef135d1787c7f6df89f57f13eaa47d9f4c95c5ab01c05566e7bf40ab547c33676be1cf17f8b2c448b1a436c443b8ed2dd7a0ad2b1b56b4f84b78ea8e0dc594b70cc47fcf48cb559d506b94c4d2edffe162f8cee752d4413a5d902a918391fc231cfaf2d5e8da8ead67a45bef9a54b64419009fbc0f1c0ef5cd7c2ed3d20f075bdcaafcf70ed23e07dedaecbfd0552d3f52d0b58f18ea17daf6a56715b592986c62b9986c2d83f3143c37dff00d3da84ca72f671b9b29a86a7adb2be9166c2de4ce6eee7e4033dc21c311deb42fdadf40d3bed9abde451c71a7207f11f451c93dcd735a37c4c50ba8e9d3c0ba9ddd94ed169c6d1405ba5cb05015780bf2af4cf0d59dff0817897c57a8fdbfc4da81b4b595b7adb972c50f40361c01c679ff1a77308d5ace5a1ade04d62fb5ff0e4d7b7f86922b968c49ce08dabd7fefa354be205c5e4f77a3f87ece530aea52f9120cf504a28cfb7cc6badb5b0d3f4cb14d3b498d61b4463231dd90dc7563f80fcab8f9957c4df126daf2d27ff00897684c935cddb7fab4d841393d06761fcaa0ea9cfdcb48eef44f00695a4f8627d14ac8f1dda62e58b0c9fa71595e33f0ef83ae358b5d47c45a9c91cb042b0a43e6a9dca198e59704f563cfb571de2ff008c9a8cf7f2da681b60b488edf39806697d4e31c0cfbd7276fe1bf13f8aa46bfbcf3bcb51f35e5eb308c2fa6e39ee7f5a0e249f43e89d3354d11ac61874ebbb536f1c40471452a92aa070368e7a76af0df89dadcfe20d7a29e4d2ee61b5b206205e265ddcf5c915d1687f0eb4eb1b78ae5b599e495d4316b5728bebc32b723debab305ab69c34f962fb5c2075ba6f358f3dd9b24f5a0d961e4f5397d3be36e91629159c1e1d92dacd380a928c2fe005767a57c49f0a6b522c506a4b14cca0949919147b6e20035ccaf807c2c55a31a738ddfc5e73715cdea7f0919a577d26fd003b8ac730da07a0dd939a528dc52a3247b7c4f1cb109229c321e54a1c8fc29df692af823208eb5e19e1df17eb7e01d40695afa4d358e36e09394c9072a4f5efe9d6bda52e2de4b7fb6453a496bb0b895082a40e49cd73cd38ec428dbe22db5ddba60493a23119c16028af9e7c5fe2dd4b59f125d5d6952dc2da2b98e33164ab05246463d68ad13993689ee1aa782fc3fadca92dfe9b1bca8b8574664c75e9b48f5ae625f0578a74072fe15d7835a86691ad2ef9dddc2a9db9f51c9f4af46a43db8cd6a49e711fc4abfd1a44b5f176813da484e04b000c87dcfcc4f4abfe2cb9b4f13f845b52d0a75bc9acdd2684a1c1003297e0e3f8335d95d5ac57903c13c4b2c520c32b579178e7c28de07964f12f87a55b6b693097167900609db85031f2fcc38e7b9a3a816fc5f6c3c57e088f5984059ededfedb137429f28775fd05676b7a84fe23f865a5f896ca40ba9e932fef8f78d17cc5fd7e53577e1dea3fda56b7ba5de5bac390268e1ff00a652ee3c7b00062b27c08b0d9f8b35cf076a840b4bf563e59fe27254a8ff00be49aa92b81a9f13f47b7d5744b7f19e901b0154cd8272e85b038fab73ed5876ba9ebde3ad12f22b0b98ac6c348d382cd16399bf76781c1fee1f4eb5d7fc2f9e5bdf09df78675362977652343e5b758e32ab8fd4b579d693349e02f8912d85da7fa13dc9b79849f74c0cfb7711feee4d2b8d368ee3c2ba99d17e11c37a54eeb712b06f53e6bf15c7782345d35fc4f6365e23b04ba8b57b5f3add99d86dc6fe4e08e4ecc56e78dfc2b73e1fd0a2bc5d526bcd01ae838b08cecdaacaec4e791d49eddeb63e2043a6def826c3c45a049146b6251edca8d84a97036e0e08ea4e28b9539f3246bc3e1ad2bc1925eea36d6315b42ff3799967f2d57278ce79e7f4aa97fe254b6860b8fb05ede25d670c814020123b907b558b4f15af8a7e1f79d617d6e9aba404f90d20def2a2f385c83cb547a45e47f11bc34910d426d3f59b0930ed0b6d2ae3701d7a8c1edde91a46b38ab24729aef88bc41e22b46b0f0fe8f73046e312160a09efc64d6169bf0fbc69716cf66f1fd86d6421a4f364500f5eb8c9ee6b7351d17e24e9d15c5cdf7882e20b580644cd783e7f6fbdef5c3a6b5e27d5e7fb0a5fde5dbcc4a6dde5b7678fca9d89e7e7dcb72cda4f84b5258ece38756b988fef25977796adfece304fa723d6badd17c39aff008c161d4bc4b7cd0582f0908c2165ea3851d0938e79eb53f857e174566a97bad817129e45b70547fbdd73ff00d7aef1e0f33e79e50c7eb4ac6f0a5dc8a0b2b3b481208709146a16340490aa381d7daa78d606e02668586dc60ad4d90a3e5a0ddcdad036284c6c19a06060ed008efe94b473dbbf1f9d215db452d4f49d3f59845bdedb24a8c7e7ea09fc6bce97c4b71a3fc3fd73405ba7966b59d52da6c0c7965a3057d7a6eeddebd2350d46d34bb5fb55f4c22822386c1eb5c2f807c33a378d353bfd6ef22970976db215ff0057f754fa7bd0d5ce6acd6875df0e3c2b159f826c4ddc714b25c20b80d83c2b80c07eb4576d14314112431031a2285555e800a2aae731206c8048233d3351dc4e9044d2c8eb1a2024b31c003b9ae63c75e35b6f07e9a5ce1ef255fdd47d73938cff003fcabc774fb2f167c50d5e47339f2636cc9231da91063d38ebd0faf4a407a9eb7f173c33a4cb24314cf7d2a8eb6f864fa673fd2b812de28f8afaa46f2412dae900e368c940073d70327915ddf877e11e81a3049af43ea1381c79adf2a1f6c63f5aeed2358c6d44541fec8c0a00f37f14e949e13d4bc37a9d944120802585dcbb88cc67cb44fae006eb5c7fc4fb5b8d13c4b67e24d3cf96d36d6122f660b81fa0cd7ae78cf445d7fc2d7f665774be4b3c1838fdeaa9d9fae2b80beb43e30f8691a91fe996a4b019fe38cb4607e55517702e8d4adb44f1fd8f886d82ff0063788a00b2cc4ffcb5cb91edd420eb583f1c6db4efed2b5bbb5b9b7fb70052ea2dff003e3e5d876ffdf550f83dcf8afe1cdf685e61fed0d31c5cdabb0e1101438ffc75bf3ae93c3de1af0ff8fb416d52ee07fed436c6d27676e5660bb4be07fb5923f954816be1c5fc3e32f009d2f535f3cdab18a42e33bb2495c7d0102b9bf03f856d759b3d53c25adcb335dd84c594c770fb1010a00db9191906b37c037575e07f8953e897a0849bf72e09042e76b2bffdf207e75d978a10786fc69fdae11974dd4adfecd7ed1e37296de15c67fda64fca80387f0ef8320b2f88973a06a171242543fd96e639190f04ed3c119278e335d15be929f0bbc716b7925e4afa5ea31b452cf2aed58dcb03c924f276939aa1e26f85b67a35ad96b167aa5dcb65e6afdaa47605c4448f9d303fbbb8f3ed51dc68a35b2be13d06fae27d32065b99aeaeb07e62bf754819ff009687b76a076b99faa6b1e21f89fab359d96e834f4c6e42708a073962073dbafb5773e1cf0d697e16b2678b619e38f7cf7920fbbb464919e83ad5d82df4cf0ee8e234d96d6500cb48fd4fb7a93d2b81d63c4f75e37d422f0f68503c764d2e2490f0ceb90371e7a0193f8d51d718469ab3dceb2c3c4d3ebfabb43a4c4cd6107fafba738dc78e140c8cf3ebdab7a2d84824b3b372aa3d3dfdea9e9fa6c1a569b069b681520b71f33671b98f2793ee4d70fe2cf1d4d7412cbc3cdfe8f3ca14dd6dc1924c8e003db18edeb499bb972a573d21ae618cb7c846dedde8378a470981df358da0e8cda3e950c124b24b7728125c3c841daec3240f6049a4bcd774bb19208e4b8f3279a4f2f628cfaff8522938daecd9fb6839217e5edebf9537ce7b96548c61875e7a547e51f3581c0c0cbb9e805723adea7aaf892e1bc39e178490cc63bbbbe81549c1393db1bb3819f4a02725057313e25f892db5130e87a633cef0c80cd221cabb60fca3d7afe95e97f0b7c3373e17f0a9b7bbff005f7139999718db95518ffc76a2f05fc34d3fc2e82e673f6cbf7187958e55067385181e83ad771c75cfd283cc94b99dc503d79a2914607e345049f3a7c57b892f7e227977c0c714212156c63f77b98e7f535ebda26ade13f0df866d61b6d56c63b68a153849903bb6d196201c963dfdeb3be227c388bc5a12fad2558b5285020dd9db22649c1ffbe89ce335e417bf0e7c5f6b3f90349b8b8da700c285d47e62803d3f55f8e3a259cc56c2ce4bf50719dc63fe6a6a4d37e38f876e47fa7c33591f6064fe4b5e616df0b7c5d73c9d35a2f69030fe95b96bf037c472c83ed3736712f728ec4ffe83401e87ff000b93c15ff3ff003ffe033ff85721a0f8e7c2fa6789757305d3c5a55c32cd0ee81b87daa1be5c77258d5a87e01db955f3b5d915b1c858011fcea4d73e1d68fe0cd32c758b6b7fb64967741eeda524abc5b5f395248ebb680399d32e23f02fc4d836339d2efc6420e37c6c19173ff0219fc2bacb3b8ff8413e284b68576d87882552871c79858e00c7bc9543e2ae93e769506ab688824d3d84659072a99f947e0cc4d5a603c77f0d2caf630c350d3a3dab28fbfe6a28e73d46e2b4495848caf8d3a41b3d6a1f1058baa34db63b868e41bf7edf9781ce36af5aec7519a1f1c7803ede2346f3e1cba820ed607705fe5f9d717e18f87abe38d1bed773e25bc13aca52e2165f30230240e4b7a0fd6b53e18c971a4de6afe09d44a096390cb190d9ded819001ed84cd172994fc2fabdff00893c2927876e7548f4f8b4b531df231c492db804145248c615181e0f51c7ade97c5be13f09e92b6ba6b25d143f2451100b75277300475ae7bc485bc0be338b5bb6b749e2bef304b038f95ce4798a739fef62b4bc3fe3ff000adeeac2df59f0c59e9cb21f9655556553db7640c0c67f4a0a8cdc4e7359ff008497c5f7d64265f2e3bd19b7b40dd1064ef2b9f63cff00b38af43f0ff87acbc25a5158f60902037576f8182073cf751cf19a446f0d69facddea9fdaf6be65c7311f3388a2feea0e8067774c7535c5ebbae5f78e3c430f87b44775b1f38a178ce7cc52c01638ea31cfe3546e9c60b99ee5fbfd4effe20eae7c39a066df4e43bae2e573861d09edc65ba77eb51693a769daff8f22974cb72ba369316c048e2461b883d00ce597f2ae9b53b187c01e15fecfd16ce59753bcc4492c6b9258e4e793ed52695a7597817c2b2f9cea443fbe964ed24870b8c9fa2f149914ef3973cb6449af6a9e54d6ba447238bed62511298b398118805ce3d03e7b74ae1beccbaa7c5882db4c44482cd946e887a2a87638f5624fe35d4fc3db69b55f12cbe23d6ff007735e2b369903f5f28649207a00c9cd4d69a3c3e07d4bc45a935abcc8581b67dbccbb9559947fc0b3f9522a5539e7e45fbf86efc47ac9d06c19e3b4401afeed7aa8e488c7be40cfb374aed747d26cb45b14b3b0b758214000550067dce3b9aa9e19d224d1f478e1b8657bc63be6947591f00127f002b600c506352a3931696929682028a28a0068cf1c003f5a14633c1a7514009cf6c527eb4ea2801338eb55350b08b53b196cee9774532ec907b55ca2803cef4b6fb7e842d2f30f71106b6bc4ffa698ebf9329fc2b96f878ede1bf19eabe16baf962bc6c40ec7b2160847fbdb85759acc2343f1c2fdd8ed75b8ce58f004ebb989fc5554573de3cd32768ed3c45671817da43891d40c960a4107f0d87f3ab92e644dec5fb466f0a78e7ed20b7f676aade44e8f8db0cbc61bd7eea1f5eb59de3fd7745b5f17d978834ad511f54d34882ea1556dbe5924120e304e243d0f6adeb8169e37f0aa5fa32b477d1ec972326275f9493ff007c9fceb9bf00fc3df0eebba4cd2dfc73aea56aed0cd1348300ed183b48e996fcc564b428daf1f69a9e25f0b0bbb11bd6e611756f8ee36ee23ea722acfc35b8b1f14f8421b3d52dd6e6eac19a398b8c1cee62a38ff6481517848c9656ba97856eb2b75a2cc65b6791f2d34396dbb47503083a67a8acbf0fcdff00089fc52903a347a6eb116c80676a094ec258f6ce55ff003a771b772e7c4df0cd8e9ffd9bae45a524f6b66e22bb424ed111381c0209f99fb5761a0e9fe1ed2b48fed5d1ad63b5b5b8856e59d031dc9b77670727a135c678f9fe21436571691c16fa9e9d300a4c16a4cbd7fba093e9cd713a1f8a3c7ba669f2e8b63a6dddc242a1248ded64778410401fec8e0e3e9ed55711ee96375a76bf609736b2adcdabb36d7c11b58120f0704720f5af34b9b28758f8887c37e21d56430427ceb18a3c00cc33956247a293589e08f16f883c25a8dc6913e83737735cb799f6625a3652707a153ebe9dead7c411a95ec76fe2bff846e5d2a5b39144ccd26ecae7e53f74776c52b8f99dac755f136c24b4d3f48d7b4f528da04d9109e8572879c76023f5aec74d92d3c41a4d8dfcca920c0993ae11c02323f33542d5a1f17f822332609d4ac3126d1f75cc7f37d482d5cffc27be78b4dbff000d5e6124d36760913fde31962dbb07b6587e74091e8a8f1ba0911c3a9e8c0e41a703924e78ed5e79e17be97c27e2a97c237d2cb259dc666d365909202e0fc99e807c84e3debd0a3e8473d73827a5003e8a28a0028a28a0028a28a0028a28a0028a28a00e6bc71a18d67407318c5cda913c2e3aa90c09fcc023f1ac4b4bb8b52d3edee5d30b756e23b88dba8254071fa9aeedb3c8e0b7519ec2b8fd6af8d9eb89a76a02386d6f32d673007a8fbe0fa7de4ec2aa2ee4c8e4bc2f73ff0008678d2e3c397ce5b4bd4be7b66c701ced3f801961c54be335d43c1f75f6fd0ef1edeeefe61049989591fa60fcd9c1c9ec3b0ab1e2cf0e1f126926d80297d6cdbad9810370e78cfbe73f856bf86af6dfc7de0c47bfb72d7b6126194fcac255daf9c1ec7207e7532452322c34ef1ebdc47ac6a5159b5ce9caec652a11ee1382d1e02608217009e466a5f1a6813eb3a4f950ab4777959edcaf043ed3f2fb0f98f4f4ac4b8d53e27ebde209e0b38dec611334676155545dd8c9dc4e71ed5e912d95c4ba4dbda4f3f9d791005a77eed83e9f5c5480786bc516dadf872c3509ee228a7baf95901fe31c95fae306a46d0e483c52babda3ac6b71194be5c9fde6dff5640f6cbfa673deb8397c229772ded95ec530b0b97f3d553ef4339c062bc74daaa39cf7ae753e116ad737722adeecb60c56267ce4ae78cfbe319a5703d23c4de18b89fc51a678974bc1bcb794473447eec8983c93cfa28ae8759d2e0d7b47bbd3ae409209d718e9820823a7a100d79758fc1090eefb7ea339c8e3ca703f98ae82c7e15f85f4f8c0b895ae187de32cc0107f215480b7e00b3bbd1f43b8d26ee3955ac2edd629586048bb8818fc147e756ae7c38a3c5b07892c675b69597cbbc8c0c89578ebe9f757a55e81745d22c7ecd0df5b43147ce1a604fb74aa175e33f0b69fbbed3ae468b8f9f6c4edfc94d3028fc48d35af3c2c755b60c97fa63a49038e0e37a83d3b60b5747e0dd713c45e18b3d483ee91e2513f03fd68037f4f7cd717aefc4bd1a7d3e6b1f0dac9aadddd298862270141ee7207bd6ffc2dd12f741f05c16b7ea526776976641da1b07b77a00ec68a28a0028a28a0028a28a0028a28a0028a28a002b9ff001a78723f13787e6b4031771a992d64070524032bcf619033f4ae829ac09c63d6803c7fc29e2b7be99b44d6985bead6b98d5e46dbe68078c03df18c727206693c4969ade87aa1f137871e7de3e5bcb28d58891b905881f7b861db8db9acff008d5e1c1a7ea96fe23b25f245cb08e675621bcc0b8520741f2a76c52f86fe295b496cb17880cdf68438fb4c31a6d71fed0c81ebda9a57132f43f1e4476e23bdd01bed0830f8b9dbb9bbf1b38e7b551bbf8eb7121ff43d0e383dde70ff00fb20adc9fc3de0ff001a29b880452cc467cc8199594b7aa820550b7f83ba5dacc5eeae2ea58cf4565007e60d572818737c6ff1130cc16d6b11f52bbaa85cfc5af196a01516ea34639005ba15273f43cd7692c7f0e742062963b5de39e25763ff008f1acdb9f891e15d3d4c7a3e83f689c1c219614084f6e4313fa51ca8661e9917c4fd7a5df06a3acc2a790d25c4b127e049c568dc781b56809ff848fc70965dd966b9dec7f0320ad7b56f899e2c20c021d16cc8ca092350a47b1084d74ba6fc25d123dd26b135ceaf316c879e575dbed856c7ff00aea5ab01e62da5f8655cc5a558ea9e26bd538678832a29ec4801f70273f97bd6d587c2cd6bc42a26d422b6d16db1958e3b705c76f98657debd96c749b1d35152ced21815542808801e3a73d4d5adb9ebcd20303c33e0cd17c2b6fe5d85ba098f599d47987f1eb5bea00e87f3a50a00031c0e94bde800a28a2800a28a2800a28a2800a28a2800a28a2800a63fde18fbd83834514019daee8f6be21d226d2ef3788ae1705908057dc641af9bbc4fe0cb8f0c6a0d6935dc5395fe2452075a28a04cca8ed26134691cdb5bb1f4aecb4af877ab789514b6af0aa81d1d18d14500765a3fc0bd211049a9dfdccef9e9132853f9a9aee743f06e83e1ec369d60914a400d2ff1363d68a2819b4d8047519f4a72b6e5ce28a280168a28a0028a28a0028a28a0028a28a00fffd9}}
\par {\pntext }
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2716811}{\*\bkmkend id2716811}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Static Verification
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls76 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls76 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
But we can still have static verification!
\par {\pntext }
}
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2753486}{\*\bkmkend id2753486}
{\*\shppict {\pict \jpegblip \picw230 \pich240 \picwgoal4600 \pichgoal4800 ffd8ffe000104a46494600010101004800480000ffdb00430001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101ffdb00430101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101ffc000110800f000e603012200021101031101ffc4001f0001010000070101010000000000000000000603040708090a0b050201ffc4005d100000050301030506110806070705010002030405060001071108142112131531410951617681d616222324333536555671919496a1b5b6f00a1725323444b1c1435354d1e1f12642526364748445627393a4a5b31827376583b4ffc4001d010100010403010000000000000000000000070106080902040503ffc4003a1100010303030205020403070501000000010203040005110612210731131422415108611532719116428123a1b1c1d1e1f024334452f162ffda000c03010002110311003f00eff14a548124b9ba39c842190bab710dcea990a54a853b008909226064701884370645ea4660d4af502bdc4a2e1b06e000001b078a955f4a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7a742397c2f917cda27e6bd295454a9de8472f85f22f9b44fcd7ac36abaf4ef8ecd8a9d96ba90435312e206b896b28e24e5cb2429d484226b6e6e00cb181b935ed634b30401587708ed61dc34a5535294a52953ac9ed9cbfc624bf74a2f54553ac9ed9cbfc624bf74a2f4a5515294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a54ea5f75af7e2ec5fed397d5154ea5f75af7e2ec5fed397d295454a5294a54eb27b672ff1892fdd28bd5154eb27b672ff001892fdd28bd295454a5294a5294a5294a5294a529d5596b5ec5e9a8ad7d35beba5fcbafcbe0a60fc700727e3e3f7ff002ae2a504e376424e72af649e31b8f600938c93fed99a56535b5ac2bded6d2fde16badefe0bdbabaf5a06c2bd8465f52ef7ff0056d6b0ad6b77ad7e16b6bdbaf1d386ba75f1049dc46c5018c6c58528e7e524271fb9f8c55724e3f2771bb0b49c248277009ca95db18091c9009039acdd2b4e2679331f6396b35e7204e6250a692ac6f38e5299133479006c49373ceb5d739ab489754a9c3710adcaea0eb7bf6d70556fca5eee5f1590e41095331cac535b1bd393393910ac5cece9047bdc14588e95603d8d5384a5531abb7aed02d57174565a8b55c0f4b7bebd39372810803326468bb8e121f7421455c71b70781b8127381919ef57358b46eabd4a16ab1e9ebbdcd084a4acc382fbe415950693e946d25cd8bc00bce5246d3838ec394ae1dd17779fb942b5942f856d770d253d81cb122591ac8081e41a69a9776157110bc6bd9c115b4d35d3bdb75cabf94bbdcb4c7ec6b9c18323e43cb6ea94270ca8ec07144c532b586daf7d377709ea185476e9ef7fdeba73936b5fd2eb7bf1eb2efd686802bb8c25120ab6b12997545231ca53b90a5601e40191f06bda67a55d497890342eaa6c2561b5a9eb2ce650951383eb71a4a0e0e3f9c77cf6e6bb0952b8e4d85fba65b2f6df58ae3190712c9fd0cbe3d16a8a71c453e54c8cf94a36e082e23d427718fa67c5c15e914a6ba7756f7e675ce2cabd0a908b7e0af0ad428b910b5c030d860bdb4171e5db4bf2ad6eaedbdada5b4eaf96bbd1e5c796ca1f8ae25f69cced5b652a048c123295292950cf29594a87c77c5a576b35dac529d8578b74cb74b694a4a9896ca98580081921dd9df9394ee4103295a81c8cdd2b256bf2842e5039360df8df4b5ee2e1c34d385ed6ebb5edd5af838677aabb38503c8006011ea055c8079006077e30a39fb5799c8252ada1400380add80ae464e00ed8ec4e0f1f04a958620def7d6dc75faab12955a5294a5294a5294a54ea5f75af7e2ec5fed397d5154ea5f75af7e2ec5fed397d295454a5294a54eb27b672ff001892fdd28bd5154eb27b672ff1892fdd28bd295454a5294a5294a5294a560f275e36d7871b796da5fe3edb7577fcac81c93818249f8c7fad50e7db19c8ee7031b802738f64927ef8c7bf18dc2fe1b565457d03e9ae10078dee21e9c3e2bf57834f8bb6bf9c9be82f4bd7c2d6beb6d393af6f8457d3f9e95d65bbbc1dd6a906cb691ab64dd9da56260ce5396d4aef91e7ad672739d311c15c8fb276944d5d616e9dce6fca0a058af459148c1027fb002bdd581c1279977bb44b2dbe45ca7381b8f1db5a80e0a9e73186d96d07056e3848da9ce0724f6abd3a7ba0affd4bd556dd2ba75843d367ad654b7721a8919af53f365707630c212559209528a5b482b5a41e5af6b8ee9a6c75b1515ba66bcb6d29e6a3462588319c4c93663919c0ad2fbb9b688b1d86b1bd22cbfa546ef20e8663e57fda41e3a7581dafff002927680c8615f16d92e06d982a2e2b1c9bf3873a29aa5f939613aa8279f6960f5f42a297ba6b6b7df0537542d6d7bab417e35d6ba40fce8e6f873e3e3b3abe3e485ece58f7217b5eb9d1e5e1c947ae142e78797254b5d9c952cfed6b16efdd55cd9f7213b9c446d653d373666363129d9e31d3ad93a062580e6d2e5fc82dfa28f4387f0bef30d8dfadd5cb374e0fabec91834bdacfb6a838eb5d4fabae0cda2ca9101123d47ca6d0b11b29deebcfa9b2a47849ec1211ca8a4e7008d92b1f4d3d18e83e8f7f5df531c56aeb85b196e5331ae01b66149945016c46876a6d67c553ee1d804b5be36a14b01b208569ae23ee68ed7ddd1e893ded179eb324991ddf5a962bc5720cca291cede3202cfdddd132771556b4231cfee881d99915b7fbfe908ec7d73722dfab680b21ee5b15ac70c4fb786c228f2a4449723bd0c4c3a55d606fcdc4d972950e1e81f34449ad6b4cb585e157aed034c916efcc3bcabfd877ddc6bd07bd0ba74e14ede893264a8d026251a04c99310952a3469c8ddd3a14e9d35b744c95125ddd220488fd63fca5dd319b6c9097067786d6d786f528f9c52d8ea810af40a7fe61bd4a5dcd4dbc15202742c665865c6674a55d1293e33f24f9b6a42941392e30fa940a46141b536a6c1ca89cf18c644fd56dd9cb9dc1899a6ed9fc22fca26d969b49558dfb430df0c31026c1421e0b65b2953a564a54a5048da1273e7b8e125ee4f3d234c623c1bb6cc65cb924dd710cf9ab0f2e63b1bcf29deac409f234b555d2a44dcc25d55ab0d975b8688b4d6a11af67dc7fb47ced9e2bb20ecf19d64cb8d34ae43339492d93de559dfda1c098945d923cc696dfbf2c775bb97cb7af4006fd89765f30e13a2ad9b7021ce094938ce794e1c801a7167273edeafbc740dbebebd3bf5bbc89c3a298fd913b642e311d87b45b73d1ae271d698bb58c9b9fd89d912a2496f5af0f0f56b5e639a0a7be4a1f9ac446d6a07c4870186df5247e7f0dc515f82ac6002028127949c62aec6feac74eda101eb5696bedc6e2ca7c563f88f534b9b0d32481e1b85a46f54a69b24e597d6df184a1401247552c37f93d9b429186ef91a4392a3f8bf68e6a312bc63d8037aede9b632537687d9149b2646d4ef916982cf4db92b87096b2b0eea1df56b9f2bd6194c69dd6bee8b6c47909c30e6d0c51993154157d9aa4303cca9ecdf3548458571106b3e4665d543ca55c9ed656c9227643366771427d97378b4b695dc8c21e2703fee7380fc69f8eaf0d70d7dd6bee77db6c6c528f26e33468d3ed17889b0f3236408b20ab64d88deca54386307071d750b95d558f7583ab5961206f7c54a992fc86d9318246bce899765b719ba425ce8b3e3a14e38c890a5b7705a76a8ae436acb4a78e178d8da42b9c246335d1e9ff00d435aba87abd3a7faf9a7b4e5ff4cea299e5635c156d6a24bd30ec93b1931a6c74a24b56d04a52f9548f1d030b12368526b593655eedb6c87b461adb1a96bba8c07909708a4e546b25a94491897ad3edaf32c13d20578b3976dac91cc6cce22bdedfa36d7eae6412aa2151203d39e5a820d058659c59d634b1157b5af632c2d74bfd5a5fb6bca8942a58d6e4b11b925392984ef89dc1b57a53d22a46b1bcfdddc10b837a9fd99523549d4245e91675ae4d7ebaec21dc54eeb03fe319cc3b657cf924705b88b21392260c55257d5bbe1b8ce52b8fe619a2ca179ea442f4112c5364cd2da9555b58abe28441401471d785376df1747754dd972d9b56a5663c675c223a6e0da54da952cab621b92cf294a5c29280ea0a40730149217b937f75e7e8ae0e9db04bd6fd289b22e56c8acaa6cdb03ca129d4434a0bab7ed7282fc69296580871119ef30f38c82a4c85bbb5a5775cd6ddfb71eaf0d2b2858ec696032c30981bdad700817b69708ed7bdaf7b5bfeee96e3adf8ebdfd737537a4923246076ef939e0e08c71c119fbe47b56b9b04770a49c9052a185020f208c9ff004f824734a5295ca94a5294a52a752fbad7bf1762ff0069cbea8aa752fbad7bf1762ff69cbe94aa2a5294a52a7593db397f8c497ee945ea8aa7593db397f8c497ee945e94aa2a5294a5294a5294ac215f85b4bdf4e16d34f0dedafd5f571ac5ac3d74b5f4b5edc6ddbaf87b7c16f0eb5c549dd807f2ee0543e47b0fd09c0ed5439c1c7071dfe0fcff004fe9ce2b6c9b5ded1f12d91b66dcc1b464e751b1e2e86b8c844840758a52f6effb046638de75eda74ac8e48b9a981bad7b5edbfb8a4b5eda5ebca9336e679ce70cab35cc792de0e7c9ee4d967a3794b90ccd4ae927f7b4c7d90b7a7fdd9ad9db3a39a98525ef7dc18db52b7dff0062bd76d2fcaa1daec29d9f0d6c5d1a74e49cbc77cd795c84c75ccb59b1beee2c18e98d7fa6e4decb5d2d2694dd22cb5f9238bb0b806f70ded6b74c3931bcda9084af49eb06d500d3af9e4e7263ede4faaa07ea4dd84fbb376b0add1a2255e61b0aca5320842b0063016d048daa39c05ac60e735b4efa35e9e33a7b454dd7971889176d50b3e41e711b56c599974371c34ac95a7cc3edbaeaca4a438ca992a0ac66b7f9b20ece524db0b6a1c558023c79cd49e48bd63e4be4e413bd7a0fc7d1f23a425f2addf8e8a91b5a7b24614bc2cb9edc9a5befc1657a1ae22c618f70b37c2f16e2f64046a090484a28dc7da128b9cdddb9bf43d3a870d35e927458a94383abebadef75eb9edc552fe55f7daeaf5f93838fdbd74bb698ce0e0de330e40c303c571e72e66fcd164b81ee33094109d4696bff00d9f17b2fd3afd69d56aed288df0217b58b1419eb8ddba3c1c81e9f5fc5f1fc7d957774c6c8cc1b2c7b93ad83367a54e2dc09d8a4301c710dc719c909da9deb236f88543206d04e3efd66f52ae3aa3a84ad28ccc5fe09a618663861878869f9ce210ec971e48cef5a3296d1b94af0d215b08deaad6a469c9387ce72402e583ff2f870fe5f276d668b4e512f68c570dee5a946b0b183fdf27d7fcedf1fc753ecae013ac4882300b900e3afe3fcfaedd95a1b34da1c715daff66fd996f1502e0666c3fb4565c1ce46f1bafa1bfcc73e6258ff00a1cf43fd17fa4bd127e7437be96e9a43b87427b5ebb7df58c98090085615ea3838c108c8da8079f4a79c7ea6b0d810144e1446309429794a07b0008c6339273c9cf278adc49810a77027925803cb19c599c8d3d53f1fdf5f4d4042621b93c9f4a0193c80581ec7e4f8fb7cbdeb571dfb7a6de719d8cf2a6c4b8f5f21274b03b6067bfcd1b93f12f766bfcd3c6f9f8947d464d704fd16b7a6dad1ccb2041e3abd22c5ac486dd39c5c3a4b7142bb68fb5b776f714ec7790f6fbc553ec66b174c362ec2f82329c0db499ba740ab68b73cde74499fd07b426f430b2f1255047e9c45ba795a3b4aace11552ed20e8f45b8df4600ed9e7e4e7f6e062b882a481b7605024eef0d20f38ff00d4249c63dc9ff5e7e11aa09c993e860395c8f4831f0ff3ff000d3b6f7af9e90e2f5548941403939c3589ce247fd4a8fe82fdff00e1fc2a020f300caa090a97052ee25cc2191598011f3fbd747fa308e36c8371de3ad4ee7d21ba6f7afaff0076f0d7f163e169cd52a022f4a0f54180ebf0ff001e3dfedd3b2fc3e6b4ee4ec7092da949ca53e95020e4292ae7047208fe649293deb97ac82b4a949710378520e09520150c0fbed293839c289e7031d503bb7fb0fa6843d49f6afc66da5a76ebc891b3e7969444734526717f3ac9e1f98484e9b8264b2457bbc52797e1aca6ed2ff6b7fa4abee2eb54274e65b0c3093ce2ce00c9dd4e00f9ae6ce4c4594273d3eeda6edf17571f057a146da51a4992f066d3b197324614b36d9a72a20389388e7492d637c39c9c1028b5f4e1b9b9b7a75483af82649adfaebce34b7c255b2474b10809d63c1c8ee04c31faa9877ef1c7e3faeff15eb1bfa99a79ab65f513a136940b8ba979c6d29c212fb3b0ae42082363490a0bd83b383c42bf6adc2fd17f55676b4e9edd34d6a290dcc5e937db8b11d7c90fb96f9296531a3a96bde57e12d6e3492adc4b4001b768af496ee2e6db466d83b2633a498bbf49e66c28736e3fc987a93b9e707bb59b00a22135516d795bc4ba3224e25eaf8016c9d048400b06c1ae63aba027e4f4ed237c53b7a138a95af116c5b44c31d614a5288f34a4a0944190aa9b44970938b85d4851219930e96bdafca790f5deda5fbf9daf6bdb5bdb5b0adf170bdbaed7ff003b54bfa0af2edeb4f3121e57892633ae4290a2af5296c046d52811c95b6a42cb9fce49c7622b5fdf541d3b63a71d5dd416eb73686acd7758beda109212d371a7295e2b0d606d08665b721b6db18f0990d23180927314ac2b5c170e97e1af1e1adffbfb2b16af5e3fe7fcfd7f6fdb1e067b11850ee3fc3f7feea5294a556953a97dd6bdf8bb17fb4e5f54553a97dd6bdf8bb17fb4e5f4a5515294a52953ac9ed9cbfc624bf74a2f54553ac9ed9cbfc624bf74a2f4a5515294a5294a5294a54ac95fda626c2f7287d714ad6cb1d68717b77735e658a4281b9a51285eb96a93ef7b0484c912a6394ac10b4e4808d75d35d6aab82ffca11da44dd9efb9ab969ad9960904b33caf62c0ec27127d8a5164b38de4e9c1a4dadaa9bded8e9a2549edc9bdee130f4d7b5ffdae95c64a614197294400cc67963240cac277213939c6540007d8e383daae0d29607f546a5b1e9f8e925cbb5ce241252371436fbc84b8e04ff37869fed143206c4ab240c91d0af6f9da81d36c6da8338ed14bc4aee8723cd9c96c4122c15ac6b6e3960ba68c639477b5bf6612687b433ad7049af15ea965efadef7ad9dcbb944948d5f274b811f3631f23fdc6efdbf1f7abf4fc211650820083994c1469f5e47d7a7f0af8ef8f5d2899d1b541772562001d707f526136f2ff0087d558afe33971b82e5baa2b71e716e3e14492e38e140efed8dd8e07f2738cf1bd3662db74be958f61829f2d1adf678516deda5380151980c34de3d8a8472a3dfd414a2495577daee3cc0da713ec7d0b8ba54e046f4a21b1b9c49ce003d74b2559010a998386f1e14695c1bda7fe45b525720e4bd284099bcf506728ee9b3b9e18c76d78f7b85fb7f8e9e1ad85773e6444998ce0220a8b04990e378a99e907c744d158deef7eae1afae3fcab7812316ebcf1611f26e053ce07b3f68fc70ecf8b8d6545b986e34188cb200651163ec0318e5a4ef3c7caf7123e4d68cf5a4e9973d577f9f3d657264dd66ade529454ade990e365273d821284a07cedce39ac9647dbd315e04da73646d94e60d7265d3adb39d3213440242d66355a2f103b1fb2362f4e74df795485dae9a60e8e29e2912b33a25ffa6ed7bb8f55ebfae19bb084ea63b4b6d3e4e2bc84fd973b98f6da13019206f7e4252f9c3338623c39b43e496a8033f4a7a1d72bcc12b7c1e3cc2ae61742b903e323b7ec0dcb7d7ba0b943603c33b52ed0f867696c8132cccc53ed9edb71ea8c688f1ecd90472248d663fca89b30275d208fa8617af449d30fccc9da5f922c5bb8f41a649d1db8b8fafab6bbb32ed91b10ee5dd0cdb831ce5bdaa0cc4aebd03b406d1580728e2d42c3176f272847237078be69c4f0f511745379230cf22d8c2f1e41ff00dce7c63dc5b643fe8fa171dc575776ad8ad4972cbddcd6eec867ec170599e11ca93eca5034d998bc6cf77c8aba2ecd8ae2b17876c97b487e751c13e379e22fff00242aca185e3d0356b113e3e2095324b23ee2de8772dfab4a55a5ee69f7469936efdb41d3654cbf98f24ecd394f38e33ca31e6a99f464f3242bc618014617709561f40dafa8a3c95b25f849c5c1d60a9162d42b97cae2295fed7f466890aeab7d837649ee6a7732b6d576c1db39a8da6dfb699c8184e1304983dbe43e4592f134091ce5da5997e0f69be508dc3114531c646c90c58ff756045235a898d7c571c3020b590382e16ff90ee76c33614d97720e58c19b35e4ada566b2dcd0666b669b35657b9efc5ac79d87e54e787f343e4397a66265bb6b9ac7ecbe9da589a915aec52cdd9a17c7dbd05d1addfd4add8b97751b08e2dd8db0eed2711c3f98e4984f2164e61d9bf66c6802987449d32446dbcf7b87637ca8e128ca3288c44f1be389e2583b87a0376ca927637c7fde626dee2de85c66886f5c89237c31f99d85e1434bc477d123233bc1d1b93a321048e3dd30d499c14b1c81bd32a5a9133f33ef1d12fc9112d5c837e4caeedce0bbf6eb70b388db7669db7b63a2760ec16f5b75619c67b25b3c6f67796cc32be0a6a81af7cfcdfb27e6fe518572037e5986c9f196517f46c3204eae798f56c2ff0040ad551398b7590b8b2b1ee3caa635c6717c1788312e17839efca221896010fc6f125927783dfa46a1861ed4999d9cf904814fb64e8b1237a7dfd5ee487ffd737a16ef58d54103dbf4e7183f3404e7d27070483edc609047be471dc7f7d7eb263792e6d32061501008b72894aa366137fea5c18dc9bf98d3fea3f1adf4f30567524ae98a9b9c49c51717b9c8100002b1a98b3d31e24e7f3f7fed37557eab75dfaedc2d5e9f12a55cb90270883ce05612499cb003fa6e63775046be0d13f7fab5f0d798aee65c7e4b2842a0c06f5e8d655bc99c8fe993489c93a723f1c3c1ae9511f5410911e038a3b9d264b39c104b6e864ad239201213807b8f839acfdfa1d9f205d35447096fcbecb4497ca900e5c65c9284920638507013ce016d39f6add7603cb0eb82b39627ccec2473efd8c66f169b25b722f6356da20ea99d94b4eb6bebfa61a8852d3c2f6fda785ed5eac98da751fc9d0286e4089af2dd237338b47e54c0e448ed721c19248d295d9a5697adad7d15a45c40836d2f7b5efaf0eaaf2296b59fa5daf956d79cbacd3ff23c9c7e3d7c15e847f93c9b485b30ec348b14bbaeb1f28d9c650e38e9416728b1aacd88baded27812dbdefc9d1181a1dcd8aa0d785fd0a0f4bebe96adde92dd14c4e916851da9951d32d8495100b8c295e28db8c152a390a528633e00e3dc491f5dda11374d33a7f5ec5650b72c934da2e4f36d907c9dc52c3b15e717956111e4a03296d5e92a94a2149276ab9f3bdb88b5ef6bc3b2f7d2fe5b5bb7c1c7bd58d583a5b95c2fad836bded6bf55efa69e5e3f556354f83ba88f9093fa8009e3ed902b57293903230768ce7ed900e7033903776f7a5294aad56953a97dd6bdf8bb17fb4e5f54553a97dd6bdf8bb17fb4e5f4a5515294a52953ac9ed9cbfc624bf74a2f54553ac9ed9cbfc624bf74a2f4a5515294a5294d6dd5af1ef52b06c5db5fd6f4d6b69dbaf6fc5aeb6bf1a71ee707d87cff00f2a84e0fdb6a8e7ffd029094feaac9c7e958d5d20ff2b47355d64fb648d9f912c16eb1f8fe41cb72444529f65592558db0887a8509fbe912b54e77116bfbc2ad7ab5bf773d793cab5ade96d6d78fcbc6fe5f2796d5e617dddccd47e7fee96ed38e4994987346297861c231d24c377929322c74c89c6fe14f6b69bb5954edc650aaddba28f8f5b13a872fcb580b417b172a4b0d020f3b139717c7f30212104718dc0fb62b27be92f4d2ef7d57893dc6c2dad3d6b977323ba7cc3e1101841271b15b65bae25442b05b2769c6471012a70dd9638121bf3877b1f323fea5475fc9adbb7876542ca165f790b820386116ec4a358007fe0757f9f7eff1de9a604f38a82bb93e94699199cbfeaf5275e1f2757c95bcbd83bb977b5d7749dc727a6d9a9860ea997171b104f3290cfa64544d99b15cbc87be8844dfa35bd3b392bb26607654bf7345eb0f5adf86f886f50cd8a1b931d8e988d95b8a438f16fb93859ca7b13800e41c63b0f6c9d91f5175540d3b6f952eff003588105b90079d7bd2c45cb8b6d9f1540129cbae786818c28ac1e3dfb29f71672528c81b28e2552b4c1a9728c279242961c33b9d34c3a2eeaa5bdbff00f61e87fe55cca4a0ee49dcf0840f56013c9f4ffda3aaddebdbc16bf6f7ab8f8d98360e0f72fcdc57b352e9c027f367ec6ff9d4ca8f48f9e2a305e429848e48cee0860e438a646a93459235c7d9da5bf7b45bf2f5a995c81c9bd05deae8506fae50ab9c6bb88411f2891a32ff0053fdff00f1eae1d5d959276d43addbe136ff00a5d6e33685a7be0819ce7ef9feef7e31a64d632add3b545fa5dadc2e4395759d218580a08532f3ea5b6a4850491b812ac148e0a4fbf1add8ece10401e4f009cd7cd8c7cbf8f5f8f5de3eaf9789ac6fdc6dc6784766cda7365d86e62786b89ed4581f0fe2e9b3da0c7ac6dea8b9e62f3e5aa1e33b599fd142d48e532c9095e1bd24b5a3d608507a1b48e1d20baeb6b94581a8b051b599cab07d21c58f917d3bfa783f871e15a7fb5931caa5d875d9a60ee4731ca00bdb54353f266a6a7ef43eb1beca5437be3847deff0044bdb5a374e8fe9e48b3a98f7bff00b46bb8a2425442776d4938c819c638e7e6bc18ec87de69953ccc70f3adb41e7d650d36a7169485385216b0d804952928501800e339ad3791773b49c89b724076dc6dda1a55116146fd837204ff000531c790f3b9026db37c1e7f8ff1bdff00390db2844eedd8e5e1ae71bde4bc7ab230fa865af71b8f7e90437ead33c23dcc1c6bb33ed9126daea3d3a1bd4ee60edb5d3c4c09f4244205f282769fcc512ca0de85c1e133fadf5ae1f4ac0a226c1b9b2dfa790bdf4838ee3b96e35ab3b15e31929717cb19c27a8d916666cc700471e5e386266a418be10d8dfe8d7a1f0f617e8d54b7798746b7867572d963c5fa72793752ae40e5fa3912142875a5e11c4573f63f5d0c82fa1f74879ce4d73c584b0c5998d67394401c5bfa29e1436ba2d57bd2c7450df6e88597bf63857ce3b8e3cd25c71bf08a94a011bb7709c739c27be7e2bb3748b1214c5c5873dbb936d21bf1253282860bea4ee71b68a8953886c9003a4277f7da2b1b05ecf29767b6cda31423982f987ff503b5465ada91416b19086b3628b32c11124ea20e9f7754bba6d2b3fa17f744b3715cbfa4bdaf43b971d6858bb9e46879c36fe9064f2f97eabce7c9fe1ae9f169f602ab7865d795ca1731fec757838fd7fe1a54096a8ae644584ef4c429e6ff005f4fc7935f071afb579fc8f50e7008c7ce7ff9fb9159e7c09672a46a395ca3132924c05f91d44fecca3875797fe1afc7aebcc3f2f1814f9bf2a21e57253b6654c909c9007b6e9e62f76d7f8f671e15e9b4eca8b08d2fa6e4807fa83e591a80efe7fdd5e6279d2c24fb4467c4a6167122479a72d16612700f4a6a7ff4e1eff684ea7f66a8d3a8ec85c386e14eedae3a31f7506d201fd4ff009f06b34fe8e672a25f351b095801f87094ae71f9241193cf01214495678381819cd55322ede1e99c9b7512059e9ffacf50b76fc9fc34d7afb3d7e4dee7ff00cdbeda125c38eeb2c9da7687c6ead2358077b1651b34c6472a95b0a7bf794aa86b9cdcc177ec8925bb75aeaa18f9fc4ecec4a5dd8b24b6d4c77aecbd6f750773e9b8eefc2de4d7c3d7d5becc1b95a4382f2ee2dccd17199692e279c45a74dc4d817b5d6d981d53b838b528d34beeaf0d5770695f7b5f5dc5cbafbd08c194ed86ff006d90a05b7233ad29612a1ea8ab514c949e380b65c581dc83db279ad8c6bbd30c7537a4facec0cff6ab9f6c7d3014a4ff00e7466995447027bed4cb6073ee107f30562bd60795c6e1e3d56ebd74bdadf5696bf5797bd598ad3ec6d3760c9500856418d2db2f8ecda30c929625d6e1bc343f3526756f3ed6bffb4956902d7af8f1e35a83596adb897025685254971b438952470b0a00f880f030a3c01cf6c838381a1a911dd88fbb15e429b76338a61c6d4085216c9f0d69503c8505a54920f623ef4a5295f4af8d2a752fbad7bf1762ff0069cbea8aa752fbad7bf1762ff69cbe94aa2a5294a52a7593db397f8c497ee945ea8aa7593db397f8c497ee945e94aa2a5294a52b0f80036bdf5f4b6d35d3fc3ab5bf0bdbbfdb58958570daf7b5ef7d74b5efaf5defd97e3e0d2da6baf5dea9900824679038efea2127fc6b8ab1c0382320919c120119208e7d39cf1dce06466b4733ee5865c1b85b2b66092726cc58cb1f4c27cebca379900d0c463ae520524f3d7b5f4ba90b7dd35af7ebe7f5bdafd55e44f269249b2549261901f5d07e8b2732a954d24271dbbf34b1e250eaa642f07ebe054e0a2bd137f28d73a5b0f7732f26c553aa0a57ccf72c8361c69b80ee68d3123bbb5e4d2fb13c6fc050c894892acb77945eda5aeaed6af3922cde6c0758be588ce5f34307f445f0ecff003bfc750a754a695cb850107725869525c50231bdc58486f6e38da96c107bab79c00064ec93e88b4ba23e9fd4baa16d2bcc5ca6376e8ae2c6038c426838bdab3eea7a538ce00c053293df22a4e5c4fac91aab887ce124eee77207a14677beaeff000bf67657a467e4df6cef8ef0e7731310e4989b51e9e6db471cfb93b27beaa337a56eeee8a44f70f60213eb7bd9bd8da2331e6f48ded29340016a97571bdba45e57885e6fcf49d53813d169493962e5e3dcd0264c49e62a58e4a4fdddbd0a74ff00b5a954b15284e9374d34f5d7557adaec0181556cc1b156cc3815c85613d62dc2b038c48c7cad6c6ca53b1a43a502d6dd82929eec30dbbc2d78f5d7d7a5f1c29f7e486f704365285903d3e37200fd0a0f3c7c0c719ea7d6bde92cda6c5688d294872e3764b926285f0fc7891b0ade8eca6db90ec65a54ac0538d9212149ca78afdbd9d1736edeed6aac22c6953e088b9070061b5f77d64b25529afc35eb53c7bdaa9ecaf9bd28e4f2c6b0e312924a3b5d1984d937b2ebdfbf83d6fdfece1a5673ba18e5e86f6ed6b5ca1bc97046bf0544140d329f623094d3296a6507a7e36f5ca3b755f870bf65eb229df9adc12aa2d1f20b20e4de901fd5f0f60fe1deb70d7aaa654a8a920a80de0949238c84e36f1edc1e3fdab5ce3f9485296020277ad414aca094949290012001ce38181edceb943cedddad28b92772400f6605fd4b8fe3b7cbdebd23f380449cee509484b1f3261231fb15ff0078eceaebff001a8d8e9c11342410420fd4e6c7f271edeaf0ff003bd7d650a2ca101812ce1986120e734bfaaf1fd9d476dfb3f17ece5fedfeff00bd5464107278c7031ce149577209038c1da4673cf615aad01393a665390a74e4a54fc8e7082519242528bde3fe1d37f0f8b5afd3c1859cd2bb929c924f1faa1c32404146a83b5ddf9e50a78ef3deb757f0a9381b817b888b32c0e5001fa830735ce5bf67d7bddefe7c2f5f5972a4e5947004a0e08463e6c60b13cef364f57e3bfa5fc8e7007b0ec318c67bfef5524e12918da94a401b40564242544a87241da080738e79e6bea30acb9ece1e57a50807cd8f977fc5bfc74f243aa3b7358a826047cd8c5ce0c7cbf8fbde5fc70acdc6d65c452c4a13b9ce48fd20f90793f8eaedebe3a57ca9008cb2531458248423e679670ffe235fc77e954ac3941c94c6251cb08eca894671849dec5fd069e1eabff3aea8bf94a5b048b02663c77b6440580297196d491b636dc8263723b12823f9ed8a3c42a5ab145920428937e7422c9c87e0f0109c24f189ab919710d7def7ed2d2a5861719761736bc01dc159601ee679457adc8d6fff0017bd77fc9c7bdc81ed1db28616db7b65f5fb3ee728d1cf9029ac623a7d869cd0a09145df50224cbe3d2a8cbbdd3aae85934796582b1bd60522c4621594b7b8a05ed8b57b7adf1afd6845e2dcf4629056125c657dca5d47294e38c85763cf1c7049a917a5daf1ee9f6ab85795b8e7e18eee85758ed1fed1e8720616a6d3ce56c101f49c0cf865bdc90e2943c8ea02585b54947085cd99c8274e781ea5ecfbc7d7dfd2d7bd6e7885c9d71259c4aee782a49fd427428a4fa71b6bdeff000af85b5a6cf921d9476a6cebb363c2b7256761dc9b238a36be39a0b35b849e2a80eb2987ca54204beb44d791c5dc59ddbd67eb1d5cbc969a8b9c7276c4a484360841c4ce4039dfe9ff00cfbdd958b57f88e32fb9e632994d294c2c9ee3c3c6d4e3d86e093fa6456eff00a757d8773b4c07e02b7dbae511a723a81c1f2f2434eb6b5231c175b25c19e70a39c6723d1d7b8099f879bbb9d98d581c5498adff00073c48b0b389879d635518df16392af87987e9a7eac0dfa2c9f4bdf5d48bdede0e6eeba527e4bc669318f32ed25b3f2a522ba49d42a2b9618939a3b6817084ba5e2121b91c34de56b74963965dadbadb6d6b5775bb70b5addeac91d0f385c74cda5f272b6a2888e024288319c5b48248f7536942c8c0fcdfd4e9b3ea3b4a7f07f58b59dbd0df871a65cdcbc43c24a52a8f75ff00acdc84764a03eebed8da483e1e78fca14a52aeda83a953a97dd6bdf8bb17fb4e5f54553a97dd6bdf8bb17fb4e5f4a5515294a52953ac9ed9cbfc624bf74a2f54553ac9ed9cbfc624bf74a2f4a5515294a529597b5ed6b8ad6d6dc036d6fdeebb7874bebc7afcbdb98acaf2b5b72816d437bdb956bf834ebbf0d3e3ecf25e98c903ef9ed9edc0ff001c8fd2b89e540029dc52ac051c150f49291c1f7da49f6c7c135d1cbf2b0f3d94f995b664d99d22cb965c1e2129cc5252423b7ae5da6cb7d0843c9d34b5eca9136c6654a7d6b6e55c2f01ece37ea684f3c2112a8b0dcc254a6253ace45ffa64fc7827eff1ebfaebd7ef2ce07c339e19ed1dcc98a71ee5263b02d72dae7f0d8ecc1017c3fa14efad8bc245efa86dbca6b06fd7c6fa5ad5c34671fc9bdee6c65c58b5ce250c9de06715813843fcd0cd56a463deaf6be8a2d119a259946d286d7b7048ce8199269c34beb6bd451aa743dceed7093708b263b81e512187c9654da363494a5b582b4b832952b90de0ab818c9aceae857d4ee8ad07a42dda42f563bac6f20dbcb54f825994dc896f4954871d75a518eeb40b8ea94036247a1b09c92457579fc9dfd8912ed57b78a4cad326548ed89b64742d992dd5238a6de90bbe52773dc906226cb5ad7b26bdd9dcdbde32086eab5b85c228cf7e4decbaf7b7a3ed8b058160dafa0785ada5afa5ad6b696f0def6d3aef5c66f733bb9918afb9938d7214071c4ae479056e4b9fde6d23994c1231a4911e4a6646d60608e5eeca8d125bb54793255ca9bc3705af658f4ee3e1be5f4e4e6af1d2763361b4b3156940924953eb4e0ee390401df181c67f5e3bd63d75d3a8ad752f5f4fbd4075f5d96325b89646de4a9b288a101c5b85a504e16e3eb754a2464a7603c8aeb97dd5b7d2536d4509724a9b9b32158d638d8fca6da68b1b65323922922c7f0b5f445bbdefc78eaaafe4d3f8a89b546ee7a75049c1381ce03909bd48c27bdf8ead7e5d45dbac4db34db072745d41841e8ff36f15631dbd979b5ade85b5c14f0fed48fa63aaff002f6d6d5319aa708da8262ee862a30b6d59bba353d8613fbbfe2dfceae6c7271c671c7dfdcff5a87070001c01edf73dcff53ce3dab7f91ff6b131610f363f63b5c60ecf8b4fc796bea36aa09dcfa3104b10bfdb183d57e4ebfc70d6a15328092416684c188b07faff00dffc34f0dbe2acf2530b0b884e2d40c259e3e701e9c8f54ba823c3fcfe3e1daa56a2434e1a730e4a23b50fab7a41eb6e6ed6effe3af5d6bee3daa54125408b30b0848e6796307137fea2f7b540370844b8dc4110bd39dce7569e5ff1aad74302616138b307ce589bf2f9061fea84ebd5fcbbfdbe1a52b271f582dfc5ca306308ff0050031f93f1c7bd7d2b0e424b87309775279ef56e6c6007b2964f3fdbd9e4f8bb34a9542ab775e5879e198100fac60bdbb7c9f8f05aae84acc2efca0a834930ed7991801637f975fc5c2f4a542cd8c504c65c8930bddf90ceb0ce469cd7367730a7affb4dfafebedeae6230abb864987f16bf04db18176c770e5a31dada5ee71f1c6ede35e3c7453cfdaf7efdbc16d3869c98b0428c3b04e54338434c717fa9ea5ccf317ea4ff008e1d7dba72a1b1d2c3956cd18977815847218f9ace3e476743bdb9b427b5ff00e99311e1f92d6ae2a38da4fe50a4e4e71839f4a8fd8739fb1aa1c83918c807692327271dbee403cff71aea7ff9541b0e92dab317f740608d6328e3d534616cf56464f3a49c4884a54e319b38116b69ad8443863f70597bf28577484a0b681456d3a92c75473c983708b92672f53b963eaece62ff00c7aebd60b6dfd99d9b6c0d93b3c6cd8f5bb144e56c7cf91c675ea81ce92c92f20ab3bc2a457b5afaeb1b98206778075fa76eb70bfead746fd9f7f2697ba4b2f561064f270de016b0196b2953239aa79dbca8d6feaea1b9a71ca57842ababa9da52c97bef3c2d50aebed25366dd12fdaa22de1276adcd8380e276ef52940fa77e41e7b10413c66b63bf4b3d7dd31a6f473f69d6fa8a25a7f0094a62099cb5ae44ab62da2b8c98ed36871e78c7529f69286d0a2db296527d8d699770b727db1bf74f766e296ac390b7cdcac8b8e9c077173653818fb0379736140a2d7d7d6f79332b45837e3a09323e3db5e9296beb6b5fbf6b5fe5aeb59b17fe4e3e11d9d321c0731e57cd39032e64bc712c8dce2285c693918ca12d1238cac4ae0de6a96f6d52f52890270ab2341856ca52a05e83d60e0dd7b57652006c000436e160dad6b5bbd579681b25cac369722dc50da54ec832194a1cde5b4adb6d0a69400c0214d85e771fce46011938f5f54dd44d1dd4cea147bf68e91226438d6862d6fcb763bb19b90b8cfbeeb6e3287821d2121f5b6a2b6d19d89292a4a811faa52957d563452a752fbad7bf1762ff0069cbea8aa752fbad7bf1762ff69cbe94aa2a5294a52a7593db397f8c497ee945ea8aa7593db397f8c497ee945e94aa2a5294a52b08bb70bdb85af7b767576f1fe158b4a71f1cfb1ff1fd73fe554209e3d38f7253950edf94e4633ce783edf15877d34b86e2bdc5af66bd7d76b787cbdfafc06c00ea205b4bebc6d6bf55efaf7ed7d7b78767c5d58f4d2ddeae252158dc1271d8ede476cfbe39c73c67e7dc1a04800019f482139c7048009ce37738f650acbdc43be9a5adf10ad6be96ebebedf93bfd56acc52b2aa14929c93941c604b24928e38e18f4d004a7b6a7dfafb2d6e3c74d7b35eba8001279e7b8f6fe80703fe7355008cf3df181cf0001f249ef92724d7574da3df02876dd9b2e5020093af9e4f19c677ffc1333a7b793a3fe2bdfbfdb9d7250ce8ce2d66ee00aad49e40c9073bd5a7f66d6d7f93f9deb6d39aa71e8cb23259f187736a64ef0fd3019c3bf345184bc4a94b811c7fe55427ef787855f6339ab32e7331a5f894ca42a47ea271c3f63e3f1755f8ff1aad56b734c720315233118b7617a4fd7e469f8d6fa75e97f92ad19ce5012f9271601049f55e5801ec7feff00fbbb2be6b5a469424fa8841ccf2f9b00c60f63e3fda38f57d7e0e15f449746f4ea49ddcf24ae5839b1f3dcc1455ffea2ff002ff3bd2956e4f26c3e739ce50ae322c0183bdc3e3f07e34d280e5413130bd50059dc8fd707aa94677f784fc779ff00fdd6d7cb51a9dc9bc3cae71c1184c0733c800ce23fa8fddd469e1fe3dfafc9cee8ccf542440f4e0fd4e7bf1bd77be5eaa52be2b93a1c85515be1604a23876280711eac80d3bb74fecdc2dfb22cfe357815e6284698c2cce57b09831807c7afbd7d35ebbf6792b495e1e8b158e0f37cf0400f57247c79cf9ce9a6bf8bdafc6bf2db30424b3aa50130924b6df674631f3a57f3dd7cbd5c694ac9e6890ee7143c924c244a17a925bc00008f3b9ade147ae7d6fc7f75e15c96ece99760385f65904b3284a5ba2f1c6293ca9180d54310d52c3d52c1ba10cccedc404d5ceee87d9618325bdbc850a6e580d50200139079a5f08993b2eb33a8d05db5b6e8ca42a8c5ef223c8b00c2c9006e404a2837b8794bce128b00bb5ef60f295db942083942b6d7320e4a93e457109ef4e0afa250a856630c7f7b38c6a6229659380fdc928ae122cb56148d105cdc42496a1c44913f3d7b12992909e12eb2758edfd30b7b3163b0d5d353dcd95b96eb63ab508f198054dfe25722da92e88a9752a6d861b536ecd750eb6dbad21a79e6b233e9fbe9f2e9d69ba4899324bf66d17667da6aed7765b4aa54b967c37ff08b40752a64cd54729724c9752eb36e61e65d7597dc7e3c77b960cd9dd7e99b9ab5ad581e10d91967088c249964e8ab3d48d597adf90b1247d1a92d8d94dd793c921c154a00305ae2184a18f9b2762120dba76b8929e250e19da6a9462379de4301cdd152022b739a0409e3281a490976e7456e6ac0e6c5c92ee208ae495706d36958037feadf51f52495c8b8eafbd36952894c3b6cd7ad501a49fca8443b72e330421384871d4b8f280cb8ead454a3b4ad2dd0ae9268f8adc6b4683d3ae3884250bb85dadd1ef77578a4614b72e17544b929f1144ad4d30b663a49c34cb680942778516dbef6bc892829420cdb26730977d069e5099965849e5dcc19822cdbc89b1c8fb58771881ce92792a005f24b24e2c2595607235817bb005a956898b68985a56f20e180914fa004ad1a74b6be8009ef50f58a17ac1956e26ac5ac4e679b6bea1471d1ea12c3c11d2bb1a6bac7d48d2d29b9103555d25b285277dbef329fbbdbde6d2796951e738e9652b1e95390dc8cf81f91e41c1aea6aff00a7ee906b586f46b9e87b25be43a95ecbae9e851ac17661d50f4be9976d6581256d9f521bb83532313ff723ad24a4f785894be2f3d8e354ba18fcd7278cbe26b2b6a7b665652d6f5a4f2c450f9b38910ac13883cb3532b4c6d80a51ab24e48a8a254926940a3aea5fb17ed8f2cd9666c512a0d56f78964ae2943398972c46dd304772938e551b2c630969646dc9821b984d845269023200d6e032cc2db1c9abb5c47a40cb2b616693c71c533c47e42d681e991d518ee624716a734a52c40b538ef608ae5294c71468394108ec11dac308456b86db09e92f562d5d51b338fb4d26dd7eb6869179b41737868b8086a6c35ab0a7a04928584150f1633a95477f761a7e46aa3aebd0dbdf45b50b515e79775d31772f39a7afc1a0d17d2c9497adf706925488f73861c417020f832d9522547d997e345fb153a97dd6bdf8bb17fb4e5f54553a97dd6bdf8bb17fb4e5f52d54175454a5294a54eb27b672ff001892fdd28bd5154eb27b672ff1892fdd28bd295454a5294a5294a5294a5294a56886d1d23262b80f32bf0d50d26e38d26b6254962b96694b5430b8a141722fc2d651d267a6b5afa7eb696d2fc2d5adf5b32dbe96989765cc8494908842783a38d03d3fa951236d3cfbeba70e09ef6be9e4eda52baca2d8097344705670ae52debbd04126350c9f6258737eedd20854ff00c56eaa37ce3532762b9a308b7846e0684c463e6fd393ec7f8b77f870d2fa5aad99fa61730c2e40d6ec492da99192dea6e00fafdade1bbf43b82151bcff00cbd6ad199111b7a1101d8c038aa1dac558e58839d4a67fd426f0fe2f4a56240324488e6a399648de492e08c9f48bc90dbd79af92dfcebec6fc72e56138e500097ec80d467f3bfe7f2755f8d694a8787f903800e4ad2489193fa84b78c8d0c274ecfdefaaa91bd698944109dcb2c448fd392307f3f93af4d694ad7624458ae9c7fac238927d87d97afcbd5c3abeaaaa462382588259a7083fea1270ec69bd7c0f6febf2f1ede15a66072b18513cc87f52c4f2ccb80fe64cf277b5fe3d954cdab0261dc91047cf038035f8bfb4f1e1dbf55e94acebf12616489404470891dbf5c9e7f9dbf7f78b7c9d5fdfa698b6bc3689ccc6a7230e0a375f59ac00c1cd792b5fc4de62d462393f2883060e73b3d71dbeb7ff008af8fb6b4ce411c25c05730c2ca24c00ee6291f32473dff8e9f4ff00d7dafe4a52b6b1b4122628d3cb6c598423b8aede9de5e959a3e70f507aab0c0dc98d1defcaf5b26018a841d3902df8915ee21956e46ddaae7252a1ab9c488633ae7dc858041632f7b8b50b72621006d6bdfaed6b26d3956e02e22b70154356a5bab9a824ea5ea46afb8c8714e21abd4db64305594b702d2f2edd0d0d8fca80a66325e584e029e75d70e56b528ef53a11a5a1e8fe91682b4c5692d2ded3b6ebc5c141385bd74be476eed7071d56029c52244b5476d4bf5263b2cb40250da10952beeab8bc9502060755d1e7c46d72b2d61d177154d4bd3a19194deb46dabcd615669004eee5a2702c68558dbcc5014cb0024c75c075ae0ad74c0bb33cbb3fb66575f1b7764633315c50993adb4955a3676c5bca5a302944b1edc972142c05a26844f4f2a1cdc2e344414d4325509304fde4ab32db64bb5de7b36bb75be4cab84869d79888846d79e69a84bb8ad4da5c28df984daa4b6124a9e6f69682cad015215df51d8ac56b917abb5d2242b5447998f267b8e854761e7ee0dda5b43ab6839b08b8ba888e9500961ede1f2d86dc28db752b7bb34d88e4d8fe1d911f5fb22c1dd6598ce2d059dc831f43c4ecfae85c366cfe36725dc6f6a10b6339662346246f834c906e57bb5ac2cf5434211a5bacdece2fd8d36618e4af34c6664baf9095c75d608e51367903b81a244a7124ca16d7222e44d81493bc5ed689f6ceae8a9adc644f2a1c59a3c06320e3d82c5bb84c32f9b4749358dd272203b1e0da1c5eccb9759ecb48429c6efca4b6b6e2997243e1cd37758cec50c192c4865b6df65bf19a52a35bf75dba7f65b63b74625dcafccb61c21bb25b243cb712d3ba610b71b76688310c72ceafb1cb66619221c98921d7634874c77928e1ae451293c44c682a4ec2e8c264823ed32b6403aa339189d636fa489433be21b1c10ef0d8e44806624565f28a38201f2457b8456b7604ee43e6c572bc6330c2ef4ac47adc62e09dea2d738621197894a8f5862b6f2b85f52996429d5a810c63b5c25c89226243cca6b581c526d4f2c86496398a1823f20657d73c383c8985ca704cee7bbbcbe63b8a4b0d5d8c1ed71a899498c0118585e0f6c20f6591bda77056996aa4814e8ae55ab5c7b928f4adb36aa3db8810b769163296b62e2f956e45ca48b585f0932e0b8056b985a9692800106e598101a6dac6736334a36f2e92cd4e89eb55820dae7f9d8173722d965ad0b42c3cd5f2dd1dc5c47d4d610a72db767184b8503617e06e492d90551ef5d2de7a8df4ebaa2e57ab60b75d2ccd4dd45010e34e36a8ef69cbaca69b9d192fe5d43578b137214d0592b11ae9b57b5d4909ecd953a97dd6bdf8bb17fb4e5f54553a97dd6bdf8bb17fb4e5f5b31ad3ad515294a52953ac9ed9cbfc624bf74a2f54553ac9ed9cbfc624bf74a2f4a5515294a5294a5294a5294a5295b17ee8db996c3b20e52920ee50451e530470008e11d62bd713f8d3428b9fbb7a6bdac95c5477fb3e2adf45494ba15199ec6dd61f338fb3c9e2cf89b76798fbea04ee6d4ea4d8f0aab10e0dea0374a787792532ae36d37926c3b5faaf4a5750c8c88c5042b25b5f91a742b1c8e700243931e6949ce51eb8e7d3fad96a5dd7cbdba7656aa1303727020b2c2f50c4fce73258ce3897cdebff00529774f99a2b77fbd6aec66dbb1becbece1085af09c1d08403e586c99bce2f4bdbaba9575f677bab8551df666c0c22f9abe2d8adcbe4f239062338cb696f8d57f8f0eba52bad39783e509461504ca5a8c2c00e709dcce7c38d2fcbbafe2ddbc75a9f768ac88b17362922254218ce2f9e1a091f3a41ddbbc7e8bfc77f8e95d9a0bd94f675287ce1787a1801781b7fbd4ff3f2550a6d9ef07a2184d231340ec683a8c1469a8e335f8cf4c2b7d74a575ac88c2dc8d073674b1188cff5ec36d7c34a2fff006befeb5ad8db8b9f825079992321bfd496346ea94de67fe6374b77bc1deaec016c3789adc9d31940fd27eaff00a26c7c3ff49e5ead3c15826612c40707922c65092edde2a36d24ff00f0260fc7f8bd295c1cb4b1c81a6c125c9c9a9416671f5119e5737c34fde7f75e158ced0554e856f01508cbe58f500c0bc828dd6daf7fb3e2e1d7e0ae6ced8130e80571178f23458aff00d5a3b035f286fadbebfefc33701622383c91c292043de0393d13ff00c0e61fae94aea1399588f8ee4993b79f7285712a21696612600d28c02f469d5dc41301e947701869851b7ebe78b32d7e36d6fc81ec90f18d2358bf12663758346d7be61dda3cd80642751129d02a1639ce51f29a104be4cb0b4e313f13155a0796e696b7610d19451c6d939a96e69a3ad68eea7eca2cf146088e6fc731f3d135b618289e434e5295abc09895aa2c7c55f87bda95869045971cbd91c0f19fcddcf5d1f20b2c221183170a843aba256f5ed299c97a76a753111ce8d842c504b7b91ada23c6dc6af4659814cb0c40352a44886a0b304944a0f11172ee699716b235bf9ae95f57f55beedb9b94dcb972ef368f1db696d84dc26b77eb34c60c865e42936ebbc6618905280b5a624c8e95a54a2aadc9f4e3c975b3a07a1e331757613b020dbf4f5ffcb3cfb6e955aadcee98d456f9222c861c42aed62972a4c50a596db54f812d6d2d0908ae4ee33b45acc2bb484cb18c91ee0919c4b8f1d734c1e04a1b63f265a931f34cb25095e55a982bf411c4cc86d4aa44a585b796aaef8f166ab2f7220099380f50106dfd56d070fc73b554f72e62d6e914e71ec9012e6958d190de1581e264d7388b1ed5291bd3a985af72b2655235ab1f1af7d09ee57469db4873bd95dd4dc3b35a558937a8b7e92d456182cc745af517f1059a4b8932ee16c2d35e5e0dadb7df3e51cb5c28a8623b513c82195351d86148f2ad3519126dbba4ba621bd364c84c894e5e749ff0aea188d29302d7790fbde6ae57a7a346027357bb8cc5c894f4f17372421e9526421cf3afbd31ddc72bdab734de4f1499b0496d0c944571547b0ef4c454b392289244a34030b4439614e0a5cd2bdba1e5dd2856a83082929836d6e3c9444294d63859080e32ce1b596447531a7a5e6d275e601ca613794b9a8136b427b82c416e327922eb9c14a4813a7b276e420e7d72925285032372a1105a50fc0c138664b9eb26306388d08094c7219ab5eded416231046a36df609cf2fee1c9102d725127bd8b4a9c46922717450ded241a154bd3dafce6bc3cc37064318b046096338f34d3886e24a6e4c52993cde4ca825a635dde0e4649463a3db9180073a70801211a52c9428cb44d4852254d2074c7a7fa87aa8f3b2b505deec34a439fe23c8f32ea9572ba969b4badc165c2b8acbe98ea6fcedc0b0b7025c6da4a5d71d5ad886fae9d63d27d068d1adba4b4f58dfea05d2d9e1424f946908b458c4870b326eafb21b9b221996977f0eb4a64b4db8e32f3a56c34c212fecc136c9186f161ad6caf25bb67bc9ae8a886f44c494c7362881eeaa46009085ad91855a4953c1859d71000bd74890245455ac72b8fa52f9d26dcc7ecc1b3147b0db393237b87e3b41921c4b18c4745a13136c1c35b959212cd8cb649d034972378e582c1b3caf72795c4ab520e69104294b1285dfad9b766d063100a7b3d1267bcb2f6985650a2c20aa410c40a83a9ac2c265f9403161801736f4f45e82582b09122105b42618bf77359e1a43a6ba3f4932c2ad7a72d5124b412a6e47946df9e8527052b72e1252f4e71e046e0a5c8578649d9b49e3597ac7ab7d47d74fc85ea5d657db8b3242d2ec04ce7a1da363990b69ab3c2547b634d293e952511417120070af19a54ea5f75af7e2ec5fed397d5154ea5f75af7e2ec5fed397d48551bd515294a52953ac9ed9cbfc624bf74a2f54553ac9ed9cbfc624bf74a2f4a5515294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a9f95c563d388d3e43e56d495ee37246c56cef4d4b4171a75cdeb891127923e4dc26163e48b9649e48cb5098e096a139a51e516607aaaed91b154e765d952a5e9932e91e21785c3bc526c511730282ca0621131b957336105b5f5206f624852658a42fe482cb5b840516706c6ced955f31e9919a46d2e0c3216a6d7d64764a6a17467774499c9b1c519e1e41c917205859c955273437e49849e50cb1db80837a89faadd25b2f546d4d3325d36dbe5bd2e1b45e5a683aa67c4c17224c67720ca82f292145b0e21d61d01e61c4e5e6df9cba1fd74d45d16bdbf221b3f8be9bbaa9a17dd3cf3c594482d652d4f80fed7043b9c7429484ba5b71992c931e534adb1de8dd1aa95d8cb3777233144c95ac7bc392a71c54e0a2e33851b5e98e95438675f942b810ef0b933fb200e30571197e917a489c3609485ad3941b176d873ef72476a76b53729ad6e3092a6b8c7cdaa6c95b8a2d0bb5fd4c4790fb1e6a19660c37b72cb26ea8001d841b1c606c130781ba83a03d53b0495b3fc34fde580a21a9d61711728efa41c05a594144f641c8e2543615dc8052335b3ad2df549d13d510da91fc61174f4a5212a7edba9db72d12a32c8c96d721c0bb5be4723743b84947ca8138afb9b23a7371661a03d32369eeb9333e3b1891850b710354ee6c4a3eeaba3eced484b06a69663ccad248962f24160014256c605675ee5104981e64b66dd9b418c4029ecf4499ef2cbda6159428b082a9043102a0ea6b0b0997e500c586005cdbd3d17a0960ac24488416d09862fc3d97f65e67c311c87bcc88925c723a0c7b0e8c1c2b88952dd0d1a08c36a593b6c68d05ae1344f124b3d39383de8052b0a5d6444588441382b377b5b07e9a690674968fd396b530199312d313ccb4a4ed5227bed264dc5c5a48043ae4f7a42c8564b614119ca78d4e757758bdaeba91acf52aa4f9a8f71bf4f4dbdd4af7a3f0786f185666da503b4b6ddb23c540527097082e632b34a529521d46d4a9d4beeb5efc5d8bfda72faa2a9d4beeb5efc5d8bfda72fa52a8a94a5294a9d64f6ce5fe3125fba517aa2a99bb53e275eeca9b1d9a8821d5692b8642e6258b8e24e29adb9ac410a94f216e00cb181b8b36d6ba6b08023061b8c76b06f4a55352a7776967bf71dfa2ee5e77d376967bf71dfa2ee5e77d295454a9ddda59efdc77e8bb979df4dda59efdc77e8bb979df4a55152a7776967bf71dfa2ee5e77d376967bf71dfa2ee5e77d295454a9ddda59efdc77e8bb979df4dda59efdc77e8bb979df4a55152a7776967bf71dfa2ee5e77d376967bf71dfa2ee5e77d295454a9ddda59efdc77e8bb979df4dda59efdc77e8bb979df4a55152a7776967bf71dfa2ee5e77d376967bf71dfa2ee5e77d295454a9ddda59efdc77e8bb979df4dda59efdc77e8bb979df4a55152a7776967bf71dfa2ee5e77d376967bf71dfa2ee5e77d295454a9ddda59efdc77e8bb979df4dda59efdc77e8bb979df4a55152a7776967bf71dfa2ee5e77d376967bf71dfa2ee5e77d295454a9ddda59efdc77e8bb979df4dda59efdc77e8bb979df4a55154ea5f75af7e2ec5fed397d376967bf71dfa2ee5e77d62363638a7717073735e8969eb5136210010b61eda4924b69eeaa02210543aba8cd30d1ba996bdec6141004a05ac015c4215295f7a94a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5294a5295f8345701460add612c62b7c610def6faed5b3cc739de7cf3897653210c7da721663cdb81d8327ba9d2190871dc5829d9a1b8ed74ee44e6e8c30f96988942991e428f256a6162872828e35d4e186cd6d8da79c5ef16f6b0ad70dedad856bdaf6efdaf6d2f6f2dab4896e08c5eb22502848189cda98f1733b7b063e3e35319ac4a4d14656c654f1c4ed8d3368c489a2684a439912256e73286fe659e494c45ddf7e30a00eca56d99db6d191b6431be5bf99720472187ed5d3e9fb1a8c94412ae2f19d9272b33e329a96c6b134317a196c81f02e86bc3236986c71aeca1285a8f7fddd474d13b8cc6f93e51269a4cf1dcee12d50c9644a2f029c00b8f4c8f9bb2b9457222f9d3432997745713862a44fa89db1d49123c3559a95a120bb372a6f7b732d61964b954bb346114517bc2d3418a2a33785e5dc7976ce9e940ed78767890a195e5866dec6f625fc996bfb6a270316ef5d24ce223778fac694861a9ccd524b128f2295bc4dd2b704a943f47233127675b2858212b8f439ca58ef1b6eba41a8120202dae33894a90a84c94958aaeea2296a8524a3405a552b6c916da5a5d2671c16e03c56dadd8cf68b7578478f2625e4512d93a26a4d8b67795185da5b06142512569512763856a85b1a66120e8e02f304f6b5b9c1114d4e1a13b37eda173f0ceccacf39617b5f36786a8244727be39c9ece8ae3ed8ae178b6d1dcbd23735e84b56ee5e4478cbf87cc549940c93dbd44f9e561ef2ea5445c542fde1b46ce18758a571e99b5c65c8879883b3ebdc3d39b369e2c8cc3dc64ccefac1201c4a12b64ca217174cf0d525794ebdb98581bdb8f31494ac692eb50b7a84b922765cc084313f468ac72d81669362b8a6147c4d7717e19cbb1a41d02a6b8ac76ebc6ec2714e7342155724b7f48ac892a81246a396bc293d95a0d42a56df45b6a4bddb15e51cc90bc1e89ee158863ce5269385f3288a30fce4d264509c971553156c0e3d7b4ae453c6297d83cd9e46ece6c17661c9d4c7d9432e7163344bb54176d3aa8a914960cd18c9e24990e1ee79904fb08657b4e6bbfa15c69146c9545640d373db0829c1664f04df14b531b31db81285ce68ec459e5d2f0e5b672b49aecc58472090e48a4d105836c7b8e2189bfb2314ca75108f49181ad00dada10c9e3b10933131c946c8de3b25635afadee0e0c851292cd4a91dd124b91f5526148e5f2165dc84f574eecbf2cc5e2b0356410804ce7b641e32d8ec45d984ec8577482e5ae8ef2390392a7a246d6ac088c61692cbbfa1c46bce52a090ed1e78b678cad9d97c6a36a14e2d8dcf640b227159bbabb94a8f8344ef273e3eece3238042a4b0e910c761353b32496048dd988f08558d0ae48a120d4450b68bc9a1ceb7c1a9b19b59d945e70b4532c24883c6504cdf8f6371ff47194238fcb97cd1af12baca3d128cb438fd13936a56794331ae2e9648c216e6f8ebecba5bafe8706e3241039ce350b1382f8964c25f889f92fd2d98c95f65c19347d2c51e4c7c98c8640e9315aa944650a0614eb0c7fdedb5a5bdb90b61e8d3a0460234ff33ece69f2549d04ee30eecb0d9e14d6db1f73962c4191d43ca98fb11b2552c2daccf58d330e1c93c5f71513496dd789a64564d234ef56492344e6534b2747295a14c19fb33e419b61590c6b1c36207d75c65b6636cc710bae5f5a8a20924985b3ee1ac65d2e397b763f722640e6954373ea48d9e28526b262662bd3f4822406382e51ab9b2ae7096e790659963bb6363642cb94e39578c1290e625af48a233bd9ef0ee554edb2022d1b6624b5e10cf487952a02e4f4321ddf5e63041c6b3c559df6457787767b83e1e8f421b1b4a35d5ee0ecd92595be46a0d5a987bae609db764ac86953b67482a4a537bbcbd9da15b794b8c74726840d691bc8773ac6b91ee16d8e31540711b3a861c791f0475a555a3763d201c5ddcac65a230388e328edae73c2f71501e8e83c1228c41e41c1de42d215eb3787558e0b95a95a854a5294afffd9}}
\par {\pntext }
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2721480}{\*\bkmkend id2721480}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> val t = 7\line t: Int = 7\line \line scala> t.length\line :6: error: value length is not a member of Int\line t.length\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls77 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls77 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
However, sometimes we must explicitly type annotate to help out the inferencer. e.g. method arguments, recursive calls.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart BasicFeatures_FirstClassFunctions}{\*\bkmkend BasicFeatures_FirstClassFunctions}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
First-class Functions
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls78 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls78 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Since functions are first-class, we can pass them just as we do for any argument.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls79 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls79 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A function that accepts a function as an argument is a
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
higher-order function
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls80 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls80 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The Scala library includes some higher-order functions
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2715157}{\*\bkmkend id2715157}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line people.filter(_.age > 20)\line \line people.sort((p1, p2) => p1.name < p2.name)\line \line (1 to 15).filter(even)\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes}{\*\bkmkend AlgebraicDataTypes}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Algebraic Data Types
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes_TheExpressionProblem}{\*\bkmkend AlgebraicDataTypes_TheExpressionProblem}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
The Expression Problem
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls81 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls81 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We use the visitor pattern in traditional OO to get around the problem of wanting to add a method to an interface and all its implementations.
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls82 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls82 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
What if we don\rquote t own the interface?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls83 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls83 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
What if we don\rquote t have track of all the implementations!?
\par {\pntext }
}
}
}\pard {\pntext }
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2728284}{\*\bkmkend id2728284}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
One or None
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls84 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls84 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Suppose we wish to use a collection that always has only zero or one element and we wish to dispatch based on this.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2755269}{\*\bkmkend id2755269}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line interface OneOrNone \{ \line A visit(OneOrNoneVisitor v);\line \} \line \line abstract class One implements OneOrNone \{ \line public A visit(OneOrNoneVisitor v) \{ return v.visit(this); \} \line abstract T one();\line \} \line \line class None implements OneOrNone \{ \line public A visit(OneOrNoneVisitor v) \{ return v.visit(this); \} \line \} \line \line interface OneOrNoneVisitor \{ \line A visit(One o);\line A visit(None n);\line \} \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2730940}{\*\bkmkend id2730940}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Visitor
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls85 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls85 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
So you write a function that uses the visitor.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2713784}{\*\bkmkend id2713784}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line class You \{ \line static String stringOne(OneOrNone o) \{ \line return o.visit(new OneOrNoneVisitor() \{ \line public String visit(One o) \{ return \ldblquote got it! \ldblquote + o.one(); \} \line public String visit(None n) \{ return \ldblquote don\rquote t got one\rdblquote ; \} \line \} );\line \} \line \} \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls86 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls86 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We are effectively destructuring into one of two parts, where one of those parts contains a value, while the other doesn\rquote t.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2727944}{\*\bkmkend id2727944}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
ADTs Instead
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls87 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls87 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Instead, we do away with the visitor code and create an
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
Algebraic Data Type
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2726343}{\*\bkmkend id2726343}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line sealed trait OneOrNone[+A]\line final case object None extends OneOrNone[Nothing]\line final case class One[+A](a: A) extends OneOrNone[A]\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls88 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls88 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Then we
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
pattern match
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
when destructuring:
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2726328}{\*\bkmkend id2726328}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line def stringOne[X](o: OneOrNone[X]) = o match \{ \line case One(o) => \ldblquote get it! \ldblquote + o\line case None => \ldblquote don\rquote t got one\rdblquote \line \} \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls89 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls89 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Much tidier!
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes_DescribingStructure}{\*\bkmkend AlgebraicDataTypes_DescribingStructure}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Describing structure
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls90 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls90 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Consider the set of natural numbers
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
12
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
12
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See Church Numeral Encoding \u8212\'3f Alonzo Church
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2730949}{\*\bkmkend id2730949}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line sealed trait Natural\line final case object Zero extends Natural\line final case class Succ(s: Natural) extends Natural\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls91 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls91 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We can now write a function to add two natural numbers.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2718560}{\*\bkmkend id2718560}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line def add(x: Natural, y: Natural): Natural = x match \{ \line case Zero => y\line case Succ(t) => add(t, Succ(y))\line \} \line \line scala> val k = add(Succ(Succ(Zero)), Succ(Zero)) // add 2 1\line k: Natural = Succ(Succ(Succ(Zero)))\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls92 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls92 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We destructure algebraic data types using
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
pattern matching
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
\u8212\'3f the
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
case
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
match
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
keywords.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls93 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls93 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We could write many functions over this algebraic data type.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes_List}{\*\bkmkend AlgebraicDataTypes_List}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
List
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls94 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls94 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Lists are extremely common in high-level programming.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2754895}{\*\bkmkend id2754895}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line sealed trait List[+A]\line final case object Nil extends List[Nothing]\line final case class Cons[A](h: A, t: List[A]) extends List[A]\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls95 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls95 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Singly-linked list, however, unlike what you may be used to, lists are immutable! We
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
prepend
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
to lists, not append
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
13
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
13
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
We can, but it is a more expensive operation.
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and we do not do it destructively.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls96 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls96 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Immutability leads to sharing. You can pass your list all around the place and nobody is going to update it \u8212\'3f not just by promise, but not even the most malicious method could.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes_Option}{\*\bkmkend AlgebraicDataTypes_Option}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Option
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls97 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls97 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Option
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
structure is a list that contains 0 or 1 element (
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
sound familiar?
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
) \u8212\'3f and is not recursive like
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
List
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2732495}{\*\bkmkend id2732495}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line sealed trait Option[+A]\line final case object None extends Option[Nothing]\line final case class Some[+A](a: A) extends Option[A]\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls98 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls98 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Option
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is a better
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
null
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
than
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
null
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls99 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls99 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Consider a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Map.get(K)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
that returns an
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Option[V]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
\u8212\'3f not just a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
V
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls100 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls100 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
flatMap
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
method is one example of a method written over the
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Option
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
algebraic type.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2729423}{\*\bkmkend id2729423}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line X x = method1(args1);\line if(x == null) return null;\line else \{ \line Y y = method2(x, args2);\line if(y == null) return null;\line else return method3(y, args3);\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Ick!
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2670176}{\*\bkmkend id2670176}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line method1(args1) flatMap (method2(_, args2)) flatMap (method3(_, args3))\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes_Either}{\*\bkmkend AlgebraicDataTypes_Either}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Either
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls101 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls101 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
algebraic type is exceptional in that it was authored by an incredibly handsome person.
\par {\pntext }
}
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2755184}{\*\bkmkend id2755184}
{\*\shppict {\pict \jpegblip \picw49275 \pich49244 \picwgoal3600 \pichgoal5560 ffd8ffe000104a46494600010101004800480000ffe1380645786966000049492a000800000008001201030001000000010000001a010500010000006e0000001b0105000100000076000000280103000100000002000000310102000b0000007e00000032010200140000008a00000013020300010000000100000069870400010000009e0000003e2300004800000001000000480000000100000047494d5020322e342e350000323030383a30373a32332031303a30333a35370007000090070004000000303232300191070004000000010203007c92070046220000f800000000a00700040000003031303001a00300010000000100000002a0040001000000b400000003a004000100000016010000000000004e696b6f6e000200000049492a0008000000070001000700040000003032313011000400010000001e220000a20004000100000058ec0000020e0700bc21000062000000050e040001000000020000000e0e07001e0000001e220000100e0400010000007c22000000000000000021bc4e4b4f4e022000006d6e74725247422058595a2007d2000a0019000d00200010616373704150504c000000006e6f6e65000000010000000000000000000000000000f6d6000100000000d32d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000964657363000000f0000000437258595a00000134000000146758595a00000148000000146258595a0000015c0000001477747074000001700000001463707274000001840000002c72545243000001b00000200c67545243000001b00000200c62545243000001b00000200c6465736300000000000000164e696b6f6e207352474220342e302e302e333030310000000000000000000000164e696b6f6e207352474220342e302e302e33303031000058595a200000000000006fa2000038f60000039058595a2000000000000062940000b785000018d958595a20000000000000249f00000f840000b6c858595a20000000000000f35400010000000116cf74657874000000004e696b6f6e20496e632e2026204e696b6f6e20436f72706f726174696f6e203230303200637572760000000000001000000000010002000300040006000700080009000b000c000d000e00100011001200130015001600170018001a001b001c001d001e00200021002200230025002600270028002a002b002c002d002f00300031003200340035003600370038003a003b003c003d003f00400041004200440045004600470049004a004b004c004e004f00500051005200540055005600570059005a005b005c005e005f00600061006300640065006600680069006a006b006d006e006f00700071007300740075007600780079007a007b007d007e007f00800082008300840085008700880089008a008b008d008e008f00900092009300940095009700980099009a009c009d009e009f00a100a200a300a400a500a700a800a900aa00ac00ad00ae00af00b100b200b300b400b600b700b800b900bb00bc00bd00be00bf00c100c200c300c400c600c700c800c900cb00cc00cd00ce00d000d100d200d300d500d600d700d900da00db00dd00de00df00e100e200e300e500e600e700e900ea00eb00ed00ee00ef00f100f200f400f500f600f800f900fb00fc00fe00ff0100010201030105010601080109010b010c010d010f0110011201130115011601180119011b011d011e0120012101230124012601270129012a012c012e012f013101320134013601370139013a013c013e013f014101430144014601470149014b014c014e015001510153015501570158015a015c015d015f01610163016401660168016a016b016d016f01710172017401760178017a017b017d017f01810183018401860188018a018c018e019001910193019501970199019b019d019f01a001a201a401a601a801aa01ac01ae01b001b201b401b601b801ba01bc01be01c001c201c401c601c801ca01cc01ce01d001d201d401d601d801da01dc01de01e001e201e401e601e801ea01ed01ef01f101f301f501f701f901fb01fe02000202020402060208020a020d020f0211021302150218021a021c021e02200223022502270229022c022e02300232023502370239023c023e02400243024502470249024c024e0250025302550257025a025c025f0261026302660268026b026d026f0272027402770279027b027e0280028302850288028a028d028f0292029402970299029c029e02a102a302a602a802ab02ad02b002b202b502b802ba02bd02bf02c202c402c702ca02cc02cf02d102d402d702d902dc02df02e102e402e702e902ec02ef02f102f402f702f902fc02ff030203040307030a030d030f031203150318031a031d0320032303260328032b032e0331033403360339033c033f034203450348034a034d0350035303560359035c035f036203640367036a036d0370037303760379037c037f038203850388038b038e039103940397039a039d03a003a303a603a903ac03af03b203b603b903bc03bf03c203c503c803cb03ce03d103d503d803db03de03e103e403e803eb03ee03f103f403f703fb03fe040104040408040b040e041104150418041b041e042204250428042b042f043204350439043c043f044304460449044d045004540457045a045e046104640468046b046f047204750479047c048004830487048a048e049104950498049c049f04a304a604aa04ad04b104b404b804bb04bf04c204c604ca04cd04d104d404d804db04df04e304e604ea04ee04f104f504f904fc050005040507050b050f05120516051a051d052105250529052c053005340538053b053f05430547054a054e05520556055a055d056105650569056d057105740578057c058005840588058c059005930597059b059f05a305a705ab05af05b305b705bb05bf05c305c705cb05cf05d305d705db05df05e305e705eb05ef05f305f705fb05ff06030607060c061006140618061c062006240628062c063106350639063d06410645064a064e06520656065a065f06630667066b067006740678067c068106850689068e06920696069a069f06a306a706ac06b006b406b906bd06c106c606ca06cf06d306d706dc06e006e506e906ed06f206f606fb06ff07040708070d07110716071a071f07230728072c07310735073a073e07430747074c07510755075a075e07630768076c07710775077a077f07830788078d07910796079b079f07a407a907ad07b207b707bc07c007c507ca07cf07d307d807dd07e207e607eb07f007f507fa07fe08030808080d08120817081b08200825082a082f08340839083e08430847084c08510856085b08600865086a086f08740879087e08830888088d08920897089c08a108a608ab08b008b508ba08bf08c508ca08cf08d408d908de08e308e808ed08f308f808fd09020907090c09120917091c09210926092c09310936093b09410946094b09500956095b09600966096b09700975097b09800985098b09900995099b09a009a609ab09b009b609bb09c109c609cb09d109d609dc09e109e709ec09f209f709fc0a020a070a0d0a120a180a1e0a230a290a2e0a340a390a3f0a440a4a0a500a550a5b0a600a660a6c0a710a770a7d0a820a880a8e0a930a990a9f0aa40aaa0ab00ab50abb0ac10ac70acc0ad20ad80ade0ae30ae90aef0af50afa0b000b060b0c0b120b180b1d0b230b290b2f0b350b3b0b410b460b4c0b520b580b5e0b640b6a0b700b760b7c0b820b880b8e0b940b9a0ba00ba60bac0bb20bb80bbe0bc40bca0bd00bd60bdc0be20be80bee0bf40bfa0c000c070c0d0c130c190c1f0c250c2b0c320c380c3e0c440c4a0c500c570c5d0c630c690c700c760c7c0c820c890c8f0c950c9b0ca20ca80cae0cb50cbb0cc10cc80cce0cd40cdb0ce10ce70cee0cf40cfa0d010d070d0e0d140d1b0d210d270d2e0d340d3b0d410d480d4e0d550d5b0d620d680d6f0d750d7c0d820d890d8f0d960d9d0da30daa0db00db70dbe0dc40dcb0dd10dd80ddf0de50dec0df30df90e000e070e0d0e140e1b0e220e280e2f0e360e3c0e430e4a0e510e570e5e0e650e6c0e730e790e800e870e8e0e950e9c0ea20ea90eb00eb70ebe0ec50ecc0ed30eda0ee10ee70eee0ef50efc0f030f0a0f110f180f1f0f260f2d0f340f3b0f420f490f500f570f5e0f650f6c0f740f7b0f820f890f900f970f9e0fa50fac0fb40fbb0fc20fc90fd00fd70fdf0fe60fed0ff40ffb1003100a1011101810201027102e1035103d1044104b1053105a1061106910701077107f1086108d1095109c10a310ab10b210ba10c110c810d010d710df10e610ee10f510fd1104110c1113111b1122112a1131113911401148114f1157115f1166116e1175117d1185118c1194119b11a311ab11b211ba11c211c911d111d911e011e811f011f811ff1207120f1217121e1226122e1236123e1245124d1255125d1265126c1274127c1284128c1294129c12a412ab12b312bb12c312cb12d312db12e312eb12f312fb1303130b1313131b1323132b1333133b1343134b1353135b1363136b1373137c1384138c1394139c13a413ac13b413bd13c513cd13d513dd13e613ee13f613fe1406140f1417141f14271430143814401449145114591461146a1472147a1483148b1494149c14a414ad14b514bd14c614ce14d714df14e814f014f8150115091512151a1523152b1534153c1545154d1556155f156715701578158115891592159b15a315ac15b415bd15c615ce15d715e015e815f115fa1602160b1614161d1625162e1637164016481651165a1663166b1674167d1686168f169816a016a916b216bb16c416cd16d616de16e716f016f91702170b1714171d1726172f17381741174a1753175c1765176e1777178017891792179b17a417ad17b617bf17c817d217db17e417ed17f617ff18081812181b1824182d1836183f18491852185b1864186e1877188018891893189c18a518af18b818c118ca18d418dd18e718f018f91903190c1915191f19281932193b1944194e19571961196a1974197d19871990199a19a319ad19b619c019c919d319dc19e619ef19f91a031a0c1a161a1f1a291a331a3c1a461a501a591a631a6d1a761a801a8a1a931a9d1aa71ab11aba1ac41ace1ad81ae11aeb1af51aff1b091b121b1c1b261b301b3a1b441b4d1b571b611b6b1b751b7f1b891b931b9d1ba71bb11bba1bc41bce1bd81be21bec1bf61c001c0a1c141c1e1c281c331c3d1c471c511c5b1c651c6f1c791c831c8d1c971ca21cac1cb61cc01cca1cd41cdf1ce91cf31cfd1d071d121d1c1d261d301d3b1d451d4f1d5a1d641d6e1d781d831d8d1d971da21dac1db71dc11dcb1dd61de01dea1df51dff1e0a1e141e1f1e291e331e3e1e481e531e5d1e681e721e7d1e871e921e9d1ea71eb21ebc1ec71ed11edc1ee71ef11efc1f061f111f1c1f261f311f3c1f461f511f5c1f661f711f7c1f871f911f9c1fa71fb21fbc1fc71fd21fdd1fe81ff21ffd20082013201e20292033203e20492054205f206a20752080208b209520a020ab20b620c120cc20d720e220ed20f82103210e21192124212f213a21462151215c21672172217d21882193219e21aa21b521c021cb21d621e121ed21f82203220e221922252230223b22462252225d22682274227f228a229622a122ac22b822c322ce22da22e522f022fc23072313231e232923352340234c23572363236e237a23852391239c23a823b323bf23ca23d623e223ed23f924042410241c24272433243e244a24562461246d247924842490249c24a824b324bf24cb24d624e224ee24fa25062511251d252925352541254c255825642570257c25882594259f25ab25b725c325cf25db25e725f325ff260b26172623262f263b26472653265f266b26772683268f269b26a726b326bf26cc26d826e426f026fc270827142721272d273927452751275d276a27762782278e279b27a727b327bf27cc27d827e427f127fd280928162822282e283b284728532860286c287928852892289e28aa28b728c328d028dc28e928f52902290e291b292729342940294d295a29662973297f298c299829a529b229be29cb29d829e429f129fe2a0a2a172a242a302a3d2a4a2a572a632a702a7d2a8a2a972aa32ab02abd2aca2ad72ae32af02afd2b0a2b172b242b312b3d2b4a2b572b642b712b7e2b8b2b982ba52bb22bbf2bcc2bd92be62bf32c002c0d2c1a2c272c342c412c4e2c5b2c692c762c832c902c9d2caa2cb72cc52cd22cdf2cec2cf92d062d142d212d2e2d3b2d492d562d632d702d7e2d8b2d982da62db32dc02dce2ddb2de82df62e032e102e1e2e2b2e392e462e532e612e6e2e7c2e892e972ea42eb22ebf2ecd2eda2ee82ef52f032f102f1e2f2b2f392f472f542f622f6f2f7d2f8b2f982fa62fb42fc12fcf2fdd2fea2ff8300630143021302f303d304a3058306630743082308f309d30ab30b930c730d530e230f030fe310c311a31283136314431523160316d317b3189319731a531b331c131cf31dd31eb31f932073215322432323240324e325c326a32783286329432a232b132bf32cd32db32e932f83306331433223330333f334d335b336933783386339433a333b133bf33ce33dc33ea33f934073415342434323441344f345d346c347a3489349734a634b434c334d134e034ee34fd350b351a3528353735453554356335713580358e359d35ac35ba35c935d835e635f53604361236213630363e364d365c366b36793688369736a636b436c336d236e136f036ff370d371c372b373a37493758376737763785379337a237b137c037cf37de37ed37fc380b381a3829383838473856386538753884389338a238b138c038cf38de38ed38fd390c391b392a393939483958396739763985399539a439b339c239d239e139f03a003a0f3a1e3a2e3a3d3a4c3a5c3a6b3a7a3a8a3a993aa93ab83ac73ad73ae63af63b053b153b243b343b433b533b623b723b813b913ba03bb03bc03bcf3bdf3bee3bfe3c0e3c1d3c2d3c3c3c4c3c5c3c6b3c7b3c8b3c9b3caa3cba3cca3cd93ce93cf93d093d193d283d383d483d583d683d773d873d973da73db73dc73dd73de73df63e063e163e263e363e463e563e663e763e863e963ea63eb63ec63ed63ee63ef63f063f163f263f373f473f573f673f773f873f973fa83fb83fc83fd83fe83ff84009401940294039404a405a406a407a408b409b40ab40bc40cc40dc40ed40fd410d411e412e413f414f415f41704180419141a141b241c241d341e341f4420442154225423642464257426742784288429942aa42ba42cb42dc42ec42fd430e431e432f43404350436143724382439343a443b543c543d643e743f844094419442a443b444c445d446e447e448f44a044b144c244d344e444f54506451745284539454a455b456c457d458e459f45b045c145d245e345f446054616462746384649465b466c467d468e469f46b046c246d346e446f5470647184729473a474b475d476e477f479147a247b347c547d647e747f9480a481b482d483e4850486148724884489548a748b848ca48db48ed48fe4910492149334944495649674979498b499c49ae49bf49d149e349f44a064a184a294a3b4a4d4a5e4a704a824a934aa54ab74ac94ada4aec4afe4b104b224b334b454b574b694b7b4b8d4b9f4bb04bc24bd44be64bf84c0a4c1c4c2e4c404c524c644c764c884c9a4cac4cbe4cd04ce24cf44d064d184d2a4d3c4d4e4d604d734d854d974da94dbb4dcd4ddf4df24e044e164e284e3b4e4d4e5f4e714e844e964ea84eba4ecd4edf4ef14f044f164f284f3b4f4d4f5f4f724f844f974fa94fbc4fce4fe04ff350055018502a503d504f506250745087509950ac50bf50d150e450f65109511c512e5141515351665179518b519e51b151c451d651e951fc520e522152345247525a526c527f529252a552b852ca52dd52f0530353165329533c534f536153745387539a53ad53c053d353e653f9540c541f543254455458546b547e549254a554b854cb54de54f155045517552a553e555155645577558a559e55b155c455d755eb55fe561156245638564b565e56725685569856ac56bf56d256e656f9570d572057335747575a576e5781579557a857bc57cf57e357f6580a581d583158445858586b587f589358a658ba58cd58e158f55908591c593059435957596b597f599259a659ba59ce59e159f55a095a1d5a305a445a585a6c5a805a945aa75abb5acf5ae35af75b0b5b1f5b335b475b5b5b6f5b835b975bab5bbf5bd35be75bfb5c0f5c235c375c4b5c5f5c735c875c9b5caf5cc45cd85cec5d005d145d285d3d5d515d655d795d8d5da25db65dca5dde5df35e075e1b5e305e445e585e6d5e815e955eaa5ebe5ed35ee75efb5f105f245f395f4d5f625f765f8b5f9f5fb45fc85fdd5ff16006601a602f60436058606c6081609660aa60bf60d460e860fd61126126613b615061646179618e61a361b761cc61e161f6620a621f62346249625e62736287629c62b162c662db62f06305631a632f63446359636d6382639763ac63c163d663eb64016416642b64406455646a647f649464a964be64d364e964fe65136528653d65526568657d659265a765bd65d265e765fc66126627663c66526667667c669266a766bc66d266e766fd67126727673d67526768677d679367a867be67d367e967fe68146829683f6854686a687f689568ab68c068d668eb69016917692c69426958696e6983699969af69c469da69f06a066a1b6a316a476a5d6a736a886a9e6ab46aca6ae06af66b0c6b226b376b4d6b636b796b8f6ba56bbb6bd16be76bfd6c136c296c3f6c556c6b6c816c976cad6cc46cda6cf06d066d1c6d326d486d5e6d756d8b6da16db76dcd6de46dfa6e106e266e3d6e536e696e7f6e966eac6ec26ed96eef6f056f1c6f326f496f5f6f756f8c6fa26fb96fcf6fe66ffc7013702970407056706d7083709a70b070c770dd70f4710b71217138714e7165717c719271a971c071d671ed7204721b72317248725f7275728c72a372ba72d172e772fe7315732c7343735a73717387739e73b573cc73e373fa74117428743f7456746d7484749b74b274c974e074f7750e7525753c7553756a7581759975b075c775de75f5760c7624763b765276697680769876af76c676dd76f5770c7723773b775277697781779877af77c777de77f5780d7824783c7853786a7882789978b178c878e078f7790f7926793e7955796d7985799c79b479cb79e379fb7a127a2a7a427a597a717a897aa07ab87ad07ae77aff7b177b2f7b467b5e7b767b8e7ba67bbd7bd57bed7c057c1d7c357c4c7c647c7c7c947cac7cc47cdc7cf47d0c7d247d3c7d547d6c7d847d9c7db47dcc7de47dfc7e147e2c7e447e5d7e757e8d7ea57ebd7ed57eed7f067f1e7f367f4e7f667f7f7f977faf7fc77fe07ff880108029804180598072808a80a280bb80d380ec8104811c8135814d8166817e819781af81c881e081f98211822a8242825b8273828c82a482bd82d682ee830783208338835183698382839b83b483cc83e583fe8416842f84488461847a849284ab84c484dd84f6850e8527854085598572858b85a485bd85d685ef8608862186398652866b8684869e86b786d086e98702871b8734874d8766877f879887b187cb87e487fd8816882f88488862887b889488ad88c788e088f98912892c8945895e8978899189aa89c489dd89f68a108a298a438a5c8a758a8f8aa88ac28adb8af58b0e8b288b418b5b8b748b8e8ba88bc18bdb8bf48c0e8c278c418c5b8c748c8e8ca88cc18cdb8cf58d0e8d288d428d5c8d758d8f8da98dc38ddd8df68e108e2a8e448e5e8e788e918eab8ec58edf8ef98f138f2d8f478f618f7b8f958faf8fc98fe38ffd90179031904b9065907f909990b390cd90e79102911c91369150916a9184919f91b991d391ed92079222923c92569270928b92a592bf92da92f4930e93299343935d9378939293ad93c793e193fc94169431944b94669480949b94b594d094ea9505951f953a9555956f958a95a495bf95da95f4960f962a9644965f967a969496af96ca96e596ff971a97359750976a978597a097bb97d697f1980b98269841985c9877989298ad98c898e398fe99199934994f996a998599a099bb99d699f19a0c9a279a429a5d9a789a939aae9aca9ae59b009b1b9b369b519b6d9b889ba39bbe9bda9bf59c109c2b9c479c629c7d9c999cb49ccf9ceb9d069d219d3d9d589d749d8f9dab9dc69de19dfd9e189e349e4f9e6b9e869ea29ebd9ed99ef59f109f2c9f479f639f7f9f9a9fb69fd29feda009a025a040a05ca078a093a0afa0cba0e7a102a11ea13aa156a172a18da1a9a1c5a1e1a1fda219a235a251a26ca288a2a4a2c0a2dca2f8a314a330a34ca368a384a3a0a3bca3d8a3f4a411a42da449a465a481a49da4b9a4d5a4f2a50ea52aa546a562a57fa59ba5b7a5d3a5f0a60ca628a644a661a67da699a6b6a6d2a6eea70ba727a744a760a77ca799a7b5a7d2a7eea80ba827a844a860a87da899a8b6a8d2a8efa90ba928a945a961a97ea99aa9b7a9d4a9f0aa0daa2aaa46aa63aa80aa9daab9aad6aaf3ab10ab2cab49ab66ab83aba0abbcabd9abf6ac13ac30ac4dac6aac87aca4acc1acddacfaad17ad34ad51ad6ead8bada8adc5ade3ae00ae1dae3aae57ae74ae91aeaeaecbaee8af06af23af40af5daf7aaf98afb5afd2afefb00db02ab047b064b082b09fb0bcb0dab0f7b114b132b14fb16cb18ab1a7b1c5b1e2b200b21db23bb258b276b293b2b1b2ceb2ecb309b327b344b362b37fb39db3bbb3d8b3f6b414b431b44fb46db48ab4a8b4c6b4e3b501b51fb53db55ab578b596b5b4b5d2b5efb60db62bb649b667b685b6a3b6c1b6deb6fcb71ab738b756b774b792b7b0b7ceb7ecb80ab828b846b864b882b8a0b8bfb8ddb8fbb919b937b955b973b992b9b0b9ceb9ecba0aba29ba47ba65ba83baa2bac0badebafcbb1bbb39bb57bb76bb94bbb3bbd1bbefbc0ebc2cbc4bbc69bc87bca6bcc4bce3bd01bd20bd3ebd5dbd7bbd9abdb9bdd7bdf6be14be33be52be70be8fbeadbeccbeebbf0abf28bf47bf66bf84bfa3bfc2bfe1bfffc01ec03dc05cc07bc099c0b8c0d7c0f6c115c134c153c172c191c1afc1cec1edc20cc22bc24ac269c288c2a7c2c6c2e5c304c324c343c362c381c3a0c3bfc3dec3fdc41dc43cc45bc47ac499c4b8c4d8c4f7c516c535c555c574c593c5b3c5d2c5f1c611c630c64fc66fc68ec6adc6cdc6ecc70cc72bc74bc76ac78ac7a9c7c9c7e8c808c827c847c866c886c8a5c8c5c8e5c904c924c943c963c983c9a2c9c2c9e2ca01ca21ca41ca61ca80caa0cac0cae0cb00cb1fcb3fcb5fcb7fcb9fcbbfcbdecbfecc1ecc3ecc5ecc7ecc9eccbeccdeccfecd1ecd3ecd5ecd7ecd9ecdbecddecdfece1ece3ece5ece7ece9ecebfcedfceffcf1fcf3fcf5fcf80cfa0cfc0cfe0d001d021d041d061d082d0a2d0c2d0e3d103d123d144d164d184d1a5d1c5d1e6d206d227d247d267d288d2a8d2c9d2e9d30ad32ad34bd36cd38cd3add3cdd3eed40fd42fd450d470d491d4b2d4d2d4f3d514d535d555d576d597d5b8d5d8d5f9d61ad63bd65cd67cd69dd6bed6dfd700d721d742d763d783d7a4d7c5d7e6d807d828d849d86ad88bd8acd8cdd8eed90fd930d952d973d994d9b5d9d6d9f7da18da39da5bda7cda9ddabedadfdb01db22db43db64db86dba7dbc8dbeadc0bdc2cdc4edc6fdc90dcb2dcd3dcf5dd16dd37dd59dd7add9cddbddddfde00de22de43de65de86dea8dec9deebdf0ddf2edf50df71df93dfb5dfd6dff8e01ae03be05de07fe0a1e0c2e0e4e106e128e149e16be18de1afe1d1e1f2e214e236e258e27ae29ce2bee2e0e302e324e346e368e38ae3abe3cee3f0e412e434e456e478e49ae4bce4dee500e522e544e566e589e5abe5cde5efe611e634e656e678e69ae6bde6dfe701e723e746e768e78ae7ade7cfe7f1e814e836e859e87be89de8c0e8e2e905e927e94ae96ce98fe9b1e9d4e9f6ea19ea3bea5eea81eaa3eac6eae8eb0beb2eeb50eb73eb96ebb8ebdbebfeec20ec43ec66ec89ecabecceecf1ed14ed37ed5aed7ced9fedc2ede5ee08ee2bee4eee71ee94eeb6eed9eefcef1fef42ef65ef88efabefceeff1f015f038f05bf07ef0a1f0c4f0e7f10af12df151f174f197f1baf1ddf201f224f247f26af28ef2b1f2d4f2f8f31bf33ef362f385f3a8f3ccf3eff412f436f459f47df4a0f4c4f4e7f50bf52ef552f575f599f5bcf5e0f603f627f64af66ef692f6b5f6d9f6fdf720f744f768f78bf7aff7d3f7f6f81af83ef862f886f8a9f8cdf8f1f915f939f95cf980f9a4f9c8f9ecfa10fa34fa58fa7cfaa0fac4fae8fb0bfb2ffb54fb78fb9cfbc0fbe4fc08fc2cfc50fc74fc98fcbcfce0fd05fd29fd4dfd71fd95fdbafddefe02fe26fe4afe6ffe93feb7fedcff00ff24ff49ff6dff91ffb6ffdaffff303130300200010000009023000000000101020000002c2300000000010106000301030001000000060000001a010500010000008c2300001b010500010000009423000028010300010000000200000001020400010000009c2300000202040001000000621400000000000048000000010000004800000001000000ffd8ffe000104a46494600010100000100010000ffdb004300080606070605080707070909080a0c140d0c0b0b0c1912130f141d1a1f1e1d1a1c1c20242e2720222c231c1c2837292c30313434341f27393d38323c2e333432ffdb0043010909090c0b0c180d0d1832211c213232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232ffc000110800b4007403012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00f19ebda9c10fa50187181cfbd384ad46a74251eac4da476349c8e706a50d21ec00a7e38e4d2e6365493d8aeaacec140392702b56e2e8594096366a3716ccb328c3b1f41e80532c232f7684151b3e6e7be39ac9b9b967b87719e5b39ef9a49f33b04a2a9479afab3634fd485a162f6b04eacd92655cb0e9d0d51ba9e39efe59e14d91b12401dbe951dac72de49b06718eb5b30786e59d55605632631eb935329461bb1c6152aab4568668732c5e5a499909070fc9fcea7b5d42e16ddd400a73823ad75307c35d72dad1b5051100a7953cb1e39c0c572c60686768ce039e0803152a709e88d3d9d486af4285ca6c9d863033902a2c56cc96c6f805563f20c173dcd675c5a4b6f215386c775e6b58d44f4ea61530d522b9eda15f8a4229719141240ab396c30820f5a28279a29dc09d5093c74a99230bdb9a7aa8029e00c560e47a54e8a8eac4db9eb4ab1ee3819cd4d1c4d2101455d11a5b0191973d2b373b6c7752c339eaf44430db2c513b48d82ca40fad60b40ef72540e0679ae9e28834825b8195073b738acbd2879de27b2b694623b9ba489d7d033814e8c9ea639852845434b235bec915969f67f644779dd03c8db7b9ed5d4785b56961bc4b3bad3cacb2e366dea7f0ad0d5a3b6d33578925dab1c51085d31c8dbeb547469e0bdf195bcd0ec8e288e4066c678ae3a93534d3475c21ecece2fe475afe376b79e6d323d2de59147cce4b1c0fa0535e65e3e5920d5a29a38042b3c4ac5318c364ff00f5abd804d669ad279bfba2f1ee242e37e3dfbd79378fee5356f132da43e63345c4a4f083b803f0393f5a5866bda26ba232c4c3f76d2de4d7fc31896492adbf9687963b9980e9ec2ac9f2edd762aee90d3c602886dc7dd182dd850765b8c72d21fd6b693bbb9df0a7c914afb75ff2285c69d1b44d2bb6c90f6038ac89a1788e1d48cfaf7ae956318f3676e4741e950cf0fdb97691b631c83deb48566b7d8e1c4e023515e0acfb77f5ec7358e68ab13db3c53320f9803c11de8aeb4d33c2952945d9a2de3356aded5a439c7cb4fb6b5fe3938157376f1b22185ee6b86753a23e928617694fee1a76c7f24432d49b045f3bfcce6927b886c93e6701cfe758d3eb4db8985467fbcdcfe94e14a72d4baf8da345da4f5ecba1b3b0b9df21c28e7150e8bf63bff16c1364410c122ca5ba64a9078f4ae726d42ea6043ccc41ab7a21fdebe7be2b6545c22ddf53cbad8e8e2271828e97ebbb3d0b55b88afb56d425f34491cc4b820f20e6b5fc196f61123addd9c925c237c8c0907f1e083fa570c6de5c09232c0f622bbcf06df6a30052d6424c0c190be33fad7154f7568ceda7ef3b35e86ff88425ac4350bc95846aacc919c7cbd801effd4d791ed9af750babe94ed69dcb1c761e82bacf897ad3433d8dacc378605d914fdd0381fccd7276d7497e9881b6a0fbc3bd14a1251e7ee6d49d294d5393f7a3d098b003c98179eede949b23b71963b9cd38bac7fbb84658d2ac6908f3256cbd33b9a6fe5f722310993f7931c28e42fa534933fca9f2a773eb536d328dd29da839c530832f0bf247ebeb4ee250e8bafdeffe00ccc117c814b63b81452f9f0c5f2019c7a0a28b8ad15a5d0815e53ce563fe7595a9eac613e45a1031c338fe953eaba83450ec5382c30315cd312cd926ba2851bfbd23c8ccb1dc9fbaa4f5eaff004077676258924f7349da90fa515da8f9e6ee15a1a34aab7cb13f0252141f7ed59f5bbe0db08b51f1559413ff00ab0c646f7da33fd2a2a34a0db36a09bab14bb9e9fe1ed3639e0314f1e08e3918aeb2cb4f8ac5708bc76154e282285cba9c13d38eb5b564d13a2b6773f615f3d293933eb6a7b91d0f18f8a31cbff091216cff00c7ba91f9b66b88491a261223153df0715ebbf1234596eacffb431ba746dbb1467095e3cc590953f8835ed60e4a5492ec7cee61170adceba9bb63ac045db2a06f471d7f1ad9428544ccc1f3d31d2b870c41ad4d2750fb2dc012e4c4dc1f63eb456a174e513ab0399b4d53adaaefd8e9c2963ba5e17b2d46ccd365506d4ee7d6a40ad30dcfc27503d69accce7645c0ee6b88fa1dd7f576479822f938e28a70485061b693ef45569dc355a6871b7774f7570d2377e83d2a0eb4519e2bd54acac7c2ca4e4dca5bb03451453242bb1f86f626ebc47249ced860639f7240ff001ae3abd33e16c3e5daea37618292c918cfa0049fe62b97192e5a323b72e8736263f79df0dd14be6be1801c67b56fe9e0ac2b231c6fe067bd605c5e451c31bb445dc31217fbd5a76dad8d81248b6e0f19c605786bb9f495d4a4ac91af73631b4277e0ee1cf19af9afc67a7ff66f89aee055daa1c951ec79afa226d4b2a0e6bcbbe2868eb7b6e9abdba92f10db3fbae7835d983aaa356ddcf33174272a0dbe9a9e534f1914ca50715ed1e09d1e897ed7082d256e54657dc7a56b991bee4407d7b0ae2124789924462187422badb0be4bcb61e5ae24030cbe9ef5c15e959f32d8fa6cab1bed23ec66f55f8aec58f2e31f7fe66f53453844bfc47268ae7b9ecf2ff751c166acc1652dc44f2a83b10673eb4b6166f7d74225e07563e82bad4862b6844112678c62bbab56e4765b9f2780cbde2139cb48fea7138c1a3b559d42d9ad6f6488fae47d0d5735d09a6ae8f3a7070938cb74257aa78241b7f0d26d254b97949238ce703f957958e4e2bd77c3f6329d22da350548403683fceb871f24a9a47ab9441baae5d9176199cdbfda257666190a0761db3505c5e6f00871b87ccc73c0e6b624d2996306e0e78c0c1e33dab15ec26379810b18c7038eb5e645a67bb252b686b595d4d24283733af4ebd7dea6beb6492236ef992174646cf43907f5ace682f11331db9007f778c7b545797f789a74d2f92523814bef638e714946ef409b496a7915c5bac770608f7bcaaec8c31c70703155d95918ab0208ea0d4f0cacb7ab2b1cb070c4fe39aeb750d2e1d46304fc9201f2b8feb5eeceafb3694ba9f3785c0bc54272a6f55d0e2c9f940ab1657b2595c2ca9f461ea299716d2daccd1ca8410719ec6a035a34a48e34e746775a34771014b981260490e3239a2b8e8ef2e6240892baa8e801a2b95e19f467bd1cea9f2ae68bb9b1a044cb149228c339db9f415bc36c438f99cd52d3de3fb04296eb9f9793efdeadaed8864825ab96b49ca6db3d4c0d254e84527d3739cf10c4cb7692b7f1aff2ac8adef11b9616e18609dc71f9560d7a18777a68f98cce2a38a9a459d321fb46a76f1819cc8323dabd9f4c9b0002369cf4c5795f85936ea9e791c46a71f535e9fa5ce92c81b0335e7e60ef24bb1ea64d151837dce9cc80dab165edd7b0aad6772a1c6429fc2892502d8ab7231dcd66db4fbe6c28e9debcc4b43d8b2d51d57d8bed30f9aae00ebc561f8834f59bc3da886e710b63f019ad5b3f3c41b83707a8a82f2192e34fb98b049746503ea29c5da499ccd3b38dcf9c31b5813d4f35dddac9e65a42ff00de407f4ae2ef21682e0c72290c84a91e84575ba4b9934ab738fe1c7e55ede2d5e299e7646f96b4e0fb09aa5b8bab09536ee20165e71820570e7ad75faecf3ac296d6ea77cd9c85eb8ae7ae348d46d62f3a7b19e38ffbe50e3f3aac2be586accb3b6a75fdc5b2d594a8a28aec3c337343d496dd1ade5200639427d7deba2540bcb1dce6b0bfe10cd608dd0a452f19c249d7f3ad2d37ed115af95791bc7346db0871826bccaea12f7e0cfabcaabd68da8568dadb330fc47216d4150ff020e3d3359156f539bcfd46793fdac0fc38aaf12196458c75638aeea4b96091f3d8ca9ed711392eacecfc37a705d11ae48c348c48fa74ad5b19658a71f3719a9ac02a6929028c05502a90796198ed1debcb94b9e52b9ef5382a5085ba23ad4b8dd1ec662158773597a75c94b8902b33856f7e951dbb4d75b51c00adc03e9f5a698ffb3b506b52363c8c186dcf22b0504ae8eb95493b48ee2c2ede545192a0feb5b91dba7959cf26b97b18e386346f324676e72dce2b7e298b46081c76ae662ab16d6878efc51d1e3d3f5f8ae62c04bb52ec07f78707fa551d07e6d323c678623f5ad9f894971a96bd6f0a950b0c5ce7b127ff00ac28f09787ee098636ddb0bfca3a124d7aae6bead1e67a9c18552a58d94d2d2dfe46c68da0b4bfe932a8f309c4608e95d46a6d6ba3e8f209f0fb936943fc5ed5bb069d6b61a7cb757276c566a5df8fbdf4af26d77579b57bc799f2b167f769e83dfdeb823195495dec7a109fb693e5f99e7f7ba7dcade4be5c0761625427200f4a2ba7c515ea7b76704b28a6ddeece82ca77b578d59f746e3745201c30ad1be81757b57d88bf6c810ec3d37fa035ced9dd470a7d9a5dcd1b1c8239287d47f515b76d2bc5b1f20956c10bfc40579b38d9f323d38c654fdd3c8e6478e674954ac8188604720d5cd2630f7618f3b46457aaeafe0ed375c905d3ab24c472d136370f7ae535af0d0d0163bcb08e49914912a37240f5af4618da75172ecd9f3f3cb2ad193a8f58afeb62e58dcaaa6d2783534c416dcbfa564596b5a44f18599dade4ff0069723f315a10df69cc31f6f831eee0573ca0d3bd8f42156128d9497de6ae9f722103006eed9abb717b35f5c44240808e15b19ac84d474ab6019f5180f3c85604d589bc63e1db2da7ce92e5d578112d62e9c9bd22ce8f6d4e31f7a491d96976e665da4e460002b7b50b9d3bc3ba5fdaf539d21403e553cb39f451d49af1abef8afa960c7a4dbc568bfdf601dffc29fe17826d5a69fc59e27bd92582d3e6569db3bcfa28faf402a9612515cd53ee382a631569f2527a756745f634d53526d56f51a16b9702185ba851d3f1aea34ab5f2a747c007240f6f615930ea2d7166daf5f43fe9374c21d3ed17f80638fc8724d6b45762db54b6b0660c6284dc5dc9d8647ddfcab1a8a4d9df09a70b456a49e3ad645bf8722d3633879dbe63dca0ebfae2bcb58035a7ac6a526ada8c97527018e117b2af6159ad80302b58688efc3e1fd8d3e5eaf5645b051552e353b5b694c7249f30ea00ce28ae8509be843c4d04ece4bef21b1bf8a54ffa6bdc1eff004addb1d522b678a3bac6e76db1e7a723a7f85704ae55c329c30e4114ebfbe96e522590f2a49c8e2b69e1149e9b1e147377ec5a92f796de67ad586abe5485492c87853dc7d6b623912e1b6b2abab65791c835e49a578908658ef1b0dd04bd8ffbdfe35de2ea0d6900bd84196d980deca794fafb7bf4af3eb61a5095ac7a386c6c2b42f723d57c33a05e5f3ac4c2c2fd464e14156f7287820fa8ae13c47e0ed6741ff49ba84496b21cadc403f77fa7ddfa57a90b1b7d66c09913edd6a3e6320e24833dc11cfe23f1ac2d4a6d7fc20ad3c32a6b9a13af2651928a7f85ff00967a57461ab4d7bb7bf93fd19e7e3b0f49fbd6b79afd51e4d922909a9279049348e1150331608bd173d85455eba3c01c3a5771a4ea17de2c9f4ad18dbc515959282e90a902423a33fbd7150c6d2cab1a0cb31c0af64f05e836fa5db24ea5bed2e30ee091907b571e32ac69c2ef7e87a397509d5a9a7c2b72e473c37be299ae9e364d3b4a8cc50c6bd0b773f527f4c549aa836571abde1047da51228ce7b900b7e95d459e8f6bf63b842372ccc5db2077edc5709e3dba86c3558fcd9708620557b93c8e0579316ea4ac8fa0c3b8424f99d92dee6235626a9ac2400c56e4197a161d16a85feb92dc831c598a3fd4d63b3679af4e8e16def4ce3cc33a4ef0c3fdff00e423b9672c4924f5345368aeeb23e6eec9fbd063573922969471505208ad4492a220259980007735e99776973e13d5121b79fcf7280491ba8dbc8e47d2b9df87da70d4fc6ba746ca0c7139b87cfa20ddfcc0ae9b5a9c5ef896e241ca872057262a5b23d5cba1bb5e468d8d90cc775a734da7c872648e37dc84fa81dbbd68179a459e3631c4658de297cb5c09030c6483c67ad2e9ca16055ab8502ae58641ed8af225525cc7d0aa3051b34783eb5a349a4dec9164ba2b6035658eb5ecfaf78686a5133ae3cc00f18ea2bcb9348dee48932992381cd7b786c4aa90d773e631b81952a9ee2d193f876d435cf9eebc0e99af59d1e71b147b579e58c6b11450b803802bb6d264e10570e35f36a7ad9641538f29e816521307b62bc9be2d10dac591efe49fe75ea164fb61c7b5792fc529b7f88a08f8f92dc7eac6b1c0eb591966092a7238334c6f5a79a6374af78f9c184e09a290f5a29816a941e68a2b3291e95f08235fed0d6ae31fbc8ac0853e99619fe555edc97bf9198e49734515c18af89fa1ee65bb7ccec2c7fd529f615a129c28e074a28af1e5b9efcb74676b52bdb6877b2c6c43ac2e41fc0d795e9aa1f4891c8f99270a0fb1049fe54515e960bf872f53c9c7bfdfc17932e407041aeb74762421ef9a28a313b1a613e2476364ed8033c62bc83e21c8cfe30b80c7eea201f4da3fc68a2a32ff00e2fc8c736fe13f54727d8d358704d1457b67cd109eb45145303fffd9ffdb0043000302020302020303020303030304050805050404050a070806080c0b0d0d0c0b0c0c0e0f14110e0e130f0c0c1117111314151616160d10181a18151a14161615ffdb0043010303030504050a05050a150e0c0e1515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515ffc0001108011600b403011100021101031101ffc4001d000001040301010000000000000000000007030506080102040009ffc400441000010303020404030506040503050100010203040005110621071231411322516108147132428191a1152352b1c1d1166272e1173382f0f10924432634446392c2ffc4001c0100000701010000000000000000000000010203040506070008ffc400391100010401030303010605030403010000010002030411051221061331224151610714233271814291b1c1d115a1f02433e1f116346252ffda000c03010002110311003f00f9dc5291d0e694c27cbdc83d07d687081c3216c84849eb8a03944633256e1383cd838a06a70c6616ea5029ea49a3147c6169ce06f9c7bd765712b1e20cfad76576574dbedf22eb3e3c2b732b912a4b81a65948dd6b27000fc48a0246327c2e630c8ed8d3c9455b85eb4f70a34afecf876f333553ccf8afdd24381e69054b03c269ac728e50092b567cdd00eb51e0f7dfc8e02b0b18cd3187272e2a04edda65ca45b957b98f5cda53a81c86479832370de7ee8c67e99a57b4d67e44ccd87ccecb8e515f496b2e1adc5c84ccbd206d0ea1b5a1c599efb8d296adb212b2ac0dba63ea4d309db607e53c29da7251702d7379416d6488d13524a30b2221592db6a39f276c1c8daa5e177e10dcaa77f067f4785d6c2e734ec88b1277821b250964af1e6cf98004f4f7da9378691e13a87b99f4b96da92798c63e1879b11804f8a9505737d540edbefd76a4ebc6df74b5e971838f09ef47eb965125262b92800002cbaaca56938e607a6fcd4dec55c0ca774352046125abaf69d590df7e6b018971940243614b050700ef9c0df7a568b044709aea2f6cc3781ca8313d81c81dbd2a5643955a2395a2f2704abdb7a4c349f0bb04af0413dabb694182b3e19f44fe75db4aec2c14e0500f28168a464e73bd2fbc2e48152c1eb8fc6bb7a1c271f0b3ba3703a9a681c3384f9b0e46e0ba9888568e656c9f4ee69074c7384fa0a064e4ae910da2ac01f86683bee1e148374e841c795b880d8f2e1401ee4d15b61dee8eed2e22124602324056c0f6a53be52034b67cac2adc829c051cd777cfc203a530fbad4da92139e7ce3b1143df491d246782a5fc3cb3f24c9d70448f9730e329c6d40e14959f2a4e76c0c900fb134d6c4e71b54952d25b19ee67c2865f653934bdf301454d0c10a574df7ebeeaa750b03070a2afcddc773ec9673e4d6f38eda5c536943695b4877ed28fd924febfafa50ba324e4223037cb0a4e7ddd0da14a613caae524606e0d19b17ca096ded1b47929ba3adc7078925b3294bffe4527b50b871809935ae71dc52d224988e29d6105c75c565217bf29ea49fcf6fc68587230947485870d52cd1cdcbbc07cdc25811d9614e2d0eba70b0074e5c8cfd3ff0014c6c3fb6e014d5089d3b0f70a65b7427acf7652571c325ce575214028729f3023b7434f2491ae60013182b98a423d8a91c381143f7063e694db6b1c882fb58e66f209240dfa6761b9a66e7edf0a4fb0d76e0544ef56872cf3971de5b4480143c307183d3ad48c6f0f1e556ac56ed3882b8becf534a821bc652001c2c2883b0228ae77d510e526adbd6bb79c610251a1ce01510907d7b51576385e525090029609cf6cd02295cee2473ab97a676cd723029c84c25bf0f946fe9496cc1ca956db219b70b4539c9d41fa1a3e06309a1749e4b9652b21391b5000d6fe642c91f9ce4a5901f5e020ac8f6240a23dccf85210b667fbe174b11159c38b593d480aa4770f6525054763d6575909490024f4ec68bbb94ec438f0b5c648183bd71c142c7e0e0a952601b168097764bb1e67cd3e860368cf33684f305f36db1c947e60fad320ceecdb47b27d2e60a8643ee8472a5acbeb5a72504ec4fa54f88b80b3eb5292e242c30fa9e404100721c83bf4f4a296e1035ce2029de95d24bbb4742e4214011dc54659b5b780acf434d1280510a2e80171871d8534ca12d7949edcb9277fccd434ba811eeacf5f40de380a59a53e122f3abcbaf438eb520a88654b002547b1dc8d8ff4f7a6e75e23d2d4bfff00168d80be5214db5efc095cf8796c6ae10eeabbba9b67c671b4305086f237c0cef8cd14eb8ede03c26d4f43af61a70fe42ac93ad6c58de5340bac2d00254dbc9dc8eb9007639ce2a7e194ccddf950562b0aefc61395bdb45ad68b8bcd28348cada6c0dd67df39c7e268b282ef48478ded6fa9de128c69a4ea86fe6ae4971a0af30293b84e72120f7c669a3aeba03b42b3d1e9466a118926e3e1306a5d0ebb314ae24a1252b3b32a012b1fd0d3da7a8777f32af6bfd23f72f542fdc3e3dd45dc694dab95685b6bf450c54a023380a9334124670f690bdc87182951aee5103578838e871439452c3e568aeb5c9348124927949cd72e5da51c8b1bee76a02709e8680960d29e3ca9049fe5491952f147dc380bb5982840495f9d436ebb5212cb90a72b69ed67a9dcaeb50fdd848006290dea476378c05b7858dc1ed5dbca531959f057e833f5a51bc8ca0da7384a3105d90b0942493ed49c92b5bee96af4a498f0d4fbaaadd260e96b79016d877c449f0fa109c601f5ea3f214ce958cce4a7fd4ba5c956a444f839cfec8493bf7520b414709ea074f7ab4093d3b96573b4eec0444e1270b6e1c44bc2e3c28aa5b515490e2c100212ae84ef511a85d10341f9563d074b759908c70d53d43f174a5f645bd0c4995123ad4d2de8c39c1c75e53f787bd443a39266ee1e4ab6b268ea49b71908d9c12bee8fbb4c4a133e30924ffcb928295a71db07e9559d4aad88ce5c3015cb49d46acbc30f2ad9e959d06cc1a7173a33515670974a92919edbd44c20970ca36acc74ad380a53ac389fc3f7b4f221c9d53689d2dd6cb6b69b7d2b5729d8fd927029fcf0b80e152f4daf63ef47d381faaf9edf16fa72c7a46e961bb59a1b6634e5486d4b4f98f3a020a540f71850db7a9de9a7be6dd113e139eab636b8648f1c9559dfb926e4151e1b6b2f1702d9520e4efdb1f80fcaadee8bb4dcb951993fde4ec6792514dfbc26df0598b1d09320212929ea941c7fe6aac622e79256d326a42bd765760f561256eb1192e891735171677e43d6864b61addac090d3f479267f76c95a6a562d4ec65479319b7dfc61246c5bfc694a0f9f3bc9e113a920a12c7d9d9972854dd07716a37cc46497991d927cdf954d3751613871e566b6fa32db22efc6dc8f61eea38e2363b04e3b1a91690465541c30e2d770b9d69c907a62832907371ca4820ab71dfde85269dd8885e5052b648a6d34c0701582a53329cbbc2706e3a518080001e94cf7953d1576c630d0944b6ace40da80b894e0352edb3900a7073eb408c180a53c2ca48efe95c946c79380bb615b5e96ee129dbbe7b53796c0670a5e969724eec01c29231099b435e23c539fe2c54597be4770aed5e9c54999726bb94d72f1165b494911db6d4e63d0a47534f208842f0e0792ab7aed975faee601c0e50f2d9646665c9082b6ca8a4bbcaafbc94fdafc76356391f88d647156def19f2ac3705346df53a5f5d5d6d3ccc43305297d28c8c85ad1b023bf2e4fd3355cd4266485a3e1683a0d67441c7c6e5ab7c143a990d4b75d9322238397318f9dbdc744e40ed4d06abd9384f0f4d3acb7793e5736a6d1cde82b84376cc2545086d2cacba0a4b8e0dcafed1c67b81b0c52df7dfbdb4ef4c8e9474c7b76939cab6b76e134dbbf0722bba6d6edd26986cbce21d67c4c7313e2109390703a6475c555636832ee3e15a9fa913ff4f2e0678072a07c30f86fb9bb68e6ba5e62c49e5ec2985c06b0e358dc7294208567a1e6236e94fedea30c830c69fe6a361d3e6a926e91fb9bfa262f8bdd196fb0e88d3d6b7a595ae2bcfbacadf5ee3ca9e6d87ddc76f614a74ecc5b3b88f748f556db155b9f654eb40ad0f5c17f24d14c9c72f3f2e703d8f6abb5f7ed67278546e941bec1d8df50454b759db888e69242dc233923606ab32cd93e95b250d29b01ef49ce52772bbadc7171ed84ad78014b1dbe95d141fc4f485cd54bdc62afe52702c5e02bc596a0e3bd798ef8a525b191b6345a5a5161ef4fc95eb95e791b11adfe77738e6c6c93ed4586bff13ca1bfab92decd61ca629dc3f371696e8703530824653e551f7f7f7a908f536838556b3d0e6db3bbe1c8792e2ae1c971890909710482054ec677b438785965baceaf2ba27f90b9793618a3e533d81499b6b0303a544b9d9f2af4d6003012a0271ef5c5386b425f953d139c8a23ddf09400251a49384a46f441263ca710c5bf8c277b55917257ccb0beb9271b5379ad0678565d3345748773bc27d79d8f69639464b876091d4d31c774e55a669a0a11ed0394d898efdd9e0a749437fa0fa52c5cd8c7a54088e7d41d97f84ef749674ee8fbb46b7b6c87a4b05b2b280a591d0e0fa609fd29bd53dd9c67c029df5146da3a639b1f0e3c205c879cb5cd69d616b4bc84a48511d15dff000c935776c61edc2c06495d0c9b9be42fa75a3b4dc487c0cd312e2b4d4062fd61b6aa448fb214e38c655f5dd4a07daa8371a593b96bfa25a86d42cf9c217f0ff52db746c694cde5d6d2a616a40c2b249071b7bed51366192470d81586adb8a08b69721fea8bb2b891ac929650c456c28005e7873149232424919fa0cf7a94af09821712a0adcdf7cb2d03c057bec127f62e9385124bacad22dde10443752a7084839dbd7355d74848fa25a6aed7d8381820f93e17370a75169d9c27cd79e43ea0d2bc27163cc15e9bf43da8d0b9ac0729d6bb0d9904621e47baa71f1b7c47b387ded371e03f70d4f37c357cfaff00e5c4859c94206775b8b0398e364a71deacfd314890673f972aa1d6775f06caacf2478416e1e5885a6d1fb4a706a3875386db2304241ea7df6a7da85a32c9b1be1593a27476d2ae6dd8e09f013a3f25fbdb8a6a136511cedcc475a6bb1910dc7dd4d4d666bcf30c03d2bba3428d6568a95827972a5abb9a48cc65380a4e2a30e9ccf572535ceb83b72703101b5a5927750ea7fda8ed8bb4773942dbd45f71ddaae384eb6fb5c5b735cee94a9c3f69476c5252cae94e1a14a69fa7435185f21e5355caeae4e598d6af39ce0afd29c431ede5ea3aedf7d8798a984df70d0d1e6453f32e2932fee389e80e3bfb53a6ea25a435aa2ef747453c05d270ff00942f9501e8b21c65c07990483b5599b6581a3d3958a5cd3e682531bfc8f852729041c00303b545157b7340586dac9cef9a23cf081be575c78ca7d5ca94927da912f0df29dc15dd33b68529b5e9ef0d01c909076d85474b639e15fb4bd01ac6ef9175cab8221a3c38dca57d3a74a6e4179c94fecdf8e01db8c72b8e25b1c98ef8d3cab07d4ee69c17ec6e02695f4d7d977766f0bae5ce6e0361b6120ac6dca3a0a4991977253eb17a1ae36b16b6e82ab9cd42aeae969977ed28ff006f4a1de2b8e3ca671e9efd409ef9e0a16eacd2cb897d7e0b32512def10250a6c13cf9c60fa8c8356aad6bf083cac475dd1dd52ebaab1dbb07faabe9af6f978d3df0b3c26b1baa530e5be0a4be848c7304adc4004faf214d55ae4c2697215b345a0ea31c8e3e4140fd4f6872e5638771b318fcde194a92e646579d893db3cdd7da90a72359216bfdd4d5a87bd08919ff0a98f003818df17662444956e1746901c5db9f99f2efa1402c9290410b0397b1fbc9ce295b25cecb23f0a3d93c14dad9ac3493ffe7d95c5634f4fe0de976c5ce27ed0bb1753162448d210eca90a5ee02100e3a2892a51000492481d615d41cc39e023cdaf43a83f0d0e2d1f4f8f92846d5aa637aa6fd25117f63a5c9296dd8cd381485ba0fef1431f500e36cd4559c8270aef45dba305be31eea95f187518d7bc73bb5c2000e5b622d111a701c85a1a484923d94a0a23fd59ad0b4d67dd68363f9e56636f3a96b0646f86f0bb1982fde5692f8f0a2a3eca53b0c7b0a8f96610bbf55a657a526a079e1ad4ed2171ac90c72018fba91f69469a35ae79cfb29c7bebe9d1f1e53325a9b7c732e73258c6c3a7fe4d3acc718c0f2abfdab1a8c9b9dc3539a998f6a60ab012903076dc9a40974c7694f246c1418484ceeaa4dedd2d3414d31be69db0475c73e543192c6a2fc33809d22c08f6e671f6120654b3d49a44ca5fc2b055a70d169dc9a2549937559620e435be558a598d647ea7f950d76ccd75dda83c2e86f49432da7c6690e2f1ba9437a2bb5078384b37a660006f1ca81a527230a18ef8a97dc16703cf29c205b9c94e04a06526929e70c6e4293ab44cce000e14bedb636a2232fe42c1ce7b0a869ecb9dc2bf697a3475c091cb170b8a9e3e0c53d76c81b9a2c71ed1b8a52ddd73dfdb856d12d01925c90525637c1a033178c35295b4ad9f892795acbb8870f85172a59d8a87f4a710338cb9256f5100f6a15ab16c4c661526e2b4a100731538795207b93b51dce73f8672918a9c15877acb803f54cbaa75bc5b35b5620bc85cb713e4283b273dfebe95214b472efc49bd954ba9baee38633150e49f7f6fd944784b75546d7b12f5347ccaa239e32d2a39e627233f5dea5b5460ec76d8b32d0e77cd73ef1372739566f5671c86a2b5b305517c482d24a0379df94e3a7e46aa95a9481dc95a459bcc20903ca8e5aaf306e96487022bed25b69c5a57cc30af0d6a0723dc1cfe04d1ac45da25ce1944af704a04438f645ee13586ef65b93b0e04cb64c86e9e5578e82463b1041c6707bfad42cf69b272382ad14e9bebb36bc82df3e15add0da4dcb2cc8c6ecf5b0aca1c5b69864a949c8192a246401b6d4838103d4ab5a85e6b9ae6c0cc64fedfb2ad1f13dc546f4ec79161d3ceb9fb42e29505bac929f019248383fc47047e67d2874da9de93baef01595b218abf6dde4855774f69a69a41529b4a503a367aabea6a7acdb246139d0fa7d8dfc47ffcfd539cdbaa200f098014e630027eefd69b4706ff00515377f51656f44432571c0b53b35e326e44ac9dc24f5fcbb0a5dcfc0c051b574f96cbfbd2a709d7362d8c96f9473e3012938c52714064f514fafea6ca2cd918e536b56f9377752fce590d0190907ad2d248d8861be541c34a6bd20926f1f09d5f758b4b0094040c0c01d69902e98f2ac323a2a0cc84c65326f4e73b83c38e7a207714f9c5b0700a858db2ea3265fc35383d2635999e5e5015f75291babeb49126539526eb30e9ecc01ca6d2ab8cdfdfa545a0bdc201e82947067eaa247dee7fc4f951ab6d9d72dc077001cf4e94fa59835a7e554f4cd25f39f5053187199b7b43ec8206e4f53513bdf2bb6ad0ab55af4a2cbd22f4976e0e78518290df43e9466b034fad3292dc969db22f0bb22c14c7493caa715ec324fd05170f95e1ac09e76a3a0def4c71f551bd43ab62c25a90fc9481d3c36f73f8aba0fc33561a9a26399167badf5fb438b20e541ae1c499acaca6ca98f192063c6ff9abfc09d87e02a5dba6c0df6caa059eb0bae27b476fe9e7fe7e8a2170bcce9efa9f9d2df92e2ce54a716559fc0d2ec81acfca140dbd4a7b5cccf27f5395c9224bb29c52e42d4b51ee69770e3098990fba95f0e141139f182aca46df8d30b9ca9cd04fe23822cb51fc66ff00769df1bd423e4d855e58cdc30b924d9dc65e0b84a536e673ca3a514cad734e537921731c0b7ca3b705b8957db0371e133669929e6ce505b8be285f7c646e3f95572f40cddbd8ae3a65fdf0982769fd55b0ff001b5f756c07153adcdd850e37e1bca0007949f4c8ce075df39f6a879a725d84a57d26085c1c093ef83e17cf1e30715e33bc63d4c99717c7830a4184d1695e6690d79338e846428f5ef575d3f4777dc9a59e4f2a09fd69154bee8e7665ade172c4d52c5e9829d3ae78a957558ebf4c1dc5206a3a239955cab750b750662a784eb6db2a2261c93caa5e33bf63fde9b4b609f4b14de9fa536305f31c948dc2ec1b3e05b925c593cbcc37a3322fe27242e6a85bf830795bdbac0947ef6e04adc56f8eb834134e47a58bb4ed1773bb960e574dc6e0cc14f84c00e3a760949efefe948c7139eecbd3cd46f475c76e2f2b9e25a552d65fb9952943708ec29c493362e18147d7d39f60f7273fb2f5c6721857810d05c78f9404f41448985c373bd92f7276c4ded40394844b38e60fce2a71cee0d71949e005d5349c8ee4c72528e5e22c7596cba072ed8c522d0f09d3b518613db1ecb956b8f6c6c6c028f418dcd1c38c85357ba1a4de3cae56587eeaf7339cc8681d883467384672a2e3864bd265fe162fbaa6dba458c4c5f338524a5946ea57d7d29c57a0fb47e024f5aea0a7a1376e72ef842fd45c4bbade4a9b697f2710f465a38c8ff31ef56dab562aedc01cac435cea5b7a93f74aef4fb0f651275f75e57ef56a563a53f6b8b95541c782b5e6294e3cbb8cf4ae5c7948efdb15c816140eddeb901f0a59c3b2872e8eb4a3e7537948f5dc531ba30ddca774277e31faab05a02d099d2834fe491b0154ed4a52d190b54d2200f760a311e0d7cfb687a2b5b919013d6a04df763195633a4b4944fe1be8f99628e5b7bf769384a560ee6994b60bfca74d8840dc00a7baa657ec5d3cfa9195ba8694e1f7e5493fd2908da5cec24a325ce2f3e02f9077f9aec9bc489d254a5bb31d53ab593d54a39513f89ad9e9e1b1b5a3d82c135524d87487dce56b6bbb4cd3f344ab5487192765141dbe98e847b50cd5592b76b82434ed4ecd097bb59fb4ff00b221c3e283d7465b66ec94319c02eb1b057b91fdaa1e5d21917a9ab49abf6872cec10d9f48f91fdd4f2d10a3263a64447449439e60e0391f8557e72e0eda42d53458ab187bd1b83b3eeb332e4b71cf02de0b8e1eaa1da936c45a32e44bba8bde7b70794ac2b4a2282fc9256ef55151e940e90b9db47847afa6b20fc797cad5531c9ea5316ee703bbbfda94c35bf991ac5c92d1db5fc7ca558b6b70519cacaba9513bd3774a5e539ad523aedcb9345c27bb31663daf9d5d94a07a53b6338dce513a86a32ce7b559799d30df869f1fc55b9dd58cd09981f28f5f45dac1dce4acc6b33b29c2f4d5271fc3eb4d9d28670d46a7a3c929dd395cfaab52b3a5e0129e471f230db63d7de9dd0a8e9de0bbc265d51d435f4787634fa902ef5747aef70724ca70b8b51ea6ae11462368685e70bf7e4bb2ba694e495c1d5271b9f4a532a3f8582704e2956140bca3e518ea7ad1972d0ec7273d31b50e572c9e940bb194bdbae0fdaa7332a0aca1e695cc939ebed449981edc14e6acee85c1cc574b86d679174b0d8f51c14a5b625369754929394ff10fcf3f95665a9ce04ae8cfb2df742afde8a3b2df0e0ad5e8d31d71108504b871d4f6fcfe955b76558ad35cce5a54b1a8ec4650eb9dc8e40319fce880e1443e47bc2e1d4d665ccd3b72912c64ae33891b7aa4d2f13cb5c0a08a504f682f915aa2cce41932a3b980b8ce29393df15b052977c60858d6b54cc723b3ec999b21c8e1b23cc4548e555b773949b5296cafc2593802bbcf94ab6529facda9255af3f2721684a8f99bcf955f514c6cd68de391ca9ad335ab14dd98dd86fb845ad29ab2d53e125b4a90c4a4a72e36b3b9f749ef555bb4e569f1c2ddfa63aa34fb51f3c3c79cff0054e81b76ecbc905b8a3a64eeaa60088f8534f64d70e7c3577e19b7b2148094369f7a21cc854931d1528f0784d0ff00ccde9d01a25a8c0eea3d4d2ec0d8064f2a0a4926d45de8e1abb511dbb7b29c2528427ed28abad27ddee9c052ecad0d4682534bd7f714e2bc064a9bec7d695ed1516fd61fb8f69b90b377be7cb46739541b6d0398af3838f6a2c15bb8e1945d6ba85b5e37381f082ba9ef4e5d67bae12ae41f6504f4f4abcd5acd8a30179cf5ad51d72d3a4272147b90850df24f7a59edc0ca8473b71cadbec9c8eb40d6e502d0e0aa95030b97b1bec2b972f77f6a15cbc4f503ad72e4e3a6ecebd43a8ad76a65410b9d29a8c147ee95ac241fd691b12f6a373cfb04e69c1df99b17c9017d5781c3eb669db4c0b2da92d310a2349610cefba5207e676eb589c93ba595d23bdcaf4e522daf0b6260e0709f2242fd98d365250920f2a027ec8cd26e24a56497b870029e69e88cce868710eb2b40d804809df1e9f5cd1d8ccf9556b73b98e2005c5afa54a9105306d119a7038829528b9ca109e8761f9d28f6e31847d298d0e32bcaf9d3f167c31570fb56216d292e267305d3c873caadfaed5a074d5dee47b1c5543ac6b349ef467caad254a6482158567706adeb2e9060e165723c4c6400a1dc5763944070b0874823276efb5716e571395db0a7bd09f6dd65cf3a085255e86927c61c0b4a735eec9048d9187908fb60d650eef6266530a425f2007181d52bfeddc5512d5273252d3e17a5349ea8af6e8b6569f56391f5ff00caec6a13d73587a710db5f75b19dc7a9a4cb847e13c82196dbb7cbc05d722435063e56528c741eb4de2dc7ca9699f1d56e0269530fde15cef92d339cf2fad3a69633db9510e8a6ba72ff00ca9c9a86db4da5096d1803d28c2c63ca968eb089a18cc6109b891a8198eafd9909c0ea927f7ce8eebc741ec3f9fd2a7f4aa648def58775ceb3102295739c7e6fd7fc0439717cad807a95649a9c6e7dd667b8a4caf7181be68efe422add44a9bc9e5073da8ace1724c1f2918a5172f67077dab82e5ecf7ae5cb29030ac9c12302b97299f05e22e5f1634934ca79962e4cb98c67eca82bfa5466b4fdb52423e14ef4d45dcd4616ff00fa0be9d45bb010cbb38788be65241083b7b9ebbd63f80bd26e8769c05d5628ab96d3cfdd1c080a24b69e4e5c0c0f73823cd40065379e62c2034299e9965892ea1bf9a98b428052901490bd8f71f8528d613e140ea133b69c00a5f708690c169b4951e53ca804f37d68e41f750b5e6e72e41fe2df02ac9c41b329bbdf882436d1521e09dd0afea37fd29d54b4fa6fcb0a7efeddf676646ffbaf973c51d1ee68ad533ed72775c774a39b1f6bd0d6aba6d91660122c83a834d34ac160f0a1a00ce453f55f5b63c99f4340572590be6dc8181d85011ca1048f0a43a3f537f86af4d49523c48eac0791ea9f6f7ef4c2ed5eeb0fcab2f4d6b1fe9969939191e08ff9ee8f6abe45763b4ec377e650e2429be4048503bd525f0381daff0065e921aa452421f0fa8119493308bce78b7051e7ebc9db3472f0060246bd174a7bb64a5274f62135827997f75237348b06e3ca7b66ec75d9b5a33f44d6635c251f152e29b0adc241c629d1634f9513f74bf37ac7bfc2ae73652e5be5c70f989abbb5b85e5895e663b8a4b7c8eb4be102ca464ee284205e39ec7143e172c74a2ae5eea01c834385cbc76dfd3b5705cb2b27c4c8e87b515de119be51e7e0c34caefbc7284fa13ce8b6c37e61db3bf2f863f570555faa242da647ce15dba0e0126a1dcf8cafa013aced4825a7e3a3f798c15640e6ff00bcd663170dc2dcc4a31b972b6e22d92a33518952dc77fe5a41c146300904e7afa7e54a8457e5cc2f457d336d722e9d6253ea79e648f304a4e40fcb3ff9a502a75cb2d9252c1e54bb4fb51e7322416d6959529492bebe99a59a461425c2f69da3d923780da1b75011e3208c1c8cfbe7de8c48095a99c82be57fc7468f72c5c4f932437cac4d6d2fb653b838d8d5e7a5ac6f8767c283eb6877ed9be7fb70ab12462ade1673859eb42b92c004a011bf968ab96cb4f2f2006b90e4a24f0875288d3956898b3c8e82a8e55d95dd23ebd7f0aafeb54b7b77356b1f66dd402198d498f07c7ea89532e079cb5072e3e76ce721355a647b3f32d8ad5dc9edc5c95a45b606d45d96a2b7d5fc47a51bb991c7843069ddbfc49792945cc6da514a15b0f4144ca5fbb137855831b8dab455e3c593b2b3da84ae5b9201e848aee572d147276ae5cb07ae0d72e5ec8c7bfa5715cbc68172c820e3346032576700956f7e00acaf3727575fd80de5a6e3c30a3d7ceb2a57e884fe7543eb498811c5fa95aa7d9b566bbb929f1c0feeae4dbae80ca61bbc20349395252a57dbfa74faee6a86cf2b51b2cc3731a4157cb4698bf3d26408d21e75c4a5097169db2a3b6e76d95ff7d97d853399af963037614decdc45b5bf1c094fb28041fdca5407438c0e9b1eded5db80e0a839f4a7e72d2a45175536a404b094a12ac9e5e6e9b6d935cd760e531934d77b9e536ced422302979c2a3d88fba69392424f09fc14370e1574f8c1e18a789dc397a5dbd7e2deed3ffb865b4e0a9d6c8f3a07a9e87bf4c54df4f6a1f75b2038fa4a63af696eb754b31e39fe4be643cd969c50db20e2b58cf8c2c471e72b5ef474559e6d8039f4d8d170b92ae2c2d48e5fc6b972d9d71c61e438d294850390a49c10691730a3b6592376e61c11e308e3c3ad5316fd6c2dbc129b9309fdee4eee209fb5fdeaa1a954731fb80e17a1fa17a861d460d92f1237cfd7eaa432a4aa5385b8601ff367a5300d318f52b8cb69f23b644b645a1b524178e567ae287bcdf8453403b925560000e95a1af232ce72a1e940e38e572d54adf1da89dc08400b0951e619a335d95c42dca81edbfbd1f2816318dff4a05cbd40b96520a8647d6bb38f0840cf0af4fc19c76f4d7095e9e5c4976eb31d525a18cab0391381d49ca15b7bd663d592992dedff00f90b75e81aa22d3771f2e24a311d590e14d750b74cb981b438958504e719c800fb119aafc75dc3055bdd2b7c14cb6b9f0afb73fda1776d0eb25495acfcbe52a505280dc83b8f31cedf8d390df629bee04fd175c8d582dd0e40891e2a1c0bf0c2da3ca8525252028003249dfb814918b714ab64dad4f1a5b8a4253c98f35b6daf1402db60fd819c11d7fd3f86688f88b7ca49bb243c29249d4ac4853aa8679db03cea07600f53ec29b961478c06a66ff11b3f22d4b92501295a836e64942f0a05393bf28e9d7d7a1a1631c4f094948dbcaa07f143a0068be25487e132188177409eca12d9425055ba90323b1236ec08ad57a76f9b35f0ef2de1611d63a5369dcee3470fe508520f9b1561caa92d0d72e5b0290a077fa502e4b4bdd293dbd2b90a5ed3727ad92912622d4879a3cc08efea0fb1a6f2c3dc66d704fa8dd92acc2584e0ff00ce1581d357f8779b1b336216d048e571bcee85f707f9d52af44f8e5d87c2f4e685ac4372836c4679f07e72ba0dc5c5125b6d4b4f62334d8424f2a499a8078c8558c9db276ad14f0bc84bc93ccac8e9ef49176784239536b4e8079fb1cb9d35a70bc96cb8cb2938207751fed51cfbec6c9db575a5d1f3cd49f69e3db80a1aeb650e14a872a927152cd660673e552f181b4fb2d41f2d0a2acb8397a6f5cb96b40b965009524e48dfa0ae270328cd19385f40b81d1dfb6e8bd250d2c3084c6824bab59e53cca25446fdfbfe3593eb4fee5a7bd7a2fa7a3ed50859e30d0b77e2c59dacca829e1059e6597420e5c52b7520819cefdf73b1a458f023faa74f88ba5f29fb54dc64351971d8f1a2445bcd29a4b49d9b424ec491b14f995e5c6dbd271b7e51e57e0a8dcbd4499298916dea7cf3a57ca95ee1039b64e7b92339a55b164e53774b9f4a434ccc65b98b62dce224488c39c29033b677fd7193938fc686781fb739435251bc8089968665fccb4ab7bad969c2ca9f09e89077c01d3718cd4690a40c791c2916a58e9910d7fb1e334b8cde5e71a23252ac104109fba5491f975a20f3c26c377872ac5f18d09a93a074f4e75cf987a2ce0da56e8c2f95685152481fe906ae3d2521133a354afb41acc7548e4f705550b8c95eb0d44e3b6db7c582ecc70044389cc1095600c0e624ef82773b926afef7860c959054af259944518e4ae0b8db255a64962e2c3f19d1f75d414ff3a2b266c832c394b5ba335576c95841faae639d81a5064a6648f65bb8b50510935c8568925276df2314250613f692d4ef69db836a0b518cb203cde76527e9eb4cadd66c8c3c72ac9d37ae49a6590e07d07190ac2c55b4a8cd29950536b4852559c641dc1aa786904823c2f4c31cc9d8d960c6d232aac119c67afa0abe633c2f22004f014ff871a0977b73e7e6a0fc9b4416d27ff915fd8557b55d41b07e1b4f2b46e8ae91935022d483d03c7d5188a18b746e478108208207556d5536bdef7ee0b7a2c86ac3db7f8c6157ed716855aaf8e25295065c01c6c9ee9e9fd2afda7d813443e42f3175469c69dc78c7a4f213023ed6c323de9fe156d6ea38dc0143e172d09db268ab975daa2fcedc22b271871e420ef81b9149ce76b094ea9b37ccd6fd42bf1a663babb733fb29c79b64b6968139dc7da18dfaed592dc937cce2e5e93a30e6218f18522b3479aea5318b52d48083cd254474c60e3d49c9df3e94cdd20ce5396c249c2525e8c52a0fcebce3ef3c072065440241202b650a16ce73c2e75407f321edf985c6b9350e325e5f81e5f101181d7f0db9b1f41dea5211b9aa12cb764a00522b4330ed4ca396187a5a9242d29384f2f5df6dfdbf4a673b893b72a52bc0d6004255ed4ec477594b121d88d1793e2280cab977d812320efd70718a4995dc520fb1b4e1487fe2140b7db5e8b21c043ac27952da39540fb9f7f7eb468eabb72136daaaff00c586b07a73565b21512da39e62b277c901091f924fe7576e98a78dd39f759975e6a45db2b8f1e5012c32fe4aeb124e027c2750e730f620d5aac337c4e0a87a44c20b91ca7d88564af9a7e0ea2b63912e0d25d42d3e55a479927ae41acfe1b52579720f0bd53a9e915f57a86399a092383ee101b58f0f676905971f1e34151c37253d09f457a1aba52d4596464795e77ea2e91b1a3bf3272cf9ff002a2bb636cf377cd490f954e2b55791c183b03de810ad415059228495c0e3c290c5d797a8519b6189ef21a6d212948c6c3d3a5307e9f1b8e5582b7546a15e3113243809b6c36c72f3768911904ade7528c8ec09dcfe5934b5c93b71970f6098e8f48dcb51d71fc442b205c8d6a8e88d0d094f869086db1d00fa567d234cee2e72f5436582842218478e384947b73b355e34c24e7700ff00df4a297f6dbb5a890d292cc82490a84f1b21342d36d71b480e36ea91b75c119fe953dd3d212f734acdbed56a44d82274639048fe7ffa41e4e01c0ef56e0b12208f2bcbc01d4e7d3140515687a7ad7211e54e782fa67fc53af21c759c34c053ebc8c8c27fdf1511ad5930562e69e4ab474950fbddf682381cff00257f3465b598f059616cb22204e0290e9ce3dc1fcab24b32b8bc95e87a91ec8f6b5156cd12188ada1b8cda518c003072714cccbf29b580e0729af525997e273a0a531d4df206129c7303d77fa0a523942181fbb85143c2db5dd66ad6584a96b38f2ac9f73b9f7a742fb9bc02865ad16773c29135c21890e3214e2908e5c7314ee7dc7af7a4dd3b9c72906dc8c71b570dc38776578a1a5b680ef8613cc76233d0e00142db4e6f8294ed31fec992370aed16d7dc79e6c4c7d5f650772a037f5a37fa8484100a4fee2c041c2a55f15ce2ff00e2adc5a90cf82db09434da07a01b11fad69bd31ffd50b16ebb24dd2106e2ee707deaca4e01c2a3b5b9e7e15a0d3aea65d86d8fa794a9c8ad1c93be79467f956677062572f60e81289a8c327b968fe896bb5b58bbdbde857169a7a3ba395492700ffbd756b0607771a52da8e9f15e81d5a6190504f5cf0b91a5e009b6d94ecd429de42cf85e642704e720ef8c75c55bb4fd5c5938770b03eaee83ff004987bf0bf702718c78ff00d21ea80293eb9a9cf2b34f75a01b753f4a140b728036237a101729a70ba12ff6b3d2d2325a6ca10aee14af4f7c03f9d42eb33fa3015ffa0aa6eb4e971f978463b6dbc021d9652b51f53fcea9f24becd5bc51a1db21f37395d92ae48641446095a86db6fcbfef4ddad2e4fa6bed1e88fca89710ac6b9ba565bee905d6949700cef8e9fd6a5f48b2193868546eb6d25d3e9ee99dfc3ca05630ac55e5a72bcecfe385ec51f088b5510361bd15dc0423928d9f0d101f6ee974b9476f3cada5849f73e63fc8554ba965dcc6b568dd03096c8f97f656db4acf4259ff00de2db0b207940213f9e3fef359ecf1e395b553932308a1619eb29695918d941233d2983c04bd8634b795ddaa6738b809f9943681b8040c1c63b0a36d1ec98558dad7fa7951bb3ddc216d252e02bc150563bf5febfa518009f3a1dede51134f4e62e2b6d879efde2b61bff5a1505722742dde070148aeba2a3a6378cef84e63f8b7228a400a26beae4bf628f46b536e49743411b271cde94461195312da21a0af9f3f1d167444e33462ca472bd6f438a09e85416a1fd2b4ee917134ce7e564fd7b0975a63c7bb55705252d3cea08e9919156d61395402c23002b0dc36925fd176e2ef29f0829ac9193b28d50758662c1c2f51740d8ef693167db8525f10631b01eb8a8d238572da3cae3b8477e644911e2a8214f36b6c2b97d411bfe74eabfe1bc151daa324b359f133dc10aadcd88b8125f8ce94a9c696a6d45272323635a3c3c85e43b7108a4733e0e173a7b7d28dee99a53af5a3e1723b70d74fb364d30c4893ca24c91e32893d011e51f963f3aa16b161d2cc631e02f4a7d9f685150d345898f2fe7fc27c933552965b88ac0eea1b1351ad6f6db95629ecbec3bb711e177c18288b851752a5e3bf6a45f26e5235a8c700c93cae2d4935b76cf3996949592cacab6db0124d3aa60895b9519afccd9a8cd08f82ab591856dd7ad692179331e5607b50a0580397f3a29e108e55adf8778f1ac5a2a2a9e090eca5979471d41d87e959f752c85f3e07b2dbfa2a36d6a437719e51df4ea5976685a5d1d72a4ee3f5aa7ccd385a0569038f089d655a9975b0d9073b8e618c6c298169252f670e6e0a4756bec5c1b714f4b2dad073cab008d8f6ff00b14e5a3d93585bb5aa26d49603cdb2dbc59e641dc1e9be063f33425847b272d7654cad376752fa447514a8e094a4511273363737d414f236a87d5083127213d89f5fa511cf3855e934e6093b8d4d8c4d716f10da95ccac9c81da9bc79053d962018095483e39a186f5dd924e0f32e094927d967fbd693d14fcc6f1f559f75cb06f888f85549f642e63c47427ad5ef1caca65e5dc7ca38706e5217a44b7cf9534fa811f500ff7aa5eb8dc4d92bd0df65b683b4c7349e41ff0a705695f373ac84f615065a49e02d2f7b48c82a23c46d6ff00e12b536dc02bf9f94086947a200d8a8fbfa549699a78b3265de02a3f5cf55bb46aa190fe77ff004ffc2af2eb85d2a2add449513ea6afe01c701797dcfc9dc56ad729c85e463d281a795dfa2c949c9e50a23b528b916785d364dfed86de5cf2c339049ce104edf91cd537598595dddc1eeb6ffb3cbd3ea30ba9b8fe4fe87fc223a203505a242864632a3b5568c9bce42d8a2a3157664f948296e4f253149e50775628cd681c94c6463e73b63f09ab59348b368cbab88510bf00a013d54547947f3a7ba7b5d2d8681eca23aae2669fa4cd2679231fcd57ae6c9dc6feb5a1b4e57951dee563b1db7a3a05d56f86ab94d8f119412ebee06d38dfad379660c6171f64bd584cb28637cab496049b3c28f186128692120fe02a8d6bf1dc5cb6da6c10c6d8cfb0449d1da91843884bcee5408cfd2a0edd53b72159e84ed1ee8bd6dd450df4a50e2f0bc04e55b8fad57ded734a9e31ee195cdabef09856752d5212a463a046393fdbaf5a5a06b9eec24266f6da5c5422c9788d7099e209284a538c14e318ec69f4d1168e53582c35c7ca2ee94e492e25d4ac2909f31527607ea6a3cb52f68fa0a223a622e2e12a4f883d7d688f55b025dc9b61c34079c52b9fcdb7953456b53e96576c0157ef8c7e122b5368155f2d8871d9b6725e5a42775327ed76edd7f03563e97ba6bd831bbc3bc7eaa03a86ab6ed6dd8e5abe775cd01b9abf08f95407e15abc6e27cac52d86b5e5a115b818b6c5baecdbc55e571b207e0afec2aabd46d3bd8e5b47d91383993c6ef905140a5be50466aba4b9a56c4c8da060280ea8e1f5c3881ac23c7860fcab2ca53e5f7249cfa7fb54ed2bf1d680b9de5637d6fa1cbaa6a422cfa401ff00944bd3ff00057a76f7112dc9badd22cceeb69485a47e053ff78a8a9face661f4b721356fd9bd4ed65cf39fd90e38fbf0877be0bdb9179b7dc5abf58d4ae55bc86bc37183db9d392307d41a9ed2ba9a3b8eedbc61ca8dad747c945a6588ee6fbfca01f29efb1f4cd591d3341c154d3c27fd0fa817a6eff1a6827c00ae57d23ef20f5feff8532d4ea7de21dbeeacdd2bafbb46bf1d869f48e0fe88e768b837ab9a1260bed3911271e53dfd08ed549b109a870472bd23a76a8dd6877a2765a9e9411113c88033d0241dc9a64e3bb956464cd846d0a01c667dd634b32dbc7954f4948e4cf64a547f9e2a77418f74dbbe165df6a57246e9ad693f98a08fdeabbb483c85e787f2bc7707b50a2a2470134dfeddd79196ea096e1a54f1f73d07f3fd2a075f9bb35ce3dd5bfa32877efe5de02b11ab2ce98e4840c1f5aa7d49f72d4f528369f4a62b536fc79290c14247de2a34eac39a5a9a552f6bbca2f586e2a5dbd0db69656797ef64104557268c1255caad83b4029f1d92c4c83216e720416c9e65ab718dc8524f6fc29360daf1b52b2ca1cc21c85ba72e4c469ee3119ce6905c56021b2a18a98b10ee6ee556af6b126118f4aea5710a4a0b6fac96c606700677fb3e99a82959b4ab0366dfc144fb2bcb7948549ddc3d52a38dfbed4cdeec944b01a065a1106d5019f9519c1511b9a32ac5b9de5dc246fb6662e115d61e4a54d2d252a42b70a4e370685a5cdf534a1af3383b2be42f1e342b7c3de2e6a5b0c6ff00eda2c9cb1cc72436b01681ff00f2a15b1e8764d9a8c90f93e5643d4751b56e39adf0538705141722f0d018cb6da87d4123fad47f518f4b4ad17ec9a72249da3e07f745e8b11e98a4c686d7892167ca319091ea7d055624200dcb62b57dd047b19f98a35e80e1b376cd3412569129f70a94f632a51e877efbe6ab96edb9cfe3d940d761397bf97128e5a4b483162b38765048511ce949ea37ea698c8777851b6aeb9eeed31017e2935ea1fb1ced3162545f989a92cbab5a4292da31ba80fc00fc7daa7b41aa3bfdf7a42ec124b51d5d98c90be775db4e5c2d939d6264778b80e7992924287a823b569ce999273b961f2e8d6ab3cc6584ae1528a55cc06c4f5a94ed9230a07dd4a342eae7f4b5dd2ea547e55efddbe81b829f5fa8eb511aa5012b09f856be94d7dfa5db0f6bbd2ee0fc615808a94fdb5292e150079bd41aa1c8369dabd475a2648d12939f742be39dc8393adb010e67c26cbcb03b156c3f407f3ab5f4dc45ac3211e5623f6b57f7d98ab83c004ff342a3b1356468c058fa5149f2e1209f7a37b20f7563fe196c8dc0b739717c27c494e6d9fe01d2a8fd5139710c0b5ee85a8191770f928a5acd21cc16f3cbbe2a0298c70ae9a947eea1d0ae8d477f0fa72527a63a54ac916e18508c7861cb94e2d9ac61b31897dc524293ca94a519e5f73513354767d2a621d463c6015d52de7eeea4a21baf212f020bc161194e3a1c8ce4d1236363f53928e99d2f0d4c1a4a10b5dcee0b1203ab6c65b473e0956ffae3d6a4279039a0851352b6d79dc511b4eccbb4f5475d9a1c72f2dc1975c700dbb820efd7bd415a0015395bb8e05d8458b23332daf0335497243a51ca96b3ca81b64e4fb8a8f29ec8ddcd449873c21be5e6e65600c8ed5dc2829abe5d92bd36ec88ec1539cdd3b74ae1cf8458ab173800be517c4fea01a978e7ab65a15e412830939ebe1a128fff00cd6b5d3b176e8c63e8b21eaf783a8bd9f0b8783ce48b64bb848758794879a4a1a563009e6145d6631333cf8564fb3fb6fd3e595ee6f90adef093484a9a85bd2594a5d580a4a9093cce2c8db3f4cd673a8d82d3b42d62b39f2466c4aacd47e1fbed4fb6c6652bf958e86d95bcd272107ef1fae6a29b1ee3950ced718d85ef3f98e480a0ff00119c4963866db9a7e33e5cbaf29e56d18e700f42afe11834fa9d1748ecfb2534268b6cfbcfcaa6177b8c9b9497a44d74b8f38ae652943bfd2ad10b033030a70c2633c26a524ace481f9538c7d524630ee5c32a7f6ee15e85d49110a7ac3158c8c12d24857e86a1e6d56dc47d2e2aab1e81a5ce3fed85aea4f83ad3baa2125de1cca9b6cb92863e59f5f88d38707b9f30edde9dd1ead99a76d86f0a3753fb3bab237b951c47eaa31fb1ae3a59a6ac97161f62643692d3be2f5e6c0df3dc7a1a4a42d95e6669e0ad374c12434e3aede4b40e50138972c48d673c1257e114b20e7f84007f5cd5f74966caed5e78ebab5f78d56439f1c7f2518e4db2761ef523954e4bc288b932da61b249714123f3a4249080709c578bb92062b49c3808b6c7663a3ca1000091d2a8da992f71715b4e8588181adf653dbaa7e6d9e5567a76a8389e58ee159ac7e237950b97683e3a92323d7d6a5e398919505341ec53858ededb4f3617977b04e36a42c3894b5485b9c22ae83d3ad7cfbbe3b0e3f15652de5f58053bfd7a74a84b521240563a9580048f098f8c5a06f9a66e316669a8d6c30252561c483ccb4ab0324efcb8236dbd0d48529e27336caa16f3242edd0852de1995c211db77c1656b473289071d37031b1fad465b00b890a5ea38867288b1a64d42fc75bed29b24a027ae15cdb1c8c6ddbde9a1013a38535b0b0ebcc2567056add4403bd205aa32d48d070b1a9a33912d12e4bc3ca842949fca948061e3f548c1334bf85f37d5a6e1dff535c67222a244d9135c254acab72a3ebb75ad37ef06085acce301518518adcee98b7249462d0dc2345b92ab86a62d21b6760c7281cdfec37deab37f57dfe969574a1a2b58373d5bbe10e918d6fd3ce4894ca1b993006a2b69ff00f1db38dc7f995d7e98aae399939772530d5eebdd2358ce18de4fd517ee170ff869c33d4974ba341c910a3b92195ac7956a4a3ca09f75629f5684631eea9af3fea57e28e1f04e0ff3ff000be5eea1bc4fd53789b76d4125d997196b2e3afb877513fc87a0ed5350b88185bad7a51d68c32218013048694b70a86fea08a70d72248d07cae5f042b7c7eb4ae5372c0a6acc77b485ca302faa5419090e4794d2b2dbada864107e98fcea3a7883d843bc8544a4f740ec1e41f05126d17f54761b9109d5971a00a4f363f3aaf7ddc87615a2399a5b829cb58e9f678a36576e56d681bc424f9528232fe324b7ee4f6f738ef4ad625b206b8f054ac17440c2e1f0be755e5d7d5789aa9edb8d4953cb2e2163052a24e41cd6c9503044d0d3ecbcb7acbdefb523dfe4927fdd7039f6bcd8cd39e14672a55a0e278f754bea030d8ca7f9530bcedace14d688c0e9f2423969f981a5a0a4e0d54ac0dde56a354edf0a7d0aec24b6465055d8677a847c25a72a7e39f70e537dccf32f9c2492076229dc5e12121c9c2c59a4a23be852c14e3d4e49fa5166191c23c0e0d28896cd4d221b2dfca2d2e2d1f64956e91f4c64d45c95c38e5c54cc560b47a42d2f7ac6f534a1b9be30f115c9e2288dd5ee3b7fd8a521ab160e5212cd20c0030148f4adba430087a5a1e7160f212d901b0474ce3707a669a4c5a3809789aeca2ee98b1a8c388dbe82b5900a94475c74dbf2a8f24e516c580c08b7a734b84b0de5b50481be76a59ad24f0a93a96abea382809f147c6ab45816ef0fb493cd5cf564a6f964a639e66ede83b12e60fdac744f5c91d2a5ab6987fef4830d1cfee8ba55a7ceedb17e63c0ff00250b747f08ad1a62dd0a25c82932df6f9d45e5f3104e4957ba8e7a76cfb512eea4f9cf1c00aed474786b376f93fdd12acf6a52aeb2257840ad49f221432528e89cfba89cfe750ef0e778524f2d680118b45301a6d854b792b532e052b1be158df1f851a3041c154dd61ed76437dd41be3538a8b77435a74bc652993364979e19dd6ca06c0fb15907fe9a9881b8e50f42682d8edc969fec31fb954a9ce871823d7d2a4220b53206395caeb6372903ea4ed4b0e0a6a5a1229692918291f852883b613d680bc34e5a8e9ad548659b02d798ab4a7cd01c3f7d3fe5ce323f1a42e1c9c8f2abedd204b1600007b2924669fd3b715dbae3e1a424029752aca1c41008503dc1cd45c91ee19518ccc2e31b94cb4c5e11649d1e323c22dbeefee893f78d3199bbda485335a41110d3eea03f105f0d9fe3e5397fd19f26c5f79478f18282112bb673d97efb038ed539a07533aa1ecd8196fcfc2a77577450bf9b15787fc7caaca780daedb7cb6fe9bb833ca4a799d0129fcf35751afd5f67acb47456a81dea8b096b3e9f9fa1f52310755326deec84e10567639e873f5a55d6196623230e709c53a1269d6847606dca305af4c3b2805b0acf36e30363f4aaac96b2790b43ad5011e9394e66db2adc4050dba731dff4a4cccd7709cf6e469cb938476c3e909584a491e9ef49bced094c6e4b4684a4bc9494240e6f29f518a6ee7e51c46478529b2421cebd9e0f728070ac100d3599fb4297acdcf952b4e85179663b16e8cf28020ad485e4124f723a63eb4cbef38e13c96061c1251134f6928f123a1cbba11144757302bf39ea37c0db1d4d363990f08b34ad8db860ca4aff00f165c24e13788c4dbc3b799ece1463421e2ad6a27246764a761f788eb5254fa7ed5a3903015075ad5d9182259434fc0e4aadbc66ff00d45f5f7153ff00a7784f015a36d920f8485455f8935f04e31e26006fe88191fc5575a5d3b05566eb3e42cf5d7e4b128657e49f73fe1183e1d3833a57839c33baeb8e2f4a65325a6cca96f3ca2a5adc2321033f68e4e00ee4d566edd7ea13f6e2fca3c2d1e3ae746818c8ff00ee3b971f8ca7bd01a76e5c4796f6babfc676db6b6f9e44686b57fc96f24a42bdc0dff1a8db0030f6a3f6feaad705d0d6304c7d47c7e9f553dd0d7162fad5ceeb1f945aa320b8b79431e210084ee7b0a62c8de1e414a6a32b5a58d07d4eff00854a349ea3b5b7a01ed4126618d688695bae2b239dc3b6d9f527207e15d1309507a8d794db6c118cb9de3e81536e276bd9bc46d5526f37105b0b3e1c78fd432c8fb28fea4fa9352f0785a5d1d223d3abb6361c9f25438a4852828e7f0a900e184e5cd2b9dff213819a11cf8496de70525e21ec0fe09a1dab890d382b85eb98607232429c270397b5136646ef64dac5e633d11f9530d317a7e6dad36bbd2d2ea9bde03ce0f33649dda27af2aba8f450f4269b4c1b8c851eed34d81dd3e54d4ad998a8d09ae669696f9d4e2864b4e83ebef8c544ed2d041f74cdcd68f4fc229699bbc7936882e4ecfcdbad72aca80c15254413f98cd44bc61c429287739a1c9ce758b295ca87e19563ef27215ef40d95c0709413e7d2f0815c7ce0dbdc43b4c76e19762de60654ca94d12dad2aea9240dba0deac9a0eb0ea6f224e5a5543abba6e2d5210603878ff0098553d17bd67c25bd2a04ef9a82eb673f2b31054dac7f1273d47b835a2186a5f602d1fc963a2fea5a34bdb7920fd54f207c4bdd9cb772df74e4594c9252990c05b673ec4822a21fd2f16ecb1c410a7a1ebe9b6ec962041f70bae07c48d91a4e25d96e0920edc8a41fed447f4e4a470f4fa2eb9acde1f1909ea37c4fe968ad151b25c5c5e3ca141bebf9d36774c4cfe37a76debfa6dfcac2526efc5c45833db9364b0bad2523f78d92d8e73f5c74077f5a18fa51c410f7e4a465fb4488383a38d37ea6f8d8d4d706db6f4edba15ad208512e90f10a1fc3b0c0fae69cd7e91887e72a3ae7da4cf2710c607d4a14eb0e35eb3d7721d7352ea1b8484ba908532d39e136523eef2a7031ed561a9a456afe180aa8dcea4d42dfa5f2707e3850a2a2a3f688c9a7ee000e141bb2e3c956efe08f826dccbc275aeae421ab6456d4eb41e18096c757493d07bfa03547ea6d50b9c2b45fbad3fa3f4715abffa948393f973fd54af51f11cfc5271a22da74bb2f33c3ab0bb9623a138f9d7520e1d50fc3649e837c64d213d41a6d6dc3f3bbc7d148e98e7eb16f9398d8724fc9ff08c9c6dd60b765e9ce0ce8598a8caf0933f504847955e09dda6091d0ab6511fc2075e6a898d8d86b3a770e7c0ff0029f42e7dfd44bb3e3fd804afc41ea4ff000570cb4e70ff004dc87a3cb9ed87ee1c9b2ca39821b4138e8485123be290a87d25cef7563a1a78d4269eec9f95986b7fbff55c1c77bb8d31c3dd31a3ed6a4a5b773324841d9494ec807db9b98fe148d71eaca9ee9ea7dcb725a77f08da3f555f1c4e57cd9ef9000a7a55be5f1c245c5e41c050dbd2b804815c32df6e2477244a5f86da073296ae8053d82273f86a8fd4276578cc921c01ca115eb8b33977073f63b6d37153b24ba8054af7ab4b3496068dde563173ed12d49338d7682df652bd1fa821dd1839296e6a012b6cefd3b8f6a83bd55f11c01c2b9f48ebf05f8bd470ff0085245dd0abf771b75e3afa54736b9072ef0ad2fd4c03b621944cd19ac6129c89f3810bbd36cb8992d13e6991d201f1123bad19dfd46feb51f62b3a661733c05097acb2a4c371e5fe07e9e53db3a89eb5ce69fb5ccf1e1a9392d383293b927dc75a631c1bc7a91e3b9b5c1cd3c2245ab5645ba472b8ab908401fbd6f39e4ef918ea3a5339abed380a4629992124a788176791252ddd12eae2ce4a432ea46520ef8fa673456b485cf00faa3f64dfaaf49e90d47695d978836c8d70428975a6e48dc6723990afb493ee0d3aa572c4077c04b545ea5a5c3aafe1ccd0e1f5406d5ff09b7bb1c17a5700f575ce278cae6fd8526596d44fff00add040ce4f4501fea3573d3baa5b2902d8e47bacd359e85b15f2ea6ef4fc2a81ab344df342de5db56b1b64fb3dc5afb51a5b250ac7a8cf507d4641abbc13b6766f8ce42cbad432c0fdb28c2625e50a57a0a5b69487d56012683695d95a2f756f4a00b9793ba87a77a12b92b9e98a48a16f9478d41f16dab3527032c9c318b06db6f8909023bd71889299131901212d2bb01e54838eb8fae61068d0367fbc3fdb953efd7277c5d98ce32003fb7c7c2b4df0b11ed3c07e0f5eb566a8b77ceae3b1f30c36e0003f254084273e855b7d327b55375098dfbc1b9e168ada1269fa532388ed73b93fa2e1f85fb33577beea6d7dc4b9cfbd265adc9f3662f6f13a9200ec063007d00a2eb13ee90576f809e69151d52b7de231eb7e072a6bc72b30d4dae3424d871941771f296d2adc36d2d2bc67db9bf5a87af2ed63c156ed365ec567d6f7cffed4138f37b6ef3c43948869e48f05a6e1a53cc0ee91956e3fcca57e54b56e1a0956de9c89d156cbf92e24a1bb8307b6714ed4acad384df72b847b7447244f5fcbb0d8cad6a56d8a7356b3a67ed6a8ad4350869466598f010435e6bc7b51bca62015b16e4923909f339eeafed577a1a6361197795e7aeb0eb3975590c5112183fdd4196a3cc739a9431e7cace1c4e7d29ed0e391dd4b8d2d48712729503b8a6af6f70e1ca4e092485d989d8441d23ade338d062eca4b32063f7c46cbfafa1aadea3a7383b733c2d6fa57aba0da22b3c3be531712b53c985aa2d12acd2171e4c06c3ccbcd1c14acac9cfe829e69348765c241e5573ed0b573f7f8dd03bf28f28c1a3b89917584633ad61b6e700153ed39c72afa171b1ddb277c7dde87b13057f4eecbb0070a6b45d71b6e30e69f57b8fee112b46dd92fb8d78293e1a028adace39b381b1f50707f0aafd98b6f255db4eb225396953fd1b7b32be559ba109763ab94f31092950f51dfd33dc547c8dc153113f00b4aebd5736c3aede1a7b5089d0643454b666b4551e44459e85048c149f420a4fe4697ad33e03bb191f0a3add26dbf4c6e2d3f4e10d7564ee257009d8d78b8368d77a4e39e7fda1093e1c88e9ede3b63207fa87976dc83b54fd5ad52fb7101d8ff008551b5ae6a3a612cb8cee47f23cfeea6f138fbc32f8a9b147d31c408301e29079132b0d4a649eed2fb2bfd2483df3d2892c17f4b78382426d155d2b5a638c2ff0051fe13e5535f89ee0646e046ba8b6db3de5abe59ee5105c20bc48f190d15293cae81b730283b8d88c1db7157cd2aff00dea10ec2caf59d30d0b0e8c8c20e38903ec9c8a960eca8849d1972d9270680a029668f32c0c7e148f9428b3c12e14de356df62dda2db1336dd01d43ceb0a58417c0232919db38a84d67538ebb0b1c792ae5d27d3f3dd944fb7d23fdd5f1e2ad918bbf091e8167b7ccb740429870c54e5d520f32428909ce703989c7a9acbea592673202b609e8811164bc9238fa290ff00c25f93e1149b5e9c71a7d52596ca1d50e42e6c15bec36e6c76ec28b35accc6472245658e7363c60048f14350bdc3cd3da6aec981066ce65a761244ac94b65c403ce31d48280451eab9af7387ca94d3e936f4cf66e23c1e3e9fe555d7a5b921d71d90be775c515a979ce544e49a916b4670afec2d6b70a33aaf5cdb74d35894e2644ac6531db3957fd5e83f5a96aba5cb372070a9bd4dd654f48661eecbbe07f7f8414d51abe76a77f9e6a821a07286103c88aba54a2caedf4af3d6bdd536b567e663e9f61ec3f451a75d2ac848c6feb5200aab9200c04813befc9ff5288a51113c28907072334c9a394ec3d6c92527cbf9d292346de51f81e1355c9e53b28f9ce529091bf4c76a3b2301b8c26f62574aecbce569027c9b64b6a54079d8f25a57336eb4a29524fb11457c4d7b76b86422432ba1707b0e08477e1371c9a5de22235136d47b911e0fcc0412c4849231e2240f22bfce0609c640eb552d5f44cb498fc2d2fa73ab0ef0c9865df45602f9a6a6ea182edd7868eb8ab8b69509da71c5f39740eaa6559dcf538e871b7a1ac55318221987eeafb75f29ff00a8ae723dc2efe18f156d5ac2d9134eeaa8e87de69de44978143f1cee3293d42877c6c73b8ea291d428c959fb99c84bd3b715df58710f1e11ba2db2e7c2c52afce3c9d55a69d4e1531a6b9d6c27f81f6fb7fac794ff0097a16cc6670f84f8483efb2eb0d1b8d2c7fcfb1fd1576e39fc1f583898e3daa3e1b8310ae4b6fe65fb0a1c0861e577f9757dc575f212127a0c6c2adda4f5117620b3e167fae749c9559f7987e7dbcaa37a85bb947bac88da984d6ee3116633cd4d2af11a520e0a0856e08e98ed8abbc11b3b60b3c2cf6c3dee77e2924fd5351567634ae309b2c0009c50e572db18073b514b970e53fe8db01d457b62275689cb87d0531b73f6a32e52ba4d0fbd4a1a7c2fa1bc1bb443d3761663c16588cd9d8f2a375003a935916b13ba69b738af476874a3ad5836218473d39210549e420f311be3a544838f08979b9f288d150955b4970a1471fc34b968232553e4716c9c2aff00f1713235ab8602e3703c8c4596d95142398f9b291fa914fb498dd34e2368562d2f588b4cdd3ce7d385f3e752f16a74f0a8f6347c8c7dc170e0b8afe83f0ad169e8cc8802fe4aa57507da64f643a1a7e96fcfba1fbd29c75c5add5296b51ca94a3924d58a16860c00b2b9e674aedef393fdd72a959c7312067b5181ca40948297951c157f4a386a2ac0a15c9cd79db14cd2d95ba49e9da8c5e48c1470e2524ab7b2f2c95020939241a0ee1462c0569fb21b51185b80fb814ab1d9f28a61ca28fc36f0eae3aef8ab6fb0e9c7db6644c65ef11f7db2a432da1b52ca8e37fba07e22a2f5401cccbbc2b174cd87d1b3bd8339e117a2b9a83815a91286a7c69eb8aeab90b055b75cf2e46c09df1ef9d8ef5549618edb31f0b476492d1387f20fb226b4ad07c7d7d52f50b72349eaf7815a6e31d92da1c52538f38c617f5c83ef51e2c3ea0dafe427ff00728e7c3ea820fc7ba71d090b5d68b0d3d16f2ddd22b6a0e26248e64289c0e8adff000c8a8c92d405fe9182ac71e97316626f5fb73e7f9a9847bdca99788774d2b6c6b48cff00196bb8a5b1cedc8e982848384af20e48c0393b5127b2dc64725255f497b0189eecb3c60f91fa1f854e3e2e786f789bc48bdeb0755f35fb5def1dd486c24850481b63b613f53839abff004eeb0d9a00c7f90b24eafe9534e432c1f94aadcb494a8e76cd5a9873cacef9f042c27ed0a3ae29408e6393bd26e5c11cb82f60444610fbe8216e10ae6231b1aad6b363d3b42d23a528ed1bdcadae8c989f05ac65406339edfdab39bcccbb2b65a070d0d08c5a725e5c425ad920ee09a8dda116e45c64a24c298b11f914a56e32075a393c6153ac4037e4201fc6aad0f700f51255bf22e311f5f1dba9ce9b1ff5adfdd476bf18ff004f932be63bc39082338ad66360c2c88905a0a415b939fad2802409493801c8ce47714384423091213cc0273df39a10510a47c5006fd68e853d63ca0fad314aaf6315c8c384b36a4f61bd725da72944a72a1bd08242e3cabadffa75e8854785c42d76eb67c4891dbb44459381973f7aefe2021a1f459f5a81d6a62d6615a3a620125a682a1faea5a6fdac643a52015b84903380735010e361c2d226199b051238750d2d96904797738a80bc727956cd2c60708a823a0303b0233509e4f2a5c92b823599079cb0e3e878a89185818c9f52297078447bb1c9505e2ee917afd6a723cf525c7d0328e4fd0549e9770d7932a1f54aadbb11680a8ef107433b6f7df90d32af15b24ba91d169fe215ab52ba256872f3feb9a4181c7087aa6f98e4671529907c2ad118522d1fa795799e0ba85fcb3472a3eb4d6d4a1ade14ae994fbeefd11db4b2034a4b6c27185636fd2aa368eff2b4ad3076f01a8e9a454bf0d277e4000239bad546eb795a1517904231e9491ce96b202939fb26a0dc482a5ecb43988b16e702e1e5494e318cf374a54f8549b4d2d9157bf8d69611c0dbb00397c59519b23d7f780ff4ab0f4b8cde6feea2ba89fb74e7fecbe6e3dba867703b56aecf0b1a91dc70b9d49ebcc9dbb13429be568a4e158512715d95d94828f9f9baf5a108a572f21ec68e853fa9381be7d698a5b95809271b6d9ae466adce5076ce2b919a70784ab7e61e6cf2d7671ca5865cbe9a703eccd709be09ec6f3a0a666a1549bbaca93c8541c3cad9ebd0a10820fbd54b57937395ff00a36b6e99d23bf842acb0819d7871f572e54e120e7dea365386f2adf5da24937046bd12df2b4851c24818073d7deab774e4f0af145986a234621c64e067b039a8c3e52f29c14bb8c259616e21a50793b838dbeb4669f64dfb9b9d84d2fc01742dc87e328029e6752579513d07b62940fc2121acf3ee855c64e145b1cd3772bb94263a62c653fce0eca42464a4e6a7b48d45cc99ac1eeaafafe9514b5dcf03c2a716cd236db930994b608cad43942cf28c76fcb15a43ed39a76959143a543237b9ed9527836d443486e3a52db60f446d4cdf26e395315e988b86a94d88ad0e2463273be3bd44d805582b0c108bfa61f3f2ad794f30f5ef55ab606e570a2ee11af46942c0f1103071b8aaf4a087e54d3f3b113603c551793cbb1db23340cf0557661eac955a7e3c26263f0b2dd14b8a05fba20f2a13b1e56d67fb55aba35a7ef4e27e155fac65d94b03dc85409c51ca893b76ad45ab1e99224646475f7a36520524a0738c91ea4506502417be362684795d948a80e638200cf735c414013d939f5a6a965e1b1cf5f6ae42946d5958f7dab91d9cae988daa4486da6884a96ae504f404ed5cff00c853a847a97d5ef8b964687e17696d336e23e5ad76e62de8206329690123f9552750ff00ba1687d223152493e4aa73a5db2a79056467229adcf0ae1a63013946ad228cb042303cc2ab731578a638443b7a798a1000e518393d6a37dd1674e531e407d08e5c9e42a3ee3d28aa3d9ee9b2324ca5214c1f0db3f74ef424a7a5c1a39420f8afd4d22c5c219519a2a52ae125a8655d395072a57e7c98fa1ab374b566cd6c13ecaa3d637dd5e838b3df8557f85d0d17ad25a992b252e5b92d4e6d44e762b4b6b4fe3ce93ff40abf6a3e9999f5598f4f1eec1230fb63fdf85dcda795c29ed9a6a783853838e13d5b5c534ea5431d69ad8f0a520454d1ae97d3938c819fd37aaadcfccacba67908cda5649f09b29c804e7afe550b385690ddcd447b2dc14eb4ac8fbc534d98a06d44092aa6ff00ea0775588ba4a08e6f0d4eca78fd521b48fd147f3abc7463374921fa0feaa85d787657880f92a9839ba77edd2b46c61648e390b5fb95c524925279938e95d85c90713e19481de84202b97a939a3a15ffd9}}
\par {\pntext }
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2651646}{\*\bkmkend id2651646}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Either
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls102 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls102 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
data type represents
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
logical disjunction \u8212\'3f this or that.
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
14
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
14
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See Curry-Howard Isomorphism or Proofs as Programs.
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls103 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls103 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Have you ever wanted to return one type or another, depending on the input?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls104 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls104 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Typically, you\rquote d write a class to represent the disjunctive nature of this requirement \u8212\'3f perhaps using the visitor pattern again and dispatching polymorphically.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls105 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls105 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
is a better recoverable exception model than Java exceptions.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart AlgebraicDataTypes_Others}{\*\bkmkend AlgebraicDataTypes_Others}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Others
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls106 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls106 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
There are many others; pairs (
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
logical conjunction
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
), functions (
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
logical implication
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
), lazy lists, trees.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls107 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls107 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
And of course, you can write your own.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart PartialApplication}{\*\bkmkend PartialApplication}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Partial Application
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart PartialApplication_ReplaceParameterWithM}{\*\bkmkend PartialApplication_ReplaceParameterWithM}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Replace Parameter With Method
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Refactoring Catalog
}
{\field {\*\fldinst HYPERLINK "url(http://www.refactoring.com/catalog/replaceParameterWithMethod.html)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
\u167\'3f
}}}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://www.refactoring.com/catalog/replaceParameterWithMethod.html)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
http://www.refactoring.com/catalog/replaceParameterWithMethod.html
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
: Replace Parameter with Method
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
An object invokes a method, then passes the result as a parameter for a method. The receiver can also invoke this method. Remove the parameter and let the receiver invoke the method.
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
Before:
\par
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2746182}{\*\bkmkend id2746182}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line int basePrice = _quantity * _itemPrice;\line discountLevel = getDiscountLevel();\line double finalPrice = discountedPrice (basePrice, discountLevel);\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2759472}{\*\bkmkend id2759472}
{\f6 \strike0 \ul0 \b0 \sa200 \sb400 \fs20 \cf1 \i0
\line int basePrice = _quantity * _itemPrice;\line double finalPrice = discountedPrice (basePrice);\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart PartialApplication_JavaGetsNoCurry}{\*\bkmkend PartialApplication_JavaGetsNoCurry}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Java Gets No Curry
\par
}
}
}
}
}
}
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls108 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls108 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
In Java, all methods are in
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
uncurried form
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls109 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls109 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
They take zero or more arguments and return a value e.g.
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
(A x B x C) -> D
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls110 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls110 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
In curried form,
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A -> B -> C -> D
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
where the
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
->
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
associates to the right
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A -> (B -> (C -> D))
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls111 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls111 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We can
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
partially apply
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
each argument, getting back a function (that we can apply another argument to) or we get back a value.
\par {\pntext }
}
}
}\pard
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart PartialApplication_ConstructorsAsAnExamp}{\*\bkmkend PartialApplication_ConstructorsAsAnExamp}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Constructors as the Example
\par
}
}
}
}
}
}
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls112 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls112 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Since Java is always uncurried, we often use constructor arguments to work around it or a
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
factory
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls113 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls113 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Then, every use of the object has the constructor arguments applied.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2740920}{\*\bkmkend id2740920}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Foo foo = new Foo(\rdblquote foo\rdblquote );\line foo.method(\rdblquote bar\rdblquote ); // method uses the value \ldblquote foo\rdblquote by accessing a field \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls114 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls114 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Consider a trivial example
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Encoder -> String -> byte[]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2718565}{\*\bkmkend id2718565}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Encoder e = new Encoder(\rdblquote UTF-8\rdblquote );\line byte[] encoded = e.encode(contents); // has UTF-8 applied.\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart PartialApplication_PartiallyApplyingScal}{\*\bkmkend PartialApplication_PartiallyApplyingScal}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Partially Applying Scala
\par
}
}
}
}
}
}
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls115 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls115 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
In Scala, we can partially apply arguments to return new functions.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2721546}{\*\bkmkend id2721546}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> def add(x: Int)(y: Int) = x + y\line add: (Int)(Int)Int\line \line scala> def foo = add(7) _\line foo: (Int) => Int\line \line scala> val h = foo(8)\line h: Int = 15 \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls116 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls116 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We can get very funky indeed.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2653330}{\*\bkmkend id2653330}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> val i = List(1, 2, 3) map foo\line i: List[Int] = List(8, 9, 10)\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls117 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls117 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Our encoder.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2721375}{\*\bkmkend id2721375}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> def encoder: String => String => Array[Byte] = null // todo\line encoder: (String) => (String) => Array[Byte]\line \line scala> def utf8 = encoder(\rdblquote UTF-8\rdblquote )\line utf8: (String) => Array[Byte]\line \line scala> def encoded = utf8(\rdblquote contents\rdblquote )\line encoded: Array[Byte]\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart ImplicitArguments}{\*\bkmkend ImplicitArguments}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Implicit Arguments
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls118 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls118 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Some function arguments can be declared
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
implicit
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls119 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls119 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Then, at compile-time, the only value matching the type of that argument is used. If there is no matching argument or there is more than one, then a compile-time error results.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls120 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls120 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Implicits appear like a potential problem at superficial glance, since what about side-effects?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls121 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls121 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
But actually, we can encode an extremely powerful concept called type-classes
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
15
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
15
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See How to make ad-hoc polymorphism less ad hoc by Philip Wadler and Stephen Blott (and subsequent papers).
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
with
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
implicit
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
arguments.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls122 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls122 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
We can also do what the dynamic typing guys are doing, but with the advantage of safety
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
16
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
16
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
Also see C# 3.0 Extension Methods
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2680140}{\*\bkmkend id2680140}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> implicit def i(s: String) = new \{ def parseInt = Integer.parseInt(s) \} \line i: (String)java.lang.Object\{ def parseInt: Int\} \line \line scala> val v = \ldblquote 456\rdblquote .parseInt\line v: Int = 456\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart RealWorldSnippets}{\*\bkmkend RealWorldSnippets}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Real World Snippets
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart RealWorldSnippets_Instinct}{\*\bkmkend RealWorldSnippets_Instinct}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Instinct BDD Framework
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Before
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
17
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
17
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
}
{\f3 \b0 \fs16 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
Courtesy: Tom Adams,
}
{\field {\*\fldinst HYPERLINK "url(http://code.google.com/p/instinct/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
Instinct
}}}
{\f3 \b0 \fs16 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
[
}
{\field {\*\fldinst HYPERLINK "url(http://code.google.com/p/instinct/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
http://code.google.com/p/instinct/
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i1
]
}
}
}
{\f3 \strike0 \ul0 \b0 \fs16 \cf1 \i0
}
}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
:
\par
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2744715}{\*\bkmkend id2744715}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line private Collection findNamedMethods(final Class cls, final NamingConvention namingConvention) \{ \line final Collection locatedMethods = new ArrayList();\line for (final Method method : methodLocator.locate(cls)) \{ \line if (method.getName().matches(namingConvention.getPattern())) \{ \line locatedMethods.add(method);\line \} \line \} \line return locatedMethods;\line \} \line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
After:
\par
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2737507}{\*\bkmkend id2737507}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line def findNamedMethods[T](cls: Class[T], namingConvention: NamingConvention) =\line methodLocator locate(cls) filter (_.getName.matches(namingConvention.getPattern))\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart Formalities_ReductioWebsite}{\*\bkmkend Formalities_ReductioWebsite}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Reductio Website
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Reductio
}
{\field {\*\fldinst HYPERLINK "url(http://reductiotest.org/examples)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
code examples
}}}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(http://reductiotest.org/examples)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
http://reductiotest.org/examples
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
utilising Scala\rquote s XML literals:
\par
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2742360}{\*\bkmkend id2742360}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line \line
\line \{ \line examples map \{ case (c, name, _) =>\line - \{ name \}
\line \} \line \} \line
\line
\line
\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart WorkingmouseTraining}{\*\bkmkend WorkingmouseTraining}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Want to Learn More?
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2731819}{\*\bkmkend id2731819}
{\*\shppict {\pict \pngblip \picw189 \pich99 \picwgoal3780 \pichgoal1980 89504e470d0a1a0a0000000d49484452000000bd000000630803000000f93df15d000000c0504c5445ffffff003333335c5cdbe2e2849d9dadbdbd3a6161a3b5b51c49498ba2a2446a6a5c7c7c638282b2c2c27a94946c8989527474bdcacae4eaea4a6e6e94a9a9114141224e4e2a5454e9eded093a3a0d3d3dd1dadacad5d5043636f9fafa759191f4f6f6023535edf1f198adad718d8dd5ddddc5d1d1154444255151c0cdcdf2f5f5fdfdfd063838fbfcfcf7f9f99db0b04d7171a7b8b82f59590b3c3cfefefeced8d8184646e0e6e67f9898134242f0f3f3567878406666688686b8c6c68fa6a66e4d90390000000174524e530040e6d86600000001624b47440088051d48000000097048597300000b1300000b1301009a9c180000000774494d4507d60817170d12aa73cb8500000bb04944415478daed9c6963a2ca1286bb65914551511454c47d01038a6b5cffffbfba55dd92459d3be69ccc24dc9bfe709c28c243515df556757b08f9193fe367fc1f8da12757633dbb4b23bba9bb948d71a5953af84d06c09db585fc8761cae0db32a5d548b0cdd2111e8163a4cb7db6946af649cfc885d37006e6af45cbf4c0db23aa7445eef747615e8597f22035f4594a8d21ce5805fea3643739787956c394d01768e7a4532a86bbec18edde38c5f02297d2415fa4f555958e3154dade82526b2b54469476729b34d097a935b0a8c6ff686a386df383227a511a823fd0379e137af28476a7c78d845ea43553464f08b77bd62c7428ad8b61cae809c963eed58643f422cd4c1b3df10d0792eed68e6012cbbbb4d183e63ce0ec9d94ea9416be0b68d80e1fa427ad33ccde6949a274217c07f495a1d5aab5f276f5103dcc5e48619600ff31be9ebd8589888d6971f5103d210684ce5287cac157c307a85eacc34c46115fdffaefe957d65dfaa798562191adfdafa657c17f55b3bb31855e0df863e9f5a319b59af7e9e1a3b560d1d157471d60b08682aed447878ad04331597ea9a13274d4b84f3f00876a4e69fcd58201e4fbd956b8dfc72713ddc8f16cf6d1c4a5b250a7e53bd31c9e92040f2df7d58e03de6143f4c8148a10c0e95e98403108d5e0eec997a01a89261d7abc89ae2a4c91a209b77cfaea8013d38c69d12a58bb81b5dfba62f7508c5565aca434023736bffaca49663201348ffcf4d5757715fcdce52eb0ccb2e2e334c839cc913aba1f4161f53eaeac749068a32d0ab6fa847c03fa929be4fcb68a76df0f0686161ffacd106bdafcbbe3f3981b72ab0ab8cd224fbe03fdc47d552c833d653554bbddeece51508a37212a9367be53fb0605e2353d2112bacfb426c7388ba7e2f517ce62a30fbee3f66df21de9c96ebbbe2887c5ec8e7de72c274c08f99ef48498514e8ee5bd7ab77703da32ce13f27de951fdb47e29c072fd6f5395fc8a3e1de387fe87fe87fe9b8da624d9527ae9cf5e54fc47f4fe46e87e5c6fb7db9fd39ee1359b90cd16ce1fa737cfda7ae18c34f5a6d977f2b6129eba257a9e3167fa3eeb199e88ef4d8eb152d55476d32bcf300ccf10b30d6e8bad67707111c107de60e079a20039b1e2192a2b44e17c86c73a1a7ea53c56327d6c15b5379bc6e6a3f4b678a914a148b92e4d2af066318463d8c73ae03fb15a3e208171591b8db1bd1c2567986a4867e2bfd08557f8dea89bc5736f480bdbd16e016eddc78e46842237c3bfb7ceffa3596b8b58553d97fbde0cced8a95c55b4880805e16acaae01403b2c090aacc573198ac0168d92b1c8c24951b04229b62cf36fb18fb7a4c551c13bda68303870534dbe566f3e465f7a43ef9ff1eb8a2a6c1a826f1e01ffbdccf4517faa50a5f04be8e09c5366b506de561c15f0ddfd857eac31164be0f4e310251ec5329f7d7c244f9c3e7e7aa1cfb1037aac2c0d1eb5fda53910cc63569caca243dd9d56d5e5f6ba780db030e9bf78c661494a58430e7171943ae0e4d81b77048e27125bbbbc227ded89d9da595de80b09bddb48e84d7420c526677cf7f7cb93618d753d6a88b8cc637bd83936597dcb4d0befbc97f23a3a3e6ba4b875664ebc8fd16e2973a3b2890118177afe8c66177a6e7aec51bca7878779a14f0ec0954a5af92dfd5283390406d287ab8899ad3089f094cfbad807879e4bd7ad562c753301019f1ac1f1759b19fd40cc05f75f32ecb08733bfd0338792397ddc654f76734b7f2021d2cfd9c970f2da8a558d7f4f8f934d6ac2153b6c1aee87121a7171c480757269b9e1d0e2757142473e9981290bec99e71807fa0f6bef6c16ccd809fdea0dbd2cf2b97a450f1777364f9c3e7739cdd2deb5c3075abc4d97d6fc39ab05a7e553096382abf356f232a6cae0ba132838ccafe1b2b2caaea4b1678cb42e7e6d879e9b79a19ff359cce847cf182777d7f458404784d397f9247a7ce8d85ab223cfab0c876c3b8b3679ed21dff631430c07a5002e3693d8538690dd99901e9fac97a034e6d45bbfc15ca3c7e9598f882790b7f44738971e54193d4ebc69e303f43638e3a8200d4fbd2236a166a7e59b2ee19d2e2cae1b66bb70a83e0067135b606bcb669375811eeda311ab9cde52585b2bb37ba5bfa0bda517e18c559bd3a3db3a0332f4782e7ea48b9c79cd2c72fefdeac31d7acc4ae2009cd50b01bcb071d82cbe4bcfad2d0be495fe129bdfd257e0b9b9f9da5b7a16b894c7367474b73cc13987ecfbc5abbbf4c855c8b33007572c4e3a2c6745fcb2403f62b1f1953e87e77ca55f0caee955014e5188193d4ea2e98ad353ef41efd99d54631b35ae37dfdca5c71858acb0e80cd73acc79189192e9c6380f9c3e87c9415ebed23b9770ffde7370ea8c478c7ecf4f23652c9e56fecdb84b8f7925e3e1d4c5f8363a70b5c3e27a1655d6946539467f46ab32edc5e9fbe87575e186be70792e73d2a7ac731ab4ca2cee7e3e3d46b5354cb4a9c0730bfb1777f7fe251f00108f391858e97877a17fee36f06e8c1b7ae9429f65a18be5d8f21fb23ddac751501df06bc11c45cfde7319c6ad574a446485eb808b4a0b02a45ddbd7f4b695d00f2f220fb3e19fa1bf08b4b89508cdd98b276fc3155bbaf0137a7bc471197db58d4b7c2c89bda7679666f421869ec529e826b2e9d3e95157f073aff8459910dae17569cde2d929a1e78fc27ba14f34e4157d25a1e7a671d8c2cdc331e743f4ac1c61b1a3c5f4ef8227a066d279a6c7e5851e6ecbc69b9a0e760ea7271ebfab843ee6f7b83b24f42f33181cc8ff13f44bcdc1a162c1a75b7539597a6b9499d053545457733c049bff82feec4cfbfe1afeac01fd4eb71c67ec4bf8719f3cc99713d9fd5add715045042ab37b27fed8e6c9d6ada6bb4f4f6c0107b78c6dbef956b327aa125f95f0f110de94e80ac2e669037f6e96c9b7c3367e6c93a5f972546826a7ec4aaa58997c60ef52783266714dce45e623f4df6ccc935a8aaecfad94d187ac2418c987b17bb5dbf2b7f4adabe71bfef53d23018a9172c96fb7db8207a1c1cd99ff853ebbdfeb26b1f5fdbe475a623cd60552dae7c2a5579c9349b12a47f0e7be38d3ffd6e611482056b62de532356ddb68628eabf6dabfd4f70526474e4cea7ad4aad238ec51d70fc6d480e21ee4561e82617d54fd4b8b43c282d6871b99bbbdd33799d0ce70992fd3f57565d8675944a4535a30a754821c2fcda9d50e62aa5668bd2bce7a59ea36dbedbfb4571c9496e86375573bb0ba626e8b6c391c94d7aa4ee5c1e2bddce8d3d82d936227433d893a26dca097e5f4e29cba18b0e151fcb58dbe8146eb36b843661206f679cd76b9ae507658c523a48d4a892bc737f43945e98e47396a54a8e5439da8479c7ebb5328669e1eedf4d5bfc41f8e69c61cd1112f2285024cdba9212421547bda5f6d54e853afece61d794b0d153776ed69b1c7e90d328447a88711bdd9dcf027d74eb4a18bb51d1f6c97abd2337bdaa85e135b67d092e17bfaed96e6685fbdb13d8a1a786822f8fdbcf9c993b6bbddfc92fe6d1796041176a533f38d6dee84e38d19813e4f159a3dbff87d1ffc3e2431f5821669c754ae50f7d3b7691ab7adf8fbf460c102662d4b2e671c5e5abca73720d6740491c79c2ec49c3c1457a14255359383477100fa66187e6acc614b04fbc143f4844cca6ea21c7a57c71760122bd40a0c88f7393aaa4125029abd063abd01811e026f042f2365fc99d336280d3c90af96d17d881ed4a25accd4327aef66e5272a66895adc9279b1427ca356ddaf08e658459b93a07750e41e29158be572f133f7870fdd72a38919e96677c72fe89986f9fdaeb344e784fc3508ff4892c25eb5689eb12cbbfacd08d01f26d3efbdda7cc2fa519eb06d5b4a14a48c9ef86705f7f835f29886b452cae809613ff5b22aa658c735463365f4844835f643cd0666d371b2fcdf1ea7849e740db47b7fd34331a60bc96282369ca6638f4803970ec6110bfecf6cabfd0614f0a9f36f1b3f7fad00e73ff51a6210ca487e176683183db2b8f83d86dd7751049bb88f9b5615ec489769a749d2324a2ce99e9817413188eb9d9914fd663c64db008ac392a769c6a03166cb07291ab87d82d6bda1690f448bbed6266919ec0783d47a46293cf3d3464ffc640b9165a4ef7f9480eed3d3e35a591d909ff133fe27c77f00f46c28b6705821030000000049454e44ae426082}}
\par
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls123 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls123 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
I will happily answer your questions when I can get a chance \u8212\'3f by email or otherwise.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls124 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls124 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
I would love to give these topics justice, which is simply not achievable in a one hour talk.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls125 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls125 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Workingmouse offers 2 \u8212\'3f 3 day hands-on workshop sessions that cover these topics and more in thorough detail. In particular, we go deeper into answering
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
why this foreign mumbo-jumbo is important
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls126 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls126 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The training sessions cover language basics all the way to advanced high-level programming concepts, primarily using Scala or Haskell.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls127 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls127 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
To talk to myself or Brad Clow if you are interested in becoming a better and highly proficient software developer
}
{\field {\*\fldinst HYPERLINK "url(mailto:training@workingmouse.com)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
training@workingmouse.com
}}}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(mailto:training@workingmouse.com)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
mailto:training@workingmouse.com
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls128 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls128 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Most people have had an
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
\rdblquote aha! moment\rdblquote
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
on day 2 or 3 and have started rewriting all their legacy Java using Scala.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls129 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls129 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Who wants to know what a monad is and why it matters?
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls130 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls130 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
These slides are available on the Workingmouse Wiki
}
{\field {\*\fldinst HYPERLINK "url(http://wiki.workingmouse.com/)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
http://wiki.workingmouse.com/
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime}{\*\bkmkend IfWeHaveTime}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
If we have time but we probably won\rquote t
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime_Questions}{\*\bkmkend IfWeHaveTime_Questions}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Are we still here?
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls131 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls131 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The remaining concepts are quite deep and advanced and each of them can initiate lengthy discussion.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls132 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls132 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
What have we seen so far?
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime_WeWont}{\*\bkmkend IfWeHaveTime_WeWont}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
I feel very little right now
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls133 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls133 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
What you have seen today may appear intimidating or overwhelming in theoretical foundation.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls134 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls134 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Some of the more advanced concepts are those that are the most exciting and incredibly powerful, however, they typically require some pre-requisite understanding.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls135 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls135 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Let\rquote s not burn our brains just yet anyway.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls136 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls136 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Take the following with light steps and don\rquote t feel intimidated if you do not follow.
\par {\pntext }
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime_HigherKinds}{\*\bkmkend IfWeHaveTime_HigherKinds}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Higher Kinds
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls137 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls137 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
In Java, we can abstract over type variables. After all, we don\rquote t write a
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
length
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
function for
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
List, List, List
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and so on.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls138 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls138 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
With Scala, we can abstract over
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
type constructors
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2722898}{\*\bkmkend id2722898}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line trait Mappable[F[_]] \{ \line def map[A, B](fa: F[A], f: A => B): F[B]\line \} \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls139 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls139 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Some type constructors that are
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Mappable
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
:
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls140 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls140 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
List
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls141 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls141 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Option
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls142 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls142 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either[X, _]
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls143 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls143 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Either[_, Y]
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls144 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls144 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Function[X, _]
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard {\pntext }
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime_LazyAnnotations}{\*\bkmkend IfWeHaveTime_LazyAnnotations}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Lazy Annotations
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls145 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls145 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Scala arguments may be annotated to defer their evaluation.
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls146 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls146 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
This can be very dangerous in an environment with uncontrolled side-effects, but also gives excellent compositional properties. Be careful!
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls147 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls147 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2718739}{\*\bkmkend id2718739}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line scala> def and(x: Boolean, y: => Boolean) = x && y\line and: (Boolean,=> Boolean)Boolean\line \line scala> val r = and(false, throw new Error(\rdblquote blow up!\rdblquote ))\line r: Boolean = false\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime_HighLevelAbstractions}{\*\bkmkend IfWeHaveTime_HighLevelAbstractions}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
High Level Abstractions
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls148 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls148 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Since we have higher-kinds we can model some high-level abstractions, including those from the king of abstraction \u8212\'3f Category Theory.
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls149 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls149 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Functor
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls150 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls150 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Monad
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
18
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
18
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See Monads for Functional Programming by Philip Wadler
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls151 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls151 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Applicative
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
19
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
19
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See Applicative Programming with Effects by Conor McBride and Ross Paterson
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls152 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls152 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Traversable
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
20
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
20
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See The Essence of the Iterator Pattern by Jeremy Gibbons and Bruno C. d. S. Oliveira
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls153 \pnindent1160 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls153 {\pntext }
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1360 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Arrow
}
}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \b0 \fs15 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs15 \cf1 \i0
21
}
}
}{\footnote \ftnalt
{\li0 \f3 \qj \b0 \ri0 \fs16 \cf1 \i0
{\f3 \b0 \fs12 \cf1 \i0
{\super \f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs12 \cf1 \i0
21
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs16 \cf1 \i0
See Programming with Arrows by John Hughes
}
}}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
\par {\pntext }
}
}
}\pard {\pntext }
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart IfWeHaveTime_CodeSnippets}{\*\bkmkend IfWeHaveTime_CodeSnippets}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Some High-level Code Snippets (for fun)
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls154 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls154 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Adding methods (
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
!>
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
unless)
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
to
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Boolean
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
to perform a side-effect depending on the value.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2728749}{\*\bkmkend id2728749}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line (7 > 6) !> println(\rdblquote seven is greater than six\rdblquote )\line (6 > 7) unless println(\rdblquote six is not less than seven\rdblquote )\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls155 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls155 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Addings methods to any reducible container.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2743323}{\*\bkmkend id2743323}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line List(1, 3, 5) any even // false\line Array(1, 2, 3) all even // false\line List(2, 6, 8, 9, 6, 7, 3, 5, 8, 6, 9) selectSplit even // List(List(2, 6, 8), List(6), List(8, 6))\line \rdblquote age=54&name=Bob&address=At Home\rdblquote .toList selectSplit (_ != \lquote &\rquote ) > (_.mkString) // List(age=54, name=Bob, address=At Home)\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2748039}{\*\bkmkend id2748039}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs34 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs34 \cf1 \i0
Functors and Monads
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}\pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls156 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls156 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Functor
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2736402}{\*\bkmkend id2736402}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line List(1, 2, 3) > (_ + 1) // List(2, 3, 4)\line Some(1) > (_ + 1) // Some(2)\line None > (_ + 1) // None \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls157 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls157 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Monad
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2742079}{\*\bkmkend id2742079}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Some(7) >>= (x => if(x % 2 == 0) None else Some(x + 1)) // Some(8)\line Some(8) >>= (x => if(x % 2 == 0) None else Some(x + 1)) // None\line Some(\rdblquote a\rdblquote ).replicate[List](3) // Some(List(a, a, a))\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls158 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls158 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
MonadPlus
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2737387}{\*\bkmkend id2737387}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line List(1, 2, 3) <+> List(4, 5, 6) // List(1, 2, 3, 4, 5, 6)\line Some(7) <+> Some(8) // Some(7)\line Some(7) <+> None // Some(7) \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls159 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls159 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Applicative
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
functor.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2753561}{\*\bkmkend id2753561}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Some(7) <*> (None > add2) // None\line Some(7) <*> (Some(8) > add2) // Some(15)\line List(1, 2, 3) <*> (List(\rdblquote a\rdblquote , \ldblquote b\rdblquote ) > (s => n => n + s + n)) // List(1a1, 2a2, 3a3, 1b1, 2b2, 3b3)\line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard \pard \fi-360 \li {\*\pn \pnlvlblt \ilvl0 \ls160 \pnindent960 \pnf1 {\f2 \pntxtb \u8226\'3f}}\ls160 {\pntext }
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li1160 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
The
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Traversable
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
.
\par {\pntext }
}
{\li1160 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2751415}{\*\bkmkend id2751415}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line Some(\rdblquote 789\rdblquote ) traverse ((_: String).map(_ - 48).toList) // List(Some(7), Some(8), Some(9))\line List(\rdblquote abc\rdblquote , \ldblquote def\rdblquote , \ldblquote ghi\rdblquote ) ->> // abcdefghi\line Array(true, false, false, true, false) ->> // true (using the disjunction monoid) \line
\par {\pntext }
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\pard
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart Thanks}{\*\bkmkend Thanks}
\par
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li960 \f4 \qj \b0 \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs20 \cf1 \i0
{\li0 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb200 \fs41 \cf1 \i0
Questions
\par
}
}
}
}
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
Thanks for listening. Questions?
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Please send any questions or comments that may arise later to
}
{\field {\*\fldinst HYPERLINK "url(mailto:research@workingmouse.com)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Tony Morris research@workingmouse.com
}}}
{\f3 \b0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
[
}
{\field {\*\fldinst HYPERLINK "url(mailto:research@workingmouse.com)" }{\fldrslt
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
mailto:research@workingmouse.com
}}}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
]
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
.
\par
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart LargeApplications}{\*\bkmkend LargeApplications}
\par
{\li960 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb414 \fs41 \cf1 \i0
A.\u160\'3fYeah but how can we write medium/large applications?
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
Many people who are new to high-level programming often ask this question. This question needs addressing (as opposed to answering), since it begs another question, \ldblquote what is a medium/large application?\rdblquote .
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
Consider this very trivial program:
\par
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2736296}{\*\bkmkend id2736296}
{\f6 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
\line def f(a: Int, b: Int, c: Int) = a * b + c\line
\par
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
It takes two smaller
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
units of software
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
(
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
*
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
+
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
) to compose a larger (but still what many would say is small) piece of software. We can do this because
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
*
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
+
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
are
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
pure functions
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
. They have no unwanted side-effects.
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Some programming environments actively promote side-effects. This can sometimes be so overwhelming that the possibility of an alternative is never considered. It becomes the norm to accept the far-reaching implications of performing side-effects wildly and without care, as unavoidable. The beginner is so used to a mindset that shuns compositional software that any alternative looks vague and fuzzy. If either of
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
*
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
or
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
+
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
perform a side-effect, we must rewrite, absent the side-effect.
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
Even when considering the I/O aspects of a typical application, the impurities are relatively minor and inconsequential. However, since the composition of an impurity with a purity results in an impurity, it is often tempting to yield to the programming environment and produce a
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
large application
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
\u8212\'3f which is a euphemism for an
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
unmanageable application
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
. In other words, the answer to the question \ldblquote what is a medium/large application?\rdblquote is simply this:
\par
}
{\li1680 \f3 \qj \b0 \ri720 \fs20 \cf1 \i0
{\li1680 \f3 \qj \b0 \ri720 \fs20 \cf1 \i0
{\li1680 \f3 \qj \b0 \ri720 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa200 \sb200 \fs20 \cf1 \i0
Any application that is so difficult to manage as a result of the proliferation of side-effects, that it often requires a committee of authoritarianism to approve a change that is almost certainly going to cause devastating consequences. These consequences are dealt with by clever marketing and squelching any protests by software developers.
\par
}
}
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
Once the detrimental mindset of marriage to side-effects is abandoned, I am quite sure that many examples of such applications can be found in the sphere of the web and various other places. However, this very act can be psychologically traumatic as certain propositions that were once held deep and dear as true, tumble into the pits of undefinedness resulting in the sudden onset of mass insecurity. This is a very real trauma and counselling is often beneficial. No, really, it is.
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
If you have a mandatory pure environment (like Haskell) or a just-don\rquote t-be-silly-please environment (like Scala), where compositional aspects of software are embraced to at least some degree, the distinction between a trivial and non-trivial application disappears (to that degree).
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
How can we write large applications? Just keep composing the smaller units to make the larger unit \u8212\'3f that\rquote s how (yes really). You don\rquote t have
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
ABC
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, but you do have
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
B
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
C
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
? Well that\rquote s easy, write
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
A
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, then
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
ABC
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
. Yeah but
}
{\f3 \b0 \fs20 \cf1 \i1
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i1
really
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
large. You mean like
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
ABCDEF
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
? Well if you have
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
ABC
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
, then write
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
D
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
,
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
E
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and
}
{\f6 \b0 \fs20 \cf1 \i0
{\f6 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
F
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb0 \fs20 \cf1 \i0
and you\rquote re nearly done.
}
{\f3 \b1 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b1 \sa0 \sb0 \fs20 \cf1 \i0
...ad infinitum
}
}
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
.
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \sa0 \sb200 \fs20 \cf1 \i0
The reader is strongly urged to consider essays, papers and presentations by John Hughes, Erik Meijer, Simon Peyton-Jones, Philip Wadler and many other figures who make efforts to portray this understanding.
\par
}
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\*\bkmkstart ScalaExercisesForBeginners}{\*\bkmkend ScalaExercisesForBeginners}
\par
{\li960 \f4 \b1 \ql \ri0 \fs41 \cf1 \i0
{\f4 \strike0 \ul0 \b1 \sa0 \sb414 \fs41 \cf1 \i0
B.\u160\'3fScala Exercises For Beginners
\par
}
}
{\li960 \f3 \qj \b0 \ri0 \fs20 \cf1 \i0
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
{\li960 \f6 \b0 \ql \ri0 \fs20 \cf1 \i0
{\*\bkmkstart id2722601}{\*\bkmkend id2722601}
{\f6 \strike0 \ul0 \b0 \sa200 \sb400 \fs20 \cf1 \i0
\line sealed trait List[+A] \{ \line override def toString = \{ \line def toScalaList(t: List[A]): scala.List[A] = t match \{ \line case Empty => Nil\line case Cons(h, t) => h :: toScalaList(t)\line \} \line toScalaList(this).toString\line \} \line \} \line final case object Empty extends List[Nothing]\line final case class Cons[A](h: A, t: List[A]) extends List[A]\line \line object List \{ \line def foldRight[A, B](as: List[A], b: B, f: (A, B) => B): B = as match \{ \line case Empty => b\line case Cons(h, t) => f(h, foldRight(t, b, f))\line \} \line \line def foldLeft[A, B](as: List[A], b: B, f: (B, A) => B): B = as match \{ \line case Empty => b\line case Cons(h, t) => foldLeft(t, f(b, h), f)\line \} \line \line def reduceRight[A](as: List[A], f: (A, A) => A): A = as match \{ \line case Empty => error(\rdblquote bzzt. reduceRight on empty list\rdblquote )\line case Cons(h, t) => foldRight(t, h, f)\line \} \line \line def reduceLeft[A](as: List[A], f: (A, A) => A): A = as match \{ \line case Empty => error(\rdblquote bzzt. reduceLeft on empty list\rdblquote )\line case Cons(h, t) => foldLeft(t, h, f)\line \} \line \line def unfold[A, B](b: B, f: B => Option[(A, B)]): List[A] = f(b) match \{ \line case Some((a, b)) => Cons(a, unfold(b, f))\line case scala.None => Empty\line \} \line \} \line \line sealed trait Natural \{ \line override def toString = \{ \line def toInt(n: Natural): Int = n match \{ \line case Zero => 0\line case Succ(x) => 1 + toInt(x)\line \} \line toInt(this).toString\line \} \line \} \line final case object Zero extends Natural\line final case class Succ(c: Natural) extends Natural\line \line object Exercises \{ \line \line // Exercise 1\line // Relative Difficulty: 1\line // Correctness: 2.0 marks\line // Performance: 0.5 mark\line // Elegance: 0.5 marks\line // Total: 3\line def add(x: Natural, y: Natural): Natural = error(\rdblquote todo\rdblquote )\line \line // Exercise 2\line // Relative Difficulty: 2\line // Correctness: 2.5 marks\line // Performance: 1 mark\line // Elegance: 0.5 marks\line // Total: 4\line def sum(is: List[Int]): Int = error(\rdblquote todo\rdblquote )\line \line // Exercise 3\line // Relative Difficulty: 2\line // Correctness: 2.5 marks\line // Performance: 1 mark\line // Elegance: 0.5 marks\line // Total: 4\line def length[A](as: List[A]): Int = error(\rdblquote todo\rdblquote )\line \line // Exercise 4\line // Relative Difficulty: 5\line // Correctness: 4.5 marks\line // Performance: 1.0 mark\line // Elegance: 1.5 marks\line // Total: 7\line def map[A, B](as: List[A], f: A => B): List[B] = error(\rdblquote todo\rdblquote )\line \line // Exercise 5\line // Relative Difficulty: 5\line // Correctness: 4.5 marks\line // Performance: 1.5 marks\line // Elegance: 1 mark\line // Total: 7\line def filter[A](as: List[A], f: A => Boolean): List[A] = error(\rdblquote todo\rdblquote )\line \line // Exercise 6\line // Relative Difficulty: 5\line // Correctness: 4.5 marks\line // Performance: 1.5 marks\line // Elegance: 1 mark\line // Total: 7\line def append[A](x: List[A], y: List[A]): List[A] = error(\rdblquote todo\rdblquote )\line \line // Exercise 7\line // Relative Difficulty: 5\line // Correctness: 4.5 marks\line // Performance: 1.5 marks\line // Elegance: 1 mark\line // Total: 7\line def flatten[A](as: List[List[A]]): List[A] = error(\rdblquote todo\rdblquote )\line \line // Exercise 8\line // Relative Difficulty: 7\line // Correctness: 5.0 marks\line // Performance: 1.5 marks\line // Elegance: 1.5 mark\line // Total: 8\line def flatMap[A, B](as: List[A], f: A => List[B]): List[B] = error(\rdblquote todo\rdblquote )\line \line // Exercise 9\line // Relative Difficulty: 8\line // Correctness: 3.5 marks\line // Performance: 3.0 marks\line // Elegance: 2.5 marks\line // Total: 9\line def maximum(is: List[Int]): Int = error(\rdblquote todo\rdblquote )\line \line // Exercise 10\line // Relative Difficulty: 10\line // Correctness: 5.0 marks\line // Performance: 2.5 marks\line // Elegance: 2.5 marks\line // Total: 10\line def reverse[A](as: List[A]): List[A] = error(\rdblquote todo\rdblquote )\line \} \line
\par
}
}
{\f3 \strike0 \ul0 \b0 \fs20 \cf1 \i0
}
}
}\sect }