From fc2bd86cff1aa2a8f0c34e8c408157bf701a75f6 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Thu, 5 Jul 2018 11:16:48 +0100 Subject: [PATCH] Extremely close to alpha release --- env/prod/resources/config.edn | 4 +- project.clj | 4 +- resources/public/css/yyy-common.css | 7 +- resources/public/img/ProjectHopeLogo4.png | Bin 0 -> 55218 bytes resources/sql/queries.auto.sql | 52 +- resources/sql/youyesyet.postgres.sql | 2 +- .../templates/auto/application-index.html | 66 +- .../auto/form-addresses-Address.html | 46 +- .../auto/form-authorities-Authority.html | 76 +- .../auto/form-canvassers-Canvasser.html | 70 +- .../auto/form-districts-District.html | 26 +- .../auto/form-dwellings-Dwelling.html | 52 +- .../templates/auto/form-electors-Elector.html | 50 +- .../form-followupactions-Followupaction.html | 74 +- .../form-followupmethods-Followupmethod.html | 16 +- ...form-followuprequests-Followuprequest.html | 57 +- .../templates/auto/form-genders-Gender.html | 16 +- .../auto/form-intentions-Intention.html | 51 +- .../templates/auto/form-issues-Issue.html | 41 +- .../templates/auto/form-options-Option.html | 16 +- resources/templates/auto/form-roles-Role.html | 42 +- resources/templates/auto/form-teams-Team.html | 74 +- .../templates/auto/form-visits-Visit.html | 67 +- .../auto/list-addresses-Addresses.html | 75 +- .../auto/list-authorities-Authorities.html | 75 +- .../auto/list-canvassers-Canvassers.html | 75 +- .../auto/list-districts-Districts.html | 75 +- .../auto/list-dwellings-Dwellings.html | 75 +- .../auto/list-electors-Electors.html | 75 +- .../list-followupactions-Followupactions.html | 75 +- .../list-followupmethods-Followupmethods.html | 75 +- ...ist-followuprequests-Followuprequests.html | 75 +- .../templates/auto/list-genders-Genders.html | 75 +- .../auto/list-intentions-Intentions.html | 75 +- .../templates/auto/list-issues-Issues.html | 75 +- .../templates/auto/list-options-Options.html | 75 +- .../templates/auto/list-roles-Roles.html | 75 +- .../templates/auto/list-teams-Teams.html | 75 +- .../templates/auto/list-visits-Visits.html | 75 +- resources/templates/base.html | 11 + resources/templates/home.html | 44 +- src/clj/youyesyet/routes/auto.clj | 752 ++++++++++++------ src/clj/youyesyet/routes/auto_json.clj | 178 +++-- 43 files changed, 2375 insertions(+), 719 deletions(-) create mode 100644 resources/public/img/ProjectHopeLogo4.png diff --git a/env/prod/resources/config.edn b/env/prod/resources/config.edn index b48cfbd..eeaa8d9 100644 --- a/env/prod/resources/config.edn +++ b/env/prod/resources/config.edn @@ -1,2 +1,4 @@ {:production true - :port 3000} + :port 3000 + :site-title "Project Hope" + :site-logo "img/ProjectHopeLogo.png"} diff --git a/project.clj b/project.clj index 7ffe7db..6ae71ee 100644 --- a/project.clj +++ b/project.clj @@ -80,7 +80,9 @@ [datatables.net-dt "1.10.19"] [jquery "3.3.1"] [leaflet "0.7.3"] ;; old version works, new ["1.3.1"] doesn't - [signature_pad "2.3.2"]] + [selectize "0.12.5"] + [signature_pad "2.3.2"] + [simplemde "1.11.2"]] :root "resources/public/js/lib"} :uberwar diff --git a/resources/public/css/yyy-common.css b/resources/public/css/yyy-common.css index 65fde48..4e739b0 100644 --- a/resources/public/css/yyy-common.css +++ b/resources/public/css/yyy-common.css @@ -104,7 +104,7 @@ input, select { padding: 0.25em 1.25em; } -input.action { +input.action, input.action-safe { color: white; background-color: rgb( 50, 109, 177); font-size: 125%; @@ -113,6 +113,7 @@ input.action { input.action-dangerous { color: white; background-color: red; + font-size: 125%; } input.required:after { @@ -254,6 +255,10 @@ th { border: thin solid silver; } +.editor-toolbar { + background-color: silver; +} + .error { width: 100%; background-color: red; diff --git a/resources/public/img/ProjectHopeLogo4.png b/resources/public/img/ProjectHopeLogo4.png new file mode 100644 index 0000000000000000000000000000000000000000..7b82d8b8253980c27bf2ff19e5a5c8365d1376ec GIT binary patch literal 55218 zcmXt91yoec+o!vc5F`X?5Rh&V5Rj6VZV>72mQq4QLRv{lVd-3Hq!grCI;6X#zPY~N z9}fr5?!7b5JRQG@d7-9&k3)rngoK2zq$sC}goFZvez7p1Pc|Z`!5<6@Wd%8;JLq3- zYf%#T1lvVX-yM8!2>l|rIHYBQ4>3KIROK<3G0`!}2*0iT!bL)&M^ciL(e|0yL3sOQ zj3asu_g7kNNyIvQ7 z_BT}$rqsk&B&-HfhOeSH_1rSwn~PNk1Xm2`c??@}oT(?Q87gdu^gfl#$9&TB2Gup{ zA{x`ezzGxemoz02fn4oLH!?X9_M4ii$omsGR!ZRk`?7S zp=&eJRM8>_0}hOV!I(}rDa6B!o+o#WaeT$=Ly1S%+t5HRx<=`sfn9O>f$B1gWJS4q zHu7@ukIM|WKJ&M(St@1(=QS-~72Cfm?3s8oG_Mkl2rd65lhmnXEXzkw^toq34%Vp@ znAf>tpY9?WH+eIak;Okn^Ckj~gyi0$Cnr6e;R$C$Ee$c1;tMmRUrXQ7FkZ?_sPfVcB=Cz}$aNPcS z4blLEC_~yGmq`Vcf!*Q*v*o;}iqQm2lI(9xc+Jb}SMr`#iJncj5lkUFIA8X?y7aEJ z)>q3~V)(+t!Ek%eXeCq$E@#%F@Csil`>Iw*jII22ZgIymjfl8q9O~}mii9t2)N8eI z+P`NAsknAyP*6Dae#YT2i9F2AZ*cjr(z!`Wp|)`0@?jbJ-!m68_~EVIDSSA^rTP98 zmO~9^>C<-Xe|sSwHk>(QmuJ)2_4)-TdwLxyZyV8JZW%aJ=u8Q}DBn&MJxK^fkNIVO zqKd^*;QffLmBIM#EZ$1GQgN9peCRgSSL^FrW^t%OBm?+p!&cX5M+oQoL}>XqD+Crt5)Y*n!;F_v=A zIX{07Rd5$7;QH=$|J#F?j`}H)+y4k9z^RmJD8$R0IpQUamiSQVDGX8Q(9g!gSotCA zGTDk^{B?~E0m(f|`1{pYkwslkm<8gi?6C9C<0R9G=YFJ^T{#Z)iVjqt;3z={_j?sW z6Knr_{DwIAk*RlXQz(ru7h}bxj>8~(-ZOW@HOh!6v?l@5oQ#+~ynsOLaMC|HK3%1- zab%9rOL)LQ^+f3x=&Z}_O9I5gsA;oDiC&LPQ;oGdBL|-d+N8pGOJkRDGTyRfv9n2L zD#?<35`Gk_v>Ai<{H^3D_YiWM-Q~+y`nruJY>-YO#NcX3!>Esu3X!5(cjoNyKA{UZ z^oheG%fMR6S|($~Pk&%16VYtp)NjUQe$4KB-}VbF;QTQWff@b*+d-qXzM-}fafCkc z;mrY6{I*3ouEA4>AKrngKzgO#Db=s_u&JL66jw}sL_T!nC4LAkQA6DNN$`shs-HY< zf9e`a4r&haJI;a8r``XK#fV%-;o_jqsq;Z;8c zHOr|)z5e>yxB88FZ)h%cgyT~7?%mxZGUH`uir-|s;;~mD$}94L(u$HcY`)$uI7L&22n=zqC#&MmOB-cx&109)3ed*ld&b0T??E!A zaQ5&C=O34xy{=lso-N!k#d=o*T^_i>)e95{sl_X}K*L0+M1F@G^@0<}@~or0Lmy}7 ze3_?-ym$l}CXYxf1+3?h>sFc-Fn7YM?Wk>(YG1e*Am(e>KNYt^79?-Ln#9_fhCht@ zaF#j_^Drb{aNsm^R})E>pm$r1Jc+XzeiM`_@KwrANh9h?o2BB^VF7ji_X9&nP$I(c z$R&foMT12n`jZzq8Tv1V!iFL^=Zq9>WNP2Cj3P&#CM?As28vh)NJXAV>@?NkH|Way z;9hi8bCw&k0Hqntlij(u7zH1fp8G7xUHUDua$?`|wg=_t`L?!jqT0t9mbZ;be_hX% zZrbfTBXJf@;T$u8DnR%1S4Bj^A=Pa?Tj_2~p!teJqcQl~Y4I*M4)X zrgmB3=;e)6S&KGHqN4`h>RLc?Agb6zmFg16%0)!*ly2<=z^XzjC--f&yc$z}k{l8v zr*wBc#LndNMY2`rd%ei3kG)cCUDEgv$5sqXNueRJ_$2LfrEN2FPc=vG+(*(t&hSR>C{olcjQ5=w5 zo+(GSzL70^_N~4lMO|;>uzxGyhrI`WjH35PO41+tNq^m!euv_1)43O`yQAQSQiKq4 z4Y(D%K{T{cTC9Xnhct&g+znJKFORu%;9NWwxJ<|7Shjsu*yVcLk1A|?gk-@;D1!eG z*N50=y1GnLM-^fM#nTYC>KiIhy7dDE0mp$wdFLUvT4(Nehh1gm9AHw^(c zRF;}6gr|1+@L70LinXKWI23`KMBx~VP4Bmz%+&mIv=*iY^|sHCZ%12qW=spd#GFWn zfB4cEV8c$KMy)9K=i#}OK7lxPKt65{^scB_*RvG^(lbdjAOD<{Y}~7*w?-w~8QT2B z4;lEQVd`5WWH1aGCnraO1M!0}Ykjhk^yrQOJ3)#k&PsLb z9dG;0RUdrl(<#DVK5-2stR;CWaPZ_nXrS6nhZm@4;tF<^W$2Y_To3IDtvN^vaw>*b zhUE3{rOayc5Q|u}T68oxJY(0(68!UGdqOmnJH*s3>feib_*HzNn65+bB>tQ~YOjg+ zPFX+LCu^MAF|byUi#JwuL9$id8NqiSy`MR^ch-n8`3x`k8>f9EJ2Oyew_+rFWC|oH z%)S{>+^NdNfRGWO7Vu-+YqjQ(9*=lCve!;dJ@tb zT3-W81HSE~jL2VKIhtnr%qP&2FQ@FsO6}#RkJz|aA(wj}3KC70pxr5p*>~wq&idMG2p*?cX-(#O4#;<%%SBCl|ZiRT>cG)>slGVQ(96` zv2|-5YCFpOWP}CeC0b>7@D_Q^CO$viF?>YZI0$gTYn3^77dNQP$+KQs*$-~JbBpltWHex zO5os|peYe>W($N>orX_$3LHoFn<8!IU#4{%zN@}xA>YLsuxU2{p|C z;rak)N(xnKMKice@DWF-6q33@N`WVqJn(?;WXsTv(64C~k0mjVg~$$eHpFVDL!+^H zSlQCWhUvcFU%9ID7N(vQoHw|XhAfx0Zy4zoC3Eg6+At}8k``*o;L=oQxhyKXJypDmv{@VH2Wuq`-TagVI8mv^G6h_eZD)=x1Whjz6jtacAA3L(zEAt+jEEf8rr7hV866yh*W7iR51JYax7|g$~#vr0=#GO zHSo*DW`SiIZ;AS>tlFafqWM5|i8h-?T5|RSEACgmPj~jGO%2B3Ig)cd*Kz3VAENuP zy+AmpZL#3&Kg3j(U`3&=;oSDrQMzYSP!uu6Z={7YeB}3apTFhCkzgdKf(@O4q3zKV z&S;S`57rO)$g+d%|)Am>a$`^V8yp27N{Z3F6GqQwcg94j@{yCd*mQ+LqZZt zx<@zMxj?rtk8a@!mxc3D6_7>fZ|=!>VO9K^n$ErvsAJCl>mx>2(WjFrC)d;{LV9)h zj-!{D`u^zIPaLDX8ZjLvz_vYd3xvDn9g3VEtzlDn+Cn?*(}xlavgdML>W}22j(#Su z2wMg$)J0K+m?Epc`lt)o){Hi7wU`5M%)VI@h!ej&^pZ5pduJ>!cRijNb8~S?wi2Bn z`s$;X1XBc zXPiZXf$DkPWWeSCuC5+rbyTT?oysbK!;34!ON(-o=y%a4{O-(WD}c$2%*(kNGv_Yl z%7%sPF&$+WPv1*W``kZBXRWnRz;3^sWPUCnq$`)-`}{5LM(U)R+1A0lBjIkZ!0sY7 zB>XkGh$*v0^F?BMIAURHbuoh5`|xiVXXdl*p108_7vIdkGmU9A?vL_47YSov%imyevo>suD0|UD9n1G>q}IZ1Z#cn;-^5Cy;K&RE{-8CFxy}? zSA4?O>TC(%Ha_D47{w_+k{yld=+S(sFPehQ|kNs%3}-cf7F4i7V!`EvF0Cv(^r zN8qwh9ttU9woDzx0f9@T?cH*@{PosQ-0!IxgHS+wdEYns+x>Lx{}j>LRaJ~t1EQU$ zM+Hd|WppkO_*J@`-Njn;Pp=dVh>1naWxB&k)u;zsDdHGddEmz{BwfB*>u+l_0VAB2 zIWt(47f(TmzCgfHxhpN*y&7@Ac_qz9-^<19BQy|j>zKg;FHB=!K zQ{u{dUGH!#b>fA#xfYOHSJ6of{)&3Nin+(@fLU2}WDsWx3cP>~Mxjlk88!P3o$lOO z>Ch&$HlzE)wB$*MiF58zJ?QJyi`!^nL!F`hi__3kU52Bh1RR%GUmdqd>ppHx54Psh9SX7-}l;#uSy&C(T5Vqh!gipgDud48&6m3W*28d zK~Z>G!k*8=fsg{8liN_zfNQ~|L$=!uCBl~YGlRze4QNhlY|TqjT{UZ&`j0rH=pV^uST za))Yrn|cP461KGHQuxJ0M=xZEwg?5c*gXLqu55$|T*P2g8h9kBzF{;;43fD(-vZCM ztLxWp%CDitH;FM=6priZ)C+0zGMs84BSxL^ z>Bi$v$()FF0UbfSG~3ulS@1a3r`_9!6DYS>bNkbGx7DrJhd1TISq4?oa&mrkaHMyp z0m0%F>U2|QKl9*>Db||_1s!FXx%AXn;+S(s3z9yErN-iS1?%0UrORZV^&YYQ6-w&Q67)2 zMR6d>?)Yyl(gB(dK0!Y|B z%)xDdqxW#H?I``(?FL=xRBik7e{bM0YFhaIt+N9`%g@Ue$yPr_Cl?ZNFXXF{d8QD0 zFHA&l)~Nk^0Ru`Udb7rq;t9`p=1~W$I62fITa3r8#toI(YisSUojXiOzNa^( z4Wyj7@>5JO)^;y#7_?xr5x(&IDc07It+)lqcu`gmPb2TO#kM@(3-TgM_ME|!0di)9 z;^&Fu7-b^Ktl-aVJAK_k$P9YPt)f<_5_dQDW;3;hjYlfJRLBf00UmkegO28H&=r4A zVYj~*#ZtQ4`_JG6KYpQ4CpJ8@x@x)-v~CV_2+RvBi;h;b#UjLBb(YHhvHH1Hy!l;d zBPcg@A_CMyo-ZcJc%gjj;_Gwj`v5n$u&Shxdw#k*EbL?9>_-S*#=l3B^i$px_fyuF-A`ovq3VCx;E zoI9i&q4uEM#>FChN7_gW*C2eSaK|mE1X`FlXLQx&2tHu1U*Bt=9DdJCV?Zs-E$o%m zSr_C+G|j#>JImVK_m-;1$uKS@kB*MM_!9k-{-1yd)eaz)spc$wNw(!j^+|$PMv&lQ z4zRrcD`e^%kej;r_P57o&(Dc$){R5FISOTg(vk!?hUsh~tGp2IQ0%?7UEk#E5g149 z!!RIFp%;@s2k)*e$(qk}e7zFTC3$<~ih+XNKCqGvIS;YhYn%IEu;&{j;E4~p1qOsX zs1d}n^_A3I<806I7A-ARiUDJ`6J!L5d`N|75qd`EEAh6vnxKmanV<(BXhiP?*pQ*G zon|B4LwtME=yep$Cvw8d(8V#0mi9`EYu&H-IM_v7fx9rp~pZ-z?_iUQo-?!rV^dOwPgd6X2?5ERo3YQ^P zf8r7$g949mW)JMDvM24GHciCz9;Hq>~$P_?89SN-RqT>#z9e{B>nEYVesRJ!bWOcPP zbMLb!#rp)^)uW@}vto!?i7s5zz2(*de~D(2Q0_S1{*w5PGH%RiR-@V9g-ur}4qVIU z`%W6Jz+C*&SR|)@RL5G3RLH=KW|&mWC-lM{kSbJ(4eGxR^_8wJO-`(wWMe&smJI>U zbaBnoq5tc_PBvc4uMgC6<`eZMA;{%=9P7ywuIDgJu3rzKClxJ|!gJbcB5$lsn%@}X zT$=#ap5E_C%Luue+Xa)6bIJDfAEM1~Au)6&Px8B+12G)VYcI)I4kiGG>6>Cz7om(a z%?=T;0P9n0_6K^PSPDFwxX%GqO|Vc;=I1Te!R$VIF|-RLEZ1|1!|#F8BYPteiwa@%!Ef22^p}RUQ@W7{t$uzpdA@zdMCBC@| z6jM^c^2#oN#y)R%s?N?zM|xQ949x%WL2*eQ&+KL_?<9(pXFcdZ&fSd~Y*A&0Tf8W`EtPE9nQPbWet!{sf%hL0I#y3)Nn*ukmc{3J{ZAo0fTFoN3EeZAU12 zi$ko45~QoK^ch$IST#;E=S75dRY3{5kBPvMEMYe1$k~6Vw$n3Q7Evu#oOKk;>lniw zcn%~hB$AOY98@Lu9}oSL{%S)@BkMbL-8EmY0u*Oz%P@#j@kcCXbrdFDn5@ zSB$#o^f#PNG~Jx`#5hP}&*Sl*i{;fr@ot{A9*+}081V$-HuiY%q(^iQGp1Ca9T%vt zvJp}OJw}BDOKxi`4w^`i>i<`f{S(e+Qr39!?XCRJ>f2wN!Zn*yLZ6jo#Bt{jQ#z7xV{9fYLE! zZGjw@b4K&ev;eu!^JI-Q35%Yz*%0cvT`+SBx?F!2D|i7ybfVhG!-MU5!K!`fEZg%T zpp?+58L_Kbkb^zzsdoryFE$Lo-0nXbW2g*C3EQd({F5fpH-O&7LSzzB07qCK!sER_ zH$U4!yWg4wJh+@FV)&Xp`@*c$R!{gKo0r)D$VlR&ZRpZoPrKgw5in#O=rOfuLcP_a zX{t)jC-*KgAZ8L-4&uWJ=XQ6#P=VJoaDY`Xu>7W*M|8|D8;n$B0QD(;f&)3!*+M;dI)Fgl9yC;E6yCiysoeR4bT|eWLB;y+t7$ zm_!=y`h!JU@8;r;9_J0mQD=~JMPHaXg)ZFMlQQYxXCuz3E!SBG&j#sdaW7aZ0ux-R zI`3K=6Sw@zSvUZBZC|U0hdV1PdN=vA_4jlvRl+(PMvgguP9i`ahbUWcmu_bQk1dZ0 zS|uO;xR%H^z6mWNvw?Wx318bgi@$zuayvqM;|1wq{lPUwb6;QS$xc%buokcqR`pFN z3t|_eIXudARvOm%bpa1p)+RZqR=F3Zro0*}Y~y&@KrEuM;xan6T0sN`-*{s*GS&Vq zhit`(si>iF*Ui`!KEUOxU_POaKn)l{yljPiBuv>KcMgYCTG^Sq-=;gBWTZj_o+a@W zLxQ=H+Awkxu#?=ZJqahB?!{*y$U}w(AAb$4$GzGePSPr zjb!46sUOlik0_ys_<}HTEr^q9sUL@Np!k$C-LVe-jcE@3wAUl|TDR$cSb$)`oee4K zv+W%UaH#f!@utAR1?|OY0h)$9mg}7$sUbKeAJ$ZuJ)tG2c8m_Mx?m>BdT z{o94J-u!vtttY`VTwTT)eA{^AXH~cMx{YE^hJ3NgyPg$__R$Mp%V5W;2~WhE8A2#- z0zFZKb8K8ND@y+&y{xW{zNE(WsDq?#`qvF1N$$vYvLi~#}>_nkA<+JzBSkxbK1tGSQvr1pj1?1WVd+=VQozet< zueGK|0*!`bkbz}20zF}n2J;@kv>_M=j?Yu`2~0}Mb(GYGS><{%$V`VpMNdpjcq~Nz zZPb5vx-^y-MrNb#@E#u{+pT_gXt++y1e`2d@tss#JDERh47RS>o<|&mUaeBdReL?Al0RNGTW3H!)o6e*krtiv`Oe$V)cbf7T%BdSHW)7D&8;9R ztvj>-oMwZTL2EN;Pl(gE&Ni0f?@~9cCJYZo!o6o93AQpM4bJ>kUNw&W#Vh#=+er`c6fvE&-H&?2%y>S7h>8m5 zl6EeEj{b-n$;oE2Blp6xN9CNchC{BNMus*ax* z!YTHC3D2x6Eqa*ock=9OAF-Z4U8LZdO{^Z!3!d8gRQWVyfql?R(RJvacuGuK``3`6 z={3=9ATT-6pJ1X#?#u=J;V31ahWXir#IpemY_+1LMsBYyhkwhUsRvhgx-+8VPByRL zzLCnHs2hUh@X*9ZmInD4A6mqDz6;dNs*qkY4Fq@;U4uFbCIATWYU{fBf*WZ z-M1R;T4@p(J!#4yr9Tr>c4w{lwu$%eeL27oNu#z&n0+Mgx_HEN9&UB0kCBWXP=#&W zC!Ss)F^cvGO>LW34YY*WPFnU*<_yNQi9Ycc;F*DRkQ}57qA=)0P10b91I9#WJ5;zv zpLzVz44zrvO~TTEWsd4YfnqcQOl#ylTM@8rV$%m%r`?Iu`>36WxJe4DI+}HIh`DOI z_V%DjW|9ZX3mpK#I*(~rYSl?^d>U%xXQ@ImVu80XO*<;s25;Ku!P*3$Tm_oNHhdEQ&Mg3zs9K;MXZ@K4oOGL%?A0tX(pkS0+MN6+2&e;0PJW^qLHTtKF zJ8sY9o_(V|j~^#}K>cDZ2#|{*;Cg1J%9(!X#g2Z%+#hQ1a#VM(K}eJ3D(Fosq=- z_!r>6fDxI6vzwon#Lqm)HXpduHQ)4?h!bcF{ZRquCq9$`NnJpd6VL`wZ}UnB4lYwA z*CJ)Ab%Gh0N6J6)zX5hH^YD;f(NWJ&iopUg=uRH>di$K#kpF~2c%lMxp{#?ICLDA&LU(Gj92B|Flma3FG!c@`k=}dWGKz#JD z1cvi3q=I~AY<9ncvto^^V=k_~eY_ZS8=|A7eEehdDsa&&&P%}|t6a*taN*fuuLW&W zw-cc-e+U}uKl<3q4tJVbneHwX($L#5@jQi~@+P4PT7d4-rBSbq8YOc{-TX}OJPw4F zHlup=gogjVbl7dHE7eAA*pHQIn}q8Dax_- z*(m)*1?l(AhhUN~F$1Y-&>w{Jxu0OT3m4MQK%h*_lnv8}`43v(D*|==@}Zb={j=gm z=RZgHIu?7U&YWDB;?IUtOS{T|E94a}V1g831xU7@8$AAbSI>v1>uo>e2$@i6xO7KZhRsUy&mtg6xgy|iEw&|CP)1IIK@-2&@m^3(LI|Rr$Nym5L z5`9DMzVyq3;3A#hQ|T|;THk=9V*sSu(Tjai?b-B~wXl!ibVw=aNs*5}%yUP6doK<8 zq5$PngCGhV{b`a9o(=YufO<4DQ&uE-vV?zIxcoUl;K49+Fc9y=>>?o}ms4})0+D!y zKa#D}FL9Kk8j)j%$VOdFp4c1&z9^A)C28E(NIWpN`96vfzBmHW;jk@e18`uDEU5L{ z^Y5M|QLfOi0=>QbPP*_!kSjZ?k}CM;Bxv0={5@ovqRO}&C}-gdw4$qA0nLxOvlAQu z-0?p(6&8p9lLzyq^{2Y~oNIsi#y;@~FXdj{4Jh2VBG*1{2VHak0BDW3Ue!IwE7Eg0 ztO?DO@Re?s8oO()k^yKkki>ihVPuD^f{Bam2jaBTiOeRBS1ZJ|eDfOXnYBb<14C-o zrOx&BkE;B$7>kKN`4g6)7njr45LtXc9~9gPCOA=imfCb*I>J6lRui5vv$O|$^8wE> z7kv2=@OhObHFn*WyIkVSoqzuXL)*dBZ}XAc*FA)4ukfpbFImGgzfjRO+MwiVt$_J1 zm8mnUnYxUCozgEO9s%@__TVN|OFXe!KPUq~kATS)|5dS$4kmNF!P(MgOipt zkVdUDbvwbSxAKR9m^_(aEHWn+-u3=O8#4KcdMv#p`$ss^sRFqTI4< z0NOg-6-*Nm{VFin)<#bnHTFm4pLjQcyO{Hx$3j6daG#5Vw@T6hE}A#2%hyB>RB!d< zH6>&WQ_c7_=a+<9-)9=6+D(@vqI&R00I>*=7n}pE>&u%JiCP&q?Rq2ARL1p;onZ+V zcWS$&@~`P8-}{(1;?IZoz0mt4zA;}h>mFi!RWjo=%M4kbw4Dwrhj$8(rS`VijucOi zxS4(mqNtP8MUrU4DZuZe79JAtD^|1fI9pU1`rp33-}-xZI|%g~PIuU|8!bh_82jTm zzXcx9fQTxdpcg2_pJk?YhRTm^-QT`e+@}B~TUJPGe?ONx7YlO-nG5yIn_rXbwnx8N zW?TOrJ-0{xlS(ABKgILBlv+{gLEfZOfH z-$H^(59kQs00aU$d%U@Nk3d-!aGC*Ae5K!LW~uvW^2QWkPAYL*=Z(_3TbL>;)#C{_ z!lOoVOXk(u-(aQF4A&{ELw-*29T1>~r9Fda%c=2EX@Ds3#TEu6LP&ShFQk(?eY;HC zi*nOHl$f!95!z(uH}nUwEIqXbw1 zv8}srqQZmoc%YNAaI|_9{!9|`u=yKlVCZw#;NE0Ad75I~`b*<{;nx_R0rxd~#kVSv z=Ii1%AH{`NJ%rB>-eFdNGX5h}2x zzrwlA)yL1R4R=RXL5FZIgl-u?eS*$j_84W`^tT)UYFge)w~tizc>WvH>cHMfyM-+Yx&)=@c*i5Jbo^ z+%(_l8ZOBGmJ5co!^aGdR%5V1V&SvHQ1|Lx$G?#Mz#!xM2>s$U>3ti+4H1Ap11RFJ z3Q*oCN5IBd8McgL*z8-a3`NTa!ea=N>RKYp6C@}W_ANbm6wq8g1>5GdRC$>iHJw6F zz2w9>#5$1&HF_8pzN$LKqN#}yo1cmQi{ye16Y>2j_9g zV$Z9D#7_IbvY;nfEhM53EBy`IPTLrw)%usrXd-s4X9c>!%neNC=br3;#rWEj_RE;u z=J4gy?{;_tWB`8;*v1OBcWU;5^K$+2EHghdI*$Xbe*kvhg0>}2WYh(S6~H88$nV9# z`?J3qKnt$E;u>N-a!}*z>GJYR>#lvIw>?=tW%5PgDfDgp%nuq9icoaqB5(P$tnD@p z9@}@0xcvL-w&o!E`Ixt{;zG{Oizd*v|gyjou~gtR&RdOyqcPZ<3_}EiZ5B%sdn#rzb9}d*ER9 zqhkbZCOY_c5H)Hrhlbe3w$XX@-sB4~BzgN!|D)JSoxqH+0&(qY1eDbhnQv}a@c2IT zmYir8#{REqEkn0IhY|W_kAC(driw5BRT`sg<`W#Y%&4+r41;RN4i1B(0Z@KTyy>&M zI=Bh8G2G9uDG6PEp27Z4@o6e@Te7QPSK7l0z2wpyTa&=Jqof*AGmrH0MiXE68P^D4 zeEd8=5c4Tujt22H%XZeJvPEQqlGJz5oIDK$t&VxE6~LvyRrD)15cE7-7dEj-Y* z8@_(717&w|qN>lF&`n2DO#zBLa|rvGIII7SCAOo3C?kJ>Y=CEql( z?HKDDbSZ?dkO#uL{_y-|enUz}_8cJ9V|YJzDMU17ub`lU5w3^Cc?1TrnZ8^Erf(K^ zk91r)b_l>yW~z<-&76GY{lWktt?$W*SwhVU?y9sDCcZUje!GATHmiR3nsQ$1tO2CL z{NW&_(H?gqGU&$rLC00oU|d>8Ujp<{cDTMWR_3RGMW{}m zZl>-2s1!W|b(<0zM$@bq=qHY*{q`x0`!l2@>(3kXLL6Kj$+``G_6CF3RgnSU2I|g| zbp^hGfiswDR5_i8);Z%UVs4XC_vD|*JtK&<)PDW|U%xK%oBDZ4lwz#ei|}DWmK6DI5iv{coQaTTknadI zKi98sDU&T{n0?zaFx%)y@*Bz@Mqd#HYJQE3%9tfJVRp^xUR(0OcW&n;;*z%X3h z-poZ5zxhnBN)i?eQQW+NbjExa{Gr`-?}Zxe#K1=T$kknAN>k+eW8vO#k^R+skA+1d zmQXDMmu>4gDJP^N&2KC(zTcNEuBeCkC=;7HPL0eMW4dhZ7OVO5ikmAkj72tQ?>{T* zA-+fX(=j+Z1nJ%P{$F@%@#~rWs7S9I+}$XU!_3N32&%*^Ei0+;uW}HcG#+Pb2*=X3yLy6XC(sDidhBA zq8CSevms&jFR|_K1q@-kYE|XjfilF)>(69d@XVE;G_NKejJ@ zbZF@wj}!oWvii$jHh{a=>ScD{N_$k8@JCif?wjdd3(!H8=jv9Pehd)$7(g$ff)XUO zoYT50<@4pQYyE=-)GWn|RMf=NdBlbT8S86wk0sRJuU@!7P;uqLB9i;$zjxd2PJ(#F z-A;Y>+FTx02Ed}~Q&<0#CwKm#q3$_nKHVrw`pf5MW|UASt*8eH+n*7ylJ%- zuL*U60sQ(z+yf<+?&D83bFbfUVW-P^9steV8RH%%EHHhFR-Yplma##wGA7{LQpNM` zdQ>!vN8#Zk){swmNf&^@gH%bsnZ{NFbUb``0M62KxGMfX??7LM0z>yu|!Sdo+LEeHALcHhYl{k^Q%MRVc z*dP6s`J_5wK{Dp%Fe*u3vNmmDXjVl@M>Zj_tWy@H@s%I@ql`e6IrD8S+Jx_gjR z4lZ*sBS{iwhz>M}RjY37F+eCyPXY#dS;{usYYorSdhs;Loc>Ef2Y$Nh{ zesi;2u89xDJ!kn%4Bz+jHnM;&ps$9mbpszGyiP(C-=j!1q4qF2ylKU zrDxO|`Fz46Zvnt`BenfKz-vd0X+i+Rbh-(p(GOoPRtQ;OAm3)0U+Afu!yzj`jibId zf;n(bJ3a~G`ti0s%M*Viw}hae=B=9VDk|!$x2Y4=?Pa!u1vJ25a*PEdl^iG1QsR>V zqOhrMPr}bwp=7RP4YVYK{!}xm6*UB-~ zwtvY?jD5BIaJijO_!lu=1|i`#=kEhQf`&f*n1@*)TW>$3+qoh`F5qLKi-%E~MAODs z$tv>}mvc4=(Y`u-Z|C`7_OY821FZVAXfp^Z4?ZXfbD(&>OWLhfue$biw$N)^ppUQ@ z6x2EA@GTjNP#VF(*KH2HIN<6NxGHeaHKcW->rOrP>|}kvUj6uMR$2Up>n%X)`>fa& zZJ{euz&M4Se;`TvT;Kr*-;OhitO+h49=@vr$wQ0l-Pi0{b({);*ExR=wIAnvT2GZ) z0D!@ktDl=dSKlvG#O!X{#6Dln${AVj5!np7q+Ipke&%w)F2a)YnSJ zFiI(-c-SNo0bXphJeatbP|a*UyvP;kd{EWN3vV*&`yF{gnO!SFs=rtrF&{>a-SYL$lm7qxulw@9}^N@*U-@PO2({>9Z-WGiAS)JsjTa%XQoS93zniyI-) z=`JBI@*U(8sor#=t%eRX+XHR(CEwqC#};?*_4v|x8b9XUc)GJR=YROe>CPRr%{IWX z#>MC*(?!-Lgfn2wmm`*AHdcZdijqcYG+Wa@i&}(2H zQN7sHDC@h%!nc{4D^MM%WA&0K0pUX;)$9?w5ut^cXbY!cq;zZG+4g+FasNS%vYOIb z{iN!S>%geT8-Bx!9TxT0QFJ}|f&))e?8#|uB zFT8Sk|FS$g_`Rz|W|iIojhl;cqp`=4Yq0~%<*Ia%}+ zKQd{BXOuYp4-4Q-9!PqUM&lTLUlM-xr2^y|*=>R8>wUCQ;8ITac~igP_dttIpUe4A zpwk;d+u&rg6+PcFH>5DivAv@`DO8)GH;W6~j8gjUcF%$#tk!zLmFg2o@3^Gj_c=1y z=*4V;0K+&9{wDQM>G{wo*?I2)O6w_Ml=b24HuLMC3)gDSi*Z8cC!zxLMeQRpO21nE zj_HFd&|~2fs`wyTD)6^`pYl5}*!Dbi9Bf5MX9JoG0dSg)xP!*hC(fBk!y}cHMH=T$ zWqPspT)$&vYiQRKk1~b)foz36V+_pRoSrcM76`E3s2xvH8uvf&N*>?L`Q9q-ZAF%H^?m=+5q^2KI|lCA zB)oM6_%wkhVs?tlcd+y9B}XIMzvmL+&%)3Y!yZlfbAMos*-9z1(XXDf5>uP|&|uv< z%sgEa2y14`aQG11;`%m8IG%LYRoTd@zpl)r>~YBl_MKL5l1DE!Hg2Rz7!;8n$-hS; z$X@Wgd?JG%X*--L;-0f1jy~d`T0r1h*oSr0&E3}Wd)MojybE(_JlIfmbC;5#&-ATc zTiXvt7>6oPb>Y-KSQz~q)E844aI~c-6Wn+THf7uO_1QBY!iwthf8v`vRGnnlrdoPp zV9$Jgfq6mCq#2VVS(WC+v>rmX`T1g5^xU=ddA#;A;YfLiRDq#oJdzaK?e(b+ZR)$a zsU! z4P`dd*55nNXDpFR##Ma|@>$z1&Hb1ppQ7^=HQ?arINLLU#+sj!+h(PQ?$>VtMeht3 zYQe{ErK{g*dX^6nbOwvpggBveUObog*=!_J#LDYnj?d*Ja(}17(2+pf@A|blRP%AS z@<@567q(@GdkpqzC$9RMpGtb|`kqn~|3pe!-2E#VXMWkS$~-aE2K)y?Bt8NQkKV8y z9J8eStSh0&JxE?G*wB3+OuwY*Mxry-#@WLZY{&_nVU0oXcY@QK)NkSfXbaOz_sKRz z{i4kIKbb4n&)kFUO2`tSHTA#oukv+$gtA`sAzf3F!Ku%7&_5a{Wo1&GJ3I|1i|FyH z;kk9wqum8>y1tGl>^D1}0h?!X4o3Hu&UX1T&^=yzj#0oI(;qf9znOhVeAr;=y4rHn zdKcjHxmTo*6lUwH$#c6)dz8Rz6!rXJXR6TfzS{2|d14l$`&aursPb; z>s@XoAC=h-qSCs6q9M6`N)rup!8UE+qSZW{vzoj(zk=oFI&gKN)o~|0^HT{itQ(4~ z8h<`$ATO$-7${BT6rtV0$nxuQJpI<%ko_`_I0;MlM{z9g(i3f*>C6UQ>u!u?H5|8y zVY8>o=R{PZ7%xVDhJT2p)fTh|${v0DFkJ5pd&KoZNT}RrT0lQ15;?@@8q@4ig5F3- zwhd87xqdcP7_K#qnwY6aG#zaVSGH)%xBeCCqyr@riR4RWqYfb9mBnP{qU_^YvFb(D zS~Cv}(h6Pgm1pG`I$VLpPP?+DHm{z4XHShGCgW6i=0IOZm&Othz}ruj{4|h(W5H(Kj)U<`sMldY*7Bbukou)ULHp7KRk(wq?z}z!B(Dg&zQK= zLnDhth^09zP2dyy2|iU1#fxgkPrG}J6sR3HO7Sm3Ru(@#_vHN?WKxgNot#gguBEy+ zVfSKsE=qTZe#Sr2yc+hN?48dWjK2S)=_;e5`o8v{#L(T{Qqo-#BHi5#9nvkKbb}z> zA}G?`(v2V>-5}ip((oRB>;13A;scABxpU9Cdq1`B#iF2lqaN~X&P8G%4pUk(t;_!A zV3c0%YN6BhcirXWbJ-DL1Gj?Hndg?uf-{o_>gh)%TSpSDw?6n{gC*gkrmi>F!hP4X%X9fd5x4;S~XKPKQ;B0l-+8Iuh)SvQm^az$z}2@ z@}2!pb{;CrAJ_4<`D0pL-EON5s26aBVlf z^Fd3bnI)(f8Cxr6W4an_K{$utoQ)bOA0A*SFB3Nee_s#K9JH-pBRPAs|kycZ`_la+4K^eDxjkYYLzgrHQ_JpJr<#G`> z1{IY{_<4Uv4F8+?Yh2g^f$uPnqW8iVZ|2f;W={V~_VsKt4~oiLxr-=S1&Ay((@4)C zXWRMly8y#&(U*LrmB9N%1=ff+s2Lx1CgMQFh2JL(&+~DZuwoRnT}&XOHi2&ZC|{1oLhc6*WEM3~U7CP9@jp?w5MIzpBRj~5D8TmI?ZFmoJ@`;t!z&i(7MexCUs7%GWPInqzZclBF6 zzb!KDQeGf(D=*vh4w9BdpkH*iFDA#8Da>K~QH;lsu2i>Tnc4aj@ml1_hJ+bjU9H4jTjIElG5TD1 zuWsjpBM;La8TZ<(-e!4sV22uTr~E@9^nl1pqT^Vc zsf#q6C2fEEa2RIuEEBHo?Y;Ni%-56kqb|WgbK@1x_m2VlC^>n#IrMN&RW9LE}Axvhb&>G!&dgFcXl595Bp^-$_7M&(W#dy zrYnUqMK`{-@*GKGoo=0{`)uIY7}e%Vv(MT+@=Kq`w|k@Ll(eKDj`cRAMVjubdlDQk z`3v3sS$ftm8tKG^dUYy{;Ap1njF{<4v)K1Kw5ODmqm+M5IItz6jc_|4y1KNAaK-=d z^Fk!4b^a#>s-#7I$98no?zL`J`e;g{&|oqO2D8~NB_RzFq+F}z+Ds^@9A zyl6)jzq(D9gDZ8rXBByLrFhw*SM6o}F-gE}xYUrL?*`!jOjTU%guUsxk=cB7e483I5Vp5m>^cX`e(x4Yy>_&fuu0Yg&-W? zHh+Y5xnjzF!$zW}zxML@4fB=a&%T!u(qzGR9GJ zYe-ItdNup%#b!AsP1eLuQ&nqs`*1sz!Zt4=_Jh{72|mrb^EEfj%H^MU#THw;{o0n5 z=7o)_(`#x5#q$!PpmACkJwB~{fboiY@+TQln$u41x zndOg3(w`KYEW#gadfzH8hQD^CvVv1wyhi>5cNOaov%DS4{${t^ozHUgF=a>IlF^NK z(~`S(;SqbbLJrp%WPK(=U$HolU1w80Wz|Qekn%9c@r8e_4fm)?g9_Tw zA9Ka_j5eUsWp7u{+AUF2(eR8Iv%!I2=90sO5?mwH>qhP5o2nywXmnQDqD_>ePOc?< zM#ZKqB_F)QFtw}o$`HMAwC-*VtSzD^PJZW=E$nu;@iYsJh!C+1+sNlNiY zxMZE{NLnJd+huqW>F_jUmVWx9Y0=!%e;=c`pFQ+;>c8j zs8H*Ung6BpzClgzI|?5;e{k&!J_3FGpZW|zGA*~VBSNUzo%v&|2=4`xNb8QQ5jfHj z+`0a~`iVzb3Td2yKTDK+jXSt9MH6Dwsyr_%_w-$8bstTo7H8b}n?u=KLG z`{wIHVZ<(*iZRaqzxJhb^*H+gW*IA;rHAFbB;}`e8;-W~8-p7g zuka-K74ud;|9pUx8(G?1e|Jta?_j+}F8qiL_S@JKuL49)mSPj9;j(8p$sy=Y=kSWwb$Q22N zUvv0^v%HBaX)uRIXPz5lRXrk9R^U;~;mi+{{ByvXLUj7>2=+$^CfPc}Wib9n?_q%z zKThp>xD|G)+(`M6dFF?T5(7&c^A?E0_7hH@z<4sH$K416_; zzJb|he7glC8@Nqo&XR=r+~Zb`mqBUblFuy4@oT2VFlbmf6>f%optUcZg@f?97|IL! z(T78q|JI>Zy0A&06dP#vx*%Loq_C$Y8|Ff={&aAWe*W}b+T0xH~g>wn5|fg@z5&r5D%FN^S(lVf~oJ zYD-^N-#vqP9{um-sq!huff*CIp6{4kZ)>n%d=D#U>RGlyq#ib47zz|38MDax96u3Q zo1!@At^9j_OY~%|ZLgnN4*%?^zGO}qW0k<9koXm3n~^s1Ok>(ZMT&+%Fzw6+PGw|M zc&ct=IK^`MFKOJy4hFU&O_Dl28LT`M;n-tFQF6LYpn7D8PQ(L?GyE*u{$f2uGlGHQ z{otrL4m@{+tpl!`XrDA41@scT=3I<%>tFWX{B;~7r-C;vO%AZ2XJ9E?DzE^TTGCh1 zEHLGjVw%eu5LkR+6hxITfi+2CPDc@O{hFD2m~}1tY$@dQZEgKXA~;&C9yW;@#!VHvUpDR(vV(_tk8ux!S5q79Bfu)7vDc3aq#?;W6tmS3!jOGMp}#;Ay~MA z+MgD&ZS!UcYjKPq9gBV&BH>%J_vnCTj1pTlWnfZTtqIavo>%u zFD?yBG1VQBXN;c9&xEBg&<82q5M|5?h9$nLa%Wq%yT81sR3B&Ed_FCVS5y0*an@3@ zX^Wb(&%mk>wnrT#hZu&A1^*s_P#jq*g(Ic>weU{%xa`&F#hv#CAW!(b+wyYJ4CTX09Weum2QG;J z`Ca4Ov+oPR1VkFACQe2YmNhBH7Cnt#;k5kEnXX504kmgdW)l)Erw_5<^At+XhPLI& zcQ(`xwXWpTc5jcwZq3VUQnP#UuPt$L)AMw~OP_UE;6Y?K6d7q@-7DebUR2s4ugBg~ zAhQ4DCMDcE2CrnYIAHxn9x;az)>9e+HnrM_(8zxaZKj*Pc<)c2z*Q|e7FB5~CorNr z66TYVX4yGqgBD9W%qr!`{^N^M1V|Cf@C83qsRVGLKxk(RtL)#W+ap^^!-u`_Piu?| zi-W81FIT5YrkGlWCTFGpI6kU5CR|wL9T@Sbwoqcss_m$nE_p8Uez{5or76TW!Zan! z(-S^i=-13fg#_~&_G*7$*5t48+YTom~HYdyN??Zu%5(x#Ftn zw|u)ef%vk@>oA8!d~d=kjha*T>|sS^{{vqal1#DekZ?2O%D;V5l$esJw34~{Zkv`C*dKAY&eP$U`!c=-BjD@HX(UaAp z?(p9D-T`ojiwIAvUIfm`?WOx0rfqI*Pc)e1{SJbRZspo*)3@mev+@R#SR2Gde4m># z(Z#t`&NOOY+i5~@FS}Tw-)#OKk);7x>@6*km?e$R?Jq_yei*eS#!#M2KZDhU4D+m3 zKEzH+qi>D;TVyPa@Gbx{@EIPTj%K-FQi4qm!wRN2)qn}0;Q1cd0;|ELvs6HFS!~V* z!oTR+U6>)G)nOyC?oTm!L1DowD2%4} zLUhD%I76|nzuwJJxEWVpGD$~8SFf^;-BR zS}7D){E!ou#+!+-_-&lSrA_bj&cIT=jr+op675kXWA_pXz(I-zFR430} zO0K->(Ac~PfjaRCQRkB7u{SXb)m>?gNYA@vKE3lfneonir>AV9B|!e%!{n`K{lfc{_U1 zpC0&)KRODwmJj{lXS~@LX$06WpspoF(e|yTAD$tNnox2tN2GeS#+Qqa$?= zMkJvem{Czcb`#nA@NAJ{J8EI~Lq>-=Db5nJ$KpRrPQ}es1daktXMVdD@I^RXmb}>G zPp|Av=?i33+V^`7;0sE~ITe!mpnXl6%gEUuVh4?Y8h?;oOfk6}KGXN^(^XE?j^|L5Vg<1k7o!OX zwNo=ydn^1~)9Cr1ci9t7XF4|pW#?tzYWLDCJZDwulqUu{E(!O&@zg{(&})429G-UN zPS1QQquAaiMA? z5nMv=HPDofMEcjl<5^wp#Wmxe2b>p@6;&5zwT{bUCO)rckM83?8gw39Avh&_SV?M9 z)Vd=nXi*8jAx)k|my{!j;_=6L;*^{L zXCtnqCRn2uxyEHjIaM4_`rHKx-?L7z_VMhjX)~OgXh4Id$X0d{v66V@QDR^HEb_Go z-j9E5H3a<6b2ids10}HHeqrpn{P+@FY(Jkt8f#tOocnlCzi9I$0BiUgP5+K&mQip0 z$!pRqie2I7k1zRrON@e+jTzz;V9n-+`ZW^vPkS~nJ-b&&U-SK&Ce~Ata7xj{4HvLu zVzYx^vh?NuO@&EvK^Ic=AW*f$61Yw=R{iORi*k374H-ByuxC2QC`?91=p3;TQwNxZ zaa}bePdYKDH$GlOCX7gIHoOvN`q4&tIglTzYpI0mLK7ZeI!iz9E;pVk!xZv;guUFD$ycJ-hTBL=c@TvxOR`* zRbN~BRc`+*ZnaP_a;}k09+FKM{FU5k8&Y-EemLprrqZBtj;1AFD7;9MY-D>G-Q=?JsvW>tcdDO<)`Q7#i-D1eyQ`$dzH?A z9ttrp)F**JAp#I6DjlanW&E;DpEV)L36OS2j25OBZN5k&tOD_&W%KQz0X;ae;@;lW z1Pt(;f{qwQwvrX7xMA;v)H+@L_J1h)-5Z_=zArvY-L-x{Rwk_b`CYa@{HuLsL=^{l*k_ty=|mbl??Z!z zwbf*qR+mQDDEYqvsk@U+CArxu<~Tw718*?_BPq-{T&!qsRwazSi9eYsyxE;0;)A|x1A$v@O7v6%TFG8wfU(OS%Q)b*wpIu zU*jq}6PEwr?Qe{7*IkW;6LRs7`Fpr=r7$3E%(S4WX?}IlGr;M>yQ*M+*^~Ikl%apE zxJx^=$S0G^itWJ|xA#Du6bTo8vNfQQjFj;8drR^@myV1Pj?zK2;APXk!YJj%Z&P`d z%E8~Q*o5kune5xn$ihtv(FQ-tTl6BrB>b?zre73lFRSr6G!+!(2vHF5X+w}wexcB^ zEh(DwgByPj^6$I<%LvRagB87KscR+g%QNOrBj$PPU*ui1t?d7o1&HhCV_3`Qb-@~w zNGND=UT?NPvsXDG`_{l{^_E-_OHpHbHX3LqjchC0HyW_&_p1i}1hWaxNTX+8!qz@!pq3`0@DbnHAxY zL8^?|{=^Hzit*JN)C(Z!hy7bN`})WR$oYPCx65|oi_)JM=3gl{}&5;c`>x79FsNKJ4GY*$+5w0iHi)X;-owlUUCUmIJ0$N(I{wT>Rh68uV)rS;1Jqo!51zOzF z*-EoHNCNJB1jz1Qc^nU5xOp)(lc zL1E71+w$|C48T`Nuv)oTAS zL7w$1mFzW3_sd-{BViT-T%$fM5T$?{cCG{--`4(W8_(^e^=Ls;aGuB zD}VS7tMcEFN9nPI&+EGKQnhB4Of6k)BFz-jwuYGadq3A6RHiq@o5-}8y^>r z2@Je=hUg*FjBTt4{66DZpYF1GybUV0R5s29G*i<9Dal6hC9SUgIkz7aPKn~gXTTB} z*~E8*u6yO;wft@?2J-*oy|!4>oHvt{FYb@adHVC%lCUid5U(hm_JhnHMCrwCj6md_ zqVy1!^nxHKU&o?O$J6!qpfWy>n&=O{c`?9mXZng_P_^yXW>CAq`1m3Z4aqnRDAbdI zczIn))r2vOoL%zq1a4%Ev-mXyczQn+VJTD)ND#+5THvZHtp}pHpI8(nX%a^=4wgoe;(=;A z$5$Nk#=UZ}NI5$t4Zz(Yeg&)z6Co?O_N&zlgWtsrR{fc8SWZi_X9oXDH)iQzep+*I zX)&ljoIJa@TDDKk<4)U=;T$pm|MPblr{S$h>pZ2%*iv&E0>d>ER>%x3^gnxveVH*j zlo1BZn2R_3C;g(mzllSJ1wHE!oXEaA@AKs_JM^BhZ%a(7_%!GNcXs#$i9Z(=m-Z8e z$9GXqgJ2h8^Z}<7Du*XI|Hs81!g-6{Z$>jpP_!TaZHu%9eh(80b{4!&Ho969))9eu ztpX2;!ha1u+1tuS?Qs~he8UN8N&JMDdW5+~Tl{?(Q}2O|OfVNt4Lm2W5B=fQo)egl zEQ}ZG{>k)qrx%w!r?1zQS>r%asP2=+qxK8?y(J=@yubiUJdFM?Qg`AhFv;83vVuQN}Nb42cdhX-E2<2nULjlEB4oiyL8 z2vu6WhYAQT2B#en`TS`PBJ~sk5_Ib*|8Q}}LW0s@L5~;Zl6NziIyOOGw7@ODIJ;%yspoD3p+eogWNbElgaJNe zjO7jL)+5hzuw>WmMpHdko5VLcYgP|;$ou$>1>=Et7`0G{PwO}VLIT^sLU$5>`S(Qw z0Yo+$1!A2%070matFd-v1CRPyg;0qKVa?bN>}FCGNqOaB0K*suklS?-3&EoJqma!N z|74@}E`NV$r^h$|V`t&-&Ly}^ND;_=_q$kY6w`q*C+ZXpC;L9_oK;vDPX{3}{P*g0@+paFShp{ZPcNSRy zI=I>lpE;QeMJ%e&5Vq;4@HFm6`f7JlcFR@8Cmch8NazYo%l6yG0XBun(GYk0d%a#4 z!{gfCgBJ+qFuv>_R*A*xj+?V(^#dV|aO?V_^&iPq7In^CGD*ZwunyGoU*ifNFOFX6 zX|PlHticD|T)`Z4iPq}wRW(4u_t=)&S!8a+MxnWN&GG=+QYv+DA3o!GO)Bi52bBc5JAFzS_jFl$c zLrc9#xv8X2!U@lb3QU)$9eldoM(^z)g>z(ruP`TRB@2A9meJ|8wxlVGNDsG>p!Z(! zI#1j3hl>*f;G$L!8SKek>!I2Fs*^HJU*T5uJ@|iIr=CS<+-@i|Fs>eLa`J2o?q74E z3b+*DQ|6R+(j%T(GroSoNaF7(H=)(sryYk{nlkVkJDxTGJoma%Q#K2A)d1RAUPZJ~Fl z!cME3ZM1I709I9UP)7)D5db{W^AH_7o2?Vh_Y^dqd5TaJT#9i1i$vB&5)sF3=v82?lf)%jlvJ&*$OhA+ICOKWxe~ZijAKHnBoao zGEA??$BW7PcDwk<8W$t(zQ3#>vPWHi-XG|&E>LdS2lM=d3OS+_ERK@Fl^CH8^>|7s zfp~xDT;hucz53|WA#k1`DSq@ zwL(gGL{Yq^amj%XwGrSP)I#!A0V-Z*NP}gV8IaEaSCnAD=JaR-Ex%mHYXkP0aTKpE zzdC&}y%i2%9vcbnI07D8Mzv63fbiYoZja=l&r}zG1$XOYR6e@W;v+kAO_e=G)4J`$ zhd^uq#4GVwCZs+leUp?-3%XwAlz{9B->7NM1hXU?J@EqNvdcdB0n7EsP7^{h@-e|9 zLo?C$8|Jy~|N7k;B}-I;oQc&r<4YTv$6{e}W>#$Hu*D)#dY z1yLKT#?Yf!6}%TG4%)@ggLxejwPw(ZyXWQfvip96t2D1d}RLJ$bBFLgiVNh*Iv ziQbx(wB|##*&~s5k;07H_jN8%4*o23Y+%zw3tV`xG;50EKLMtZ4Eywgetqg8g7lu9 z;Ws8=5(!aDw1;aTNER0N;p3wa607)(7n*n7l!uU_Gbe|sVOSY)Gyrgj@DeW&E3qKe z8%%!_s1{>imSOnJ|C5ueF2teu$Sl|u?3a&m9y(-#0zTr^f3yYblnk(S@EbJQ9vX@t z>e%47m^wBUuQjR2cV(Fem z%yItvyYkNEi*E{$ge@w`#yef5L$9d0bmLwmlgW!Ce}PfRH{q#sVx~*O2U2q0gvb6O zRr*CdvO~%B%8ADu#Gh6Y;0{H*ZGd5~#2o_CcTZuzvBN@pMw<{&Jmu!ARyT>RrYCr#=O_T@Rv0CUc&C|I-7C>wLE1A(zQA}F1!TbsaVR4 z%(`OZN=HH5J*CMs##wlZqDoJHhnEl_Cl#7xN}0of9P&RxH#6y>K~&%;Yb?=%g>zxZ z#jv-um$l#J+4~yv+*F2eRh9pL$5FzX>6E#o$?G`pjBPOlQzS@F@qNDfzzg|!D(F`# z?9+h=^jE+&_#CuZQ0yVif%>fZ#=TK<`a@D^nI`im@EIE0}r?KlNqQ&tP04X6(gQn+(2{$Hg;Zu!c%kK;{k^lHmH>Thkaj@^Bwvt z%=fP#x>--KKEgnX0sFr)EhQ#XflkAKmuWRDF>|qFxIi+?{xcb=Bi!sY1`^lpVoKIY79~!?}^hpvx z;*1JIxxw)dmsU?FlR$K`Up}1*vn&tK*Cdg8K~!WlpkXzzL%Ts<)C|PJ(wKsx!6H_6 zR%@~t`B-Rr3F(Z)W&0h3r>TldBMcW`A_r9t4xOty49E7hVf{rle=1vIhQb-u?(aj{^ zI!SxusPfeJ-Z6eJ?uK?n0_Fycqr5n(G|8TLivg1Uwe%cwZJ0JwDitk5!V$cLH(arr zyr1WaZ_A4Bt+UPMOhmvr`GR3lr8%j^+EEa*g6zQu}}Xq!LN2q%!f_SXR8- zn%kVs!WAqy?hCnDdxvRN@cp&$W)+A(JVkz^$5^{-3?>}NAp7OFfK8ByPZ|N7oCJKr5KI-Iwv^QPWC3mGDX_WwSsP@h1nbaM zR??#Y4~299Bmm$8G%1~n)*BV5wyd(M)S66BIQ|VvMn1o<@$y<=8w)uwC?KZ8iQjCK zLsghDT;`&+#_;T$C1mqlz^t#%v$ShsSG%Y?Vup zwNCIH29Opw4ZH^_AasT;;Mk$j}{*xm>-B}1oNhw+3Zqer0_uQlp>I?R(W zbPIvRl@K%0$&Ut|zt9;d7uTyy3k=1gMB_&|2;6y)re@PkaDK+{Yq41qv^ z$XB~>+~Lwe=olSdWD?H(`mNhU%04fNVFk4pgA=tbQ#WuHI`Wo7+K-w)gt-{(6AlY~ zBp_e?IO74biK#{D-$$P;KEjaa5RhlhPI=c!giik4`vP*9hI2GFe^41Iw)DcdW~10fjzGXFfHI^={$>OvGNK>k*2m|$ zV^)q{*5Xt{Kzvqh2f>Aelps#mvMv}A>@V5p!KNA`R(efDnr>t|LQVjj-kXb;%3^{s zhDjr8s0^40GS%CQ(DIy_6KWCru8thvqSKRC_|AErfHBCq=iladf}FJXz3O#VW2yJE z05Mppi2#gl{#{k4{p|e^E_P1X@ zNN@~-5IR^wfUCyvVgKA9_bI9Kc#*%6gHF&U%%1^j01e`R;aB(TKJx+{6+z4Bw@Xhc zaE>v)I@W$}diTrzmP(zz!J+M_Wfr1Oi&N?fp3f*>9sv2eZ3M{c*Y3voCZIVpadJz< zNd5URb@~N|!o)BW0(k<08mazjRSXKTKtLVEZ}@5Zz0_d$4Yn4;xd4zVBA|b>J#Ux@ zwt+2nvU4MSA`-qgEf$U-Z*zc~gVqmcUsJYTh7rFvbPdES-8)jSZ9mFQb!?Fp8U_LX z9h7t$mY2{U(+s|;)Jcu?XO( zrDTk%fq%3N_-CtMb?+m+M~^PQ-m0UXCyfr|-ajO}K#@;AP(f#psdm6DR+S(lj#bTj z?%sb55+GKg`{`TP#Gh4SBh)ds2+hGNe?1;B942&lEd9-|%EK0qqM2>^2!3y`N`BUA zIPnEp`!Y&)=k-HANX7%K_sMm)b+mydM+(&YBLm{-H#3aNK6fBzAAx#?!~sjrj^qH) z*z`Wg`R?{!FG2B4FIwYPin-q3L9=r4s9kBh`T5YQT+r}NM7R`O; z?QtLiIF6b-DvKP<4xE0>(x~n|MP5V?h5WmWf>1tgF#H|H&-T96 zE$luN!ya236jo0l!H1a44ZuGfZBP49-~08oVMqXRwNb6p5DWyhQe_|e}mOPLoy#BbD}id}|l``O#k#$sM2!rMawdvs|<+5SrO zRlW&+%uz{7vyv=v{2_365*EIKtUYw{J4I9ayC3jKKxFai`gVq)Ev8qZ*+E@W|6!-6XXjO-z=#IWi$0PR)?QH@2^s8jltjo=0}=We z>P9fou%b=oYzQG1eTcB9jS0y1ScQ^No+QX7(6GTPBuORURjiHP_n zUNN#dRKMJI=wRDQ^@vK_6ew4~3Q2RtwsbYo4F5$2DX`ks(fZD~IIRUlK&QbrUsdC~R1 z8I+q+JTO<%vOOG!+66rKdf%!NJT8H1-j|BdE?^@@prvfU^pFDnjg{2otRCr-Mb^!& zdGFiM1NVvgRR^$e78|$-6f`6gOs04(1Jpr92h%{hY2Ui4f~@XNYhYLMy;p+;f(a2m ze~Ln=D!!0!D*cO2d>ZJ8#&ObSvfCr;>HV9@-U=p?z+{Xyb~7!z0cVJd({I2u^n(o)+bMGsuOQ894IrZA$CL9Ue`tfwsUsgdnfmK0BIRt0I3yiMtohUZ(J>^kyrK zBW(nuw^X;s926Z^IgGyT8U2&L%j&YdA`jbDy$SN(Kt-dbW%zYO@G$Eq?9fz0X4*K_VoNKSOou^K1Wp2+zF`u=RF+VMsYu5)=cd4#}IK_rQ`9d-XIn44hSQP|qg0Za6pY;^Hh9VtI z2+$+b`YHb{)?T6Q#awMi+C{Jay-c31O@Mm^h(9>RVbUY!W7oc9ZSxN49bh(9ZAQ!# zyM`g@JwJwyB9le#Qih$Lj{$=N60V=NAy!TkH#!;8Z!fe}%Kj2-^7|a3@(#dS?tEv^ zYu#5Ij>m(n{?L8HBHRMzV|usS7is3xfg5SSm^T_)P}vS=NY8(r@3TpA$(lWi0Phl4 zC;dvG0s}POH6M3>oa&8dE_Ch0K*+%sYOZqyFw*sD;0DX%e+qVl$S`NaN{Qa zK^3E0NbYj^muR@26@rFA>SFVIn@f5(*t($zRF2A92Q~__ZQlfbbkx(C`XcI=Ba{G2 zU+sV3D%mb+GzP3C2!c~xLj|U+>E$}T*J$lg*D@4&kBljTfxQOi`*eGj6Gs0yD|@^9 z(}2+SNlSb*D}g*nF96s}6TF!cdTIEx0k{9lxJ5m&te$2?XY!EpIXZDwfSEu&Yg|x; z!xx7`%71t&O~1xs(0lq`YX?EzvGWPw&4J~uht2_w^Dj9o3eetzII0I?P*N7~YCsDK zpP{D$n+c3|=ph`Dw=V~Q@gu6_6F_z+Uon>U9ffdK+1GEo%ec-iK@|B-WU<}9X32v2 zM<7``w`p_RChi?g<` zTOobGWDMEUzUA%S`2FDhHx3U-8U}Cc(03JQ-woEs7Xm!T?xa|)+XwvA?7DM0QIf%+(N0gER2q8^Nr zYO(!0ewvX6gVvIuXR!P0JJ4IaDQ%}2{w&4c`F#@1+k%`v$Y#)T8h*eyBJ= zcEc8@=LUptMc>Gk8X82(?Bedn+Y_O_%dJipC5&SqfEVgFWenOn*i*cOV(e5vvNHATZZFvDf-WyhFWf_aj( zE{thG&CQ1e&Yj4vUUG!DY)_UYrvw&3woMz9+brdwS{b{BtiKL!pv5*l@{8~$odpgy zh$o`OZBW&0fCoR2%LHhp{*+^S5>^`7;K-23MxCnl?A%>omAyB!bHXtN7{-4k9@PEb z8j!rya$heL?S+yz+_xR8KfeigK>cy6(<>>)j26AegV8(ZJ_n!~XuJgNLy_(myLlif zQEgexo3Jgzinriepaw8e_E&qxi`?A!*}YBcVRg}ZHe=N(gaWxrU0m^>C2w>S*njv3 z66o^;d%NgR&+|ylwhBzZ@CAYJPu+%%S)tSc=1K1!l4!D+9YW=)Yd$4RfmyIC!|eN1 zrPYBIK!%j7$>Khed%2-j*T1cXMqr$F8x6ypcjR$_oaGGY+*^#&zb8zMK$J!}Y*N6aM_#UHbNVepEk{opcCbmy5u{SO$3H1y$BtP+QXJpj> zkQ-a0-N$tqiz3qGu|Itn9BdKeiX320o1CWc5;}XE>Pdu2%@5D zA37~}?6Y~*uxuk^YkvF%VWr`CO!A9-+zbY&V*BY;9|&^&-=Si43D23bS*f^^@$Xv< zjWRFPy}KLoY#k%zMD45>!uU`SWU3W5FK@V1+ZyRIBvU*Ng0d6~3D7uFmyU*uF0e@f zY%#yS8wZS)-3OckZV>-6bOATu(u@7#9NPPNVOG#|Mui2$BQ1;bQ^vy2GOd@`i8(*$ zCW|HJDwFS+Z*uc3llZO6?9=U|^us-wa@D`F+|MyKe$wLev4zQDqeN?cu5#o%Y~(0SJ%9fSTlQ!0dK#%X$#sHS2GpCB+uChEQCE$i)4~PZ)71OIMs>mJ&}L^I zkTV3N=N?^y z_8s^5TuHY&J~@Y?FMTqpuvon{7fPs zG!J^WKVcJ{H7#s4aT(A0OY5u|AX;+;I~XfY&&?&06Nac3j=;wMo?&l9 z#>yq#X|4$AbK1VMX4REoT{q*%I9*0wcqqOsi>iyL1dR(%(D@_~2w}__b+i1;Q4L!% zE3Mbo`wlrKAgJ8yflN@PHZ`&RE7VNr>Q=te+=Eq&gi!IM*CSH9Q=wyE`WTy3dkX}6 zD?y$+2m)-pdB^ktfG$#U`=!UdfxSizO1M{?mYGstM6$9I#|E$kb5?TVYF@v+vdM~A z_=Ia#MMK%R2yS-KM+>&~ioc=qX2P1v*IFp8Z*oF_r)ATjqPb%%pTd2;! zpT#)utXvKOCbWUxs83wC4*%CxSqW}m#B<%OZ;~JYWoA4FG!6pBxF4%B{hNP(V>#$z z#fkfQPU`S;GyI~VVApXMsvQD~u#8tb25_M&{c8P=5=KM1F-r9Sy3PNr7u}lZ3Dl%I z-E2Wex^IWzUIA>=fpMgIR58f=Dq}MXqR0L$<{ybTX)-{FqH0$Ni*zqsnBa|GX+IKs zl9neQ;M)boZdjl=uC(&w0y`V1e&%&odfCPGU>Zep**2Nl;;ko<58847aTy%(||~ zl)8F-xT`HzUVlRm`1(7Y9{rxQwnLF#8%Isko`#D9_)9dPV*)q>LOsJEtZ6237h!p& z=t4@-B#I5vJOtz7o6OpQDRKoU2Sv<%}m@U1quClCe@a1gYX zXz!c22mPdS`Xa-T$8-MQTTp*s_crctt&c00vSS!Q zMlw%OXTovDRasF9be$e&ggv2~QxGOmTUd@)k$KM8e|haaQ&-c=pWC~GB`(q^6rh>q zF{gye1g0`Aeh+=)PGhiKB@$nWYcRIzM_OC+&=_lIV&d=r1N5$x-dhm6{FtrgL8%~T?fwj(Y#BFJu~)rclb!Uf8t?N!40`RzrG}+9 zu|Xw}p-t(fXDq{Md41_*&zu9!=m^OIO^}~%)&xNK3y`OB^2AqfR_?OnT(KYn5te#Sk`IzZBKl2A%I(e(X$Q^W)i;nTAuosg}HIZ)C?F}Xm7`6zbW$Nd_3WLjEfRbCqY=r(Xq8s$IQ@cRThJQ-mO>14$Lg=l_fD;mpqxnR%Sm6GTrmqf& zs(b#XSGv0dM3hFl)rS%URHRE-q+#h^LL`(Dm5>zaZdjxikflSqTafOq_pIOF`!C!* z_nbMCpP9Ksw<6Hq{c`+6PXCkoASPgb;%|2UGS{p)0OO91LIJLNb@p5FQ@B^dk&Tdv z?2FKvw2WtCsS_^({8Drw0Cffq?-9vg=e8C?4Sq_fdd}1%6AKC!@X?ib;y~oiDLXaOcEGq?z`OI3&wP`To zvm+5#eohsZLqc{HBQ&Pth1#?6<@c8)Wt!OV*~uXwG@K>z>*cJ4YIa)WKabim$~J1fScZ?D(Yo)j!;T5r0aD>S_hjrd zdBEH~@QE7EP~!V)wlZIyAx)%1!|w(>+|ehG0O!8TJJ|6#tftP64DPYSh;bM62!OCX z&t|*QB_HI~5O!|LCAp@s4=rTZw_CHGZbt31sQq1gt=&e$cEz2V8DDHh!5qe6X`DN3 z_|H^Y8Hb*!aAIQNP^e^t&9wxUV?vRQv|Wvz6+b!k-RI?N%6N(+TRs;b`1N<;d+O9= z|DLTMNR>Whj9?Sze21%5alYQ(hEH1KdRxd?cRL#8pj6H`m0G0B_?7-YAHPJ{FeUS` zr>8|CoFKgbk0JHi$C5~GahT6kCdplDv5WNM6$|+Q^Or^4*3LFtp%n4*nA5XwoYT{h zJKn2JK1xD{1}T_5C@&?f{^W_U+lJac!wGpFp&8$><{xDu3n~eHwu{~R-VN1$rKj`f zZ?=P$r=T*TVqbgTJ2e~U%T2xL4NWzDpOEtPPJikr>b-%1hbkPCvZ_~OA7!`sbt0nf z9PC7x=ok;w7oMIQhnJ?rb@&#ZR+bjgK%34Udra_3Wb}pE>Xk)x?X*8lTega~hY8P` zqsj!7-kRE2$$N}1C1TD^HMNlN%*%QT0?iF3bIX3LS-N<5x1Fa(sh?z6 z-%{!;EuHNoj_Hdl*9qQ~CAsvZBtx(LF9LIhm7%#lx~l?4b)~Z%6EDq3V6r{kNqEh! zL*_&Y{hbc3jd1gqv8D^MuJ)G5mTzQXaS^#|2c@3IYb%jv5B+x+A18Mxgi0mKOC|?2 zRmO#)XhJPJ$Y|+*ZTzSZ6ZL=({8r0ZD{~r^1LJCh9tfkPqt@Dp+cDD{>ilbD()1fr z588<5PB8~9g>*ONJ$HWbMvI8l`*X?3x7lP4H4=JnixJMtS&?~~$fV4h3MUcXf9rat zLfL#dZ*X&Q5E^*s3FUYvF>DnTdL)+{bv6_}EVGQ4qz}~i7 zE0nPIBFagF;p>WS(ad4c>Nisz9pm|(63eu9v$VS60p7VC-7LSBul65#n)3Q21UaTI z^Gfq4*NMZMa?Wu?12x6sswQ!HWPa@sx7VxMV)YxJyyqX-t<5M8X}2RSvzWz9GcfuU z!(!OKds`bnE*6L~eXpuUJ__3uj{lpED%WUmq%x2PL-;CbP^qmub zCryUL73OCS*7l1Z6crsDF*J_rG8_f;1{jmqQ(rB){bV7ojZa|cl3cFzS_)=AnBlAw z;r8`YT4^VzSeZKBSgftVA#%x$Qav4e=pWFBx%(i%D}46St)L($$Wyoawq8$=bGknD zu#$CW@6xkB`K#jj;zi*2blCjNmS>}}VD|R0$J8K|$)%e(XPojK!W!@SHeb@w3QJ#o z0qH&a5n@9?3F$U|DXjuzZkN#tc9JSh(-4U2E?bC{g zXz18~*)liuFzwTVAwqtz^{Y2jm_CWQ$N%(B-0(BxD`wcUwLmxbXf2adWB#p9mHfF+=>w1 z{mZZ4F~?_&H6OzR`ffbderR-R9);GtO;&4gZH#n|qpj47oX27xkkJdIP1vy)ma?cd zxN5RAwc#7!b-aAwKK03B7dm*NnwctIP6{7pzjpMQGipizJXmJqi5`kgL|oy#ypHW< z^+#^^&Y!&$y(RYGiI;weSr?<+NR{J48na5eAwWkno9Pbl-PT<5NN4y&v5nQssSzfU zujAhGBllOhe3boYOQyzGEs@$cyb0Tog2raj`q9?JoBg>`Z??ztx$Pl7xzhGi#`I2R z(+Es_{|Is&d+CuJ97EM2yNm8t?Mn%xX%!<2GDS#%w(VaDbvNA;FUzizz%>(Kf5iW8 zOTJzfSF~6yqk;iCYzKLi@6Z6ig zeolYYuD&VFb6QhZUh$LGp@jS5hohT@3(jO0`B&}nT1LT+qX?@vmXV$YuN}K-wJqWu zG9IGv3|5c~&pYDD3X0hxQp<#am1QU*scBiHlQkh541E_0xCuS8I)}Vj04ZMq2bd zkyn138G(eE8jNuo_6lSIKZDCg%^QyK3T+v&cRT~;e#zlT7x|l6TFgtpCbNt=MKP7D zWf-Nsp1Rmw53x%+y#9H*<|LKc@Y}Y;)h#iYaiG)cyyic&$ld?BcHC6@a&q}I1EZ>k z3(ls;SBRfER46ne=g*sR#A=(|#fc6K7ki%ZSI%m@ScEWqKzSeRD^Znk1 zPpB#8Kgy{WZdIFn3&vT0%M2UV44?fW*QqI(->AzO8x=o~`a9s%d^@&HbOk5s z{%E$k_xfgkjAnNrU?W^)_x!>!@X%)_5J%}aYHfa(=Hfav%@~61@L`i)wBApNKLiXk zn#p4b_GHF$8YvJDa{K|41fLa$6imx>#m=>B74#jRV47@HfC(>JxD7j!X`(Wt(o6TY z2|e__$?^V4RPyy>O&B{XI%AnVjTjPEGbkQoPT!rPImiIxw2~PXQ^%?QntS!1@oq30 zP8He55LNrqic>LL8=CU~x39-?<=|9YOv^xfV4;ZaX|O}lq=~(Lr?Ox_xmuD`N&yIv#CJ~f0=*>^=h_fm&wW3 zN^V?09oYS7s`i5+Ni!c7V`+c?-O?5OxdC@<-n6p0uc2jlMqD!8@!>um)X71?iPxOt z9pbns$bL#|QQROsnPPEvS8nh=P3C30FjSA=7G64NSd3}pYJlx6D_`-f5gZZN#MHICww?rRsRmShFt8wS_b9Hzv_$ztgAXn{=~8gP8g-kel+J)GG<_zjpHA_;EmYPu3B&X~cwjBiJeWzH_{ z7oh~*RUUcr(kZ=l;D}P^>u_&8zVtqzY_!8RXbzM8v-G1a_-yymbcTov80@N;&91kL zO*OmCSCQ8Ii6dcQa}!&{eKyV+EA`_%XeaMbCBVXwDL1Bn0aof@t3~|F_0Y47eNQA1 zSRH))3fvU#I2P8`+UwmDXu}C`*3QNng0{Hx7yrDicUw9&C#erv|L;02vB^4eeXzr@ zM&qn09i#sc=lcijFVO~ennsxlPl}c1rYhH7M0qyb54Z*0tslMgnpyuInvBrs<T?3)=++Iiwc)wTmTFOSbiaPj}TCzx%ZAyeoE zlpvKpzVxI`<#pv+}0e4jeq#Td=e^x}DT|LnD*%oYtV+0olw7^*%n{Q+iQR z)G_9;yzIwIlgYouEgR0foEdm;+npvOjc9;Tvb+b6A81V)W8L_I$0_8hM{wHsGqy!v zXm0+pIMsXV;yJ^P1An=I zSFF2BNDksYBk^4ME+IBBe5E~e*PfGiLi^kDrU}f@lu#zS&A=d~Xzv@PZDb*yhviec z)24=&Qn?+s^jxE22wo^ywk1mru%cyiP@tAyw?E(f#=HQqnXdisd3Su@LXj=OcTcM# zA9L>BCwXqZgjBfMyZRYeT5ACJe=Z8W%vE$gFOrd)d$FbKuH=)OAN=JSh$}VG-xpvg zmMNq=h%V53`4N?6v%+)4W=U;;(raX@jh|wOq#&xg6X{Cct4eej{c&_u+&L?QK5VuX z_e;fk0!^2!fWvo0L$t6`uCG9-^hZ)(W&Ed1I{azzJ+Uau@l-H*xIs}<0(ZiHp{(}$ z=;iuzy2M|=ydC%>6hb8F66yQq{;Te&c6aa!XRhyS4Lr)rbOf`3nOBkPZWmF{JI*5? z;1s+O^tE7sLhii)ifuTec6es!sRLXX!m}||OfH$F8R==(Jro7O?r%BXO2aNmDp$u` zJw8^8IM5(|$bW0D;S}E1oh^KDhqT;zo`*5N7v3GFDi zdRXM8KG~@oIF90*+nu+pc3Pbv!pl;29#CV^(>n)_WbE7vk% zE|el)PKpa(M%>0l`4bYme&%QxIyTcDVqOn5&mGqs*U>Edld={RoX!=6;7uYdeE2h-=`lxPm{b#E?RPGc2d)`F&RVhJN2np{|V)IhdjcK9HX%DidpVkl%lCK%?QEPcsGUhgl3oHxV#8xK>mvU0L)4ug0R~h;?Wwl z|E~p5WDf8#lLb>gEw~iD28w4nMeXf#HOj1Z1Rp0|8m)h!>d)sG4kvMSy5(VXQ@Ouysf=tsR|*21nktS)%bS zvM}nx%TQ1ITO8o4#e3AY;ywU#Rfm$3nI=~a-c%aUePis|dgsQFlyp9PxQUHtw+^Ss zd`G_~yvE=)LpQuw-!~z(ei<-AX<1Bz#xTwXd_yjZYudE(>H~bJYSTnN1vDG}<;!2< zd5EgU?ghc(RnDFFkZD6>UJkFr!$!ZdlfZeEq+MnYb2q_xIbX7558Z=7#$@dN;H#zo zI3{+_B7d)sjEWzw9?0?<_#$D^aYBOrkFi9Rlcr<{E(>Htoz^t_En7zH*`IDTRJxcV zeZCUrtdu!gc_;Ug)$A0q_gw2uX@zo2^|tJ#NSq{$yX^KbP7x~xot1nxt*@LBu(+72 zY5oXQjfq{ZCGSFQn6JvGI9PvAF3` z>L1>`up|OZ*HCRP!0Pb8@pS%}c@_%+ATAKRdpWObG@pN`geyIXsRcWY|6E59-@wnFS8yq6DU9k4b>TDm}(b4}3Mqq{b_PiVxkP*|G~OGe*&WcKhm zQ=-D}AltNy?|<{ge}DCNQ|- zSxN^S-WQ0}&W;%i*pqYFQg|)zLR{`jxrMP1q`)bkC-3@y$=~ zSQ43zhR;a!GbKNH`dScRFb9)k6t(J!kl;;PFaA zW5LOo64Gs_-(0z5=b-4*b!3DhR{37^^Cpi~uLJb(ysLvga+=`X;wgl>zocjM(5||C zLPov%W+##8K=?;Ek-L|&E{`3<#Lv=?)zdxtjg3XKL(nERpE<;HCb4nIRH!j^(fp`~ z;_>+xqd1(J?ZTzuzHL~+pgiA4?`7dEr9Tn%mcQ&H4~k z&vRx0eTIBInKWviC@2`4vT}#$h4Hw8vm!G%wO@8fPKRsbaa<}@OFoBj_ANk8$}7r_ z)JpMVGf4WA6BR)KKD6Nj!U>DMga#PLf7>atauIog5bCf^K-_oQ(>+*@y<{prespV^ z8~?dHzvHWBcW$rt!7lSF^y)A+!vl>3EXWD@kEazR;ni%HT5dIee}#P{s>XK&T94Nr8+8xct* z{%x0yu8=RWWGKzs`ii#G;(_OPGEIG`ew&fJ+t%T>Wk8!+5F~eKcbpU^N(jdC`4&#` zk@)}6;|m4RQ1!8T;}SNg5%2#bCj`RFu~l+=-)qXPGM3?SmOjN{7hqRAfu;6*PDmaz z3hb3nZ~T0^z0_HD@(+d3sq^z}4!wqwMA9)9q*>()!}+aLtn5vP)5W?IFjNp?M0j^e zn(Vl>h@v z?-b`}3)8Jgv+jPQyI!Lyp5T`65LkbBtTWECzOfp0Jl%u{(#SJk_-&*3CQ2w9X_vM< z$uWFYbNn@}qq2PkVn>=MoHd;+1yEPXh?xg~gsw*Zg#X!7-avhKb5la;HX);3-0Kc8PA z68Ad0m)s%I-m#HY)HL?ci$N+7fnC+SqKQr0ZusCoJ-CZQ<1q~;TH0W->@$(BQ!dvA zM;s9aSDJS|iv|+j)EBMBKC5p2T2KqZr8Pg%+re0sezgx=skl#fd3wa+m`<52$=6x% z-YQ*=Qb1V5P;R!djy?Eibu3s6%_^JlqvV|@_Bw=X&z)w28k;SfmCCaqkq?eqY(@PL zH*b<%OkB2>ID)@P-J{Q?q_Lq@iJfyLJ`Nz5SK!hVl0c7Wu4GLQdE-hj1Tf?E+S&hl z8Ddp|K?PP)@8?U`rL5$b2Nodc69fyDUr*F}IGZ#$B5 zn>vDc9QbEWQj5iZd`H;W8-L9R(Z83t;?|Y*V!xTCq_&*LY?xl_O;6dLeWLJ_3%c;x zrVhNkz?MO;$i--=FLlYkdvIc;wZ8CJ?`o3(y_0~V2fVWD)ftK_zxIjlARMsgc7?z> zmvLB5nAYwo3(9b5G#@+KgX_M?QN-Fq9W;uF*l^LUH+_aaZOF!!pK|&H45xedctcmC zmjOwv83_O{8-Ci?N-1U~Jm`$z5a(>IUB~pi*`zlc+fEPkTpD?oKY7vTsRf{hUgl-) z_Ug44eY#WMo@EsRrC;aaA-^R?IO-nNkl(RnI$g!~kZ7F}8~LLeBJn!Au7bU>9f+_W z>1JR+YF@zQ`w;!pe$u((UP~f%Ha`B>&DR=V`Y;lObZq6sXkf29TUvG-%;viCpp84W5yFJ8ZHswaI z7!UZj0nMLKmg=$;>wGlN`%vclhD7eWAFfU{t-(a?B3!vWrgT}k%3}|!p&-D+QOqI< zqqaguV!|;Eug7I3e_)TIvzb!*8Vl$4Qf`hXb(9x^1*LZHD?qv?H^F{a6z-jcy}1Um zHLk<-*mpeUB?OGBH4P0Sj@W^hzN8Tw{JY`SJD(Nv^I1pnNe^){fr*0TYK3qEtJo;P8 z+zM30dH-Z^qR0b$j9kjJtMB3J^*p|BO*L3QUsc}}&Dt(rJ%b|_t8Q>6jkO4Y+1;-l z7qeNWiZ!w9{**OlM}M=??=3402u+!Hz+@yPt81meHPMhuk=zcbkWyOpO!1Z59o_V) z1UswKLq}O7py{wn9n7bjxZR6VsQ!d8qJ5V_%j0WR*X{p;?Sa|;B27cY$@6fA*&-(T*R7cmg+QfKP?M|1t|0PP@oAgzmG=9}4D^Q~AU=nNc_p^=v zc`=sPmW3ZH*W2Sbp`7k@w;RecG2~zWeWLD2%j*(?RC?yT{JM|?`PshgVb>3L$`4l{ zis*F4p>z;PnFD;n-2T=pQuBhZxL|D;W^ZZwjhnW!>v(A>)$g`}ZN_8g4dCv*Ji@3~ z(EsSu(>u?uaCYzfSVL|7_N*!QxAHFC?f?u7%r%Ny*!9^5{KakRZJ6IunPI19jOFSc zRmGRbc{yr8381bjis?>)dLaBQ@ z_xKS-Yo6rLFW{DJNxp6az*1|lgF=YZKOa^U%djwCRhc2_d_GKCucl6cD@#S-xMLF~ zxE-;s8ud6$Xf>+{LpGnMG(}^rIj{%QAVp(!zB+unoqK(V9zbPFMb6*e<1ib}PJ(#LyuVP;=#kT^dl63_#|p$6dh8ch^x?(#hZ5Pt0K#6|3G` zyfB|LsnZ-~Rq!bXc(lyr@_G~D*{xY*-H8QUo=duS6?@ZZU>3f(oO-p9KPsgr_00NH z6#n^#$j&HE4z^wxchE3Ch_)uGa^L+iRMX~q^-~6*tB(Yte_t<<$w8jBBI&^eDK17jI(hD|AOwZ5)z%#swG}Z`X!!i&Kd<#%VK@(`EG$xT*TP@Zn5{P& zS8ku__Hx$Y>Q6SYlp%T;`_Du$(6YB3*p%e^bkO*;-rX*j3h8#bN}{ttS3i&rnq!~& zH%ML-K-?0(4fA8w5gHz!wkd!$a~ueGk2|dg%)eD6m=Ui+>(X_UGUnbCFiqW5T0&uI zirv7|41h+;vgcpXL*!GufX_^G1~ab5@-j3V>jPHS-~B5IB{?~H?3Wc_tBWBF0gL@G zf=anG>@hDA{?ypQx_@Krx%9olQweh~h#!?;ne1@Snuyhns3Eo&a49GCLcQ6yPM1L7;ME+^1wqpnk|`lAqCXHVsw%iX;#eY)~+gXH}{K zqOahD#}GNn>UxOo`RQJn)LSIF$MoNfxH2(VEN^ICZ1nzH2(u)0Hij&0w01qr*rCKe zfuwTh@#Ukv^0l+8F1Shr;pikMIQ7s6pi(4#pXR`Z!%&Ih^&6*l>r2Xyk=jzb^o(ls}`mY?WOQLxlWb79}MEA)VJtMPQ44F$6PXVe)aqgVUFb{5f%DYND}&bIVJD^s$B<{`zU0x z-&vrn&(#SyEK{pG=vC}KM%`IDp!aT4PYw$EIXo~}+*%}*gQ=U(kF4(7c6Y6ceFu)# zIqrNog9*6aFWFHXCBoh7;rJa+gBF#WUvfuk5hIfi!08UCi8{m0=k%H#>}ctsCL50O zVcE$ix2JoPDvQ2r#4q#t(Px8N5Y71CyqG7ZNDA8Z=tyrLk`2JLq~8Ny#C~GJlpFox z{~iM{9T6!1ITMpLkJQf>^fjL)dF@5g1n9G?8 zh#@5JT(!EU&{6k_=AMkwbAxTUP>H9^rJr@ana`1q6bhrV)Qt8Gs!j`5vt0QcM^{q$ z8mx3La4YK$&GY@j;bsyqg!Jw6St)=CCk4WMqqlVkYg485tP0Rqj4>}CAShNSej^!_ zJmaluc5)AI>NLRTD$q^Kx74oVLwi5(+_>udbndQ+eMhO#s)WcI{`whQYt3F6Y6^3;#`amva|V6-ZTa%imo2< zg{c;-2%(wsH;KFVtkA?aX}5L$!xphWy}pSDeO}pWKTcGYj!EhreVL`EdQk8bXDy#H%YgI?`NR} zQW1yrl<5GDBAz%Aem8X+{bVM9hr!t1 zV87&oz`|K?6|)*f$P_c8+Z_{NObaK3p?@Q30Z~}~gwYalJ{nn^cB>b%)YZJL^X)m& zJH?KWg@D>P+n+(`ozb~=SO`M(KEj6C{lq@MO59$J6yie^Fpl`ZwEJ0qZ2UXsHfP8C zz3W4~OR-Um@sp!<+(z!+pV-?p3myZ`ARUx$EcG<`A(|ymiCs{8hib}XJEn~bV$kPi zrR%{aC(_NV>3vinwpnX^DCxt6ez4Z9>xc=|2b?~D$!4aziSPNx_X8@Z5aeuED30=Wo{F3Ex{U@g{ zv&R8TJg0Pe_+s6r{&?%jk!H+Ly%LbipYK5m-BE71lt>rXDMKjdrJ0T(ifYlYq{nix zRyPW$rksAX$bI1kN~*NfT1)9j3EE3?9Nk(31Ip8D#5Dy(N!zqUFFU|VI-j|Byfd@l z3)*y9>-2F^!)DT^X7hySQdLcUdY0Gw+w%AMMUD{)j}0(xQQ zMUMsbfhYb-BJy?Ci9Y{qMzRnZq+L&6)g?G$UeEydVGl{Q$e~BzJUFUK72{4-%Uvr# zZ*>KMF5sBtxE52IATe42k|{WC7F0tdL95$hj^QY4cbD>ja#RxR^q@L&J002QdI(P@ z!9I)>%0^SO|4x-%V2`uFok~5T<|gxd>-%OKOn@QIRe|SHx7q#fF=5kKz9*HXwD6!D z=~cfg6aB_Q%y{&D-iiM)4wQn$d@YR;MX}x7_O}!WOaXXU^F1qesV~XFD~|JR?aVTR zDn+!PT53*%RBe-Q|6TWJ@GR5l=>TKz zO3Sk*b;dx#>IF5k69veW%Yw-FU&A#ZU3SQ2RfsC)}{KCz>tr=7;+4k&m3pl zakx#Jb}7heRH7o9HYH@%x41Lgk|cyR`?=uKfQN{Fc>NDL#@-Z1k+YbeI^4twt;%nt zl60DFyo+9RlOo=`=aiA_u)IT1a=Y0vGA5oM3^w7D0np!=8L8Ntb$`Rr8`4Brq;o-7 zbh?tI^hOEN{izAD-;PbsK)6m9KM+QfZp-SuOFN}nl8SVU1fEXd$&5ZWBupW(Kdw?| zO6(lqrw@9WMh&*2_zmL*)*=XU40{gzzqISVYsh8^PRC(8;Fo+hhR8bP#%Qd8(yf2@ z-}nnCOIMJTpU?RZX@g1(MxSwq%$hK$?r~J^_QmjpYs-op`u1a4c2e;5jo`MX^En1@ z(u6DveU!~=q;aPP0@W~f9a-k(VJe%<^59%qkZ)r5zOfFlZcLB7w<{lig=SPwqACGQ zaqno54V=}D`f*o4Bb5W_thPvyh=G+bg|r7Oo))7L$I-k$D>-<>jOcM?vZy@(G#0$e zq5ALP|3GlRIxrs7Vs;v#(=3R(Qg0mY(pNJcJf9J@X2mHvt=Sr%jkYjA4NY6$f9Ss)lBNDdFrR`<9jVfYW%&oiuxK$@y{ABYjW}go4&R$E)dw{BS=RXi5>W3gqyJ&CsV^d^GD?VegDqq- zjmg?BNH~x>t>$L^rOa6$zCtMXAka!~?f}@{skdQ*YjMDnb?bwRJWheRr4Fk3tTR1F z(iy&#w%I|!V4(&103Lpcc3bM5nSvi>!jr`@bLpVnqyG_9Ha;Ar!4?i=*PJd((F6Za z!72uZhn8xq%w^yhN;kxXs`cg)>}X7Fe9(LH^Km^Skz{L+xGDhQA@andP)Y?{Wdz8_ z)vaBWQyl^0J4gIn9JTeD^kMJG>f?GsP=c~)!#FJ;ByT*PvsVEGGzABwN#>1ZKmNYH zdbh>m`DwO<2fcZ$>zm(APSO?RaPi5FlbJnDLi>i4vJ`Q{H`a)0K&D%5Nlir zwicHOney}euD)MY%**@7kd!|YbQu5RoUSJ)K!H8#4k#agV)UnWEDw0!eK7uDjwWA(83QD;*)h9=b}j%<-7=4W76{rrb2AQM1%DZns>o zM{RRKm=qgLwKz9v=M-=HX_mNG1ZA%cXxcqaSXGDgeVmi)aG0jrbdKZ#cvT@B2C9M)zULhYE;l`chFi3&jyK&57*RI#WU_+CN^eQZ`=iIFMpz7Y@K&Zdu;hs zZ}YD7f9@94mf6c#4tOOGA#hoT_CM}3UbnA2SY(RO9DmLLv>f7gbsuE)F2!K2qRJkn zJ}PE9QeuPmF=1G3vJTqS#4`uTM`PQ(x@h|Q;hxj~p7C9l0O(RvA5Y+Lq!0wnY(tVk zVhmo?iGOVhi(yMOVe)^5`NBq?02|Zs{jNZ?ys3PA*_&k8p*heUIj_(sNM*GCFK8`j zGOgwUW$74jcxHyEW`bUE)JQ&>{=aYxAbYHDnsSS?+q-6O z4SR0oW-`#Hz+V7}69^XQbRtY~d?*mDbi;Y*>!oD0E=FP_-J7;!_-0V>QhVh3YgTXw z3_9%bf%Spo++*1FP%yF&zz4^lTZ>Xs9@_<)V#^;m1URqr@A&wL_VKA!0co$FETZvu z`7O8_-DQ0}G!P{uuLW*Qb^K1XE;cFV+_x=|%GtXP@Xy(XDJo=*6A)MIPZuf)IluV< za~0lGhxP^oVb@zznqLh@8bN!l{;fY1Bu49n zoj%(N64GbCp*`nLjjEpD4Fh71kFh*WML+I=pu&~B1QbA^`8gW|GZsdohXgVXeS8}J zxkJX_sKI=RNo@{mM6FAvK6dm@IYK!K=*ybr8N|bm!6NjVPQUfyYKB`zaWeyD5@S|Q z=P2zdNSI?$>%Sg=ujT2jXPj^wg=8?N)i_)hob9xwSJb{1F9f@h&F%<8+u2W`R^&6&MxcS7mM8skEe4C!JMe0*wSlwvqX-1pqhf-l<9pG4s4gg8;bm zpfOAyYWi*U_s4LR@z0gkbrx8VnOaAKjyBKLmN2g2wP>aQy~OXC@2{dPr~1>61O|G#Y{Or32|a#AU(D ztY4vL@Yk5lm^&gU>*|UJy{h#YC(jp5A4ldEXXJ-8H#G!t(Nd$`oGh(WX|{;nba@=m ze>H7{Ym|Ln4qnm0VD0L>Z6!NXdp)Y@c{pt~_G0`yqdB+_J+v{?6O5F^b?A14lNh~; zoXjwx2+=?14iW>?HqYW=m;J$E=YYK@8A^Fy{% zPe8WW^Tv}?O`PR5*N5;qYsZ1&EhC3+!F*nA>#dX$Unla<#f$-uSkrnBE2;l?-5kGuwyyU>`4gzu7!il z%FXUP4@j%1qIc$xc2&Vm(tjc!y~uuxY)8?J22h3QOJ;zZykgy>L`vH=gPw-4xxpnt za&qS|V(hiZfu$N(2&gl-fPcj}#hMpJSr0 z9|Zq8pv?B_YKR=TZ1We{sYq%Ni;ke##h7hS39}iyB3Eh^Fk#XMFpQKeU4Y>zppYB!XyovkHnm+g)B>b zo&nt>jbngq1i8ZBn@--#ByPXDSQkxF;{lrOmonaA=J|i$#6;?j)!dOWfz1riDsDaS zlj)EtrUmjhKVkJ&{M&?ToDg3-25h%PePIWQdymk%qp&{-80e z8JsJ;JEw4mbyP5T$LN;8@Pp!T6;JTlhVENqkrbipsn^_jc#aU35$hr#Aesc#aHqcP z)IZZEAU)O$E0Bf97+HDx)00iS-l{SA5jI27hzH^u+>xGzYI;!Lze(VS*}Jl;{Jb2r_v z0|@8nOAyQJdA!0wV~zkRtMbpMN06R<00pxh)KFiwSQYQ$_=tzZWD|ObAUa0tGXjtmUT;yn9+kuC~QZrPR73`<=;#pjMFIKqNy) zA?updA6qyq*9GXSXHmos*Di#65__`H-Y3WL4|+ekY2-2EUg0OsTvUVeogETx>g($j zL{pI4WCPc0H$^!7D)R4R0Rb#WVN}rz%@3_bogeV4*A@-##gAW9pN?;>!Ac!}{0;18 z{TRNIqu?|=)Y2?8nrL$PUE6L_As-b zBG!aU^8R~tYwwoxH$7elxr3g-dCXHfXw_#OV1YDT@}e*uAx*?*)XMg@j_8gH@4aL7 zuR7~KeC)EO&k@0DRx8f?RZL7ZV#zEbSTR_hbWoD~S~OYgLZ+G!N;U%4aR2c!@%>*v z*l!L^*upj$M)lc;mO%kjow+3oP~~J>Wi|eFxLyQ^VGu_AyY>=hTjd4rKkf#b<7h8o z*H=-d8lf`1{81$a)cCFau#q&9;R_2V^ZhR1O?@U0?X~?MHA`Pevmgi)$1bWtYpcxV zA_r57>|OYgm9(= zfR%vU1p0^Y&#l-dp99AO>m!BKMxpG0Fs7U%tC+PI;)AxyMoyyza8R`Y()Z!;x7A>? zl9r%yCq=rPbWNkvwzNTqqlCHM-!5|UI}7E@L~6;j7s(&&vQ8N8Rvd4Fru8{f*T7u4 z2j+@q`BKjnrnEoNcD&1%e9rhevYlcNilFeqL3GenD$CvnJ06P75W_;;IU^CgJ2;Lm zNKKHR1f?juKMHD|q~2!-S*JwVM^Wcm6`(k6axQ@yixiub9?Csphu(84y)7S-XhCNo z^6_pqXc(s{l}1vsQkDPAd!BlKi0}{aX+R%1y6rE#ZE7w7j&p_UWg=>>h?Xa%GUip1 zYFf;epeA&+L)xVi1XensW*jV6sNhopNR=D?99_r-9HZLPx5|MXLBQ0F<&7(VAOC!s z7lpTqJC{x+p)3e zgoaDlRAo?L&sR?tnO?)5(}RNwV_^7d>ey#rf_hl1NR73keSNeecKWst$%x3IXehiW zLmzkc;YiL>L7)@!C-T2`pf87a*6kA@S0AXav$h_J{>pCr4fI}aELf~Y^;j6)zCYon zz}Wg#{e6=a^ssM8k^?oq!(=ND;v;I%0kBIwR=4L1f=oVz7+19s^< zmd7WL`bw!K@c|Ag0e8c5?Z~2JrT426m|Y+#OCm(`=TPChZKnn91&Z&peG{^WcA%M8 zdGW^9Jw=79TPtcQ{zY0g@wRaf?CxV+orr;wE`rwVSBL+e12qn7#%+~44DG;Xf z>U#!y>g)`M7pp+f)#9L=N`wBJs>iEeznhNkl#z`;*ir)`AIXlErs8)FcLc|o?X8A2 zL~#PI-@5yic{IN(?sUePn8dXKusiFvT5`~7(CtDJq_Ben{YIC_7BTYitEq^fgA z1v_9lF*sogLab}Kec@1HP%5lf(Uf?qvzv=Ba<|X+1o>C~8JM0I(5XB##`5;w+lh2X*#CP*Bwda)Ib# zV9;#yH=XAAZ9o>e7pWJC7jTw;m{0);jiqF?hX#Q!KnH0_bT0`xjaFRSZ?efvzHY7P z;{;_;FS%4}@_nNEGBvee^l?;D`!uF|9|mT%1-^3=ptRFp-c zHP`d?*FbTBf)?m|X{03!d>PBs&`F)u3*t3Tr(G@EtVHxT8SZ`+lUNUd8$`kQonPAR|p|)Pc zd<1TU$}Ulj&Kn#-+(d%sQe#fjLrYnpaLCT{Yo()=Wb(=DSBTOil;vn0bpU|*W=8IS zMlPW&&Ht-*MVd>l#{77-@SkU(F;aPM?yOQJ6Ik^Vv@4S&F?vxmlpPpH=SZiqm z8|(sz7!@eM9!^u`u0|A%??ob3?YAD!|52$RHC{QnD91F8J4^4AmtpSc64uBLE*H9Lx{*-?C$h9>2c?#f}a zkew7kpQLbdQzOVuilA?5B zONYa4tYhuEcKG574nm?LLDc7yTzYM?w&|MNlkR%g3i;R?@Szp5-#%sk_*74F?~!W7 zqq$U}xm4lNiVdxg8UbsIlbf)TVTg{eFMA&HnH6WTDs~YqA)8We?!2X&x7qc@B(-SJmm*7mHkLIIir0N)9OaF zIzx_nF-N_K&z*>)UPLDx(FsSIx)*Sr0<~F>gpzrWcZ_%2SNz--BG_dSP_ z=is>oDy1SN&mr)O_?~lDUqu(#26nD2x79^JL=yQ?B?}7V8CBVGX@i2QfH0jg)cIT!xiGXMYp M07*qoM6N<$f*$r|IsgCw literal 0 HcmV?d00001 diff --git a/resources/sql/queries.auto.sql b/resources/sql/queries.auto.sql index dc3d591..dc97b4a 100644 --- a/resources/sql/queries.auto.sql +++ b/resources/sql/queries.auto.sql @@ -1,7 +1,7 @@ ------------------------------------------------------------------------ -- File queries.sql -- --- autogenerated by adl.to-hugsql-queries at 2018-07-03T23:08:18.480Z +-- autogenerated by adl.to-hugsql-queries at 2018-07-05T10:14:16.954Z -- -- See [Application Description -- Language](https://github.com/simon-brooke/adl). @@ -753,7 +753,7 @@ ORDER BY lv_visits.address_id, lv_visits.date, lv_visits.id --- :name search-strings-address :? :1 +-- :name search-strings-addresses :? :1 -- :doc selects existing address records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_addresses WHERE false @@ -771,7 +771,7 @@ ORDER BY lv_addresses.address, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-authority :? :1 +-- :name search-strings-authorities :? :1 -- :doc selects existing authority records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_authorities WHERE false @@ -784,7 +784,7 @@ WHERE false --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-canvasser :? :1 +-- :name search-strings-canvassers :? :1 -- :doc selects existing canvasser records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_canvassers WHERE false @@ -806,7 +806,7 @@ ORDER BY lv_canvassers.username, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-district :? :1 +-- :name search-strings-districts :? :1 -- :doc selects existing district records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_districts WHERE false @@ -817,7 +817,7 @@ ORDER BY lv_districts.name, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-dwelling :? :1 +-- :name search-strings-dwellings :? :1 -- :doc selects existing dwelling records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_dwellings WHERE false @@ -830,7 +830,7 @@ ORDER BY lv_dwellings.address_id, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-elector :? :1 +-- :name search-strings-electors :? :1 -- :doc selects existing elector records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_electors WHERE false @@ -848,7 +848,7 @@ ORDER BY lv_electors.name, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-followupaction :? :1 +-- :name search-strings-followupactions :? :1 -- :doc selects existing followupaction records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_followupactions WHERE false @@ -864,7 +864,7 @@ ORDER BY lv_followupactions.date, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-followupmethod :? :1 +-- :name search-strings-followupmethods :? :1 -- :doc selects existing followupmethod records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_followupmethods WHERE false @@ -872,7 +872,7 @@ WHERE false --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-followuprequest :? :1 +-- :name search-strings-followuprequests :? :1 -- :doc selects existing followuprequest records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_followuprequests WHERE false @@ -888,7 +888,7 @@ ORDER BY lv_followuprequests.elector_id, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-gender :? :1 +-- :name search-strings-genders :? :1 -- :doc selects existing gender records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_genders WHERE false @@ -896,7 +896,7 @@ WHERE false --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-intention :? :1 +-- :name search-strings-intentions :? :1 -- :doc selects existing intention records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_intentions WHERE false @@ -908,7 +908,7 @@ WHERE false --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-issue :? :1 +-- :name search-strings-issues :? :1 -- :doc selects existing issue records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_issues WHERE false @@ -919,7 +919,7 @@ WHERE false --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-option :? :1 +-- :name search-strings-options :? :1 -- :doc selects existing option records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_options WHERE false @@ -927,7 +927,7 @@ WHERE false --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-role :? :1 +-- :name search-strings-roles :? :1 -- :doc selects existing role records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_roles WHERE false @@ -938,7 +938,7 @@ ORDER BY lv_roles.name, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-team :? :1 +-- :name search-strings-teams :? :1 -- :doc selects existing team records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_teams WHERE false @@ -952,7 +952,7 @@ ORDER BY lv_teams.name, --~ (if (:offset params) "OFFSET :offset ") --~ (if (:limit params) "LIMIT :limit" "LIMIT 100") --- :name search-strings-visit :? :1 +-- :name search-strings-visits :? :1 -- :doc selects existing visit records having any string field matching the parameter of the same name by substring match SELECT DISTINCT * FROM lv_visits WHERE false @@ -1035,6 +1035,12 @@ SET request_id = :request_id, closed = :closed WHERE followupactions.id = :id +-- :name update-followupmethod! :! :n +-- :doc updates an existing followupmethod record +UPDATE followupmethods +SET id = :id +WHERE followupmethods.id = :id + -- :name update-followuprequest! :! :n -- :doc updates an existing followuprequest record UPDATE followuprequests @@ -1044,6 +1050,12 @@ SET elector_id = :elector_id, method_id = :method_id WHERE followuprequests.id = :id +-- :name update-gender! :! :n +-- :doc updates an existing gender record +UPDATE genders +SET id = :id +WHERE genders.id = :id + -- :name update-intention! :! :n -- :doc updates an existing intention record UPDATE intentions @@ -1062,6 +1074,12 @@ SET url = :url, id = :id WHERE issues.id = :id +-- :name update-option! :! :n +-- :doc updates an existing option record +UPDATE options +SET id = :id +WHERE options.id = :id + -- :name update-role! :! :n -- :doc updates an existing role record UPDATE roles diff --git a/resources/sql/youyesyet.postgres.sql b/resources/sql/youyesyet.postgres.sql index 6871331..3cfd37b 100644 --- a/resources/sql/youyesyet.postgres.sql +++ b/resources/sql/youyesyet.postgres.sql @@ -5,7 +5,7 @@ -- -- auto-generated by [Application Description Language framework] -- --- (https://github.com/simon-brooke/adl) at 20180703T230819.494Z +-- (https://github.com/simon-brooke/adl) at 20180705T101417.868Z -- -- -- A web-app intended to be used by canvassers campaigning for a diff --git a/resources/templates/auto/application-index.html b/resources/templates/auto/application-index.html index 63d842b..d821ad8 100644 --- a/resources/templates/auto/application-index.html +++ b/resources/templates/auto/application-index.html @@ -1,55 +1,74 @@ {% extends "base.html" %} - {% block content %} {% endblock %} diff --git a/resources/templates/auto/form-addresses-Address.html b/resources/templates/auto/form-addresses-Address.html index e29ac70..a9ce785 100644 --- a/resources/templates/auto/form-addresses-Address.html +++ b/resources/templates/auto/form-addresses-Address.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,7 +33,7 @@ You are not permitted to view id of addresses address {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -48,7 +51,7 @@ You are not permitted to view address of addresses postcode {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -66,7 +69,7 @@ You are not permitted to view postcode of addresses phone {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -84,12 +87,13 @@ You are not permitted to view phone of addresses district_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -138,19 +142,43 @@ You are not permitted to view longitude of addresses {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-authorities-Authority.html b/resources/templates/auto/form-authorities-Authority.html index a6d40b6..3dfce8f 100644 --- a/resources/templates/auto/form-authorities-Authority.html +++ b/resources/templates/auto/form-authorities-Authority.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -26,108 +29,117 @@ You are not permitted to view id of authorities {% endifmemberof %}

-

-

-

-

-

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-canvassers-Canvasser.html b/resources/templates/auto/form-canvassers-Canvasser.html index dd5961b..e2f68e9 100644 --- a/resources/templates/auto/form-canvassers-Canvasser.html +++ b/resources/templates/auto/form-canvassers-Canvasser.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - + {% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,7 +33,7 @@ You are not permitted to view id of canvassers username {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - + {% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -48,7 +51,7 @@ You are not permitted to view username of canvassers fullname {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - + {% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -66,12 +69,13 @@ You are not permitted to view fullname of canvassers elector_id {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -89,12 +93,13 @@ You are not permitted to view elector_id of canvassers address_id {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -112,7 +117,7 @@ You are not permitted to view address_id of canvassers phone {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - + {% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -130,7 +135,7 @@ You are not permitted to view phone of canvassers email {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} - + {% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -148,12 +153,13 @@ You are not permitted to view email of canvassers authority_id {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -189,11 +195,11 @@ You are not permitted to view authorised of canvassers roles {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} -
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -206,19 +212,43 @@ You are not permitted to view roles of canvassers {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-districts-District.html b/resources/templates/auto/form-districts-District.html index d58b19f..3ad3790 100644 --- a/resources/templates/auto/form-districts-District.html +++ b/resources/templates/auto/form-districts-District.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -11,10 +14,10 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> -{% ifmemberof admin admin %} - +{% ifmemberof admin %} + {% else %} -{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %} {{record.id}} @@ -29,10 +32,10 @@ You are not permitted to view id of districts -{% ifmemberof admin admin %} - +{% ifmemberof admin %} + {% else %} -{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %} {{record.name}} @@ -43,19 +46,28 @@ You are not permitted to view name of districts {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-dwellings-Dwelling.html b/resources/templates/auto/form-dwellings-Dwelling.html index 528cf25..c254954 100644 --- a/resources/templates/auto/form-dwellings-Dwelling.html +++ b/resources/templates/auto/form-dwellings-Dwelling.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,12 +33,13 @@ You are not permitted to view id of dwellings address_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -49,36 +53,60 @@ You are not permitted to view address_id of dwellings {% endifmemberof %}

-

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-electors-Elector.html b/resources/templates/auto/form-electors-Elector.html index 0ed2cc5..0814a6c 100644 --- a/resources/templates/auto/form-electors-Elector.html +++ b/resources/templates/auto/form-electors-Elector.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,7 +33,7 @@ You are not permitted to view id of electors name {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -48,12 +51,13 @@ You are not permitted to view name of electors dwelling_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -71,7 +75,7 @@ You are not permitted to view dwelling_id of electors phone {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -89,7 +93,7 @@ You are not permitted to view phone of electors email {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -107,11 +111,11 @@ You are not permitted to view email of electors gender {% ifmemberof admin %} -
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -124,19 +128,43 @@ You are not permitted to view gender of electors {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-followupactions-Followupaction.html b/resources/templates/auto/form-followupactions-Followupaction.html index 6f47cb4..005a321 100644 --- a/resources/templates/auto/form-followupactions-Followupaction.html +++ b/resources/templates/auto/form-followupactions-Followupaction.html @@ -1,8 +1,12 @@ {% extends "base.html" %} - +{% block extra-head %} +{% script "js/lib/node_modules/simplemde/dist/simplemde.min.js" %} + {% style "js/lib/node_modules/simplemde/dist/simplemde.min.css" %} +{% endblock %} {% block content %}
@@ -12,7 +16,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof issueexperts canvassers analysts issueeditors admin %} @@ -30,12 +34,13 @@ You are not permitted to view id of followupactions request_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof issueexperts canvassers analysts issueeditors admin %} @@ -53,12 +58,13 @@ You are not permitted to view request_id of followupactions actor {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof issueexperts canvassers analysts issueeditors admin %} @@ -76,7 +82,7 @@ You are not permitted to view actor of followupactions date {% ifmemberof admin %} - + {% else %} {% ifmemberof issueexperts canvassers analysts issueeditors admin %} @@ -94,7 +100,9 @@ You are not permitted to view date of followupactions notes {% ifmemberof admin %} - + {% else %} {% ifmemberof issueexperts canvassers analysts issueeditors admin %} @@ -125,19 +133,61 @@ You are not permitted to view closed of followupactions {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-followupmethods-Followupmethod.html b/resources/templates/auto/form-followupmethods-Followupmethod.html index ced5877..7ced8e2 100644 --- a/resources/templates/auto/form-followupmethods-Followupmethod.html +++ b/resources/templates/auto/form-followupmethods-Followupmethod.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -25,19 +28,28 @@ You are not permitted to view id of followupmethods {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-followuprequests-Followuprequest.html b/resources/templates/auto/form-followuprequests-Followuprequest.html index 417bf02..2ab297d 100644 --- a/resources/templates/auto/form-followuprequests-Followuprequest.html +++ b/resources/templates/auto/form-followuprequests-Followuprequest.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,12 +33,13 @@ You are not permitted to view id of followuprequests elector_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -53,12 +57,13 @@ You are not permitted to view elector_id of followuprequests visit_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -76,11 +81,11 @@ You are not permitted to view visit_id of followuprequests issue_id {% ifmemberof admin %} -
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -98,11 +103,11 @@ You are not permitted to view issue_id of followuprequests method_id {% ifmemberof admin %} -
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -115,19 +120,43 @@ You are not permitted to view method_id of followuprequests {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-genders-Gender.html b/resources/templates/auto/form-genders-Gender.html index a232471..a5a60ce 100644 --- a/resources/templates/auto/form-genders-Gender.html +++ b/resources/templates/auto/form-genders-Gender.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -25,19 +28,28 @@ You are not permitted to view id of genders {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-intentions-Intention.html b/resources/templates/auto/form-intentions-Intention.html index 06887e0..15fde2f 100644 --- a/resources/templates/auto/form-intentions-Intention.html +++ b/resources/templates/auto/form-intentions-Intention.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,12 +15,13 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> visit_id {% ifmemberof admin %} -
- - +
+ -
+ {% else %} {% ifmemberof canvassers analysts admin %} @@ -35,12 +39,13 @@ You are not permitted to view visit_id of intentions elector_id {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers analysts admin %} @@ -58,11 +63,11 @@ You are not permitted to view elector_id of intentions option_id {% ifmemberof admin %} -
+ -
+
{% else %} {% ifmemberof canvassers analysts admin %} @@ -93,19 +98,43 @@ You are not permitted to view locality of intentions {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-issues-Issue.html b/resources/templates/auto/form-issues-Issue.html index eebc4f2..ec86dc3 100644 --- a/resources/templates/auto/form-issues-Issue.html +++ b/resources/templates/auto/form-issues-Issue.html @@ -1,8 +1,12 @@ {% extends "base.html" %} - +{% block extra-head %} +{% script "js/lib/node_modules/simplemde/dist/simplemde.min.js" %} + {% style "js/lib/node_modules/simplemde/dist/simplemde.min.css" %} +{% endblock %} {% block content %}
@@ -12,7 +16,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof issueeditors admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,7 +34,7 @@ You are not permitted to view id of issues url {% ifmemberof issueeditors admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -66,7 +70,9 @@ You are not permitted to view current of issues brief {% ifmemberof issueeditors admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -79,19 +85,46 @@ You are not permitted to view brief of issues {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof issueeditors admin %}

+{% endifmemberof %} +{% ifmemberof issueeditors admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-options-Option.html b/resources/templates/auto/form-options-Option.html index 2e3382a..aa168b2 100644 --- a/resources/templates/auto/form-options-Option.html +++ b/resources/templates/auto/form-options-Option.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -25,19 +28,28 @@ You are not permitted to view id of options {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-roles-Role.html b/resources/templates/auto/form-roles-Role.html index be6c211..ff7e440 100644 --- a/resources/templates/auto/form-roles-Role.html +++ b/resources/templates/auto/form-roles-Role.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,7 +15,7 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -30,7 +33,7 @@ You are not permitted to view id of roles name {% ifmemberof admin %} - + {% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -48,12 +51,13 @@ You are not permitted to view name of roles members {% ifmemberof admin %} -
- - +
+ -
+
{% else %} {% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %} @@ -66,19 +70,43 @@ You are not permitted to view members of roles {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-teams-Team.html b/resources/templates/auto/form-teams-Team.html index b56d6a7..dcf6f7c 100644 --- a/resources/templates/auto/form-teams-Team.html +++ b/resources/templates/auto/form-teams-Team.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -12,9 +15,9 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> id {% ifmemberof teamorganisers admin teamorganisers admin %} - + {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.id}} @@ -30,9 +33,9 @@ You are not permitted to view id of teams name {% ifmemberof teamorganisers admin teamorganisers admin %} - + {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.name}} @@ -48,14 +51,15 @@ You are not permitted to view name of teams district_id {% ifmemberof teamorganisers admin teamorganisers admin %} -
- - +
+ -
+ {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.district_id}} @@ -73,7 +77,7 @@ latitude {% ifmemberof teamorganisers admin teamorganisers admin %} {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.latitude}} @@ -89,14 +93,15 @@ You are not permitted to view latitude of teams members {% ifmemberof teamorganisers admin teamorganisers admin %} -
- - +
+ -
+ {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.members}} @@ -112,14 +117,15 @@ You are not permitted to view members of teams organisers {% ifmemberof teamorganisers admin teamorganisers admin %} -
- - +
+ -
+ {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.organisers}} @@ -137,7 +143,7 @@ longitude {% ifmemberof teamorganisers admin teamorganisers admin %} {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %} {{record.longitude}} @@ -148,19 +154,43 @@ You are not permitted to view longitude of teams {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof teamorganisers admin teamorganisers admin %}

+{% endifmemberof %} +{% ifmemberof teamorganisers admin teamorganisers admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/form-visits-Visit.html b/resources/templates/auto/form-visits-Visit.html index e5e7fc8..b818009 100644 --- a/resources/templates/auto/form-visits-Visit.html +++ b/resources/templates/auto/form-visits-Visit.html @@ -1,8 +1,11 @@ {% extends "base.html" %} - +{% block extra-head %} + +{% endblock %} {% block content %}
@@ -11,10 +14,10 @@ See [Application Description Language](https://github.com/simon-brooke/adl).--> -{% ifmemberof admin admin %} - +{% ifmemberof admin %} + {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %} {{record.id}} @@ -29,15 +32,16 @@ You are not permitted to view id of visits -{% ifmemberof admin admin %} -
- - +
+ -
+ {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %} {{record.address_id}} @@ -52,15 +56,16 @@ You are not permitted to view address_id of visits -{% ifmemberof admin admin %} -
- - +
+ -
+ {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %} {{record.canvasser_id}} @@ -75,10 +80,10 @@ You are not permitted to view canvasser_id of visits -{% ifmemberof admin admin %} - +{% ifmemberof admin %} + {% else %} -{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers issueexperts analysts issueeditors admin %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %} {{record.date}} @@ -89,19 +94,43 @@ You are not permitted to view date of visits {% endifmemberof %} {% endifmemberof %}

+{% ifmemberof admin %}

+{% endifmemberof %} +{% ifmemberof admin %}

+{% endifmemberof %}
{% endblock %} +{% block extra-tail %} + + +{% endblock %} diff --git a/resources/templates/auto/list-addresses-Addresses.html b/resources/templates/auto/list-addresses-Addresses.html index 35c7ad6..cab8e08 100644 --- a/resources/templates/auto/list-addresses-Addresses.html +++ b/resources/templates/auto/list-addresses-Addresses.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -34,6 +65,9 @@ latitude + @@ -96,15 +130,30 @@ View {% endfor %} - - - -
longitude +  +
@@ -58,7 +92,7 @@ longitude - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-addresses-Addresses'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-authorities-Authorities.html b/resources/templates/auto/list-authorities-Authorities.html index 9fff93f..d4dd91b 100644 --- a/resources/templates/auto/list-authorities-Authorities.html +++ b/resources/templates/auto/list-authorities-Authorities.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -25,6 +56,9 @@ access-token-uri + @@ -67,15 +101,30 @@ View {% endfor %} - - - -
authorize-uri +  +
@@ -40,7 +74,7 @@ authorize-uri - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-authorities-Authorities'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-canvassers-Canvassers.html b/resources/templates/auto/list-canvassers-Canvassers.html index b6ae6d1..8982723 100644 --- a/resources/templates/auto/list-canvassers-Canvassers.html +++ b/resources/templates/auto/list-canvassers-Canvassers.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -40,6 +71,9 @@ authority_id + @@ -118,15 +152,30 @@ View {% endfor %} - - - -
authorised +  +
@@ -70,7 +104,7 @@ authorised - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-canvassers-Canvassers'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-districts-Districts.html b/resources/templates/auto/list-districts-Districts.html index 2263933..59cb3fe 100644 --- a/resources/templates/auto/list-districts-Districts.html +++ b/resources/templates/auto/list-districts-Districts.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -19,6 +50,9 @@ id + @@ -49,15 +83,30 @@ View {% endfor %} - - - -
name +  +
@@ -28,7 +62,7 @@ name - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-districts-Districts'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-dwellings-Dwellings.html b/resources/templates/auto/list-dwellings-Dwellings.html index 4cc5d1d..473c656 100644 --- a/resources/templates/auto/list-dwellings-Dwellings.html +++ b/resources/templates/auto/list-dwellings-Dwellings.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -22,6 +53,9 @@ address_id + @@ -60,15 +94,30 @@ View {% endfor %} - - - -
sub-address +  +
@@ -34,7 +68,7 @@ sub-address - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-dwellings-Dwellings'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-electors-Electors.html b/resources/templates/auto/list-electors-Electors.html index 10777ff..55366fe 100644 --- a/resources/templates/auto/list-electors-Electors.html +++ b/resources/templates/auto/list-electors-Electors.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -31,6 +62,9 @@ email + @@ -89,15 +123,30 @@ View {% endfor %} - - - -
gender +  +
@@ -52,7 +86,7 @@ gender - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-electors-Electors'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-followupactions-Followupactions.html b/resources/templates/auto/list-followupactions-Followupactions.html index 797e9fe..e96ed1d 100644 --- a/resources/templates/auto/list-followupactions-Followupactions.html +++ b/resources/templates/auto/list-followupactions-Followupactions.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -31,6 +62,9 @@ notes + @@ -89,15 +123,30 @@ View {% endfor %} - - - -
closed +  +
@@ -52,7 +86,7 @@ closed - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-followupactions-Followupactions'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-followupmethods-Followupmethods.html b/resources/templates/auto/list-followupmethods-Followupmethods.html index 292c50c..e27df9b 100644 --- a/resources/templates/auto/list-followupmethods-Followupmethods.html +++ b/resources/templates/auto/list-followupmethods-Followupmethods.html @@ -1,28 +1,62 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + + @@ -40,15 +74,30 @@ View {% endfor %} - - - -
id +  +
- +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-followupmethods-Followupmethods'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-followuprequests-Followuprequests.html b/resources/templates/auto/list-followuprequests-Followuprequests.html index d2efd40..3809e40 100644 --- a/resources/templates/auto/list-followuprequests-Followuprequests.html +++ b/resources/templates/auto/list-followuprequests-Followuprequests.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -28,6 +59,9 @@ issue_id + @@ -84,15 +118,30 @@ View {% endfor %} - - - -
method_id +  +
@@ -46,7 +80,7 @@ method_id - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-followuprequests-Followuprequests'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-genders-Genders.html b/resources/templates/auto/list-genders-Genders.html index db02a22..9294b2f 100644 --- a/resources/templates/auto/list-genders-Genders.html +++ b/resources/templates/auto/list-genders-Genders.html @@ -1,28 +1,62 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + + @@ -40,15 +74,30 @@ View {% endfor %} - - - -
id +  +
- +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-genders-Genders'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-intentions-Intentions.html b/resources/templates/auto/list-intentions-Intentions.html index eba312e..8918d29 100644 --- a/resources/templates/auto/list-intentions-Intentions.html +++ b/resources/templates/auto/list-intentions-Intentions.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -25,6 +56,9 @@ option_id + @@ -73,15 +107,30 @@ View {% endfor %} - - - -
locality +  +
@@ -40,7 +74,7 @@ locality - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-intentions-Intentions'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-issues-Issues.html b/resources/templates/auto/list-issues-Issues.html index 661c9d4..3b409a8 100644 --- a/resources/templates/auto/list-issues-Issues.html +++ b/resources/templates/auto/list-issues-Issues.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof issueeditors admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -25,6 +56,9 @@ current + @@ -67,15 +101,30 @@ View {% endfor %} - - - -
brief +  +
@@ -40,7 +74,7 @@ brief - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-issues-Issues'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-options-Options.html b/resources/templates/auto/list-options-Options.html index 35a5e64..36a0ee9 100644 --- a/resources/templates/auto/list-options-Options.html +++ b/resources/templates/auto/list-options-Options.html @@ -1,28 +1,62 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + + @@ -40,15 +74,30 @@ View {% endfor %} - - - -
id +  +
- +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-options-Options'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-roles-Roles.html b/resources/templates/auto/list-roles-Roles.html index f573b01..a2310d2 100644 --- a/resources/templates/auto/list-roles-Roles.html +++ b/resources/templates/auto/list-roles-Roles.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -19,6 +50,9 @@ id + @@ -49,15 +83,30 @@ View {% endfor %} - - - -
name +  +
@@ -28,7 +62,7 @@ name - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-roles-Roles'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-teams-Teams.html b/resources/templates/auto/list-teams-Teams.html index 5c2ec09..b561259 100644 --- a/resources/templates/auto/list-teams-Teams.html +++ b/resources/templates/auto/list-teams-Teams.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof teamorganisers admin teamorganisers admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -28,6 +59,9 @@ latitude + @@ -78,15 +112,30 @@ View {% endfor %} - - - -
longitude +  +
@@ -46,7 +80,7 @@ longitude - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-teams-Teams'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/auto/list-visits-Visits.html b/resources/templates/auto/list-visits-Visits.html index 45a6a01..d0c6d3d 100644 --- a/resources/templates/auto/list-visits-Visits.html +++ b/resources/templates/auto/list-visits-Visits.html @@ -1,15 +1,46 @@ {% extends "base.html" %} - -{% block content %} -
+{% block back-links %} +
+ +
+ +{% endblock %} +{% block big-links %} +
+{% ifmemberof admin %} + +{% endifmemberof %} +
+ +{% endblock %} +{% block content %} + +{% csrf-field %} + + @@ -25,6 +56,9 @@ canvasser_id + @@ -71,15 +105,30 @@ View {% endfor %} - - - -
date +  +
@@ -40,7 +74,7 @@ date - +
{% endblock %} +{% block extra-script %} + + var form = document.getElementById('list-visits-Visits'); + var ow = document.getElementById('offset'); + var lw = document.getElementById('limit'); + form.addEventListener('submit', function() { + ow.value='0'; + }); + + {% ifunequal params.offset "0" %} + document.getElementById('prev-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)-parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); + {% endifunequal %} + + document.getElementById('next-selector').addEventListener('click', function () { + ow.value=(parseInt(ow.value)+parseInt(lw.value)); + console.log('Updated offset to ' + ow.value); + form.submit(); + }); +{% endblock %} diff --git a/resources/templates/base.html b/resources/templates/base.html index 420a7a7..28be249 100644 --- a/resources/templates/base.html +++ b/resources/templates/base.html @@ -9,6 +9,7 @@ + {% script "js/lib/node_modules/jquery/dist/jquery.min.js" %} {{site-title}}: {{title}} {% endblock %} {% block extra-head %} @@ -37,6 +38,16 @@

{{title}}

+ {% if message|not-empty %} +
+ {{ message }} +
+ {% endif %} + {% if error|not-empty %} +
+ {{ error }} +
+ {% endif %} {% endblock %}
diff --git a/resources/templates/home.html b/resources/templates/home.html index 59a851f..fa0dd1c 100644 --- a/resources/templates/home.html +++ b/resources/templates/home.html @@ -1,19 +1,47 @@ {% extends "base.html" %} {% block big-links %} - - + + {% endblock %} {% block content %} +

Alpha test code

- Although addresses in the database mostly are real, all personal data in the database - is randomly generated and does not represent real people. + This is a voter intention information system intended to be used by the 'Yes' side in the next independence referendum. + Design documentation is here.

+ +

Although addresses in the database mostly are real, all personal data in the database + is randomly generated and does not represent real people.

+ +

+ The Canvasser app +

+ +

Because the canvasser app now loads data from the database and uses your current location, and the database currently only holds + data for the Castle Douglas area, you're unlikely to see any actual data in the app. A dummy of the app in which you can see + data is here. +

+

+ The app currently works on the Chrome browser, and on Android phones. I don't yet know whether it works on iPhones. It does not at + present work with Firefox. +

+ +

+ The Admin system +

+ +

'Save' and 'Delete' buttons on administrative pages do not work; this is intentional at this stage. + I want you to be able to see what different roles in the project can see, without actually being able + to mess up the database.

+ +

If you encounter problems, please submit a report here. + General feedback on usability is also appreciated.

{% endblock %} diff --git a/src/clj/youyesyet/routes/auto.clj b/src/clj/youyesyet/routes/auto.clj index d20c677..c52eeb4 100644 --- a/src/clj/youyesyet/routes/auto.clj +++ b/src/clj/youyesyet/routes/auto.clj @@ -1,9 +1,11 @@ (ns youyesyet.routes.auto - "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180703T230819.733Z" + "User interface routes for Youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180705T101418.070Z" (:require [adl-support.core :as support] [clojure.java.io :as io] + [clojure.set :refer [subset?]] + [clojure.tools.logging :as log] [compojure.core :refer [defroutes GET POST]] [hugsql.core :as hugsql] [noir.response :as nresponse] @@ -29,13 +31,13 @@ (l/render (support/resolve-template "list-addresses-Addresses.html") (:session r) - {:title "Addresses", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-address db/*db* p) - (db/list-addresses db/*db* {}))}))) + (merge + {:title "Addresses", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-addresses db/*db* p) + (db/list-addresses db/*db* {}))})))) (defn form-addresses-Address @@ -45,11 +47,30 @@ (l/render (support/resolve-template "form-addresses-Address.html") (:session r) - {:title "Address", - :params p, - :record - (if (empty? (remove nil? (vals p))) [] (db/get-address db/*db* p)), - :districts (db/list-districts db/*db*)}))) + (merge + {:title "Address", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-address! db/*db* p) + {:message "Updated record"}) + (do (db/create-address! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-address db/*db* p))}) + (list {:districts (db/list-districts db/*db*)})))))) (defn list-authorities-Authorities @@ -59,13 +80,13 @@ (l/render (support/resolve-template "list-authorities-Authorities.html") (:session r) - {:title "Authorities", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-authority db/*db* p) - (db/list-authorities db/*db* {}))}))) + (merge + {:title "Authorities", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-authorities db/*db* p) + (db/list-authorities db/*db* {}))})))) (defn form-authorities-Authority @@ -75,13 +96,32 @@ (l/render (support/resolve-template "form-authorities-Authority.html") (:session r) - {:title "Authority", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-authority db/*db* p))}))) + (merge + {:title "Authority", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-authority! db/*db* p) + {:message "Updated record"}) + (do + (db/create-authority! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-authority db/*db* p))}) + (list)))))) (defn list-canvassers-Canvassers @@ -91,13 +131,13 @@ (l/render (support/resolve-template "list-canvassers-Canvassers.html") (:session r) - {:title "Canvassers", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-canvasser db/*db* p) - (db/list-canvassers db/*db* {}))}))) + (merge + {:title "Canvassers", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-canvassers db/*db* p) + (db/list-canvassers db/*db* {}))})))) (defn form-canvassers-Canvasser @@ -107,17 +147,36 @@ (l/render (support/resolve-template "form-canvassers-Canvasser.html") (:session r) - {:title "Canvasser", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-canvasser db/*db* p)), - :electors (db/list-electors db/*db*), - :addresses (db/list-addresses db/*db*), - :authorities (db/list-authorities db/*db*), - :roles (db/list-roles db/*db*)}))) + (merge + {:title "Canvasser", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-canvasser! db/*db* p) + {:message "Updated record"}) + (do + (db/create-canvasser! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-canvasser db/*db* p))}) + (list + {:electors (db/list-electors db/*db*)} + {:addresses (db/list-addresses db/*db*)} + {:authorities (db/list-authorities db/*db*)} + {:roles (db/list-roles db/*db*)})))))) (defn list-districts-Districts @@ -127,13 +186,13 @@ (l/render (support/resolve-template "list-districts-Districts.html") (:session r) - {:title "Districts", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-district db/*db* p) - (db/list-districts db/*db* {}))}))) + (merge + {:title "Districts", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-districts db/*db* p) + (db/list-districts db/*db* {}))})))) (defn form-districts-District @@ -143,13 +202,32 @@ (l/render (support/resolve-template "form-districts-District.html") (:session r) - {:title "District", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-district db/*db* p))}))) + (merge + {:title "District", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-district! db/*db* p) + {:message "Updated record"}) + (do + (db/create-district! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-district db/*db* p))}) + (list)))))) (defn list-dwellings-Dwellings @@ -159,13 +237,13 @@ (l/render (support/resolve-template "list-dwellings-Dwellings.html") (:session r) - {:title "Dwellings", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-dwelling db/*db* p) - (db/list-dwellings db/*db* {}))}))) + (merge + {:title "Dwellings", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-dwellings db/*db* p) + (db/list-dwellings db/*db* {}))})))) (defn form-dwellings-Dwelling @@ -175,14 +253,32 @@ (l/render (support/resolve-template "form-dwellings-Dwelling.html") (:session r) - {:title "Dwelling", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-dwelling db/*db* p)), - :addresses (db/list-addresses db/*db*)}))) + (merge + {:title "Dwelling", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-dwelling! db/*db* p) + {:message "Updated record"}) + (do + (db/create-dwelling! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-dwelling db/*db* p))}) + (list {:addresses (db/list-addresses db/*db*)})))))) (defn list-electors-Electors @@ -192,13 +288,13 @@ (l/render (support/resolve-template "list-electors-Electors.html") (:session r) - {:title "Electors", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-elector db/*db* p) - (db/list-electors db/*db* {}))}))) + (merge + {:title "Electors", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-electors db/*db* p) + (db/list-electors db/*db* {}))})))) (defn form-electors-Elector @@ -208,12 +304,32 @@ (l/render (support/resolve-template "form-electors-Elector.html") (:session r) - {:title "Elector", - :params p, - :record - (if (empty? (remove nil? (vals p))) [] (db/get-elector db/*db* p)), - :dwellings (db/list-dwellings db/*db*), - :genders (db/list-genders db/*db*)}))) + (merge + {:title "Elector", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-elector! db/*db* p) + {:message "Updated record"}) + (do (db/create-elector! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-elector db/*db* p))}) + (list + {:dwellings (db/list-dwellings db/*db*)} + {:genders (db/list-genders db/*db*)})))))) (defn list-followupactions-Followupactions @@ -224,13 +340,13 @@ (support/resolve-template "list-followupactions-Followupactions.html") (:session r) - {:title "Followupactions", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-followupaction db/*db* p) - (db/list-followupactions db/*db* {}))}))) + (merge + {:title "Followupactions", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-followupactions db/*db* p) + (db/list-followupactions db/*db* {}))})))) (defn form-followupactions-Followupaction @@ -241,15 +357,34 @@ (support/resolve-template "form-followupactions-Followupaction.html") (:session r) - {:title "Followupaction", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-followupaction db/*db* p)), - :followuprequests (db/list-followuprequests db/*db*), - :canvassers (db/list-canvassers db/*db*)}))) + (merge + {:title "Followupaction", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-followupaction! db/*db* p) + {:message "Updated record"}) + (do + (db/create-followupaction! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-followupaction db/*db* p))}) + (list + {:followuprequests (db/list-followuprequests db/*db*)} + {:canvassers (db/list-canvassers db/*db*)})))))) (defn list-followupmethods-Followupmethods @@ -260,13 +395,13 @@ (support/resolve-template "list-followupmethods-Followupmethods.html") (:session r) - {:title "Followupmethods", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-followupmethod db/*db* p) - (db/list-followupmethods db/*db* {}))}))) + (merge + {:title "Followupmethods", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-followupmethods db/*db* p) + (db/list-followupmethods db/*db* {}))})))) (defn form-followupmethods-Followupmethod @@ -277,13 +412,32 @@ (support/resolve-template "form-followupmethods-Followupmethod.html") (:session r) - {:title "Followupmethod", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-followupmethod db/*db* p))}))) + (merge + {:title "Followupmethod", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-followupmethod! db/*db* p) + {:message "Updated record"}) + (do + (db/create-followupmethod! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-followupmethod db/*db* p))}) + (list)))))) (defn list-followuprequests-Followuprequests @@ -294,13 +448,13 @@ (support/resolve-template "list-followuprequests-Followuprequests.html") (:session r) - {:title "Followuprequests", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-followuprequest db/*db* p) - (db/list-followuprequests db/*db* {}))}))) + (merge + {:title "Followuprequests", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-followuprequests db/*db* p) + (db/list-followuprequests db/*db* {}))})))) (defn form-followuprequests-Followuprequest @@ -311,17 +465,36 @@ (support/resolve-template "form-followuprequests-Followuprequest.html") (:session r) - {:title "Followuprequest", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-followuprequest db/*db* p)), - :electors (db/list-electors db/*db*), - :visits (db/list-visits db/*db*), - :issues (db/list-issues db/*db*), - :followupmethods (db/list-followupmethods db/*db*)}))) + (merge + {:title "Followuprequest", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do + (db/update-followuprequest! db/*db* p) + {:message "Updated record"}) + (do + (db/create-followuprequest! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-followuprequest db/*db* p))}) + (list + {:electors (db/list-electors db/*db*)} + {:visits (db/list-visits db/*db*)} + {:issues (db/list-issues db/*db*)} + {:followupmethods (db/list-followupmethods db/*db*)})))))) (defn list-genders-Genders @@ -331,13 +504,13 @@ (l/render (support/resolve-template "list-genders-Genders.html") (:session r) - {:title "Genders", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-gender db/*db* p) - (db/list-genders db/*db* {}))}))) + (merge + {:title "Genders", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-genders db/*db* p) + (db/list-genders db/*db* {}))})))) (defn form-genders-Gender @@ -347,13 +520,28 @@ (l/render (support/resolve-template "form-genders-Gender.html") (:session r) - {:title "Gender", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-gender db/*db* p))}))) + (merge + {:title "Gender", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do (db/update-gender! db/*db* p) {:message "Updated record"}) + (do (db/create-gender! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-gender db/*db* p))}) + (list)))))) (defn list-intentions-Intentions @@ -363,13 +551,13 @@ (l/render (support/resolve-template "list-intentions-Intentions.html") (:session r) - {:title "Intentions", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-intention db/*db* p) - (db/list-intentions db/*db* {}))}))) + (merge + {:title "Intentions", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-intentions db/*db* p) + (db/list-intentions db/*db* {}))})))) (defn form-intentions-Intention @@ -379,16 +567,35 @@ (l/render (support/resolve-template "form-intentions-Intention.html") (:session r) - {:title "Intention", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-intention db/*db* p)), - :visits (db/list-visits db/*db*), - :electors (db/list-electors db/*db*), - :options (db/list-options db/*db*)}))) + (merge + {:title "Intention", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"Id"} (map name (keys p))) + (do + (db/update-intention! db/*db* p) + {:message "Updated record"}) + (do + (db/create-intention! db/*db* p) + {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-intention db/*db* p))}) + (list + {:visits (db/list-visits db/*db*)} + {:electors (db/list-electors db/*db*)} + {:options (db/list-options db/*db*)})))))) (defn list-issues-Issues @@ -398,13 +605,13 @@ (l/render (support/resolve-template "list-issues-Issues.html") (:session r) - {:title "Issues", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-issue db/*db* p) - (db/list-issues db/*db* {}))}))) + (merge + {:title "Issues", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-issues db/*db* p) + (db/list-issues db/*db* {}))})))) (defn form-issues-Issue @@ -414,10 +621,28 @@ (l/render (support/resolve-template "form-issues-Issue.html") (:session r) - {:title "Issue", - :params p, - :record - (if (empty? (remove nil? (vals p))) [] (db/get-issue db/*db* p))}))) + (merge + {:title "Issue", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do (db/update-issue! db/*db* p) {:message "Updated record"}) + (do (db/create-issue! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-issue db/*db* p))}) + (list)))))) (defn list-options-Options @@ -427,13 +652,13 @@ (l/render (support/resolve-template "list-options-Options.html") (:session r) - {:title "Options", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-option db/*db* p) - (db/list-options db/*db* {}))}))) + (merge + {:title "Options", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-options db/*db* p) + (db/list-options db/*db* {}))})))) (defn form-options-Option @@ -443,13 +668,28 @@ (l/render (support/resolve-template "form-options-Option.html") (:session r) - {:title "Option", - :params p, - :record - (if - (empty? (remove nil? (vals p))) - [] - (db/get-option db/*db* p))}))) + (merge + {:title "Option", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do (db/update-option! db/*db* p) {:message "Updated record"}) + (do (db/create-option! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-option db/*db* p))}) + (list)))))) (defn list-roles-Roles @@ -459,13 +699,13 @@ (l/render (support/resolve-template "list-roles-Roles.html") (:session r) - {:title "Roles", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-role db/*db* p) - (db/list-roles db/*db* {}))}))) + (merge + {:title "Roles", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-roles db/*db* p) + (db/list-roles db/*db* {}))})))) (defn form-roles-Role @@ -475,11 +715,28 @@ (l/render (support/resolve-template "form-roles-Role.html") (:session r) - {:title "Role", - :params p, - :record - (if (empty? (remove nil? (vals p))) [] (db/get-role db/*db* p)), - :canvassers (db/list-canvassers db/*db*)}))) + (merge + {:title "Role", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do (db/update-role! db/*db* p) {:message "Updated record"}) + (do (db/create-role! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-role db/*db* p))}) + (list {:canvassers (db/list-canvassers db/*db*)})))))) (defn list-teams-Teams @@ -489,13 +746,13 @@ (l/render (support/resolve-template "list-teams-Teams.html") (:session r) - {:title "Teams", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-team db/*db* p) - (db/list-teams db/*db* {}))}))) + (merge + {:title "Teams", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-teams db/*db* p) + (db/list-teams db/*db* {}))})))) (defn form-teams-Team @@ -505,12 +762,31 @@ (l/render (support/resolve-template "form-teams-Team.html") (:session r) - {:title "Team", - :params p, - :record - (if (empty? (remove nil? (vals p))) [] (db/get-team db/*db* p)), - :districts (db/list-districts db/*db*), - :canvassers (db/list-canvassers db/*db*)}))) + (merge + {:title "Team", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do (db/update-team! db/*db* p) {:message "Updated record"}) + (do (db/create-team! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-team db/*db* p))}) + (list + {:districts (db/list-districts db/*db*)} + {:canvassers (db/list-canvassers db/*db*)} + {:canvassers (db/list-canvassers db/*db*)})))))) (defn list-visits-Visits @@ -520,13 +796,13 @@ (l/render (support/resolve-template "list-visits-Visits.html") (:session r) - {:title "Visits", - :params p, - :records - (if - (not (empty? (remove nil? (vals p)))) - (db/search-strings-visit db/*db* p) - (db/list-visits db/*db* {}))}))) + (merge + {:title "Visits", :params p} + {:records + (if + (not (empty? (remove nil? (vals p)))) + (db/search-strings-visits db/*db* p) + (db/list-visits db/*db* {}))})))) (defn form-visits-Visit @@ -536,12 +812,30 @@ (l/render (support/resolve-template "form-visits-Visit.html") (:session r) - {:title "Visit", - :params p, - :record - (if (empty? (remove nil? (vals p))) [] (db/get-visit db/*db* p)), - :addresses (db/list-addresses db/*db*), - :canvassers (db/list-canvassers db/*db*)}))) + (merge + {:title "Visit", :params p} + (reduce + merge + (merge + (cond + (:save-button p) + (try + (if + (some #{"id"} (map name (keys p))) + (do (db/update-visit! db/*db* p) {:message "Updated record"}) + (do (db/create-visit! db/*db* p) {:message "Saved record"})) + (catch + java.lang.Exception + any__2078__auto__ + {:error (.getMessage any__2078__auto__)}))) + {:record + (if + (empty? (remove nil? (vals p))) + [] + (db/get-visit db/*db* p))}) + (list + {:addresses (db/list-addresses db/*db*)} + {:canvassers (db/list-canvassers db/*db*)})))))) (defn raw-resolve-handler diff --git a/src/clj/youyesyet/routes/auto_json.clj b/src/clj/youyesyet/routes/auto_json.clj index 713c2bf..707e1b7 100644 --- a/src/clj/youyesyet/routes/auto_json.clj +++ b/src/clj/youyesyet/routes/auto_json.clj @@ -1,10 +1,11 @@ (ns youyesyet.routes.auto-json - "JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180703T230818.649Z" + "JSON routes for youyesyet auto-generated by [Application Description Language framework](https://github.com/simon-brooke/adl) at 20180705T101417.082Z" (:require [adl-support.core :as support] - [clojure.java.io :as io] [clojure.core.memoize :as memo] + [clojure.java.io :as io] + [clojure.tools.logging :as log] [compojure.core :refer [defroutes GET POST]] [hugsql.core :as hugsql] [noir.response :as nresponse] @@ -945,13 +946,13 @@ (do (db/list-visits-by-canvasser params))) (def - search-strings-address + search-strings-addresses (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-address + (db/search-strings-addresses db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -959,13 +960,13 @@ 1000000000)) (def - search-strings-authority + search-strings-authorities (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-authority + (db/search-strings-authorities db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -973,13 +974,13 @@ 10000000000)) (def - search-strings-canvasser + search-strings-canvassers (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-canvasser + (db/search-strings-canvassers db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -987,13 +988,13 @@ 10000000)) (def - search-strings-district + search-strings-districts (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-district + (db/search-strings-districts db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1001,13 +1002,13 @@ 10000000000)) (def - search-strings-dwelling + search-strings-dwellings (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-dwelling + (db/search-strings-dwellings db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1015,13 +1016,13 @@ 1000000000)) (def - search-strings-elector + search-strings-electors (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-elector + (db/search-strings-electors db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1029,24 +1030,24 @@ 100000000)) (defn - search-strings-followupaction + search-strings-followupactions "Auto-generated method to select all records from the `followupactions` table with any text field matching the value of the key `:pattern` which should be in the request. If the keys `(:limit :offset)` are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: `(:request_id :actor :date :notes :closed :id)`." [{:keys [params form-params]}] (let [result - (db/search-strings-followupaction + (db/search-strings-followupactions db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) (def - search-strings-followupmethod + search-strings-followupmethods (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-followupmethod + (db/search-strings-followupmethods db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1054,13 +1055,13 @@ 10000000000)) (def - search-strings-followuprequest + search-strings-followuprequests (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-followuprequest + (db/search-strings-followuprequests db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1068,13 +1069,13 @@ 100000)) (def - search-strings-gender + search-strings-genders (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-gender + (db/search-strings-genders db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1082,13 +1083,13 @@ 1000000000)) (def - search-strings-intention + search-strings-intentions (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-intention + (db/search-strings-intentions db/*db* (support/massage-params params form-params #{"Id"}))] (response/ok result))) @@ -1096,13 +1097,13 @@ 100000)) (def - search-strings-issue + search-strings-issues (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-issue + (db/search-strings-issues db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1110,13 +1111,13 @@ 1000000)) (def - search-strings-option + search-strings-options (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-option + (db/search-strings-options db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1124,13 +1125,13 @@ 10000000000)) (def - search-strings-role + search-strings-roles (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-role + (db/search-strings-roles db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1138,13 +1139,13 @@ 10000000000)) (def - search-strings-team + search-strings-teams (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-team + (db/search-strings-teams db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1152,13 +1153,13 @@ 10000000)) (def - search-strings-visit + search-strings-visits (memo/ttl (fn [{:keys [params form-params]}] (let [result - (db/search-strings-visit + (db/search-strings-visits db/*db* (support/massage-params params form-params #{"id"}))] (response/ok result))) @@ -1242,6 +1243,17 @@ (support/massage-params params form-params #{"id"}))] (response/found "/"))) +(defn + update-followupmethod! + "Auto-generated method to update one record in the `followupmethods` table. Expects the following key(s) to be present in `params`: `(:id)`." + [{:keys [params form-params]}] + (let + [result + (db/update-followupmethod! + db/*db* + (support/massage-params params form-params #{"id"}))] + (response/found "/"))) + (defn update-followuprequest! "Auto-generated method to update one record in the `followuprequests` table. Expects the following key(s) to be present in `params`: `(:elector_id :id :issue_id :method_id :visit_id)`." @@ -1253,6 +1265,17 @@ (support/massage-params params form-params #{"id"}))] (response/found "/"))) +(defn + update-gender! + "Auto-generated method to update one record in the `genders` table. Expects the following key(s) to be present in `params`: `(:id)`." + [{:keys [params form-params]}] + (let + [result + (db/update-gender! + db/*db* + (support/massage-params params form-params #{"id"}))] + (response/found "/"))) + (defn update-intention! "Auto-generated method to update one record in the `intentions` table. Expects the following key(s) to be present in `params`: `(:Id :elector_id :locality :option_id :visit_id)`." @@ -1275,6 +1298,17 @@ (support/massage-params params form-params #{"id"}))] (response/found "/"))) +(defn + update-option! + "Auto-generated method to update one record in the `options` table. Expects the following key(s) to be present in `params`: `(:id)`." + [{:keys [params form-params]}] + (let + [result + (db/update-option! + db/*db* + (support/massage-params params form-params #{"id"}))] + (response/found "/"))) + (defn update-role! "Auto-generated method to update one record in the `roles` table. Expects the following key(s) to be present in `params`: `(:id :name)`." @@ -1663,69 +1697,69 @@ request (route/restricted (list-visits-by-canvasser request))) (GET - "/json/auto/search-strings-address" + "/json/auto/search-strings-addresses" request - (route/restricted (search-strings-address request))) + (route/restricted (search-strings-addresses request))) (GET - "/json/auto/search-strings-authority" + "/json/auto/search-strings-authorities" request - (route/restricted (search-strings-authority request))) + (route/restricted (search-strings-authorities request))) (GET - "/json/auto/search-strings-canvasser" + "/json/auto/search-strings-canvassers" request - (route/restricted (search-strings-canvasser request))) + (route/restricted (search-strings-canvassers request))) (GET - "/json/auto/search-strings-district" + "/json/auto/search-strings-districts" request - (route/restricted (search-strings-district request))) + (route/restricted (search-strings-districts request))) (GET - "/json/auto/search-strings-dwelling" + "/json/auto/search-strings-dwellings" request - (route/restricted (search-strings-dwelling request))) + (route/restricted (search-strings-dwellings request))) (GET - "/json/auto/search-strings-elector" + "/json/auto/search-strings-electors" request - (route/restricted (search-strings-elector request))) + (route/restricted (search-strings-electors request))) (GET - "/json/auto/search-strings-followupaction" + "/json/auto/search-strings-followupactions" request - (route/restricted (search-strings-followupaction request))) + (route/restricted (search-strings-followupactions request))) (GET - "/json/auto/search-strings-followupmethod" + "/json/auto/search-strings-followupmethods" request - (route/restricted (search-strings-followupmethod request))) + (route/restricted (search-strings-followupmethods request))) (GET - "/json/auto/search-strings-followuprequest" + "/json/auto/search-strings-followuprequests" request - (route/restricted (search-strings-followuprequest request))) + (route/restricted (search-strings-followuprequests request))) (GET - "/json/auto/search-strings-gender" + "/json/auto/search-strings-genders" request - (route/restricted (search-strings-gender request))) + (route/restricted (search-strings-genders request))) (GET - "/json/auto/search-strings-intention" + "/json/auto/search-strings-intentions" request - (route/restricted (search-strings-intention request))) + (route/restricted (search-strings-intentions request))) (GET - "/json/auto/search-strings-issue" + "/json/auto/search-strings-issues" request - (route/restricted (search-strings-issue request))) + (route/restricted (search-strings-issues request))) (GET - "/json/auto/search-strings-option" + "/json/auto/search-strings-options" request - (route/restricted (search-strings-option request))) + (route/restricted (search-strings-options request))) (GET - "/json/auto/search-strings-role" + "/json/auto/search-strings-roles" request - (route/restricted (search-strings-role request))) + (route/restricted (search-strings-roles request))) (GET - "/json/auto/search-strings-team" + "/json/auto/search-strings-teams" request - (route/restricted (search-strings-team request))) + (route/restricted (search-strings-teams request))) (GET - "/json/auto/search-strings-visit" + "/json/auto/search-strings-visits" request - (route/restricted (search-strings-visit request))) + (route/restricted (search-strings-visits request))) (POST "/json/auto/update-address" request @@ -1754,10 +1788,18 @@ "/json/auto/update-followupaction" request (route/restricted (update-followupaction! request))) + (POST + "/json/auto/update-followupmethod" + request + (route/restricted (update-followupmethod! request))) (POST "/json/auto/update-followuprequest" request (route/restricted (update-followuprequest! request))) + (POST + "/json/auto/update-gender" + request + (route/restricted (update-gender! request))) (POST "/json/auto/update-intention" request @@ -1766,6 +1808,10 @@ "/json/auto/update-issue" request (route/restricted (update-issue! request))) + (POST + "/json/auto/update-option" + request + (route/restricted (update-option! request))) (POST "/json/auto/update-role" request
+{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Address
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

Addresses of all buildings which contain dwellings.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Authority
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

Authorities which may authenticate canvassers to the system.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}
Canvasser
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers admin canvassers teamorganisers issueexperts analysts issueeditors admin %}

Primary users of the system: those actually interviewing electors.

+{% endifmemberof %} +{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %}
District
+{% endifmemberof %} +{% ifmemberof public admin canvassers teamorganisers issueexperts analysts issueeditors %}

Electoral districts: TODO: Shape (polygon) information will need to be added, for use in maps.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Dwelling
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

All dwellings within addresses in the system; a dwelling is a @@ -60,110 +79,155 @@ All dwellings within addresses in the system; a dwelling is a

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Elector
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

All electors known to the system; electors are people believed to be entitled to vote in the current campaign.

+{% endifmemberof %} +{% ifmemberof issueexperts canvassers analysts issueeditors admin %}
Followupaction
+{% endifmemberof %} +{% ifmemberof issueexperts canvassers analysts issueeditors admin %}

Actions taken on followup requests.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Followupmethod
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Followuprequest
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

Requests for a followup with an issue expert

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Gender
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

All genders which may be assigned to electors.

+{% endifmemberof %} +{% ifmemberof canvassers analysts admin %}
Intention
+{% endifmemberof %} +{% ifmemberof canvassers analysts admin %}

Intentions of electors to vote for options elicited in visits.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Issue
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

Issues believed to be of interest to electors, about which they may have questions.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Option
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

Options in the election or referendum being canvassed on

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}
Role
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin %}

A role (essentially, the same as a group, but application layer rather than database layer) of which a user may be a member.

+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
Team
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin teamorganisers admin %}
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}
Visit
+{% endifmemberof %} +{% ifmemberof canvassers teamorganisers issueexperts analysts issueeditors admin canvassers teamorganisers %}

All visits made by canvassers to dwellings in which opinions were recorded.

+{% endifmemberof %}