From 1785343de01bd1e1eab1a2d9c73e0dc154542e34 Mon Sep 17 00:00:00 2001 From: Kistaro Windrider Date: Tue, 12 Sep 2023 22:40:48 -0700 Subject: [PATCH] Starting state: my generic shmup engine from a while back --- genericshmup-basic-collision..p8.png | Bin 0 -> 14923 bytes genericshmup.p8 | 945 +++++++++++++++++++++++++++ genericshmup.p8.png | Bin 0 -> 31978 bytes 3 files changed, 945 insertions(+) create mode 100644 genericshmup-basic-collision..p8.png create mode 100644 genericshmup.p8 create mode 100644 genericshmup.p8.png diff --git a/genericshmup-basic-collision..p8.png b/genericshmup-basic-collision..p8.png new file mode 100644 index 0000000000000000000000000000000000000000..7626d11cc097949b58a2067bfd448650958c44e9 GIT binary patch literal 14923 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 literal 0 HcmV?d00001 diff --git a/genericshmup.p8 b/genericshmup.p8 new file mode 100644 index 0000000..f1e01cd --- /dev/null +++ b/genericshmup.p8 @@ -0,0 +1,945 @@ +pico-8 cartridge // http://www.pico-8.com +version 34 +__lua__ +-- generic shmup +-- by kistaro windrider + +game = 1 +win = 2 +lose = 3 + +debug = {} + +function _init() +-- create the pwr gradient +-- 15 is the gradient color + poke(0x5f5f,0x3f) + poke(0x5f68,10) + poke(0x5f69,10) + poke(0x5f6a,9) + poke(0x5f6b,4) + memset(0x5f78,0xa8,3) + init_bullet_mt() + init_ship_mt() + wipe_level() + primary_ship.special_gun = new_gun_of(blast_gun_t) + load_level(example_level) + state = game +end + +function wipe_level() + primary_ship = new_p1() + pships = {primary_ship} + eships = {} + pbullets = {} + ebullets = {} + intangibles = {} + events = {} +end + +function _update60() + if (state == game) updategame() +end + +function updategame() + local leveldone = level_frame() + local deaths = {} + for i, e in ipairs(events) do + if (e()) add(deaths, i) + end + bury_the_dead(events, deaths) + for _, tbl in ipairs({pships, eships, pbullets, ebullets, intangibles}) do + local deaths = {} + for i, x in ipairs(tbl) do + if (x:move()) add(deaths, i) + end + bury_the_dead(tbl, deaths) + end + --then, calculate collisions + local pdeaths = {} + local edeaths = {} + for ip, ps in ipairs(pships) do + for ie, es in ipairs(eships) do + if collides(hurtbox(ps), hurtbox(es)) then + if (es:hitship(ps)) add(edeaths, ie) + if ps:hitship(es) then + add(pdeaths, ip) + break + end + end + end + end + bury_the_dead(pships, pdeaths) + bury_the_dead(eships, edeaths) + pdeaths = {} + edeaths = {} + for ip, ps in ipairs(pships) do + for ie, eb in ipairs(ebullets) do + if collides(hurtobx(ps), hurtbox(eb)) then + if (eb:hitship(ps)) add(edeaths, ie) + if ps:hitbullet(eb) then + add(pdeaths, ip) + break + end + end + end + end + bury_the_dead(pships, pdeaths) + bury_the_dead(ebullets, edeaths) + pdeaths = {} + edeaths = {} + for ip, pb in ipairs(pbullets) do + for ie, es in ipairs(eships) do + if collides(hurtbox(pb), hurtbox(es)) then + if (es:hitbullet(pb)) add(edeaths, ie) + if pb:hitship(es) then + add(pdeaths, ip) + break + end + end + end + end + bury_the_dead(eships, edeaths) + bury_the_dead(pbullets, pdeaths) + + if leveldone and ((#eships + #ebullets + #events) == 0) then + state = win + end + if #pships == 0 then + state = lose + end +end + +function _draw() + drawgame() + draw_debug() + if (state == win) dropshadow("win",50,61,11) + if (state == lose) dropshadow("fail",48,61,8) +end + +function draw_debug() + if (#debug==0) return + cursor(0,0,7) + foreach(debug,print) + debug={} +end + +function drawgame() + cls() + clip(0,0,112,128) + for tbl in all{pbullets, pships, eships, intangibles, ebullets} do + for x in all(tbl) do + x:draw() + end + end + clip(0,0,128,128) + drawhud() +end + +function drawhud() + -- 112-and-right is hud zone + rectfill(112, 0, 127, 127,0x56) + rect(112,0,127,127,7) + line(127,1,127,127,5) + line(113,127) + + draw_gun_info("❎",116,3,primary_ship.main_gun) + draw_gun_info("🅾️",116,31,primary_ship.special_gun) + + dropshadow("pwr",114,59,1) + inset(114,66,125,92) + vertmeter(115,67,124,91,primary_ship.power, primary_ship.max_power, 15) + + dropshadow("h s",114,97,1) + inset(114,104,125,125) + line(119,105,119,124,7) + line(120,105,120,125,5) + vertmeter(115,105,118,124,primary_ship.hp, primary_ship.maxhp, 8) + vertmeter(121,105,124,124,primary_ship.shield, primary_ship.maxshield,12) +end + +function draw_gun_info(lbl,x,y,gun) + dropshadow(lbl,x,y,1) + inset(114,y+7,125,y+18) + inset(114,y+20,125,y+24) + if(gun) then + spr(gun.icon,116,y+9,1,1) + --115 to 124 - ammo bar. round up + if gun.ammo == nil then + fillp(0xa5a5) + rectfill(115,y+21,124,y+23,0xea) + fillp(0) + elseif gun.ammo > 0 then + rectfill( + 115,y+21, + 115+flr(9*gun.ammo/gun.maxammo), + y+23,10) + else + line(118, y+22, 121, y+22, 2) + end + end +end + +function vertmeter(x0,y0,x1,y1,val,maxval,col) + if (val <= 0) return + local h = y1-y0 + local pxm1 = flr(h*val/maxval) + rectfill(x0,y1-pxm1,x1,y1,col) +end + +function inset(x0,y0,x1,y1) + rectfill(x0,y0,x1,y1,0) + rect(x0,y0,x1,y1,7) + line(x1,y0,x0,y0,5) + line(x0,y1,5) +end + +function dropshadow(str, x, y, col) + print(str, x+1, y+1, 5) + print(str, x, y, col) +end + +function grab_p1_butts() + + local b = btn() + return { + [0]=b&0x1, + [1]=(b&0x2)>>1, + [2]=(b&0x4)>>2, + [3]=(b&0x8)>>3, + [4]=(b&0x10)>>4, + [5]=(b&0x20)>>5 + } +end + +function bury_the_dead(tbl, dead) + if (#dead == 0) return + local tail = dead[1] + local head = tail + 1 + local deaddex = 2 + + while head <= #tbl do + while deaddex <= #dead and head == dead[deaddex] do + deaddex += 1 + head += 1 + end + if (head > #tbl) break + tbl[tail] = tbl[head] + head += 1 + tail += 1 + end + + for i=1,(head-tail) do + deli(tbl) + end +end +-->8 +--ships, including player + +function init_ship_mt() + setmetatable(player, ship_t) + setmetatable(frownie, ship_t) + setmetatable(blocky, frownie_t) +end + +player = { + --shape + sprite = 1, --index of ship sprite + size = 2, --all ships are square; how many 8x8 sprites? + hurt = { -- hurtbox - where this ship can be hit + x_off = 6, -- upper left corner + y_off = 6, -- relative to ship ulc + width = 4, + height = 4 + }, + + -- health and power + hp = 3, -- current health, non-regenerating + maxhp = 3, -- player only; other ships never heal + shield = 2, -- regenerates, using power + maxshield = 2, + shieldcost = 300, -- power cost to refill shield + generator = 1.5, -- 1 feels too slow + + -- gun + main_gun = nil, -- assign at spawn time + special_gun = nil, + fire_off_x = 8, -- offset where bullets come from + fire_off_y = 0, + + -- position + x=52, -- x and y are for upper left corner + y=96, + xmomentum = 0, + ymomentum = 0, + maxspd = 2.5, -- momentum cap + thrust = 0.25, -- momentum added from button + drag = 0.125, -- momentum lost per frame + slip = false, -- does not slide down screen + grab_butts = grab_p1_butts, -- button fetch algorithm +} + +player_t = { + __index = player +} + +function new_p1() + p = { + main_gun = new_gun_of(zap_gun_t, false) + } + setmetatable(p, player_t) + return p +end + +frownie = { + --shape + sprite = 3, --index of ship sprite + size = 1, --all ships are square; how many 8x8 sprites? + hurt = { -- hurtbox - where this ship can be hit + x_off = 1, -- upper left corner + y_off = 1, -- relative to ship ulc + width = 6, + height = 6 + }, + + -- health and power + hp = 1, -- enemy ships need no max hp + + -- position + x=60, -- x and y are for upper left corner + y=8, + xmomentum = 0, + ymomentum = 0, + maxspd = 2, -- momentum cap + thrust = 0.12, -- momentum added from button + drag = 0.07, -- momentum lost per frame + slip = true, + grab_butts = function(discard_self) + -- buttons are effectively analog + -- and negative buttons work just fine! + local butts = {} + local tstate = (1 + flr(4*t() + 0.5)) % 6 + butts[0] = ((tstate==1 or tstate==2) and 1) or 0 + butts[1] = ((tstate==4 or tstate==5) and 1) or 0 + for b=2, 5 do + butts[b]=0 + end + return butts + end, -- button fetch algorithm +} +frownie_t = { + __index = frownie +} + +blocky = { + sprite = 10, + hp = 2, + ow = function(self) + if self.hp <= 1 then + self.sprite = 11 + else + self.sprite = 10 + end + end +} + +blocky_t = { + __index = blocky +} +-->8 +--ship behavior + +scrollrate = 0.25 --in px/frame + +ship_m = { + + -- ships have no shield by default + shield = 0, + maxshield = 0, + shieldcost = 32767.9, + shieldcooldown = 180, + + -- default generator behavior: + -- 10 seconds for a full charge + max_power = 600, + power = 600, + generator = 1, -- power gen per frame + + invincible_until = -32768, + + slip = true -- most enemies slide +} + +ship_t = { + __index = ship_m, +} + +function ship_m.die(_) +end + +function ship_m.move(ship) + ship:refresh_shield() + ship.power = min(ship.max_power, ship.power + ship.generator) + butt = ship.grab_butts() + if (butt[5] > 0) ship:maybe_shoot(ship.main_gun) + if (butt[4] > 0) ship:maybe_shoot(ship.special_gun) + ship.xmomentum += (ship.thrust * butt[1]) - (ship.thrust * butt[0]) + ship.ymomentum += (ship.thrust * butt[3]) - (ship.thrust * butt[2]) + ship.xmomentum = mid(-ship.maxspd, ship.maxspd, ship.xmomentum) + ship.ymomentum = mid(-ship.maxspd, ship.maxspd, ship.ymomentum) + + ship.x = mid(0, 112 - 8 * ship.size, ship.x + ship.xmomentum) + if not ship.slip then + ship.y = mid(0, 128 - 8 * ship.size, ship.y + ship.ymomentum) + end + + --friction + local xfric = 0 + local yfric = 0 + if (ship.xmomentum > 0) xfric = min(ship.xmomentum, ship.drag) + if (ship.xmomentum < 0) xfric = max(ship.xmomentum, -ship.drag) + if (ship.ymomentum > 0) yfric = min(ship.ymomentum, ship.drag) + if (ship.ymomentum < 0) yfric = max(ship.ymomentum, -ship.drag) + ship.xmomentum -= xfric + ship.ymomentum -= yfric + + -- "scrolling" behavior + if ship.slip then + ship.y += scrollrate + if ship.y >= 128 then + ship:die() + return true + end + end + return false +end -- moveship(ship) + +function ship_m.draw(ship) + spr(ship.sprite, ship.x, ship.y, ship.size, ship.size) +end + +function hurtbox(ship) + return { + x=ship.x + ship.hurt.x_off, + y=ship.y + ship.hurt.y_off, + width=ship.hurt.width, + height=ship.hurt.height + } +end + +function ship_m:maybe_shoot(gun) + if (not gun) return + if (self.power < gun.power) return + if (not gun:shoot(self.x + self.fire_off_x, self.y + self.fire_off_y)) return + self.power -= gun.power +end + +function ship_m:hitship(other) + return self:hitsomething(1) +end + +function ship_m:hitbullet(b) + return self:hitsomething(b.damage) +end + +function ship_m:hitsomething(dmg) + if (dmg <= 0) return false + if (lframe < self.invincible_until) return false + self.shield_refresh_ready = lframe + self.shieldcooldown + if self.shield >= dmg then + self.shield -= dmg + self:ow() + return false + end + dmg -= self.shield + self.shield = 0 + self.hp -= dmg + if self.hp <= 0 then + self:die() + return true + end + self:ow() + return false +end + +function ship_m:ow() + -- todo: implement damage blink +end + +function ship_m:refresh_shield() + if (self.shield >= self.maxshield) return + if (lframe < self.shield_refresh_ready) return + if (self.power < self.shieldcost) return + self.shield += 1 + self.power -= self.shieldcost + self.shield_refresh_ready = lframe + self.shieldcooldown +end +-->8 +-- collisions + +-- box: x, y, width, height + +function collides(box1, box2) + local dx = box2.x - box1.x + local cx = dx >= 0 and dx <= (box1.width or 0) + dx = box1.x - box2.x + cx = cx or (dx >= 0 and dx <= (box2.width or 0)) + if (not cx) return false + + local dy = box2.y - box1.y + local cy = dy >= 0 and dy <= (box1.height or 0) + dy = box1.y - box2.y + cy = cy or (dy >= 0 and dy <= (box2.height or 0)) + return cy +end +-->8 +-- level and event system + +-- a level is a map from +-- effective frame number to +-- callback for that frame. + +-- effective frame number stops +-- when freeze count is nonzero + +-- a level is won when it hits +-- the end-of-level sentinel +-- and there are no more +-- tracked enemies. +-- lost when there are no +-- player ships left. + +-- effective frame +distance = 0 +-- actual frame count since +-- start of level +lframe = 0 + +-- do not advance distance when +-- nonzero +freeze = 0 + +eol = {} + +function load_level(lvltbl) + distance = 0 + lframe = 0 + freeze = 0 + current_level = {} + for frame, cb in pairs(lvltbl) do + current_level[frame] = cb + end +end + +function level_frame() + lframe += 1 + if (current_level == nil) return true + if freeze == 0 then + distance += 1 + local cb = current_level[distance] + if cb ~= nil then + if cb == eol then + current_level = nil + return true + else + cb() + end + end + end + return false +end +-->8 +-- example level + +function spawn_rnd_x(mt) + s = { + x = rnd(104), + y = -(mt.__index.size * 8 - 1) + } + setmetatable(s, mt) + add(eships, s) +end + +function spawn_blocking_rnd_x(mt) + freeze += 1 + s = { + x = rnd(104), + y = -7, + die = function(self) + freeze -= 1 + mt.__index.die(self) + end + } + setmetatable(s, mt) + add(eships, s) +end + +function spawn_frownie() + spawn_rnd_x(frownie_t) +end + +function spawn_blocking_frownie() + spawn_blocking_rnd_x(frownie_t) +end + +function spawn_blocky() + spawn_rnd_x(blocky_t) +end + +function spawn_blocking_blocky() + spawn_blocking_rnd_x(blocky_t) +end + +example_level = { + [1]=spawn_frownie, + [60]=spawn_blocky, + [61]=spawn_blocky, + [250]=spawn_blocking_blocky, + [310]=function() + spawn_blocking_blocky() + spawn_blocking_blocky() + spawn_blocking_blocky() + end, + [311]=spawn_frownie, + [401]=spawn_frownie, + [420]=spawn_blocking_frownie, + [450]=spawn_frownie, + [451]=eol +} +-->8 +-- bullets and guns + +function init_bullet_mt() + setmetatable(zap, bullet_t) + setmetatable(zap_gun, gun_t) + setmetatable(blast, bullet_t) + setmetatable(blast_gun, gun_t) +end + +zap = { + --shape + psprite = 8, --index of player ammo sprite + esprite = 9, -- index of enemy ammo sprite + width = 1, --in 8x8 blocks + height = 1, + hurt = { -- hurtbox - where this ship can be hit + x_off = 0, -- upper left corner + y_off = 0, -- relative to sprite + width = 2, + height = 8 + }, + center_x_off = 1, -- how to position by ship + bottom_y_off = 0, + top_y_off = 0, + + damage = 1, + dx = 0, -- px/frame + dy = 8, + + hitship = function(_, _) + return true + end +} +zap_t = { + __index = zap +} + +zap_gun = { + enemy = false, + power = 30, -- power consumed per shot + cooldown = 10, -- frames between shots + ammo = nil, -- unlimited ammo - main gun + t = zap_t -- metatable of bullet to fire +} + +zap_gun_t = { + __index = zap_gun +} + +blast = { + --shape + psprite = 12, --index of player ammo sprite + esprite = 3, -- index of enemy ammo sprite + width = 1, --in 8x8 blocks + height = 1, + hurt = { -- hurtbox - where this ship can be hit + x_off = 1, -- upper left corner + y_off = 1, -- relative to sprite + width = 6, + height = 6 + }, + center_x_off = 4, -- how to position by ship + bottom_y_off = 0, + top_y_off = 0, + + damage = 4, + dx = 0, -- px/frame + dy = 2, + + -- disable damage for 2 frames + -- when hitting something + hitship = function(self, _) + self.damage = 0 + local wait = 2 + e = function() + wait -= 1 + if wait <= 0 then + self.damage = 4 + return true + end + return false + end + add(events, e) + end +} +blast_t = { + __index = blast +} + +blast_gun = { + icon = 13, + enemy = false, + power = 0, -- ammo, not power + cooldown = 30, -- frames between shots + ammo = 5, + maxammo = 5, + t = blast_t -- metatable of bullet to fire +} + +blast_gun_t = { + __index = blast_gun +} + +function new_gun_of(mt, is_enemy) + g = { + enemy = e + } + setmetatable(g, mt) + return g +end +-->8 +-- bullet and gun behaviors + +bullet_base = { } + +bullet_t = { + __index = bullet_base +} + +gun_base = { + shoot_ready = -32768, + + icon = 20 +} + +gun_t = { + __index = gun_base +} + +function bullet_base:hitship(_) + self:die() + return true +end + +function bullet_base:die() +end + +function bullet_base:move() + self.x += self.dx + if self.enemy then + self.y += self.dy + if self.y > 128 then + self:die() + return true + end + else + self.y -= self.dy + if self.y < -8*self.height then + self:die() + return true + end + end + return false +end + +function bullet_base:draw() + spr(self.sprite, self.x, self.y, self.width, self.height) +end + +function bullet_base:spawn_at(x, y) + self.x = x - self.center_x_off + if self.enemy then + self.y = y + self.top_y_off + add(ebullets, self) + else + self.y = y - (8 * self.height) + self.bottom_y_off + add(pbullets, self) + end +end + +function gun_base:shoot(x, y) + if (lframe < self.shoot_ready) return false + if self.ammo then + if (self.ammo <= 0) return false + self.ammo -= 1 + end + self.shoot_ready = lframe + self.cooldown + b = { } + setmetatable(b, self.t) + if self.enemy then + b.enemy = true + b.sprite = b.esprite + else + b.enemy = false + b.sprite = b.psprite + end + b:spawn_at(x, y) + return true +end +__gfx__ +000000000000000aa00000000088880090000009e00000000000000e00dddd003b00000082000000066666600555555000333300002222000000000000000000 +000000000000000aa00000000822228099000009ee0000000000000e0d1111d037000000a2000000655555565555555503bbbb30028888200000000000000000 +00700700000000aaaa00000082a22a280990009000ee0000000000eed171171db7000000a800000065755756557557553bbaabb3288aa8820000000000000000 +00077000000000aaaa0000008222222800990900000ee00000000ee0d111111db7000000a800000065555556555555553ba77ab328a77a820000000000000000 +0007700000000aaaaaa00000822aa228000990000000ee000000ee00d117711db7000000a800000065555556555775553ba77ab328a77a820000000000000000 +0070070000000aaaaaa0000082a22a2800999900000000eee00ee000d171171db7000000a800000065777756557557553bbaabb3288aa8820000000000000000 +000000000000aaaaaaaa0000082222800990099000000000eeee00000d1111d037000000a2000000655555565557755503bbbb30028888200000000000000000 +000000000000aa8888aa0000008888009900009900000000eeee000000dddd003b00000082000000066666600555555000333300002222000000000000000000 +00000000000aaa8888aaa00000000000b000000b0000000ee00ee000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000aaa8888aaa0000000000000bbbb00000000ee000eeee0000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000aaaa8888aaaa00000000000b0000b000000ee0000eeee0000000000000000000000000000000000000000000000000000000000000000000000000 +0000000000aaaaaaaaaaaa00000000000b0bb0b00000ee000000eee0000000000000000000000000000000000000000000000000000000000000000000000000 +000000000aaaaaaaaaaaaaa0000000000b0bb0b0000ee00000000eee000000000000000000000000000000000000000000000000000000000000000000000000 +000000000aaaaaaaaaaaaaa0000000000b0000b000ee000000000eee000000000000000000000000000000000000000000000000000000000000000000000000 +00000000aaaaaaaaaaaaaaaa0000000000bbbb00ee000000000000ee000000000000000000000000000000000000000000000000000000000000000000000000 +00000000aaaaaaaaaaaaaaaa00000000b000000be0000000000000ee000000000000000000000000000000000000000000000000000000000000000000000000 +__label__ +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007777777777777777 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666611111666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666115151166665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666111611156665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666115161156665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666611111556665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666665555566665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007655555555555565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650b000000b0765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765000bbbb000765 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076500b0000b00765 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076500b0bb0b00765 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076500b0bb0b00765 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000076500b0000b00765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765000bbbb000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650b000000b0765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007657777777777765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007655555555555565 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765aeaeaeaeae765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765eaeaeaeaea765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765aeaeaeaeae765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007657777777777765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666611111666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666115551166665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666115161156665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666115651156665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666611111556665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666665555566665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007655555555555565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650002222000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650028888200765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650288aa8820765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765028a77a820765 +0000000000000000000000000000000000006666660000000000000000000000000000000000000005555550006666660000000000000000765028a77a820765 +00000000000000000000000000000000000655555560000000000000000000000000000000000000555555550655555560000000000000007650288aa8820765 +00000000000000000000000000000000000657557560000000000000000000000000000000000000557557550657557560000000000000007650028888200765 +00000000000000000000000000000000000655555560000000000000000000000000000000000000555555550655555560000000000000007650002222000765 +00000000000000000000000000000000000655555560000000000000000000000000000000000000555775550655555560000000000000007650000000000765 +00000000000000000000000000000000000657777560000000000000000000000000000000000000557557550657777560000000000000007657777777777765 +00000000000000000000000000000000000655555560000000000000000000000000000000000000555775550655555560000000000000007666666666666665 +00000000000000000000000000000000000066666600000000000000000000000000000000000000055555500066666600000000000000007655555555555565 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765aaaaaaaaaa765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765aaaaaaaaaa765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765aaaaaaaaaa765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007657777777777765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007611161616111665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007615151515151565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007611151515116565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007615551115151665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007615661115151565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007665666555656565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007655555555555565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007650000000000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007659999999999765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007659999999999765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007659999999999765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007654444444444765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007659999999999765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007654444444444765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007659999999999765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007654444444444765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007654444444444765 +000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000007654444444444765 +000000000000000000000000000000000000000000000000aa000000000000000000000000000000000000000000000000000000000000007654444444444765 +00000000000000000000000000000000000000000000000aaaa00000000000000000000000000000000000000000000000000000000000007654444444444765 +00000000000000000000000000000000000000000000000aaaa00000000000000000000000000000000000000000000000000000000000007657777777777765 +0000000000000000000000000000000000000000000000aaaaaa0000000000000000000000000000000000000000000000000000000000007666666666666665 +0000000000000000000000000000000000000000000000aaaaaa0000000000000000000000000000000000000000000000000000000000007666666666666665 +000000000000000000000000000000000000000000000aaaaaaaa000000000000000000000000000000000000000000000000000000000007666666666666665 +000000000000000000000000000000000000000000000aa8888aa000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000aaa8888aaa00000000000000000000000000000000000000000000000000000000007616166666611665 +00000000000000000000000000000000000000000000aaa8888aaa00000000000000000000000000000000000000000000000000000000007615156666165565 +0000000000000000000000000000000000000000000aaaa8888aaaa0000000000000000000000000000000000000000000000000000000007611156666111665 +0000000000000000000000000000000000000000000aaaaaaaaaaaa0000000000000000000000000000000000000000000000000000000007615156666651565 +000000000000000000000000000000000000000000aaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000007615156666116565 +000000000000000000000000000000000000000000aaaaaaaaaaaaaa000000000000000000000000000000000000000000000000000000007665656666655665 +00000000000000000000000000000000000000000aaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000aaaaaaaaaaaaaaaa00000000000000000000000000000000000000000000000000000007655555555555565 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007658888750000765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000765888875cccc765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007657777757777765 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007666666666666665 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007555555555555555 + diff --git a/genericshmup.p8.png b/genericshmup.p8.png new file mode 100644 index 0000000000000000000000000000000000000000..9bfb49dfaf2f6212d89e38d3764b31d065236931 GIT binary patch literal 31978 zcmXVWbwHEf_dh5IN;i^H5)w*FN_RIBN(yfTX&5m{C8R`9L575+ATb(-NZ07@8Zcn= zsBOQ8&-eGo9_}vBw&$LEUgver>)bd)eGRe)Ob_tz@W`|@RgHnaxxj0P_#SXoEDR~Z z!wdbQrK)5agujmoo~S?sFMhzBw+-X-yZ^3x;w{u?ge*viC!%t_Y4dGYic;(Mq)8!g zPOEkt3?k~{-mLrSAj5&*>ue2mmQhU?AQ8JC$PY~$ksO~?O;3E-DVGv=Ppn$7nf`^9 zC=ZXV?T)W~bErQIK}n$G&BmQ`z48y;iaL=)``S-K(OAsOvPlZ>-3k06eb&Q^adz9o zROCLFR6&wma&qV}MCLe;`F9hC|EcZm$W+5KJ!#>+2q-g|rBOk~M_wcOhEK+aOX0Wz z9<(IV^sM4!83Nu~kk=4tS}J89O65XTC)q#{;G7T}FMGc*8(#{0zt+&x8-&Pd(QY1d zalX{yY>pymL*u#6hPvOz|9(W<-|;3duq0_=g-fGSL&LKmspUWLFLrr*^eESKei$71 zTpq~cQcX$@ovq+AdN%626mpt}eC~6qUh4TLspX0P1}MqSkE?>&1(#%lI=Qwz6>hG8 zr*cUdYk0n3Xhqgc9WFpXqi35<9M|yDgm6>;(<}J#Uh?ktD6{{@_9vF-R~2Ka%=-*O z*2vzo<5cDnu4xku&vph|_-GRw>+|U-b|Lo0*S`Db8Wj3JRyRt-CRYDi@vLsmd)b>? z*bkSO@P-~=bUpW9V=U5VS)bUUQIHOV&2)<)mDOxW65wp@6kNl)_TM4TgJ?&P^5uYpbWKbjuD;|(qS z9}Qo}dy;oH`ab)=JC^1(U|XN4N_ZZ;W~tAr*xg6dBOSK8CgZ<*A??3s`9mg5?n6)V zWoI0XLfDlvaF=wE0n16rXNK#I9mi~$@JJJ0;jM}P4HHdxlO|V7K0o)ri6%F&*)!qQ z_X*mK)@OrVn7GRLckm{|1dH_dU?Jfc-lWTwi)TON0`e&I?FRoI(J1)u2I)hj4}jJ9 zuFX7S&ymR)=heTMD9PO1C=WZ3fVcOpGazh|4RRX38dTyOet_&SMM?JAw`<&pbIeu< zE7!LTEjNHDY>gKsq2tzjq@{y7d6QVzC*n{Ww|B?{XGg8~_#BV_hX9Pik|WdChe4V2 z7`&N+fj#YUCF>$cxHaz9!~s?MY_h3QpBWIRN1p*hIOyk;;V!&cb7Y2hXn6guCI)u;8*NYppSqQp-nJ=a5PJsrQ;0c=%-8tT{CVYWLrhs#B@> zN983^YjmdMWWLG-EIR3$0V73x7Z0hZMn)|+?MdL|0`T3_rAhoEhDDTQY>5$9MCR@ z_-|j)by;g#PG#I>1R*1NeMUG9uGm6gF+{)bP?Yqwn5|ghu#3J6T^H%po^2R?!1cmZ z{Wr3%zn9^TFHMH~71mj|8krSPzCUOt!f_{O;D|0oS6^tlFQGi{q-fb@1c5-VB3jJ} zgOl#I|C>bQ%(9~?) zZ8+90)yZke34VU=I{qz2hWvoR{qqCH@st-aiD_rbt7kX<2xX-zrY z4V-FO{63s++4Z9Hk*TwlCL`?^!A{Z&19t2q3F4B}iS}Qs&)2R21jqdKT?)kF;QQ~l z-uyKdA3rBVifm)31<*whTrgA=l+Calz65!!5Oun6CF@`hhP}YB&2(19$p@&j?1U=x zJ=Y7_=o;AF9f0tH_%o?_$l^uK?1L|WQZmZ9ptLxkg8?z zcB~=X_nM)Z;ES)*Y0kxOhQU+Bbn?Vp(JJEe9T6Kv@lFJtV*Q2RYj6g^jkX|3pdBT( zh$Z-Y2Inae=grnU>P8pedaO|yt<1d>YF;kK9wE|OA_B$lUWEK@hcsP2#P09cPqCn% z>y*Ligf1yO+ATb0X?Wm0t5W^dxhKz&U?qI)Yb! z5Ls=8+uyP0!N*R7EMeRf1uk~bH$-RkSUBz_b}9rLbyb2p1f$*1OQ$)3$eJ*;2`U)v zd-c&UY);k_1aI~~$eC=W2%7zXWrUqChsR#D<=zXO9j|OJHpQCai#(msu|H|ezP1&R zM~k&1VYo?1z;dIjNZ1hC=b&h1T;c9h#!PG@iuHdN((c~gB3mML^C{=eLTg}^T6bt(UMuJ%gPwwLBKeB>SVVm%oc)x93|A9g@73%38R^T@j^O&}8yDz_ zLV(dk4>uag4!7aoqV3BcDZETJP0u+&CB%=wIZl0dE|l*DSKtc*3x%ZGu=(%UUo4&U zvc()-OprjX7k#mx68W)+aK!2fBTtf5u#s!U`LmOfs}>}J zCiBvOk@DdQBmsjyS;pqb@WvwAaL~$2-@X5&!L131sTfKy3K9MnF}59w*#W@LwJx@c zgDd(;;VwTMRGh&7UBGb(%{`YV6l9+ac3wWM{Dgr8!;7d%4-Z4#-vk8>vSq`_L~vgH{FYuS9aImQ9O?EXDp(C zr$V?+gPp>KN$sz`qvTz`BKF0|j{oA;4)9CBCnBM!i)&n$Vo-P(m($eK;*`I>G7?CL z81-fCES{za=%~8wN_&_}y;ynpq)W|N*I3cD-9HH>-0MngO1I@t7fO#0R+@&0tuVA< z7w*ZSnqqU7-y6V^UO2c=o@qya1li)=07e@2)w*#UvEiskUss z%A=DIb{|5!NrvsGu}#`M$OTVGfUVJe=Q<-u9gMWPZ?E5%<|&?}8VmI>q`*lO_J?D% zNI)8fY!Nmv2Nxo7X;+S!qSyJx`^%wi;a&F;*C!okkdQ58F}4R13VOV<8~;S1{+~N} zcyiv!wCw~prY$k=j@&dyqJdcz(U32z@wkOZVvFMLG%R&`sD3$4`gqOR|7>%4yS3p@ zoBEy87)cvT`vHHY_Y6~n_;!{I1VOKDE$u)1Z|DSH05P;>T@pC0p-9-5wS4XPziIy| zbeqTOF*^uuLE3sd)4C$V+u+-W4&??nP8S`Ybu|6S;p$-M*x&t)YIxL6f-I|PqjqS% z9o1AYXtz|xz7Qck?6{%@fzP8L(_sU=Ije2Fis#P3MIyDBj;q=;1B$kW{}`x&d#cO5 zz^5@?=ljXwyK}duus@;=ZJV*%ZYCkdc1$0iLoRD!48rob%O4`GdyyA8B2ATe0XW0^ zhsRRk+K=o5INA`ymuO#AU_JiR)2(=@n^}tR%dVb6lTa^MHnTlwBa&Eg{_0!<#yJyq z@O=@-)#e#`J+yFti-!vJtizMKQd_rfSQMPqRE$mWe*;_nA(a!BectNuRSpLwxg+Ora6tHzG zw|im+MgfbAS_qa{xEQ856w72itYMeNTX7Z6f-PgJ`1?r!-w8LH5@|jC5N`h-eC4R< z|MMXO!NsKB-_3K4%UKHD)v(k2Wvqq*Mxho2cMU~<&sq-0|7+iOyS%W!sLc82$;-aT z+wDtkxd`9y^uZ!(;*J5EBqDDY@7j8vsc^{W)v`D0_3jhz7u zB}931bM}d|V|wA{yz=9=F!5mm?V42Np`Gu^JiKW6gE?x|KJ2(Rm>aBibp;hTJ(jY& zB62`=TwUq3A=WM^T5tCi84||RdG5~xI4SbKR>QS02?Ee9{1|i#0bIRX{>*+|-7?NF z7ydd-XnOh!o(Ooo5HcTD|4-H)G#k@rOSzJ1VF{+ZlQFM&EymCpr1ajt_D@dptuH~u zE;Hs=T@~N857?a>Tz(rMzW`psx`)6T<&fRza%?+N@jBve`1xI;P$cdc*FlsViu~Vq zS_Ix2kGx$Bmx<%a6o!Y+1u{&rFZpj!3@8ESr})!CbGvzv^F>+vs}i{V=~WS2<+5H8 zq;$In*(!FJ9c6-H64U}hL@TsjQABGQvwt`&;=N3QOs0>-Z#XSP;98FUv15+8m+e9` z6&rO&Z7~K2gp?gfi4_1~@CS?|d&plHY{LKYGf5zJkH}t{3>GnU9Onv{xvZ%TV-$q0 z_eI2Uy;~D)zywF$+_NsLZ;QIlxjFuJ#jO3FgeFttf>ZTmm?HF^Cv3En=-vN!aH*F6 znQ#GH)2@i)xmf85LNtr4FS1{^Gqk{^@>bf?6$BwcTLT#xSgz4O6yckrRqyywp*zkD zrdQ5(;9|lc@@A>FYf;Y|&T$IvKe^E(u9zD*Zk0V0(}57#t%2o``(0)UWAbvq=pJm& z5~d1F+3npv5v_M<+0J1{#hQGh0`#Z#~f7n+lkOK&KQ1dRvkC;CCI% zXQNyTx52-fX)A$xW%|xD6n2J4p$yM66uvv2iuqq$CCbdf-CT0s)a*lB+U>xMsn^QL z5c|4pgGL7GjsH&q6u@?`5By55Bq0D--9K(j^9sI(w}%{XAG&p1I!raT2C!m{(N`d) z1CrlBygPbMcy6X~IQ_&SCo2@ru-;K<^7MakSmwt~WAw=^0p_Oll#YINn$rl9JS7X> z-G^j+L{z{iBVn{*H-ATPoXkF+(i#^l7MqQT1S9(mN=Wi?C2vG%N!-O}bsJ6uaITTeysC>a5`;VUb? z*xTvdDog3G52DzloU zx#hP*F6l0d6QRwCrkZ0O5k{|PW2?QDX1~8pOMNdum!ZooSH_>q{a{Pu%Rqznn&Nec z>&?~x+i%?I-4897L~LmAF`66$%$xuNAOYV)L00t?4=>8?otfu5&iAw*Hk%5YZc>+y z-3-bVMe}_5qi6Od*$%ur@ob(hVv9C~d)8RcgM<0WCNV?jc3+W#dom7UO3jZinWS`d zGbT!}_ANfO$a(9XOBttD=?blz|4Z*kZtJ&wwzWl*d5(=+|nj1ZpX?nt8MWO)Fc;E9&Gc6_g; z=IOunAGcEA#$sJsWY#Nb9HkF4GgbZHMNL92Q@q+}*~dO4!GZCrww8L7)CCAh=Lpvy zs4Jx68u)6@>*OLIjbN>8)&V0>IR~(dE8ZJO=t}z1%~j9kEDYRkAG)7^^MiuraBEsI z4T5R@fUT*7$-%IDUYBti2kU*fD+~X3Hx6^Pkx`nFE{d8uLZzhc+H?{$#?R{ug0|=a1<2tq~5bS+G~Bu zacvjLoz5r9PY`F4sxpxg{fgX6q^p`PU7L85as0g;U5;NLsr9eOm%2rR0jeEUFKW3) zjSYwjw|ei;Y2h~#QfqVll8m9WjlLHU_SNZ|S|iE$_>637ZHw2_*=FKZ@-)shZlNay zWt*zMHGRekO4SPJO*%|G;sr$ur5x$22L@Er=+p>z2^{_ZC1cOnckFQ&UdYi82dg-A z0`6|>5n1vv1l#(r1sH6hZWiyhUXms600WiQBOLTryZu-?F7l1V-NL*Nh*xSQdo8VGG#D~ zP}UZ98B?nKnXxuJV}Zq*{WfNXj#5G!SmI|o$J%R)m7etr{-TeIIbP%ZNEl2d@qjG< zo`2sp+_Nv?DAHY%?PP%tt|0Lz*L_}SJMUg$m#InZXgl%^kri1jdZEBaH}(#_n>4_J_-;>lgt9`FqV{1muQT%&9Pe&N`?qzA#FvwttZ zHUVEDml0x@-=tWQZic;t0~ayvK3!RM46I>CmX%Yp6?LsvUYTd^&E?bc&d?>78e6n` zv#mMutlH{#4+v^2Ie%6?TV8Gb`<{kJ08zy9M}J<)zv;#cBaT3R1T zUZ{J9xP+WjecdgU6l-w(7*WWVu1QJOX!?ps0PE$ipDn)Q_HA<`sL)Z&cU(kLgFGRKMi6EyH zu`kaq{-Mt`!gts=S2n7iqUN-m*X)fbYdJZm2LpJ%6Fo{+#2CdlZO5AM+TF{+E6+7| zpm{O-{EceeI+Zm~prBQ<{H0&DAWin>T-7^mDLlm z$Sd|>RPN64lz4bK%ziO&b>@my%egqb3)-~^*DFe9=ZbMAA+hqD&_`){t?D;z1-)^w zNaKZE5t}K1Fnu(<@dVasLevjssgBAOJU2=|u5h!mf!B6S=l0T>RRg2n^&OwO<;A8N zFG!odapH0Sz&a)EPi|VLpzIDNt4Y8lN26JsPNfcc- z-?T8DYtZ*Fea$>(nlhK^H}_se$qMQIiKlWAD|o?NiqJB2lj`1clB9O%xz^2UlYEuA z;LgGo%PkYPCtdNTs7fFD+vgD<;jGu&nA&ERPwM7l+=OnwOzs=)H4v%`q4F7&mM)X( zPmr*qdAXyJ)+=(XY>CiT84WG`Dbl?BfND?iBo?-SL%D*B*g`IrYr%Iv2 zU?OQ6C)eJHUcmkQy=#>+=3h{v?axSC+yU$}z= z_f5z~QiXoO=@`5q;7;R^Twk&6* zl+O61EGE()pTWMgA*U3F!(bQ+4#!Mxy|2)Q^M@vjZYB?pxbH|hP@HvknB$94B~llT z2QX@OB|VcD5~DE^ko7J)*Zq&;Vann|D(YWywnB1dhMu5?PcGf-tPc|@g}R!KmahYE zknA`Hxue4s zbR^5d$hUUDQ%782d4F%ewt}^Vt)Vk+INz zzBuc&$GKUI&idA^XzIU_5B=otrjHJ)r_014LRe`CpEz6XJc|_MEDe-M&NZddq$0^5 zY@Z8!EVLSHN%N2Xt&Wk?I9bzbB~BAJ=XFDp6Lb*{ThGABid;twoD_*%>tMwyub*5F z4`4-?FJlKTYbtT|r$4+d>TindaTdp}ONSP!O<>GAq?aanA&VDRmb`O#an!q?)XZ|O zr3m%RzgHL|{syLBp5lU(?^Bq8Ho*CLLes**0cBtnRVyRKQWAR}jMZW}-oY{l1pi%#pA>)0e8xkEe29GyLZIx{7aG zC|*c8AkIZDTi$5)FaHZQ(`=06+)?|Bu@*`(i@1UpSKc)8zaTprYYQACwjfl;2^B3D7%O-t@bq8PbW-TY{QTZv{A*`m6UGYH)scr&owgWYU-i5vOH zB$myrsfq74nRqhnS=PzQv^Vhw{p+)q#`hmxn&WOpUyf>3LY^u~XhrZU3Tf}G{9(v; z_nG9&FDSVdc6wx+{wI%oa692^=Lcq7_xxoKZm-^3V&{=n|HrlOZUzX;=-?{qfAz~Odm;QNZtpHXYISpdQ3Yu+ltJe zxs;oiEqP2i*4R4NSPLO1-OH!4oT0WtWoMvrDWuVDvLpEY-^BxmrYa2Qv+cD1R$VGKPHm1)XbeMFQ>31b+P}_ue1Bq$sbb3{q zOw|8UsC9<6?M-Xd_~^~Z`lCv_x{QPHDF%UdSI|Kd61%w+!e)8UgvM^>G#{Xv51PP@ z$cpRhoDdXT9=!w!LAAk9ZNPt*LJru`OK0s3$R#3Qcq_%}7sZRFtvs)O5On_x^kWFL zIKS^c>pA7vI_J`AmpmEJTwYh^Tmx8j2(V&V)m%jnsM*f%G^;7}bo-1~pT$DvTMIdH z4_yfz?Tg-uUaIN>aXD;ia&b+1x~4?bIG>Tzj8YL@7C)xp&rH>LRsQ=iO`ozTi6Q-W z)JCdrwcJzoQ&MV8Pe_gU=Jd2=@5Xkg#=7upX;_*Yq73MiXXA3;l_>wy{ptt(((vUy zUwI&=87GR%!fhB#w8Ah64)?xN=gqQJC67`++|P4kdE>G>>#aPVq)SyuM#UMwaAL@r zWAwYbSmLO>fR<~H_O9ma!H!FZ(~l@_9`eKo2j=CPuQ<-QX&?JzWS5q38{Z5pYZvGy zs8t{L?&@>)eBRZhC;fRi^S^ZQXxeXg!uzB3BRvgGe5*%$-K;#RX4F4M%nTIH3Isr- zWFLy`em$Za`#R{S{KVxKlvuo%Cq2h0cr7mZqn#nK@fnK`4fnjZt2(Nn8Np9jJn@5` z|Dzz(TPkV%Us<;#zZJhw?27(9L2;tX0={WITn*@sbh1?@l4)>JZnLs*mtJ66GQuwR6rH_0l)c+!IReuiL9MR4vA znM=`rZ@3C4D3c_vUCe=0^g)tip>oi1Uy%uL^yd?=ft_HNk+r}$n=A_-DOIEjhl$p& ze%2-kXxA;3C&Y`HK-rR7kC`T+q_ZUSZZ$3c(p#o6Dx=6MSMvU##{^Xc#1lEPyfsgW zOeJg$V#JRJZ6Cn#{gj_;2L$cD+12r*wEP5Ov+0OCY_objEU~a{e~y7%Y!bK_>ze$u zrBAwimyHqT5bpa_=$B4k3@>>dC}{Ex&814M_Li3O&!q4B2S#eW>hT4SWg9ILrV6yJ zjFm}wwmx*5KU4eW^Gl+@xc}n>+SbP?@lswU6Ib-&@G$s1!@(T@Bp=uUYme!>Ld27Zm-S<|kqhC7khpaGte^}eVxapqntUa7itmg2j z$L#kpUrqX(`BVvQXnJ~erT}LRp3dq$vOb--*Q3t#gAQdv6s7cs(&)xL(-M+EyA2UyhyXOcTnBT~5que-noAi*eI`VIG%=kS%4*XeuXMi1{$Y_bi?%-NfweWaLgM z(^qvn8$lilQ=O6~8yzDO)0b>@8P)4Pnd0vXH;lUSN(%?qj*Z_~I$bWhW;P#$<>HFK z=hd6w;~$wq;A42pYa490&UH>Ro6SMf_1}dsRM@~`;G!aS1Jdeo3Bk^?Z!2CFEk8YI zyl(SG%cDgsS}xE2Y1mbJSRm~xEdYU_)v7XcA1Hby=gX(doT0PASwjJ{<>mu+vX0G5 zf&fvJFod1(O(%q(o*tpnfByW1-<$$UE*hlu{V$IWM64}$w4tGi4N-c$yif2EZ`M!H z^;B0WVAdW#YVHR$d35nd*<#uzIf2JcSpsaMfT^v=sRl;79RcYjIm9l;%{jK^rN zpq}IlKt`FrGQcgVT;?P&gzwLm;%4jpAaWOO@SH0U)@{dWJx)oSSW3TNedews{gvh0GF70x~De=t`}}W{T_> zBm#2zYb{9+jg52jO4YiIr#Q!jlhe5Pb&Uh#GTb%YwevfT%@SUfeA6G${cFufA7A*& zXcEt1eCCr}^t_shdvlX^Rj;lo{eX~V3bXq&CPQ03S|zpsXnD-BTqV?y$;|pez3trz z9udpC?n>H531&)ynr|)tXqX8RzWo|UEW{sUJ&^*Za=@`o#LVs8SAv!~d=3-&P#gjM z8aAi>?@g+eP4uy4IO^Mi|8&&)JZ{f<{aC8i^Af0lM1(Ecj-cyHAwYKx)ub4>eBJH? zm#0WlymSqJ1>A66-G(?I%6zhP)6|AoBI@4s0)_c)bUD_{p1L$M%}=^`)C2x#4nQ?y z2zcPS`Kl#P5Y!q_VC*Ez_5rO5AX2McwdLCJ0X39N*lx5KliYe)wmO|o!CwKISlu!5 zB;}h<8Uw3`oIgxuQvWo`n(E}f(k)WT_^r<}KK?;sXGV-9O?&N|lUU~#7x}KQyRNoT zllVVz&ytu${WQkO1!2wmV%>%@4KqXqLWL@-6T0K-!kX_Rv6Tn zwUk{SFZM`27!dthgXd)@s14*o0~M|kaJ{_xHY|~wekp4HoQW^UqF&v}(aP?PV+%Xp zNl#{JJ=&;p#E*HOLQ8nY#&a(@XIo-~x>`-~d}2ILL-bj$L&uE3+}rJ3R!YH9H|{=_ zG!_jve!3R|&YbC{sbQ{hoN&)!l&q%7o!7fff-;tWn@2;&NG8k$II1JH*|_)%8caTQ znR>q>_s4VYAsdMhP(j%txC^$fWA1+4d#Qt5UilIFVR@)B`f*h*9X@BYbo#<>0AF^) zw}0;E8}UM}?Tyc+i>ue-aXz^-nUuu!}E~)#!~)qBwkOAZqpXLzI;@v zcoIh(db}4XAxT73smYmDKsCvkWWe5LTm)|^t?Jm8!)`}i^@?D*^mC+t`hW^pqQ;tI zEfS-DY1uY^&@IYW)=XAB^BYO98_U`US-k})qS;z9%in7X88>(4VpUl`5CH81)i7n9 zNoJkZP0s^lVXmS9dv5%R`mI36Kz7qh2VJcOA&S2#A2%CH$%Oth9o3B{U+)S)jW$~* zZK##n%F@r|Yxu>b|M!SYD}T?(SP-fsBI&p&G`@LSRwb$fA)8HNozqot#8@VOF1@?~)7^Rj{bH5uK zlC2ll>iPt|5_<9Sp!!2O$CGrf=aF&CaSL6hj${naYIVpGtLb&}M>r>6OxE2~L!%UG z02+u|kC$qztGxL;z11%T3$Quro<^H_HTl_GZcQhbEnQsQ&YaPCffgHX^eR~`T8_>J zHWe?fHi0A9ea<#R>wOk7rIe6S2;q?C^n$~V-WF8`{ZHEjJ3AdUxHLx-OScU^qE}Z z4@9aRSO)Q=Oqt34u~fU6+?|v=3BUM$t#`LKcv=Vi2z8YtB}lDuENa?(aQRJm8lm5T2u7w)}oo<;ZP#e_UA zpL5s6u8FN;fK0&Z2b(Dn|KA$vwe2bZvIC zA_T>3(Rv9@09+1$ZuP83<{3zAs_boLU74NN)PQ?s;ZT6QWY$o%Rb>ctPPlBc$)ap1 zFMl~ZPxxwdoHvO`lXmXTn!ETN&QB$pRC>I!1*P&qdwoTPrrD5UT^qwByIbr`qEp9N@HmZyKhCt5tjcMvwn@&Orhu<-#HeJ#h=qE< z#eGaD(7#kgr{wDlkLr_NRx*<&WJQP-cHT93H#6MIUGv2o98;fiAnsfw>004vKx|9d zhF(0*%(J90r;>qnE`{>Rn}hAnPN90$v4F8V(R6AVn(#Fxc2YQgj+uD&~EI}@O&?k zH1#Yf9N~1Ydg$QLZ7K*YRx{0nKB6cvHM2paMXov&3v?u?GC*k$O55>kV{lUtt7 z$T~K3(`1_Af1XaC5KvOZ+%i~OTsY_hU!+L9SrS{X2w~eE03VKh(+?`~VU8{QSsLR* z()Fgn{iplPp00!wigdO;k3YR@ESHhK#0O;pGScJBWy&z#G*oqH$R5*e)QWc3PACwz zNO4gd1v-tTr8-PJ(BE2*YG&**mct$gE@Rpo)`&#*1H*fmuVTR%GR!b=37!tTY47FD zv8o6ner*XRIPI!8T;-~Ami==fL*wk;3*xv`&C<1Yhy+IThQIrmFSFo<*KH6WBKz= zjr<$*oY`;vr-=juwKj#M4yex*{JZ8hmiPI!gg8XKj4AnMi8z&6qu#{zDml6&$H~lC z`Xo3lO{CgZ%ievE&Il(?Vg2;jx%}X?HXzy%%ALT?m+@w;tkUWdBNZl%n+v?r0p0w( zKAsQ(CsO9k7}HV@dBmDOjsEuXL8@5+7oUl-#4CQ;r$stn87F2XjM|@?vphE{;_T8- zTX_>8@cRYlJhd;BwD&yG{@zSoN_s)m1ERp7X&9OdIG%*f$hkQTyJQc$`4}f_B)A(Q znYpWYeT{2`U<>V2N!5X#F!S;e7seoby?(b!1BKv%T|CqO(K17~)t;vv;KZCX@j{ir zbL`bRqwB?Jk)pue626^L@5pT7PbEYpk9kX7bg~F6f*-3z$}vTo8df{8FyHf0dssSp zC$RaMR#_^~2m$NUj|=!#Y6E&Yj2v2wb3eCBo~!t4<11OfA4*o|B|4?ONfI;~EB)E| zHtWD|KAn%J*GYWm+4-wNtwn!y6sFV>S97zkQ$gx81>R@1xx9;u-Jh{dTnen!Qtwx4 z;AII^AQwpESdDndR3M~Q9NkZ+w<>Ntp!VMK+rn9UYZOwGMPp=0ztRQIOnHY&nZ-YM z=W$4aAMw+%e^u#hp8OLPiRRPT3`#PiM^e=$+}b^UdA-ys)rQ+60m|Yw-xh!A)i-@t z*QYgX{v;@q82`aY;-~P{uO-iVK)MqGfCso506`(-{^PPqfKLJ9eQQ4dw$dC~UXLud zKmuI5$`I!JhoRBI%*5`6&d=9krHn63JP$h)2XpzwpeC7k$8VWm{Mzkne7|j1H7>kL-V_Riib?hSa)l3W zUwSTX@rG*kY6OxN6cRVV3@VuxLS0RZytJ;g?M8)%-U5-;nPUE5Y2ANT3P)Lu=$z}G zTiI?qFEeq{1t5fdfGWB{(1*w~0Fru@^+;!^-I;rhT^&-du1v3TI?K6v7GMj|MV^;- zmq^pHRGiLc*{@?rtzy(Ttw{OR+Kn9_ ziFJ9OOPPs(mmF0Dq{fAF8XOU>3cPP{X@6}3X0Z;1mt^kRU!5y{#-bF4KjS7v9PiU? zejZQ%QWt+8(d(@&D}m4aP(p#owb0qnVM#`C`OcL>e z+%NQ)vj-n>iT_$i+TKgF{~0{J93%@gVSxTs@}?7@v1sxPDmiJL*Exe= z7b%WUMX>Q|G8rnq>&q8Z*gi2>VGnzgq5)>DCp2iS;m!!|8_;F6?c?2=tUit=~&xB9;qrRVx zUnRX9M76#vKQz>rIY`m;waGZCfE}IRTq#~N$ekUA1&2OgW5#8z!Y)}g8duqc`<8=j zF|9Bh`f^(X+<2ePpVsfzaG0waNbfq(CoBrzv3Tykt4f>QYwJfz@TI`=cdrmdiu*6> z)T^o@2yx4H*MNKL{yqrm0px?WUVw&-cB$E)1kEG&T|6X_&ds;1>wc>>w=SN#*H{C2 zAJgO5#Jja4s=Uy2y3Q2$h6!PjG*LCne-&zKrh)<@v_ip_q^m{_>2Z&f7)m%Tb%o42 z9r)dTF>%R&nzaBaTMBgxJ>_YgE6+Fs zO_mJ-@V+fFs^&aHT9;g!fx>0-an=yX%FAK^RMYQXV{4wJ=ev>hUFJ%!)%G{26;K#z z`U6^bg4dg*%KYnqjNHnrW=Y@E3$Sgol?YJwlq9s3kaVe0+Ma(+%q0Pyvdhp@izKLb zS2V%QB&b11NWe9|!eRLSsBKqnt!dQ@HM6^;u}Wrp!3N(9>Hg&zGdo!3&K2_urDZ4^ zO;Vnee~oDAg{DIXm8Ll@Q!=X^sb1=QX)1^fzNejUL!vu6!*pzyvKf&c`An_Dp%zHc z^;h}DCuv_j+iJ5bWziuy$CIj%v>OywkvFxAzBdI#P&0^b+V_y+*aCG@8zHm)2j-^k z|1sVDk3ajU8J-CAHoR`lh6WA|$Bv%OEgX)q_pVKU!nP(SKLJuGL&3UxIkEQPXsOH) z6ezbcbi8mhHPfla3gDCgtIFwCK!$0y0=$nk>rAF>(q*=M+Oftuc@i|4H3`Us^|Kz5 zLuw*+i8Eb#&EkdY-|`RqoMQhFlX|e+^D7fKyp#UzHHwnMzgd?Str^M3B%97z|C4`$ z`~CeHEeb*2{Hl*n^ZrT)xwaZ>(ilJJOic9)^sqLq`JgwGpzA~OBxxXyIaxeS=IiVJ z`1G98%3f);FLW=ID}KJ3i%%_!nb2SO*{_l(6pbe+^<5WFYV_Tgejd{dncCW#NEtl? zW^kS z0-?gO-hc~qXWzZmV+z2gHPHP5%8t5v;1pK zf;7RD+^it!ZBK`89jJBDsTuH@0NJT5AO)TVgo8d1)T%CPf2O>? zb@uic+U`D3x@En+?$u$kKOM5Fl$`aH0@7wH^RmfmJFgyhC|lMfpx^+NN6o{sGnx5) zm-6W>puGktt=1Yaw-O9q!2^jZt>?u}hmp|UN!quxbYy;XI!3mI5!q=k)tE&(67&ou zfMSC>zkKF;l}>21fqtYjoIkhlkT3X^hyeYbDOGuTYXeK;-1oa_|Ha#=@>MWZ#F<)1 zbkY7<6fo{GHZQmK5VBM`f7fUReI>+0@rAzBxQkL^!+oQ*SArXnO;x^|CVEuzOYUjD zHdRQ3F-c+FWMsgo$y`%3D5~bqWo<>6MnoP6_?{pI9vZ}zq=`}zhJ>B#QU#y<^ zFH^13_WQK(Zyg}g<*?q0srx>O4D&i)GO>%UJ+^_0Pb)&#|6^be(*jPU%~VVe{I3Nm zCOJO|h@+s^oY!@Bzia07sXV9W%gvF1diufsR4)RET~f$1%incCk7U55d1uId9ytl* zioYy?irLm6yi#)Bu2OOU)I970wQJbs$&V+j75UTj?vI9*kXXMpLBfEZTl$mq$b}W7 z(p>ihwF%CuLHr2^cgChy>19=sRu6!9*bg;KOtTKsg!V!;lgbMZ9VQK_zP%Rrs4u_t zlvVTpiI?!&F#b83?T%-8m)XBx=n^sUn28wr_!s^qYy9m-E{_Te3SFqln$?Y{m=KBP z$HrX_Z|HQstd|B%ir2LCUe|WpRuFD~%eLEdH%-`|kdb&mlr5UXCBqASk)Hx-( z}EfEOYK|w{ED#@tK$&ZbD&Rx_3ol*lT{R)tf%W*47HsOYZz*lyitN-IjJM*j-m#I~y56Fs7b z9M&owyKE<)-bM&g@hNp`$~@@c`P5DDsUf>|{ygd5BF`thNp3!3TEZvyVwBT#RpGOK zR;0?MAOb2vGIu`Nj}mp=1%r?Ln&-q^3G!ph&BZ%BGe1h3mFA;l{MV%OK3l4Ho49)> z*jhq$yY4eS(QXgkE8+E4ch(qqqhM0NQC+GvukKdQSmiBBr{2uULgYfAMODQD6)kGY zjQ@m4t=fOe?$7emPb;44t{i{9{zCK6f_BPl(su1X|F5gB42z>_x{g4w1SbjHxO;Gy z;BJcscUgiv1W0feU)?qovJ>KONkTw z-h7GaRYd6prz|Ym{%ClqUG(-%ZfDH=9GU@po`gkajU=0bRJB|vGFA;w7u@s1{I1_1 z{IhaTM}qtac3K6phwD!`HC$QLI$@k`>O~r4fIeQNj z*r}heaHxpt7B|IFV5oJ+CQ-smR}vo%r_9OS0a8ev0)(x^NB>Q(`FJnSzmL!cu!FMt|XxZrdD3E{3nY^JHN}a{dHoZXgen*Q@*w=L7=L7 zM9BbSLQvO7ZAyi3RXv>ij_|i`@pSx4gl6{Ga^-bkx>cnSiS$wx5?xs(SlRSyOpu6&&YH%* z%eRhzqFWf-!`7SEtK18mxjf+?VFW~+OFO6R>xEqV8@J3M;I3vhA6BjZ0G3l@PrZJ@ zW_kf6ah}4iA@e%m!Rb?n08Cpb(_E-pDyz}A>4CO@nhM*t?JhK*G47}#Kz;&~wS2N@ znG2ut6y(|)nziKy$;$tmO7$*QENbSM0T1dk7M2JHwj6_~>s2Ia2Q-&4*WzkZeyAr< zw|_HmU~Cw)nIJRA3N4BYk_T3=l z#~ALr3PcVVtORmly!hLOm#v0+k}3iI%2nr(O)saEgYvB$9qWpLwrmDHd#hB!mBoAr)$L>hTZh7Pl46hXe6; zp7%w7ygYYpeqzv@mm`NJ2dkfEKpW4RWyXam*AJZv(|ZTipKJi#{z2$wy&&?7Dp#qE z-88VVZI5{kaq2;VCdj4f*#Q_LT>FGc^r!dKK{n)bL+Ms;SRyZ_o6H+k@e=P8kAlEF zR`&FK4n1oq-L@kWNR>Bpd~PZTxro$UIHb=n0;y@sXMkP)*^Afl-7+;ntA8+{1gg$N z|KT^<530KSY-25L(;zjpf@D7{wXugUS^2uT`%`mzB30#>LWj$lU^SD>Rj~_7Db_b{(99=Wi8u21=i25fai{8$ z)S38K&8}N4ZV#Ie_ez)Dts3+*+pQBX_G-4riQ6ty|CDgI_!z$JXPWvo1rAGSK5P|E zY};`;c-NBGkg5(?VmpxU=1SEs2ksqA0pJmro&#tCvK!&&(AX(+KyEGo-+z$%0bTb@ z!K7LL9E1<%EeBJsoYM;~0N%}ho_QLNb)POhTXv^F%96XZ3IM!jZ6-qRzF$-7hbbuB zfcoqvfSXvi*Ott?C&|j>_WyODW*z2SFdpPM5znT9Gcrl*vC!t{b-6~*Q;X_tnxRg; z9NQ+;A6bj2U#e&Om#+ndQkM$`8kQiIkAIwEZjwify4HU+POE-_Ow1SDnsSMTQ7lbWqoTGFWMVJc_|p(YbE#=9_erbfgt^ERD|Zx?ixyVa`Z zTC(x;T`ZhlW(k`(U{Y+n{kGZ9ZIJTMYlO1x^z-GBK=T<*hTaK(+ni?Wb)6ibQa*vn zl(FqJbw}yWJZizBo<|NsHtXr# z2};FlrCeB5B#ZL}nM>d9OLQrZuhOh>uhrpb>5|E9$>k9cJhwN1 z!6v+1_BH_Q*~>o_&BX67mtA~UoMya12K~?gBtpJD<>8K=MmEohLd%?O!U5owXG*KI zK`sLn=^d14rh@TWKld51%gw`gKlSSYpqnpyYj6f<2Kqqv?V*WOk~#g@lG4}^>`x** zwx484i(&=NJ15K;i74FYUgadcqI}2N7kyy+U4oE~EKl?m?F)bV09-0;M9JDT=R)mn z@=if~e|S!4tgXCGHpM_>yz@9pXD@0@S#1mzuSymfI&54-u^2}p@ELLpd0bX+@f;$} za}@c&fOO$)#s05mAHPXUQ`SyWy;G6utj@DkPLIsj!p_P6wQu2ng}<$gAHdp4Vku@Q=~ve!f0q8a6T^(}Ht%I9C(+F58=e8{Y0!0SlXn2&i1 zNwW>TA0hubRY|fpD7cB!1PVw4HSCq$Jlzh_tMiFbX=^Ad$g^lNZY*`pNIYVUu}Fr} z9>O?Eup<+q)OyF1-{A?t%pg?P66=;SQjzp7l#oz9`WcBxxvQLl$T)8Vq88~Z@-^6Q zh?>-ZROBij{VsXmyEzv%K1bZW9NTza?G8R|KF=7J4RVoe3Mq1fGZ}RvtdiBRyy~(r zu;>9ogeOE_Vy|bqTcjqH-z0qijnp;0r7a1=loBIiid1v#3<*QkbUw?0MR7FIj;W~D ze^FVd*x@7Jl@64RRD|2zg?aP}G0et)R%P z9g`@MbwtrDjqI0-q;}+~HaU`jMXu9JN#*cC_blbQj$?}S0sH6s=(}F*du0t$Rl?m9 zZCBP0+m(0R*S#O^p&2*vzHx=VJ2PjKm0t!)?(==i3Vp6MZ`*DveHD}*I(#>x9@Z;Q zVhpb9zHB7=PSFw)3NPEB%H+-UF_5V&PG;fubQcBd(n5AaX)+7GY=DyYG#*8lNmu$9 z(^9eMIP<2N!6c<7q5!3IzG<4s^xnSM9>?7c6d=5m;IG=VH(C5AP2hnIUCE$KwI_1( ztT@bN{pz0(kM|%=6v^M!D~C)04^||g_jJ~WBjj5Lot7f8FMeTU=42nvO0p_Vl*3J@Lpq-WV^35|cq~n%)5+C<^T}D4 z5RXfa5^?hn#dN-9AlWnk)TMw%Q<(S725Y*IgD6cD(F|yl&*8+KBuyX&2u=+b!6q}01gD|Sd*-oLLO-oG*NqiGfn4t zsCKa5{h^ro6gtb)e*T*+w^fwmP;n*tXg621niS$F?;H%hvLJAZm^ zfC2b;To#|Sw$A!YczIj}XcYC!I%0di>|S+wuTQe3gQ8+|MWRww8l{`bDidCp6Ei-S z6UsuxFEqh4QGZuA2EN?Qq9_uz@f1d7j<)yx;q_iepo#LfczOmnG*P#cp@|Vd)$6vi z_z$ngKUR`7zG))$wGirrGHMM%LMnNq7&0}JSM}R88J;N=v|8m{HhCIS_)OV97`Iss zrI5vB2tw#nSo7$u@=j&K#zc2shgQSRq{WJ-%seO+zDdgQ5FJ>K(hprm@nE81ph;Rb zOe&U8e4h~XTYRytC^av!{NB)0vN7z;asdAgdC6FKNsLiGUp54m`}$t*h8Riv1s0y+t@=`0U-59uQp~=8{x#=L6&gk<%?(#BNiJ*mQ^H z++Hl4HI^R4z9L@pz_(&ccv#xyjxsEs;niWLAqXz7P@l=N5~@eNF2z@;ryax0V&5SD zO^=|aGWaO_wFGKQEiZzkmK}uH-cQP;Vk~QFPL-~^T#l{(73`WwG2g6L!@QzWZe54Ol6!IC&ciqElXrc7iP&x=U7Z*ZR2N; z*ezvWQAoUYm9i2Kpx2=3z1{g6dzWifmU0@8c~JXC7Io1`TIEITt57(x8XeiB;vrik zVJZ}t;rUv$m8qQbFRCzUW@P?NDrVe(4W4wv{@H3KG^C@IlQ^vzLL3SoS)UI;aAi=fnp6xc zjnZbPE%)iX$_|U`dGr+c9J3VWvW(U*&d}J&dKwv18zt>2qs1uroi&3EA+*tu8AB3Y z7^W4=3z`h4{E5}tjzg6Eak7(eM~M{GfiKa$mI;fY$fz6_19E#@UgySm``G*!Ni>c-0c=x}R4*aW962BI(>PWStMraw4&Wt)qjhEL; zDdI}@DaDFbB8#-KZ~~qq(BJGvjlzjj?)smrtB;+Lwv%DfNjQtAWOIZmMxhLc-rs+H zXK$l?H|XMB&Vv5X7`!bm3Ma4Hnx&t0TA+P32K7j+YiSc zkzEA=t7WAVlA;3bLRa`)NR@l4`gM@E>gRp9UJyrAGWMa)aYHz zy(qp{Sv*@%Xwa?cl_U?@)iUbN33-mXpoqjT4at?)OUNZ%-}&vBX4zTQBeYLlBaYqB z=}a18^(sG4lt4C3eugK8hAJBFTxv!mcv^(_i%6+D9?t5&Rn;TBzAmlj>wXu&r+~`O zB94R@2T6N>sjsV2trUPSu&-vG9f>FwsiTO{sca)bA5A70i#XPe@0Cs~Qay2q8rfuV z{Z*VG##Eb{*k2yjL$K@o*Zb)!6#; zV&&^)kmqZ29s7$-hZ(ADxOe6fdb11jn&h%C(OoxaoBv9xB6LAr%%k=LG6=d*Y`jPe zly^MFv8MwbOcNuF$>^Z3p;PBylPItWyBdRL-B%t=$4(QuAbx~UJ4Bj z2%kVMttui#85%y&^ADVeZ6M1aQW?nD4kz5eTo_IZ9!z5vY~wsNgXDcZ{wP*0V2pOK zH4C@w8|89zM_zD=bb< z6>Uybr?DLQL3z+PC!o289+z&x^KMvT!Oz=Bjw)Jk;HjIK;tF~4X}%VS1fes75Vp=MY3 zYgYc0UisibTqVTDJZcAJs4pQ)6^ZZ34)d3>h+vw?qf^S*KY<*%!o#myvx-ynsA+dA zG$dqFl8u)ebNGKJY|DEfnxCc)o?&4Vb|$%t@lLJ9)s zV$R9<6kPg|i95rJR}V>K(z)Kv;qPdK{X#SI(UQ_+Xds=`e#928<)EZ=`f4(i^Z8`P zqQabF+Kx24Ix^L^VW?rYWVGb;*(vb6pm`9PTl=njs!IXAcU=&|D5=g9UCf`Nu6@M z7);*WPwv<}ULAC_zmO-%;AKZ2Aq=lU3jT9^oP~jbelyrUC&c448*DKW-r?UNDmqobocZ5@*a2M7Nd zOlIfh5m-P%vPke}x9FLx3HH7K7rj`uCnP33OYZRBT-_JR6m&8tOyk|Ju|RjUcjrOJ z7-mGWK)-qF$}nL#JCcQ?{T3-wu*J>(Tn%W^e{;V*S;)!#2Vn-UF8WAD@@0k~__k(X zj@{zs7~I{lY$t*UKFI%8x#r z);9-EUR!JD;c)_OCjaH}a!;xWwn(T64)(U++IPG-X0gB+K3iKe$`lmn1x-D5nk0?4 z2DHI4OqhXhF_QLaI4#+mheu$reN6;?g!p2v#v-AkqlVYZ-j$cfi3^<1i1cLM!S<({ z2Pe9MKb~P?;I4g=FTYz@wVPVe*ZczsXf6{sO3CI)u5 z2Tgv@1o?y2Cp#X4-mS{lFDTe)lve54Bs{J40#AF{HsRcSqV&KM&0hnLUvY92Nr%&^Cn^rB6&N%!(ZLRAei-+W_(TsmkH^N41wqH&J=*X941eyYH2mRUv z1|!A`oP)Uim~?Lm7T**L{>M4P`dLXQ(YCN!Z2&usk!XnJx78dSrNLU{INJ14U7Y zR!YA{T!B9-l{g$*VbF!4elfyu1rbL(^4X#)uUEv6rk-D+NDC8BWU%rsKARY6<2~ov2oq7+(Mp1k-muV{ZzTNCx7HOsH(BOF3}~ z`N^qmhaM!YcK(cf5m2~zfkn=l&Uafs^2!s+V!2yRlvwI!MjdFW_EAj`EN)K03Biq> zRf#J)n5<3NNya2AR~8}a2{jR8z(cIIt`xC4|H<6&-BA2%bkl1UWqKKN4T41n`O^H( z>h#0O1?H-)Dvgg(QQTGgH3TNSy}Q=Mfb`g*jBmub8uJ7 zy6?~18uqHGIW3M4){J%rCO;?ZvJ&a4Rn6vuw|wBN59t)23FkMnz;uz0qYQd~m0))} zE&rA$<(k^#MgvQPlAdZ7viN4&B+7SE-Q{VqT5I?|#|)Muc_XgHR~hLk57vSSF0-3V z!COWRzp8iv_mz>Fri%E z+48$#@uJ~28_6d!)vj@Zr1es4(Rtza{P+YSQnV3MN#~5MU#3G&>_$ofp|M z2LIVN#AoGI)hw(O%8Gn#$+%?AS5s!B&;c4=f9!-oM5j>rRNBd)d?ZxSwnx z7N*3up2I-a^$F%0EQlzMdPBd z_ug$yAr-%x4TZg#4`)FB_jq-?O0bMZu&WM_a~{NEn2YT65E+N# z@g3!mN6k1>J1#64|y-}pnUo4-D602y+k|3>g+$^J+=ChS-!4!ZEMj#*elB1L^ zn~KJae#}&z<`fv5LiSTGng%^N8nJt8g*mQPUixj$qoKCo8(kE6C zT&V)>7-LgDB1^K*99tnxh;Q-42qr}#$@_y%NS2eXi5FW3$a1Xiy#@GjD*J+_HU$Ig z(oBh++um@Asm;fKnO7v-PBdia4|%&|oIC#^R3(WpudnuG`0$zOId=g13gx-qdT0`D zHRWLVXEFu?y#r+%!P|cp>l{oqpY$>^TQ|MW*KU0(?3(TsD=V7Q5`8aA`<#uyzwlH$ zZ!lu?+lRPUV$NMO9r_py{L@DBf!#OoR?fXWjx#WJ3KovUlcwqtZ>M!uNTi-DzB#>M zTX>n!4ejHIpjvTUxOF;ZI+_4BO$P1x>UkYZ{ajbCoc454UvWIWbvXbHpE9|5IxXQf zZBAeA%h!WD4oJ<+^pxXYdoZ9zOK;R+gdnOzQFzlZ=wpxD|&+(bJ_Txs9XXe zN->3~J#;=7mr6M<^*hcS2auSF%NUCIuYu_$k%}#r(pCiijml^9EUvGvDzh&H8qyGI z#})~jU88M{KAB)A@{rF~<&YVrAm@HW&M^)CG&|W4suS@Gh8F<5@O1(%l~MktE4M=S z?`$U7az$nO3Ptj>jo8Qd&D;+=dlfB&=aFw(xcSqen(Ta=OByos9Dd=-e*Y$8l^SDk z-LJl3MA(L`;Z@%F5dXXs!$S=Ic^6+f{1W5NPyeC+XyE1LgQ)(4VC7c!?SmX0b?8Xz z$<+Pm%eLs6$}gP%=KspKj>BV`Cs1qw{EEWqN5T2I1>AM57YEE zAa1%9BlH=`lrr(-BZ_&!9XKvZneLiR9LZ5LQ>)_gpJtGG_(uXd7Fr#O-klw%cc!F< z2#MAKwB_P9pH8-)TgI&$&O_b&CEOS%RZAm2=g0KM@hmNwS#x}}SKui`$;htuYOyCB zWusIXaA=Bldn<1ttug+hF3n16UhK8o&TO%XB&wKl?fX-EKT4`XoIkeOl=M5Xj%}Ow zN0t3x#|J(h2LV*s#%!vKkSOVMXEz#g+jp4wo5>a#WT^1#9i5fJRJ-O5?iJ5q(#G?8 z{vVsu{Eh?VZY-Zy9QTNb+HD$st|3UU* zVvV{5XlZ(+>b_rzagQ`aJL0$e7L-Oy$SxnXui+uoF7_qF?M0FJJh~NwZDXjKqgsh= zeqK-J6>=bR)4$cussKF<^L+ZU3>WnU6%6u)7(OCQdco6uyF6pM&|g73iq#}WCO?&w z{2_TkR;83(vb^Q4`Gqg_uqhK{pHKSDQ~7Yy^;P}ee^ha4*n;V{7Ve;<^y)1qg>9qKBUg!D}VvzD|2o2k!;3WnIWgt!n0g)DogxMl4l8j63D5not3H+E4H^2h=x=S9Ji zAj@(_(`4gJA%>N_9#f+gIce}-XsB&6zhx}_&l>3jHtQl#4xd;(lr-bG3GK;r-Pw-$ z4`d!He&{@_=66Po`ASCLM`WrEVI8>{d6;9rJsi;(myCR2AxdkGG{i6Ca!%L6ja(MGh5JA%<8Bo{yi)Q)FgV zZ#%4clBT(Tb+_O1aIX41TRY@!g+>o0hw@t+*3zVPHLx&ymy|cswSdd4ap@a2WI`{( z4I8IV|g}NkjkZmPsW5q30>{%YF{b`hj@GT&51Ni zH{_4L@?<&CHFs_>*^IgMt*{E&0G`D~&~YXB<`~ach@|yV?B|Jk<#3#$D*c-};G_OJ z_Lb^)bX@w<23NXA5H}r(!Fnu52Mo^d{qw-j@8&xbf9`S$9IyH|szOChPc*%Kh3$_< zvf0Seyr-li~t+ykmqk<&ACDOgGOHG1-7yN*RYh-W&I~wr6^hGYtu}#0u&@9CcdS($V z;$lV1bZ}xNO-&Vy6*VuVKJd*@E*wi`2db$#V)SX3Ih*x;x2@FZb9+2WO6ls9$fVFH zeu`>JN$#9^g3ds;@l!H;I=_OrF=PpB|7CpN{m+8i^5$&gZ?H&9`Kd@+{+)#;qUiK1 zZiwJy8WJES?|SF>>s6@<5v+68y3-fhtUh}=4#mLF-R z0R(mZ=EU65 z!$VnR3oO;nt4#(6=X_%pT*(>it#JX6R6Ed1A0Fbqw=rmF$}#w-S1A)RGow5A;qmZj zL<|_+uJIhbTvPL$s`AQ5@b1^h-d5_$O6gw32^APo(@*%{)>{~OM=v`~P4JArC}3NA z9pLeTX9i|BpX|qJrX!Pq|9^Luu5m@+`plR7mz zon_oc-6b%9>#@J>goz{6cppDngh+*+&jCfM(*}Wmun{oBJ8_Y^XBA+F7^7G$f6oz~ zwIE8{DM}HF+JRHW;Ja=+0aa0zv~y0)zw_1=lMJo5w`J%v6%`dzoSM#*0ACVKI6lut zuy7iRFRN_sw=lRS@FxoV-y>T%q_hHe4MHy1a#_XNmd+vO=I4rLS?(oIBpDCygG~U@ z=?OOr?OHl!^t{Xr+?F`hbpA+7UKF8Pvbv57lPvhB9$(l`79bFG(>eu4G`YXomK z1jr}ZcFDGvQA+U4zZVRMsRX<#>Xx^tiki&RVJcigkJxdxqGc^1^cagk>S<$F_>N0U zh7}zn8g#&eT%9_W7QJtg;Z0quFaScx^(N~|cm0PmPiq@wAa7pvt%F^Xr9Uz>`!gvtl z;DJVjDl1zBxR-7o^!1$LeQz#6%(F#c+q&s$Q_(m-qwnUS|8J?1Ow6p8)9_qd@{ke&P%)WjrhQE7J^s~rmg1&XbSx$VebW^We_z# zp4l8tc)G-c@YlNvd1;yMS5?aUG$=26=wCG}EIN(JkUXmRI6#`ez^6X5&(5yRm6=!E za3l=ZrhK~}J>y3zu>)1c)`8AJ@sV&Oe#gYWKe1W4pn-o?6*Z;a6hdV{!K+oWF~+mv zR}whK>KuD_xmz-z+OQpyIvZPi@bFa83qrX;7#Pi4K`}%ZCg4u~# zSQEZ1*0=HTGZu(u4@xNRdWs&g!*h{b6nce)(f4kIh@Ts!FbU>jN<336!?`pxi`HH( z)*4HtOIH2qoTE}!V&O~|hfoo)x|XV!W0^Gsi}A@ePQ4$yWsmxX>Y{0#NSEV>X;;r+1cCM5do{{qNrb*6uG1%mf z7FE|C)^cX4mszFibWxN^1;s=bl6;#v{EnE^En*q=ZYF7Ku{4S!@^2(ul3tD{+10G0 z4`P4+&D48Gz|jP4MUp&H3SMU_!Hs`NN@G0%%Ri%I!z4(#5f7}Lir zGi3rqofI`G4s0sIpMT`!$RRQuw()6L*4)pGdQPd@HO5gB(oCaMib*UN`nRR==v3si zWP>bj*n<_h;1wb2c0ercspY zX;yPtY(rVfx!1zm?^!aKWI)=T2Ct9gaoVn2wt3)SEcB9>W>sXU>tSzQZallD^%p$ITM zG$a0lL5EXM!93sCMHJ_Xg`prgxib1ec=N(;nf8BNn*$)Oq`BHz$N zWqu#;xUHwg&Gxt0zzgaYq+^yN0tD9XPDF}cpX>D^>8_VPG7*-YK~QWF zJeQXV^cm$|TXQQPzZrJrNyFd&vh8ws6(dJnp2rcdrMHqr!jaA@WcwUzEArN#4U4|XzOi>eE* zqWxUa$x<;zuIt&Pi+Ipy>M`GO{6naU;|oe5JG?if0|)6pn)J{Upa=mAw>a*ZTh3U? zj=|yz^UvZaY0~jGk<<3IRbm8$-+Z2oq$#vUl4=ORQT`k^xBQ#wdtRr5I8J=XN#&OX zl99<}Vs++^DQ{zR;X2jZ*$E5vaH&kseyNX8)&j#ir;l!gm$Ygork3v>*^PrIVyE%N zUb`gbvl_;A6XURwB}|EN$yhFCqjW;K`DQ|Y`4CHEIiwKJQb&~OvGWP0LGX6EchSf8 zoiPcZ{_N(Fm`(G3k}t$wDb%^`a8eh%iZLSn`FEVT4Ax?!@ zL8*!fvVz;%p{@KUs`F7yx|ekEQM%55z?Orm*gMJOs8g)+X-R#GI*{gd`K7z=p3J^8 z4VO@lbW_w%L&SX={tA>*hDK{^-8Q`Jg|63}RcyBY!vLaW zQc;19!dkRvE&@1#RdVS8A*9hsN&P|^Ix3LgFlsIAt~m0(Jbn?!x$=VfDTv>?Q~aUG z5M!bGT!$<>X|i&{H|Crr}wLuwQ`1xdd||89x9 z;G|lyx!iTCDit_x^frT7n)=&9G-)4`oBZ0V;yJqs+wEjW&#gI&THj8)+qH%bkf|ih zXcUj~xx!k$N$_0=P9(fY?vUGE3nqq>`&`-hPFW1M3Xu408~NRJ_#W6aZJZeqdvA}q zM$`4NOF!)DtmLp;7*xm&XB-3*dn)H)<^+0{%=#Xb+wF8DX0BxilWdj?-*xah^^sYO z5N>A&6K~qsd0R6#ZhTJXb(+NxzWKgnJ05HtPTLyxcdU#$wnJBpd~9 zjyull+intCH{dm(5q#m328ImreOWSY6|)2B}V*dd)3Idr&kNe2hRGxQPFIO159I zQ1H|_C5KP&*D5B;z+0?n1g{)t>_UE9O`Q@_*MPS^6fIoUtqN{ z8nk^9p8=iwKf>34{tT{BT_5LSVD*W|j8nQ?Y+79Pk@(svX7ZNy5c^E_ks{Bjz#HzT zNVbGMkD_j4f{7#j41D@TmT&(Ew}b4m&(&HmuYi*VXiB&OB*NYI$AV8sDKMP+s6PCq z0Y@pW!sUi9lpdsx&exLJ1@3w~?t62iw$GAlZbC_XD@hwS_VFKbGp|BD_ZF7tF}$xj z&O7Y9(1agwjyBh%h+olLV2m6uKW@{U98*LUnbQ(L>FFU}(pczKc{0QFVXnWKKk$>I z!%{*8N7QJP5paUqe~1w#g&fCSq33khPkb|m2LDoQMXCB4;;da{n!}|K5Wq1hMsAhW zbnzMvZu ztJ9NM0H6*i2t5m51x)pW*a-`Oyg}NI~DpPq$|2CdhTs$?| zcV&>#q4z7Gc*PW-a%TGeEm5(Yy0GU-r;LEY`%=?B92}T9Uje;%Ot4$EonNN+7B_Z0 z%g?*xET8orU$!WrvuG8RQ7R-0cQ8n!H`pzPPeyYw{-X+?OlD6!9yN)wcXyx05WJHn z_TK0axI3osyc&~==di%QxDLI12*A*Pa3uEG#xg;G(uhvCQ(4^4c0_SZFoK$k6C7c% zXRKErl>m6Jd7Unz!I;WC(^ySGv9dtROdTc;ddmh2hVTg{ zQsKx}b`S9yye3%SWR!wefM*prYNlxP54^n{Bt8gXLSF7#BtBP0%)A1n|8vn72@TY2 z79V&=DWU|@YAl%7_Ngou9f`fR$%b_uf6aAttWHv32p9O*Slqzbk@&payTNd<)Tw@r zAZk4B-i^RPDz;Ir9Hfq;CJrNPm?D6LU~4;kPU28YvnP$vkr4UCiEHM5^LdSz339Va5qd`goK(()G~QM4J+044C{1jFSkSXS z1m;O9d0&aeAx4YNUx&dm=2isao|7Tf6>s{FV zY9CGJ&(V9dJvr>G54B*UHSG!t1GG&8t#{LayzATDEsfHZ1{q_lnQoKt-?*qRYQ@rC(^|KfkxWU4O~r+kv}wFc3KH zZNg-dlJP08fHoq$msW39rgSqdl{j*W5^v0w|FHc#ZJskOu9f#eoz!GZ021nsPxj^G z_3hxdXEG9s;uWHXe*X_0 C?jV=| literal 0 HcmV?d00001