From f0ed7dc1987c2cbc349f351892a331fd7ce75129 Mon Sep 17 00:00:00 2001 From: "sieve32@gmail.com" Date: Thu, 16 Aug 2012 02:06:43 +0000 Subject: [PATCH] -Fixed carp chasing their target around when dead -Deleted the old /obj/item/weapon/'grenade', there's standardized stuff now, and the old shit doesn't even work. Waste of space, 0/10 would delete again. -Fixed clusterbangs. Honk git-svn-id: http://tgstation13.googlecode.com/svn/trunk@4426 316c924e-a436-60f5-8080-3fe189b3f50e --- code/game/objects/grenades/flashbang.dm | 101 ++-- code/game/objects/items/weapons/grenades.dm | 507 ------------------ code/modules/mob/living/simple_animal/carp.dm | 25 +- icons/obj/grenade.dmi | Bin 2377 -> 4763 bytes 4 files changed, 87 insertions(+), 546 deletions(-) delete mode 100644 code/game/objects/items/weapons/grenades.dm diff --git a/code/game/objects/grenades/flashbang.dm b/code/game/objects/grenades/flashbang.dm index 3b5d5430036..fc762d1b7b0 100644 --- a/code/game/objects/grenades/flashbang.dm +++ b/code/game/objects/grenades/flashbang.dm @@ -99,49 +99,74 @@ M.update_icons() -/obj/item/weapon/grenade/flashbang/clusterbang +/obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." name = "clusterbang" icon = 'icons/obj/grenade.dmi' icon_state = "clusterbang" - var/child = 0 - prime() - //world << "Armed!" - var/numspawned = rand(4,8) - //world << numspawned - var/again = 0 - if(!child) - for(var/more = numspawned,more > 0,more--) - if(prob(35)) - again++ - numspawned -- +/obj/item/weapon/grenade/flashbang/clusterbang/prime() + var/numspawned = rand(4,8) + var/again = 0 + for(var/more = numspawned,more > 0,more--) + if(prob(35)) + again++ + numspawned -- - for(,numspawned > 0, numspawned--) - //world << "Spawned Flashbang!" - spawn(0) - var/obj/item/weapon/grenade/flashbang/F = new /obj/item/weapon/grenade/flashbang(src) - F.loc = src.loc - F.icon_state = "flashbang_active" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - F.active = 1 - F.banglet = 1 - var/stepdist = rand(1,3) - walk_away(F,src,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - F.prime() + for(,numspawned > 0, numspawned--) + spawn(0) + new /obj/item/weapon/grenade/flashbang/cluster(src.loc)//Launches flashbangs + playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - for(,again > 0, again--) - //world << "Spawned CFlashbang!" - spawn(0) - var/obj/item/weapon/grenade/flashbang/clusterbang/F = new /obj/item/weapon/grenade/flashbang/clusterbang(src) - F.loc = src.loc - F.active = 1 - F.child = 1 - F.icon_state = "clusterbang_active" - var/stepdist = rand(1,4) - walk_away(F,src,stepdist) - spawn(det_time) - F.prime() + for(,again > 0, again--) + spawn(0) + new /obj/item/weapon/grenade/flashbang/clusterbang/segment(src.loc)//Creates a 'segment' that launches a few more flashbangs + playsound(src.loc, 'armbomb.ogg', 75, 1, -3) + spawn(0) + del(src) return + +/obj/item/weapon/grenade/flashbang/clusterbang/segment + desc = "A smaller segment of a clusterbang. Better run." + name = "clusterbang segment" + icon = 'icons/obj/grenade.dmi' + icon_state = "clusterbang_segment" + +/obj/item/weapon/grenade/flashbang/clusterbang/segment/New()//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode + icon_state = "clusterbang_segment_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,4)//How far to step + var/temploc = src.loc//Saves the current location to know where to step away from + walk_away(src,temploc,stepdist)//I must go, my people need me + var/dettime = rand(15,60) + spawn(dettime) + prime() + ..() + +/obj/item/weapon/grenade/flashbang/clusterbang/segment/prime() + var/numspawned = rand(4,8) + for(var/more = numspawned,more > 0,more--) + if(prob(35)) + numspawned -- + + for(,numspawned > 0, numspawned--) + spawn(0) + new /obj/item/weapon/grenade/flashbang/cluster(src.loc) + playsound(src.loc, 'armbomb.ogg', 75, 1, -3) + spawn(0) + del(src) + return + +/obj/item/weapon/grenade/flashbang/cluster/New()//Same concept as the segments, so that all of the parts don't become reliant on the clusterbang + spawn(0) + icon_state = "flashbang_active" + active = 1 + banglet = 1 + var/stepdist = rand(1,3) + var/temploc = src.loc + walk_away(src,temploc,stepdist) + var/dettime = rand(15,60) + spawn(dettime) + prime() + ..() \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades.dm b/code/game/objects/items/weapons/grenades.dm deleted file mode 100644 index 41c5ad27755..00000000000 --- a/code/game/objects/items/weapons/grenades.dm +++ /dev/null @@ -1,507 +0,0 @@ -/* -CONTAINS: -EMP GRENADE -FLASHBANG -CRITTER GRENADE - -*/ - -/obj/item/weapon/empgrenade - desc = "It is set to detonate in 5 seconds." - name = "emp grenade" - w_class = 2.0 - icon = 'icons/obj/device.dmi' - icon_state = "emp" - item_state = "emp" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - origin_tech = "materials=2;magnets=3" - var/active = 0 - var/det_time = 50 - - proc/prime() - return - - proc/clown_check(var/mob/living/user) - return - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)&&(clown_check(user))) - user << "\red You prime the emp grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "empar" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( src.det_time ) - prime() - return - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - - - attack_self(mob/user as mob) - if(!active) - if(clown_check(user)) - user << "\red You prime the EMP grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "empar" - add_fingerprint(user) - spawn(src.det_time) - prime() - return - return - - - prime() - playsound(src.loc, 'Welder2.ogg', 25, 1) - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(700,125) - if(empulse(src, 5, 7)) - del(src) - return - - - clown_check(var/mob/living/user) - if((CLUMSY in user.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.active = 1 - src.icon_state = "empar" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return 0 - return 1 - - - -/****************************Flashbang***********************************************/ -/obj/item/weapon/flashbang - desc = "It is set to detonate in 3 seconds." - name = "flashbang" - icon = 'icons/obj/grenade.dmi' - icon_state = "flashbang" - w_class = 2.0 - item_state = "flashbang" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - origin_tech = "materials=2;combat=1" - var/active = 0 - var/det_time = 30 - var/banglet = 0 - - proc/bang(var/turf/T , var/mob/living/carbon/M) - return - - proc/prime() - return - - proc/clown_check(var/mob/living/user) - return - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (isscrewdriver(W)) - switch(src.det_time) - if ("1") - src.det_time = 30 - user.show_message("\blue You set the flashbang for 3 second detonation time.") - src.desc = "It is set to detonate in 3 seconds." - if ("30") - src.det_time = 100 - user.show_message("\blue You set the flashbang for 10 second detonation time.") - src.desc = "It is set to detonate in 10 seconds." - if ("100") - src.det_time = 1 - user.show_message("\blue You set the flashbang for instant detonation.") - src.desc = "It is set to detonate instantly." - src.add_fingerprint(user) - ..() - return - - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)&&(clown_check(user))) - user << "\red You prime the flashbang! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "flashbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn(src.det_time) - prime() - return - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - - - attack_paw(mob/user as mob) - return src.attack_hand(user) - - - attack_hand() - walk(src, null, null) - ..() - return - - bang(var/turf/T , var/mob/living/carbon/M) // Added a new proc called 'bang' that takes a location and a person to be banged. - if (locate(/obj/item/weapon/cloaking_device, M)) // Called during the loop that bangs people in lockers/containers and when banging - for(var/obj/item/weapon/cloaking_device/S in M) // people in normal view. Could theroetically be called during other explosions. - S.active = 0 // -- Polymorph - S.icon_state = "shield0" - - M << "\red BANG" - playsound(src.loc, 'bang.ogg', 25, 1) - -//Checking for protections - var/eye_safety = 0 - var/ear_safety = 0 - if(iscarbon(M)) - eye_safety = M.eyecheck() - if(ishuman(M)) - if(istype(M:ears, /obj/item/clothing/ears/earmuffs)) - ear_safety += 2 - if(HULK in M.mutations) - ear_safety += 1 - if(istype(M:head, /obj/item/clothing/head/helmet)) - ear_safety += 1 - -//Flashing everyone - if(eye_safety < 1) - flick("e_flash", M.flash) - M.eye_stat += rand(1, 3) - M.Stun(2) - M.Weaken(10) - - - -//Now applying sound - if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) - if(ear_safety > 0) - M.Stun(2) - M.Weaken(1) - else - M.Stun(10) - M.Weaken(3) - if ((prob(14) || (M == src.loc && prob(70)))) - M.ear_damage += rand(1, 10) - else - M.ear_damage += rand(0, 5) - M.ear_deaf = max(M.ear_deaf,15) - - else if(get_dist(M, T) <= 5) - if(!ear_safety) - M.Stun(8) - M.ear_damage += rand(0, 3) - M.ear_deaf = max(M.ear_deaf,10) - - else if(!ear_safety) - M.Stun(4) - M.ear_damage += rand(0, 1) - M.ear_deaf = max(M.ear_deaf,5) - -//This really should be in mob not every check - if (M.eye_stat >= 20) - M << "\red Your eyes start to burn badly!" - M.disabilities |= NEARSIGHTED - if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang))) - if (prob(M.eye_stat - 20 + 1)) - M << "\red You can't see anything!" - M.sdisabilities |= BLIND - if (M.ear_damage >= 15) - M << "\red Your ears start to ring badly!" - if(!banglet && !(istype(src , /obj/item/weapon/flashbang/clusterbang))) - if (prob(M.ear_damage - 10 + 5)) - M << "\red You can't hear anything!" - M.sdisabilities |= DEAF - else - if (M.ear_damage >= 5) - M << "\red Your ears start to ring!" - M.update_icons() - - prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. - var/turf/T = get_turf(src) - if(T) - T.hotspot_expose(700,125) - - for(var/obj/structure/closet/L in view(T, null)) - if(locate(/mob/living/carbon/, L)) - for(var/mob/living/carbon/M in L) - bang(T, M) - - - for(var/mob/living/carbon/M in viewers(T, null)) - bang(T, M) - - for(var/obj/effect/blob/B in view(8,T)) //Blob damage here - var/damage = round(30/(get_dist(B,T)+1)) - B.health -= damage - B.update_icon() - del(src) - return - - - attack_self(mob/user as mob) - if(!active) - if(clown_check(user)) - user << "\red You prime the flashbang! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "flashbang1" - add_fingerprint(user) - spawn( src.det_time ) - prime() - return - return - - - attack_hand() - walk(src, null, null) - ..() - return - - - clown_check(var/mob/living/user) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.active = 1 - src.icon_state = "flashbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return 0 - return 1 - -/obj/item/weapon/flashbang/clusterbang - desc = "Use of this weapon may constiute a war crime in your area, consult your local captain." - name = "clusterbang" - icon = 'icons/obj/grenade.dmi' - icon_state = "clusterbang" - var/child = 0 - - attack_self(mob/user as mob) - if(!active) - //world << "cluster attack self" - user << "\red You prime the clusterbang! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "clusterbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn(src.det_time) - arm(user) - return - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)) - //world << "cluster after attack" - arm(user) - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - -/obj/item/weapon/flashbang/clusterbang/proc/arm(mob/user as mob) - - //world << "Armed!" - var/numspawned = rand(4,8) -// world << numspawned - var/again = 0 - if(!child) - for(var/more = numspawned,more > 0,more--) - if(prob(35)) - again++ - numspawned -- - - for(,numspawned > 0, numspawned--) - //world << "Spawned Flashbang!" - spawn(0) - var/obj/item/weapon/flashbang/F = new /obj/item/weapon/flashbang(src) - F.loc = src.loc - F.icon_state = "flashbang1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - F.active = 1 - F.banglet = 1 - var/stepdist = rand(1,3) - walk_away(F,src,stepdist) - var/dettime = rand(15,60) - spawn(dettime) - F.prime() - - for(,again > 0, again--) - //world << "Spawned CFlashbang!" - spawn(0) - var/obj/item/weapon/flashbang/clusterbang/F = new /obj/item/weapon/flashbang/clusterbang(src) - F.loc = src.loc - F.active = 1 - F.child = 1 - F.icon_state = "clusterbang1" - var/stepdist = rand(1,4) - walk_away(F,src,stepdist) - spawn(30) - F.arm() - - spawn(70) - prime() - - return - - - -/****************************Critter Grenades***********************************************/ - - -/obj/item/weapon/spawnergrenade - desc = "It is set to detonate in 3 seconds. It will unleash unleash an unspecified anomaly into the vicinity." - name = "delivery grenade" - icon = 'icons/obj/grenade.dmi' - icon_state = "delivery" - w_class = 2.0 - item_state = "flashbang" - throw_speed = 4 - throw_range = 20 - flags = FPRINT | TABLEPASS | CONDUCT - slot_flags = SLOT_BELT - origin_tech = "materials=3;magnets=4" - var/active = 0 - var/det_time = 30 - var/banglet = 0 - var/spawner_type = null // must be an object path - var/deliveryamt = 1 // amount of type to deliver - - - proc/prime() - return - - proc/clown_check(var/mob/living/user) - return - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (isscrewdriver(W)) - switch(src.det_time) - if ("1") - src.det_time = 30 - user.show_message("\blue You set the delivery grenade for 3 second detonation time.") - src.desc = "It is set to detonate in 3 seconds." - if ("30") - src.det_time = 100 - user.show_message("\blue You set the delivery grenade for 10 second detonation time.") - src.desc = "It is set to detonate in 10 seconds." - if ("100") - src.det_time = 1 - user.show_message("\blue You set the delivery grenade for instant detonation.") - src.desc = "It is set to detonate instantly." - src.add_fingerprint(user) - ..() - return - - - afterattack(atom/target as mob|obj|turf|area, mob/user as mob) - if (istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container - if (istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..() - if((user.get_active_hand() == src)&&(!active)&&(clown_check(user))) - user << "\red You prime the delivery grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "delivery1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn(src.det_time) - prime() - return - user.dir = get_dir(user, target) - user.drop_item() - var/t = (isturf(target) ? target : target.loc) - walk_towards(src, t, 3) - return - - - attack_paw(mob/user as mob) - return src.attack_hand(user) - - - attack_hand() - walk(src, null, null) - ..() - return - - prime() // Prime now just handles the two loops that query for people in lockers and people who can see it. - - if(spawner_type && deliveryamt) - // Make a quick flash - var/turf/T = get_turf(src) - playsound(T, 'phasein.ogg', 100, 1) - for(var/mob/living/carbon/human/M in viewers(T, null)) - if(M:eyecheck() <= 0) - flick("e_flash", M.flash) // flash dose faggots - - for(var/i=1, i<=deliveryamt, i++) - var/atom/movable/x = new spawner_type - x.loc = T - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(x, pick(NORTH,SOUTH,EAST,WEST)) - - // Spawn some hostile syndicate critters - if(istype(x, /obj/effect/critter)) - var/obj/effect/critter/C = x - - C.atkcarbon = 1 - C.atksilicon = 1 - C.atkmech = 0 - C.atksynd = 0 - C.aggressive = 1 - - del(src) - return - - - attack_self(mob/user as mob) - if(!active) - if(clown_check(user)) - user << "\red You prime the delivery grenade! [det_time/10] seconds!" - src.active = 1 - src.icon_state = "delivery1" - add_fingerprint(user) - spawn( src.det_time ) - prime() - return - return - - - attack_hand() - walk(src, null, null) - ..() - return - - - clown_check(var/mob/living/user) - if ((CLUMSY in user.mutations) && prob(50)) - user << "\red Huh? How does this thing work?!" - src.active = 1 - src.icon_state = "delivery1" - playsound(src.loc, 'armbomb.ogg', 75, 1, -3) - spawn( 5 ) - prime() - return 0 - return 1 - -/obj/item/weapon/spawnergrenade/manhacks - name = "manhack delivery grenade" - spawner_type = /obj/effect/critter/manhack - deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" - -/obj/item/weapon/spawnergrenade/spesscarp - name = "carp delivery grenade" - spawner_type = /mob/living/simple_animal/carp - deliveryamt = 5 - origin_tech = "materials=3;magnets=4;syndicate=4" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/carp.dm b/code/modules/mob/living/simple_animal/carp.dm index 730eb8fa85d..dde1b85f63b 100644 --- a/code/modules/mob/living/simple_animal/carp.dm +++ b/code/modules/mob/living/simple_animal/carp.dm @@ -42,7 +42,30 @@ var/mob/living/target_mob //Once the bear enters attack stance, it will try to chase this mob. This it to prevent it changing it's mind between multiple mobs. /mob/living/simple_animal/carp/Life() - ..() + if(stat == DEAD) + walk(src,0)//STOP FUCKING MOVING GODDAMN + if(health > 0) + icon_state = icon_living + dead_mob_list -= src + living_mob_list += src + stat = CONSCIOUS + density = 1 + return + + + if(health < 1) + Die() + + if(health > maxHealth) + health = maxHealth + + if(!ckey && !stop_automated_movement) + if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. + turns_since_move++ + if(turns_since_move >= turns_per_move) + if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled + Move(get_step(src,pick(cardinal))) + turns_since_move = 0 if(!stat) switch(stance) diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 1fc6daeb9d547698b755a5f1785c33aa449d4d1e..d548e040c65a9ed92ad4961f6c4cf214648d8a5c 100644 GIT binary patch literal 4763 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 literal 2377 zcmV-P3AXl$P)q+U|KtGwv;hBRGXOI)W&i-p009600RPMYGyi7)|7HLH zGXMYp|I9NcH6SuZ4QGB#SZ+8N%K3aoxO%&3S;k2UDw z9+bg~@t|6&fDo9ZYt%Pt?zY_H4SSn55XTY7ano!~J#9E{<9IJ|*CuPf|HqqN02{a$ zg+qSX^iQ8W4nIJ5r;`vDLW?3RD=RB2tCdpf%6VDBdnl)dhtKnJuKhS}_b4my+^VW7 zy-PB?$Qp1nGLYlT9$&%^pzX);-%3>eJ?QqHv>%NYm43?624$iV4*RtJXH(AI)*4ZW#un(Jw={b;_d zmJmN`AGtEjH((#edS)@EGD=RB2 zD=RB2E9=}!UB6E)rS9(NJ0clRFLlS%--SH2#PxZW7eD=6;4X^!hY$Dn_e5n(#+CZ0 zormuGG`{kDh49o4sE@8Pw5VKVQA1TBj<0B5G}T|qKoNJ5U1(QVbe|^hRmWGD1Fo)2 z8OZQotOy6(Z^vx&+Q)Ey?slmR6JY`O0S*xaL(KBk5l6Z}t(Y8_@Fqh-1ThCFzB=OP zaKNWP8$m2ZB>cz#Ofnuq>>@}FVuG(ajt=70hhG^31w2fXHiG0dO7IoUi_|@EiVIm< z2mDeX{7b~e^?6DCJ}WCLD=RB2E9(Npt>-R&y=U+H7QYGjxuq8F3%8Kt=T%+TN>_{0 z**Jx>N}GOly+?@Iuh*N+!9w>~V%baQA=j#e9t@N^z|`lr z9p8=|uoiYPwo*d}dfYovzu7?60YQDf-Wr;}cY``oJ@d!T;*!-{ag&qAaFRDFJX#D_UlZ#LG#^(NTpQb_k5=yU%yw*#X3 ze7$oPS`*jaem@3koMR4%Qi!k5Z#zC7#2ag&Gtt>-Wha@sCb$#ez#P*kQJ;Upxs9;5 z(A(&iY?a#81ouJ>#KdyRg>1KTHa1^7>p)F$D`Xn|lX2iL=JETf_4&H7&ucgAfFUOw zkp2CDKrX~xgn{c+kHhwNYaL9}*Wod$8T&ZyEo9dFNte?h#*HBRIPP@L`vJG$*@Zj- zCYTt`EA1Uw;qQ6D`7xHWy7ZDvR#sM4R#w(^>)O{E>}pTyAa}f!KR!P{Ka$6D@Asi4 zeSZ+!esF-QzccUm;Us>45Y4&zd*t5_Fb$;q`vk7A#J~Tir24q!#PP!S3vmu`@BgvK z@4wIiavVKg{C*+M0q*THoC8jj1LC*aaK+WXzkU@t;C{74Il!Ht;f3WefuVJfH|J!FE5+}+iQ1#>46JRA+G)&x7Ily zXP46#ud8<;dHp@PuKk`kD=RB2D=RDOf34K@`xpZxw=~J?_nZ`2{N;J-`aLUGf2IoP zEKgj&FJf-GDi2s81+QCpt_cGkfTJ|1_*uv2lmXPt*@^x!Z^1L5d0J=MD{>90cRk= zh4uNE`hCvCm`0X}A3s4kKex~^Xj=)W4NBZRYJQ+c-wc*Br&l89E^!j{M1nH3u zBtO~&CP{tXFy>J|lHu>hYj-tnw*f6N_4h*kctLp6YDE6RMpL`LVTd#Jck93pk^|@N zMydg}f>3ZB5Y*@2kRrG-222a!7;Y9qFvTOzPE0KwikSe2UFEe&L)pp9tT1XXAO52W z=WoaLXi+V$4hte^Vj0!W4Ao(*t-~G3;U`l-t7yrkK+*%fd1Pt?*;`3^m`i$~oepUW z_?ZydBl1!puFtn?Udlpf6-*g*yb^2^55E$N>+{nicr*&g>oU=bSlGIAJmHNuHba~X zfH8)@tD7e3zC131Q8Q7p@S7%naBKjdVt2$g&+kXff{a2)S{$;iy_xF