From 0c25bf4a21a5e8504ce990b10c75bd2700c6b664 Mon Sep 17 00:00:00 2001 From: JimKil3 <47290811+JimKil3@users.noreply.github.com> Date: Sat, 16 Mar 2024 11:51:13 -0500 Subject: [PATCH] Cloning Rework (#21683) * guts the cloning pod * guts cloning console (except the tgui) * clonescanner, more gutting, linkage * reagent stuff * `cloning_data` datum * scanner inserting/removing * scanning logic * auto-linkage * `get_cloning_cost()` in its entirety * logic for which limbs to grow * RefreshParts() and insert_organ() * removes misinformation * robot parts * more organ insertion logic * more organ code :D * create_clone * beginnings of clone logic * cloning addl. stuff * cloning finalization * fixes CI? * whitespace fixes (regex edition) * ejection logic * Update code/game/machinery/clonepod.dm Co-authored-by: Nathan Winters <100448493+CinnamonSnowball@users.noreply.github.com> * stuff * stuff 2 * update_icon_state stuff * clonepod TGUI * organ fix yipee * cloning console UI beginnings * cloning console main menu * reagents stuff * beginning of damage tab * damages menu skeleton * aiuhgugh * splits up code * ejecting patient updates ui * contra reviews * temp fix for CI * tgui finished? (clueless) * Cloning :D it's done * manual & tweaks * more feedback! * cooldown because you can spam the fuck out if it otherwise and it's really loud for the ghost * oops * tweaks * edits EVERY MAP OH GOD * no link stuff * oops * Apply suggestions from code review Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Apply suggestions from code review (pt. 2) Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/game/machinery/computer/cloning.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * dgamer review * Update code/game/machinery/clonepod.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> * henri stuff * makes it compile * builds tgui (oops) * rebuilt bundle i guess? * not stale i swear * fixes * whoops * countdown stuff * sirryan review pt. 1 * sirryan review pt 2 * every day i'm shuffling (or something idk) * wasdfhdfg * sean clonepod.dm changes * update_icon(UPDATE_ICON_STATE) * Update code/game/machinery/clonescanner.dm Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> * icon stuff * map weirdness * henri disks * unfucks maps? * cc maps * eject button * Apply suggestions from code review Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * Update code/game/machinery/clonepod.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * dgamer review 2 * ourgh * dgamer review 3 * waaaah * fixes access locks * fixes Fixes the numbers issues (and no feet hopefully?) * re-adds feet * more fixes yipee * un-biomass * fixes ghost stuff * exploit fix --------- Co-authored-by: Nathan Winters <100448493+CinnamonSnowball@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> --- _maps/map_files/Delta/delta.dmm | 4 +- _maps/map_files/MetaStation/MetaStation.dmm | 4 +- _maps/map_files/cerestation/cerestation.dmm | 2 +- _maps/map_files/cyberiad/cyberiad.dmm | 4 +- _maps/map_files/generic/centcomm.dmm | 32 +- _maps/map_files/shuttles/admin_hospital.dmm | 6 +- code/__DEFINES/cloning_defines.dm | 13 + code/game/machinery/clonepod.dm | 1095 +++++++++-------- code/game/machinery/clonescanner.dm | 229 ++++ code/game/machinery/computer/cloning.dm | 676 +++++----- code/game/machinery/constructable_frame.dm | 6 +- code/game/machinery/cryopod.dm | 5 - code/game/objects/items/weapons/disks.dm | 67 + code/game/objects/items/weapons/manuals.dm | 109 +- code/modules/client/preference/character.dm | 22 +- code/modules/countdown/countdown.dm | 5 +- .../carbon/human/species/slimepeople.dm | 4 +- icons/obj/cryogenic2.dmi | Bin 86007 -> 80841 bytes paradise.dme | 2 + .../tgui/interfaces/CloningConsole.js | 829 +++++++------ tgui/packages/tgui/interfaces/CloningPod.js | 151 +++ tgui/public/tgui.bundle.js | 148 +-- 22 files changed, 1984 insertions(+), 1429 deletions(-) create mode 100644 code/__DEFINES/cloning_defines.dm create mode 100644 code/game/machinery/clonescanner.dm create mode 100644 tgui/packages/tgui/interfaces/CloningPod.js diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm index aa026618a9d5..0791a5cfe9a1 100644 --- a/_maps/map_files/Delta/delta.dmm +++ b/_maps/map_files/Delta/delta.dmm @@ -81719,7 +81719,7 @@ /turf/simulated/floor/plasteel, /area/station/engineering/atmos) "nsl" = ( -/obj/machinery/clonepod/biomass, +/obj/machinery/clonepod, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -93376,7 +93376,7 @@ /turf/simulated/floor/plasteel/dark, /area/station/medical/surgery/observation) "udS" = ( -/obj/machinery/dna_scannernew, +/obj/machinery/clonescanner, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index bb7dfebbc117..12991913a00b 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -37480,13 +37480,13 @@ /turf/simulated/floor/plating, /area/station/maintenance/medmaint) "cAj" = ( -/obj/machinery/clonepod/biomass, /obj/effect/turf_decal/stripes/line{ dir = 5 }, /obj/effect/turf_decal/siding{ dir = 5 }, +/obj/machinery/clonepod, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -39927,13 +39927,13 @@ /turf/simulated/floor/engine, /area/station/science/xenobiology) "cIR" = ( -/obj/machinery/dna_scannernew, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /obj/effect/turf_decal/siding{ dir = 1 }, +/obj/machinery/clonescanner, /turf/simulated/floor/plasteel{ icon_state = "dark" }, diff --git a/_maps/map_files/cerestation/cerestation.dmm b/_maps/map_files/cerestation/cerestation.dmm index 4dab9f0ffa71..55eff70d42ab 100644 --- a/_maps/map_files/cerestation/cerestation.dmm +++ b/_maps/map_files/cerestation/cerestation.dmm @@ -41182,7 +41182,7 @@ network = list("SS13","CMO") }, /obj/machinery/light, -/obj/machinery/dna_scannernew, +/obj/machinery/clonescanner, /turf/simulated/floor/plasteel{ icon_state = "whiteblue" }, diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index b86b572be3a1..94c98dd40fa1 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -32052,7 +32052,6 @@ /turf/simulated/floor/plating, /area/station/science/genetics) "bXO" = ( -/obj/machinery/dna_scannernew, /obj/machinery/light{ dir = 4 }, @@ -32060,6 +32059,7 @@ layer = 4; pixel_x = 32 }, +/obj/machinery/clonescanner, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, @@ -32980,10 +32980,10 @@ }, /area/station/medical/cloning) "caN" = ( -/obj/machinery/clonepod/biomass, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, +/obj/machinery/clonepod, /turf/simulated/floor/plasteel{ icon_state = "freezerfloor" }, diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm index f49696832a9a..17bdeb7a24e3 100644 --- a/_maps/map_files/generic/centcomm.dmm +++ b/_maps/map_files/generic/centcomm.dmm @@ -3854,7 +3854,6 @@ /area/abductor_ship) "mX" = ( /obj/machinery/door/window{ - dir = 2; name = "Cockpit"; req_access_txt = "150" }, @@ -4139,15 +4138,11 @@ /turf/simulated/floor/plasteel/freezer, /area/syndicate_mothership) "nN" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/corner, /turf/simulated/floor/plating/airless, /area/syndicate_mothership) "nO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plating/airless, /area/syndicate_mothership) "nP" = ( @@ -4554,10 +4549,10 @@ /turf/simulated/floor/carpet/purple, /area/wizard_station) "pq" = ( -/obj/machinery/clonepod/upgraded, /obj/machinery/light/spot{ dir = 1 }, +/obj/machinery/clonepod/upgraded, /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "pr" = ( @@ -4908,8 +4903,7 @@ "qJ" = ( /obj/structure/table, /obj/machinery/door/window/classic/normal{ - name = "security checkpoint"; - dir = 2 + name = "security checkpoint" }, /turf/simulated/floor/carpet, /area/admin) @@ -5054,6 +5048,10 @@ /obj/structure/coatrack, /turf/simulated/floor/wood, /area/ghost_bar) +"rg" = ( +/obj/machinery/clonescanner, +/turf/simulated/floor/mineral/titanium, +/area/shuttle/administration) "rh" = ( /obj/machinery/economy/vending/liberationstation, /turf/simulated/floor/plasteel, @@ -7907,9 +7905,7 @@ /turf/simulated/floor/wood, /area/ghost_bar) "Cl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plating/airless, /area/centcom/control) "Cm" = ( @@ -8480,7 +8476,6 @@ /area/holodeck/source_basketball) "Ej" = ( /obj/machinery/door/window/reinforced/normal{ - dir = 2; name = "Cell Door"; req_access_txt = "150" }, @@ -11381,9 +11376,7 @@ /obj/machinery/door/airlock/medical/glass{ name = "Escape Shuttle Infirmary" }, -/obj/effect/turf_decal/stripes/line{ - dir = 2 - }, +/obj/effect/turf_decal/stripes/line, /turf/simulated/floor/plasteel, /area/shuttle/escape) "Of" = ( @@ -14331,8 +14324,7 @@ "YJ" = ( /obj/machinery/door/window/classic/normal{ name = "Cell B"; - req_access_txt = "101"; - dir = 2 + req_access_txt = "101" }, /turf/simulated/floor/plasteel/dark, /area/admin) @@ -28037,7 +28029,7 @@ ZN ZN Ek ZG -km +rg lr lr Sx diff --git a/_maps/map_files/shuttles/admin_hospital.dmm b/_maps/map_files/shuttles/admin_hospital.dmm index 167f4c130b61..120d18bf47cf 100644 --- a/_maps/map_files/shuttles/admin_hospital.dmm +++ b/_maps/map_files/shuttles/admin_hospital.dmm @@ -97,7 +97,7 @@ /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "aB" = ( -/obj/machinery/dna_scannernew, +/obj/machinery/clonescanner, /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "aC" = ( @@ -585,12 +585,10 @@ /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "ip" = ( -/obj/machinery/clonepod{ - biomass = 300 - }, /obj/machinery/light{ dir = 1 }, +/obj/machinery/clonepod/upgraded, /turf/simulated/floor/mineral/titanium, /area/shuttle/administration) "kY" = ( diff --git a/code/__DEFINES/cloning_defines.dm b/code/__DEFINES/cloning_defines.dm new file mode 100644 index 000000000000..5b22af2017d8 --- /dev/null +++ b/code/__DEFINES/cloning_defines.dm @@ -0,0 +1,13 @@ +//Defines used to pass info between the scanner and cloning console +#define SCANNER_UNCLONEABLE_SPECIES "uncloneable" +#define SCANNER_HUSKED "husked" +#define SCANNER_ABSORBED "absorbed" +#define SCANNER_NO_SOUL "soulless" +#define SCANNER_BRAIN_ISSUE "suicide or missing brain" +#define SCANNER_MISC "miscellanious" +#define SCANNER_SUCCESSFUL "successful" + +//Defines used to make the return value of a get_cloning_cost() operation more readable +#define BIOMASS_COST 1 +#define SANGUINE_COST 2 +#define OSSEOUS_COST 3 diff --git a/code/game/machinery/clonepod.dm b/code/game/machinery/clonepod.dm index 05ee54d5e37d..d07e5f3ba598 100644 --- a/code/game/machinery/clonepod.dm +++ b/code/game/machinery/clonepod.dm @@ -1,23 +1,58 @@ -//Cloning revival method. -//The pod handles the actual cloning while the computer manages the clone profiles +/// Reagents that can be inserted into the cloning pod (and not deleted by it). +#define VALID_REAGENTS list("sanguine_reagent", "osseous_reagent") + +/// Meats that can be used as biomass for the cloner. +#define VALID_BIOMASSABLES list(/obj/item/food/snacks/meat, \ + /obj/item/food/snacks/monstermeat, \ + /obj/item/food/snacks/carpmeat, \ + /obj/item/food/snacks/salmonmeat, \ + /obj/item/food/snacks/catfishmeat, \ + /obj/item/food/snacks/tofurkey) + +/// Internal organs the cloner will *never* accept for insertion. +#define FORBIDDEN_INTERNAL_ORGANS list(/obj/item/organ/internal/regenerative_core, \ + /obj/item/organ/internal/alien, \ + /obj/item/organ/internal/body_egg, \ + /obj/item/organ/internal/adamantine_resonator, \ + /obj/item/organ/internal/vocal_cords/colossus, \ + /obj/item/organ/internal/cyberimp, \ + /obj/item/organ/internal/brain, \ + /obj/item/organ/internal/cell, \ + /obj/item/organ/internal/eyes/optical_sensor, \ + /obj/item/organ/internal/ears/microphone) + +/// Internal organs the cloner will only accept when fully upgraded. +#define UPGRADE_LOCKED_ORGANS list(/obj/item/organ/internal/heart/gland, \ + /obj/item/organ/internal/heart/demon, \ + /obj/item/organ/internal/heart/cursed, \ + /obj/item/organ/internal/eyes/cybernetic/eyesofgod) + +/// Limbs that the cloner won't accept. +#define FORBIDDEN_LIMBS list(/obj/item/organ/external/head, \ + /obj/item/organ/external/chest, \ + /obj/item/organ/external/groin) //you can't even get chests and groins normally + +/// A list of robot parts for use later, so that you can put them straight into the cloner from the exosuit fabricator. +#define ALLOWED_ROBOT_PARTS list(/obj/item/robot_parts/r_arm, \ + /obj/item/robot_parts/l_arm, \ + /obj/item/robot_parts/r_leg, \ + /obj/item/robot_parts/l_leg) + + +//Balance tweaks go here vv +#define BIOMASS_BASE_COST 250 +#define MEAT_BIOMASS_VALUE 50 +//These ones are also used for dead limbs/organs +#define BIOMASS_NEW_LIMB_COST 100 +#define BIOMASS_NEW_ORGAN_COST 100 +#define BIOMASS_BURN_WOUND_COST 25 +//These next 3 are for every point of the respective damage type +#define BIOMASS_BRUTE_COST 0.5 +#define BIOMASS_BURN_COST 0.5 +#define BIOMASS_ORGAN_DAMAGE_COST 1 +#define SANGUINE_IB_COST 5 +#define OSSEOUS_BONE_COST 5 -//Potential replacement for genetics revives or something I dunno (?) - -#define BIOMASS_BASE_AMOUNT 50 // How much biomass a BIOMASSABLE item gives the cloning pod - -// Not a comprehensive list: Further PRs should add appropriate items here. -// Meat as usual, monstermeat covers goliath, xeno, spider, bear meat -GLOBAL_LIST_INIT(cloner_biomass_items, list(\ -/obj/item/food/snacks/meat,\ -/obj/item/food/snacks/monstermeat, -/obj/item/food/snacks/carpmeat, -/obj/item/food/snacks/salmonmeat, -/obj/item/food/snacks/catfishmeat, -/obj/item/food/snacks/tofurkey)) - -#define MINIMUM_HEAL_LEVEL 40 -#define CLONE_INITIAL_DAMAGE 190 -#define BRAIN_INITIAL_DAMAGE 90 // our minds are too feeble for 190 /obj/machinery/clonepod anchored = TRUE @@ -26,367 +61,520 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ density = TRUE icon = 'icons/obj/cloning.dmi' icon_state = "pod_idle" - req_access = list(ACCESS_MEDICAL) //For premature unlocking. - - var/mob/living/carbon/human/occupant - var/heal_level //The clone is released once its health reaches this level. - var/obj/machinery/computer/cloning/connected = null //So we remember the connected clone machine. - var/mess = FALSE //Need to clean out it if it's full of exploded clone. - var/attempting = FALSE //One clone attempt at a time thanks - var/biomass = 0 - var/speed_coeff - var/efficiency - - var/datum/mind/clonemind - var/grab_ghost_when = CLONER_MATURE_CLONE - - var/obj/item/radio/Radio - var/radio_announce = TRUE + //So that chemicals can be loaded into the pod. + container_type = OPENCONTAINER + /// The linked cloning console. + var/obj/machinery/computer/cloning/console + + /// Whether or not we're cloning someone. + var/currently_cloning = FALSE + /// The progress on the current clone. + /// Measured from 0-100, where 0-20 has no body, and 21-100 gradually builds on limbs every 10. (r_arm, r_hand, l_arm, l_hand, r_leg, r_foot, l_leg, l_foot) + var/clone_progress = 0 + /// A list of limbs which have not yet been grown by the cloner. + var/list/limbs_to_grow = list() + /// The limb we're currently growing. + var/current_limb + /// Flavor text to show on examine. + var/desc_flavor = "It doesn't seem to be doing anything right now." + /// The countdown. var/obj/effect/countdown/clonepod/countdown - - var/list/brine_types = list("corazone", "perfluorodecalin", "epinephrine", "salglu_solution") //stops heart attacks, heart failure, shock, and keeps their O2 levels normal - var/list/missing_organs = list() - var/organs_number = 0 - - light_color = LIGHT_COLOR_PURE_GREEN - -/obj/machinery/clonepod/power_change() - ..() //we don't check return here because we also care about the BROKEN flag - if(!(stat & (BROKEN|NOPOWER))) - set_light(2) - else - set_light(0) - -/obj/machinery/clonepod/biomass - biomass = CLONER_BIOMASS_REQUIRED + /// Whether or not the interface is locked. + var/locked = TRUE + req_access = list(ACCESS_MEDICAL) + + /// The speed at which we clone. Each processing cycle will advance clone_progress by this amount. + var/speed_modifier = 1 + /// Our price modifier, multiplied with the base cost to get the true cost. + var/price_modifier = 1.1 + /// Our storage modifier, which is used in calculating organ and biomass storage. + var/storage_modifier = 1 + + /// The cloner's biomass count. + var/biomass = 0 + /// How many organs we can store. This is calculated with the storage modifier in RefreshParts(). + var/organ_storage_capacity + /// How much biomass we can store. This is calculated at the same time as organ_storage_capacity. + var/biomass_storage_capacity + + /// The cloning_data datum which shows the patient's current status. + var/datum/cloning_data/patient_data + /// The cloning_data datum which shows the status we want the patient to be in. + var/datum/cloning_data/desired_data + /// Our patient. + var/mob/living/carbon/human/clone /obj/machinery/clonepod/Initialize(mapload) . = ..() + countdown = new(src) - Radio = new /obj/item/radio(src) - Radio.listening = FALSE - Radio.config(list("Medical" = 0)) - Radio.follow_target = src + if(!console && mapload) + console = pick(locate(/obj/machinery/computer/cloning, orange(5, src))) //again, there shouldn't be multiple consoles, mappers component_parts = list() component_parts += new /obj/item/circuitboard/clonepod(null) component_parts += new /obj/item/stock_parts/scanning_module(null) - component_parts += new /obj/item/stock_parts/scanning_module(null) + component_parts += new /obj/item/stock_parts/matter_bin(null) component_parts += new /obj/item/stock_parts/manipulator(null) component_parts += new /obj/item/stock_parts/manipulator(null) component_parts += new /obj/item/stack/sheet/glass(null) component_parts += new /obj/item/stack/cable_coil(null, 1) component_parts += new /obj/item/stack/cable_coil(null, 1) - RefreshParts() + component_parts += new /obj/item/reagent_containers/glass/beaker/large(null) + create_reagents(100) update_icon() + RefreshParts() + +/obj/machinery/clonepod/biomass/Initialize(mapload) + . = ..() + biomass = biomass_storage_capacity /obj/machinery/clonepod/upgraded/Initialize(mapload) . = ..() component_parts = list() component_parts += new /obj/item/circuitboard/clonepod(null) - component_parts += new /obj/item/stock_parts/scanning_module/phasic(null) - component_parts += new /obj/item/stock_parts/scanning_module/phasic(null) - component_parts += new /obj/item/stock_parts/manipulator/pico(null) - component_parts += new /obj/item/stock_parts/manipulator/pico(null) + component_parts += new /obj/item/stock_parts/scanning_module/triphasic(null) + component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null) + component_parts += new /obj/item/stock_parts/manipulator/femto(null) + component_parts += new /obj/item/stock_parts/manipulator/femto(null) component_parts += new /obj/item/stack/sheet/glass(null) component_parts += new /obj/item/stack/cable_coil(null, 1) component_parts += new /obj/item/stack/cable_coil(null, 1) - biomass = CLONER_BIOMASS_REQUIRED + component_parts += new /obj/item/reagent_containers/glass/beaker/bluespace(null) + + update_icon() RefreshParts() + biomass = biomass_storage_capacity + reagents.add_reagent("sanguine_reagent", 150) + reagents.add_reagent("osseous_reagent", 150) + /obj/machinery/clonepod/Destroy() - if(connected) - connected.pods -= src - connected = null - if(clonemind) - UnregisterSignal(clonemind.current, COMSIG_LIVING_REVIVE) - UnregisterSignal(clonemind, COMSIG_MIND_TRANSER_TO) - QDEL_NULL(Radio) - QDEL_NULL(countdown) - QDEL_LIST_CONTENTS(missing_organs) - return ..() + if(console) + console.pods -= src + if(console.selected_pod == src && length(console.pods) > 0) + console.selected_pod = pick(console.pods) + else + console.selected_pod = null -/obj/machinery/clonepod/RefreshParts() - speed_coeff = 0 - efficiency = 0 - for(var/obj/item/stock_parts/scanning_module/S in component_parts) - efficiency += S.rating - for(var/obj/item/stock_parts/manipulator/P in component_parts) - speed_coeff += P.rating - heal_level = max(min((efficiency * 15) + 10, 100), MINIMUM_HEAL_LEVEL) - -//The return of data disks?? Just for transferring between genetics machine/cloning machine. -//TO-DO: Make the genetics machine accept them. -/obj/item/disk/data - name = "Genetics Data Disk" - icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. - var/datum/dna2/record/buf = null - var/read_only = FALSE //Well,it's still a floppy disk - -/obj/item/disk/data/proc/initialize() - buf = new - buf.dna=new - -/obj/item/disk/data/Destroy() - QDEL_NULL(buf) + QDEL_NULL(countdown) return ..() -/obj/item/disk/data/demo - name = "data disk - 'God Emperor of Mankind'" - read_only = TRUE - -/obj/item/disk/data/demo/New() - ..() - initialize() - buf.types=DNA2_BUF_UE|DNA2_BUF_UI - //data = "066000033000000000AF00330660FF4DB002690" - //data = "0C80C80C80C80C80C8000000000000161FBDDEF" - Farmer Jeff - buf.dna.real_name="God Emperor of Mankind" - buf.dna.unique_enzymes = md5(buf.dna.real_name) - buf.dna.UI=list(0x066,0x000,0x033,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000,0x000,0x328,0x045,0x5FC,0x053,0x035,0x035,0x035) - //buf.dna.UI=list(0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x0C8,0x000,0x000,0x000,0x000,0x161,0xFBD,0xDEF) // Farmer Jeff - if(buf.dna.UI.len != DNA_UI_LENGTH) //If there's a disparity b/w the dna UI string lengths, 0-fill the extra blocks in this UI. - for(var/i in buf.dna.UI.len to DNA_UI_LENGTH) - buf.dna.UI += 0x000 - buf.dna.ResetSE() - buf.dna.UpdateUI() - -/obj/item/disk/data/monkey - name = "data disk - 'Mr. Muggles'" - read_only = 1 - -/obj/item/disk/data/monkey/New() - ..() - initialize() - buf.types=DNA2_BUF_SE - var/list/new_SE=list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) - for(var/i=new_SE.len;i<=DNA_SE_LENGTH;i++) - new_SE += rand(1,1024) - buf.dna.SE=new_SE - buf.dna.SetSEValueRange(GLOB.monkeyblock,0xDAC, 0xFFF) - -//Disk stuff. -/obj/item/disk/data/New() - ..() - var/diskcolor = pick(0,1,2) - icon_state = "datadisk[diskcolor]" - -/obj/item/disk/data/attack_self(mob/user as mob) - read_only = !read_only - to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") - -/obj/item/disk/data/examine(mob/user) - . = ..() - . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." - -//Clonepod - /obj/machinery/clonepod/examine(mob/user) . = ..() - if(mess) - . += "It's filled with blood and viscera. You swear you can see it moving..." - if(HAS_TRAIT(src, TRAIT_CMAGGED)) - . += "Yellow ooze is dripping out of the synthmeat storage chamber..." - if(!occupant || stat & (NOPOWER|BROKEN)) - return - if(occupant && occupant.stat != DEAD) - . += "Current clone cycle is [round(get_completion())]% complete." - -/obj/machinery/clonepod/return_air() //non-reactive air - RETURN_TYPE(/datum/gas_mixture) - var/datum/gas_mixture/GM = new - GM.nitrogen = MOLES_O2STANDARD + MOLES_N2STANDARD - GM.temperature = T20C - return GM - -/obj/machinery/clonepod/proc/get_completion() - . = (100 * ((occupant.health + 100) / (heal_level + 100))) + . += "[desc_flavor]" + . += "[src] is currently [locked ? "locked" : "unlocked"], and can be [locked ? "unlocked" : "locked"] by swiping an ID with medical access on it." -/obj/machinery/clonepod/attack_ai(mob/user) - return examine(user) - -//Radio Announcement - -/obj/machinery/clonepod/proc/announce_radio_message(message) - if(radio_announce) - Radio.autosay(message, name, "Medical", list(z)) - -//Start growing a human clone in the pod! -/obj/machinery/clonepod/proc/growclone(datum/dna2/record/R) - if(mess || attempting || panel_open || stat & (NOPOWER|BROKEN)) - return 0 - clonemind = locate(R.mind) - if(!istype(clonemind)) //not a mind - return 0 - if(clonemind.current && clonemind.current.stat != DEAD) //mind is associated with a non-dead body - return 0 - if(clonemind.active) //somebody is using that mind - if(ckey(clonemind.key) != R.ckey) - return 0 - if(clonemind.suicided) // and stay out! - malfunction(go_easy = 0) - return -1 // Flush the record - else - // get_ghost() will fail if they're unable to reenter their body - var/mob/dead/observer/G = clonemind.get_ghost() - if(!G) - return 0 +/obj/machinery/clonepod/RefreshParts() + speed_modifier = 0 //Since we have multiple manipulators, which affect this modifier, we reset here so we can just use += later + for(var/obj/item/stock_parts/SP as anything in component_parts) + if(istype(SP, /obj/item/stock_parts/matter_bin/)) //Matter bins for storage modifier + storage_modifier = round(10 * (SP.rating / 2)) //5 at tier 1, 10 at tier 2, 15 at tier 3, 20 at tier 4 + else if(istype(SP, /obj/item/stock_parts/scanning_module)) //Scanning modules for price modifier (more accurate scans = more efficient) + price_modifier = -(SP.rating / 10) + 1.2 //1.1 at tier 1, 1 at tier 2, 0.9 at tier 3, 0.8 at tier 4 + else if(istype(SP, /obj/item/stock_parts/manipulator)) //Manipulators for speed modifier + speed_modifier += SP.rating / 2 //1 at tier 1, 2 at tier 2, et cetera - if(biomass >= CLONER_BIOMASS_REQUIRED) - biomass -= CLONER_BIOMASS_REQUIRED - else - return 0 + for(var/obj/item/reagent_containers/glass/beaker/B in component_parts) + if(istype(B)) + reagents.maximum_volume = B.volume //The default cloning pod has a large beaker in it, so 100u. - attempting = TRUE //One at a time!! - countdown.start() + organ_storage_capacity = storage_modifier + biomass_storage_capacity = storage_modifier * 400 - if(!R.dna) - R.dna = new /datum/dna() - var/mob/living/carbon/human/H = new /mob/living/carbon/human(src) - H.set_species(R.dna.species.type) - occupant = H - if(!R.dna.real_name) //to prevent null names - R.dna.real_name = H.real_name - else - H.real_name = R.dna.real_name - - H.dna = R.dna.Clone() - - for(var/datum/language/L in R.languages) - H.add_language(L.name) - - domutcheck(H, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them - - if(efficiency > 2 && efficiency < 5 && prob(25)) - randmutb(H) - if(efficiency > 5 && prob(20)) - randmutg(H) - if(efficiency < 3 && prob(50)) - randmutb(H) - - H.dna.UpdateSE() - H.dna.UpdateUI() - - H.sync_organ_dna(1) // It's literally a fresh body as you can get, so all organs properly belong to it - H.UpdateAppearance() - - check_brine() - //Get the clone body ready - maim_clone(H) - H.Paralyse(8 SECONDS) - - if(grab_ghost_when == CLONER_FRESH_CLONE) - clonemind.transfer_to(H) - H.ckey = R.ckey - var/message - message += "Consciousness slowly creeps over you as your body regenerates.
" - message += "So this is what cloning feels like?" - to_chat(H, "[message]") - else if(grab_ghost_when == CLONER_MATURE_CLONE) - to_chat(clonemind.current, "Your body is beginning to regenerate in a cloning pod. You will become conscious when it is complete.") - // Set up a soul link with the dead body to catch a revival - RegisterSignal(clonemind.current, COMSIG_LIVING_REVIVE, PROC_REF(occupant_got_revived)) - RegisterSignal(clonemind, COMSIG_MIND_TRANSER_TO, PROC_REF(occupant_got_revived)) - - SSblackbox.record_feedback("tally", "players_revived", 1, "cloned") - update_icon() +//Process +/obj/machinery/clonepod/process() - H.suiciding = FALSE - attempting = FALSE - return 1 + //Basically just isolate_reagent() with extra functionality. + for(var/datum/reagent/R as anything in reagents.reagent_list) + if(!(R.id in VALID_REAGENTS)) + reagents.del_reagent(R.id) + reagents.update_total() + atom_say("Purged contaminant from chemical storage.") -//Grow clones to maturity then kick them out. FREELOADERS -/obj/machinery/clonepod/process() + //Take in biomass. Mostly copied from the old cloning code var/show_message = FALSE for(var/obj/item/item in range(1, src)) - if(is_type_in_list(item, GLOB.cloner_biomass_items)) + if(is_type_in_list(item, VALID_BIOMASSABLES) && (biomass + MEAT_BIOMASS_VALUE <= biomass_storage_capacity)) qdel(item) - biomass += BIOMASS_BASE_AMOUNT + biomass += MEAT_BIOMASS_VALUE show_message = TRUE if(show_message) - visible_message("[src] sucks in and processes the nearby biomass.") + visible_message("[src] sucks in nearby biomass.") + + //If we're cloning someone, we haven't generated a list of limbs to grow, and we're before any possibility of not having any limbs left to grow. + if(currently_cloning && !length(limbs_to_grow) && clone_progress < 20) + for(var/limb in desired_data.limbs) + if(desired_data.limbs[limb][4]) + continue //We're not growing this limb, since in the desired state it's missing. + + var/obj/item/organ/external/limb_typepath = patient_data.genetic_info.species.has_limbs[limb]["path"] + if(initial(limb_typepath.vital)) //I hate everything about this check, but it sees if the current organ is vital.. + continue //and continues if it is, since the proc that creates the clone mob will make these all at once. + var/parent_organ_is_limb = FALSE + for(var/organ in desired_data.organs) + var/obj/item/organ/external/organ_typepath = patient_data.genetic_info.species.has_organ[organ] + if(!initial(organ_typepath.vital)) //I hate this check too. We loop through all the organs the cloned species should have. + continue //If it's not a vital organ, continue looping through the organs. + if(initial(organ_typepath.parent_organ) == limb) + parent_organ_is_limb = TRUE //If it's a vital organ, and belongs to the current limb, we don't want this limb. + break + if(parent_organ_is_limb) + continue + limbs_to_grow += limb //It's not supposed to be missing and it's not vital - so we'll be growing it. + limbs_to_grow = shuffle(limbs_to_grow) + + if(clone) + clone.Weaken(4 SECONDS) //make sure they stay in the pod + clone.setOxyLoss(0) //..and alive + + //Actually grow clones (this is the fun part of the proc!) + if(currently_cloning) + switch(clone_progress) + if(0 to 10) + desc_flavor = "You see muscle quickly growing on a ribcage and skull inside [src]." + clone_progress += speed_modifier + return + if(11 to 90) + clone_progress += speed_modifier + if(!clone) + create_clone() + return + + if(clone.cloneloss >= 25) + clone.adjustCloneLoss(-2) + return + + if(!current_limb) + if(!length(limbs_to_grow)) //if we meet all of the conditions to get here, there's nothing left to do in this section + desc_flavor = "You see muscle and fat filling out on [clone]'s body." + return + for(var/limb_candidate in limbs_to_grow) + var/obj/item/organ/external/LC = clone.dna.species.has_limbs[limb_candidate]["path"] + if(initial(LC.parent_organ) in limbs_to_grow) + continue //If we haven't grown this limb's parent organ yet, we don't want to grow it now. + current_limb = limb_candidate //If we have grown it, then we're good to grow it now. + limbs_to_grow -= limb_candidate + return + + if(!(current_limb in clone.bodyparts)) + if(get_stored_organ(current_limb)) + var/obj/item/organ/external/EO = get_stored_organ(current_limb) + desc_flavor = "You see [src] attaching \a [EO.name] to [clone]." + EO.replaced(clone) + current_limb = null + clone.adjustCloneLoss(4 / speed_modifier) + clone.regenerate_icons() + return + + var/list/EO_path = clone.dna.species.has_limbs[current_limb]["path"] + var/obj/item/organ/external/EO = new EO_path(clone) //Passing a human to a limb's New() proc automatically attaches it + desc_flavor = "You see \a [EO.name] growing from [clone]'[clone.p_s()] [EO.amputation_point]." + current_limb = null + EO.brute_dam = desired_data.limbs[EO.limb_name][1] + EO.burn_dam = desired_data.limbs[EO.limb_name][2] + EO.status = desired_data.limbs[EO.limb_name][3] + clone.adjustCloneLoss(4 / speed_modifier) + clone.regenerate_icons() + return + + if(91 to 100) + if(length(limbs_to_grow) || current_limb) //This shouldn't happen, but just in case.. (no more feetless clones) + clone_progress -= 5 + if(eject_clone()) + return + clone.adjustCloneLoss(-5 * speed_modifier) //rapidly heal clone damage + desc_flavor = "You see [src] finalizing the cloning process." + clone_progress += speed_modifier + return + if(101 to INFINITY) //this state can be reached with an upgraded cloner + if(eject_clone()) + return + clone.setCloneLoss(0) //get out of the pod!! + return + +//Clonepod-specific procs +//This just begins the cloning process. Called by the cloning console. +/obj/machinery/clonepod/proc/start_cloning(datum/cloning_data/_patient_data, datum/cloning_data/_desired_data) + currently_cloning = TRUE + patient_data = _patient_data + desired_data = _desired_data + + var/cost = get_cloning_cost(patient_data, desired_data) + biomass -= cost[BIOMASS_COST] + reagents.remove_reagent("sanguine_reagent", cost[SANGUINE_COST]) + reagents.remove_reagent("osseous_reagent", cost[OSSEOUS_COST]) - if(stat & NOPOWER) //Autoeject if power is lost - if(occupant) - go_out() - connected_message("Clone Ejected: Loss of power.") + countdown.start() + update_icon(UPDATE_ICON_STATE) - else if((occupant) && (occupant.loc == src)) - if((occupant.stat == DEAD) || (occupant.suiciding)) //Autoeject corpses and suiciding dudes. - announce_radio_message("The cloning of [occupant] has been aborted due to unrecoverable tissue failure.") - go_out() - connected_message("Clone Rejected: Deceased.") +//Creates the clone! Used once the cloning pod reaches ~10% completion. +/obj/machinery/clonepod/proc/create_clone() + clone = new /mob/living/carbon/human(src, patient_data.genetic_info.species.type) - else if(occupant.cloneloss > (100 - heal_level)) - occupant.Paralyse(8 SECONDS) + clone.change_dna(patient_data.genetic_info, FALSE, TRUE) - //Slowly get that clone healed and finished. - occupant.adjustCloneLoss(-((speed_coeff/2))) + for(var/obj/item/organ/external/limb in clone.bodyparts) + if(!(limb.limb_name in limbs_to_grow)) //if the limb was determined to be vital + var/active_limb_name = limb.limb_name + limb.brute_dam = desired_data.limbs[active_limb_name][1] + limb.burn_dam = desired_data.limbs[active_limb_name][2] + limb.status = desired_data.limbs[active_limb_name][3] + continue + if(length(limb.children)) //This doesn't support having a vital organ inside a child of a limb that itself isn't vital. + for(var/obj/item/organ/external/child in limb.children) //Future coders, if you want to add a species with its brain in its hand or something, change this + child.remove(null, TRUE) + qdel(child) + limb.remove(null, TRUE) + qdel(limb) + + for(var/candidate_for_insertion in desired_data.organs) + var/obj/item/organ/internal/organ = clone.get_int_organ(clone.dna.species.has_organ[candidate_for_insertion]) + + if(desired_data.organs[candidate_for_insertion][3]) //if it's desired for the organ to be missing.. + qdel(organ) //make it so + continue - // For human species that lack non-vital parts for some weird reason - if(organs_number) - var/progress = CLONE_INITIAL_DAMAGE - occupant.getCloneLoss() - progress += (100 - MINIMUM_HEAL_LEVEL) - var/milestone = CLONE_INITIAL_DAMAGE / organs_number -// Doing this as a #define so that the value can change when evaluated multiple times -#define INSTALLED (organs_number - length(missing_organs)) + if(get_stored_organ(candidate_for_insertion)) + var/obj/item/organ/internal/IO = get_stored_organ(candidate_for_insertion) + qdel(organ) + IO.insert(clone) //hotswap + continue - while((progress / milestone) > INSTALLED && length(missing_organs)) - var/obj/item/organ/I = pick_n_take(missing_organs) - I.safe_replace(occupant) + if(candidate_for_insertion == "heart") + continue //The heart is always cloned or replaced, remember? If we're not inserting a new one, we don't need to touch it. -#undef INSTALLED + organ.damage = desired_data.organs[candidate_for_insertion][1] + organ.status = desired_data.organs[candidate_for_insertion][2] - //Premature clones may have brain damage. - occupant.adjustBrainLoss(-((speed_coeff/20)*efficiency)) + clone.updatehealth("droplimb") + clone.regenerate_icons() - check_brine() + clone.set_heartattack(FALSE) //you are not allowed to die + clone.adjustCloneLoss(25) //to punish early ejects + clone.Weaken(4 SECONDS) - //Also heal some oxyloss ourselves just in case!! - occupant.adjustOxyLoss(-10) +//Ejects a clone. The force var ejects even if there's still clone damage. +/obj/machinery/clonepod/proc/eject_clone(force = FALSE) + if(!currently_cloning) + return FALSE - use_power(7500) //This might need tweaking. + if(!clone && force) + new /obj/effect/gibspawner/generic(get_turf(src), desired_data.genetic_info) + playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) + reset_cloning() + return TRUE + + if(!clone.cloneloss) + clone.forceMove(loc) + var/datum/mind/patient_mind = locateUID(patient_data.mindUID) + patient_mind.transfer_to(clone) + clone.grab_ghost() + clone.update_revive() + to_chat(clone, "You remember nothing from the time that you were dead!") + to_chat(clone, "There's a bright flash of light, and you take your first breath once more.") + + reset_cloning() + return TRUE + + if(!force) + return FALSE - else if((occupant.cloneloss <= (100 - heal_level))) - connected_message("Cloning Process Complete.") - announce_radio_message("The cloning cycle of [occupant] is complete.") - go_out() + clone.forceMove(loc) + new /obj/effect/gibspawner/generic(get_turf(src), clone) + playsound(loc, 'sound/effects/splat.ogg', 50, TRUE) - else if((!occupant) || (occupant.loc != src)) - occupant = null - update_icon() - use_power(200) + var/datum/mind/patient_mind = locateUID(patient_data.mindUID) + patient_mind.transfer_to(clone) + clone.grab_ghost() + clone.update_revive() + to_chat(clone, "You remember nothing from the time that you were dead!") + to_chat(clone, "You're ripped out of blissful oblivion! You feel like shit.") -//Let's unlock this early I guess. Might be too early, needs tweaking. -/obj/machinery/clonepod/attackby(obj/item/I, mob/user, params) - if(exchange_parts(user, I)) + reset_cloning() + return TRUE + +//Helper proc for the above +/obj/machinery/clonepod/proc/reset_cloning() + currently_cloning = FALSE + clone = null + patient_data = null + desired_data = null + clone_progress = 0 + desc_flavor = initial(desc_flavor) + update_icon(UPDATE_ICON_STATE) + countdown.stop() + +//This gets the cost of cloning, in a list with the form (biomass, sanguine reagent, osseous reagent). +/obj/machinery/clonepod/proc/get_cloning_cost(datum/cloning_data/_patient_data, datum/cloning_data/_desired_data) + var/datum/cloning_data/p_data = _patient_data + var/datum/cloning_data/d_data = _desired_data + //Biomass, sanguine reagent, osseous reagent + var/list/cloning_cost = list((price_modifier * BIOMASS_BASE_COST), 0, 0) + + if(!istype(p_data) || !istype(d_data)) + return //this shouldn't happen but whatever + + for(var/limb in p_data.limbs) + + if(get_stored_organ(limb)) + continue //if we have a stored organ, we'll be replacing it - so no biomass or sanguine/osseous cost + + var/list/patient_limb_info = p_data.limbs[limb] + var/patient_limb_status = patient_limb_info[3] + + var/list/desired_limb_info = d_data.limbs[limb] + var/desired_limb_status = desired_limb_info[3] + + if(p_data.limbs[limb][4] && !d_data.limbs[limb][4]) //if the limb is missing on the patient and we want it to not be + cloning_cost[1] += BIOMASS_NEW_LIMB_COST * price_modifier + continue //then continue - since we're replacing the limb, we don't need to fix its damages + + if((patient_limb_status & ORGAN_DEAD) && !(desired_limb_status & ORGAN_DEAD)) //if the patient's limb is dead and we don't want it to be + cloning_cost[1] += BIOMASS_NEW_LIMB_COST * price_modifier + continue //as above + + var/brute_damage_diff = patient_limb_info[1] - desired_limb_info[1] + cloning_cost[1] += BIOMASS_BRUTE_COST * brute_damage_diff * price_modifier + + var/burn_damage_diff = patient_limb_info[2] - desired_limb_info[2] + cloning_cost[1] += BIOMASS_BURN_COST * burn_damage_diff * price_modifier + + if((patient_limb_status & ORGAN_BURNT) && !(desired_limb_status & ORGAN_BURNT)) //if the patient's limb has a burn wound and we don't want it to + cloning_cost[1] += BIOMASS_BURN_WOUND_COST * price_modifier + + if((patient_limb_status & ORGAN_INT_BLEEDING) && !(desired_limb_status & ORGAN_INT_BLEEDING)) //if the patient's limb has IB and we want it to not be + cloning_cost[2] += SANGUINE_IB_COST * price_modifier + + if((patient_limb_status & ORGAN_BROKEN) && !(desired_limb_status & ORGAN_BROKEN)) //if the patient's limb is broken and we want it to not be + cloning_cost[3] += OSSEOUS_BONE_COST * price_modifier + + for(var/organ in p_data.organs) + + if(organ == "heart") //The heart is always replaced in cloning. This is factored into the base biomass cost, so we don't add more here. + if(get_stored_organ(organ)) + cloning_cost[1] -= BIOMASS_NEW_ORGAN_COST //the cost of a new organ should ALWAYS be below the base cloning cost + continue + + if(get_stored_organ(organ)) + continue //if we can replace it, we will, so no need to do the rest of the loop + + var/list/patient_organ_info = p_data.organs[organ] + var/patient_organ_status = patient_organ_info[2] + + var/list/desired_organ_info = d_data.organs[organ] + var/desired_organ_status = desired_organ_info[2] + + if(patient_organ_info[3] && !desired_organ_info[3]) //If it's missing, and we don't want it to be, replace the organ + cloning_cost[1] += BIOMASS_NEW_ORGAN_COST * price_modifier + continue + + if((desired_organ_status & ORGAN_DEAD) && !(patient_organ_status & ORGAN_DEAD)) //if the patient's organ is dead and we want it to not be + cloning_cost[1] += BIOMASS_NEW_ORGAN_COST * price_modifier + continue //.. then continue, because if we replace the organ we don't need to fix its damages + + var/organ_damage_diff = patient_organ_info[1] - desired_organ_info[1] + cloning_cost[1] += BIOMASS_ORGAN_DAMAGE_COST * organ_damage_diff * price_modifier + + cloning_cost[1] = round(cloning_cost[1]) //no decimal-point amounts of biomass! + + return cloning_cost + +//insert an organ into storage +/obj/machinery/clonepod/proc/insert_organ(obj/item/organ/inserted, mob/inserter) + var/has_children = FALSE //Used for arms and legs + var/stored_organs + for(var/obj/item/organ/O in contents) + stored_organs++ + for(var/obj/item/robot_parts/R in contents) + stored_organs++ + + if(stored_organs >= organ_storage_capacity) + to_chat(inserter, "[src]'s organ storage is full!") return - if(I.GetID()) - if(!check_access(I)) - to_chat(user, "Access Denied.") + if(is_int_organ(inserted)) + if(is_type_in_list(inserted, FORBIDDEN_INTERNAL_ORGANS)) + to_chat(inserter, "[src] refuses [inserted].") + return + if(is_type_in_list(inserted, UPGRADE_LOCKED_ORGANS) && speed_modifier < 4) //if our manipulators aren't fully upgraded + to_chat(inserter, "[src] refuses [inserted].") return - if(!(occupant || mess)) - to_chat(user, "Error: Pod has no occupant.") + if(inserted.status & ORGAN_ROBOT && speed_modifier == 1) //if our manipulators aren't upgraded at all + to_chat(inserter, "[src] refuses [inserted].") + return + + if(isorgan(inserted)) + if(is_type_in_list(inserted, FORBIDDEN_LIMBS)) + to_chat(inserter, "[src] refuses [inserted].") return + var/obj/item/organ/external/EO = inserted + if(length(EO.children)) + if((stored_organs + 1 + length(EO.children)) > organ_storage_capacity) + to_chat(inserter, "You can't fit all of [inserted] into [src]'s organ storage!") + return + has_children = TRUE + for(var/obj/item/organ/external/child in EO.children) + child.forceMove(src) + child.parent = null + EO.children -= child + EO.compile_icon() + + if(is_type_in_list(inserted, ALLOWED_ROBOT_PARTS) && speed_modifier == 1) //if our manipulators aren't upgraded at all + to_chat(inserter, "[src] refuses [inserted].") + return + + if(ismob(inserted.loc)) + var/mob/M = inserted.loc + if(!M.get_active_hand() == inserted) + return //not sure how this would happen, but smartfridges check for it so + if(!M.drop_item()) + to_chat(inserter, "[inserted] is stuck to you!") + return + M.unEquip(inserted) + inserted.forceMove(src) + to_chat(inserter, "You insert [inserted] into [src]'s organ storage.") + SStgui.try_update_ui(inserter, src) + if(has_children) + visible_message("There's a crunching sound as [src] breaks down [inserted] into discrete parts.", "You hear a loud crunch.") + +/obj/machinery/clonepod/proc/get_stored_organ(organ) + for(var/obj/item/organ/external/EO in contents) + if(EO.limb_name == organ) + return EO + for(var/obj/item/organ/internal/IO in contents) + if(IO.organ_tag == organ) + return IO + for(var/obj/item/robot_parts/RP in contents) + if(organ in RP.part) + return RP + return FALSE + +//Attackby and x_acts +/obj/machinery/clonepod/attackby(obj/item/I, mob/user, params) + if(exchange_parts(user, I)) + return + + if(I.is_open_container()) + return + + if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + if(allowed(user)) + locked = !locked + to_chat(user, "Access restriction is now [locked ? "enabled" : "disabled"].") else - connected_message("Authorized Ejection") - announce_radio_message("An authorized ejection of [(occupant) ? occupant.real_name : "the malfunctioning pod"] has occurred") - to_chat(user, "You force an emergency ejection.") - go_out() - -// A user can feed in biomass sources manually. - else if(is_type_in_list(I, GLOB.cloner_biomass_items)) - if(user.drop_item()) - to_chat(user, "[src] processes [I].") - biomass += BIOMASS_BASE_AMOUNT - qdel(I) - else - return ..() + to_chat(user, "Access denied.") + return + + if(is_int_organ(I) || isorgan(I) || is_type_in_list(I, ALLOWED_ROBOT_PARTS)) //fun fact, robot parts aren't organs! + insert_organ(I, user) + return + + return ..() /obj/machinery/clonepod/crowbar_act(mob/user, obj/item/I) . = TRUE @@ -403,7 +591,6 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ /obj/machinery/clonepod/screwdriver_act(mob/user, obj/item/I) . = TRUE - // These icon states don't really matter since we need to call update_icon() to handle panel open/closed overlays anyway. default_deconstruction_screwdriver(user, null, null, I) update_icon() @@ -411,119 +598,96 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ . = TRUE if(!I.use_tool(src, user, 0, volume = I.tool_volume)) return - if(occupant) - to_chat(user, "Can not do that while [src] is in use.") - return if(anchored) WRENCH_UNANCHOR_MESSAGE anchored = FALSE - connected.pods -= src - connected = null else WRENCH_ANCHOR_MESSAGE anchored = TRUE -/obj/machinery/clonepod/emag_act(user) - malfunction() - return TRUE +/obj/machinery/clonepod/attack_hand(mob/user) + . = ..() + add_fingerprint(user) -/obj/machinery/clonepod/cmag_act(mob/user) - if(HAS_TRAIT(src, TRAIT_CMAGGED)) + if(stat & (BROKEN|NOPOWER)) return - playsound(src, "sparks", 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, "A droplet of bananium ooze seeps into the synthmeat storage chamber...") - ADD_TRAIT(src, TRAIT_CMAGGED, CLOWN_EMAG) -//Put messages in the connected computer's temp var for display. -/obj/machinery/clonepod/proc/connected_message(message) - if((isnull(connected)) || (!istype(connected, /obj/machinery/computer/cloning))) - return FALSE - if(!message) - return FALSE + ui_interact(user) + +/obj/machinery/clonepod/attack_ai(mob/user) + return attack_hand(user) + +/obj/machinery/clonepod/attack_ghost(mob/user) + return attack_hand(user) - connected.temp = "[name] : [message]" - connected.updateUsrDialog() +/obj/machinery/clonepod/emag_act(user) + . = ..() + eject_clone(TRUE) return TRUE -/obj/machinery/clonepod/proc/go_out() - countdown.stop() - var/turf/T = get_turf(src) - if(mess) //Clean that mess and dump those gibs! - for(var/i in missing_organs) - var/obj/I = i - I.forceMove(T) - missing_organs.Cut() - mess = FALSE - new /obj/effect/gibspawner/generic(get_turf(src), occupant) - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - update_icon() +/obj/machinery/clonepod/emp_act(severity) + if(prob(50)) + eject_clone(TRUE) + return ..() + +//TGUI +/obj/machinery/clonepod/ui_interact(mob/user, datum/tgui/ui = null) + if(stat & (NOPOWER|BROKEN)) return - if(!occupant) + if(!allowed(user) && locked && !isobserver(user)) + to_chat(user, "Access denied.") + if(ui) + ui.close() return - if(grab_ghost_when == CLONER_MATURE_CLONE) - UnregisterSignal(clonemind.current, COMSIG_LIVING_REVIVE) - UnregisterSignal(clonemind, COMSIG_MIND_TRANSER_TO) - clonemind.transfer_to(occupant) - occupant.grab_ghost() - to_chat(occupant, "You remember nothing from the time that you were dead!") - to_chat(occupant, "There is a bright flash!
\ - You feel like a new being.
") - if(HAS_TRAIT(src, TRAIT_CMAGGED)) - playsound(loc, 'sound/items/bikehorn.ogg', 50, 1) - occupant.dna.SetSEState(GLOB.clumsyblock, TRUE, FALSE) - occupant.dna.SetSEState(GLOB.comicblock, TRUE, FALSE) - singlemutcheck(occupant, GLOB.clumsyblock, MUTCHK_FORCED) - singlemutcheck(occupant, GLOB.comicblock, MUTCHK_FORCED) - occupant.dna.default_blocks.Add(GLOB.clumsyblock) //Until Genetics fixes you, this is your life now - occupant.dna.default_blocks.Add(GLOB.comicblock) - occupant.flash_eyes(visual = 1) - clonemind = null - - - QDEL_LIST_CONTENTS(missing_organs) - occupant.SetLoseBreath(0) // Stop friggin' dying, gosh damn - occupant.setOxyLoss(0) - for(var/datum/disease/critical/crit in occupant.viruses) - crit.cure() - occupant.forceMove(T) - occupant.update_body() - domutcheck(occupant) //Waiting until they're out before possible notransform. - occupant.special_post_clone_handling() - occupant = null - update_icon() + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CloningPod", "Cloning Pod") + ui.open() + +/obj/machinery/clonepod/ui_data(mob/user) + var/list/data = list() + data["biomass"] = biomass + data["biomass_storage_capacity"] = biomass_storage_capacity + data["sanguine_reagent"] = reagents.get_reagent_amount("sanguine_reagent") + data["osseous_reagent"] = reagents.get_reagent_amount("osseous_reagent") + + var/list/organs_list + for(var/obj/item/organ/O in contents) + organs_list += list(list("name" = O.name, "ref" = O.UID())) + + data["organs"] = organs_list + data["currently_cloning"] = currently_cloning + + return data + +/obj/machinery/clonepod/ui_act(action, params, datum/tgui/ui) + if(..()) + return + switch(action) + if("eject_organ") + var/obj/item/organ/O = locateUID(params["organ_ref"]) + if(!istype(O)) //This shouldn't happen + return FALSE + if(!ui.user.put_in_hands(O)) + O.forceMove(loc) + return TRUE + if("purge_reagent") + if(params["reagent"]) + reagents.del_reagent(params["reagent"]) + return TRUE + if("remove_reagent") + if(params["reagent"]) + reagents.remove_reagent(params["reagent"], params["amount"]) + return TRUE -/obj/machinery/clonepod/proc/malfunction(go_easy = FALSE) - if(occupant) - connected_message("Critical Error!") - announce_radio_message("Critical error! Please contact a Thinktronic Systems technician, as your warranty may be affected.") - UnregisterSignal(clonemind.current, COMSIG_LIVING_REVIVE) - UnregisterSignal(clonemind, COMSIG_MIND_TRANSER_TO) - if(!go_easy) - if(occupant.mind != clonemind) - clonemind.transfer_to(occupant) - occupant.grab_ghost() // We really just want to make you suffer. - var/message - message += "Agony blazes across your consciousness as your body is torn apart.
" - message += "Is this what dying is like? Yes it is." - to_chat(occupant, "[message]") - SEND_SOUND(occupant, sound('sound/hallucinations/veryfar_noise.ogg', 0, 1, 50)) - QDEL_LIST_CONTENTS(missing_organs) - clonemind = null - spawn(40) - qdel(occupant) - - - playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 0) - mess = TRUE update_icon() +//Icon stuff /obj/machinery/clonepod/update_icon_state() - if(occupant && !(stat & NOPOWER)) + if(currently_cloning && !(stat & NOPOWER)) icon_state = "pod_cloning" - else if(mess) - icon_state = "pod_mess" else icon_state = "pod_idle" @@ -532,103 +696,20 @@ GLOBAL_LIST_INIT(cloner_biomass_items, list(\ if(panel_open) . += "panel_open" -/obj/machinery/clonepod/relaymove(mob/user) - if(user.stat == CONSCIOUS) - go_out() - -/obj/machinery/clonepod/emp_act(severity) - if(prob(100/(severity*efficiency))) malfunction() - ..() - -/obj/machinery/clonepod/ex_act(severity) - ..() - if(!QDELETED(src) && occupant) - go_out() - -/obj/machinery/clonepod/handle_atom_del(atom/A) - if(A == occupant) - occupant = null - countdown.stop() - -/obj/machinery/clonepod/deconstruct(disassembled = TRUE) - if(occupant) - go_out() - ..() - -/obj/machinery/clonepod/proc/occupant_got_revived() - // The old body's back in shape, time to ditch the cloning one - malfunction(go_easy = TRUE) - -/obj/machinery/clonepod/proc/maim_clone(mob/living/carbon/human/H) - QDEL_LIST_CONTENTS(missing_organs) - - H.setCloneLoss(CLONE_INITIAL_DAMAGE, FALSE) - H.setBrainLoss(BRAIN_INITIAL_DAMAGE) - - for(var/o in H.internal_organs) - var/obj/item/organ/O = o - if(!istype(O) || O.vital) - continue - - // Let's non-specially remove all non-vital organs - // What could possibly go wrong - var/obj/item/I = O.remove(H) - // Make this support stuff that turns into items when removed - I.forceMove(src) - missing_organs += I - - var/static/list/zones = list("r_arm", "l_arm", "r_leg", "l_leg") - for(var/zone in zones) - var/obj/item/organ/external/E = H.get_organ(zone) - var/obj/item/I = E.remove(H) - I.forceMove(src) - missing_organs += I - - organs_number = length(missing_organs) - H.updatehealth() - -/obj/machinery/clonepod/proc/check_brine() - // Clones are in a pickled bath of mild chemicals, keeping - // them alive, despite their lack of internal organs - for(var/bt in brine_types) - if(occupant.reagents.get_reagent_amount(bt) < 1) - occupant.reagents.add_reagent(bt, 1) - -/* - * Manual -- A big ol' manual. - */ - -/obj/item/paper/Cloning - name = "paper - 'H-87 Cloning Apparatus Manual" - info = {"

Getting Started

- Congratulations, your station has purchased the H-87 industrial cloning device!
- Using the H-87 is almost as simple as brain surgery! Simply insert the target humanoid into the scanning chamber and select the scan option to create a new profile!
- That's all there is to it!
- Notice, cloning system cannot scan inorganic life or small primates. Scan may fail if subject has suffered extreme brain damage.
-

Clone profiles may be viewed through the profiles menu. Scanning implants a complementary HEALTH MONITOR BIO-CHIP into the subject, which may be viewed from each profile. - Profile Deletion has been restricted to \[Station Head\] level access.

-

Cloning from a profile

- Cloning is as simple as pressing the CLONE option at the bottom of the desired profile.
- Per your company's EMPLOYEE PRIVACY RIGHTS agreement, the H-87 has been blocked from cloning crewmembers while they are still alive.
-
-

The provided CLONEPOD SYSTEM will produce the desired clone. Standard clone maturation times (With SPEEDCLONE technology) are roughly 90 seconds. - The cloning pod may be unlocked early with any \[Medical Researcher\] ID after initial maturation is complete.


- Please note that resulting clones may have a small DEVELOPMENTAL DEFECT as a result of genetic drift.
-

Profile Management

-

The H-87 (as well as your station's standard genetics machine) can accept STANDARD DATA DISKETTES. - These diskettes are used to transfer genetic information between machines and profiles. - A load/save dialog will become available in each profile if a disk is inserted.


- A good diskette is a great way to counter aforementioned genetic drift!
-
- This technology produced under license from Thinktronic Systems, LTD."} - -//SOME SCRAPS I GUESS -/* EMP grenade/spell effect - if(istype(A, /obj/machinery/clonepod)) - A:malfunction() -*/ - -#undef MINIMUM_HEAL_LEVEL -#undef BIOMASS_BASE_AMOUNT -#undef CLONE_INITIAL_DAMAGE -#undef BRAIN_INITIAL_DAMAGE +#undef VALID_REAGENTS +#undef VALID_BIOMASSABLES +#undef FORBIDDEN_INTERNAL_ORGANS +#undef UPGRADE_LOCKED_ORGANS +#undef FORBIDDEN_LIMBS +#undef ALLOWED_ROBOT_PARTS + +#undef BIOMASS_BASE_COST +#undef MEAT_BIOMASS_VALUE +#undef BIOMASS_NEW_LIMB_COST +#undef BIOMASS_NEW_ORGAN_COST +#undef BIOMASS_BURN_WOUND_COST +#undef BIOMASS_BRUTE_COST +#undef BIOMASS_BURN_COST +#undef BIOMASS_ORGAN_DAMAGE_COST +#undef SANGUINE_IB_COST +#undef OSSEOUS_BONE_COST diff --git a/code/game/machinery/clonescanner.dm b/code/game/machinery/clonescanner.dm new file mode 100644 index 000000000000..b644feb3182d --- /dev/null +++ b/code/game/machinery/clonescanner.dm @@ -0,0 +1,229 @@ +/// A limb that's not missing with no damages or flags. +#define HEALTHY_LIMB list(0, 0, 0, FALSE) +/// As above, but for organs. +#define HEALTHY_ORGAN list(0, 0, FALSE) + +/// A datum to store the information gained by scanning a patient OR the fixes to be made to their body. +/datum/cloning_data + /// The patient's name. + var/name + /// A reference to the patient's mind. + var/mindUID + + /// The patient's external organs (limbs) and their data, stored as an associated list of lists. + /// List format: limb = list(brute, burn, status, missing, name, max damage) + var/list/limbs = list() + + /// The patient's internal organs and their data, stored as an associated list of lists. + /// List format: organ = list(damage, status, missing, name, max damage, organ tag) + var/list/organs = list() + + /// The patient's DNA + var/datum/dna/genetic_info + +//this is mostly an example +/datum/cloning_data/healthy + + limbs = list( + "head" = HEALTHY_LIMB, + "torso" = HEALTHY_LIMB, + "groin" = HEALTHY_LIMB, + "r_arm" = HEALTHY_LIMB, + "r_hand" = HEALTHY_LIMB, + "l_arm" = HEALTHY_LIMB, + "l_hand" = HEALTHY_LIMB, + "r_leg" = HEALTHY_LIMB, + "r_foot" = HEALTHY_LIMB, + "l_leg" = HEALTHY_LIMB, + "l_foot" = HEALTHY_LIMB + ) + + organs = list( + "heart" = HEALTHY_ORGAN, + "lungs" = HEALTHY_ORGAN, + "liver" = HEALTHY_ORGAN, + "kidneys" = HEALTHY_ORGAN, + "brain" = HEALTHY_ORGAN, + "appendix" = HEALTHY_ORGAN, + "eyes" = HEALTHY_ORGAN + ) + +//The cloning scanner itself. +/obj/machinery/clonescanner + name = "cloning scanner" + desc = "An advanced machine that thoroughly scans the current state of a cadaver for use in cloning." + icon = 'icons/obj/cryogenic2.dmi' + icon_state = "scanner_open" + density = TRUE + anchored = TRUE + + /// The linked cloning console. + var/obj/machinery/computer/cloning/console + /// The tier of scan we can perform. Tier 2 parts and up can scan husks - or a tier 4 scanner and tier 1 laser. + var/scanning_tier + /// The scanner's occupant. + var/mob/living/carbon/human/occupant + /// The scanner's latest scan result + var/datum/cloning_data/last_scan + /// Whether or not we've tried to scan the current patient + var/has_scanned = FALSE + +/obj/machinery/clonescanner/Initialize(mapload) + . = ..() + + if(!console && mapload) //this could be varedited in in mapping, maybe? + console = pick(locate(/obj/machinery/computer/cloning, orange(5, src))) //yes, it's random, but there shouldn't be multiple consoles anyways + + component_parts = list() + component_parts += new /obj/item/circuitboard/clonescanner(null) + component_parts += new /obj/item/stock_parts/scanning_module(null) + component_parts += new /obj/item/stock_parts/micro_laser(null) + component_parts += new /obj/item/stack/sheet/glass(null) + component_parts += new /obj/item/stack/cable_coil(null, 1) + component_parts += new /obj/item/stack/cable_coil(null, 1) + update_icon() + RefreshParts() + +/obj/machinery/clonescanner/RefreshParts() + for(var/obj/item/stock_parts/SP in component_parts) + scanning_tier += SP.rating + +/obj/machinery/clonescanner/Destroy() + if(console) + console.scanner = null + return ..() + +/obj/machinery/clonescanner/MouseDrop_T(atom/movable/O, mob/user) + if(!(ishuman(user) || issilicon(user)) || user.incapacitated()) + return + if(!ishuman(O)) + return + var/mob/living/carbon/human/H = O + if(H.stat != DEAD) + to_chat(user, "You don't think it'd be wise to scan a living being.") + return TRUE + if(occupant) + to_chat(user, "[src] is already occupied!") + return TRUE + + to_chat(user, "You put [H] into the cloning scanner.") + insert_mob(H) + return TRUE + +/obj/machinery/clonescanner/AltClick(mob/user) + if(!occupant) + return + if(issilicon(user)) + remove_mob(occupant) + return + if(!Adjacent(user) || !ishuman(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) + return + remove_mob(occupant) + +/obj/machinery/clonescanner/relaymove(mob/user) + if(user.stat) + return + remove_mob(user) + +/obj/machinery/clonescanner/proc/try_scan(mob/living/carbon/human/scanned) + if(!scanned) + return + + occupant.notify_ghost_cloning() + + has_scanned = TRUE + + if(!scanned.dna || HAS_TRAIT(scanned, TRAIT_GENELESS)) + return SCANNER_MISC + if(HAS_TRAIT(scanned, TRAIT_BADDNA) && scanning_tier < 4) + return SCANNER_ABSORBED + if(HAS_TRAIT(scanned, TRAIT_HUSK) && scanning_tier < 4) + return SCANNER_HUSKED + if(NO_CLONESCAN in scanned.dna.species.species_traits) + return SCANNER_UNCLONEABLE_SPECIES + if(!scanned.ckey || !scanned.client || ischangeling(scanned)) + return SCANNER_NO_SOUL + if(scanned.suiciding || !scanned.get_int_organ(/obj/item/organ/internal/brain)) + return SCANNER_BRAIN_ISSUE + + return scan(scanned) + +/obj/machinery/clonescanner/proc/scan(mob/living/carbon/human/scanned) + var/datum/cloning_data/scan_result = new + + scan_result.name = scanned.dna.real_name + scan_result.mindUID = scanned.mind.UID() + scan_result.genetic_info = scanned.dna.Clone() + + for(var/limb in scanned.dna.species.has_limbs) + if(scanned.bodyparts_by_name[limb]) + var/obj/item/organ/external/active_limb = scanned.bodyparts_by_name[limb] + scan_result.limbs[limb] = list(active_limb.brute_dam, + active_limb.burn_dam, + active_limb.status, + FALSE, + active_limb.name, + active_limb.max_damage) + else + scan_result.limbs[limb] = list(0, 0, 0, TRUE, scanned.dna.species.has_limbs[limb]["descriptor"], 0) //no damage if it's missing! + + for(var/organ in scanned.dna.species.has_organ) + var/obj/item/organ/internal/active_organ = scanned.get_int_organ(scanned.dna.species.has_organ[organ]) //this is icky + if(!istype(active_organ)) + scan_result.organs[organ] = list(0, 0, TRUE, organ, 0, organ) + continue + + scan_result.organs[organ] = list(active_organ.damage, + active_organ.status, + FALSE, + active_organ.name, + active_organ.max_damage, + active_organ.organ_tag) + + last_scan = scan_result + return scan_result + +/obj/machinery/clonescanner/proc/insert_mob(mob/living/carbon/human/inserted) + if(!istype(inserted)) + return + inserted.forceMove(src) + occupant = inserted + update_icon(UPDATE_ICON_STATE) + +/obj/machinery/clonescanner/proc/remove_mob(mob/living/carbon/human/removed) + if(!istype(removed)) + return + removed.forceMove(get_turf(loc)) + occupant = null + update_scan_status() + update_icon(UPDATE_ICON_STATE) + +/obj/machinery/clonescanner/proc/update_scan_status() + last_scan = null + has_scanned = FALSE + +/obj/machinery/clonescanner/update_icon_state() + if(panel_open) + icon_state = "scanner" + (occupant ? "" : "_open") + "_maintenance" + return + if(stat & NOPOWER) + icon_state = "scanner" + return + if(!occupant) + icon_state = "scanner_open" + return + icon_state = "scanner_occupied" + return + + +/obj/machinery/clonescanner/multitool_act(mob/user, obj/item/I) + . = TRUE + if(!I.use_tool(src, user, 0, volume = I.tool_volume)) + return + if(!I.multitool_check_buffer(user)) + return + var/obj/item/multitool/M = I + M.set_multitool_buffer(user, src) + +#undef HEALTHY_LIMB +#undef HEALTHY_ORGAN diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index da24fb361686..668e88b84b24 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -1,5 +1,5 @@ -#define MENU_MAIN 1 -#define MENU_RECORDS 2 +#define TAB_MAIN 1 +#define TAB_DAMAGES_BREAKDOWN 2 /obj/machinery/computer/cloning name = "cloning console" @@ -7,116 +7,151 @@ icon_keyboard = "med_key" icon_screen = "dna" circuit = /obj/item/circuitboard/cloning - req_access = list(ACCESS_HEADS) //Only used for record deletion right now. - var/obj/machinery/dna_scannernew/scanner = null //Linked scanner. For scanning. - var/list/pods = null //Linked cloning pods. - var/list/temp = null - var/list/scantemp = null - var/menu = MENU_MAIN //Which menu screen to display - var/list/records = null - var/datum/dna2/record/active_record = null - var/loading = 0 // Nice loading text - var/autoprocess = 0 - var/obj/machinery/clonepod/selected_pod - // 0: Standard body scan - // 1: The "Best" scan available - var/scan_mode = 1 + req_access = list(ACCESS_MEDICAL) - light_color = LIGHT_COLOR_DARKBLUE + /// The currently-selected cloning pod. + var/obj/machinery/clonepod/selected_pod + /// A list of all linked cloning pods. + var/list/pods = list() + /// Our linked cloning scanner. + var/obj/machinery/clonescanner/scanner + /// Which tab we're currently on + var/tab = TAB_MAIN + /// What feedback to give for the most recent scan. + var/feedback + /// The desired outcome of the cloning process. + var/datum/cloning_data/desired_data + /// Whether the ID lock is on or off + var/locked = TRUE + + COOLDOWN_DECLARE(scancooldown) /obj/machinery/computer/cloning/Initialize(mapload) . = ..() - pods = list() - records = list() - set_scan_temp("Scanner ready.", "good") - updatemodules() + + if(length(pods) && scanner) + return + + if(!mapload) + return //cloning setups built by players need to be linked manually + + pods += locate(/obj/machinery/clonepod, orange(5, src)) + scanner = locate(/obj/machinery/clonescanner, orange(5, src)) + selected_pod = pick(pods) + + new /obj/item/book/manual/medical_cloning(get_turf(src)) //hopefully this stems the tide of mhelps during the TM... /obj/machinery/computer/cloning/Destroy() - releasecloner() + if(scanner) + scanner.console = null + if(pods) + for(var/obj/machinery/clonepod/P in pods) + P.console = null return ..() -/obj/machinery/computer/cloning/process() - if(!scanner || !pods.len || !autoprocess || stat & NOPOWER) +/obj/machinery/computer/cloning/examine(mob/user) + . = ..() + . += "[src] is currently [locked ? "locked" : "unlocked"], and can be [locked ? "unlocked" : "locked"] by swiping an ID with medical access on it." + +/obj/machinery/computer/cloning/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id) || istype(I, /obj/item/pda)) + if(allowed(user)) + locked = !locked + to_chat(user, "Access restriction is now [locked ? "enabled" : "disabled"].") + else + to_chat(user, "Access denied.") + return + + if(!ismultitool(I)) + return ..() + + var/obj/item/multitool/M = I + if(!M.buffer) + to_chat(user, "[M]'[M.p_s()] buffer is empty!") return - if(scanner.occupant && can_autoprocess()) - scan_mob(scanner.occupant) + if(istype(M.buffer, /obj/machinery/clonepod)) + var/obj/machinery/clonepod/buffer_pod = M.buffer + if(buffer_pod.console == src) + to_chat(user, "[M.buffer] is already linked!") + return - if(!LAZYLEN(records)) + pods += M.buffer + buffer_pod.console = src + to_chat(user, "[M.buffer] was successfully added to the cloning pod array.") + if(!selected_pod) + selected_pod = buffer_pod return - for(var/obj/machinery/clonepod/pod in pods) - if(!(pod.occupant || pod.mess) && (pod.efficiency > 5)) - for(var/datum/dna2/record/R in records) - if(!(pod.occupant || pod.mess)) - if(pod.growclone(R)) - records.Remove(R) - -/obj/machinery/computer/cloning/proc/updatemodules() - src.scanner = findscanner() - releasecloner() - findcloner() - if(!selected_pod && pods.len) - selected_pod = pods[1] - -/obj/machinery/computer/cloning/proc/findscanner() - //Try to find scanner on adjacent tiles first - for(var/obj/machinery/dna_scannernew/scanner in orange(1, src)) - return scanner - - //Then look for a free one in the area - for(var/obj/machinery/dna_scannernew/S in get_area(src)) - return S - - return FALSE - -/obj/machinery/computer/cloning/proc/releasecloner() - for(var/obj/machinery/clonepod/P in pods) - P.connected = null - P.name = initial(P.name) - pods.Cut() - -/obj/machinery/computer/cloning/proc/findcloner() - var/num = 1 - for(var/obj/machinery/clonepod/P in get_area(src)) - if(!P.connected) - pods += P - P.connected = src - P.name = "[initial(P.name)] #[num++]" - -/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob, params) - if(istype(W, /obj/item/multitool)) - var/obj/item/multitool/M = W - if(M.buffer && istype(M.buffer, /obj/machinery/clonepod)) - var/obj/machinery/clonepod/P = M.buffer - if(P && !(P in pods)) - pods += P - P.connected = src - P.name = "[initial(P.name)] #[pods.len]" - to_chat(user, "You connect [P] to [src].") - else - return ..() + if(istype(M.buffer, /obj/machinery/clonescanner)) + var/obj/machinery/clonescanner/buffer_scanner = M.buffer + if(scanner) + to_chat(user, "There's already a linked scanner!") + return + + scanner = buffer_scanner + buffer_scanner.console = src + to_chat(user, "[M.buffer] was successfully linked.") + return + to_chat(user, "[M.buffer] cannot be linked to [src].") + return -/obj/machinery/computer/cloning/attack_ai(mob/user as mob) +/obj/machinery/computer/cloning/attack_ai(mob/user) return attack_hand(user) -/obj/machinery/computer/cloning/attack_hand(mob/user as mob) +/obj/machinery/computer/cloning/attack_hand(mob/user) + . = ..() add_fingerprint(user) if(stat & (BROKEN|NOPOWER)) return - updatemodules() ui_interact(user) -/obj/machinery/computer/cloning/ui_state(mob/user) - return GLOB.default_state +/obj/machinery/computer/cloning/emag_act(mob/user) + . = ..() + if(!emagged) + emagged = TRUE + to_chat(user, "You short out the ID scanner on [src].") + else + to_chat(user, "[src]'s ID scanner is already broken!") + + return TRUE + +/obj/machinery/computer/cloning/proc/generate_healthy_data(datum/cloning_data/patient_data) + var/datum/cloning_data/desired_data = new + + for(var/limb in patient_data.limbs) + desired_data.limbs[limb] = list(0, + 0, + 0, + FALSE, + patient_data.limbs[limb][5], + patient_data.limbs[limb][6]) + + for(var/organ in patient_data.organs) + desired_data.organs[organ] = list(0, + 0, + FALSE, + patient_data.organs[organ][4], + patient_data.organs[organ][5]) + + return desired_data /obj/machinery/computer/cloning/ui_interact(mob/user, datum/tgui/ui = null) if(stat & (NOPOWER|BROKEN)) return + if(!allowed(user) && locked && !isobserver(user)) + to_chat(user, "Access denied.") + if(ui) + ui.close() + return + + var/datum/asset/simple/cloning/assets = get_asset_datum(/datum/asset/simple/cloning) + assets.send(user) + ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "CloningConsole", "Cloning Console") @@ -128,60 +163,73 @@ ) /obj/machinery/computer/cloning/ui_data(mob/user) - var/data[0] - data["menu"] = src.menu - data["scanner"] = sanitize("[src.scanner]") + var/list/data = list() - var/canpodautoprocess = 0 - if(pods.len) - data["numberofpods"] = src.pods.len + data["tab"] = tab - var/list/tempods[0] - for(var/obj/machinery/clonepod/pod in pods) - if(pod.efficiency > 5) - canpodautoprocess = 1 - - var/status = "idle" - if(pod.mess) - status = "mess" - else if(pod.occupant && !(pod.stat & NOPOWER)) - status = "cloning" - tempods.Add(list(list( - "pod" = "\ref[pod]", - "name" = sanitize(capitalize(pod.name)), - "biomass" = pod.biomass, - "status" = status, - "progress" = (pod.occupant && pod.occupant.stat != DEAD) ? pod.get_completion() : 0 - ))) - data["pods"] = tempods - - data["loading"] = loading - data["autoprocess"] = autoprocess - data["can_brainscan"] = can_brainscan() // You'll need tier 4s for this - data["scan_mode"] = scan_mode - - if(scanner && pods.len && ((scanner.scan_level > 2) || canpodautoprocess)) - data["autoallowed"] = 1 + if(scanner) + data["has_scanner"] = TRUE + else + data["has_scanner"] = FALSE + + if(scanner) + data["has_scanned"] = scanner.has_scanned else - data["autoallowed"] = 0 - if(src.scanner) - data["occupant"] = src.scanner.occupant - data["locked"] = src.scanner.locked - data["temp"] = temp - data["scantemp"] = scantemp - data["selected_pod"] = "\ref[selected_pod]" - var/list/temprecords[0] - for(var/datum/dna2/record/R in records) - var/tempRealName = R.dna.real_name - temprecords.Add(list(list("record" = "\ref[R]", "realname" = sanitize(tempRealName)))) - data["records"] = temprecords - - if(selected_pod && (selected_pod in pods) && selected_pod.biomass >= CLONER_BIOMASS_REQUIRED) - data["podready"] = 1 + data["has_scanned"] = FALSE + + if(scanner?.last_scan) + data["patient_limb_data"] = scanner.last_scan.limbs + var/list/allLimbs = list() + for(var/limb in scanner.last_scan.limbs) + allLimbs += limb + data["limb_list"] = allLimbs + + data["patient_organ_data"] = scanner.last_scan.organs + var/list/allOrgans = list() + for(var/organ in scanner.last_scan.organs) + allOrgans += organ + data["organ_list"] = allOrgans + + if(desired_data) + data["desired_limb_data"] = desired_data.limbs + data["desired_organ_data"] = desired_data.organs + + data["feedback"] = feedback + + if(feedback && feedback["color"] == "good") + data["scan_successful"] = TRUE else - data["podready"] = 0 + data["scan_successful"] = FALSE - data["modal"] = ui_modal_data(src) + if(scanner?.occupant) + data["scanner_has_patient"] = TRUE + else + data["scanner_has_patient"] = FALSE + + var/list/pod_data = list() + if(length(pods)) + for(var/obj/machinery/clonepod/pod in pods) + pod_data += list(list("uid" = pod.UID(), + "cloning" = pod.currently_cloning, + "clone_progress" = pod.clone_progress, + "biomass" = pod.biomass, + "biomass_storage_capacity" = pod.biomass_storage_capacity, + "sanguine_reagent" = pod.reagents.get_reagent_amount("sanguine_reagent"), + "osseous_reagent" = pod.reagents.get_reagent_amount("osseous_reagent"))) + + if(selected_pod) + data["selected_pod_data"] = list("biomass" = selected_pod.biomass, + "biomass_storage_capacity" = selected_pod.biomass_storage_capacity, + "sanguine_reagent" = selected_pod.reagents.get_reagent_amount("sanguine_reagent"), + "osseous_reagent" = selected_pod.reagents.get_reagent_amount("osseous_reagent"), + "max_reagent_capacity" = selected_pod.reagents.maximum_volume) + data["selected_pod_UID"] = selected_pod.UID() + if(scanner?.last_scan && desired_data) + var/list/costs = selected_pod.get_cloning_cost(scanner.last_scan, desired_data) + data["cloning_cost"] = costs + + data["pods"] = pod_data + data["pod_amount"] = length(pods) return data @@ -191,273 +239,119 @@ if(stat & (NOPOWER|BROKEN)) return - . = TRUE - switch(ui_modal_act(src, action, params)) - if(UI_MODAL_ANSWER) - if(params["id"] == "del_rec" && text2num(params["answer"]) && active_record) - if(!allowed(usr)) - set_temp("Access denied.", "danger") - return - - records.Remove(active_record) - qdel(active_record) - set_temp("Record deleted.", "success") - menu = MENU_RECORDS - return + var/datum/cloning_data/patient_data = scanner?.last_scan //For readability, mostly switch(action) + if("menu") + switch(text2num(params["tab"])) + if(TAB_MAIN) + tab = TAB_MAIN + scanner?.update_scan_status() + return TRUE + if(TAB_DAMAGES_BREAKDOWN) + tab = TAB_DAMAGES_BREAKDOWN + return TRUE + if("select_pod") + selected_pod = locateUID(params["uid"]) + return TRUE + if("clone") + var/cost = selected_pod.get_cloning_cost(scanner.last_scan, desired_data) + if(selected_pod.biomass < cost[BIOMASS_COST] || (selected_pod.reagents.get_reagent_amount("sanguine_reagent") < cost[SANGUINE_COST]) || selected_pod.reagents.get_reagent_amount("osseous_reagent") < cost[OSSEOUS_COST]) + feedback = list("text" = "The cloning operation is too expensive!", "color" = "bad") + else + selected_pod.start_cloning(scanner.last_scan, desired_data) + scanner?.update_scan_status() + feedback = list("text" = "Beginning cloning operation...", "color" = "good") + return TRUE if("scan") - if(!scanner || !scanner.occupant || loading) - return - set_scan_temp("Scanner ready.", "good") - loading = TRUE + if(!COOLDOWN_FINISHED(src, scancooldown)) + feedback = list("text" = "The scanning array is still calibrating! Please wait...", "color" = "average") + return TRUE - spawn(20) - if(can_brainscan() && scan_mode) - scan_mob(scanner.occupant, scan_brain = TRUE) - else - scan_mob(scanner.occupant) - loading = FALSE - SStgui.update_uis(src) - if("autoprocess") - autoprocess = text2num(params["on"]) > 0 - if("lock") - if(isnull(scanner) || !scanner.occupant) //No locking an open scanner. - return - scanner.locked = !scanner.locked - if("view_rec") - var/ref = params["ref"] - if(!length(ref)) - return - active_record = locate(ref) - if(istype(active_record)) - if(isnull(active_record.ckey)) - qdel(active_record) - set_temp("Error: Record corrupt.", "danger") - else - var/obj/item/bio_chip/health/H = null - if(active_record.implant) - H = locate(active_record.implant) - var/list/payload = list( - activerecord = "\ref[active_record]", - health = (H && istype(H)) ? H.sensehealth() : "", - realname = sanitize(active_record.dna.real_name), - unidentity = active_record.dna.uni_identity, - strucenzymes = active_record.dna.struc_enzymes, - ) - ui_modal_message(src, action, "", null, payload) - else - active_record = null - set_temp("Error: Record missing.", "danger") - if("del_rec") - if(!active_record) - return - ui_modal_boolean(src, action, "Please confirm that you want to delete the record:", yes_text = "Delete", no_text = "Cancel") - if("refresh") - SStgui.update_uis(src) - if("selectpod") - var/ref = params["ref"] - if(!length(ref)) - return - var/obj/machinery/clonepod/selected = locate(ref) - if(istype(selected) && (selected in pods)) - selected_pod = selected - if("clone") - var/ref = params["ref"] - if(!length(ref)) + if(!scanner.occupant) return - var/datum/dna2/record/C = locate(ref) - //Look for that player! They better be dead! - if(istype(C)) - ui_modal_clear(src) - //Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs. - if(!length(pods)) - set_temp("Error: No cloning pod detected.", "danger") + + COOLDOWN_START(src, scancooldown, 5 SECONDS) + var/scanner_result = scanner.try_scan(scanner.occupant) + switch(scanner_result) + if(SCANNER_MISC) + feedback = list("text" = "Unable to analyze patient's genetic sequence.", "color" = "bad") + if(SCANNER_UNCLONEABLE_SPECIES) + feedback = list("text" = "[scanner.occupant.dna.species.name_plural] cannot be scanned.", "color" = "bad") + if(SCANNER_HUSKED) + feedback = list("text" = "The patient is husked.", "color" = "bad") + if(SCANNER_ABSORBED) + feedback = list("text" = "The patient cannot be scanned due to a lack of biofluids.", "color" = "bad") + if(SCANNER_NO_SOUL) + feedback = list("text" = "Failed to sequence the patient's brain. Further attempts may succeed.", "color" = "average") + if(SCANNER_BRAIN_ISSUE) + feedback = list("text" = "The patient's brain is inactive or missing.", "color" = "bad") else - var/obj/machinery/clonepod/pod = selected_pod - var/cloneresult - if(!selected_pod) - set_temp("Error: No cloning pod selected.", "danger") - else if(pod.occupant) - set_temp("Error: The cloning pod is currently occupied.", "danger") - else if(pod.biomass < CLONER_BIOMASS_REQUIRED) - set_temp("Error: Not enough biomass.", "danger") - else if(pod.mess) - set_temp("Error: The cloning pod is malfunctioning.", "danger") - else if(!GLOB.configuration.general.enable_cloning) - set_temp("Error: Unable to initiate cloning cycle.", "danger") + var/datum/cloning_data/scan = scanner_result + if((scan.mindUID == patient_data?.mindUID) || (scan.mindUID == selected_pod?.patient_data?.mindUID)) + feedback = list("text" = "Patient has already been scanned.", "color" = "average") + return TRUE + feedback = list("text" = "Successfully scanned the patient.", "color" = "good") + desired_data = generate_healthy_data(scan) + return TRUE + if("fix_all") + desired_data = generate_healthy_data(scanner.last_scan) + return TRUE + if("fix_none") + desired_data = scanner.last_scan + return TRUE + if("toggle_limb_repair") + switch(params["type"]) + if("replace") + if(desired_data.limbs[params["limb"]][4]) + desired_data.limbs[params["limb"]][4] = FALSE else - cloneresult = pod.growclone(C) - if(cloneresult) - set_temp("Initiating cloning cycle...", "success") - records.Remove(C) - qdel(C) - menu = MENU_MAIN - else - set_temp("Error: Initialisation failure.", "danger") - else - set_temp("Error: Data corruption.", "danger") - if("menu") - menu = clamp(text2num(params["num"]), MENU_MAIN, MENU_RECORDS) - if("toggle_mode") - if(loading) - return - if(can_brainscan()) - scan_mode = !scan_mode - else - scan_mode = FALSE + desired_data.limbs[params["limb"]][4] = TRUE + if("damage") + if(desired_data.limbs[params["limb"]][1] || desired_data.limbs[params["limb"]][2]) + desired_data.limbs[params["limb"]][1] = 0 + desired_data.limbs[params["limb"]][2] = 0 + else + desired_data.limbs[params["limb"]][1] = patient_data.limbs[params["limb"]][1] + desired_data.limbs[params["limb"]][2] = patient_data.limbs[params["limb"]][2] + if("bone") + if(desired_data.limbs[params["limb"]][3] & ORGAN_BROKEN) + desired_data.limbs[params["limb"]][3] &= ~ORGAN_BROKEN + else + desired_data.limbs[params["limb"]][3] |= ORGAN_BROKEN + if("ib") + if(desired_data.limbs[params["limb"]][3] & ORGAN_INT_BLEEDING) + desired_data.limbs[params["limb"]][3] &= ~ORGAN_INT_BLEEDING + else + desired_data.limbs[params["limb"]][3] |= ORGAN_INT_BLEEDING + if("critburn") + if(desired_data.limbs[params["limb"]][3] & ORGAN_BURNT) + desired_data.limbs[params["limb"]][3] &= ~ORGAN_BURNT + else + desired_data.limbs[params["limb"]][3] |= ORGAN_BURNT + return TRUE + if("toggle_organ_repair") + switch(params["type"]) + if("replace") + if(desired_data.organs[params["organ"]][3] || desired_data.organs[params["organ"]][2]) + desired_data.organs[params["organ"]][3] = FALSE + desired_data.organs[params["organ"]][2] = 0 + else + desired_data.organs[params["organ"]][3] = patient_data.organs[params["organ"]][3] + desired_data.organs[params["organ"]][2] = patient_data.organs[params["organ"]][2] + if("damage") + if(desired_data.organs[params["organ"]][1]) + desired_data.organs[params["organ"]][1] = 0 + else + desired_data.organs[params["organ"]][1] = patient_data.organs[params["organ"]][1] + return TRUE if("eject") - if(usr.incapacitated() || !scanner || loading) - return - scanner.eject_occupant(usr) - scanner.add_fingerprint(usr) - if("cleartemp") - temp = null - else - return FALSE + if(scanner?.occupant) + scanner.remove_mob(scanner.occupant) + return TRUE - src.add_fingerprint(usr) -/obj/machinery/computer/cloning/proc/scan_mob(mob/living/carbon/human/subject as mob, scan_brain = 0) - if(stat & NOPOWER) - return - if(scanner.stat & (NOPOWER|BROKEN)) - return - if(scan_brain && !can_brainscan()) - return - if(isnull(subject) || (!(ishuman(subject))) || (!subject.dna)) - if(isalien(subject)) - set_scan_temp("Safety interlocks engaged. Nanotrasen Directive 7b forbids the cloning of biohazardous alien species.", "bad") - SStgui.update_uis(src) - return - // can add more conditions for specific non-human messages here - else - set_scan_temp("Subject species is not clonable.", "bad") - SStgui.update_uis(src) - return - if(NO_CLONESCAN in subject.dna.species.species_traits) - set_scan_temp("[subject.dna.species.name_plural] are not clonable. Alternative revival methods recommended.", "bad") - SStgui.update_uis(src) - return - if(subject.get_int_organ(/obj/item/organ/internal/brain)) - var/obj/item/organ/internal/brain/Brn = subject.get_int_organ(/obj/item/organ/internal/brain) - if(istype(Brn)) - if(Brn.dna.species.name == "Machine") - set_scan_temp("No organic tissue detected within subject. Alternative revival methods recommended.", "bad") - SStgui.update_uis(src) - return - if(NO_CLONESCAN in Brn.dna.species.species_traits) - set_scan_temp("[Brn.dna.species.name_plural] are not clonable. Alternative revival methods recommended.", "bad") - SStgui.update_uis(src) - return - if(!subject.get_int_organ(/obj/item/organ/internal/brain)) - set_scan_temp("No brain detected in subject.", "bad") - SStgui.update_uis(src) - return - if(subject.suiciding) - set_scan_temp("Subject has committed suicide and is not clonable.", "bad") - SStgui.update_uis(src) - return - if(HAS_TRAIT(subject, TRAIT_BADDNA) && src.scanner.scan_level < 2) - set_scan_temp("Insufficient level of biofluids detected within subject. Scanner upgrades may be required to improve scan capabilities.", "bad") - SStgui.update_uis(src) - return - if(HAS_TRAIT(subject, TRAIT_HUSK) && src.scanner.scan_level < 2) - set_scan_temp("Subject is husked. Treat condition or upgrade scanning module to proceed with scan.", "bad") - SStgui.update_uis(src) - return - if((!subject.ckey) || (!subject.client)) - set_scan_temp("Subject's brain is not responding. Further attempts after a short delay may succeed.", "bad") - SStgui.update_uis(src) - return - if(!isnull(find_record(subject.ckey))) - set_scan_temp("Subject already in database.") - SStgui.update_uis(src) - return - if(subject.stat != DEAD) - set_scan_temp("Subject is not dead.", "bad") - SStgui.update_uis(src) - return + add_fingerprint(usr) - for(var/obj/machinery/clonepod/pod in pods) - if(pod.occupant && pod.clonemind == subject.mind) - set_scan_temp("Subject already getting cloned.") - SStgui.update_uis(src) - return - - subject.dna.check_integrity() - - var/datum/dna2/record/R = new /datum/dna2/record() - R.ckey = subject.ckey - var/extra_info = "" - if(scan_brain) - var/obj/item/organ/B = subject.get_int_organ(/obj/item/organ/internal/brain) - B.dna.check_integrity() - R.dna=B.dna.Clone() - if(NO_CLONESCAN in R.dna.species.species_traits) - extra_info = "Proper genetic interface not found, defaulting to genetic data of the body." - R.dna.species = new subject.dna.species.type - R.id= copytext(md5(B.dna.real_name), 2, 6) - R.name=B.dna.real_name - else - R.dna=subject.dna.Clone() - R.id= copytext(md5(subject.real_name), 2, 6) - R.name=R.dna.real_name - - R.types=DNA2_BUF_UI|DNA2_BUF_UE|DNA2_BUF_SE - R.languages=subject.languages - //Add an implant if needed - var/obj/item/bio_chip/health/imp = locate(/obj/item/bio_chip/health, subject) - if(!imp) - imp = new /obj/item/bio_chip/health(subject) - imp.implant(subject) - R.implant = "\ref[imp]" - - if(!isnull(subject.mind)) //Save that mind so traitors can continue traitoring after cloning. - R.mind = "\ref[subject.mind]" - - src.records += R - set_scan_temp("Subject successfully scanned. [extra_info]", "good") - SStgui.update_uis(src) - -//Find a specific record by key. -/obj/machinery/computer/cloning/proc/find_record(find_key) - var/selected_record = null - for(var/datum/dna2/record/R in src.records) - if(R.ckey == find_key) - selected_record = R - break - return selected_record - -/obj/machinery/computer/cloning/proc/can_autoprocess() - return (scanner && scanner.scan_level > 2) - -/obj/machinery/computer/cloning/proc/can_brainscan() - return (scanner && scanner.scan_level > 3) - -/** - * Sets a temporary message to display to the user - * - * Arguments: - * * text - Text to display, null/empty to clear the message from the UI - * * style - The style of the message: (color name), info, success, warning, danger - */ -/obj/machinery/computer/cloning/proc/set_temp(text = "", style = "info", update_now = FALSE) - temp = list(text = text, style = style) - if(update_now) - SStgui.update_uis(src) - -/** - * Sets a temporary scan message to display to the user - * - * Arguments: - * * text - Text to display, null/empty to clear the message from the UI - * * color - The color of the message: (color name) - */ -/obj/machinery/computer/cloning/proc/set_scan_temp(text = "", color = "", update_now = FALSE) - scantemp = list(text = text, color = color) - if(update_now) - SStgui.update_uis(src) - -#undef MENU_MAIN -#undef MENU_RECORDS +#undef TAB_MAIN +#undef TAB_DAMAGES_BREAKDOWN diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index e4d89c6f7383..e3c9877aa5c3 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -824,19 +824,19 @@ to destroy them and players will be able to make replacements. origin_tech = "programming=2;biotech=2" req_components = list( /obj/item/stack/cable_coil = 2, - /obj/item/stock_parts/scanning_module = 2, + /obj/item/stock_parts/scanning_module = 1, + /obj/item/stock_parts/matter_bin = 1, /obj/item/stock_parts/manipulator = 2, /obj/item/stack/sheet/glass = 1) /obj/item/circuitboard/clonescanner board_name = "Cloning Scanner" icon_state = "medical" - build_path = /obj/machinery/dna_scannernew + build_path = /obj/machinery/clonescanner board_type = "machine" origin_tech = "programming=2;biotech=2" req_components = list( /obj/item/stock_parts/scanning_module = 1, - /obj/item/stock_parts/manipulator = 1, /obj/item/stock_parts/micro_laser = 1, /obj/item/stack/sheet/glass = 1, /obj/item/stack/cable_coil = 2,) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 02bc0b34b199..bd691273d8a0 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -329,11 +329,6 @@ I.forceMove(src) handle_contents(I) - for(var/obj/machinery/computer/cloning/cloner in GLOB.machines) - for(var/datum/dna2/record/R in cloner.records) - if(occupant.mind == locate(R.mind)) - cloner.records.Remove(R) - //Delete all items not on the preservation list. var/list/items = contents items -= occupant // Don't delete the occupant diff --git a/code/game/objects/items/weapons/disks.dm b/code/game/objects/items/weapons/disks.dm index 50f6c04919cc..b982a0d44e59 100644 --- a/code/game/objects/items/weapons/disks.dm +++ b/code/game/objects/items/weapons/disks.dm @@ -5,3 +5,70 @@ icon_state = "datadisk0" drop_sound = 'sound/items/handling/disk_drop.ogg' pickup_sound = 'sound/items/handling/disk_pickup.ogg' + +/obj/item/disk/data + name = "Cloning Data Disk" + icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. + var/datum/dna2/record/buf = null + var/read_only = FALSE //Well,it's still a floppy disk + +/obj/item/disk/data/proc/initialize_data() + buf = new + buf.dna = new + +/obj/item/disk/data/Destroy() + QDEL_NULL(buf) + return ..() + +/obj/item/disk/data/demo + name = "data disk - 'God Emperor of Mankind'" + read_only = TRUE + +/obj/item/disk/data/demo/New() + . = ..() + initialize_data() + buf.types = DNA2_BUF_UE|DNA2_BUF_UI + buf.dna.real_name = "God Emperor of Mankind" + buf.dna.unique_enzymes = md5(buf.dna.real_name) + buf.dna.UI = list(0x066,0x000,0x033,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0xAF0,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x000,0x033,0x066,0x0FF,0x4DB,0x002,0x690,0x000,0x000,0x000,0x328,0x045,0x5FC,0x053,0x035,0x035,0x035) + if(length(buf.dna.UI) != DNA_UI_LENGTH) //If there's a disparity b/w the dna UI string lengths, 0-fill the extra blocks in this UI. + for(var/i in length(buf.dna.UI) to DNA_UI_LENGTH) + buf.dna.UI += 0x000 + buf.dna.ResetSE() + buf.dna.UpdateUI() + +/obj/item/disk/data/monkey + name = "data disk - 'Mr. Muggles'" + read_only = 1 + +/obj/item/disk/data/monkey/New() + . = ..() + initialize_data() + buf.types = DNA2_BUF_SE + var/list/new_SE = list(0x098,0x3E8,0x403,0x44C,0x39F,0x4B0,0x59D,0x514,0x5FC,0x578,0x5DC,0x640,0x6A4) + for(var/i = length(new_SE); i <= DNA_SE_LENGTH; i++) + new_SE += rand(1, 1024) + buf.dna.SE = new_SE + buf.dna.SetSEValueRange(GLOB.monkeyblock, 0xDAC, 0xFFF) + +//Disk stuff. +/obj/item/disk/data/New() + . = ..() + var/diskcolor = pick(0, 1, 2) + icon_state = "datadisk[diskcolor]" + +/obj/item/disk/data/attack_self(mob/user) + read_only = !read_only + to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") + +/obj/item/disk/data/examine(mob/user) + . = ..() + . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." + +/obj/item/storage/box/disks + name = "Diskette Box" + icon_state = "disk_kit" + +/obj/item/storage/box/disks/populate_contents() + for(var/i in 1 to 7) + new /obj/item/disk/data(src) diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 3e15b3b06e92..d14a4c0e2b5f 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -348,11 +348,11 @@ "}) /obj/item/book/manual/medical_cloning - name = "Cloning techniques of the 26th century" - desc = "A clinical explanation on how to resurrect your patients." - icon_state ="bookCloning" - author = "Medical Journal, volume 3" - title = "Cloning techniques of the 26th century" + name = "Introduction to Cloning" + desc = "A guide covering the basics of cloning." + icon_state = "bookCloning" + author = "Bioarchitect for the Pillars of Creation" //this is a valid nian name, right? + title = "Introduction to Cloning" pages = list({" @@ -366,60 +366,59 @@ -

How to Clone People

- So thereÂ’s 50 dead people lying on the floor, chairs are spinning like no tomorrow and you havenÂ’t the foggiest idea of what to do? Not to worry! This guide is intended to teach you how to clone people and how to do it right, in a simple step-by-step process! If at any point of the guide you have a mental meltdown, genetics probably isnÂ’t for you and you should get a job-change as soon as possible before youÂ’re sued for malpractice. +

How to Clone People

+ Picture the scene: there's five corpses surrounding you, the Chief Medical Officer is yelling something \ + about terror spiders into their radio, and you only graduated medical school last week. What are you supposed to do?
\ + Well, Thinktronics Corporation is proud to present you the new and improved TTC-5601 cloning device - capable of \ + economically resuscitating even the most damaged of bodies. What follows is a guide on how to use this newer model \ + of cloning machine and where it differs from previous models.
    -
  1. Acquire body
  2. -
  3. Strip body
  4. -
  5. Put body in cloning machine
  6. -
  7. Scan body
  8. -
  9. Clone body
  10. -
  11. Get clean Structurel Enzymes for the body
  12. -
  13. Put body in morgue
  14. -
  15. Await cloned body
  16. -
  17. Use the clean SW injector
  18. -
  19. Give person clothes back
  20. -
  21. Send person on their way
  22. +
  23. Preparation
  24. +
  25. Load into Cloning Scanner
  26. +
  27. Scan Patient
  28. +
  29. Configure Device
  30. +
  31. Clone
  32. +
  33. Finish Procedure
-

Step 1: Acquire body

- This is pretty much vital for the process because without a body, you cannot clone it. Usually, bodies will be brought to you, so you do not need to worry so much about this step. If you already have a body, great! Move on to the next step. - -

Step 2: Strip body

- The cloning machine does not like abiotic items. What this means is you canÂ’t clone anyone if theyÂ’re wearing clothes, so take all of it off. If itÂ’s just one person, itÂ’s courteous to put their possessions in the closet. If you have about seven people awaiting cloning, just leave the piles where they are, but donÂ’t mix them around and for GodÂ’s sake donÂ’t let people in to steal them. - -

Step 3: Put body in cloning machine

- Grab the body and then put it inside the DNA modifier. If you cannot do this, then you messed up at Step 2. Go back and check you took EVERYTHING off - a commonly missed item is their headset. - -

Step 4: Scan body

- Go onto the computer and scan the body by pressing ‘Scan - ’. If you’re successful, they will be added to the records (note that this can be done at any time, even with living people, so that they can be cloned without a body in the event that they are lying dead on port solars and didn‘t turn on their suit sensors)! If not, and it says “Error: Mental interface failure.”, then they have left their bodily confines and are one with the spirits. If this happens, just shout at them to get back in their body, click ‘Refresh‘ and try scanning them again. If there’s no success, threaten them with gibbing. Still no success? Skip over to Step 7 and don‘t continue after it, as you have an unresponsive body and it cannot be cloned. If you got “Error: Unable to locate valid genetic data.“, you are trying to clone a monkey - start over. - -

Step 5: Clone body

- Now that the body has a record, click ’View Records’, click the subject’s name, and then click ‘Clone’ to start the cloning process. Congratulations! You’re halfway there. Remember not to ‘Eject’ the cloning pod as this will kill the developing clone and you’ll have to start the process again. - -

Step 6: Get clean SEs for body

- Cloning is a finicky and unreliable process. Whilst it will most certainly bring someone back from the dead, they can have any number of nasty disabilities given to them during the cloning process! For this reason, you need to prepare a clean, defect-free Structural Enzyme (SE) injection for when they’re done. If you’re a competent Geneticist, you will already have one ready on your working computer. If, for any reason, you do not, then eject the body from the DNA modifier (NOT THE CLONING POD) and take it next door to the Genetics research room. Put the body in one of those DNA modifiers and then go onto the console. Go into View/Edit/Transfer Buffer, find an open slot and click “SE“ to save it. Then click ‘Injector’ to get the SEs in syringe form. Put this in your pocket or something for when the body is done. - -

Step 7: Put body in morgue

- Now that the cloning process has been initiated and you have some clean Structural Enzymes, you no longer need the body! Drag it to the morgue and tell the Chef over the radio that they have some fresh meat waiting for them in there. To put a body in a morgue bed, simply open the tray, grab the body, put it on the open tray, then close the tray again. Use one of the nearby pens to label the bed “CHEF MEAT” in order to avoid confusion. - -

Step 8: Await cloned body

- Now go back to the lab and wait for your patient to be cloned. It wonÂ’t be long now, I promise. - -

Step 9: Use the clean SE injector on person

- Has your body been cloned yet? Great! As soon as the guy pops out, grab your injector and jab it in them. Once youÂ’ve injected them, they now have clean Structural Enzymes and their defects, if any, will disappear in a short while. - -

Step 10: Give person clothes back

- Obviously the person will be naked after they have been cloned. Provided you werenÂ’t an irresponsible little shit, you should have protected their possessions from thieves and should be able to give them back to the patient. No matter how cruel you are, itÂ’s simply against protocol to force your patients to walk outside naked. - -

Step 11: Send person on their way

- Give the patient one last check-over - make sure they donÂ’t still have any defects and that they have all their possessions. Ask them how they died, if they know, so that you can report any foul play over the radio. Once youÂ’re done, your patient is ready to go back to work! Chances are they do not have Medbay access, so you should let them out of Genetics and the Medbay main entrance. - -

If youÂ’ve gotten this far, congratulations! You have mastered the art of cloning. Now, the real problem is how to resurrect yourself after that traitor had his way with you for cloning his target. - - - +

Step 1: Preparation

+ Your patient must be dead to clone them (as of the Cloning Regulatory Act of 2533). Therefore, make sure that \ + they are deceased before proceeding, and ideally try to revive them via defibrillation! If that fails, however, \ + you should strip them of their equipment and check to make sure the cloning pod is loaded with, at least, 250 \ + biomass.
+ If your patient has a lot of damage, it'll take a lot of biomass to clone them! If you do not have ample biomass \ + or simply want to conserve it, try to tend to the cadaver's wounds before proceeding. In addition, fixing broken \ + bones and internal bleeds via cloning will consume Osseous Reagent and Sanguine Reagent respectively - these are \ + both much harder to replenish than biomass, so consider being polite to your chemists and fixing these via \ + surgery instead. + +

Step 2: Load into Cloning Scanner

+ After stripping your patient, load them into the cloning device's scanning machine, as you would with any other \ + device. + +

Step 3: Scan Patient

+ Access the cloning device's terminal, then navigate to the Damage Configuration menu and click 'scan.' If you see \ + 'Scan Successful' - great! Move on to the next step. If not, the device will inform you about what went wrong with \ + the process. If it says it failed to sequence the patient's brain, try to scan them again in a few seconds. \ + +

Step 4: Configure Device

+ This step is where the TTC-5601 cloning device diverges from its earlier models. Its advanced systems allow you to \ + conserve resources and elect to not fix certain damages, or elect to fix all damages - all on the fly! Keep \ + in mind that if you're short on resources, you'll have to leave some damages on the patient in order to clone \ + them. Once you're done tweaking settings, proceed to the next step. + +

Step 5: Clone

+ This is the simplest, but most important step. Simply press 'Clone' in the Damage Configuration menu, and the machine \ + will begin the process of cloning. The process is fully automatic, so feel free to take care of other chores in the \ + meanwhile - like moving the scanned cadaver to the morgue. + +

Step 6: Finish Procedure

+ After cloning, the patient may be disoriented - help them to get their bearings and put on the gear you stripped from \ + their previous body. In addition, make sure to fix any wounds you may have left to save resources before sending them off. + +

Congratulations! You now know how to use the TTC-5601 model cloning device. Please direct any further questions you have \ + to your Chief Medical Officer. Warranty void if used on living people, changeling organisms, or cluwnes. "}) diff --git a/code/modules/client/preference/character.dm b/code/modules/client/preference/character.dm index db3cd2447a6c..333acaf4d4bb 100644 --- a/code/modules/client/preference/character.dm +++ b/code/modules/client/preference/character.dm @@ -110,17 +110,17 @@ real_name = random_name(gender, species) /datum/character_save/proc/save(client/C) - var/organlist - var/rlimblist + var/organ_list + var/rlimb_list var/playertitlelist var/gearlist var/markingcolourslist = list2params(m_colours) var/markingstyleslist = list2params(m_styles) if(!isemptylist(organ_data)) - organlist = list2params(organ_data) + organ_list = list2params(organ_data) if(!isemptylist(rlimb_data)) - rlimblist = list2params(rlimb_data) + rlimb_list = list2params(rlimb_data) if(!isemptylist(player_alt_titles)) playertitlelist = list2params(player_alt_titles) if(!isemptylist(loadout_gear)) @@ -177,8 +177,8 @@ gen_record=:gen_record, player_alt_titles=:playertitlelist, disabilities=:disabilities, - organ_data=:organlist, - rlimb_data=:rlimblist, + organ_data=:organ_list, + rlimb_data=:rlimb_list, nanotrasen_relation=:nanotrasen_relation, physique=:physique, height=:height, @@ -236,8 +236,8 @@ "gen_record" = gen_record, "playertitlelist" = (playertitlelist ? playertitlelist : ""), // This it intentnional. It wont work without it! "disabilities" = disabilities, - "organlist" = (organlist ? organlist : ""), - "rlimblist" = (rlimblist ? rlimblist : ""), + "organ_list" = (organ_list ? organ_list : ""), + "rlimb_list" = (rlimb_list ? rlimb_list : ""), "nanotrasen_relation" = nanotrasen_relation, "physique" = physique, "height" = height, @@ -316,7 +316,7 @@ :sec_record, :gen_record, :playertitlelist, - :disabilities, :organlist, :rlimblist, :nanotrasen_relation, :physique, :height, :speciesprefs, + :disabilities, :organ_list, :rlimb_list, :nanotrasen_relation, :physique, :height, :speciesprefs, :socks, :body_accessory, :gearlist, :autohiss_mode, :h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes) "}, list( @@ -364,8 +364,8 @@ "gen_record" = gen_record, "playertitlelist" = (playertitlelist ? playertitlelist : ""), // This it intentional. It wont work without it! "disabilities" = disabilities, - "organlist" = (organlist ? organlist : ""), - "rlimblist" = (rlimblist ? rlimblist : ""), + "organ_list" = (organ_list ? organ_list : ""), + "rlimb_list" = (rlimb_list ? rlimb_list : ""), "nanotrasen_relation" = nanotrasen_relation, "physique" = physique, "height" = height, diff --git a/code/modules/countdown/countdown.dm b/code/modules/countdown/countdown.dm index 34d8653ca99a..1d11da9dc5d9 100644 --- a/code/modules/countdown/countdown.dm +++ b/code/modules/countdown/countdown.dm @@ -93,9 +93,8 @@ var/obj/machinery/clonepod/C = attached_to if(!istype(C)) return - else if(C.occupant) - var/completion = round(C.get_completion()) - return completion + + return C.clone_progress /obj/effect/countdown/supermatter name = "supermatter damage" diff --git a/code/modules/mob/living/carbon/human/species/slimepeople.dm b/code/modules/mob/living/carbon/human/species/slimepeople.dm index 9a7cc5098eef..39c9e7f6bc34 100644 --- a/code/modules/mob/living/carbon/human/species/slimepeople.dm +++ b/code/modules/mob/living/carbon/human/species/slimepeople.dm @@ -139,8 +139,8 @@ for(var/l in H.bodyparts_by_name) var/obj/item/organ/external/E = H.bodyparts_by_name[l] if(!istype(E)) - var/list/limblist = H.dna.species.has_limbs[l] - var/obj/item/organ/external/limb = limblist["path"] + var/list/limb_list = H.dna.species.has_limbs[l] + var/obj/item/organ/external/limb = limb_list["path"] var/parent_organ = initial(limb.parent_organ) var/obj/item/organ/external/parentLimb = H.bodyparts_by_name[parent_organ] if(!istype(parentLimb)) diff --git a/icons/obj/cryogenic2.dmi b/icons/obj/cryogenic2.dmi index 6fcd3462abd655774e183c4db7fcbb6b03a5b4ce..a8ab1a9f3e98d329677418d2497ca58b53c4a607 100644 GIT binary patch literal 80841 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%0D$Ef#4@bQ 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

|VtF=p+xr`H`J` zK2qF(O)Me|)lIPvfdlEMCE7sJCkPu?Xo!rANO!QoKLhB&F^+((>3?1OpL}84=2DMx zluu8~+B?)u**ujtl@NKNABhzG;TYekAB=vI@Hx^fu^L+>#lcCdnr~Emk2BMl*+94^ zO)4?ip@+>D8x222TCiY#ZY{9v{5O(>jVYA`IR+wI#@HmCh2TPB^hAghN8hLAj@#zB zh<(*t0}+bk>0P;j2zq^+d1F8@^x|;`v6Q1qKgv|+WDqJ{IY6l6qlz|Lsw)AktR<<0 zjU5NCb^Do|l>rASC1&`%e~uvy2YK8PUDQzXscc^eb2rpl@1sCwIpP?8*t5mHO?IAj zWAW;Q&Wh?gD`x&C{5$R9>*~+vR;U(Tx;#9mLQbN2)|-Ftg`DkM#b&^6Zy4ODA0K1_ z)JP#o`{3w?Day51>jPt0=|ER~*f?OKqz2e6N%ZxrB|8v_2e^2T-n{#j_n^gnA>Q4O zC7VcX`VdR}k(LVG0BhK0n*gJ9Dpi&?O1e`TgaFAzgyFv5u_#l(nXuXRyJvfOe(~`+ z*D-jl@&Ru@R=Y?2I9#ci9pot~Qc3zu46ra26B785L=onwp|uik$Kfu^(R83Do#-?e zx88>CrG>nm?1f{RSK1(a+ZjBlZlo}CtfClV|4`9 z%R+2}XH@ol!TU6Ow+qL`b!8O5WO+cU^E?sMlHR? zPe@U}uu1tL7{vsWYPTv}ZoGRSzkytj`*g4ZHCg(3oE;POJ8#?%{ee^10&!H1R~gV*=dWHXoO^OOOx>jbLz1H_)_0-@QDaCxupchz7}oGvHAI{ zNBF04mLoZ$)VWG|Gz(Tt3Q|R_6--XzbO$N*7UeEDOPPZQlH}{>aw@xhO27~8- z>6w2E%j8($(9x3mZPfMF^y`+lN++7+v-L9aYs>2v+2pu?S^Tkid#(W_q;wyP49Il( zqgXY>cA{bi2DtZTaaTlZ{qFgg8(&{Wr9DLAqFeQwq2R^16R2uo518P!62n2*Hp6<5 z!yQP8C@IjfD0Q*1T8G5Q|E0%1f@lCQHD5F9B`3HaBXST*!@xJ&1GEe8U$F(QsOge- zsnOE77NhLjMG%92NA^OnF2ZE_=r^dpkMdV&TZz+1iHDeULx&;1npx%q|#|tMv0Ubsxm{`~W$QfIDu;+=l>yTP}j8b~~% zVeZ~@8hRotHqaP3z8gq!nXF~&dL6sx@!n@wZrf2*6LxQ={y8Tv`@R$&GYPo|*{E;F z|EJz}oqehF*zr0Epg;VDQvNJz=M(J5^uu}W=#GK8&%pk2wOQWqt zi;-;-^unu{;j+*BuEtCvoIpi|_?8%qauWNQPR0ZF1XWxo9=Bg!YR`r& zUWW=uOTh@R`w8FCr!|Rbx~o2LJC7WL@1FDoN%Kg)f#swN$Ay9%+^>tI8?r*KM!F)|PzhhaD#> z{ul@`?x+YcUw88Zv+44W#x|$UFZ94JJpDZH^S;-Isj%-K7}aa*n1%?7R3d#9J0prt zFph(b(Cd9TQwgD+*?4>4-^e@m{?BZ;LR-FA-`spc@0nZvbQKKH3VPC#wZ6Ysp6Y+k zD`h%SRau|Sf1PlZ>V*i9!j9XHGg(y~Gvm*LKnOsGGN23BW2-}fHu?thuJ1CR)0i}L zyMyfCE>>O!_wFY|S`!zUXQIZ)I4<)v!usKWU!^LFKw!Wl3s?&>jFKIbx~dKOzJKI;-31VIySlbA^d6t@s;S5m~j=~^r^IlL=_szx825QoeBe5nyRcZQiY&JGz>HLTbF4w)M6AjAoN5aV?_5|J+sCrv-jk=Ydc z=X2Oj6OxI1F_V^~ZrzRBnv5($bo*3vs?ge0;;i1bwOoN!9sg|>$Dx6Kwh~TCt=oYG zrN!!9ZIZlA!_~Q!yZ7AyObC<@SMqq;@(L8r-ui0l=~pJoog!tJS7fDYZaT^Mht%x5 zekCtTe>cem%8TkFrkkV9^q(t7Jj@V@0_>3A7R|ybKhuq;i5emW1oaRhsmzX>*0*B0 zjl7I1kp8wRH?kKV3_4f}=y8F;DvqHa|Jf8nC8C&!=xJuE)rW;*m_q;Pgj>#l?I`qc zStWO|+Matm>j*`@d@7{|&HoRCmF4}!wRIb-Gw9xRKe_z)3XXN(pl`C<>??>95|NQ1 zYP*u(0E$R|G#MR+h8|_9=8;3gwai0A$)`tDSQ0ene%y>u=}U;DP>mH~^2&)e+jNXQ zIHWZNUGdQAYgFPOc{1J)U^*^<$ozOEB)z|`3B#eoP({Q`_M(kM2A>MA;_@uMnnHdU zqW9A+kEhq}(ZZO)>Mj_g&W?{_Gc^5>JG;a17bp2qufCYjEnp4*#B_QredeGPC% z+M#~gZ@mlq9zx%gkbS_IRq-FA62`1-&IgtKvs4xUgk7L+U{txcow(v0Y@p;2ZB#^W zy%5DI(n13up2+Y`ucb{z%8j-IAm`-Rh#LYKr8S$x*^`GIZEPfWkW2B~1EA{&$SsfJTHE9$sp)@KY&nLl+>>QcphW+`i>Tx&ARn3g?&M&oe!0Nz1Bna zhQDo2&MZnrkD6k3#_zZKLhJrz99oh)KlOAKGGdC;XD|I7rMkydC;>}bS%0uYH_ly| zp>!4dO;Cm=l@cS<0QpF%1Lc{dhe$C&1`Z*BUS@&3=e9* zFZ>OizHnx9Y>0!Y0a-v+Xh?fo0?dIN5m7*haI%@pa9(tf#z?7@BE6I8_TCE_A)%?M zX>`Sw4*^6II*4C?O28c%!Xo$84$0tyhntQoK&LwAwoh7+>;oig3m8HpKGt*ZUHU<{ z_ELKEkq@cc3sfKf*;kCKjifeaNHHe$gL{uCDUF`WnjqBrZKn}K|ZAnZSxQ@KB3wBT@i?C`Syp{AEe&jhv@NUNKMd~ z!BmPB)A`diwcs8)R)4S|DrARUzd2;BvrV7|>Zg16;;Nhf!vZ{9iJgQ7U`Kx*gDu>^ z_J~ueJ+1zCr-Ie7i$zwN+jS?0SLb}}41pa<2!6d58Xq{oHh7!so>*@Y@b)5@Cj|-G+#k-qJN$8ez-Gnj*hFl*B0#ljt}=;0A5nAk;hP za+a7Fr_+#j=h`sGNtGam1kyzY8i8)$I%KhBhSffZm{+vH{EE|CN&W6W+jEk%5 zT~t?RaQ{46WxW~J16{*dq8bh-`d(^E$k}bJ(Y+TluQ#PmMaR?SdG@n}%>j56@43Fl zUC67EQIBEwq+u~bvbjie!f~+ek$6K$^;%4e!TB(gIlpMMG48J}x`86ZGHBc3%Dk9{ zmQDv(y(>H^>!2tBqa!kq5VZj3j(F;D_J>5YaYE+D`e4a#aGnh$F+2g{xZB846npx#RmUWNo3M3M=|C~fxOE~fiq9W>bnjW8H}S3eCPJbUJZPL_@RZVW zdw0+CFmUf7z%KfWTvw+C!l_A2cqF)@E?S zAe*3LR}8p4ji@t#dQ?O@k9ha^Z9lV={^$M;`6p8fjIh(W#JwO^m4E{BuZ!_-1e-6! zNd*Lq>%9ddCn-T}VeOh#OcH+}WFY}0v~jZ}1v=J0L%0)U_~&Hg;C?nFi5RJs?DXWZuNHaNp4Yhz zp7-Xsec$XmBD!WVf`@|$FlL6DSzniFu{?t3%law$=rQAS}0p&{~)tw2G;dxettM z$##WN@OJcDfF;X9D@Z7f$*5XO+JXnFz$DuA$DiagsIEHw)p`e{c>;^RU3@?@y>#nT zka)8>gQdr(^j1iVjy;P76Df4YChT^Us^0F`8T>rW?2<@JLH5K79V}Hxz)smA_>0JK zq*>1%2z=(x@1pzW|Lh$%b3bNx^$#yKHDj$>lR2r(D`7dbwxhs$4Bp+;V_lCb! z5sM7!#uoPnV-gg%G+D|CvSI{{f|h34&mI2oI@25VJ1wOF5EanX+1z^xO7V0&sGjS+ zw9?`@tygcx$dG+{h;b;fwQao7uw?NxB5P?UTiXZi^qdHAIBQCRApBo9sl*afLhYqqU}nb z=%?YjP}F&25q=B`N*FJFu@d?nfv@L{rU2%1y_g;;!yFR<#{8iu6c91W(X90Bb-eWw zV2tznA}^mnkV}P+Xsl*4_re|vQN%}Jh2&w03ZFKXI*N}A**$hw%$nEH!!Lrv(eeh? zn(JS8rmR%f%}{N zt-TORJDT$Th}aVF^|`t?z(BT*;9l0W9He;ObpOV^1)|1`pa~s{o2egY%pFx*FSFB9 zlMgHg(wt?5kX)WMo=<|@tUt3YuZk@himPqxbXF%jI=`R&c>qopgZ^V3txA(NVLqxs z&y(`WE2Lg^V40YfcP1`plAJeCdXwky&Ho>Z;7+x&z4!J-6w#ENto-e9v;SEOX#3-- z`G%IPqxIui)hSVS=y69*oYM3T*8LEf?v_rHW*+#QPcm-)8_*s$U;g+u^R?vWy$2o~ zKIN9$9t02fawGuWz4N~(t1Y&IBFIkL%LU(_H*_RrD*Mh2TG-)OQ4MXq!=D{rDrRY* zq9%raSKL#QDhBeeQo&^L1=sJRrgyT`CE58`|5Cr<`G5uV$s#XQDS$Vy}xKM zc0|f%YLFLYo^X=yv<(;|2V5bT!i;~*kS-LUs@m6#<=9y}-(uF*$@r-=H^lAD#N2s+ znd0W+pyhhIYcB=kq{WFbqRH2vP{-!?I8M7d(;2PGJ_vNi^%(zB>oek-Kb~1~zR#Ag z3iphs8P#v>SF>lH>$hBq!}J^@IQ8MghcYVNSJQDzB0#Tpwi9^YAsREJ0u*ciG@>pa z4S}~Wn21i`-0rXk7Jpeg!?ai#=8EleBKM$?m~yNv^3QAWrbG35dDp3*)dU30(`*nu zEX7T7rvzVhfeGekkxAHzM~5Iq0;^s&eNYYQP?K%qD91};tlj#G=x1J3K1>Y6A$Dq{ zMSG<$sYMkH$>B4jc(|z0naIof&u$no!IriLea)!ax?Zj0U{|$|L%5HciaVi=9&mXz zs`BVT;F~uDS8iRbL5Ej7t=E%?1^jmIM17y*jIt%idS`Q5jbWimHT@cEUfUh)OlYx6 z^F|k~kF+~xYJOi0vC6|2u(68`1 zeL|5LC*8*jPuG`PgQL*3@)o?&AD6J!kl4GAtS%-rWCfb%q-RorZr8k_4nI%8Z02QUJc6yr;$#WWw4 zW>A2NDtLfOLd*O;;}A%|2JJ3pJT{GAz@U<@o-?%y&+k7(|7+(ki94(L`>2=)&qi~!A4p{#s~RWr=n9#A)Vkv)Gnbd9mp^KVlK*i! z57V@N5v=)`N4wwXf>b_be9#|p;^n0) z_#EQDr|1vv;Mz&9P-mYJ5?(%XCEnT$E1(-N@$*TPEvr<)=))OF43>x6w%@QBKrdWtisNypFZXg zusj^8R&ly{=~Y*w*_aWr%|GQleQjQ3xBIr^7nnWy+Zh(FJVN0|irAPFf|qIHr>Bkl z{=ax0jdI%k*UpdNo)75Xu2rNzxbW6e|9)i?1Sa>z3x7+NCd;|4#$eoWahBi0!lhpV z2@&?uN>8*23M$#y_##;8UF^;)7?h@o&ZHh|kLlb#4ta zJ1_Qi#lYtm@Q}Y>gGd_X0B{kE){$5~{V#9-ZijDQ-qTQd>hW4DkX@ZHjn;XZVhZWf z4k-p@k?I_=#xwR@+}v^&VtF`Q$dr6TZ(z+44E`|t#7Uk&ImfC|Aa#RZyQiPK!M+;V zL^;_TzE*DtR%~IFp@?4C?vLk6bQa1FX3CZ4`rjQ*)9#IRMzQBjQBi73Djj>-*6KN7s@oBRFrz%Wp2fU65M4>6gS8*sSt+VRUMyEpl-ZmsR|+_QfY5p~gm;nRkxo z*7IX-H%Q->E=mADlbliGqt0#-4iXa%kfDC%5)55y3U+R43;YQK2}!n}gu~v+;_zNf zr0@mI@_12W564DkwQfX;X7@VdZGkW_JL?Ds7pg^qcq=t+$H$c`M$Or~5}&ENbHT0K z=Rl)@*JaOZPigCwQvJLYeesB??2Cg4a)TjQH?N|? zIMt8&H-TQ16b=h_Xr5DxWXUZ6HrlAzukM^1LQ=ReR*}v_!JOFx!PfBVr zUu*{lH-s>Wq0FsRM>mRDPL)T;?uUpiL1WEl`jvW#Mil#=k7T(cVF6mfv9M4ni?8WN z7mwOb_?eL>qtr09PI||)V_;7}^eajWmxabj+pbVxJ|zO#VpBXL8|w~I`R=ZxXkHJB z>&4omHNk}t$Mu0YL$cyKJvaa6a0rnG*7K{@`fp*=IggZoBe+o@F(bYv(7nM+oe;Ln6Eiaad!=~Iwd zJ7Jm!ma^9VNI;O3ipq{s&pza)@X}ZfA{gjfpJ9!DC-;76-9PlNj?dZ@V1fL6>}2Z1 zn+U&oD^=;liFe7M-oTErGZWV}ycs9xq5HV$bx$^d*)uvi(E)XkK$nabZs@sL1&Ti^bb}>xWjLCF{QL{k-M#^`nAL!D zdybfr4@z9LA%5I!l@8;l7u^7jP8!|!Fm%IJ)nB!ey-g&hlJN?7o?_PFO~^GOvMKmp zCx{SE(EaGTyainwJr8hj70hcxbI3Kl&)LHsG+Gpn=0|3a}l5sHV;%u|0JpiqIp)qlQkH zt*TI3-$&R9OotlTb=sE~#(A}fg}}BRoqmQ!m&1&BbpUswmJx%7P_^|czoF&8CWzKx zLkBFdT|2;h78p@`?oq_M!*Zx7K)O`D9bKLJa$w+>6%w`osKUg--q@AXAhrRLoCJmW+~0KTe4htXFTFIx;ixpo2gRRDm% z%6r8N0xZ|iETZN1txV;f*|)&GaSd+o<_A*IhCyw#CrSu38Hk{F4tR^HmTalO@g_Tm zR#pB=Bv7l*ixwRLUKU8lI2pXc%@NV?dT*5sm}zZI#J!QS%3Yl9?uI@0r^8h>F+RH=Y! z(c!AW)Ym=oPsQ6fJ)UrovOG77s~ZdL=LtJp2r&*^U36Z?m4&n3q|6wYX9Q z)m4nEJ=Kj58j|KUN=BkKuH&(_b!=0;A= zqH7X<{%FZl(hdab|+Ofw~%|V;>JgWwf-AJ zUKQY**txNJ2KVkdF1a*0-6rGR-2gs|s}y0>?tRJWX%tCv(?}v#f8UqXdk@R%RHnN3 zpJ%rg2UWRbsPO+ZSY^(#TZ#riv`c=cvm_*0#OpBsT9xcP@dGztImbU0dDB4yF+%)r zPGx>*&E}(-;KOblmfqpinFbA%&($cI=wg=v*6*Uwj&aUBhC9!Lh9<}F6jQ}gzoU(M z3cAx9nDA@`lY+OWE6$hdXp;s#U#P>y&s-N2D=O57g|2+k;`HvkQA|13G^)s1ox*Fj z9uK{aD!wmdjT62K;t^sQp}gh#Q-4byWK2$DJeNJieQ}BqYpF|Zjhx(35s>O$jbVaW z=c=Ji zs-h&7L4=FPQl0U<@SW~*Cv(f?OPs(5OmEg}7q-J<#|r9CRHHbkwTI_b77^V?#kJL- zE_)$!clhkKp_gXAwB1fJGh<^U^{OnT;ei3{syg)J?SI3CS1;bE<&Yg=!}w$8h2wl$ zn;AHPsy1mJsl>Zizbe!Dajg&K?Ax#%XwhTviAl|JHwKiCw(0T`{KXzIPIN=rI3u|6 zKNpsNmewqy(9exi5`HfG>%k8LMUGFJp)|$DpatX9ic(%a*E-;;{NVKt)Wf%rv+lP? z7+AV{(k-(4|J&kdbbNxC=fEc+s}w>;HX1?#wM9+s?do-2*y%>S$D+MCzGN$Q3y=9n6VNV#_~eHB}`mgT;$sg*wc@qzjDpDm)I}e{w&E( z^?G8V$3E;)4Gq(0a+1r8sNrz#XtL7_+CDy>V(|$C;Ik?3MW=Cg4t zUi8Fj%44T)wKqH@>cph#Q1YbQR^xBiS)Zsdm9kpCA$p8AEp9kHYiO;`M%b?^|0C|@ z)7rZ*8wXA8ps(}sA#!lvg9czKFdezFotd|Z2>0fW%oA~v>LPpRw3r;&)Y+s!@49On z6FIUeLM=~x`b-C_^J_zy>+7@1U-Suy4oMhN?)Pq3eG?GQO(P;r?pta7M>d;%!r}dS zL$K`06T%Zm4^|)hCM>E_0+m03j;#8!N>ye5nqrQ+g~O};Fw0H|Jfb;-(0)Uz5=2Xn z91J(YK!wAgZ6ztRJJD=X0=LsB%7i3l=Fb=nIUY~xea&t{qGn%3NojQW7Avk1@3-&0 z^1PsjBJ{oyy$#SI0Y^lewYHEjuN~VEHmk4MT0SIWv->hUjv? zCGbwg+m)?(I2H4yjsn+3Hk&jkPR!~hkog~78*wQv8Coqa)phq#K& z!0#oUKwjs6V0+04hotP7HVA#79qM5dS>jG68r%nZ)29zT^%6`)KAD;zO4h`3(xJ6# z{WbLwVQvVrk_v~P2bn-rt~>qclo^+mDweg-zsYejrSgdEEizy3udaw*XoF? z{^>GifTzBm`|2@*A;%9AqqY%xhH$QAIV@}`_R@2Nc88>l5N*{n7F0|-x){j^5fSW?^EQy zUfEh&n!z%7`YlJ@FBzrd+}Zn}Wj%f?gnWAQf853%?CI^)0_8kfmG- zkQEajJp62c6`c}8EsYQLmJ*~9SZS9h)RoI^pk&^!h9`18@$3m~1G;6W_g@M6A8EKN zTH~t9`_(>ic7AVH5a9{zxI{YS|I7f`j(uh03N+VD1N!7S>d+-b{|J3P>R@?miF?^A z`f_z0$RR4GHbS4qqJD?L-~98D5)}H;fmqd=%&{X~(sF$(S$mP>59ZFQ!&%SJrvp&M z9Q_~=g5J2sq$Xsp=MwK%`|42M>&^SI4%dZl!}n807NKqAE(ql^DW&J#8p3H#i?vy# zQt$4ispOJky@pN_z={%9nIJnaPefTo`hSk1)!iR(O$YAxIdnFo*XAF^tx_coC=X~m zb+Y;-1e9vbShkkMth^z^*Zof?rAUR6u|QikfjZ)^WkOE>?1_gXBj+B#98{yBDKRHe zz}9hU_f(h=NEstU<985(0L*4_ic+9z1D9+dYZTJmJm_%|pkC| z7-~99mtHT0{@L2i>?{` z`jN#U6yur*d$V-okrFfkQZnoIIN;O7A!z>xE)C67!e{W!D@4a3lRaf-mT`ZmtIy4( z#cfU4GsN%`akx(o5WDq=&zIK>*sXL4pVP8THwl-=oBG{t$TxQH=g;ov&hGDAt{H4L zY6D6tymzl^GzY$Z(YW03veBttK0oxe7mVr(D!5o*4y(50zZ;2zY}tMG%e_?vusDOl zGBM7k>>P zK@N*IC}PSa|K!r>8n2MEL$mTps^n;E#$@r#wNNF=g$dBuP&&PI_&+Rw2Sq9J4v>*{ z)R`OqN|(W?JW@=ihs*z65Y6CW#wojAZVWX)Z!Flat!J_g#k&pFq; z+xL3n2H`pEU@?~WJ?_44#)#W{-8fD2xFgv~F@cX5R z@z*a;ogHLy47Up^3JZx`cq~okgDpy~%n~nApzg)}1&Ce(~Td7s~(8H-UE;G^+1TTR3nSS~1 z5V+_a=SML^8eVVV)scK!uUG73N2>i&8qaP6)q@i6&RDI9K~+ph#ep^HSZ*hcp;egg zjWkwGugYZ`i>lDS<^}2F;z79j*OFe+nLfGSiVMOL-X}$F%aK(gK&nSfXQsd57K&V& zN>N_9dzA7Hvl>~8Ja_Q#C!6^)>o}(!0_`zdeU$&kgvD$zfjmax&2IUGhZKxLf<`eU z8$GI&7U$`y zgM4=3rTV!=_#pq;CcXJQwH+<-hZ!BVYL534!ByM6${T1n4%0HmVL3Z@FAw}Yz47?Q z*7a|yNK9#Jg6gMzoWr~hi*en+70y=>ZZ4EyNV8kjpT%<{^P>q#ksY@}K$cNWxr}OZ z5*c12Ei0>%wEKK&J=LY5JS1cCc9!gN&(}D*{pwA1QSP|)cN6qF6y%+jEriDJ+uf2Ti(Ahda;tzfdXv<4sO#GY6E|apY$Gw%Fjq96 zfuY0w?GymG>2&?*-l>+0B3;JhJ<-|9xNKk{uBqPhBaVc~fK_6=j{ z;GfdiZgrvi!I^3{96c~x-5DwBcDq^$0kfui{)`i2X?oi7&a?Gj#`%m4>ZUJItIha2sNLQVXWc}J{?t@1 z>iW6Ma_f-=VnXT1@5lyvkDBfeKe0TxqqCu|dDoAQj?Sp$UMN>6D%z5p6c?M}J}wf$ zkBIfr1EY%prRuIDKHxe^CwlwINBN(+{Km;kB_KNl&9g8%J~2`ait(&C3<>t&$V%!h zk0W&p)}RfS86+*nU=|xuc$+%C5Hm52pM%XD)NC8G?a&p#`l&!8BA&4)9 z`gV2*%QTRoAX*-sdw%eO_%9@AWxHF}%K0 zeU0An*Epxi_NJTk%iLUx!#4ctbuTQmkACj*uFCP=O?$omIKRKSl<&jkA3c));viLX z%`UaieEsj4mTC;9hva0AJBdj)CF=lDaqpVys|vOBoI`&jRggkaB0mUiTQh}d@7Nd8O77E0fDMO=C&-!fW^Q zscIsTkb~`}@6v|>!*B5Aw*LBAugMIpyfVs8 zEdhP6G-9&-oM)Ce@Kdb(UY%tZN{e%yS-v6k{9kvM#BrwVxMx$TA{7{-Kv_8n;MUjU zrG4nLjtcy|^XN6p5%cjuzQkEcovaVa)IyL0m~hEFZ)4*w)!Ne^o!x-JJQ_s4qE?XG zvhvq-DhV~oWlpHPK~8CiIuJ^e+3ftX#->IEdmNxhVU<$zT_H>O_ZjEU)+B@mQNgHu z&<#9J-)_pCfY;cw4I2ml(7^zmer|4FfQU<#cv5{wukJdM1~eurcl&wGc(55E5Rh~W zJp(JC`kKrrUFIl&sKMc~RDIr0$&#}of)0Z+f3R|cXtS=Jf>w`mg~Ea>lPF~g>cliL z!P?Oz7V?W8s(Ji;dK%OcoURRfs zo0r$~`?*!)VHP65{s^s4o2>h39zPb z=|qlN#f=9)$fx?VOi?27H@5HmT>bkBEkjy6|HiJoJ%ze>8zLgFD~glpaMhygj|>e* zd~qjZ9s|j_k|?;6%BOTK%!||0(~m%PFnRH*mUn=J@gX;j zbNWGVy_wc2x!!~b>l@rp-f?(ro5A%-``pGzkyF%2 zIS>k!Eg8piN(dC4wH9kd@}cjC}KXBc(E{4sQXqP0*VA0iYnXa*rnGo;P!q2HQpGc#iU`yO*+V@gU6zm z_ixeTCKc(h!{z0a_=~4@yIr+#2V-L7TwL6oprn=^o)^AO&#S6uOO_OSoE8blq;NJ* z0a&QFkIx~Z0UkDRaTabv^>z)`u(8xb&L|=YPnjvy=Osy~FYkIgY#6bk^ zOnGV4=#O7@dXE-cq!Jbvm)v+k2NU+$=r*V94=eZ%U25XE7XP~BsXTM!L|b)AArbG@ zQ)skt;Sd)o{5gRH7^^VVEuA0*$npg+GW?X#D1Gg?5@yDYBOkwdw#wkUqB7`l?5Wmn zU8Ze}7x=N*LT_)HAb{CqVxq%E0~appYFX=SMhhW{dY!qvHK?dWzTEb#3W%-sdaj35 z3+N#P_UNv*=642BzQ6M{4Mw866O=2`p(DW1VI#TJoEdwW-(p8Olam1_wz@hQg_vZZ zKnmY1=}86Au=c&dz%llTtjcX98R7em+ezXc6-AuH(ctzJEe40(1prh!cNMMK94?+wewcj-J^;ns2n|~rjF*831J%g2q)iq7 z_q8$e`9%UplYK_;QMnN%<5da=4w5vUCs-YhnGAw0NjFxeE}HzqO~u${X_5nm>Adr=>xF+a$O< zTeSA{1b?U~3oTnUE?4?ut?VF!PK115M9^y|2_bFy!bvqcz3D}0s@v@{P113j)CL@d z6RDSDkTia!{-p?H^=2v2=901tWjDXpKo_SOj-Bm=wPsJh-|@9vYY~T;r8cVyj1Q(SsaQ^X z+PmqImXyR695rAsOw_O68%%<|x17aVnH(f|CH9?eE*cax;0c6YM&od+3_SjwmMA=b zOzkoL-;2Z1{QiEKcdPvp8abBGSD#E*B<&0l**nUP z|7raaEred^D*+#xmo#dMPY84|8iLBoe!8~X^}_}Be)jYK<-s4CF|Mvso*hf+!Nf%< zP5X4Af?Zq^LFxfGk0s8U!bxDKeMxtL!{%~poV{;i0;$)Oco>Iozze!PQSw7ytkm_N zo}3t-FI544Af%^-M3kjvMM=-L-rN8LkSzD(p`>CxjLft0Dr>hl=whQa=_kh+iTj4* zcijV)pAL*g0SOy0-D!e75pO8al<*kIpIcAx6JiCYwr||*PFkapgDx+o73wVguNc7= zzZ%}U>uxjmz{~8=TQ?)z#J>V;{qM>+ zxB@@LEZRzdpkS;S?{LRGTd@JC6|N+Mv&JCJs#J&GVtH@K$qx&V@bYc z0pn@}*Jm5j^+|o1s@11rqVrf=3ap-O>l@l$nMlj4W8e<4IyaR|f^W8W=i}p>YPt8P z1Re|aHg7Z_e>E5f31M|Z+&!vcnw9^CCia`x@0~1rNv8JS@U|0w)9A$P`(GFL$%6o$X}I&n62iAT7_j`L5s9Bh(|KM*6P}`24wzDPRhf<}(FJ`AlT`R0X2jHR zl1?n)d$`PfwT`dOPfm80bnFERyxaj!qs?{~$*+(25z1LTDrAD<2Cc~07(w5_Vqx^r z{XyC%dTwkav|b)Uu$xpf=+(%%H1OK1z`4jWC_#Vv=Oa#0b+PV_(7hc~bY{^d z_O#(!CLTSRxrA=>lfQt#0k%sDepZ&SQISG}ZZ}E7RGJF^Ch-gQtcxNQMuVm(D-%@G zewOmVp9W3z| z({-f#%APHPmV$)E3a|F}?pICWe| zl;2_n0M>ASc)60ak~@r&xMY>7gIdbjlE)GhieAQ&Wro)Tq7KOkV*uodIz<9Pf>f}J zlhu~N;mT4KKq`%Q~K`V>+|GS2xU`xcEPjNo|>C%M+TaOfCk~9^8T%3SNP*#*GL(A*mvV^3R z25kCe^)dPb_W#G%S4PFnwOs?nio3hJI}|JK6nA%bDDLi7+@U~mcPPc(Dehj}8JI8k zv)23f`$ZNrlR3#GC)e56mQtxr|C_k!*<{%Wubxo_iZ9Av-fc|;GK4IwJ~%x-3S#eP z*%Qh%_OhdyMaNv|q&)^H(=c5SjRjE>94N<0a`&<#T?7$vPu;U+%za$SD3jq&@3Shz ze+?Ba!jD9trY1-xJHR!m|0xD_`o7bBpcTVMSeQUTLeAHT3m-H&yJUcQc>?l41&s*b z9}@cxIL7Al?``!dZp1bNeO;>+GEq}a;+}2!){IQ4^ zdyG@6KL)=M^gVeQdCj0QfEtMqZrsh14Lx7Vy05D@6+S@hjfc6v8X;oHf<8s;7e+zB zEYK9f1B}H>Z8CT&tG!GB?cZCI^VM0cdNMIZ~vhP%bk(Z zVaH==U*bOU?9%MG+cwkPw!smY^O!|@x^jmJ3~qT=ykQNs`{~w*i6yz)wf)`)B|75O zd!V2+gdb3u@(a>EQiQBToh4Lii6&3ikNw-$OPGBuP&GY*v&$1!26+(U=HkjTHo z`keE(e?8t1^|<#1Bj0ClZo#oG+hedA8}oDAx6kNa8Rt7v7TnB{DK@hgcZGjZsw{){ z$q=E6oZ&tEN^5h6>h(X2?7X?3jmD%1bahARI7TVDeYj;XMqr;P=@3SU;aYP)MFf+5 zCPUzAZmv&>m&fj*W3ZE32;8)QBZ7Yk)?%QP-NSb$CbBCW?!UL%n#r`FB zlNLC8NLPPnOqQgQp|LD9V}(KUxoB0p!hwmOZwhDT^Kn$a}fbQ~KJ z?vQqHp}UKNC=j$0Le+6vO%f##lbVQcGeQsf?1h{@Y3Yvm+#~%eq%GI4wu8$_u_S{x z=1<~wkPs^rORl%~f+c#Cfv5Pvvq}*rD0rOi#sP@Um=lUe@9%5!GySQsY{?2{8a&Q< ztd6G_P){F?f@}2J`0bV*ezq3j6sdeFp-o^N17GimnGzb{a)k(o8AFVn53=CHr@%3J z8Phd;8dvQ9IOXC&St;hV5Nwnfa0+v2ZjnwIOuH-XE3#k zD4q0$BF$ZbX_>e77vu3)($`tp^S=#dk!}x5T5caN$Eg!bA{D@b3$R3c+79fy(>)LS z@3%WH&vC2*#)OQFOvL9LL@emZWJ@k2pcNuGxGVNr2HZiS4!B47)FcRz%v#gryneu;Bu|6BL;r?pE z0bJvBFR?ct*Mig&+|IC}B}AKup^Ae>Ag3aRmt`J07lu|x*@|3iXKJ@tCiiO@zKW8O z#d<>yP?~7-ROw8s?*;7y)v?Fzo-Da$gsfEW+`U}C`2DiBGcmVM0YDn25n@TB!1sp@ zzdKTay7a8;DPC}q+kaL}&zQ=e)MP^XJCV;%{~3-`Hm*W`8n`y|n(vX&R7 z)8>Xk;1)$~*Hft;%2@G#y9*R?FtV=84S zr_1~eUB@%h&^L5xv}CHRB-&VfR)ZNeF zH!aPSaD-wIV@894g_C`TQ0p`o{1f0nY(qQH1Vn>&i~_?Yzk zpTmw!Ncd+-4B0$!mxvHQ*gZ+{6qzko6^BSm#L*nTd7=JK!4S#Qt(~rs z5eY>(urU`ph0EEIlsuhQY|m2|OmI zn*LpFHAFp82nCdmp(wi6~qu#Z_gQt*PYZ5-b zGzv_XuI~VS4_w~h8!=}c#-%~Hi#_hzLZ4{CFJ(b3Ib4^cUpE0_7(ajq`rDT&{eTy} z>NnEBy^b^R8z60Nytmy+O9cv74i6Bvu0M$-)n~Y;E;K51%DjOFg)|xHbvCpwhTX{V zKd6!6R{cTPVOj&khv7HxlfVp%*O`+sgh5BuWUO}rxQgAG*bro74<=hk7zJ@ru*O{( zwZ;zmKW#>CU)4?H$(3OQiv~HYw?fw2EYN(=+%rRYK|jl1R`2(zI+E?xTuln}5Z}Xm zKY8?;!#yFVgTdeW;w=ZN>v8WX(Pf}TD2cA{4-DU zt4#*6XP-Cpkf+Km>~2z|#QZ-r)}EsjE$VMe{jDPCTk3$RK51aGsZNHZnWQ@*jiHdZ zmW<`s>Vh%#&n-ftKe!x1U@#Q{cjFy5YhDm(1S+b=gnpYNa>E~_ti?T8xfj2T3Y03p zXW~pY&^?JzW7K}TqiDwd4g~(h@Ksb8m6t=i_4-dWH6ah@ux>Q{X3(K&r^+urVq*=a zLKw&;*HHnS0M&j^QBDW*LNEVO&nw6Js?MDH&2(Smex8JvyL-^p=#))MAA0f+`f7Nh$->vb?A99fSOZ)%s3 zu_Z^i&EL_KD9g1p9K2AiOKQ}EAU;tuHv>WjhwKFEj-8OZ=n=CeYfIX%fq^1}i6n>0 zA|HJ|hbNE#Fz;NCz|d+F-=|BM4d}B1Fz8s8 z3PV2P^TpMb)pJ$}=rj_{TSrtd*r#zM0^F5hDg+ZCT=j&*eWBOM^TfcKk-UfK@rx#< zRMRw72>VTOn;TaucPvgPvPhwBx21IbWxpGn8?g8p^@kfM%T~v7OH?`I?5r-_VA`TK z9>^(*P?3N~=jc9PSsI~B zOb5Yj*PYIDh~a|rL|Q|`ZGIf3qB72X(vRpE{5@ckJH4=&JHalf@9W`C}G+; zeEqJ7uAXz&^HTa3wYe1;`(m>z(%IXlueZ9k6Ja{qBpN|Z4Kaku%={Z(C0EEwEQZYh zlQkK_B@zr;4+%;lsp&udoQ|_9o@uJTvRnjZ`%Xrd*D-j^J?D@zpo0ns_wHj|h`4P3 z_(Oj%s5)@(EO4529meu_I`97J$qj(zw4Si-w${aqf@r_hF<*PWCIbYR7i7MSP}Kyu zozIN!9&K}&C*`cOgW4`3$VDCsnWkKhj-DU4B?WMnH7bmn?SU>}+$@$M?Og}6Uwi`{ z$j4|Kc;?M)!wNhR$#d0Ey{(4T)+VKv+~oODnc_t%8oW5iexY8Q9$Fs$9_;!aOB(e& z5!Cc_@fIIV^l=JV;Bp)VMK|WODGo3RYGg^IcGu&>NZ(JHQSucx4HO?0Ctfc~Poi7yD;f!?r}lj>Gr=#Q?YGT3^_Q6(24*?VzOEx!B`hgf ze47aV2%_8B4K_hHjT)%$Vk47;L2+5UMry#7+i2h5v+!#@Oj9M93Lnv0U81owUib1k z8z$JiRYJ4PM(fPtqP&;P;Cz|m<>n0stM>zzG`YUI_D5ESt!&C10z+@m+pYapbF#Ln z3nl&ElGzOaZlxZ59)&iniwtqxOO{ysg7JAuv>G0A1ackwcQ$ZI&o1B>@zY~+9w)A5 zhCVsI1uZPEiTg?mq7rj;{KL^o>V|o~^y-_?bL{N^auR^8Dc)^`V$j<_Ac!Pq**!Ii z+WV>%l~2A*0x9w<;K9@R+EtwWzV#$L6e$AYg-}RG`fl!(flr@lnE^)u5%Vv}MITZJ zBfRQGjC@`cUWSyvf3Zm!^YZ+tfz>bN>HXg)z%GOUN(f{{O8&B_JerGF(v%D8M6(f% z?yO-*kKd6);aY~qXJghn@r98|^HNSnqDxd}aQLagYvews2Sg5FEv4FtW@l%wc6u(t(ZjE11RF3F%LDO%!ihC{tR~yN{;^+P zQ%&C<|4knYKk);o)|}ww&Oqd)+oxXeO~p}xep4L)L9aXZME?`?Op>8m?e*_!QkQE6 zmXXUtwRzRqh|o|!Lv=#VH$B|wPf(nH6>I!Uf|2e2##~w$<}i)om-;;>y%zMOI-*}H<-2urp5z{Of4K|amBaWHlpmkW!%1Ln5 z3Mshe>f$GYVZn)Hle{;y7ygX%#^(eKm9yH1=u0nL#vvcSBN5y~aK|5(|AyxEwzOo& z?W^hW3mWU*Ri#|62O_=*wpq0DJ5!I~NA_-CC+sh5h0ZR6yN7SGl=|AhQ4u;>#C*2+X;d5_L;B}k%-ue4m%RimE6>Wz=Qb*sR@2OP(~cfqA?Eqxc58R0kk2d{ea z_FvkIK$TjGVYBR{Z`9UD;RhL$ARlR~s~#aDrb9tBJ#P-5#J)+5xal6XJDcyaVvQi; zjn`s+D!$m)^OzQK*)e6Bp@TksA({U^E(vv9kFfmJEqh21AV?wD_nsYhK-}t zJ&bIX&ZKzquPTahgyNOZ1E3LaoP(2kW5d$3ljnE()o5=Z^5d`>iX2#jELxc2lL)o{ zT5TNUu2r^MDUb#N`chW>?sB$EOG-i${V&Ws-WE>pyQf!W(%8l+dpep->FG?U+=WcS z-OVE0c?Q=C1?$geP*XVOL8jX*j=iAJ-0I0*yYrR0sg=z^7O)EAX!=2lrH2&em9_V}Sn+YorjC)SdeGG*RU!d{YncHnx(K z3x)X$n>`7WG^xK2V)+b;soZWCal*sPy8%FA8zkmRJ&%lG|ix(^-=!Mpl5uKv>TAox+)kJ(lDTlb&rAc?veZ2N_X zp^RI3L-by!jx!=*Hm3b2#%Dsmu$-@#-~fO)_VYDUt?6L#BBW_X+qC?9_ha^&D+pN_ z6cCPzG|_!n@!fUbyIP(=YnLx|QU4w+pDj!5 z%z25)lBH*UgZwlpA%J(yOIb|) z#qPu(wA5|;Vc4Jk^U;ve;pbuC`|tx7H%qUu2!KujE8}Tw0q^ZKLTmW2>$k7)@TBk16r-9g=b%6P%W3QJg`i&vECCHR=a@DxbcM|O4` zJdX_w^g`owTCC}_G*s$@@{y`R_{x7k&Vy~H?9NJ0Ii*e?L%~4xfJIOFW!t(6R)J8iYv&G`aC9}9uO{PNC{E&bdp zTg?|7z3|ty)h~HQ0f8FOz(*}?R|KbFs3EY+m~L0k}7m}Y1v)zz$SrWqAWnMR{k zZH9@rtRhxg3e?tXtHnW7(LW=?gWmQuM>;Li-AT0WHtIUWU$kbf_HStOs|k#!9PUil zf@2VW!+v*;Qfp??8oGeD9uj)7Cm&zEvQO3iu zfD>Lj?t%ypjbJmlRKTrg*}Y$q_7>})X8gL&n+m_=c^WGs?foZA{t zBmIG^Kihd{@Yy5is-cn9>fj{yzMj50-=K06i8i4~GIo@_!#0c?SE{(YTSF4Mj?Pn+iqYZEBKZ&``*R>j(3Rd$!4rQnesyiWZ zkb;WNd29+8(P)P^r?nlejV0SFUwz4m*1V|$d#_~aPVU1b7MT>Xc><|h>WgbSz8n6S z4RH{}Z#GR<@%hto*3&m32tq!&p^L_SN}&l~#w#6akfl(mXWHtvL1wmFHm&4O%h1$i z^(VaE!N)hLFiv~=q*GVWMf16#N8$YsUN$%{Q7LaJp88&Zr7_$$^S zQBg^#Frsrk9se$5`Abru3qN(tXastBdEMa#-r!1XEhkjy3~YZ{=b5A3)jO3&7=I=> z4@Kb`Gimkg&T$OH4H#3-X-k*yWZCN&Gh)&OQybvU9XSlKzI52V7qGY5hUCqS$mBeH z(qXPPsiavmN7u_S2)X8B1oo_C6BwNs2-=T}pL!&oK>ms9_N*1+_tN%}rpi2FR>>Z7 zD%*LFr0d2iXB+p8d`ghlU@S*hGnI{7^SfaINIu~694$FaS(TXP&z_9 z)Tw-$-}!8tA1u>$8c7|h+X~T{Qw^N6-MfRk6zS>;=f1Qrzns= ztfFCwK;SY(rKf@q>z5)U)rR*n6cA=a((g*dB2;?x*;Iat?HFg>&KMl*LxZXeierRmeDB%A~#&Y zlTm<(=NC%%m^PzYCyLznz`^ z$WK_nL2*5;2~^kBA!PlHFpo-P?%P%qh#dtC6ov?zv) zd+3va9}J^2{)jJ~uMdrLEkA4Klu75lve%AoMu49E7<8y|%#iM$3)+W%*Xd$WD zNf5j=9!Vf3l6lm6qG#T^{nZvmyC-R(*+K_H-JDJ!=o1&!79Mm$d-3_Mp?BSz+UrN? z-@)$4>hm+cA72y}%5j93y$HbqH(xoVB0>zPROK)fl}Z$GjylMeYTq?2rH0tk??!lB zfc6PQEkvc{zw8}T&EFoN>d)U!O}<$si@PE*3lB$Si}SfaB=X9zht zbg8;&i2QA}39`)NXU44m{gbuyk?j|W)wfsa4Nph(+!@sl270Z@rrR{=oByPDQ5d|3QFqA|Fu_v>pLv57aBg-%Z0RHjK@vsSPs-vjZb%K zf6b8VJMAOX?Zk>(w;t5zMx99fUVp7$_g1*cs#Hx=KRY9T<9!@ zUBNwSn11(^fs?a~&@YeJ-M;($SQRurHr7E;JuehMi)2)^JsR0CyqM{hd#CR0+r@X2 zFg6qigX$>7I8I^V^^C1_11zR^iJv(rvSBB;7*Z#lV(d6y>+Q3lgcn1GC2CJ#0cC3s zhC_^k9B&p~Ru~jyE~f%qc{-PZU2AA1ygGM9Cpm+|St~$p)V69aJ5v94idEim?;pqe znBw;)eF7f(6!%^g5Vp3t89#Gub_a8OxBq^fzoG6CaEuAfHByNnZZz~$7Q-Oe21f>m zE2=!}-skUgsMGc3IykKde2sc{Su|Jeyfgxi!W4Oil}1%gp5JKARLC*?3vT0BSh9`# z#qflN1!KQMi=1cQyW>}GCd;K*O$hnvXAf=?FoGRiR0!G(KOP8Jn*Vu69cz>?z5unYVh&HT4Aqgt zalTd#kstd-&NzqZ{T!i)Xe67qm;L+e16|DT$A9Y`Pg}mHeLLO{Kd{oO#oKSYpd1?e z!vw^*PF_pj2>g+%N7{ku`Nk;~btYCB^QQG0aO54$gu67W;)>7kfRoO!)qD?R?nKz*i0JON zyHkuy;kX4Q9c_P<8$*xyyx*bLYIG)#?nl#|jD1Uw#5cu5hV67<`{v#^0F)?>=O154 za(r9|-r9lr`FSOpRC5My<(VN}K65k95>8i2yl#4!QAM}Aj{n1AVK#ak-89~DF{zTW zs|pTA)!ff7BrA*VQ>P;P#?;GSofb!z13t|1DePk-QPX?qg)FWwMQCZri45Yn#!NV6 z?Csu~2?)ccO{|KNcx{J`Xb3mfG>X6*i3iY>k*_NB^5dUwv+OzHx@kTx;D;xCXFU)% znRe4sk5O{*#QCja*O!@o4Db4Q%naRgDyIB6b&eICGT1@g=%532ZuOd-pDLn z@=!(N*`jxG1=j4T-y9*bN~D!miKScUtk&SnfX{r;Hbu$P|M?s{)poVE0MNzj>fPR! z4j=6Y~+iNdaKDj|x-fF7eeBjYk7 z*5?t=QQcaVX{chVA{&AQHB2mdnh3++jh2EJ=8Afsd;@x^;23axIrXt z!tMrE=H_93!paQkRZZbh2DiJmdYPCs-&&X-kJJ<@U35V;aeshgaA$3tNi4~HajM)E z(LUPt@xQx@rlVsvJRn)&=nRPo;<}@0=nh^pB%^~-seu}dHUs)%`rsY@#9r3fuYmzc zV4}eCGoxR+FbJHs8bkVs$`a(Wm{kZzD-7UT^ksJuhaj(8H0t%L>1+vf-aS-ukR1<2 zb?gW?j~hQm39X8rKK7$F)A&(7cbH}QX~3Hxgte2957O2n5N{Dowkw)6>!#eqFh9Jj zx}ssjRY3bAPHSnJ)**?GqV8{0_IQzvkG(ICPY)BKH!bR%rsJKfrc7)!-9G1M1u9ifrlySoLdb@pyce<4K&xH}Q}9Pv~jD$Gq{piRH zi4^)dL*%zGzEZ~g#jZ4op0jV~HPJIZDgXASZT4_UVy6vPUFR8tx`xG4mBxW9zqw96 zcL==`W0i<;ewq8fi_#GAb7q0--?y#CLiA-s)T?0ZhhurMO2>Fy+ql|@jbKq1`$zc< zi!301RJg#(&o9@ULkBs+dDCNMsl|i;$EYG3o5oS#D<3^`BJaEuz2?z2OR-E+7QVQ0 z=1UtAjcc9L2e8_)MO7hEtF}G0%|eGsnnM&2XmZ^T9z?yV?ezjeNHA&h#nXm-R#rPT ztgJPBjv3wzCjemnuRAPtU!psCB-MXD-?`@%nwtL#VqYcz-s{`PjM%(kBbP|pHUOitiEDE!L&+hZ_CG@wf z3&$BUU09wE&rXE!&wDw%z zeU2L9V)KonwZudZr%Fo-k_QI+TZAIS56IhuA#BEwKkA`jmc{%i!UHYZ38SVS7Hrzf z>Z9dTbGtU$daOZ-D9V&MJc`0klq~-rbtPH!YClclsC+w%dAJ|W0#ChSMeUdIU@L3- zHXru?=-C~|b$!DuQnFTRznsn~=2w;0IHGJMyU$t8Eeew@6C-(sA}{+DDn$oo@tHe0 zLwrA8?KWPrlv%QGFU(~s7Cd?jDoj<>e5YKcUJM$g?iQPnENHy%=cHeNZYOd(dq|u8 z-;i>fFmZAr64YcytwP0VB_rmg(yQ`^gYrhKgu@2)CfkOK&oi%)3^ldRtvouk2A^7M zo3DZBH&^OFox76hY1gtsg#$%JE_WV|muI?St5uHJ&4y%XK}VpL>~@Qx=DfZEzZA{ z3{)~iOD6t}J=YPjnp-h%5>I4}1b)o|pBgFk9=&7^c+_MyP-kO_06wCSjriD!L_7I) ze({1}P%1psNoV-TxrK$^N-?ituw#aXRC)Yfbz;IiTCND9qtn%o%r>o+d)puKlKEEk z29eH9=V=(RLvs^n2qWn2$Bah%S~Gnimg()6uc)^R(%?LNJqml)ni4HH9Y9d&cd=GY zXO3Gig&fMh6iFY78*XWm2MtMp_0%y&n$#35rH znz1h;6=TPTXLhw;S^3?c91a?po%XMKUo`9!B`Zr)xtV*n-^zVf`XJb78?7q&1p9AZ z&#!o~Y=30_JQp-Lo|#zh(#B^}p%ry?MR1ZG@no`J*xfH^&r={7RwDXuxBDGd1ymi! z$IZ|0cdYrLMZrLHX?@5#Yj;FgXOx({kJMJ>v)D~ji$8MDGaiAr#h5@wD8TLaJC!%8 zf|b%9ouVR$*Gvq&bSu!)oQ*(G*En?ZMbyt)ouC!IiLN>y1O9yOeVKA{UDD7>9y5Oi z|Mk6N;~#(9dQw~3Tspt!$dOu))6{H`VQSq&HZx;W{q0FaXv9b4+VJpagXmX({DnRd z92}wZ#b|FY75i;RfcJ%)*~oygG%OT!sDB(9Jl1E~(fPPi9j=9@`(CXTSMbl;vr8Rc zoB{ZyC!hP~@~&6^>a&FhmcFN_w;q56zK=7*Twi`PVHX4)F;-%UU8+K7th?J|$oeC7 zHLQV@@j(%4Jx1^R$>CwK6ir{3zC`o$PE7PlW8h}Mw@R!Rzx>TEum9Srcc8l&%xH=B zx63XcAgFhB?)-4#c-o%gLiiQOfK>Z8F0WsRb^s1YZ)KJ`j~Zn1{o^lzXZjyY*HVgixya|g*Z-cE?Ggw7#D}a!66V;s3rZmvsT-# z5~A|Yeff^AkKfd&D`Z8Jtz4DjFgpPukR^sa6inqqk5$!lkrm=2j&A0!v%=-x(`nf3 z`*eN}XouZ>v?y^Aq4Olstd!K}wi?nJ=1h7a@!T3<(^rB_)&w(B01rRXD|I<4%;y{s z60#)!RksIxdMRnDEE@ENBQHQ@p_J~_S!vFY;9x&(NTp|z9Ua1m++G`*$3FiHKDyFw z-H5WlgmFV&Yp<(R&lOja%7}f2T5vjtV-w&BDX#)#p%y(_b{wRHge`mVkgrPl67GE0 z-qoQ|lUVFi02U~FyYnC)CO(z!=B_cVQ`S{cFren&{>88}k>o2&2E6=ysYSe&ygcHC z<}=zv@Gxw?2EDfx`XgJG=fAZf0F!av_J2~mcFj}r+VY`Q{@BxD%xFM&IA^%NFQTJW z%B?r0RnBF*kT2J=|EIf#8gTt-`IpXMr^mS^ldrKc;AA$sq-EsLqjg?H7&{av)lm%i zf1@Xk48~w%mf#IncXj3Lk0iRS7067*?z+s zW@ct*a}*F~fBn?E0mqm62hpwLu)aJObozYMtJFEv`4sQ7y@dvpIeOLR@jo*irhlHZ(*ga#Vi@nfK}CS z2(ci`luex|rBA~mLP>VjiD*pFXV88M=oEdrOgl3=W1* zGLnphUE>NR)?5OI1RM5?*5aVbMYjvGUFRPoB)-3Pufhg*b+VWuBhIw8^mKKdJM=Ra zrbeUKwUwwax^KrBpWlc3=?Z4tcKU-qn=l?(LHxDPaP5dAgO?~#ov5tPyz$QU7E($m{JDK3_dOgIMhg6zR}UC@Lb487lUeCP|E3s@76t(ek0i;6zn$_}~G1 zh4h(()J|4GlL@SjzzM&qj$33&bh`$J%-NiFCVXQlIoI8!cv-}V8mTT44k_Gs@1Pqi zWIzxuVE2`yN#$dpu`KZ`szq{}uTVr^0~Gy`*kWk$ZtB?krtUJOw-VVs(7(kx1K;h2 zjjr4|1Y>Tpie0m~KFW8(R&=p%o0LP?)1e3WwwJ0`Zr5_0Qj~_HCE~OsZ2qFny60i%NnPj*sNw&J4r$1*vK_@jhe;OiSbO0&NWfptju*_6 z8+I0;j)5srduoq|^KrMws#y4u&Jd%&>)^}_`%R_AB-=wS!%d?#clgw`@RT6Csz?P^ z^=EcO20rTidL-EG_k$8`6FQ;OH0R3EaG%oSX1FH9d2v&9Yyx!zK8FBNnVBry+%8?E z_7l=}zJ3d`4n^_~Fk8Y^agtHEfI3Glz;}W1m66)F^MGk7h7JGMR ztL&z08CLrCB_ksZuh`V8W*?upYTR|_G&NsdUVdH?%(MUC3FPYmoeLU6LIuMcdIiZe z!F3pKP`MqEA+Wd;=d!TM>EvsqL<9aPVk_?HjlYUYC=n9mMr_>K8ucYaMWvi}BrA}2Y#{TC zDON~u1b@@i?)lCPQDhutA)m=f^d-D%Fnj6zRL}#VZyS%k*03kT|LtjJ9HeizWZ3jb zG26d?=X`Lz4j-bjFGF5PFHk(eb~T-mT=mo17SaGNvT1z#)K!H62QBQZW3tuWxscxW zkSP8R8#;O5W53yHO@`gbd}=KgkN5?ZAR0}ECiUX`k%r31YGc_)6C9~u(%V&E;BUJc zU=oB$SdJhlKW(;KsqN&jCEQ*yT>omNgwbGMJm59egtsa1NydY zsiyG1I)oxN$#Vb1?TJn zkJ0Dhc$}~)Ox`1x8oY2wn*;gd+?0A{Xto(IK09s5Gt^XKx7ZqBkadGs( z<60yzw06PShjVG+=aF8b&lf@#?vylC)I73G#nhQHg5G?9<8ij{^(o|xg?-ojP#@_v(F!LqaRj5w6^TdJ{4y^w9kllf7#XmTeqvY z$!723iBYTC^lGKJ{p}q2)mUb|h0|xBVS&}F`3m@0r36dq&u0kopc*7ZC1Er}$w(W~yr$H5J{uN9Bi^E&&tYl??J1^_~(|`+{K?Rp4@aN@bmrvqvqt zP^iE2B@yphUx`VKDbuVe%a1Uy2p@<3f^Tk`TOa?BmwWYjvL2Qb*6!1B&n?Fytg3+4Ro)OOEJg8qW3&xh0VUoCIS8{ddq zmk0#<#+Zb{7;j1EHm1RS#AGcwkX2)WHuY6w>-Z4`frLLhkB{nWSrPPg|<1dygODOG$sFoa(L}F+;1*0TUwwxvwJ`1)EroPn22K945 z-L!gl4J=l?RL6O3*Dvn=F-zVftE22)@v$TDB_lz+D-iW_yNeq5V;gkDEA+6a_FpEJ z-?3oZ-4N@?&)27a+q?G)eUIZ0uVa3!b+lV#B}dxlMh^bVse)oo zy#-;pxmur)X7m1$*O*%;>jEz+ev{Sn;Nk~0J6JDiy>u#_+dppxeC)esi_6j!%&4(o zU3YF+A7adXLs8TiwG%*rMmYKD8m&EHdwX2l{K8upVc8#v(L;2_k5n8rvHz7GyPq7- z$kR8u8`2$Jt||uh8Cu3x08>qSH9IzC%={|~pRrKX9r6b$D{xO#|Go9AyEF1V{O%uk z#{5Y2n4-x6owwxvOA&>#OSd?e>crl(nM;b3^O&(fp`?txnkguG4<3I>=ERt1Qp^hT zDpr4*TFcOV&2n(e-1WEawYqLsz+lMT)fkdXV;!O50$Lu1Z6!2{vn@e;Px}T5m%6#6 zBw+Qz1CHRffCJ4^ZtqU4_l+V8wsHO-0j79&ewXhXWG6qV@hjF9$ukFbZNxEhe||^D zj?X_pW9s-JP2v+4N%De1Ik&~X8PufHVgfVQClo32+_oMk^2&HrrVQ3{Z%aH>tN}gF zjYoNvC6m+MXW}a9PTQN`1$t>r{Hv<2-8&dd%@y*&m|L1IXA~Y7OQr3&8SaBIUcfFW zyi(661V2ihKaY)P#p5u7|GSM?k^xuEC-+G7P7!0*e@BT-8 z&MM~IapTi{-~E6kuM`S(d)BRdN?W70)m?lr5l0@SqP`yOW0n)?T;PRhQD0I~vFY3W6@`7^o(&Rbf zk`m5*Hh1CtDI|^Km7Axg99gokG-_mMJ8lJU8~CSxnt-0kmz*i37az*$&$~xuT;bWW z9l68HamRJAk)ivvPn7LcN+$yP--YQcpj9DM3+Weyt|az&z%O=1K*m%y#V5Eeo@c?% zfnCw-H+21!hGP%M!UXWGhRLN5>aCZ3(mgN*-GWZ)YG&@_@+J6Xy;>uqu*xNEi^g_o zhq=~Aro_}4gC@R0o!Vna^Mx$z zimPEsVN${?(V`^c8m;)i>*Dig(x}PY^%=M_@9zD+QO0#66F|#Vl8D5FBrao0)les5 zF_Ze0hOIue>RtAefhUk)U&I2={s==uBRy9ic>Y3jrTHOftlYqTZO`p&puw^oIK?QU zqAYF{ZvR!AtLN0?F`l{#XaGMN68+<1S$n;I2P6Sxesd0d&&!R<0-N}2KvMWH<9Ecl z%)MAuSsDEa4rLOrWCd8ClxT&;iTIH~7obKSh^0=zqu^TaphTck5L=(Jrzv14uDq1E zZH-j#2CNwt1fcGpn%@-^*ncd!TJ8n@Ygus}fWc+!Z9ssAGH=rP@4JkiW=UP#OLMlw z12@@qsO2fr59S|mZ=zePKX-^PTQPq_G_gu*;GYiqJx!MLJ9GZv+D-C+qu=?~$MIe= z|LUEar4O^9$=2FG;C=;I^Se%Gd%QLoeegQ=JZPR13>&TN4n`6l1&)p1;mb<8w0|KB z%9af+F3z-Y7nAtffBHz#iOmJAuC4OnQx-)QQ+Q72iXI8kSxdplAr=TxrZ15(VI2}h zCU9bJTf;bVB*G1*7u?A-{5~dU+hg)F1S$tn36Sv-596qAK?sW#GG!*+;WG$M7gZrl zZK1icTcvXnLj})oL=`~_TK{Lc-s%uG zXktg3phCxGfSv){GzbB2$a+%9$N=0nWbk}KB+zrgx|8IuAyFxWEk7zK+tUUv*c^~A zeE8GtKio2>0zE;1e9EzHy^|Ke6airvO5IBA8>bk{OAh1T)YS;;CyYTO1k6s8{o-hF^d#b zT{%H&4%TG;?}P`sRK?h(%DfpwbRZghWzAI4$htRX9b3d3YoN<&Ku0Kp>LlB9=KI_Z zm72ksK3Vea-vrM;s+noJRl=B`z=(w{R zNou)2{9hd8+}zv%;B|3wb=CIR!d2(Puykon;r*!{id<;wAK$weTK_Kh_?!oFCTkE` z5JRTu0(?gtoD)cip(%MP(6RAlCQqclQmw-Kvg7!_?vlG)x-G^JlsCKdTf(Z#wtc*n{2R!c^?Ju?~5DxZjC_$ntF5Ypf zKe8tZ1@odvNM$7+kuC~4y+|vZ{Ll5gdkpP{RT$C%mF$M|AaYPc&tlsraF|n0BHXj4 z0VR<;&)i-ul>QkHQL^TXfX=DGG=mXsKxE*upy6NPKSx%2~eS~b-{Y@cN<7V(?TD{AXp_huc9Bb;lQ^;gYy9_Qny;w1`-~P?pmAu-r7AHk&ULP=dasv?uly zHRdO`H3!>~Mi4u9)t9+i-YP)p9rj=09r*q17($}79((K7^}E zQyQl`<+!9Kd93*&TD|yt*Ugs?Jeu9K`|6;m!?xX}I|QV=LrOZA zl1^!q?(UAILrS_qKtx(fLSO-<8w8}gK|orT-ShMP<~=iK&OaZ+Z)Rt9XZM*W?&pr{ zy6)@s4pzjJc^DU6O6{f%L!VlL?yhcSeDu|Dgz(2}_Lz{u37Qj!t2XVQLX($mm)n=2 zID?3?8#?q#oKY4Zz%5zZwbHRkO|=q6DMP6g31{x`#AMXq0Z;jye|-??g#!Iweq89F z3i^QRaGQ{6v0hXB3_ylSdt`Eq5#gu)NZ9`I=bw$OV?oFgiOa%QB1DFP2;-wajL0p|SM<>4VMK@Fmeek7UkjNWu+#f1)7pYC;6bTHp{0 zKY_B6CQjtC{vJ+ay6%Dn!(q+lTXn=39v#dwN)rduKVLdfR@{?onu9pVWx2UBuf$U9 zhXVcrLW5^%F?oDEtZ-1-?w6hdW?8zyP2~*zk9H#N7-6aD+&j4K?Lh-d`vZu9h@846 z^`6$7Mb(VtcBKNu>HP+v6+zs8YEWy`xA6)Q@wz(R;3xa_{`+MqV98z^S*?A#slDd0 zw?E&xr;!fPq~nqtJDi~U)Ia6B)=1yjA=N-bEZu!+7Yck}!Q#Z@_HH*z^6@psFY-=u zVcCsKvrHcf`{`GuB5?wn+nJTaJYs`FTs=C5`#C+=Kzj{x0EArl)hz?@IQ7W>G(tOD zos_QjfdySuGz2;BQ07k@JJ7J!ZaeeJaoGO;=iVYWJEE=G`h#OQC|{AM=v7XlL$y=V zi0Z4+$oSoKLK?=V!~Di^lcEV&z#d+BR+>$ojkrb2#T|bO@U76*}4NE5n>(`4yOuRnKny z$&(Zj`j>%430~=C4bcLdauZd%SAk=zM#0=5bNHW}6XE1y)qkSVwKT7Mm6iMKP~$SZ z#AU^@6g714};=)$o_{?gQs*}dgh!aoql;J;el*S74W)B0UfuILyY1TaqyjD+!H_5V+ZK!(ScWRL7_T9^ zon~fjWX*u z+|9U%`Zl-qkG2NN(Su|Sz zS~w|WN=^0DJtNx^oU{>j6ioctOt;Z!w*h|K(7qXoW7oyYidYXxD(?{0DCRTPV4$Q@ zV9)A3Lw{8Yuz+OVu#L>@kdVuz%i)Y7stCYJW25@veJ1vd5E>7|^>2t6#LE5#{Xd`O z3`i&d@(y4iU$4;Sx)YZQ8N)-qyC*c`33H zB4BE23KRZXkntd0?~KU3Su36OFkP~Xlj!LY_NM}_t5FTx?Z#&{mqn-fv_XfZ6!tPe z(wqCuS3Z(}qBaafhFwm99z!BPr7`I&{B_8uT4A}U%0eP5GdJo`f!y?cqJvBLi|yF+ zW>rh0nt?&E{|k+ic^ZQuF2=IFVp^f}kk@M)v@>|*MegM=@Jv|i&03j3HP@TTG2-Lv zdr1eO5*Bl+?{{f;q=-8xB<50f?BM<~6*6A=#=vL@eow*Mw&q8rN957{_qe8c8!@64 zHhUlTs?jJ(Z}eg_%VcfXnkBQvGSI6nP*f-gJFr&4LL)R_Oz4bmZ*+K%-TgV6Ylu4l zO3|7*_j`S`F$x}Ewh7>Tb%8_%=oAA4iFyhVFzII zyReseEtEWBX8kPffE|8mAjo4^0eOgSO0i2tGHRyNeTvZ)RC|X1k)V&WUE9Px^lR8t z5I(oWV8k^8a9bQ{MytuA4MaB6LNN)tx+ejwok4z&c{kg^;Q{D8}aW4Er}AMZvYk^;t{|| zX?_Ei9s2mAX4fYMkGrVW^~mPqTZK8_>>zoCw?xl!;@S(@ICAboyHZ;YH~&1Rn#}#T z`Ww@f9=;MSd8tBe@&(C26tvJuMU<>~8PrWJ;g`f!-yT`6luFbkDEC^0L3MDpht>J| z2VRB+-?UBMN2Yo{rRJf-vAe6S1p+=jO1o}IvTdwpX2uH&5jAw9Z8s(z%_i*f9emLz z>MZ(YOU4w2E*jg*cqAfT$JkJh)Pz-=>~ zZhhz+`u5jPS$`!Z`G^YvNB)bu`s;F=vH0}wCe9jXi91ed+DyFimc8UcbR(}9yO1^@<$>0;4-|9B55v#qJSs8VPXDc}hNXH9s zK>`f_Zg|5YIw#3KpM)UQTorL6B+k2LpwJ36euM( zi^W3@R^v_~;8qxG`nRF`Q+seC`#Zq-^%C0&ynC#n?XZ)y6D}zFvTr0I|FC)>ZT|%Q zS_p8HKRGHtDoD3Ju!i{^tAI53(2XHyf!AFwxbOlV+?mzY@!oamdX*<6lo+JgxSH&L z>`t%KU;M=Z+X)=!D%=S7J1D+1xI4{`TpYQFFzM!xff`%sO>8Sq41PKpk{D=3b8Z}-NOI1ia+6^?BxFE{>~1^;$;p@i7u3+VR3A|I~ZWp7rra{(I#avA^g$K z`j%dm@yI1skU~MFtT?=S2fSp7!T?LUIfqsQ?0m5wS>+4v~;ku^Yb>oE5-fFZY zegDM*$Q2#N@MGt{`;J|S^mormcZtPi)l-YVUp%{nXOdicayaab=4VI5 zB79FZyA-ufMF$*^?0b!eIt=!VGy>JSlO#p%i+3P@c2#;Uy4}{qPu#*icUKeivPzG;gI25%iFfi=$T~?-8M{l)h)0 zM~E}W_8x)aa8zHh?@!(XXLt+jim?i0T7awCd;Lw*0`<&i6BCnm1pKiMYFPhv#1Q&d z-$Z&^Q_NP-=XEnx)sn_AjZNK#$K|B{A0HlH|LGU6Kle+Ny!{x%d^s5gRnpS{B}%8{2%(4xC+zC8s$ojN>kuyb?t zkw^PX5N*!#@Guw$FYK|(wn{6d^i3ZFVGZtwkb2lr~VK{Kj!AL}7HBCnYE_Wpm4v-}0JS(Py~Pn{}~?91%8 z!g#K68ZNL}HPe8uE3`>EmAfYB{!O zMT16-tkUz>qPt{I&PRNXr@ccqS0@I=>hP}&Zn?3$#RBMux_9cW>tRS2`e8eLH==K* zlt%EaOiUJwAOdTRZKau!Y2}12RX{EX8t^bBiUJgoioW0s75T4^5J2v~V>RqR4JGPI zRQC^6vXdu;sPVNtES3R19-#cQDFef_SS8o0Bo1pvY0xtCLrAnv%~*HFlR1m8zAh=GKM3}V@S18n9l~b^7(6bn1=Ot z8-Ddq{l~(GzO~wvxNuVK;&B7fV^J@EIx?Wl9IVWa_UAI}o%Pf8J`pAx!KT+EhmE3` z_=RvhV^GJq29@-9$Haljp1ME6e%5O5{6b>Jgn9dtC{LTRk6{zHoxCr=2#Dt-pFcfU zTcde#<9!8oNE#Ix86DP%Pyewsij9KP|o zxMvu*>u;$A8JOD9@OE7wiy za0<)WOSkhc;{}H%^ zb$`CIu`T~TZ&SxZOWwQX&xmwzWkElTlm&-}LRq6;={prK z-fc1y9@1xOcpU2y01+`N62yiAo~`M1#PCvHD*B20@UH^F))G*wYRJmhjM=z*qZOq9sY_PJ1|5I*4<#kwM`p<5QA1Pno#&w2C=qsya>Z-F zVQa6)7eL$c!4DuNafr!qmpS2NwaxKhp;AR!S+<%fu-h;Jqgh`$K?(EYo|G}}BGdKp7Q zGTPKMD~$<``$Z9Be4|T;)#DH(XARM+kL29RCZ%%a6*|m1FC{+?iB;DB@%3T`LcBq< zDv7Yqf-ZsI@_lm~CTJ!;HY+Nbp9)Cc007gb7jr8sYQhC9Y05@851?|xkcG|##n~Tw zf>|QXSg~H#g28W&XwLS}HlPV}JFjwVNty!kC8jwE3diUe^?A}359p$yMh_^!vNCa~ zRn|=6ES=J4)%IKX5t@H1`68h3T4jb<0!XzTWWrMIz6E-2+H&;(qa9A&eL?J9_m-Qe zXEJ=AzeWrVu(h;{mNzRgYgl`yGc@Y}ZhhzO(;0l;YhQtDW!$hDnbcpjCS_@aPdLXe2(tuCA6R9Q>|Sjo1g4y%saR5#-gu0 z2NVyRNlGj4L=$APwhY7mg2;M0v-Kg3v2E)?i7vuwFGy>ykc=9w(98pFQ6;21YbOQ# zIQImf>rvdXw1GU#9$7)@rf88VPHfVJH1w>hqRmm6eqg(+gYiw^0+pQ4_5(n1ODg6E zoQn~VgZjkeMF8_Qrv=6%k2nPIPtUmw-jCRLh!+{4NZeYHoU4L4lG1cjlJ=6Z^)qDq zjDg&3>Y}CKI+*sJgU)4rJf^lm3Jr*P?#(aPUik7_wg{@q3i(Zcz6lVr6<^y;q42aJ}cS>I|&msIL;UJ@+UxeiO>phKFlGJ9W6 z-n0tT+E8RQ3yMkF%)i8!Rgh&nJ?Ygax5lM!f+g+JB@VD>sb-@r4}syAcc=(5Grrf> zZc9xuMlbA4xzq(vG+8rz8_k=IwHux^naW{%lZm7eIlk^P~g*_hgChnu=)hsBL)pU-|4p1UlySSJ{rJ*4NdtJxIKj*Nh)*p(_;zMPl)l;=> z0-3B3$;5nJkNcv}V$Y>MmUHOq7VM(bXRfJK&~E~#F751uZ*_y&wtLoJH(wQIV0l%y>`C>X|_R)1X^6$)j&ifqYkV zAGY@jJuuBaEu8KWVFD;{13v6=&mKTB-d?XJt3`z|Z8XC*^;CsU_z><+Sh0>XEBh?8 zsosav45}5g9~bB1ogQ`wb(HSBe=$UGq9ChOpbiKIByE_9Pe+uEYER0Ym~4*k&?PGd zZpDzb1BEEiKLwx1;!X2lDLTac&`DtL)^u0EGF8K)zvgL{MzJ7Ekv>G z@O04=jy-`o<{(Y|%-8J&tjDh=pQ7jkasq1TK4&$tj*0r7xXueLOA8s%fsMh*5BPPtZu6n|tG|YMb zOM3g;RS3_%O0W8j8X&UC2B6=q&z4&Svb!Nre)hk+Y+%Q3kz$BzIc!{DiV!=7a(e?X zlK%c}^8sYoF`Y#X%djwK8B4R3?i#h;aZRJd7|6@K-4Sz1i9V{JmoWu7UUPVh#vAT> zclA7tC)4y&Qc~B~*C3+?kNrRAM@N=EKAAH!I&!6iKq6xGTh%CJkiuiCF$yT^(gvS4 zQfLk8iBcD5jaWH+rgZ@v4W67auTDU40VxUX(a1VS zKAGUq(TPR6Uj)6kP~VHQhC=z5c{Ttl+~~z1(1g)yLJ^Soi^Hd>_MQ~jh;u4;U4QJ6 zwqC3~x<@gHT3T6gcEL8kG%Bj5<+GCpnzR7=C8`zawn5!@?x}xnFp^l3{(XH4LVDRF zVBKmP0r>d251a4yM>l>p*^U87=7msj#>2NYH=sIuT#PV*6bcs#9EucV% zFZq+12qT<~g%L4(ylt(QHyG8)my2}TmlmsIMlTcrVi>?I1T@};z(fgxf}er9U`tyY z)uIk@YKQ$4Etj1)@b(jcel=RS7oQMPy)sdU+Z{N=HT zCM%o$r;+1rZfn(S87fUnF910>6Ijc>Yt8 zdGLYVXnq3NMfLV(Xud9T_zV9Za@JT(R-Lr~Vr{zuJDA#NhJf#2HQ$e0;0+Dp_e1Aj zH8<%J$R~N5Z8J41>nL>i$XiC8ot?|SeWS`5vz^ehd*i32mFio}3Nd%)x?9(UNNqgv zK5__IEK5>76mXJY11YeY3`yOGsF|7I?sf62z_T0dxihj30Cqd3Yjd?fkz7ph&Hwx> z96T5Eb73ZaKYwXYz4l+%g1`554ULE!+W!WsW5Aw^!s2W!(STz7XPhdaePxM6r7;x`67 zCq9>L5}Qj7@}ak}&ICPI1bb{Lp^A%YltE?@wUGwX7R@Mq+#ep9QK7__!!V-8m3%p2 zMDv?}Ph|vj4Qc9i1>XGQ32ljH0%vAS7-56hUq>2a`3+D|eNr)Jc_j(E!=Xq-WB!Nj zAPS!WetE~Q|FE4)+`v;8v+wTT>zys*7}XJ7|E9r>S(IJtrb0|@ip%2}I~@ngK6E*) z9zFh$1+CQOO^GJd1#aK=?;(wao<$2eV`V|CCJ-_CQ<@p?I8D|=E=X?8>Ota_q_an?B1+u*Ak&yu2I zbEw&Z>;hJb5E5n1xzM!f(~9z5D}_fmbEE?}qEaa_4r-hVKxThhZJDpQ6hKi55J!vs zSHSEUtAVJ65bEUOef(NkLvoA9gtBoy&XJqB9hDWvZAM~bY-KB0JX9w~854-pY~Wew z|I@Y@ZqJROIUl3sSB4{w%=t=XkSs^JEj!?7ngDgbL_Rdq>^_POExe}P;BGf0T&7d# zRewqEuQyuAdZ=wUeV+LyNN;js5QBRhH}9~;eaJ%9Ul>C9>3sD!EVuw+T=Dl7F*GU_ zGJ1DW`0$42qBW}Rgq^apOxCytw-(hSVen85RpFVe&$f@MXdw@3917|)Q~hZYG<|LW z+~Xkdtxs!@#cyIp>jc;aW$(-uo>7=e|IO8bqGpGofAJG;G*Mvg>|Zy7{!uub+k z85avXsJUIQNb!47^9#{*-13|>4U+*_DO}B zkzgtyzXu}JI@mK3!pwMee5*~^=DCj zVFG^;PcP0rXTyHB8umUV>MkebB)2%fHF5rTlx~5NwCAZnXHV&|6CJfP<68bEXZ?I~ zTFK=O)zPfOxvTw0oaJDtB%kMw=e~TiS!LaZRv*WHbu)?Xv#go49Q!kQp7pKVbRy}mQ^z!if$}*)ncvFd)5)*-m1;MoTwrBgmB#wPp_A-{+NIr)Vohmm<;pn_M*uLHjc@?J!VQPw-Y>jCF^&-0Hg+GVN^WG4BbY? za)ULZ213=}-bjQ6Rb*a7jaIogRq&GSHRcb^^r%ACl7JJ`0NoAE>(~%>Y)T zp3*7JE%_NW&eq5S`4MGHSO{dC5PE7N7wjIM#?$>LzqEUCO4%^~cAXWN```PE!L<`+ z0B1yjU~?!n!4~_hyEN}zUYla4AUv1BtPBU!S`wEL3xajA<>PQT zxs-ZM8VP-qJ^k$2dk)n;pcgN~EaU&nB>~F}{jHkE*jK9v*kfhG zTN-ktwyUvv7E~-y7-I)3QCNg>y+VHjBQ~~ZVl!_*F$_`R(cQ>nq9a_e_o-JTj|;NX z_ned)QGkqy;1~Gv5OoPVVOipvI6|h~zk?Nw18~@;sR@lPQ2Ry(j2PZHig8W~DPJ8J zr}J^!c8q*A^&iu4MFvmwxM}!$*sn6(*4Lw9#WJW(zokVuLcxk*{jma|u`$CwseLue z!?UVQEF*_3s`Q3xM@9YliL+%qpxh8UxEDN8z?$x+q2v3IVvz)cWkHa&>9t8X$ZV~j z1Pm~ zp>EcCC1MV56Z4aO8N*}q?7D15WZuyahPMP8Iw{(AXAa<_JyyI&D6d$Fvgl_{*mWeh zFZ|?t1GkHEylR*Sz}(Yk2$u(NUbk&JREHKFW>I0_q*{aC~|_VnHe;U z$lo?Eaw~$i#0A!(|6Tf%c1kRbqAnr2C|0?w@1vpNjq6*3Mpu0H!{`>WBFmvjY=@et zput>oH%>EY)NuaQ~_J*cwVHD;GMDMLHOa27X?jSmpc=LhK6QZ z6h(~w^Rgj3*zTgF3+Z!F#1hP2j|Nfwe0y!P@v^Rsnk1# zX8AaiYSk-r3dOOpWjIWgW<8J1v6~*H>}k&k(%r`O!o+m*?v}CG0FoH>S<3av%Jp~` zgd;KWyM;0dz}aCo{BggP#omD<`Fv?qcPlu6v#F@eCTLrKQD~n@pQHTf)d!jW67<`2ItcOuho21D!Mnkok-}7$1_Lia5=la0m9Sm}Qpt5cjh(nYF zKn68phT0o1?pE~zaWO;=!!v^!?7-E{3ri4Op#_-m4PSC*+ zj(15PvO#Ielcp4DS$v97*iajev+hbTTA^nuUR;!y&LH2n{<)sIx8K{eTNyult6_S4 zy5bE^RHsGfhXCoh2oI2dsru3z;Ci-&p=^PI7-QZLlIB8Yuu+0U?x~6jD3-6+_skcO zz-@50ejyBSg@itt32l=XlFr?Q)d`eh?j|D(g({@`>jTdk4cZB-dK>86i~hc7Ff4lq zxeu)krw}>PNYRJHLmX&P*{4H{S?`3VR~NsmOn*=P(HXnbG1a6#h6fM-Yt0YzI4xOBaT6}Z4#SqfR< z#NM)Mj9nEBq_4Q1lh=7mp2#})&3D^O@>wP36V=hY!gEu-BvBFjXA@g8 zH6P{Vb&}G|qpGIuxHaS#ag~^?nGJqmDr%ubj2?O{^)E_jGMTC@2jdwA3l4aQ&T1q* zC+L583!Q*?0V4_5PS^k@%@l@YJwZiNfB+;5n!d%I{UP@ge-q_G)D20bluh zxO#%}q*{N;fO523Qhn0+3;D`WR9x-rvE71XZ5$8!L(URCr~&`Csq-QGs}i}yTnKP! z9cES4`%jn(BRE==AMBfrQBzHt_kqxWTU-Nnw)UPfv)<{D#oG0UQNjC!-F%gM>yK|V z2q_IypVD|}eJ8~t?)5tT4*iO7)`X7cf2bB(*VQ~xd-X0mDJSMZx6WLzz(pptuoL+@ z7kH&wWg@iO)25u$*?|S^`?z)Ik)cxI(E>?dWBjwE`eJlq%<$g!YbU$fiU)T~YJ3+B z#{YWub3ZnIhf`&JqLT3a@Mk+NiM*8zoCyMMOG?GTY+PmJ$P*u9-D}T={U{^npeDNh zxiZIlYui(Rcw{exh4>p>w*=c5tKKr#KkFt{X-k>Rhq^|(>4{?^lQR&-UPV3QWbk+} zn=@UHIrP>@kM)euvXOI}%R^anozR`TXmHbYyn;+Q5y2IkFf*Xfz|L2Y)aqDh9!qU8 zl=uSpvNa?T&Ybv7Vebe^x8MEvypclpO z|Le6oZUgZOo~p;YLuri39GNMJq$2rPJ%t8L3O2dbgiX>wx9?h-V{;ZkBxb=Ew^;I~ z{ubp z4;e!akR%54W@#_9;5RsBDafwa7N#<;9Ge)lMj8zV!<0Rfq~5rMMY{n2u1A@p&J}Ca zpuW%*Xlz&E*n~p$bO?@sJ!Q(hq)ycc|M&AIuuQ--Z4>@r|~OZ*3J~ z_ku?BmEIf_MqQn?Bxelm^-Lo!w!TXZDeCNA`-@_0{{kWIOTcUj*w>OWRQwJ?=yli@ zY7u7WKGHcqPsFf!4_s232#++|mt26~;9!X+q%YeQ8zc`W6+IC3zvRTLCYJVw-ghu8d*U2_7Un80?fqF|9E%YimECt@mx$zCBd?%RvPQ~|YgbE`iDZ*D-vFLC$-NL7WVs$?b*$*{WqF*!AELZce(G3AP&6M3Qz zO8gGF4oO7355|g6@BY*Hddu7m6eYTJ>i+i+_UozdN9P_Svv{r3Jifqw;kl6-5tocw!*T2Acjt^Y=74pQ$y z2}DyO8G+n+H6Qz7)xGx!N>%&bUV`)KDy6Or`kg-|lSe+^EVpm=6yoXdKo26&r5c)X zaw(ms2VsCpkR*A0Cl}42vRV_UD!FPLSpoXRl~NKbJ6ECj8}^%TBfaq}KoydhvfA%% zVieD&3;AuJ@QIaccnM^2&bX-CBTJLIX6w)17|D?5EdJa>=HB0%6I7Qt0bozUTbQxwj7IN>t-zqEG&Dw{bsXIBI~Q)n^L#sx^=0nu*5vF-77_X(5Y-S0$^o zP!jY7;CdJz7c#R%TQ~?8#P5i5G+c&)u^jU!GNp5&8beO0I(aF?GJo3E9>N~a+VVy? zRk1K-|9!OV^F{8Wrn-j4(UcPEq!_Ja07!o;r0|B4o6gD*x8whQQ z6Txm83_t7cP`QA8_%}=$_o5TNcJG5pe**}|*xE1rC`J)x+Z%t;!7OarFa1+r;@{+= zO{02%KuR?;NFJb`N|`Xd8cB^a}1^W@0czG;nKmlaePQ0BC3+39E8X}35z=j zF^dw1Z}9lPW>l_9pZ4zjL~_`Dk({Ohw(ol8P3v77$|I0mp59IKg$UVG9k6YA4QH;u zzaChFv)vBdO4@KO3B$dwSB*Zdyi$-F(f%%%+ToTuL+L(EZY4nGL7sh|WcsA^su(U` zSq2YGVnj9Fl~O%9_ekQXX!uoOY!PIMEPlEwQ=@}ID6{ehM0?ezN*P%|w_$;J*k>Rm zBlCQ`bp;*fo%RLP*}13gET!Twq&rfc9gO<{4WM6eb8l^IxZKn+Gi51|yh=d&nq1)O zGP_eEA=Nf#5OWxUvQ3f=>?< z#olH?Jfv?BmO6R}%gfJy4;szoruBi_XfO?%)`MyeC%hOZ2&Wf4T+^SJkdWRuOmb?6 zwx3U-&R`7pe7PWSTzL5Cz;C%pGzaITOw9^JoeWFQXe8zPmHLHU}9LOG3hxjr)hgh;N z8334>qAhnN1qI)K{7|rcy86ZSG^aPSu|=+=O0{`}MxfSAuvI18V}#(KeB-L_;>Pfv z3M9-hPpTIaO}Wl3_7a`^msqAV74%xvhGBNdHyP+jrU9r~tLxr&RvrmyPn@VfWbzL? z%AW?(1|(GdEo0Y|JNcT{e0Tfnfv=HxBOLz1!8?O6>jiPs4V}2eA(*rJxMb+_HLsVt z@xOEbQI7PQ^Aj26rYr_AF>&uGXM8xNb$p3~e6=wBSZX={e&3xh_h-}nG|eBXIT7UF zo#V>qmWGcm9D-Ug*M;(Lf~3ThvSsNMDD<{za@y}^Xud3FytRXneG9yc8pM}Hc}noI z%Tv&qMQOT$039*yewMjVyzk)Ps78GLTn(XpWI;831&On!uHr+dwsQ2t8zLn@2F2G! z^6E;aQ;ep z(IV(=aD^rLHUNl~FT!LFq~ZPTsq##|3jVUP$jM7d_V1_fJrvri48JoU@lG+GkWASm zU4YrBJZHbzNap-2LA|4lMi78DhlA0FOk-vB6MYy1g~9mK7c2H8Z`1SkrY7WI&fe-4 z6Ye!dI}M^Vq1YunhK9O2TlJV<;NQ-1*%~i%NBSpKvzwALLMO}EM}nHVGyIz2SYols zPhtDPLVHTLr;GRBoF$y?9`JMMJF52IE8VfcwMp%JYV9}SG$|q2RGT@Z<_sYX zvGQYDfVUtFO37hck2Q-WoR%6dPkqF7W}yWAawUQhYP{wU(K` ze}neWQ2n-n`%q9wD8{ZiZ%wXDFTTr!;PiT`?0#aw?8yC!{okZ2h!NzLI)_kPquH6; z{4S#+Rlt7z`sMR2OMTD&rp%j^TvICZ|jQ->7GJn#xw@=OO?6#en~Dq|oo_1R&O+i`krp>$Mf9@>6ok zw{fIV^u62LjLT=j(S*O2m*ogiRj|}6=lT%YETZ-(8g_rL%c)LR2Wmc&Ww_rYp)C8( z*sbv1d``tHv|ZphCwrP}ozsNGm6KPDy-#BJI`VQfrLQlqUc}VcSj8?s{k2u-9L8Np zKw-oq$T}JtCSLf$DnmA8zyCQhyYcH(e*CF#8$boqI|4m!1`6DdYELE79ecpcbN0He zb+#_LdXQ|kF1iz{U{x`b9N}N=4@u { - const { act, data } = useBackend(context); - const { activerecord, realname, health, unidentity, strucenzymes } = - modal.args; - const damages = health.split(' - '); - return ( -

- - {realname} - - {damages.length > 1 ? ( - <> - - {damages[0]} - -  |  - - {damages[2]} - -  |  - - {damages[3]} - -  |  - - {damages[1]} - - - ) : ( - Unknown - )} - - - {unidentity} - - - {strucenzymes} - - -
- ); -}; +const brokenFlag = 1 << 0; +const internalBleedingFlag = 1 << 5; +const burnWoundFlag = 1 << 7; export const CloningConsole = (props, context) => { const { act, data } = useBackend(context); - const { menu } = data; - modalRegisterBodyOverride('view_rec', viewRecordModalBodyOverride); + const { tab, has_scanner, pod_amount } = data; return ( - - - - - - - - -
- -
-
-
+ + +
+ + + {has_scanner ? 'Online' : 'Missing'} + + + {pod_amount} + + +
+ + act('menu', { tab: 1 })} + > + Main Menu + + act('menu', { tab: 2 })} + > + Damage Configuration + + +
+ +
); }; -const CloningConsoleNavigation = (props, context) => { - const { act, data } = useBackend(context); - const { menu } = data; - return ( - - - - act('menu', { - num: 1, - }) - } - > - Main - - - act('menu', { - num: 2, - }) - } - > - Records - - - - ); -}; - const CloningConsoleBody = (props, context) => { const { data } = useBackend(context); - const { menu } = data; + const { tab } = data; let body; - if (menu === 1) { + if (tab === 1) { body = ; - } else if (menu === 2) { - body = ; + } else if (tab === 2) { + body = ; } return body; }; const CloningConsoleMain = (props, context) => { const { act, data } = useBackend(context); - const { - loading, - scantemp, - occupant, - locked, - can_brainscan, - scan_mode, - numberofpods, - pods, - selected_pod, - } = data; - const isLocked = locked && !!occupant; + const { pods, pod_amount, selected_pod_UID } = data; return ( - <> -
- - Scanner Lock:  - -
-
- {numberofpods ? ( - pods.map((pod, i) => { - let podAction; - if (pod.status === 'cloning') { - podAction = ( - - {round(pod.progress, 0) + '%'} - - ); - } else if (pod.status === 'mess') { - podAction = ( - - ERROR - - ); - } else { - podAction = ( -
- + Select + + + + + + {!pod['cloning'] && ( + Pod is inactive. + )} + {!!pod['cloning'] && ( + + )} + + + + + {pod['biomass']}/ + {pod['biomass_storage_capacity'] + + ' (' + + (100 * pod['biomass']) / + pod['biomass_storage_capacity'] + + '%)'} + + + + {pod['sanguine_reagent']} + + + {pod['osseous_reagent']} + + + + + + ))} + ); }; -const CloningConsoleRecords = (props, context) => { +const CloningConsoleDamage = (props, context) => { const { act, data } = useBackend(context); - const { records } = data; - if (!records.length) { - return ( - - - -
- No records found. -
-
- ); - } + const { + selected_pod_data, + has_scanned, + scanner_has_patient, + feedback, + scan_successful, + cloning_cost, + has_scanner, + } = data; return ( - - {records.map((record, i) => ( - + + + } + > + {!has_scanned && ( + + {scanner_has_patient + ? 'No scan detected for current patient.' + : 'No patient is in the scanner.'} + + )} + {!!has_scanned && ( + {feedback['text']} + )} + +
+ + {(!scan_successful || !has_scanned) && ( + No valid scan detected. + )} + {!!scan_successful && !!has_scanned && ( + + + + + + + + + + + + + + selected_pod_data['biomass'] + ? 'bad' + : null + } + > + Biomass: {cloning_cost[0]}/ + {selected_pod_data['biomass']}/ + {selected_pod_data['biomass_storage_capacity']} + + + + + selected_pod_data['sanguine_reagent'] + ? 'bad' + : 'good' + } + > + Sanguine: {cloning_cost[1]}/ + {selected_pod_data['sanguine_reagent']}/ + {selected_pod_data['max_reagent_capacity']} + + + + selected_pod_data['osseous_reagent'] + ? 'bad' + : 'good' + } + > + Osseous: {cloning_cost[2]}/ + {selected_pod_data['osseous_reagent']}/ + {selected_pod_data['max_reagent_capacity']} + + + + + + + )} + +
+ + )} ); }; -const CloningConsoleTemp = (props, context) => { +const LimbsMenu = (props, context) => { const { act, data } = useBackend(context); - const { temp } = data; - if (!temp || !temp.text || temp.text.length <= 0) { - return; - } - - const tempProp = { [temp.style]: true }; + const { patient_limb_data, limb_list, desired_limb_data } = data; return ( - - - {temp.text} - -