From 07b56dcd40870d02a1d114bf04de3b42688ab530 Mon Sep 17 00:00:00 2001 From: Nicole O'Connor Date: Sat, 28 Jan 2023 21:08:47 -0800 Subject: [PATCH] base game code; there's no game here (yet) --- .gitmodules | 3 +++ Dockerfile | 28 ++++++++++++++++++++ LICENSE | 7 +++++ app/index.wsgi | 22 +++++++++++++++ app/pylocal/core.py | 29 ++++++++++++++++++++ app/requirements.txt | 2 ++ app/templates/main_page.j2 | 39 +++++++++++++++++++++++++++ ext/imsky/wordlists | 1 + static/css/seagull.css | 53 +++++++++++++++++++++++++++++++++++++ static/image/seagull.jpg | Bin 0 -> 28062 bytes static/js/seagull.js | 48 +++++++++++++++++++++++++++++++++ 11 files changed, 232 insertions(+) create mode 100644 .gitmodules create mode 100644 Dockerfile create mode 100644 app/index.wsgi create mode 100644 app/pylocal/core.py create mode 100644 app/requirements.txt create mode 100644 app/templates/main_page.j2 create mode 160000 ext/imsky/wordlists create mode 100644 static/css/seagull.css create mode 100644 static/image/seagull.jpg create mode 100644 static/js/seagull.js diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2313d22 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ext/imsky/wordlists"] + path = ext/imsky/wordlists + url = https://github.com/imsky/wordlists diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0cb305a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM python:3.11-alpine AS base + +# install rust environment (for rant) +ENV RUSTUP_HOME=/usr/local/rustup CARGO_HOME=/usr/local/cargo PATH=/usr/local/cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin RUST_VERSION=1.61.0 +RUN apk add --no-cache rustup gcc musl-dev +RUN rustup-init -y + +# install rant +RUN cargo install --color=never rant --version 4.0.0-alpha.33 --root / --features cli + +RUN mkdir -p /lib/wordlist +COPY ext/imsky/wordlists /lib/wordlist +#RUN python /lib/wordlist/render.py -o rant /app/rant/wordlist.rant + +# prereqs +COPY app/requirements.txt /app/requirements.txt +RUN pip install -r /app/requirements.txt + +# installing app +COPY app /app +WORKDIR /app + + +CMD [ "python", "index.wsgi" ] +EXPOSE 80 + +FROM base AS dev +COPY static /app/static \ No newline at end of file diff --git a/LICENSE b/LICENSE index d5075a3..84641cc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,5 @@ +Copyright © 2023 Nicole O'Connor. + Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the @@ -15,3 +17,8 @@ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + + +(Images used in this project come from Wikimedia Commons. Individual +file sources can be located within each file's metadata, which can be +read by tools such as rdjpgcom(1).) \ No newline at end of file diff --git a/app/index.wsgi b/app/index.wsgi new file mode 100644 index 0000000..4e101bc --- /dev/null +++ b/app/index.wsgi @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +import gevent.monkey +gevent.monkey.patch_all() + +import logging + +import flask +from gevent.pywsgi import WSGIServer + +from pylocal import core + +@core.app.route("/") +def index(): + if not core.base_context_live: + core.render_base_context() + return flask.render_template("main_page.j2", **core.base_context) + +if __name__ == "__main__": + #core.app.run("0.0.0.0", 1337) + http_server = WSGIServer(('', 80), core.app, log=logging.getLogger(name="gevent")) + http_server.serve_forever() \ No newline at end of file diff --git a/app/pylocal/core.py b/app/pylocal/core.py new file mode 100644 index 0000000..7c39742 --- /dev/null +++ b/app/pylocal/core.py @@ -0,0 +1,29 @@ + + +import flask + +app = flask.Flask("seagull-game", root_path="/app") + +base_context = {} +base_context_live = False + +def render_base_context(): + global base_context + global base_context_live + + print(flask.request.host) + + domain_components = flask.request.host.split(".") + base_domain = ".".join(domain_components[-2:]) + + # all this wind up for... + if base_domain == "otl-hga.net": # production, use assets from S3 + base_context["styles"] = ["https://cdn.otl-hga.net/seagull/css/seagull.css"] + base_context["scripts"] = ["https://cdn.otl-hga.net/seagull/js/seagull.js"] + base_context["seagull_pic"] = "https://cdn.otl-hga.net/seagull/image/seagull.jpg" + else: # dev, serve files from here + base_context["styles"] = [flask.url_for("static", filename="css/seagull.css")] + base_context["scripts"] = [flask.url_for("static", filename="js/seagull.js")] + base_context["seagull_pic"] = flask.url_for("static", filename="image/seagull.jpg") + + base_context_live = True \ No newline at end of file diff --git a/app/requirements.txt b/app/requirements.txt new file mode 100644 index 0000000..8bdc19b --- /dev/null +++ b/app/requirements.txt @@ -0,0 +1,2 @@ +Flask==2.2.2 +gevent==22.10.2 \ No newline at end of file diff --git a/app/templates/main_page.j2 b/app/templates/main_page.j2 new file mode 100644 index 0000000..7337ee6 --- /dev/null +++ b/app/templates/main_page.j2 @@ -0,0 +1,39 @@ + + + +Seagull Game +{%- for style in styles -%} + +{%- endfor -%} +{%- for script in scripts -%} + +{%- endfor -%} + + + +
+ +
+
+
Nameless ✏️
+ +
+

Lv 1 LoadError

+

+ Colony: 1337
+ Shinies: 420
+

+
+
+ +
+
It has been a cosmically unknowable number of days.
+
+
+ +
+ + \ No newline at end of file diff --git a/ext/imsky/wordlists b/ext/imsky/wordlists new file mode 160000 index 0000000..cdda0e8 --- /dev/null +++ b/ext/imsky/wordlists @@ -0,0 +1 @@ +Subproject commit cdda0e81d62151349c3a17679b5a0433eec60327 diff --git a/static/css/seagull.css b/static/css/seagull.css new file mode 100644 index 0000000..0ef2476 --- /dev/null +++ b/static/css/seagull.css @@ -0,0 +1,53 @@ +html, body { height: 100% } + +div#root { + display: flex; + width: 100%; + height: 100%; +} + +div#main-sidebar { + display: flex; + flex-direction: column; + + max-width: 265px; + /*padding-left: 5px;*/ + padding-right: 5px; + border-right: 0.125em solid rgb(192, 192, 192); +} + +div#side-seagull-name { + text-align: center; +} + +div#side-seagull-name-editor { + display: none; +} + +div#main-content { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + + padding-left: 5px; +} + +div#main-log { + display: flex; + flex-direction: column-reverse; +} + +div.log-line { + display: flex; + flex-direction: row; +} + +div.log-tick { + font-size: 0.75em; + margin-right: 0.2em; +} + +div.log-msg { + margin-left: 0.2em; +} \ No newline at end of file diff --git a/static/image/seagull.jpg b/static/image/seagull.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c33228495ac6148f73ff4e4befe6ce69e496b92 GIT binary patch literal 28062 zcmbSxWmH_jvhJP%26uON4^D7*7%aHEYjAf4m*6%KJdh9|cnIz;fk3dJAp{5{KnT3a zJ@=h+-dpS5C-tM}o9gPW+EulCSNH12kB{2`o|=-X5&%LF7l;c09v=V;C1*E#I$uwJ zA6t8IIwwCrFL7R8TTgd)PY++70B2WccY8Z$YaUM@N8Z2xc>juvKePAsv-k0^bo6&~ zvvjle@%Od#w6%4%v-j|`c60W%6cpnV<#F+HeB8w{Qk9pt)X~*eQq@pIC+7Ydr=$-cNL5ju&KDu{7yle+ zAX)%el&#`P}-Bmc!d z2m=wA>@Rlw2S)e~A@dI`^B3E>d)Ogl{@Uzi=Wh2G48&gTO@Y_SU`tfQ{#3Ai_=n zkoWWo@^N-_@}pz3WvAm86BDIVu@7*w_w(b{v9@)!_OYXr_jLEN_6P!ie?0TwQ2@bT z-_jwREX*$^EX@6c2jTvI(tq3ePpSVN{Eh8DBz{2uBW56ysekeQHTGXTPdEUGUL$;y z@h_fD0RX&<0|2u1fAN^g0RT4^0NQ8&?RiN4=F5L3aX>%-kF&ik&tHfBlm3qa|CIc% z!N2L_`K#}rzN1sHcd+(%^P~IgR9jCs#7jlz>t$_gPsjbgC-MLHz<)FA-|XPhwRf=h zvG+izGDKvVvxg%h+#Yt$e$JjAbj}|CRfPXPhy9xkf8js!8UYBa9snXs9sqBa2tfKa z1t1e*0!U`1h#t^CgBXp3xruBkvIy(f=Rq|I&cd5r4tH&W?0{+48#jbhiFJ z&;Me?JMp(c0WbhufCwN5XaGil4d4cz03yIsKn73*)BtTjA20?i09(Kba0h&V03Z~I z0^$J}kOAZZg+Lil1=ImeKnw5==m94J2Kv|$dPz9(C^aj)k`T!aS&4boJ zJD_9GCFl-}1jYgrfvLePU|z5&SQe}f)(4w|9l_q!+Eh23rog&>LLy!rP z>5#dRpCYRu8z9>vdn1PSN=;G+w z=yvEq=;`QH=w0Zu==+>~#QuzZgF}eJ zgQJRLhZBKQgwu|*fOCe6j?0WIi)(=!jQaxjE$%GtDIPi=3!XflHC{Mg5nd`#Tgqh0 z7Rq%hFck-tE>#FsCDjzwH8l;jGPM_V0repDDGdpY42=s-4ox4;F)bmj6s*%?z827>uHf4vaaB1B~ZPv`m^z zp-c@->&)oPqRdXrdCa5CzgSpVp0Ombykj|HC1X`(4Q6d%-C)CJlV=cTvtN25yfx z=e;<+;=Q)L#l3UA&wbQ=s(nGe=Dr<%M2KQ)%Ad_Y&VT2*)bpa}HvxtLZv*iIJp!kK zID(Rb4uh3~Uxpxu*oF**(uYQc?u5yPRfL1WZNdj47$agM_9K-eYojotT%)F=`J%I; zuVS9Xbj4D~M#k>NDaSR$WAC`&|6bWWT}5=bgYdPufQo`CVeUcl~CY*Qvu z`BU>#AJZJtX3~YzOEVxD9vLf{(wVhc_*ubOd)b=V?KyNg$vIcKmbv3E1YeZpVdVMe zZRcy`cN8!cWE9*NIu$M#$rUvhQxzu_|0=O7Styk$Z7QQKgO%NtJC}c~P_Af)v%p_e zLMoqE9#k1tjlL9pSyxR_4XgfB<59C+t6Mu%CsJ2ePgS4Z0B-PaIBqm+oO`A4s-ua! zsiK*r8TJ}@?f?4Zjn$i#7WI~ax1w*GTA5pm+X&l|+d=I??dR{D-fedncg%OHbq;hr z?P}}h>8|Oa?{P&y5Fn+^n>Gvy#dRCPlHB-OGD71nPK(eu@R+_ z!BN@K_hXV{J>%lzofD!H?ven|PZqK2v>$Z?SJRZwqht z?kMa`?dt7*+OysJ`o;Il{eJ8L_Q8uo+QYh|Cr3TUO2>02rYHMfy}tfFjsJ%Kt@w=X zto6Ih_o;KE^Zg5-i^t29ALKu3t^}_Ju63?I|8)QP`&aS}`AzMu=g0pNa(oe7+F}^IoQc*x%s%+_?X$)+5S!fLVVXS&@c!wFbLTwNGRC;pXsq5 zz()fEpm`(^J^;oCA>o4_hX5)>?Sk}opY^v=`3Hf(NC7g5d=a3K*&f45fDC@9*G~BKo)9^LdfvMTMk0R zC?Fq|`M3^XA^nF5_<%HU3*|i88?I7&y=2cf&mNys7oT&-!jqaYhn=a=5IIFOsQx6s z%W6zR5S;HkVH3woG;hy0C!}GH!q3g7VXVpTmrbfP9-n1h!7qrWU4ImtF(+r^90lUH z2UwTp(c|ERjE1paqJ}13zSBg07rln70%yt*2wM$obCgyW|3Y6-4xxsH zLB^QhuU|umO+ynf=C{YoFGTX!FjnWVuH>+OiDCVdTo0S8e#e<)rYW&8|nNrH2hv^AtD4XRs&LaM&E> z3@RnXCu#69rJyPKjZDadNQYys?ik-b+cFy8Z&*k zx)5V|Pxs{&E*0R=I)ydd{v7VXoZ;Wj(MjbDWb80@f~vSGj1D!Kll+#PO}@oaHEXy+ zHHB`zb6tG#8k0HD0K;(0&q~t67HetnKptAm*TW_p=UdDfW=AVTNJTeMfHcg7_>rr5 zVvUFZHYXHB_+fR(2-6EQ*b_c}h#g)mVqq?)BpS{+7?00c)4(tolx2@cOb9eY%knMi zVcYVWTZHKF8kBI&>0uAzoa8U{;`=m4{?Rulj|RkbVxF)~W3chc%lJ?PW%?l@=_Fcj z>PRehQ3y07aWIdW2>8oEIe0SJXzWS7Vyfz$4|K%jRXXV_g)-)a6$z3mpOEDHcfpSj z6j~kRpas~Vu`U66w&@=V^MzoZodXR)RHJIH$|p8wc;0%1+Cqz@UJe?Xpz-*Z1^j-f zjM8>*&CQHMRKzsQK@-&}n>zCdwu4R%DGTezmk5EsVUpK=LcxsfGnkaSpb;efaj-E} z-t{H=S{{wsE3SeZ}w;iPr-5^cF+QV+K*t`j<=jDF(bgh@Og%R4#eLZ zQ>wlkw+qI8ptvxVpW&c~a7tl@4^OFUMNM&pBJuQs;pYgs^IG)CdW$qWxzrH$)YGIR zR1YF^zHdvOsrS)P=}f8Gz7Kvl^`x~jGh;Ffv3wp;)0s*hYAsg%%S5PQgaqcSw1pYv zVx;NiW|=NeR1H$Asi3u1n=+d1id`sk1j!(U9HeDMmW(7Es1=T+frAVN;aapk3DyXd zo8YIFo_fLha6-$)>s!(rac`r8-nks>d*qa;Tk$>boeFCx39H; zb5Lc9(EhTVNJW5{0<@}-^Fxkj%(%0nQaF(;fXUL49g95IvE3MX(|O|8++tTk?RZqmCZK9WDaXT3aZ#dK+1=CJq?CfUACNz(pi5BCI>$&SG1OJNL4vw zJ?m>^wJJ$_#gZH}MSO}{yZcJCFn{i7c_an67CVrfB$sc1&-exY(VlRgp(;84u}E}`al~EdD?$G0*f54qUsVTSjJXP82t&tHOQd>$~(};uPqtwY_A7%6rG|IybqU>`Tg5L#BMK=O$%P;qv`SD1w-D_p81X=aAy+`*ktbj`&$ zc)k8G(=i-@iRDOi7D*Lj6s@%t3NjZ(}m%^Bl< zdOM?)oue_mH2%$NK=NEs@eEJ6Q$F=ijCU7z_dGk{{7Gtvx*d)i>?LKDJzGnIpF0L^ z^yi5RC;j25v06mB@&NWLU4&g$8&&4_pk_r~vNL$Te%u{>SQI_p0E{KpoIBGVyk|hL zNeVtGO*x9BAfhWt#!L4zMT;XuBb?StI>DazdPT~XOGjVNRRT%1*29*QUo)VK1@k0| z$YUMBRPj8~GTf4}2T0t6VYS||+T(f{&lM?&R0Us>;_9md3Ln_uP(MY zx$AlGwiMClT{+$sLR}l1|8Qexlltr``(*lFp&HlrOf^W>R~RSXLy2C@ZQM>!Spbep8IY|d_pkUT~3o}Dp{8ZypnMCp@oPhdbF<7Y-+ zPhZh`Ez@pLv;k7g_{lbpEvV#Jj`s*eZx6sep2Fg$u?Hx|4G35!m@5sQt!aINd!YNU zu0O;CcnS`M{&|Kopmj)5|ktfqq*y7l#RcjQU1uM%2YwM$7POvyf7GmelsR16<`Kax zIrUjFw(zXB#MyfK?3oFoclt4|4A)AD4rC-yrSWPa&c-oYMT%@JhBPPLg_EkI4_z!j zgUcDl3ak|4!9sKt#*V6JuJfe0U2HHSjbr@!#%(k-g?@1k=dk6J2ZbxeiC{7lpYD@X zu-r`Snn_Vc$_GULJ~&Z))Tn)XBLwCrfO%E>8`e;IzAciA-$|t>p;@n3LorUM&+J*? zaE>fbeA7ZxmtL5vf_?z2#u>}bEFvn&tMZ>WbL`^n;`&L%EJgrZNqQ$ZxW*6xLCF}T zV0b`gkOxtaYi<)cVywm3IXu;TP&2IV%GbuZNHM}0^ePThDvD+kMLLn2T^H9Py`UV8 zmeAPoKux6{RNkoBNa|RKe6OwbCqXG7xDo)e}tjbpK&rve%^3XIBxOE&w9&$yMkU_yW zMqhu5-rsa$98(Xt+;?>iu^{=DG$-nJEkcf8)*Z&Yt5F5DEf$^L?7y71XdWz`y;mO1 zU+>VOx)ar_W+eUnf@XpFb7WJ%_=xz$g~_iC-jA{(zY1oJYF;+F(bWph%zkLm4>^K|GuNv^lIM4_YH5_v;2|Y0>BI*tzn+p zRZPN^>>c+k>o?fWABhK%{tZhUbX%{R7wMNLW_M&J#e1Z~W>l8gBUa;on$ayXC_Ce& zg1IM#_Z)XJEY;Jj%^ZMg4)I*0&kHcNHN{LpoceP22`arf%D5I-+1oW-Ik!YLE&xTH zzDkbXMZgZD#T2ernpkFUCsP{2&F=uj(~M^EZsUyC(UC&KqTsySMImt2-YW4EeHY8M zuz5a4%PVkHDh7QjzE`@wCI$Tx3aJX7y*h!2GNycX0!ZuOhn7d1Ag_&_yc?zt#H+^4Z@n zHV+JRKkHlFegquM2nWwznzvG?j6T^TOmgxq3~GCi84@M=497x!{Ah2$J4CHi&o|sb z)$Eh5iGwOL$~S+mcS$FBat$T{XpK$PYxz&2--*<`$@r{b-}2nDz15LEQ#mRQtL=m$Ki@AmvjeIEi_2jbTdx zSAiKspst1QrI_)$ZC*$~>z6LCl{vxl47}8wpyr}| zrL>^IqrP^Q?m?pwbjdr=w7OkMGY(~Nc;ZjbQyBV(u+P$I?Jq=iUE@)SI~PMCT9hb)q^$Ut<>&gI4jj^s5B+1EJ) zV>lBSWhxe22ITcnzwCOfnTp2PdG!Lw1xE5FbWkZWC{+iNUEf+3zB30Tj$2}U5XtUp z$v=2jMJZ+%!Ca@|ebHfcuFbvjQkjrA+Ohk2#gYQ0Fun$amuxGm=iQ{ zoX@R&QF(2UE~m|O{Jeq5?JfC!gaXJww3uy$3A-s(TcykxieBZT;+CWlYrZz;;*4Co zvi1(LA2^5uC3QTqqNHpvFOGev7|)W>P{jJGA$cq69q3qnGk+H37H#n)mH{kk=OK zHl|mq(3@PDUpHNms7ptTJD%t1#+>7`CHo=49f%KtWF~-Z<%3z;UX7K%*a|N<4vCg? zN^(?ZiIr%G|U^1C{DIvHbHm5GC^=4`AZW*WucbCh-_T>}nIoYUL<^kOIaKLmOG0 z$;n_n2;=Si9RnMKhoJIPkq&DT(<5pkQ@=rI4>xO}jWar|erjtR{R-+(OgWIMc@J>K zI}cr{SkPh81MVsGbYPv5XhL;}DWfp92E!wOx=ciJ)~Jq!B4mf}7svI^K&lQhe$uj( zwiPQOl6s*{SurRYZnzZ4TW7HSrBcJ?m(nLt9TV_&vUpEuF#)$Ny!~7`_O%qr_SI`6 z46k{dkPV6JvWk#d>2eax;mMM|&z~jiN+h{djGU&Q(lxdm(H-oQl<5<iD=W10M{@Mop?FUXL=;#{Ys3Wwmh%i*__(J|TBG783~US;hY#l;&N-`Hn`5 z>PC#1JpqkDys319>rL8A5&l(@gSYu*Ssj?%_Dp(Ezf8aCVSd4=woF0QO`|+*d)=Y< zB!D=nMiMGy7G>`}>lLe3Rfk7pN^j<`vAj`&-@>w8fY$vwbjelOP7ukS#3x?pG|`8U zRLx){d>os|Ro$jB5t5`D44^}U@k2Or+!+PR{( zBuxyg(JJz1y`s#1ZM^SD-quHO*-87Vx8Q~qbNdWq9oyG+j}u>yFcB=dcPny((oa3} zGBC)ur)jl29eqTyjZdW`vE^VPJh29eUAE*4IvYFRUP~nlFS$}o3}(OgoG;W@|6z${ zZkuY`152U0iLL(7ftx#qJkk48p_(mJkbv zwp_p+L;0_0Vse-6NjkV~Nn(>9kAYdEx!EF9LtP3^K+brshSe(_ZbojC0*Pq`W#&3% zPLf~Ug4{~3u+(ZZrbNyficz+08zYKCo|cY}qtK`o&YE|e(p+gMX>^U&cn7(O#%(9n zTosB7FnUbYFLfTY_PR^a5Z?NZ5CCX&PMy~ zX8MkWxgj^{`xz}saSGJlA*a2TIS$IjB8N)V;KA}0F^{kf9OS_#LeY4y@#*!a0V1Yq z)~reM_|{piq+X^X%bMQg5NR5k9rxW(tqdwtk~y;lUb)PLGCBW%^0mO8KJB)#Ux7Ul z#?6fj_RUru;*EUsb_Vv_Y@BswkODq2_#WpQx&*vWIQDupA!*+2)@)rat)u&aSwV7z zOMA_rXG0_LJbm=v?Zy2HeS1fRb^VZVY-Ut3}uDEy*JlwpxeFP|erl#)V zHtWT0yY8I}`m{9B9dKED)Aw0%nImJfaCO}DgnK;uKGVI$3LAZpu-*x^9C3b<-C*4j zPmuJ3VDLLxNNO0PednJuQvagK;n|Jn_uP9E%Qvaw66TGf8uIWozM#-W8tX|}`_M_|vrINq?Ahi)Up7UPs+u)AHcm}*T5O!!C+gwl2+Hc@$nkzc zQkcL4GDJDbqlrtZp%`zYkF3BaZWQ2CsB1P{5wsEY?u^^L{plCUYZK13G2?q^jbzTUF708yDz%t#L(Y2%hZ z0>7z6U^W~v7bBv{;&fClBqTI-suA)CbUW{uT$(3(HJCbkcm6?z-#p+*Z~XWiTKWhu_eca$xf!_hhz#CL zu@LW;a&^8OZo||vEK=O{^fb6;95lLT9j28>w}_XjpzCu&jozhlu==IH)v{ zREslhmDiWgtwviQM#&mF)Q=->M1DXY`Un&_(h&aqb#FT1`#|gY(_Wq8J9bMuOJ%(d z3*QXUh|~Vlw9J#f^wHwJ?9=nmqS5c(rxD#>Te3@xUSyXug+-tJa80+w)#({7BsOUE zYQ~N{MskkB+f3jl@up^mmcE7Pu^zH(23!=oBqfQeE?S_LM)llEK<<&+OE({u2Sp zO7ZDf`B5e5ykIp~FA4@o{;M`Z&DYfjCW~os5J{Tj^7!E|t0B z-6mTPidL^2kaohv@0F@`$JPalD*vI7@o-E*5TCJ(^s!d1Akjebj*n=;yB}3>S<0yw zf1Z3PA3n1s_fvgae)o*!Zg)qKc_yUtAFvv%Y7x1;l$ht1WK zChF+QxWUDjN=57own$_nBAh03bbv55Da`-t)hgo3Mtz;`f*MzfkW1F|Sqvh!f#*B) zuQrJ(jGjS)OsFn}j`G=ut$Gi0hg8_NB#A|)_PwQI-4_iEGCjWX#0b<%s*Kxd)l|Dt^G9*Bcff-8%F{q867d+VR}4c*9|7;l zZ;sH_@rl5|wcD`ScxzgvT;3qf9OnfmdkU=in1YkO;?RZ=2`hh7&0I}i^LQ&hk03R4 z3XKUXCPe*OqL^IQXi$gMGr(DpT!o~SCvO(K^ufDD(LPK##>y}zQYn$+GZv8?H>x=S zR$zQo;hz@?oJ3pf8Se->K6bfB2Vm;Hu}w&gl2}zWYbY@Ma@wWjW&n&WdpzSLcM+yh z8rz4$Du87<0BTiorAjg{ylgbvnwwE2&T-g%ba}1hld)0%dWk254w+al&Bg??cDW

x*NTy~U2<|%!4%~>0rGDtD|Ou9x@-EvMdZ+0d_lSl0$959>DT_iM}Xu4 z!!EhQf?!qA&A~W-Ip+}&c!<$^EfLyhJYx6r+wO(MGtZin_qbjutdO02Hxft;o3)bw zv$$p-w5dDGLv^VcyW3)osesySP4U`TAH84`g*aWG5&uW$Ktz*DU3*!#TYQqNyRdvp z0js{kdjF+6_K`=r)!%Va(fJ!*w+h${W|X z-qa91uoNaI%*74(de-ku?ge&+>`^<89ZKqZ^`Y;a*1PP=eQ9P2y+=&5cd{U}FS%B7#e8bYR*l}xe>V#M5k8W{8dL`uO;Uw#77RY3nX8i_QMjj>Xknl? zdg1r{B$d;xbfVM7JmdWbbcNkw_E&$P?nwrvk~&PzaIR{U92c}wHN3vDCArKRQA@Q_#&8wKx62}YX;3WkWj|%+K6WZrUV;;CAKYHHx_S=_m*!dw=&A@Ao@~!9O z8um`rb0Z@8wn{M%YI|+nWeFZdLs9uMP>h$BLMbKD=)wVP98Cf^wVai5Xx=d2O_Was zq|12gLf}6GuZ`u*u=*vz=!BW8!m@Pzss$M69grkE$Ajp1cnYer>LX)MR%ntxWNz1U zQr6Pz7}fI|;Ne*{W%$0qW+GPRc_k7u&NT4Gprc&~u{V5|DJKx0FR^Tp!oq+Iw@Hy# zs%C}Dj*RF*4B?`p>kRuY%swtHtX^GWt5V%`8U7}@FtQSN!@ZJcM(U(0`xAb%RP$wW zLOL;u-Yl_tiSl!l^^s<9k79;D2GKIgQeXH5TI%A}6c-8W4YDs;o>nshKXT}JqM;3w z7z$(@R0_4_N3czXIJ#U0Q-5gl2SE1=)4TKI^9R%+{-KZ*&dczClvlU8yFcy`JCB4v zosxaDQ3scIC6Wm!=iGD@56nhOe)mNCl}jh#u$|Ddub0=m1^0dLWA3zZsBd{zdv-!; zaigl0aIv+DjF^($38`lGL%06S7JczK`+B5Jnm#;QmtJY*Jm2rNZk#`&??(F6Z06H) z7(yBCxAUyuq3OJwv$^jRoJZJ&nxuTz=xAKK(>MktrX1-b@9)?|7HMpbqgvh&)LKP? zm`+ow<}mF(md7)c+bZdyvDfJ9cRm4=wdyMthh_JDTH2aZ%w#!utXf1DyOs+UIfW9baA|h*et54<<^+w;ic0OD!&EJ!|4IKr7 z1xq_=5Rx<6m9w&606{R|^&_T~RY^@+boVkxZK#YC3ruc}%7l1yO_?*D9a;7sVk@L4 zhI>M&=2hII;&5b6s$&+GM0uHcAmu@Zn)u10A|CXq4wYT~VI5dRar{27{zXQ#)h6gJFC4^)v15p^TTErxV?nvCYZh8bYkgenb3KO%|4!d*>Iw zgSgT@^QO;Eu97z!5A>j<59<{d+(AY4Iw*Q6Dxsh7O&%W|7?NIh)?a49I~T|a(g zM+~2=K|6vfb<1CwR4@;}ij<7l^v^vU=@H=6WBjaNe&7Q{KlM{Gskb?L^C7;{e%)L@ zTdyIxdL@Ar>+Lj_&Co?5Q87!UsyARRH?F7_yQbx6>yoxK*uFHT+hRJ1E{ zQqKdbc#|Kxq(CE4EAZYl3}0WAKu4}Tx{)EFv_56opN-ucu^vRB@$I4{%g#0vA{i)A ze1i@7tB7@E`ZSWulA<2e*Eca~3n~gG5iHcsCe=}paeSB90P;v%^z+?d>h4 ztF~d&>A%S|0`s0(QGWF{jJ{>Vr&l1icE1ZRBPy*fNn8+XNLB6t&p_}N&dkw1#-*P| zV*ib8AKs9Fj(LxkOVKi4Uv&kZW>6Y5pzKv(CJb1RG1gkoT-*Lkxl3h8t(4bY9&zDf z+*kaEbn5o~a-YaR*?n>MAIV36_AVlC_Oo4x7U^~h4iyrNcW8M_B=kI75y{?u}Wr z<{L&`cGuSh>m6)y&tOG7CG=smq?0|p62Cr({xZ9dARb=y_IT1=pkX}ijAh@>lU53Q z^~1#b!uwvCG-2mvEBOKyx1TR6HG?)~D33y4=|Fo(TT?IfaCXt`{kz?w>FX_=5b5oE zMhpl`i54S_E@VTCfB&pDV)4AytRFnNJQ|x`GCMn2vbMOaJ7|3@2+^sU+e9)#=KkW{ z^Xk_#+=Qz&eZ}>9PTxjr{KCp@GJZ71_~ECYNjh57YG2uZqwDX&pkc}((oYpu5$JHK zoz-2DEk27z-I2&}sOLVoQW5(YA4OMGKJatWd>T42OqS6|b=Nc@<5Lei!K%`1!>Hyj zEHHciN5^J(xq$oT9o2G7W>NzwWK#a=R!NJ2vH;1~jQzkj;}frJo~ay+UDr-4aF0GE z5__$-;XQ>%FNa4^cPfV`N0xz?l#i<@mpx7Ptx#8kJLf~%*mQ64Mtv9Z59m|Mq5Aii ziDinUA1TsszvuOt4b&W`sD%aTZqCxmzv!r*a~3Pdbgln3I2^#*!iVLHB)LQ1ct6WWS{=&E%f3pn`b*UN zm%goNA5N63tF717#twaTd6qbO*L7e-)$Q#s2km{{iJcQxrOG$@k_RMl%IUK@BqCpZ zKcXzA5A6(YES590?SrBE=;-1}pw2oMwynuX6uAk2eF}lCu}HbMZ`O6y zmbz5@9><9LF5|w*#`&wiR3+9z(t!M{1htT&126bX)F!?!KOl@*(}F2^9XF?clHGz~ zcGLn-$a3(AhR>-Y)77oupg>$|CS*lE!o@nWol)hI2MuhDl2r;{wjZ+a^J2>Y`aqZ5QAMMc7$Xaj^GH$XL zOj&W3u`=N@mT^|tE__}}owS>OXCy%^pxY}CxIxZXt;7&tX`9jNMf4=F`b-$yZ568S~p1BNdGBhoA+__6ny66ZLJ*0Kz7j5}P(lSNC zJAJwHj#f!os)>zHwAI1u%ew(jonDD%vH{zUX-8;{>89>nhg)CGP>+P=zN3d(`!%uE zpVISR@!e_OTn>C9=YsJlr#~Xh4j+1$@(=fJsKP#f&PGYt-k^>uW{ltQ`hrIMME#GM z=e4EC{k6X!N2`Y*3jG+q~J5p``2}@S?+@8$ncCqgw-e+xpy2A?Nq(6(>yi_41 z`c(AQsvEJmm3`BEg=OzU-^#Y=ym=^)KJIXPZx*~KB-Q@gTpd|}HcWRT|4BsGzLdt6 z<{#77ZRBy*9u!3sI8~UVx?Ns}Uk+E%rn4^>2P2$zMGv;mwR(-Y>A8&?74JNvj>H|^+bxl@ zl+F(Arr84-6qHiTO(n3;p!;0)m=#ebPBWRgPZ*?-zHh}@VPiPi?>_Fr>L|9h;>jah zVs1zg>?nf8yZGbEFl$=Aa<3dxlu@ldS8TF9YkC{lC=^q}A4rYdz+qF9**YpJi?xH2 z!{Lzm1kVUP|CSE+K|BYa#=1%lUPIkiU&-uJ%YL(c}hW;4B`IaJzKMy=BIN6(5@6IW(AjL7ONHxA+4mM82~9$33z%x+cnf-BkXYPFzz@o zAm%A?`oxC06}E1;b>t=GwPohR%O7H)X#u=9qeoJ-qop)b-E|jS-a|{?#jR1V6R#}` ze+1E*CQy01?h1&L!!H~*o2Cw2u&SrFn*HCmYw(lqvhS?Ro3X;TC}(qq3#d*l31C^l zD60w44<^4K^5Zltm~NE}eTB{Y`lM)9yVeqRPDzIhm@>UcdBPC~aw*2co$p(qNX#s= zPniBZlRgU)^IKiPD3-w%oOe8)_-&@cpG(b0@A})!x_(pl?ZMtbo9IP~h3Z0$$tw~5 zQb(<9u!zNX*q1$V@55%qW+OJ5wTbD;WUpPtkct^;BPf-wO+cLdp#0K%Y z<7OROT-6uy=X%O68Xx%-S*Wemxwr4R;4ieoI5!AIrCa~tbi0O7{Cga%vgg}j^w_>z zF<$<2!n#-#zc65!07OXEG}2eKwVq7~MA|+K30_9_-z22ES2XoMs7uof?o5Iq!8!Ai z8^~ji>p8L2)-#*0{mkqek4d)98Z~UfM3Os-IQPtB1|l|JpHIz`r!`zg@J>o<4}QN1{IXiu ztj8x3-yAoax8B#T?R$$gl36tC@1Z_eyh1Gxo&6*_kd8u59OQyZ=626zc zn2Eg`c`3go8gr1g2UUd$bB z*|hK!;w)F>TACELxk4J4+W&Bfsm=8uLh$V4dBpK7Dec3IsU`2^AJ@DGDwFfi?B(;n zPceT`Yl^R=4e@%W-)X~!A2J6X0fWQYKP64XBOO{S<(@r6G=A>Zd0*kHys4A1CnBT! z-Uq*VV;a2fHh5C`R@$zbFx_OI-ZdG+f}T}+kiZ(A^y1C!xIQp9YQHo3yxw>At+@Jv zZ9?jvnhGd^k}L)$v4~G_%pT`QO@ERu9#n%tL1rodf3=^JP@h@aNZ{Gdx$B+e?2 zl2|4tP*DA3M-#}ZJTcS(Df;+z9y-}{D4Mb; z?vy;K6F=RxN&MpN6rK=81FBT_I4jRD12S)%H*|O03cj4#K5gXng-jf&g2(nW*8F~a zq+gIt&=hzQ1!0-T0OAQ98srJ)s9T-j-}@ zeN*`}`Th4!X$DmI{pj@NcPX>7fZdxPDQPqe?0k6zL7fNMLbtP-1Bg43WOv0p&v(43 zLf8nXB=<&lAX}0-7op)aykV;~!-IJ*z66DH?{Y!GMXnSYsM{}{zfXtp(tgT5z6r-A z7s;M_Pxj+wUeI2;+0JP4JquT7zi4BSgpXFi{)qA7+zv* zjhOn(Ibqq?Xs~;V@FVZDn4MdRU-!1N`?pjQdO?O5_ZGQgWG=ejXZ3D*=R!S?^qMS8 zZu%llF5NCVJ5s_K2^d~IBY7}K9S?htJ9vH*u?RyL=$SWp_7<~%b5%S@z#|sJTBrzd zoAXVbxd+Ow6!QnpmTDw|gI3z}tpn?;2laGmQX0zy4;l|MY2L;_*YyWTrO}LlQWHTr z{mZMU+EK0hfy>LA`;NQdj-Z>%pLaY+Lmf2Cv1G-NC-Dq1X*zcv$l5#!6=qy5`vEU3 zHU0Q!y4AO@=N+F>n^8{dp!-EF6LeuAN3H3bjJ)VCDo?Wo2grO}*xpV`o&+H?oB*J( znc62Sbccs9M#9_#|cdbs9HM3_)Y|Tu!y{})gPbWBHF5<}?EIXFD z;}(l_nBeN3J4&=BLTXX?oJB#bdQ5XN!u7p1bMY(r?!GeBS?XLuOa8F{8e6xmBV?dB zfTVvXVzyZ;ufhxUsPmS`tF4*pGxSa%RYEx1`L$6I=*lwpmdgJQmlV3)qnX&C`LKsE z=c4`HMSJj`vHtwW&Q(cBh^TQ`Pnu{qJ!BMqdA^tTZt*-cX|VP(|L5S8+MNaG;?emn ztpkJBWKZg6(_?!EBl#M|QuC|h(bSpEQp(gHka)?NJ6>Mt^q}CNo<6a&4Zjm_sNx$9 z!DWU6CXw6Rt3J{z_eVfl;D_bYyBb{T9tjcGOjCT_Ub(w;9`B9ZJ8ja01X!9^{{3vx z?3c^UeFIoilR#_rrp{}maS}6vB(-5Rtw}jKt|6s*y{BRliw4hWNiDHBF^FCChzrh6 zfUlB0>C*EK7kQt|f-IyOPNhcfmDBf#8@!6mpV_#~JNDM-R`v`>gWS#(D*{6wc$>Yy zp9e`TzT3D_!fJb~Bm1fF$EeBI#qu3t0}=}F_OZf*4(}uqMG?I*GsOX{=8Q{514V{{ z1i~(?Yv(M;3|IGs~E6*i;$yY!exfJawwVK6!(cpH_z z{_F0IltuVK#L_M8YB+CNL^^MqlfTZ2UDe!(-&WUeTH2lS^XXrfS+`ruJzE@yO&lXx zYColP2_^C$1(deCsuZ?nSACuLe^@EmtE zDfYh;`55swMH#79^gAWa%k&17mUvQapHYRvvJtDG2%KMw!v~jIVao4@_wKZ|+{;&l z;FIy(-E|2CU}Gt{XK0GkT|*=Zb{MNf!dNgb7pxcH~Z?z%@lOf@W3jMXm^ zEi0p+CK|^xheczJRy0*KBmf09BonaJAxt45>8z^+RbvkQP}O|p6LbwUMUZH+)aeqK zomJdB7W@uB4T_{Dr3#Iz(045}3mmxprZvXpmFxUlB=UaWL-Js$xsACm_X#Bl#XbY&qH(|bF8Fl)Fx7-?KTHEfY3=K z005FskUFflBlK^v-(}~5x{n$01ty*?8K_~L0T@oM=TblE(^)IWqDq4? zafWt5I z&89m*Dz3SB_YZ%!noM=y=PJR*$2-Xck_$4E+x`M8pGo-~``B3aS{%$lEo+=60f|<2 zj!r7H2nOJ-Gp<%DsScH7X4f*S<;89>ZmDtBR-+Y~wLs88D{g$N43bLLICuCUixL_j zQkb7$IwI^cg$kw7vL=&qTq4+3{Xv~E(Ax7oVA2k}7L|Rl_A)+U<(W*wj2HuLV z9^h>CMsViH4)Tfr08L#m!bLI3H9vzKjg>IM7<$TSnnoa@kb#8ulcJjy8k0x~3R<&^ z@1DWEo#kd9#XM?>&hI}Cpz)yEySnR;ZFh2BPcM^y#yy@M88*J}Nr9pUnlC%L_Rpv2 zq8va$9cQ8lIGfo~TaK!VDjj(st1;wR(o_rP@5s=>v7c&E)#bj@}<1=D$_aWq@da00031 zFC)~wtNb_|0@0`-WHcF=3c(kdbn;YFP@txu^7lbW9$v^Rd%WzPqw0bn$OP{L z^*~RXsWO7Bz|*L8-5{pG9l+n1)e)7}E#^e}-Bn7U^B>`a6xDymPWSpKtiZ(+n^F}= zI=kf51nv=Ik&UWpw=g>!e_pDNZYr$OX%U<0V*~o=sT{mTVgPV;gG&UBWvBI3T(5iX z%Nv>j1RmB}MjUNZ?gN^4yeks+;o~Zrn(bw%#dF?nWo|K5IE__|>WZhxVRYjh`CgbF z$=>}}Ppo(sfAL12MDm>^ih45RMN?WtYoBeD4K~?f)Ofe z$utNOrK`pf)e1%kMd-D%DSZa$j z3M?>hbRe6e?t+COs$x%VoGSr|;(S95fxuJuxU5Y^(WKAJ;$RNjouALM}7nz53~dLnkN`zV|GMYAOiJH3fT(k4_t;2&igkPoV- z@?%XAt)|&~hCi<$HLP@eDwIHKX zSSEETL2obBu{pC+Ua{9S={M`Ql@q2tca%=QG zFavaj=XO{HiUd$V#5<@^R{IBZ3qrSC6cCU}lodGWf||qvBYU9C;6UfFK?j@UnIlvc zy!nSFkJSQkmkxpo4DHfRuKiF}OtABW6*!SncMyWA&Ml}q+APkj&7SU7m+pV_dECMU{!i3?D1@wH*4 zl4mw!ev46>&4_zlMVWOF)7*ctM00AJp75$`GtG*zD?9nE#wwRBMin`viwiBrZ)(d9 z;c7Y3$f@XyZmF7qVnoCo-E69R=~LPOQqoLO?_W-IA!6KX4Vb!aFiBzLZz4O1AF9+!;A5xW8QezVyg12Zw2pNkiApS@yeTf^QDsl5L z_eDU#1oVUyRF^Tvbtp4p1e~J8!1O^1kSVu#fDu(Y{7ZZ@sv@VuL!kCSQ~nQ7f|H>m zYoe&Bc?Y;v8EY7;18@)4=rCd$2&~y4JQ)7HQY)E>e2_qc=j8zZ0J_{}$1q`~uI4$a&L@Q7 zwQ)0%q{gr&%UdBh+Vs3T!UCg7ty)|R1?R2lJEqC)$`#;8+?!Iku3TZG|`l$tv&PD%BSb$$;-6P8C}tmRYb7;5ly2PHsz zg{jGpqo0c5ScVA=p2_x4t~eY*i|LXo({Na;j!k-CgA0vyjQLMhmY$H=d*3GezygaR zCtcBc(upc0xw$yQ4*Mn^5uHA8zSyi$n<5WRpAF!?JEUW{E_O&daD%cmA97>rp1 zI%tbXXrdN{Q*)$%x{Hs|zuA|C`;QLsZYK8mu~?x+r}$|%{{VB($$0$td1Kq*pX0B# z)7HUoc3j;Q5}8y-VuCKw1PDP{3W}Y-R24fx8x$2g;Ui=9L7DG~`k<!DW3WjLnmqcMhRVS6Y~`EC4j} z{S+DihLZsA2lPQxt_^^V^!chY)oGVRf-V05DG|@DOaen-f>jxxOE54jZmy12C6M9) z^ea-MpHPrZ){#X)B2`9uY%e9SQ40}=3}-RT73X-37Lw>9c}gse z`#I*hwCfEQz4D+}2}EiXS=t=>DT%m3=uXlCLN`4KzNJO<8)8wJ(T-@crPwPWX@S*L z!w9lq3PmBjqJPm~g$BhJ(GUV9#DoCja{_y*TjSqR`#ag!2maykR|es(Xl+_pcDk*i zYCF#V09kQgKb_uIz5HfJs$*?+hL*E+1j?c#UWg;ipn*D|teba1ORui#it1_5AgSMD z2s02bC@86UCz=ITbG4&WbQzo`q2&;Qnu9TM+cEyWh$(r@!OZ;#K_>|gJL?~Gff{4t zBT!{gl(aUh3xFVuuIhwiuG=1eakxcus?!q_K3E-E6&Wf}1b_sK{J*cd8mZV~+@-pk zjz{_mnwv0yIi;XWtS5N=R*`EdLmC-&2?Ey~!h+^9MXm;tf^7s%q!V$?R853H5=iQ9 zimIdA64wZb?ue(}%mX&KkBAS{D}pr$ef*|Iv18w=4A`dS9$1shLaI3!wg+Y;59F+) zi&%M#t!gRvX8e}4QdurAh^DC`nP@0E7|K&N3rts^$4~}jU1G)J<@=6-W9r&)z0vY6 z$~L)0Ff~!BKS;&V2sRd0LyMzCbUP#|0jjLY+F&T$n0u<1+D+a{ED)|FGdn1#<>#U^ zhZacHoe&UJv6yXcsxKKG{{R8-=J8({a6A*nW>?12YsWT+WCpu*I+)!BM93Z0RWA5SB9hYx zB0t40I|%ehGc~g3bQe@q=F4nsN9cn+KqM3R+7Dua)(B{wV<|vY0JH(w20ET$*}(={ z?Jj8o*58;xh_f)Tu`=FZ@>NyVrWHE5F3fZaqn(QY$!vmtNI6eod2n-Jg`rcx4TC6*wRJG887c!eRT-<&kX1}^ zv6y?G)F_^u-`S5QrW)rPi!V%%o66~dWlz9Sc;1mVHwbBLRBJ%_s6lQ?i?AWE#1o<- zR#r5S1Jwu!2$u~L{sCj6xJ&pDp)3}N-4|s5T&S}(^iN=zFWSAM;VQ(p35TzU>~iD> z=JmtRf5qRyKg(aLsaOcuFB8_%%`T#*3I1qY6-O7 zQB~#CodTjHNIhDJt_Qk2&{W}SpXmrQn`Ruqlo_g@EDa@5nyH&Xi6y8mla zvFXtfFN}#715gzc1Ij^fc|lYkEFCoM$pq>)*@QtXQ|feqN2b;vW(Sf-BANVL>rz(H8Fz~ zg>F(s`f^Q69PimjFQO(qq>J-jx6AyWR9=7~MV14h2(qFsG(^+3$iJR}A2pq8Is-^T zet^|f^qeBxFaVn(e+C*L$U`6lRICY6dV}hzF4x$9vt}PRh`7!qX-fpk zUazS?{{Rcg=eQ+H~j!G{Y0E5*H&W2wq%U^;3?Yh%Fq|qshrwNAG zlwMR{#DKzonq zyq_c7dpuWNGYg%#&p~&E6NPb&_uEg zm;wmYBC4n?FD{7}NQ^NgSe7_J>8yQD=Go&6S-R2;%NpuMI@nMA~D)0@ER5MrrDWx-KN z!xtS2BC6PIgl4gX)pK!Bz;z`wbL!$q+;&q(3yX0vO_dIIf-MsZHxsA&G3H_Ytntl|=)r-}~y8OdwGx?R``5)}|e0iK-V5blW z+(Prc3)<)t(Le(X^g$p^x}t*QMQ8aSPTd4FB^48LJ-(-k>WVYfvylq(t0e~vOKOeuc==(R}y-a&8ZaSXGC4CBHOR5_)8|rHTVMPoM-Ix zDzB;~LeL2+;%=VGH|*FEAO%q(i|B+(Ciaqx_7aP_i>^^Gut`Mhfh6h>hBr~D{T=_<}D{z2hM`frpk~5F83mX|s*+2%{qPi2b(p43f_pA!-U%tB&q^kBd!vg88j zPWm`Rz|m=iR%%gY8qR=FF`_OQD3iW|E`CJLvahCY(+~!#YRQ8{t05u$qa2YW&d&0q zQ(vV$fG`hd^v>_b;tBb*ev8BB{{VXTct6qg28}04TpgCQSw%LR5Qss@ikTVxTu6-6(#$2mb=MuRb`qahb}<_ZT)a=ak64#NGF zMO7MNVWj+!W2js~kZtOVgaIwm=!Qm641ADO=7Q%AiouGjece+(i0jo+8j%yfG#Q-P zB!q%Dyb~SO6+ZfW&{hGSNGqtb{* zhOZ219%mrUS4R-iG)fp#7eaId6k8#*>{HrtFeIscFYx^}>?V+|C)Nj#Ima{Xp%{DywDn>U01RFSN5mC!KU#cPxrr0fjLdPpp%7)v8r`V{rG^dmLw1RAG(Io6C8pCO{DoRrwlNq$YLl3$h({8A*)E>jy zTkP|NOnHrBKl7fxf0zBM=y<=PL z?}qVYL1!~CxAQ?$hs0yJ{ZLa-POw2#Qd@3_D|sLgE)^BbZh&izjDy((YOucT5P9=R zD#}O12qNl=p3rZvR0y~c1d#4I8;C5S{oSthOayYy2=&{N=ak!%}{LlXYsIFM)s=yLg(tKMYU_eEa zA%SEh2cofWqaP16NqQ!Y(DrfFMyDQ#3zSYU`l!_JvpTB^N)&=f%(##U*xghD$|MJ} zu%^yxERp(a*hVB*_I-n7f8FsIia+}E52M$E%|FV${u{g>N*Z59#no#r<8=jyYQ}Pr z0S!3%Sps#$bVXO11<+RKOOQ!|=py*f9P~jlJcpP;7?uPG=`w=1Tt~>DtOGXL06-=T z1QB$NB~elGs*0*uk_U7Z>j)xjV`FlHrkt;+(qv7-DODTI#{AI~PNV3kt>g*a1sa%b zki-j4ZNdv#BplJ|5Ja>z!7$!@l{H;?huog-M>Dl=4bfdeYAP##?394s_J zix}LXikZN6;VrSxDp&jnvK;|F%5>GA21qYbp41(u1ZaLSL#y(i^;pH|x z7I`zq_T=P0=M~Q#b-ZrAi{i_P1je->3N`G*ZmJj%R3rc%NKeu1LXA%PC`2oPDT_S- zivhKg7UxG6MD_&kizp~s4v4>iI-@Yf)UAIn&>z{)6`R9cPKWte?7)Ann}7DN7s&qr zXS3tq@qLwsX@%!{7BEYUYEf2zR7BbU(FFEETaAI8(1;Ot7zn5qs3hAqPRfWpUA*=| zYfqMAx(dyS8yyft9YNIu0lS)X2nK;NMa7B;)QO!CLBp+;MNgd#l~pw?FED~27MZjZ zMO9khL_v?T2)UWA-C$2tR7sZlB4U@?VFq#}@>EA4GqFHrX%;{khz7_Ln zc4Bq9EYrG*K=e!{zK#(@bVZka6kbt1(2FTaQD&nuiJ+K6&;>=5!MYLk@9gP~4C5SQ z0$gUb3U%5#wZ*6C@VvhwdaqZ&o@7r(zFDP+QFd1_FwZ_(hQwfgpp< z$P@q!qN3k~N+1G5z|%m2G4PS7D61??b3{_-d~74AK?;ERTsHcmieS0+JHRL=;6}4O zkrh7vg%t-F5UMGtWJlMMs;mPAju$8(+Yd3Z*SZ11EN(VLR7h`_d>iyZ2Q*wxmk2Xd zIZ0^%5UCWp;D9|4CP5}-kFqLdwlE1n0NFPMA}02L6(coZVnH?>&}A$n$u9)yDFt;K z4R+^}qZL-@3Zj~VT6u*>Hx@Di<8i++)mS-oz;G@Ro9?VfHxc9_6&W!eb{=ZPt`0m# zyY9CbuQ9~w`G_J8%CO}7mvahZOM!_ny)pB55@=NXreo1ot{VXEm7Y1I4fI63yGQ{V zBXd21ibF*(*p|8^FMf({iM@#lt$!$zqdv>zjl@cfqEOG+2mo$WSzg=N-aqyqXgoJD zhGIobGr#+rBkIt&`KIxA@Z9A6S%i2XM@8X#TAEBpND3}323mF@R7e{rsc&xRh}a-Q zTd1g!<|>BWJE8#vma#z-C?i$5+6dGllR;<_EusOefa~u)kV>JJ{{RqGB9~~Qvy+-c z=%|Tgf`SGBhX8u2D|v%+q6XiDiy|nDt|L~vP=c5&IZ2rKN-7naT@Gj&g^1=kA~S*J zI^{ZaL2DZV^V}*V0GsBN22jvq;RGH16eBf9LAVg8q>W2wA?AXbxy-uQ?zY#U5JGfKvAhtlt2#3EUt%#alhUCdxqmlfrrIXs!u@iKS@~UH;bnW+x9*I z`C3~umPC!?Mf0CQ(+|}3L1=LR_CYXY5}=Sfp$P5}AZ;iUrb;LP?ac(D^YcU_(&ZH> z1Jwe6*#t{Y$cR`@UrOB*2-NQ}sv?&Z6wEp{*#dR% zx(dsIX%8Ny1P$yb)dCDHI_uE{NXs&QiidI{M4*mirura2jgVDUfQ{u*p5kLpNGPn` z2>5v<8O=Ec7KIfVxUvp)b`w8UM>7#f2?Pb9&Z^jusyR55mF@&tQHrcNv3*h_lZc?) z#jnx9ZdNRFf4bZLY56Ox{bSCVB(F>6-tRydK_F+EFLc2~*po>@T>$Kw*3u+^i+2n- zkfANGNl8}e&oxcKHd01)5^kxeff}L4V6o9gx+F}bY%Zep`9$hbK$kVm<{?XqAFg}> z#77nI#|FmcmsY~lE+_K_<#*H-^Lb3RK938tUaESb9ZmNj50^Q0C^;_tuq_jN9*Ky4SPhn}Yqdj0l58Ved5Hh==S{N~n z)3UH~F#*8yRWZlK+_>(kj&r2CHdPU?O|@DXB4f(!Jql@Nx! z_G{+mdPp1HRzE3bzSl0;)keXn^jl<3IRVC~PM5ua8H!V4&i}w6LUD*sQ z+|bfQz(k_hM??VXqLrl+qCFH_`vxG&i?RAM*e*G^j{>%aZ$1+hR+$`whCAu1?J~-G5aC+IJfwtjwYY9ebd#8^VCG^O6UeKhn~bnpgNuwL12U-PRfmj^*P5f0&_!a(f+WCI3lPxC z@lFqv&Az?<}gtPvE8wiZkkz%)&3R zHq@r90Qq^Sehs8Tx^eViqLDHZRImb4kOF!_6Gq1At04)CDW(DSO-Tzw(MGHV7S5kz z{?8cvwRqkDokc85M`>aEwRwE=y?TB%_aAb?)$$3v7+zIPJpF~93 zZ9S1w4$%=Q-2ff0L<{i|)dFzU0hpGci89IbC=+fB>NP=CM?pOiP;0f66+hu58B|sP zbgBk|HL@ZvJdj5~f||Dnnhdf*x++Eql4Np08kW}K1x>O2P))`pO_33%&ZY|6&Ok7n#6QbSv~JT@+xf~JrV}1**koW?rqr!*g?KPf&Vx|n4_QMEwlIbch!_f(AwZ((fjJa~lqW;FCGMpc zLmuDQ);snu9$?s912L59VVx&(GdKSLQ$pqEo5kC~%Q?SF;h?mU9%jn${$BRXE8sXC zjHorS!YqPpB)EhV1m!3!Ypo-d&^*uzA-3ow4!uMmS+$f9%syxUVrN6D2sq?3D5`4f zZc-3H9MD080VgfMR8ygp0e_YTheE1h5@V_e$Z#-&JwuvA-4#JR(E)HG{{S>pOXkMm z1z?7}pUjA{n}cz(1mTo{sGA_UqC_7=f?zjYlcg4woA&UQJ^!_k|DsW|#eE`6>1>@|!Vu+`9dHf~`*xLXIYZnibe8)BgZV znh5$IqWRa`>2bRo={RK%Cs3f)%L~kaiklz%z(KSkGzbqd-2|cp4KzU(I$a$QS)|GW zZ73k;SfHysn-l=342{q|S@l6voh}2>0?7hwXJiM(uIh?h*d!V5hM?P6>&XCJ%>{K1 zrMmJ$GdSjgH~S)>^-&u*S^?PeL0IyV2dF_J&|BKz^g$t~*#Yrb>Vo=a526XRz}Z+3 z5>F){Sz~GJsDWTGL7zkvRd1J~4t_0%Ascg5HOR$M%nX%BnBx?S96__S4$^;;)L+BS zSE?UD{`Ipm3r@#>>$2KMofW{SMMC43NjL78%y4-7T}95tVcrCQ9MPc~+ot_I!)3>u Q$6hWEzGwMsp0$tv*|hJoP5=M^ literal 0 HcmV?d00001 diff --git a/static/js/seagull.js b/static/js/seagull.js new file mode 100644 index 0000000..091d14f --- /dev/null +++ b/static/js/seagull.js @@ -0,0 +1,48 @@ +var page_elements = {}; + +function record_log(text) { + const div_logrow = document.createElement("div"); + div_logrow.className = "log-line"; + + const div_logtick = document.createElement("div"); + div_logtick.className = "log-tick" + div_logtick.innerHTML = "Day 69"; + div_logrow.append(div_logtick); + + const div_logmsg = document.createElement("div"); + div_logmsg.innerHTML = text; + div_logmsg.className = "log-msg"; + div_logrow.append(div_logmsg); + + page_elements["div_log"].append(div_logrow); +} + +document.addEventListener("DOMContentLoaded", function (ev) { + page_elements["div_log"] = document.querySelector("#main-log"); + page_elements["div_name"] = document.querySelector("#side-seagull-name"); + page_elements["div_name_editor"] = document.querySelector("#side-seagull-name-editor"); + page_elements["lbl_name"] = document.querySelector("#lbl-seagull-name"); + page_elements["edt_name"] = document.querySelector("#edt-seagull-name"); + + record_log("It works!"); +}); + +function change_seagull_name() { + page_elements["div_name"].style.display = "none"; + page_elements["div_name_editor"].style.display = "block"; +} + +function confirm_seagull_name() { + const new_name = page_elements["edt_name"].value; + page_elements["lbl_name"].innerHTML = new_name; + + page_elements["div_name"].style.display = "block"; + page_elements["div_name_editor"].style.display = "none"; +} + +function cancel_seagull_name() { + page_elements["edt_name"].value = ""; + + page_elements["div_name"].style.display = "block"; + page_elements["div_name_editor"].style.display = "none"; +} \ No newline at end of file