From 3b40c9048814767637c5ce4d7f16bd71f65f5bff Mon Sep 17 00:00:00 2001 From: "vageyenaman@gmail.com" Date: Sat, 15 Oct 2011 22:12:06 +0000 Subject: [PATCH] =?UTF-8?q?=E2=97=A6=202=20new=20hairstyles,=201=20new=20b?= =?UTF-8?q?eard=20style.=20Includes=20the=20luxurious=20ADAM=20JENSEN=20be?= =?UTF-8?q?ard/hair=20set.=20YOU=20NEVER=20ASKED=20FOR=20THIS.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ◦ As a result of the previous change, a substantial overhaul of the order in which clothing and hairs are displayed has been put into effect. From what I've playtested, it works mostly fine. Keep an eye out for small little oddities, though. ◦ Masks and head wear have been given a new flag, BLOCKHAIR. If turned on, this flag will force to the hair to not display. Intended for space suits, rig helmets, etc. ◦ (Committed for Zudrag) Added in the circuit boards for clone pods and cloning scanners and making them produceable from the circuit imprinter. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@2368 316c924e-a436-60f5-8080-3fe189b3f50e --- code/defines/mob/living/carbon/metroid.dm | 2 + code/defines/obj/clothing/gimmick.dm | 2 +- code/defines/obj/clothing/head.dm | 31 ++++++------ code/game/dna.dm | 14 +++++- code/modules/clothing/spacesuits.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 45 ++++++++++++++++-- code/modules/mob/new_player/preferences.dm | 16 +++++-- .../mob/new_player/preferences_setup.dm | 18 ++++++- code/modules/research/designs.dm | 18 +++++++ code/setup.dm | 2 + icons/changelog.html | 9 ++++ icons/mob/human_face.dmi | Bin 6328 -> 7662 bytes 12 files changed, 131 insertions(+), 28 deletions(-) diff --git a/code/defines/mob/living/carbon/metroid.dm b/code/defines/mob/living/carbon/metroid.dm index 2d2cefc503e..c60d26fc748 100644 --- a/code/defines/mob/living/carbon/metroid.dm +++ b/code/defines/mob/living/carbon/metroid.dm @@ -9,6 +9,8 @@ voice_message = "skree!" say_message = "hums" + layer = 5 + health = 150 gender = NEUTER diff --git a/code/defines/obj/clothing/gimmick.dm b/code/defines/obj/clothing/gimmick.dm index c795cb0ebcd..5085e785f14 100644 --- a/code/defines/obj/clothing/gimmick.dm +++ b/code/defines/obj/clothing/gimmick.dm @@ -502,4 +502,4 @@ desc = "Gentleman, elite aboard!" icon_state = "bowler" item_state = "bowler" - flags = FPRINT | TABLEPASS | HEADSPACE + flags = FPRINT | TABLEPASS diff --git a/code/defines/obj/clothing/head.dm b/code/defines/obj/clothing/head.dm index d8e873497be..28593a0b785 100644 --- a/code/defines/obj/clothing/head.dm +++ b/code/defines/obj/clothing/head.dm @@ -10,14 +10,14 @@ name = "Radiation Hood" icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" - flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH + flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) /obj/item/clothing/head/bomb_hood name = "bomb hood" desc = "Use in case of bomb." icon_state = "bombsuit" - flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH + flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR armor = list(melee = 20, bullet = 5, laser = 10,energy = 5, bomb = 100, bio = 0, rad = 0) /obj/item/clothing/head/bomb_hood/security @@ -30,7 +30,7 @@ icon_state = "bio" desc = "Keeps the germs from flying on your face." permeability_coefficient = 0.01 - flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH + flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) /obj/item/clothing/head/bio_hood/general @@ -90,7 +90,7 @@ desc = "An amish looking hat." icon_state = "tophat" item_state = "that" - flags = FPRINT|TABLEPASS|HEADSPACE + flags = FPRINT|TABLEPASS /obj/item/clothing/head/wizard name = "wizard hat" @@ -118,32 +118,32 @@ icon_state = "chef" item_state = "chef" desc = "The commander in chef's head wear." - flags = FPRINT | TABLEPASS | HEADSPACE + flags = FPRINT | TABLEPASS /obj/item/clothing/head/redcoat name = "Redcoat hat" icon_state = "redcoat" desc = "I guess it's a redhad." - flags = FPRINT | TABLEPASS | HEADSPACE + flags = FPRINT | TABLEPASS /obj/item/clothing/head/mailman name = "Mailman Hat" icon_state = "mailman" desc = "Right-on-time mail ervice head wear." - flags = FPRINT | TABLEPASS | HEADSPACE + flags = FPRINT | TABLEPASS /obj/item/clothing/head/plaguedoctorhat name = "Plague doctor's hat" desc = "Once used by Plague doctors. Now useless." icon_state = "plaguedoctor" - flags = FPRINT | TABLEPASS | HEADSPACE + flags = FPRINT | TABLEPASS permeability_coefficient = 0.01 /obj/item/clothing/head/beret name = "beret" desc = "A beret, a mime's favorite headwear." icon_state = "beret" - flags = FPRINT | TABLEPASS | HEADSPACE + flags = FPRINT | TABLEPASS // CHUMP HELMETS: COOKING THEM DESTROYS THE CHUMP HELMET SPAWN. @@ -163,14 +163,14 @@ name = "cueball helmet" desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" - flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH + flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR item_state="cueball" /obj/item/clothing/head/secsoft name = "Soft Cap" desc = "A baseball hat in tasteful red." icon_state = "secsoft" - flags = FPRINT|TABLEPASS|SUITSPACE|HEADCOVERSEYES + flags = FPRINT|TABLEPASS|HEADCOVERSEYES item_state = "helmet" /obj/item/clothing/head/syndicatefake @@ -179,12 +179,13 @@ item_state = "syndicate" desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" see_face = 0.0 + flags = FPRINT | TABLEPASS | BLOCKHAIR /obj/item/clothing/head/helmet/swat name = "swat helmet" desc = "Used by highly trained Swat Members." icon_state = "swat" - flags = FPRINT | TABLEPASS | SUITSPACE | HEADSPACE | HEADCOVERSEYES + flags = FPRINT | TABLEPASS | SUITSPACE | HEADSPACE | HEADCOVERSEYES | BLOCKHAIR item_state = "swat" armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) @@ -192,7 +193,7 @@ name = "Thunderdome helmet" desc = "Let the battle commence!" icon_state = "thunderdome" - flags = FPRINT | TABLEPASS | SUITSPACE | HEADSPACE | HEADCOVERSEYES + flags = FPRINT | TABLEPASS | SUITSPACE | HEADSPACE | HEADCOVERSEYES | BLOCKHAIR item_state = "thunderdome" armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0) @@ -291,13 +292,13 @@ name = "Chaplain's hood" desc = "A hoodie for the chaplain!!!" icon_state = "chaplain_hood" - flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES + flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|BLOCKHAIR /obj/item/clothing/head/hasturhood name = "Hastur's Hood" desc = "This hood is unspeakably stylish" icon_state = "hasturhood" - flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES + flags = FPRINT|TABLEPASS|HEADSPACE|HEADCOVERSEYES|BLOCKHAIR /obj/item/clothing/head/nursehat name = "Nurse Hat" diff --git a/code/game/dna.dm b/code/game/dna.dm index e9243daad0f..77f10dbb5d7 100644 --- a/code/game/dna.dm +++ b/code/game/dna.dm @@ -18,7 +18,7 @@ // determine DNA fragment from hairstyle // :wtc: - var/list/styles = list("bald", "hair_a", "hair_b", "hair_c", "hair_d", "hair_e", "hair_f", "hair_bedhead", "hair_dreads" ) + var/list/styles = list("bald", "hair_a", "hair_b", "hair_c", "hair_d", "hair_e", "hair_f", "hair_bedhead", "hair_dreads", "hair_vlong", "hair_jensen", "hair_skinhead" ) var/hrange = round(4095 / styles.len) var/style = styles.Find(character.hair_icon_state) @@ -27,6 +27,17 @@ else hair = 0 + // Beard dna code - mostly copypasted from hair code to allow for more dynamic facial hair style additions + var/list/face_styles = list("bald", "facial_elvis", "facial_vandyke", "facial_neckbeard", "facial_chaplin", "facial_watson", "facial_abe", "facial_chin", "facial_hip", "facial_gt", "facial_hogan", "facial_selleck", "facial_fullbeard", "facial_longbeard", "facial_jensen" ) + var/f_hrange = round(4095 / face_styles.len) + + var/f_style = face_styles.Find(character.face_icon_state) + if(f_style) + beard = f_style * f_hrange + f_hrange - rand(1,f_hrange-1) + else + beard = 0 + + /* // Deprecated code -- Doohl switch(character.face_icon_state) if("bald") beard = rand(1,350) if("facial_elvis") beard = rand(351,650) @@ -42,6 +53,7 @@ if("facial_selleck") beard = rand(3351,3650) if("facial_fullbeard") beard = rand(3651,3950) if("facial_longbeard") beard = rand(3951,4095) + */ temp = add_zero2(num2hex((character.r_hair),1), 3) temp += add_zero2(num2hex((character.b_hair),1), 3) diff --git a/code/modules/clothing/spacesuits.dm b/code/modules/clothing/spacesuits.dm index 6dd0e6fb7ec..c3b57801456 100644 --- a/code/modules/clothing/spacesuits.dm +++ b/code/modules/clothing/spacesuits.dm @@ -8,7 +8,7 @@ Space suit parts name = "Space helmet" icon_state = "space" desc = "A special helmet designed for work in a hazardous, low-pressure environment." - flags = FPRINT | TABLEPASS | HEADSPACE | HEADCOVERSEYES | HEADCOVERSMOUTH + flags = FPRINT | TABLEPASS | HEADSPACE | HEADCOVERSEYES | BLOCKHAIR see_face = 0.0 item_state = "space" permeability_coefficient = 0.01 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f093caf2cf1..becb33d91b1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -345,6 +345,7 @@ else if (W == glasses) glasses = null else if (W == head) + var/obj/item/prev_head = W W = h_store if (W) u_equip(W) @@ -355,6 +356,11 @@ W.dropped(src) W.layer = initial(W.layer) head = null + if(prev_head && (prev_head.flags & BLOCKHAIR)) + // rebuild face + del(face_standing) + del(face_lying) + else if (W == ears) ears = null else if (W == shoes) @@ -362,11 +368,17 @@ else if (W == belt) belt = null else if (W == wear_mask) + var/obj/item/prev_mask = W if(internal) if (internals) internals.icon_state = "internal0" internal = null wear_mask = null + if(prev_mask && (prev_mask.flags & BLOCKHAIR)) + // rebuild face + del(face_standing) + del(face_lying) + else if (W == wear_id) wear_id = null else if (W == r_store) @@ -406,6 +418,10 @@ return u_equip(W) wear_mask = W + if(wear_mask && (wear_mask.flags & BLOCKHAIR)) + del(face_standing) + del(face_lying) + W.equipped(src, text) if("back") if (back) @@ -495,6 +511,10 @@ return u_equip(W) head = W + if(head && (head.flags & BLOCKHAIR)) + del(face_standing) + del(face_lying) + if(istype(W,/obj/item/clothing/head/kitty)) W.update_icon(src) W.equipped(src, text) @@ -937,6 +957,14 @@ drop_item() hand = h + + if (lying) + if (face_lying) + overlays += face_lying + else + if (face_standing) + overlays += face_standing + // Head if (head) var/t1 = head.icon_state @@ -1232,17 +1260,26 @@ var/icon/mouth_s = new/icon("icon" = 'human_face.dmi', "icon_state" = "mouth_[g]_s") var/icon/mouth_l = new/icon("icon" = 'human_face.dmi', "icon_state" = "mouth_[g]_l") - eyes_s.Blend(hair_s, ICON_OVERLAY) - eyes_l.Blend(hair_l, ICON_OVERLAY) + // if the head or mask has the flag BLOCKHAIR (equal to 5), then do not apply hair + if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR))) + eyes_s.Blend(hair_s, ICON_OVERLAY) + eyes_l.Blend(hair_l, ICON_OVERLAY) + eyes_s.Blend(mouth_s, ICON_OVERLAY) eyes_l.Blend(mouth_l, ICON_OVERLAY) - eyes_s.Blend(facial_s, ICON_OVERLAY) - eyes_l.Blend(facial_l, ICON_OVERLAY) + + // if BLOCKHAIR, do not apply facial hair + if((!(head && (head.flags & BLOCKHAIR))) && !(wear_mask && (wear_mask.flags & BLOCKHAIR))) + eyes_s.Blend(facial_s, ICON_OVERLAY) + eyes_l.Blend(facial_l, ICON_OVERLAY) + face_standing = new /image() face_lying = new /image() face_standing.icon = eyes_s + face_standing.layer = MOB_LAYER face_lying.icon = eyes_l + face_lying.layer = MOB_LAYER del(mouth_l) del(mouth_s) diff --git a/code/modules/mob/new_player/preferences.dm b/code/modules/mob/new_player/preferences.dm index 32034a27191..8f0f8228b8c 100644 --- a/code/modules/mob/new_player/preferences.dm +++ b/code/modules/mob/new_player/preferences.dm @@ -431,10 +431,10 @@ datum/preferences if(gender == FEMALE) h_style = pickweight ( list ("Cut Hair" = 5, "Short Hair" = 5, "Long Hair" = 5, "Mohawk" = 5, "Balding" = 1, "Fag" = 5, "Bedhead" = 5, "Dreadlocks" = 5, "Bald" = 5)) else - h_style = pickweight ( list ("Cut Hair" = 5, "Short Hair" = 5, "Long Hair" = 5, "Mohawk" = 5, "Balding" = 5, "Fag" = 5, "Bedhead" = 5, "Dreadlocks" = 5, "Bald" = 5)) + h_style = pickweight ( list ("Cut Hair" = 5, "Short Hair" = 5, "Long Hair" = 5, "Mohawk" = 5, "Balding" = 5, "Fag" = 5, "Bedhead" = 5, "Dreadlocks" = 5, "Jensen Hair" = 5, "Skinhead" = 5, "Bald" = 5)) if("input") - var/new_style = input(user, "Please select hair style", "Character Generation") as null|anything in list( "Cut Hair", "Short Hair", "Long Hair", "Mohawk", "Balding", "Fag", "Bedhead", "Dreadlocks", "Bald" ) + var/new_style = input(user, "Please select hair style", "Character Generation") as null|anything in list( "Cut Hair", "Short Hair", "Long Hair", "Longer Hair", "Mohawk", "Balding", "Fag", "Bedhead", "Dreadlocks", "Jensen Hair", "Skinhead", "Bald" ) if(new_style) h_style = new_style @@ -450,9 +450,9 @@ datum/preferences if(gender == FEMALE) f_style = pickweight ( list("Watson" = 1, "Chaplin" = 1, "Selleck" = 1, "Full Beard" = 1, "Long Beard" = 1, "Neckbeard" = 1, "Van Dyke" = 1, "Elvis" = 1, "Abe" = 1, "Chinstrap" = 1, "Hipster" = 1, "Goatee" = 1, "Hogan" = 1, "Shaved" = 100)) else - f_style = pickweight ( list("Watson" = 1, "Chaplin" = 1, "Selleck" = 1, "Full Beard" = 1, "Long Beard" = 1, "Neckbeard" = 1, "Van Dyke" = 1, "Elvis" = 1, "Abe" = 1, "Chinstrap" = 1, "Hipster" = 1, "Goatee" = 1, "Hogan" = 1, "Shaved" = 10)) + f_style = pickweight ( list("Watson" = 1, "Chaplin" = 1, "Selleck" = 1, "Full Beard" = 1, "Long Beard" = 1, "Neckbeard" = 1, "Van Dyke" = 1, "Elvis" = 1, "Abe" = 1, "Chinstrap" = 1, "Hipster" = 1, "Goatee" = 1, "Hogan" = 1, "Jensen Goatee" = 1, "Shaved" = 10)) if("input") - var/new_style = input(user, "Please select facial style", "Character Generation") as null|anything in list("Watson", "Chaplin", "Selleck", "Full Beard", "Long Beard", "Neckbeard", "Van Dyke", "Elvis", "Abe", "Chinstrap", "Hipster", "Goatee", "Hogan", "Shaved") + var/new_style = input(user, "Please select facial style", "Character Generation") as null|anything in list("Watson", "Chaplin", "Selleck", "Full Beard", "Long Beard", "Neckbeard", "Van Dyke", "Elvis", "Abe", "Chinstrap", "Hipster", "Goatee", "Jensen Goatee", "Hogan", "Shaved") if(new_style) f_style = new_style @@ -585,6 +585,12 @@ datum/preferences character.hair_icon_state = "hair_bedhead" if("Dreadlocks") character.hair_icon_state = "hair_dreads" + if("Longer Hair") + character.hair_icon_state = "hair_vlong" + if("Jensen Hair") + character.hair_icon_state = "hair_jensen" + if("Skinhead") + character.hair_icon_state = "hair_skinhead" else character.hair_icon_state = "bald" @@ -615,6 +621,8 @@ datum/preferences character.face_icon_state = "facial_gt" if("Hogan") character.face_icon_state = "facial_hogan" + if("Jensen Goatee") + character.face_icon_state = "facial_jensen" else character.face_icon_state = "bald" diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index e6d3806eaf6..5d17691987e 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -26,7 +26,7 @@ datum/preferences proc/randomize_hair(var/gender) //Women are more likely to have longer hair. - var/temp = gender==FEMALE&&prob(80) ? pick(2,6,8) : rand(1,9) + var/temp = gender==FEMALE&&prob(80) ? pick(2,6,8,9) : rand(1,12) switch(temp) if(1) h_style = "Short Hair" @@ -44,11 +44,17 @@ datum/preferences h_style = "Bedhead" if(8) h_style = "Dreadlocks" + if(9) + h_style = "Longer Hair" + if(10) + h_style = "Jensen Hair" + if(11) + h_style = "Skinhead" else h_style = "bald" proc/randomize_facial() - var/temp = prob(50) ? 14 : rand(1,13)//50% of not having a beard. Otherwise get a random one. + var/temp = prob(50) ? 15 : rand(1,14)//50% of not having a beard. Otherwise get a random one. switch(temp) if(1) f_style = "Watson" @@ -76,6 +82,8 @@ datum/preferences f_style = "Goatee" if(13) f_style = "Hogan" + if(14) + f_style = "Jensen Goatee" else f_style = "bald" @@ -252,6 +260,10 @@ datum/preferences h_style_r = "hair_bedhead" if("Dreadlocks") h_style_r = "hair_dreads" + if("Longer Hair") + h_style_r = "hair_vlong" + if("Jensen Hair") + h_style_r = "hair_jensen" else h_style_r = "bald" @@ -283,6 +295,8 @@ datum/preferences f_style_r = "facial_gt" if ("Hogan") f_style_r = "facial_hogan" + if ("Jensen Goatee") + f_style_r = "facial_jensen" else f_style_r = "bald" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 1d47f31c26d..98a42a2b4cc 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -229,6 +229,24 @@ datum materials = list("$glass" = 2000, "acid" = 20) build_path = "/obj/item/weapon/circuitboard/cloning" + clonepod + name = "Circuit Design (Clone Pod)" + desc = "Allows for the construction of circuit boards used to build a Cloning Pod." + id = "clonepod" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/weapon/circuitboard/clonepod" + + clonescanner + name = "Circuit Design (Cloning Scanner)" + desc = "Allows for the construction of circuit boards used to build a Cloning Scanner." + id = "clonescanner" + req_tech = list("programming" = 3, "biotech" = 3) + build_type = IMPRINTER + materials = list("$glass" = 2000, "acid" = 20) + build_path = "/obj/item/weapon/circuitboard/clonescanner" + arcademachine name = "Circuit Design (Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new arcade machine." diff --git a/code/setup.dm b/code/setup.dm index 6607e3985a7..e4ebaf758d5 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -89,6 +89,8 @@ #define HEADSPACE 4 // head wear protects against space +#define BLOCKHAIR 5 // temporarily removes the user's hair icon + #define MASKINTERNALS 8 // mask allows internals #define SUITSPACE 8 // suit protects against space diff --git a/icons/changelog.html b/icons/changelog.html index b3279d23013..c76c8a48563 100644 --- a/icons/changelog.html +++ b/icons/changelog.html @@ -63,6 +63,15 @@ should be listed in the changelog upon commit tho. Thanks. --> +15 October 2011: +
    +
  • Doohl updated: +
      +
    • New hairstyles! YOU never asked for this!
    • +
    +
  • +
+ 11 October 2011:
  • ConstantA updated: diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 9fa3b242dc59f9028cec529aff6f9f6bed1600f8..5069ddd2766cd0537a537b85d8bc6089208a63d9 100644 GIT binary patch literal 7662 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 literal 6328 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�A2|5Bm{@s^Dm~1sM7m&M%G=f^ z&N137=^LDiC6Wf=y{QRHM$b)PHpvkYjMe9~ZC9r+d*X+^h~i-z+Fzh1d#+Q+(Jp-3 z@Ak&xwPFvd^eD?SS-rt{lNQGYAJ$d3a-#nrDZQjlvoj@~vFj#l8(c?>BS8)AH>NEQ z8O5Cr6#8igk!?=Gef8V1n}g66k8pSMvIz2m#r&V#ZzR0}$RlO&<*b(Zd-F<@aQT|? zr_6ju={0)(%6SRG{3@Z40D0k{)XwH$IiceS@eU#kf+q#4B=mFD3O=rvx_ zYDU@zezZkMT?&i7bR6Jg0oo$XsQKm*p16s0#=u{zv)2`}j$tjl%{gHW(s5dG$+r3( zvM!y3(P=L}=m)y7o)YKI<1f}utgeXu7PUVso8TQ7;l2VA#lWujPq&SDlM;ir!uE1- zn~Lt=&s>Sewcucx$1eYbl@dvU?B3YRNf6}8#{DERnP`Q@bt%Jull3p{cUuDiB?HMl zJw0R2W7x~>Rk)IwT_AoE{?64pJ2Rsx-nE;372Hd;$Y6c%sh@GzFMO?1Eo4*4&`}XuDXF>aJCF+mT zs~GZ0);O2Fi#M{w>KhvFXlQ7p5X(`p_fl$a6D^rv zb;l}%pOR}@P_4jZ1%pUfn@5%yy87K|(p}V}TC^*1B04ueOhE_~x@7_HDF3VPxp`UQ zy>vN0nl2W#obc|TUG(P|Wj4#XYn9_^+gtEbSApT3%nyd;yg0#^Ff&%z*rRF@*Wu1X zQ=RK&8Qay{+GI>Yc?7X&7UTUGtm9)YPl zr)Ctfi+yu`-;84%H49;Z$yz;Hr%xN$7z4{ESB#^$St25jH2LgfkjRXPh>wO27tYf7NSfvx3LQ0>*(lva=|q5&{cG~jUN cUv2ps9W;!assuDb|2qJnk2KON)Um(&U!VR*F#rGn