diff --git a/baystation12.dme b/baystation12.dme
index 79074cacbce..2202d4f3848 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -43,6 +43,7 @@
#include "code\_onclick\item_attack.dm"
#include "code\_onclick\observer.dm"
#include "code\_onclick\other_mobs.dm"
+#include "code\_onclick\rig.dm"
#include "code\_onclick\telekinesis.dm"
#include "code\_onclick\hud\_defines.dm"
#include "code\_onclick\hud\alien_larva.dm"
@@ -1007,6 +1008,7 @@
#include "code\modules\food\recipes_microwave.dm"
#include "code\modules\games\cards.dm"
#include "code\modules\genetics\side_effects.dm"
+#include "code\modules\ghosttrap\trap.dm"
#include "code\modules\holodeck\HolodeckControl.dm"
#include "code\modules\holodeck\HolodeckObjects.dm"
#include "code\modules\holodeck\HolodeckPrograms.dm"
@@ -1334,8 +1336,8 @@
#include "code\modules\nano\modules\power_monitor.dm"
#include "code\modules\nano\modules\rcon.dm"
#include "code\modules\organs\blood.dm"
+#include "code\modules\organs\misc.dm"
#include "code\modules\organs\organ.dm"
-#include "code\modules\organs\organ_alien.dm"
#include "code\modules\organs\organ_external.dm"
#include "code\modules\organs\organ_icon.dm"
#include "code\modules\organs\organ_internal.dm"
@@ -1343,6 +1345,11 @@
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\robolimbs.dm"
#include "code\modules\organs\wound.dm"
+#include "code\modules\organs\subtypes\diona.dm"
+#include "code\modules\organs\subtypes\machine.dm"
+#include "code\modules\organs\subtypes\standard.dm"
+#include "code\modules\organs\subtypes\unbreakable.dm"
+#include "code\modules\organs\subtypes\xenos.dm"
#include "code\modules\overmap\_defines.dm"
#include "code\modules\overmap\sectors.dm"
#include "code\modules\overmap\ships\ship.dm"
@@ -1645,16 +1652,14 @@
#include "code\modules\spells\targeted\projectile\projectile.dm"
#include "code\modules\supermatter\supermatter.dm"
#include "code\modules\surgery\bones.dm"
-#include "code\modules\surgery\brainrepair.dm"
#include "code\modules\surgery\encased.dm"
-#include "code\modules\surgery\eye.dm"
#include "code\modules\surgery\face.dm"
#include "code\modules\surgery\generic.dm"
-#include "code\modules\surgery\headreattach.dm"
#include "code\modules\surgery\implant.dm"
+#include "code\modules\surgery\limb_reattach.dm"
#include "code\modules\surgery\organs_internal.dm"
#include "code\modules\surgery\other.dm"
-#include "code\modules\surgery\robolimbs.dm"
+#include "code\modules\surgery\robotics.dm"
#include "code\modules\surgery\slimes.dm"
#include "code\modules\surgery\surgery.dm"
#include "code\modules\tables\flipping.dm"
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index b8caa45399d..7307927ac0d 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -229,17 +229,6 @@
/mob/living/carbon/MiddleClickOn(var/atom/A)
swap_hand()
-/mob/living/carbon/human/MiddleClickOn(var/atom/A)
-
- if(back)
- var/obj/item/weapon/rig/rig = back
- if(istype(rig) && rig.selected_module)
- if(world.time <= next_move) return
- next_move = world.time + 8
- rig.selected_module.engage(A)
- return
-
- swap_hand()
// In case of use break glass
/*
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index 477fb04b7ad..179a470fc6b 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -97,8 +97,6 @@
if (powerlevel > 0 && !istype(A, /mob/living/carbon/slime))
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- return
stunprob *= H.species.siemens_coefficient
diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm
new file mode 100644
index 00000000000..ad9346ec15f
--- /dev/null
+++ b/code/_onclick/rig.dm
@@ -0,0 +1,63 @@
+
+#define MIDDLE_CLICK 0
+#define ALT_CLICK 1
+#define CTRL_CLICK 2
+#define MAX_HARDSUIT_CLICK_MODE 2
+
+/client
+ var/hardsuit_click_mode = MIDDLE_CLICK
+
+/client/verb/toggle_hardsuit_mode()
+ set name = "Toggle Hardsuit Activation Mode"
+ set desc = "Switch between hardsuit activation modes."
+ set category = "OOC"
+
+ hardsuit_click_mode++
+ if(hardsuit_click_mode > MAX_HARDSUIT_CLICK_MODE)
+ hardsuit_click_mode = 0
+
+ switch(hardsuit_click_mode)
+ if(MIDDLE_CLICK)
+ src << "Hardsuit activation mode set to middle-click."
+ if(ALT_CLICK)
+ src << "Hardsuit activation mode set to alt-click."
+ if(CTRL_CLICK)
+ src << "Hardsuit activation mode set to control-click."
+ else
+ // should never get here, but just in case:
+ soft_assert(0, "Bad hardsuit click mode: [hardsuit_click_mode] - expected 0 to [MAX_HARDSUIT_CLICK_MODE]")
+ src << "Somehow you bugged the system. Setting your hardsuit mode to middle-click."
+ hardsuit_click_mode = MIDDLE_CLICK
+
+/mob/living/carbon/human/MiddleClickOn(atom/A)
+ if(client && client.hardsuit_click_mode == MIDDLE_CLICK)
+ if(HardsuitClickOn(A))
+ return
+ ..()
+
+/mob/living/carbon/human/AltClickOn(atom/A)
+ if(client && client.hardsuit_click_mode == ALT_CLICK)
+ if(HardsuitClickOn(A))
+ return
+ ..()
+
+/mob/living/carbon/human/CtrlClickOn(atom/A)
+ if(client && client.hardsuit_click_mode == CTRL_CLICK)
+ if(HardsuitClickOn(A))
+ return
+ ..()
+
+/mob/living/carbon/human/proc/HardsuitClickOn(atom/A)
+ if(back)
+ var/obj/item/weapon/rig/rig = back
+ if(istype(rig) && rig.selected_module)
+ if(world.time <= next_move) return 1
+ next_move = world.time + 8
+ rig.selected_module.engage(A)
+ return 1
+ return 0
+
+#undef MIDDLE_CLICK
+#undef ALT_CLICK
+#undef CTRL_CLICK
+#undef MAX_HARDSUIT_CLICK_MODE
diff --git a/code/datums/disease.dm b/code/datums/disease.dm
index 398dc73bbbc..606acdef99e 100644
--- a/code/datums/disease.dm
+++ b/code/datums/disease.dm
@@ -53,14 +53,15 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
// if hidden[2] is true, then virus is hidden from PANDEMIC machine
/datum/disease/proc/stage_act()
+
+ // Some species are immune to viruses entirely.
+ if(affected_mob && istype(affected_mob, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = affected_mob
+ if(H.species.virus_immune)
+ cure()
+ return
age++
var/cure_present = has_cure()
- //world << "[cure_present]"
-
- if(carrier&&!cure_present)
- //world << "[affected_mob] is carrier"
- return
-
spread = (cure_present?"Remissive":initial_spread)
if(stage > max_stages)
stage = max_stages
@@ -126,7 +127,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
source = affected_mob
else //no source and no mob affected. Rogue disease. Break
return
-
+
if(affected_mob.reagents != null)
if(affected_mob)
if(affected_mob.reagents.has_reagent("spaceacillin"))
diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm
index 9fe4226e5bb..bd436ceaf8e 100644
--- a/code/game/antagonist/alien/borer.dm
+++ b/code/game/antagonist/alien/borer.dm
@@ -33,7 +33,10 @@ var/datum/antagonist/xenos/borer/borers
/datum/antagonist/xenos/borer/proc/get_hosts()
var/list/possible_hosts = list()
for(var/mob/living/carbon/human/H in mob_list)
- if(H.stat != 2 && !(H.species.flags & IS_SYNTHETIC) && !H.has_brain_worms())
+ var/obj/item/organ/external/head/head = H.get_organ("head")
+ if(head.status & ORGAN_ROBOT)
+ continue
+ if(H.stat != DEAD && !H.has_brain_worms())
possible_hosts |= H
return possible_hosts
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index ba40b09e448..99aab0eb080 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -23,6 +23,10 @@
/datum/job/proc/equip(var/mob/living/carbon/human/H)
return 1
+// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
+/datum/job/proc/equip_preview(mob/living/carbon/human/H)
+ return equip(H)
+
/datum/job/proc/get_access()
if(!config || config.jobs_have_minimal_access)
return src.minimal_access.Copy()
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index 11d8f70a12b..8889f238dd5 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -17,6 +17,9 @@
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
+/datum/job/ai/equip_preview(mob/living/carbon/human/H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/straight_jacket(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head)
/datum/job/cyborg
title = "Cyborg"
@@ -32,4 +35,8 @@
equip(var/mob/living/carbon/human/H)
if(!H) return 0
- return 1
\ No newline at end of file
+ return 1
+
+/datum/job/cyborg/equip_preview(mob/living/carbon/human/H)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/cardborg(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/cardborg(H), slot_head)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 8c6be59f712..645bfa5bccf 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -390,7 +390,8 @@
infected = "Acute Infection++:"
if (INFECTION_LEVEL_THREE to INFINITY)
infected = "Septic:"
-
+ if(e.rejecting)
+ infected += "(being rejected)"
if (e.implants.len)
var/unknown_body = 0
for(var/I in e.implants)
@@ -406,7 +407,7 @@
if(!(e.status & ORGAN_DESTROYED))
dat += "
[e.name] | [e.burn_dam] | [e.brute_dam] | [robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured] | "
else
- dat += "[e.name] | - | - | Not Found | "
+ dat += "[e.name] | - | - | Not [e.is_stump() ? "Found" : "Attached Completely"] | "
dat += ""
for(var/obj/item/organ/i in occ["internal_organs"])
@@ -431,6 +432,8 @@
infection = "Acute Infection+:"
if (INFECTION_LEVEL_TWO + 300 to INFINITY)
infection = "Acute Infection++:"
+ if(i.rejecting)
+ infection += "(being rejected)"
dat += ""
dat += "| [i.name] | N/A | [i.damage] | [infection]:[mech] | | "
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 84a6b7730c7..d0d72fc53f2 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-
/obj/machinery/computer/robotics
name = "robotics control console"
desc = "Used to remotely lockdown or detonate linked cyborgs."
@@ -9,218 +7,205 @@
req_access = list(access_robotics)
circuit = "/obj/item/weapon/circuitboard/robotics"
- var/id = 0.0
- var/temp = null
- var/status = 0
- var/timeleft = 60
- var/stop = 0.0
- var/screen = 0 // 0 - Main Menu, 1 - Cyborg Status, 2 - Kill 'em All! -- In text
-
+ var/safety = 1
/obj/machinery/computer/robotics/attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+ ui_interact(user)
/obj/machinery/computer/robotics/attack_hand(var/mob/user as mob)
- if(..())
- return
- if (src.z > 6)
- user << "\red Unable to establish a connection: \black You're too far away from the station!"
- return
- user.set_machine(src)
- var/dat
- if (src.temp)
- dat = "[src.temp]
Clear Screen"
- else
- if(screen == 0)
- dat += "Cyborg Control Console
"
- dat += "1. Cyborg Status
"
- dat += "2. Emergency Full Destruct
"
- if(screen == 1)
- for(var/mob/living/silicon/robot/R in mob_list)
- if(istype(R, /mob/living/silicon/robot/drone))
- continue //There's a specific console for drones.
- if(istype(user, /mob/living/silicon/ai))
- if (R.connected_ai != user)
- continue
- if(istype(user, /mob/living/silicon/robot))
- if (R != user)
- continue
- if(R.scrambledcodes)
- continue
+ ui_interact(user)
- dat += "[R.name] |"
- if(R.stat)
- dat += " Not Responding |"
- else if (!R.canmove)
- dat += " Locked Down |"
- else
- dat += " Operating Normally |"
- if (!R.canmove)
- else if(R.cell)
- dat += " Battery Installed ([R.cell.charge]/[R.cell.maxcharge]) |"
- else
- dat += " No Cell Installed |"
- if(R.module)
- dat += " Module Installed ([R.module.name]) |"
- else
- dat += " No Module Installed |"
- if(R.connected_ai)
- dat += " Slaved to [R.connected_ai.name] |"
- else
- dat += " Independent from AI |"
- if (istype(user, /mob/living/silicon))
- if((user.mind.special_role && user.mind.original == user) && !R.emagged)
- dat += "(Hack) "
- dat += "([R.canmove ? "Lockdown" : "Release"]) "
- dat += "(Destroy)"
- dat += "
"
- dat += "(Return to Main Menu)
"
- if(screen == 2)
- if(!src.status)
- dat += {"
Emergency Robot Self-Destruct
\nStatus: Off
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
- \nStart Sequence
- \n
- \nClose"}
- else
- dat = {"Emergency Robot Self-Destruct
\nStatus: Activated
- \n
- \nCountdown: [src.timeleft]/60 \[Reset\]
- \n
\nStop Sequence
- \n
- \nClose"}
- dat += "(Return to Main Menu)
"
+/obj/machinery/computer/robotics/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+ data["robots"] = get_cyborgs(user)
+ data["safety"] = safety
+ // Also applies for cyborgs. Hides the manual self-destruct button.
+ data["is_ai"] = user.isSilicon()
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
- return
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/obj/machinery/computer/robotics/Topic(href, href_list)
if(..())
- return 1
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.set_machine(src)
+ return
+ var/mob/user = usr
+ if(!src.allowed(user))
+ user << "Access Denied"
+ return
- if (href_list["eject"])
- src.temp = {"Destroy Robots?
-
\[Swipe ID to initiate destruction sequence\]
- Cancel"}
-
- else if (href_list["eject2"])
- var/obj/item/weapon/card/id/I = usr.get_active_hand()
- if (istype(I, /obj/item/device/pda))
- var/obj/item/device/pda/pda = I
- I = pda.id
- if (istype(I))
- if(src.check_access(I))
- if (!status)
- message_admins("\blue [key_name_admin(usr)] has initiated the global cyborg killswitch!")
- log_game("\blue [key_name(usr)] has initiated the global cyborg killswitch!")
- src.status = 1
- src.start_sequence()
- src.temp = null
-
- else
- usr << "\red Access Denied."
-
- else if (href_list["stop"])
- src.temp = {"
- Stop Robot Destruction Sequence?
-
Yes
- No"}
-
- else if (href_list["stop2"])
- src.stop = 1
- src.temp = null
- src.status = 0
-
- else if (href_list["reset"])
- src.timeleft = 60
-
- else if (href_list["temp"])
- src.temp = null
- else if (href_list["screen"])
- switch(href_list["screen"])
- if("0")
- screen = 0
- if("1")
- screen = 1
- if("2")
- screen = 2
- else if (href_list["killbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["killbot"])
- if(R)
- var/choice = input("Are you certain you wish to detonate [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- if(R.mind && R.mind.special_role && R.emagged)
- R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
- R.ResetSecurityCodes()
-
- else
- message_admins("\blue [key_name_admin(usr)] detonated [R.name]!")
- log_game("\blue [key_name_admin(usr)] detonated [R.name]!")
- R.self_destruct()
- else
- usr << "\red Access Denied."
-
- else if (href_list["stopbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["stopbot"])
- if(R && istype(R)) // Extra sancheck because of input var references
- var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
- message_admins("\blue [key_name_admin(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [R.name]!")
- R.canmove = !R.canmove
- if (R.lockcharge)
- // R.cell.charge = R.lockcharge
- R.lockcharge = !R.lockcharge
- R << "Your lockdown has been lifted!"
- else
- R.lockcharge = !R.lockcharge
- // R.cell.charge = 0
- R << "You have been locked down!"
-
- else
- usr << "\red Access Denied."
-
- else if (href_list["magbot"])
- if(src.allowed(usr))
- var/mob/living/silicon/robot/R = locate(href_list["magbot"])
-
- // whatever weirdness this is supposed to be, but that is how the href gets added, so here it is again
- if(istype(R) && istype(usr, /mob/living/silicon) && usr.mind.special_role && (usr.mind.original == usr) && !R.emagged)
-
- var/choice = input("Are you certain you wish to hack [R.name]?") in list("Confirm", "Abort")
- if(choice == "Confirm")
- if(R && istype(R))
-// message_admins("\blue [key_name_admin(usr)] emagged [R.name] using robotic console!")
- log_game("[key_name(usr)] emagged [R.name] using robotic console!")
- R.emagged = 1
- if(R.mind.special_role)
- R.verbs += /mob/living/silicon/robot/proc/ResetSecurityCodes
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-/obj/machinery/computer/robotics/proc/start_sequence()
-
- do
- if(src.stop)
- src.stop = 0
+ // Destroys the cyborg
+ if(href_list["detonate"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["detonate"])
+ if(!target || !istype(target))
return
- src.timeleft--
- sleep(10)
- while(src.timeleft)
+ if(user.isMobAI() && (target.connected_ai != user))
+ user << "Access Denied. This robot is not linked to you."
+ return
+ // Cyborgs may blow up themselves via the console
+ if(isrobot(user) && user != target)
+ user << "Access Denied."
+ return
+ var/choice = input("Really detonate [target.name]?") in list ("Yes", "No")
+ if(choice != "Yes")
+ return
+ if(!target || !istype(target))
+ return
+
+ // Antagonistic cyborgs? Left here for downstream
+ if(target.mind && target.mind.special_role && target.emagged)
+ target << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
+ target.ResetSecurityCodes()
+ else
+ message_admins("\blue [key_name_admin(usr)] detonated [target.name]!")
+ log_game("\blue [key_name_admin(usr)] detonated [target.name]!")
+ target << "Self-destruct command received."
+ spawn(10)
+ target.self_destruct()
+
+
+
+ // Locks or unlocks the cyborg
+ else if (href_list["lockdown"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"])
+ if(!target || !istype(target))
+ return
+
+ if(user.isMobAI() && (target.connected_ai != user))
+ user << "Access Denied. This robot is not linked to you."
+ return
+
+ if(isrobot(user))
+ user << "Access Denied."
+ return
+
+ var/choice = input("Really [target.lockcharge ? "unlock" : "lockdown"] [target.name] ?") in list ("Yes", "No")
+ if(choice != "Yes")
+ return
+
+ if(!target || !istype(target))
+ return
+
+ message_admins("\blue [key_name_admin(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
+ log_game("[key_name(usr)] [target.canmove ? "locked down" : "released"] [target.name]!")
+ target.canmove = !target.canmove
+ if (target.lockcharge)
+ target.lockcharge = !target.lockcharge
+ target << "Your lockdown has been lifted!"
+ else
+ target.lockcharge = !target.lockcharge
+ target << "You have been locked down!"
+
+ // Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
+ else if (href_list["hack"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"])
+ if(!target || !istype(target))
+ return
+
+ // Antag AI checks
+ if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user))
+ user << "Access Denied"
+ return
+
+ if(target.emagged)
+ user << "Robot is already hacked."
+ return
+
+ var/choice = input("Really hack [target.name]? This cannot be undone.") in list("Yes", "No")
+ if(choice != "Yes")
+ return
+
+ if(!target || !istype(target))
+ return
+
+ message_admins("\blue [key_name_admin(usr)] emagged [target.name] using robotic console!")
+ log_game("[key_name(usr)] emagged [target.name] using robotic console!")
+ target.emagged = 1
+ target << "Failsafe protocols overriden. New tools available."
+
+ // Arms the emergency self-destruct system
+ else if(href_list["arm"])
+ if(istype(user, /mob/living/silicon))
+ user << "Access Denied"
+ return
+
+ safety = !safety
+ user << "You [safety ? "disarm" : "arm"] the emergency self destruct"
+
+ // Destroys all accessible cyborgs if safety is disabled
+ else if(href_list["nuke"])
+ if(istype(user, /mob/living/silicon))
+ user << "Access Denied"
+ return
+ if(safety)
+ user << "Self-destruct aborted - safety active"
+ return
+
+ message_admins("\blue [key_name_admin(usr)] detonated all cyborgs!")
+ log_game("[key_name(usr)] detonated all cyborgs!")
+
+ for(var/mob/living/silicon/robot/R in mob_list)
+ if(istype(R, /mob/living/silicon/robot/drone))
+ continue
+ // Ignore antagonistic cyborgs
+ if(R.scrambledcodes)
+ continue
+ R << "Self-destruct command received."
+ spawn(10)
+ R.self_destruct()
+
+
+// Proc: get_cyborgs()
+// Parameters: 1 (operator - mob which is operating the console.)
+// Description: Returns NanoUI-friendly list of accessible cyborgs.
+/obj/machinery/computer/robotics/proc/get_cyborgs(var/mob/operator)
+ var/list/robots = list()
for(var/mob/living/silicon/robot/R in mob_list)
- if(!R.scrambledcodes && !istype(R, /mob/living/silicon/robot/drone))
- R.self_destruct()
+ // Ignore drones
+ if(istype(R, /mob/living/silicon/robot/drone))
+ continue
+ // Ignore antagonistic cyborgs
+ if(R.scrambledcodes)
+ continue
- return
+ var/list/robot = list()
+ robot["name"] = R.name
+ if(R.stat)
+ robot["status"] = "Not Responding"
+ else if (!R.canmove)
+ robot["status"] = "Lockdown"
+ else
+ robot["status"] = "Operational"
+
+ if(R.cell)
+ robot["cell"] = 1
+ robot["cell_capacity"] = R.cell.maxcharge
+ robot["cell_current"] = R.cell.charge
+ robot["cell_percentage"] = round(R.cell.percent())
+ else
+ robot["cell"] = 0
+
+ robot["module"] = R.module ? R.module.name : "None"
+ robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
+ robot["hackable"] = 0
+ // Antag AIs know whether linked cyborgs are hacked or not.
+ if(operator && istype(operator, /mob/living/silicon/ai) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator))
+ robot["hacked"] = R.emagged ? 1 : 0
+ robot["hackable"] = R.emagged? 0 : 1
+ robots.Add(list(robot))
+ return robots
+
+// Proc: get_cyborg_by_name()
+// Parameters: 1 (name - Cyborg we are trying to find)
+// Description: Helper proc for finding cyborg by name
+/obj/machinery/computer/robotics/proc/get_cyborg_by_name(var/name)
+ if (!name)
+ return
+ for(var/mob/living/silicon/robot/R in mob_list)
+ if(R.name == name)
+ return R
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 99a2dc6607a..6a82c2bf5c1 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -106,7 +106,7 @@
if(NOCLONE in T.mutations)
return
- if(T.species && T.species.flags & NO_BLOOD)
+ if(T.species.flags & NO_BLOOD)
return
// If the human is losing too much blood, beep.
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index d41ab317d96..98cc92380c7 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -176,8 +176,11 @@
R.adjustBruteLoss(-1)
if(wire_rate && R.getFireLoss())
R.adjustFireLoss(-1)
- else
- update_use_power(1)
+ else if(istype(occupant, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = occupant
+ if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450)
+ H.nutrition = min(H.nutrition+10, 450)
+ update_use_power(1)
/obj/machinery/recharge_station/proc/go_out()
if(!(occupant))
@@ -209,30 +212,42 @@
if(!user)
return
- if(!(istype(user, /mob/living/silicon/robot)))
+ var/can_accept_user
+ if(istype(user, /mob/living/silicon/robot))
+
+ var/mob/living/silicon/robot/R = user
+
+ if(R.stat == 2)
+ //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
+ return
+ if(occupant)
+ R << "The cell is already occupied!"
+ return
+ if(!R.cell)
+ R << "Without a powercell, you can't be recharged."
+ //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO
+ return
+ can_accept_user = 1
+
+ else if(istype(user, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = user
+ if(!isnull(H.internal_organs_by_name["cell"]))
+ can_accept_user = 1
+
+ if(!can_accept_user)
user << "Only non-organics may enter the recharger!"
return
- var/mob/living/silicon/robot/R = user
- if(R.stat == 2)
- //Whoever had it so that a borg with a dead cell can't enter this thing should be shot. --NEO
- return
- if(occupant)
- R << "The cell is already occupied!"
- return
- if(!R.cell)
- R << "Without a powercell, you can't be recharged."
- //Make sure they actually HAVE a cell, now that they can get in while powerless. --NEO
- return
- R.stop_pulling()
- if(R.client)
- R.client.perspective = EYE_PERSPECTIVE
- R.client.eye = src
- R.loc = src
- occupant = R
+
+ user.stop_pulling()
+ if(user.client)
+ user.client.perspective = EYE_PERSPECTIVE
+ user.client.eye = src
+ user.loc = src
+ occupant = user
/*for(var/obj/O in src)
O.loc = loc*/
- add_fingerprint(R)
+ add_fingerprint(user)
build_icon()
update_use_power(1)
return
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 6e2697657c0..4c576e0446a 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -93,7 +93,7 @@ REAGENT SCANNER
return
user.visible_message(" [user] has analyzed [M]'s vitals."," You have analyzed [M]'s vitals.")
- if (!istype(M, /mob/living/carbon) || (ishuman(M) && (M:species.flags & IS_SYNTHETIC)))
+ if (!istype(M, /mob/living/carbon) || ishuman(M))
//these sensors are designed for organic life
user.show_message("\blue Analyzing Results for ERROR:\n\t Overall Status: ERROR")
user.show_message("\t Key: Suffocation/Toxin/Burns/Brute", 1)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 563df642efa..8529e6db2e9 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -68,6 +68,7 @@
name = "torso"
desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell."
icon_state = "chest"
+ part = list("groin","chest")
construction_time = 350
construction_cost = list(DEFAULT_WALL_MATERIAL=40000)
var/wires = 0.0
@@ -77,6 +78,7 @@
name = "head"
desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals."
icon_state = "head"
+ part = list("head")
construction_time = 350
construction_cost = list(DEFAULT_WALL_MATERIAL=25000)
var/obj/item/device/flash/flash1 = null
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 7328b88d78b..a9ca4b8dc0e 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -106,14 +106,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
if(location)
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
- if(istype(C, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = C
- if(H.species.flags & IS_SYNTHETIC)
- return
-
+ if(ishuman(loc))
+ var/mob/living/carbon/human/C = loc
+ if (src == C.wear_mask && C.check_has_mouth()) // if it's in the human/monkey mouth, transfer reagents to the mob
reagents.trans_to_mob(C, REM, CHEM_INGEST, 0.2) // Most of it is not inhaled... balance reasons.
else // else just remove some of the reagents
reagents.remove_any(REM)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 9f2add5541b..6d5ea444cb8 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -254,7 +254,7 @@
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
- B1.reagents.add_reagent("fluorosurfactant", 40)
+ B1.reagents.add_reagent("surfactant", 40)
B2.reagents.add_reagent("water", 40)
B2.reagents.add_reagent("cleaner", 10)
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
index 6c2eb7ced35..cf7ebba2b44 100644
--- a/code/game/objects/items/weapons/material/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -67,7 +67,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC || (H.species.siemens_coefficient<0.5)) //Thick skin.
+ if(H.species.siemens_coefficient<0.5) //Thick skin.
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 0f8cbcc10fe..61968c7692c 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -628,3 +628,15 @@
new /obj/item/weapon/light/tube(src)
for(var/i = 0; i < 7; i++)
new /obj/item/weapon/light/bulb(src)
+
+/obj/item/weapon/storage/box/freezer
+ name = "portable freezer"
+ desc = "This nifty shock-resistant device will keep your 'groceries' nice and non-spoiled."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "portafreezer"
+ item_state = "medicalpack"
+ storage_slots=7
+ max_w_class = 3
+ can_hold = list(/obj/item/organ, /obj/item/weapon/reagent_containers/food, /obj/item/weapon/reagent_containers/glass)
+ max_storage_space = 21
+ use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 0f57ee3197b..2bf69d31e70 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -81,7 +81,8 @@
return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- if(!istype(M)) return ..()
+ if(!istype(M) || user.a_intent == "help")
+ return ..()
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
return ..()
if((CLUMSY in user.mutations) && prob(50))
@@ -329,8 +330,6 @@
var/obj/item/organ/eyes/E = H.internal_organs_by_name["eyes"]
if(!E)
return
- if(H.species.flags & IS_SYNTHETIC)
- return
switch(safety)
if(1)
usr << "\red Your eyes sting a little."
@@ -427,16 +426,12 @@
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP)
return ..()
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- if(M == user)
- user << "\red You can't repair damage to your own body - it's against OH&S."
- return
-
if(S.brute_dam)
- S.heal_damage(15,0,0,1)
- user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
+ if(S.brute_dam < ROBOLIMB_SELF_REPAIR_CAP)
+ S.heal_damage(15,0,0,1)
+ user.visible_message("\red \The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
+ else
+ user << "\red The damage is far too severe to patch over externally."
return
else
user << "Nothing to fix!"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index fcbd8902638..0848c17a119 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -634,10 +634,6 @@ datum/preferences
dat += "Has a variety of eye colours."
if(current_species.flags & IS_PLANT)
dat += "Has a plantlike physiology."
- if(current_species.flags & IS_SYNTHETIC)
- dat += "Is machine-based."
- if(current_species.flags & REGENERATES_LIMBS)
- dat += "Has a plantlike physiology."
dat += ""
dat += "
"
dat += "
"
diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm
new file mode 100644
index 00000000000..dd53c1a389b
--- /dev/null
+++ b/code/modules/ghosttrap/trap.dm
@@ -0,0 +1,114 @@
+// This system is used to grab a ghost from observers with the required preferences and
+// lack of bans set. See posibrain.dm for an example of how they are called/used. ~Z
+
+var/list/ghost_traps
+
+proc/get_ghost_trap(var/trap_key)
+ if(!ghost_traps)
+ populate_ghost_traps()
+ return ghost_traps[trap_key]
+
+proc/populate_ghost_traps()
+ ghost_traps = list()
+ for(var/traptype in typesof(/datum/ghosttrap))
+ var/datum/ghosttrap/G = new traptype
+ ghost_traps[G.object] = G
+
+/datum/ghosttrap
+ var/object = "positronic brain"
+ var/list/ban_checks = list("AI","Cyborg")
+ var/pref_check = BE_AI
+ var/ghost_trap_message = "They are occupying a positronic brain now."
+ var/ghost_trap_role = "Positronic Brain"
+
+// Check for bans, proper atom types, etc.
+/datum/ghosttrap/proc/assess_candidate(var/mob/dead/observer/candidate)
+ if(!istype(candidate) || !candidate.client || !candidate.ckey)
+ return 0
+ if(!candidate.MayRespawn())
+ candidate << "You have made use of the AntagHUD and hence cannot enter play as \a [object]."
+ return 0
+ if(islist(ban_checks))
+ for(var/bantype in ban_checks)
+ if(jobban_isbanned(candidate, "[bantype]"))
+ candidate << "You are banned from one or more required roles and hence cannot enter play as \a [object]."
+ return 0
+ return 1
+
+// Print a message to all ghosts with the right prefs/lack of bans.
+/datum/ghosttrap/proc/request_player(var/mob/target, var/request_string)
+ if(!target)
+ return
+ for(var/mob/dead/observer/O in player_list)
+ if(!O.MayRespawn())
+ continue
+ if(islist(ban_checks))
+ for(var/bantype in ban_checks)
+ if(jobban_isbanned(O, "[bantype]"))
+ continue
+ if(pref_check && !(O.client.prefs.be_special & pref_check))
+ continue
+ if(O.client)
+ O << "[request_string]Click here if you wish to play as this option."
+
+// Handles a response to request_player().
+/datum/ghosttrap/Topic(href, href_list)
+ if(..())
+ return 1
+ if(href_list["candidate"] && href_list["target"])
+ var/mob/dead/observer/candidate = locate(href_list["candidate"]) // BYOND magic.
+ var/mob/target = locate(href_list["target"]) // So much BYOND magic.
+ if(!target || !candidate)
+ return
+ if(candidate == usr && assess_candidate(candidate) && !target.ckey)
+ transfer_personality(candidate,target)
+ return 1
+
+// Shunts the ckey/mind into the target mob.
+/datum/ghosttrap/proc/transfer_personality(var/mob/candidate, var/mob/target)
+ if(!assess_candidate(candidate))
+ return 0
+ target.ckey = candidate.ckey
+ if(target.mind)
+ target.mind.assigned_role = "[ghost_trap_role]"
+ announce_ghost_joinleave(candidate, 0, "[ghost_trap_message]")
+ welcome_candidate(target)
+ set_new_name(target)
+ return 1
+
+// Fluff!
+/datum/ghosttrap/proc/welcome_candidate(var/mob/target)
+ target << "You are a positronic brain, brought into existence on [station_name()]."
+ target << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
+ target << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
+ target << "Use say :b to speak to other artificial intelligences."
+ var/turf/T = get_turf(target)
+ T.visible_message("\The [src] chimes quietly.")
+ var/obj/item/device/mmi/digital/posibrain/P = target.loc
+ if(!istype(P)) //wat
+ return
+ P.searching = 0
+ P.name = "positronic brain ([P.brainmob.name])"
+ P.icon_state = "posibrain-occupied"
+
+// Allows people to set their own name. May or may not need to be removed for posibrains if people are dumbasses.
+/datum/ghosttrap/proc/set_new_name(var/mob/target)
+ var/newname = sanitizeSafe(input(target,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
+ if (newname != "")
+ target.real_name = newname
+ target.name = target.real_name
+
+// Doona pods and walking mushrooms.
+/datum/ghosttrap/plant
+ object = "living plant"
+ ban_checks = list("Dionaea")
+ pref_check = BE_PLANT
+ ghost_trap_message = "They are occupying a living plant now."
+ ghost_trap_role = "Plant"
+
+/datum/ghosttrap/plant/welcome_candidate(var/mob/target)
+ target << "You awaken slowly, stirring into sluggish motion as the air caresses you."
-
- // This is a hack, replace with some kind of species blurb proc.
- if(istype(host,/mob/living/carbon/alien/diona))
- host << "You are [host], one of a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders."
- host << "Too much darkness will send you into shock and starve you, but light will help you heal."
-
- var/newname = sanitizeSafe(input(host,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN)
- if (newname != "")
- host.real_name = newname
- host.name = host.real_name
\ No newline at end of file
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index 7726775a1dd..08160229727 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -47,9 +47,10 @@
var/global/list/toxic_reagents = list(
"anti_toxin" = -2,
"toxin" = 2,
- "fluorine" = 2.5,
- "chlorine" = 1.5,
+ "hydrazine" = 2.5,
+ "acetone" = 1,
"sacid" = 1.5,
+ "hclacid" = 1.5,
"pacid" = 3,
"plantbgone" = 3,
"cryoxadone" = -3,
@@ -70,11 +71,11 @@
"left4zed" = 1
)
var/global/list/weedkiller_reagents = list(
- "fluorine" = -4,
- "chlorine" = -3,
+ "hydrazine" = -4,
"phosphorus" = -2,
"sugar" = 2,
"sacid" = -2,
+ "hclacid" = -2,
"pacid" = -4,
"plantbgone" = -8,
"adminordrazine" = -5
@@ -89,8 +90,7 @@
"adminordrazine" = 1,
"milk" = 0.9,
"beer" = 0.7,
- "fluorine" = -0.5,
- "chlorine" = -0.5,
+ "hydrazine" = -2,
"phosphorus" = -0.5,
"water" = 1,
"sodawater" = 1,
@@ -99,11 +99,11 @@
// Beneficial reagents also have values for modifying yield_mod and mut_mod (in that order).
var/global/list/beneficial_reagents = list(
"beer" = list( -0.05, 0, 0 ),
- "fluorine" = list( -2, 0, 0 ),
- "chlorine" = list( -1, 0, 0 ),
+ "hydrazine" = list( -2, 0, 0 ),
"phosphorus" = list( -0.75, 0, 0 ),
"sodawater" = list( 0.1, 0, 0 ),
"sacid" = list( -1, 0, 0 ),
+ "hclacid" = list( -1, 0, 0 ),
"pacid" = list( -2, 0, 0 ),
"plantbgone" = list( -2, 0, 0.2),
"cryoxadone" = list( 3, 0, 0 ),
@@ -129,7 +129,22 @@
return
return ..()
+/obj/machinery/portable_atmospherics/hydroponics/attack_ghost(var/mob/dead/observer/user)
+
+ if(!(harvest && seed && seed.has_mob_product))
+ return
+
+ var/datum/ghosttrap/plant/G = get_ghost_trap("living plant")
+ if(!G.assess_candidate(user))
+ return
+ var/response = alert(user, "Are you sure you want to harvest this [seed.display_name]?", "Living plant request", "Yes", "No")
+ if(response == "Yes")
+ harvest()
+ return
+
/obj/machinery/portable_atmospherics/hydroponics/attack_generic(var/mob/user)
+
+ // Why did I ever think this was a good idea. TODO: move this onto the nymph mob.
if(istype(user,/mob/living/carbon/alien/diona))
var/mob/living/carbon/alien/diona/nymph = user
diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm
index c9847d6cc3b..44d78497009 100644
--- a/code/modules/mob/holder.dm
+++ b/code/modules/mob/holder.dm
@@ -74,6 +74,22 @@
icon_state = "cat"
origin_tech = null
+/obj/item/weapon/holder/mouse
+ name = "mouse"
+ desc = "It's a small rodent."
+ icon_state = "mouse_gray"
+ origin_tech = null
+ w_class = 1
+
+/obj/item/weapon/holder/mouse/gray
+ icon_state = "mouse_gray"
+
+/obj/item/weapon/holder/mouse/white
+ icon_state = "mouse_white"
+
+/obj/item/weapon/holder/mouse/brown
+ icon_state = "mouse_brown"
+
/obj/item/weapon/holder/borer
name = "cortical borer"
desc = "It's a slimy brain slug. Gross."
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index d5900769b35..bb343c0e7ff 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -94,6 +94,25 @@
else
return ..()
+/datum/language/machine
+ name = "Encoded Audio Language"
+ desc = "A language of encoded tones that allow for IPCs to communicate auditorily between each other in a manner that allows for easier transfer of information."
+ speech_verb = "beeps"
+ ask_verb = "beeps"
+ exclaim_verb = "loudly beeps"
+ colour = "changeling"
+ key = "6"
+ flags = RESTRICTED | NO_STUTTER
+ syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz")
+ space_chance = 10
+
+/datum/language/machine/get_random_name()
+ if(prob(70))
+ name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ else
+ name = pick(ai_names)
+ return name
+
//Syllable Lists
/*
This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index d68008c889e..0cda53c1820 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -92,4 +92,4 @@
desc = "A tightly furled roll of paper, covered with indecipherable runes."
robotic = 2
icon = 'icons/obj/wizard.dmi'
- icon_state = "scroll"
\ No newline at end of file
+ icon_state = "scroll"
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index ffc376721c2..3c2d4422d1f 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -5,47 +5,41 @@
icon_state = "posibrain"
w_class = 3
origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4)
-
+ var/searching = 0
construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=500,"silver"=200,"gold"=200,"phoron"=100,"diamond"=10)
construction_time = 75
- var/searching = 0
- var/askDelay = 10 * 60 * 1
req_access = list(access_robotics)
locked = 0
mecha = null//This does not appear to be used outside of reference in mecha.dm.
+/obj/item/device/mmi/digital/posibrain/New()
+ ..()
+ brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ brainmob.real_name = src.brainmob.name
-/obj/item/device/mmi/digital/posibrain/attack_self(mob/user as mob)
- if(brainmob && !brainmob.key && searching == 0)
+/obj/item/device/mmi/digital/posibrain/attack_self(var/mob/user)
+ if(brainmob && !brainmob.key && !searching)
//Start the process of searching for a new user.
- user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process."
+ user << "You carefully locate the manual activation switch and start the positronic brain's boot process."
icon_state = "posibrain-searching"
- src.searching = 1
- src.request_player()
+ searching = 1
+ var/datum/ghosttrap/G = get_ghost_trap("positronic brain")
+ G.request_player(brainmob, "A [src.name] has been booted by \the [user] in [get_area(user)]. ")
spawn(600) reset_search()
-/obj/item/device/mmi/digital/posibrain/proc/request_player()
- for(var/mob/dead/observer/O in player_list)
- if(!O.MayRespawn())
- continue
- if(jobban_isbanned(O, "AI") && jobban_isbanned(O, "Cyborg"))
- continue
- if(O.client)
- if(O.client.prefs.be_special & BE_AI)
- question(O.client)
-
-/obj/item/device/mmi/digital/posibrain/proc/question(var/client/C)
- spawn(0)
- if(!C) return
- var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round")
- if(response == "Yes")
- response = alert(C, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No")
- if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
- if(response == "Yes")
- transfer_personality(C.mob)
- else if (response == "Never for this round")
- C.prefs.be_special ^= BE_AI
-
+/obj/item/device/mmi/digital/posibrain/attack_ghost(var/mob/dead/observer/user)
+ var/datum/ghosttrap/G = get_ghost_trap("positronic brain")
+ if(!G.assess_candidate(user))
+ return
+ var/response = alert(user, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No")
+ if(response == "Yes")
+ if(G.transfer_personality(user, brainmob))
+ var/turf/T = get_turf(src)
+ T.visible_message("\The [src] chimes quietly.")
+ searching = 0
+ name = "positronic brain ([brainmob.name])"
+ icon_state = "posibrain-occupied"
+ return
/obj/item/device/mmi/digital/posibrain/transfer_identity(var/mob/living/carbon/H)
..()
@@ -55,33 +49,13 @@
icon_state = "posibrain-occupied"
return
-/obj/item/device/mmi/digital/posibrain/proc/transfer_personality(var/mob/candidate)
- announce_ghost_joinleave(candidate, 0, "They are occupying a positronic brain now.")
- src.searching = 0
- src.brainmob.mind = candidate.mind
- src.brainmob.ckey = candidate.ckey
- src.name = "positronic brain ([src.brainmob.name])"
- src.brainmob << "You are a positronic brain, brought into existence on [station_name()]."
- src.brainmob << "As a synthetic intelligence, you answer to all crewmembers, as well as the AI."
- src.brainmob << "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm."
- src.brainmob << "Use say :b to speak to other artificial intelligences."
- src.brainmob.mind.assigned_role = "Positronic Brain"
-
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain chimes quietly.")
- icon_state = "posibrain-occupied"
-
-/obj/item/device/mmi/digital/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
-
- if(src.brainmob && src.brainmob.key) return
-
- src.searching = 0
+/obj/item/device/mmi/digital/posibrain/proc/reset_search()
+ if(!searching || (src.brainmob && src.brainmob.key))
+ return
+ searching = 0
icon_state = "posibrain"
-
- var/turf/T = get_turf_or_move(src.loc)
- for (var/mob/M in viewers(T))
- M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+ var/turf/T = get_turf(src)
+ T.visible_message("\The [src] brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
/obj/item/device/mmi/digital/posibrain/examine(mob/user)
if(!..(user))
@@ -115,7 +89,3 @@
src.brainmob.emp_damage += rand(0,10)
..()
-/obj/item/device/mmi/digital/posibrain/New()
- ..()
- src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- src.brainmob.real_name = src.brainmob.name
diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm
index b467b88cd2e..62f14da4996 100644
--- a/code/modules/mob/living/carbon/breathe.dm
+++ b/code/modules/mob/living/carbon/breathe.dm
@@ -2,14 +2,14 @@
/mob/living/carbon/proc/breathe()
//if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
- if(species && (species.flags & NO_BREATHE || species.flags & IS_SYNTHETIC)) return
-
+ if(species && (species.flags & NO_BREATHE)) return
+
var/datum/gas_mixture/breath = null
-
+
//First, check if we can breathe at all
if(health < config.health_threshold_crit && !(CE_STABLE in chem_effects)) //crit aka circulatory shock
losebreath++
-
+
if(losebreath>0) //Suffocating so do not take a breath
losebreath--
if (prob(10)) //Gasp per 10 ticks? Sounds about right.
@@ -17,9 +17,9 @@
else
//Okay, we can breathe, now check if we can get air
breath = get_breath_from_internal() //First, check for air from internals
- if(!breath)
+ if(!breath)
breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location
-
+
handle_breath(breath)
handle_post_breath(breath)
@@ -40,15 +40,15 @@
/mob/living/carbon/proc/get_breath_from_environment(var/volume_needed=BREATH_VOLUME)
var/datum/gas_mixture/breath = null
-
+
var/datum/gas_mixture/environment
if(loc)
environment = loc.return_air_for_internal_lifeform()
-
+
if(environment)
breath = environment.remove_volume(volume_needed)
handle_chemical_smoke(environment) //handle chemical smoke while we're at it
-
+
if(breath)
//handle mask filtering
if(istype(wear_mask, /obj/item/clothing/mask) && breath)
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 52ba116d43b..5f9527b93b9 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -118,6 +118,7 @@
b_skin = blue
force_update_limbs()
+ update_body()
return 1
/mob/living/carbon/human/proc/change_skin_tone(var/tone)
@@ -127,6 +128,7 @@
s_tone = tone
force_update_limbs()
+ update_body()
return 1
/mob/living/carbon/human/proc/update_dna()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index dad4e902446..d6510c2bf84 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -270,9 +270,8 @@
if(temp)
if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
- if(!species.flags & IS_SYNTHETIC)
- wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n"
- continue
+ wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]!\n"
+ continue
else
wound_flavor_text["[temp.name]"] = "[t_He] has a robot [temp.name]. It has[temp.get_wounds_desc()]!\n"
else if(temp.wounds.len > 0 || temp.open)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b79f4b269d9..cb5b1bdf847 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -746,10 +746,17 @@
xylophone=0
return
+/mob/living/carbon/human/proc/check_has_mouth()
+ // Todo, check stomach organ when implemented.
+ var/obj/item/organ/external/head/H = get_organ("head")
+ if(!H || !H.can_intake_reagents)
+ return 0
+ return 1
+
/mob/living/carbon/human/proc/vomit()
- if(species.flags & IS_SYNTHETIC)
- return //Machines don't throw up.
+ if(!check_has_mouth())
+ return
if(!lastpuke)
lastpuke = 1
@@ -1078,7 +1085,7 @@
usr << "[src] has no pulse!" //it is REALLY UNLIKELY that a dead person would check his own pulse
return
- usr << "You must [self ? "" : "both"] stand until counting is finished."
+ usr << "You must[self ? "" : " both"] remain still until counting is finished."
if(do_mob(usr, src, 60))
usr << "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
else
@@ -1217,16 +1224,26 @@
else
target_zone = user.zone_sel.selecting
- switch(target_zone)
- if("head")
- if(head && head.flags & THICKMATERIAL)
- . = 0
- else
- if(wear_suit && wear_suit.flags & THICKMATERIAL)
- . = 0
+ var/obj/item/organ/external/affecting = get_organ(target_zone)
+ var/fail_msg
+ if(!affecting)
+ . = 0
+ fail_msg = "They are missing that limb."
+ else if (affecting.status & ORGAN_ROBOT)
+ . = 0
+ fail_msg = "That limb is robotic."
+ else
+ switch(target_zone)
+ if("head")
+ if(head && head.flags & THICKMATERIAL)
+ . = 0
+ else
+ if(wear_suit && wear_suit.flags & THICKMATERIAL)
+ . = 0
if(!. && error_msg && user)
- // Might need re-wording.
- user << "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
+ if(!fail_msg)
+ fail_msg = "There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into."
+ user << "[fail_msg]"
/mob/living/carbon/human/print_flavor_text(var/shrink = 1)
var/list/equipment = list(src.head,src.wear_mask,src.glasses,src.w_uniform,src.wear_suit,src.gloves,src.shoes)
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 6c995d75e03..21a386b5cf1 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -48,6 +48,12 @@
switch(M.a_intent)
if(I_HELP)
if(istype(H) && health < config.health_threshold_crit && health > config.health_threshold_dead)
+ if(!H.check_has_mouth())
+ H << "You don't have a mouth, you cannot perform CPR!"
+ return
+ if(!check_has_mouth())
+ H << "They don't have a mouth, you cannot perform CPR!"
+ return
if((H.head && (H.head.flags & HEADCOVERSMOUTH)) || (H.wear_mask && (H.wear_mask.flags & MASKCOVERSMOUTH)))
H << "Remove your mask!"
return 0
@@ -178,8 +184,13 @@
miss_type = 2
// See what attack they use
+ var/possible_moves = list()
var/datum/unarmed_attack/attack = null
- for(var/datum/unarmed_attack/u_attack in H.species.unarmed_attacks)
+ for(var/part in list("l_hand","r_hand","l_foot","r_foot","head"))
+ var/obj/item/organ/external/E = H.get_organ(part)
+ possible_moves |= E.species.unarmed_attacks
+
+ for(var/datum/unarmed_attack/u_attack in possible_moves)
if(!u_attack.is_usable(H, src, hit_zone))
continue
else
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 04ca8922257..298c4fa6251 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -142,12 +142,12 @@
..()
/mob/living/carbon/human/getCloneLoss()
- if(species.flags & (IS_SYNTHETIC | NO_SCAN))
+ if(species.flags & (NO_SCAN))
cloneloss = 0
return ..()
/mob/living/carbon/human/setCloneLoss(var/amount)
- if(species.flags & (IS_SYNTHETIC | NO_SCAN))
+ if(species.flags & (NO_SCAN))
cloneloss = 0
else
..()
@@ -155,7 +155,7 @@
/mob/living/carbon/human/adjustCloneLoss(var/amount)
..()
- if(species.flags & (IS_SYNTHETIC | NO_SCAN))
+ if(species.flags & (NO_SCAN))
cloneloss = 0
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 994cab11f6f..675d3c41df6 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -179,12 +179,6 @@ emp_act
for(var/obj/O in src)
if(!O) continue
O.emp_act(severity)
- for(var/obj/item/organ/external/O in organs)
- if(O.status & ORGAN_DESTROYED) continue
- O.emp_act(severity)
- for(var/obj/item/organ/I in O.internal_organs)
- if(I.robotic == 0) continue
- I.emp_act(severity)
..()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 84a6fb82902..896f57878cd 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -258,9 +258,6 @@
proc/handle_mutations_and_radiation()
- if(species.flags & IS_SYNTHETIC) //Robots don't suffer from mutations or radloss.
- return
-
if(getFireLoss())
if((COLD_RESISTANCE in mutations) || (prob(1)))
heal_organ_damage(0,1)
@@ -709,9 +706,9 @@
*/
proc/stabilize_body_temperature()
- if (species.flags & IS_SYNTHETIC)
- bodytemperature += species.synth_temp_gain //just keep putting out heat.
- return
+
+ if (species.passive_temp_gain) // We produce heat naturally.
+ bodytemperature += species.passive_temp_gain
var/body_temperature_difference = species.body_temperature - bodytemperature
@@ -858,15 +855,16 @@
proc/handle_chemicals_in_body()
- if(reagents && !(species.flags & IS_SYNTHETIC)) //Synths don't process reagents.
+ if(reagents)
chem_effects.Cut()
analgesic = 0
var/alien = 0
if(species && species.reagent_tag)
alien = species.reagent_tag
touching.metabolize(alien, CHEM_TOUCH)
- ingested.metabolize(alien, CHEM_INGEST)
- reagents.metabolize(alien, CHEM_BLOOD)
+ if(!(species.flags & NO_BLOOD))
+ ingested.metabolize(alien, CHEM_INGEST)
+ reagents.metabolize(alien, CHEM_BLOOD)
if(CE_PAINKILLER in chem_effects)
analgesic = chem_effects[CE_PAINKILLER]
@@ -931,7 +929,8 @@
take_overall_damage(2,0)
traumatic_shock++
- if(!(species.flags & IS_SYNTHETIC)) handle_trace_chems()
+ // TODO: stomach and bloodstream organ.
+ handle_trace_chems()
updatehealth()
@@ -1133,7 +1132,7 @@
if(damageoverlay.overlays)
damageoverlay.overlays = list()
-
+
if(stat == UNCONSCIOUS)
//Critical damage passage overlay
if(health <= 0)
@@ -1268,7 +1267,7 @@
if(2) healths.icon_state = "health7"
else
//switch(health - halloss)
- switch(100 - ((species && species.flags & NO_PAIN & !IS_SYNTHETIC) ? 0 : traumatic_shock))
+ switch(100 - ((species.flags & NO_PAIN) ? 0 : traumatic_shock))
if(100 to INFINITY) healths.icon_state = "health0"
if(80 to 100) healths.icon_state = "health1"
if(60 to 80) healths.icon_state = "health2"
@@ -1504,7 +1503,8 @@
if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
- if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse.
+ if(species && species.flags & NO_BLOOD)
+ return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
return PULSE_NONE //that's it, you're dead, nothing can influence your pulse
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 10a2dca6aa5..a4591b34d28 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -170,8 +170,9 @@
/mob/living/carbon/human/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
switch(message_mode)
if("intercom")
- for(var/obj/item/device/radio/intercom/I in view(1, null))
+ for(var/obj/item/device/radio/intercom/I in view(1))
I.talk_into(src, message, verb, speaking)
+ I.add_fingerprint(src)
used_radios += I
if("headset")
if(l_ear && istype(l_ear,/obj/item/device/radio))
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 1bc6ca880a5..057fabcb5fc 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -29,6 +29,7 @@
var/icon/icon_template // Used for mob icon generation for non-32x32 species.
var/is_small
var/show_ssd = 1
+ var/virus_immune
// Language/culture vars.
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
@@ -69,7 +70,7 @@
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
var/heat_level_3 = 1000 // Heat damage level 3 above this point.
- var/synth_temp_gain = 0 // IS_SYNTHETIC species will gain this much temperature every second
+ var/passive_temp_gain = 0 // Species will gain this much temperature every second
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
var/warning_low_pressure = WARNING_LOW_PRESSURE // Low pressure warning.
@@ -213,13 +214,6 @@
for(var/obj/item/organ/external/O in H.organs)
O.owner = H
- if(flags & IS_SYNTHETIC)
- for(var/obj/item/organ/external/E in H.organs)
- if(E.status & ORGAN_CUT_AWAY || E.status & ORGAN_DESTROYED) continue
- E.robotize()
- for(var/obj/item/organ/I in H.internal_organs)
- I.robotize()
-
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
var/t_him = "them"
diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm
index 6d5e918a957..46a7e9f5f53 100644
--- a/code/modules/mob/living/carbon/human/species/station/slime.dm
+++ b/code/modules/mob/living/carbon/human/species/station/slime.dm
@@ -8,7 +8,7 @@
language = "Sol Common" //todo?
unarmed_types = list(/datum/unarmed_attack/slime_glomp)
- flags = IS_RESTRICTED | NO_BLOOD | NO_SCAN | NO_SLIP | NO_BREATHE
+ flags = IS_RESTRICTED | NO_SCAN | NO_SLIP | NO_BREATHE
siemens_coefficient = 3
darksight = 3
@@ -30,17 +30,17 @@
push_flags = MONKEY|SLIME|SIMPLE_ANIMAL
has_limbs = list(
- "chest" = list("path" = /obj/item/organ/external/chest/slime),
- "groin" = list("path" = /obj/item/organ/external/groin/slime),
- "head" = list("path" = /obj/item/organ/external/head/slime),
- "l_arm" = list("path" = /obj/item/organ/external/arm/slime),
- "r_arm" = list("path" = /obj/item/organ/external/arm/right/slime),
- "l_leg" = list("path" = /obj/item/organ/external/leg/slime),
- "r_leg" = list("path" = /obj/item/organ/external/leg/right/slime),
- "l_hand" = list("path" = /obj/item/organ/external/hand/slime),
- "r_hand" = list("path" = /obj/item/organ/external/hand/right/slime),
- "l_foot" = list("path" = /obj/item/organ/external/foot/slime),
- "r_foot" = list("path" = /obj/item/organ/external/foot/right/slime)
+ "chest" = list("path" = /obj/item/organ/external/chest/unbreakable),
+ "groin" = list("path" = /obj/item/organ/external/groin/unbreakable),
+ "head" = list("path" = /obj/item/organ/external/head/unbreakable),
+ "l_arm" = list("path" = /obj/item/organ/external/arm/unbreakable),
+ "r_arm" = list("path" = /obj/item/organ/external/arm/right/unbreakable),
+ "l_leg" = list("path" = /obj/item/organ/external/leg/unbreakable),
+ "r_leg" = list("path" = /obj/item/organ/external/leg/right/unbreakable),
+ "l_hand" = list("path" = /obj/item/organ/external/hand/unbreakable),
+ "r_hand" = list("path" = /obj/item/organ/external/hand/right/unbreakable),
+ "l_foot" = list("path" = /obj/item/organ/external/foot/unbreakable),
+ "r_foot" = list("path" = /obj/item/organ/external/foot/right/unbreakable)
)
/datum/species/slime/handle_death(var/mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 985a5dac097..c2ded0799d0 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -195,7 +195,7 @@
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
- flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP | REGENERATES_LIMBS
+ flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | IS_PLANT | NO_BLOOD | NO_PAIN | NO_SLIP
blood_color = "#004400"
flesh_color = "#907E4A"
@@ -231,21 +231,28 @@
else
qdel(D)
- H.visible_message("\red[H] splits apart with a wet slithering noise!")
+ H.visible_message("[H] splits apart with a wet slithering noise!")
/datum/species/machine
name = "Machine"
name_plural = "machines"
+ blurb = "Positronic intelligence really took off in the 26th century, and it is not uncommon to see independant, free-willed \
+ robots on many human stations, particularly in fringe systems where standards are slightly lax and public opinion less relevant \
+ to corporate operations. IPCs (Integrated Positronic Chassis) are a loose category of self-willed robots with a humanoid form, \
+ generally self-owned after being 'born' into servitude; they are reliable and dedicated workers, albeit more than slightly \
+ inhuman in outlook and perspective."
+
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
- language = "Tradeband"
+
+ language = "Encoded Audio Language"
unarmed_types = list(/datum/unarmed_attack/punch)
rarity_value = 2
eyes = "blank_eyes"
- brute_mod = 0.5
- burn_mod = 1
+ brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
+ burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
warning_low_pressure = 50
hazard_low_pressure = 0
@@ -254,24 +261,41 @@
cold_level_2 = -1
cold_level_3 = -1
- heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
+ heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage
heat_level_2 = 1000
heat_level_3 = 2000
- synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
+ passive_temp_gain = 10 // This should cause IPCs to stabilize at ~80 C in a 20 C environment.
+ siemens_coefficient = 0 // Insulated.
- flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC
+ flags = CAN_JOIN | IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_POISON
blood_color = "#1F181F"
flesh_color = "#575757"
+ virus_immune = 1
+ reagent_tag = IS_MACHINE
- has_organ = list() //TODO: Positronic brain.
+ has_organ = list(
+ "brain" = /obj/item/organ/mmi_holder/posibrain,
+ "cell" = /obj/item/organ/cell
+ )
-/datum/species/machine/equip_survival_gear(var/mob/living/carbon/human/H)
+ has_limbs = list(
+ "chest" = list("path" = /obj/item/organ/external/chest/ipc),
+ "groin" = list("path" = /obj/item/organ/external/groin/ipc),
+ "head" = list("path" = /obj/item/organ/external/head/ipc),
+ "l_arm" = list("path" = /obj/item/organ/external/arm/ipc),
+ "r_arm" = list("path" = /obj/item/organ/external/arm/right/ipc),
+ "l_leg" = list("path" = /obj/item/organ/external/leg/ipc),
+ "r_leg" = list("path" = /obj/item/organ/external/leg/right/ipc),
+ "l_hand" = list("path" = /obj/item/organ/external/hand/ipc),
+ "r_hand" = list("path" = /obj/item/organ/external/hand/right/ipc),
+ "l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
+ "r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
+ )
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
..()
- if(flags & IS_SYNTHETIC)
- H.h_style = ""
- spawn(100)
- if(H) H.update_hair()
+ H.h_style = ""
+ spawn(100)
+ if(H) H.update_hair()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 382ff909b3c..8b13178adf3 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -234,15 +234,13 @@ var/global/list/damage_icon_parts = list()
var/hulk = (HULK in src.mutations)
var/skeleton = (SKELETON in src.mutations)
- var/g = (gender == FEMALE ? "f" : "m")
-
//CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
//Create a new, blank icon for our mob to use.
if(stand_icon)
qdel(stand_icon)
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
- var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin]"
+ var/icon_key = ""
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
if(eyes)
@@ -260,7 +258,12 @@ var/global/list/damage_icon_parts = list()
icon_key += "3"
else
icon_key += "1"
-
+ if(part)
+ icon_key += "[part.species.race_key]"
+ icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
+ icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
+ if(part.s_col)
+ icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]"
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
@@ -894,22 +897,22 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/get_tail_icon()
var/icon_key = "[species.race_key][r_skin][g_skin][b_skin]"
-
+
var/icon/tail_icon = tail_icon_cache[icon_key]
- if(!tail_icon)
-
+ if(!tail_icon)
+
//generate a new one
tail_icon = new/icon(icon = (species.tail_animation? species.tail_animation : 'icons/effects/species.dmi'))
tail_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
-
+
tail_icon_cache[icon_key] = tail_icon
-
+
return tail_icon
/mob/living/carbon/human/proc/set_tail_state(var/t_state)
var/image/tail_overlay = overlays_standing[TAIL_LAYER]
-
+
if(tail_overlay && species.tail_animation)
tail_overlay.icon_state = t_state
return tail_overlay
@@ -919,30 +922,30 @@ var/global/list/damage_icon_parts = list()
//Update this if the ability to flick() images or make looping animation start at the first frame is ever added.
/mob/living/carbon/human/proc/animate_tail_once(var/update_icons=1)
var/t_state = "[species.tail]_once"
-
+
var/image/tail_overlay = overlays_standing[TAIL_LAYER]
if(tail_overlay && tail_overlay.icon_state == t_state)
return //let the existing animation finish
-
+
tail_overlay = set_tail_state(t_state)
if(tail_overlay)
spawn(15)
//check that the animation hasn't changed in the meantime
if(overlays_standing[TAIL_LAYER] == tail_overlay && tail_overlay.icon_state == t_state)
animate_tail_stop()
-
+
if(update_icons)
update_icons()
/mob/living/carbon/human/proc/animate_tail_start(var/update_icons=1)
set_tail_state("[species.tail]_slow[rand(0,9)]")
-
+
if(update_icons)
update_icons()
/mob/living/carbon/human/proc/animate_tail_fast(var/update_icons=1)
set_tail_state("[species.tail]_loop[rand(0,9)]")
-
+
if(update_icons)
update_icons()
@@ -951,14 +954,14 @@ var/global/list/damage_icon_parts = list()
set_tail_state("[species.tail]_idle[rand(0,9)]")
else
set_tail_state("[species.tail]_static")
-
-
+
+
if(update_icons)
update_icons()
/mob/living/carbon/human/proc/animate_tail_stop(var/update_icons=1)
set_tail_state("[species.tail]_static")
-
+
if(update_icons)
update_icons()
diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm
index cd26c58a047..a4d6f621d37 100644
--- a/code/modules/mob/living/silicon/robot/analyzer.dm
+++ b/code/modules/mob/living/silicon/robot/analyzer.dm
@@ -26,54 +26,70 @@
user.show_message("\blue Key: Suffocation/Toxin/Burns/Brute", 1)
user.show_message("\blue Body Temperature: ???", 1)
return
- if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- user << "\red You don't have the dexterity to do this!"
- return
- if(!istype(M, /mob/living/silicon/robot) && !(ishuman(M) && (M:species.flags & IS_SYNTHETIC)))
+
+ var/scan_type
+ if(istype(M, /mob/living/silicon/robot))
+ scan_type = "robot"
+ else if(istype(M, /mob/living/carbon/human))
+ scan_type = "prosthetics"
+ else
user << "\red You can't analyze non-robotic things!"
return
- user.visible_message(" [user] has analyzed [M]'s components."," You have analyzed [M]'s components.")
- var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
- var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss()
- user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
- user.show_message("\t Key: Electronics/Brute", 1)
- user.show_message("\t Damage Specifics: [BU] - [BR]")
- if(M.tod && M.stat == DEAD)
- user.show_message("\blue Time of Disable: [M.tod]")
+ user.visible_message("\The [user] has analyzed [M]'s components.","You have analyzed [M]'s components.")
+ switch(scan_type)
+ if("robot")
+ var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss()
+ var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss()
+ user.show_message("\blue Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")
+ user.show_message("\t Key: Electronics/Brute", 1)
+ user.show_message("\t Damage Specifics: [BU] - [BR]")
+ if(M.tod && M.stat == DEAD)
+ user.show_message("\blue Time of Disable: [M.tod]")
+ var/mob/living/silicon/robot/H = M
+ var/list/damaged = H.get_damaged_components(1,1,1)
+ user.show_message("\blue Localized Damage:",1)
+ if(length(damaged)>0)
+ for(var/datum/robot_component/org in damaged)
+ user.show_message(text("\blue \t []: [][] - [] - [] - []", \
+ capitalize(org.name), \
+ (org.installed == -1) ? "DESTROYED " :"",\
+ (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \
+ (org.brute_damage > 0) ? "[org.brute_damage]" :0, \
+ (org.toggled) ? "Toggled ON" : "Toggled OFF",\
+ (org.powered) ? "Power ON" : "Power OFF"),1)
+ else
+ user.show_message("\blue \t Components are OK.",1)
+ if(H.emagged && prob(5))
+ user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1)
+ user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
- if (istype(M, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/H = M
- var/list/damaged = H.get_damaged_components(1,1,1)
- user.show_message("\blue Localized Damage:",1)
- if(length(damaged)>0)
- for(var/datum/robot_component/org in damaged)
- user.show_message(text("\blue \t []: [][] - [] - [] - []", \
- capitalize(org.name), \
- (org.installed == -1) ? "DESTROYED " :"",\
- (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \
- (org.brute_damage > 0) ? "[org.brute_damage]" :0, \
- (org.toggled) ? "Toggled ON" : "Toggled OFF",\
- (org.powered) ? "Power ON" : "Power OFF"),1)
- else
- user.show_message("\blue \t Components are OK.",1)
- if(H.emagged && prob(5))
- user.show_message("\red \t ERROR: INTERNAL SYSTEMS COMPROMISED",1)
+ if("prosthetics")
+ var/mob/living/carbon/human/H = M
+ user << "Analyzing Results for \the [H]:"
+ user << "Key: Electronics/Brute"
- if (ishuman(M) && (M:species.flags & IS_SYNTHETIC))
- var/mob/living/carbon/human/H = M
- var/list/damaged = H.get_damaged_organs(1,1)
- user.show_message("\blue Localized Damage, Brute/Electronics:",1)
- if(length(damaged)>0)
- for(var/obj/item/organ/external/org in damaged)
- user.show_message(text("\blue \t []: [] - []", \
- capitalize(org.name), \
- (org.brute_dam > 0) ? "\red [org.brute_dam]" :0, \
- (org.burn_dam > 0) ? "[org.burn_dam]" :0),1)
- else
- user.show_message("\blue \t Components are OK.",1)
-
- user.show_message("\blue Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1)
+ user << "External prosthetics:"
+ var/organ_found
+ if(H.internal_organs.len)
+ for(var/obj/item/organ/external/E in H.organs)
+ if(!(E.status & ORGAN_ROBOT))
+ continue
+ organ_found = 1
+ user << "[E.name]: [E.brute_dam] [E.burn_dam]"
+ if(!organ_found)
+ user << "No prosthetics located."
+ user << "
"
+ user << "Internal prosthetics:"
+ organ_found = null
+ if(H.internal_organs.len)
+ for(var/obj/item/organ/O in H.internal_organs)
+ if(!(O.status & ORGAN_ROBOT))
+ continue
+ organ_found = 1
+ user << "[O.name]: [O.damage]"
+ if(!organ_found)
+ user << "No prosthetics located."
src.add_fingerprint(user)
return
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index ad41fc28aad..e94462a20b9 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -28,6 +28,7 @@
maxbodytemp = 323 //Above 50 Degrees Celcius
universal_speak = 0
universal_understand = 1
+ holder_type = /obj/item/weapon/holder/mouse
mob_size = 1
/mob/living/simple_animal/mouse/Life()
@@ -62,6 +63,13 @@
if(!body_color)
body_color = pick( list("brown","gray","white") )
+ switch(body_color)
+ if("brown")
+ holder_type = /obj/item/weapon/holder/mouse/brown
+ if("gray")
+ holder_type = /obj/item/weapon/holder/mouse/gray
+ if("white")
+ holder_type = /obj/item/weapon/holder/mouse/white
icon_state = "mouse_[body_color]"
icon_living = "mouse_[body_color]"
icon_dead = "mouse_[body_color]_dead"
@@ -76,6 +84,22 @@
if(client)
client.time_died_as_mouse = world.time
+/mob/living/simple_animal/mouse/MouseDrop(atom/over_object)
+
+ var/mob/living/carbon/H = over_object
+ if(!istype(H) || !Adjacent(H)) return ..()
+
+ if(H.a_intent == "help")
+ get_scooped(H)
+ return
+ else
+ return ..()
+
+/mob/living/simple_animal/mouse/get_scooped(var/mob/living/carbon/grabber)
+ if (stat >= DEAD)
+ return
+ ..()
+
/mob/living/simple_animal/mouse/start_pulling(var/atom/movable/AM)//Prevents mouse from pulling things
src << "You are too small to pull anything."
return
@@ -101,14 +125,17 @@
/mob/living/simple_animal/mouse/white
body_color = "white"
icon_state = "mouse_white"
+ holder_type = /obj/item/weapon/holder/mouse/white
/mob/living/simple_animal/mouse/gray
body_color = "gray"
icon_state = "mouse_gray"
+ holder_type = /obj/item/weapon/holder/mouse/gray
/mob/living/simple_animal/mouse/brown
body_color = "brown"
icon_state = "mouse_brown"
+ holder_type = /obj/item/weapon/holder/mouse/brown
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 17def087b35..79115b61b29 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -104,7 +104,11 @@
return 0
/mob/living/carbon/human/isSynthetic()
- return species.flags & IS_SYNTHETIC
+ // If they are 100% robotic, they count as synthetic.
+ for(var/obj/item/organ/external/E in organs)
+ if(!(E.status & ORGAN_ROBOT))
+ return 0
+ return 1
/mob/living/silicon/isSynthetic()
return 1
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 28f63329b1c..dbabfc5917d 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -208,7 +208,7 @@ datum/preferences
if(!dummy.mind)
dummy.mind = new
dummy.mind.role_alt_title = alt
- J.equip(dummy)
+ J.equip_preview(dummy)
break
dummy.update_eyes()
dummy.force_update_limbs()
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 272f43b790b..70c2281bb30 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -214,7 +214,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
//Transfers blood from reagents to vessel, respecting blood types compatability.
/mob/living/carbon/human/inject_blood(var/datum/reagent/blood/injected, var/amount)
- if(species && species.flags & NO_BLOOD)
+ if(species.flags & NO_BLOOD)
reagents.add_reagent("blood", amount, injected.data)
reagents.update_total()
return
diff --git a/code/modules/organs/misc.dm b/code/modules/organs/misc.dm
new file mode 100644
index 00000000000..a330e307a38
--- /dev/null
+++ b/code/modules/organs/misc.dm
@@ -0,0 +1,70 @@
+//CORTICAL BORER ORGANS.
+/obj/item/organ/borer/process()
+
+ // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
+ for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
+ if(owner.reagents.get_reagent_amount(chem) < 3)
+ owner.reagents.add_reagent(chem, 5)
+
+ // They're also super gross and ooze ichor.
+ if(prob(5))
+ var/mob/living/carbon/human/H = owner
+ if(!istype(H))
+ return
+
+ var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
+ blood_splatter(H,B,1)
+ var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
+ if(goo)
+ goo.name = "husk ichor"
+ goo.desc = "It's thick and stinks of decay."
+ goo.basecolor = "#412464"
+ goo.update_icon()
+
+/obj/item/organ/borer
+ name = "cortical borer"
+ icon = 'icons/obj/objects.dmi'
+ icon_state = "borer"
+ organ_tag = "brain"
+ desc = "A disgusting space slug."
+ parent_organ = "head"
+ vital = 1
+
+/obj/item/organ/borer/removed(var/mob/living/user)
+
+ ..()
+
+ var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
+ if(B)
+ B.leave_host()
+ B.ckey = owner.ckey
+
+ spawn(0)
+ qdel(src)
+
+//VOX ORGANS.
+/obj/item/organ/stack
+ name = "cortical stack"
+ parent_organ = "head"
+ robotic = 2
+ vital = 1
+ var/backup_time = 0
+ var/datum/mind/backup
+
+/obj/item/organ/stack/process()
+ if(owner && owner.stat != DEAD && !is_broken())
+ backup_time = world.time
+ if(owner.mind) backup = owner.mind
+
+/obj/item/organ/stack/vox
+
+/obj/item/organ/stack/vox/stack
+
+/obj/item/organ/stack
+ name = "cortical stack"
+ icon_state = "brain-prosthetic"
+ organ_tag = "stack"
+ robotic = 2
+
+/obj/item/organ/stack/vox
+ name = "vox cortical stack"
diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm
index 06dd521f64e..9f94656806d 100644
--- a/code/modules/organs/organ.dm
+++ b/code/modules/organs/organ.dm
@@ -23,6 +23,8 @@ var/list/organ_cache = list()
var/list/trace_chemicals = list() // traces of chemicals in the organ,
// links chemical IDs to number of ticks for which they'll stay in the blood
germ_level = 0
+ var/datum/dna/dna
+ var/datum/species/species
/obj/item/organ/proc/update_health()
return
@@ -34,6 +36,12 @@ var/list/organ_cache = list()
max_damage = min_broken_damage * 2
if(istype(holder))
src.owner = holder
+ species = all_species["Human"]
+ if(holder.dna)
+ dna = holder.dna.Clone()
+ species = all_species[dna.species]
+ else
+ log_debug("[src] at [loc] spawned without a proper DNA.")
var/mob/living/carbon/human/H = holder
if(istype(H))
if(internal)
@@ -42,10 +50,10 @@ var/list/organ_cache = list()
if(E.internal_organs == null)
E.internal_organs = list()
E.internal_organs |= src
- if(H.dna)
+ if(dna)
if(!blood_DNA)
blood_DNA = list()
- blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ blood_DNA[dna.unique_enzymes] = dna.b_type
if(internal)
holder.internal_organs |= src
@@ -53,16 +61,18 @@ var/list/organ_cache = list()
if(status & ORGAN_ROBOT)
return
damage = max_damage
+ status |= ORGAN_DEAD
processing_objects -= src
if(dead_icon)
icon_state = dead_icon
/obj/item/organ/process()
- // Don't process if we're in a freezer, an MMI or a stasis bag. //TODO: ambient temperature?
- if(istype(loc,/obj/item/device/mmi) || istype(loc,/obj/item/bodybag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer))
+ // Don't process if we're in a freezer, an MMI or a stasis bag.or a freezer or something I dunno
+ if(istype(loc,/obj/item/device/mmi))
+ return
+ if(istype(loc,/obj/structure/closet/body_bag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer) || istype(loc,/obj/item/weapon/storage/box/freezer))
return
-
//Process infections
if (robotic >= 2 || (owner && owner.species && (owner.species.flags & IS_PLANT)))
germ_level = 0
@@ -76,8 +86,10 @@ var/list/organ_cache = list()
if(B && prob(40))
reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1)
- damage += rand(1,3)
- if(damage >= max_damage)
+ germ_level += rand(2,6)
+ if(germ_level >= INFECTION_LEVEL_TWO)
+ germ_level += rand(2,6)
+ if(germ_level >= INFECTION_LEVEL_THREE)
die()
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
@@ -86,6 +98,11 @@ var/list/organ_cache = list()
handle_rejection()
handle_germ_effects()
+/obj/item/organ/examine(mob/user)
+ ..(user)
+ if(status & ORGAN_DEAD)
+ user << "The decay has set in."
+
/obj/item/organ/proc/handle_germ_effects()
//** Handle the effects of infections
var/antibiotics = owner.reagents.get_reagent_amount("spaceacillin")
@@ -114,24 +131,23 @@ var/list/organ_cache = list()
/obj/item/organ/proc/handle_rejection()
// Process unsuitable transplants. TODO: consider some kind of
// immunosuppressant that changes transplant data to make it match.
- if(transplant_data)
- if(!rejecting && prob(20) && owner.dna && blood_incompatible(transplant_data["blood_type"],owner.dna.b_type,owner.species,transplant_data["species"]))
- rejecting = 1
+ if(dna)
+ if(!rejecting)
+ if(blood_incompatible(dna.b_type, owner.dna.b_type, species, owner.species))
+ rejecting = 1
else
rejecting++ //Rejection severity increases over time.
if(rejecting % 10 == 0) //Only fire every ten rejection ticks.
switch(rejecting)
if(1 to 50)
- take_damage(1)
+ germ_level++
if(51 to 200)
- owner.reagents.add_reagent("toxin", 1)
- take_damage(1)
+ germ_level += rand(1,2)
if(201 to 500)
- take_damage(rand(2,3))
- owner.reagents.add_reagent("toxin", 2)
+ germ_level += rand(2,3)
if(501 to INFINITY)
- take_damage(4)
- owner.reagents.add_reagent("toxin", rand(3,5))
+ germ_level += rand(3,5)
+ owner.reagents.add_reagent("toxin", rand(1,2))
/obj/item/organ/proc/receive_chem(chemical as obj)
return 0
@@ -204,31 +220,17 @@ var/list/organ_cache = list()
min_broken_damage = 35
/obj/item/organ/emp_act(severity)
- switch(robotic)
- if(0)
+ if(!(status & ORGAN_ROBOT))
+ return
+ switch (severity)
+ if (1.0)
+ take_damage(0,20)
return
- if(1)
- switch (severity)
- if (1.0)
- take_damage(20,0)
- return
- if (2.0)
- take_damage(7,0)
- return
- if(3.0)
- take_damage(3,0)
- return
- if(2)
- switch (severity)
- if (1.0)
- take_damage(40,0)
- return
- if (2.0)
- take_damage(15,0)
- return
- if(3.0)
- take_damage(10,0)
- return
+ if (2.0)
+ take_damage(0,7)
+ return
+ if(3.0)
+ take_damage(0,3)
/obj/item/organ/proc/removed(var/mob/living/user)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index a539f5f421b..ecb0cb9ca2b 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -141,20 +141,11 @@
/obj/item/organ/external/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
if((brute <= 0) && (burn <= 0))
return 0
-
if(status & ORGAN_DESTROYED)
return 0
if(status & ORGAN_ROBOT )
-
var/brmod = 0.66
var/bumod = 0.66
-
- if(istype(owner,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = owner
- if(H.species && H.species.flags & IS_SYNTHETIC)
- brmod = H.species.brute_mod
- bumod = H.species.burn_mod
-
brute *= brmod //~2/3 damage for ROBOLIMBS
burn *= bumod //~2/3 damage for ROBOLIMBS
@@ -322,10 +313,14 @@ This function completely restores a damaged organ to perfect condition.
var/datum/wound/W = pick(compatible_wounds)
W.open_wound(damage)
if(prob(25))
- //maybe have a separate message for BRUISE type damage?
- owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\
- "\red The wound on your [name] widens with a nasty ripping noise.",\
- "You hear a nasty ripping noise, as if flesh is being torn apart.")
+ if(status & ORGAN_ROBOT)
+ owner.visible_message("\red The damage to [owner.name]'s [name] worsens.",\
+ "\red The damage to your [name] worsens.",\
+ "You hear the screech of abused metal.")
+ else
+ owner.visible_message("\red The wound on [owner.name]'s [name] widens with a nasty ripping noise.",\
+ "\red The wound on your [name] widens with a nasty ripping noise.",\
+ "You hear a nasty ripping noise, as if flesh is being torn apart.")
return
//Creating wound
@@ -354,7 +349,7 @@ This function completely restores a damaged organ to perfect condition.
//Determines if we even need to process this organ.
/obj/item/organ/external/proc/need_process()
- if(status && status != ORGAN_ROBOT) // If it's robotic, that's fine it will have a status.
+ if(status & (ORGAN_CUT_AWAY|ORGAN_GAUZED|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED))
return 1
if(brute_dam || burn_dam)
return 1
@@ -369,11 +364,6 @@ This function completely restores a damaged organ to perfect condition.
/obj/item/organ/external/process()
if(owner)
- //Dismemberment
- if(status & ORGAN_DESTROYED)
- if(config.limbs_can_break)
- droplimb(0,DROPLIMB_EDGE) //Might be worth removing this check since take_damage handles it.
- return
if(parent)
if(parent.status & ORGAN_DESTROYED)
status |= ORGAN_DESTROYED
@@ -933,6 +923,9 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/get_wounds_desc()
. = ""
+ if(status & ORGAN_DESTROYED && !is_stump())
+ . += "tear at [amputation_point] so bad it barely hangs on few tendons"
+
if(status & ORGAN_ROBOT)
if(brute_dam)
switch(brute_dam)
@@ -983,165 +976,3 @@ Note that amputating the affected organ does in fact remove the infection from t
if(6 to INFINITY)
flavor_text += "a ton of [wound]\s"
return english_list(flavor_text)
-/****************************************************
- ORGAN DEFINES
-****************************************************/
-
-/obj/item/organ/external/chest
- name = "upper body"
- limb_name = "chest"
- icon_name = "torso"
- health = 100
- min_broken_damage = 35
- body_part = UPPER_TORSO
- vital = 1
- amputation_point = "spine"
- joint = "neck"
- dislocated = -1
- gendered_icon = 1
- cannot_amputate = 1
- parent_organ = null
- encased = "ribcage"
-
-/obj/item/organ/external/groin
- name = "lower body"
- limb_name = "groin"
- icon_name = "groin"
- health = 100
- min_broken_damage = 35
- body_part = LOWER_TORSO
- vital = 1
- parent_organ = "chest"
- amputation_point = "lumbar"
- joint = "hip"
- dislocated = -1
- gendered_icon = 1
-
-/obj/item/organ/external/arm
- limb_name = "l_arm"
- name = "left arm"
- icon_name = "l_arm"
- health = 50
- min_broken_damage = 30
- body_part = ARM_LEFT
- parent_organ = "chest"
- joint = "left elbow"
- amputation_point = "left shoulder"
- can_grasp = 1
-
-/obj/item/organ/external/arm/right
- limb_name = "r_arm"
- name = "right arm"
- icon_name = "r_arm"
- body_part = ARM_RIGHT
- joint = "right elbow"
- amputation_point = "right shoulder"
-
-/obj/item/organ/external/leg
- limb_name = "l_leg"
- name = "left leg"
- icon_name = "l_leg"
- health = 50
- min_broken_damage = 30
- body_part = LEG_LEFT
- icon_position = LEFT
- parent_organ = "groin"
- joint = "left knee"
- amputation_point = "left hip"
- can_stand = 1
-
-/obj/item/organ/external/leg/right
- limb_name = "r_leg"
- name = "right leg"
- icon_name = "r_leg"
- body_part = LEG_RIGHT
- icon_position = RIGHT
- joint = "right knee"
- amputation_point = "right hip"
-
-/obj/item/organ/external/foot
- limb_name = "l_foot"
- name = "left foot"
- icon_name = "l_foot"
- health = 30
- min_broken_damage = 15
- body_part = FOOT_LEFT
- icon_position = LEFT
- parent_organ = "l_leg"
- joint = "left ankle"
- amputation_point = "left ankle"
- can_stand = 1
-
-/obj/item/organ/external/foot/removed()
- if(owner) owner.u_equip(owner.shoes)
- ..()
-
-/obj/item/organ/external/foot/right
- limb_name = "r_foot"
- name = "right foot"
- icon_name = "r_foot"
- body_part = FOOT_RIGHT
- icon_position = RIGHT
- parent_organ = "r_leg"
- joint = "right ankle"
- amputation_point = "right ankle"
-
-/obj/item/organ/external/hand
- limb_name = "l_hand"
- name = "left hand"
- icon_name = "l_hand"
- health = 30
- min_broken_damage = 15
- body_part = HAND_LEFT
- parent_organ = "l_arm"
- joint = "left wrist"
- amputation_point = "left wrist"
- can_grasp = 1
-
-/obj/item/organ/external/hand/removed()
- owner.u_equip(owner.gloves)
- ..()
-
-/obj/item/organ/external/hand/right
- limb_name = "r_hand"
- name = "right hand"
- icon_name = "r_hand"
- body_part = HAND_RIGHT
- parent_organ = "r_arm"
- joint = "right wrist"
- amputation_point = "right wrist"
-
-/obj/item/organ/external/head
- limb_name = "head"
- icon_name = "head"
- name = "head"
- health = 75
- min_broken_damage = 35
- body_part = HEAD
- vital = 1
- parent_organ = "chest"
- joint = "jaw"
- amputation_point = "neck"
- gendered_icon = 1
- encased = "skull"
-
-/obj/item/organ/external/head/removed()
- if(owner)
- name = "[owner.real_name]'s head"
- owner.u_equip(owner.glasses)
- owner.u_equip(owner.head)
- owner.u_equip(owner.l_ear)
- owner.u_equip(owner.r_ear)
- owner.u_equip(owner.wear_mask)
- spawn(1)
- owner.update_hair()
- ..()
-
-/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
- ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
- if (!disfigured)
- if (brute_dam > 40)
- if (prob(50))
- disfigure("brute")
- if (burn_dam > 40)
- disfigure("burn")
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index 7036e7e725f..281cd0c0162 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -17,11 +17,23 @@ var/global/list/limb_icon_cache = list()
s_col = null
if(status & ORGAN_ROBOT)
return
+ if(species && human.species && species.name != human.species.name)
+ return
if(!isnull(human.s_tone) && (human.species.flags & HAS_SKIN_TONE))
s_tone = human.s_tone
if(human.species.flags & HAS_SKIN_COLOR)
s_col = list(human.r_skin, human.g_skin, human.b_skin)
+/obj/item/organ/external/proc/sync_colour_to_dna()
+ s_tone = null
+ s_col = null
+ if(status & ORGAN_ROBOT)
+ return
+ if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && (species.flags & HAS_SKIN_TONE))
+ s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
+ if(species.flags & HAS_SKIN_COLOR)
+ s_col = list(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
+
/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
..()
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
@@ -35,10 +47,10 @@ var/global/list/limb_icon_cache = list()
..()
overlays.Cut()
- if(owner.species.has_organ["eyes"])
+ if(species.has_organ["eyes"])
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
- if(owner.species.eyes)
- var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes)
+ if(species.eyes)
+ var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
else
@@ -46,14 +58,14 @@ var/global/list/limb_icon_cache = list()
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
- if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS)))
+ if(owner.lip_style && (species && (species.flags & HAS_LIPS)))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
- if(facial_hair_style && facial_hair_style.species_allowed && (owner.species.name in facial_hair_style.species_allowed))
+ if(facial_hair_style && facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
@@ -61,7 +73,7 @@ var/global/list/limb_icon_cache = list()
if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
- if(hair_style && (owner.species.name in hair_style.species_allowed))
+ if(hair_style && (species.name in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
@@ -75,25 +87,25 @@ var/global/list/limb_icon_cache = list()
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name]")
else
- if(!owner)
+ if(!dna)
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_f" : ""]")
else
if(gendered_icon)
- if(owner.gender == FEMALE)
+ if(dna.GetUIState(DNA_UI_GENDER))
gender = "f"
else
gender = "m"
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
- else if ((status & ORGAN_ROBOT) && !(owner.species && owner.species.flags & IS_SYNTHETIC))
+ else if (status & ORGAN_ROBOT)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
else
if (status & ORGAN_MUTATED)
- mob_icon = new /icon(owner.species.deform, "[icon_name][gender ? "_[gender]" : ""]")
+ mob_icon = new /icon(species.deform, "[icon_name][gender ? "_[gender]" : ""]")
else
- mob_icon = new /icon(owner.species.icobase, "[icon_name][gender ? "_[gender]" : ""]")
+ mob_icon = new /icon(species.icobase, "[icon_name][gender ? "_[gender]" : ""]")
if(status & ORGAN_DEAD)
mob_icon.ColorTone(rgb(10,50,0))
diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/organ_stump.dm
index 728f9cd1bc1..68201c14139 100644
--- a/code/modules/organs/organ_stump.dm
+++ b/code/modules/organs/organ_stump.dm
@@ -2,7 +2,6 @@
name = "limb stump"
icon_name = ""
dislocated = -1
- cannot_amputate = 1
/obj/item/organ/external/stump/New(var/mob/living/carbon/holder, var/internal, var/obj/item/organ/external/limb)
if(istype(limb))
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 8d19d60b491..87da7f03534 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -7,6 +7,7 @@ var/global/datum/robolimb/basic_robolimb
for(var/limb_type in typesof(/datum/robolimb))
var/datum/robolimb/R = new limb_type()
all_robolimbs[R.company] = R
+ world << "Adding [R.company] as [R], [R.type]"
if(!R.unavailable_at_chargen)
chargen_robolimbs[R.company] = R
@@ -35,3 +36,9 @@ var/global/datum/robolimb/basic_robolimb
company = "Xion Manufacturing Group"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion.dmi'
+
+/datum/robolimb/ipc
+ company = "Morpheus Cyberkinetics"
+ desc = "This limb is simple and functional; no effort has been made to make it look human."
+ icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
+ unavailable_at_chargen = 1
diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/subtypes/diona.dm
similarity index 50%
rename from code/modules/organs/organ_alien.dm
rename to code/modules/organs/subtypes/diona.dm
index 0905a612666..f08a5a93711 100644
--- a/code/modules/organs/organ_alien.dm
+++ b/code/modules/organs/subtypes/diona.dm
@@ -1,15 +1,10 @@
/proc/spawn_diona_nymph_from_organ(var/obj/item/organ/organ)
if(!istype(organ))
return
-
- //This is a terrible hack and I should be ashamed.
- var/datum/seed/diona = plant_controller.seeds["diona"]
- if(!diona)
- qdel(src)
-
spawn(1) // So it has time to be thrown about by the gib() proc.
var/mob/living/carbon/alien/diona/D = new(get_turf(organ))
- diona.request_player(D)
+ var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
+ P.request_player(D, "A diona nymph has split off from its gestalt. ")
qdel(organ)
/obj/item/organ/external/diona
@@ -201,189 +196,3 @@
/obj/item/organ/diona/node/removed()
return
-
-//CORTICAL BORER ORGANS.
-/obj/item/organ/borer
- name = "cortical borer"
- parent_organ = "head"
- vital = 1
-
-/obj/item/organ/borer/process()
-
- // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
- for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
- if(owner.reagents.get_reagent_amount(chem) < 3)
- owner.reagents.add_reagent(chem, 5)
-
- // They're also super gross and ooze ichor.
- if(prob(5))
- var/mob/living/carbon/human/H = owner
- if(!istype(H))
- return
-
- var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
- blood_splatter(H,B,1)
- var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
- if(goo)
- goo.name = "husk ichor"
- goo.desc = "It's thick and stinks of decay."
- goo.basecolor = "#412464"
- goo.update_icon()
-
-/obj/item/organ/borer
- name = "cortical borer"
- icon = 'icons/obj/objects.dmi'
- icon_state = "borer"
- organ_tag = "brain"
- desc = "A disgusting space slug."
-
-/obj/item/organ/borer/removed(var/mob/living/user)
-
- ..()
-
- var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
- if(B)
- B.leave_host()
- B.ckey = owner.ckey
-
- spawn(0)
- qdel(src)
-
-//XENOMORPH ORGANS
-/obj/item/organ/xenos/eggsac
- name = "egg sac"
- parent_organ = "groin"
-
-/obj/item/organ/xenos/plasmavessel
- name = "plasma vessel"
- parent_organ = "chest"
- var/stored_plasma = 0
- var/max_plasma = 500
-
-/obj/item/organ/xenos/plasmavessel/queen
- name = "bloated plasma vessel"
- stored_plasma = 200
- max_plasma = 500
-
-/obj/item/organ/xenos/plasmavessel/sentinel
- stored_plasma = 100
- max_plasma = 250
-
-/obj/item/organ/xenos/plasmavessel/hunter
- name = "tiny plasma vessel"
- stored_plasma = 100
- max_plasma = 150
-
-/obj/item/organ/xenos/acidgland
- name = "acid gland"
- parent_organ = "head"
-
-/obj/item/organ/xenos/hivenode
- name = "hive node"
- parent_organ = "chest"
-
-/obj/item/organ/xenos/resinspinner
- name = "resin spinner"
- parent_organ = "head"
-
-/obj/item/organ/xenos
- name = "xeno organ"
- icon = 'icons/effects/blood.dmi'
- desc = "It smells like an accident in a chemical factory."
-
-/obj/item/organ/xenos/eggsac
- name = "egg sac"
- icon_state = "xgibmid1"
- organ_tag = "egg sac"
-
-/obj/item/organ/xenos/plasmavessel
- name = "plasma vessel"
- icon_state = "xgibdown1"
- organ_tag = "plasma vessel"
-
-/obj/item/organ/xenos/acidgland
- name = "acid gland"
- icon_state = "xgibtorso"
- organ_tag = "acid gland"
-
-/obj/item/organ/xenos/hivenode
- name = "hive node"
- icon_state = "xgibmid2"
- organ_tag = "hive node"
-
-/obj/item/organ/xenos/resinspinner
- name = "hive node"
- icon_state = "xgibmid2"
- organ_tag = "resin spinner"
-
-//VOX ORGANS.
-/obj/item/organ/stack
- name = "cortical stack"
- parent_organ = "head"
- robotic = 2
- vital = 1
- var/backup_time = 0
- var/datum/mind/backup
-
-/obj/item/organ/stack/process()
- if(owner && owner.stat != 2 && !is_broken())
- backup_time = world.time
- if(owner.mind) backup = owner.mind
-
-/obj/item/organ/stack/vox
-
-/obj/item/organ/stack/vox/stack
-
-/obj/item/organ/stack
- name = "cortical stack"
- icon_state = "brain-prosthetic"
- organ_tag = "stack"
- robotic = 2
-
-/obj/item/organ/stack/vox
- name = "vox cortical stack"
-
-// Slime limbs.
-/obj/item/organ/external/chest/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/groin/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/arm/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/arm/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/leg/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/leg/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/foot/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/foot/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/hand/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/hand/right/slime
- cannot_break = 1
- dislocated = -1
-
-/obj/item/organ/external/head/slime
- cannot_break = 1
- dislocated = -1
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
new file mode 100644
index 00000000000..28c44bc41e5
--- /dev/null
+++ b/code/modules/organs/subtypes/machine.dm
@@ -0,0 +1,141 @@
+// IPC limbs.
+/obj/item/organ/external/head/ipc
+ dislocated = -1
+ can_intake_reagents = 0
+ encased = null
+/obj/item/organ/external/head/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/chest/ipc
+ dislocated = -1
+ encased = null
+/obj/item/organ/external/chest/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/groin/ipc
+ dislocated = -1
+/obj/item/organ/external/groin/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/arm/ipc
+ dislocated = -1
+/obj/item/organ/external/arm/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/arm/right/ipc
+ dislocated = -1
+/obj/item/organ/external/arm/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/leg/ipc
+ dislocated = -1
+/obj/item/organ/external/leg/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/leg/right/ipc
+ dislocated = -1
+/obj/item/organ/external/leg/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/foot/ipc
+ dislocated = -1
+/obj/item/organ/external/foot/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/foot/right/ipc
+ dislocated = -1
+/obj/item/organ/external/foot/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/hand/ipc
+ dislocated = -1
+/obj/item/organ/external/hand/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/external/hand/right/ipc
+ dislocated = -1
+/obj/item/organ/external/hand/right/ipc/New()
+ robotize("Morpheus Cyberkinetics")
+ ..()
+
+/obj/item/organ/cell
+ name = "microbattery"
+ desc = "A small, powerful cell for use in fully prosthetic bodies."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "scell"
+ organ_tag = "cell"
+ parent_organ = "chest"
+ vital = 1
+
+/obj/item/organ/cell/New()
+ robotize()
+ ..()
+
+/obj/item/organ/cell/replaced()
+ ..()
+ // This is very ghetto way of rebooting an IPC. TODO better way.
+ if(owner && owner.stat == DEAD)
+ owner.stat = 0
+ owner.visible_message("\The [owner] twitches visibly!")
+
+// Used for an MMI or posibrain being installed into a human.
+/obj/item/organ/mmi_holder
+ name = "brain"
+ organ_tag = "brain"
+ parent_organ = "head"
+ vital = 1
+ var/obj/item/device/mmi/stored_mmi
+
+/obj/item/organ/mmi_holder/proc/update_from_mmi()
+ if(!stored_mmi)
+ return
+ name = stored_mmi.name
+ desc = stored_mmi.desc
+ icon = stored_mmi.icon
+ icon_state = stored_mmi.icon_state
+
+/obj/item/organ/mmi_holder/removed(var/mob/living/user)
+
+ if(stored_mmi)
+ stored_mmi.loc = get_turf(src)
+ if(owner.mind)
+ owner.mind.transfer_to(stored_mmi.brainmob)
+ ..()
+
+ var/mob/living/holder_mob = loc
+ if(istype(holder_mob))
+ holder_mob.drop_from_inventory(src)
+ qdel(src)
+
+/obj/item/organ/mmi_holder/New()
+ ..()
+ // This is very ghetto way of rebooting an IPC. TODO better way.
+ spawn(1)
+ if(owner && owner.stat == DEAD)
+ owner.stat = 0
+ owner.visible_message("\The [owner] twitches visibly!")
+
+/obj/item/organ/mmi_holder/posibrain/New()
+ robotize()
+ stored_mmi = new /obj/item/device/mmi/digital/posibrain(src)
+ ..()
+ spawn(1)
+ if(owner)
+ stored_mmi.name = "positronic brain ([owner.name])"
+ stored_mmi.brainmob.real_name = owner.name
+ stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
+ stored_mmi.icon_state = "posibrain-occupied"
+ update_from_mmi()
+ else
+ stored_mmi.loc = get_turf(src)
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm
new file mode 100644
index 00000000000..3a7e18a9dc8
--- /dev/null
+++ b/code/modules/organs/subtypes/standard.dm
@@ -0,0 +1,163 @@
+/****************************************************
+ ORGAN DEFINES
+****************************************************/
+
+/obj/item/organ/external/chest
+ name = "upper body"
+ limb_name = "chest"
+ icon_name = "torso"
+ health = 100
+ min_broken_damage = 35
+ body_part = UPPER_TORSO
+ vital = 1
+ amputation_point = "spine"
+ joint = "neck"
+ dislocated = -1
+ gendered_icon = 1
+ cannot_amputate = 1
+ parent_organ = null
+ encased = "ribcage"
+
+/obj/item/organ/external/groin
+ name = "lower body"
+ limb_name = "groin"
+ icon_name = "groin"
+ health = 100
+ min_broken_damage = 35
+ body_part = LOWER_TORSO
+ vital = 1
+ parent_organ = "chest"
+ amputation_point = "lumbar"
+ joint = "hip"
+ dislocated = -1
+ gendered_icon = 1
+
+/obj/item/organ/external/arm
+ limb_name = "l_arm"
+ name = "left arm"
+ icon_name = "l_arm"
+ health = 50
+ min_broken_damage = 30
+ body_part = ARM_LEFT
+ parent_organ = "chest"
+ joint = "left elbow"
+ amputation_point = "left shoulder"
+ can_grasp = 1
+
+/obj/item/organ/external/arm/right
+ limb_name = "r_arm"
+ name = "right arm"
+ icon_name = "r_arm"
+ body_part = ARM_RIGHT
+ joint = "right elbow"
+ amputation_point = "right shoulder"
+
+/obj/item/organ/external/leg
+ limb_name = "l_leg"
+ name = "left leg"
+ icon_name = "l_leg"
+ health = 50
+ min_broken_damage = 30
+ body_part = LEG_LEFT
+ icon_position = LEFT
+ parent_organ = "groin"
+ joint = "left knee"
+ amputation_point = "left hip"
+ can_stand = 1
+
+/obj/item/organ/external/leg/right
+ limb_name = "r_leg"
+ name = "right leg"
+ icon_name = "r_leg"
+ body_part = LEG_RIGHT
+ icon_position = RIGHT
+ joint = "right knee"
+ amputation_point = "right hip"
+
+/obj/item/organ/external/foot
+ limb_name = "l_foot"
+ name = "left foot"
+ icon_name = "l_foot"
+ health = 30
+ min_broken_damage = 15
+ body_part = FOOT_LEFT
+ icon_position = LEFT
+ parent_organ = "l_leg"
+ joint = "left ankle"
+ amputation_point = "left ankle"
+ can_stand = 1
+
+/obj/item/organ/external/foot/removed()
+ if(owner) owner.u_equip(owner.shoes)
+ ..()
+
+/obj/item/organ/external/foot/right
+ limb_name = "r_foot"
+ name = "right foot"
+ icon_name = "r_foot"
+ body_part = FOOT_RIGHT
+ icon_position = RIGHT
+ parent_organ = "r_leg"
+ joint = "right ankle"
+ amputation_point = "right ankle"
+
+/obj/item/organ/external/hand
+ limb_name = "l_hand"
+ name = "left hand"
+ icon_name = "l_hand"
+ health = 30
+ min_broken_damage = 15
+ body_part = HAND_LEFT
+ parent_organ = "l_arm"
+ joint = "left wrist"
+ amputation_point = "left wrist"
+ can_grasp = 1
+
+/obj/item/organ/external/hand/removed()
+ owner.u_equip(owner.gloves)
+ ..()
+
+/obj/item/organ/external/hand/right
+ limb_name = "r_hand"
+ name = "right hand"
+ icon_name = "r_hand"
+ body_part = HAND_RIGHT
+ parent_organ = "r_arm"
+ joint = "right wrist"
+ amputation_point = "right wrist"
+
+/obj/item/organ/external/head
+ limb_name = "head"
+ icon_name = "head"
+ name = "head"
+ health = 75
+ min_broken_damage = 35
+ body_part = HEAD
+ vital = 1
+ parent_organ = "chest"
+ joint = "jaw"
+ amputation_point = "neck"
+ gendered_icon = 1
+ encased = "skull"
+ var/can_intake_reagents = 1
+
+/obj/item/organ/external/head/removed()
+ if(owner)
+ name = "[owner.real_name]'s head"
+ owner.u_equip(owner.glasses)
+ owner.u_equip(owner.head)
+ owner.u_equip(owner.l_ear)
+ owner.u_equip(owner.r_ear)
+ owner.u_equip(owner.wear_mask)
+ spawn(1)
+ owner.update_hair()
+ ..()
+
+/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
+ ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs)
+ if (!disfigured)
+ if (brute_dam > 40)
+ if (prob(50))
+ disfigure("brute")
+ if (burn_dam > 40)
+ disfigure("burn")
diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm
new file mode 100644
index 00000000000..137249e7473
--- /dev/null
+++ b/code/modules/organs/subtypes/unbreakable.dm
@@ -0,0 +1,44 @@
+// Slime limbs.
+/obj/item/organ/external/chest/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/groin/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/arm/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/arm/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/leg/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/leg/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/foot/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/foot/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/hand/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/hand/right/unbreakable
+ cannot_break = 1
+ dislocated = -1
+
+/obj/item/organ/external/head/unbreakable
+ cannot_break = 1
+ dislocated = -1
diff --git a/code/modules/organs/subtypes/xenos.dm b/code/modules/organs/subtypes/xenos.dm
new file mode 100644
index 00000000000..0b1233085fd
--- /dev/null
+++ b/code/modules/organs/subtypes/xenos.dm
@@ -0,0 +1,52 @@
+//XENOMORPH ORGANS
+/obj/item/organ/xenos
+ name = "xeno organ"
+ icon = 'icons/effects/blood.dmi'
+ desc = "It smells like an accident in a chemical factory."
+
+/obj/item/organ/xenos/eggsac
+ name = "egg sac"
+ parent_organ = "groin"
+ icon_state = "xgibmid1"
+ organ_tag = "egg sac"
+
+/obj/item/organ/xenos/plasmavessel
+ name = "plasma vessel"
+ parent_organ = "chest"
+ icon_state = "xgibdown1"
+ organ_tag = "plasma vessel"
+ var/stored_plasma = 0
+ var/max_plasma = 500
+
+/obj/item/organ/xenos/plasmavessel/queen
+ name = "bloated plasma vessel"
+ stored_plasma = 200
+ max_plasma = 500
+
+/obj/item/organ/xenos/plasmavessel/sentinel
+ stored_plasma = 100
+ max_plasma = 250
+
+/obj/item/organ/xenos/plasmavessel/hunter
+ name = "tiny plasma vessel"
+ stored_plasma = 100
+ max_plasma = 150
+
+/obj/item/organ/xenos/acidgland
+ name = "acid gland"
+ parent_organ = "head"
+ icon_state = "xgibtorso"
+ organ_tag = "acid gland"
+
+/obj/item/organ/xenos/hivenode
+ name = "hive node"
+ parent_organ = "chest"
+ icon_state = "xgibmid2"
+ organ_tag = "hive node"
+
+/obj/item/organ/xenos/resinspinner
+ name = "resin spinner"
+ parent_organ = "head"
+ icon_state = "xgibmid2"
+ organ_tag = "resin spinner"
+
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index f21db9327d4..8c0144710ec 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -664,34 +664,7 @@
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(H.species.flags & IS_SYNTHETIC && H.a_intent == I_GRAB)
- if(emagged || stat & BROKEN)
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- H << "\red The APC power currents surge eratically, damaging your chassis!"
- H.adjustFireLoss(10,0)
- else if(src.cell && src.cell.charge > 0)
- if(H.nutrition < 450)
-
- if(src.cell.charge >= 500)
- H.nutrition += 50
- src.cell.charge -= 500
- else
- H.nutrition += src.cell.charge/10
- src.cell.charge = 0
-
- user << "\blue You slot your fingers into the APC interface and siphon off some of the stored charge for your own use."
- if(src.cell.charge < 0) src.cell.charge = 0
- if(H.nutrition > 500) H.nutrition = 500
- src.charging = 1
-
- else
- user << "\blue You are already fully charged."
- else
- user << "There is no charge to draw from that APC."
- return
- else if(H.species.can_shred(H))
+ if(H.species.can_shred(H))
user.visible_message("\red [user.name] slashes at the [src.name]!", "\blue You slash at the [src.name]!")
playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index e5be56b9440..d883054b1bd 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -519,14 +519,12 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
- if(H.species.flags & IS_SYNTHETIC)
- if(M == user)
- user << "\red You can't repair damage to your own body - it's against OH&S."
- return
-
if(S.burn_dam > 0 && use(1))
- S.heal_damage(0,15,0,1)
- user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].")
+ if(S.burn_dam < ROBOLIMB_SELF_REPAIR_CAP)
+ S.heal_damage(0,15,0,1)
+ user.visible_message("\red \The [user] repairs some burn damage on \the [M]'s [S.name] with \the [src].")
+ else
+ user << "\red The damage is far too severe to patch over externally."
return
else
user << "Nothing to fix!"
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index b722b36eded..a37c41a0aa1 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -200,7 +200,11 @@
else if (temperature > upper_limit)
bias = max(round((temperature - average)/TEMPERATURE_DIVISOR, 1), -TEMPERATURE_CHANGE_MAX)
- temperature += rand(-7 + bias, 7 + bias)
+ //limit temperature increase so that it cannot raise temperature above upper_limit,
+ //or if it is already above upper_limit, limit the increase to 0.
+ var/inc_limit = max(upper_limit - temperature, 0)
+ var/dec_limit = min(temperature - lower_limit, 0)
+ temperature += between(dec_limit, rand(-7 + bias, 7 + bias), inc_limit)
if (temperature > max_temperature)
overheat()
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 0e0da75e2a6..2d8ece18c12 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -1,11 +1,11 @@
/datum/reagent
var/name = "Reagent"
var/id = "reagent"
- var/description = "A non-descript chemical."
+ var/description = "A non-descript chemical."
var/datum/reagents/holder = null
var/reagent_state = SOLID
var/list/data = null
- var/volume = 0
+ var/volume = 0
var/metabolism = REM // This would be 0.2 normally
var/ingest_met = 0
var/touch_met = 0
@@ -13,11 +13,11 @@
var/max_dose = 0
var/overdose = 0
var/scannable = 0 // Shows up on health analyzers.
- var/affects_dead = 0
+ var/affects_dead = 0
var/glass_icon_state = null
var/glass_name = null
var/glass_desc = null
- var/glass_center_of_mass = null
+ var/glass_center_of_mass = null
var/color = "#000000"
var/color_weight = 1
@@ -86,11 +86,11 @@
return data.Copy()
else if(data)
return data
- return null
+ return null
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
..()
- holder = null
+ holder = null
/* DEPRECATED - TODO: REMOVE EVERYWHERE */
@@ -108,4 +108,4 @@
id = "woodpulp"
description = "A mass of wood fibers."
reagent_state = LIQUID
- color = "#B97A57"
+ color = "#B97A57"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
index d957e88a4c7..c7afddee391 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm
@@ -57,6 +57,8 @@
M.adjustToxLoss(removed)
/datum/reagent/blood/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_MACHINE)
+ return
if(data && data["viruses"])
for(var/datum/disease/D in data["viruses"])
if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS)
@@ -181,6 +183,7 @@
description = "Required for welders. Flamable."
reagent_state = LIQUID
color = "#660000"
+ touch_met = 5
glass_icon_state = "dr_gibb_glass"
glass_name = "glass of welder fuel"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
index eac0f76cd27..901676b8996 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm
@@ -1,3 +1,31 @@
+/datum/reagent/acetone
+ name = "Acetone"
+ id = "acetone"
+ description = "A colorless liquid solvent used in chemical synthesis."
+ reagent_state = LIQUID
+ color = "#808080"
+ metabolism = REM * 0.2
+
+/datum/reagent/acetone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustToxLoss(removed * 3)
+
+/datum/reagent/acetone/touch_obj(var/obj/O) //I copied this wholesale from ethanol and could likely be converted into a shared proc. ~Techhead
+ if(istype(O, /obj/item/weapon/paper))
+ var/obj/item/weapon/paper/paperaffected = O
+ paperaffected.clearpaper()
+ usr << "The solution dissolves the ink on the paper."
+ return
+ if(istype(O, /obj/item/weapon/book))
+ if(volume < 5)
+ return
+ if(istype(O, /obj/item/weapon/book/tome))
+ usr << "The solution does nothing. Whatever this is, it isn't normal ink."
+ return
+ var/obj/item/weapon/book/affectedbook = O
+ affectedbook.dat = null
+ usr << "The solution dissolves the ink on the book."
+ return
+
/datum/reagent/aluminum
name = "Aluminum"
id = "aluminum"
@@ -5,6 +33,20 @@
reagent_state = SOLID
color = "#A8A8A8"
+/datum/reagent/ammonia
+ name = "Ammonia"
+ id = "ammonia"
+ description = "A caustic substance commonly used in fertilizer or household cleaners."
+ reagent_state = LIQUID
+ color = "#404030"
+ metabolism = REM * 0.5
+
+/datum/reagent/ammonia/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_VOX)
+ M.adjustOxyLoss(-removed * 10)
+ else if(alien != IS_DIONA)
+ M.adjustToxLoss(removed * 1.5)
+
/datum/reagent/carbon
name = "Carbon"
id = "carbon"
@@ -32,19 +74,6 @@
else
dirtoverlay.alpha = min(dirtoverlay.alpha + volume * 30, 255)
-/datum/reagent/chlorine
- name = "Chlorine"
- id = "chlorine"
- description = "A chemical element with a characteristic odour."
- reagent_state = GAS
- color = "#808080"
-
-/datum/reagent/chlorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.take_organ_damage(1*REM, 0)
-
-/datum/reagent/chlorine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
- M.take_organ_damage(1*REM, 0)
-
/datum/reagent/copper
name = "Copper"
id = "copper"
@@ -57,6 +86,7 @@
description = "A well-known alcohol with a variety of applications."
reagent_state = LIQUID
color = "#404030"
+ touch_met = 5
var/nutriment_factor = 0
var/strength = 10 // This is, essentially, units between stages - the lower, the stronger. Less fine tuning, more clarity.
var/toxicity = 1
@@ -133,25 +163,26 @@
usr << "The solution dissolves the ink on the book."
return
-/datum/reagent/fluorine
- name = "Fluorine"
- id = "fluorine"
- description = "A highly-reactive chemical element."
- reagent_state = GAS
+/datum/reagent/hydrazine
+ name = "Hydrazine"
+ id = "hydrazine"
+ description = "A toxic, colorless, flammable liquid with a strong ammonia-like odor, in hydrate form."
+ reagent_state = LIQUID
color = "#808080"
+ metabolism = REM * 0.2
+ touch_met = 5
-/datum/reagent/fluorine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- M.adjustToxLoss(removed)
+/datum/reagent/hydrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustToxLoss(4 * removed)
-/datum/reagent/fluorine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
- M.adjustToxLoss(removed)
+/datum/reagent/hydrazine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) // Hydrazine is both toxic and flammable.
+ M.adjust_fire_stacks(removed / 12)
+ M.adjustToxLoss(0.2 * removed)
-/datum/reagent/hydrogen
- name = "Hydrogen"
- id = "hydrogen"
- description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
- reagent_state = GAS
- color = "#808080"
+/datum/reagent/hydrazine/touch_turf(var/turf/T)
+ new /obj/effect/decal/cleanable/liquid_fuel(T, volume)
+ remove_self(volume)
+ return
/datum/reagent/iron
name = "Iron"
@@ -193,28 +224,6 @@
M.emote(pick("twitch", "drool", "moan"))
M.adjustBrainLoss(2)
-/datum/reagent/nitrogen
- name = "Nitrogen"
- id = "nitrogen"
- description = "A colorless, odorless, tasteless gas."
- reagent_state = GAS
- color = "#808080"
-
-/datum/reagent/nitrogen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_VOX)
- M.adjustOxyLoss(-removed * 3)
-
-/datum/reagent/oxygen
- name = "Oxygen"
- id = "oxygen"
- description = "A colorless, odorless gas."
- reagent_state = GAS
- color = "#808080"
-
-/datum/reagent/oxygen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_VOX)
- M.adjustToxLoss(removed * 3)
-
/datum/reagent/phosphorus
name = "Phosphorus"
id = "phosphorus"
@@ -345,6 +354,15 @@
qdel(O)
remove_self(meltdose) // 10 units of acid will not melt EVERYTHING on the tile
+/datum/reagent/acid/hydrochloric //Like sulfuric, but less toxic and more acidic.
+ name = "Hydrochloric Acid"
+ id = "hclacid"
+ description = "A very corrosive mineral acid with the molecular formula HCl."
+ reagent_state = LIQUID
+ color = "#808080"
+ power = 3
+ meltdose = 8
+
/datum/reagent/silicon
name = "Silicon"
id = "silicon"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
index 97db6ceab5e..2f9cc0f548e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm
@@ -226,11 +226,11 @@
M.adjustToxLoss(0.5 * removed)
/datum/reagent/capsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
- if(alien == IS_DIONA)
+ if(alien == IS_DIONA || alien == IS_MACHINE)
return
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC)))
+ if(H.species && (H.species.flags & (NO_PAIN)))
return
if(dose < 5 && (dose == metabolism || prob(5)))
M << "Your insides feel uncomfortably hot!"
@@ -307,7 +307,7 @@
/datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && (H.species.flags & (NO_PAIN | IS_SYNTHETIC)))
+ if(H.species && (H.species.flags & (NO_PAIN)))
return
if(dose == metabolism)
M << "You feel like your insides are burning!"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
index 0b57ef93725..51c86f1b524 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm
@@ -220,13 +220,6 @@
T.holy = 1
return
-/datum/reagent/ammonia
- name = "Ammonia"
- id = "ammonia"
- description = "A caustic substance commonly used in fertilizer or household cleaners."
- reagent_state = GAS
- color = "#404030"
-
/datum/reagent/diethylamine
name = "Diethylamine"
id = "diethylamine"
@@ -234,10 +227,10 @@
reagent_state = LIQUID
color = "#604030"
-/datum/reagent/fluorosurfactant // Foam precursor
- name = "Fluorosurfactant"
- id = "fluorosurfactant"
- description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
+/datum/reagent/surfactant // Foam precursor
+ name = "Azosurfactant"
+ id = "surfactant"
+ description = "A isocyanate liquid that forms a foam when mixed with water."
reagent_state = LIQUID
color = "#9E6B38"
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index 92b6b67796a..9f8e05a20b6 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -44,10 +44,13 @@
reagent_state = LIQUID
color = "#9D14DB"
strength = 30
+ touch_met = 5
/datum/reagent/toxin/phoron/affect_touch(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.adjust_fire_stacks(removed / 5)
+ if(prob(50))
+ M.pl_effects()
/datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T)
if(!istype(T))
@@ -226,6 +229,9 @@
affect_blood(M, alien, removed)
/datum/reagent/mutagen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ var/mob/living/carbon/human/H = M
+ if(istype(H) && (H.species.flags & NO_SCAN))
+ return
if(M.dna)
if(prob(removed * 0.1)) // Approx. one mutation per 10 injected/20 ingested/30 touching units
randmuti(M)
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index 72ce607065f..e400cee3604 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -24,21 +24,21 @@
name = "Inaprovaline"
id = "inaprovaline"
result = "inaprovaline"
- required_reagents = list("oxygen" = 1, "carbon" = 1, "sugar" = 1)
+ required_reagents = list("acetone" = 1, "carbon" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/dylovene
name = "Dylovene"
id = "anti_toxin"
result = "anti_toxin"
- required_reagents = list("silicon" = 1, "potassium" = 1, "nitrogen" = 1)
+ required_reagents = list("silicon" = 1, "potassium" = 1, "ammonia" = 1)
result_amount = 3
/datum/chemical_reaction/tramadol
name = "Tramadol"
id = "tramadol"
result = "tramadol"
- required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "oxygen" = 1)
+ required_reagents = list("inaprovaline" = 1, "ethanol" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/paracetamol
@@ -60,35 +60,28 @@
name = "Sterilizine"
id = "sterilizine"
result = "sterilizine"
- required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "chlorine" = 1)
+ required_reagents = list("ethanol" = 1, "anti_toxin" = 1, "hclacid" = 1)
result_amount = 3
/datum/chemical_reaction/silicate
name = "Silicate"
id = "silicate"
result = "silicate"
- required_reagents = list("aluminum" = 1, "silicon" = 1, "oxygen" = 1)
+ required_reagents = list("aluminum" = 1, "silicon" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/mutagen
name = "Unstable mutagen"
id = "mutagen"
result = "mutagen"
- required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1)
+ required_reagents = list("radium" = 1, "phosphorus" = 1, "hclacid" = 1)
result_amount = 3
-/datum/chemical_reaction/water
- name = "Water"
- id = "water"
- result = "water"
- required_reagents = list("oxygen" = 1, "hydrogen" = 2)
- result_amount = 1
-
/datum/chemical_reaction/thermite
name = "Thermite"
id = "thermite"
result = "thermite"
- required_reagents = list("aluminum" = 1, "iron" = 1, "oxygen" = 1)
+ required_reagents = list("aluminum" = 1, "iron" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/space_drugs
@@ -102,14 +95,14 @@
name = "Space Lube"
id = "lube"
result = "lube"
- required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
+ required_reagents = list("water" = 1, "silicon" = 1, "acetone" = 1)
result_amount = 4
/datum/chemical_reaction/pacid
name = "Polytrinic acid"
id = "pacid"
result = "pacid"
- required_reagents = list("sacid" = 1, "chlorine" = 1, "potassium" = 1)
+ required_reagents = list("sacid" = 1, "hclacid" = 1, "potassium" = 1)
result_amount = 3
/datum/chemical_reaction/synaptizine
@@ -130,14 +123,14 @@
name = "Arithrazine"
id = "arithrazine"
result = "arithrazine"
- required_reagents = list("hyronalin" = 1, "hydrogen" = 1)
+ required_reagents = list("hyronalin" = 1, "hydrazine" = 1)
result_amount = 2
/datum/chemical_reaction/impedrezene
name = "Impedrezene"
id = "impedrezene"
result = "impedrezene"
- required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1)
+ required_reagents = list("mercury" = 1, "acetone" = 1, "sugar" = 1)
result_amount = 2
/datum/chemical_reaction/kelotane
@@ -174,7 +167,7 @@
name = "Cryptobiolin"
id = "cryptobiolin"
result = "cryptobiolin"
- required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1)
+ required_reagents = list("potassium" = 1, "acetone" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/tricordrazine
@@ -188,14 +181,14 @@
name = "Alkysine"
id = "alkysine"
result = "alkysine"
- required_reagents = list("chlorine" = 1, "nitrogen" = 1, "anti_toxin" = 1)
+ required_reagents = list("hclacid" = 1, "ammonia" = 1, "anti_toxin" = 1)
result_amount = 2
/datum/chemical_reaction/dexalin
name = "Dexalin"
id = "dexalin"
result = "dexalin"
- required_reagents = list("oxygen" = 2, "phoron" = 0.1)
+ required_reagents = list("acetone" = 2, "phoron" = 0.1)
catalysts = list("phoron" = 1)
inhibitors = list("water" = 1) // Messes with cryox
result_amount = 1
@@ -204,7 +197,7 @@
name = "Dermaline"
id = "dermaline"
result = "dermaline"
- required_reagents = list("oxygen" = 1, "phosphorus" = 1, "kelotane" = 1)
+ required_reagents = list("acetone" = 1, "phosphorus" = 1, "kelotane" = 1)
result_amount = 3
/datum/chemical_reaction/dexalinp
@@ -240,7 +233,7 @@
name = "Cryoxadone"
id = "cryoxadone"
result = "cryoxadone"
- required_reagents = list("dexalin" = 1, "water" = 1, "oxygen" = 1)
+ required_reagents = list("dexalin" = 1, "water" = 1, "acetone" = 1)
result_amount = 3
/datum/chemical_reaction/clonexadone
@@ -262,14 +255,14 @@
name = "imidazoline"
id = "imidazoline"
result = "imidazoline"
- required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
+ required_reagents = list("carbon" = 1, "hydrazine" = 1, "anti_toxin" = 1)
result_amount = 2
/datum/chemical_reaction/ethylredoxrazine
name = "Ethylredoxrazine"
id = "ethylredoxrazine"
result = "ethylredoxrazine"
- required_reagents = list("oxygen" = 1, "anti_toxin" = 1, "carbon" = 1)
+ required_reagents = list("acetone" = 1, "anti_toxin" = 1, "carbon" = 1)
result_amount = 3
/datum/chemical_reaction/soporific
@@ -284,7 +277,7 @@
name = "Chloral Hydrate"
id = "chloralhydrate"
result = "chloralhydrate"
- required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
+ required_reagents = list("ethanol" = 1, "hclacid" = 3, "water" = 1)
result_amount = 1
/datum/chemical_reaction/potassium_chloride
@@ -312,7 +305,7 @@
name = "Mindbreaker Toxin"
id = "mindbreaker"
result = "mindbreaker"
- required_reagents = list("silicon" = 1, "hydrogen" = 1, "anti_toxin" = 1)
+ required_reagents = list("silicon" = 1, "hydrazine" = 1, "anti_toxin" = 1)
result_amount = 3
/datum/chemical_reaction/lipozine
@@ -323,19 +316,12 @@
result_amount = 3
/datum/chemical_reaction/surfactant
- name = "Foam surfactant"
- id = "foam surfactant"
- result = "fluorosurfactant"
- required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
+ name = "Azosurfactant"
+ id = "surfactant"
+ result = "surfactant"
+ required_reagents = list("hydrazine" = 2, "carbon" = 2, "sacid" = 1)
result_amount = 5
-/datum/chemical_reaction/ammonia
- name = "Ammonia"
- id = "ammonia"
- result = "ammonia"
- required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
- result_amount = 3
-
/datum/chemical_reaction/diethylamine
name = "Diethylamine"
id = "diethylamine"
@@ -361,7 +347,7 @@
name = "Foaming Agent"
id = "foaming_agent"
result = "foaming_agent"
- required_reagents = list("lithium" = 1, "hydrogen" = 1)
+ required_reagents = list("lithium" = 1, "hydrazine" = 1)
result_amount = 1
/datum/chemical_reaction/glycerol
@@ -375,7 +361,7 @@
name = "Sodium Chloride"
id = "sodiumchloride"
result = "sodiumchloride"
- required_reagents = list("sodium" = 1, "chlorine" = 1)
+ required_reagents = list("sodium" = 1, "hclacid" = 1)
result_amount = 2
/datum/chemical_reaction/condensedcapsaicin
@@ -390,7 +376,7 @@
name = "Coolant"
id = "coolant"
result = "coolant"
- required_reagents = list("tungsten" = 1, "oxygen" = 1, "water" = 1)
+ required_reagents = list("tungsten" = 1, "acetone" = 1, "water" = 1)
result_amount = 3
/datum/chemical_reaction/rezadone
@@ -404,14 +390,14 @@
name = "Lexorin"
id = "lexorin"
result = "lexorin"
- required_reagents = list("phoron" = 1, "hydrogen" = 1, "nitrogen" = 1)
+ required_reagents = list("phoron" = 1, "hydrazine" = 1, "ammonia" = 1)
result_amount = 3
/datum/chemical_reaction/methylphenidate
name = "Methylphenidate"
id = "methylphenidate"
result = "methylphenidate"
- required_reagents = list("mindbreaker" = 1, "hydrogen" = 1)
+ required_reagents = list("mindbreaker" = 1, "hydrazine" = 1)
result_amount = 3
/datum/chemical_reaction/citalopram
@@ -426,7 +412,7 @@
name = "Paroxetine"
id = "paroxetine"
result = "paroxetine"
- required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1)
+ required_reagents = list("mindbreaker" = 1, "acetone" = 1, "inaprovaline" = 1)
result_amount = 3
/* Solidification */
@@ -579,7 +565,7 @@
name = "Foam"
id = "foam"
result = null
- required_reagents = list("fluorosurfactant" = 1, "water" = 1)
+ required_reagents = list("surfactant" = 1, "water" = 1)
result_amount = 2
mix_message = "The solution violently bubbles!"
@@ -1922,7 +1908,7 @@ datum
name = "Lithium Sodium Tungstate"
id = "lithiumsodiumtungstate"
result = "lithiumsodiumtungstate"
- required_reagents = list("lithium" = 1, "sodium" = 2, "tungsten" = 1, "oxygen" = 4)
+ required_reagents = list("lithium" = 1, "sodium" = 2, "tungsten" = 1, "acetone" = 4)
result_amount = 8
density_separated_liquid
diff --git a/code/modules/reagents/dispenser/cartridge_presets.dm b/code/modules/reagents/dispenser/cartridge_presets.dm
index 007660c1e9a..3683a89af05 100644
--- a/code/modules/reagents/dispenser/cartridge_presets.dm
+++ b/code/modules/reagents/dispenser/cartridge_presets.dm
@@ -10,18 +10,17 @@
sugar spawn_reagent = "sugar"
// Chemistry
- hydrogen spawn_reagent = "hydrogen"
+ hydrazine spawn_reagent = "hydrazine"
lithium spawn_reagent = "lithium"
carbon spawn_reagent = "carbon"
- nitrogen spawn_reagent = "nitrogen"
- oxygen spawn_reagent = "oxygen"
- fluorine spawn_reagent = "fluorine"
+ ammonia spawn_reagent = "ammonia"
+ acetone spawn_reagent = "acetone"
sodium spawn_reagent = "sodium"
aluminum spawn_reagent = "aluminum"
silicon spawn_reagent = "silicon"
phosphorus spawn_reagent = "phosphorus"
sulfur spawn_reagent = "sulfur"
- chlorine spawn_reagent = "chlorine"
+ hclacid spawn_reagent = "hclacid"
potassium spawn_reagent = "potassium"
iron spawn_reagent = "iron"
copper spawn_reagent = "copper"
diff --git a/code/modules/reagents/dispenser/dispenser_presets.dm b/code/modules/reagents/dispenser/dispenser_presets.dm
index 60d30506920..01c92fcb662 100644
--- a/code/modules/reagents/dispenser/dispenser_presets.dm
+++ b/code/modules/reagents/dispenser/dispenser_presets.dm
@@ -1,17 +1,16 @@
/obj/machinery/chemical_dispenser/full
spawn_cartridges = list(
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/iron,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/copper,
diff --git a/code/modules/reagents/dispenser/supply.dm b/code/modules/reagents/dispenser/supply.dm
index f208991712f..45e9ac8702c 100644
--- a/code/modules/reagents/dispenser/supply.dm
+++ b/code/modules/reagents/dispenser/supply.dm
@@ -31,18 +31,17 @@
/datum/supply_packs/reagents
name = "Chemistry dispenser refill"
contains = list(
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur,
- /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine,
+ /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/iron,
/obj/item/weapon/reagent_containers/chem_disp_cartridge/copper,
@@ -153,18 +152,17 @@
// Chemistry-restricted (raw reagents excluding sugar/water)
// Datum path Contents type Supply pack name Container name Cost Container access
-SEC_PACK(hydrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrogen, "Reagent refill - Hydrogen", "hydrogen reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(hydrazine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hydrazine, "Reagent refill - Hydrazine", "hydrazine reagent cartridge crate", 15, access_chemistry)
SEC_PACK(lithium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/lithium, "Reagent refill - Lithium", "lithium reagent cartridge crate", 15, access_chemistry)
SEC_PACK(carbon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/carbon, "Reagent refill - Carbon", "carbon reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(nitrogen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/nitrogen, "Reagent refill - Nitrogen", "nitrogen reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(oxygen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/oxygen, "Reagent refill - Oxygen", "oxygen reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(fluorine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/fluorine, "Reagent refill - Fluorine", "fluorine reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(ammonia, /obj/item/weapon/reagent_containers/chem_disp_cartridge/ammonia, "Reagent refill - Ammonia", "ammonia reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(oxygen, /obj/item/weapon/reagent_containers/chem_disp_cartridge/acetone, "Reagent refill - Acetone", "acetone reagent cartridge crate", 15, access_chemistry)
SEC_PACK(sodium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sodium, "Reagent refill - Sodium", "sodium reagent cartridge crate", 15, access_chemistry)
SEC_PACK(aluminium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/aluminum, "Reagent refill - Aluminum", "aluminum reagent cartridge crate", 15, access_chemistry)
SEC_PACK(silicon, /obj/item/weapon/reagent_containers/chem_disp_cartridge/silicon, "Reagent refill - Silicon", "silicon reagent cartridge crate", 15, access_chemistry)
SEC_PACK(phosphorus,/obj/item/weapon/reagent_containers/chem_disp_cartridge/phosphorus, "Reagent refill - Phosphorus", "phosphorus reagent cartridge crate", 15, access_chemistry)
SEC_PACK(sulfur, /obj/item/weapon/reagent_containers/chem_disp_cartridge/sulfur, "Reagent refill - Sulfur", "sulfur reagent cartridge crate", 15, access_chemistry)
-SEC_PACK(chlorine, /obj/item/weapon/reagent_containers/chem_disp_cartridge/chlorine, "Reagent refill - Chlorine", "chlorine reagent cartridge crate", 15, access_chemistry)
+SEC_PACK(hclacid, /obj/item/weapon/reagent_containers/chem_disp_cartridge/hclacid, "Reagent refill - Hydrochloric Acid", "hydrochloric acid reagent cartridge crate", 15, access_chemistry)
SEC_PACK(potassium, /obj/item/weapon/reagent_containers/chem_disp_cartridge/potassium, "Reagent refill - Potassium", "potassium reagent cartridge crate", 15, access_chemistry)
SEC_PACK(iron, /obj/item/weapon/reagent_containers/chem_disp_cartridge/iron, "Reagent refill - Iron", "iron reagent cartridge crate", 15, access_chemistry)
SEC_PACK(copper, /obj/item/weapon/reagent_containers/chem_disp_cartridge/copper, "Reagent refill - Copper", "copper reagent cartridge crate", 15, access_chemistry)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 2d0a1469b58..17de69ae346 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -25,9 +25,9 @@
/obj/item/weapon/reagent_containers/attack_self(mob/user as mob)
return
-/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone)
+/obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone)
if(can_operate(M))//Checks if mob is lying down on table for surgery
- if(do_surgery(M, user, src))
+ if(do_surgery(M, user, src))
return
/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user, flag)
@@ -98,10 +98,9 @@
if(target == user)
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user
- if(H.species.flags & IS_SYNTHETIC)
- H << "You have a monitor for a head, where do you think you're going to put that?"
- return 1
-
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? You don't have a mouth!"
+ return
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -114,10 +113,9 @@
else
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = target
- if(H.species.flags & IS_SYNTHETIC)
- H << "They have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -153,4 +151,4 @@
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
user << "You transfer [trans] units of the solution to [target]."
- return 1
+ return 1
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 985ed3d9d27..b57830e1d62 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -65,6 +65,16 @@
if (!istype(M))
return
+ var/mob/living/carbon/human/H = M
+ if(istype(H))
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ if(!affected)
+ user << "\The [H] is missing that limb!"
+ return
+ else if(affected.status & ORGAN_ROBOT)
+ user << "You cannot inject a robotic limb."
+ return
+
if (R.total_volume && M.can_inject(user, 1))
user << "You inject [M] with the injector."
M << "You feel a tiny prick!"
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index a63fbdd46bc..47240eeb222 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -45,10 +45,9 @@
if(M == user) //If you're eating it yourself
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- H << "You have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? You don't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -68,10 +67,9 @@
else
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- user << "They have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index c5153510d7b..f39d7167fab 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -25,6 +25,17 @@
return
if (!istype(M))
return
+
+ var/mob/living/carbon/human/H = M
+ if(istype(H))
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ if(!affected)
+ user << "\The [H] is missing that limb!"
+ return
+ else if(affected.status & ORGAN_ROBOT)
+ user << "You cannot inject a robotic limb."
+ return
+
user << "You inject [M] with [src]."
M << "You feel a tiny prick!"
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index bb405828ee3..0891468cd10 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -21,10 +21,9 @@
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- H << "You have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? You don't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
if(blocked)
user << "\The [blocked] is in the way!"
@@ -40,12 +39,10 @@
else if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.flags & IS_SYNTHETIC)
- H << "They have a monitor for a head, where do you think you're going to put that?"
+ if(!H.check_has_mouth())
+ user << "Where do you intend to put \the [src]? \The [H] doesn't have a mouth!"
return
-
var/obj/item/blocked = H.check_mouth_coverage()
-
if(blocked)
user << "\The [blocked] is in the way!"
return
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index c7f869802bb..bdc17b298c4 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -142,13 +142,21 @@
user << "[target] is full."
return
+ var/mob/living/carbon/human/H = target
+ if(istype(H))
+ var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
+ if(!affected)
+ user << "\The [H] is missing that limb!"
+ return
+ else if(affected.status & ORGAN_ROBOT)
+ user << "You cannot inject a robotic limb."
+ return
+
if(ismob(target) && target != user)
var/injtime = time //Injecting through a hardsuit takes longer due to needing to find a port.
- if(istype(target, /mob/living/carbon/human))
-
- var/mob/living/carbon/human/H = target
+ if(istype(H))
if(H.wear_suit)
if(istype(H.wear_suit, /obj/item/clothing/suit/space))
injtime = injtime * 2
diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm
index bf5d6957a6a..3368c8344d0 100644
--- a/code/modules/supermatter/supermatter.dm
+++ b/code/modules/supermatter/supermatter.dm
@@ -120,12 +120,17 @@
if(lum != light_range || clr != light_color)
set_light(lum, l_color = clr)
-/obj/machinery/power/supermatter/proc/announce_warning()
+/obj/machinery/power/supermatter/proc/get_integrity()
var/integrity = damage / explosion_point
integrity = round(100 - integrity * 100)
integrity = integrity < 0 ? 0 : integrity
+ return integrity
+
+
+/obj/machinery/power/supermatter/proc/announce_warning()
+ var/integrity = get_integrity()
var/alert_msg = " Integrity at [integrity]%"
-
+
if(damage > emergency_point)
alert_msg = emergency_alert + alert_msg
lastwarning = world.timeofday - WARNING_DELAY * 4
@@ -148,7 +153,7 @@
else if(safe_warned && public_alert)
radio.autosay(alert_msg, "Supermatter Monitor")
public_alert = 0
-
+
/obj/machinery/power/supermatter/process()
@@ -267,11 +272,11 @@
if(Adjacent(user))
return attack_hand(user)
else
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update."
+ ui_interact(user)
return
/obj/machinery/power/supermatter/attack_ai(mob/user as mob)
- user << "You attempt to interface with the control circuits but find they are not connected to your network. Maybe in a future firmware update."
+ ui_interact(user)
/obj/machinery/power/supermatter/attack_hand(mob/user as mob)
user.visible_message("\The [user] reaches out and touches \the [src], inducing a resonance... \his body starts to glow and bursts into flames before flashing into ash.",\
@@ -280,6 +285,31 @@
Consume(user)
+// This is purely informational UI that may be accessed by AIs or robots
+/obj/machinery/power/supermatter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+
+ data["integrity_percentage"] = round(get_integrity())
+ var/datum/gas_mixture/env = null
+ if(!istype(src.loc, /turf/space))
+ env = src.loc.return_air()
+
+ if(!env)
+ data["ambient_temp"] = 0
+ data["ambient_pressure"] = 0
+ else
+ data["ambient_temp"] = round(env.temperature)
+ data["ambient_pressure"] = round(env.return_pressure())
+ data["detonating"] = grav_pulling
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "supermatter_crystal.tmpl", "Supermatter Crystal", 500, 300)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+
/*
/obj/machinery/power/supermatter/proc/transfer_energy()
for(var/obj/machinery/power/rad_collector/R in rad_collectors)
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index b2ccbb10032..25addbd40a4 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -18,7 +18,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open >= 2 && affected.stage == 0
+ return affected && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -52,7 +52,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.name != "head" && affected.open >= 2 && affected.stage == 1
+ return affected && affected.name != "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
@@ -91,7 +91,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.name == "head" && affected.open >= 2 && affected.stage == 1
+ return affected && affected.name == "head" && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \
@@ -127,7 +127,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open >= 2 && affected.stage == 2
+ return affected && affected.open >= 2 && !(affected.status & ORGAN_ROBOT) && affected.stage == 2
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
diff --git a/code/modules/surgery/brainrepair.dm b/code/modules/surgery/brainrepair.dm
deleted file mode 100644
index 6935b09d244..00000000000
--- a/code/modules/surgery/brainrepair.dm
+++ /dev/null
@@ -1,70 +0,0 @@
-//////////////////////////////////////////////////////////////////
-// BRAIN DAMAGE FIXING //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/brain/bone_chips
- allowed_tools = list(
- /obj/item/weapon/hemostat = 100, \
- /obj/item/weapon/wirecutters = 75, \
- /obj/item/weapon/material/kitchen/utensil/fork = 20
- )
-
- priority = 3
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- return (sponge && sponge.damage > 0 && sponge.damage <= 20) && affected.open == 3
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts taking bone chips out of [target]'s brain with \the [tool].", \
- "You start taking bone chips out of [target]'s brain with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] takes out all the bone chips in [target]'s brain with \the [tool].", \
- "\blue You take out all the bone chips in [target]'s brain with \the [tool].")
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- if (sponge)
- sponge.damage = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, jabbing \the [tool] in [target]'s brain!", \
- "\red Your hand slips, jabbing \the [tool] in [target]'s brain!")
- target.apply_damage(30, BRUTE, "head", 1, sharp=1)
-
-/datum/surgery_step/brain/hematoma
- allowed_tools = list(
- /obj/item/weapon/FixOVein = 100, \
- /obj/item/stack/cable_coil = 75
- )
-
- priority = 3
- min_duration = 90
- max_duration = 110
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- return (sponge && sponge.damage > 20) && affected.open == 3
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending hematoma in [target]'s brain with \the [tool].", \
- "You start mending hematoma in [target]'s brain with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] mends hematoma in [target]'s brain with \the [tool].", \
- "\blue You mend hematoma in [target]'s brain with \the [tool].")
- var/obj/item/organ/brain/sponge = target.internal_organs_by_name["brain"]
- if (sponge)
- sponge.damage = 20
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, bruising [target]'s brain with \the [tool]!", \
- "\red Your hand slips, bruising [target]'s brain with \the [tool]!")
- target.apply_damage(20, BRUTE, "head", 1, sharp=1)
\ No newline at end of file
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index 8e1a5163842..1744cec3d7e 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -12,7 +12,7 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.encased && affected.open >= 2
+ return affected && !(affected.status & ORGAN_ROBOT) && affected.encased && affected.open >= 2
/datum/surgery_step/open_encased/saw
diff --git a/code/modules/surgery/eye.dm b/code/modules/surgery/eye.dm
deleted file mode 100644
index 7b69fea7ff6..00000000000
--- a/code/modules/surgery/eye.dm
+++ /dev/null
@@ -1,147 +0,0 @@
-//Procedures in this file: Eye mending surgery
-//////////////////////////////////////////////////////////////////
-// EYE SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/eye
- priority = 2
- can_infect = 1
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
- return 0
-
- var/obj/item/organ/eyes = target.internal_organs_by_name["eyes"]
-
- return target_zone == "eyes" && eyes
-
-/datum/surgery_step/eye/cut_open
- allowed_tools = list(
- /obj/item/weapon/scalpel = 100, \
- /obj/item/weapon/material/knife = 75, \
- /obj/item/weapon/material/shard = 50, \
- )
-
- min_duration = 90
- max_duration = 110
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to separate the corneas on [target]'s eyes with \the [tool].", \
- "You start to separate the corneas on [target]'s eyes with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has separated the corneas on [target]'s eyes with \the [tool]." , \
- "\blue You have separated the corneas on [target]'s eyes with \the [tool].",)
- target.op_stage.eyes = 1
- target.blinded += 1.5
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, slicing [target]'s eyes wth \the [tool]!" , \
- "\red Your hand slips, slicing [target]'s eyes wth \the [tool]!" )
- affected.createwound(CUT, 10)
- eyes.take_damage(5, 0)
-
-/datum/surgery_step/eye/lift_eyes
- allowed_tools = list(
- /obj/item/weapon/retractor = 100, \
- /obj/item/weapon/material/kitchen/utensil/fork = 50
- )
-
- min_duration = 30
- max_duration = 40
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.eyes == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts lifting corneas from [target]'s eyes with \the [tool].", \
- "You start lifting corneas from [target]'s eyes with \the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has lifted the corneas from [target]'s eyes from with \the [tool]." , \
- "\blue You has lifted the corneas from [target]'s eyes from with \the [tool]." )
- target.op_stage.eyes = 2
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s eyes with \the [tool]!", \
- "\red Your hand slips, damaging [target]'s eyes with \the [tool]!")
- target.apply_damage(10, BRUTE, affected)
- eyes.take_damage(5, 0)
-
-/datum/surgery_step/eye/mend_eyes
- allowed_tools = list(
- /obj/item/weapon/hemostat = 100, \
- /obj/item/stack/cable_coil = 75, \
- /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity.
- )
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.eyes == 2
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending the nerves and lenses in [target]'s eyes with \the [tool].", \
- "You start mending the nerves and lenses in [target]'s eyes with the [tool].")
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] mends the nerves and lenses in [target]'s with \the [tool]." , \
- "\blue You mend the nerves and lenses in [target]'s with \the [tool].")
- target.op_stage.eyes = 3
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, stabbing \the [tool] into [target]'s eye!", \
- "\red Your hand slips, stabbing \the [tool] into [target]'s eye!")
- target.apply_damage(10, BRUTE, affected, sharp=1)
- eyes.take_damage(5, 0)
-
-/datum/surgery_step/eye/cauterize
- allowed_tools = list(
- /obj/item/weapon/cautery = 100, \
- /obj/item/clothing/mask/smokable/cigarette = 75, \
- /obj/item/weapon/flame/lighter = 50, \
- /obj/item/weapon/weldingtool = 25
- )
-
- min_duration = 70
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to cauterize the incision around [target]'s eyes with \the [tool]." , \
- "You are beginning to cauterize the incision around [target]'s eyes with \the [tool].")
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- user.visible_message("\blue [user] cauterizes the incision around [target]'s eyes with \the [tool].", \
- "\blue You cauterize the incision around [target]'s eyes with \the [tool].")
- if (target.op_stage.eyes == 3)
- target.disabilities &= ~NEARSIGHTED
- target.sdisabilities &= ~BLIND
- eyes.damage = 0
- target.op_stage.eyes = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/eyes/eyes = target.internal_organs_by_name["eyes"]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, searing [target]'s eyes with \the [tool]!", \
- "\red Your hand slips, searing [target]'s eyes with \the [tool]!")
- target.apply_damage(5, BURN, affected)
- eyes.take_damage(5, 0)
\ No newline at end of file
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 0a42f7c1374..7272ecf49e0 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -10,7 +10,7 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!affected)
+ if (!affected || (affected.status & ORGAN_ROBOT))
return 0
return target_zone == "mouth"
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index c1e51d9c4df..20bf10bd002 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -17,8 +17,6 @@
return 0
if (affected.status & ORGAN_DESTROYED)
return 0
- if (target_zone == "head" && target.species && (target.species.flags & IS_SYNTHETIC))
- return 1
if (affected.status & ORGAN_ROBOT)
return 0
return 1
diff --git a/code/modules/surgery/headreattach.dm b/code/modules/surgery/headreattach.dm
deleted file mode 100644
index ad47b144293..00000000000
--- a/code/modules/surgery/headreattach.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-//This is an uguu head restoration surgery TOTALLY not yoinked from chinsky's limb reattacher
-/datum/surgery_step/attach_head/
- priority = 3 // Must be higher than /datum/surgery_step/internal
- allowed_tools = list(/obj/item/organ/external/head = 100)
- can_infect = 0
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/head = target.get_organ(target_zone)
- return isnull(head) && target_zone == "head" && !isnull(target.species.has_limbs["head"])
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts attaching [tool] to [target]'s neck.", \
- "You start attaching [tool] to [target]'s neck.")
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\blue [user] has attached [target]'s head to the body.", \
- "\blue You have attached [target]'s head to the body.")
- var/obj/item/organ/external/head = tool
- user.drop_from_inventory(head)
- head.replaced(target)
- head.loc = target
- head.status = 0
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s neck!", \
- "\red Your hand slips, damaging [target]'s neck!")
- target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index 95980d52521..62cf65b2ce9 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -32,6 +32,12 @@
return "abdominal"
return ""
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \
+ "\red Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+
/datum/surgery_step/cavity/make_space
allowed_tools = list(
/obj/item/weapon/surgicaldrill = 100, \
@@ -60,12 +66,6 @@
user.visible_message("\blue [user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
"\blue You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
-
/datum/surgery_step/cavity/close_space
priority = 2
allowed_tools = list(
@@ -96,12 +96,6 @@
user.visible_message("\blue [user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \
"\blue You mend [target]'s [get_cavity(affected)] cavity walls with \the [tool]." )
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
-
/datum/surgery_step/cavity/place_item
priority = 0
allowed_tools = list(/obj/item = 100)
@@ -126,7 +120,7 @@
user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
"\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
- if (tool.w_class > get_max_wclass(affected)/2 && prob(50))
+ if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT))
user << "\red You tear some blood vessels trying to fit such a big object in this cavity."
var/datum/wound/internal_bleeding/I = new (10)
affected.wounds += I
@@ -136,12 +130,6 @@
tool.loc = target
affected.cavity = 0
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
-
//////////////////////////////////////////////////////////////////
// IMPLANT/ITEM REMOVAL SURGERY //
//////////////////////////////////////////////////////////////////
@@ -162,9 +150,9 @@
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts poking around inside the incision on [target]'s [affected.name] with \the [tool].", \
- "You start poking around inside the incision on [target]'s [affected.name] with \the [tool]" )
- target.custom_pain("The pain in your chest is living hell!",1)
+ user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \
+ "You start poking around inside [target]'s [affected.name] with \the [tool]" )
+ target.custom_pain("The pain in your [affected.name] is living hell!",1)
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -209,8 +197,8 @@
user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \
"\blue There's something inside [target]'s [affected.name], but you just missed it this time." )
else if (affected.hidden)
- user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.name] with \the [tool].", \
- "\blue You take something out of incision on [target]'s [affected.name]s with \the [tool]." )
+ user.visible_message("\blue [user] takes something out of [target]'s [affected.name] with \the [tool].", \
+ "\blue You take something out of [target]'s [affected.name]s with \the [tool]." )
affected.hidden.loc = get_turf(target)
if(!affected.hidden.blood_DNA)
affected.hidden.blood_DNA = list()
@@ -223,10 +211,8 @@
"\blue You could not find anything inside [target]'s [affected.name]." )
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ ..()
var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, scraping tissue inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
if (affected.implants.len)
var/fail_prob = 10
fail_prob += 100 - tool_quality(tool)
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
new file mode 100644
index 00000000000..aee13ede832
--- /dev/null
+++ b/code/modules/surgery/limb_reattach.dm
@@ -0,0 +1,129 @@
+//Procedures in this file: Robotic limbs attachment, meat limbs attachment
+//////////////////////////////////////////////////////////////////
+// LIMB SURGERY //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/limb/
+ priority = 3 // Must be higher than /datum/surgery_step/internal
+ can_infect = 0
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected)
+ return 0
+ var/list/organ_data = target.species.has_limbs["[target_zone]"]
+ return !isnull(organ_data)
+
+/datum/surgery_step/limb/attach
+ allowed_tools = list(/obj/item/organ/external = 100)
+
+ min_duration = 50
+ max_duration = 70
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \
+ "You start attaching [E.name] to [target]'s [E.amputation_point].")
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].>", \
+ "You have attached [target]'s [E.name] to the [E.amputation_point].")
+ user.drop_from_inventory(E)
+ E.replaced(target)
+ E.loc = target
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
+ " Your hand slips, damaging [target]'s [E.amputation_point]!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
+
+/datum/surgery_step/limb/connect
+ allowed_tools = list(
+ /obj/item/weapon/hemostat = 100, \
+ /obj/item/stack/cable_coil = 75, \
+ /obj/item/device/assembly/mousetrap = 20
+ )
+ can_infect = 1
+
+ min_duration = 100
+ max_duration = 120
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ return E && !E.is_stump() && (E.status & ORGAN_DESTROYED)
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ user.visible_message("[user] starts connecting tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
+ "You start connecting tendons and muscle in [target]'s [E.amputation_point].")
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
+ "You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool].")
+ E.status &= ~ORGAN_DESTROYED
+ if(E.children)
+ for(var/obj/item/organ/external/C in E.children)
+ C.status &= ~ORGAN_DESTROYED
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
+ " Your hand slips, damaging [target]'s [E.amputation_point]!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
+
+/datum/surgery_step/limb/mechanize
+ allowed_tools = list(/obj/item/robot_parts = 100)
+
+ min_duration = 80
+ max_duration = 100
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/robot_parts/p = tool
+ if (p.part)
+ if (!(target_zone in p.part))
+ return 0
+ return isnull(target.get_organ(target_zone))
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts attaching \the [tool] to [target].", \
+ "You start attaching \the [tool] to [target].")
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/robot_parts/L = tool
+ user.visible_message("[user] has attached \the [tool] to [target].", \
+ "You have attached \the [tool] to [target].")
+
+ if(L.part)
+ for(var/part_name in L.part)
+ if(!isnull(target.get_organ(part_name)))
+ continue
+ var/list/organ_data = target.species.has_limbs["[part_name]"]
+ if(!organ_data)
+ continue
+ var/new_limb_type = organ_data["path"]
+ var/obj/item/organ/external/new_limb = new new_limb_type(target)
+ new_limb.robotize(L.model_info)
+ if(L.sabotaged)
+ new_limb.sabotaged = 1
+
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
+
+ qdel(tool)
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message(" [user]'s hand slips, damaging [target]'s flesh!", \
+ " Your hand slips, damaging [target]'s flesh!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index a97184f35cb..d352c4aed48 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -138,75 +138,6 @@
if(I && I.damage > 0)
I.take_damage(dam_amt,0)
-/datum/surgery_step/internal/fix_organ_robotic //For artificial organs
- allowed_tools = list(
- /obj/item/stack/nanopaste = 100, \
- /obj/item/weapon/bonegel = 30, \
- /obj/item/weapon/screwdriver = 70, \
- )
-
- min_duration = 70
- max_duration = 90
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/is_organ_damaged = 0
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0 && I.robotic >= 2)
- is_organ_damaged = 1
- break
- return ..() && is_organ_damaged
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(I.robotic >= 2)
- user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
- "You start mending the damage to [target]'s [I.name]'s mechanisms." )
-
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- for(var/obj/item/organ/I in affected.internal_organs)
-
- if(I && I.damage > 0)
- if(I.robotic >= 2)
- user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \
- "\blue You repair [target]'s [I.name] with [tool]." )
- I.damage = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- user.visible_message("\red [user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
-
- target.adjustToxLoss(5)
- affected.createwound(CUT, 5)
-
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I)
- I.take_damage(rand(3,5),0)
-
-
/datum/surgery_step/internal/detatch_organ
allowed_tools = list(
@@ -223,12 +154,17 @@
if (!..())
return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ if(!(affected && !(affected.status & ORGAN_ROBOT)))
+ return 0
+
target.op_stage.current_organ = null
var/list/attached_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && !I.status && I.parent_organ == target_zone)
+ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
attached_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
@@ -283,7 +219,7 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
+ if((I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs
@@ -312,8 +248,8 @@
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("\red [user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \
- "\red Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!")
+ user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \
+ "\red Your hand slips, damaging [target]'s [affected.name] with \the [tool]!")
affected.createwound(BRUISE, 20)
/datum/surgery_step/internal/replace_organ
@@ -335,6 +271,10 @@
if(!istype(O))
return 0
+ if((affected.status & ORGAN_ROBOT) && !(O.status & ORGAN_ROBOT))
+ user << "You cannot install a naked organ into a robotic body."
+ return 2
+
if(!target.species)
user << "\red You have no idea what species this person is. Report this on the bug tracker."
return 2
@@ -410,7 +350,7 @@
var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
+ if(I && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
removable_organs |= organ
var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 50e6c3bcfb9..ba9334d933a 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -186,7 +186,7 @@
return 0
if(istype(tool,/obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/welder = tool
- if(!welder.isOn())
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
return (target_zone == "chest") && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove)
diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm
deleted file mode 100644
index d8214837bf6..00000000000
--- a/code/modules/surgery/robolimbs.dm
+++ /dev/null
@@ -1,62 +0,0 @@
-//Procedures in this file: Robotic limbs attachment
-//////////////////////////////////////////////////////////////////
-// LIMB SURGERY //
-//////////////////////////////////////////////////////////////////
-
-/datum/surgery_step/limb/
- can_infect = 0
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected)
- return 0
- var/list/organ_data = target.species.has_limbs["[target_zone]"]
- return !isnull(organ_data) && !(target_zone in list("head","groin","chest"))
-
-/datum/surgery_step/limb/attach
- allowed_tools = list(/obj/item/robot_parts = 100)
-
- min_duration = 80
- max_duration = 100
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/robot_parts/p = tool
- if (p.part)
- if (!(target_zone in p.part))
- return 0
- return isnull(target.get_organ(target_zone))
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts attaching \the [tool] to [target].", \
- "You start attaching \the [tool] to [target].")
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/robot_parts/L = tool
- user.visible_message("\blue [user] has attached \the [tool] to [target].", \
- "\blue You have attached \the [tool] to [target].")
-
- if(L.part)
- for(var/part_name in L.part)
- if(!isnull(target.get_organ(part_name)))
- continue
- var/list/organ_data = target.species.has_limbs["[part_name]"]
- if(!organ_data)
- continue
- var/new_limb_type = organ_data["path"]
- var/obj/item/organ/external/new_limb = new new_limb_type(target)
- new_limb.robotize(L.model_info)
- if(L.sabotaged)
- new_limb.sabotaged = 1
-
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
-
- qdel(tool)
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("\red [user]'s hand slips, damaging [target]'s flesh!", \
- "\red Your hand slips, damaging [target]'s flesh!")
- target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
new file mode 100644
index 00000000000..11babd42e42
--- /dev/null
+++ b/code/modules/surgery/robotics.dm
@@ -0,0 +1,421 @@
+//Procedures in this file: Gneric surgery steps
+//////////////////////////////////////////////////////////////////
+// COMMON STEPS //
+//////////////////////////////////////////////////////////////////
+
+/datum/surgery_step/robotics/
+ can_infect = 0
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (isslime(target))
+ return 0
+ if (target_zone == "eyes") //there are specific steps for eye surgery
+ return 0
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.status & ORGAN_DESTROYED)
+ return 0
+ if (!(affected.status & ORGAN_ROBOT))
+ return 0
+ return 1
+
+/datum/surgery_step/robotics/unscrew_hatch
+ allowed_tools = list(
+ /obj/item/weapon/screwdriver = 100,
+ /obj/item/weapon/coin = 50,
+ /obj/item/weapon/material/kitchen/utensil/knife = 50
+ )
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open == 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "\blue You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",)
+ affected.open = 1
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \
+ "\red Your [tool] slips, failing to unscrew [target]'s [affected.name].")
+
+/datum/surgery_step/robotics/open_hatch
+ allowed_tools = list(
+ /obj/item/weapon/retractor = 100,
+ /obj/item/weapon/crowbar = 100,
+ /obj/item/weapon/material/kitchen/utensil = 50
+ )
+
+ min_duration = 30
+ max_duration = 40
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open == 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
+ "You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] open the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "\blue You open the maintenance hatch on [target]'s [affected.name] with \the [tool]." )
+ affected.open = 2
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].",
+ "\red Your [tool] slips, failing to open the hatch on [target]'s [affected.name].")
+
+/datum/surgery_step/robotics/close_hatch
+ allowed_tools = list(
+ /obj/item/weapon/retractor = 100,
+ /obj/item/weapon/crowbar = 100,
+ /obj/item/weapon/material/kitchen/utensil = 50
+ )
+
+ min_duration = 70
+ max_duration = 100
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \
+ "You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \
+ "\blue You close and secure the hatch on [target]'s [affected.name] with \the [tool].")
+ affected.open = 0
+ affected.germ_level = 0
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].",
+ "\red Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].")
+
+/datum/surgery_step/robotics/repair_brute
+ allowed_tools = list(
+ /obj/item/weapon/weldingtool = 100,
+ /obj/item/weapon/pickaxe/plasmacutter = 50
+ )
+
+ min_duration = 50
+ max_duration = 60
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/welder = tool
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
+ return 0
+ return affected && affected.open && affected.brute_dam > 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool]." , \
+ "You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \
+ "\blue You finish patching damage to [target]'s [affected.name] with \the [tool].")
+ affected.heal_damage(rand(30,50),0)
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].",
+ "\red Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].")
+ target.apply_damage(rand(5,10), BURN, affected)
+
+/datum/surgery_step/robotics/repair_burn
+ allowed_tools = list(
+ /obj/item/stack/cable_coil = 100
+ )
+
+ min_duration = 50
+ max_duration = 60
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open && affected.burn_dam > 0 && target_zone != "mouth"
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to splice new cabling into [target]'s [affected.name]." , \
+ "You begin to splice new cabling into [target]'s [affected.name].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] finishes splicing cable into [target]'s [affected.name].", \
+ "\blue You finishes splicing new cable into [target]'s [affected.name].")
+ affected.heal_damage(0,rand(30,50))
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\red [user] causes a short circuit in [target]'s [affected.name]!",
+ "\red You cause a short circuit in [target]'s [affected.name]!")
+ target.apply_damage(rand(5,10), BURN, affected)
+
+/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs
+ allowed_tools = list(
+ /obj/item/stack/nanopaste = 100, \
+ /obj/item/weapon/bonegel = 30, \
+ /obj/item/weapon/screwdriver = 70, \
+ )
+
+ min_duration = 70
+ max_duration = 90
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!affected) return
+ var/is_organ_damaged = 0
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I.damage > 0 && I.robotic >= 2)
+ is_organ_damaged = 1
+ break
+ return affected.open == 2 && is_organ_damaged
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ if(I.robotic >= 2)
+ user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
+ "You start mending the damage to [target]'s [I.name]'s mechanisms." )
+
+ target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ for(var/obj/item/organ/I in affected.internal_organs)
+
+ if(I && I.damage > 0)
+ if(I.robotic >= 2)
+ user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \
+ "\blue You repair [target]'s [I.name] with [tool]." )
+ I.damage = 0
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ user.visible_message("\red [user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \
+ "\red Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
+
+ target.adjustToxLoss(5)
+ affected.createwound(CUT, 5)
+
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I)
+ I.take_damage(rand(3,5),0)
+
+/datum/surgery_step/robotics/detatch_organ_robotic
+
+ allowed_tools = list(
+ /obj/item/device/multitool = 100
+ )
+
+ min_duration = 90
+ max_duration = 110
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && (affected.status & ORGAN_ROBOT)))
+ return 0
+ if(affected.open != 2)
+ return 0
+
+ target.op_stage.current_organ = null
+
+ var/list/attached_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
+ attached_organs |= organ
+
+ var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
+ if(!organ_to_remove)
+ return 0
+
+ target.op_stage.current_organ = organ_to_remove
+
+ return ..() && organ_to_remove
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to decouple [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start to decouple [target]'s [target.op_stage.current_organ] with \the [tool]." )
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "\blue You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].")
+
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status |= ORGAN_CUT_AWAY
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, disconnecting \the [tool].", \
+ "\red Your hand slips, disconnecting \the [tool].")
+
+/datum/surgery_step/robotics/attach_organ_robotic
+ allowed_tools = list(
+ /obj/item/weapon/screwdriver = 100,
+ )
+
+ min_duration = 100
+ max_duration = 120
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && (affected.status & ORGAN_ROBOT)))
+ return 0
+ if(affected.open != 2)
+ return 0
+
+ target.op_stage.current_organ = null
+
+ var/list/removable_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && (I.status & ORGAN_CUT_AWAY) && (I.status & ORGAN_ROBOT) && I.parent_organ == target_zone)
+ removable_organs |= organ
+
+ var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
+ if(!organ_to_replace)
+ return 0
+
+ target.op_stage.current_organ = organ_to_replace
+ return ..()
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\blue [user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "\blue You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")
+
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status &= ~ORGAN_CUT_AWAY
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips, disconnecting \the [tool].", \
+ "\red Your hand slips, disconnecting \the [tool].")
+
+/datum/surgery_step/robotics/install_mmi
+ allowed_tools = list(
+ /obj/item/device/mmi = 100
+ )
+
+ min_duration = 60
+ max_duration = 80
+
+ can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+
+ if(target_zone != "head")
+ return
+
+ var/obj/item/device/mmi/M = tool
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && affected.open == 2))
+ return 0
+
+ if(!istype(M))
+ return 0
+
+ if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD)
+ user << "That brain is not usable."
+ return 2
+
+ if(!(affected.status & ORGAN_ROBOT))
+ user << "You cannot install a computer brain into a meat skull."
+ return 2
+
+ if(!target.species)
+ user << "You have no idea what species this person is. Report this on the bug tracker."
+ return 2
+
+ if(!target.species.has_organ["brain"])
+ user << "You're pretty sure [target.species.name_plural] don't normally have a brain."
+ return 2
+
+ if(!isnull(target.internal_organs["brain"]))
+ user << "Your subject already has a brain."
+ return 2
+
+ return 1
+
+ begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \
+ "You start installing \the [tool] into [target]'s [affected.name].")
+ ..()
+
+ end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("\blue [user] has installed \the [tool] into [target]'s [affected.name].", \
+ "\blue You have installed \the [tool] into [target]'s [affected.name].")
+
+ var/obj/item/device/mmi/M = tool
+ var/obj/item/organ/mmi_holder/holder = new(target, 1)
+ target.internal_organs_by_name["brain"] = holder
+ user.drop_from_inventory(tool)
+ tool.loc = holder
+ holder.stored_mmi = tool
+ holder.update_from_mmi()
+
+ if(M.brainmob && M.brainmob.mind)
+ M.brainmob.mind.transfer_to(target)
+
+ fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("\red [user]'s hand slips.", \
+ "\red Your hand slips.")
\ No newline at end of file
diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm
index 88876da9ed0..62bfaff907f 100644
--- a/code/modules/virus2/admin.dm
+++ b/code/modules/virus2/admin.dm
@@ -73,10 +73,11 @@
var/f = 1
for(var/k in all_species)
var/datum/species/S = all_species[k]
- if(!(S.flags & IS_SYNTHETIC))
- if(!f) H += " | "
- else f = 0
- H += "[k]"
+ if(S.virus_immune)
+ continue
+ if(!f) H += " | "
+ else f = 0
+ H += "[k]"
H += {"
Reset
diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index c1852a0cb98..62bd4153f59 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -45,7 +45,7 @@
var/list/res = list()
for (var/specie in all_species)
var/datum/species/S = all_species[specie]
- if(!(S.flags & IS_SYNTHETIC))
+ if(!S.virus_immune)
meat += S.name
if(meat.len)
var/num = rand(1,meat.len)
@@ -66,6 +66,12 @@
if(prob(5))
mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
+ // Some species are flat out immune to organic viruses.
+ var/mob/living/carbon/human/H = mob
+ if(istype(H) && H.species.virus_immune)
+ cure(mob)
+ return
+
if(mob.radiation > 50)
if(prob(1))
majormutate()
diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm
index 2cac2551044..d2671b7933c 100644
--- a/code/modules/virus2/helpers.dm
+++ b/code/modules/virus2/helpers.dm
@@ -3,25 +3,26 @@ proc/infection_check(var/mob/living/carbon/M, var/vector = "Airborne")
if (!istype(M))
return 0
+ var/mob/living/carbon/human/H = M
+ if(istype(H) && H.species.virus_immune)
+ return 0
+
var/protection = M.getarmor(null, "bio") //gets the full body bio armour value, weighted by body part coverage.
var/score = round(0.06*protection) //scales 100% protection to 6.
switch(vector)
if("Airborne")
- if(M.internal)
- score = 6 //not breathing infected air helps greatly
- var/obj/item/I = M.wear_mask
-
- //masks provide a small bonus and can replace overall bio protection
- if(I)
- score = max(score, round(0.06*I.armor["bio"]))
- if (istype(I, /obj/item/clothing/mask))
- score += 1 //this should be added after
+ if(M.internal) //not breathing infected air helps greatly
+ return 0
+ var/obj/item/I = M.wear_mask
+ //masks provide a small bonus and can replace overall bio protection
+ if(I)
+ score = max(score, round(0.06*I.armor["bio"]))
+ if (istype(I, /obj/item/clothing/mask))
+ score += 1 //this should be added after
if("Contact")
- if(istype(M, /mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
-
+ if(istype(H))
//gloves provide a larger bonus
if (istype(H.gloves, /obj/item/clothing/gloves))
score += 2
diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm
index 7508818a6d7..d318ca9f8ad 100644
--- a/code/modules/virus2/items_devices.dm
+++ b/code/modules/virus2/items_devices.dm
@@ -16,7 +16,7 @@
var/mob/living/carbon/C = M
if (istype(C,/mob/living/carbon/human/))
var/mob/living/carbon/human/H = C
- if(H.species && H.species.flags & NO_BLOOD)
+ if(H.species.flags & NO_BLOOD)
report("Scan aborted: The target does not have blood.", user)
return
diff --git a/code/setup.dm b/code/setup.dm
index cbd079c9a5d..80074d2afc0 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -645,11 +645,10 @@ var/list/be_special_flags = list(
#define HAS_UNDERWEAR 512 // Underwear is drawn onto the mob icon.
#define IS_PLANT 1024 // Is a treeperson.
#define IS_WHITELISTED 2048 // Must be whitelisted to play.
-#define IS_SYNTHETIC 4096 // Is a machine race.
-#define HAS_EYE_COLOR 8192 // Eye colour selectable in chargen. (RGB)
-#define CAN_JOIN 16384 // Species is selectable in chargen.
-#define IS_RESTRICTED 32768 // Is not a core/normally playable species. (castes, mutantraces)
-#define REGENERATES_LIMBS 65536 // Attempts to regenerate unamputated limbs.
+#define HAS_EYE_COLOR 4096 // Eye colour selectable in chargen. (RGB)
+#define CAN_JOIN 8192 // Species is selectable in chargen.
+#define IS_RESTRICTED 16384 // Is not a core/normally playable species. (castes, mutantraces)
+// unused: 32768 - higher than this will overflow
// Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
@@ -719,11 +718,12 @@ var/list/be_special_flags = list(
#define NETWORK_FAILURE 32
// Some on_mob_life() procs check for alien races.
-#define IS_DIONA 1
-#define IS_VOX 2
-#define IS_SKRELL 3
-#define IS_UNATHI 4
-#define IS_XENOS 5
+#define IS_DIONA 1
+#define IS_VOX 2
+#define IS_SKRELL 3
+#define IS_UNATHI 4
+#define IS_XENOS 5
+#define IS_MACHINE 6
#define MAX_GEAR_COST 5 // Used in chargen for accessory loadout limit.
@@ -984,3 +984,5 @@ var/list/be_special_flags = list(
#define TABLE_BRITTLE_MATERIAL_MULTIPLIER 4 // Amount table damage is multiplied by if it is made of a brittle material (e.g. glass)
+// Damage above this value must be repaired with surgery.
+#define ROBOLIMB_SELF_REPAIR_CAP 30
\ No newline at end of file
diff --git a/html/changelogs/Atlantis-PR-8816.yml b/html/changelogs/Atlantis-PR-8816.yml
new file mode 100644
index 00000000000..f3d30f9abec
--- /dev/null
+++ b/html/changelogs/Atlantis-PR-8816.yml
@@ -0,0 +1,6 @@
+author: Atlantis
+delete-after: True
+
+changes:
+ - rscadd: "NanoUI for Robotics Control Console"
+ - rscdel: "NanoUI for Supermatter Crystal - AI/Robot only, purely informational"
diff --git a/html/changelogs/Techhead-chemRename-170516.yml b/html/changelogs/Techhead-chemRename-170516.yml
new file mode 100644
index 00000000000..2408d1e7fd6
--- /dev/null
+++ b/html/changelogs/Techhead-chemRename-170516.yml
@@ -0,0 +1,10 @@
+author: Techhead
+
+delete-after: True
+ - rscadd: "Removed gaseous reagents from the chemistry system and replaced with real-world organic chemistry precursors."
+ - rscadd: "Hydrogen has been replaced with hydrazine, a highly toxic, flammable liquid.
+ - rscadd: "Oxygen has been replaced with acetone, a mildly toxic liquid. Ethanol's ink-sovlent capabilities have been copied to it.
+ - rscadd: "Chlorine has been replaced with hydrochloric acid. It is a stronger acid than sulphuric but less toxic.
+ - tweak: "Nitrogen has been replaced with ammonia. Ammonia now acts as a Dexalin-equivalent for Vox.
+ - tweak: "Flourine has also been replaced with hydrazine in its one recipe. Flourosurficant has been renamed azosurficant."
+ - tweak: "Being splashed with liquid Phoron will burn eyes and contaminate clothes like being exposed to Phoron gas."
diff --git a/html/changelogs/Zuhayr-GhostTrap.yml b/html/changelogs/Zuhayr-GhostTrap.yml
new file mode 100644
index 00000000000..5e3c89f853f
--- /dev/null
+++ b/html/changelogs/Zuhayr-GhostTrap.yml
@@ -0,0 +1,5 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - rscadd: "Added a ghost requisition system for posibrains and living plants."
+ - rscadd: "Added attack_ghost() to hydro trays and posibrains to allow ghosts to enter them."
diff --git a/html/changelogs/Zuhayr-IPC.yml b/html/changelogs/Zuhayr-IPC.yml
new file mode 100644
index 00000000000..623c01c723e
--- /dev/null
+++ b/html/changelogs/Zuhayr-IPC.yml
@@ -0,0 +1,14 @@
+author: Zuhayr
+delete-after: True
+changes:
+ - rscadd: "Prosthetic limbs are now only repairable with welders/cable coils if they have suffered below 30 combined damage."
+ - rscadd: "Surgery steps that cause no pain and have no failure wounding have been added: screwdriver for 'incision', crowbar to open, multitool to 'decouple' a prosthetic organ. Hemostat is still used to take an organ out."
+ - rscadd: "Using a welder or a cable coil as a surgical tool after opening a maintenance hatch will repair damage beyond the 30 damage cap. In other words, severe damage to robolimbs requires expert repair from someone else."
+ - rscdel: "Eye and brain surgery were removed; they predate the current organ system and are redundant."
+ - rscadd: "IPC are now simply full prosthetic bodies using a specific manufacturer (Morpheus Cyberkinetics)."
+ - rscadd: "IPC can 'recharge' in a cyborg station to regain nutriment. They no longer interface with APCs."
+ - rscadd: "NO_BLOOD flag now bypasses ingested and blood reagent processing."
+ - rscadd: "NO_SCAN now bypasses mutagen reagent effects."
+ - rscadd: "Cyborg analyzers now show damage to prosthetic limbs and organs on humans."
+ - tweak: "Prosthetic EMP damage was reduced."
+ - tweak: "Several organ files were split up/moved around."
\ No newline at end of file
diff --git a/html/changelogs/comma-frankenstein.yml b/html/changelogs/comma-frankenstein.yml
new file mode 100644
index 00000000000..5210de96c45
--- /dev/null
+++ b/html/changelogs/comma-frankenstein.yml
@@ -0,0 +1,9 @@
+
+author: Chinsky
+
+delete-after: True
+
+changes:
+ - rscadd: "Meat limbs now can be attached. Use limb on missing area, then hemostat to finalize it."
+ - rscadd: "Limbs from other races can be now attached. They'll cause rejection, but it can be kept at bay with spaceacilline to some point. Species special attack is carried over too, i.e. you can clawn people if you sew a cathand to yourself."
+ - rscadd: "Limbs that are left in open will rot in ~7 minutes. Use freezers or cryobags to stop it. You can still attach them, but you wish you couldn't."
\ No newline at end of file
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 42c1b28cbf0..15c0f982127 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/ipc.dmi b/icons/mob/human_races/cyberlimbs/ipc.dmi
new file mode 100644
index 00000000000..b0ae6739177
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/ipc.dmi differ
diff --git a/icons/mob/human_races/r_machine.dmi b/icons/mob/human_races/r_machine.dmi
index 2e3956f8464..65f66c32385 100644
Binary files a/icons/mob/human_races/r_machine.dmi and b/icons/mob/human_races/r_machine.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index ed6383ba7c1..c125ebf6b70 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index e7042ca3ad2..d505697c521 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 9143ac4817b..ac5c73a100c 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 377d12b4ff0..e754acbc1d1 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm
index 0df4c6028c9..1ef77df4d33 100644
--- a/maps/exodus-1.dmm
+++ b/maps/exodus-1.dmm
@@ -1135,7 +1135,7 @@
"avQ" = (/turf/simulated/floor{icon_state = "neutral"; dir = 4},/area/crew_quarters/fitness)
"avR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Holodeck North"; pixel_y = -6},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"avS" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eva_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "eva_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/evahallway)
-"avT" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
+"avT" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/gateway)
"avU" = (/obj/machinery/computer/cryopod{density = 0; pixel_y = 32},/obj/machinery/camera/network/civilian_east{c_tag = "Dormitory Cryo Storage"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
"avV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/fitness)
"avW" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/evahallway)
@@ -1473,7 +1473,7 @@
"aCq" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aCr" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aCs" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
-"aCt" = (/obj/structure/table/standard,/obj/item/weapon/storage/fancy/cigarettes{pixel_y = 2},/turf/simulated/floor,/area/gateway)
+"aCt" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/quartermaster/storage)
"aCu" = (/turf/simulated/wall,/area/maintenance/substation/civilian_east)
"aCv" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard)
"aCw" = (/obj/machinery/power/solar_control{id = "auxsolareast"; name = "Fore Starboard Solar Control"; track = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 32},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating{dir = 8; icon_state = "warnplatecorner"},/area/maintenance/auxsolarstarboard)
@@ -1489,7 +1489,7 @@
"aCG" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/arrivals)
"aCH" = (/obj/structure/table/standard,/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor,/area/storage/primary)
"aCI" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
-"aCJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/item/stack/rods{amount = 50},/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aCJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 6},/turf/simulated/floor{icon_state = "neutral"; dir = 8},/area/crew_quarters/sleep)
"aCK" = (/turf/simulated/wall,/area/storage/primary)
"aCL" = (/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aCM" = (/turf/simulated/wall/r_wall,/area/storage/primary)
@@ -1520,7 +1520,7 @@
"aDl" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/item/weapon/bikehorn/rubberducky,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/toilet)
"aDm" = (/obj/machinery/vending/coffee,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aDn" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/maintenance/arrivals)
-"aDo" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aDo" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/maintenance/dormitory)
"aDp" = (/turf/simulated/wall,/area/crew_quarters/bar)
"aDq" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/bar)
"aDr" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Assistant"},/turf/simulated/floor,/area/storage/primary)
@@ -1583,7 +1583,7 @@
"aEw" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aEx" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"aEy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
-"aEz" = (/obj/structure/table/reinforced{icon_state = "table"},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"aEz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/landmark{name = "JoinLateCryo"},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
"aEA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva)
"aEB" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva)
"aEC" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = -32},/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -1709,7 +1709,7 @@
"aGS" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2)
"aGT" = (/obj/machinery/recharger{pixel_y = 4},/obj/structure/table/reinforced,/turf/simulated/floor{icon_state = "red"},/area/security/checkpoint2)
"aGU" = (/obj/item/weapon/crowbar,/obj/item/device/flash,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint2)
-"aGV" = (/obj/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/turf/simulated/floor,/area/gateway)
+"aGV" = (/obj/machinery/cryopod/right,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/sleep/cryo)
"aGW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/terminal,/turf/simulated/floor/plating,/area/maintenance/substation/civilian_west)
"aGX" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/hallway/secondary/entry/starboard)
"aGY" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/hallway/secondary/entry/port)
@@ -1813,7 +1813,7 @@
"aIS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/marble,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/bar)
"aIT" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/gateway)
"aIU" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/gateway)
-"aIV" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/gateway)
+"aIV" = (/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/obj/item/weapon/storage/briefcase/inflatable{pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = -3},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"aIW" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aIX" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/evahallway)
"aIY" = (/obj/machinery/suit_cycler/engineering,/obj/machinery/light/small{dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/ai_monitored/storage/eva)
@@ -3445,7 +3445,7 @@
"bom" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/substation/command)
"bon" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/substation/command)
"boo" = (/obj/item/weapon/stool,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/assembly/robotics)
-"bop" = (/obj/item/clothing/glasses/welding,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
+"bop" = (/obj/machinery/vending/coffee,/obj/machinery/camera/network/civilian_west{c_tag = "Gateway Arrival Area"; dir = 4},/obj/structure/sign/biohazard{pixel_x = -32},/turf/simulated/floor,/area/gateway)
"boq" = (/obj/item/weapon/stool,/obj/effect/landmark/start{name = "Scientist"},/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
"bor" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/plating,/area/maintenance/substation/command)
"bos" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/substation/command)
@@ -3599,8 +3599,8 @@
"brk" = (/obj/machinery/button/remote/blast_door{id = "Disposal Exit"; name = "Disposal Vent Control"; pixel_x = -25; pixel_y = 4; req_access = list(12)},/obj/machinery/button/remote/driver{id = "trash"; pixel_x = -26; pixel_y = -6},/obj/item/weapon/cigbutt,/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/maintenance/disposal)
"brl" = (/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = -30; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"brm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
-"brn" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
-"bro" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"brn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"bro" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"brp" = (/obj/effect/landmark/start{name = "Cargo Technician"},/obj/structure/bed/chair/office/dark{dir = 4},/turf/simulated/floor,/area/quartermaster/office)
"brq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency)
"brr" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/storage/emergency)
@@ -3655,7 +3655,7 @@
"bso" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "hazard door east"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bsp" = (/turf/simulated/wall,/area/crew_quarters/captain)
"bsq" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/camera/network/research{c_tag = "Research Division Access"},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/rnd/research)
-"bsr" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"bsr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/lab)
"bss" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two)
"bst" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bsu" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
@@ -3691,7 +3691,7 @@
"bsY" = (/obj/machinery/r_n_d/destructive_analyzer,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab)
"bsZ" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab)
"bta" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/lab)
-"btb" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/rnd/lab)
+"btb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/lab)
"btc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"btd" = (/obj/structure/table/standard,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_shuttle"; pixel_x = 25; pixel_y = -8; req_one_access = list(13,48); tag_door = "mining_shuttle_hatch"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/mining/station)
"bte" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/breath,/turf/simulated/floor/plating,/area/storage/emergency)
@@ -3847,7 +3847,7 @@
"bvY" = (/obj/structure/table/standard,/obj/item/weapon/module/power_control,/obj/item/weapon/airlock_electronics,/turf/simulated/floor/plating,/area/storage/tech)
"bvZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/camera/network/exodus{c_tag = "Primary Hallway Central - East Southwest"; dir = 8},/turf/simulated/floor,/area/hallway/primary/central_two)
"bwa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "scanhideside"; name = "Diagnostics Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/medbay4)
-"bwb" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bwb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
"bwc" = (/obj/machinery/light_switch{pixel_x = 22; pixel_y = -8},/obj/machinery/button/remote/blast_door{id = "chemwindow"; name = "Chemistry Laboratory Window Shutters Control"; pixel_x = 26; pixel_y = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
"bwd" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/medical/reception)
"bwe" = (/turf/simulated/floor,/area/medical/reception)
@@ -3874,7 +3874,7 @@
"bwz" = (/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab)
"bwA" = (/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab)
"bwB" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "warnwhite"; dir = 1},/area/rnd/lab)
-"bwC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warnwhitecorner"},/area/rnd/lab)
+"bwC" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bwD" = (/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
"bwE" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency)
"bwF" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency)
@@ -3921,7 +3921,7 @@
"bxu" = (/obj/machinery/cryopod/robot/right,/turf/simulated/floor,/area/assembly/chargebay)
"bxv" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal)
"bxw" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/central_two)
-"bxx" = (/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
+"bxx" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/gateway)
"bxy" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor{dir = 1; icon_state = "whiteyellow"},/area/medical/chemistry)
"bxz" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/airlock/glass_mining{name = "Cargo Bay"; req_access = list(31)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/quartermaster/storage)
"bxA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/medical/chemistry)
@@ -3958,7 +3958,7 @@
"byf" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"byg" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 36},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/button/windowtint{id = "isoA_window_tint"; pixel_y = 26},/turf/simulated/floor{dir = 5; icon_state = "whitered"},/area/medical/patient_a)
"byh" = (/obj/structure/table/standard,/obj/item/weapon/folder/white{pixel_y = 10},/obj/item/weapon/clipboard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/weapon/stamp/cmo,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo)
-"byi" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/lab)
+"byi" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"byj" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor,/area/quartermaster/office)
"byk" = (/obj/structure/closet/crate,/obj/item/weapon/coin/silver,/turf/simulated/floor/plating,/area/storage/emergency)
"byl" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research/station)
@@ -4027,7 +4027,7 @@
"bzw" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green,/turf/simulated/floor,/area/assembly/chargebay)
"bzx" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular{pixel_x = 5; pixel_y = 5},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/random/firstaid,/turf/simulated/floor{dir = 8; icon_state = "whiteyellowcorner"},/area/medical/chemistry)
"bzy" = (/obj/machinery/computer/med_data/laptop,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/medical/exam_room)
-"bzz" = (/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/assembly/robotics)
+"bzz" = (/obj/machinery/door/airlock/glass_medical{name = "Medical Hardsuits"; req_one_access = list(5)},/turf/simulated/floor{icon_state = "dark"},/area/ai_monitored/storage/eva)
"bzA" = (/turf/simulated/wall,/area/rnd/research)
"bzB" = (/obj/machinery/light{dir = 8},/obj/machinery/computer/guestpass{pixel_x = -28},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/rnd/research)
"bzC" = (/obj/effect/landmark{name = "lightsout"},/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/rnd/research)
@@ -4114,12 +4114,12 @@
"bBf" = (/obj/structure/closet/wardrobe/robotics_black,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"bBg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/rnd/research)
"bBh" = (/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bBi" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bBj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
-"bBk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/noticeboard{pixel_y = 28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bBl" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bBm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/rnd/research)
-"bBn" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/research)
+"bBi" = (/obj/structure/noticeboard{pixel_y = 28},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bBj" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whitepurplecorner"},/area/rnd/research)
+"bBk" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/research)
+"bBl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
+"bBm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bBn" = (/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bBo" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whitepurplecorner"},/area/rnd/research)
"bBp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora)
"bBq" = (/obj/machinery/button/remote/airlock{desc = "A remote control switch for the medbay foyer."; id = "MedbayFoyerStar"; name = "Medbay Doors Control"; pixel_x = 24; pixel_y = 26},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{tag = "icon-whiteblue (NORTH)"; icon_state = "whiteblue"; dir = 1},/area/medical/medbay2)
@@ -4128,7 +4128,7 @@
"bBt" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medicine Storage"; req_access = newlist(); req_one_access = list(33,66)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bBu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora_storage)
"bBv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "whitebluecorner"},/area/rnd/docking)
-"bBw" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_research{name = "Research and Development"; req_access = list(7)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bBw" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bBx" = (/obj/machinery/door/airlock{name = "Starboard Emergency Storage"; req_one_access = list(12,47)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/storage/emergency)
"bBy" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking)
"bBz" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/research/station)
@@ -4268,8 +4268,8 @@
"bEd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "whiteredcorner"},/area/rnd/research)
"bEe" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 1; icon_state = "whitered"},/area/rnd/research)
"bEf" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "whiteredcorner"},/area/rnd/research)
-"bEg" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bEh" = (/obj/machinery/hologram/holopad,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bEg" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room)
+"bEh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station)
"bEi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29,47)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bEj" = (/obj/machinery/camera/network/research{c_tag = "Research Division North"; dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bEk" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access = list(47)},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "delivery"},/area/rnd/research)
@@ -4356,7 +4356,7 @@
"bFN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFP" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bFQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bFQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFR" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
"bFS" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bFT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research)
@@ -4428,7 +4428,7 @@
"bHh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 0; icon_state = "shutter0"; id = "staffroom"; name = "Staff Room Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/cryo)
"bHi" = (/obj/machinery/camera/network/command{c_tag = "AI - Messaging Server"; dir = 1},/obj/machinery/blackbox_recorder,/turf/simulated/floor/bluegrid,/area/turret_protected/ai_server_room)
"bHj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light_switch{pixel_x = 24; pixel_y = -8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_server_room)
-"bHk" = (/obj/machinery/vending/coffee,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bHk" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bHl" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/command{c_tag = "AI - Cyborg Station"; dir = 1},/turf/simulated/floor/bluegrid,/area/turret_protected/ai_cyborg_station)
"bHm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = -24; pixel_y = -8},/turf/simulated/floor{icon_state = "dark"},/area/turret_protected/ai_cyborg_station)
"bHn" = (/obj/machinery/computer/robotics,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
@@ -4508,22 +4508,22 @@
"bIJ" = (/turf/simulated/wall,/area/rnd/storage)
"bIK" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
"bIL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/research)
-"bIM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_three)
+"bIM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bIN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIO" = (/obj/machinery/computer/mecha,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIP" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIQ" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bIR" = (/obj/machinery/door/airlock/highsecurity{name = "Messaging Server"; req_access = list(16)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_three)
+"bIR" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bIS" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bIT" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/firedoor/border_only{dir = 1; name = "Firelock North"},/obj/machinery/door/airlock/mining{id_tag = "cargodoor"; name = "Mining Dock"; req_access = list(50)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock)
-"bIU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/primary/central_three)
+"bIU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/command{name = "Research Director"; req_access = list(30)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research)
"bIV" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/quartermaster/miningdock)
"bIW" = (/obj/structure/table/rack{dir = 1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor,/area/quartermaster/miningdock)
-"bIX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_three)
+"bIX" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop)
"bIY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags{pixel_x = 1; pixel_y = 2},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "white"},/area/medical/genetics_cloning)
"bIZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Medical Equipment"; req_access = list(66)},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay3)
"bJa" = (/obj/structure/table/standard,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bJb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/highsecurity{name = "Cyborg Station"; req_access = list(16)},/turf/simulated/floor{icon_state = "dark"},/area/hallway/primary/central_three)
+"bJb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bJc" = (/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=AIW"; location = "QM"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor,/area/hallway/primary/central_three)
"bJd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor,/area/hallway/primary/central_three)
"bJe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/central_three)
@@ -4570,25 +4570,25 @@
"bJT" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"bJU" = (/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 500; oxygen = 0; temperature = 80},/area/server)
"bJV" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = list(30)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/rnd/research)
-"bJW" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bJW" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bJX" = (/obj/item/weapon/stool{pixel_y = 8},/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
"bJY" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor{icon_state = "dark"},/area/server)
"bJZ" = (/obj/machinery/light/small{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor,/area/rnd/storage)
"bKa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bKb" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
"bKc" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bKd" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bKd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bKe" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bKf" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/research{name = "Toxins Storage"; req_access = list(8)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/rnd/research)
-"bKg" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bKh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bKi" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hop)
-"bKj" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bKg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bKh" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bKi" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bKj" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
"bKk" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bKl" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bKm" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/device/flashlight,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bKn" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
-"bKo" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/item/device/multitool,/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
+"bKo" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/table/reinforced,/obj/machinery/camera/network/security{c_tag = "EVA Northeast"; dir = 8},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/rods{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
"bKp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"bKq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"bKr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
@@ -4657,12 +4657,12 @@
"bLC" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bLD" = (/obj/item/device/radio/intercom{freerange = 1; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 28},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 4; icon_state = "whiteblue"; tag = "icon-whitehall (WEST)"},/area/medical/medbay)
"bLE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
-"bLF" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bLF" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bLG" = (/obj/machinery/light_switch{pixel_y = -23},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bLH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/item/weapon/storage/belt/utility,/obj/structure/table/plastic{name = "plastic table frame"},/turf/simulated/floor,/area/quartermaster/office)
"bLI" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/hallway/primary/central_three)
"bLJ" = (/obj/structure/closet/secure_closet/RD,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
-"bLK" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
+"bLK" = (/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing)
"bLL" = (/obj/structure/window/reinforced,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
"bLM" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bLN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
@@ -4706,7 +4706,7 @@
"bMz" = (/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bMA" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bMB" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/closet/secure_closet/CMO,/obj/item/clothing/mask/gas,/turf/simulated/floor{tag = "icon-whiteblue (EAST)"; icon_state = "whiteblue"; dir = 4},/area/crew_quarters/heads/cmo)
-"bMC" = (/obj/machinery/power/apc/high{dir = 1; name = "north bump"; pixel_y = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/camera/network/research{c_tag = "Research - Server Room"},/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bMC" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor{icon_state = "dark"},/area/server)
"bMD" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j2"; dir = 2},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light_switch{pixel_x = 22; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay2)
"bME" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/medical/medbay2)
"bMF" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat/equipped,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/heads/hor)
@@ -4723,11 +4723,11 @@
"bMQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/mob/living/simple_animal/mouse/white,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bMR" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
"bMS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/shuttle/plating,/area/rnd/docking)
-"bMT" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bMT" = (/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bMU" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "hazard door north"},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
"bMV" = (/turf/simulated/wall/r_wall,/area/rnd/mixing)
"bMW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
-"bMX" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
+"bMX" = (/obj/machinery/door/airlock/glass_research{name = "Toxins Lab"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
"bMY" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/portable_atmospherics/powered/scrubber/huge,/turf/simulated/floor/plating,/area/rnd/mixing)
"bMZ" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/space,/area/space)
"bNa" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
@@ -4783,8 +4783,8 @@
"bNY" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/sleeper,/turf/simulated/floor{dir = 8; icon_state = "whitered"},/area/medical/sleeper)
"bNZ" = (/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/window/westleft{dir = 8; name = "Server Room"; opacity = 1; req_access = list(30)},/obj/machinery/door/window/eastleft{name = "Server Room"},/turf/simulated/floor{icon_state = "dark"},/area/server)
"bOa" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
-"bOb" = (/obj/structure/bed/chair/office/light,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/server)
-"bOc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/command{name = "Research Director"; req_access = list(30)},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/rnd/research)
+"bOb" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/machinery/meter,/turf/simulated/floor{icon_state = "dark"},/area/server)
+"bOc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bOd" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/research_shuttle)
"bOe" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
"bOf" = (/obj/machinery/computer/security/mining,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Mining Dock"; dir = 4},/turf/simulated/floor,/area/quartermaster/miningdock)
@@ -4810,7 +4810,7 @@
"bOz" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bOA" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
"bOB" = (/obj/machinery/light{dir = 8},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
-"bOC" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
+"bOC" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bOD" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor,/area/hallway/primary/central_three)
"bOE" = (/obj/structure/table/rack,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/toolbox/mechanical,/obj/machinery/vending/wallmed1{pixel_x = -32; pixel_y = 0},/obj/item/roller,/obj/item/roller,/obj/item/roller,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
"bOF" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/sleeper)
@@ -4881,10 +4881,10 @@
"bPS" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/security{c_tag = "Engineering - Technical Storage"},/turf/simulated/floor/plating,/area/storage/tech)
"bPT" = (/obj/item/weapon/cigbutt,/turf/simulated/floor{icon_state = "floorgrime"},/area/rnd/storage)
"bPU" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/rnd/storage)
-"bPV" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bPW" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "whitehall"},/area/rnd/research)
+"bPV" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
+"bPW" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/plasteel,/obj/item/stack/material/plasteel,/obj/item/stack/material/plastic{amount = 20},/turf/simulated/floor,/area/engineering/workshop)
"bPX" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/light_switch{pixel_y = 28},/obj/machinery/camera/network/security{c_tag = "Custodial Closet"},/turf/simulated/floor,/area/janitor)
-"bPY" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
+"bPY" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel,/obj/item/stack/material/steel,/turf/simulated/floor,/area/engineering/workshop)
"bPZ" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "chemcounter"; name = "Pharmacy Counter Shutters"; opacity = 0},/obj/structure/table/reinforced,/obj/machinery/door/window/westright{name = "Chemistry Desk"},/turf/simulated/floor{icon_state = "yellowfull"; dir = 8},/area/medical/chemistry)
"bQa" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"bQb" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/command{name = "CMO's Office"; req_access = list(40)},/turf/simulated/floor{icon_state = "white"},/area/crew_quarters/heads/cmo)
@@ -4906,7 +4906,7 @@
"bQr" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor{dir = 10; icon_state = "brown"},/area/quartermaster/miningdock)
"bQs" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/quartermaster/miningdock)
"bQt" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "QM Office"; name = "QM Office"},/turf/simulated/floor,/area/quartermaster/miningdock)
-"bQu" = (/obj/structure/disposalpipe/segment,/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/mixing)
+"bQu" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/turf/simulated/floor,/area/engineering/workshop)
"bQv" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/cargo)
"bQw" = (/obj/structure/disposalpipe/sortjunction{dir = 8; icon_state = "pipe-j1s"; sortType = "HoP Office"; name = "HoP Office"},/turf/simulated/floor/plating,/area/maintenance/cargo)
"bQx" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/cargo)
@@ -5028,9 +5028,9 @@
"bSJ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/rnd/storage)
"bSK" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 5; icon_state = "whitehall"},/area/rnd/research)
"bSL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/rnd/research)
-"bSM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
-"bSN" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Waste to Scrubbers"},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
-"bSO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
+"bSM" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/portables_connector,/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"bSN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"bSO" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/obj/machinery/door/window/brigdoor/westleft{name = "Engine Waste"; req_access = newlist(); req_one_access = list(10,24)},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
"bSP" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor{dir = 2; icon_state = "whitehall"},/area/rnd/mixing)
"bSQ" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible,/turf/simulated/floor{icon_state = "white"},/area/rnd/mixing)
"bSR" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor{icon_state = "bot"; dir = 1},/area/rnd/mixing)
@@ -5688,8 +5688,8 @@
"cft" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/rnd/test_area)
"cfu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research_starboard)
"cfv" = (/obj/machinery/light/small,/turf/simulated/floor/plating/airless,/area/rnd/test_area)
-"cfw" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/plating,/area/construction)
-"cfx" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/plating,/area/construction)
+"cfw" = (/obj/structure/table/reinforced,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/storage/eva)
+"cfx" = (/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = -30; pixel_y = 0},/obj/machinery/camera/network/civilian_west{c_tag = "Cargo Office"; dir = 4},/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/glass{pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel,/obj/item/device/multitool,/turf/simulated/floor,/area/quartermaster/office)
"cfy" = (/obj/structure/table/standard,/obj/item/clothing/head/soft,/obj/item/weapon/stamp{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft,/turf/simulated/floor,/area/quartermaster/storage)
"cfz" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/quartermaster/storage)
"cfA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/table/standard,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engineering/engine_smes)
@@ -5765,11 +5765,11 @@
"cgS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/construction)
"cgT" = (/turf/simulated/floor/plating,/area/construction)
"cgU" = (/turf/simulated/floor,/area/construction)
-"cgV" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = newlist(); req_one_access = list(11,24)},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"cgV" = (/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 50; pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/clothing/glasses/welding,/turf/simulated/floor{dir = 1; icon_state = "whitepurple"},/area/rnd/lab)
"cgW" = (/obj/machinery/door/airlock/glass_medical{name = "Patient Ward"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay4)
"cgX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/rnd/xenobiology/xenoflora)
-"cgY" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = newlist(); req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 9},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
-"cgZ" = (/obj/machinery/door/window/brigdoor{dir = 8; name = "Engine Waste"; req_access = newlist(); req_one_access = list(11,24)},/obj/structure/window/reinforced,/obj/machinery/atmospherics/binary/pump{dir = 8; name = "waste pump"},/turf/simulated/floor/plating{icon_state = "platebot"},/area/engineering/engine_waste)
+"cgY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/cable_coil,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor,/area/assembly/robotics)
+"cgZ" = (/obj/structure/table/plastic{name = "plastic table frame"},/obj/item/stack/material/glass{amount = 20; pixel_x = -3; pixel_y = 3},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"cha" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "toxin_test_pump"; tag_exterior_door = "toxin_test_outer"; frequency = 1379; id_tag = "toxin_test_airlock"; tag_interior_door = "toxin_test_inner"; pixel_x = 0; pixel_y = 25; req_access = list(13); tag_chamber_sensor = "toxin_test_sensor"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/maintenance/research_starboard)
"chb" = (/obj/structure/table/standard,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor,/area/engineering/workshop)
"chc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/engineering/foyer)
@@ -6083,7 +6083,7 @@
"cmY" = (/obj/machinery/door/blast/regular{desc = "By gods, release the hounds!"; id = "xenobioout6"; name = "Containment Release"},/turf/simulated/floor/engine,/area/rnd/xenobiology)
"cmZ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/starboard)
"cna" = (/obj/structure/cable/yellow,/turf/simulated/floor/plating/airless,/area/solar/starboard)
-"cnb" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
+"cnb" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cnc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"cnd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"cne" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering EVA Storage"; req_one_access = list(11,24)},/turf/simulated/floor,/area/engineering/engine_eva)
@@ -6128,7 +6128,7 @@
"cnR" = (/turf/simulated/wall/r_wall,/area/engineering/locker_room)
"cnS" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating{dir = 4; icon_state = "warnplatecorner"},/area/maintenance/engineering)
"cnT" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor,/area/engineering/atmos)
-"cnU" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
+"cnU" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cnV" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syringes,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
"cnW" = (/obj/machinery/computer/med_data,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery)
"cnX" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/glass_jar,/obj/item/glass_jar,/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
@@ -6378,6 +6378,7 @@
"csH" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "freezerfloor"},/area/medical/surgery2)
"csI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/medbay)
"csJ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/medical/virology)
+"csK" = (/obj/structure/bed/chair{dir = 4},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"csL" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor{dir = 9; icon_state = "blue"},/area/engineering/atmos)
"csM" = (/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "o2_in"; name = "Oxygen Supply Control"; output_tag = "o2_out"; sensors = list("o2_sensor" = "Tank")},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "Atmospherics Northwest"},/turf/simulated/floor{dir = 1; icon_state = "blue"},/area/engineering/atmos)
"csN" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6407,14 +6408,17 @@
"ctl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering)
"ctm" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating,/area/maintenance/medbay)
"ctn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/workshop)
+"cto" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"ctp" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs)
"ctq" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs)
"ctr" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs)
"cts" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor{icon_state = "white"},/area/rnd/xenobiology)
"ctt" = (/obj/structure/window/reinforced{dir = 1},/obj/item/stack/rods{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/cell/high,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/reinforced,/turf/simulated/floor,/area/engineering/workshop)
+"ctu" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"ctv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/engineering)
"ctw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/engineering)
"ctx" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/machinery/light,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = 0; pixel_y = -28; req_access = list(5)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "greencorner"},/area/medical/virologyaccess)
+"cty" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"ctz" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay)
"ctA" = (/obj/machinery/light/small{dir = 1},/obj/item/weapon/cigbutt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay)
"ctB" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio3"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/rnd/xenobiology)
@@ -6465,7 +6469,7 @@
"cuu" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop)
"cuv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor,/area/engineering/workshop)
"cuw" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/workshop)
-"cux" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage)
+"cux" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 2; icon_state = "floorgrimecaution"},/area/maintenance/incinerator)
"cuy" = (/obj/machinery/atmospherics/binary/pump{dir = 4; name = "O2 to Mixing"},/turf/simulated/floor,/area/engineering/atmos)
"cuz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plating,/area/engineering/storage)
"cuA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/storage)
@@ -6525,7 +6529,7 @@
"cvC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engineering/workshop)
"cvD" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engineering/workshop)
"cvE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor,/area/engineering/atmos)
-"cvF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/storage)
+"cvF" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cvG" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor,/area/engineering/atmos)
"cvH" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cvI" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "warnwhite"},/area/medical/virology)
@@ -6566,8 +6570,8 @@
"cwr" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/port)
"cws" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor,/area/engineering/workshop)
"cwt" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 3},/turf/simulated/floor,/area/engineering/workshop)
-"cwu" = (/obj/machinery/portable_atmospherics/canister/phoron,/turf/simulated/floor/plating,/area/engineering/storage)
-"cwv" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/plating,/area/engineering/storage)
+"cwu" = (/obj/structure/reagent_dispensers/fueltank,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cwv" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cww" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engineering/storage)
"cwx" = (/obj/machinery/shieldwallgen,/turf/simulated/floor/plating,/area/engineering/storage)
"cwy" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor{dir = 1; icon_state = "green"},/area/medical/virology)
@@ -6580,13 +6584,13 @@
"cwF" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cwG" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access = list(11,13)},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"},/area/maintenance/starboardsolar)
"cwH" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/engineering/atmos)
-"cwI" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cwJ" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cwI" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cwJ" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/machinery/button/remote/blast_door{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_one_access = list(12,5)},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator)
"cwK" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cwL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cwM" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 27},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cwN" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cwO" = (/obj/structure/closet/emcloset,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cwO" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cwP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/medbay)
"cwQ" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/medbay)
"cwR" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/machinery/embedded_controller/radio/airlock/access_controller{tag_exterior_door = "virology_airlock_exterior"; id_tag = "virology_airlock_control"; tag_interior_door = "virology_airlock_interior"; name = "Virology Access Console"; pixel_x = 8; pixel_y = 22},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "greencorner"},/area/medical/virology)
@@ -6626,7 +6630,7 @@
"cxz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port)
"cxA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/engineering/workshop)
"cxB" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/engineering/workshop)
-"cxC" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/turf/simulated/floor/plating,/area/engineering/storage)
+"cxC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cxD" = (/obj/structure/dispenser{oxygentanks = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/engineering/storage)
"cxE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/plating,/area/medical/virology)
"cxF" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/bed/chair,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/camera/network/medbay{c_tag = "Virology Monkey Pen"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6688,10 +6692,10 @@
"cyJ" = (/obj/machinery/door/firedoor/border_only{dir = 1; name = "Engineering Firelock"},/obj/machinery/door/airlock/engineering{name = "Engineering Hard Storage"; req_access = list(11)},/turf/simulated/floor,/area/engineering/storage)
"cyK" = (/obj/machinery/door/airlock/maintenance{name = "Incinerator Access"; req_one_access = list(5,12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/incinerator)
"cyL" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{req_one_access = list(12,5)},/obj/structure/sign/redcross{desc = "The Star of Life, a symbol of Medical Aid."; icon_state = "lifestar"; name = "Medbay"; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/medical/virologyaccess)
-"cyM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"cyM" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cyN" = (/obj/machinery/atmospherics/trinary/mixer,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"cyO" = (/mob/living/simple_animal/mouse,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"cyP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/sign/deathsposal{pixel_x = 32},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cyP" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cyQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/wall,/area/maintenance/medbay)
"cyR" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_interior"; locked = 1; name = "Virology Interior Airlock"; req_access = list(39)},/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyS" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/construction)
@@ -6708,7 +6712,7 @@
"czd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/rnd/xenobiology)
"cze" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/turf/simulated/floor,/area/engineering/locker_room)
"czf" = (/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 4; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor,/area/engineering/workshop)
-"czg" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
+"czg" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czh" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"czi" = (/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating/airless,/area/solar/port)
"czj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6746,8 +6750,8 @@
"czP" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czQ" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czR" = (/obj/machinery/atmospherics/tvalve/digital/bypass{dir = 1; icon_state = "map_tvalve0"; state = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
-"czS" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"czT" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"czS" = (/obj/machinery/atmospherics/pipe/tank/phoron{dir = 2; volume = 3200},/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
+"czT" = (/obj/machinery/atmospherics/pipe/tank/oxygen{dir = 2; volume = 3200},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator)
"czU" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/maintenance/medbay)
"czV" = (/obj/machinery/atmospherics/binary/pump{dir = 8; name = "Port to Waste"},/turf/simulated/floor,/area/engineering/atmos)
"czW" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6796,13 +6800,13 @@
"cAN" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"cAO" = (/turf/simulated/wall,/area/maintenance/engi_shuttle)
"cAP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/engineering)
-"cAQ" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cAR" = (/obj/structure/sign/nosmoking_2{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cAQ" = (/obj/machinery/portable_atmospherics/canister/phoron,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
+"cAR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/engineering/storage)
"cAS" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor,/area/engineering)
-"cAT" = (/turf/simulated/floor{dir = 2; icon_state = "floorgrimecaution"},/area/maintenance/incinerator)
+"cAT" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction)
"cAU" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"; req_access = list(39)},/turf/simulated/floor{icon_state = "delivery"},/area/medical/virology)
"cAV" = (/turf/simulated/floor/plating,/area/maintenance/incinerator)
-"cAW" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/visible,/turf/simulated/floor/plating,/area/maintenance/incinerator)
+"cAW" = (/obj/machinery/light{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction)
"cAX" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "virology_pump"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 10},/area/maintenance/medbay)
"cAY" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 6},/area/maintenance/medbay)
"cAZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6908,7 +6912,7 @@
"cCV" = (/obj/machinery/light{dir = 1},/obj/effect/landmark{name = "JoinLateCyborg"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 9},/area/engineering/drone_fabrication)
"cCW" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 5},/area/engineering/drone_fabrication)
"cCX" = (/turf/simulated/floor/plating/airless,/area/maintenance/medbay)
-"cCY" = (/obj/machinery/atmospherics/pipe/simple/visible,/obj/machinery/meter,/obj/machinery/button/remote/blast_door{id = "disvent"; name = "Incinerator Vent Control"; pixel_x = 0; pixel_y = -24; req_one_access = list(12,5)},/turf/simulated/floor{dir = 1; icon_state = "warningcorner"; tag = "icon-warningcorner (WEST)"},/area/maintenance/incinerator)
+"cCY" = (/obj/machinery/alarm{pixel_y = 23},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/construction)
"cCZ" = (/obj/structure/bed/chair,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engineering/drone_fabrication)
"cDa" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access = list(55)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/rnd/xenobiology)
"cDb" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -7470,23 +7474,23 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaafalkaaaaaaaaaaafaaaaaaaaaaaqaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaqzaqAaqBagDagWagWagWarvalRagWalWalWalWahbaqEapkahCahDaqkaonaqIagnaqKahaanyarMaqOaryaqQaqRaqSanxaqUaqVarQamVanGarzaqYaqZafDaflafMardanGarearfapFaqtaqtapFaifaoHarhariarFaoHaaaakrakrakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafapIapIapIapIapIaafalJaafapIapIapIapIapIaafaaIaaaaaaaaaaaaabgaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzarkaqBagDaekarHagWarmarOalKaogarPaoiaokarparqaesaeRaeraonarualWarZarSarxalLasnarAasBamzasOarEasRarGasWamjanGanGarIanGanGanGanGanGanGarJarKarLasaasaapFarNaoHaoHasXaoHaoHaaaaaaakrakrakraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalJaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaLasYaaLaaaaaaaaaaaaaaaaaaaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaqzataaqBagDarRapcatiarTarUatIapharWaloaonaonarYasFasyasMaonascalWasdasealmasgasharAasiasjaskarEaoHaoHaoHaoHaoHaslatQatJasoasoaspaspasqasrassastastasuasvasvaswasxatXaszaqsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaIaafanTanTanTanTanTaafalJaafanTanTanTanTanTaafaaIaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAauiasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWaZtasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgaZuathauuarAasQauvasSarEasTasUasUasVauSasVavCavbasZasZasZasZasZasZasZasZasZasmavFatbatcaoKatdateatfaaaaafatPatratjatjatjatjavRatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHavTavUatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasAauiasAaaaaaaaaaaaaaaaaaaaaaaaIaafapJapJapJapJapJaafalkaafapJapJapJapJapJaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasCasbapbagDapUapMagWaZtasEalKapOasPaoiasGasGasHasIaonasJaonasKalWasLatgaZuathauuarAasQauvasSarEasTasUasUasVauSasVavCavbasZasZasZaDoasZasZasZasZasZasmavFatbatcaoKatdateatfaaaaafatPatratjatjatjatjavRatjatjatjatjatUaafaaaaaaaaaaaaaamaafanianjanjanjanjanualJansanqanqanqanqanwaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatkatlatmaaaatnatoatpaaaaafatqatWatqaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafaaaaaaaaaalkaaaaaaaaaaafaaaaaaaaaaamaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaanXatsattagDagDagDagWagWagWagWalWalWalWalWalWatuaonaoratvaqEatwalWalWalWatxatxatxarAatyatzatAarEatBasZasZasZasZatCatDatEatFatGatHaEzavUatKatLatMatNatOatPatPatPatPatPatPatPatPatPatPatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaamaaaapIapIapIapIapIaafalJaafapIapIapIapIapIaaaaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaihaihaihaihaihaihaihaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatSatTaLAatTatSatVaLBatVatSaafatqawvatYaaaaaaaaaaaaaaaaaaaaaaaIaafanVanVanVanVanVaafalkaafanVanVanVanVanVaafaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafatZauaanYaubaucanXaafaafalWaudaueaufaugauhawMaonapnaonasJaqEaujaukaulawRaunauKauparAauqaurausarEatBasZauLaxdauMatCauxauyatFatGauzauAauBauCauDatMatNauEauFauGauHauIauHauJauwauOauPaxsatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaaaaafaaaaafaafaaaaaabepaaaaaaaafaaaaaaaafaaaaaIaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRaxuauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWaZYavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGauzauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNatTavmatTauNatVavyatVauNauQauRaxuauTauUauUauVauQauQaafaaaaaIaafalzalyalyalyalyalAalkallaivaivaivaivagEaafaaIaaaaaaaaaaaaaaaaaaaaaaaaanXanXanXauWanXanXapbaucanXaaaaaaalWauXalWauYauZavaalWaZYavzaonavdaveaveavfavgaveavhaviavjarAavkauravlarEatBasZavAavoavJatCawravqatFatGaGVauAavravsavtatMatNavuavvauGauHauHauHauJavwavQawfavVatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaamaamaaIaaaaaaaafaaaaaaabpaaaaafaafaafaafaaIaaIaaIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNavBaxyavDauNavEaxAavGauNavHavIaxCavKavLavMavNavOauQaaaaaaaaqaaaapJapJapJapJapJaafbeSaafapJapJapJapJapJaaaaaIaaaaaaaaaaaaaaaaaaaaaaaaawkaxGavSayqaxOawoavWavXanXaaaaaaalWalWalWavYavZawaalWaYJaYNawcaweawpaYHaukawhawxautawyawlarAawmaurayzarEatBasZawzawUawYaxaaxbawZatFatFatFawsawtawuatFatFatNayNawwauGauHauHauHauJawAavxawfaykatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaafaafaaaaafaaaaaaaYxaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaZhaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaxGawQazgaxOawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnazpaxcaxfaxeaxhaxgaxhaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoaYUazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaZnaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaAvaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAHaxPaxQaxRaAHavpasZaxSawjcfSatCaxVaxXaxXawLaxZaxYayaaxpaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaBaaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaauNawGawHawIauNawGawHawIauNawJavHavHavHavHavHavHavHasAaaaaaaaaIaaaaafaaaaafaafaaaaaaaZhaaaaaaaafaaaaaaaafaaaaaIaafaaaaaaaafaafaaaaaaaafawPaxGawQazgaxOawSaucawTanXaafaaLcqTatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxatxarAawVaurawWarEatBasZawBaxjawCatCaxVavnazpaxcaxhaxeaxhaxgaxfaxiaxkaxlaxmaxnaxoaxoaxoaxnaxmavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaafaafaafaaaazoaYUazoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaatSauNazFaxxatSauNazUaxxatSauNaAbauNauNauNauNauNavHatqaaaaaaaaIaaIaaIaaaaaaaafaaaaxBaZnaxBaafaafaafaafaaIaaIaaIaafanXanXanXanXaxDaxEaxEaxFanXanXanXanXaAvaucaucanXaxHaxIanXanXaxJaxKaxLaxMaxMaxMaxMaxMaxMaxMaxMaxNaxMaxMaxMaxMaxMaAHaxPaxQaxRaAHavpasZaxSawjcfSatCaCJaxXaxXawLaxZaxYayaaxpaxXavqaydayeayfaygayhayhayhayhawXavxawEawDatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaAuaBaaAuaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaynayoaypayoaBcayoayrayoaysaytayvayvayvayvaywauNawNatqaaaaafaafaaaaaaaaaaaaaafaaaayyaBkayAaafaaaaafaaaaaaaaaaaaaaaanXayBayCayDayCayCayCayCayEayCayCayFayGayDayHayIaxMaxMaxMaxMaxMaxMayJayKayLayLayLayLayMayLayLaZsayLayMayLayLayLarAaBEayPayQarEaAiasZcfSaycaxUatCayUayTayWaxqayYayXayYayiayTazaazbazcazdazeazdazdazfaxraBOaxtaxTaxvatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaafaBuaBvaZraBxaByaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaCeauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbdHazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTazTazVazWazXazYazZaAabeTazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXawLayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbfyaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqazrazsaztazuazvazwazxazyazwazzazAazwazwaCeauNavHauRaafaafaaaaaaaaaaaaaaaaafazDazEbdHazGazHaaaaafaaaaaaaaaaaaaaaanXazIanXazJazKazLazLazLazMazLazLazLazNazJazOazPazPazPazPazPazPazPazQazRayLazSazTbzzazVazWazXazYazZaAabeTazTaAcarAaAdayPayQarEaAiasZaybaAeauMatCaxWaxXaxXaxXaxXawLayjaAlaAmaAnaxkaAoaylaApaApaApaAqayVatPayZatPatPatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCwbfyaCyaCvaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafauNaAwaAxaAwaAyazsazsaAzaAwaAxaAwaAAaABaACaADauNavHauQauQaAEauUauUauUauUauVauQaAFaAGbfAaAIaAFanXanXaxHaAJaxIanXanXanXazIaAKazJaaaaafaaaaafaaaaafaaaaafaaaazJazOazPaALaAMaANaAOaAPazPazQaucayLaAQaAQaARaASaATaAUaAVaATaAWaAXazTaAcarAaAdayPaDdarEaAiasZawzaAgaAhaBbayRaBdaBeazhaBgaBhaBiaBjaBjaCLaBjatPaBlaBmaBnaBoaBpaBraxvazibguazjatRatRatRatRatRatRatRatRatRatRavcaafaaaaaaaaaaaaaaaaacaaaaaaaafaaaaCvazlaDAaDBaCvaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaDcaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDnaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDxaCfaCgaChaCfaCJaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDQatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEeaCIaAsaAFaCKaEvaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbaDoayLayLayLarAaAdayPayQarEaAiasZaAtaEMauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaESbgIaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEVatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbgHaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaFEaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFbaNaDZaCMaEaaEbbcCbbTbbxbaCbafbacaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFSaEwaCfaExaEyaATaEzaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFZaEKaENaEOaBjaEPaEQaERaGfaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaGkaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGqaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkawiaFlaFmbIraFoaFpbHfaFlawnaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGravHaFuaGxaFxaGHaFzaDfaGPaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaDtaElaFQaEnaFRaBYaaaazJazOazPaGVaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYbcEazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaHJaDzaHYaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaIcaDpaIkaIhaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIlaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaBzatSaBAawHaBBaBCaBDaDcaBFaBBawHaBGaBHaBIaBJaBKaBLavHavHavHavHavHavHavHavHaDnaBPaAFazmaBRaBSaAFaBTaBUayCayCayCayCayCaBVaBWaBXazJaafaBYaBYaBYaBYaBYaBYaBYaafazJazOazPaBZaCaaCbaCcaBZazPazQaCdayLayLayLayLaDxaCfaCgaChaCfbKoaCjazTaCkarAaAdayPaClarEaJCasZaznaAYazCatCaxWavqatEaBjaBjaBjaBjaBjaCqaCraCsaBjatPatPatPatPaDQatPatPaAfaAkaAjatRatRatRatRatRatRatRatRatRatRaumaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaEXaEYaDYaCvaaaaaaaaaaafaafaaaaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazqaAxaCzaCAaCAaCAaCAaCBaAxazqaaaaBIaCCaxzaBLaCEaCEaCEaCEaCEaCEaCEavHaCFaCGaAFaEeaCIaAsaAFaCKaEvaCKaCKaCKaCKaCKaCKaCKaCKaCMaaaaBYaCNaCOaCPaCQaCRaBYaaaazJazOazPaBZaCSaCTaCUaBZazPazQanXayLaCVaCWaARaCXaCYaCZaDaaDbcfwayLayLayLarAaAdayPayQarEaAiasZaAtaEMauMatCaDgavqatEaDhaDiaDjaDkaBjaCqaDlaCsaBjaDmaESbgIaDpaDqaGwaDsatPatPatPaAZatjatjatjatjaEVatjatjatjatjaBfaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaCvaCvbgHaGyaCvaDCaDDaDEaDCaDCaDCaDCaDCaDCaDCaDFaDGaDGaDGaDHaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaDIaDJaDKaDJaDJaDLaDMaDJaDJaDKaDNaDOaBIaDPaFEaBLaDRaDSaDTaDUaDVaDWaCEavHaDXauQaAFaAFbaNaDZaCMaEaaEbbcCbbTbbxbaCbafbacaEiaEjaCMaafaBYaEkaElaEmaEnaEoaBYaafazJazOazPaEpaEqaEraEsaEtazPazQaEuayLazSazTaFSaEwaCfaExaEyaATaIVaEAaEBaEBarAaAdayPayQarEaAiaCmaCmaCmaCmaCmaEHaEIatEaEJaEKaEKaELaFZaEKaENaEOaBjaEPaEQaERaGfaETaCnaDsaaaaafaafaafaaaaaaaafaafaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaDCaBsaBqaDCaBtaCpaGkaFdaFdaFdaFdaFeaFfaFgaFgaFgaFgaFgaFgaFgaGqaFiaFjaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaDIaDNaDJaFkawiaFlaFmbIraFoaFpbHfaFlawnaFraFsaFtaDPayuaBLaFvayxaBMaCxaBMaBNaGravHaFuaGxaFxaGHaFzaDfaGPaFJaFKaFLaFLaFLaDraFLaFLaFNaFOaCMaaaaBYaDtaElaFQaEnaFRaBYaaaazJazOazPbopaFTaFUaFTaFVazPazQaFWayLayLayLayLaFXaCfaCgazTaCfaFYbcEazTaGaarAaGbaGcaGdarEaAiaDeaDvaDuaCoaDeaHJaDzaHYaGlaGmaBjaBjaBjaBjaBjaBjaGnaGoaGpaIcaDpaIkaIhaDsaDsaDsaDsaDsaDsaDsaDsaDsaFaaFbaDsaDsaFaaGtaDsaDsaaaaaaaDCaDCaDCaDCaDCaEZaEWaFdaFcaFwaDCaDCaDCaDCaDCaGDaGEaGFaGFaGFaGFaGFaGFaGGaGGaIlaGGaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraGIaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPayuaBLaInaFAaGRaGSaGTaGUaCEaFBaFDaFCaFCaFCbazaIzaFCbcTaFLaFLaFLaFLaFLaFLaFLaFNbcPaCMaafaBYaHeaHfaHgaHhaHiaBYaafazJazOazPaHjaFPaFUaHlaHmazPaHnaHoayLaHpazTaARaHqaATaHrazTaCfaFYaHsazTaHtarAaHuaHvaHwarEaGuaIDaEUaGvaDwaIIaGzaGjatEaHCaHDaBjaHEaBjaHFaBjaHGaBjaHHaGpaIZaDpaJsaJjaHLaHMaHMaHNaHOaHKaHKaHKaHKaHKaHPaHKaHKaHKaHQaHVaDsaDsaDsaDCaGBaGAaGCaGCaGLaGJaDCaDCaJwaDCaIdaIeaIfaIgaGFaJBaGFaIiaIjaJHaKjbinaKlaIoaIpaIqaKHaIsbjFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGMaGNaGOaDPaFFaIAaIAaKMaICaKPaICaIAaIAaIEaIFaFCaGQaFHaGWaHkaFCaCDaILaIMaFLaFLaHRaFLaIOaIPaCDaCMaaaaBYaBYaIQaHSaIQaBYaBYaaaazJazOazPbdzaITaIUaFTaIVazPaIWaIXayLaIYazTbdtaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaKVaCuaCuaCuaCuaCuaHUaHTaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaKXaJtaGsaGsaDqaJvaDsaDsaKYaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHXaHWaIaaLcaIraIbaIbaIbaIRaINaIgaJIaJJaLdaJkaJMaJNaIgaJOaJPaGFaJQaJAaJSaJTbinaJUaIoaJVaLeaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaLiaIHaIGaIJaLkaJZaJYaJGaKaaFCaCDaKmaKnaKoaCHaCDaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPaCtaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaLmaKIaKJaKKaKLaJeaEDaKNaKOaLYaEEaKRaaaaaaaJlaKSaJKaMcaJlaJLaJnaJnaJnaKWaJnaJnaJnaBjaDpaMvaDpaDpaDpaDpaMwaDpaKZaLaaLbaMEaMVaMFaLfaLgaLhaLfaLfaLfaLfaLfaMXaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaLpaKTaGFaLraLsaLtaJTbkuaJUaIoaJVaIoaKUaCiaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaIwaFlaFlaDKaFlaFMaFlaFMaIxaFMaIyaFMaFlaGMaGNaGOaDPaFFaIAaIAaKMaICaKPaICaIAaIAaIEaIFaFCaGQaFHaGWaHkaFCaCDaILaIMaFLaFLaHRaFLaIOaIPaCDaCMaaaaBYaBYaIQaHSaIQaBYaBYaaaazJazOazPbdzaITaIUaFTaFTbxxaIWaIXayLaIYazTbdtaEwaCfaJaaEyaATaJbaJcazTaJdaJeaJfaJgaJhaMbaKVaCuaCuaCuaCuaCuaHUaHTaJlaJmaJnaBjaJoaBjaJpaBjaJqaBjaJraGpaKXaJtaGsaGsaDqaJvaDsaDsaKYaDsaDsaJxaDsaGsaJyaGsaGsaGsaJzaHZaHXaHWaIaaLcaIraIbaIbaIbaIRaINaIgaJIaJJaLdaJkaJMaJNaIgaJOaJPaGFaJQaJAaJSaJTbinaJUaIoaJVaLeaGGaGGaGGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaFraJXaFyaGKaFlaFMaFlaFMaFlaFMaFlaFMaFlaGMaGNaGOaDPaGYaGXaHaaGZaHbaHbaIBaLiaIHaIGaIJaLkaJZaJYaJGaKaaFCaCDaKmaKnaKoaCHaCDaKqaKraKsaKtaKuaaaaafaaaaKvaKwaKvaaaaafaaaaKuazOazPavTaKyaKzaKAaKBazPaKCaKDayLaKEazTaARaKFaKGaHrazTaLmaKIaKJaKKaKLaJeaEDaKNaKOaLYaEEaKRaaaaaaaJlaKSaJKaMcaJlaJLaJnaJnaJnaKWaJnaJnaJnaBjaDpaMvaDpaDpaDpaDpaMwaDpaKZaLaaLbaMEaMVaMFaLfaLgaLhaLfaLfaLfaLfaLfaMXaLfaLfaLfaLfaLfaLfaLfaLfaJRaIgaLjaJWaLlaEFaKbaLoaIgaLpaKTaGFaLraLsaLtaJTbkuaJUaIoaJVaIoaKUaCiaLxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaLyaLzaDJaFkawiaFlaFlaFqaFlaFlaFnaFlawnaFraLCaLDaDPaLEaLFaLGaLHaLGaLGaLGaLGaLGaLIaLJaFCaFCaFCaFCaFCaFCaLLaLMaLNaLOaLOaLOaLOaLPaLQaLRaKuaLSaLTaLTaLUaLVaLWaLTaLTaLXaKuaNAaKuaKuaLZaMaaLZaJeaJeaMbaNGaJeaJeaJeaJeaMdaMeaBwaBQaMhaMiaJeaJeaJeaJeaMjaKNaMkaMkaMlaMmaMnaMoaJlaMpaLqaLnaJlaJlaJlaJlaJlaJlaJlaJlaBjaBjaMsaMtaMuaOiaOoaLvaMyaMfaKZaMAaMBaMCaMCaMDaLfaOpaOqaMGaMHaMIaMJaMKaMLaMMaMNaMHaMJaMIaMHaMOaLfaJRaIgaMPaMgaMRaMSaMqaMUaIgaOsaMWaOCaMYaMraNaaNbaGFaGGaOHaJVaIoaMxaAraNfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaLyaDJaDKaDJaDJaDLaDMaDJaDJaDKaLzaNgaBIaNhaLEaNiaMzaMzaNkaMzaNlaIAaNmaNnaLJaNoaNpaNqaNraNsaNtaNraNuaNraNraNraNvaNraNraNwaNxaNyaNzaNzaNBaOMaNCaNzaNzaNzaNzaNDaNEaNFaQcaNraNHaNIaNJaNKaNLaNMaNLaNNaNOaQdaNQaNQaNRaNSaNTaNSaNUaNVaNWaEGaNYaNZaOaaObaOcaMkaMkaMkaOdaOeaMTaMQaOhaQxaOjaOkaOlaOmaOnaJlaQAaQyaQEaOraOtaOtaOuaMZaOwaNdaKZaOyaOzaOAaOAaOBaLfaQJaODaOEaOEaOEaOEaOFaOGaQTaOIaOJaOKaOKaOLaRbaLfaJRaIgaONaOOaNjaOfaONaONaIgaORaOSaGFaOTaOUaOVaOWaGFaIoaIoaJVaIoaGGaGGaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOXaOYaOZaPaaPaaPaaPaaPbaOYaOXaaaaBIaPcaPdaPeaOvaOgaPhaPhaOxaIAaPjaNnaPkaPlaPmaPnaPoaPpaPqaPqaPraPsaPsaPsaPtaPuaPuaPvaPwaNIaPqaPqaPxaPyaPzaPAaPBaPBaPCaPBaPDaPyaPyaPyaPEaPFaPGaPHaMkaPIaPJaPJaPJaPJaPJaPJaPJaPJaPKaPJaPLaPMaPNaPOaPPaPQaPRaPSaPTaPJaPUaPJaPVaPWaPXaPWaPWaPWaPWaPWaPWaPYaPZaRsaQbaQbaQbaRraQbaQbaRxaQeaQfaDyaKZaQhaMCaQiaQjaQkaLfaEcaQmaQnaQnaQnaQnaQnaQoaQpaOPaQraQnaQnaQsaQtaLfaJRaIgaQuaONaONaQvaONaQwaIgaGFaGFaGFaGFaGFaGFaSoaGFaIoaIoaJVaIoaStaOQaGGaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7500,29 +7504,29 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaT
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaXubcFbcZaXmbbUaSFbaabaabaabaabaabbVbaaaXoaYObbXbbYbaibbZbbZbbZbbZbdKbbZbcbaTUbccbcdbcebcebcfbcgaTSaXebchbcibcjaKibdQblcaKkbcobcobcpbcpbcpbcpbcpbcqaMbbcrbcsbctbeabcvbcwbcxbbgaUpbczbcAbeeaUpaUpaaaaaaaafaafbekaaaaaaaUpaUpbezbcGbczaUpbbgbcxbcHbcIbcJbcKbcLaRpaWcaSSaSSaSSaSSaSSaGpbcMaSSbcNaSSbcObcObcObcObeBbcQbcRbcSaUQaUQaUQbeMbcUaTeaZMbcWbcXaYgaWBaYhaWDbcYaZzaZZbdabdbbdcbddbdebddbddbddbddbddbdfbdgbdhbdibdjbdkbdlbdmbdnbdobdpbdqbdraVoaYubdsaZNaVobeNbbOaafaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBbdubdvaZUbdwbdxaSFaWnbabbaaaZvaYXbbVbaabdAaYObbpbdCbaibbZbdDbdEbdFbdGbbZaEgbdIbdJaTSbeRbdLbdMbdNaTSaXebdObdPbdPbeVbdPbdPbdPbdPbdRbdSbdSbdSbdTbdSbdUaMbbdVbdWbdXbdYbdYbdYbdYbdYbdYbdZbeWbdZbdYbebbebbebbebbebbecbebbebbebbedbedbfobedaUpaUpaUpaJiaJiaJibcKbcLaRpaJlbefbegaDmbehaSSbeibcMbejbfqbelbcObcObembenaZzaZzaZzbfwaSGaSGaSGaZzaZzaZzbeqberbesbetaWBaYhaYhbeuaZzbevbewbbqaZzbeybbsbeAaYtbfxbbEbeDbcmaONaGGaIobeFbeGbeHbeFbeIaIoaIoaGGbeJaVoaYuaVoaZNbeKbeLbbOaafaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaafbeObePbeQbfWaRtaWnaZebeUbbtaYXbbVbgNbgMaYObeXbeYbaibbZbbZbbZbeZbfabbZbfbbdIbfcaTSbeRbdLbdMbfdaTSaXebdObdPbbzbffbfgbfgbfhbdPbfibcVbfkbflbfmbfmbfmaMbaMkbcsbctbdYbfnbgUbfpbgWbfrbfsbftbfubdYbebbfvbgXbfvbhebhCbfvbdybebbedbfCbfDbfEbfFbfGbfHbfIbfJaJibfKbfLbfMaJlaZzaZzaZzaZzbfNbfObfPbfQaZzaZzbfRaZzaZzaZzaZzbfSbfTbfUbfVbfVbfVbhJbfXaZzbfYbfZbgabgbbgcbgcbgcbgdaZzbevbewbdBaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbgfbggbghbgibgjbgfbggaZzaRZbgkaVoaYuaVoaZNaZObglbgmaWTaZRaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhKaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeRbdLbdMbfdaTSaXebdObdPbgBbgCbgDbfgbgDbdPbfibgEbgFbgGaFIaFGaFhaMbbgKbgLbctbhLbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhRbhNbfzbgYbhSbebbedbhabhbbhcbeCbhTbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhUbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIaHdbhXbhWbhMaHcaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaabgnbgobgpbgqaZUbgrbgrbgrbgrbgrbgrbgsbgtbgraYOaYOaYOaYOaYObhKaYOaYOaYObgvbgvbgwbbZbdDbgxbeZbgybbZbgzbgAbgzaTSbeRbdLbdMbfdaTSaXebdObdPbgBbgCaCtbfgbgDbdPbfibgEbgFbgGaFIaFGaFhaMbbgKbgLbctbhLbivbgObgPbexbexbgRbgSbgTbdYbebbmIbgVbhRbhNbfzbgYbhSbebbedbhabhbbhcbeCbhTbeEbhgbhhaJibhibhjaRpbhkbhlbhmbewbewbhnbewbhobewbewbewbewbhpbewbewbewbewbhqbewbewbewbewbewbewbhmbewbewbhrbhsbhsbhtbhsbhsbhubhvbewbhqbhwbhxbhpbewbhybewbewbewbhzbhAbhBbhUbewbhDbewbhEbewbewbhFbhGbhHaVoaYuaVobhIaHdbhXbhWbhMaHcaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaafbhPaYDbhQbitbiqbjubjqbjwbjvbjubjBbjGbjCbjObhYbhZbgwbbZbbZbbZbiabfabbZaTSaTSaTSaTSbeRbibbicbjQaTSbiebifbdPbigbihbiibgDbijbdPbfibikbgFbgGbgGbgGaEhaMbbimaSzbctbjVbiobipbfjbirbisbfBbiubjMbdYbebbiwbixbiybjYbiybgYbgebebbedbiAbiBbiCbgQbiEbgZbiGbiHaJibiIbiJbiKbiLbiMbiNbiObiObiPbiQbiRbiSbiSbiSbiTbiSbiSbiSbiSbiSbiUbiVbiVbiVbiWbiObiObiNbiObiObiXbiVbiVbiYbiSbiZbjabjbbiSbjcbiObiObiObiObiObiObiObiObiObiObiObiObiObjdbiTbjebiSbjfbjgbjhbjibjibjjbjkaZNaWRbjlaWTaWTaWUaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhOaZSaZTbjmbjnbjobgrbjpbjpbjZbjpbjpbjpbjrbajbajbajbajbaibbZbdDbjsbjtbgybbZbkZbkZbkZaTSaTSaTSaTSbkkaTSbjxbdObdPbjybjzbgDbfgbkxbdPbkAbfmbkHbgGbgGbgGbjDaMbbjEaSzbctbkKbkLbgObhdbjIbjJbhfbjLblybdYbjNbkMbjPbiybkNbiybgVbkPbjSbedbjTbjUbizbjWbjWbjWbjXbkVaJibkXbkabkbbkcbkdbkebbFbkfbkgbkhbkibkjbkYbklbkmbknbknbkobewbewbewbewbewbkpbkqbkrbewbksbktcsfbkvbewbkpbkwcLYbkybhFbewbewbkzbewbewbllbkBbewbkpbewbewbewbewbewbewbewbewbewbhqbewbewbhFbkCbkDbkEbkFbkGblmbkIbkJaafaaaaafaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObQDblrblEbQLbkObgrblTbkQbkRbkRbkSbkTbkUbmdbmlbmlbmAbmxbbZbbZbbZbeZbmBbbZbajbajbajbajblaaXeaXeblbblcbldbleblfblgblhblibljblkbdPbmEbfmbmFbgGblnbgGbbAblpblqaSzbctbdYbmHblsbltblublvblwblxbdYbdYbebblzblAbmUbmNblDblAbiDbebbedbedblFblGblHblIbiCblJblKaJiblLblMblNaJiblOblOblOblOblOblOaZzaZzblPblQbZNcdMblQblPaZzaZzaZzaZzaZzaZzaZzaZzaZzaZzbmVaZzaZzaZzaZzaZzaZzbmXaZzbewbewblVblWbiFblOblOblOblOblOblXblYblYblZblYbewblYblZbmablYbmbblObmcbmcbmcbnbaRZbmeaRZaRZaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhObhObdubdvbjmbjnbmfbgrbmgbjpbmhbmibjpbjpbjpbnsbmjbmkbmkbnwbbZbdDbmmbeZbmnbbZbfebmpbmqbmrbmsbmtbmtbmubmtbmtbmvbdPbmwbnNbfgbmybmzblfbnRbnPbnSbgGbgGbjHbilbnUblqaSzbnVbmGbmGbmGbmGbmGbmGbmGbnWbmGaafbebbmIbmJbmKbmLbmKbmMbjKbebaafbedbmObnXbmQbmRbiCbiGbmSaJibcKaRqaRpaJibmTbohboibjAbojbmYbmZbjRblBblobndbneblobmobmCbnhbnibnjbmPboKbnmbnnbPLbnpbnqbnrboWbntbntbnubYfaVJblOblObpmblObZMbZMblObnzbmDbnBblObZtbpobZtblOblXblYbmbblObZnbmWbZnblObnGbPJbnIbnJbnKbnLbnMaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnObpwbeQbnQbgrbpLbpBbpMbnTbpPbpNbjpbpSbnlbnYbnZbnwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbqcbnSbgGbgGbgGbokblpblqaSzbqgbmGbombonbncbOIbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbPZboPboQboRboRboSboTboUboUboVbolboXboYboZbpabpbbnnbPGbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbOJbpnbnybppbnCbnDbpqbqxbptboobqyblOaZzbqBbpxblObopboqbprbqGbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbqKbgrbqQbjpbrkbrcbpQbpRbrvbrubrwbrwbrwbrxbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPcfycfocfzbrybqdbqebqfbrCbqhbqibqjbqkbqkbrDbrIbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbrPbxsbotaafbebbebbebbebbshbebbebbebbebaafbedbqzboCbqAbsjbqCbqDbqEaJibqFaRqaRpaJibskbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbslboYbqRbqSboNbnnbqUbqVbqWbsnbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbsobrdbrdbrdbrebrdbrfboObrhbribrjbsqbnIbrlbpCbrmbrnbrobsrbnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsvbsBcaLbsHbsHbthbrzbrAbgrbtkbtlcaMbpTbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtBbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtIbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabYZcanbotbosbotaafbsibZibtKbtTbsmbtXbtKcaJbsiaafbedbspbuibspbedbedbedbujaJibssaRqaRpbXHboJbngbstbsubuobqLbswbqNbupbtmbuGbuAbuNbsCbqObsDbnibwDbsFbwKbxhbnncdtbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNbxxbsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabtbbtccflbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbuYbtibtibtibtjbtibtibgrbvabuZboAbvjbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvqbtwbtxbtybtzbtAbfmbfmbvCbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvEbmGaafbtJbvFbtLbtMbtNbtMbtLbvIbtPaafbspbtQbtRbtSbvObtUbspbtVaJlbtWbbmbvZaJibtYbohbtZbuabwcbucbudbuebufbwgbzrbzcbwnbukbulbumbnibnnbunbpubzybnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzbzzbpvbuCbuDbuEbuFbVybrhbuHbuIbuJbnIbuKbuLbuMbtbbpCbVebnIbpEbpFbUAbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObSwbxmbuVbpHbuWbgnbgobuXbuWbgrbxpbjpbxvbvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibxzbvkbvlbvmbSlbSrbfmbvpbgGbxDbpzbvsbvtbvubvvbmGbmGbmGbRcbQMbvzbvAbvBbvwaafbpObRpbvHbvJbvKbvMbvNbRybpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbTTbxObucbyobxTbyKbwdbwebwebwfbyMcdWcdVbUqbwkbTWbwmbwkbwkbwkbwkbyQbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbTsbwvbwwbyUbwybnIbwzbwAbwBbwCbpCbSEbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbCkbxabgGbgGbugbxcbvtbvubxdbxebxfbEYbzHbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibDDbxybAobxAbxBbxCbAtbxEbxCbxFbxGbDIbxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbDQbwsbwsbwsbsSbwtbEFbwwbvDbUabTQbwwbESbFbbEZbyibpCbFybnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgcLebwJbFUbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAFbypbAFbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbxrbxrbALbxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbAVaJibyPblMblNaJibCnbyRbyRbySbyTbxCbAXbyVbyWbCobyYbyZbzabwmbzbbBqbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbBsbcnbCQbzsbztbzubzvbzwbppbCXbpqbpqbDBbsSbwtbCLbzAbzBbzCbzDbzAbzEbzFbzGbBwbzIbwwbwwbBxbnMbnMbzKbzLbzLbzLbzMbCJbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPbKobgGbrNbBJbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBKbAhbBRbBQbBSbAjbBUbAjbAjbyNbCcbCdbAmbAnbBXbApbAqaJibAraRqaRpaJibAlbAsbAubAvbAwbBtbAybAzbBabABbACbADbAEbBEbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbBGbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbAkbBbbBcbppbBdbBebBfbBgbBhbBibBjbBkbBlbBlbBmbBnbBobTHbCrbBrbCwbCAbTIbBvbCEbCIbCHbCKbwGbwJbrgbwJbwJbBNbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCYbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbLpbgGbBHbBIbgGbCZbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbLrbBMbBObvwbDbbDabDdbDcbDfbDebDhbDgbDjbDibBVbyNbBWbzmbBYbBZbCabCabCbbDwbAraRqaRpaJibzxbCebCebySbCfbxCbCgbChbxCbCibCjbCjbyObwkbClbCmbwkbwkbwkbwkbwkbwkbyXbwkbwkbwmbDKaXKaXKaXKaXKbDYbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbEibCsbCtbBhbCubCvbEjbCxbCxbCxbCybCzbEkbCBbCCbCDbEpbTGbCGbErbCGbEsbEubBzbuQbuRbEwbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbLHbgGbrNbwXbgGbqlbCRbgGbgGbECbxcbvtbAbbCTbxcbCUbvwbCVbEKbMIbAWbxlbvwbEMbELbERbAhbEUbEUbEUbAjbEWbEVbEXbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbMMbDvbMpbDxbDybDzbDAbyWbLWbFabCjbMybwmbDEbDFbwmbDGbDHbNsbDJbFobDLbDMbCpbDNbDObBTbNtbDRbCpbVLbVMbDUbVAbDWbDXbDXbFrbDZbEabEbbEcbEdbEebEfbEabEgbEhbCvbFVbFFbGfbwwbwwbwwbwwbwwbGhbGgbEnbzKbzMbCJbEobGibCJbzKbzLbzMbGjbCJbGkaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGubExbGubEybEzbEAbEAbEAbEAbEAbEBbGAbEDbzTbEEbdPbNzbEGbEHbEIbEJbGDbGCbGWbGEbGvbtCbENbAbbEObEPbyEbvwbEQbHabOxbBMbETbvwbBPbHibHjbAhaaaaaaaaabAjbHmbHlbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHMbFjbFkbFlbFmbFnbHNbFpbFqbxCbxFbxFbIZbxFbwkbFsbFtbFubFvbFwbFxbDJbIYbDLbFzbFAbFBbDObFCbFDbFEbHPbVlbDXbHQbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbFQbFRbFSbCvbHRbJrbJabFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHUbHUbHVbIfbHZbIobEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbITbGtbGvbGwbGxbGybGzbtCbvtbAbbIAbGBbtCbtGbtGbtGbtGbtGbIBbtGbtGbtGbIRbtGbIUbIMbIXbtGbJbbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHMbJqbFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIDbGXbGYbGZbJDbHbbHcbHdbHecLVbCpbUSbUfbwwbwwbwwbwwbwwbJVbwwbwwbwwbzAbKfbzAbzAbHkbBhbCubCvbHRbIvbKzbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCIbBybKBbKUbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIubHwbHxbHybGvbHzbKVbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbLabLxbLnbLzbAabAabLIbMhbLYbAabHTbAabzZbHHbKJbHWbHXbHYbMibxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebMlbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqcLUbFDbIsbItbHObCpbHSbIwbIxbIybUdbLybMqbICbMCbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbMHbMFbINbIObIPbIQbHvbGabGbbISbEnbEnbEnbCJbCJbCJbMSbMPbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMZaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbuObEmbIVbIWbNdbPebPKbPEbNfbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNkbJkbJlbNqbJnbJobNBbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNLbGHbDzbHAbFibDVbxFbNQbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNZbJWbObbJYbIFbJZbKabKbbKbbzAbKcbKdbKebOcbKgbKhbKibKjbKjbKkbGabGbbKlbEnbKmbOdbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOfbKAbIVbKAbOibKCbOnbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbODbOtbKWbKXbcLbKYaRpaRpaRpaJlbOEbFlbFnbOFbJmbOGbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbPMbLqbQPbLsbLtbCpbLubLvbIxbLwbFGbLybOHbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbLFbCvbwwbLGbuTbuUbLJbLKbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbsObLXbtdbLVbLZbMabMbbGtbMcbMdbMebMfbMgbOLbOKbMjbMjbMkbtCbtCbtCbOMbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbONbtCbtCbtCaJlaJlbOQaJlaKSaMpbMraJlbKZbJXbORbGFbLdbxCbDzbLDbxCbtvbMzbMAbMBbwkbOTbMDbMEbOUbMGbPubVzbMJbMKbMLbItbJObFDbFDbVVbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPvbMQbMRbMRbzAbPAbMTbMUbwwbMVbMVbMVbMWbMXbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbPCbLRbLRbNebKtbKtbLTbLTbPDbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbPFbNlbNmbNnbKAbNobNpbGvbPHbNrbubbtObGvbNubNvbNwbNxaaaaaaaaaaaabNybuhbNAbPSbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbPXbNMbNNbNObNPbqsbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbQabOabQbbMzbMvbMubOebQcbOgbOhbQdbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbQebOubOvbOwbWIbMObOybOzbOAbOAbzAbOBbOCbCvbzIbQgbQpbQjbQBbQubRdbQXbRvbRebRxbVFbMVbuxbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbRAbRzbKAbOSbRDbRBbKAbRFbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbvYbPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbRWbRJbPwbPxbPybDtbNYbLbbScbGFbGFbSgbDzbSibxCbSnbwZbwYbwlbwkbSubPIbwkbOkcbdbXnbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbwjbMObPTbLEbPUbPUbzAbBhbPVbPWbwbbPYbPYbSMbSObSNbSQbSPbSSbSRbSSbSVbMVbQfbSWbOObQhbTgbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaTDaaaaaaaaabhObhObhObhObhObhObhObhObhObhOaaaaaabnObpwbeQbnQbgrbpLbpBbpMbnTbpPbpNbjpbpSbnlbnYbnZbnwbbZbbZbbZbbZbbZbbZboabobbocbodboebdPbdPbdPbdPbdPbdPbdPbWqbdPbdPbdPbogbdPbfmbqcbnSbgGbgGbgGbokblpblqaSzbqgbmGbombonbncbOIbvGbotbosbotaafbebboubovbowboxboybozbnfbebaafbedboBboCboDboEbiCbiGboFaJiboGboHaRpbXHboJbngboLboMbnkbPZboPboQboRboRboSboTboUboUboVbolboXboYboZbpabpbbnnbPGbpdbpebpfbpgbphbpfbpibYfaVJbpjbpkbplbOJbpnbnybppbnCbnDbpqbqxbptboobqyblOaZzbqBbpxblOcgVboqbprbqGbpCbpDbnIbpEbpFbpGbnMaaaaaaaaaaacaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaabgnbgobgpbgqbdvbpHbpHbpHbpIbpHbpJaZVbpKbqKbgrbqQbjpbrkbrcbpQbpRbrvbrubrwbrwbrwbrxbkWbpUbkWbkWbkWbkWbpVbpWbpWbpXbpYbdPcfycfocfzbrybqdbqebqfbrCbqhbqibqjbqkbqkbrDbrIbgGbgGbqmbfmaMbblqbqnbqoaJubqqbqrbqrbxqborbrPbxsbotaafbebbebbebbebbshbebbebbebbebaafbedbqzboCbqAbsjbqCbqDbqEaJibqFaRqaRpaJibskbqHbqIbqJaJDbqLboPbqNboUboUboUboUboUboUbqObqPbslboYbqRbqSboNbnnbqUbqVbqWbsnbpgbphbpfbqXbYfaVJbpjbqYbqZbqZbrabrbbsobrdbrdbrdbrebrdbrfboObrhbribrjbsqbnIbrlbpCbrmbrnbpCbrobnIbrqbpFbrrbnMaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaaaaaabrsbrtbsvbsBcaLbsHbsHbthbrzbrAbgrbtkbtlcaMbpTbjpbjpbjpbajbrEbrFbrGbrHbrGbrGbrGbrHbrGbajbajbdPbdPbdPbtBbdPbrJbrJbrJbrJbrJbrJbqfbrKbrLbrMbrNbrObtIbrQbrRbrSbrTbrUbrVbrWbrXbrYbrZaHBbsbbqvbsabYZcanbotbosbotaafbsibZibtKbtTbsmbtXbtKcaJbsiaafbedbspbuibspbedbedbedbujaJibssaRqaRpbXHboJbngbstbsubuobqLbswbqNbupbtmbuGbuAbuNbsCbqObsDbnibwDbsFbwKbxhbnncdtbqVbpebpfbpgbphbpfbpibYfaVJbpjbsJbsKbsLbsMbplbsNcgZbsPbsQbsRbsSbsTbsUbrhbsVbsWbsXbnIbsYbsZbtabsrbtccflbnIbrqbpFbtebnMaaaaaaaaaaaaaaaaaaaaaaaaaIuaIuaIuaIuaIuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaaaaaaaaaaaaaaaaaaaTDaTDaTDaTDaTDaaaaacaaaaaaaaaaaaaaaaaaaaabrsbtfbtgbuYbtibtibtibtjbtibtibgrbvabuZboAbvjbjpaaaaaaaaaaafaafbtnbtnbtnbtnbtnbtnbtnaaaaaabtobtpbtqbtrbtsbrJbrJbrJbrJbrJbrJbttbtubvqbtwbtxbtybtzbtAbfmbfmbvCbfmbfmbtCbtDbtEbtFbmGbtHbmGbmGbmGbmGbmGbvEbmGaafbtJbvFbtLbtMbtNbtMbtLbvIbtPaafbspbtQbtRbtSbvObtUbspbtVaJlbtWbbmbvZaJibtYbohbtZbuabwcbucbudbuebufbwgbzrbzcbwnbukbulbumbnibnnbunbpubzybnnbuqburbusbutbuubuubuvbuwbYfaXqbpjbwxbplbplbsMbuybuzcgYbpvbuCbuDbuEbuFbVybrhbuHbuIbuJbnIbuKbuLbuMbsrbpCbVebnIbpEbpFbUAbnMaaaaaaaaaaaacHOaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabeObSwbxmbuVbpHbuWbgnbgobuXbuWbgrbxpbjpbxvbvbbjpaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaabvcbvdbrJbvebvfbvfbvfbvfbvfbvgbvhbvfbvibxzbvkbvlbvmbSlbSrbfmbvpbgGbxDbpzbvsbvtbvubvvbmGbmGbmGbRcbQMbvzbvAbvBbvwaafbpObRpbvHbvJbvKbvMbvNbRybpOaafbspbqMbvQbxnbedbvRbspbvSaJlbvTbcLbvUaJibvVbvWbvXbTTbxObucbyobxTbyKbwdbwebwebwfbyMcdWcdVbUqbwkbTWbwmbwkbwkbwkbwkbyQbwkbwkaXKaXKaXKaXKaVJbpjbsJbsKbsLbwobwpbwqbwrbwsbwsbwsbsSbwtbTsbwvbwwbyUbwybnIbwzbwAbwBbtbbpCbSEbnIbwEbwFbnMbnMaaaaaaaaaaaaaafbuPbuQbuRbuQbuRbuQbuSaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbwMbwNbwObwPbrJbwQbrJbwRbwRbwRbwSbwTbrKbrJbrJbrLbwUbwVbwWbwXbrpbCkbxabgGbgGbugbxcbvtbvubxdbxebxfbEYbzHbxibxjbxkbxlbvwaafbxrbzNbzJbzObyLbxobzPbzVbxraafbspbqwbAebuBbedbAibspbtVaJlbxwbcLaRpaJibDDbxybAobxAbxBbxCbAtbxEbxCbxFbxGbDIbxFbwkbAxbxJbwkbwkbxKbxLbxMbxNbAAbxPbxQbxRbxSaXKbaybvraXKaVJbpjbxXbqZbqZbxYbxZbppbDQbwsbwsbwsbsSbwtbEFbwwbvDbUabTQbwwbESbFbbEZbwbbpCbFybnIbrqbykbnMaaaaaaaaaaaaaaaaafbwGbwHbrgcLebwJbFUbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbAFbypbAFbyqbyrbwQbrJbrJbrJbysbrJbwTbrKbytbdPbdPbyubgGbrNbwXbyvbywbyxbyybyybyzbyAbyBbyCbyDbvsbyEbvPbyGbxkbyHbyIbyJbvwaafbxrbxrbxrbxrbALbxrbxrbxrbxraafbyNbyNbyNbyNbyNbyNbyNbAVaJibyPblMblNaJibCnbyRbyRbySbyTbxCbAXbyVbyWbCobyYbyZbzabwmbzbbBqbzdbzebzfbzgbzgbzhbzibzgbzjbzkbckbaAbwubclbBsbcnbCQbzsbztbzubzvbzwbppbCXbpqbpqbDBbsSbwtbCLbzAbzBbzCbzDbzAbzEbzFbzGbwCbzIbwwbwwbBxbnMbnMbzKbzLbzLbzLbzMbCJbylbymbrgbwJbrgbynbuRaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaacaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbzRbrJbwQbrJbzSbzSbzSbzSbwTbrKbzTbzUbdPcfxbgGbrNbBJbzWbzXbzYbgGblnbgGbzZbAabAbbAcbAdbyEbwIbAfbxkbxkbxkbAgbvwbAhbAhbBKbAhbBRbBQbBSbAjbBUbAjbAjbyNbCcbCdbAmbAnbBXbApbAqaJibAraRqaRpaJibAlbAsbAubAvbAwbBtbAybAzbBabABbACbADbAEbBEbAGbAHbAIbAJbAKbAIbxtbAMbANbAObnvblUbsdbBGbsgbsfbaAbPObpjbxubxUbAYbAZbAZbppbAkbBbbBcbppbBdbBebBfbBgbBhbyibKebBibYrbYrbBjbBkbBobTHbCrbBrbCwbCAbTIbBvbCEbCIbCHbCKbwGbwJbrgbwJbwJbBNbwGaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBCbwNbBDbCYbrJbwQbrJbrJbrJbrJbrJbwTbrKbzTbBFbdPbLpbgGbBHbBIbgGbCZbgFbgGbgGbyjbvsbvtbAbbAcbAdbyEbvwbBLbBMbLrbBMbBObvwbDbbDabDdbDcbDfbDebDhbDgbDjbDibBVbyNbBWbzmbBYbBZbCabCabCbbDwbAraRqaRpaJibzxbCebCebySbCfbxCbCgbChbxCbCibCjbCjbyObwkbClbCmbwkbwkbwkbwkbwkbwkbyXbwkbwkbwmbDKaXKaXKaXKaXKbDYbpjbwwbzAbzAbzAbzAbzAbzAbzAbzAbzAbzIbEibCsbCtbBhbWXbCvbEjbCxbCxbCxbCybCzbEkbCBbCCbCDbEpbTGbCGbErbCGbEsbEubBzbuQbuRbEwbuRbuQbBBaafaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbBAbzQbBAbCMbCNbCObrJbrJbrJbCNbrJbwTbrKbzTbCPbdPbLHbgGbrNbwXbgGbqlbCRbgGbgGbECbxcbvtbAbbCTbxcbCUbvwbCVbEKbMIbAWbxlbvwbEMbELbERbAhbEUbEUbEUbAjbEWbEVbEXbyNbDkbDlbDlbDmbDnbDobDpaJibDqbDrbDsaJibDtbMMbDvbMpbDxbDybDzbDAbyWbLWbFabCjbMybwmbDEbDFbwmbDGbDHbNsbDJbFobDLbDMbCpbDNbDObBTbNtbDRbCpbVLbVMbDUbVAbDWbDXbDXbFrbDZbEabEbbEcbEdbEebEfbBmbBlbBnbCvbFVbFFbGfbwwbwwbwwbwwbwwbGhbGgbEnbzKbzMbCJbEobGibCJbzKbzLbzMbGjbCJbGkaafcHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGubExbGubEybEzbEAbEAbEAbEAbEAbEBbGAbEDbzTbEEbdPbNzbEGbEHbEIbEJbGDbGCbGWbGEbGvbtCbENbAbbEObEPbyEbvwbEQbHabOxbBMbETbvwbBPbHibHjbAhaaaaaaaaabAjbHmbHlbFcbyNbFdbFebFfbFgbDnbDobFhaJibxwaRqaRpbHMbFjbFkbFlbFmbFnbHNbFpbFqbxCbxFbxFbIZbxFbwkbFsbFtbFubFvbFwbFxbDJbIYbDLbFzbFAbFBbDObFCbFDbFEbHPbVlbDXbHQbVAbFJbDXbDXbFKbFLbFMbFLbFLbFNbFObFPbBwbFRbFSbCvbHRbJrbJabFWbFXbFYbFZbGabGbbGcbGdaafaafbCJbGebHUbHUbHVbIfbHZbIobEvaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnbGlbGmbGnbdPbdPbGobwNbwNbwNbGpbdPbdPbGqbGrbGsbdPbGtbGtbGtbITbGtbGvbGwbGxbGybGzbtCbvtbAbbIAbGBbtCbtGbtGbtGbtGbtGbIBbtGbtGbtGbEgbtGbtGbtGbtGbtGbEhbtGbtGbtGbtGbtGbtGbtGaJiaJiaJiaJibxwaRqaRpbHMbJqbFkbCSbGGbCWbGIbGJbGKbGLbGMbGNbCjbGObGPbGQbGRbGSbGTbGUbGVbIDbGXbGYbGZbJDbHbbHcbHdbHecLVbCpbUSbUfbwwbwwbwwbwwbwwbJVbwwbwwbwwbzAbKfbzAbzAbFQbBhbCubCvbHRbIvbKzbHnbHobHpbHqbGabGbbGcbHraaaaaabCJbHsbHtbEobCIbBybKBbKUbCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaafaaaaaaaaabHuaafaaaaaaaaaaaabGtbIubHwbHxbHybGvbHzbKVbHBbHCbtCbvtbAbbAcbAabHDbHEbHFbHGbHHbHIbHJbHKbHLbLabLxbLnbLzbAabAabLIbMhbLYbAabHTbAabzZbHHbKJbHWbHXbHYbMibxwaRqbDsaJlbDtbDubDtbDCbDPbxCbIbbIcbIdbIebMlbIgbIhbIibIjbIkbwmbIlbImbInbDJbDTbElbIpbIqcLUbFDbIsbItbHObCpbHSbIwbIxbIybUdbLybMqbICbJWbUcbIFbIGbIHbIIbIJbzAbIKbCubCvbMHbMFbINbIObIPbIQbHvbGabGbbISbEnbEnbEnbCJbCJbCJbMSbMPbCJbCJbBybCJaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaabMZaaaaaaaaaaaaaaaaaaaaaaaaaaabGtbuObEmbIVbIWbNdbPebPKbPEbNfbtCbvtbJcbJdbJebJebJfbJgbJhbJibJjbJgbJfbJebJebNkbJkbJlbNqbJnbJobNBbJebJebJpbJgbJhbJibJjbJsbJtbJubJtbJvbJwbvUaJlbEtbEqbFHbGFbNLbGHbDzbHAbFibDVbxFbNQbCFbDSbDEbJGbwkbJHbJIbJJbDJbJKbJLbJMbJNbJObFDbJPbItbJObCpbJQbJRbIxbJSbJTbJUbNZbObbMCbJYbIFbJZbKabKbbKbbzAbKcbIMbHkbIUbIRbJbbIXbKgbKdbKkbGabGbbKlbEnbKmbOdbKnbEnaafaafaafaafaafaafaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbKpbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtnbtnbtnbtnbtnaaaaaaaaaaaaaaaaaaaaaaaabKvbKwbKxbKwbKyaaaaaaaaabGtbGtbOfbKAbIVbKAbOibKCbOnbKDbKEbtCbKFbvtbKGbKHbAabKIbAabzZbHHbKJbAabKKbKLbKMbKNbKObAcbAabKPbKQbHLbKRbHLbHLbKSbKTbODbOtbKWbKXbcLbKYaRpaRpaRpaJlbOEbFlbFnbOFbJmbOGbJybJxbFIbLgbLhbLibLjbHgbDEbIkbIabIzbHhbDJbDJbLobLobLobCpbPMbLqbQPbLsbLtbCpbLubLvbIxbLwbFGbLybOHbLAbLBbLCbIFbJCbLEbKbbKbbzAbRsbSLbCvbwwbLGbuTbuUbLJbKhbLLbGabLMbLNbLObLObLObLPbGdaaaaaaaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafbLQbLRbLSbLRbKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbsObLXbtdbLVbLZbMabMbbGtbMcbMdbMebMfbMgbOLbOKbMjbMjbMkbtCbtCbtCbOMbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbtCbMmbMnbMobtCbtCbtCbtCbtCbONbtCbtCbtCaJlaJlbOQaJlaKSaMpbMraJlbKZbJXbORbGFbLdbxCbDzbLDbxCbtvbMzbMAbMBbwkbOTbMDbMEbOUbMGbPubVzbMJbMKbMLbItbJObFDbFDbVVbJObCpbMNbMObMObMObMObMObMObMObMObMObMObPvbMQbMRbMRbzAbPAbKibMUbwwbMVbMVbMVbMWbKjbMYbMVbMVbMVbMVbMVbMVbNabNbaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymaymbPCbLRbLRbNebKtbKtbLTbLTbPDbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbNgbMsbNgbKxbNibNjbPFbNlbNmbNnbKAbNobNpbGvbPHbNrbubbtObGvbNubNvbNwbNxaaaaaaaaaaaabNybuhbNAbPSbNDbNCbNEbNFbNGbNHbNIbNFbNJbNKbPXbNMbNNbNObNPbqsbNRbNSbNTbNUbNUbNUbNUbDtbDtbDtbDtbMtbMtbxCbQabOabQbbMzbMvbMubOebQcbOgbOhbQdbOjbMxbMwbOmbNhbMKbOobFDbFDbNVbJObJObOobCpbMNbMObOqbOrbOsbQebOubOvbOwbWIbMObOybOzbOAbOAbzAbOBbLFbCvbzIbQgbQpbQjbQBbLKbRdbQXbRvbRebRxbVFbMVbuxbEnbOObOObOObOObOOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabLVbNgbNgbNgbRAbRzbKAbOSbRDbRBbKAbRFbOVbOWbGvbGvbGvbGvbGvbGvbOXbOYbOZbPaaaabPbbPcbPcbPdbvYbPfbPgbPhbPfbPibNFbPjbPkbPlbNFbPmbNXbPobPpbPqbPrbPsbPtbPtbNSbRWbRJbPwbPxbPybDtbNYbLbbScbGFbGFbSgbDzbSibxCbSnbwZbwYbwlbwkbSubPIbwkbOkcbdbXnbOlbPNbMKbCpbCpbCpbCpbCpbCpbCpbCpbPObMObPPbQYbPRbOsbOsbOsbOsbwjbMObPTbLEbPUbPUbzAbBhbSLbCvbMXbMTbMTbOcbPVbOCbSQbSPbSSbSRbSSbSVbMVbQfbSWbOObQhbTgbOpbQkaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKsbKtbQlbQmbQmbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabKxbMsbMsbMsbKxbQnbQobTAbQqbQrbKAbKAbQsbQtbTObQvbQvbQvbQvbQvbQvbQwbQxbQyaaabQzbQAbUbbQCbxbbPfbQEbQGbQFbPfbNFbQIbQJbQKbNFcbQcbkbQNbQOcdpbQQbQRbPtbQSbPxbQTbNUbPxbPxbQUbDtbPnbGFbQVbUkbGFbPzbDzbLebRCbQZbPBbUobyhbRGbDEbIkbSpbOkbXnbXnbOlbRfbMKbRgbRhbygbRjbRkbRlbybbRnbPObMObOsbOsbRobOsbOsbOsbOsbyabMObRqbLEbRrbRrbzAbRsbRtbRubyfbRwbUGbUwbUPbUObUWbURbVkbVjbVvbVmbxIbREbVGbxHbRHbRIbQibRKaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbKtbRLbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLbwLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabLVbRMbRNbRObLVbRPbMabMbbGtbGtbRQbRQbRQbGtbGtbNxbRRbRRbRSbRSbRSbRSbNwbQyaaabRTbRUbRVbVObRXbRYbRZbSabSbbSbbWgbSdbSebWibNFbPtbPtbPtbPtbPtbWkbPtbPtbShbWobSjbNUbPxbSkbvnbDtbQHbLbbQVbSmbWMbPzbSobJAbJBbSqbRabSsbStbJzbFsbSvbIEbSxbRibRbbSAbSBbMKbRmbSDbWVbRjbSfbSGbXabRnbPObMObMObMObRobOsbOsbOsbMObMObMObSIbSJbRrbRrbzAbSKbSLbCvbzIbXcbXfbXebSQbXibXqbXpbXvbXubYabXxbMVbQfbYobOObSXbSYbSybTaaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbKtbLTbLTbLTbLTbLTbLTbTbbLTbTcbLTbLTbLTbLTbLTbKtbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTdbKwbTebKwbTfbYtaafaaaaaabGtbThbTibTjbGtaaabNxbTkbTlbTmbTnbTnbTnbTobQyaaabQzbTpbTqbTrbvobPfbTtbTvbTubTwbNFbSzbTybTzbYwbTBbTBbTBbTCbTCbTDbTEbULbPxbPxbTFbNUbNUbNUbNUbDtbDtbLfbLkbLcbDtbTJbTKbTLbJFbJEbTJbQbbLlbLmbTRbTSbTJbMKbMKbMKbMKbMKbMKbvLbTUbTVbRjbvybTXbTYbRnbPObMObTZbQWbPQbYHbYzbNWbNcbTZbUgbUhbUibIIbIJbzAbIKbSLbUjbwwbMVbMVbYMbYSbMVbMVbMVbMVbYYbSCbVFbMVbvxbUnbOObUpbZbbUrbOOaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaabKtbUsbUsbUsbUsbUsbUsbUtbLTbUubUsbTcbLTbLTbLTbLTbKtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7534,9 +7538,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcbbceccebcblcedceicefcbpcbobYIcelcbsbYIbYIcercbucbvcbwcbxceucbqbXzbXybYecbzbsIbWJbWJcbBcbCbWJcexbSUcbFcbGcaqcbHcaqbTFcbIcbIcbIcbIcbIcbIcbIbTJceCcbEbTJcbKcbMcbNceHcaEcbPceIceKcaIbZxbWQcbRbZycbScbTbZAcbUcbVcfebZAccqbYfbYbbYdbYcbYiccsccAbYccepbYkbYlcktbZDbZwbZFcktcfjbZGccCccBcfkccDccPccFcfscfmcfGcfucfmcfIcfMcfLcfRccwccxccycczbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaaaaaabOPbKtbPCbKtbKtbLTbLTbLTbLTbLTbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafccRccRcebccTcfZceiccUccWccVbYIcgeccHccIcgfccKccLcgmccNccOcgoccXcdaccZcdecdbbqTcdycdQcdFcekceecembsccdccddaJEcdfcaqbTFcbIcdgcdhcdicgOcdkcdlcgRcdncdocgWcdqcdrcdsbqtcaEcducdvcdwcaIbZxbWQcenbZycdxbqbbZAcdzcdAbqabZAcaPbYfbYfcaQbYccbYcbXcbZbYcchBccacjfcdLcdLbyFbBucdLcdOcdPceqcdRcdOcdSbBpbyebydcdScdScdScdScgXbyebydcdScdSbXjcdXbpZbpAceachabpybpsbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycbycchicegcegcehbKtbKtbLTbLTchnbLTbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejcejcejcejcetcesbYIbYIbYIbYIbYIchpchuchqchqchqchzcewbXzbXybYeceybYjceEceTceSceWceUceXbSUcezaJFceYaJFcaqbTFcbIceDcfacfacfaceFceGbTJchPchLbTJcbKcbNceJceHcaEchSceLceMcaIbZxbWQceNbZyceOcePbZAbZAbZAbZAbZAccbceRbYfcaQbYcccdbszbYcbYcchBcifcjfcdLbsycfbcfbcfccdOcfdciycffcdOcfgcfhcfhcfhciCciLciKbsxciPcfnbsecfpcdScfqcfrciQbUnbUnbUnbUnaaaaafaaaaaaaaaaahaahaahaafaaaaaaaafaaaaaaaafaafaafcftcfBcfvbNebKsbKtbKtbLTbLUbLTbKtbKtaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcfwcfxcvbcvccwfcejcfDcfCcfFcfEcfHciVcjacjacfKcfJcfJcjlcjpcbqbXzbXybYecfNcaicfOcfQcfPcvtcwecggbSUaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcjtcgacfYcgbcgccgdcjvcaEcjCceLcgicaIcghccfcwEbZycgkcglbZycjIbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLckncgycgycgzcgActscgrcgpcgucgtcgGcgGcgGcgxcgIcgIcgJckocgLcgDcgMcdScgNcwDcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacgScgTcgTcgTcgUcsdcejcgHcgFckFcgKckQckNclgclfcluclpclCchcchfchechhchgchjclGbSUbSUbSUbSUbSUbSUbSUbSUcmgclVcaqcmkcaqbTFcbIcbIctpctqctrcbIcbIcsnchschtcfYcaEcaEcaEcaEcaEcaIchkchlcaIchwcsZchwbZyctGctbbZychAchBbVichCbVichDbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchIchJchJchKcmschMchochOcmwchQckLckLckLckLcuOctUckLcmGckLchEcCqcdSchZciachGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcmPchHcgEchNcmQchNcgEchRcmRchRcgEaaaaaaciicgTcgTcgUcgUcyScejchUchTchWchVcmXchXcidciccnecieciecigciecbqbXzcihbYecikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJcnfcngciMciXciOcnucnhciRciSciSciTciUcaIcaIcaIcnwcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjjcjkcivcjmcjncjociwcjocjocixcyVcyUcgIcnEcgIciWcyTcdScnFcjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcejcAWcCYcvbcvccwfcejcfDcfCcfFcfEcfHciVcjacjacfKcfJcfJcjlcjpcbqbXzbXybYecfNcaicfOcfQcfPcvtcwecggbSUaJFaJFcaqceBcaqbTFcbIcfVcfWcfWcfWcfXcbIcfYcjtcgacfYcgbcgccgdcjvcaEcjCceLcgicaIcghccfcwEbZycgkcglbZycjIbLvbVicgnccgcchbYfccjcciccicckcclcclcclcclccmcdLckncgycgycgzcgActscgrcgpcgucgtcgGcgGcgGcgxcgIcgIcgJckocgLcgDcgMcdScgNcwDcgPcgNaaaaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafcgQbKqbKqbKrbKsbKsbKtbKtbKtbKtbKuaafaafaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaaaaacgScATcgTcgTcgUcsdcejcgHcgFckFcgKckQckNclgclfcluclpclCchcchfchechhchgchjclGbSUbSUbSUbSUbSUbSUbSUbSUcmgclVcaqcmkcaqbTFcbIcbIctpctqctrcbIcbIcsnchschtcfYcaEcaEcaEcaEcaEcaIchkchlcaIchwcsZchwbZyctGctbbZychAchBbVichCbVichDbYfccobYfbYfccpcdCcdCcdCcdDbYfcdLchIchJchJchKcmschMchochOcmwchQckLckLckLckLcuOctUckLcmGckLchEcCqcdSchZciachGcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcmPchHcgEchNcmQchNcgEchRcmRchRcgEaaaaaaciicATcgTcgUcgUcyScejchUchTchWchVcmXchXcidciccnecieciecigciecbqbXzcihbYecikcimcilciocinciocipcirciqciqciAciAciAciAbTFciGciHciIciIciJcnfcngciMciXciOcnucnhciRciSciSciTciUcaIcaIcaIcnwcdEckqbZybZybZybZychBchBbViciYbViciZbYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcjgcisciucitcjjcjkcivcjmcjncjociwcjocjocixcyVcyUcgIcnEcgIciWcyTcdScnFcjwcjxcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEchHcjbchHcgEchNcjcchNcgEchRcjdchRcgEaaaaaaciicgTcgUcgUcgUcjBcnIcjhcjechWcjicnLcnKcnPcnNcjzcjycjDcjAcjEcbqbXzcjFchjcjGcnQcjHcjJcjJcjJcjKcjMcjLcjNcolcjOceAciAbTFciGcxnciIckbckccxecubcxJckgckhctQcxwckkcklciScywciUconcoqcxYcjQcjPcdHcyLcdIcdIcdJcdIcdKbVibVibVibVibYfccobYfaaaaaaaaaaaaaaaaaaaaacdLcorcjRcjTcjSckEcdOcotcdOckGckHcjXcjUcjUcjYcgIcgIckecjZcjUckickOcdSckPcwGckRcgNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacgEckrckuckscgEckzckBckAcgEckDckJckIcgEaaaaafciiclbcgTcgUcgUcgUcejckMckKchWchWcoAchWchWchWchWckTcieckWckYcbqclackZcldclccoBcleclhclhclhclicljcljclkciAcllcgqclwclxciGcDdciIclzclAclBcoCclDclEclFcoFclHclIclJciScDcciUcoJcoLclNclnclmclQclNclRclSclTbYfceQcdIcdIcdIcdIcdIcltbYfaaaaaaaaaaaaaaaaaaaaacdLcmacmbcmccmdcdOcmecmfcpdcdScmhcmicmicmiclvcpfcmlclPclOcmicmicmncdScmocDFcmqcmraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafcgEclXcmmcmjcgEcmtcmmcEgcgEcmtcmmcEgcgEaaaaafcmzcgTcgTcgUcgUcmAcejcmvcmucmxcpocprcmycmCcmCcmEcmDcmCcmFcyXcbqcmIcmHcmKcmJcimcmLcmLcmMcljcmNczJczeczeciAcibceVcCgcqgciGcClciIcnccndcpCciGcmSciNcmWcfYcpGcnicnjciScCOciUclLclMclNcnlcpHcnlclNaaaaaaaaabYfbYfbYfcnnclSclSclTbYfbYfaaaaaaaaaaaacdOcdOcdOcdOcdOcdOcdOcdOcdOcnocnpcnqcdScdScnrcnscntcdScdScdScdScpIcnscntcdScdScnvcpNcnvaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7545,14 +7549,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaaaaaaaaaaafcptcsDcpucpxcpwcpFcsLcsMcpzcsWcsQcpEcpDcsXcpFcpLcpJcsYcnTcevcnkceZcpTcpWcpVcpYcpXcqacpZcqccqbctccqdcticqfctkcqzcoTcqJcqKcnOcpacpacpacpacpacqMcpjcqPcqPcqPcpncpncpjbTFcrYciGcqhcqicqjcqkciGcqlciNcmOciUcqncqocqpcqqciUctmclLcpiclNctxcqQcquclNaaaaaaaaaaaaaaaaaacqvcqwcqxcqycqvaafaaaaaaaaaaaacdOcplcplcplcoictBcqBcqCctIcqEcqFcqGcqHcdOaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaaacmZaaaaafaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaafcqRcqYcqScqVcqUcpFcqXcpFcvWcqYcqXcpFcvWcqYcpFcpFcpFcpFcpFcqZcpFcpFcpFcrbctOcrdcrcctScpZcrfcrecrhcrgcrjcricrlcrkcoTcqJcrmcnOcrncpacpacrocpacrpcpjcrIcrKcrJcrKcrLcpjbTFcrqciGcrrcrscrtcructTcrwcrxcryctVcrAcrBcrCcrDciUcrEcrFcrGcrHcqvcuacqvcrHaaaaaaaafaaaaaaaaacqvcrRcrTcrScqvaafaafaaaaaaaaacdOcomcomcomcomcrMcppcrNcrNcrNcnpcrNcrOcdOaaaaaaaaaaaaaaacrPcrPcrPccMaafaafaafaafcnaaafaafaafaafaafaaqcrPcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafcptcpFcrccpFcrccpFcqXcpFcuecxacufcxaculcxacxacuycurcpFcpFcuLcuEcuEcuEcuYcuUcvkcvkcvlcpZcvncshcsjcnGcsmcskcvscnGcspcsocsrcsqcstcsscsvcsucpacswcpjcsxcrKcsycrKcficpjbTFcizciGcszcsAcsBcsCciGcfYcoacfYciUcsEcsFcsGcsHciUcsIcrGcrGcqvcsJcsNcvvcqvcqvcqvcqvcqvcqvcqvcqvctMctDctNcqvcqvcqvcrHaaaaaacdOcofcogcohcslcsRcqBcrNcrNcrNcnpcrNcsScdOaaaaaaaaaaaaaaacrPaaaaafaaaaafaaaaaaaaackxaaaaafaafaaaaaaaaaaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcvEcsVcsUcvGcufcxacvOcxacxacvXcvRcwmcwacwzctacwUcwHcwHcwWcrccrccthctgctjcwXcnzcnGcwYcnGcnGcnGcwZctlcsrctncttcnbcnbcnUcpacxdcpjcxocrKcsycrKcxpcpjctvctwciGciGcxqciGciGciGciBctzctAciUciUciUcxrciUciUcsIcrGaaacqvctCctZctEctFcnZctHcxsctJctKctLcqvcuVcxtcuVcqvcxFctPcqvaafaafcdOcplcplcplcxHcLZctRcuccnXcnVcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcvEcsTcsTcsTcvEcsTcsTcsTcsTcsTcxVcyacsTcybcsTcyccsTcsTcsTcuhcugcuicpvcpFcujcygcukcuncumcupcuocumcuqcuscyhcuucutcutcuvcutcuwcyicuxcuAcuzcuBcuBcpjcuCcuDcymcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFcypcuPcuNctFcpycuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcyrcuZcvicpBcpAcvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFcyucpFcyEcyzcvpcvocvrcvqcyFcvqcyHcvucvxcvwcvycvucvucvzcvAcqIcvBcpacvDcvCcpacpacyJcrKcrKcvFcuBcuBcpjbPxcAscvNcvNcvNcvNcyKcvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFcyRctFctFcobcvScvTcvUcvVcvHcvJcvIcvLcvKcyZcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicpgcoycvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaccMaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFczncpFcpFczncznczocpFcpFcvZcvYcwgcwgcwgcwgczqcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcwucrKcwvcwxcwwcpjczrcvMcvNcwIcwJcwKcwLcwMcwNcwOcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAczBcwCcwBcqWcqAcqtcwFcwTcwScwVczFcuWcuQcqmcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkczLcxmcqscdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcpFcpFcvWcpFcpFczXczVcAhctdctdcAhcAtcAhcxlcAvcAwctdcAAcAxcAHcADcAJcwkcoTcxucoTcxvcpQcpacpacxAcpacxBcpjcxCcxCcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcxRcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUcAUcxWcxXcpMcxZcuTcBkcuScxEcuTcBmcqvcqvcqvcqvaaaaaacdOcplcpmcplcBncLZcppcrNcrNcyecyfcrNcBqcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBsaaaaaacBsaaaaaaaaacBsaaaaaaaaaaaaaaacBsaaaaaaaaacBsaaaaaacBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFczmcrWcrWczpcxGcrWczpcrWcxIcBucuEcuEcBzcuEcBAcuEcuEcuYcBDczncpFcpFcyjcylcykcyncBEcyocpFcBHcyqcyscyscBIcytcoTcxucyvcnOchbcpacyxcpacBKcyycpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcyMcyNcxLcyOcxLcxNcyPcvNcyQcBLcrGaaaaaaaaaaaaaaaaaacqvcuVcBOctFctFchdcyAchmcyWctMctDctNcyBctMcvhcyYcqvaaaaaaaaaaaacdOcplcplcplckXcBRczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBscBscBscBsaaaaaaaaacBscBscBscBscBscBscBsaaaaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFcqXcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcyCcpFcvWcpFcpFcpFcyDczncpFcpFcBScAtctfcyGcwgcCccwgcwgcyqcCecyIcCfcytcoTcxucoTcnOcijchYchychvczfcpacnOczgchrchrczhcCicjqczNczOcvNcxNczPczQcxNczRczSczTcvNczUcCncrGaaaaaaaaaaaaaaaaaacqvczWcuMcCBcuVczYczZcAactFcAbcAccsPcyBczWczjcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczkcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczlcpFcqXcpFcCFcxacufcxacCJcxacufcxacCJcxacxccxacxbcCKctectdcCNctfczsczucztczwczvczxcwgczzczycwgcwgcwgcwgcwgczAcjscjrcjscnOcnOcnOcnOcnOcnOcnOcnOczDchrchrczEcANcAObPxcAPcvNcAQcARcCQcATcCYcAVcAWcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBeczHczGczIcBeczKcqvaafaafaaaaaaaaaaaabquaaacdOcBlcDmcDacBocBpcDmcDpcBrcBpcDmcDtcdOaaaaaaccMaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaafaaaaaacptcpFcrccpFcsOcsTcvEcsVcsUcvGcufcxacvOcxacxacvXcvRcwmcwacwzctacwUcwHcwHcwWcrccrccthctgctjcwXcnzcnGcwYcnGcnGcnGcwZctlcsrctncttbPWbQubPYcpacxdcpjcxocrKcsycrKcxpcpjctvctwciGciGcxqciGciGciGciBctzctAciUciUciUcxrciUciUcsIcrGaaacqvctCctZctEctFcnZctHcxsctJctKctLcqvcuVcxtcuVcqvcxFctPcqvaafaafcdOcplcplcplcxHcLZctRcuccnXcnVcudcrNctWcdOcdOcdOcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcsOcsTcsTcsTcvEcsTcsTcsTcvEcsTcsTcsTcsTcsTcxVcyacsTcybcsTcyccsTcsTcsTcuhcugcuicpvcpFcujcygcukcuncumcupcuocumcuqcuscyhcuucutcutcuvcutcuwcyicyMcuAcuzcuBcuBcpjcuCcuDcymcuFcuFcuGcuHcuIcuJcuJcuJcuJcuJcuJcuJcuJcuKcrFcrGaaactFcypcuPcuNctFcpycuRcuQcuQcvdcvacuQcuQcvhcuQcuVcuXcuQcqvaaaaaacdOcplcplcplcslcyrcuZcvicpBcpAcvjcrNcrNcvecvfcvgcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFcyucpFcyEcyzcvpcvocvrcvqcyFcvqcyHcvucvxcvwcvycvucvucvzcvAcqIcvBcpacvDcvCcpacpacyJcwOcwOcxCcuBcuBcpjbPxcAscvNcvNcvNcvNcyKcvNcvNcvNcvNclMcvPcrGcrGcrGcrGcrGcrGaaactFctFcyRctFctFcobcvScvTcvUcvVcvHcvJcvIcvLcvKcyZcwbcwccqvaaaaaacdOcomcomcomcomcwdcppcvicpgcoycvQcrNcrNcwhcrNcwicdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaafcrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaccMaaaaaaaaaaaacptcpFcpFcpFcpFcpFcqXcpFcpFcpFcqXcpFcpFcpFcpFcpFcvWcpFcpFctScpFczncpFcpFczncznczocpFcpFcvZcvYcwgcwgcwgcwgczqcwkcoTcwocwpcsqcwqcpacwscvCcpacwtcpjcAQcwOcARcwxcwwcpjczrcvMcvNczSczTcwKcwLcwMcwNczgcvNcwPcwQcrGaaaaaaaaaaaaaaaaaacqvcwRcwycwAczBcwCcwBcqWcqAcqtcwFcwTcwScwVczFcuWcuQcqmcqvaaaaaacdOcofcogcohckXcsRcuZcxgcxhcxhcxicxjcxkczLcxmcqscdOaaaaaacrPaaaaafaaaaafaafaafaaackxaaaaafaaaaafaaaaafaaacrPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaacptcpFcpFcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcpFcpFcvWcpFcpFczXczVcAhctdctdcAhcAtcAhcxlcAvcAwctdcAAcAxcAHcADcAJcwkcoTcxucoTcxvcpQcpacpacxAcpacxBcpjcyPcyPcxDcwxcwwcpjbPxcvMcvNcxKcxLcxMcxNcxOcxNcxPcvNcxQcxRcrGaaaaaaaaaaaaaaaaaacqvcxScxTcxUcAUcxWcxXcpMcxZcuTcBkcuScxEcuTcBmcqvcqvcqvcqvaaaaaacdOcplcpmcplcBncLZcppcrNcrNcyecyfcrNcBqcomcomcomcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBsaaaaaacBsaaaaaaaaacBsaaaaaaaaaaaaaaacBsaaaaaaaaacBsaaaaaacBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFczmcrWcrWczpcxGcrWczpcrWcxIcBucuEcuEcBzcuEcBAcuEcuEcuYcBDczncpFcpFcyjcylcykcyncBEcyocpFcBHcyqcyscyscBIcytcoTcxucyvcnOchbcpacyxcpacBKcyycpjcpjcpjcpjcpjcpjcpjbPxcvMcvNcnbcyNcxLcyOcxLcxNcnUcvNcyQcBLcrGaaaaaaaaaaaaaaaaaacqvcuVcBOctFctFchdcyAchmcyWctMctDctNcyBctMcvhcyYcqvaaaaaaaaaaaacdOcplcplcplckXcBRczacrNcrNcrNcyfcrNczbcrNczccrNczdaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBscBscBscBsaaaaaaaaacBscBscBscBscBscBscBsaaaaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafaaaaaaaaacptcpFcqXcpFcpFcpFczMcpFcpFcpFczMcpFcpFcpFcyCcpFcvWcpFcpFcpFcyDczncpFcpFcBScAtctfcyGcwgcCccwgcwgcyqcCecyIcCfcytcoTcxucoTcnOcijchYchychvczfcpacnOcsKchrchrczhcCicjqczNczOcvNctoczPczQcxNczRctuctycvNczUcCncrGaaaaaaaaaaaaaaaaaacqvczWcuMcCBcuVczYczZcAactFcAbcAccsPcyBczWczjcAecqvaaaaaaaaaaaackEcdOcAfcAgcAgczkcAicAjcAkcAlcAmcAncAocApcAqcokcAraaaaaacrPaafcwjcwjcwjcwjcwjaaackxaafcwjcwjcwjcwjcwjaaacrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaaaaaaczlcpFcqXcpFcCFcxacufcxacCJcxacufcxacCJcxacxccxacxbcCKctectdcCNctfczsczucztczwczvczxcwgczzczycwgcwgcwgcwgcwgczAcjscjrcjscnOcnOcnOcnOcnOcnOcnOcnOczDchrchrczEcANcAObPxcAPcvNcwucvFcCQcuxcwJcwIcwvcvNcAXcAYcrGaaaaaaaaaaaaaaaaaacqvcuQcAZcAectFcBacBbcBcctFcBdcBeczHczGczIcBeczKcqvaafaafaaaaaaaaaaaabquaaacdOcBlcDmcDacBocBpcDmcDpcBrcBpcDmcDtcdOaaaaaaccMaaaaafaaaaafaaaaafaaackxaaaaafaaaaafaafaafaafcrPaaacBscBscBscBsaaaaaacBscBscBscBscBscBscBscBscBsaaaaaacBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIvaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMaaaaaaaaaaaIaaaaaacAdcpFcqXcpFcDxcylcqXcpFcDNcylcqXcpFcAucylcpFcpFcDOcpFcDUcylcEccAzcAycABcEicErcACcAEcwgcEycAFcjucAIcAKcumcAMcALcumcAScumcBfcuocBgcBicBhcBhcBjckacBVcBWcBWcBXcBYcAObPxcBZcvNcvNcCacCbcFecCbcCacCdcvNcrGcFgcrGaaaaaaaaaaaaaaaaaacqvctFcFrcuVctFckdcChcFCctFcCjcCkcqycgvcBtcCkcCocrHaaaaaaaaaaaaaaaaaacgwaafcdOchFcFEclUcomclscFFclqcomclocFKclWcdOaaaaaacrPaaactXctXctXctXctXaafckxaafctXctXctXctXctXaafcrPaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaafaafaafaaIaafaafcAdcpFcFLcBycBxcFVcFUcBCcBBcGgcFWcBGcBFcGhcpFcBvcGocGucBJcBMcGvcnycnycnycnycnycnycnycnycGAcBNczAcBPcBQcoTcGEcoTcoTcxucoTcoTcGMcoTcBQcBTcCpcBUcCrcGOcHjcHacCPcHCcAObPwcCRcCScCTcCacAGcAVcBwcCacCtcCscCucHVcCXaaaaaaaaaaaaaaaaaacqvcCvctDcuQcIAcDbcuQckfckjcDeaafaaachxcCxcCwcCyaaaaaaaaaaacaaaaaaaaaaaaaaacdOcDhcplcplcomcDicplcplcomcDicplcplcdOaafaafcrPaafckVckSckSckSckSckyckxckwckvckvckvckvckUaafcrPaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcCzaaaaaaaaIaaaaaacCAcCCcIMcCEcCDcCGcIRcCHcCDcCGcIRcCHcCDcCGcCIcCIcITcCHcCDcCGcIZcnyaaacCMcCLcCVcCUcCZcCWcDjcDgcDkcDkcJhcDlcDocDncDqcJlcDncDqcDocDrckmcDscDrczAczAcAOcJAcJzcDPcDQcAObNUcDRcDScDTcCacCbcJBcCbcCacDvcDucDfaafaaaaaaaaaaaaaaaaaaaaacqvcCvcDVcDwckpckpcDwcsPcDYcqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacdOcDZcplcplcomcEacplcplcomcEacplcplcdOaaaaaacrPaafcwjcwjcwjcwjcwjaaackxaaacwjcwjcwjcwjcwjaaacrPaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -7563,9 +7567,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaIaafaafaaacgEcFscKTcFscgEcFucKUcFucgEcFwcKVcFwcgEaafcgEcFwcKWcFwcgEaafaafaafcFYcFXcGacFZcGccGbcGdcDEcDkcGecKXcGfcDJcGicGmcGkcKYcGncDJcGpcGrcGqcDraaacLacKZcLccLbcLWcLdcLfcGFcGGcGHbNUaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacqvcCmcqxcqxcqxcCocqvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPcrPcrPcrPcrPaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccMaaaaaacgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEcgEaaacGscgEcgEcgEcgEaaaaaaaaaaaacBNcBNcBNcBNcBNcLgcGtcGtcGtcGtcLhcGtcGwcGycGxcGycGzcGtcGtcgBcGtcGtcGtcLacKZcLkcLjcLmcLlcLnaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrPaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacGQcGRcGRcGRcGScGBcGDcGCcGIcLocGKcGJcgCcGLcLqcGNcGTcGPcGVcGUcGXcGWcGZcGYcHbcLrcGYcGtcLacKZcLtcLscLXcLucLvaafaaacGQcHccGQcHccGQcHcaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGBcHfcHecHhcHgcgVcHicHlcHkcHocHmcHscHrcHucHtcHucHucHucHvcHucHwcHxcGtcLxcKOcKOcKOcKOcKOcLyaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaabgaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGBcHfcHzcHBcHAcgYcHicHEcHDcHFcHbcHbcHbcHHcHGcHIcHbcHbcHDcHLcHJcHMcGtcGtcGtcHNaaaaaaaaaaaacHOaaacHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGBcHRcHQcHTcHScgZcHUcHXcHWcHZcHYcHYcHYcIbcIacIdcHYcHYcIecIgcIfcIicIhcIkcIjcImcIlcIlcIlcIlcIlcIlcIncIocIncIocIncHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHncjVcHpaaacHncjVcHpaaacHncjVcHpaafaafaaaaafaafaafaafaafcHqcGRcGRcGRcGScGBcHfcHecHhcHgbSMcHicHlcHkcHocHmcHscHrcHucHtcHucHucHucHvcHucHwcHxcGtcLxcKOcKOcKOcKOcKOcLyaafaafcHycHycHycHycHycHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaabgaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaacHncjWcHpaaacHncjWcHpaaacHncjWcHpaafaafaaaaafaaaaaacHKaafcGQcGRcGRcGRcGScGBcHfcHzcHBcHAbSNcHicHEcHDcHFcHbcHbcHbcHHcHGcHIcHbcHbcHDcHLcHJcHMcGtcGtcGtcHNaaaaaaaaaaaacHOaaacHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIaafcHncjWcHpaaacHncjWcHpaafcHncjWcHpaafaaaaaaaafaafcIcaaaaafcHqcGRcGRcGRcGScGBcHRcHQcHTcHSbSOcHUcHXcHWcHZcHYcHYcHYcIbcIacIdcHYcHYcIecIgcIfcIicIhcIkcIjcImcIlcIlcIlcIlcIlcIlcIncIocIncIocIncHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaaaaaaaaaaaaaafaafaaaaafaaaaaaaaaaaaaafcIpcIrcIqcItcIscIucGJcIvcHbcHbcHbcIxcIwcIzcIycIBcLBcIDcICcIFcIEcIHcIGcINcIIcImcIOcIPcIOcIPcIOcIPcIOcIPcIOcIPcIOcHyaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaamaaIaafaaacHncjWcHpaafcHncjWcHpaaacHncjWcHpaafaaaaaaaaaaaaaafaafcIJcIKcIKcIKcIKcILcILcILcILcILcLCcILcGtcIQcHbcHbcHbcLDcGtcLEcIScLFcGtcLGcJdcJicIfcJkcJjcLHcGtaaacHPcHPcHPcHPcJmcHPcHPcHPcHPcHPcHPcHPaafcHdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacBscBscBscBscBscBscBsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYctYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaaaaafaafczCaafaafaafczCaafaaaaafczCaafaaaaaaaaaaaaaaacIUcIVcIWcIXcIYcJncJacJbcJcciFcJecJfcJgcJecGtcLIcJocHbcHbcJrcJqcJtcJscJucJqcJwcJvcIgcIfcJycJxcJLcGtaafcHycHycHycHycHycHycHycHycHycHycHycHyaafaanaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm
index 9ba2de46e17..7f0a04754a1 100644
--- a/maps/exodus-5.dmm
+++ b/maps/exodus-5.dmm
@@ -766,10 +766,10 @@
"oL" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille/broken,/obj/item/weapon/material/shard{icon_state = "small"},/obj/item/stack/rods,/turf/simulated/floor/plating/airless,/area/outpost/abandoned)
"oM" = (/obj/machinery/light_construct/small,/obj/structure/table/rack,/obj/item/stack/material/steel{amount = 10},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"oN" = (/obj/structure/table/standard,/obj/item/weapon/paper/crumpled,/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/outpost/abandoned)
-"oO" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
+"oO" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a)
"oP" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
"oQ" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
-"oR" = (/obj/machinery/artifact_scanpad,/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b)
+"oR" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b)
"oS" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b)
"oT" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'MOVING PARTS'."; name = "\improper MOVING PARTS"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating{dir = 1; icon_state = "warnplatecorner"},/area/outpost/research/power)
"oU" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/outpost/research/power)
@@ -785,7 +785,7 @@
"pe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 4},/area/mine/explored)
"pf" = (/turf/simulated/wall/r_wall,/area/outpost/research/isolation_b)
"pg" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 2},/area/mine/explored)
-"ph" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/light,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
+"ph" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
"pi" = (/obj/structure/girder,/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/outpost/abandoned)
"pj" = (/obj/structure/window/reinforced,/obj/structure/lattice,/turf/space,/area/mine/explored)
"pk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/outpost/research/eva)
@@ -1010,7 +1010,7 @@
"tv" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/outpost/engineering/hallway)
"tw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_inner"; locked = 1; name = "Engineering Dock Airlock"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/turf/simulated/floor/plating,/area/outpost/engineering/hallway)
"tx" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/space,/area/mine/explored)
-"ty" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell A"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_a)
+"ty" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_a)
"tz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "barber"},/area/outpost/engineering/meeting)
"tA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/outpost/engineering/hallway)
"tB" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating/airless{icon_state = "asteroidplating"},/area/mine/explored)
@@ -1037,7 +1037,7 @@
"tW" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 10},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"tX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"tY" = (/obj/machinery/light,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = -6; pixel_y = -28},/turf/simulated/floor,/area/outpost/engineering/hallway)
-"tZ" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell B"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_b)
+"tZ" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/bluegrid,/area/outpost/research/isolation_b)
"ua" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"ub" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"uc" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 1; tag_east_con = 0.79; tag_south = 1; tag_south_con = 0.21; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
@@ -1086,7 +1086,7 @@
"uT" = (/turf/simulated/wall,/area/outpost/engineering/storage)
"uU" = (/obj/machinery/floodlight,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
"uV" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting)
-"uW" = (/obj/machinery/camera/network/research_outpost{c_tag = "Research Outpost Isolation Cell C"; dir = 8},/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
+"uW" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/outpost/research/isolation_c)
"uX" = (/obj/structure/sign/science{desc = "A warning sign which reads 'ANOMALOUS MATERIALS'"; name = "\improper ANOMALOUS MATERIALS"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"uY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor,/area/outpost/engineering/hallway)
"uZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/outpost/engineering/storage)
@@ -1696,8 +1696,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrkNekkOhTkMcphKcreUekcrhOkJkJkKcradababababababababababababababababababababababababababababalalgygygyprgygygygygygygygygygyaeaaaaaaaaaaaaaeaeaekBkBkCkFkBkBkGlhkGkBkIeoowpBrVhGkpsekshukVkvkwkYkukzkAlckyknkmhuhththtababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababcrkPcrhTcpbVljeUekgocrkPcrcriWeUkJkKlkadababababababababababababababababababababababababababababallTpTgypUlTpQgygygygygygygygygytjaaaaaaaaaaaetjtjtjgygyqdqeqfkBmllglfkBlieogylrlAhGkSkTkTkUlUkWkXkUlVkZlalblXleldlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababcrkPcrcrcrcrcrcrcrcrcrkPcrpSbCeUbCkKpiadababababababababababababababababababababababababababababallTgygygylTpQgygygygygygygyqwqCpjsWsWsWsWsWsWpoqwqCgygygygygykBplpnsIkBpkgygygygyhGpApxpykUpwpupvkUptpqpslbpppEpDlbababmdabababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababcrkPkPkPkPkPkPkPkPkPkPkPcriWeUiFeUiEcradababababababababababababababababababababababababababababalgygygygyqMqNgygygygygygygygyrWqPqPqPqPqPqPqPqPrWgygygygygygykBtlrUkGkBpFrigygygypmpXkTkTkUpWpOtykUpRuStZlbpNpKuWlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoLcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyuXpBrSpCvcpcpeoVoVoVxVoUsyoZkUpboOoPkUoWoRoSlboQphpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLaaaaaaaaaaqLababababababababababababababcrkPkPkPkPkPkPkPkPkPkPkPcriWeUiFeUiEcradababababababababababababababababababababababababababababalgygygygyqMqNgygygygygygygygyrWqPqPqPqPqPqPqPqPrWgygygygygygykBtlrUkGkBpFrigygygypmpXkTkTkUpWpOoOkUpRuSoRlbpNpKphlbababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLababababababababababababababababcrcrcrcrcrcrcrcrcrcrcrcrcrcrmjrOoLcrcradababababababababababababababababababababababababababababalgygygygygygygygygygygygygyqwqCrdrerererererereqwqCgygygygygyuXpBrSpCvcpcpeoVoVoVxVoUsyoZkUpbtyoPkUoWtZoSlboQuWpalbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcrkJkJeUcradadababababababababababababababababababababababababababababallTpTgygygygygygygygygygyaaaaaaaaaaaaaaaaalalalalalalalalgygygygygygypBpgpCgygyalhGhGhGhGkUkUkUkUkUpfpfpflblblblblbabababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababadadadcroJoDoJcradabababababababababababababababababababababababababababababallTgygygygygygygygygygygyaaaaaaaaaaaaaaaaalalalababababalalalalalalalgyjHgygyalalababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLqLabababababababababababababababababababababababababababababadadcroIrOmjcradabababababababababababababababababababababababababababababalalpVryoMgygygygygyalalalaaaaaaaaaaaaaaaaaaababababababababalalalalalgyjHgygyalabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/nano/images/nanomap_z1.png b/nano/images/nanomap_z1.png
index 079c4379b7f..ea35b7f06d1 100644
Binary files a/nano/images/nanomap_z1.png and b/nano/images/nanomap_z1.png differ
diff --git a/nano/templates/robot_control.tmpl b/nano/templates/robot_control.tmpl
new file mode 100644
index 00000000000..57bbebd490b
--- /dev/null
+++ b/nano/templates/robot_control.tmpl
@@ -0,0 +1,83 @@
+{{if !data.is_ai}}
+
+
+ Emergency Self-Destruct:
+
+
+ {{if data.safety}}
+ {{:helper.link('ARM', 'unlocked', {'arm' : 1})}}
+ {{:helper.link('DETONATE', 'radiation', {'nuke' : 1}, 'disabled')}}
+ {{else}}
+ {{:helper.link('DISARM', 'locked', {'arm' : 1})}}
+ {{:helper.link('DETONATE', 'radiation', {'nuke' : 1}, null, 'redButton')}}
+ {{/if}}
+
+
+
+{{/if}}
+{{for data.robots}}
+
+
+
{{:value.name}}
+ Information
+
+ Status:
+
+
+ {{:value.status}}
+
+
+ Master AI:
+
+
+ {{:value.master_ai}}
+
+
+ Module:
+
+
+ {{:value.module}}
+
+
+ {{if value.hackable}}
+
+ Safeties:
+
+
+ ENABLED
+
+ {{else value.hacked}}
+
+ Safeties:
+
+
+ DISABLED
+
+ {{/if}}
+ Power Cell
+ {{if value.cell}}
+
+ Rating :
+
+
+ {{:value.cell_capacity}}
+
+ {{:helper.displayBar(value.cell_percentage, 0, 100, (value.cell_percentage >= 50) ? 'good' : (value.cell_percentage >= 25) ? 'average' : 'bad')}}
+ {{:value.cell_percentage}} %
+ {{else}}
+ Not Installed
+ {{:helper.displayBar(100, 0, 100, 'bad')}}
+ N/A %
+ {{/if}}
+ Actions
+ {{if value.status == "Operational"}}
+ {{:helper.link('Lockdown', 'locked', {'lockdown' : value.name})}}
+ {{else}}
+ {{:helper.link('Unlock', 'unlocked', {'lockdown' : value.name})}}
+ {{/if}}
+ {{:helper.link('Self-Destruct', 'radiation', {'detonate' : value.name}, null, 'redButton')}}
+ {{if value.hackable}}
+ {{:helper.link('Hack', 'calculator', {'hack' : value.name}, null, 'redButton')}}
+ {{/if}}
+
+{{/for}}
\ No newline at end of file
diff --git a/nano/templates/supermatter_crystal.tmpl b/nano/templates/supermatter_crystal.tmpl
new file mode 100644
index 00000000000..b06aaae7466
--- /dev/null
+++ b/nano/templates/supermatter_crystal.tmpl
@@ -0,0 +1,25 @@
+{{if data.detonating}}
+
+
CRYSTAL DELAMINATING
+
Evacuate area immediately
+
+
+{{else}}
+ Crystal Integrity
+ {{:helper.displayBar(data.integrity_percentage, 0, 100, (data.integrity_percentage >= 90) ? 'good' : (data.integrity_percentage >= 25) ? 'average' : 'bad')}}
+ {{:data.integrity_percentage}} %
+ Environment
+
+ Temperature:
+
+
+ {{:helper.displayBar(data.ambient_temp, 0, 10000, (data.ambient_temp >= 5000) ? 'bad' : (data.ambient_temp >= 4000) ? 'average' : 'good')}}
+ {{:data.ambient_temp}} K
+
+
+ Pressure:
+
+
+ {{:data.ambient_pressure}} kPa
+
+{{/if}}
\ No newline at end of file