From 1f18ca6aa266a41a73d1bac844d10bde75dc95b5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 5 Jan 2017 15:23:14 +0100 Subject: [PATCH] Add basic minecarts and powered rails --- mods/default/nodes.lua | 2 +- mods/mcl_minecarts/README.txt | 31 ++ mods/mcl_minecarts/depends.txt | 2 + mods/mcl_minecarts/functions.lua | 150 ++++++++ mods/mcl_minecarts/init.lua | 290 +++++++++++++++ mods/mcl_minecarts/mod.conf | 1 + mods/mcl_minecarts/models/cart.png | Bin 0 -> 216 bytes mods/mcl_minecarts/models/cart.x | 339 ++++++++++++++++++ mods/mcl_minecarts/rails.lua | 46 +++ mods/mcl_minecarts/textures/cart_bottom.png | Bin 0 -> 114 bytes mods/mcl_minecarts/textures/cart_side.png | Bin 0 -> 147 bytes mods/mcl_minecarts/textures/cart_top.png | Bin 0 -> 131 bytes .../textures/carts_rail_crossing_pwr.png | Bin 0 -> 458 bytes .../textures/carts_rail_curved_pwr.png | Bin 0 -> 443 bytes .../mcl_minecarts/textures/carts_rail_pwr.png | Bin 0 -> 729 bytes .../textures/carts_rail_t_junction_pwr.png | Bin 0 -> 539 bytes mods/mcl_minecarts/textures/minecart.png | Bin 0 -> 7434 bytes .../mcl_minecarts/textures/rail_activator.png | Bin 0 -> 6915 bytes .../textures/rail_activator_powered.png | Bin 0 -> 6915 bytes mods/mcl_minecarts/textures/rail_detector.png | Bin 0 -> 636 bytes .../textures/rail_detector_powered.png | Bin 0 -> 3504 bytes .../textures/rail_golden_powered.png | Bin 0 -> 778 bytes mods/mcl_minecarts/textures/rail_normal.png | Bin 0 -> 357 bytes .../textures/rail_normal_turned.png | Bin 0 -> 448 bytes 24 files changed, 860 insertions(+), 1 deletion(-) create mode 100644 mods/mcl_minecarts/README.txt create mode 100644 mods/mcl_minecarts/depends.txt create mode 100644 mods/mcl_minecarts/functions.lua create mode 100644 mods/mcl_minecarts/init.lua create mode 100644 mods/mcl_minecarts/mod.conf create mode 100644 mods/mcl_minecarts/models/cart.png create mode 100644 mods/mcl_minecarts/models/cart.x create mode 100644 mods/mcl_minecarts/rails.lua create mode 100644 mods/mcl_minecarts/textures/cart_bottom.png create mode 100644 mods/mcl_minecarts/textures/cart_side.png create mode 100644 mods/mcl_minecarts/textures/cart_top.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_crossing_pwr.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_curved_pwr.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_pwr.png create mode 100644 mods/mcl_minecarts/textures/carts_rail_t_junction_pwr.png create mode 100644 mods/mcl_minecarts/textures/minecart.png create mode 100644 mods/mcl_minecarts/textures/rail_activator.png create mode 100644 mods/mcl_minecarts/textures/rail_activator_powered.png create mode 100644 mods/mcl_minecarts/textures/rail_detector.png create mode 100644 mods/mcl_minecarts/textures/rail_detector_powered.png create mode 100644 mods/mcl_minecarts/textures/rail_golden_powered.png create mode 100644 mods/mcl_minecarts/textures/rail_normal.png create mode 100644 mods/mcl_minecarts/textures/rail_normal_turned.png diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 42a2550369..927fdbc4f0 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -872,7 +872,7 @@ minetest.register_node("default:rail", { fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, }, stack_max = 64, - groups = {bendy=2,dig_immediate=2,attached_node=1}, + groups = {dig_immediate=2,attached_node=1,rail=1,connect_to_raillike=1}, }) minetest.register_node("default:ladder", { diff --git a/mods/mcl_minecarts/README.txt b/mods/mcl_minecarts/README.txt new file mode 100644 index 0000000000..e7873e6e71 --- /dev/null +++ b/mods/mcl_minecarts/README.txt @@ -0,0 +1,31 @@ +mcl_minecarts +============= +Based on the mod "boost_carts" by Krock. +Target: Run smoothly and do not use too much CPU. + +TODO: +- Make minecart smaller +- Minecraft-like physics +- Change minecart model and textures +- Add activator rail +- Add more rail textures +- Add loaded minecarts + +License of source code: +----------------------- +WTFPL + +License of media (textures, sounds and models): +----------------------------------------------- +CC-0 + +Authors of media files: +----------------------- +kddekadenz: + cart_bottom.png + cart_side.png + cart_top.png + +Zeg9: + cart.x + cart.png diff --git a/mods/mcl_minecarts/depends.txt b/mods/mcl_minecarts/depends.txt new file mode 100644 index 0000000000..1b3c7979f0 --- /dev/null +++ b/mods/mcl_minecarts/depends.txt @@ -0,0 +1,2 @@ +default +mesecons? diff --git a/mods/mcl_minecarts/functions.lua b/mods/mcl_minecarts/functions.lua new file mode 100644 index 0000000000..1a298841ee --- /dev/null +++ b/mods/mcl_minecarts/functions.lua @@ -0,0 +1,150 @@ +function mcl_minecarts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function mcl_minecarts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=mcl_minecarts:get_sign(v.x), y=mcl_minecarts:get_sign(v.y), z=0} + else + return {x=0, y=mcl_minecarts:get_sign(v.y), z=mcl_minecarts:get_sign(v.z)} + end +end + +function mcl_minecarts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function mcl_minecarts:check_front_up_down(pos, dir_, check_down, railtype) + local dir = vector.new(dir_) + local cur = nil + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if mcl_minecarts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_down then + dir.y = 1 + cur = vector.add(pos, dir) + if mcl_minecarts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if mcl_minecarts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function mcl_minecarts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur = nil + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + cur = mcl_minecarts:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + + -- Left, if not already checked + if left_check then + cur = mcl_minecarts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = mcl_minecarts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = mcl_minecarts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function mcl_minecarts:boost_rail(pos, amount) + minetest.get_meta(pos):set_string("cart_acceleration", tostring(amount)) + for _,obj_ in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + if not obj_:is_player() and + obj_:get_luaentity() and + obj_:get_luaentity().name == "mcl_minecarts:minecart" then + obj_:get_luaentity():on_punch() + end + end +end diff --git a/mods/mcl_minecarts/init.lua b/mods/mcl_minecarts/init.lua new file mode 100644 index 0000000000..f6bb851aa4 --- /dev/null +++ b/mods/mcl_minecarts/init.lua @@ -0,0 +1,290 @@ +mcl_minecarts = {} +mcl_minecarts.modpath = minetest.get_modpath("mcl_minecarts") +mcl_minecarts.speed_max = 10 + +function vector.floor(v) + return { + x = math.floor(v.x), + y = math.floor(v.y), + z = math.floor(v.z) + } +end + +dofile(mcl_minecarts.modpath.."/functions.lua") +dofile(mcl_minecarts.modpath.."/rails.lua") + +mcl_minecarts.cart = { + physical = false, + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "cart.x", + visual_size = {x=1, y=1}, + textures = {"cart.png"}, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=0, y=0, z=0}, + old_pos = nil, + old_switch = 0, + railtype = nil, +} + +function mcl_minecarts.cart:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + self.driver = nil + clicker:set_detach() + elseif not self.driver then + self.driver = player_name + default.player_attached[player_name] = true + clicker:set_attach(self.object, "", {x=0, y=3, z=0}, {x=0, y=0, z=0}) + end +end + +function mcl_minecarts.cart:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) +end + +function mcl_minecarts.cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:getpos() + if not self.railtype then + local node = minetest.get_node(vector.floor(pos)).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + + if not puncher or not puncher:is_player() then + local cart_dir = mcl_minecarts:get_rail_direction(pos, {x=1, y=0, z=0}, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 3) + self.old_pos = nil + self.punched = true + return + end + + if puncher:get_player_control().sneak then + if self.driver then + if self.old_pos then + self.object:setpos(self.old_pos) + end + default.player_attached[self.driver] = nil + local player = minetest.get_player_by_name(self.driver) + if player then + player:set_detach() + end + end + + self.object:remove() + puncher:get_inventory():add_item("main", "mcl_minecarts:minecart") + return + end + + local vel = self.object:getvelocity() + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > 7 then + return + end + end + + local punch_dir = mcl_minecarts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = mcl_minecarts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + time_from_last_punch = math.min(time_from_last_punch, tool_capabilities.full_punch_interval) + local f = 3 * (time_from_last_punch / tool_capabilities.full_punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_pos = nil + self.punched = true +end + +function mcl_minecarts.cart:on_step(dtime) + local vel = self.object:getvelocity() + local update = {} + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:setvelocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local dir, last_switch = nil, nil + local pos = self.object:getpos() + if self.old_pos and not self.punched then + local flo_pos = vector.floor(pos) + local flo_old = vector.floor(self.old_pos) + if vector.equals(flo_pos, flo_old) then + return + end + end + + local ctrl, player = nil, nil + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + if self.old_pos then + local diff = vector.subtract(self.old_pos, pos) + for _,v in ipairs({"x","y","z"}) do + if math.abs(diff[v]) > 1.1 then + local expected_pos = vector.add(self.old_pos, self.old_dir) + dir, last_switch = mcl_minecarts:get_rail_direction(pos, self.old_dir, ctrl, self.old_switch, self.railtype) + if vector.equals(dir, {x=0, y=0, z=0}) then + dir = false + pos = vector.new(expected_pos) + update.pos = true + end + break + end + end + end + + if vel.y == 0 then + for _,v in ipairs({"x", "z"}) do + if vel[v] ~= 0 and math.abs(vel[v]) < 0.9 then + vel[v] = 0 + update.vel = true + end + end + end + + local cart_dir = mcl_minecarts:velocity_to_dir(vel) + local max_vel = mcl_minecarts.speed_max + if not dir then + dir, last_switch = mcl_minecarts:get_rail_direction(pos, cart_dir, ctrl, self.old_switch, self.railtype) + end + + local new_acc = {x=0, y=0, z=0} + if vector.equals(dir, {x=0, y=0, z=0}) then + vel = {x=0, y=0, z=0} + update.vel = true + else + -- If the direction changed + if dir.x ~= 0 and self.old_dir.z ~= 0 then + vel.x = dir.x * math.abs(vel.z) + vel.z = 0 + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + if dir.z ~= 0 and self.old_dir.x ~= 0 then + vel.z = dir.z * math.abs(vel.x) + vel.x = 0 + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + -- Up, down? + if dir.y ~= self.old_dir.y then + vel.y = dir.y * math.abs(vel.x + vel.z) + pos = vector.round(pos) + update.pos = true + end + + -- Slow down or speed up.. + local acc = dir.y * -1.8 + + local speed_mod = tonumber(minetest.get_meta(pos):get_string("cart_acceleration")) + if speed_mod and speed_mod ~= 0 then + if speed_mod > 0 then + for _,v in ipairs({"x","y","z"}) do + if math.abs(vel[v]) >= max_vel then + speed_mod = 0 + break + end + end + end + acc = acc + (speed_mod * 8) + else + acc = acc - 0.4 + -- Handbrake + if ctrl and ctrl.down and math.abs(vel.x + vel.z) > 1.2 then + acc = acc - 1.2 + end + end + + new_acc = vector.multiply(dir, acc) + end + + self.object:setacceleration(new_acc) + self.old_pos = vector.new(pos) + self.old_dir = vector.new(dir) + self.old_switch = last_switch + + -- Limits + for _,v in ipairs({"x","y","z"}) do + if math.abs(vel[v]) > max_vel then + vel[v] = mcl_minecarts:get_sign(vel[v]) * max_vel + update.vel = true + end + end + + if self.punched then + self.punched = false + end + + if not (update.vel or update.pos) then + return + end + + local yaw = 0 + if dir.x < 0 then + yaw = 0.5 + elseif dir.x > 0 then + yaw = 1.5 + elseif dir.z < 0 then + yaw = 1 + end + self.object:setyaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + self.object:setvelocity(vel) + if update.pos then + self.object:setpos(pos) + end + update = nil +end + +minetest.register_entity("mcl_minecarts:minecart", mcl_minecarts.cart) +minetest.register_craftitem("mcl_minecarts:minecart", { + description = "Minecart", + inventory_image = minetest.inventorycube("cart_top.png", "cart_side.png", "cart_side.png"), + wield_image = "cart_side.png", + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + if mcl_minecarts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "mcl_minecarts:minecart") + elseif mcl_minecarts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "mcl_minecarts:minecart") + else return end + + itemstack:take_item() + return itemstack + end, +}) + +minetest.register_craft({ + output = "mcl_minecarts:minecart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/mods/mcl_minecarts/mod.conf b/mods/mcl_minecarts/mod.conf new file mode 100644 index 0000000000..5661f8b9ca --- /dev/null +++ b/mods/mcl_minecarts/mod.conf @@ -0,0 +1 @@ +name = mcl_minecarts diff --git a/mods/mcl_minecarts/models/cart.png b/mods/mcl_minecarts/models/cart.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b12d63ca534fbd5889e2def721946927aa4e4b GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iWS4|liQ+0JmLqmT%yNvMg zveeX;;^G;doin?-mQ0)W|NnohH!BK&iivYp|Kl?r1=Gg}Y-{!4*^ zDxNNmAsn*FDFR#L4{N+S@Il@wWp5fs;u)sGPDO_RL&S3j3^P6m{<_R#4O5|&djEeV3x=s#=;!@%J@Op0o_(h aW`=)D1y^r%+vEn+$KdJe=d#Wzp$PzFcOdNm literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/carts_rail_crossing_pwr.png b/mods/mcl_minecarts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..dc317cfb2c58a6d0e05023ddc4521a1171af8242 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`j)FbFd;%$g$s6l5>) z^mS#w%gD*CqB!})-6EjSx&WULS0Ei49-QGRmg6m+>n%~>D^chtS?DiW?3Bvlb2T^%Z29VSx~CS4OQQwKy5GTmvq-5I()>ADlL z^(SWQPsufymS;G7ojg#TBMY zDuKvsX_eWsD$`|EX3J~LR@RxXsxx0xZ?S9dw*UVb{{R19X)3e>=wil_AirP+hi5m^ zK%69RcNfd+3{xF|oT;8Jjv*44Q_mj{V`7wWekg6FVbmnT%HrB}h0*)p_j)5S<8I3d zsb=v^5sVCq%n3(7OKMGDvqAUy#M}~Lr8OFBm4CHQP=0WH*3$a>x9?YKy>DFj^@5f8 z>ARu6b*H8t)Hd12l~c-mxPOmD) z^mS#w%gD*CVkBNRXAMwjb%0NZE07Ki56W+^(W;3k-^k_gBgWJvx&(~GS*&TW*tK`t|NjjC|Npl-^!NhMxr`-2e!&b5&u*lFI7!~_ zE*1;emtF&MIz3$+LnI_w53(ycGYYUCh|~?V3tYtQc;&^Oz5mai0jg*?ZO(AO!joY_ zNGPMnsF|52d>+Hr#{w25W-88l?o{%LYqc5?} za;Jysn{)T7YY*1F%KyoA_-d|b(BYD|zn^-`hc$(4-e~lza!ro@#4H0jE&qRv`p5aQ U-@mq*4z!ZN)78&qol`;+0K$HqGXMYp literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/carts_rail_pwr.png b/mods/mcl_minecarts/textures/carts_rail_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..53c8c37b5f19c14d09316d7513f8021ab1fe4e7e GIT binary patch literal 729 zcmV;~0w(>5P)!R?3_>vPp0usSUilQ4w%s=#or8_x4&Oq&ATBBm6K`6|`<+Pmc^LT1s-8=IbA)YQzMm zVE)d4pmhbiG-ny??WKapz^7X^V%laPYnRr#x~S68L3xh>tP3{q<*pHY26#As17(i^ ztPAdeuhT|Aybw3!|J=!80Y66Qur9a3Yd{YN#}5v-ZXhX!KOY+b@#3f*+W7}O zHU4IxgYn=V@EQ1<3FxpcxCfSIjG%R#f9`^E<5OQxGO*?p{F*a@*7Z9*z-jpB2Dp5x zot-q$-7TN``r<=FOxq0bVE+1t`ue;*@Z*6YCb$P+K=*)-AYRSTEj}_ra1Uq$oOPc8 zrhZ^c>jsiyxHM}7Uk~UgGSGdyX9R74_Y-aD0c~Kxw&23_I`jY*I~+q@6VN4XO4r;2IN|6RGUNLPo8maKdF6Hd z{$^DO-Vfkxs15LN;F?%D7gU7c9%%J&`YJ9H^WRR#&o38NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l;AAz zh%9Dc;1&X5#!GkW{s0BpOFVsD+3zxQ35xUT?C0wQ3Q3i?MwA5Sru2dbJM;1l8sr2qf_9~vGU<0z5hE}h~bmFXp&xtBa`hT zljkR!?=M&2FIyNOR~RT)6d+d=C|4XLUm7f579w9BDqk4}L<&{m3f18X_0ftA(Mk<5 zN^Qy7-RZg$vh*ir>rc%!m{DjntH@|h2@o02Eis;7YO<)@baAEWk_yu$m1aw;%$8T1 zuc$R&U1zbr(Q-qx<(4+9?d>+Z_HO(CpTS4tkUh|eOeH~nz>qAPeAWWUo8;-@7$R{w zwf}e?6Qc+-yKq&z%9lwSwg{}c|G!?kJyxJ;vF^=e<}e0_6Aab^u))AH~>$=}r}mXpIB z?glNNGga(zN5wI_eRtabMlIie^~(?Y_$8OC!&cvys0q)OFOrLUf1km!N90ii--39c P>li#;{an^LB{Ts5{lm9t literal 0 HcmV?d00001 diff --git a/mods/mcl_minecarts/textures/minecart.png b/mods/mcl_minecarts/textures/minecart.png new file mode 100644 index 0000000000000000000000000000000000000000..e91f8b314670a6c5425de04d82f786402b3934ee GIT binary patch literal 7434 zcmYLNby!r-*S`x3EZqVUQUW4f(%s#SAgxFVND2!`BO%@OrAz7VM!LI8BqUs#_wxJa zeV&;;GkfoxIq^BM8>X%*hmG+Z0{{SQ1$k*rkix+!4nqY$CujZqK!WZhZ{Pv|INeVZ z((hPg2>=*s@1>;F)omSJ9bIf4ov0P0q^O-fIaiiWCWZjmVucD9ZxZoCTD?IqZ40721-7V9f}+k1&<`wV8IHj^eSOAAcXwWMF>J69;(9wASUsC`g z*)u)izppFs_LxCSrBn$w(hJD=8^Kte(e(7#sF+3-NL~~1y+eAJD$dsBnL@_p&x5;u z{tE!IV~Ig+&+k1(aVkbf`J(D@Oj&=oqdwA_n{PerjFmcx1Hgu>@5BQOd-Zd;5GvgM zA@}7m)b=fAwi_bCx(Zjk7RWwW)H`>2vW-kmOyk1B&i3}aVvnTJyCJnz<9eVd4 zuYHB@5SQz1oAmx%CjN5JtM#s57s~k*W8cxgnlJB0%iYyuKHgDI(e@~qH|jGJZD|lV zM@gqfo^$2XhDm;Z)%$Yt(QV-o=YXU&eC z(@ZdAxNYFZnET_2*u7l#O8{=I@ZA{z-b&N6X%AJ4^}_%_I@_Q5hXnaWCn-w@Dn%#C zawq1U8Q)h)`kpRHJV^{oIK?NkS7iZ`Ou-{RD4EUJr^P9GIy7v9Mbin_5Sn z@=W9tl0b;DY*Vbz0KgS+7u+Jp8Sh`EAu^3sE7e%^=J{9IT+DGxSI*SvXW41vpK6|q zMDpeAjhEWuE=G$=^>cLWlcI6=eB@y3>z4e<&w?IjG5nLZ46C&7`48PP1MYlI`H_@a&*kC38vWtg!|-!t!RIq`bMif9 zbA(7qagKl#w<5P*wdQ%ewHVq~vh!8Ct19{)Q(@A%Z}=+F$*av*d3XhXB+up)6l^qLLJzMu~D88`YYv0@76kf_<>7!O-(W5S5jgkuY@;W;T zQ?mCj{nd~%=@ysDf0ytsY2#~bt!c?_rwGz>~Azg3P? zHB}l5UKI!_3n}-H{2Iv}nN8tM6XBfW+DqF@n@d}(H#77wWT`8vYp_zN+BPgOIIe4P z2r?8f$k*2~G^v&?&nSO6+g#pUh+o*K8mC&CIcwAX<8R$yU2#3xkDYncrHVTHx-ai+ z%t>tOdn>w+<67gsG=2GYFM@_0vVc=cX-MhoQuB#OP*-p@bu|50>`U)O;sLvj{utia zJoi=|;qa@T_ZeDgQ*t&WHjOTU=b;f{N&&-cNuq3NIdqF)w&%sO@r2?{OBGnAH5zYfI|37 zhz)X>zl6UL((RR(4^4ZNnBbDtzp8~JiOB3m31W%pfbxKy&T<;tfj=?jG>E;Z`?KR{?{?osbo*j4289Ia1&c*Fh3Y?_;7sCmpIDZ1S(CnzPLy6vv*A<|sAN^- zWfm=A`yjmdrirIXtdGsw;Ma_PhQ7i_B?4A zsFfb+B~|#gGI*)j`M>QP3h1nb*d1c(VC)2aIb5DQGEviKH(0BEcN3gJE=n90UO}`( zl0@t`&$R5ZLmuKd)Sj{&UsGJ#(`Y$nJ!yTgyULnrgp*j3w3~$EfW5F-gT1C(b9DJn zW{Ev%glVZcuuiHmuU)vI#j0>{bVNu@`#`7Iw~{PGgh|>x77%-im;M{tHfJ-lX6vi=c9h)N#uJpI-I(>#_1W#NfB+$ z=-JnYayb1j+8#1a+*z^tuywwr_ifTSNqcS|AkfzkRM>)xpCi4?HqfSCe5SOaWd9(U zdX_4irj>eYWNy@?_DghP_V=pSo!rt3+;kpc15d?s?ZNkp2LV%YHfLjz83`F*eA%v- z&6aZOy!R|d*FNAno;2aPZcNHNM(hc-2#p$_HMpKtE$tBMHRz>Q3YyygcKt2<5I3dP z-<;l@TG421*LdvJTI+3%I3Uk_GrDro>iPHCw~rr4+ZgS$ehG0QQAOp=G(hv5p6XY9ULGlz4d6Uh@fNoPrM?e;$T_rE(1 z$tsuny85Wv20ger-(Kk69(B4eyHlRzt>LO|`%wEaJ=$LXywn;myp1D^i+hA3C!gP0 zaI-Ff{U)`Ayrv2Oc)bLB(LeyWegx?O0Jw1gz;81E5KIOD636eRy|Ms6z^foFq3yBw z$M{Gs4)J`|&lxp8AI?qg_$7ZDIp|+be!8TRlBY{w`c8WFALTp;)cEVJ^fZUzI+t_@ zet|rt6u!bE34BeBLN|X4%dqdH7F9jJEEhIIdjD)yInG_HA1|$)*UU%=75AquzrSr+ zmaIJVy*6pT-5>+TLO-88R5pCsqe^sG={*uc{AjpfeOhi#)_=qm$~wFs%Gy(?mV8Y5 zcWzDFFqi7-|R||p=V=TM~IrzcRVMgZgfJP3Zpl-8MSy=R6(^lp42hUY>!&I^@#0G4NixaP*yEY|r#BJy1ye zu(5)NEQ%Aq4={0!2De+h;Lj&EOaB(xt^$!y(a?Sz)tY!%4dc{hbbBwX&Oh=!%^S2g zd45jZpZ`$2BVTNNA?nBO^YHdxGkCbJwGMOjn7U;}qNVB5?P>lpX$r^GdzJz`3jbq& z5-LP4ijG3y8$#>`O1QyH{4f3pQFsy(n7T8VHbk~`Scw@uOpIG={?=V z@k=82owj*YmD9WCuju>w7&$>RPza1nP=$>R(fZUP#E8kv4rWap`kqudZC#N-&H9tT zDunmP4}bO8tZyHIhBhwNV2~&i3cFnu#xl*uZ4=Lmw3QC9uRQ7k1?=fXc}r;-K8YJm z(J##(?k>h39_B<8vMLr3Etb*I+5LishphXF5M+%!-)X;mkoWobm<80IEO)z$-9-+c z&vE)4F%;S(1p{;(f%oiOkSELCA?!UY9+y0>PnJ$4-6(A$Tk}GGxL@EY@5+wCEOF^N z?rPH-g#9R=FzB$>7_vVtP_YIY(HW{G?RR$ojq*7Y5Ea2sY|Vnnf$rUPeFR;tCWron z+t@3XC)o9m;{RE6flK7b7nc11{T6V~o?GZhM+om=MEXN1LNDaN^=1fMt0&^4;|aM? zfyeAn`lI~(!Mi9ZF=;?oNu9iqu;mKQv!HqMs#x?rX3ik#s@EPe#r3vJWZNZ`=*<=P z6P>%5S$&Zqh;X%p=Nq|mx*sqX5GsJT1EAkJmMEpw)?`)B&3oEJYtSljk0ih?8+OJj z@V2NTaCl{Ky?Hq!9sggeCn@NG$Zu(HyZThvMW}l|xyZK_5-Nc38d9XerxkRIS_@&Y zASKU|289Bp1VIj3Jz?eojGUC|($>e~0U$zYjTQ_&k_wh5()^F2qe292e5yWHh29_5 z_8kCkH9l4)Lzh0yIHDrE0>SkJb3(Jd)3*y_RbW~GO}91wmmM!`Y;#{9_LF<>Z*<-k zOr_6h|DKMY(;4Fhl|a;d$~h>-wqE$d%(7Z*HwcSDRWy!N7H}+2ATI2CP6wFk99~Ga zj>7z$;8P9k<7i3EgqMPJu3m(JC+CRVrh-f{P-&++@A==qu}K%)W6(hmk_m+%x?WH) z{RZsHkuPu^67kJEEQz}5^7daWM|x%8dj%TEBGCqk@q=3QylQPKcq<#A3RP37_}L(rpHEy!2Qu5fy@yg0kg7aGeftY`XFv^?N6J|JdO4=& z!dFy0lT)DEkJyny%T9efMw5#W>`-(AIIF?{!B+J9z_c8YgU?UpP_oV!6ziGb#a3qM zKH%v^K@rgHTanZR)LDWZ()@eCRqMWT1!z6i~48 z|6fx_$AgggGs4lG{-#e@zLNwso1P)poV)S1f@Yu7q7R%EBP)N+lc8MKfHt^4>Mb`v zzOHOdz^~+?1!NjwZSqJ+rYZPEkuejTw7>yy;Zkl*`M43gRkc+*fe(6Kj8d?p^|rkV z;;}o5K*Sn1_y;*USf#IOEOr-o@3NWnf?+9eiwUA(V~F;t3M4$TZ4CJ(>Hp3*boj~F zX>KoBtjJo;kVdJ(Clnzyy`#qXJsBqF%*@xF<#LJGQfpriW9*0)yAJ^Q(lk2J*?ZY| zSjM-La%nDcsUYwmpDvTW0T(;bA+%hk(8S)wuOKTB08c!)yb`Cr(2EX3v&R~5n$Pd= z8KZ$AWcRlAv35MSaWKyY%gIhyRu_Jud1gllt~sf~2WH2?s8;Q@_Rw?SeHhr=H#*^j z41^Mag=x2PWm~(Fei}q-R+cJ#N+{;qau=u_SJm$CldxYPXR(J1OfZVck}bC4(r@Bl z#kP?W7}5SUXv>1dl(v6_Qje^k-ML9`Rwp;R@>&?+kC`@94UmPw#JfuxZ@g)_fqThm z=w~nF{jcb>VoHs4ee-lr> z@C{%T0S%eP8C-xAk9^Z@CaimgKEjH_Q_oLoY?>V{*CuS@%fBQNlTPW0keg&nfu)ux z2XeW2TCYRlSzqe3QH}Wsw!2L`3E|IK2?FjqA&HI(3vn`q*$DS*FAwthCCcq{*NX0~ z;pXLk&|*(YZtq$>5pTE=yt!I?S2~gUURi@Zp`%dJ3_7E7u~>23VE{!6 zK*|hV$GpfHp6l*F@j{!}Iov41zQB1Z6-cdtRr@-!4TZyF{bvViK3z=C&i-`YXsiB{ z4g$mY!w0t($9EijKlY`Oh{FusE>RN;^}J0@S|MJ6Wcm44%G9)B-+?7#-H$E?WT(gw zG#n@eR?T0f5n9dyUFX))!EJc6z@es4eh`U~QFJ$9xvH`30 z0k0drA@~`}&3eqD)+aZriS2I8V6j_f+)IPxddFndfqHKT*~Y>x}Da=NKCe zR;Hd|*bcp(tS~*e|Li>y~IrX}zU6gv39*2Gy=p&6<5pBn*ic1oA&}8VU)EdNc z5#>`l#KSbFJEVwnU1?ZPCD7+FnEY0{ztco~>o>MDaDYr8GrT=AC8p z!^<=X`vO+hU1pi+)mg3k{TM| zptg6+pLafdd&c0B$5K_CMsiq{%sEt>PzBSos~L~ib4tW({-WZE@?`w<7(aU%;$PUh z4D=c79!N}XK>l;NF*LA9%ARyEyiK|dM2219e6kF`Y?&fokI!=S<90FK0`rqEagtp= zGp`NY*zQKrI~YXE6O-pAS>;eX^`U|&K&0klG&8m$lKNC33$X!u_B13Oetp+!TPp-6 z({7sD?w#YW)4RKu%?%&(Dl&5U<66>6+lx~wEoBcZG88B|ZtO zRu)qyrQj4jrU04c%|~;nW)fR%<25O609&am{bEdPA1K`>fs#)>5e*=fU+Tjvhu-udrGPKXwasqCs;s#bxsY zM+s@5?oYF-;X_A zr&a2`%?ySEsB4uBlim5SY)94dYh%WML`Od@ZqvVn!eEdEN&%_AzS$KZPtP7)-+UAV zAQBx~9~iR}RA?Y-P@23$g|n9(2@moAO#(PTOB0&PYgH{L zt)6-&_)??Fo?+sji!4&;lwgo3u6VJj0Is++XdP2-O1NT2w<|n=4j4I@;3=Cr@}J&i zoA(4hJlIl+H`?2A@MSBTv@r+*ul&t}2N<9l=;{SdRv*R~u9=lkOe&Y9X>+YsuxL*i zyEMQbPq{N2U$=k5-K4l#62+cv3j?v#V5>RBjo)eM5dR)IS_!SF$e58Zpy~iXk$Xy) z)Qy5*HcEl9xieB|dUyUpjsc|4flU^;VV>2?Q|CiK=Wv!A(!-TQ4?r4PSHh2ubWtM{ z?OZeAS`Oq|zx8keVqT@mF8Yo(kx4%#J@E2dwYU5$ncA+3Z1NR2WSp~~sNnQw8fbV5 z<7Nx+@FBNo6SSw?_SPmIJHgrzg@^*uBk%y0l^?Z=;D||gsBw243>)7K-gYgVZ0v4i zI0tIbpM*L#N@=11VF~8Q@-Q56Me2;P8jS1><$No03>}i0hcq6$45-0XC$g94I+i@O4j=`Y@9mViJElaqt!4gmv`QNN9 zW)`3bIt5O8U#E+%nI=^0yrsyx_UC&s7wuLQt^WD#!d_^DLR&KDnA@-WxeG{==IRR4aNN|_Q($&zD~Br1|Id# z9HiuCJVw6to`B-LHbzgAiJ>8C-XQG~wvVwO=z$ceADF{ zS3u56&>71&X`j5kMCJa4JzFzU9KZL)@#~C~ZS9>no>{ixF)(xZ zai)LM{WUv)PCOOo$1)I(uVT^;!tsSmlSn!?g{BagvQicdUmg?2KYYqS%SMv|`!a)m z)%SXTM!7{s6OMkew|&08F}|~k3&5;G!*c^lPKXAfMZITo`&bOVYrmZeXnhRmvY854 z#GxL^?K2=^q00I2G)@#-CQbH0yrpYy$EKCWsXRzuTq(*Xd`>X`jH zB+U<9NE*`J)!TcTq);vxLstOkS)dC6;uARmpwqNfQPI}6advZdwQ+XgS65NtcRAy1 zW$R!GfLCkMQBQ*i0=r@-!IDu=xq19ijKc*WD1<{+Fd3#Y-2i5nn3$Ey0s`suSlQMm zVsuL{Hqv2|0((+6=UMN&7I-{J_r$I-zV?i#=e+TwqYEDw3I-Dg7i+O~jDG8xMZyPC z?Z9rG0C~A)zECYpX=R}w1skS|il1qq>XkKh835yySTA3A2xC+- z1%7eL+o}QoE()Nsk)?)`UxPA5qM^7e)5Ikp4}$|=^P=8ydrppb^$7I5 za(JX{#<7LT3e_i=7?U8xf*GXLs9gsDH?jWZ@~*vMg9Clt16G3$`029LW&3ewK}CUy z&gFvZ6jXrea2>wYq`$w3(xn{n(7o6`(+ITc0h>;uv2+_Mpk_JtxlZ_gfy$^J=ArXa6MWH2s0dFqz+KiV zIsAu=U|S+I25kaU~3iFL?_}I4I0$_A9O1R3gu$Ow;GLf$kP(^gga*C34MF zPajfpr>u|fX3BXfxeGnm#eCwzunPx`DQEI4&VtJ*s(lqm7Bd04!1d-K&4RT^j<^si zK{JfZ4Zn2$p+MFnf@KwF(kU{P?ZS;QLX%==Sa%1XP?`^GtKgTqws@^TO)~Pr<0F(G zDBP8v-{s@J_9n%(-c5$l*e^QOzMea0qk`YF)QtK=pWWTSxoaU7e)WxT}>T?9EIp^)i=x6lQP$Co(3mQ6O3P#d8 zTI0KTTWec_jrfpTKB~iiqiW2%m+qJ>+Dt^w(z&iQF2jwQNB@w_m1hh>h5jC-lIQuUzhRz zNxgG-4(LA7?#)DfV87p($*cP!b4PZqj;BtjcHI$^v?7zGi}M!f$Cm>Rq+G_N9ka-N z!xb#R{zl4j!a%v{j2`9iHv3pjbEC(^5e*OO1s)Iavl>TLT<=-otir9522R%?7~VYU z8sFWLc(7KW7F~N*j8bf`*rO)9EUPTvtevgitwpWoqi06hM~7SS?k-76N!yZUhq(2k(; z=+XaX))Pf-u6H>39vr`~j8c-ydJlfHvCkAA|s1i6H&XLqv_vPwM?96MQi zSVOloY?(Rg)G9f$I6^lPKSDFQd)91Lc-C>Yj<>^*+}x`@99#;9)4OF} zXO?EZ9@4kwvA*S+G$qS%=TKM`bBsp}$5F?OYZ*>Ay{n@7xySMwp1z++OL&pcp4H;` zp`%)%?A-kY&Fu+1mBz0X@cX962?jlOdlgZcl4pC#M`WZ5?OU)rLkI$AXj)QoPb<0+% zd)vPp$vNtF+KsTS3D;-1U|kq85t@1Z`JOhrXJ7bB=+b+Nxwvc|%#lFrQrkvCJ`# z_xAhqD{G5$YV~J0Y4Wm6UP=hiQY}giPCfD{H}9bQje#V+sM%c|d(NrM+g#Q<;QmG$ zrKKZ^4d=S?Txd#DZ-3J#TwTlQ7O~xtiIItEI%wPI9MO*wxtnvftVBg4(0$ke$G1EY zSKbo(gov(FZEOw!8ue*8I@#I`>>A>CMZJtTjlA+Og_z?Xq&uyazYvA!FS7d-hCS5I zd-$X|&&zP4OR!k=1-nqtQ4Y`TlEymur@U;(8_rePR6UMf((W=pQy|^qIjr zwzhscnEQ5g7&Dwc?1Up27C$&xXt%HN-Q{s~7SBX*KaYvy!B1|tyzOQ}YI17c)=z#DoxJqv+>wa!gi%4rzafj#GDF%ODwmqNlks}39MZNUx3suj} zI5mu2>_69ID6wG z#)Z}@b;)}<+{QF=O$e1!p9VvX#|vDh1qtSD!nudC6tWf6d|j5hF%OKKhb;+Jqx$mM zZqu5>d+PD;&(GVHG`fDA`?%fsCbkg&W`rl#Nu*;#o^bxmoX6}ahbP^bM!T_hsMmwV zqSmD^wDXK#&gU#YvMh1znlmjit$S_Ah-W}uNnVazd4Hw5L9JS?QRskBaA*=A9}k+l zaPm}bM0dvH43@gLzIrRzVb}YEol89nhw2O#o5$&iL3PF1*vzRj`1_d;W z3KMr0vufMU;q&nMo#lmmahn&FmbItq=Pk-J-f0mO2Yr?o#R-?D7K9saN<*!u1x7~` z0B>Oc{QLnRu8{N)0PYe1d@%(;E*1a|=Nl$v2LND_P~X4rm=^-@Gj-w-D=Q?^Z{+sv z+vJJT(o*tlOiT>oo8^D}XlrXrjwdfKPxdu3GWsqa#XpYtf9ya7$Gd2=kGxYMg;Vep zS<4|1E6m@_h#1R~N76!UWQ|0UdM=W*^-qy?X~YY%hHhh|OWek0bqqbgIKHvPbkx& z`aHJq-S|h~Fb?eS(+t3d&?cY@jYNR4>1BADtT~yfSI4m3>cmeTRx^-Q@R9sZ;3|Oq zhE`U-JGJnjEEIzPh7OU(1g`_!oHqf}SA#7KQ`{hBpGu{cAiRLi$FaNC%KessdV)t|t=z zmM?xA4?qMoMFK~Xcwk}S`&R&EVy&`z2G;5T+d=h9LqP$SmX-hl@wb0GZ2Cj}%RGRj zq5?}K9-#VD{}AN|i>n>cUwHuTi0Wfw!GDSi0GJ18Y5qKke+FkqGmxJ${GP4Ceai!I zN7V5;k-YxP{XqZ7_rNgPm#Ilm+6X~@mEXn#U426UKMKQq)!&vOH1i{Hm~Y?+Yd!{cZe`^PW{7A1>0sNg_Yd;`?M6S#diGZHe6V8&_vR~~7RyXjYUH;t~RDMt& zFiisgf9VHi78e1M)DJ*?!T(0qd|GDQr=YO9&7q$1Ru`mfR0RULkvAc9A zS`_-B87Nm5FRw9*!Z>4%TmWF^gnkGR8_x#-lcuezsZ+=u&L^F$ zZ5^xt@N7)b^)L)4^C-2Ft=RNc8iwviJDdgL5_ohOyHPUxRbYOOokO`KAdpF)i+g!I zR@&} zfo(bg3i1siAzIktSNXn3ZfqN!D0_GLa~t{+0ESRFPaoHNJ7y7god6Oz*KJtIQQE%X zpQ|lp07Sz;n>a@gGa^(6lx;Xz#s$jwz&+iEN0~qb01mj*D&pWa3+NwHSE2_E8R5;m zpdooh1{z#JfS6TkE0M}iftlV}ops2f=O78MEWUxRC=20h^jKC6>6=dv+=C56*_6$I zZ;Z;i3Lv@_2~>qSD^a2vs3hsy!nO=k=Kum00gB2aE2H<-ZsHv-;P zU&WkvHM=#YQ#?L8PJ$ELgVLy427tg+&9nKfJ3@Q9JKMXhdmKn(CCT&lLr&sKV#BTT zd6$uNfPH^8snN8ns~+WCin!-iXrEyW8uh`k)+v)sO_-!ZOmDoVf^b`Bm4y>;XqPDn ztzcqi9+0%SkuUuzNNHhHyHi_`&je+5zR7C{oQPG9$t+6opF3fG+&xPtxTl;>MdmoU zM`FG-;LKd`>Y9$t_Ybe*zBFujk)SQES&Dn26Shn2Rb&T8?-|))k*GOLxCaZspVund z|CsSnxkHi9AOac0YFO(Ilzm3mUlw2v1MD`NWpQKx!V9NDl-D9aWpwH%0P;Tb9ljO8 ztML*Iz^!Oen927irG0OL^JKA_aC8hECrVOgH$VcJd!Al5e1U zbPpwvv^=(*J^Pu=R+gSNj>Bh(&b$m}e2LHb^3G%Ec9x+z&Bf#cms}C-GEvz}vzPMJWFpQ!IDmSG zbW?tEOGMz(%OsZ?*UfAuzER2cH3HefioTDN(`)v9c5?;Zmx3*QYh+lhFMlvUeEGs| zvx|lTQl&hWU50Y{A##>NhJU(q3l=4slh7-XLB5>*=p*OYpF8-4hN>BA7^>cq?3c*q z$VD4q{Ljfe|3f_dmR7c;7sphwr-l6eP{TcVsX;Meu|&xuf3R|zhGSQB5 zN}bdQj=geLJG$u7uFI;#B;7txnUVMoeLGP8`XP14BzNtNx)(AyH@n43R>twDmZz>y zse2P^Yhz13wz1bW7t`V|ygT|$bglho#@?P@|1pncEazGLOR*NK`0e>m@u&0U@NbOK zxJmyuI;QNP^m|#s7@KQs*PQeW*G#NA%^midBT_z6Khh_%=k`H87rh;IxZBJJ@944J zIil}e|vYCUTGj`jEJ?J})1eKP-S^lB_B)K^!C?~8-7?*dH zC%a*Cx8xqk4ajYBtL{^JYe~fQV#Z&Ov-Y;ssEs?0rHu3Tk?Kh`B7aJ6MsEq_caYg? zIaCp9`Pu%OEum)UT>Gu%<;QZvijSq#sHglvkQ%&T^GVK=SIHXhw88?v`J+{{y@I)g zt!z_jacW6t!RpEg`&jGTn(Vi(6%}Rcn(+f-Ga%?m!{HO*cLNZTD>vNvc; zP-#?S)ai2iD9tD`{+hm$K2CpJ|20Z$nQ@uL?s1N- zTpe5?t7}(}>mF~E>7VUq>W}Sb7}z#pJ|Q{bI8iNBv4TUWe!J`T(5M^N6YK zn_pxUXT0b&uo1Mm;gT>a$9r>MXgNo;do-`EWBR4^H9Z!jS8rPip z!SP*7g<^^Kof*vyae}W*UMP}wjt!9wJ5E%5N=T1Oe?A)8v+;=g5u+nB`NCQcX8UycT*zc$ zJ8pz$ct5=v;u)d~k$+a;>_e12N`x+kE{#!+{tEq5hKNN`%ZLP|rpetGcuYIG~RkJHU5joymK=)g8Lhd_deEq@H}lsDJv zHL|xi^c~37bv@xqURRIrG@7x=4;~K5xcp>$lilN!?lyQk2OS5?{y2g!;Wpu{=Y`4L z!_geBoGUQ{7dwj^iWM(@azXYu#BPf3j6E3TYMIs5ocx5hySJ)5(L=#V&M5Ts)_`jq z(GPZX`HQM(Z{*YJNM`fU;M5%DQHEVfbEYu`)ftjf`{Ub{A&r4!ff z_*yXh!fSG;#FWcu6SqTvMomh#PL?(+kH*GZYdwwmj6Dh1eC(ljn_8{s`=%tA{di92 zhu+gB+#?_Guxgd1#d+hMY<}#W=B>M6`2ta%jF=Soi?rsI%pYFjn5V zE6&%cF>WB%pG~BV@iHC`mra(WGK&hOq^`dB$=}>Q!z_X&BuAJ9edZ$rT<%YMO}<5Ddv2$H$ulkO7(ydF%08qFqN zA)a?<3mWJ87^m6#&ScNuw<>aMn=~sjtA1g`MqAx z5kVG#{E?$o;qB=U(mAVN`{*y=h%R?}TIV`u_Ej6sHViRO1yvVj;W9=~lI~>Ol`oYj z70Ii@DGuM9&8%wjCJ{)vt)=-QF{@^k=e0*`rY%d;-)NDQdQQ*JZX}-@osq1)z6m;d zT4HrH0q~Lpz}FvusRfGe1;9-jfIc$-vYw$WDfxB((1c*9`r;2QTA36Vqt+| z`WHz{OQQ}H7Z+1Uqobn{f0_R6rmd|l)t`cb0(GsivGI5QkiYHm|Ga<>_UCtOCpA(D z#iQ^LRpaT93#;e91)XphN;m+UB)F*>ji#KrDALq5O4XVX`BV*E-Xke4t!!w0r~%{n zTq~qH{bdGPz`_?tU)>OgW@zBh(B$MK4g9MKRYBm;+FuDR12xT`skRb||Gk9jh!QH4 ziQYjnD5`Gz&gk>t46RSuh}3}p2^_|O7yL25kvi4N#JDgrP6iAp1Yl%j1mfiBuNwscR)a6iY$P?% z@16sU1N)~101qryL(iU>^4W<%Ai&Jbw@0wp^|0NyTZ2aysVCLB(}`+3cS zR6FMf4YV9m)`B)#?@I&5SuzhmZXj?-U~s6tW+eweGjTvosw}n|Xc>U(^H)4j@}>>E z`|t$>gZWZ^Wb*f$@MqvK&eu38e>p5tU><?M*2H^Vq6%Vv^_5#uX4TswJYZ*cVKPyET2lhY< z03P@!4IfINd58ztFkdWx2mJ4R(*pQi9%!UTE=*6)0yJe4LT|&Ro(Gm(1@!dv6kq^G zC#S*O+|sLH$pK7HPgCz4VgTq+vQ$}e01yd5si&OC{-*$Fd*F9@0J>x7wG3qddKcyr z`=~syC-@~aMU{Vr2VmzAICLI>&jiBUJn$4%|Ev`MYDmifT%W(<0q8scNy!@k#CVv% z;OGRX1ib(%$CjQMK>7Im_jv#c00M`EgXK#Q(AhwOpZ=%d)CE6WXc_n?9`Kl5_->0I w{K3Jmy71RAYzO1O{Uuic?BIXZl)GD4VCX!9GTEx40Xb9Oy?qYgYkWlHvn!cQ5)_F;8}iAa+~>K)P`qLX0~gss#uKS_#qtf;}ytTAphA zR^xqshX%U*UjW38YXBLq76Qgy0eD&90aQxEjrm?yP)(hvt)&rl9aI{xsiB$1M!uhJ zXrO?)4k=;Yu#)`m&vgKcAg8D5>uI*RnZiv?G+9^2h9TUKSa2ch8DOpfDy5;M6BY$P zIiIIOCPVpDic0FfTq@C9HcQ#ZM@qzE41swIAwzXQ0N??*834sxj$V~sl!|y(db+-* z_}(6e19Oen0mK#ymkR|dK0i}Bop$Kq_LeRW4mcEmFrEbn0TzbK@y0s9o$|nm3IPBD zysTjW?0R?rafj=5fSY)n_M=hW1DIzV0I4;mR0-hjDo)4iYn&0t6ytROi^8?9YWHKq z-6sB=%gVy>}%KmdlVLW5L;PIq?L<%l~r-^JDz1HkyN0KQ8@9Ix11 zfEcxetbj*C)^osCArS@~%{az&06E%S*8wTRcsqbd8Ajy`S%xtuXpKo9;q?O^fU)la zX|<&VzuN9)>E8wNyV36gd#`UdQWb=$I$+o4YQKBTwilDbCwfohHG5MCYl3E&-P W&k~_xi!%}c0000KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z0^LbOK~#9!?3dq5+fWq8&p%TXUzC>0pcNEpO{XPL*`R2_2eAR|g9;_H;#vu2P)NE~ zq@&o?5k}cB7-LVuVEEue!EOJ+eo6OVeD~nJA-!Rmw1xR#;6QGYbIym$Ip2Fi0LW>U zWx=v6D2f6_Q6RqeYdj8*E54^&15nCNqm-S72(X--z;bc|o0%{+GhtZ8`#tvNNvg;6 zTnu_H2IaxMD-!^C9^U}V$q83-5rQZ0f$$2DnjJ-IcGLwBi;UQ|Dvw=j3sZp}o0$x_ z0C*nX0Q|jIh?z;B0C!y=0;o~~ilTr9yc9)&Dkb^@P^HAc06dOw9pH`|=_oeRQJ6%i z6QM=~lL$vdXtMibA{az?%GOmP+fM}WtOHH}Jr_fR2rr1xBEmD4$Yl3523KM0WJ(v$&X>Lxp{}6u|5XUo#n8#N#+7LW9Wm^9&#sp%x553x@0>G+E$3-#q74HiLoIRA$iG*>;0Qfwh1w(`Dz(zWXDifMBS;mj0dyzB7pzh`x1z18^O1T5fS1xy5lT#RFK12VA2$Z{30B0VjYH;-=&x1Rrki e{tNyE@OJ>q{K8Dtjk)>&0000 z+iy%!6vk(!cm4&Psf@YUFT40o1Z1eETq}kuz>pQ1=eS4n(5e58so<~e7l@i8| zED^M>7-Q{?#9$q)t95~52F8yz3gsGj+z}zBWCMryttUnsm^dC5o(Dt1fjz4P@6cu; z-QFr3YikjpdvZD=XalHIvVqK*CIJiY-nueZ9H6-0K&G=vDA_>k#w0P?z~uR;Fi;f~ zTGl3L?>3XimUXcl&`n;53fchblx$$yiwjs7xPaB^xNT319ao1g#rc+(6yg z>0E4hQT>8(%yaI7nZf0P)^Xt*^|dtAP)FBlsuql6Ud0S_Wv5=RtC6?BzZEm^cE|`? zH&|OOubzwd$ujxlnCF}W??;S)_CmX%|4$uk7O)wi!#w94uo=+B!Tz1iIo*ewMsUu7 z&v%S~_TpCCwP_AKHU4Ix!#w94`0>C9egl6q0o}KIMsUu7pAU^-%K_eiJ=rBZ%O?DO z-w@;61-~8{LF;(ubN{0i_4t=jLrg^ta0vCz8`0yRZX04MX5eZlAWzO|*kgGEv)QMg z9sLhE00TM)bPM8WhVJWKBRJ;(HX#<~Ubh)wQajet^&vLi%ZLh zaW;S_(K_z^bahBtkl%tHe|9cPjI#k;F13zBi2n`!!MQ-v<5QPo#5m^wuGcyT{KvBY zXol`pZ$fa+fr*Z=V7ri@sNV#1FR#P}=NuS65f*eCGHu&ee6tHBJR^wO2L=0AOwzHV5#``o2F>Q)A1p z3BakQix*+;#+$3vsF$bpsA_sz zwXFm2!tU(>0N?=t%?3!B=SFQjmMw@XbKEYKTLnl(p$I_Dnco~l44~^~naBApfw0yU zhu$hO^mr=A8iiQ^xoYR2@gNAGZ-iN)uYu4sRNvl%(3)Tr`rWk+fIl(q;)z!Rpb(mG zm}4{p06GHTyjOGYV^RviFC-z%LP-I9?jOd(aBv9(2NnUc4-y3+HE#p4(7fJfi$eH) z@{7m0WKmCk)B^I`z2UMv_E*d)W81;0rDE5sD`ggK(P qD1eposoeyC#>r7!3!v}89KbIlN7S!aFj;p10000