From e3643f43fd5be7f8a4e8f77e969a140b1f361bf5 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Tue, 1 Sep 2020 21:07:27 +0900 Subject: [PATCH] Implement graphical display w/stepped timing --- base64/delete.png.64 | 1 + base64/pause.png.64 | 1 + base64/play.png.64 | 1 + base64/reset.png.64 | 1 + base64/rotation_clockwise.png.64 | 1 + base64/rotation_counterclockwise.png.64 | 1 + convertAll.sh | 1 + convertto64.sh | 5 + delete.png | Bin 0 -> 947 bytes delete_cursor.png | Bin 0 -> 1711 bytes dot.svg | 191 ++++++++- game.js | 539 ++++++++++++++++++++---- game.test.js | 12 +- image_data.js | 14 +- pause.png | Bin 0 -> 303 bytes play.png | Bin 0 -> 690 bytes reset.png | Bin 0 -> 718 bytes rotation_clockwise.png | Bin 0 -> 487 bytes rotation_counterclockwise.png | Bin 0 -> 487 bytes 19 files changed, 674 insertions(+), 94 deletions(-) create mode 100644 base64/delete.png.64 create mode 100644 base64/pause.png.64 create mode 100644 base64/play.png.64 create mode 100644 base64/reset.png.64 create mode 100644 base64/rotation_clockwise.png.64 create mode 100644 base64/rotation_counterclockwise.png.64 create mode 100644 convertAll.sh create mode 100644 convertto64.sh create mode 100644 delete.png create mode 100644 delete_cursor.png create mode 100644 pause.png create mode 100644 play.png create mode 100644 reset.png create mode 100644 rotation_clockwise.png create mode 100644 rotation_counterclockwise.png diff --git a/base64/delete.png.64 b/base64/delete.png.64 new file mode 100644 index 0000000..58e3684 --- /dev/null +++ b/base64/delete.png.64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAABUAAAAgCAYAAAD9oDOIAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA0BJREFUSIntlV9oW1Ucxz/n3DviTYO9NrFlTToQ2j5YyqIIa1YK4theSsEw5gJ9EP9QweoQFCllreCGdb5UfEspWEFwIAPtQx+a0ILifKjo8uBmpY6aVEi70lwTcps/N/f4sC5aUBJkj/2+HDi/3/nw/Z0fv3MEgILLwBWrre2VL65e/U7TtLvA++VyeebNS5ds4HugDQgLKNBA+sH6ITDiKxQ+8dn2I7bPlxVCBD0ezxPAL8DTwLPNAAEkgAAHeFGAd+D6dU0IEdzc3MSfyVx0pZz+9fTpn+fi8aFmgAB6PB4/AbwcV+qlcCIhTt24wWe2zcfr69z1+9kLBsU3o6P9SqnfmoVKKeXjwHuFQuHElWKRtWPHGL99m49qNR67d49Pz5zB1XWUUs/Nzc29oJQSDaGapqWVUramaSRWVhitVmkF3gAmlOLdhQWWlpaQUj6qlLoohFANodVq9XMhhLelpYWBgQEcoHYQNAHDMIhEIriumwdea6Z83XGcVzVN+1oI8VRnRwcfABngW2ASKEYimKaJlPKHsbGx3Wagcnx8PGPb9iCgnl9f5xTwumHwthD8DryTSkGpRK1We7KZ+wSoJ305OVmLXrsmfzp7lh+jUSzLorK8zOWVFW6dO8fa+fNF4A+lVEkI4bquW5FS2kAe+FMptV8vH0CBJ7ewgHX8OLdGRgBobW2FCxe4U61ycnmZdH9/S7anpxdAKYUQAqX+7pnrukgpFSDEAXTWlfKtryYmyAaDpNNpVldXsSyLno4O4jdvUq7VOAkUhcAwDHRdx+/3EwgECAaDDA0N4fP5Dpcfj8czQAggm82SzWbZ3d0ln8+zv7+P4ziUy+U60DAMTNMkEAgQCoUwTfOB2/rsA2xvbW2FUqkUfX199Pb2Eg6HGzbFcRw2NjZIJBJ0dnYyODh4f/YfqFwus7i4SDKZxOv1AjA7O8v09DTJZBKAvb09pqammJmZud8UXWd+fp5kMkmpVAI4DP035XI5tre3yeVydWc7OztYlvWfZxpC/4+OoEfQI+gR9KHpn480gUCAWCxGe3t7fW94eBjbtunq6gLA5/MRi8XweDz1nGg0SqVSobu7Gzj8nawBzzwMp38BxWJHOyltKE0AAAAASUVORK5CYII= \ No newline at end of file diff --git a/base64/pause.png.64 b/base64/pause.png.64 new file mode 100644 index 0000000..4b516c6 --- /dev/null +++ b/base64/pause.png.64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAABIAAAAbCAYAAABxwd+fAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAALxJREFUOI3t1TGKwzAQQNE/JoXQGQTGpbFP5HJhXfsoKo0XUupCSWpj0BmMKk8KJ2QXglnYcvXLQfNQNzKO40VEWl5tIvLZ9/2ZN03T9KGqX0DxnKnq9SQi7bquLMuCMYaqqgqgeYc8aoBinmdSSpRlibW2LQBijHjvCSEc7P8shID3nhgjfP/eX8tQhjKUoQz9Q+gE4JxjGAaMMb9e7LqOlBLOuR1S1au1tq3r+vlmA24Hxg3YHocU2C/tHUseO6D31KjVAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/base64/play.png.64 b/base64/play.png.64 new file mode 100644 index 0000000..5adac51 --- /dev/null +++ b/base64/play.png.64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAABkAAAAgCAYAAADnnNMGAAAACXBIWXMAAACbAAAAmwEPcaP1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAj9JREFUSIm11rtrFVkcB/DPmdwbbx7GRK+IQbbQVQwIK0RIYSciguBa6RaKCxa+UCu1EDvZXaxstBAr8Q/QwifIrgirLrusq2ChyD6qKCJ41U2MuXMsJiM+gibm5FtNcc7vM2f48ZsDD3ASVdOYiCi4jgXTh8yrRi2hKXiKddODrOyMdtSj2ZUmchxDLRWQvX2aV2V7PbO8PWCf4HcsS4tAa+DbWWzsYUbWJ/gDBz9aNyWkTF+NnfXMV61V/IQr6E2LQFcLW+cEa7vIrBLcxfq0CAQMdLCtHvRUunEWx9GWDinTWy0+30BHwC7BbfSnRaASWNvFph5q2deCmziElnRImaU1ds/NLKlVcERwA4vTItCR8V0PG7qphH7BHexLi5T5po1dczMLWlsVU+IS5qdFoLuF7+dkVs8ks2bsVO+1+tSRssrKzrLVZ+McTqMzHVKmt8qOemZFO2wR/IWBtAhUA+tm0d9OtBAXKsmRR6+52Ij+HQmCh6Ld6ZDhnF9e8NvLiGEcFf2IV1NHIu4McbmRG8oDzuAABsslU0P+GeHis9zj0Wxsnu3Brx8u+zKk0eTq8+IEwRMcFp1S/Lo/yuSQ0citl1x7kRuNOU6IDqPxqW0TR+4Pc6GRe9bM8DP24t5Etn4eGRxryf9GguBvxSA8P+GX+yQylHNt/JacDDA+kuPP/7n6vGkozxQtuR+PJlt8fGT8lrzxpcXfTbSsLeqrFXfizCA2K64RyVJeuEfwg7HxnDbBA8VVZ1H64kXeAM9RoeriawdYAAAAAElFTkSuQmCC \ No newline at end of file diff --git a/base64/reset.png.64 b/base64/reset.png.64 new file mode 100644 index 0000000..958ab8a --- /dev/null +++ b/base64/reset.png.64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAACXBIWXMAAACIAAAAiAHr3JJSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAltJREFUSImt18tvTVEUx/HP1WiiRNVE1YCItJWiBiIxMRADA21MxCPxiAQTI/+AgUc8ykRUhH9AJQy8JiVmJhJpQkSISBRtJQZarRZlsM9N9729r3N7f8ka3HPWWt+799l7rb1Jpzrsw0MMYQrv0IO1KXNVrM14jX9FbApnUV9L6JEkcTFobE+xqBbQkxUCY+vH/FJJ68pAD6IXmejZXzzBLdzBABrRHPmsxlI8KjusAurEuNyR3Ed7Ad8MDmEsz78rLXQJ3kcJJnGsgritGI3ivmBxGvC9KHgc21PE7pU76guVBu6KgqawMwU0q74oxwRaygU04GMUdKAKqAQ0EeW5VC7gXOR8o0poVtejXD/QFL+Mt9MqXMNvvBK+1Z+UsGWJNeETtiXQX8IMjCTvUi24StSJb8oXmBO1BhOaxdcS0MvFAjvQOkd4u7CH86EPFKmWzcKqHkr+wFzUhs8R9AUWFnJcgOeR4zDWzRHeisHEVhRymIe7Zk/NMNbXAF509q4UgGZtBBvmCC+ooyWgWfuOTbWEZrDSzErrFho/MyVzMPn9U5j6NGrAM6wROtwWYfHOUpNQabIj7U0JytfNKNeZcs49kfMEllcJPRzl+SDsmpJqEWprNuh2FdBuoeZnc1TcWi/KXVx7UkB3yG2JfSliNcoteaPCsaaUMkLxj0f6VhWdqEvuqMeE75Yp4Nsh3C7y/auufFfN3tMDwoHhOE4JB/i/eT7T2F8tlHAo7y8AL2XTatRvG/C4QuikcAmomepxWun700tsrCU0VhvO441QvweFM/huocNVrP+6PgXaCh5PhAAAAABJRU5ErkJggg== \ No newline at end of file diff --git a/base64/rotation_clockwise.png.64 b/base64/rotation_clockwise.png.64 new file mode 100644 index 0000000..feb796d --- /dev/null +++ b/base64/rotation_clockwise.png.64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r9OFFEUgPHfriawu1ESCdgZGkIhWkJhYYQHoLDRxNLwACQklDwAFQ3lJhI6okJB3AcwsbIhtFpBhf8SIya6QHF3ks3A7t47MnKSU8095/vmzp0zw9XHMm7FLq6WIPAIb2MlyhCAObyJkShLAOaxg5HrEoAneI3bvRZUCjSt4SEmMYV7wlYPda5NYyxX8w5P8asAD4ziJbbxHWcFcg/1VPA4VvGlIDSfLTRi4S9wfEXgJIkhvCoB3J27wnm5EDXh/S0TnuXOZRIb/wme5VY3/BlO/6HZET7jR8TaNjYxkcEb+JQI/IYmFnC360bWB9R9wOP81i8lgP92IOP5JgMEDrGIG/mCCvYj4T+FidYv8gInWMOdXgWzkfA2ng+A5wV2cX9QwUqkQDMCngkcCGcjKjYj4CfCRycmZjAcC4f3EQLbKQ1ToqrrXewTrbIEiBscD65T4I/EZ5oSN/FRGCr1DrAi/OFkA+MrfpclcA5HFShV5l7kTwAAAABJRU5ErkJggg== \ No newline at end of file diff --git a/base64/rotation_counterclockwise.png.64 b/base64/rotation_counterclockwise.png.64 new file mode 100644 index 0000000..a7e2468 --- /dev/null +++ b/base64/rotation_counterclockwise.png.64 @@ -0,0 +1 @@ +iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r1LHFEUxuEnLgRdVoJpFKuktg02KdJaCEkhWKRTsLXSvyGFlaZWRNJEAhqCWlslnUhsNCSk0CKLSAh+gR8pZhfGDZs5szrrCweGO+fe98c9nMshrm5M5cgPqSOYV8Z7PL9rgKj5Gq6x0m7zCjZq5m0HqGA9ZV4IwIMm62V8wFDDehVfcYpz/MFP7GIP27V/t1K65nnjCMsYw+NWzDvxqUXzxjjEG/Tfh3k6qhjPMu/CxwLM0zGPh83MVws2r8dy7aZv6F2bzOsx1wjwBEu4DGz+jR84uAXAFUYaIeAFPmdsnk3l9+EVFiTtlwfim6Td/1EJE9gPAKTVi7fBW6zHZJOzkDwiM5JXLQJQ1yiOgwBbGWeBATfbMwsAXkvqHIF4FoGAl9gJAsBiEGA6CkDSv4PB3Kc4CwAs5gHIq5UAwGapQIBHGM7IKUVnwlb0JZBTKdBfGRf+X4KjZhPRXek7emrfl5IJ6loyiZ3g119x6S+ogBYJVgAAAABJRU5ErkJggg== \ No newline at end of file diff --git a/convertAll.sh b/convertAll.sh new file mode 100644 index 0000000..99faa89 --- /dev/null +++ b/convertAll.sh @@ -0,0 +1 @@ +find *.png -type f -exec ./convertto64.sh {} + \ No newline at end of file diff --git a/convertto64.sh b/convertto64.sh new file mode 100644 index 0000000..fd232f5 --- /dev/null +++ b/convertto64.sh @@ -0,0 +1,5 @@ +rm *.64 +for i in "$@"; do + echo "Converting $i to base 64." + base64 $i > $i.64 +done \ No newline at end of file diff --git a/delete.png b/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..81d4ce9b2c6ba57c4e102f20921f2e715ce6005c GIT binary patch literal 947 zcmV;k15EshP)R8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H113*bc zK~zYI?Ui3>TU8v#Kj+*#;!T6SHnC+*IuP1ESjwUZYgP*4*j`G(Fy;b%5dToY>JStu zWv$?bb-q-5ODR}Ea3BNiLm!&Zg5rFr=OP6fmd!P*n3nZNcZAx_=6!DqJ3$Ls6d_50Zi2E{j{qy0*$-_dQnsdP zBvw`!tyXCT-T)?);@yP>mX?-~Qa-Abx+sKD4WZR)^>ZPFx22_pfq?-Wpmq>60mCqe zL?XDZn+INNrhMIToL4nX`&tO`RA)yA9{?HPTVN6>Mk1J|iInn(v9Yn;W}tF>d^}^@ z_8_31Uti}G@Va5}wh;Udypu{nsYI<-d$O7P1gIx{IXPL2Ub`lLI(wEMqfso&qO!cq z<&_m~ojb?c`SV5K52aK|2;sV}Tai-QKpyy0DYaiOA3%X8x3GY9{5ZEpMgVASZG{UL zxKpiia(S6_e}7B1r>7S{DTNRMrT*@j>$*rO6(Ga`bk>#ft*<5~$OeO?(`i;$SFtRM zo{kRUH*Zp|)i?-Q6Xh z&$GY3kK;I$%jG)IFbqu7BoGJ?3WYFD^MTv?>;r6XZEb~8sT6&Eef0MB5)OwOHpOuq zHa0d$BocIXb}~3Pcz^aEs9Y|yxVT6%nZ)b$0x&x}%k=a#$z&3My}doArly#gnYrH- zU1xrNo@6pfsZ;_u4E;CdayhoQx5?#lb!R&}J6M+WpJy6E|BsHKN6;ha5%i(ypN}+w zK!8{*MtggEeQ$Vp7~8h#>goc(=kpPZ#qfAM^_*xlN~KbvySp1W{GF@;&pZsLe*wi} VM>{EPC`|wW002ovPDHLkV1iFZw^0B9 literal 0 HcmV?d00001 diff --git a/delete_cursor.png b/delete_cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..c41a135e59b6ff1e3e6e10bed5b6e557d8950e17 GIT binary patch literal 1711 zcmV;g22lBlP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+Rc|)vg;@ehTpY{UV2V0wkeN*a_AD{%!ORE)nr$T~Hsr-*DMzqa<{6n^zh&Z+6t{VLNqhyn#0 zdj8xFIo%JidyacBz49p7vthaM$b=rLt4l9;YeieDb9c#lY}v0(op!=BP`0x7BpAy) zO2F;V52HjB#c|2Vv9jfDN68#nfVi>c!igJk9i7Y>K3b^~(28U+L#AL6C3o<~_QFj9 zz!#%PfQ(czkVqTwo0lx)El@2Gh1r6}#h0ZkYkvV4g!e4>yN0*LOu0wjG>d0|c9A z-z+ox@wY;eJc5H!S))TmXbUW2MeO;Mu3+t@`M z$EY#JlwdPKbMllhKS8p~Zg#u7-S1)7J?<$ZeX`9i`y8_7m{XBr3eIuyB@`{Oq{tf?W_nrXJV=38jmVoPUgi|Rx9fEq7qGD!7#;Y&Q6+Y@S~f41`=Hcw%X>1J^HFkUr@rv4R8bn1+@C7xqNv&v=G9E^2#vn}?1Q0RLV zv!$)=*B;J=dhFwk;Rd8BQcM8sH9{oHvM_G^T9Qk>>jy|>g$}k-&c(;W*`qZCS zsX?zI^MQY3HGSvLrKO)UEX>4Tx0C=2zkv&MmP!xqvQ$;N;4t5Z62vVIah>AE$6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRRoNXeTF@QK88OgAjz4dR(i zOXs{#9A+g+AwDM_H|T=Ik6f2se&bwpSm2pqBa@mZ4ik&T4wgHZl?;`5nmD4U8s!UF zmle)ioYhK=weHDZ7|d%cX|B^6MjT5>APEsNYAB-u3sKrNQcR@iJm%paa{Nhh$>b`7 zkz)Z>sE`~#_#gb9ty!3wbd!QHp!>zPKSqI`U7%UF?eAmTZk_=CXW&X}`>PFL_LKB_ zTZl~*KK!#?ud;=UD z0%JwWUiWx+Z|B_p?P<;L2QhbYjs4`N-2eap24YJ`L;wH)0002_L%V+f000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2jmF>3LOgOgZA_Q000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}00020NklN117LEuojK^**vC|T + style="display:none"> + style="fill:#206476;fill-opacity:1;stroke:#999999;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> @@ -93,7 +93,7 @@ inkscape:label="Dot" inkscape:groupmode="layer" id="layer1" - style="display:inline"> + style="display:none"> + + + + + + + + 0) { + BOT_TAPE=BOT_QUEUE[0] + } else { + BOT_TAPE="BR" + } + BOT_STATE=ALIVE + gameState=WAITING + BOT_X=gameStage.start.x + BOT_Y=gameStage.start.y + BOT_DIR=RIGHT + gameState=RUNNING + for (var i=0;i{ + if (tape.length===0) { + return false; + } for (var i=0;i0) { - BUTTON_SELECTED=button; - SUBMENU.visible=true; - SUBMENU.buttons=[] - var index = 0; - for (var button2 of BUTTON_SELECTED.submenu_buttons) { - var buttonX = ((index%3)*48)+16 - var buttonY = canvas.height*0.8-(Math.floor(index/3)*48)-40 - SUBMENU.buttons.push({def:button2,img:button2.img,x:buttonX,y:buttonY,w:32,h:32}) - index++; + if (button.cb!==undefined) { + button.cb() + return; + } else { + DELETEMODE=false + document.body.style.cursor="url('cursor.png') 8 8,auto" + if (button.submenu_buttons&&button.submenu_buttons.length>0) { + BUTTON_SELECTED=button; + SUBMENU.visible=true; + SUBMENU.buttons=[] + var index = 0; + for (var button2 of BUTTON_SELECTED.submenu_buttons) { + var buttonX = ((index%3)*48)+16 + var buttonY = canvas.height*0.8-(Math.floor(index/3)*48)-40 + SUBMENU.buttons.push({def:button2,img:button2.img,x:buttonX,y:buttonY,w:32,h:32}) + index++; + } } + ITEM_SELECTED=button.lastselected + //console.log(button) + return } - ITEM_SELECTED=button.lastselected - //console.log(button) - return } } } //console.log(getGridCoords(getMousePos(e))) - if (ITEM_SELECTED!==undefined) { + if (ITEM_SELECTED!==undefined||DELETEMODE) { var clickCoords = getGridCoords(getMousePos(e)) if (clickCoords.x>=0&&clickCoords.y>=0&&clickCoords.ywidth-24) { + xOffset=0; + yOffset+=24; + } + } +} + +function createVerticalGradient(x,y,up,ctx) { + var gradient = ctx.createLinearGradient(x, y+32*((up)?1:0), x, y+32*((up)?0:1)); + gradient.addColorStop(0,"rgb(124,162,157)") + gradient.addColorStop(0.31,"black") + gradient.addColorStop(0.6,"rgb(124,162,157)") + gradient.addColorStop(0.61,"black") + gradient.addColorStop(0.9,"rgb(124,162,157)") + gradient.addColorStop(0.91,"white") + gradient.addColorStop(1,"white") + return gradient +} + +function createHorizontalGradient(x,y,right,ctx) { + var gradient = ctx.createLinearGradient(x+32*((right)?0:1), y, x+32*((right)?1:0), y); + gradient.addColorStop(0,"rgb(124,162,157)") + gradient.addColorStop(0.31,"black") + gradient.addColorStop(0.6,"rgb(124,162,157)") + gradient.addColorStop(0.61,"black") + gradient.addColorStop(0.9,"rgb(124,162,157)") + gradient.addColorStop(0.91,"white") + gradient.addColorStop(1,"white") + return gradient +} + +function DrawSingleConveyor(x,y,dir,ctx) { + ctx.lineWidth = 16; + ctx.lineCap = "square" + ctx.strokeStyle="rgb(124,162,157)" + ctx.setLineDash([]) + if (dir===LEFT||dir===RIGHT) { + ctx.beginPath() + ctx.moveTo(x+8,y+16) + ctx.lineTo(x+24,y+16) + ctx.stroke() + ctx.setLineDash([5,5]) + ctx.lineDashOffset = -dashOffset*((dir===LEFT)?-1:1); + ctx.strokeStyle=createHorizontalGradient(x,y,dir===RIGHT,ctx) + ctx.lineWidth = 3.5; + ctx.beginPath() + ctx.moveTo(x+2,y+16) + ctx.lineTo(x+30,y+16) + ctx.stroke() + } else { + ctx.beginPath() + ctx.moveTo(x+16,y+8) + ctx.lineTo(x+16,y+24) + ctx.stroke() + ctx.strokeStyle="rgb(34,62,57)" + ctx.setLineDash([5,5]) + ctx.lineDashOffset = -dashOffset*((dir===DOWN)?1:-1); + ctx.strokeStyle=createVerticalGradient(x,y,dir===UP,ctx) + ctx.lineWidth = 3.5; + ctx.beginPath() + ctx.moveTo(x+16,y+2) + ctx.lineTo(x+16,y+30) + ctx.stroke() + } +} + +function GetOppositeDirection(dir) { + switch (dir) { + case UP:{return DOWN} + case DOWN:{return UP} + case LEFT:{return RIGHT} + case RIGHT:{return LEFT} + } +} + +function DrawConnectedConveyor(x,y,ctx,connections,dir,pass=0) { + ctx.lineWidth = 15; + ctx.lineCap = "round" + ctx.strokeStyle="rgb(124,162,157)" + switch (Object.keys(connections).length) { + case 0:{ + DrawSingleConveyor(x,y,dir,ctx) + }break; + default:{ + ctx.lineWidth = 15; + ctx.lineCap = "square" + ctx.strokeStyle="rgb(124,162,157)" + ctx.setLineDash([]) + ctx.beginPath() + ctx.moveTo(x+16,y+16) + var endingPoint={x:0,y:0} + switch (dir) { + case UP:{startingPoint={x:0,y:-12};endingPoint={x:0,y:-14}}break; + case DOWN:{startingPoint={x:0,y:12};endingPoint={x:0,y:14}}break; + case RIGHT:{startingPoint={x:12,y:0};endingPoint={x:14,y:0}}break; + case LEFT:{startingPoint={x:-12,y:0};endingPoint={x:-14,y:0}}break; + } + ctx.moveTo(x+16+startingPoint.x,y+16+startingPoint.y) + ctx.lineTo(x+16+endingPoint.x,y+16+endingPoint.y) + if (pass===0) {ctx.stroke();} + for (var connection of Object.keys(connections)) { + var startingPoint={x:x,y:y} + switch (Number(connection)) { + case UP:{startingPoint={x:x+16,y:y+8}}break; + case DOWN:{startingPoint={x:x+16,y:y+24}}break; + case RIGHT:{startingPoint={x:x+24,y:y+16}}break; + case LEFT:{startingPoint={x:x+8,y:y+16}}break; + } + ctx.lineWidth = 16; + ctx.lineCap = "square" + ctx.strokeStyle="rgb(124,162,157)" + ctx.setLineDash([]) + ctx.beginPath() + ctx.moveTo(startingPoint.x,startingPoint.y) + ctx.lineTo(x+16,y+16) + if (pass===0) {ctx.stroke()} + ctx.setLineDash([5,5]) + ctx.lineDashOffset = -dashOffset*1; + if (Number(connection)===RIGHT||Number(connection)===LEFT) { + ctx.strokeStyle=createHorizontalGradient(x,y,Number(connection)===LEFT,ctx) + } else { + ctx.strokeStyle=createVerticalGradient(x,y,Number(connection)===UP,ctx) + } + ctx.lineWidth = 3.5; + ctx.beginPath() + startingPoint={x:x,y:y} + switch (Number(connection)) { + case UP:{startingPoint={x:x+16,y:y+2}}break; + case DOWN:{startingPoint={x:x+16,y:y+30}}break; + case RIGHT:{startingPoint={x:x+30,y:y+16}}break; + case LEFT:{startingPoint={x:x+2,y:y+16}}break; + } + ctx.moveTo(startingPoint.x,startingPoint.y) + ctx.lineTo(x+16,y+16) + if (pass===1) {ctx.stroke()} + } + + if (dir===RIGHT||dir===LEFT) { + ctx.strokeStyle=createHorizontalGradient(x,y,dir===LEFT,ctx) + } else { + ctx.strokeStyle=createVerticalGradient(x,y,dir===UP,ctx) + } + ctx.setLineDash([5,5]) + ctx.lineWidth = 3.5; + ctx.beginPath() + switch (dir) { + case UP:{startingPoint={x:0,y:-14}}break; + case DOWN:{startingPoint={x:0,y:14}}break; + case RIGHT:{startingPoint={x:14,y:0}}break; + case LEFT:{startingPoint={x:-14,y:0}}break; + } + ctx.moveTo(x+16,y+16) + ctx.lineTo(x+16+startingPoint.x,y+16+startingPoint.y) + if (pass===1) {ctx.stroke();} + }break; + } +} + +function RenderConveyor(x,y,ctx,icon_definition,dir=0,background=undefined,grid=undefined) { + if (grid===undefined) { + DrawSingleConveyor(x,y,dir,ctx) + } else { + var connections = {} + if (grid.x>0) {if (gameGrid[grid.y][grid.x-1].direction===RIGHT){connections[LEFT]=true}} + if (grid.x0) {if (gameGrid[grid.y-1][grid.x].direction===DOWN){connections[UP]=true}} + if (grid.y=buttonX&&LAST_MOUSE_X<=buttonX+32&&LAST_MOUSE_Y>=buttonY&&LAST_MOUSE_Y<=buttonY+32)?"#555555":"#b5b5b5") + RenderIcon(buttonX,buttonY,ctx,button,ITEM_DIRECTION,(LAST_MOUSE_X>=buttonX&&LAST_MOUSE_X<=buttonX+32&&LAST_MOUSE_Y>=buttonY&&LAST_MOUSE_Y<=buttonY+32)?"#555555":"#b5b5b5") index++; } } @@ -655,9 +1030,9 @@ function RenderMenu(ctx) { var buttonY = canvas.height*0.8+16 for (var button of MENU.buttons) { if (button.lastselected) { - RenderIcon(buttonX,buttonY,ctx,button.lastselected,0,"#b5b5b5") + RenderIcon(buttonX,buttonY,ctx,button.lastselected,(button.cb===undefined)?ITEM_DIRECTION:0,"#b5b5b5") } else { - AddButton(button.img,buttonX,buttonY,ctx,button,0) + AddButton(button.img,buttonX,buttonY,ctx,button,(button.cb===undefined)?ITEM_DIRECTION:0) } button.x=buttonX button.y=buttonY @@ -668,10 +1043,14 @@ function RenderMenu(ctx) { } } -function AddButton(img,x,y,ctx,button,rot=0) { +function AddButton(img,x,y,ctx,button,dir=0) { ctx.fillStyle="#b5b5b5" ctx.fillRect(x,y,32,32) - drawImage(x+16,y+16,img,ctx,rot) + if (img===IMAGE_WRITER) { + drawImage(x+16,y+16,img,ctx,dir*90-90) + } else { + drawImage(x+16,y+16,img,ctx,dir*90) + } } function ConsumeTape() { diff --git a/game.test.js b/game.test.js index f85e408..6eb08b4 100644 --- a/game.test.js +++ b/game.test.js @@ -442,9 +442,9 @@ function runTests() { .it("Run a TESTING state to see if an acceptable player-built level has no bots in queue.",()=>{ loadStage(STAGE2) gameGrid=[ - [{},{},{},{},{},], - [{},{...BELTDOWN},{},{},{},], - [{},{...BRANCHRIGHT},{...BELTRIGHT},{...BELTRIGHT},{type:"EXIT"},], + [{},{...BELTRIGHT},{...BELTRIGHT},{...BELTDOWN},{},], + [{...BELTRIGHT},{...BRANCHUP},{},{...BELTDOWN},{},], + [{},{...BRANCHRIGHT},{},{...BELTRIGHT},{type:"EXIT"},], [{},{},{},{},{},], [{},{},{},{},{},], ] @@ -469,13 +469,15 @@ function runTests() { console.log("ALL TESTS: "+totalTestsPassed+" passed, "+(totalTests-totalTestsPassed)+" failed, "+totalTests+" total") if (testsPass===undefined) { testsPass=true - } + } + resetGame(); } function runGame() { + resetGame(); setupGame(); - loadLevel(LEVEL2,0,2) + //loadLevel(LEVEL2,0,2) setInterval(()=>{ step() draw() diff --git a/image_data.js b/image_data.js index 923efc4..ec9a2f1 100644 --- a/image_data.js +++ b/image_data.js @@ -41,4 +41,16 @@ IMAGE_DOT_P.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8 const IMAGE_DOT_R = new Image(); IMAGE_DOT_R.src="data:image/png;base64,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" const IMAGE_DOT_Y = new Image(); -IMAGE_DOT_Y.src="data:image/png;base64,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" \ No newline at end of file +IMAGE_DOT_Y.src="data:image/png;base64,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" +const IMAGE_ROTATE_CLOCKWISE = new Image(); +IMAGE_ROTATE_CLOCKWISE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r9OFFEUgPHfriawu1ESCdgZGkIhWkJhYYQHoLDRxNLwACQklDwAFQ3lJhI6okJB3AcwsbIhtFpBhf8SIya6QHF3ks3A7t47MnKSU8095/vmzp0zw9XHMm7FLq6WIPAIb2MlyhCAObyJkShLAOaxg5HrEoAneI3bvRZUCjSt4SEmMYV7wlYPda5NYyxX8w5P8asAD4ziJbbxHWcFcg/1VPA4VvGlIDSfLTRi4S9wfEXgJIkhvCoB3J27wnm5EDXh/S0TnuXOZRIb/wme5VY3/BlO/6HZET7jR8TaNjYxkcEb+JQI/IYmFnC360bWB9R9wOP81i8lgP92IOP5JgMEDrGIG/mCCvYj4T+FidYv8gInWMOdXgWzkfA2ng+A5wV2cX9QwUqkQDMCngkcCGcjKjYj4CfCRycmZjAcC4f3EQLbKQ1ToqrrXewTrbIEiBscD65T4I/EZ5oSN/FRGCr1DrAi/OFkA+MrfpclcA5HFShV5l7kTwAAAABJRU5ErkJggg==" +const IMAGE_ROTATE_COUNTERCLOCKWISE = new Image(); +IMAGE_ROTATE_COUNTERCLOCKWISE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAYCAYAAACbU/80AAAACXBIWXMAAADbAAAA2wHwUOacAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAXRJREFUSInF1r1LHFEUxuEnLgRdVoJpFKuktg02KdJaCEkhWKRTsLXSvyGFlaZWRNJEAhqCWlslnUhsNCSk0CKLSAh+gR8pZhfGDZs5szrrCweGO+fe98c9nMshrm5M5cgPqSOYV8Z7PL9rgKj5Gq6x0m7zCjZq5m0HqGA9ZV4IwIMm62V8wFDDehVfcYpz/MFP7GIP27V/t1K65nnjCMsYw+NWzDvxqUXzxjjEG/Tfh3k6qhjPMu/CxwLM0zGPh83MVws2r8dy7aZv6F2bzOsx1wjwBEu4DGz+jR84uAXAFUYaIeAFPmdsnk3l9+EVFiTtlwfim6Td/1EJE9gPAKTVi7fBW6zHZJOzkDwiM5JXLQJQ1yiOgwBbGWeBATfbMwsAXkvqHIF4FoGAl9gJAsBiEGA6CkDSv4PB3Kc4CwAs5gHIq5UAwGapQIBHGM7IKUVnwlb0JZBTKdBfGRf+X4KjZhPRXek7emrfl5IJ6loyiZ3g119x6S+ogBYJVgAAAABJRU5ErkJggg==" +const IMAGE_DELETE = new Image(); +IMAGE_DELETE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAgCAYAAAD9oDOIAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAA0BJREFUSIntlV9oW1Ucxz/n3DviTYO9NrFlTToQ2j5YyqIIa1YK4theSsEw5gJ9EP9QweoQFCllreCGdb5UfEspWEFwIAPtQx+a0ILifKjo8uBmpY6aVEi70lwTcps/N/f4sC5aUBJkj/2+HDi/3/nw/Z0fv3MEgILLwBWrre2VL65e/U7TtLvA++VyeebNS5ds4HugDQgLKNBA+sH6ITDiKxQ+8dn2I7bPlxVCBD0ezxPAL8DTwLPNAAEkgAAHeFGAd+D6dU0IEdzc3MSfyVx0pZz+9fTpn+fi8aFmgAB6PB4/AbwcV+qlcCIhTt24wWe2zcfr69z1+9kLBsU3o6P9SqnfmoVKKeXjwHuFQuHElWKRtWPHGL99m49qNR67d49Pz5zB1XWUUs/Nzc29oJQSDaGapqWVUramaSRWVhitVmkF3gAmlOLdhQWWlpaQUj6qlLoohFANodVq9XMhhLelpYWBgQEcoHYQNAHDMIhEIriumwdea6Z83XGcVzVN+1oI8VRnRwcfABngW2ASKEYimKaJlPKHsbGx3Wagcnx8PGPb9iCgnl9f5xTwumHwthD8DryTSkGpRK1We7KZ+wSoJ305OVmLXrsmfzp7lh+jUSzLorK8zOWVFW6dO8fa+fNF4A+lVEkI4bquW5FS2kAe+FMptV8vH0CBJ7ewgHX8OLdGRgBobW2FCxe4U61ycnmZdH9/S7anpxdAKYUQAqX+7pnrukgpFSDEAXTWlfKtryYmyAaDpNNpVldXsSyLno4O4jdvUq7VOAkUhcAwDHRdx+/3EwgECAaDDA0N4fP5Dpcfj8czQAggm82SzWbZ3d0ln8+zv7+P4ziUy+U60DAMTNMkEAgQCoUwTfOB2/rsA2xvbW2FUqkUfX199Pb2Eg6HGzbFcRw2NjZIJBJ0dnYyODh4f/YfqFwus7i4SDKZxOv1AjA7O8v09DTJZBKAvb09pqammJmZud8UXWd+fp5kMkmpVAI4DP035XI5tre3yeVydWc7OztYlvWfZxpC/4+OoEfQI+gR9KHpn480gUCAWCxGe3t7fW94eBjbtunq6gLA5/MRi8XweDz1nGg0SqVSobu7Gzj8nawBzzwMp38BxWJHOyltKE0AAAAASUVORK5CYII=" +const IMAGE_RESET = new Image(); +IMAGE_RESET.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAgCAYAAAAFQMh/AAAACXBIWXMAAACIAAAAiAHr3JJSAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAltJREFUSImt18tvTVEUx/HP1WiiRNVE1YCItJWiBiIxMRADA21MxCPxiAQTI/+AgUc8ykRUhH9AJQy8JiVmJhJpQkSISBRtJQZarRZlsM9N9729r3N7f8ka3HPWWt+799l7rb1Jpzrsw0MMYQrv0IO1KXNVrM14jX9FbApnUV9L6JEkcTFobE+xqBbQkxUCY+vH/FJJ68pAD6IXmejZXzzBLdzBABrRHPmsxlI8KjusAurEuNyR3Ed7Ad8MDmEsz78rLXQJ3kcJJnGsgritGI3ivmBxGvC9KHgc21PE7pU76guVBu6KgqawMwU0q74oxwRaygU04GMUdKAKqAQ0EeW5VC7gXOR8o0poVtejXD/QFL+Mt9MqXMNvvBK+1Z+UsGWJNeETtiXQX8IMjCTvUi24StSJb8oXmBO1BhOaxdcS0MvFAjvQOkd4u7CH86EPFKmWzcKqHkr+wFzUhs8R9AUWFnJcgOeR4zDWzRHeisHEVhRymIe7Zk/NMNbXAF509q4UgGZtBBvmCC+ooyWgWfuOTbWEZrDSzErrFho/MyVzMPn9U5j6NGrAM6wROtwWYfHOUpNQabIj7U0JytfNKNeZcs49kfMEllcJPRzl+SDsmpJqEWprNuh2FdBuoeZnc1TcWi/KXVx7UkB3yG2JfSliNcoteaPCsaaUMkLxj0f6VhWdqEvuqMeE75Yp4Nsh3C7y/auufFfN3tMDwoHhOE4JB/i/eT7T2F8tlHAo7y8AL2XTatRvG/C4QuikcAmomepxWun700tsrCU0VhvO441QvweFM/huocNVrP+6PgXaCh5PhAAAAABJRU5ErkJggg==" +const IMAGE_PLAY = new Image(); +IMAGE_PLAY.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAgCAYAAADnnNMGAAAACXBIWXMAAACbAAAAmwEPcaP1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAj9JREFUSIm11rtrFVkcB/DPmdwbbx7GRK+IQbbQVQwIK0RIYSciguBa6RaKCxa+UCu1EDvZXaxstBAr8Q/QwifIrgirLrusq2ChyD6qKCJ41U2MuXMsJiM+gibm5FtNcc7vM2f48ZsDD3ASVdOYiCi4jgXTh8yrRi2hKXiKddODrOyMdtSj2ZUmchxDLRWQvX2aV2V7PbO8PWCf4HcsS4tAa+DbWWzsYUbWJ/gDBz9aNyWkTF+NnfXMV61V/IQr6E2LQFcLW+cEa7vIrBLcxfq0CAQMdLCtHvRUunEWx9GWDinTWy0+30BHwC7BbfSnRaASWNvFph5q2deCmziElnRImaU1ds/NLKlVcERwA4vTItCR8V0PG7qphH7BHexLi5T5po1dczMLWlsVU+IS5qdFoLuF7+dkVs8ks2bsVO+1+tSRssrKzrLVZ+McTqMzHVKmt8qOemZFO2wR/IWBtAhUA+tm0d9OtBAXKsmRR6+52Ij+HQmCh6Ld6ZDhnF9e8NvLiGEcFf2IV1NHIu4McbmRG8oDzuAABsslU0P+GeHis9zj0Wxsnu3Brx8u+zKk0eTq8+IEwRMcFp1S/Lo/yuSQ0citl1x7kRuNOU6IDqPxqW0TR+4Pc6GRe9bM8DP24t5Etn4eGRxryf9GguBvxSA8P+GX+yQylHNt/JacDDA+kuPP/7n6vGkozxQtuR+PJlt8fGT8lrzxpcXfTbSsLeqrFXfizCA2K64RyVJeuEfwg7HxnDbBA8VVZ1H64kXeAM9RoeriawdYAAAAAElFTkSuQmCC" +const IMAGE_PAUSE = new Image(); +IMAGE_PAUSE.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAbCAYAAABxwd+fAAAACXBIWXMAAADGAAAAxgGwdJvFAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAALxJREFUOI3t1TGKwzAQQNE/JoXQGQTGpbFP5HJhXfsoKo0XUupCSWpj0BmMKk8KJ2QXglnYcvXLQfNQNzKO40VEWl5tIvLZ9/2ZN03T9KGqX0DxnKnq9SQi7bquLMuCMYaqqgqgeYc8aoBinmdSSpRlibW2LQBijHjvCSEc7P8shID3nhgjfP/eX8tQhjKUoQz9Q+gE4JxjGAaMMb9e7LqOlBLOuR1S1au1tq3r+vlmA24Hxg3YHocU2C/tHUseO6D31KjVAAAAAElFTkSuQmCC" \ No newline at end of file diff --git a/pause.png b/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..44b7aaffcba450339ab8c4cfcbc81c2ccd545c18 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9d!3HD?58j^-q&N#aB8!3aF%V|lP%`@{kRe&( z8c`CQpH@mmtT}V`<;yxP|+Sw7sn8b-nUl`yAB%&I9#+> zYrP=Ja%|~F|0hL>vA;F6dc}iYIeBI!Uy$t4^5;@d5pRmTQS|k+Us0 zN}q0i|2xy%_wtv8tKuC#&RO~DtBTUwUF&pCHyO6ATE(@XvfU=DA!%NEkk^#d&aK;Y z8IpP`-g7F-y!o%w((rwrgmTUQd-10O+Ki?wzopr0LK@6TmS$7 literal 0 HcmV?d00001 diff --git a/play.png b/play.png new file mode 100644 index 0000000000000000000000000000000000000000..5ee66b9d2ed351fe1222b16c3ee07e9948de5857 GIT binary patch literal 690 zcmV;j0!{siP)P001Be1^@s6=bY0900009a7bBm0001+ z0001+0S|Gb^#A|>8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10zXMa zK~zYIwbr|96d7)bV!+{HFnR< zEU8s+L~sL((<0E3@m&uax~YVI!5!>NiX3^hHv=A36$&p8| zx!8#Q9SMSmqTT6`;hbMy@Y~CXVH_3xh*wibBJK=vxse;n1J2+82FoQ=L;e}z;Z=uZ;>;j6E3OgAQeL=6@Po1OoHoG&#Z_lf`r<|2 Y0MAjO>f&n$SO5S307*qoM6N<$f;3D(6aWAK literal 0 HcmV?d00001 diff --git a/reset.png b/reset.png new file mode 100644 index 0000000000000000000000000000000000000000..b4f1fede0e8d11dfa8a2d1603af1bc357a560b27 GIT binary patch literal 718 zcmV;<0x|uGP)_}Y_t|@`y-BA!?88G0 zVG8figS9DhRjkc;jekXK3TIJYOX!g#aWQCYPqC;L(32GcW9!HKQc3H|Ko6o9ndsSH zJi#s8!2lZ39QmxqQama+I!*9G2zSW641-V0z1$;M|iuihx4Hi6seZY!m1uh{=i(+hR+f71r`=^T!811<1p6E5#EZy z#8wn?n1{P&Pt7pa*8pC0_O29wW^Du;<_IsSqa~nO`;JYugl4eP%u4GP8b327b1?b+ zQ<(ZRYQQtB5jxx!Ve!sVlTc~0BkfHI%Gb>(*O_w8J(2SSmRAWq9Od~S?3$8l5o&8T z=yny*ZlUI9b5z_~FUnn9ds0Am$Zd&zDPlFsEqSBDv8I$VLh+AB`c@U4s7vms$As^e zDd5{7+%EF{tFC-k&EC@k!hzv9P6-G2zj;2>*k3J_a47FD054_JYSeEV@VG+gq;LtS znd)&`>HE`5Y^)_TRvXUajZnV_g){hWp~F?I|GGW}+6o>|ga7~l07*qoM6N<$f|a&I ARsaA1 literal 0 HcmV?d00001 diff --git a/rotation_clockwise.png b/rotation_clockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..02d0a75a0697b72fe3f900e08ebe4f8b28148b52 GIT binary patch literal 487 zcmV-z((nKzB$PY=6%FMk5;~$n zLEHy0v9ckwT0w>X5+f$MKyi1H&A{&7J2G;TQ_Vf+`{vG_GsD%#GH%5#u9hJ12ybI0 z$`F7#yor%0O91AvgOTeJfG2p3+r1W43N)?ZAto_}d%{)^b*@cgELZamPw}e&4~*g^ zw(%Wj1#%DdRPZ=f@ueU%pDi?E;V*D}Mc^cfA-pO9+?~6^dASfZ;r%TWp5@ME5*z;s zp5<0I{25OFq1h2W<445WHa0Pl!5jFL2>ga77I3%gM%D+^eZb@V)-NT1|8^kb`6dGd z4zY+E`GN}eBjG=ViPkUj0w-9*on8gAk?=O24}j+dc5#1D!Ahh+GXkCo90+G4DmEkF zC&EW3CT1`k3y1d+0^2DKQ=+QtUF;LBvIK}591pHj;E%*-ni4nhQ5Y)q4zMEp;ba5j dD}I+Ha1KWmC{^ZOl=6sx4R4K^v#S_nxYSfo?1wbH*Kg_WjOMAAe88iHC| zC7noYG$f?ZB8x}}et{n;W*5c{n>n*O>k9{lJLlf_$32|OA+Byr<;V}IBbZmldpy5u zfT;NzuCdZ?^9nX<=4}V4U_E7C2*86T>t%evP{Vo^UvY|a{J~G`Vh`K3f45S)=6T}? z%NWDsR?Iu`sYUa~IK&(D--mfRsu<5Q@509d%+oQCht14a3pTIEa_y#X=v|x4>oL~| z@B~Y^3~c_5A2_%Lz!gRsA>ai*XKbEL<@ezg79{PL2jZKg-TzSu6W9*`q}7YJ!CS1y zWRtUyJR&oaS1kfi*C>vI09zSnfdMz$GYbG-OX?hfcou^=(Ou~~dTQU7k_qZs dGKrnw*I#kzFQ|YP3043A002ovPDHLkV1l_T%fSEu literal 0 HcmV?d00001