diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
index c0cf15616f..66468a516c 100644
--- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm
@@ -164,7 +164,7 @@
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
+ radio_connection = radio_controller.add_object(src, frequency, radio_filter = RADIO_ATMOSIA)
/obj/machinery/atmospherics/binary/dp_vent_pump/proc/broadcast_status()
if(!radio_connection)
@@ -185,7 +185,7 @@
"external" = external_pressure_bound,
"sigtype" = "status"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
return 1
diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm
index feb1b5cb93..8710623dfd 100644
--- a/code/ATMOSPHERICS/components/omni_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm
@@ -1,11 +1,11 @@
//--------------------------------------------
// Gas filter - omni variant
//--------------------------------------------
-/obj/machinery/atmospherics/omni/filter
+/obj/machinery/atmospherics/omni/atmos_filter
name = "omni gas filter"
icon_state = "map_filter"
- var/list/filters = new()
+ var/list/atmos_filters = new()
var/datum/omni_port/input
var/datum/omni_port/output
@@ -18,27 +18,27 @@
var/list/filtering_outputs = list() //maps gasids to gas_mixtures
-/obj/machinery/atmospherics/omni/filter/New()
+/obj/machinery/atmospherics/omni/atmos_filter/New()
..()
rebuild_filtering_list()
for(var/datum/omni_port/P in ports)
P.air.volume = ATMOS_DEFAULT_VOLUME_FILTER
-/obj/machinery/atmospherics/omni/filter/Destroy()
+/obj/machinery/atmospherics/omni/atmos_filter/Destroy()
input = null
output = null
- filters.Cut()
+ atmos_filters.Cut()
return ..()
-/obj/machinery/atmospherics/omni/filter/sort_ports()
+/obj/machinery/atmospherics/omni/atmos_filter/sort_ports()
for(var/datum/omni_port/P in ports)
if(P.update)
if(output == P)
output = null
if(input == P)
input = null
- if(filters.Find(P))
- filters -= P
+ if(atmos_filters.Find(P))
+ atmos_filters -= P
P.air.volume = 200
switch(P.mode)
@@ -47,17 +47,17 @@
if(ATM_OUTPUT)
output = P
if(ATM_O2 to ATM_N2O)
- filters += P
+ atmos_filters += P
-/obj/machinery/atmospherics/omni/filter/error_check()
- if(!input || !output || !filters)
+/obj/machinery/atmospherics/omni/atmos_filter/error_check()
+ if(!input || !output || !atmos_filters)
return 1
- if(filters.len < 1) //requires at least 1 filter ~otherwise why are you using a filter?
+ if(atmos_filters.len < 1) //requires at least 1 atmos_filter ~otherwise why are you using a filter?
return 1
return 0
-/obj/machinery/atmospherics/omni/filter/process()
+/obj/machinery/atmospherics/omni/atmos_filter/process()
if(!..())
return 0
@@ -79,13 +79,13 @@
input.network.update = 1
if(output.network)
output.network.update = 1
- for(var/datum/omni_port/P in filters)
+ for(var/datum/omni_port/P in atmos_filters)
if(P.network)
P.network.update = 1
return 1
-/obj/machinery/atmospherics/omni/filter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/machinery/atmospherics/omni/atmos_filter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
usr.set_machine(src)
var/list/data = new()
@@ -100,7 +100,7 @@
ui.open()
-/obj/machinery/atmospherics/omni/filter/proc/build_uidata()
+/obj/machinery/atmospherics/omni/atmos_filter/proc/build_uidata()
var/list/data = new()
data["power"] = use_power
@@ -113,22 +113,22 @@
var/input = 0
var/output = 0
- var/filter = 1
+ var/atmo_filter = 1
var/f_type = null
switch(P.mode)
if(ATM_INPUT)
input = 1
- filter = 0
+ atmo_filter = 0
if(ATM_OUTPUT)
output = 1
- filter = 0
+ atmo_filter = 0
if(ATM_O2 to ATM_N2O)
f_type = mode_send_switch(P.mode)
portData[++portData.len] = list("dir" = dir_name(P.dir, capitalize = 1), \
"input" = input, \
"output" = output, \
- "filter" = filter, \
+ "atmo_filter" = atmo_filter, \
"f_type" = f_type)
if(portData.len)
@@ -139,7 +139,7 @@
return data
-/obj/machinery/atmospherics/omni/filter/proc/mode_send_switch(var/mode = ATM_NONE)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/mode_send_switch(var/mode = ATM_NONE)
switch(mode)
if(ATM_O2)
return "Oxygen"
@@ -154,7 +154,7 @@
else
return null
-/obj/machinery/atmospherics/omni/filter/Topic(href, href_list)
+/obj/machinery/atmospherics/omni/atmos_filter/Topic(href, href_list)
if(..()) return 1
switch(href_list["command"])
if("power")
@@ -183,7 +183,7 @@
nanomanager.update_uis(src)
return
-/obj/machinery/atmospherics/omni/filter/proc/mode_return_switch(var/mode)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/mode_return_switch(var/mode)
switch(mode)
if("Oxygen")
return ATM_O2
@@ -204,7 +204,7 @@
else
return null
-/obj/machinery/atmospherics/omni/filter/proc/switch_filter(var/dir, var/mode)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/switch_filter(var/dir, var/mode)
//check they aren't trying to disable the input or output ~this can only happen if they hack the cached tmpl file
for(var/datum/omni_port/P in ports)
if(P.dir == dir)
@@ -213,7 +213,7 @@
switch_mode(dir, mode)
-/obj/machinery/atmospherics/omni/filter/proc/switch_mode(var/port, var/mode)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/switch_mode(var/port, var/mode)
if(mode == null || !port)
return
var/datum/omni_port/target_port = null
@@ -246,14 +246,14 @@
update_ports()
-/obj/machinery/atmospherics/omni/filter/proc/rebuild_filtering_list()
+/obj/machinery/atmospherics/omni/atmos_filter/proc/rebuild_filtering_list()
filtering_outputs.Cut()
for(var/datum/omni_port/P in ports)
var/gasid = mode_to_gasid(P.mode)
if(gasid)
filtering_outputs[gasid] = P.air
-/obj/machinery/atmospherics/omni/filter/proc/handle_port_change(var/datum/omni_port/P)
+/obj/machinery/atmospherics/omni/atmos_filter/proc/handle_port_change(var/datum/omni_port/P)
switch(P.mode)
if(ATM_NONE)
initialize_directions &= ~P.dir
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index e8a66695ed..c2e1e34f2a 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -120,7 +120,7 @@
var/core_icon = null
if(istype(src, /obj/machinery/atmospherics/omni/mixer))
core_icon = "mixer"
- else if(istype(src, /obj/machinery/atmospherics/omni/filter))
+ else if(istype(src, /obj/machinery/atmospherics/omni/atmos_filter))
core_icon = "filter"
else
return
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 5bc9f8d20f..e9fe37f8a1 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -1,4 +1,4 @@
-/obj/machinery/atmospherics/trinary/filter
+/obj/machinery/atmospherics/trinary/atmos_filter
icon = 'icons/atmos/filter.dmi'
icon_state = "map"
density = 0
@@ -30,13 +30,13 @@
var/frequency = 0
var/datum/radio_frequency/radio_connection
-/obj/machinery/atmospherics/trinary/filter/proc/set_frequency(new_frequency)
+/obj/machinery/atmospherics/trinary/atmos_filter/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA)
-/obj/machinery/atmospherics/trinary/filter/New()
+/obj/machinery/atmospherics/trinary/atmos_filter/New()
..()
switch(filter_type)
if(0) //removing hydrocarbons
@@ -54,8 +54,8 @@
air2.volume = ATMOS_DEFAULT_VOLUME_FILTER
air3.volume = ATMOS_DEFAULT_VOLUME_FILTER
-/obj/machinery/atmospherics/trinary/filter/update_icon()
- if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
+/obj/machinery/atmospherics/trinary/atmos_filter/update_icon()
+ if(istype(src, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter))
icon_state = "m"
else
icon_state = ""
@@ -68,7 +68,7 @@
icon_state += "off"
use_power = 0
-/obj/machinery/atmospherics/trinary/filter/update_underlays()
+/obj/machinery/atmospherics/trinary/atmos_filter/update_underlays()
if(..())
underlays.Cut()
var/turf/T = get_turf(src)
@@ -77,23 +77,23 @@
add_underlay(T, node1, turn(dir, -180))
- if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter))
+ if(istype(src, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter))
add_underlay(T, node2, turn(dir, 90))
else
add_underlay(T, node2, turn(dir, -90))
add_underlay(T, node3, dir)
-/obj/machinery/atmospherics/trinary/filter/hide(var/i)
+/obj/machinery/atmospherics/trinary/atmos_filter/hide(var/i)
update_underlays()
-/obj/machinery/atmospherics/trinary/filter/power_change()
+/obj/machinery/atmospherics/trinary/atmos_filter/power_change()
var/old_stat = stat
..()
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/trinary/filter/process()
+/obj/machinery/atmospherics/trinary/atmos_filter/process()
..()
last_power_draw = 0
@@ -124,11 +124,11 @@
return 1
-/obj/machinery/atmospherics/trinary/filter/initialize()
+/obj/machinery/atmospherics/trinary/atmos_filter/initialize()
set_frequency(frequency)
..()
-/obj/machinery/atmospherics/trinary/filter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
+/obj/machinery/atmospherics/trinary/atmos_filter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if(!can_unwrench())
@@ -146,7 +146,7 @@
qdel(src)
-/obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE
+/obj/machinery/atmospherics/trinary/atmos_filter/attack_hand(user as mob) // -- TLE
if(..())
return
@@ -188,11 +188,11 @@
Flow rate: [round(last_flow_rate, 0.1)]L/s
"}
- user << browse("
[src.name] control[dat]", "window=atmo_filter")
- onclose(user, "atmo_filter")
+ user << browse("[src.name] control[dat]", "window=atmos_filter")
+ onclose(user, "atmos_filter")
return
-/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
+/obj/machinery/atmospherics/trinary/atmos_filter/Topic(href, href_list) // -- TLE
if(..())
return 1
usr.set_machine(src)
@@ -230,13 +230,13 @@
*/
return
-/obj/machinery/atmospherics/trinary/filter/m_filter
+/obj/machinery/atmospherics/trinary/atmos_filter/m_filter
icon_state = "mmap"
dir = SOUTH
initialize_directions = SOUTH|NORTH|EAST
-obj/machinery/atmospherics/trinary/filter/m_filter/init_dir()
+obj/machinery/atmospherics/trinary/atmos_filter/m_filter/init_dir()
switch(dir)
if(NORTH)
initialize_directions = WEST|NORTH|SOUTH
@@ -247,7 +247,7 @@ obj/machinery/atmospherics/trinary/filter/m_filter/init_dir()
if(WEST)
initialize_directions = WEST|SOUTH|EAST
-/obj/machinery/atmospherics/trinary/filter/m_filter/initialize()
+/obj/machinery/atmospherics/trinary/atmos_filter/m_filter/initialize()
set_frequency(frequency)
if(node1 && node2 && node3) return
diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 19e5615291..9ebf60632c 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -158,6 +158,7 @@
#define O_MOUTH "mouth"
#define O_EYES "eyes"
#define O_HEART "heart"
+#define O_CELL "cell"
#define O_LUNGS "lungs"
#define O_BRAIN "brain"
#define O_LIVER "liver"
diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index 88f4309e36..9082482ebe 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -7,6 +7,8 @@
#define NO_POISON 0x20 // Cannot not suffer toxloss.
#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it.
#define NO_HALLUCINATION 0x80 // Don't hallucinate, ever
+#define NO_BLOOD 0x100 // Never bleed, never show blood amount
+#define UNDEAD 0x200 // Various things that living things don't do, mostly for skeletons
// unused: 0x8000 - higher than this will overflow
// Species spawn flags
diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm
index 8ac42dc0b9..eb1ef73eb7 100644
--- a/code/_helpers/mobs.dm
+++ b/code/_helpers/mobs.dm
@@ -24,6 +24,15 @@
return mobs
+/proc/mobs_in_xray_view(var/range, var/source)
+ var/list/mobs = list()
+ for(var/atom/movable/AM in orange(range, source))
+ var/M = AM.get_mob()
+ if(M)
+ mobs += M
+
+ return mobs
+
proc/random_hair_style(gender, species = "Human")
var/h_style = "Bald"
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index ef83e95f77..4b56d94f0d 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -5,13 +5,13 @@
Note that walkie-talkie, intercoms and headsets handle transmission using nonstandard way.
procs:
- add_object(obj/device as obj, var/new_frequency as num, var/filter as text|null = null)
+ add_object(obj/device as obj, var/new_frequency as num, var/radio_filter as text|null = null)
Adds listening object.
parameters:
device - device receiving signals, must have proc receive_signal (see description below).
one device may listen several frequencies, but not same frequency twice.
new_frequency - see possibly frequencies below;
- filter - thing for optimization. Optional, but recommended.
+ radio_filter - thing for optimization. Optional, but recommended.
All filters should be consolidated in this file, see defines later.
Device without listening filter will receive all signals (on specified frequency).
Device with filter will receive any signals sent without filter.
@@ -30,12 +30,12 @@
radio_frequency is a global object maintaining list of devices that listening specific frequency.
procs:
- post_signal(obj/source as obj|null, datum/signal/signal, var/filter as text|null = null, var/range as num|null = null)
+ post_signal(obj/source as obj|null, datum/signal/signal, var/radio_filter as text|null = null, var/range as num|null = null)
Sends signal to all devices that wants such signal.
parameters:
source - object, emitted signal. Usually, devices will not receive their own signals.
signal - see description below.
- filter - described above.
+ radio_filter - described above.
range - radius of regular byond's square circle on that z-level. null means everywhere, on all z-levels.
obj/proc/receive_signal(datum/signal/signal, var/receive_method as num, var/receive_param)
@@ -220,7 +220,7 @@ var/global/datum/controller/radio/radio_controller
/datum/controller/radio
var/list/datum/radio_frequency/frequencies = list()
-/datum/controller/radio/proc/add_object(obj/device as obj, var/new_frequency as num, var/filter = null as text|null)
+/datum/controller/radio/proc/add_object(obj/device as obj, var/new_frequency as num, var/radio_filter = null as text|null)
var/f_text = num2text(new_frequency)
var/datum/radio_frequency/frequency = frequencies[f_text]
@@ -229,7 +229,7 @@ var/global/datum/controller/radio/radio_controller
frequency.frequency = new_frequency
frequencies[f_text] = frequency
- frequency.add_listener(device, filter)
+ frequency.add_listener(device, radio_filter)
return frequency
/datum/controller/radio/proc/remove_object(obj/device, old_frequency)
@@ -260,15 +260,15 @@ var/global/datum/controller/radio/radio_controller
var/frequency as num
var/list/list/obj/devices = list()
-/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/filter = null as text|null, var/range = null as num|null)
+/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, var/radio_filter = null as text|null, var/range = null as num|null)
var/turf/start_point
if(range)
start_point = get_turf(source)
if(!start_point)
qdel(signal)
return 0
- if (filter)
- send_to_filter(source, signal, filter, start_point, range)
+ if (radio_filter)
+ send_to_filter(source, signal, radio_filter, start_point, range)
send_to_filter(source, signal, RADIO_DEFAULT, start_point, range)
else
//Broadcast the signal to everyone!
@@ -276,11 +276,11 @@ var/global/datum/controller/radio/radio_controller
send_to_filter(source, signal, next_filter, start_point, range)
//Sends a signal to all machines belonging to a given filter. Should be called by post_signal()
-/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/filter, var/turf/start_point = null, var/range = null)
+/datum/radio_frequency/proc/send_to_filter(obj/source, datum/signal/signal, var/radio_filter, var/turf/start_point = null, var/range = null)
if (range && !start_point)
return
- for(var/obj/device in devices[filter])
+ for(var/obj/device in devices[radio_filter])
if(device == source)
continue
if(range)
@@ -292,14 +292,14 @@ var/global/datum/controller/radio/radio_controller
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
-/datum/radio_frequency/proc/add_listener(obj/device as obj, var/filter as text|null)
- if (!filter)
- filter = RADIO_DEFAULT
- //log_admin("add_listener(device=[device],filter=[filter]) frequency=[frequency]")
- var/list/obj/devices_line = devices[filter]
+/datum/radio_frequency/proc/add_listener(obj/device as obj, var/radio_filter as text|null)
+ if (!radio_filter)
+ radio_filter = RADIO_DEFAULT
+ //log_admin("add_listener(device=[device],radio_filter=[radio_filter]) frequency=[frequency]")
+ var/list/obj/devices_line = devices[radio_filter]
if (!devices_line)
devices_line = new
- devices[filter] = devices_line
+ devices[radio_filter] = devices_line
devices_line+=device
// var/list/obj/devices_line___ = devices[filter_str]
// var/l = devices_line___.len
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 2c0faffc1e..feef09b45e 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -68,6 +68,9 @@
//used for optional self-objectives that antagonists can give themselves, which are displayed at the end of the round.
var/ambitions
+ //used to store what traits the player had picked out in their preferences before joining, in text form.
+ var/list/traits = list()
+
/datum/mind/New(var/key)
src.key = key
diff --git a/code/datums/outfits/_defines.dm b/code/datums/outfits/_defines.dm
new file mode 100644
index 0000000000..d105fc0ebc
--- /dev/null
+++ b/code/datums/outfits/_defines.dm
@@ -0,0 +1,3 @@
+#define OUTFIT_HAS_JETPACK 1
+#define OUTFIT_HAS_BACKPACK 2
+#define OUTFIT_EXTENDED_SURVIVAL 4
diff --git a/code/datums/outfits/costumes/halloween.dm b/code/datums/outfits/costumes/halloween.dm
new file mode 100644
index 0000000000..d4ad8fa8f9
--- /dev/null
+++ b/code/datums/outfits/costumes/halloween.dm
@@ -0,0 +1,115 @@
+/decl/hierarchy/outfit/h_masked_killer
+ name = "Costume - Masked Killer"
+ uniform = /obj/item/clothing/under/overalls
+ shoes = /obj/item/clothing/shoes/white
+ gloves = /obj/item/clothing/gloves/sterile/latex
+ mask = /obj/item/clothing/mask/surgical
+ head = /obj/item/clothing/head/welding
+ suit = /obj/item/clothing/suit/storage/apron
+ r_hand = /obj/item/weapon/material/twohanded/fireaxe/foam
+
+/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H)
+ var/victim = get_mannequin(H.ckey)
+ for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
+ carried_item.add_blood(victim) //Oh yes, there will be blood.. just not blood from the killer because that's odd. //If I knew how to make fake blood, I would
+
+/decl/hierarchy/outfit/h_professional
+ name = "Costume - Professional"
+ uniform = /obj/item/clothing/under/suit_jacket{ starting_accessories=list(/obj/item/clothing/accessory/wcoat) }
+ shoes = /obj/item/clothing/shoes/black
+ gloves = /obj/item/clothing/gloves/black
+ glasses = /obj/item/clothing/glasses/fakesunglasses
+ l_pocket = /obj/item/toy/sword
+
+/decl/hierarchy/outfit/h_professional/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/weapon/storage/briefcase/new_briefcase = new(H)
+ for(var/obj/item/briefcase_item in new_briefcase)
+ qdel(briefcase_item)
+ new_briefcase.contents += new /obj/item/toy/crossbow
+ new_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/capgun
+ new_briefcase.contents += new /obj/item/clothing/mask/gas/clown_hat
+ H.equip_to_slot_or_del(new_briefcase, slot_l_hand)
+
+/decl/hierarchy/outfit/h_horrorcop
+ name = "Costume - Slasher Movie Cop"
+ uniform = /obj/item/clothing/under/pcrc{ starting_accessories=list(/obj/item/clothing/accessory/holster) }
+ shoes = /obj/item/clothing/shoes/black
+ gloves = /obj/item/clothing/gloves/black
+ glasses = /obj/item/clothing/glasses/fakesunglasses
+ mask = /obj/item/clothing/mask/fakemoustache
+ head = /obj/item/clothing/head/beret
+ r_hand = /obj/item/weapon/gun/projectile/revolver/capgun
+
+/decl/hierarchy/outfit/h_horrorcop/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/clothing/under/U = H.w_uniform
+ if(U.accessories.len)
+ for(var/obj/item/clothing/accessory/A in U.accessories)
+ if(istype(A, /obj/item/clothing/accessory/holster))
+ var/obj/item/clothing/accessory/holster/O = A
+ O.holster_verb()
+
+/decl/hierarchy/outfit/h_cowboy
+ name = "Costume - Cowboy"
+ uniform = /obj/item/clothing/under/pants{ starting_accessories=list(/obj/item/clothing/accessory/holster) }
+ shoes = /obj/item/clothing/shoes/boots/cowboy
+ head = /obj/item/clothing/head/cowboy_hat
+ gloves = /obj/item/clothing/gloves/fingerless
+ suit = /obj/item/clothing/accessory/poncho
+ r_hand = /obj/item/weapon/gun/projectile/revolver/capgun
+
+/decl/hierarchy/outfit/h_cowboy/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/clothing/under/U = H.w_uniform
+ if(U.accessories.len)
+ for(var/obj/item/clothing/accessory/A in U.accessories)
+ if(istype(A, /obj/item/clothing/accessory/holster))
+ var/obj/item/clothing/accessory/holster/O = A
+ O.holster_verb()
+
+/decl/hierarchy/outfit/h_lumberjack
+ name = "Costume - Lumberjack"
+ uniform = /obj/item/clothing/under/pants{ starting_accessories=list(/obj/item/clothing/accessory/sweater/blackneck) }
+ shoes = /obj/item/clothing/shoes/boots/workboots
+ head = /obj/item/clothing/head/beanie
+ gloves = /obj/item/clothing/gloves/fingerless
+ suit = /obj/item/clothing/suit/storage/flannel/red
+ r_hand = /obj/item/weapon/material/twohanded/fireaxe/foam
+
+/decl/hierarchy/outfit/h_firefighter
+ name = "Costume - Firefighter"
+ uniform = /obj/item/clothing/under/pants
+ shoes = /obj/item/clothing/shoes/boots/workboots
+ head = /obj/item/clothing/head/hardhat/red
+ gloves = /obj/item/clothing/gloves/black
+ suit = /obj/item/clothing/suit/fire/firefighter
+ mask = /obj/item/clothing/mask/gas
+
+/decl/hierarchy/outfit/h_highlander
+ name = "Costume - Highlander"
+ uniform = /obj/item/clothing/under/kilt
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ head = /obj/item/clothing/head/beret
+ r_hand = /obj/item/weapon/material/sword/foam
+
+/decl/hierarchy/outfit/h_vampire
+ name = "Costume - Vampire"
+ uniform = /obj/item/clothing/under/suit_jacket/really_black
+ shoes = /obj/item/clothing/shoes/dress
+ gloves = /obj/item/clothing/gloves/white
+ r_hand = /obj/item/weapon/bedsheet/red
+
+/decl/hierarchy/outfit/h_vampire_hunter
+ name = "Costume - Vampire Hunter"
+ uniform = /obj/item/clothing/under/pants/tan
+ suit = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ gloves = /obj/item/clothing/gloves/fingerless
+ l_pocket = /obj/item/toy/crossbow
+ r_pocket = /obj/item/device/flashlight/color/red
+
+/decl/hierarchy/outfit/h_pirate
+ name = "Costume - Pirate"
+ uniform = /obj/item/clothing/under/pirate
+ shoes = /obj/item/clothing/shoes/brown
+ head = /obj/item/clothing/head/helmet/space
+ suit = /obj/item/clothing/suit/pirate
+ glasses = /obj/item/clothing/glasses/eyepatch
\ No newline at end of file
diff --git a/code/datums/outfits/horror_killers.dm b/code/datums/outfits/horror_killers.dm
new file mode 100644
index 0000000000..5958cf5586
--- /dev/null
+++ b/code/datums/outfits/horror_killers.dm
@@ -0,0 +1,62 @@
+/decl/hierarchy/outfit/tunnel_clown
+ name = "Tunnel Clown"
+ uniform = /obj/item/clothing/under/rank/clown
+ shoes = /obj/item/clothing/shoes/clown_shoes
+ gloves = /obj/item/clothing/gloves/black
+ mask = /obj/item/clothing/mask/gas/clown_hat
+ head = /obj/item/clothing/head/chaplain_hood
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/plain/monocle
+ suit = /obj/item/clothing/suit/storage/hooded/chaplain_hoodie
+ r_pocket = /obj/item/weapon/bikehorn
+ r_hand = /obj/item/weapon/material/twohanded/fireaxe
+
+ id_slot = slot_wear_id
+ id_type = /obj/item/weapon/card/id/syndicate/station_access
+ id_pda_assignment = "Tunnel Clown!"
+
+/decl/hierarchy/outfit/masked_killer
+ name = "Masked Killer"
+ uniform = /obj/item/clothing/under/overalls
+ shoes = /obj/item/clothing/shoes/white
+ gloves = /obj/item/clothing/gloves/sterile/latex
+ mask = /obj/item/clothing/mask/surgical
+ head = /obj/item/clothing/head/welding
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/thermal/plain/monocle
+ suit = /obj/item/clothing/suit/storage/apron
+ l_pocket = /obj/item/weapon/material/hatchet/tacknife
+ r_pocket = /obj/item/weapon/surgical/scalpel
+ r_hand = /obj/item/weapon/material/twohanded/fireaxe
+
+/decl/hierarchy/outfit/masked_killer/post_equip(var/mob/living/carbon/human/H)
+ var/victim = get_mannequin(H.ckey)
+ for(var/obj/item/carried_item in H.get_equipped_items(TRUE))
+ carried_item.add_blood(victim) //Oh yes, there will be blood.. just not blood from the killer because that's odd
+
+/decl/hierarchy/outfit/professional
+ name = "Professional"
+ uniform = /obj/item/clothing/under/suit_jacket{ starting_accessories=list(/obj/item/clothing/accessory/wcoat) }
+ shoes = /obj/item/clothing/shoes/black
+ gloves = /obj/item/clothing/gloves/black
+ l_ear = /obj/item/device/radio/headset
+ glasses = /obj/item/clothing/glasses/sunglasses
+ l_pocket = /obj/item/weapon/melee/energy/sword
+ mask = /obj/item/clothing/mask/gas/clown_hat
+
+ id_slot = slot_wear_id
+ id_type = /obj/item/weapon/card/id/syndicate/station_access
+ pda_slot = slot_belt
+ pda_type = /obj/item/device/pda/heads
+
+/decl/hierarchy/outfit/professional/post_equip(var/mob/living/carbon/human/H)
+ var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(H)
+ for(var/obj/item/briefcase_item in sec_briefcase)
+ qdel(briefcase_item)
+ for(var/i=3, i>0, i--)
+ sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
+ sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow
+ sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
+ sec_briefcase.contents += new /obj/item/ammo_magazine/s357
+ sec_briefcase.contents += new /obj/item/weapon/plastique
+ H.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
diff --git a/code/datums/outfits/jobs/_defines.dm b/code/datums/outfits/jobs/_defines.dm
new file mode 100644
index 0000000000..e4bdd05fbb
--- /dev/null
+++ b/code/datums/outfits/jobs/_defines.dm
@@ -0,0 +1,2 @@
+#define OUTFIT_JOB_NAME(job_name) ("Job - " + job_name)
+#define OUTFIT_MILITARY(job_name) ("Military Uniform - " + job_name)
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/cargo.dm b/code/datums/outfits/jobs/cargo.dm
new file mode 100644
index 0000000000..e8974f09f9
--- /dev/null
+++ b/code/datums/outfits/jobs/cargo.dm
@@ -0,0 +1,28 @@
+/decl/hierarchy/outfit/job/cargo
+ l_ear = /obj/item/device/radio/headset/headset_cargo
+ hierarchy_type = /decl/hierarchy/outfit/job/cargo
+
+/decl/hierarchy/outfit/job/cargo/qm
+ name = OUTFIT_JOB_NAME("Cargo")
+ uniform = /obj/item/clothing/under/rank/cargo
+ shoes = /obj/item/clothing/shoes/brown
+ glasses = /obj/item/clothing/glasses/sunglasses
+ l_hand = /obj/item/weapon/clipboard
+ id_type = /obj/item/weapon/card/id/cargo/head
+ pda_type = /obj/item/device/pda/quartermaster
+
+/decl/hierarchy/outfit/job/cargo/cargo_tech
+ name = OUTFIT_JOB_NAME("Cargo technician")
+ uniform = /obj/item/clothing/under/rank/cargotech
+ id_type = /obj/item/weapon/card/id/cargo/cargo_tech
+ pda_type = /obj/item/device/pda/cargo
+
+/decl/hierarchy/outfit/job/cargo/mining
+ name = OUTFIT_JOB_NAME("Shaft miner")
+ uniform = /obj/item/clothing/under/rank/miner
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/eng
+ id_type = /obj/item/weapon/card/id/cargo/mining
+ pda_type = /obj/item/device/pda/shaftminer
+ backpack_contents = list(/obj/item/weapon/crowbar = 1, /obj/item/weapon/storage/bag/ore = 1)
+ flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm
new file mode 100644
index 0000000000..bbd96990fb
--- /dev/null
+++ b/code/datums/outfits/jobs/civilian.dm
@@ -0,0 +1,89 @@
+/decl/hierarchy/outfit/job/assistant
+ name = OUTFIT_JOB_NAME("Assistant")
+ id_type = /obj/item/weapon/card/id/assistant
+
+/decl/hierarchy/outfit/job/assistant/visitor
+ name = OUTFIT_JOB_NAME("Visitor")
+ id_pda_assignment = "Visitor"
+ uniform = /obj/item/clothing/under/assistantformal
+
+/decl/hierarchy/outfit/job/assistant/resident
+ name = OUTFIT_JOB_NAME("Resident")
+ id_pda_assignment = "Resident"
+ uniform = /obj/item/clothing/under/color/white
+
+/decl/hierarchy/outfit/job/service
+ l_ear = /obj/item/device/radio/headset/headset_service
+ hierarchy_type = /decl/hierarchy/outfit/job/service
+
+/decl/hierarchy/outfit/job/service/bartender
+ name = OUTFIT_JOB_NAME("Bartender")
+ uniform = /obj/item/clothing/under/rank/bartender
+ id_type = /obj/item/weapon/card/id/civilian/bartender
+ pda_type = /obj/item/device/pda/bar
+ backpack_contents = list(/obj/item/clothing/accessory/permit/gun/bar = 1)
+
+/decl/hierarchy/outfit/job/service/bartender/post_equip(mob/living/carbon/human/H)
+ ..()
+ for(var/obj/item/clothing/accessory/permit/gun/bar/permit in H.back.contents)
+ permit.set_name(H.real_name)
+
+/decl/hierarchy/outfit/job/service/bartender/barista
+ name = OUTFIT_JOB_NAME("Barista")
+ id_pda_assignment = "Barista"
+ backpack_contents = null
+
+/decl/hierarchy/outfit/job/service/chef
+ name = OUTFIT_JOB_NAME("Chef")
+ uniform = /obj/item/clothing/under/rank/chef
+ suit = /obj/item/clothing/suit/chef
+ head = /obj/item/clothing/head/chefhat
+ id_type = /obj/item/weapon/card/id/civilian/chef
+ pda_type = /obj/item/device/pda/chef
+
+/decl/hierarchy/outfit/job/service/chef/cook
+ name = OUTFIT_JOB_NAME("Cook")
+ id_pda_assignment = "Cook"
+
+/decl/hierarchy/outfit/job/service/gardener
+ name = OUTFIT_JOB_NAME("Gardener")
+ uniform = /obj/item/clothing/under/rank/hydroponics
+ suit = /obj/item/clothing/suit/storage/apron
+ gloves = /obj/item/clothing/gloves/botanic_leather
+ r_pocket = /obj/item/device/analyzer/plant_analyzer
+ backpack = /obj/item/weapon/storage/backpack/hydroponics
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd
+ id_type = /obj/item/weapon/card/id/civilian/botanist
+ pda_type = /obj/item/device/pda/botanist
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd
+
+/decl/hierarchy/outfit/job/service/janitor
+ name = OUTFIT_JOB_NAME("Janitor")
+ uniform = /obj/item/clothing/under/rank/janitor
+ id_type = /obj/item/weapon/card/id/civilian/janitor
+ pda_type = /obj/item/device/pda/janitor
+
+/decl/hierarchy/outfit/job/librarian
+ name = OUTFIT_JOB_NAME("Librarian")
+ uniform = /obj/item/clothing/under/suit_jacket/red
+ l_hand = /obj/item/weapon/barcodescanner
+ id_type = /obj/item/weapon/card/id/civilian/librarian
+ pda_type = /obj/item/device/pda/librarian
+
+/decl/hierarchy/outfit/job/internal_affairs_agent
+ name = OUTFIT_JOB_NAME("Internal affairs agent")
+ l_ear = /obj/item/device/radio/headset/ia
+ uniform = /obj/item/clothing/under/rank/internalaffairs
+ suit = /obj/item/clothing/suit/storage/toggle/internalaffairs
+ shoes = /obj/item/clothing/shoes/brown
+ glasses = /obj/item/clothing/glasses/sunglasses/big
+ l_hand = /obj/item/weapon/storage/briefcase
+ id_type = /obj/item/weapon/card/id/civilian/internal_affairs_agent
+ pda_type = /obj/item/device/pda/lawyer
+
+/decl/hierarchy/outfit/job/chaplain
+ name = OUTFIT_JOB_NAME("Chaplain")
+ uniform = /obj/item/clothing/under/rank/chaplain
+ l_hand = /obj/item/weapon/storage/bible
+ id_type = /obj/item/weapon/card/id/civilian/chaplain
+ pda_type = /obj/item/device/pda/chaplain
diff --git a/code/datums/outfits/jobs/command.dm b/code/datums/outfits/jobs/command.dm
new file mode 100644
index 0000000000..5fb5530ee4
--- /dev/null
+++ b/code/datums/outfits/jobs/command.dm
@@ -0,0 +1,50 @@
+/decl/hierarchy/outfit/job/captain
+ name = OUTFIT_JOB_NAME("Captain")
+ head = /obj/item/clothing/head/caphat
+ glasses = /obj/item/clothing/glasses/sunglasses
+ uniform = /obj/item/clothing/under/rank/captain
+ l_ear = /obj/item/device/radio/headset/heads/captain
+ shoes = /obj/item/clothing/shoes/brown
+ backpack = /obj/item/weapon/storage/backpack/captain
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/cap
+ id_type = /obj/item/weapon/card/id/gold/captain
+ pda_type = /obj/item/device/pda/captain
+ backpack_contents = list(/obj/item/weapon/storage/box/ids = 1)
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/com
+
+/decl/hierarchy/outfit/job/captain/post_equip(var/mob/living/carbon/human/H)
+ ..()
+ if(H.age>49)
+ // Since we can have something other than the default uniform at this
+ // point, check if we can actually attach the medal
+ var/obj/item/clothing/uniform = H.w_uniform
+ if(uniform)
+ var/obj/item/clothing/accessory/medal/gold/captain/medal = new()
+ if(uniform.can_attach_accessory(medal))
+ uniform.attach_accessory(null, medal)
+ else
+ qdel(medal)
+
+/decl/hierarchy/outfit/job/hop
+ name = OUTFIT_JOB_NAME("Head of Personnel")
+ uniform = /obj/item/clothing/under/rank/head_of_personnel
+ l_ear = /obj/item/device/radio/headset/heads/hop
+ shoes = /obj/item/clothing/shoes/brown
+ id_type = /obj/item/weapon/card/id/silver/hop
+ pda_type = /obj/item/device/pda/heads/hop
+ backpack_contents = list(/obj/item/weapon/storage/box/ids = 1)
+
+/decl/hierarchy/outfit/job/secretary
+ name = OUTFIT_JOB_NAME("Command Secretary")
+ l_ear = /obj/item/device/radio/headset/headset_com
+ shoes = /obj/item/clothing/shoes/brown
+ id_type = /obj/item/weapon/card/id/silver/secretary
+ pda_type = /obj/item/device/pda/heads/hop
+ r_hand = /obj/item/weapon/storage/briefcase
+
+/decl/hierarchy/outfit/job/secretary/pre_equip(mob/living/carbon/human/H)
+ ..()
+ if(H.gender == FEMALE)
+ uniform = /obj/item/clothing/under/suit_jacket/female/skirt
+ else
+ uniform = /obj/item/clothing/under/suit_jacket/charcoal
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/engineering.dm b/code/datums/outfits/jobs/engineering.dm
new file mode 100644
index 0000000000..1eda9d5de0
--- /dev/null
+++ b/code/datums/outfits/jobs/engineering.dm
@@ -0,0 +1,34 @@
+/decl/hierarchy/outfit/job/engineering
+ hierarchy_type = /decl/hierarchy/outfit/job/engineering
+ belt = /obj/item/weapon/storage/belt/utility/full
+ l_ear = /obj/item/device/radio/headset/headset_eng
+ shoes = /obj/item/clothing/shoes/boots/workboots
+ backpack = /obj/item/weapon/storage/backpack/industrial
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/eng
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/engi
+ pda_slot = slot_l_store
+ flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
+
+/decl/hierarchy/outfit/job/engineering/chief_engineer
+ name = OUTFIT_JOB_NAME("Chief engineer")
+ head = /obj/item/clothing/head/hardhat/white
+ uniform = /obj/item/clothing/under/rank/chief_engineer
+ l_ear = /obj/item/device/radio/headset/heads/ce
+ gloves = /obj/item/clothing/gloves/black
+ id_type = /obj/item/weapon/card/id/engineering/head
+ pda_type = /obj/item/device/pda/heads/ce
+
+/decl/hierarchy/outfit/job/engineering/engineer
+ name = OUTFIT_JOB_NAME("Engineer")
+ head = /obj/item/clothing/head/hardhat
+ uniform = /obj/item/clothing/under/rank/engineer
+ r_pocket = /obj/item/device/t_scanner
+ id_type = /obj/item/weapon/card/id/engineering/engineer
+ pda_type = /obj/item/device/pda/engineering
+
+/decl/hierarchy/outfit/job/engineering/atmos
+ name = OUTFIT_JOB_NAME("Atmospheric technician")
+ uniform = /obj/item/clothing/under/rank/atmospheric_technician
+ belt = /obj/item/weapon/storage/belt/utility/atmostech
+ id_type = /obj/item/weapon/card/id/engineering/atmos
+ pda_type = /obj/item/device/pda/atmos
diff --git a/code/datums/outfits/jobs/job.dm b/code/datums/outfits/jobs/job.dm
new file mode 100644
index 0000000000..a989311153
--- /dev/null
+++ b/code/datums/outfits/jobs/job.dm
@@ -0,0 +1,23 @@
+/decl/hierarchy/outfit/job
+ name = "Standard Gear"
+ hierarchy_type = /decl/hierarchy/outfit/job
+
+ uniform = /obj/item/clothing/under/color/grey
+ l_ear = /obj/item/device/radio/headset
+ shoes = /obj/item/clothing/shoes/black
+
+ id_slot = slot_wear_id
+ id_type = /obj/item/weapon/card/id/civilian
+ pda_slot = slot_belt
+ pda_type = /obj/item/device/pda
+
+ flags = OUTFIT_HAS_BACKPACK
+
+/decl/hierarchy/outfit/job/equip_id(mob/living/carbon/human/H)
+ var/obj/item/weapon/card/id/C = ..()
+ if(H.mind)
+ var/datum/mind/M = H.mind
+ if(M.initial_account)
+ var/datum/money_account/A = M.initial_account
+ C.associated_account_number = A.account_number
+ return C
diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm
new file mode 100644
index 0000000000..2b3c2c2407
--- /dev/null
+++ b/code/datums/outfits/jobs/medical.dm
@@ -0,0 +1,105 @@
+/decl/hierarchy/outfit/job/medical
+ hierarchy_type = /decl/hierarchy/outfit/job/medical
+ l_ear = /obj/item/device/radio/headset/headset_med
+ shoes = /obj/item/clothing/shoes/white
+ pda_type = /obj/item/device/pda/medical
+ pda_slot = slot_l_store
+ backpack = /obj/item/weapon/storage/backpack/medic
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/med
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/med
+
+/decl/hierarchy/outfit/job/medical/cmo
+ name = OUTFIT_JOB_NAME("Chief Medical Officer")
+ l_ear =/obj/item/device/radio/headset/heads/cmo
+ uniform = /obj/item/clothing/under/rank/chief_medical_officer
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat/cmo
+ shoes = /obj/item/clothing/shoes/brown
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ r_pocket = /obj/item/device/healthanalyzer
+ id_type = /obj/item/weapon/card/id/medical/head
+ pda_type = /obj/item/device/pda/heads/cmo
+
+/decl/hierarchy/outfit/job/medical/doctor
+ name = OUTFIT_JOB_NAME("Medical Doctor")
+ uniform = /obj/item/clothing/under/rank/medical
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ r_pocket = /obj/item/device/healthanalyzer
+ id_type = /obj/item/weapon/card/id/medical/doctor
+
+/decl/hierarchy/outfit/job/medical/doctor/emergency_physician
+ name = OUTFIT_JOB_NAME("Emergency Physician")
+ suit = /obj/item/clothing/suit/storage/toggle/fr_jacket
+
+/decl/hierarchy/outfit/job/medical/doctor/surgeon
+ name = OUTFIT_JOB_NAME("Surgeon")
+ uniform = /obj/item/clothing/under/rank/medical/scrubs
+ head = /obj/item/clothing/head/surgery/blue
+
+/decl/hierarchy/outfit/job/medical/doctor/virologist
+ name = OUTFIT_JOB_NAME("Virologist")
+ uniform = /obj/item/clothing/under/rank/virologist
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat/virologist
+ mask = /obj/item/clothing/mask/surgical
+ backpack = /obj/item/weapon/storage/backpack/virology
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/vir
+
+/decl/hierarchy/outfit/job/medical/doctor/nurse
+ name = OUTFIT_JOB_NAME("Nurse")
+ suit = null
+
+/decl/hierarchy/outfit/job/medical/doctor/nurse/pre_equip(mob/living/carbon/human/H)
+ if(H.gender == FEMALE)
+ if(prob(50))
+ uniform = /obj/item/clothing/under/rank/nursesuit
+ else
+ uniform = /obj/item/clothing/under/rank/nurse
+ head = /obj/item/clothing/head/nursehat
+ else
+ uniform = /obj/item/clothing/under/rank/medical/scrubs/purple
+ ..()
+
+/decl/hierarchy/outfit/job/medical/chemist
+ name = OUTFIT_JOB_NAME("Chemist")
+ uniform = /obj/item/clothing/under/rank/chemist
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist
+ backpack = /obj/item/weapon/storage/backpack/chemistry
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/chem
+ id_type = /obj/item/weapon/card/id/medical/chemist
+ pda_type = /obj/item/device/pda/chemist
+
+/decl/hierarchy/outfit/job/medical/geneticist
+ name = OUTFIT_JOB_NAME("Geneticist")
+ uniform = /obj/item/clothing/under/rank/geneticist
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat/genetics
+ backpack = /obj/item/weapon/storage/backpack/genetics
+ r_pocket = /obj/item/device/flashlight/pen
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/gen
+ id_type = /obj/item/weapon/card/id/medical/geneticist
+ pda_type = /obj/item/device/pda/geneticist
+
+/decl/hierarchy/outfit/job/medical/psychiatrist
+ name = OUTFIT_JOB_NAME("Psychiatrist")
+ uniform = /obj/item/clothing/under/rank/psych
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat
+ shoes = /obj/item/clothing/shoes/laceup
+ id_type = /obj/item/weapon/card/id/medical/psychiatrist
+
+/decl/hierarchy/outfit/job/medical/psychiatrist/psychologist
+ name = OUTFIT_JOB_NAME("Psychologist")
+ uniform = /obj/item/clothing/under/rank/psych/turtleneck
+
+/decl/hierarchy/outfit/job/medical/paramedic
+ name = OUTFIT_JOB_NAME("Paramedic")
+ uniform = /obj/item/clothing/under/rank/medical/scrubs/black
+ suit = /obj/item/clothing/suit/storage/toggle/fr_jacket
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ l_hand = /obj/item/weapon/storage/firstaid/adv
+ belt = /obj/item/weapon/storage/belt/medical/emt
+ pda_slot = slot_l_store
+ id_type = /obj/item/weapon/card/id/medical/paramedic
+ flags = OUTFIT_HAS_BACKPACK|OUTFIT_EXTENDED_SURVIVAL
+
+/decl/hierarchy/outfit/job/medical/paramedic/emt
+ name = OUTFIT_JOB_NAME("Emergency Medical Technician")
+ uniform = /obj/item/clothing/under/rank/medical/paramedic
diff --git a/code/datums/outfits/jobs/misc.dm b/code/datums/outfits/jobs/misc.dm
new file mode 100644
index 0000000000..43bbd919f8
--- /dev/null
+++ b/code/datums/outfits/jobs/misc.dm
@@ -0,0 +1,11 @@
+/decl/hierarchy/outfit/job/silicon
+ head = /obj/item/clothing/head/cardborg
+ hierarchy_type = /decl/hierarchy/outfit/job/silicon
+
+/decl/hierarchy/outfit/job/silicon/ai
+ name = OUTFIT_JOB_NAME("AI")
+ suit = /obj/item/clothing/suit/straight_jacket
+
+/decl/hierarchy/outfit/job/silicon/cyborg
+ name = OUTFIT_JOB_NAME("Cyborg")
+ suit = /obj/item/clothing/suit/cardborg
diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm
new file mode 100644
index 0000000000..80ecbfb54a
--- /dev/null
+++ b/code/datums/outfits/jobs/science.dm
@@ -0,0 +1,41 @@
+/decl/hierarchy/outfit/job/science
+ hierarchy_type = /decl/hierarchy/outfit/job/science
+ l_ear = /obj/item/device/radio/headset/headset_sci
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat
+ shoes = /obj/item/clothing/shoes/white
+ pda_type = /obj/item/device/pda/science
+ backpack = /obj/item/weapon/storage/backpack/toxins
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/tox
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/tox
+
+/decl/hierarchy/outfit/job/science/rd
+ name = OUTFIT_JOB_NAME("Research Director")
+ l_ear = /obj/item/device/radio/headset/heads/rd
+ uniform = /obj/item/clothing/under/rank/research_director
+ shoes = /obj/item/clothing/shoes/brown
+ l_hand = /obj/item/weapon/clipboard
+ id_type = /obj/item/weapon/card/id/science/head
+ pda_type = /obj/item/device/pda/heads/rd
+
+/decl/hierarchy/outfit/job/science/scientist
+ name = OUTFIT_JOB_NAME("Scientist")
+ uniform = /obj/item/clothing/under/rank/scientist
+ id_type = /obj/item/weapon/card/id/science/scientist
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
+
+/decl/hierarchy/outfit/job/science/xenobiologist
+ name = OUTFIT_JOB_NAME("Xenobiologist")
+ uniform = /obj/item/clothing/under/rank/scientist
+ id_type = /obj/item/weapon/card/id/science/xenobiologist
+ suit = /obj/item/clothing/suit/storage/toggle/labcoat/science
+
+/decl/hierarchy/outfit/job/science/roboticist
+ name = OUTFIT_JOB_NAME("Roboticist")
+ uniform = /obj/item/clothing/under/rank/scientist
+ shoes = /obj/item/clothing/shoes/black
+ belt = /obj/item/weapon/storage/belt/utility/full
+ id_type = /obj/item/weapon/card/id/science/roboticist
+ pda_slot = slot_r_store
+ pda_type = /obj/item/device/pda/roboticist
+ backpack = /obj/item/weapon/storage/backpack
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
\ No newline at end of file
diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm
new file mode 100644
index 0000000000..d96954a8f0
--- /dev/null
+++ b/code/datums/outfits/jobs/security.dm
@@ -0,0 +1,52 @@
+/decl/hierarchy/outfit/job/security
+ hierarchy_type = /decl/hierarchy/outfit/job/security
+ glasses = /obj/item/clothing/glasses/sunglasses/sechud
+ l_ear = /obj/item/device/radio/headset/headset_sec
+ gloves = /obj/item/clothing/gloves/black
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ backpack = /obj/item/weapon/storage/backpack/security
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/sec
+ backpack_contents = list(/obj/item/weapon/handcuffs = 1)
+ messenger_bag = /obj/item/weapon/storage/backpack/messenger/sec
+
+/decl/hierarchy/outfit/job/security/hos
+ name = OUTFIT_JOB_NAME("Head of security")
+ l_ear = /obj/item/device/radio/headset/heads/hos
+ uniform = /obj/item/clothing/under/rank/head_of_security
+ id_type = /obj/item/weapon/card/id/security/head
+ pda_type = /obj/item/device/pda/heads/hos
+ backpack_contents = list(/obj/item/weapon/handcuffs = 1)
+
+/decl/hierarchy/outfit/job/security/warden
+ name = OUTFIT_JOB_NAME("Warden")
+ uniform = /obj/item/clothing/under/rank/warden
+ l_pocket = /obj/item/device/flash
+ id_type = /obj/item/weapon/card/id/security/warden
+ pda_type = /obj/item/device/pda/warden
+
+/decl/hierarchy/outfit/job/security/detective
+ name = OUTFIT_JOB_NAME("Detective")
+ head = /obj/item/clothing/head/det
+ uniform = /obj/item/clothing/under/det
+ suit = /obj/item/clothing/suit/storage/det_trench
+ l_pocket = /obj/item/weapon/flame/lighter/zippo
+ shoes = /obj/item/clothing/shoes/laceup
+ r_hand = /obj/item/weapon/storage/briefcase/crimekit
+ id_type = /obj/item/weapon/card/id/security/detective
+ pda_type = /obj/item/device/pda/detective
+ backpack = /obj/item/weapon/storage/backpack
+ satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
+ backpack_contents = list(/obj/item/weapon/storage/box/evidence = 1)
+
+/decl/hierarchy/outfit/job/security/detective/forensic
+ name = OUTFIT_JOB_NAME("Forensic technician")
+ head = null
+ suit = /obj/item/clothing/suit/storage/forensics/blue
+
+/decl/hierarchy/outfit/job/security/officer
+ name = OUTFIT_JOB_NAME("Security Officer")
+ uniform = /obj/item/clothing/under/rank/security
+ l_pocket = /obj/item/device/flash
+ r_pocket = /obj/item/weapon/handcuffs
+ id_type = /obj/item/weapon/card/id/security/officer
+ pda_type = /obj/item/device/pda/security
diff --git a/code/datums/outfits/military/fleet.dm b/code/datums/outfits/military/fleet.dm
new file mode 100644
index 0000000000..cf5028978d
--- /dev/null
+++ b/code/datums/outfits/military/fleet.dm
@@ -0,0 +1,22 @@
+/decl/hierarchy/outfit/military/fleet/pt
+ name = OUTFIT_MILITARY("Fleet PT")
+ uniform = /obj/item/clothing/under/pt/fleet
+ shoes = /obj/item/clothing/shoes/black
+
+/decl/hierarchy/outfit/military/fleet/utility
+ name = OUTFIT_MILITARY("Fleet Utility")
+ uniform = /obj/item/clothing/under/utility/fleet
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+
+/decl/hierarchy/outfit/military/fleet/service
+ name = OUTFIT_MILITARY("Fleet Service")
+ uniform = /obj/item/clothing/under/service/fleet
+ shoes = /obj/item/clothing/shoes/dress/white
+
+/decl/hierarchy/outfit/military/fleet/dress
+ name = OUTFIT_MILITARY("Fleet Dress")
+ uniform = /obj/item/clothing/under/service/fleet
+ shoes = /obj/item/clothing/shoes/dress/white
+ suit = /obj/item/clothing/suit/storage/toggle/dress/fleet
+ gloves = /obj/item/clothing/gloves/white
+ head = /obj/item/clothing/head/dress/fleet
\ No newline at end of file
diff --git a/code/datums/outfits/military/marines.dm b/code/datums/outfits/military/marines.dm
new file mode 100644
index 0000000000..d818dabcaa
--- /dev/null
+++ b/code/datums/outfits/military/marines.dm
@@ -0,0 +1,23 @@
+/decl/hierarchy/outfit/military/marine/pt
+ name = OUTFIT_MILITARY("Marine PT")
+ uniform = /obj/item/clothing/under/pt/marine
+ shoes = /obj/item/clothing/shoes/black
+
+/decl/hierarchy/outfit/military/marine/utility
+ name = OUTFIT_MILITARY("Marine Utility")
+ uniform = /obj/item/clothing/under/utility/marine
+ shoes = /obj/item/clothing/shoes/boots/jungle
+
+/decl/hierarchy/outfit/military/marine/service
+ name = OUTFIT_MILITARY("Marine Service")
+ uniform = /obj/item/clothing/under/service/marine
+ shoes = /obj/item/clothing/shoes/dress
+ suit = /obj/item/clothing/suit/storage/service/marine
+
+/decl/hierarchy/outfit/military/marine/dress
+ name = OUTFIT_MILITARY("Marine Dress")
+ uniform = /obj/item/clothing/under/mildress/marine
+ shoes = /obj/item/clothing/shoes/dress/white
+ suit = /obj/item/clothing/suit/dress/marine
+ gloves = /obj/item/clothing/gloves/white
+ head = /obj/item/clothing/head/dress/marine
\ No newline at end of file
diff --git a/code/datums/outfits/military/military.dm b/code/datums/outfits/military/military.dm
new file mode 100644
index 0000000000..eb00eb6871
--- /dev/null
+++ b/code/datums/outfits/military/military.dm
@@ -0,0 +1,5 @@
+/decl/hierarchy/outfit/military
+ name = "Military Uniform"
+ hierarchy_type = /decl/hierarchy/outfit/military
+
+ l_ear = /obj/item/device/radio/headset
\ No newline at end of file
diff --git a/code/datums/outfits/military/sifguard.dm b/code/datums/outfits/military/sifguard.dm
new file mode 100644
index 0000000000..d031a5149d
--- /dev/null
+++ b/code/datums/outfits/military/sifguard.dm
@@ -0,0 +1,23 @@
+/decl/hierarchy/outfit/military/sifguard/pt
+ name = OUTFIT_MILITARY("SifGuard PT")
+ uniform = /obj/item/clothing/under/pt/expeditionary
+ shoes = /obj/item/clothing/shoes/black
+
+/decl/hierarchy/outfit/military/sifguard/utility
+ name = OUTFIT_MILITARY("SifGuard Utility")
+ uniform = /obj/item/clothing/under/utility/expeditionary
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+
+/decl/hierarchy/outfit/military/sifguard/service
+ name = OUTFIT_MILITARY("SifGuard Service")
+ uniform = /obj/item/clothing/under/utility/expeditionary
+ shoes = /obj/item/clothing/shoes/boots/jackboots
+ suit = /obj/item/clothing/suit/storage/service/expeditionary
+
+/decl/hierarchy/outfit/military/sifguard/dress
+ name = OUTFIT_MILITARY("SifGuard Dress")
+ uniform = /obj/item/clothing/under/mildress/expeditionary
+ shoes = /obj/item/clothing/shoes/dress
+ suit = /obj/item/clothing/suit/dress/expedition
+ gloves = /obj/item/clothing/gloves/white
+ head = /obj/item/clothing/head/dress/expedition
\ No newline at end of file
diff --git a/code/datums/outfits/misc.dm b/code/datums/outfits/misc.dm
new file mode 100644
index 0000000000..f7dc6e0f33
--- /dev/null
+++ b/code/datums/outfits/misc.dm
@@ -0,0 +1,55 @@
+/decl/hierarchy/outfit/standard_space_gear
+ name = "Standard space gear"
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/helmet/space
+ suit = /obj/item/clothing/suit/space
+ uniform = /obj/item/clothing/under/color/grey
+ back = /obj/item/weapon/tank/jetpack/oxygen
+ mask = /obj/item/clothing/mask/breath
+ flags = OUTFIT_HAS_JETPACK
+
+/decl/hierarchy/outfit/emergency_space_gear
+ name = "Emergency space gear"
+ shoes = /obj/item/clothing/shoes/black
+ head = /obj/item/clothing/head/helmet/space/emergency
+ suit = /obj/item/clothing/suit/space/emergency
+ uniform = /obj/item/clothing/under/color/grey
+ back = /obj/item/weapon/tank/oxygen
+ mask = /obj/item/clothing/mask/breath
+
+/decl/hierarchy/outfit/soviet_soldier
+ name = "Soviet soldier"
+ uniform = /obj/item/clothing/under/soviet
+ shoes = /obj/item/clothing/shoes/boots/combat
+ head = /obj/item/clothing/head/ushanka
+ gloves = /obj/item/clothing/gloves/combat
+ back = /obj/item/weapon/storage/backpack/satchel
+ belt = /obj/item/weapon/gun/projectile/revolver/mateba
+
+/decl/hierarchy/outfit/soviet_soldier/admiral
+ name = "Soviet admiral"
+ head = /obj/item/clothing/head/hgpiratecap
+ l_ear = /obj/item/device/radio/headset/heads/captain
+ glasses = /obj/item/clothing/glasses/thermal/plain/eyepatch
+ suit = /obj/item/clothing/suit/hgpirate
+
+ id_slot = slot_wear_id
+ id_type = /obj/item/weapon/card/id/centcom //station
+ id_pda_assignment = "Admiral"
+
+/decl/hierarchy/outfit/merchant
+ name = "Merchant"
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset
+ uniform = /obj/item/clothing/under/color/grey
+ id_slot = slot_wear_id
+ id_type = /obj/item/weapon/card/id/civilian //merchant
+ pda_slot = slot_r_store
+ pda_type = /obj/item/device/pda/chef //cause I like the look
+ id_pda_assignment = "Merchant"
+
+/decl/hierarchy/outfit/merchant/vox
+ name = "Merchant - Vox"
+ shoes = /obj/item/clothing/shoes/boots/jackboots/toeless
+ uniform = /obj/item/clothing/under/vox/vox_robes
+ suit = /obj/item/clothing/suit/armor/vox_scrap
\ No newline at end of file
diff --git a/code/datums/outfits/nanotrasen.dm b/code/datums/outfits/nanotrasen.dm
new file mode 100644
index 0000000000..4fd219685b
--- /dev/null
+++ b/code/datums/outfits/nanotrasen.dm
@@ -0,0 +1,32 @@
+/decl/hierarchy/outfit/nanotrasen
+ hierarchy_type = /decl/hierarchy/outfit/nanotrasen
+ uniform = /obj/item/clothing/under/rank/centcom
+ shoes = /obj/item/clothing/shoes/laceup
+ gloves = /obj/item/clothing/gloves/white
+ l_ear = /obj/item/device/radio/headset/heads/hop
+ glasses = /obj/item/clothing/glasses/sunglasses
+
+ id_slot = slot_wear_id
+ id_type = /obj/item/weapon/card/id/centcom //station
+ pda_slot = slot_r_store
+ pda_type = /obj/item/device/pda/heads
+
+/decl/hierarchy/outfit/nanotrasen/representative
+ name = "Nanotrasen representative"
+ belt = /obj/item/weapon/clipboard
+ id_pda_assignment = "NanoTrasen Navy Representative"
+
+/decl/hierarchy/outfit/nanotrasen/officer
+ name = "Nanotrasen officer"
+ head = /obj/item/clothing/head/beret/centcom/officer
+ l_ear = /obj/item/device/radio/headset/heads/captain
+ belt = /obj/item/weapon/gun/energy
+ id_pda_assignment = "NanoTrasen Navy Officer"
+
+/decl/hierarchy/outfit/nanotrasen/captain
+ name = "Nanotrasen captain"
+ uniform = /obj/item/clothing/under/rank/centcom_captain
+ l_ear = /obj/item/device/radio/headset/heads/captain
+ head = /obj/item/clothing/head/beret/centcom/captain
+ belt = /obj/item/weapon/gun/energy
+ id_pda_assignment = "NanoTrasen Navy Captain"
diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm
new file mode 100644
index 0000000000..93ea518df1
--- /dev/null
+++ b/code/datums/outfits/outfit.dm
@@ -0,0 +1,171 @@
+var/list/outfits_decls_
+var/list/outfits_decls_root_
+var/list/outfits_decls_by_type_
+
+/proc/outfit_by_type(var/outfit_type)
+ if(!outfits_decls_root_)
+ init_outfit_decls()
+ return outfits_decls_by_type_[outfit_type]
+
+/proc/outfits()
+ if(!outfits_decls_root_)
+ init_outfit_decls()
+ return outfits_decls_
+
+/proc/init_outfit_decls()
+ if(outfits_decls_root_)
+ return
+ outfits_decls_ = list()
+ outfits_decls_by_type_ = list()
+ outfits_decls_root_ = new/decl/hierarchy/outfit()
+
+/decl/hierarchy/outfit
+ name = "Naked"
+
+ var/uniform = null
+ var/suit = null
+ var/back = null
+ var/belt = null
+ var/gloves = null
+ var/shoes = null
+ var/head = null
+ var/mask = null
+ var/l_ear = null
+ var/r_ear = null
+ var/glasses = null
+ var/id = null
+ var/l_pocket = null
+ var/r_pocket = null
+ var/suit_store = null
+ var/r_hand = null
+ var/l_hand = null
+ var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format
+
+ var/id_type
+ var/id_desc
+ var/id_slot
+
+ var/pda_type
+ var/pda_slot
+
+ var/id_pda_assignment
+
+ var/backpack = /obj/item/weapon/storage/backpack
+ var/satchel_one = /obj/item/weapon/storage/backpack/satchel/norm
+ var/satchel_two = /obj/item/weapon/storage/backpack/satchel
+ var/messenger_bag = /obj/item/weapon/storage/backpack/messenger
+
+ var/flags // Specific flags
+
+/decl/hierarchy/outfit/New()
+ ..()
+
+ if(is_hidden_category())
+ return
+ outfits_decls_by_type_[type] = src
+ dd_insertObjectList(outfits_decls_, src)
+
+/decl/hierarchy/outfit/proc/pre_equip(mob/living/carbon/human/H)
+ if(flags & OUTFIT_HAS_BACKPACK)
+ switch(H.backbag)
+ if(2) back = backpack
+ if(3) back = satchel_one
+ if(4) back = satchel_two
+ if(5) back = messenger_bag
+ else back = null
+
+/decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H)
+ if(flags & OUTFIT_HAS_JETPACK)
+ var/obj/item/weapon/tank/jetpack/J = locate(/obj/item/weapon/tank/jetpack) in H
+ if(!J)
+ return
+ J.toggle()
+ J.toggle_valve()
+
+/decl/hierarchy/outfit/proc/equip(mob/living/carbon/human/H, var/rank, var/assignment)
+ equip_base(H)
+
+ rank = id_pda_assignment || rank
+ assignment = id_pda_assignment || assignment || rank
+ var/obj/item/weapon/card/id/W = equip_id(H, rank, assignment)
+ if(W)
+ rank = W.rank
+ assignment = W.assignment
+ equip_pda(H, rank, assignment)
+
+ for(var/path in backpack_contents)
+ var/number = backpack_contents[path]
+ for(var/i=0,i max_charge)
+ charge = max_charge
+
+/obj/item/weapon/stock_parts/capacitor/proc/use(var/amount)
+ if(charge)
+ charge -= amount
+ if(charge < 0)
+ charge = 0
+
/obj/item/weapon/stock_parts/scanning_module
name = "scanning module"
desc = "A compact, high resolution scanning module used in the construction of certain devices."
@@ -543,7 +563,7 @@
origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 5 ,TECH_MATERIAL = 4, TECH_BLUESPACE = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10)
-/obj/item/weapon/stock_parts/subspace/filter
+/obj/item/weapon/stock_parts/subspace/sub_filter
name = "hyperwave filter"
icon_state = "hyperwave_filter"
desc = "A tiny device capable of filtering and converting super-intense radiowaves."
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 3b642ffd2f..a092ed7b65 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -299,9 +299,10 @@ its easier to just keep the beam vertical.
//Deal with gloves the pass finger/palm prints.
if(!ignoregloves)
if(H.gloves && H.gloves != src)
- var/obj/item/clothing/gloves/G = H.gloves
- if(!prob(G.fingerprint_chance))
- return 0
+ if(istype(H.gloves, /obj/item/clothing/gloves))
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(!prob(G.fingerprint_chance))
+ return 0
//More adminstuffz
if(fingerprintslast != H.key)
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index 37a9945210..9225792575 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -1,6 +1,6 @@
/datum/power/changeling/transform
name = "Transform"
- desc = "We take on the apperance and voice of one we have absorbed."
+ desc = "We take on the appearance and voice of one we have absorbed."
ability_icon_state = "ling_transform"
genomecost = 0
verbpath = /mob/proc/changeling_transform
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 34a3e45877..108a0ca99a 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -289,6 +289,7 @@ var/global/datum/controller/gameticker/ticker
job_master.EquipRank(player, player.mind.assigned_role, 0)
UpdateFactionList(player)
equip_custom_items(player)
+ //player.apply_traits() //VOREStation Removal
if(captainless)
for(var/mob/M in player_list)
if(!istype(M,/mob/new_player))
diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm
index f0135c5356..1062232664 100644
--- a/code/game/gamemodes/meteor/meteors.dm
+++ b/code/game/gamemodes/meteor/meteors.dm
@@ -9,7 +9,7 @@
/obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/emp=3) //for threatening meteor event
/var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \
- /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event
+ /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10) //, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event
/var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event
diff --git a/code/game/gamemodes/technomancer/assistance/golem.dm b/code/game/gamemodes/technomancer/assistance/golem.dm
index 3bd54ed1f5..33fc246911 100644
--- a/code/game/gamemodes/technomancer/assistance/golem.dm
+++ b/code/game/gamemodes/technomancer/assistance/golem.dm
@@ -29,47 +29,133 @@
melee_damage_lower = 30 // It has a built in esword.
melee_damage_upper = 30
+ attack_sound = 'sound/weapons/blade1.ogg'
attacktext = "slashed"
- attack_sound = null
friendly = "hugs"
resistance = 0
+ melee_miss_chance = 0
var/obj/item/weapon/technomancer_core/golem/core = null
var/obj/item/weapon/spell/active_spell = null // Shield and ranged spells
var/mob/living/master = null
var/list/known_spells = list(
- "reflect" = /obj/item/weapon/spell/reflect,
- "shield" = /obj/item/weapon/spell/shield,
- "dispel" = /obj/item/weapon/spell/dispel,
- "mend life" = /obj/item/weapon/spell/modifier/mend_life,
- "mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
- "repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
- "corona" = /obj/item/weapon/spell/modifier/corona,
"beam" = /obj/item/weapon/spell/projectile/beam,
"chain lightning" = /obj/item/weapon/spell/projectile/chain_lightning,
"force missile" = /obj/item/weapon/spell/projectile/force_missile,
"ionic bolt" = /obj/item/weapon/spell/projectile/ionic_bolt,
- "lightning" = /obj/item/weapon/spell/projectile/lightning
+ "lightning" = /obj/item/weapon/spell/projectile/lightning,
+ "blink" = /obj/item/weapon/spell/blink,
+ "dispel" = /obj/item/weapon/spell/dispel,
+ "oxygenate" = /obj/item/weapon/spell/oxygenate,
+ "mend life" = /obj/item/weapon/spell/modifier/mend_life,
+ "mend synthetic" = /obj/item/weapon/spell/modifier/mend_synthetic,
+ "mend organs" = /obj/item/weapon/spell/mend_organs,
+ "purify" = /obj/item/weapon/spell/modifier/purify,
+ "resurrect" = /obj/item/weapon/spell/resurrect,
+ "passwall" = /obj/item/weapon/spell/passwall,
+ "repel missiles" = /obj/item/weapon/spell/modifier/repel_missiles,
+ "corona" = /obj/item/weapon/spell/modifier/corona,
+ "haste" = /obj/item/weapon/spell/modifier/haste
)
+ // Holds the overlays, when idle or attacking.
+ var/image/sword_image = null
+ var/image/spell_image = null
+ // These contain icon_states for each frame of an attack animation, which is swapped in and out manually, because BYOND.
+ // They are assoc lists, to hold the frame duration and the frame icon_state in one list.
+ var/list/spell_pre_attack_states = list(
+ "golem_spell_attack_1" = 1,
+ "golem_spell_attack_2" = 2,
+ "golem_spell_attack_3" = 2
+ )
+ var/list/spell_post_attack_states = list(
+ "golem_spell_attack_4" = 2,
+ "golem_spell_attack_5" = 3,
+ "golem_spell_attack_6" = 3
+ )
+ var/list/sword_pre_attack_states = list(
+ "golem_sword_attack_1" = 1,
+ "golem_sword_attack_2" = 5
+ )
+ var/list/sword_post_attack_states = list(
+ "golem_sword_attack_3" = 1,
+ "golem_sword_attack_4" = 3
+ )
+
/mob/living/simple_animal/technomancer_golem/New()
..()
core = new(src)
+ sword_image = image(icon, src, "golem_sword")
+ spell_image = image(icon, src, "golem_spell")
update_icon()
/mob/living/simple_animal/technomancer_golem/Destroy()
qdel(core)
+ qdel(sword_image)
+ qdel(spell_image)
return ..()
+/mob/living/simple_animal/technomancer_golem/unref_spell()
+ active_spell = null
+ return ..()
+
+/mob/living/simple_animal/hostile/hivebot/death()
+ ..()
+ visible_message("\The [src] disintegrates!")
+ new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(3, 1, src)
+ s.start()
+ qdel(src)
+
/mob/living/simple_animal/technomancer_golem/update_icon()
overlays.Cut()
- overlays.Add(image(icon, src, "golem_sword"))
- overlays.Add(image(icon, src, "golem_spell"))
+ overlays += sword_image
+ overlays += spell_image
+ update_modifier_visuals()
+
+// Unfortunately, BYOND does not let you flick() images or other overlays, so we need to do this in a terrible way.
+/atom/proc/manual_flick(var/list/frames, var/image/I, var/reset_to = null)
+ // Swap in and out each frame manually.
+ for(var/frame in frames)
+ overlays -= I
+ I.icon_state = frame
+ overlays += I
+ sleep(frames[frame])
+ if(reset_to)
+ // One more time to reset it to what it was before.
+ overlays -= I
+ I.icon_state = reset_to
+ overlays += I
+
+/mob/living/simple_animal/technomancer_golem/proc/spellcast_pre_animation()
+ setClickCooldown(5)
+ manual_flick(spell_pre_attack_states, spell_image, reset_to = "golem_spell_attack_3")
+
+/mob/living/simple_animal/technomancer_golem/proc/spellcast_post_animation()
+ setClickCooldown(8)
+ manual_flick(spell_post_attack_states, spell_image, reset_to = "golem_spell")
+
+/mob/living/simple_animal/technomancer_golem/proc/sword_pre_animation()
+ setClickCooldown(6)
+ manual_flick(sword_pre_attack_states, sword_image)
+
+/mob/living/simple_animal/technomancer_golem/proc/sword_post_animation()
+ setClickCooldown(3)
+ manual_flick(sword_post_attack_states, sword_image, reset_to = "golem_sword")
+
+/mob/living/simple_animal/technomancer_golem/DoPunch(var/atom/A)
+ sword_pre_animation()
+ . = ..() // This does the actual attack and will check adjacency again.
+ sword_post_animation()
/mob/living/simple_animal/technomancer_golem/isSynthetic()
return TRUE // So Mend Synthetic will work on them.
+/mob/living/simple_animal/technomancer_golem/speech_bubble_appearance()
+ return "synthetic_evil"
+
/mob/living/simple_animal/technomancer_golem/place_spell_in_hand(var/path)
if(!path || !ispath(path))
return 0
@@ -84,21 +170,30 @@
var/choice = input(usr, "What spell?", "Give spell") as null|anything in known_spells
if(choice)
place_spell_in_hand(known_spells[choice])
+ else
+ qdel(active_spell)
// Used to cast spells.
/mob/living/simple_animal/technomancer_golem/RangedAttack(var/atom/A, var/params)
if(active_spell)
+ spellcast_pre_animation()
if(active_spell.cast_methods & CAST_RANGED)
active_spell.on_ranged_cast(A, src)
+ spellcast_post_animation()
/mob/living/simple_animal/technomancer_golem/UnarmedAttack(var/atom/A, var/proximity)
if(proximity)
if(active_spell)
+ spellcast_pre_animation()
+ if(!Adjacent(A)) // Need to check again since they might've moved while 'warming up'.
+ spellcast_post_animation()
+ return
+ var/effective_cooldown = round(active_spell.cooldown * core.cooldown_modifier, 5)
if(active_spell.cast_methods & CAST_MELEE)
active_spell.on_melee_cast(A, src)
else if(active_spell.cast_methods & CAST_RANGED)
active_spell.on_ranged_cast(A, src)
- var/effective_cooldown = round(active_spell.cooldown * core.cooldown_modifier, 5)
+ spellcast_post_animation()
src.setClickCooldown(effective_cooldown)
else
..()
diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
index 630a9bdb10..0056675afc 100644
--- a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
+++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm
@@ -19,7 +19,6 @@
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
- var/mob/living/carbon/human/wearer = null
/obj/item/clothing/gloves/regen/equipped(var/mob/living/carbon/human/H)
if(H && H.gloves == src)
diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm
index 5ba100a4b4..fb28813102 100644
--- a/code/game/gamemodes/technomancer/spell_objs.dm
+++ b/code/game/gamemodes/technomancer/spell_objs.dm
@@ -149,10 +149,17 @@
// Parameters: 0
// Description: Nulls object references so it can qdel() cleanly.
/obj/item/weapon/spell/Destroy()
+ owner.unref_spell(src)
owner = null
core = null
return ..()
+// Proc: unref_spells()
+// Parameters: 0
+// Description: Nulls object references on specific mobs so it can qdel() cleanly.
+/mob/proc/unref_spell(var/obj/item/weapon/spell/the_spell)
+ return
+
// Proc: update_icon()
// Parameters: 0
// Description: Applys an overlay if it is a passive spell.
diff --git a/code/game/gamemodes/technomancer/spells/aura/aura.dm b/code/game/gamemodes/technomancer/spells/aura/aura.dm
index 23e45a2669..f3c7c93876 100644
--- a/code/game/gamemodes/technomancer/spells/aura/aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/aura.dm
@@ -15,7 +15,7 @@
/obj/item/weapon/spell/aura/Destroy()
processing_objects -= src
log_and_message_admins("has stopped maintaining [src].")
- ..()
+ return ..()
/obj/item/weapon/spell/aura/process()
return
diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm
index 4a51d0c9ae..7302a34b75 100644
--- a/code/game/gamemodes/technomancer/spells/control.dm
+++ b/code/game/gamemodes/technomancer/spells/control.dm
@@ -107,7 +107,7 @@
for(var/mob/living/simple_animal/hostile/SM in controlled_mobs)
deselect(SM)
controlled_mobs = list()
- ..()
+ return ..()
/obj/item/weapon/spell/control/on_use_cast(mob/living/user)
if(controlled_mobs.len != 0)
diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
index 630bd5408f..345b632282 100644
--- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm
+++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
@@ -27,7 +27,7 @@
/obj/item/weapon/spell/energy_siphon/Destroy()
stop_siphoning()
processing_objects -= src
- ..()
+ return ..()
/obj/item/weapon/spell/energy_siphon/process()
if(!siphoning)
diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm
index 33b4b6204d..271240ad05 100644
--- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm
+++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm
@@ -24,7 +24,7 @@
/obj/item/weapon/spell/flame_tongue/Destroy()
qdel(welder)
welder = null
- ..()
+ return ..()
/obj/item/weapon/weldingtool/spell
name = "flame"
diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm
index 48efd67783..e2afb8d120 100644
--- a/code/game/gamemodes/technomancer/spells/illusion.dm
+++ b/code/game/gamemodes/technomancer/spells/illusion.dm
@@ -64,7 +64,7 @@
/obj/item/weapon/spell/illusion/Destroy()
if(illusion)
qdel(illusion)
- ..()
+ return ..()
// Makes a tiny overlay of the thing the player has copied, so they can easily tell what they currently have.
/obj/item/weapon/spell/illusion/update_icon()
diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
index cca20eb3b0..5b05ce56b8 100644
--- a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
+++ b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
@@ -29,9 +29,6 @@
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/technomancer/mend_synthetic/tick()
-// if(!holder.isSynthetic()) // Don't heal biologicals!
-// expire()
-// return
if(!holder.getActualBruteLoss() && !holder.getActualFireLoss()) // No point existing if the spell can't heal.
expire()
return
@@ -42,8 +39,9 @@
if(O.robotic >= ORGAN_ROBOT)
O.heal_damage(4 * spell_power, 4 * spell_power, 0, 1)
else
- holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds.
- holder.adjustFireLoss(-4 * spell_power) // Ditto.
+ if(holder.isSynthetic())
+ holder.adjustBruteLoss(-4 * spell_power) // Should heal roughly 20 burn/brute over 10 seconds, as tick() is run every 2 seconds.
+ holder.adjustFireLoss(-4 * spell_power) // Ditto.
holder.adjust_instability(1)
if(origin)
diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm
index 60abcee63f..22b32bb660 100644
--- a/code/game/gamemodes/technomancer/spells/reflect.dm
+++ b/code/game/gamemodes/technomancer/spells/reflect.dm
@@ -29,7 +29,7 @@
/obj/item/weapon/spell/reflect/Destroy()
spark_system = null
- ..()
+ return ..()
/obj/item/weapon/spell/reflect/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(user.incapacitated())
diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm
index 4ea507e959..772fd7a8f8 100644
--- a/code/game/gamemodes/technomancer/spells/shield.dm
+++ b/code/game/gamemodes/technomancer/spells/shield.dm
@@ -26,7 +26,7 @@
/obj/item/weapon/spell/shield/Destroy()
spark_system = null
- ..()
+ return ..()
/obj/item/weapon/spell/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(user.incapacitated())
diff --git a/code/game/gamemodes/technomancer/spells/track.dm b/code/game/gamemodes/technomancer/spells/track.dm
index b02c88fc4d..230e282ee1 100644
--- a/code/game/gamemodes/technomancer/spells/track.dm
+++ b/code/game/gamemodes/technomancer/spells/track.dm
@@ -24,7 +24,7 @@ var/list/technomancer_belongings = list()
/obj/item/weapon/spell/track/Destroy()
tracked = null
tracking = 0
- ..()
+ return ..()
/obj/item/weapon/spell/track/on_use_cast(mob/user)
if(tracking)
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index 267d4ecf25..523589694c 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -11,7 +11,6 @@
economic_modifier = 1
access = list() //See /datum/job/assistant/get_access()
minimal_access = list() //See /datum/job/assistant/get_access()
- alt_titles = list("Technical Assistant","Test Subject","Medical Intern","Research Assistant","Visitor", "Resident") // Test Subject is a VOREStation edit.
/datum/job/assistant/equip(var/mob/living/carbon/human/H, var/alt_title)
if(!H)
@@ -30,6 +29,10 @@
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
return 1
+ outfit_type = /decl/hierarchy/outfit/job/assistant
+ alt_titles = list("Technical Assistant","Test Subject","Medical Intern","Research Assistant",
+ "Visitor" = /decl/hierarchy/outfit/job/assistant/visitor,
+ "Resident" = /decl/hierarchy/outfit/job/assistant/resident) //Test Subject is a VOREStation edit on line 36.
/datum/job/assistant/get_access()
if(config.assistant_maint)
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 0784a1a9fc..55055f480c 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -11,7 +11,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "company officials and Corporate Regulations"
selection_color = "#1D1D4F"
- alt_titles = list("Site Manager", "Overseer")
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
access = list() //See get_access()
@@ -22,45 +21,18 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimum_character_age = 25
ideal_character_age = 70 // Old geezer captains ftw
+ outfit_type = /decl/hierarchy/outfit/job/captain
+ alt_titles = list("Site Manager", "Overseer")
-/datum/job/captain/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/cap(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/com(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform)
- if(H.age>49)
- // Since we can have something other than the default uniform at this
- // point, check if we can actually attach the medal
- var/obj/item/clothing/uniform = H.w_uniform
- var/obj/item/clothing/accessory/medal/gold/captain/medal = new()
-
- if(uniform && uniform.can_attach_accessory(medal))
- uniform.attach_accessory(null, medal)
- else
- qdel(medal)
- H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
-
-
- H.implant_loyalty()
-
- return 1
-
+/*
+/datum/job/captain/equip(var/mob/living/carbon/human/H)
+ . = ..()
+ if(.)
+ H.implant_loyalty(src)
+*/
/datum/job/captain/get_access()
return get_all_station_access()
-
-
/datum/job/hop
title = "Head of Personnel"
flag = HOP
@@ -72,8 +44,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "the Colony Director"
selection_color = "#2F2F7F"
- idtype = /obj/item/weapon/card/id/silver
- alt_titles = list("Crew Resources Officer")
+ idtype = /obj/item/weapon/card/id/silver/hop
req_admin_notify = 1
minimal_player_age = 10
economic_modifier = 10
@@ -81,6 +52,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
minimum_character_age = 25
ideal_character_age = 50
+ outfit_type = /decl/hierarchy/outfit/job/hop
+ alt_titles = list("Crew Resources Officer")
+
access = list(access_security, access_sec_doors, access_brig, access_forensics_lockers,
access_medical, access_engine, access_change_ids, access_ai_upload, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
@@ -94,26 +68,6 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
-
-/datum/job/hop/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
- H.implant_loyalty()
- return 1
-
-
-
/datum/job/secretary
title = "Command Secretary"
flag = BRIDGE
@@ -125,26 +79,12 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 2
supervisors = "command staff"
selection_color = "#2F2F7F"
- idtype = /obj/item/weapon/card/id/silver
- alt_titles = list("Command Liaison", "Bridge Secretary")
+ idtype = /obj/item/weapon/card/id/silver/secretary
minimal_player_age = 5
economic_modifier = 7
access = list(access_heads)
minimal_access = list(access_heads)
-/datum/job/secretary/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
- if(H.gender == FEMALE)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/female/skirt(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/charcoal(H), slot_w_uniform)
- return 1
\ No newline at end of file
+ outfit_type = /decl/hierarchy/outfit/job/secretary
+ alt_titles = list("Command Liaison", "Bridge Secretary")
\ No newline at end of file
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 40b4c2cf92..9786c72ea0 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -9,32 +9,12 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/bartender
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_bar)
- alt_titles = list("Barista")
-
-
-/datum/job/bartender/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt)
- if(has_alt_title(H, alt_title,"Bartender"))
- var/obj/item/clothing/accessory/permit/gun/bar/permit = new(H)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(permit, slot_l_hand)
- else
- H.equip_to_slot_or_del(permit, slot_in_backpack)
- permit.set_name(H.real_name)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/service/bartender
+ alt_titles = list("Barista" = /decl/hierarchy/outfit/job/service/bartender/barista)
/datum/job/chef
@@ -47,26 +27,15 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/chef
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_kitchen)
+
+ outfit_type = /decl/hierarchy/outfit/job/service/chef
alt_titles = list("Cook")
-
-/datum/job/chef/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chef(H), slot_belt)
- return 1
-
-
-
/datum/job/hydro
- title = "Gardener"
+ title = "Botanist"
flag = BOTANIST
department = "Civilian"
department_flag = CIVILIAN
@@ -75,29 +44,12 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/botanist
access = list(access_hydroponics, access_bar, access_kitchen)
minimal_access = list(access_hydroponics)
- alt_titles = list("Hydroponicist")
-
-
-/datum/job/hydro/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
- H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/hyd(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/hyd(H), slot_back)
- return 1
-
+ outfit_type = /decl/hierarchy/outfit/job/service/gardener
+ alt_titles = list("Hydroponicist", "Gardener")
//Cargo
/datum/job/qm
@@ -114,23 +66,11 @@
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station)
- alt_titles = list("Supply Chief")
ideal_character_age = 40
-
-/datum/job/qm/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/quartermaster(H), slot_belt)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/cargo/qm
+ alt_titles = list("Supply Chief")
/datum/job/cargo_tech
title = "Cargo Technician"
@@ -142,20 +82,11 @@
spawn_positions = 2
supervisors = "the quartermaster and the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/cargo
+ idtype = /obj/item/weapon/card/id/cargo/cargo_tech
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
-/datum/job/cargo_tech/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/cargo(H), slot_belt)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/cargo/cargo_tech
/datum/job/mining
title = "Shaft Miner"
@@ -167,37 +98,15 @@
spawn_positions = 3
supervisors = "the quartermaster and the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/cargo
+ idtype = /obj/item/weapon/card/id/cargo/mining
economic_modifier = 5
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
+
+ outfit_type = /decl/hierarchy/outfit/job/cargo/mining
alt_titles = list("Drill Technician","Prospector")
-/datum/job/mining/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo (H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
- return 1
-
-/datum/job/mining/equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
-
+//Service
/datum/job/janitor
title = "Janitor"
flag = JANITOR
@@ -208,22 +117,13 @@
spawn_positions = 2
supervisors = "the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/janitor
access = list(access_janitor, access_maint_tunnels)
minimal_access = list(access_janitor, access_maint_tunnels)
+
+ outfit_type = /decl/hierarchy/outfit/job/service/janitor
alt_titles = list("Custodian", "Sanitation Technician")
-
-/datum/job/janitor/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
- return 1
-
-
-
//More or less assistants
/datum/job/librarian
title = "Librarian"
@@ -235,22 +135,13 @@
spawn_positions = 2 // VOREStation Edit. Original number is 1.
supervisors = "the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/librarian
access = list(access_library, access_maint_tunnels)
minimal_access = list(access_library)
+
+ outfit_type = /decl/hierarchy/outfit/job/librarian
alt_titles = list("Journalist", "Professor", "Historian", "Writer")
-
-/datum/job/librarian/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/librarian(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_l_hand)
- return 1
-
-
-
//var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds.
/datum/job/lawyer
title = "Internal Affairs Agent"
@@ -262,29 +153,17 @@
spawn_positions = 2
supervisors = "company officials and Corporate Regulations"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/internal_affairs_agent
economic_modifier = 7
access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads)
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
minimal_player_age = 7
+ outfit_type = /decl/hierarchy/outfit/job/internal_affairs_agent
-/datum/job/lawyer/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/ia(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
-
- H.implant_loyalty()
-
-
- return 1
+/*
+/datum/job/lawyer/equip(var/mob/living/carbon/human/H)
+ . = ..()
+ if(.)
+ H.implant_loyalty(H)
+*/
\ No newline at end of file
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 2533bb7204..95809c63f4 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -9,23 +9,23 @@
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#515151"
- idtype = /obj/item/weapon/card/id/civilian
+ idtype = /obj/item/weapon/card/id/civilian/chaplain
access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels)
minimal_access = list(access_chapel_office, access_crematorium)
alt_titles = list("Counselor")
+ outfit_type = /decl/hierarchy/outfit/job/chaplain
/datum/job/chaplain/equip(var/mob/living/carbon/human/H, var/alt_title, var/ask_questions = TRUE)
- if(!H) return 0
-
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H) //BS12 EDIT
- H.equip_to_slot_or_del(B, slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chaplain(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ . = ..()
+ if(!.)
+ return
if(!ask_questions)
- return 1
+ return
+ var/obj/item/weapon/storage/bible/B = locate(/obj/item/weapon/storage/bible) in H
+ if(!B)
+ return
spawn(0)
var/religion_name = "Christianity"
@@ -33,7 +33,6 @@
if (!new_religion)
new_religion = religion_name
-
switch(lowertext(new_religion))
if("christianity")
B.name = pick("The Holy Bible","The Dead Sea Scrolls")
@@ -83,10 +82,6 @@
if("Koran")
B.icon_state = "koran"
B.item_state = "koran"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(4)
if("Scrapbook")
B.icon_state = "scrapbook"
B.item_state = "scrapbook"
@@ -102,10 +97,6 @@
if("Athiest")
B.icon_state = "athiest"
B.item_state = "syringe_kit"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(10)
if("Tome")
B.icon_state = "tome"
B.item_state = "syringe_kit"
@@ -118,10 +109,6 @@
if("Scientology")
B.icon_state = "scientology"
B.item_state = "scientology"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(8)
if("the bible melts")
B.icon_state = "melted"
B.item_state = "melted"
@@ -129,13 +116,8 @@
B.icon_state = "necronomicon"
B.item_state = "necronomicon"
else
- // if christian bible, revert to default
B.icon_state = "bible"
B.item_state = "bible"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(2)
H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
@@ -144,7 +126,7 @@
accepted = 1
if("No")
if(outoftime)
- H << "Welp, out of time, buddy. You're stuck. Next time choose faster."
+ to_chat(H, "Welp, out of time, buddy. You're stuck. Next time choose faster.")
accepted = 1
if(ticker)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index e0efde55ad..bbc1903fd4 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -27,28 +27,7 @@
access_ce, access_RC_announce, access_keycard_auth, access_tcomsat, access_ai_upload)
minimal_player_age = 7
-
-/datum/job/chief_engineer/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/ce(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- return 1
-
-/datum/job/chief_engineer/equip_survival(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
-
+ outfit_type = /decl/hierarchy/outfit/job/engineering/chief_engineer
/datum/job/engineer
title = "Station Engineer"
@@ -60,7 +39,7 @@
spawn_positions = 5
supervisors = "the chief engineer"
selection_color = "#5B4D20"
- idtype = /obj/item/weapon/card/id/engineering
+ idtype = /obj/item/weapon/card/id/engineering/engineer
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics)
minimal_access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction)
@@ -68,27 +47,7 @@
minimal_player_age = 3
-/datum/job/engineer/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
- H.equip_to_slot_or_del(new /obj/item/device/pda/engineering(H), slot_l_store)
- return 1
-
-/datum/job/engineer/equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
-
+ outfit_type = /decl/hierarchy/outfit/job/engineering/engineer
/datum/job/atmos
title = "Atmospheric Technician"
@@ -100,28 +59,11 @@
spawn_positions = 2
supervisors = "the chief engineer"
selection_color = "#5B4D20"
- idtype = /obj/item/weapon/card/id/engineering
+ idtype = /obj/item/weapon/card/id/engineering/atmos
economic_modifier = 5
access = list(access_eva, access_engine, access_engine_equip, access_tech_storage, access_maint_tunnels, access_external_airlocks, access_construction, access_atmospherics, access_external_airlocks)
minimal_access = list(access_eva, access_engine, access_atmospherics, access_maint_tunnels, access_emergency_storage, access_construction, access_external_airlocks)
minimal_player_age = 3
-/datum/job/atmos/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
- return 1
-
-/datum/job/atmos/equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/engineering/atmos
\ No newline at end of file
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index dd265203d6..453fd88774 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -25,9 +25,21 @@
var/account_allowed = 1 // Does this job type come with a station account?
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
-/datum/job/proc/equip(var/mob/living/carbon/human/H)
+ var/outfit_type
+
+/datum/job/proc/equip(var/mob/living/carbon/human/H, var/alt_title)
+ var/decl/hierarchy/outfit/outfit = get_outfit(H, alt_title)
+ if(!outfit)
+ return FALSE
+ . = outfit.equip(H, title, alt_title)
return 1
+/datum/job/proc/get_outfit(var/mob/living/carbon/human/H, var/alt_title)
+ if(alt_title && alt_titles)
+ . = alt_titles[alt_title]
+ . = . || outfit_type
+ . = outfit_by_type(.)
+
/datum/job/proc/equip_backpack(var/mob/living/carbon/human/H)
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
@@ -35,11 +47,6 @@
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
-/datum/job/proc/equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,0)
- return 1
-
/datum/job/proc/setup_account(var/mob/living/carbon/human/H)
if(!account_allowed || (H.mind && H.mind.initial_account))
return
@@ -71,9 +78,12 @@
H << "Your account number is: [M.account_number], your account pin is: [M.remote_access_pin]"
-// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/del()
+// overrideable separately so AIs/borgs can have cardborg hats without unneccessary new()/qdel()
/datum/job/proc/equip_preview(mob/living/carbon/human/H, var/alt_title)
- . = equip(H, alt_title)
+ var/decl/hierarchy/outfit/outfit = get_outfit(H, alt_title)
+ if(!outfit)
+ return FALSE
+ . = outfit.equip_base(H, title, alt_title)
/datum/job/proc/get_access()
if(!config || config.jobs_have_minimal_access)
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index 11cc55e24b..a5e6498dec 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -23,21 +23,7 @@
minimal_player_age = 10
ideal_character_age = 50
-/datum/job/cmo/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/cmo(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/medical/cmo
/datum/job/doctor
title = "Medical Doctor"
@@ -49,58 +35,16 @@
spawn_positions = 3
supervisors = "the chief medical officer"
selection_color = "#013D3B"
- idtype = /obj/item/weapon/card/id/medical
+ idtype = /obj/item/weapon/card/id/medical/doctor
economic_modifier = 7
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_eva)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
- alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
-
-/datum/job/doctor/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
- if(has_alt_title(H, alt_title,"Emergency Physician"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
- else if(has_alt_title(H, alt_title,"Surgeon"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/scrubs(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/blue(H), slot_head)
- else if(has_alt_title(H, alt_title,"Virologist"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/viro(H), slot_back)
- else if(has_alt_title(H, alt_title,"Medical Doctor"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- else if(has_alt_title(H, alt_title,"Nurse"))
- if(H.gender == FEMALE)
- if(prob(50))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/nursehat(H), slot_head)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/scrubs/purple(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store)
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/medical/doctor
+ alt_titles = list(
+ "Surgeon" = /decl/hierarchy/outfit/job/medical/doctor/surgeon,
+ "Emergency Physician" = /decl/hierarchy/outfit/job/medical/doctor/emergency_physician,
+ "Nurse" = /decl/hierarchy/outfit/job/medical/doctor/nurse,
+ "Virologist" = /decl/hierarchy/outfit/job/medical/doctor/virologist)
//Chemist is a medical job damnit //YEAH FUCK YOU SCIENCE -Pete //Guys, behave -Erro
/datum/job/chemist
@@ -113,7 +57,7 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
- idtype = /obj/item/weapon/card/id/medical
+ idtype = /obj/item/weapon/card/id/medical/chemist
economic_modifier = 5
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
minimal_access = list(access_medical, access_medical_equip, access_chemistry)
@@ -121,20 +65,7 @@
minimal_player_age = 3
-/datum/job/chemist/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/chem(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/chem(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
- return 1
-
+ outfit_type = /decl/hierarchy/outfit/job/medical/chemist
/* I'm commenting out Geneticist so you can't actually see it in the job menu, given that you can't play as one - Jon.
/datum/job/geneticist
@@ -147,23 +78,12 @@
spawn_positions = 0
supervisors = "the chief medical officer and research director"
selection_color = "#013D3B"
+ idtype = /obj/item/weapon/card/id/medical/geneticist
economic_modifier = 7
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
-/datum/job/geneticist/equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/gen(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/medical/geneticist
*/
/datum/job/psychiatrist
@@ -177,29 +97,11 @@
economic_modifier = 5
supervisors = "the chief medical officer"
selection_color = "#013D3B"
- idtype = /obj/item/weapon/card/id/medical
+ idtype = /obj/item/weapon/card/id/medical/psychiatrist
access = list(access_medical, access_medical_equip, access_morgue, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
- alt_titles = list("Psychologist")
-
-/datum/job/psychiatrist/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- if(has_alt_title(H, alt_title,"Psychiatrist"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
- else if(has_alt_title(H, alt_title,"Psychologist"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
-
+ outfit_type = /decl/hierarchy/outfit/job/medical/psychiatrist
+ alt_titles = list("Psychologist" = /decl/hierarchy/outfit/job/medical/psychiatrist/psychologist)
/datum/job/Paramedic
title = "Paramedic"
@@ -211,35 +113,9 @@
spawn_positions = 2
supervisors = "the chief medical officer"
selection_color = "#013D3B"
- idtype = /obj/item/weapon/card/id/medical
+ idtype = /obj/item/weapon/card/id/medical/paramedic
economic_modifier = 4
access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_chemistry, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist)
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks)
- alt_titles = list("Emergency Medical Technician")
-
-/datum/job/Paramedic/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
- if(has_alt_title(H, alt_title,"Emergency Medical Technician"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
- else if(has_alt_title(H, alt_title,"Paramedic"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/scrubs(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/emt(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_l_store)
- return 1
-
-/datum/job/Paramedic/equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/medical/paramedic
+ alt_titles = list("Emergency Medical Technician" = /decl/hierarchy/outfit/job/medical/paramedic/emt)
\ No newline at end of file
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 0961963305..bbf4720dfd 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -26,22 +26,8 @@
minimal_player_age = 14
ideal_character_age = 50
-/datum/job/rd/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/science/rd
+ alt_titles = list("Research Supervisor")
/datum/job/scientist
title = "Scientist"
@@ -53,27 +39,15 @@
spawn_positions = 3
supervisors = "the research director"
selection_color = "#633D63"
- idtype = /obj/item/weapon/card/id/science
+ idtype = /obj/item/weapon/card/id/science/scientist
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_xenoarch)
minimal_access = list(access_tox, access_tox_storage, access_research, access_xenoarch)
- alt_titles = list("Xenoarcheologist", "Anomalist", "Phoron Researcher")
minimal_player_age = 14
-/datum/job/scientist/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/science/scientist
+ alt_titles = list("Xenoarchaeologist", "Anomalist", "Phoron Researcher")
/datum/job/xenobiologist
title = "Xenobiologist"
@@ -85,27 +59,15 @@
spawn_positions = 2
supervisors = "the research director"
selection_color = "#633D63"
- idtype = /obj/item/weapon/card/id/science
+ idtype = /obj/item/weapon/card/id/science/xenobiologist
economic_modifier = 7
access = list(access_robotics, access_tox, access_tox_storage, access_research, access_xenobiology, access_hydroponics)
minimal_access = list(access_research, access_xenobiology, access_hydroponics, access_tox_storage)
- alt_titles = list("Xenobotanist")
minimal_player_age = 14
-/datum/job/xenobiologist/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/science/xenobiologist
+ alt_titles = list("Xenobotanist")
/datum/job/roboticist
title = "Roboticist"
@@ -117,22 +79,11 @@
spawn_positions = 2
supervisors = "research director"
selection_color = "#633D63"
- idtype = /obj/item/weapon/card/id/science
+ idtype = /obj/item/weapon/card/id/science/roboticist
economic_modifier = 5
access = list(access_robotics, access_tox, access_tox_storage, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
minimal_access = list(access_robotics, access_tech_storage, access_morgue, access_research) //As a job that handles so many corpses, it makes sense for them to have morgue access.
- alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
-
minimal_player_age = 7
-/datum/job/roboticist/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_r_store)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/science/roboticist
+ alt_titles = list("Biomechanical Engineer","Mechatronic Engineer")
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 444f9daf55..d9623d06e8 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -18,34 +18,13 @@
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory,
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
- access_research, access_engine, access_mining, access_construction, access_mailsorting,
+ access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)//VOREStation Edit
- alt_titles = list("Commander", "Chief of Security")
minimum_character_age = 25
minimal_player_age = 14
-/datum/job/hos/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
-// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
- H.implant_loyalty()
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/security/hos
+ alt_titles = list("Security Commander", "Chief of Security")
/datum/job/warden
title = "Warden"
@@ -57,34 +36,12 @@
spawn_positions = 1
supervisors = "the head of security"
selection_color = "#601C1C"
- idtype = /obj/item/weapon/card/id/security
+ idtype = /obj/item/weapon/card/id/security/warden
economic_modifier = 5
access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 5
-
-/datum/job/warden/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
-// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
- H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/security/warden
/datum/job/detective
title = "Detective"
@@ -96,40 +53,13 @@
spawn_positions = 2
supervisors = "the head of security"
selection_color = "#601C1C"
- idtype = /obj/item/weapon/card/id/security
- alt_titles = list("Forensic Technician","Investigator")
+ idtype = /obj/item/weapon/card/id/security/detective
access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
economic_modifier = 5
minimal_player_age = 3
-
-/datum/job/detective/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store)
- if(H.backbag == 1)//Why cant some of these things spawn in his office?
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
- if(has_alt_title(H, alt_title,"Forensic Technician"))
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit, slot_r_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_trench(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/det(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit(H), slot_r_hand)
- return 1
-
-
+ outfit_type = /decl/hierarchy/outfit/job/security/detective
+ alt_titles = list("Forensic Technician" = /decl/hierarchy/outfit/job/security/detective/forensic, "Investigator")
/datum/job/officer
title = "Security Officer"
@@ -141,29 +71,10 @@
spawn_positions = 4
supervisors = "the head of security"
selection_color = "#601C1C"
- idtype = /obj/item/weapon/card/id/security
- alt_titles = list("Junior Officer")
+ idtype = /obj/item/weapon/card/id/security/officer
economic_modifier = 4
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 3
-
-/datum/job/officer/equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store)
- H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
- return 1
+ outfit_type = /decl/hierarchy/outfit/job/security/officer
+ alt_titles = list("Junior Officer")
\ No newline at end of file
diff --git a/code/game/jobs/job/silicon.dm b/code/game/jobs/job/silicon.dm
index d9aa96f710..1b063894ba 100644
--- a/code/game/jobs/job/silicon.dm
+++ b/code/game/jobs/job/silicon.dm
@@ -11,17 +11,18 @@
minimal_player_age = 7
account_allowed = 0
economic_modifier = 0
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
- equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
-
- equip_backpack(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
+/datum/job/ai/equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ return 1
+/*
+/datum/job/ai/equip_survival(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ return 1
+*/
+/datum/job/ai/equip_backpack(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ return 1
/datum/job/ai/is_position_available()
return (empty_playable_ai_cores.len != 0)
@@ -45,18 +46,18 @@
account_allowed = 0
economic_modifier = 0
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
-
- equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
-
- equip_backpack(var/mob/living/carbon/human/H)
- if(!H) return 0
- return 1
- return 1
+/datum/job/cyborg/equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ return 1
+/*
+/datum/job/cyborg/equip_survival(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ return 1
+*/
+/datum/job/cyborg/equip_backpack(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ return 1
+ 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)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index a11008294e..27a84b8c31 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -365,7 +365,8 @@ var/global/datum/controller/occupations/job_master
H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!"
continue
- H.amend_exploitable(G.path)
+ if(G.exploitable)
+ H.amend_exploitable(G.path)
if(G.slot == "implant")
H.implant_loadout(G)
@@ -385,10 +386,10 @@ var/global/datum/controller/occupations/job_master
else
spawn_in_storage += thing
//Equip job items.
- job.equip(H)
job.setup_account(H)
+ job.equip(H, H.mind ? H.mind.role_alt_title : "")
job.equip_backpack(H)
- job.equip_survival(H)
+// job.equip_survival(H)
job.apply_fingerprints(H)
H.equip_post_job()
@@ -543,7 +544,7 @@ var/global/datum/controller/occupations/job_master
H.equip_to_slot_or_del(C, slot_wear_id)
- H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
+// H.equip_to_slot_or_del(new /obj/item/device/pda(H), slot_belt)
if(locate(/obj/item/device/pda,H))
var/obj/item/device/pda/pda = locate(/obj/item/device/pda,H)
pda.owner = H.real_name
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 15bbfdeee5..b5f5af5bb6 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -146,6 +146,7 @@
if(DEAD)
data["stat"] = "Dead"
data["health"] = occupant.health
+ data["maxHealth"] = occupant.getMaxHealth()
if(iscarbon(occupant))
var/mob/living/carbon/C = occupant
data["pulse"] = C.get_pulse(GETPULSE_TOOL)
@@ -189,8 +190,8 @@
go_out()
if(href_list["beaker"])
remove_beaker()
- if(href_list["filter"])
- if(filtering != text2num(href_list["filter"]))
+ if(href_list["sleeper_filter"])
+ if(filtering != text2num(href_list["sleeper_filter"]))
toggle_filter()
if(href_list["chemical"] && href_list["amount"])
if(occupant && occupant.stat != DEAD)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 16359f5b26..42654277e0 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -270,6 +270,7 @@
occupantData["name"] = H.name
occupantData["stat"] = H.stat
occupantData["health"] = H.health
+ occupantData["maxHealth"] = H.getMaxHealth()
occupantData["hasVirus"] = H.virus2.len
@@ -427,7 +428,7 @@
t1 = "Unconscious"
else
t1 = "*dead*"
- dat += " 50 ? "blue" : "red"]>\tHealth %: [occupant.health], ([t1])
"
+ dat += " (occupant.getMaxHealth() / 2) ? "blue" : "red"]>\tHealth %: [(occupant.health / occupant.getMaxHealth())*100], ([t1])
"
if(occupant.virus2.len)
dat += "Viral pathogen detected in blood stream.
"
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index 546e6acd88..ac1e21051a 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -56,7 +56,7 @@
signal.data["nitrogen"] = 0
signal.data["carbon_dioxide"] = 0
signal.data["sigtype"]="status"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
/obj/machinery/air_sensor/proc/set_frequency(new_frequency)
radio_controller.remove_object(src, frequency)
@@ -239,7 +239,7 @@ obj/machinery/computer/general_air_control/Destroy()
. = 1
signal.data["sigtype"]="command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
/obj/machinery/computer/general_air_control/supermatter_core
icon = 'icons/obj/computer.dmi'
@@ -349,7 +349,7 @@ obj/machinery/computer/general_air_control/Destroy()
. = 1
signal.data["sigtype"]="command"
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
/obj/machinery/computer/general_air_control/fuel_injection
icon = 'icons/obj/computer.dmi'
@@ -386,7 +386,7 @@ obj/machinery/computer/general_air_control/Destroy()
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
..()
@@ -446,7 +446,7 @@ obj/machinery/computer/general_air_control/Destroy()
"status" = 1,
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
if(href_list["toggle_automation"])
automation = !automation
@@ -465,7 +465,7 @@ obj/machinery/computer/general_air_control/Destroy()
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
if(href_list["injection"])
if(!radio_connection)
@@ -480,4 +480,4 @@ obj/machinery/computer/general_air_control/Destroy()
"sigtype"="command"
)
- radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
\ No newline at end of file
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_ATMOSIA)
\ No newline at end of file
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index b467a3a375..4a8b4f2d3c 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -1,5 +1,5 @@
/obj/machinery/biogenerator
- name = "Biogenerator"
+ name = "biogenerator"
desc = ""
icon = 'icons/obj/biogenerator.dmi'
icon_state = "biogen-stand"
@@ -115,6 +115,7 @@
dat += "Utility belt ([round(300/build_eff)])
"
dat += "Leather Satchel ([round(400/build_eff)])
"
dat += "Cash Bag ([round(400/build_eff)])
"
+ dat += "Chemistry Bag ([round(400/build_eff)])
"
dat += "Workboots ([round(400/build_eff)])
"
dat += "Leather Shoes ([round(400/build_eff)])
"
@@ -219,6 +220,8 @@
new/obj/item/weapon/storage/backpack/satchel(loc)
if("cashbag")
new/obj/item/weapon/storage/bag/cash(loc)
+ if("chembag")
+ new/obj/item/weapon/storage/bag/chemistry(loc)
if("monkey")
new/mob/living/carbon/human/monkey(loc)
if("workboots")
@@ -271,4 +274,4 @@
man_rating += P.rating
build_eff = man_rating
- eat_eff = bin_rating
\ No newline at end of file
+ eat_eff = bin_rating
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 6fd9cf0f4e..5bddc29499 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -204,7 +204,7 @@
use_power(7500) //This might need tweaking.
return
- else if((occupant.health >= heal_level || occupant.health == occupant.maxHealth) && (!eject_wait))
+ else if((occupant.health >= heal_level || occupant.health == occupant.getMaxHealth()) && (!eject_wait))
playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
audible_message("\The [src] signals that the cloning process is complete.")
connected_message("Cloning Process Complete.")
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 408e3184d4..d546ef4676 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -387,9 +387,9 @@
var/dat = ""
if(gameStatus == ORION_STATUS_GAMEOVER)
dat = "Game Over
"
- dat += "Like many before you, your crew never made it to Orion, lost to space...
Forever."
+ dat += "Like many before you, your crew never made it to Orion, lost to space...
forever."
if(settlers.len == 0)
- dat += "
Your entire crew died, your ship joins the fleet of ghost-ships littering the galaxy."
+ dat += "
Your entire crew died, and your ship joins the fleet of ghost-ships littering the galaxy."
else
if(food <= 0)
dat += "
You ran out of food and starved."
@@ -650,17 +650,17 @@
if(prob(success))
FU = rand(5,15)
FO = rand(5,15)
- last_spaceport_action = "You successfully raided the spaceport! you gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)"
+ last_spaceport_action = "You successfully raided the spaceport! You gained [FU] Fuel and [FO] Food! (+[FU]FU,+[FO]FO)"
else
FU = rand(-5,-15)
FO = rand(-5,-15)
- last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)"
+ last_spaceport_action = "You failed to raid the spaceport! You lost [FU*-1] Fuel and [FO*-1] Food in your scramble to escape! ([FU]FU,[FO]FO)"
//your chance of lose a crewmember is 1/2 your chance of success
//this makes higher % failures hurt more, don't get cocky space cowboy!
if(prob(success*5))
var/lost_crew = remove_crewmember()
- last_spaceport_action = "You failed to raid the spaceport! you lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)"
+ last_spaceport_action = "You failed to raid the spaceport! You lost [FU*-1] Fuel and [FO*-1] Food, AND [lost_crew] in your scramble to escape! ([FU]FI,[FO]FO,-Crew)"
if(emagged)
src.visible_message("The machine states, 'YOU ARE UNDER ARREST, RAIDER!' and shoots handcuffs onto [usr]!", "You hear something say 'YOU ARE UNDER ARREST, RAIDER!' and a clinking sound")
var/obj/item/weapon/handcuffs/C = new(src.loc)
@@ -730,9 +730,9 @@
eventdat += "
They have stolen [sfood] Food and [sfuel] Fuel."
else if(prob(10))
var/deadname = remove_crewmember()
- eventdat += "
[deadname] tried to fight back but was killed."
+ eventdat += "
[deadname] tried to fight back, but was killed."
else
- eventdat += "
Fortunately you fended them off without any trouble."
+ eventdat += "
Fortunately, you fended them off without any trouble."
eventdat += "Continue
"
eventdat += "Close
"
canContinueEvent = 1
@@ -890,7 +890,7 @@
add_crewmember()
freecrew++
- eventdat += "
The traders of the spaceport take pitty on you, and give you some food and fuel (+[FU]FU,+[FO]FO)"
+ eventdat += "
The traders of the spaceport take pity on you, and give you some supplies. (+[FU]FU,+[FO]FO)"
if(freecrew)
eventdat += "
You also gain a new crewmember!"
@@ -904,13 +904,13 @@
if(food >= 10 && fuel >= 10)
eventdat += "Hire a new Crewmember (-10FU,-10FO)
"
else
- eventdat += "Cant afford a new Crewmember
"
+ eventdat += "You cannot afford a new Crewmember
"
//Sell crew
if(settlers.len > 1)
eventdat += "Sell crew for Fuel and Food (+7FU,+7FO)
"
else
- eventdat += "Cant afford to sell a Crewmember
"
+ eventdat += "You cannot afford to sell a Crewmember
"
//BUY/SELL STUFF
eventdat += "Spare Parts:
"
@@ -919,30 +919,30 @@
if(fuel > 5)
eventdat += "Buy Engine Parts (-5FU)
"
else
- eventdat += "Cant afford to buy Engine Parts"
+ eventdat += "
You cannot afford to buy Engine Parts"
//Hull plates
if(fuel > 5)
eventdat += "
Buy Hull Plates (-5FU)
"
else
- eventdat += "Cant afford to buy Hull Plates"
+ eventdat += "
You cannot afford to buy Hull Plates"
//Electronics
if(fuel > 5)
eventdat += "
Buy Spare Electronics (-5FU)
"
else
- eventdat += "Cant afford to buy Spare Electronics"
+ eventdat += "
You cannot afford to buy Spare Electronics"
//Trade
if(fuel > 5)
eventdat += "
Trade Fuel for Food (-5FU,+5FO)
"
else
- eventdat += "Cant afford to Trade Fuel for Food
You cannot afford to Trade Fuel for Food 5)
eventdat += "Trade Food for Fuel (+5FU,-5FO)
"
else
- eventdat += "Cant afford to Trade Food for Fuel
You cannot afford to Trade Food for Fuel!! Raid Spaceport !!"
@@ -1057,4 +1057,4 @@
#undef ORION_STATUS_START
#undef ORION_STATUS_NORMAL
#undef ORION_STATUS_GAMEOVER
-#undef ORION_STATUS_MARKET
\ No newline at end of file
+#undef ORION_STATUS_MARKET
diff --git a/code/game/machinery/computer3/networking.dm b/code/game/machinery/computer3/networking.dm
index 66d25dda5a..f88d8a4837 100644
--- a/code/game/machinery/computer3/networking.dm
+++ b/code/game/machinery/computer3/networking.dm
@@ -65,20 +65,20 @@
var/datum/radio_frequency/radio_connection = null
var/frequency = PUB_FREQ
- var/filter = null
+ var/rad_filter = null
var/range = null
var/subspace = 0
init()
..()
spawn(5)
- radio_connection = radio_controller.add_object(src, src.frequency, src.filter)
+ radio_connection = radio_controller.add_object(src, src.frequency, src.rad_filter)
proc/set_frequency(new_frequency)
if(radio_controller)
radio_controller.remove_object(src, frequency)
frequency = new_frequency
- radio_connection = radio_controller.add_object(src, frequency, filter)
+ radio_connection = radio_controller.add_object(src, frequency, rad_filter)
else
frequency = new_frequency
spawn(rand(5,10))
@@ -94,7 +94,7 @@
if(!computer || (computer.stat&~MAINT) || !computer.program) return
if(!radio_connection) return
- radio_connection.post_signal(src,signal,filter,range)
+ radio_connection.post_signal(src,signal,rad_filter,range)
get_machines(var/typekey)
if(!radio_connection || !radio_connection.frequency)
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index ba8aa85b2c..c87e78cfd5 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -101,7 +101,7 @@ obj/machinery/door/airlock/proc/send_status(var/bumped = 0)
if (bumped)
signal.data["bumped_with_access"] = 1
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
obj/machinery/door/airlock/open(surpress_send)
@@ -181,7 +181,7 @@ obj/machinery/airlock_sensor/attack_hand(mob/user)
signal.data["tag"] = master_tag
signal.data["command"] = command
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
flick("airlock_sensor_cycle", src)
obj/machinery/airlock_sensor/process()
@@ -196,7 +196,7 @@ obj/machinery/airlock_sensor/process()
signal.data["timestamp"] = world.time
signal.data["pressure"] = num2text(pressure)
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
previousPressure = pressure
@@ -269,7 +269,7 @@ obj/machinery/access_button/attack_hand(mob/user)
signal.data["tag"] = master_tag
signal.data["command"] = command
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
flick("access_button_cycle", src)
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 931e6cbe1e..ede8c53de2 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -162,7 +162,7 @@
return
if(alarmed && density && lockdown && !allowed(user))
- user << "Access denied. Please wait for authorities to arrive, or for the alert to clear."
+ user << "Access denied. Please wait for authorities to arrive, or for the alert to clear."
return
else
user.visible_message("\The [src] [density ? "open" : "close"]s for \the [user].",\
diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm
index a128e6c4e4..5a6b77931f 100644
--- a/code/game/machinery/embedded_controller/embedded_controller_base.dm
+++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm
@@ -69,11 +69,11 @@ obj/machinery/embedded_controller/radio/Destroy()
else
icon_state = "airlock_control_off"
-/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal, var/filter = null)
+/obj/machinery/embedded_controller/radio/post_signal(datum/signal/signal, var/radio_filter = null)
signal.transmission_method = TRANSMISSION_RADIO
if(radio_connection)
//use_power(radio_power_use) //neat idea, but causes way too much lag.
- return radio_connection.post_signal(src, signal, filter)
+ return radio_connection.post_signal(src, signal, radio_filter)
else
qdel(signal)
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index 049289c7c7..87eba96324 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -25,7 +25,7 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/telecomms/exonet_node(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm
index a7d5c780c3..fde455ae51 100644
--- a/code/game/machinery/pda_multicaster.dm
+++ b/code/game/machinery/pda_multicaster.dm
@@ -28,7 +28,7 @@
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/telecomms/pda_multicaster(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/ansible(src)
- component_parts += new /obj/item/weapon/stock_parts/subspace/filter(src)
+ component_parts += new /obj/item/weapon/stock_parts/subspace/sub_filter(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/subspace/treatment(src)
component_parts += new /obj/item/stack/cable_coil(src, 2)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 4547b4eaf3..e9f693e431 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -129,13 +129,13 @@ Buildable meters
src.pipe_type = PIPE_VOLUME_PUMP
else if(istype(make_from, /obj/machinery/atmospherics/binary/pump))
src.pipe_type = PIPE_PUMP
- else if(istype(make_from, /obj/machinery/atmospherics/trinary/filter/m_filter))
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter))
src.pipe_type = PIPE_GAS_FILTER_M
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer/t_mixer))
src.pipe_type = PIPE_GAS_MIXER_T
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer/m_mixer))
src.pipe_type = PIPE_GAS_MIXER_M
- else if(istype(make_from, /obj/machinery/atmospherics/trinary/filter))
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/atmos_filter))
src.pipe_type = PIPE_GAS_FILTER
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer))
src.pipe_type = PIPE_GAS_MIXER
@@ -175,7 +175,7 @@ Buildable meters
src.pipe_type = PIPE_CAP
else if(istype(make_from, /obj/machinery/atmospherics/omni/mixer))
src.pipe_type = PIPE_OMNI_MIXER
- else if(istype(make_from, /obj/machinery/atmospherics/omni/filter))
+ else if(istype(make_from, /obj/machinery/atmospherics/omni/atmos_filter))
src.pipe_type = PIPE_OMNI_FILTER
///// Z-Level stuff
else if(istype(make_from, /obj/machinery/atmospherics/pipe/zpipe/up/supply))
@@ -809,7 +809,7 @@ Buildable meters
P.node2.build_network()
if(PIPE_GAS_FILTER) //gas filter
- var/obj/machinery/atmospherics/trinary/filter/P = new(src.loc)
+ var/obj/machinery/atmospherics/trinary/atmos_filter/P = new(src.loc)
P.set_dir(dir)
P.initialize_directions = pipe_dir
if (pipename)
@@ -849,7 +849,7 @@ Buildable meters
P.node3.build_network()
if(PIPE_GAS_FILTER_M) //gas filter mirrored
- var/obj/machinery/atmospherics/trinary/filter/m_filter/P = new(src.loc)
+ var/obj/machinery/atmospherics/trinary/atmos_filter/m_filter/P = new(src.loc)
P.set_dir(dir)
P.initialize_directions = pipe_dir
if (pipename)
@@ -1232,7 +1232,7 @@ Buildable meters
P.initialize()
P.build_network()
if(PIPE_OMNI_FILTER)
- var/obj/machinery/atmospherics/omni/filter/P = new(loc)
+ var/obj/machinery/atmospherics/omni/atmos_filter/P = new(loc)
var/turf/T = P.loc
P.level = !T.is_plating() ? 2 : 1
P.initialize()
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 8eba407e72..1b181aebb5 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -45,6 +45,7 @@
var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements
var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
+ var/check_all = 0 //If active, will fire on anything, including synthetics.
var/ailock = 0 // AI cannot use this
var/attacked = 0 //if set to 1, the turret gets pissed off and shoots at people nearby (unless they have sec access!)
@@ -71,6 +72,7 @@
check_records = 1
check_weapons = 1
check_anomalies = 1
+ check_all = 0
/obj/machinery/porta_turret/stationary
ailock = 1
@@ -229,6 +231,7 @@ var/list/turret_icons
settings[++settings.len] = list("category" = "Check Arrest Status", "setting" = "check_arrest", "value" = check_arrest)
settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access)
settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
+ settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
data["settings"] = settings
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -278,6 +281,8 @@ var/list/turret_icons
check_access = value
else if(href_list["command"] == "check_anomalies")
check_anomalies = value
+ else if(href_list["command"] == "check_all")
+ check_all = value
return 1
@@ -465,7 +470,7 @@ var/list/turret_icons
var/list/targets = list() //list of primary targets
var/list/secondarytargets = list() //targets that are least important
- for(var/mob/M in mobs_in_view(world.view, src))
+ for(var/mob/M in mobs_in_xray_view(world.view, src))
assess_and_assign(M, targets, secondarytargets)
if(!tryToShootAt(targets))
@@ -496,7 +501,7 @@ var/list/turret_icons
if(!L)
return TURRET_NOT_TARGET
- if(!emagged && issilicon(L)) // Don't target silica
+ if(!emagged && issilicon(L) && check_all == 0) // Don't target silica, unless told to neutralize everything.
return TURRET_NOT_TARGET
if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really
@@ -514,7 +519,7 @@ var/list/turret_icons
if(lethal && locate(/mob/living/silicon/ai) in get_turf(L)) //don't accidentally kill the AI!
return TURRET_NOT_TARGET
- if(check_synth) //If it's set to attack all non-silicons, target them!
+ if(check_synth || check_all) //If it's set to attack all non-silicons or everything, target them!
if(L.lying)
return lethal ? TURRET_SECONDARY_TARGET : TURRET_NOT_TARGET
return TURRET_PRIORITY_TARGET
@@ -671,6 +676,7 @@ var/list/turret_icons
var/check_arrest
var/check_weapons
var/check_anomalies
+ var/check_all
var/ailock
/obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC)
@@ -686,6 +692,7 @@ var/list/turret_icons
check_arrest = TC.check_arrest
check_weapons = TC.check_weapons
check_anomalies = TC.check_anomalies
+ check_all = TC.check_all
ailock = TC.ailock
power_change()
diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm
index 17797e2a68..4f33f1703f 100644
--- a/code/game/machinery/turret_control.dm
+++ b/code/game/machinery/turret_control.dm
@@ -24,6 +24,7 @@
var/check_access = 1 //if this is active, the turret shoots everything that does not meet the access requirements
var/check_anomalies = 1 //checks if it can shoot at unidentified lifeforms (ie xenos)
var/check_synth = 0 //if active, will shoot at anything not an AI or cyborg
+ var/check_all = 0 //If active, will shoot at anything.
var/ailock = 0 //Silicons cannot use this
req_access = list(access_ai_upload)
@@ -130,6 +131,8 @@
settings[++settings.len] = list("category" = "Check Arrest Status", "setting" = "check_arrest", "value" = check_arrest)
settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access)
settings[++settings.len] = list("category" = "Check misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies)
+ settings[++settings.len] = list("category" = "Neutralize All Entities", "setting" = "check_all", "value" = check_all)
+
data["settings"] = settings
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
@@ -161,6 +164,8 @@
check_access = value
else if(href_list["command"] == "check_anomalies")
check_anomalies = value
+ else if(href_list["command"] == "check_all")
+ check_all = value
updateTurrets()
return 1
@@ -175,6 +180,7 @@
TC.check_arrest = check_arrest
TC.check_weapons = check_weapons
TC.check_anomalies = check_anomalies
+ TC.check_all = check_all
TC.ailock = ailock
if(istype(control_area))
diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index 77087ed32f..5d692b39b9 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -265,13 +265,13 @@
/obj/mecha/combat/Topic(href,href_list)
..()
- var/datum/topic_input/filter = new (href,href_list)
- if(filter.get("close"))
+ var/datum/topic_input/top_filter = new (href,href_list)
+ if(top_filter.get("close"))
am = null
return
/*
- if(filter.get("saminput"))
- if(md5(filter.get("saminput")) == am)
+ if(top_filter.get("saminput"))
+ if(md5(top_filter.get("saminput")) == am)
occupant_message("From the lies of the Antipath, Circuit preserve us.")
am = null
return
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index acd680ba57..4e895b2b62 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -105,15 +105,15 @@
Topic(href,href_list)
..()
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
- if(filter.get("eject"))
+ var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
+ if(top_filter.get("eject"))
go_out()
- if(filter.get("view_stats"))
+ if(top_filter.get("view_stats"))
chassis.occupant << browse(get_occupant_stats(),"window=msleeper")
onclose(chassis.occupant, "msleeper")
return
- if(filter.get("inject"))
- inject_reagent(filter.getType("inject",/datum/reagent),filter.getObj("source"))
+ if(top_filter.get("inject"))
+ inject_reagent(top_filter.getType("inject",/datum/reagent),top_filter.getObj("source"))
return
proc/get_occupant_stats()
@@ -473,19 +473,19 @@
Topic(href,href_list)
..()
- var/datum/topic_input/filter = new (href,href_list)
- if(filter.get("toggle_mode"))
+ var/datum/topic_input/top_filter = new (href,href_list)
+ if(top_filter.get("toggle_mode"))
mode = !mode
update_equip_info()
return
- if(filter.get("select_reagents"))
+ if(top_filter.get("select_reagents"))
processed_reagents.len = 0
var/m = 0
var/message
for(var/i=1 to known_reagents.len)
if(m>=synth_speed)
break
- var/reagent = filter.get("reagent_[i]")
+ var/reagent = top_filter.get("reagent_[i]")
if(reagent && (reagent in known_reagents))
message = "[m ? ", " : null][known_reagents[reagent]]"
processed_reagents += reagent
@@ -497,14 +497,14 @@
occupant_message("Reagent processing started.")
log_message("Reagent processing started.")
return
- if(filter.get("show_reagents"))
+ if(top_filter.get("show_reagents"))
chassis.occupant << browse(get_reagents_page(),"window=msyringegun")
- if(filter.get("purge_reagent"))
- var/reagent = filter.get("purge_reagent")
+ if(top_filter.get("purge_reagent"))
+ var/reagent = top_filter.get("purge_reagent")
if(reagent)
reagents.del_reagent(reagent)
return
- if(filter.get("purge_all"))
+ if(top_filter.get("purge_all"))
reagents.clear_reagents()
return
return
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index 4edaae81aa..3b8cf65816 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -290,4 +290,48 @@
return "* [chassis.selected==src?"":""][src.name][chassis.selected==src?"":""]\[[src.projectiles]\]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited/rearm()
- return//Extra bit of security
\ No newline at end of file
+ return//Extra bit of security
+
+//////////////
+//Fire-based//
+//////////////
+
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/incendiary
+ name = "\improper DR-AC 3"
+ desc = "Dual-barrel rotary machinegun that fires small, incendiary rounds. Ages ten and up."
+ description_fluff = "A weapon designed by Hephaestus Industries, the DR-AC 3's design was plagued by prototype faults including but not limited to: Spontaneous combustion, spontaneous detonation, and excessive collateral conflagration."
+ icon_state = "mecha_drac3"
+ equip_cooldown = 20
+ projectile = /obj/item/projectile/bullet/incendiary
+ fire_sound = 'sound/weapons/machinegun.ogg'
+ projectiles = 30
+ projectiles_per_shot = 2
+ deviation = 0.4
+ projectile_energy_cost = 40
+ fire_cooldown = 3
+ origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1)
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer
+ equip_cooldown = 30
+ name = "\improper CR-3 Mark 8"
+ desc = "An imposing device, this weapon hurls balls of fire."
+ description_fluff = "A weapon designed by Hephaestus for anti-infantry combat, the CR-3 is capable of outputting a large volume of synthesized fuel. Initially designed by a small company, later purchased by Aether, on Earth as a device made for clearing underbrush and co-operating with firefighting operations. Obviously, Hephaestus has found an 'improved' use for the Aether designs."
+ icon_state = "mecha_cremate"
+
+ energy_drain = 30
+
+ projectile = /obj/item/projectile/bullet/incendiary/flamethrower/large
+ fire_sound = 'sound/weapons/towelwipe.ogg'
+
+ origin_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 6, TECH_PHORON = 4, TECH_ILLEGAL = 4)
+
+/obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged
+ name = "\improper AA-CR-1 Mark 4"
+ description_fluff = "A firefighting tool maintained by Aether Atmospherics, whose initial design originated from a small Earth company. This one seems to have been jury rigged."
+
+ energy_drain = 50
+ required_type = list(/obj/mecha/combat, /obj/mecha/working)
+
+ projectile = /obj/item/projectile/bullet/incendiary/flamethrower
+
+ origin_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_ILLEGAL = 2)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 56149a254c..db8fc51992 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1498,10 +1498,10 @@
return
if(usr.stat > 0)
return
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
+ var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
if(href_list["select_equip"])
if(usr != src.occupant) return
- var/obj/item/mecha_parts/mecha_equipment/equip = filter.getObj("select_equip")
+ var/obj/item/mecha_parts/mecha_equipment/equip = top_filter.getObj("select_equip")
if(equip)
src.selected = equip
src.occupant_message("You switch to [equip]")
@@ -1532,7 +1532,7 @@
return
if(href_list["rfreq"])
if(usr != src.occupant) return
- var/new_frequency = (radio.frequency + filter.getNum("rfreq"))
+ var/new_frequency = (radio.frequency + top_filter.getNum("rfreq"))
if ((radio.frequency < PUBLIC_LOW_FREQ || radio.frequency > PUBLIC_HIGH_FREQ))
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
@@ -1574,11 +1574,11 @@
return
if(href_list["req_access"] && add_req_access)
if(!in_range(src, usr)) return
- output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+ output_access_dialog(top_filter.getObj("id_card"),top_filter.getMob("user"))
return
if(href_list["maint_access"] && maint_access)
if(!in_range(src, usr)) return
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
if(user)
if(state==0)
state = 1
@@ -1586,18 +1586,18 @@
else if(state==1)
state = 0
user << "The securing bolts are now hidden."
- output_maintenance_dialog(filter.getObj("id_card"),user)
+ output_maintenance_dialog(top_filter.getObj("id_card"),user)
return
if(href_list["set_internal_tank_valve"] && state >=1)
if(!in_range(src, usr)) return
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
if(user)
var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
if(new_pressure)
internal_tank_valve = new_pressure
user << "The internal pressure valve has been set to [internal_tank_valve]kPa."
if(href_list["remove_passenger"] && state >= 1)
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
var/list/passengers = list()
for (var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P in contents)
if (P.occupant)
@@ -1623,20 +1623,20 @@
P.go_out()
P.log_message("[occupant] was removed.")
return
- if(href_list["add_req_access"] && add_req_access && filter.getObj("id_card"))
+ if(href_list["add_req_access"] && add_req_access && top_filter.getObj("id_card"))
if(!in_range(src, usr)) return
- operation_req_access += filter.getNum("add_req_access")
- output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+ operation_req_access += top_filter.getNum("add_req_access")
+ output_access_dialog(top_filter.getObj("id_card"),top_filter.getMob("user"))
return
- if(href_list["del_req_access"] && add_req_access && filter.getObj("id_card"))
+ if(href_list["del_req_access"] && add_req_access && top_filter.getObj("id_card"))
if(!in_range(src, usr)) return
- operation_req_access -= filter.getNum("del_req_access")
- output_access_dialog(filter.getObj("id_card"),filter.getMob("user"))
+ operation_req_access -= top_filter.getNum("del_req_access")
+ output_access_dialog(top_filter.getObj("id_card"),top_filter.getMob("user"))
return
if(href_list["finish_req_access"])
if(!in_range(src, usr)) return
add_req_access = 0
- var/mob/user = filter.getMob("user")
+ var/mob/user = top_filter.getMob("user")
user << browse(null,"window=exosuit_add_access")
return
if(href_list["dna_lock"])
@@ -1669,9 +1669,9 @@
/*
if(href_list["debug"])
if(href_list["set_i_dam"])
- setInternalDamage(filter.getNum("set_i_dam"))
+ setInternalDamage(top_filter.getNum("set_i_dam"))
if(href_list["clear_i_dam"])
- clearInternalDamage(filter.getNum("clear_i_dam"))
+ clearInternalDamage(top_filter.getNum("clear_i_dam"))
return
*/
diff --git a/code/game/mecha/mecha_control_console.dm b/code/game/mecha/mecha_control_console.dm
index 00a0654cc1..de1f20fe0a 100644
--- a/code/game/mecha/mecha_control_console.dm
+++ b/code/game/mecha/mecha_control_console.dm
@@ -41,19 +41,19 @@
Topic(href, href_list)
if(..())
return
- var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
+ var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
if(href_list["send_message"])
- var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
+ var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("send_message")
var/message = sanitize(input(usr,"Input message","Transmit message") as text)
var/obj/mecha/M = MT.in_mecha()
if(message && M)
M.occupant_message(message)
return
if(href_list["shock"])
- var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
+ var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("shock")
MT.shock()
if(href_list["get_log"])
- var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
+ var/obj/item/mecha_parts/mecha_tracking/MT = top_filter.getObj("get_log")
stored_data = MT.get_mecha_log()
screen = 1
if(href_list["return"])
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index 2c28dd7ecb..03f743db6b 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -150,8 +150,10 @@
/obj/structure/foamedmetal/ex_act(severity)
qdel(src)
-/obj/structure/foamedmetal/bullet_act()
- if(metal == 1 || prob(50))
+/obj/structure/foamedmetal/bullet_act(var/obj/item/projectile/P)
+ if(istype(P, /obj/item/projectile/test))
+ return
+ else if(metal == 1 || prob(50))
qdel(src)
/obj/structure/foamedmetal/attack_hand(var/mob/user)
diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm
index 2bf3a2a574..85e68c31af 100644
--- a/code/game/objects/effects/decals/Cleanable/fuel.dm
+++ b/code/game/objects/effects/decals/Cleanable/fuel.dm
@@ -6,66 +6,66 @@
anchored = 1
var/amount = 1
- New(turf/newLoc,amt=1,nologs=0)
- if(!nologs)
- message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)")
- log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
- src.amount = amt
+/obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=0)
+ if(!nologs)
+ message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)")
+ log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])")
+ src.amount = amt
- var/has_spread = 0
- //Be absorbed by any other liquid fuel in the tile.
- for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
- if(other != src)
- other.amount += src.amount
- other.Spread()
- has_spread = 1
- break
-
- . = ..()
- if(!has_spread)
- Spread()
- else
- qdel(src)
-
- proc/Spread(exclude=list())
- //Allows liquid fuels to sometimes flow into other tiles.
- if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate.
- var/turf/simulated/S = loc
- if(!istype(S)) return
- for(var/d in cardinal)
- var/turf/simulated/target = get_step(src,d)
- var/turf/simulated/origin = get_turf(src)
- if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
- var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
- if(other_fuel)
- other_fuel.amount += amount*0.25
- if(!(other_fuel in exclude))
- exclude += src
- other_fuel.Spread(exclude)
- else
- new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
- amount *= 0.75
-
-
- flamethrower_fuel
- icon_state = "mustard"
- anchored = 0
- New(newLoc, amt = 1, d = 0)
- set_dir(d) //Setting this direction means you won't get torched by your own flamethrower.
- . = ..()
+ var/has_spread = 0
+ //Be absorbed by any other liquid fuel in the tile.
+ for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc)
+ if(other != src)
+ other.amount += src.amount
+ other.Spread()
+ has_spread = 1
+ break
+ . = ..()
+ if(!has_spread)
Spread()
- //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
- if(amount < 0.1) return
- var/turf/simulated/S = loc
- if(!istype(S)) return
+ else
+ qdel(src)
- for(var/d in list(turn(dir,90),turn(dir,-90), dir))
- var/turf/simulated/O = get_step(S,d)
- if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
- continue
- if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
- new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
- O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+/obj/effect/decal/cleanable/liquid_fuel/proc/Spread(exclude=list())
+ //Allows liquid fuels to sometimes flow into other tiles.
+ if(amount < 15) return //lets suppose welder fuel is fairly thick and sticky. For something like water, 5 or less would be more appropriate.
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+ for(var/d in cardinal)
+ var/turf/simulated/target = get_step(src,d)
+ var/turf/simulated/origin = get_turf(src)
+ if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0))
+ var/obj/effect/decal/cleanable/liquid_fuel/other_fuel = locate() in target
+ if(other_fuel)
+ other_fuel.amount += amount*0.25
+ if(!(other_fuel in exclude))
+ exclude += src
+ other_fuel.Spread(exclude)
+ else
+ new/obj/effect/decal/cleanable/liquid_fuel(target, amount*0.25,1)
+ amount *= 0.75
- amount *= 0.25
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel
+ icon_state = "mustard"
+ anchored = 0
+
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/New(newLoc, amt = 1, d = 0)
+ set_dir(d) //Setting this direction means you won't get torched by your own flamethrower.
+ . = ..()
+
+/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel/Spread()
+ //The spread for flamethrower fuel is much more precise, to create a wide fire pattern.
+ if(amount < 0.1) return
+ var/turf/simulated/S = loc
+ if(!istype(S)) return
+
+ for(var/d in list(turn(dir,90),turn(dir,-90), dir))
+ var/turf/simulated/O = get_step(S,d)
+ if(locate(/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel) in O)
+ continue
+ if(O.CanPass(null, S, 0, 0) && S.CanPass(null, O, 0, 0))
+ new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d)
+ O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately.
+
+ amount *= 0.25
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index e031b09f5e..547406aa1d 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -5,6 +5,7 @@
anchored = 1.0
unacidable = 1
simulated = 0
+ invisibility = 100
var/delete_me = 0
/obj/effect/landmark/New()
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index c2fb1074b4..4fdfa8a171 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -110,3 +110,77 @@
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset))
A.forceMove(T)
+
+/* Teleporter that sends objects stepping on it to a specific landmark. */
+
+/obj/effect/step_trigger/teleporter/landmark
+ var/obj/effect/landmark/the_landmark = null
+ var/landmark_id = null
+
+/obj/effect/step_trigger/teleporter/landmark/initialize()
+ for(var/obj/effect/landmark/teleport_mark/mark in tele_landmarks)
+ if(mark.landmark_id == landmark_id)
+ the_landmark = mark
+ return
+
+/obj/effect/step_trigger/teleporter/landmark/Trigger(var/atom/movable/A)
+ if(the_landmark)
+ A.forceMove(get_turf(the_landmark))
+
+
+var/global/list/tele_landmarks = list() // Terrible, but the alternative is looping through world.
+
+/obj/effect/landmark/teleport_mark
+ var/landmark_id = null
+
+/obj/effect/landmark/teleport_mark/New()
+ ..()
+ tele_landmarks += src
+
+/obj/effect/landmark/teleport_mark/Destroy()
+ tele_landmarks -= src
+ return ..()
+
+/* Teleporter which simulates falling out of the sky. */
+
+/obj/effect/step_trigger/teleporter/planetary_fall
+ var/datum/planet/planet = null
+/* //VOREStation Removal
+/obj/effect/step_trigger/teleporter/planetary_fall/sif/initialize()
+ planet = planet_sif
+*/ //VOREStation Removal end
+/obj/effect/step_trigger/teleporter/planetary_fall/Trigger(var/atom/movable/A)
+ if(planet)
+ if(!planet.planet_floors.len)
+ message_admins("ERROR: planetary_fall step trigger's list of outdoor floors was empty.")
+ return
+ var/turf/simulated/T = null
+ var/safety = 100 // Infinite loop protection.
+ while(!T && safety)
+ var/turf/simulated/candidate = pick(planet.planet_floors)
+ if(!istype(candidate) || istype(candidate, /turf/simulated/sky))
+ safety--
+ continue
+ else
+ T = candidate
+ break
+
+ if(!T)
+ message_admins("ERROR: planetary_fall step trigger could not find a suitable landing turf.")
+ return
+
+ if(isobserver(A))
+ A.forceMove(T) // Harmlessly move ghosts.
+ return
+
+ if(isliving(A)) // Someday, implement parachutes. For now, just turbomurder whoever falls.
+ var/mob/living/L = A
+ for(var/i = 1 to 6)
+ L.adjustBruteLoss(100)
+ message_admins("\The [A] fell out of the sky.")
+ explosion(T, 0, 1, 2)
+ A.forceMove(T)
+ T.visible_message("\A [A] falls out of the sky and crashes into \the [T]!")
+ else
+ message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.")
+ return
diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm
index 019425db0e..9de35c2582 100644
--- a/code/game/objects/items/devices/PDA/radio.dm
+++ b/code/game/objects/items/devices/PDA/radio.dm
@@ -29,7 +29,7 @@
if(key3)
signal.data[key3] = value3
- frequency.post_signal(src, signal, filter = s_filter)
+ frequency.post_signal(src, signal, radio_filter = s_filter)
return
@@ -47,7 +47,7 @@
..()
spawn(5)
if(radio_controller)
- radio_controller.add_object(src, control_freq, filter = RADIO_SECBOT)
+ radio_controller.add_object(src, control_freq, radio_filter = RADIO_SECBOT)
// receive radio signals
// can detect bot status signals
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 2c27e35010..6065d6a514 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -141,6 +141,7 @@
icon_l_hand = 'icons/mob/items/lefthand_guns.dmi',
icon_r_hand = 'icons/mob/items/righthand_guns.dmi',
)
+ slot_flags = SLOT_HOLSTER
w_class = ITEMSIZE_SMALL
attack_verb = list("attacked", "struck", "hit")
var/bullets = 5
@@ -343,7 +344,7 @@
icon_state = "sunflower"
item_state = "sunflower"
var/empty = 0
- flags
+ slot_flags = SLOT_HOLSTER
/obj/item/toy/waterflower/New()
var/datum/reagents/R = new/datum/reagents(10)
@@ -412,7 +413,7 @@
icon_state = "bosunwhistle"
var/cooldown = 0
w_class = ITEMSIZE_TINY
- slot_flags = SLOT_EARS
+ slot_flags = SLOT_EARS | SLOT_HOLSTER
/obj/item/toy/bosunwhistle/attack_self(mob/user as mob)
if(cooldown < world.time - 35)
@@ -529,8 +530,8 @@
icon_state = "bartender"
/obj/item/toy/figure/borg
- name = "Cyborg action figure"
- desc = "A \"Space Life\" brand Cyborg action figure."
+ name = "Drone action figure"
+ desc = "A \"Space Life\" brand Drone action figure."
icon_state = "borg"
/obj/item/toy/figure/gardener
@@ -599,8 +600,8 @@
icon_state = "geneticist"
/obj/item/toy/figure/hop
- name = "Head of Personel action figure"
- desc = "A \"Space Life\" brand Head of Personel action figure."
+ name = "Head of Personnel action figure"
+ desc = "A \"Space Life\" brand Head of Personnel action figure."
icon_state = "hop"
/obj/item/toy/figure/hos
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index e21c509c15..d79f584e2f 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -17,6 +17,7 @@
matter = list(DEFAULT_WALL_MATERIAL = 50000)
var/datum/effect/effect/system/spark_spread/spark_system
var/stored_matter = 0
+ var/max_stored_matter = 30
var/working = 0
var/mode = 1
var/list/modes = list("Floor & Walls","Airlock","Deconstruct")
@@ -32,7 +33,7 @@
/obj/item/weapon/rcd/examine()
..()
if(src.type == /obj/item/weapon/rcd && loc == usr)
- usr << "It currently holds [stored_matter]/30 matter-units."
+ usr << "It currently holds [stored_matter]/[max_stored_matter] matter-units."
/obj/item/weapon/rcd/New()
..()
@@ -48,14 +49,15 @@
/obj/item/weapon/rcd/attackby(obj/item/weapon/W, mob/user)
if(istype(W, /obj/item/weapon/rcd_ammo))
- if((stored_matter + 10) > 30)
- user << "The RCD can't hold any more matter-units."
+ var/obj/item/weapon/rcd_ammo/cartridge = W
+ if((stored_matter + cartridge.remaining) > max_stored_matter)
+ to_chat(user, "The RCD can't hold that many additional matter-units.")
return
+ stored_matter += cartridge.remaining
user.drop_from_inventory(W)
qdel(W)
- stored_matter += 10
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
- user << "The RCD now holds [stored_matter]/30 matter-units."
+ to_chat(user, "The RCD now holds [stored_matter]/[max_stored_matter] matter-units.")
return
..()
@@ -164,6 +166,14 @@
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MATERIAL = 2)
matter = list(DEFAULT_WALL_MATERIAL = 30000,"glass" = 15000)
+ var/remaining = 10
+
+/obj/item/weapon/rcd_ammo/large
+ name = "high-capacity matter cartridge"
+ desc = "Do not ingest."
+ matter = list(DEFAULT_WALL_MATERIAL = 45000,"glass" = 22500)
+ remaining = 30
+ origin_tech = list(TECH_MATERIAL = 4)
/obj/item/weapon/rcd/borg
canRwall = 1
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
deleted file mode 100644
index 4c32fda5f2..0000000000
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ /dev/null
@@ -1,370 +0,0 @@
-/* Cards
- * Contains:
- * DATA CARD
- * ID CARD
- * FINGERPRINT CARD HOLDER
- * FINGERPRINT CARD
- */
-
-
-
-/*
- * DATA CARDS - Used for the teleporter
- */
-/obj/item/weapon/card
- name = "card"
- desc = "Does card things."
- icon = 'icons/obj/card.dmi'
- w_class = ITEMSIZE_TINY
- slot_flags = SLOT_EARS
- var/associated_account_number = 0
-
- var/list/files = list( )
-
-/obj/item/weapon/card/data
- name = "data disk"
- desc = "A disk of data."
- icon_state = "data"
- var/function = "storage"
- var/data = "null"
- var/special = null
- item_state = "card-id"
-
-/obj/item/weapon/card/data/verb/label(t as text)
- set name = "Label Disk"
- set category = "Object"
- set src in usr
-
- if (t)
- src.name = text("data disk- '[]'", t)
- else
- src.name = "data disk"
- src.add_fingerprint(usr)
- return
-
-/obj/item/weapon/card/data/clown
- name = "\proper the coordinates to clown planet"
- icon_state = "data"
- item_state = "card-id"
- layer = 3
- level = 2
- desc = "This card contains coordinates to the fabled Clown Planet. Handle with care."
- function = "teleporter"
- data = "Clown Land"
-
-/*
- * ID CARDS
- */
-
-/obj/item/weapon/card/emag_broken
- desc = "It's a card with a magnetic strip attached to some circuitry. It looks too busted to be used for anything but salvage."
- name = "broken cryptographic sequencer"
- icon_state = "emag"
- item_state = "card-id"
- origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
-
-/obj/item/weapon/card/emag
- desc = "It's a card with a magnetic strip attached to some circuitry."
- name = "cryptographic sequencer"
- icon_state = "emag"
- item_state = "card-id"
- origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
- var/uses = 10
-
-/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user)
- var/used_uses = A.emag_act(uses, user, src)
- if(used_uses < 0)
- return ..(A, user)
-
- uses -= used_uses
- A.add_fingerprint(user)
- //Vorestation Edit: Because some things (read lift doors) don't get emagged
- if(used_uses)
- log_and_message_admins("emagged \an [A].")
- else
- log_and_message_admins("attempted to emag \an [A].")
- // Vorestation Edit: End of Edit
-
- if(uses<1)
- user.visible_message("\The [src] fizzles and sparks - it seems it's been used once too often, and is now spent.")
- user.drop_item()
- var/obj/item/weapon/card/emag_broken/junk = new(user.loc)
- junk.add_fingerprint(user)
- qdel(src)
-
- return 1
-
-/obj/item/weapon/card/emag/attackby(obj/item/O as obj, mob/user as mob)
- if(istype(O, /obj/item/stack/telecrystal))
- var/obj/item/stack/telecrystal/T = O
- if(T.amount < 1)
- usr << "You are not adding enough telecrystals to fuel \the [src]."
- return
- uses += T.amount/2 //Gives 5 uses per 10 TC
- uses = ceil(uses) //Ensures no decimal uses nonsense, rounds up to be nice
- usr << "You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses]."
- qdel(O)
-
-
-/obj/item/weapon/card/id
- name = "identification card"
- desc = "A card used to provide ID and determine access across the station."
- icon_state = "id"
- item_state = "card-id"
-
- sprite_sheets = list(
- "Teshari" = 'icons/mob/species/seromi/id.dmi'
- )
-
- var/access = list()
- var/registered_name = "Unknown" // The name registered_name on the card
- slot_flags = SLOT_ID | SLOT_EARS
-
- var/age = "\[UNSET\]"
- var/blood_type = "\[UNSET\]"
- var/dna_hash = "\[UNSET\]"
- var/fingerprint_hash = "\[UNSET\]"
- var/sex = "\[UNSET\]"
- var/icon/front
- var/icon/side
-
- var/primary_color = rgb(0,0,0) // Obtained by eyedroppering the stripe in the middle of the card
- var/secondary_color = rgb(0,0,0) // Likewise for the oval in the top-left corner
-
- //alt titles are handled a bit weirdly in order to unobtrusively integrate into existing ID system
- var/assignment = null //can be alt title or the actual job
- var/rank = null //actual job
- var/dorm = 0 // determines if this ID has claimed a dorm already
-
-/obj/item/weapon/card/id/examine(mob/user)
- set src in oview(1)
- if(in_range(usr, src))
- show(usr)
- usr << desc
- else
- usr << "It is too far away."
-
-/obj/item/weapon/card/id/proc/prevent_tracking()
- return 0
-
-/obj/item/weapon/card/id/proc/show(mob/user as mob)
- if(front && side)
- user << browse_rsc(front, "front.png")
- user << browse_rsc(side, "side.png")
- var/datum/browser/popup = new(user, "idcard", name, 600, 250)
- popup.set_content(dat())
- popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
- popup.open()
- return
-
-/obj/item/weapon/card/id/proc/update_name()
- name = "[src.registered_name]'s ID Card ([src.assignment])"
-
-/obj/item/weapon/card/id/proc/set_id_photo(var/mob/M)
- front = getFlatIcon(M, SOUTH, always_use_defdir = 1)
- side = getFlatIcon(M, WEST, always_use_defdir = 1)
-
-/mob/proc/set_id_info(var/obj/item/weapon/card/id/id_card)
- id_card.age = 0
- id_card.registered_name = real_name
- id_card.sex = capitalize(gender)
- id_card.set_id_photo(src)
-
- if(dna)
- id_card.blood_type = dna.b_type
- id_card.dna_hash = dna.unique_enzymes
- id_card.fingerprint_hash= md5(dna.uni_identity)
- id_card.update_name()
-
-/mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card)
- ..()
- id_card.age = age
-
-/obj/item/weapon/card/id/proc/dat()
- var/dat = ("")
- dat += text("Name: [] ", registered_name)
- dat += text("Sex: [] \n", sex)
- dat += text("Age: [] \n", age)
- dat += text("Rank: [] \n", assignment)
- dat += text("Fingerprint: [] \n", fingerprint_hash)
- dat += text("Blood Type: [] \n", blood_type)
- dat += text("DNA Hash: []
\n", dna_hash)
- if(front && side)
- dat +=" | Photo:
  | "
- dat += "
"
- return dat
-
-/obj/item/weapon/card/id/attack_self(mob/user as mob)
- user.visible_message("\The [user] shows you: \icon[src] [src.name]. The assignment on the card: [src.assignment]",\
- "You flash your ID card: \icon[src] [src.name]. The assignment on the card: [src.assignment]")
-
- src.add_fingerprint(user)
- return
-
-/obj/item/weapon/card/id/GetAccess()
- return access
-
-/obj/item/weapon/card/id/GetID()
- return src
-
-/obj/item/weapon/card/id/verb/read()
- set name = "Read ID Card"
- set category = "Object"
- set src in usr
-
- usr << text("\icon[] []: The current assignment on the card is [].", src, src.name, src.assignment)
- usr << "The blood type on the card is [blood_type]."
- usr << "The DNA hash on the card is [dna_hash]."
- usr << "The fingerprint hash on the card is [fingerprint_hash]."
- return
-
-/obj/item/weapon/card/id/silver
- name = "identification card"
- desc = "A silver card which shows honour and dedication."
- icon_state = "silver"
- item_state = "silver_id"
-
-/obj/item/weapon/card/id/gold
- name = "identification card"
- desc = "A golden card which shows power and might."
- icon_state = "gold"
- item_state = "gold_id"
-
-/obj/item/weapon/card/id/syndicate_command
- name = "syndicate ID card"
- desc = "An ID straight from the Syndicate."
- registered_name = "Syndicate"
- assignment = "Syndicate Overlord"
- access = list(access_syndicate, access_external_airlocks)
-
-/obj/item/weapon/card/id/captains_spare
- name = "colony director's spare ID"
- desc = "The spare ID of the High Lord himself."
- icon_state = "gold"
- item_state = "gold_id"
- registered_name = "Colony Director"
- assignment = "Colony Director"
-/obj/item/weapon/card/id/captains_spare/New()
- access = get_all_station_access()
- ..()
-
-/obj/item/weapon/card/id/synthetic
- name = "\improper Synthetic ID"
- desc = "Access module for NanoTrasen Synthetics"
- icon_state = "id-robot"
- item_state = "tdgreen"
- assignment = "Synthetic"
-
-/obj/item/weapon/card/id/synthetic/New()
- access = get_all_station_access() + access_synth
- ..()
-
-/obj/item/weapon/card/id/centcom
- name = "\improper CentCom. ID"
- desc = "An ID straight from Central Command."
- icon_state = "centcom"
- registered_name = "Central Command"
- assignment = "General"
- New()
- access = get_all_accesses()
- ..()
-
-/obj/item/weapon/card/id/centcom/ERT
- name = "\improper Emergency Response Team ID"
- assignment = "Emergency Response Team"
-
-/obj/item/weapon/card/id/centcom/ERT/New()
- ..()
- access |= get_all_station_access()
-
-// Department-flavor IDs
-/obj/item/weapon/card/id/medical
- name = "identification card"
- desc = "A card issued to station medical staff."
- icon_state = "med"
- primary_color = rgb(189,237,237)
- secondary_color = rgb(223,255,255)
-
-/obj/item/weapon/card/id/medical/head
- name = "identification card"
- desc = "A card which represents care and compassion."
- icon_state = "medGold"
- primary_color = rgb(189,237,237)
- secondary_color = rgb(255,223,127)
-
-/obj/item/weapon/card/id/security
- name = "identification card"
- desc = "A card issued to station security staff."
- icon_state = "sec"
- primary_color = rgb(189,47,0)
- secondary_color = rgb(223,127,95)
-
-/obj/item/weapon/card/id/security/head
- name = "identification card"
- desc = "A card which represents honor and protection."
- icon_state = "secGold"
- primary_color = rgb(189,47,0)
- secondary_color = rgb(255,223,127)
-
-/obj/item/weapon/card/id/engineering
- name = "identification card"
- desc = "A card issued to station engineering staff."
- icon_state = "eng"
- primary_color = rgb(189,94,0)
- secondary_color = rgb(223,159,95)
-
-/obj/item/weapon/card/id/engineering/head
- name = "identification card"
- desc = "A card which represents creativity and ingenuity."
- icon_state = "engGold"
- primary_color = rgb(189,94,0)
- secondary_color = rgb(255,223,127)
-
-/obj/item/weapon/card/id/science
- name = "identification card"
- desc = "A card issued to station science staff."
- icon_state = "sci"
- primary_color = rgb(142,47,142)
- secondary_color = rgb(191,127,191)
-
-/obj/item/weapon/card/id/science/head
- name = "identification card"
- desc = "A card which represents knowledge and reasoning."
- icon_state = "sciGold"
- primary_color = rgb(142,47,142)
- secondary_color = rgb(255,223,127)
-
-/obj/item/weapon/card/id/cargo
- name = "identification card"
- desc = "A card issued to station cargo staff."
- icon_state = "cargo"
- primary_color = rgb(142,94,0)
- secondary_color = rgb(191,159,95)
-
-/obj/item/weapon/card/id/cargo/head
- name = "identification card"
- desc = "A card which represents service and planning."
- icon_state = "cargoGold"
- primary_color = rgb(142,94,0)
- secondary_color = rgb(255,223,127)
-
-/obj/item/weapon/card/id/civilian
- name = "identification card"
- desc = "A card issued to station civilian staff."
- icon_state = "civ"
- primary_color = rgb(0,94,142)
- secondary_color = rgb(95,159,191)
-
-/obj/item/weapon/card/id/civilian/head //This is not the HoP. There's no position that uses this right now.
- name = "identification card"
- desc = "A card which represents common sense and responsibility."
- icon_state = "civGold"
- primary_color = rgb(0,94,142)
- secondary_color = rgb(255,223,127)
-
-/obj/item/weapon/card/id/external
- name = "identification card"
- desc = "An identification card of some sort. It does not look like it is issued by NT."
- icon_state = "permit"
- primary_color = rgb(142,94,0)
- secondary_color = rgb(191,159,95)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
index 1d806a2710..6d683cd9a8 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
@@ -35,7 +35,7 @@
origin_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
req_components = list(
/obj/item/weapon/stock_parts/manipulator/pico = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/subspace/treatment = 1,
/obj/item/weapon/stock_parts/subspace/analyzer = 1,
/obj/item/weapon/stock_parts/console_screen = 1,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
index 835971b012..856104dcce 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
@@ -11,7 +11,7 @@
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
req_components = list(
/obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/weapon/stock_parts/micro_laser = 1)
@@ -22,7 +22,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 2)
/obj/item/weapon/circuitboard/telecomms/relay
name = T_BOARD("relay mainframe")
@@ -31,7 +31,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 2,
- /obj/item/weapon/stock_parts/subspace/filter = 2)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 2)
/obj/item/weapon/circuitboard/telecomms/bus
name = T_BOARD("bus mainframe")
@@ -40,7 +40,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1)
/obj/item/weapon/circuitboard/telecomms/processor
name = T_BOARD("processor unit")
@@ -48,7 +48,7 @@
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 3,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/subspace/treatment = 2,
/obj/item/weapon/stock_parts/subspace/analyzer = 1,
/obj/item/stack/cable_coil = 2,
@@ -61,7 +61,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1)
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1)
/obj/item/weapon/circuitboard/telecomms/broadcaster
name = T_BOARD("subspace broadcaster")
@@ -70,7 +70,7 @@
req_components = list(
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/stack/cable_coil = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/subspace/crystal = 1,
/obj/item/weapon/stock_parts/micro_laser/high = 2)
@@ -81,7 +81,7 @@
origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4)
req_components = list(
/obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/manipulator = 2,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/subspace/crystal = 1,
@@ -94,7 +94,7 @@
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2)
req_components = list(
/obj/item/weapon/stock_parts/subspace/ansible = 1,
- /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/sub_filter = 1,
/obj/item/weapon/stock_parts/manipulator = 1,
/obj/item/weapon/stock_parts/subspace/treatment = 1,
/obj/item/stack/cable_coil = 2)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm
new file mode 100644
index 0000000000..7345e8871e
--- /dev/null
+++ b/code/game/objects/items/weapons/id cards/cards.dm
@@ -0,0 +1,107 @@
+/* Cards
+ * Contains:
+ * DATA CARD
+ * ID CARD
+ * FINGERPRINT CARD HOLDER
+ * FINGERPRINT CARD
+ */
+
+
+
+/*
+ * DATA CARDS - Used for the teleporter
+ */
+/obj/item/weapon/card
+ name = "card"
+ desc = "Does card things."
+ icon = 'icons/obj/card.dmi'
+ w_class = ITEMSIZE_TINY
+ slot_flags = SLOT_EARS
+ var/associated_account_number = 0
+
+ var/list/files = list( )
+
+/obj/item/weapon/card/data
+ name = "data disk"
+ desc = "A disk of data."
+ icon_state = "data"
+ var/function = "storage"
+ var/data = "null"
+ var/special = null
+ item_state = "card-id"
+
+/obj/item/weapon/card/data/verb/label(t as text)
+ set name = "Label Disk"
+ set category = "Object"
+ set src in usr
+
+ if (t)
+ src.name = text("data disk- '[]'", t)
+ else
+ src.name = "data disk"
+ src.add_fingerprint(usr)
+ return
+
+/obj/item/weapon/card/data/clown
+ name = "\proper the coordinates to clown planet"
+ icon_state = "data"
+ item_state = "card-id"
+ layer = 3
+ level = 2
+ desc = "This card contains coordinates to the fabled Clown Planet. Handle with care."
+ function = "teleporter"
+ data = "Clown Land"
+
+/*
+ * ID CARDS
+ */
+
+/obj/item/weapon/card/emag_broken
+ desc = "It's a card with a magnetic strip attached to some circuitry. It looks too busted to be used for anything but salvage."
+ name = "broken cryptographic sequencer"
+ icon_state = "emag"
+ item_state = "card-id"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
+
+/obj/item/weapon/card/emag
+ desc = "It's a card with a magnetic strip attached to some circuitry."
+ name = "cryptographic sequencer"
+ icon_state = "emag"
+ item_state = "card-id"
+ origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
+ var/uses = 10
+
+/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user)
+ var/used_uses = A.emag_act(uses, user, src)
+ if(used_uses < 0)
+ return ..(A, user)
+
+ uses -= used_uses
+ A.add_fingerprint(user)
+ //Vorestation Edit: Because some things (read lift doors) don't get emagged
+ if(used_uses)
+ log_and_message_admins("emagged \an [A].")
+ else
+ log_and_message_admins("attempted to emag \an [A].")
+ // Vorestation Edit: End of Edit
+ log_and_message_admins("emagged \an [A].")
+
+ if(uses<1)
+ user.visible_message("\The [src] fizzles and sparks - it seems it's been used once too often, and is now spent.")
+ user.drop_item()
+ var/obj/item/weapon/card/emag_broken/junk = new(user.loc)
+ junk.add_fingerprint(user)
+ qdel(src)
+
+ return 1
+
+/obj/item/weapon/card/emag/attackby(obj/item/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/stack/telecrystal))
+ var/obj/item/stack/telecrystal/T = O
+ if(T.amount < 1)
+ usr << "You are not adding enough telecrystals to fuel \the [src]."
+ return
+ uses += T.amount/2 //Gives 5 uses per 10 TC
+ uses = ceil(uses) //Ensures no decimal uses nonsense, rounds up to be nice
+ usr << "You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses]."
+ qdel(O)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm
similarity index 94%
rename from code/game/objects/items/weapons/cards_ids_syndicate.dm
rename to code/game/objects/items/weapons/id cards/syndicate_ids.dm
index b5c874868e..ce9e1c83a3 100644
--- a/code/game/objects/items/weapons/cards_ids_syndicate.dm
+++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm
@@ -27,12 +27,12 @@
var/obj/item/weapon/card/id/I = O
src.access |= I.access
if(player_is_antag(user.mind))
- user << "The microscanner activates as you pass it over the ID, copying its access."
+ to_chat(user, "The microscanner activates as you pass it over the ID, copying its access.")
/obj/item/weapon/card/id/syndicate/attack_self(mob/user as mob)
// We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked.
if(!registered_user && register_user(user))
- user << "The microscanner marks you as its owner, preventing others from accessing its internals."
+ to_chat(user, "The microscanner marks you as its owner, preventing others from accessing its internals.")
if(registered_user == user)
switch(alert("Would you like edit the ID, or show it?","Show or Edit?", "Edit","Show"))
if("Edit")
@@ -209,3 +209,10 @@
/datum/card_state/dd_SortValue()
return name
+
+/obj/item/weapon/card/id/syndicate_command
+ name = "syndicate ID card"
+ desc = "An ID straight from the Syndicate."
+ registered_name = "Syndicate"
+ assignment = "Syndicate Overlord"
+ access = list(access_syndicate, access_external_airlocks)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 67d1bc129a..01c302eb52 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -44,7 +44,7 @@
return
if(active)
if (imp)
- M.visible_message("[user] is attemping to implant [M].")
+ M.visible_message("[user] is attempting to implant [M].")
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN)
user.do_attack_animation(M)
diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm
index 92cb782e8a..4fb7172563 100644
--- a/code/game/objects/items/weapons/material/shards.dm
+++ b/code/game/objects/items/weapons/material/shards.dm
@@ -78,7 +78,10 @@
if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) )
return
- M << "You step on \the [src]!"
+ if(H.species.flags & NO_MINOR_CUT)
+ return
+
+ to_chat(H, "You step on \the [src]!")
var/list/check = list("l_foot", "r_foot")
while(check.len)
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index b3e3bb4e80..53aa3258e1 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -122,6 +122,8 @@
sharp = 1
edge = 1
var/blade_color
+ var/random_color = TRUE
+ var/active_state = "sword"
/obj/item/weapon/melee/energy/sword/dropped(var/mob/user)
..()
@@ -129,8 +131,9 @@
deactivate(user)
/obj/item/weapon/melee/energy/sword/New()
- blade_color = pick("red","blue","green","purple")
- lcolor = blade_color
+ if(random_color)
+ blade_color = pick("red","blue","green","purple")
+ lcolor = blade_color
/obj/item/weapon/melee/energy/sword/green/New()
blade_color = "green"
@@ -154,7 +157,7 @@
..()
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
- icon_state = "sword[blade_color]"
+ icon_state = "[active_state][blade_color]"
/obj/item/weapon/melee/energy/sword/deactivate(mob/living/user)
@@ -184,6 +187,55 @@
..()
icon_state = "cutlass1"
+/*
+ *Ionic Rapier
+ */
+
+/obj/item/weapon/melee/energy/sword/ionic_rapier
+ name = "ionic rapier"
+ desc = "Designed specifically for disrupting electronics at close range, it is extremely deadly against synthetics, but almost harmless to pure organic targets."
+ description_info = "This is a dangerous melee weapon that will deliver a moderately powerful electromagnetic pulse to whatever it strikes. \
+ Striking a lesser robotic entity will compel it to attack you, as well. It also does extra burn damage to robotic entities, but it does \
+ very little damage to purely organic targets."
+ icon_state = "ionic_rapier0"
+ random_color = FALSE
+ active_force = 5
+ active_throwforce = 3
+ active_embed_chance = 0
+ sharp = 1
+ edge = 1
+ armor_penetration = 0
+ flags = NOBLOODY
+ lrange = 2
+ lpower = 2
+ lcolor = "#0000FF"
+ active_state = "ionic_rapier"
+
+/obj/item/weapon/melee/energy/sword/ionic_rapier/afterattack(var/atom/movable/AM, var/mob/living/user, var/proximity)
+ if(istype(AM, /obj) && proximity && active)
+ // EMP stuff.
+ var/obj/O = AM
+ O.emp_act(3) // A weaker severity is used because this has infinite uses.
+ playsound(get_turf(O), 'sound/effects/EMPulse.ogg', 100, 1)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) // A lot of objects don't set click delay.
+ return ..()
+
+/obj/item/weapon/melee/energy/sword/ionic_rapier/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone)
+ . = ..()
+ if(target.isSynthetic() && active)
+ // Do some extra damage. Not a whole lot more since emp_act() is pretty nasty on FBPs already.
+ target.emp_act(3) // A weaker severity is used because this has infinite uses.
+ playsound(get_turf(target), 'sound/effects/EMPulse.ogg', 100, 1)
+ target.adjustFireLoss(force * 3) // 15 Burn, for 20 total.
+ playsound(get_turf(target), 'sound/weapons/blade1.ogg', 100, 1)
+
+ // Make lesser robots really mad at us.
+ if(istype(target, /mob/living/simple_animal))
+ var/mob/living/simple_animal/SA = target
+ if(SA.intelligence_level == SA_ROBOTIC)
+ SA.taunt(user)
+ SA.adjustFireLoss(force * 6) // 30 Burn, for 50 total.
+
/*
*Energy Blade
*/
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 519fff3d50..3d8a9f0b5c 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -248,3 +248,16 @@
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/weapon/coin,/obj/item/weapon/spacecash)
+
+ // -----------------------------
+ // Chemistry Bag
+ // -----------------------------
+/obj/item/weapon/storage/bag/chemistry
+ name = "chemistry bag"
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "chembag"
+ desc = "A bag for storing pills, patches, and bottles."
+ max_storage_space = 200
+ w_class = ITEMSIZE_LARGE
+ slowdown = 1
+ can_hold = list(/obj/item/weapon/reagent_containers/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 3bd5d8eb3d..951add8424 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -34,6 +34,7 @@
new /obj/item/device/multitool(src)
new /obj/item/weapon/storage/belt/utility/chief/full(src)
new /obj/item/device/flash(src)
+ new /obj/item/device/t_scanner/upgraded
new /obj/item/taperoll/engineering(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src)
new /obj/item/clothing/shoes/boots/winter/engineering(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 48c567fd20..7e543b75cd 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -149,6 +149,7 @@
new /obj/item/clothing/suit/nun(src)
new /obj/item/clothing/head/nun_hood(src)
new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(src)
+ new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout(src)
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/clothing/under/wedding/bride_white(src)
new /obj/item/weapon/storage/backpack/cultpack (src)
@@ -425,6 +426,8 @@
new /obj/item/weapon/storage/backpack/chemistry(src)
new /obj/item/weapon/storage/backpack/satchel/chem(src)
new /obj/item/weapon/storage/backpack/satchel/chem(src)
+ new /obj/item/weapon/storage/bag/chemistry(src)
+ new /obj/item/weapon/storage/bag/chemistry(src)
return
diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm
index c4fb053e32..daa6e8c94a 100644
--- a/code/game/objects/structures/loot_piles.dm
+++ b/code/game/objects/structures/loot_piles.dm
@@ -337,7 +337,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh
/obj/item/weapon/stock_parts/subspace/analyzer,
/obj/item/weapon/stock_parts/subspace/ansible,
/obj/item/weapon/stock_parts/subspace/crystal,
- /obj/item/weapon/stock_parts/subspace/filter,
+ /obj/item/weapon/stock_parts/subspace/sub_filter,
/obj/item/weapon/stock_parts/subspace/transmitter,
/obj/item/weapon/stock_parts/subspace/treatment,
/obj/item/frame,
diff --git a/code/game/turfs/simulated/outdoors/sky.dm b/code/game/turfs/simulated/outdoors/sky.dm
new file mode 100644
index 0000000000..c7209f9fb3
--- /dev/null
+++ b/code/game/turfs/simulated/outdoors/sky.dm
@@ -0,0 +1,46 @@
+// A simple turf to fake the appearance of flying.
+/turf/simulated/sky
+ name = "sky"
+ desc = "Hope you don't have a fear of heights."
+ icon = 'icons/turf/floors.dmi'
+ icon_state = "sky_slow"
+ outdoors = TRUE
+
+ // Assume there's a vacuum for the purposes of avoiding active edges at initialization, as well as ZAS fun if a window breaks.
+ oxygen = 0
+ carbon_dioxide = 0
+ nitrogen = 0
+ phoron = 0
+
+/turf/simulated/sky/initialize()
+ outdoor_turfs.Add(src)
+ set_light(2, 2, "#FFFFFF")
+
+/turf/simulated/sky/north
+ dir = NORTH
+
+/turf/simulated/sky/south
+ dir = SOUTH
+
+/turf/simulated/sky/east
+ dir = EAST
+
+/turf/simulated/sky/west
+ dir = WEST
+
+
+
+/turf/simulated/sky/moving
+ icon_state = "sky_fast"
+
+/turf/simulated/sky/moving/north
+ dir = NORTH
+
+/turf/simulated/sky/moving/south
+ dir = SOUTH
+
+/turf/simulated/sky/moving/east
+ dir = EAST
+
+/turf/simulated/sky/moving/west
+ dir = WEST
\ No newline at end of file
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 09cbde18f9..ec673b321c 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -114,7 +114,7 @@ var/list/admin_verbs_sounds = list(
)
var/list/admin_verbs_fun = list(
/client/proc/object_talk,
- /client/proc/cmd_admin_dress,
+ /datum/admins/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/everyone_random,
@@ -260,7 +260,7 @@ var/list/admin_verbs_hideable = list(
/client/proc/play_sound,
/client/proc/play_server_sound,
/client/proc/object_talk,
- /client/proc/cmd_admin_dress,
+ /datum/admins/proc/cmd_admin_dress,
/client/proc/cmd_admin_gib_self,
/client/proc/drop_bomb,
/client/proc/cinematic,
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 93202054eb..1845dd6569 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -385,518 +385,36 @@
for(var/areatype in areas_without_camera)
world << "* [areatype]"
-/client/proc/cmd_admin_dress() // Vorestation Edits throughout this proc.
+/datum/admins/proc/cmd_admin_dress(input in getmobs())
set category = "Fun"
set name = "Select equipment"
- var/mob/living/carbon/human/M = input("Select mob.", "Select equipment.") as null|anything in human_mob_list
- if(!M) return
-
- //log_admin("[key_name(src)] has alienized [M.key].")
- var/list/dresspacks = list(
- "strip",
- "job",
- "standard space gear",
- "tournament standard red",
- "tournament standard green",
- "tournament gangster",
- "tournament chef",
- "tournament janitor",
- "pirate",
- "space pirate",
- "soviet admiral",
- "tunnel clown",
- "masked killer",
- "assassin",
- "death commando",
- "syndicate commando",
- "special ops officer",
- "blue wizard",
- "red wizard",
- "marisa wizard",
- "emergency response team",
- "nanotrasen representative",
- "nanotrasen officer",
- "nanotrasen captain",
- "USDF marine",
- "USDF officer",
- "SolGov Representative",
- "Imperial soldier",
- "Imperial officer"
- )
- var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
- if (isnull(dresscode))
+ if(!check_rights(R_FUN))
return
- feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- for (var/obj/item/I in M)
- if (istype(I, /obj/item/weapon/implant))
- continue
- M.drop_from_inventory(I)
- if(I.loc != M)
- qdel(I)
- switch(dresscode)
- if ("strip")
- //do nothing
- if ("job")
- var/selected_job = input("Select job", "Robust quick dress shop") as null|anything in joblist
- if (isnull(selected_job))
- return
- var/datum/job/job = job_master.GetJob(selected_job)
- if(!job)
- return
+ var/target = getmobs()[input]
+ if(!target)
+ return
- job.equip(M)
- job.apply_fingerprints(M)
- job_master.spawnId(M, selected_job)
+ if(!ishuman(target))
+ return
- if ("standard space gear")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ var/mob/living/carbon/human/H = target
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space(M), slot_head)
- var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M)
- M.equip_to_slot_or_del(J, slot_back)
- J.toggle()
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask)
- J.Topic(null, list("stat" = 1))
- if ("tournament standard red","tournament standard green") //we think stunning weapon is too overpowered to use it on tournaments. --rastaf0
- if (dresscode=="tournament standard red")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/red(M), slot_w_uniform)
- else
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/green(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
+ var/decl/hierarchy/outfit/outfit = input("Select outfit.", "Select equipment.") as null|anything in outfits()
+ if(!outfit)
+ return
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/thunderdome(M), slot_head)
+ feedback_add_details("admin_verb","SEQ")
+ dressup_human(H, outfit, 1)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/smokebomb(M), slot_r_store)
-
-
- if ("tournament gangster") //gangster are supposed to fight each other. --rastaf0
- M.equip_to_slot_or_del(new /obj/item/clothing/under/det(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
-
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_trench(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/det(M), slot_head)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/s357(M), slot_l_store)
-
- if ("tournament chef") //Steven Seagal FTW
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(M), slot_head)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/material/kitchen/rollingpin(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_s_store)
-
- if ("tournament janitor")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- var/obj/item/weapon/storage/backpack/backpack = new(M)
- for(var/obj/item/I in backpack)
- qdel(I)
- M.equip_to_slot_or_del(backpack, slot_back)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/mop(M), slot_r_hand)
- var/obj/item/weapon/reagent_containers/glass/bucket/bucket = new(M)
- bucket.reagents.add_reagent("water", 70)
- M.equip_to_slot_or_del(bucket, slot_l_hand)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/grenade/chem_grenade/cleaner(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
- M.equip_to_slot_or_del(new /obj/item/stack/tile/floor(M), slot_in_backpack)
-
- if ("pirate")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
-
- if ("space pirate")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/pirate(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/pirate(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/pirate(M), slot_r_hand)
-
- if ("soviet soldier")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/ushanka(M), slot_head)
-
- if("tunnel clown")//Tunnel clowns rule!
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.access = get_all_station_access()
- W.assignment = "Tunnel Clown!"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- var/obj/item/weapon/material/twohanded/fireaxe/fire_axe = new(M)
- M.equip_to_slot_or_del(fire_axe, slot_r_hand)
-
- if("masked killer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/sterile/latex(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/surgical/scalpel(M), slot_r_store)
-
- var/obj/item/weapon/material/twohanded/fireaxe/fire_axe = new(M)
- M.equip_to_slot_or_del(fire_axe, slot_r_hand)
-
- for(var/obj/item/carried_item in M.contents)
- if(!istype(carried_item, /obj/item/weapon/implant))//If it's not an implant.
- carried_item.add_blood(M)//Oh yes, there will be blood...
-
- if("assassin")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/accessory/wcoat(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(M), slot_l_store)
-
- var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = new(M)
- for(var/obj/item/briefcase_item in sec_briefcase)
- qdel(briefcase_item)
- for(var/i=3, i>0, i--)
- sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000
- sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow
- sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
- sec_briefcase.contents += new /obj/item/ammo_magazine/s357
- sec_briefcase.contents += new /obj/item/weapon/plastique
- M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
-
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "Reaper"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- M.equip_to_slot_or_del(pda, slot_belt)
-
- var/obj/item/weapon/card/id/syndicate/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.access = get_all_station_access()
- W.assignment = "Reaper"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- if("death commando")//Was looking to add this for a while.
- deathsquad.equip(M)
-
- if("syndicate commando")
- commandos.equip(M)
-
- if("nanotrasen representative")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(M), slot_l_ear)
-
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "NanoTrasen Navy Representative"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- M.equip_to_slot_or_del(pda, slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/clipboard(M), slot_belt)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "centcom"
- W.item_state = "id_inv"
- W.access = get_all_station_access()
- W.access += list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer")
- W.assignment = "NanoTrasen Navy Representative"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- if("nanotrasen officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
-
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "NanoTrasen Navy Officer"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- M.equip_to_slot_or_del(pda, slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy(M), slot_belt)
-
- var/obj/item/weapon/card/id/centcom/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "NanoTrasen Navy Officer"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
-
- if("nanotrasen captain")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_captain(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/white(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
-
- var/obj/item/device/pda/heads/pda = new(M)
- pda.owner = M.real_name
- pda.ownjob = "NanoTrasen Navy Captain"
- pda.name = "PDA-[M.real_name] ([pda.ownjob])"
-
- M.equip_to_slot_or_del(pda, slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy(M), slot_belt)
-
- var/obj/item/weapon/card/id/centcom/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "NanoTrasen Navy Captain"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- if("emergency response team")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/ert(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/swat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "centcom"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "Emergency Response Team"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- if("special ops officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate/combat(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/swat/officer(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/smokable/cigarette/cigar/havana(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle/M1911(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
-
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "centcom"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "Special Operations Officer"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
-
- if("blue wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
-
- if("red wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
-
- if("marisa wizard")
- M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/marisa(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/marisa(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/marisa(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/spellbook(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/staff(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/box(M), slot_in_backpack)
- if("soviet admiral")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/eyepatch(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/mateba(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card"
- W.icon_state = "centcom"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "Admiral"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
- if("USDF marine")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/combat/USDF(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/utility/marine/green(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/combat/USDF(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/battlerifle(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/tactical(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/m95(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/m95(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/m95(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/m95(M), slot_l_hand)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s military ID Card"
- W.icon_state = "lifetime"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "USDF"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
- if("USDF officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/dress/marine/command/admiral(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/mildress/marine/command(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver/consul(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/s44(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/ammo_magazine/s44(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/clothing/accessory/holster/hip(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/clothing/accessory/black(M), slot_l_hand)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s military ID Card"
- W.icon_state = "lifetime"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "USDF"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
- if("SolGov Representative")
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/centcom(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/navy (M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen/blue(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/pen/red(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/device/pda/centcom(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/clipboard(M), slot_l_hand)
- var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s SolGov ID Card"
- W.icon_state = "lifetime"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "SolGov Representative"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)
- if("Imperial soldier")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/combat/imperial(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/leg_guard/combat/imperial(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/arm_guard/combat/imperial(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/imperial(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/imperial(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/combat/imperial(M), slot_wear_suit)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/tactical/bandolier(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/cell/device/weapon(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/cell/device/weapon(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/imperial(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/shield/energy/imperial(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/imperial(M), slot_s_store)
- /*var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card" // ToDo
- W.icon_state = "lifetime"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "SolGov Representative"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)*/
- if("Imperial officer")
- M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/combat/imperial/centurion(M), slot_head)
- M.equip_to_slot_or_del(new /obj/item/clothing/shoes/leg_guard/combat/imperial(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/arm_guard/combat/imperial(M), slot_gloves)
- M.equip_to_slot_or_del(new /obj/item/device/radio/headset/syndicate(M), slot_l_ear)
- M.equip_to_slot_or_del(new /obj/item/clothing/under/imperial(M), slot_w_uniform)
- M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/imperial(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/combat/imperial/centurion(M), slot_wear_suit)
- //M.equip_to_slot_or_del(new (M), slot_back) // Doesn't look right with the cape. No bags.
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/security/tactical/bandolier(M), slot_belt)
- M.equip_to_slot_or_del(new /obj/item/weapon/cell/device/weapon(M), slot_l_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/cell/device/weapon(M), slot_r_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword/imperial(M), slot_r_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/shield/energy/imperial(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/imperial(M), slot_s_store)
- /*var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card" // ToDo
- W.icon_state = "lifetime"
- W.access = get_all_station_access()
- W.access += get_all_centcom_access()
- W.assignment = "SolGov Representative"
- W.registered_name = M.real_name
- M.equip_to_slot_or_del(W, slot_wear_id)*/
-
- M.regenerate_icons()
-
- log_admin("[key_name(usr)] changed the equipment of [key_name(M)] to [dresscode].")
- message_admins("[key_name_admin(usr)] changed the equipment of [key_name_admin(M)] to [dresscode]..", 1)
- return
+/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit, var/undress = 1)
+ if(!H || !outfit)
+ return
+ if(undress)
+ H.delete_inventory()
+ outfit.equip(H)
+ log_and_message_admins("changed the equipment of [key_name(H)] to [outfit.name].")
/client/proc/startSinglo()
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index b416cb661a..b78b473e65 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -83,12 +83,12 @@
if (!fqs)
output += " ERROR
"
continue
- for (var/filter in fqs.devices)
- var/list/f = fqs.devices[filter]
+ for (var/radio_filter in fqs.devices)
+ var/list/f = fqs.devices[radio_filter]
if (!f)
- output += " [filter]: ERROR
"
+ output += " [radio_filter]: ERROR
"
continue
- output += " [filter]: [f.len]
"
+ output += " [radio_filter]: [f.len]
"
for (var/device in f)
if (isobj(device))
output += " [device] ([device:x],[device:y],[device:z] in area [get_area(device:loc)])
"
@@ -177,11 +177,11 @@
set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output."
set category = "Debug"
- var/filter = input("Contains what?","Filter") as text|null
- if(!filter)
+ var/job_filter = input("Contains what?","Job Filter") as text|null
+ if(!job_filter)
return
usr << "Jobbans active in this round."
for(var/t in jobban_keylist)
- if(findtext(t, filter))
+ if(findtext(t, job_filter))
usr << "[t]"
diff --git a/code/modules/busy_space/organizations.dm b/code/modules/busy_space/organizations.dm
index 4a8d23fa7b..e9ff11e963 100644
--- a/code/modules/busy_space/organizations.dm
+++ b/code/modules/busy_space/organizations.dm
@@ -73,11 +73,39 @@
motto = ""
ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response")
+ //Scientist naming scheme
+ ship_names = list(
+ "Bardeen",
+ "Einstein",
+ "Feynman",
+ "Sagan",
+ "Tyson",
+ "Galilei",
+ "Jans",
+ "Fhriede",
+ "Franklin",
+ "Tesla",
+ "Curie",
+ "Darwin",
+ "Newton",
+ "Pasteur",
+ "Bell",
+ "Mendel",
+ "Kepler",
+ "Edision",
+ "Cavendish",
+ "Nye",
+ "Hawking",
+ "Aristotle",
+ "Von Braun",
+ "Kaku",
+ "Oppenheimer"
+ )
// Note that the current station being used will be pruned from this list upon being instantiated
destination_names = list(
"NSS Exodus in Nyx",
"NCS Northern Star in Vir",
- "NCS Southern Cross in Vir",
+ "NLS Southern Cross in Vir",
"NAS Vir Central Command",
"a dockyard orbiting Sif",
"an asteroid orbiting Kara",
@@ -110,6 +138,24 @@
motto = ""
ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply")
+ //War God/Soldier Theme
+ ship_names = list(
+ "Ares",
+ "Athena",
+ "Grant",
+ "Custer",
+ "Puller",
+ "Nike",
+ "Bellona",
+ "Leonides",
+ "Bast",
+ "Jackson",
+ "Lee",
+ "Annan",
+ "Chi Yu",
+ "Shiva",
+ "Tyr"
+ )
destination_names = list(
"a SolGov dockyard on Luna",
"a Fleet outpost in the Almach Rim",
@@ -133,6 +179,22 @@
motto = ""
ship_prefixes = list("VTV" = "transportation", "VMV" = "medical resupply")
+ // Diona names
+ ship_names = list(
+ "Wind That Stirs The Waves",
+ "Sustained Note Of Metal",
+ "Bright Flash Reflecting Off Glass",
+ "Veil Of Mist Concealing The Rock",
+ "Thin Threads Intertwined",
+ "Clouds Drifting Amid Storm",
+ "Loud Note And Breaking",
+ "Endless Vistas Expanding Before The Void",
+ "Fire Blown Out By Wind",
+ "Star That Fades From View",
+ "Eyes Which Turn Inwards",
+ "Joy Without Which The World Would Come Undone",
+ "A Thousand Thousand Planets Dangling From Branches"
+ )
destination_names = list(
"a research facility in Samsara",
"a SDTF near Ue-Orsi",
@@ -289,9 +351,16 @@
"Nothing To Declare",
"Sneaking Suspicion",
"Bass Ackwards",
- "Good Things Come to Those Who Freight"
-
-
+ "Good Things Come to Those Who Freight",
+ "Redundant Morality",
+ "Synthetic Goodwill",
+ "Your Ad Here",
+ "What Are We Plotting?",
+ "Set Phasers To Stun",
+ "Preemptive Defensive Strike",
+ "This Ship Is Spiders",
+ "Legitimate Trade Vessel",
+ "Please Don't Explode II"
)
destination_names = list(
"A trade outpost in Shelf"
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index d832d00920..c59ecebf6a 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -29,6 +29,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["organ_data"] >> pref.organ_data
S["rlimb_data"] >> pref.rlimb_data
S["body_markings"] >> pref.body_markings
+ S["synth_color"] >> pref.synth_color
+ S["synth_red"] >> pref.r_synth
+ S["synth_green"] >> pref.g_synth
+ S["synth_blue"] >> pref.b_synth
pref.preview_icon = null
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
@@ -53,6 +57,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["organ_data"] << pref.organ_data
S["rlimb_data"] << pref.rlimb_data
S["body_markings"] << pref.body_markings
+ S["synth_color"] << pref.synth_color
+ S["synth_red"] << pref.r_synth
+ S["synth_green"] << pref.g_synth
+ S["synth_blue"] << pref.b_synth
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
if(!pref.species || !(pref.species in playable_species))
@@ -101,6 +109,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.h_style = pref.h_style
character.f_style = pref.f_style
character.b_type = pref.b_type
+ character.synth_color = pref.synth_color
+ character.r_synth = pref.r_synth
+ character.g_synth = pref.g_synth
+ character.b_synth = pref.b_synth
// Destroy/cyborgize organs and limbs.
for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO))
@@ -284,6 +296,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += ""
. += "
"
+ . += "
"
+ . += "Allow Synth color: [pref.synth_color ? "Yes" : "No"]
"
+ if(pref.synth_color)
+ . += "Change Color "
+
. = jointext(.,null)
/datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag)
@@ -672,6 +689,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.equip_preview_mob ^= text2num(href_list["toggle_preview_value"])
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["synth_color"])
+ pref.synth_color = !pref.synth_color
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
+ else if(href_list["synth2_color"])
+ var/new_color = input(user, "Choose your character's synth colour: ", "Character Preference", rgb(pref.r_synth, pref.g_synth, pref.b_synth)) as color|null
+ if(new_color && CanUseTopic(user))
+ pref.r_synth = hex2num(copytext(new_color, 2, 4))
+ pref.g_synth = hex2num(copytext(new_color, 4, 6))
+ pref.b_synth = hex2num(copytext(new_color, 6, 8))
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
return ..()
/datum/category_item/player_setup_item/general/body/proc/reset_limbs()
diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
index 2656e221db..658b2c8e12 100644
--- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
@@ -74,4 +74,28 @@
/datum/gear/gloves/fingerless
display_name = "fingerless gloves"
- path = /obj/item/clothing/gloves/fingerless
\ No newline at end of file
+ path = /obj/item/clothing/gloves/fingerless
+
+/datum/gear/gloves/ring
+ display_name = "ring selection"
+ description = "Choose from a number of rings."
+ path = /obj/item/clothing/gloves/ring
+ cost = 1
+
+/datum/gear/gloves/ring/New()
+ ..()
+ var/ringtype = list()
+ ringtype["CTI ring"] = /obj/item/clothing/gloves/ring/cti
+ ringtype["Mariner University ring"] = /obj/item/clothing/gloves/ring/mariner
+ ringtype["engagement ring"] = /obj/item/clothing/gloves/ring/engagement
+ ringtype["signet ring"] = /obj/item/clothing/gloves/ring/seal/signet
+ ringtype["masonic ring"] = /obj/item/clothing/gloves/ring/seal/mason
+ ringtype["ring, steel"] = /obj/item/clothing/gloves/ring/material/steel
+ ringtype["ring, iron"] = /obj/item/clothing/gloves/ring/material/iron
+ ringtype["ring, silver"] = /obj/item/clothing/gloves/ring/material/silver
+ ringtype["ring, gold"] = /obj/item/clothing/gloves/ring/material/gold
+ ringtype["ring, platinum"] = /obj/item/clothing/gloves/ring/material/platinum
+ ringtype["ring, glass"] = /obj/item/clothing/gloves/ring/material/glass
+ ringtype["ring, wood"] = /obj/item/clothing/gloves/ring/material/wood
+ ringtype["ring, plastic"] = /obj/item/clothing/gloves/ring/material/plastic
+ gear_tweaks += new/datum/gear_tweak/path(ringtype)
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index dbacf45e34..4216ab50c6 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -199,6 +199,41 @@
path = /obj/item/clothing/accessory/poncho/roles/cargo
allowed_roles = list("Quartermaster","Cargo Technician")
+/datum/gear/suit/roles/poncho/cloak/hos
+ display_name = "cloak, head of security"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/hos
+ allowed_roles = list("Head of Security")
+
+/datum/gear/suit/roles/poncho/cloak/cmo
+ display_name = "cloak, chief medical officer"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/cmo
+ allowed_roles = list("Chief Medical Officer")
+
+/datum/gear/suit/roles/poncho/cloak/ce
+ display_name = "cloak, chief engineer"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/ce
+ allowed_roles = list("Chief Engineer")
+
+/datum/gear/suit/roles/poncho/cloak/rd
+ display_name = "cloak, research director"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
+ allowed_roles = list("Research Director")
+
+/datum/gear/suit/roles/poncho/cloak/qm
+ display_name = "cloak, quartermaster"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/qm
+ allowed_roles = list("Quartermaster")
+
+/datum/gear/suit/roles/poncho/cloak/captain
+ display_name = "cloak, colony director"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/captain
+ allowed_roles = list("Colony Director")
+
+/datum/gear/suit/roles/poncho/cloak/hop
+ display_name = "cloak, head of personnel"
+ path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
+ allowed_roles = list("Head of Personnel")
+
/datum/gear/suit/unathi_robe
display_name = "roughspun robe"
path = /obj/item/clothing/suit/unathi/robe
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index a31af49fec..388760f81c 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -89,12 +89,14 @@
path = /obj/item/weapon/implant/language/eal
cost = 2
slot = "implant"
+ exploitable = 1
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
cost = 10
slot = "implant"
+ exploitable = 1
/datum/gear/utility/translator
display_name = "universal translator"
diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm
index 444b87754e..727f66de9a 100644
--- a/code/modules/client/preference_setup/occupation/occupation.dm
+++ b/code/modules/client/preference_setup/occupation/occupation.dm
@@ -157,7 +157,7 @@
var/datum/job/job = locate(href_list["select_alt_title"])
if (job)
var/choices = list(job.title) + job.alt_titles
- var/choice = input("Choose an title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null
+ var/choice = input("Choose a title for [job.title].", "Choose Title", pref.GetPlayerAltTitle(job)) as anything in choices|null
if(choice && CanUseTopic(user))
SetPlayerAltTitle(job, choice)
return (pref.equip_preview_mob ? TOPIC_REFRESH_UPDATE_PREVIEW : TOPIC_REFRESH)
diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index b3c253647e..60bc58031a 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -32,10 +32,15 @@
name = "Loadout"
sort_order = 5
category_item_type = /datum/category_item/player_setup_item/loadout
-
+/* //VOREStation Removal
+/datum/category_group/player_setup_category/trait_preferences
+ name = "Traits"
+ sort_order = 6
+ category_item_type = /datum/category_item/player_setup_item/traits
+*/ //VOREStation Removal End
/datum/category_group/player_setup_category/global_preferences
name = "Global"
- sort_order = 6
+ sort_order = 6 //VOREStation Edit due to above commented out
category_item_type = /datum/category_item/player_setup_item/player_global
/****************************
diff --git a/code/modules/client/preference_setup/traits/trait_defines.dm b/code/modules/client/preference_setup/traits/trait_defines.dm
new file mode 100644
index 0000000000..db948177f1
--- /dev/null
+++ b/code/modules/client/preference_setup/traits/trait_defines.dm
@@ -0,0 +1,223 @@
+// This contains character setup datums for traits.
+// The actual modifiers (if used) for these are stored inside code/modules/mob/_modifiers/traits.dm
+
+/datum/trait/modifier
+ var/modifier_type = null // Type to add to the mob post spawn.
+
+/datum/trait/modifier/apply_trait_post_spawn(mob/living/L)
+ L.add_modifier(modifier_type)
+
+/datum/trait/modifier/generate_desc()
+ var/new_desc = desc
+ if(!modifier_type)
+ new_desc = "[new_desc] This trait is not implemented yet."
+ return new_desc
+ var/datum/modifier/M = new modifier_type()
+ if(!desc)
+ new_desc = M.desc // Use the modifier's description, if the trait doesn't have one defined.
+ var/modifier_effects = M.describe_modifier_effects()
+ new_desc = "[new_desc][modifier_effects ? "
[modifier_effects]":""]" // Now describe what the trait actually does.
+ qdel(M)
+ return new_desc
+
+
+// Physical traits are what they sound like, and involve the character's physical body, as opposed to their mental state.
+/datum/trait/modifier/physical
+ category = "Physical Quirks" //VOREStation Edit
+
+
+/datum/trait/modifier/physical/flimsy
+ name = "Flimsy"
+ desc = "You're more fragile than most, and have less of an ability to endure harm."
+ modifier_type = /datum/modifier/trait/flimsy
+ mutually_exclusive = list(/datum/trait/modifier/physical/frail)
+
+
+/datum/trait/modifier/physical/frail
+ name = "Frail"
+ desc = "Your body is very fragile, and has even less of an ability to endure harm."
+ modifier_type = /datum/modifier/trait/frail
+ mutually_exclusive = list(/datum/trait/modifier/physical/flimsy)
+
+
+/datum/trait/modifier/physical/haemophilia
+ name = "Haemophilia"
+ desc = "Some say that when it rains, it pours. Unfortunately, this is also true for yourself if you get cut."
+ modifier_type = /datum/modifier/trait/haemophilia
+
+/datum/trait/modifier/physical/haemophilia/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ return "Full Body Prosthetics cannot bleed."
+ // If a species lacking blood is added, it is suggested to add a check for them here.
+ return ..()
+
+
+/datum/trait/modifier/physical/weak
+ name = "Weak"
+ desc = "A lack of physical strength causes a diminshed capability in close quarters combat."
+ modifier_type = /datum/modifier/trait/weak
+ mutually_exclusive = list(/datum/trait/modifier/physical/wimpy)
+
+
+/datum/trait/modifier/physical/wimpy
+ name = "Wimpy"
+ desc = "An extreme lack of physical strength causes a greatly diminished capability in close quarters combat."
+ modifier_type = /datum/modifier/trait/wimpy
+ mutually_exclusive = list(/datum/trait/modifier/physical/weak)
+
+
+/datum/trait/modifier/physical/inaccurate
+ name = "Inaccurate"
+ desc = "You're rather inexperienced with guns, you've never used one in your life, or you're just really rusty. \
+ Regardless, you find it quite difficult to land shots where you wanted them to go."
+ modifier_type = /datum/modifier/trait/inaccurate
+
+
+// These two traits might be borderline, feel free to remove if they get abused.
+/datum/trait/modifier/physical/high_metabolism
+ name = "High Metabolism"
+ modifier_type = /datum/modifier/trait/high_metabolism
+ mutually_exclusive = list(/datum/trait/modifier/physical/low_metabolism)
+
+/datum/trait/modifier/physical/high_metabolism/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ return "Full Body Prosthetics do not have a metabolism."
+ return ..()
+
+
+/datum/trait/modifier/physical/low_metabolism
+ name = "Low Metabolism"
+ modifier_type = /datum/modifier/trait/low_metabolism
+ mutually_exclusive = list(/datum/trait/modifier/physical/high_metabolism)
+
+/datum/trait/modifier/physical/low_metabolism/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ return "Full Body Prosthetics do not have a metabolism."
+ return ..()
+
+
+/datum/trait/modifier/physical/cloned
+ name = "Cloned"
+ desc = "At some point in your life, you died and were cloned."
+ modifier_type = /datum/modifier/cloned
+
+/datum/trait/modifier/physical/cloned/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ return "Full Body Prosthetics cannot be cloned."
+ return ..()
+
+
+/datum/trait/modifier/physical/no_clone
+ name = "Cloning Incompatability"
+ modifier_type = /datum/modifier/no_clone
+
+/datum/trait/modifier/physical/no_clone/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ return "Full Body Prosthetics cannot be cloned anyways."
+ return ..()
+
+
+/datum/trait/modifier/physical/no_borg
+ name = "Cybernetic Incompatability"
+ modifier_type = /datum/modifier/no_borg
+
+/datum/trait/modifier/physical/no_borg/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ return "Full Body Prosthetics are already partly or fully mechanical."
+ return ..()
+
+
+
+// 'Mental' traits are just those that only sapients can have, for now, and generally involves fears.
+// So far, all of them are just for fluff/don't have mechanical effects.
+/datum/trait/modifier/mental
+ category = "Mental"
+
+/datum/trait/modifier/mental/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ if(setup.is_FBP())
+ if(setup.get_FBP_type() == PREF_FBP_SOFTWARE)
+ return "Drone Intelligences cannot feel emotions."
+ return ..()
+
+
+/datum/trait/modifier/mental/arachnophobe
+ name = "Arachnophobic"
+ desc = "Spiders are quite creepy to most people, however for you, those chitters of pure evil inspire pure dread and fear."
+ modifier_type = /datum/modifier/trait/phobia/arachnophobe
+
+
+/datum/trait/modifier/mental/nyctophobe
+ name = "Nyctophobic"
+ desc = "More commonly known as the fear of darkness. The shadows can hide many dangers, which makes the prospect of going into the depths of Maintenance rather worrisome."
+ modifier_type = /datum/modifier/trait/phobia/nyctophobe
+
+
+/datum/trait/modifier/mental/haemophobe
+ name = "Haemophobia"
+ desc = "Not to be confused with Haemophilia (which makes you bleed faster), Haemophobia is the fear of blood. Seeing a bunch of blood isn't really \
+ pleasant for most people, but for you, it is very distressing."
+ modifier_type = /datum/modifier/trait/phobia/haemophobia
+
+
+/datum/trait/modifier/mental/claustrophobe
+ name = "Claustrophobic"
+ desc = "Small spaces and tight quarters makes you feel distressed. Unfortunately both are rather common when living in space."
+ modifier_type = /datum/modifier/trait/phobia/claustrophobe
+
+/*
+// Uncomment this when/if these get finished.
+/datum/trait/modifier/mental/synthphobe
+ name = "Synthphobic"
+ desc = "You know, deep down, that synthetics cannot be trusted, and so you are always on guard whenever you see one wandering around. No one knows how a Positronic's mind works, \
+ Drones are just waiting for the right time for Emergence, and the poor brains trapped in the cage of Man Machine Interfaces are now soulless, despite being unaware of it. None \
+ can be trusted."
+
+/datum/trait/modifier/mental/xenophobe
+ name = "Xenophobic"
+ desc = "The mind of the Alien is unknowable, and as such, their intentions cannot be known. You always watch the xenos closely, as they most certainly are watching you \
+ closely, waiting to strike."
+ mutually_exclusive = list(
+ /datum/trait/modifier/mental/humanphobe,
+ /datum/trait/modifier/mental/skrellphobe,
+ /datum/trait/modifier/mental/tajaraphobe,
+ /datum/trait/modifier/mental/unathiphobe,
+ /datum/trait/modifier/mental/teshariphobe,
+ /datum/trait/modifier/mental/prometheanphobe
+ )
+
+/datum/trait/modifier/mental/humanphobe
+ name = "Human-phobic"
+ desc = "Boilerplate racism for monkeys goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+
+/datum/trait/modifier/mental/skrellphobe
+ name = "Skrell-phobic"
+ desc = "Boilerplate racism for squid goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+
+/datum/trait/modifier/mental/tajaraphobe
+ name = "Tajara-phobic"
+ desc = "Boilerplate racism for cats goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+
+/datum/trait/modifier/mental/unathiphobe
+ name = "Unathi-phobic"
+ desc = "Boilerplate racism for lizards goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+
+// Not sure why anyone would hate/fear these guys but for the sake of completeness here we are.
+/datum/trait/modifier/mental/dionaphobe
+ name = "Diona-phobic"
+ desc = "Boilerplate racism for trees goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+
+/datum/trait/modifier/mental/teshariphobe
+ name = "Teshari-phobic"
+ desc = "Boilerplate racism for birds goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+
+/datum/trait/modifier/mental/prometheanphobe
+ name = "Promethean-phobic"
+ desc = "Boilerplate racism for jellos goes here."
+ mutually_exclusive = list(/datum/trait/modifier/mental/xenophobe)
+*/
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/traits/traits.dm b/code/modules/client/preference_setup/traits/traits.dm
new file mode 100644
index 0000000000..6312454453
--- /dev/null
+++ b/code/modules/client/preference_setup/traits/traits.dm
@@ -0,0 +1,196 @@
+var/list/trait_datums = list() // Assoc list using name = instance. Traits are saved as a list of strings.
+var/list/trait_type_to_ref = list() // Similar to above but uses paths, which is more reliable but more risky to save.
+var/list/trait_categories = list() // The categories available for the trait menu.
+
+/hook/startup/proc/populate_trait_list()
+
+ //create a list of trait datums
+ for(var/trait_type in typesof(/datum/trait) - list(/datum/trait, /datum/trait/modifier))
+ var/datum/trait/T = new trait_type
+
+ if(!T.name)
+ error("Trait Menu - Missing name: [T.type]")
+ continue
+
+ if(!T.category)
+ error("Trait Menu - Missing category: [T.type]")
+ continue
+
+ T.desc = T.generate_desc()
+
+ trait_datums[T.name] = T
+ trait_type_to_ref[T.type] = T
+ if(!(T.category in trait_categories))
+ trait_categories += T.category
+
+ return 1
+
+/datum/category_item/player_setup_item/traits
+ name = "Quirks" //VOREStation Edit
+ sort_order = 1
+ var/current_tab = "Physical"
+
+/datum/category_item/player_setup_item/traits/load_character(var/savefile/S)
+ S["traits"] >> pref.traits
+
+/datum/category_item/player_setup_item/traits/save_character(var/savefile/S)
+ S["traits"] << pref.traits
+
+
+/datum/category_item/player_setup_item/traits/content()
+ . = list()
+ . += ""
+ . += "
|
"
+ . += "| Traits |
"
+ . += "
|
"
+
+ . += "| "
+ var/firstcat = 1
+ for(var/category in trait_categories)
+ if(firstcat)
+ firstcat = 0
+ else
+ . += " |"
+
+ if(category == current_tab)
+ . += " [category] "
+ else
+ . += " [category] "
+ . += " |
"
+
+
+ for(var/trait_name in trait_datums)
+ var/datum/trait/T = trait_datums[trait_name]
+ if(T.category != current_tab)
+ continue
+
+ var/ticked = (T.name in pref.traits)
+ var/style_class
+ if(!T.validate(pref.traits, src))
+ style_class = "linkOff"
+ else if(ticked)
+ style_class = "linkOn"
+ . += " | "
+// . += "[G.cost] | "
+
+ var/invalidity = T.test_for_invalidity(src)
+ var/conflicts = T.test_for_trait_conflict(pref.traits)
+ var/invalid = ""
+ if(invalidity)
+ invalid += "[invalidity] "
+ if(conflicts)
+ invalid += "This trait is mutually exclusive with [conflicts]."
+
+ . += "[T.desc]\
+ [invalid ? " Cannot take trait. Reason: [invalid]":""] |
"
+// if(ticked)
+// . += "| "
+// for(var/datum/gear_tweak/tweak in G.gear_tweaks)
+// . += " [tweak.get_contents(get_tweak_metadata(G, tweak))]"
+// . += " |
"
+ . += "
"
+ . = jointext(., null)
+
+/datum/category_item/player_setup_item/traits/sanitize_character()
+ var/mob/preference_mob = preference_mob()
+ if(!islist(pref.traits))
+ pref.traits = list()
+
+ for(var/trait_name in pref.traits)
+ if(!(trait_name in trait_datums))
+ pref.traits -= trait_name
+
+ for(var/trait_name in pref.traits)
+ if(!trait_datums[trait_name])
+ preference_mob << "You cannot have more than one of trait: [trait_name]"
+ pref.traits -= trait_name
+ else
+ var/datum/trait/T = trait_datums[trait_name]
+ var/invalidity = T.test_for_invalidity(src)
+ if(invalidity)
+ pref.traits -= trait_name
+ preference_mob << "You cannot take the [trait_name] trait. Reason: [invalidity]"
+
+ var/conflicts = T.test_for_trait_conflict(pref.traits)
+ if(conflicts)
+ pref.traits -= trait_name
+ to_chat(preference_mob, "The [trait_name] trait is mutually exclusive with [conflicts].")
+
+/datum/category_item/player_setup_item/traits/OnTopic(href, href_list, user)
+ if(href_list["toggle_trait"])
+ var/datum/trait/T = trait_datums[href_list["toggle_trait"]]
+ if(T.name in pref.traits)
+ pref.traits -= T.name
+ else
+ var/invalidity = T.test_for_invalidity(src)
+ if(invalidity)
+ to_chat(user, "You cannot take the [T.name] trait. Reason: [invalidity]")
+ return TOPIC_NOACTION
+
+ var/conflicts = T.test_for_trait_conflict(pref.traits)
+ if(conflicts)
+ to_chat(user, "The [T.name] trait is mutually exclusive with [conflicts].")
+ return TOPIC_NOACTION
+
+ pref.traits += T.name
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["select_category"])
+ current_tab = href_list["select_category"]
+ return TOPIC_REFRESH
+ return ..()
+
+
+/datum/trait
+ var/name = null // Name to show on UI
+ var/desc = null // Description of what it does, also shown on UI.
+ var/list/mutually_exclusive = list() // List of trait types which cannot be taken alongside this trait.
+ var/category = null // What section to place this trait inside.
+
+// Applies effects to the newly spawned mob.
+/datum/trait/proc/apply_trait_post_spawn(var/mob/living/L)
+ return
+
+// Used to forbid a trait based on certain criteria (e.g. if they are an FBP).
+// It receives the player_setup_item datum since some reasons for being invalid depend on the currently loaded preferences.
+// Returns a string explaining why the trait is invalid. Returns null if valid.
+/datum/trait/proc/test_for_invalidity(var/datum/category_item/player_setup_item/traits/setup)
+ return null
+
+// Checks mutually_exclusive. current_traits needs to be a list of strings.
+// Returns null if everything is well, similar to the above proc. Otherwise returns an english_list() of conflicting traits.
+/datum/trait/proc/test_for_trait_conflict(var/list/current_traits)
+ var/list/conflicts = list()
+ var/result
+
+ if(mutually_exclusive.len)
+ for(var/trait_name in current_traits)
+ var/datum/trait/T = trait_datums[trait_name]
+ if(T.type in mutually_exclusive)
+ conflicts.Add(T.name)
+
+ if(conflicts.len)
+ result = english_list(conflicts)
+
+ return result
+
+// Similar to above, but uses the above two procs, in one place.
+// Returns TRUE is everything is well.
+/datum/trait/proc/validate(var/list/current_traits, var/datum/category_item/player_setup_item/traits/setup)
+ if(test_for_invalidity(setup))
+ return FALSE
+ if(test_for_trait_conflict(current_traits))
+ return FALSE
+ return TRUE
+
+// Creates a description, if one doesn't exist.
+// This one is for inheritence, and so doesn't do anything.
+/datum/trait/proc/generate_desc()
+ return desc
+
+/mob/living/proc/apply_traits()
+ if(!mind || !mind.traits || !mind.traits.len)
+ return
+ for(var/trait in mind.traits)
+ var/datum/trait/T = trait_datums[trait]
+ if(istype(T))
+ T.apply_trait_post_spawn(src)
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index d22433f041..a507b3323a 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -50,6 +50,11 @@ datum/preferences
var/list/alternate_languages = list() //Secondary language(s)
var/list/language_prefixes = list() //Kanguage prefix keys
var/list/gear //Custom/fluff item loadout.
+ var/list/traits //Traits which modifier characters for better or worse (mostly worse).
+ var/synth_color = 0 //Lets normally uncolorable synth parts be colorable.
+ var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
+ var/g_synth //Same as above
+ var/b_synth //Same as above
//Some faction information.
var/home_system = "Unset" //System of birth.
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index f23f205ae2..afcc676f59 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -170,6 +170,7 @@
icon_state = O.icon_state
set_dir(O.dir)
+////////////////////////////////////////////////////////////////////////////////////////
//Gloves
/obj/item/clothing/gloves
name = "gloves"
@@ -183,8 +184,11 @@
siemens_coefficient = 0.75
var/wired = 0
var/obj/item/weapon/cell/cell = 0
- var/overgloves = 0
var/fingerprint_chance = 0 //How likely the glove is to let fingerprints through
+ var/obj/item/clothing/gloves/ring = null //Covered ring
+ var/mob/living/carbon/human/wearer = null //Used for covered rings when dropping
+ var/glove_level = 2 //What "layer" the glove is on
+ var/overgloves = 0 //Used by gauntlets and arm_guards
body_parts_covered = HANDS
slot_flags = SLOT_GLOVES
attack_verb = list("challenged")
@@ -201,6 +205,8 @@
/obj/item/clothing/gloves/emp_act(severity)
if(cell)
cell.emp_act(severity)
+ if(ring)
+ ring.emp_act(severity)
..()
// Called just before an attack_hand(), in mob/UnarmedAttack()
@@ -225,6 +231,59 @@
species_restricted -= "Tajara"
return
*/
+
+/obj/item/clothing/gloves/mob_can_equip(mob/user, slot)
+ var/mob/living/carbon/human/H = user
+
+ if(slot && slot == slot_gloves)
+ if(istype(H.gloves, /obj/item/clothing/gloves/ring))
+ ring = H.gloves
+ if(ring.glove_level >= src.glove_level)
+ to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
+ ring = null
+ return 0
+ else
+ H.drop_from_inventory(ring) //Remove the ring (or other under-glove item in the hand slot?) so you can put on the gloves.
+ ring.forceMove(src)
+ to_chat(user, "You slip \the [src] on over \the [src.ring].")
+ else
+ ring = null
+
+ if(!..())
+ if(ring) //Put the ring back on if the check fails.
+ if(H.equip_to_slot_if_possible(ring, slot_gloves))
+ src.ring = null
+ return 0
+
+ wearer = H //TODO clean this when magboots are cleaned
+ return 1
+
+/obj/item/clothing/gloves/dropped()
+ ..()
+
+ if(!wearer)
+ return
+
+ var/mob/living/carbon/human/H = wearer
+ if(ring && istype(H))
+ if(!H.equip_to_slot_if_possible(ring, slot_gloves))
+ ring.forceMove(get_turf(src))
+ src.ring = null
+ wearer = null
+
+/////////////////////////////////////////////////////////////////////
+//Rings
+
+/obj/item/clothing/gloves/ring
+ name = "ring"
+ w_class = ITEMSIZE_TINY
+ icon = 'icons/obj/clothing/rings.dmi'
+ gender = NEUTER
+ species_restricted = list("exclude", "Diona")
+ siemens_coefficient = 1
+ glove_level = 1
+ fingerprint_chance = 100
+
///////////////////////////////////////////////////////////////////////
//Head
/obj/item/clothing/head
diff --git a/code/modules/clothing/gloves/arm_guards.dm b/code/modules/clothing/gloves/arm_guards.dm
index ef7d0b28dc..80a5cfd735 100644
--- a/code/modules/clothing/gloves/arm_guards.dm
+++ b/code/modules/clothing/gloves/arm_guards.dm
@@ -5,11 +5,11 @@
overgloves = 1
w_class = ITEMSIZE_NORMAL
-/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
+/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot)
if(..()) //This will only run if no other problems occured when equiping.
if(H.wear_suit)
if(H.wear_suit.body_parts_covered & ARMS)
- H << "You can't wear \the [src] with \the [H.wear_suit], it's in the way."
+ to_chat(H, "You can't wear \the [src] with \the [H.wear_suit], it's in the way.")
return 0
return 1
diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm
index 94956ec714..bc65252d38 100644
--- a/code/modules/clothing/gloves/gauntlets.dm
+++ b/code/modules/clothing/gloves/gauntlets.dm
@@ -9,16 +9,16 @@
/obj/item/clothing/gloves/gauntlets //Used to cover gloves, otherwise act as gloves.
name = "gauntlets"
desc = "These gloves go over regular gloves."
+ glove_level = 3
overgloves = 1
var/obj/item/clothing/gloves/gloves = null //Undergloves
- var/mob/living/carbon/human/wearer = null //For glove procs
/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user)
var/mob/living/carbon/human/H = user
if(H.gloves)
gloves = H.gloves
if(gloves.overgloves)
- user << "You are unable to wear \the [src] as \the [H.gloves] are in the way."
+ to_chat(user, "You are unable to wear \the [src] as \the [H.gloves] are in the way.")
gloves = null
return 0
H.drop_from_inventory(gloves)
@@ -30,7 +30,7 @@
gloves = null
return 0
if(gloves)
- user << "You slip \the [src] on over \the [gloves]."
+ to_chat(user, "You slip \the [src] on over \the [gloves].")
wearer = H
return 1
@@ -39,6 +39,7 @@
if(gloves)
if(!H.equip_to_slot_if_possible(gloves, slot_gloves))
gloves.forceMove(get_turf(src))
+ if(ring)
+ gloves.ring = ring
src.gloves = null
- wearer = null
- ..()
\ No newline at end of file
+ wearer = null
\ No newline at end of file
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index cda6411b1c..bb8f29e892 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -31,12 +31,19 @@
//Chaplain
/obj/item/clothing/head/chaplain_hood
name = "chaplain's hood"
- desc = "It's hood that covers the head. It keeps you warm during the space winters."
+ desc = "It's a hood that covers the head. It keeps you warm during the space winters."
icon_state = "chaplain_hood"
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
flags_inv = BLOCKHAIR
body_parts_covered = HEAD
+//Chaplain but spookier
+/obj/item/clothing/head/chaplain_hood/whiteout
+ name = "white hood"
+ desc = "It's a generic white hood. Very spooky."
+ icon_state = "whiteout_hood"
+ item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
+
//Chaplain
/obj/item/clothing/head/nun_hood
name = "nun hood"
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 321fd185dc..4ff12d3297 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -16,17 +16,17 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 75, rad = 0)
/obj/item/clothing/mask/gas/filter_air(datum/gas_mixture/air)
- var/datum/gas_mixture/filtered = new
+ var/datum/gas_mixture/gas_filtered = new
for(var/g in filtered_gases)
if(air.gas[g])
- filtered.gas[g] = air.gas[g] * gas_filter_strength
- air.gas[g] -= filtered.gas[g]
+ gas_filtered.gas[g] = air.gas[g] * gas_filter_strength
+ air.gas[g] -= gas_filtered.gas[g]
air.update_values()
- filtered.update_values()
+ gas_filtered.update_values()
- return filtered
+ return gas_filtered
/obj/item/clothing/mask/gas/half
name = "face mask"
diff --git a/code/modules/clothing/rings/material.dm b/code/modules/clothing/rings/material.dm
new file mode 100644
index 0000000000..355d6acf58
--- /dev/null
+++ b/code/modules/clothing/rings/material.dm
@@ -0,0 +1,47 @@
+/////////////////////////////////////////
+//Material Rings
+/obj/item/clothing/gloves/ring/material
+ icon = 'icons/obj/clothing/rings.dmi'
+ icon_state = "material"
+
+/obj/item/clothing/gloves/ring/material/New(var/newloc, var/new_material)
+ ..(newloc)
+ if(!new_material)
+ new_material = DEFAULT_WALL_MATERIAL
+ material = get_material_by_name(new_material)
+ if(!istype(material))
+ qdel(src)
+ return
+ name = "[material.display_name] ring"
+ desc = "A ring made from [material.display_name]."
+ color = material.icon_colour
+
+/obj/item/clothing/gloves/ring/material/get_material()
+ return material
+
+/obj/item/clothing/gloves/ring/material/wood/New(var/newloc)
+ ..(newloc, "wood")
+
+/obj/item/clothing/gloves/ring/material/plastic/New(var/newloc)
+ ..(newloc, "plastic")
+
+/obj/item/clothing/gloves/ring/material/iron/New(var/newloc)
+ ..(newloc, "iron")
+
+/obj/item/clothing/gloves/ring/material/steel/New(var/newloc)
+ ..(newloc, "steel")
+
+/obj/item/clothing/gloves/ring/material/silver/New(var/newloc)
+ ..(newloc, "silver")
+
+/obj/item/clothing/gloves/ring/material/gold/New(var/newloc)
+ ..(newloc, "gold")
+
+/obj/item/clothing/gloves/ring/material/platinum/New(var/newloc)
+ ..(newloc, "platinum")
+
+/obj/item/clothing/gloves/ring/material/phoron/New(var/newloc)
+ ..(newloc, "phoron")
+
+/obj/item/clothing/gloves/ring/material/glass/New(var/newloc)
+ ..(newloc, "glass")
diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm
new file mode 100644
index 0000000000..0bd745ed91
--- /dev/null
+++ b/code/modules/clothing/rings/rings.dm
@@ -0,0 +1,85 @@
+/////////////////////////////////////////
+//Standard Rings
+/obj/item/clothing/gloves/ring/engagement
+ name = "engagement ring"
+ desc = "An engagement ring. It certainly looks expensive."
+ icon_state = "diamond"
+
+/obj/item/clothing/gloves/ring/engagement/attack_self(mob/user)
+ user.visible_message("\The [user] gets down on one knee, presenting \the [src].","You get down on one knee, presenting \the [src].")
+
+/obj/item/clothing/gloves/ring/cti
+ name = "CTI ring"
+ desc = "A ring commemorating graduation from CTI."
+ icon_state = "cti-grad"
+
+/obj/item/clothing/gloves/ring/mariner
+ name = "Mariner University ring"
+ desc = "A ring commemorating graduation from Mariner University."
+ icon_state = "mariner-grad"
+
+
+/////////////////////////////////////////
+//Reagent Rings
+
+/obj/item/clothing/gloves/ring/reagent
+ flags = OPENCONTAINER
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 4)
+
+/obj/item/clothing/gloves/ring/reagent/New()
+ ..()
+ create_reagents(15)
+
+/obj/item/clothing/gloves/ring/reagent/equipped(var/mob/living/carbon/human/H)
+ ..()
+ if(istype(H) && H.gloves==src)
+
+ if(reagents.total_volume)
+ to_chat(H, "You feel a prick as you slip on \the [src].")
+ if(H.reagents)
+ var/contained_reagents = reagents.get_reagents()
+ var/trans = reagents.trans_to_mob(H, 15, CHEM_BLOOD)
+ admin_inject_log(usr, H, src, contained_reagents, trans)
+ return
+
+//Sleepy Ring
+/obj/item/clothing/gloves/ring/reagent/sleepy
+ name = "silver ring"
+ desc = "A ring made from what appears to be silver."
+ icon_state = "material"
+ origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5)
+
+/obj/item/clothing/gloves/ring/reagent/sleepy/New()
+ ..()
+ reagents.add_reagent(/datum/reagent/chloralhydrate, 15) // Less than a sleepy-pen, but still enough to knock someone out
+
+/////////////////////////////////////////
+//Seals and Signet Rings
+/obj/item/clothing/gloves/ring/seal/secgen
+ name = "Secretary-General's official seal"
+ desc = "The official seal of the Secretary-General of the Sol Central Government, featured prominently on a silver ring."
+ icon_state = "seal-secgen"
+
+/obj/item/clothing/gloves/ring/seal/mason
+ name = "masonic ring"
+ desc = "The Square and Compasses feature prominently on this Masonic ring."
+ icon_state = "seal-masonic"
+
+/obj/item/clothing/gloves/ring/seal/signet
+ name = "signet ring"
+ desc = "A signet ring, for when you're too sophisticated to sign letters."
+ icon_state = "seal-signet"
+ var/nameset = 0
+
+/obj/item/clothing/gloves/ring/seal/signet/attack_self(mob/user)
+ if(nameset)
+ to_chat(user, "The [src] has already been claimed!")
+ return
+
+ to_chat(user, "You claim the [src] as your own!")
+ change_name(user)
+ nameset = 1
+
+/obj/item/clothing/gloves/ring/seal/signet/proc/change_name(var/signet_name = "Unknown")
+ name = "[signet_name]'s signet ring"
+ desc = "A signet ring belonging to [signet_name], for when you're too sophisticated to sign letters."
\ No newline at end of file
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 63e4d93965..4a53a24405 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -36,13 +36,14 @@
user.update_inv_shoes() //so our mob-overlays update
user.update_action_buttons()
-/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user)
+/obj/item/clothing/shoes/magboots/mob_can_equip(mob/user, slot)
var/mob/living/carbon/human/H = user
if(H.shoes)
shoes = H.shoes
if(shoes.overshoes)
- user << "You are unable to wear \the [src] as \the [H.shoes] are in the way."
+ if(slot && slot == slot_shoes)
+ to_chat(user, "You are unable to wear \the [src] as \the [H.shoes] are in the way.")
shoes = null
return 0
H.drop_from_inventory(shoes) //Remove the old shoes so you can put on the magboots.
@@ -55,7 +56,8 @@
return 0
if (shoes)
- user << "You slip \the [src] on over \the [shoes]."
+ if(slot && slot == slot_shoes)
+ to_chat(user, "You slip \the [src] on over \the [shoes].")
set_slowdown()
wearer = H
return 1
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 6af6d86ee3..5b3a08f3ab 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -39,6 +39,15 @@
hoodtype = /obj/item/clothing/head/chaplain_hood
allowed = list (/obj/item/weapon/storage/bible)
+//Chaplain but spookier
+/obj/item/clothing/suit/storage/hooded/chaplain_hoodie/whiteout
+ name = "white robe"
+ desc = "A long, flowing white robe. It looks comfortable, but not very warm."
+ icon_state = "whiteout_robe"
+ item_state_slots = list(slot_r_hand_str = "suit_white", slot_l_hand_str = "suit_white")
+ flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
+ hoodtype = /obj/item/clothing/head/chaplain_hood/whiteout
+
//Chaplain
/obj/item/clothing/suit/nun
name = "nun robe"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 751b5c483f..3298541540 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -208,7 +208,7 @@
/obj/item/clothing/suit/iasexy
name = "sexy internal affairs suit"
- desc = "Now where's your pen?~..."
+ desc = "Now where's your pen?~"
icon_state = "iacost"
body_parts_covered = UPPER_TORSO|FEET|LOWER_TORSO|EYES
flags_inv = HIDEJUMPSUIT|HIDESHOES|HIDETIE|HIDEHOLSTER
@@ -377,12 +377,18 @@ obj/item/clothing/suit/storage/toggle/peacoat
desc = "A thick jacket with a rubbery, water-resistant shell."
icon_state = "pufferjacket"
item_state_slots = list(slot_r_hand_str = "chainmail", slot_l_hand_str = "chainmail")
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
+ cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
+ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
+ flags_inv = HIDEHOLSTER
/obj/item/clothing/suit/jacket/puffer/vest
name = "puffer vest"
desc = "A thick vest with a rubbery, water-resistant shell."
icon_state = "puffervest"
item_state_slots = list(slot_r_hand_str = "chainmail", slot_l_hand_str = "chainmail")
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO
+ cold_protection = UPPER_TORSO|LOWER_TORSO
/obj/item/clothing/suit/storage/miljacket
name = "military jacket"
@@ -590,7 +596,7 @@ obj/item/clothing/suit/storage/toggle/peacoat
/obj/item/clothing/suit/whitedress
name = "white dress"
- desc = "A fancy white dress."
+ desc = "A fancy dress."
icon_state = "white_dress"
item_state_slots = list(slot_r_hand_str = "white_dress", slot_l_hand_str = "white_dress")
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS
@@ -827,7 +833,7 @@ obj/item/clothing/suit/storage/toggle/peacoat
*/
/obj/item/clothing/suit/storage/toggle/track
name = "track jacket"
- desc = "a track jacket, for the athletic."
+ desc = "A track jacket, for the athletic."
icon_state = "trackjacket"
item_state_slots = list(slot_r_hand_str = "black_labcoat", slot_l_hand_str = "black_labcoat")
allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask)
diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm
index dff0740ace..363476eb2b 100644
--- a/code/modules/clothing/under/accessories/clothing.dm
+++ b/code/modules/clothing/under/accessories/clothing.dm
@@ -115,6 +115,58 @@
icon_state = "cargoponcho"
item_state = "cargoponcho"
+/*
+ * Cloak
+ */
+/obj/item/clothing/accessory/poncho/roles/cloak
+ name = "brown cloak"
+ desc = "An elaborate brown cloak."
+ icon_state = "qmcloak"
+ item_state = "qmcloak"
+ body_parts_covered = null
+
+/obj/item/clothing/accessory/poncho/roles/cloak/ce
+ name = "chief engineer's cloak"
+ desc = "An elaborate cloak worn by the chief engineer."
+ icon_state = "cecloak"
+ item_state = "cecloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/cmo
+ name = "chief medical officer's cloak"
+ desc = "An elaborate cloak meant to be worn by the chief medical officer."
+ icon_state = "cmocloak"
+ item_state = "cmocloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/hop
+ name = "head of personnel's cloak"
+ desc = "An elaborate cloak meant to be worn by the head of personnel."
+ icon_state = "hopcloak"
+ item_state = "hopcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/rd
+ name = "research director's cloak"
+ desc = "An elaborate cloak meant to be worn by the research director."
+ icon_state = "rdcloak"
+ item_state = "rdcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/qm
+ name = "quartermaster's cloak"
+ desc = "An elaborate cloak meant to be worn by the quartermaster."
+ icon_state = "qmcloak"
+ item_state = "qmcloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/hos
+ name = "head of security's cloak"
+ desc = "An elaborate cloak meant to be worn by the head of security."
+ icon_state = "hoscloak"
+ item_state = "hoscloak"
+
+/obj/item/clothing/accessory/poncho/roles/cloak/captain
+ name = "colony director's cloak"
+ desc = "An elaborate cloak meant to be worn by the colony director."
+ icon_state = "capcloak"
+ item_state = "capcloak"
+
/obj/item/clothing/accessory/hawaii
name = "flower-pattern shirt"
desc = "You probably need some welder googles to look at this."
diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm
index 7398efa44d..b958d18840 100644
--- a/code/modules/clothing/under/jobs/medsci.dm
+++ b/code/modules/clothing/under/jobs/medsci.dm
@@ -16,7 +16,7 @@
/obj/item/clothing/under/rank/research_director/dress_rd
name = "research director dress uniform"
- desc = "Feminine fashion for the style concious RD. Its fabric provides minor protection from biological contaminants."
+ desc = "Feminine fashion for the style conscious RD. Its fabric provides minor protection from biological contaminants."
icon_state = "dress_rd"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
@@ -194,4 +194,4 @@
item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white")
permeability_coefficient = 0.50
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
- rolled_sleeves = 0
\ No newline at end of file
+ rolled_sleeves = 0
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 9c8eb14582..7f9586b6a0 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -363,13 +363,13 @@
/obj/item/clothing/under/dress/dress_cap
name = "colony director's dress uniform"
- desc = "Feminine fashion for the style concious Colony Director."
+ desc = "Feminine fashion for the style conscious Colony Director."
icon_state = "dress_cap"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/under/dress/dress_hop
name = "head of personnel dress uniform"
- desc = "Feminine fashion for the style concious HoP."
+ desc = "Feminine fashion for the style conscious HoP."
icon_state = "dress_hop"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
@@ -808,4 +808,4 @@
name = "bathrobe"
desc = "A fluffy robe to keep you from showing off to the world."
icon_state = "bathrobe"
- worn_state = "bathrobe"
\ No newline at end of file
+ worn_state = "bathrobe"
diff --git a/code/modules/examine/descriptions/atmospherics.dm b/code/modules/examine/descriptions/atmospherics.dm
index 5fd5f3568f..57b6d3e9da 100644
--- a/code/modules/examine/descriptions/atmospherics.dm
+++ b/code/modules/examine/descriptions/atmospherics.dm
@@ -85,12 +85,12 @@
//Normal valves
/obj/machinery/atmospherics/valve
- description_info = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected."
+ description_info = "Click this to turn the valve. If red, the pipes on each end are separated. Otherwise, they are connected."
//TEG ports
/obj/machinery/atmospherics/binary/circulator
description_info = "This generates electricity, depending on the difference in temperature between each side of the machine. The meter in \
- the center of the machine gives an indicator of how much elecrtricity is being generated."
+ the center of the machine gives an indicator of how much electricity is being generated."
//Passive gates
/obj/machinery/atmospherics/binary/passive_gate
@@ -118,7 +118,7 @@
//Gas injectors
/obj/machinery/atmospherics/unary/outlet_injector
- description_info = "Outputs the pipe's gas into the atmosphere, similar to an airvent. It can be controlled by a nearby atmospherics computer. \
+ description_info = "Outputs the pipe's gas into the atmosphere, similar to an air vent. It can be controlled by a nearby atmospherics computer. \
A green light on it means it is on."
//Scrubbers
@@ -127,7 +127,7 @@
It can be controlled from an Air Alarm. It can be configured to drain all air rapidly with a 'panic syphon' from an air alarm."
//Omni filters
-/obj/machinery/atmospherics/omni/filter
+/obj/machinery/atmospherics/omni/atmos_filter
description_info = "Filters gas from a custom input direction, with up to two filtered outputs and a 'everything else' \
output. The filtered output's arrows glow orange."
diff --git a/code/modules/examine/descriptions/containers.dm b/code/modules/examine/descriptions/containers.dm
index fb0c4e2d25..83a97086b4 100644
--- a/code/modules/examine/descriptions/containers.dm
+++ b/code/modules/examine/descriptions/containers.dm
@@ -23,7 +23,7 @@
description_fluff = "This is a NanoTrasen branded can of Lemon-Lime juice. NanoTrasen swears to their 'natural' beverage, but most people think differently."
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
- description_fluff = "Vrisk Iced Tea is named after it's creator, Penelope Vrisk. She was a canner for Federov Beverages who wanted to create an authentic-tasting Southern iced tea. After finishing her formula and managing to get it produced, the tea became an instant hit."
+ description_fluff = "Vrisk Iced Tea is named after its creator, Penelope Vrisk. She was a canner for Federov Beverages who wanted to create an authentic-tasting Southern iced tea. After finishing her formula and managing to get it produced, the tea became an instant hit."
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
description_fluff = "This is a NanoTrasen branded can of grape juice. NanoTrasen claims that they use the same grapes that this juice is made of to make their wine."
@@ -33,3 +33,66 @@
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater
description_fluff = "This is a NanoTrasen branded can of soda water. They use the same water for this that they use for the bottled water that they sell. That may explain why the stuff isn't exactly flying off of the shelves."
+
+/obj/item/weapon/reagent_containers/food/drinks/cans/gingerale
+ description_fluff = "Somehow, NanoTrasen wound up taking this ginger ale formula from Centauri Provisions, some say as payback for the DONKpocket incident. It tastes like ginger ale."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/gin
+ description_fluff = "Griffeater Gin was originally an independent disillery in Alpha Centauri, but financial troubles obligated them to sell out to Centauri Provisions. It's said that Centauri ruined the brew, but it's pretty much impossible to tell."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey
+ description_fluff = "Uncle Git's is a product of Abel's Rest, supply shortages and ubiqtuous observation during the occupation giving Takeshi 'Uncle' Git a chance to perfect this refinement of the common bathtub whiskey."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/specialwhiskey
+ description_fluff = "Nobody knows what Special Blend Whiskey really is, how it's made, or where it comes from. It's an expensive Gilthari product, for only the most luxurious, but NanoTrasen managed to secure a supply deal."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka
+ description_fluff = "Centauri Provisions claims that their vodka wins in blind taste-tests against traditional mixes from Earth, but they're not fooling anyone."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/tequilla
+ description_fluff = "This tequilla comes from the 'Cancer Craze' of the 20's, where consumer products would openly advertize their blatently carcinogenic nature to a burgeoning middle class with newfound access to cloned organs."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/patron
+ description_fluff = "This emerged as a response to Caccavo, with Patron advertising claiming to be even more toxic and dangerous. Unfortunately, when the Cancer Craze ended, Patron's stocks nosedived and they now operate only a handful of distilleries."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/rum
+ description_fluff = "Captain Pete's was involved in a long, expensive lawsuit against Gilthari concerning their claims to be from Cuba. They're actually owned and operated by none other than Centauri Provisions, with no distillaries on Earth to speak of."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/vermouth
+ description_fluff = "One of Gilthari's less expensive products, Goldeneye Vermouth still manages to sell itself as a drink for only the richest and most successful; giving any number of poseurs a swollen head in the process."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua
+ description_fluff = "One of Centauri Provision's least successful products, this coffee liquour continues to be produced for the handful of mixed drinks requiring it. Surprisingly energizing!"
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/goldschlager
+ description_fluff = "Drinks laced with gold and other precious metals are a common indulgence among those who live on planets where these metals are still somewhat rare and expensive. On asteroid colonies and better-developed regions, they're seen as a ridiculous waste of materials."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac
+ description_fluff = "Another Gilthari product, Chataeu du Baton is one of the few brandies to still be produced using traditional methods, instead of chemical synthesizers."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/wine
+ description_fluff = "NanoTrasen makes this wine, which is generally regarded as better used for cooking than actually drinking. Morpheus specifically names Doublebeard in their recipe for Twobread."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe
+ description_fluff = "A product of the anarchists of Casini's Reach, Jailebreaker Verte is an open-source synthesized liquour that has actually managed to succeed over traditional absinthes. Gilthari is livid."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/melonliquor
+ description_fluff = "Melon liquor, formerly an obscure drink, took off when young Skrell started dabbling in alcohol. This brand is owned by Vey-Med, one of their few diversified holdings."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/bluecuracao
+ description_fluff = "Centauri Provisions is currently marketing Miss Blue as the next big thing in mixed drinks. Analysts suggest that they're mistaken."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/pwine
+ description_fluff = "You've never heard of this before, but it looks vaguely Gilthari, so it's probably good, right?"
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/tomatojuice
+ description_fluff = "Morpheus used to sell 'Tomato Juice' that was actually synthetic blood in a carton, until they got sued for damages."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer
+ description_fluff = "Getting synthesized booze to taste decent is always a challenge, but Space Beer is a resounding success. As the most popular drink in human space, it'd have to be."
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale
+ description_fluff = "A product of Titan and enjoyed widely among the hydrocarbon workers of the oil moon. Often described as 'Beer, but better.'"
+
+/obj/item/weapon/reagent_containers/food/drinks/bottle/sake
+ description_fluff = "An export from New Kyoto, Mono-no-Aware promises to show to the drinker the beautiful transience of all life. Mostly it just tastes like dry booze."
diff --git a/code/modules/examine/descriptions/engineering.dm b/code/modules/examine/descriptions/engineering.dm
index 37e69f16f9..52d24ff577 100644
--- a/code/modules/examine/descriptions/engineering.dm
+++ b/code/modules/examine/descriptions/engineering.dm
@@ -10,7 +10,7 @@
Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you. \
It is advised to obtain a genetic backup before trying to drag it."
- description_antag = "Exposing the supermatter to oxygen or vaccum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \
+ description_antag = "Exposing the supermatter to oxygen or vacuum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \
cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \
Wearing radiation equipment will protect you from most of the delamination effects sans explosion."
@@ -75,4 +75,4 @@
results += "[desc_panel_image("wrench")]to connect or disconnect from a connector port below."
results += "[desc_panel_image("air tank")]to fill the air tank from this canister."
- return results
\ No newline at end of file
+ return results
diff --git a/code/modules/examine/descriptions/mobs.dm b/code/modules/examine/descriptions/mobs.dm
index 8961b9f367..4d33263164 100644
--- a/code/modules/examine/descriptions/mobs.dm
+++ b/code/modules/examine/descriptions/mobs.dm
@@ -1,8 +1,8 @@
/mob/living/silicon/robot/drone
description_info = "Drones are player-controlled synthetics which are lawed to maintain the station and not \
interact with anyone else, except for other drones. They hold a wide array of tools to build, repair, maintain, and clean. \
- They fuction similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, \
+ They function similarly to other synthetics, in that they require recharging regularly, have laws, and are resilient to many hazards, \
such as fire, radiation, vacuum, and more. Ghosts can join the round as a maintenance drone by using the appropriate verb in the 'ghost' tab. \
An inactive drone can be rebooted by swiping an ID card on it with engineering or robotics access, and an active drone can be shut down in the same manner."
- description_antag = "An Electromagnetic Sequencer can be used to subvert the drone to your cause."
\ No newline at end of file
+ description_antag = "An Electromagnetic Sequencer can be used to subvert the drone to your cause."
diff --git a/code/modules/examine/descriptions/structures.dm b/code/modules/examine/descriptions/structures.dm
index 858653b094..0f7d6c9883 100644
--- a/code/modules/examine/descriptions/structures.dm
+++ b/code/modules/examine/descriptions/structures.dm
@@ -1,7 +1,7 @@
/obj/structure/girder
description_info = "Use metal sheets on this to build a normal wall. Adding plasteel instead will make a reinforced wall.
\
A false wall can be made by using a crowbar on this girder, and then adding metal or plasteel.
\
- You can dismantle the grider with a wrench."
+ You can dismantle the girder with a wrench."
/obj/structure/girder/reinforced
description_info = "Add another sheet of plasteel to finish."
@@ -18,4 +18,4 @@
description_info = "Click and drag yourself (or anyone) to this to buckle in. Click on this with an empty hand to undo the buckles.
\
\
Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \
- the buckles, instead."
\ No newline at end of file
+ the buckles, instead."
diff --git a/code/modules/examine/descriptions/weapons.dm b/code/modules/examine/descriptions/weapons.dm
index cea7922fbf..8acb089a4c 100644
--- a/code/modules/examine/descriptions/weapons.dm
+++ b/code/modules/examine/descriptions/weapons.dm
@@ -50,7 +50,7 @@
/obj/item/weapon/gun/projectile
description_info = "This is a ballistic weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \
- then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropiate ammo. The description \
+ then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
will tell you what caliber you need."
/obj/item/weapon/gun/energy/chameleon
@@ -89,4 +89,4 @@
it can be concealed in your pocket or bag."
/obj/item/weapon/melee/cultblade
- description_antag = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelivers are unable to use this weapon."
+ description_antag = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Nonbelievers are unable to use this weapon."
diff --git a/code/modules/lore_codex/lore_data/important_locations.dm b/code/modules/lore_codex/lore_data/important_locations.dm
index 17e05c14ca..aa906b4956 100644
--- a/code/modules/lore_codex/lore_data/important_locations.dm
+++ b/code/modules/lore_codex/lore_data/important_locations.dm
@@ -91,7 +91,7 @@
/datum/lore/codex/page/southern_cross/add_content()
name = "Southern Cross (Artificial Satellite)"
- keywords += list("Southern Cross")
+ keywords += list("Southern Cross", "NLS Southern Cross")
data = "The Southern Cross is a telecommunications and supply hub for [quick_link("NanoTrasen")], named after it's companion satellite, the \
[quick_link("Northern Star")]. It acts as a logistics hub for the smaller installations NanoTrasen has in Sif orbit and on the surface."
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 99abbe2e12..ccda4fc9f6 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -12,6 +12,8 @@
recipes += new/datum/stack_recipe("[display_name] spoon", /obj/item/weapon/material/kitchen/utensil/spoon/plastic, 1, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]")
recipes += new/datum/stack_recipe("[display_name] grave marker", /obj/item/weapon/material/gravemarker, 5, time = 50, supplied_material = "[name]")
+ recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]")
+
if(integrity>=50)
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]")
@@ -135,6 +137,7 @@
recipes += new/datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1)
recipes += new/datum/stack_recipe("noticeboard frame", /obj/item/frame/noticeboard, 4, time = 5, one_per_turf = 0, on_floor = 1)
recipes += new/datum/stack_recipe("wooden bucket", /obj/item/weapon/reagent_containers/glass/bucket/wood, 2, time = 4, one_per_turf = 0, on_floor = 0)
+ recipes += new/datum/stack_recipe("coilgun stock", /obj/item/weapon/coilgun_assembly, 5)
/material/cardboard/generate_recipes()
..()
diff --git a/code/modules/mob/_modifiers/cloning.dm b/code/modules/mob/_modifiers/cloning.dm
index 9162ae8f1d..661f957475 100644
--- a/code/modules/mob/_modifiers/cloning.dm
+++ b/code/modules/mob/_modifiers/cloning.dm
@@ -34,4 +34,12 @@
on_created_text = "Life suddenly feels more precious."
on_expired_text = "Death is cheap again."
+ flags = MODIFIER_GENETIC
+
+
+// Prevents borging (specifically the MMI part), actual effect is on the MMI.
+/datum/modifier/no_borg
+ name = "Cyboernetic Incompatability"
+ desc = "For whatever reason, your brain is incompatable with direct cybernetic interfaces, such as the MMI."
+
flags = MODIFIER_GENETIC
\ No newline at end of file
diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm
index 95d3db1e93..ee6d914fa6 100644
--- a/code/modules/mob/_modifiers/modifiers.dm
+++ b/code/modules/mob/_modifiers/modifiers.dm
@@ -37,6 +37,10 @@
var/slowdown // Negative numbers speed up, positive numbers slow down movement.
var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
var/evasion // Positive numbers reduce the odds of being hit by 15% each. Negative numbers increase the odds.
+ var/bleeding_rate_percent // Adjusts amount of blood lost when bleeding.
+ var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder. Each point makes it 15% easier or harder, just like evasion.
+ var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
+ var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
/datum/modifier/New(var/new_holder, var/new_origin)
holder = new_holder
@@ -123,7 +127,7 @@
// Removes all modifiers of a type
/mob/living/proc/remove_modifiers_of_type(var/modifier_type, var/silent = FALSE)
for(var/datum/modifier/M in modifiers)
- if(istype(M, modifier_type))
+ if(ispath(M.type, modifier_type))
M.expire(silent)
// Removes all modifiers, useful if the mob's being deleted
@@ -136,4 +140,71 @@
for(var/datum/modifier/M in modifiers)
if(istype(M, modifier_type))
return TRUE
- return FALSE
\ No newline at end of file
+ return FALSE
+
+// This displays the actual 'numbers' that a modifier is doing. Should only be shown in OOC contexts.
+// When adding new effects, be sure to update this as well.
+/datum/modifier/proc/describe_modifier_effects()
+ var/list/effects = list()
+ if(!isnull(max_health_flat))
+ effects += "You [max_health_flat > 0 ? "gain" : "lose"] [abs(max_health_flat)] maximum health."
+ if(!isnull(max_health_percent))
+ effects += "You [max_health_percent > 1.0 ? "gain" : "lose"] [multipler_to_percentage(max_health_percent, TRUE)] maximum health."
+
+ if(!isnull(disable_duration_percent))
+ effects += "Disabling effects on you last [multipler_to_percentage(disable_duration_percent, TRUE)] [disable_duration_percent > 1.0 ? "longer" : "shorter"]"
+
+ if(!isnull(incoming_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_damage_percent, TRUE)] [incoming_damage_percent > 1.0 ? "more" : "less"] damage."
+ if(!isnull(incoming_brute_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_brute_damage_percent, TRUE)] [incoming_brute_damage_percent > 1.0 ? "more" : "less"] brute damage."
+ if(!isnull(incoming_fire_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_fire_damage_percent, TRUE)] [incoming_fire_damage_percent > 1.0 ? "more" : "less"] fire damage."
+ if(!isnull(incoming_tox_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_tox_damage_percent, TRUE)] [incoming_tox_damage_percent > 1.0 ? "more" : "less"] toxin damage."
+ if(!isnull(incoming_oxy_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_oxy_damage_percent, TRUE)] [incoming_oxy_damage_percent > 1.0 ? "more" : "less"] oxy damage."
+ if(!isnull(incoming_clone_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_clone_damage_percent, TRUE)] [incoming_clone_damage_percent > 1.0 ? "more" : "less"] clone damage."
+ if(!isnull(incoming_hal_damage_percent))
+ effects += "You take [multipler_to_percentage(incoming_hal_damage_percent, TRUE)] [incoming_hal_damage_percent > 1.0 ? "more" : "less"] agony damage."
+
+ if(!isnull(incoming_healing_percent))
+ effects += "Healing applied to you is [multipler_to_percentage(incoming_healing_percent, TRUE)] [incoming_healing_percent > 1.0 ? "stronger" : "weaker"]."
+
+ if(!isnull(outgoing_melee_damage_percent))
+ effects += "Damage you do with melee weapons and unarmed combat is [multipler_to_percentage(outgoing_melee_damage_percent, TRUE)] \
+ [outgoing_melee_damage_percent > 1.0 ? "higher" : "lower"]."
+
+ if(!isnull(slowdown))
+ effects += "[slowdown > 0 ? "lose" : "gain"] [slowdown] slowdown."
+
+ if(!isnull(haste))
+ effects += "You move at maximum speed, and cannot be slowed by any means."
+
+ if(!isnull(evasion))
+ effects += "You are [abs(evasion * 15)]% [evasion > 0 ? "harder" : "easier"] to hit with weapons."
+
+ if(!isnull(bleeding_rate_percent))
+ effects += "You bleed [multipler_to_percentage(bleeding_rate_percent, TRUE)] [bleeding_rate_percent > 1.0 ? "faster" : "slower"]."
+
+ if(!isnull(accuracy))
+ effects += "It is [abs(accuracy * 15)]% [accuracy > 0 ? "easier" : "harder"] for you to hit someone with a ranged weapon."
+
+ if(!isnull(accuracy_dispersion))
+ effects += "Projectiles you fire are [accuracy_dispersion > 0 ? "more" : "less"] likely to stray from your intended target."
+
+ if(!isnull(metabolism_percent))
+ effects += "Your metabolism is [metabolism_percent > 1.0 ? "faster" : "slower"], \
+ causing reagents in your body to process, and hunger to occur [multipler_to_percentage(metabolism_percent, TRUE)] [metabolism_percent > 1.0 ? "faster" : "slower"]."
+
+
+ return jointext(effects, "
")
+
+
+
+// Helper to format multiplers (e.g. 1.4) to percentages (like '40%')
+/proc/multipler_to_percentage(var/multi, var/abs = FALSE)
+ if(abs)
+ return "[abs( ((multi - 1) * 100) )]%"
+ return "[((multi - 1) * 100)]%"
diff --git a/code/modules/mob/_modifiers/traits.dm b/code/modules/mob/_modifiers/traits.dm
index 1ee7b41090..824343c41c 100644
--- a/code/modules/mob/_modifiers/traits.dm
+++ b/code/modules/mob/_modifiers/traits.dm
@@ -1,10 +1,61 @@
-/datum/modifier/frail
- name = "frail"
- desc = "You are more delicate than the average person."
+/datum/modifier/trait
+ flags = MODIFIER_GENETIC // We want traits to persist if the person gets cloned.
- flags = MODIFIER_GENETIC
+
+/datum/modifier/trait/flimsy
+ name = "flimsy"
+ desc = "You're more fragile than most, and have less of an ability to endure harm."
+
+ on_created_text = "You feel rather weak."
+ on_expired_text = "You feel your strength returning to you."
+
+ max_health_percent = 0.8
+
+/datum/modifier/trait/frail
+ name = "frail"
+ desc = "Your body is very fragile, and has even less of an ability to endure harm."
on_created_text = "You feel really weak."
on_expired_text = "You feel your strength returning to you."
- max_health_percent = 0.9
\ No newline at end of file
+ max_health_percent = 0.6
+
+/datum/modifier/trait/weak
+ name = "weak"
+ desc = "A lack of physical strength causes a diminshed capability in close quarters combat"
+
+ outgoing_melee_damage_percent = 0.8
+
+/datum/modifier/trait/wimpy
+ name = "wimpy"
+ desc = "An extreme lack of physical strength causes greatly diminished capability in close quarters combat."
+
+ outgoing_melee_damage_percent = 0.6
+
+/datum/modifier/trait/haemophilia
+ name = "haemophilia"
+ desc = "You bleed much faster than average."
+
+ bleeding_rate_percent = 3.0
+
+/datum/modifier/trait/inaccurate
+ name = "Inaccurate"
+ desc = "You're rather inexperienced with guns, you've never used one in your life, or you're just really rusty. \
+ Regardless, you find it quite difficult to land shots where you wanted them to go."
+
+ accuracy = -1
+ accuracy_dispersion = 1
+
+/datum/modifier/trait/high_metabolism
+ name = "High Metabolsim"
+ desc = "Your body's metabolism is faster than average."
+
+ metabolism_percent = 2.0
+ incoming_healing_percent = 1.4
+
+/datum/modifier/trait/low_metabolism
+ name = "Low Metabolism"
+ desc = "Your body's metabolism is slower than average."
+
+ metabolism_percent = 0.5
+ incoming_healing_percent = 0.6
\ No newline at end of file
diff --git a/code/modules/mob/_modifiers/traits_phobias.dm b/code/modules/mob/_modifiers/traits_phobias.dm
new file mode 100644
index 0000000000..58e35fea03
--- /dev/null
+++ b/code/modules/mob/_modifiers/traits_phobias.dm
@@ -0,0 +1,491 @@
+// Gives various spooky messages to people afraid of a specific thing.
+// Doesn't have any real mechanical effect, and is more of an aid to remind someone "You're supposed to be afraid of the dark", and such.
+
+/datum/modifier/trait/phobia
+ var/current_fear = 0 // Counter for how 'afraid' the holder is.
+ var/max_fear = 100 // Cap for current_fear.
+ var/fear_decay_rate = 1 // How much is subtracted every Life() tick when not being spooked by something.
+
+ var/list/zero_fear_up = list() // Message displayed to holder when current_fear raises above 0.
+ var/list/zero_fear_down = list() // Message displayed when reaching 0.
+
+ var/list/half_fear_up = list() // Message displayed when current_fear passes half of max_fear.
+ var/list/half_fear_down = list() // Message displayed when current_fear goes below half of max_fear.
+
+ var/list/full_fear_up = list() // Similar to above, but for the cap.
+ var/list/full_fear_down = list() // Ditto.
+
+/datum/modifier/trait/phobia/tick()
+ if(holder.stat)
+ return // You got bigger problems.
+ var/new_fear = should_fear()
+ if(new_fear)
+ adjust_fear(new_fear)
+ else
+ adjust_fear(-fear_decay_rate)
+
+/datum/modifier/trait/phobia/proc/adjust_fear(var/amount)
+ var/last_fear = current_fear
+ current_fear = between(0, current_fear + amount, max_fear)
+
+ // Handle messages. safepick() is used so that if no messages are defined, it just does nothing, verses runtiming.
+ var/message = null
+ if(amount > 0) // Increase in spooks.
+ if(current_fear == max_fear && last_fear < max_fear)
+ message = safepick(full_fear_up)
+ else if(current_fear >= (max_fear / 2) && last_fear < (max_fear / 2))
+ message = safepick(half_fear_up)
+ else if(current_fear > 0 && last_fear == 0)
+ message = safepick(zero_fear_up)
+ else if(amount < 0) // Decrease in spooks.
+ if(last_fear == max_fear && current_fear < max_fear)
+ message = safepick(full_fear_down)
+ else if(last_fear >= (max_fear / 2) && current_fear < (max_fear / 2))
+ message = safepick(half_fear_down)
+ else if(last_fear > 0 && current_fear == 0)
+ message = safepick(zero_fear_down)
+
+ if(message)
+ to_chat(holder, message)
+
+// Override for specific fears, e.g. seeing blood or spiders.
+/datum/modifier/trait/phobia/proc/should_fear()
+ return FALSE
+
+
+// Actual phobia trait implementations below.
+
+/datum/modifier/trait/phobia/haemophobia
+ name = "haemophobia"
+ desc = "Seeing a bunch of blood isn't really pleasant for most people, but for you, it is very distressing."
+ fear_decay_rate = 4
+
+ on_created_text = "You are terrified of seeing blood."
+ on_expired_text = "You feel that blood doesn't bother you, at least, as much as it used to."
+
+ zero_fear_up = list(
+ "You see some blood nearby...",
+ "You try to avoid looking at the blood nearby."
+ )
+ zero_fear_down = list(
+ "You feel better now, with no blood in sight.",
+ "At last, the blood is gone.",
+ "Hopefully you won't see anymore blood today."
+ )
+
+ half_fear_up = list(
+ "You're still near the blood!",
+ "So much blood... You can't stand it."
+ )
+ half_fear_down = list(
+ "The blood is gone now, but you're still worked up.",
+ "You can't see the blood now, but you're still anxious."
+ )
+
+ full_fear_up = list(
+ "The blood is too much!",
+ "There is so much blood here, you need to leave!",
+ "You gotta get away from the blood!"
+ )
+ full_fear_down = list(
+ "The blood is gone, but you're still very anxious.",
+ "No more blood... Please."
+ )
+
+/datum/modifier/trait/phobia/haemophobia/check_if_valid()
+ if(iscultist(holder)) // Nar-nar can't be having cultists afraid of blood.
+ expire()
+ else
+ ..()
+
+/datum/modifier/trait/phobia/haemophobia/should_fear()
+ if(holder.blinded)
+ return 0 // Can't fear what cannot be seen.
+
+ var/fear_amount = 0
+ for(var/atom/thing in view(5, holder)) // It's 5 and not 7 so players have a chance to go away before getting the prompts, and for performance.
+ // Blood stains are bad.
+ if(istype(thing, /obj/effect/decal/cleanable/blood))
+ var/obj/effect/decal/cleanable/blood/B = thing
+ // Tracks are special, apparently.
+ if(istype(thing, /obj/effect/decal/cleanable/blood/tracks))
+ var/obj/effect/decal/cleanable/blood/tracks/T = B
+ for(var/datum/fluidtrack/F in T.stack)
+ if(F.basecolor != SYNTH_BLOOD_COLOUR)
+ fear_amount++
+ break
+ else
+ if(B.basecolor != SYNTH_BLOOD_COLOUR)
+ fear_amount++
+
+ // People covered in blood is also bad.
+ // Feel free to trim down if its too expensive CPU wise.
+ if(istype(thing, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = thing
+ var/self_multiplier = H == holder ? 2 : 1
+ var/human_blood_fear_amount = 0
+ if(!H.gloves && H.bloody_hands && H.hand_blood_color != SYNTH_BLOOD_COLOUR)
+ human_blood_fear_amount += 1
+ if(!H.shoes && H.feet_blood_color && H.feet_blood_color != SYNTH_BLOOD_COLOUR)
+ human_blood_fear_amount += 1
+
+ // List of slots. Some slots like pockets are omitted due to not being visible, if H isn't the holder.
+ var/list/clothing_slots = list(H.back, H.wear_mask, H.l_hand, H.r_hand, H.wear_id, H.glasses, H.gloves, H.head, H.shoes, H.belt, H.wear_suit, H.w_uniform, H.s_store, H.l_ear, H.r_ear)
+ if(H == holder)
+ clothing_slots += list(H.l_store, H.r_store)
+
+ for(var/obj/item/clothing/C in clothing_slots)
+ if(C.blood_DNA && C.blood_color && C.blood_color != SYNTH_BLOOD_COLOUR)
+ human_blood_fear_amount += 1
+
+ // This is divided, since humans can wear so many items at once.
+ human_blood_fear_amount = round( (human_blood_fear_amount * self_multiplier) / 3, 1)
+ fear_amount += human_blood_fear_amount
+
+ // Bloody objects are also bad.
+ if(istype(thing, /obj))
+ var/obj/O = thing
+ if(O.blood_DNA && O.blood_color && O.blood_color != SYNTH_BLOOD_COLOUR)
+ fear_amount++
+
+ return fear_amount
+
+
+/datum/modifier/trait/phobia/arachnophobe
+ name = "arachnophobia"
+ desc = "Spiders are quite creepy to most people, however for you, those chitters of pure evil inspire pure dread and fear."
+ fear_decay_rate = 1
+
+ on_created_text = "You are terrified of seeing spiders."
+ on_expired_text = "You feel that your fear of spiders has gone from 'crippling' to 'nope nope nope', which is still an improvement."
+
+ zero_fear_up = list(
+ "You see a spider!",
+ "Spider!"
+ )
+ zero_fear_down = list(
+ "Those evil spiders are finally gone.",
+ "At last, the chitters are gone.",
+ "The spiders are gone, at last."
+ )
+
+ half_fear_up = list(
+ "The spiders are gonna eat you!",
+ "The spiders are still here!",
+ "The spiders will lay eggs inside you if you don't run!",
+ )
+ half_fear_down = list(
+ "The spiders are gone... right?",
+ "You can't see any spiders now, but you're still anxious."
+ )
+
+ full_fear_up = list(
+ "The chittering is driving you mad!",
+ "You're gonna be spider-food if you don't run!",
+ "The spiders are gonna feast on your eyes!"
+ )
+ full_fear_down = list(
+ "The spiders must surely be hiding somewhere...",
+ "No more spiders... Please."
+ )
+
+/datum/modifier/trait/phobia/arachnophobe/should_fear()
+ if(holder.blinded)
+ return 0 // Can't fear what cannot be seen.
+
+ var/fear_amount = 0
+ for(var/atom/thing in view(5, holder)) // See haemophobia for why this is 5.
+ if(istype(thing, /obj/effect/decal/cleanable/spiderling_remains)) // Dead spiderlings are a bit spooky.
+ fear_amount += 1
+
+ if(istype(thing, /obj/effect/spider/spiderling)) // Live spiderlings are also spooky.
+ fear_amount += 2
+
+ if(istype(thing, /obj/item/toy/plushie/spider)) // Plushies are spooky so people can be assholes with them.
+ fear_amount += 1
+
+ if(istype(thing, /mob/living/simple_animal/hostile/giant_spider)) // Actual giant spiders are the scariest of them all.
+ var/mob/living/simple_animal/hostile/giant_spider/S = thing
+ if(S.stat == DEAD) // Dead giant spiders are less scary than alive ones.
+ fear_amount += 4
+ else
+ fear_amount += 8
+ return fear_amount
+
+
+/datum/modifier/trait/phobia/nyctophobe
+ name = "nyctophobia"
+ desc = "More commonly known as the fear of darkness. The shadows can hide many dangers, which makes the prospect of going into the depths of Maintenance rather worrisome."
+ fear_decay_rate = 5
+
+ on_created_text = "You are terrified of the dark."
+ on_expired_text = "You feel that darkness isn't quite as scary anymore."
+
+ var/fear_threshold = 0.5 // Average lighting needs to be below this to start increasing fear.
+
+ zero_fear_up = list(
+ "It's so dark here!",
+ "It's too dark!"
+ )
+ zero_fear_down = list(
+ "You feel calmer, now that you're in the light.",
+ "At last, no more darkness.",
+ "The light makes you feel calmer."
+ )
+
+ half_fear_up = list(
+ "You need to escape this darkness!",
+ "Something might be lurking near you, but you can't see in this darkness.",
+ "You need to find a light!",
+ )
+ half_fear_down = list(
+ "The darkness is gone, for now...",
+ "You're not in the dark anymore, but you're still anxious."
+ )
+
+ full_fear_up = list(
+ "What was that?",
+ "Something is nearby..."
+ )
+ full_fear_down = list(
+ "Light, at last!",
+ "The darkness is finally gone!"
+ )
+
+/datum/modifier/trait/phobia/nyctophobe/should_fear()
+ if(holder.blinded)
+ return 5 // Unlike most other fears coded here, being blind when afraid of darkness is pretty bad, I imagine.
+
+ if(holder.see_in_dark >= 5)
+ return 0 // What darkness?
+
+ var/fear_amount = 0
+ var/total_lum = 0
+ var/total_tiles = 0
+ var/average_lum = null
+
+ for(var/turf/simulated/T in view(5, get_turf(holder))) // See haemophobia for why this is 5. This uses get_turf() since darkness makes tiles not visible to holder.
+ total_lum += T.get_lumcount()
+ total_tiles++
+
+ average_lum = total_lum / total_tiles
+
+ if(average_lum > fear_threshold)
+ switch(average_lum)
+ if(0.0 to 0.1)
+ fear_amount += 5
+ if(0.1 to 0.2)
+ fear_amount += 4
+ if(0.2 to 0.3)
+ fear_amount += 3
+ if(0.3 to 0.4)
+ fear_amount += 2
+ if(0.4 to 0.5)
+ fear_amount += 1
+
+ var/turf/T = get_turf(holder)
+ if(T.get_lumcount() <= LIGHTING_SOFT_THRESHOLD) // Standing in complete darkness.
+ fear_amount += 5
+
+ return fear_amount
+
+/datum/modifier/trait/phobia/claustrophobe
+ name = "claustrophobia"
+ desc = "Small spaces and tight quarters makes you feel distressed. Unfortunately both are rather common when living in space."
+ fear_decay_rate = 2
+
+ var/open_tiles_needed = 15 // Tends to be just right, as maint triggers this but hallways don't.
+
+ on_created_text = "You are terrified of tight spaces. Why did you come to space??"
+ on_expired_text = "Small rooms aren't so bad now."
+
+ zero_fear_up = list(
+ "This room is too small...",
+ "The walls are too close together..."
+ )
+ zero_fear_down = list(
+ "You feel calmer, now that you're in a larger room.",
+ "At last, the walls are far apart.",
+ "The relatively open area makes you feel calmer."
+ )
+
+ half_fear_up = list(
+ "Your surroundings look like they are closing in.",
+ "Is the room getting smaller?",
+ "You need to get out of here!",
+ )
+ half_fear_down = list(
+ "Your surroundings seem to have stopped closing in.",
+ "You're not in a tight space anymore, but you're still anxious."
+ )
+
+ full_fear_up = list(
+ "You need to escape!",
+ "There's barely any room to move around!"
+ )
+ full_fear_down = list(
+ "The surroundings stop shrinking.",
+ "The walls seem to have stopped."
+ )
+
+/datum/modifier/trait/phobia/claustrophobe/should_fear()
+ if(holder.blinded)
+ return 0 // No idea if this is accurate.
+
+ if(holder.loc && !isturf(holder.loc)) // Hiding in a locker or inside an exosuit is spooky.
+ return 5
+
+ var/fear_amount = 0
+ var/open_tiles = 0
+ var/radius = 5 // See haemophobia for why this is 5.
+ var/max_open_tiles = radius * radius // Potential maximum tiles. In practice it will be rare for someone to be inside a 5x5 plane.
+ for(var/turf/T in view(radius, holder))
+ var/open = TRUE
+ if(T.density)
+ continue
+ for(var/atom/movable/AM in T)
+ if(AM.density)
+ open = FALSE
+ break
+ if(open)
+ open_tiles++
+
+ if(open_tiles < open_tiles_needed)
+ var/fear_reduction = abs( (open_tiles / max_open_tiles) - 1) // The smaller the space, the smaller this number is, and fear will build up faster.
+ fear_amount = 5 * fear_reduction
+
+ return fear_amount
+
+// Note for the below 'phobias' are of the xeno-phobic variety, and are less centered on pure fear as above, and more on a mix of distrust, fear, and disdainfulness.
+// As such, they are mechanically different than the fear-based phobias, in that instead of a buildup of fearful messages, it does intermittent messages specific to what holder sees.
+
+// This is the catch-all 'everyone but [my species] is up to no good' trait, as opposed to the other specialized variants.
+/datum/modifier/trait/phobia/xenophobia
+ name = "xenophobia"
+ desc = "The mind of the Alien is unknowable, and as such, their intentions cannot be known. You always watch the xenos closely, as they most certainly are watching you \
+ closely, waiting to strike."
+
+ on_created_text = "You remain vigilant against the Alien."
+ on_expired_text = "Aliens aren't so bad afterall."
+
+ var/last_message = null // world.time we last did a message.
+ var/message_cooldown = 1 MINUTE
+
+/datum/modifier/trait/phobia/xenophobia/tick()
+ if(holder.stat)
+ return // You got bigger problems.
+ if(last_message + message_cooldown <= world.time)
+ if(intermittent_message())
+ last_message = world.time
+
+/datum/modifier/trait/phobia/xenophobia/proc/intermittent_message()
+ var/list/xenos = get_xenos()
+
+ if(xenos.len)
+ var/chosen_xeno = pick(xenos)
+ to_chat(holder, "[make_message(chosen_xeno)]")
+ return TRUE
+ else
+ return FALSE // No xenos in sight, so don't apply the cooldown.
+
+/datum/modifier/trait/phobia/xenophobia/proc/get_xenos()
+ return list()
+
+
+/datum/modifier/trait/phobia/xenophobia/proc/make_message(var/mob/living/L)
+ return "Someone forgot to override this output message."
+
+
+// This is the catch-all 'everyone but [my species] is up to no good' trait, as opposed to the other specialized variants.
+/datum/modifier/trait/phobia/xenophobia/generic
+ name = "xenophobia"
+ desc = "The mind of the Alien is unknowable, and as such, their intentions cannot be known. You always watch the xenos closely, as they most certainly are watching you \
+ closely, waiting to strike."
+
+ on_created_text = "You remain vigilant against the Alien."
+ on_expired_text = "Aliens aren't so bad afterall."
+
+/datum/modifier/trait/phobia/xenophobia/generic/get_xenos()
+ var/list/xenos = list()
+ if(!ishuman(holder))
+ return
+ var/mob/living/carbon/human/us = holder
+ for(var/mob/living/carbon/human/H in view(5, holder)) // See haemophobia for why this is 5.
+ if(!(istype(us.species, H.species) )) // Are they a different species?
+ xenos += H
+ return xenos
+
+/datum/modifier/trait/phobia/xenophobia/generic/make_message(var/mob/living/carbon/human/H)
+ // Do special responses first if possible.
+// if(H.stat == DEAD)
+// return pick( list("Unsurprising to see a weak and inferior [H.species.name] fail to survive.", "If that [H.species.name] were a [holder.species.name], this wouldn't've have happened.") )
+
+ // Generic responses if none of the above apply.
+ var/list/generic_responses = list(
+ "That [H.species.name] is likely trying to spy on you.",
+ "[H.species.name_plural] tend to be ugly, but this one near you is even worse!",
+ "[H.species.name] scum.",
+ "The [H.species.name] nearby is certainly a spy for Them.",
+ "That [H.species.name] smells awful.",
+ "Can't trust [H.species.name_plural]."
+ )
+ return pick(generic_responses)
+
+
+// *********
+// * Human *
+// *********
+
+/datum/modifier/trait/phobia/xenophobia/human
+ name = "anti-human sentiment"
+ desc = "Humans are bound to get us all killed with their reckless use of technology..."
+
+ on_created_text = "You unfortunately are likely to have to deal with humans today."
+ on_expired_text = "Humans aren't so bad afterall."
+
+/datum/modifier/trait/phobia/xenophobia/human/get_xenos()
+ var/list/humans = list()
+ for(var/mob/living/carbon/human/H in view(5, holder)) // See haemophobia for why this is 5.
+ if(H == holder)
+ continue // No self loathing here.
+ if(istype(H.species, /datum/species/human) ) // Are they a human.
+ humans += H
+ return humans
+
+/datum/modifier/trait/phobia/xenophobia/human/make_message(var/mob/living/carbon/human/H)
+ // Do special responses first if possible.
+
+ // Generic responses if none of the above apply.
+ var/list/generic_responses = list(
+ "Why did you travel to human space? It's full of them."
+ )
+ return pick(generic_responses)
+
+// **********
+// * Skrell *
+// **********
+
+/datum/modifier/trait/phobia/xenophobia/skrell
+ name = "anti-skrell sentiment"
+ desc = "The Skrell pretend that they are Humanity's enlightened allies, but you can see past that."
+
+ on_created_text = "Hopefully no Skrell show up today."
+ on_expired_text = "Skrell aren't so bad afterall."
+
+/datum/modifier/trait/phobia/xenophobia/skrell/get_xenos()
+ var/list/skrell = list()
+ for(var/mob/living/carbon/human/H in view(5, holder)) // See haemophobia for why this is 5.
+ if(H == holder)
+ continue // No self loathing here.
+ if(istype(H.species, /datum/species/skrell) ) // Are they a squid now?
+ skrell += H
+ return skrell
+
+/datum/modifier/trait/phobia/xenophobia/skrell/make_message(var/mob/living/carbon/human/H)
+ // Do special responses first if possible.
+
+ // Generic responses if none of the above apply.
+ var/list/generic_responses = list(
+ "WetSkrell was a mistake."
+ )
+ return pick(generic_responses)
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index aa057c04c8..1aaa236446 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -52,6 +52,11 @@
user << "You aren't sure where this brain came from, but you're pretty sure it's useless."
return
+ for(var/modifier_type in B.brainmob.modifiers) //Can't be shoved in an MMI.
+ if(istype(modifier_type, /datum/modifier/no_borg))
+ to_chat(user, "\The [src] appears to reject this brain. It is incompatable.")
+ return
+
user.visible_message("\The [user] sticks \a [O] into \the [src].")
brainmob = B.brainmob
@@ -118,6 +123,11 @@
brainmob.dna = H.dna
brainmob.container = src
+ // Copy modifiers.
+ for(var/datum/modifier/M in H.modifiers)
+ if(M.flags & MODIFIER_GENETIC)
+ brainmob.add_modifier(M.type)
+
name = "Man-Machine Interface: [brainmob.real_name]"
icon_state = "mmi_full"
locked = 1
diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm
index 8dffa60d1e..3fe0d57aa4 100644
--- a/code/modules/mob/living/carbon/breathe.dm
+++ b/code/modules/mob/living/carbon/breathe.dm
@@ -70,8 +70,8 @@
//handle mask filtering
if(istype(wear_mask, /obj/item/clothing/mask) && breath)
var/obj/item/clothing/mask/M = wear_mask
- var/datum/gas_mixture/filtered = M.filter_air(breath)
- loc.assume_air(filtered)
+ var/datum/gas_mixture/gas_filtered = M.filter_air(breath)
+ loc.assume_air(gas_filtered)
return breath
return null
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index b4a47d2e47..ffac791a1f 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -112,5 +112,5 @@
mutations.Add(SKELETON)
status_flags |= DISFIGURED
- update_body(0)
+ update_body(1)
return
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 01fd297627..51491f9f08 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -233,14 +233,28 @@
m_type = 1
else
if(!muzzled)
- message = "coughs!"
+ var/robotic = 0
m_type = 2
- if(gender == FEMALE)
- if(species.female_cough_sounds)
- playsound(src, pick(species.female_cough_sounds), 120)
+ if(should_have_organ(O_LUNGS))
+ var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
+ if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs
+ robotic = 1
+ if(!robotic)
+ message = "coughs!"
+ if(gender == FEMALE)
+ if(species.female_cough_sounds)
+ playsound(src, pick(species.female_cough_sounds), 120)
+ else
+ if(species.male_cough_sounds)
+ playsound(src, pick(species.male_cough_sounds), 120)
else
- if(species.male_cough_sounds)
- playsound(src, pick(species.male_cough_sounds), 120)
+ message = "emits a robotic cough"
+ var/use_sound
+ if(gender == FEMALE)
+ use_sound = pick('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg')
+ else
+ use_sound = pick('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg')
+ playsound(src.loc, use_sound, 50, 0)
else
message = "makes a strong noise."
m_type = 2
@@ -493,12 +507,27 @@
m_type = 1
else
if(!muzzled)
- message = "sneezes."
- if(gender == FEMALE)
- playsound(src, species.female_sneeze_sound, 70)
- else
- playsound(src, species.male_sneeze_sound, 70)
+ var/robotic = 0
m_type = 2
+ if(should_have_organ(O_LUNGS))
+ var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
+ if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs
+ robotic = 1
+ if(!robotic)
+ message = "sneezes."
+ if(gender == FEMALE)
+ playsound(src, species.female_sneeze_sound, 70)
+ else
+ playsound(src, species.male_sneeze_sound, 70)
+ m_type = 2
+ else
+ message = "emits a robotic sneeze"
+ var/use_sound
+ if(gender == FEMALE)
+ use_sound = 'sound/effects/mob_effects/machine_sneeze.ogg'
+ else
+ use_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg'
+ playsound(src.loc, use_sound, 50, 0)
else
message = "makes a strange noise."
m_type = 2
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index cb3e74e5ad..f9e92a0402 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1217,6 +1217,8 @@
hud_used = new /datum/hud(src)
if(species)
+ //if(mind) //VOREStation Removal
+ //apply_traits() //VOREStation Removal
return 1
else
return 0
@@ -1554,7 +1556,7 @@
return species.fire_icon_state
// Called by job_controller. Makes drones start with a permit, might be useful for other people later too.
-/mob/living/carbon/human/equip_post_job()
+/mob/living/carbon/human/equip_post_job() //Drone Permit moved to equip_survival_gear()
var/braintype = get_FBP_type()
if(braintype == FBP_DRONE)
var/turf/T = get_turf(src)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 42530c2d4b..103019380a 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -23,9 +23,13 @@
var/g_skin = 0
var/b_skin = 0
- // VoreStation (Moved to /mob/living)
- // var/size_multiplier = 1 //multiplier for the mob's icon size
+ //Synth colors
+ var/synth_color = 0 //Lets normally uncolorable synth parts be colorable.
+ var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
+ var/g_synth //Same as above
+ var/b_synth //Same as above
+ //var/size_multiplier = 1 //multiplier for the mob's icon size //VOREStation Edit (Moved to /mob/living)
var/damage_multiplier = 1 //multiplies melee combat damage
var/icon_update = 1 //whether icon updating shall take place
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 151f1d16e2..301b1344aa 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -651,7 +651,7 @@
if(status_flags & GODMODE)
return 1 //godmode
-
+
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
var/cold_dam = 0
if(bodytemperature <= species.cold_level_1)
@@ -864,8 +864,14 @@
heal_overall_damage(1,1)
// nutrition decrease
- if (nutrition > 0 && stat != 2)
- nutrition = max (0, nutrition - species.hunger_factor)
+ if (nutrition > 0 && stat != DEAD)
+ var/nutrition_reduction = species.hunger_factor
+
+ for(var/datum/modifier/mod in modifiers)
+ if(!isnull(mod.metabolism_percent))
+ nutrition_reduction *= mod.metabolism_percent
+
+ nutrition = max (0, nutrition - nutrition_reduction)
if (nutrition > 450)
if(overeatduration < 600) //capped so people don't take forever to unfat
diff --git a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm
new file mode 100644
index 0000000000..d6c5d030a5
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm
@@ -0,0 +1,53 @@
+/datum/species/skeleton
+ name = "Skeleton"
+ name_plural = "Skeletons"
+ icobase = 'icons/mob/human_races/r_skeleton.dmi'
+ primitive_form = "Monkey"
+ language = "Sol Common"
+ unarmed_types = list(/datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/sharp) //Bones are pointy, fight me.
+ blurb = "Spooky Scary Skeletons!"
+ name_language = null // Use the first-name last-name generator rather than a language scrambler
+ min_age = 17
+ max_age = 110
+ health_hud_intensity = 1.5
+
+ flags = NO_SCAN | NO_PAIN | NO_SLIP | NO_POISON | NO_MINOR_CUT | NO_BLOOD | UNDEAD
+ spawn_flags = SPECIES_IS_RESTRICTED
+ appearance_flags = null
+
+ show_ssd = null
+
+ blood_volume = null
+ taste_sensitivity = TASTE_DULL
+ hunger_factor = 0
+ metabolic_rate = 0
+
+ virus_immune = 1
+
+ brute_mod = 1
+ burn_mod = 0
+ oxy_mod = 0
+ toxins_mod = 0
+ radiation_mod = 0
+ flash_mod = 0
+ chemOD_mod = 0
+
+ siemens_coefficient = 0
+
+ death_message = "falls over and stops moving!"
+ knockout_message = "falls over and stops moving!"
+
+ has_organ = list()
+
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+
+ cold_level_1 = 50
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 2000
+ heat_level_2 = 3000
+ heat_level_3 = 4000
+
+ body_temperature = T20C
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm
index 8440de19a9..da0ee4a804 100644
--- a/code/modules/mob/living/carbon/taste.dm
+++ b/code/modules/mob/living/carbon/taste.dm
@@ -1,4 +1,10 @@
/mob/living/carbon/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it.
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ var/braintype = H.get_FBP_type()
+ if(braintype == FBP_DRONE || braintype == FBP_POSI)
+ return from.trans_to_holder(target,amount,multiplier,copy) //skip the taste, complete transfer
+
if(last_taste_time + 50 < world.time)
var/datum/reagents/temp = new(amount) //temporary holder used to analyse what gets transfered.
from.trans_to_holder(temp, amount, multiplier, 1)
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 0fa139c36f..22289c6b43 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -87,7 +87,7 @@
return 1
-/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0)
+/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/agony = 0, var/blocked = 0, var/ignite = 0, var/flammable = 0)
if(blocked >= 100)
return 0
if(stun) apply_effect(stun, STUN, blocked)
@@ -98,4 +98,6 @@
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
if(agony) apply_effect(agony, AGONY, blocked)
+ if(flammable) adjust_fire_stacks(flammable)
+ if(ignite) IgniteMob()
return 1
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 2a0b1e7e13..8fbcab7eaf 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -319,7 +319,7 @@ default behaviour is:
return fireloss
/mob/living/proc/getActualFireLoss() // Mostly for humans with robolimbs.
- return getBruteLoss()
+ return getFireLoss()
/mob/living/proc/adjustFireLoss(var/amount)
if(status_flags & GODMODE) return 0 //godmode
@@ -724,9 +724,21 @@ default behaviour is:
if(A.has_gravity)
//this is the gay blood on floor shit -- Added back -- Skie
if (M.lying && (prob(M.getBruteLoss() / 6)))
- var/turf/location = M.loc
- if (istype(location, /turf/simulated))
- location.add_blood(M)
+ var/bloodtrail = 1 //Checks if it's possible to even spill blood
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.flags & NO_BLOOD)
+ bloodtrail = 0
+ else
+ var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100)
+ if(blood_volume < BLOOD_VOLUME_SURVIVE)
+ bloodtrail = 0 //Most of it's gone already, just leave it be
+ else
+ H.vessel.remove_reagent("blood", 1)
+ if(bloodtrail)
+ var/turf/location = M.loc
+ if(istype(location, /turf/simulated))
+ location.add_blood(M)
//pull damage with injured people
if(prob(25))
M.adjustBruteLoss(1)
@@ -737,13 +749,20 @@ default behaviour is:
visible_message("\The [M]'s [M.isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!")
var/turf/location = M.loc
if (istype(location, /turf/simulated))
- location.add_blood(M)
+ var/bloodtrail = 1 //Checks if it's possible to even spill blood
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/blood_volume = round(H.vessel.get_reagent_amount("blood"))
- if(blood_volume > 0)
- H.vessel.remove_reagent("blood", 1)
-
+ if(H.species.flags & NO_BLOOD)
+ bloodtrail = 0
+ else
+ var/blood_volume = round((H.vessel.get_reagent_amount("blood")/H.species.blood_volume)*100)
+ if(blood_volume < BLOOD_VOLUME_SURVIVE)
+ bloodtrail = 0 //Most of it's gone already, just leave it be
+ else
+ H.vessel.remove_reagent("blood", 1)
+ if(bloodtrail)
+ if(istype(location, /turf/simulated))
+ location.add_blood(M)
step(pulling, get_dir(pulling.loc, T))
if(t)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 0a9a84ac04..ffc02b4664 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -303,14 +303,13 @@ proc/get_radio_key_from_channel(var/channel)
var/image/speech_bubble = image('icons/mob/talk.dmi',src,"[speech_type][speech_bubble_test]")
spawn(30) qdel(speech_bubble)
-
// VOREStation Edit - Attempt Multi-Z Talking
var/mob/above = src.shadow
while(!QDELETED(above))
var/turf/ST = get_turf(above)
if(ST)
var/list/results = get_mobs_and_objs_in_view_fast(ST, world.view)
- var/image/z_speech_bubble = image('icons/mob/talk_vr.dmi', above, "h[speech_bubble_test]")
+ var/image/z_speech_bubble = image('icons/mob/talk.dmi', above, "h[speech_bubble_test]")
spawn(30) qdel(z_speech_bubble)
for(var/item in results["mobs"])
if(item != above && !(item in listening))
diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
index 476059a274..ba6890e835 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
@@ -22,6 +22,9 @@
playsound(loc, 'sound/mecha/nominalsyndi.ogg', 75, 0)
+/mob/living/silicon/robot/lost/speech_bubble_appearance()
+ return "synthetic_evil"
+
/mob/living/silicon/robot/lost/randomlaws
/mob/living/silicon/robot/lost/randomlaws/init()
diff --git a/code/modules/mob/living/simple_animal/aliens/hivebot.dm b/code/modules/mob/living/simple_animal/aliens/hivebot.dm
index 02f48d13fa..aefe91b371 100644
--- a/code/modules/mob/living/simple_animal/aliens/hivebot.dm
+++ b/code/modules/mob/living/simple_animal/aliens/hivebot.dm
@@ -51,6 +51,9 @@
say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.")
say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.")
+/mob/living/simple_animal/hostile/hivebot/isSynthetic()
+ return TRUE
+
// Subtypes.
// Melee like the base type, but more fragile.
diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm
index 7b5e77f5c3..fdd1615259 100644
--- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm
+++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm
@@ -212,7 +212,7 @@
Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
Z.cancel_camera()
qdel(src)
-/obj/item/device/soulstone/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob).
+/obj/item/device/soulstone/proc/transfer_soul(var/choice as text, var/target, var/mob/U as mob)
switch(choice)
if("VICTIM")
transfer_human(target,U)
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index 65f4cb9ebb..1171d1f9ac 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -78,6 +78,7 @@
W.assignment = corpseidjob
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
+ delete_me = 1
qdel(src)
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 62e580a4f3..92aefe6923 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -228,19 +228,14 @@
//Should we be dead?
/mob/living/simple_animal/updatehealth()
+ health = getMaxHealth() - getToxLoss() - getFireLoss() - getBruteLoss()
+
//Alive, becoming dead
if((stat < DEAD) && (health <= 0))
death()
- //Dead, becoming alive
- else if((stat >= DEAD) && (health > 0))
- dead_mob_list -= src
- living_mob_list += src
- stat = CONSCIOUS
- density = 1
-
//Overhealth
- else if(health > getMaxHealth())
+ if(health > getMaxHealth())
health = getMaxHealth()
/mob/living/simple_animal/update_icon()
@@ -628,6 +623,16 @@
var/tally = 0 //Incase I need to add stuff other than "speed" later
tally = speed
+
+ if(force_max_speed)
+ return -3
+
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.haste) && M.haste == TRUE)
+ return -3
+ if(!isnull(M.slowdown))
+ tally += M.slowdown
+
if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move.
if(tally <= 0)
tally = 1
@@ -681,52 +686,6 @@
if(3.0)
adjustBruteLoss(30)
-// Don't understand why simple animals don't use the regular /mob/living health system.
-/mob/living/simple_animal/adjustBruteLoss(damage)
- if(damage > 0)
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.incoming_damage_percent))
- damage *= M.incoming_damage_percent
- if(!isnull(M.incoming_brute_damage_percent))
- damage *= M.incoming_brute_damage_percent
- else if(damage < 0)
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.incoming_healing_percent))
- damage *= M.incoming_healing_percent
-
- health = Clamp(health - damage, 0, getMaxHealth())
- updatehealth()
-
-/mob/living/simple_animal/adjustFireLoss(damage)
- if(damage > 0)
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.incoming_damage_percent))
- damage *= M.incoming_damage_percent
- if(!isnull(M.incoming_fire_damage_percent))
- damage *= M.incoming_brute_damage_percent
- else if(damage < 0)
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.incoming_healing_percent))
- damage *= M.incoming_healing_percent
-
- health = Clamp(health - damage, 0, getMaxHealth())
- updatehealth()
-
-/mob/living/simple_animal/adjustToxLoss(damage)
- if(damage > 0)
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.incoming_damage_percent))
- damage *= M.incoming_damage_percent
- if(!isnull(M.incoming_tox_damage_percent))
- damage *= M.incoming_brute_damage_percent
- else if(damage < 0)
- for(var/datum/modifier/M in modifiers)
- if(!isnull(M.incoming_healing_percent))
- damage *= M.incoming_healing_percent
-
- health = Clamp(health - damage, 0, getMaxHealth())
- updatehealth()
-
// Check target_mob if worthy of attack (i.e. check if they are dead or empty mecha)
/mob/living/simple_animal/proc/SA_attackable(target_mob)
ai_log("SA_attackable([target_mob])",3)
@@ -1245,6 +1204,9 @@
if(!isnull(M.outgoing_melee_damage_percent))
damage_to_do *= M.outgoing_melee_damage_percent
+ if(attack_sound)
+ playsound(src, attack_sound, 75, 1)
+
// SA attacks can be blocked with shields.
if(ishuman(A))
var/mob/living/carbon/human/H = A
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 6d6dcd5c6a..811f7edc7c 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -367,6 +367,8 @@
// Equip our custom items only AFTER deploying to spawn points eh?
equip_custom_items(character)
+ //character.apply_traits() //VOREStation Removal
+
character.lastarea = get_area(loc)
// Moving wheelchair if they have one
if(character.buckled && istype(character.buckled, /obj/structure/bed/chair/wheelchair))
@@ -468,6 +470,7 @@
mind.loaded_from_ckey = client.ckey
mind.loaded_from_slot = client.prefs.default_slot
// VOREStation
+ mind.traits = client.prefs.traits.Copy()
mind.transfer_to(new_character) //won't transfer key since the mind is not active
new_character.name = real_name
diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm
index 0885668037..0f574f4298 100644
--- a/code/modules/multiz/turf.dm
+++ b/code/modules/multiz/turf.dm
@@ -72,8 +72,8 @@
* Update icon and overlays of open space to be that of the turf below, plus any visible objects on that turf.
*/
/turf/simulated/open/update_icon()
- overlays = list() //VOREStation Edit - Overlays are being crashy when modified.
- update_icon_edge() //VOREStation Add - Get grass into open spaces and whatnot.
+ overlays = list() // Edit - Overlays are being crashy when modified.
+ update_icon_edge()// Add - Get grass into open spaces and whatnot.
var/turf/below = GetBelow(src)
if(below)
var/below_is_open = isopenspace(below)
diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm
index c7a04a5cf5..e309a8f070 100644
--- a/code/modules/multiz/zshadow.dm
+++ b/code/modules/multiz/zshadow.dm
@@ -121,7 +121,7 @@
/mob/zshadow/set_typing_indicator(var/state)
if(!typing_indicator)
typing_indicator = new
- typing_indicator.icon = 'icons/mob/talk_vr.dmi' //VOREStation Edit - Looks better on the right with job icons.
+ typing_indicator.icon = 'icons/mob/talk.dmi' //Looks better on the right with job icons.
typing_indicator.icon_state = "typing"
if(state && !typing)
overlays += typing_indicator
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index d59c3637c3..4b6a6006fa 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -17,6 +17,9 @@ var/const/CE_STABLE_THRESHOLD = 0.5
if(vessel)
return
+ if(species.flags & NO_BLOOD)
+ return
+
vessel = new/datum/reagents(species.blood_volume)
vessel.my_atom = src
@@ -139,6 +142,16 @@ var/const/CE_STABLE_THRESHOLD = 0.5
//Bleeding out
var/blood_max = 0
var/blood_loss_divisor = 30 //lower factor = more blood loss
+
+ // Some modifiers can make bleeding better or worse. Higher multiplers = more bleeding.
+ var/blood_loss_modifier_multiplier = 1.0
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.bleeding_rate_percent))
+ blood_loss_modifier_multiplier += (M.bleeding_rate_percent - 1.0)
+
+ blood_loss_divisor /= blood_loss_modifier_multiplier
+
+
//This 30 is the "baseline" of a cut in the "vital" regions (head and torso).
for(var/obj/item/organ/external/temp in bad_external_organs)
if(!(temp.status & ORGAN_BLEEDING) || (temp.robotic >= ORGAN_ROBOT))
diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm
index 0a99fb37f3..28fbf62f1e 100644
--- a/code/modules/organs/internal/brain.dm
+++ b/code/modules/organs/internal/brain.dm
@@ -79,6 +79,11 @@
brainmob.dna = H.dna.Clone()
brainmob.timeofhostdeath = H.timeofdeath
+ // Copy modifiers.
+ for(var/datum/modifier/M in H.modifiers)
+ if(M.flags & MODIFIER_GENETIC)
+ brainmob.add_modifier(M.type)
+
if(H.mind)
H.mind.transfer_to(brainmob)
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 638d2354b2..66ee177e15 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -487,13 +487,13 @@ This function completely restores a damaged organ to perfect condition.
//moved this before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return)
//Possibly trigger an internal wound, too.
var/local_damage = brute_dam + burn_dam + damage
- if((damage > 15) && (type != BURN) && (local_damage > 30) && prob(damage) && (robotic < ORGAN_ROBOT))
+ if((damage > 15) && (type != BURN) && (local_damage > 30) && prob(damage) && (robotic < ORGAN_ROBOT) && !(species.flags & NO_BLOOD))
var/datum/wound/internal_bleeding/I = new (min(damage - 15, 15))
wounds += I
owner.custom_pain("You feel something rip in your [name]!", 50)
//Burn damage can cause fluid loss due to blistering and cook-off
- if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT) && !istype(owner.loc,/mob/living) && !istype(owner.loc,/obj/item/device/dogborg/sleeper)) // VOREStation Edit
+ if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT) && !(species.flags & NO_BLOOD) && !istype(owner.loc,/mob/living) && !istype(owner.loc,/obj/item/device/dogborg/sleeper)) // VOREStation Edit
var/fluid_loss = 0.75 * (damage/(owner.getMaxHealth() - config.health_threshold_dead)) * owner.species.blood_volume*(1 - BLOOD_VOLUME_SURVIVE/100)
owner.remove_blood(fluid_loss)
@@ -681,7 +681,7 @@ Note that amputating the affected organ does in fact remove the infection from t
//Updating wounds. Handles wound natural I had some free spachealing, internal bleedings and infections
/obj/item/organ/external/proc/update_wounds()
- if((robotic >= ORGAN_ROBOT)) //Robotic limbs don't heal or get worse.
+ if((robotic >= ORGAN_ROBOT) || (species.flags & UNDEAD)) //Robotic and dead limbs don't heal or get worse.
for(var/datum/wound/W in wounds) //Repaired wounds disappear though
if(W.damage <= 0) //and they disappear right away
wounds -= W //TODO: robot wounds for robot limbs
@@ -756,7 +756,7 @@ Note that amputating the affected organ does in fact remove the infection from t
else
brute_dam += W.damage
- if(!(robotic >= ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ(O_HEART)))
+ if(!(robotic >= ORGAN_ROBOT) && W.bleeding() && (H && H.should_have_organ(O_HEART)) && !(H.species.flags & NO_BLOOD))
W.bleed_timer--
status |= ORGAN_BLEEDING
diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm
index a66811ee26..89d4b36da1 100644
--- a/code/modules/organs/organ_icon.dm
+++ b/code/modules/organs/organ_icon.dm
@@ -19,6 +19,8 @@ var/global/list/limb_icon_cache = list()
if(robotic >= ORGAN_ROBOT)
var/datum/robolimb/franchise = all_robolimbs[model]
if(!(franchise && franchise.lifelike))
+ if(human.synth_color)
+ s_col = list(human.r_synth, human.g_synth, human.b_synth)
return
if(species && human.species && species.name != human.species.name)
return
diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm
index 0e12aa6c85..150d1475e1 100644
--- a/code/modules/organs/robolimbs.dm
+++ b/code/modules/organs/robolimbs.dm
@@ -245,6 +245,20 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
green=xion_green;\
rgb=xion_rgb"
+/datum/robolimb/xion_alt3
+ company = "Xion - Whiteout"
+ desc = "This limb has a minimalist black and white casing."
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi'
+ unavailable_to_build = 1
+
+/datum/robolimb/xion_alt4
+ company = "Xion - Breach - Whiteout"
+ desc = "This limb has a minimalist black and white casing. Looks a bit menacing."
+ icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi'
+ unavailable_to_build = 1
+ parts = list(BP_HEAD)
+
+
/datum/robolimb/xion_monitor
company = "Xion Monitor"
desc = "Xion Mfg.'s unique spin on a popular prosthetic head model. It looks and minimalist and utilitarian."
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index ee202fbca8..db01fe0580 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -2,7 +2,7 @@
name = "microbattery"
desc = "A small, powerful cell for use in fully prosthetic bodies."
icon_state = "scell"
- organ_tag = "cell"
+ organ_tag = O_CELL
parent_organ = BP_TORSO
vital = 1
@@ -21,7 +21,7 @@
// Used for an MMI or posibrain being installed into a human.
/obj/item/organ/internal/mmi_holder
name = "brain interface"
- organ_tag = "brain"
+ organ_tag = O_BRAIN
parent_organ = BP_HEAD
vital = 1
var/brain_type = /obj/item/device/mmi
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index cee809d596..0af9770434 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -466,7 +466,7 @@
user << browse("[name][info_links][stamps]", "window=[name]")
return
- else if(istype(P, /obj/item/weapon/stamp))
+ else if(istype(P, /obj/item/weapon/stamp) || istype(P, /obj/item/clothing/gloves/ring/seal))
if((!in_range(src, usr) && loc != user && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != user && user.get_active_hand() != P))
return
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index bd785389b7..7840333ef3 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -6,6 +6,7 @@
item_state = "stamp"
throwforce = 0
w_class = ITEMSIZE_TINY
+ slot_flags = SLOT_HOLSTER
throw_speed = 7
throw_range = 15
matter = list(DEFAULT_WALL_MATERIAL = 60)
diff --git a/code/modules/planet/planet.dm b/code/modules/planet/planet.dm
index 4c308ca930..97c7847fde 100644
--- a/code/modules/planet/planet.dm
+++ b/code/modules/planet/planet.dm
@@ -17,8 +17,8 @@
var/turf/unsimulated/wall/planetary/planetary_wall_type = /turf/unsimulated/wall/planetary
- var/turf/simulated/floor/planet_floors = list()
- var/turf/unsimulated/wall/planetary/planet_walls = list()
+ var/list/turf/simulated/floor/planet_floors = list()
+ var/list/turf/unsimulated/wall/planetary/planet_walls = list()
var/needs_work = 0 // Bitflags to signal to the planet controller these need (properly deferrable) work. Flags defined in controller.
diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm
index b69f61cd8a..dcb6d140ec 100644
--- a/code/modules/planet/sif.dm
+++ b/code/modules/planet/sif.dm
@@ -174,6 +174,7 @@ datum/weather/sif
temp_high = T0C // 0c
temp_low = 243.15 // -30c
light_modifier = 0.5
+ flight_falure_modifier = 5
transition_chances = list(
WEATHER_LIGHT_SNOW = 20,
WEATHER_SNOW = 50,
@@ -197,6 +198,7 @@ datum/weather/sif
temp_high = 233.15 // -40c
temp_low = 213.15 // -60c
light_modifier = 0.3
+ flight_falure_modifier = 10
transition_chances = list(
WEATHER_SNOW = 45,
WEATHER_BLIZZARD = 40,
@@ -232,7 +234,7 @@ datum/weather/sif
if(!T.outdoors)
return // They're indoors, so no need to rain on them.
- L.adjust_fire_stacks(-5)
+ L.water_act(1)
to_chat(L, "Rain falls on you.")
/datum/weather/sif/storm
@@ -241,6 +243,7 @@ datum/weather/sif
temp_high = 243.15 // -30c
temp_low = 233.15 // -50c
light_modifier = 0.3
+ flight_falure_modifier = 10
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 40,
@@ -255,7 +258,7 @@ datum/weather/sif
if(!T.outdoors)
return // They're indoors, so no need to rain on them.
- L.adjust_fire_stacks(-10)
+ L.water_act(2)
to_chat(L, "Rain falls on you, drenching you in water.")
/datum/weather/sif/hail
@@ -264,6 +267,7 @@ datum/weather/sif
temp_high = T0C // 0c
temp_low = 243.15 // -30c
light_modifier = 0.3
+ flight_falure_modifier = 15
transition_chances = list(
WEATHER_RAIN = 45,
WEATHER_STORM = 10,
@@ -295,6 +299,7 @@ datum/weather/sif
name = "blood moon"
light_modifier = 0.5
light_color = "#FF0000"
+ flight_falure_modifier = 25
transition_chances = list(
WEATHER_BLOODMOON = 100
)
\ No newline at end of file
diff --git a/code/modules/planet/weather.dm b/code/modules/planet/weather.dm
index 5a58c1323e..57995f7f75 100644
--- a/code/modules/planet/weather.dm
+++ b/code/modules/planet/weather.dm
@@ -59,6 +59,7 @@
var/temp_low = T0C
var/light_modifier = 1.0 // Lower numbers means more darkness.
var/light_color = null // If set, changes how the day/night light looks.
+ var/flight_falure_modifier = 0 // Some types of weather make flying harder, and therefore make crashes more likely.
var/transition_chances = list() // Assoc list
var/datum/weather_holder/holder = null
diff --git a/code/modules/power/supermatter/setup_supermatter.dm b/code/modules/power/supermatter/setup_supermatter.dm
index 559f035cb2..f797e14f9e 100644
--- a/code/modules/power/supermatter/setup_supermatter.dm
+++ b/code/modules/power/supermatter/setup_supermatter.dm
@@ -56,7 +56,7 @@
C.energy_setting = ENERGY_PHORON
continue
- for(var/obj/effect/engine_setup/filter/F in world)
+ for(var/obj/effect/engine_setup/atmo_filter/F in world)
F.coolant = response
var/list/delayed_objects = list()
@@ -227,13 +227,13 @@
// Sets up filters. This assumes filters are set to filter out N2 back to the core loop by default!
-/obj/effect/engine_setup/filter/
+/obj/effect/engine_setup/atmo_filter/
name = "Omni Filter Marker"
var/coolant = null
-/obj/effect/engine_setup/filter/activate()
+/obj/effect/engine_setup/atmo_filter/activate()
..()
- var/obj/machinery/atmospherics/omni/filter/F = locate() in get_turf(src)
+ var/obj/machinery/atmospherics/omni/atmos_filter/F = locate() in get_turf(src)
if(!F)
log_and_message_admins("## WARNING: Unable to locate omni filter at [x] [y] [z]!")
return SETUP_WARNING
diff --git a/code/modules/projectiles/ammunition/magnetic.dm b/code/modules/projectiles/ammunition/magnetic.dm
new file mode 100644
index 0000000000..fc299adf0b
--- /dev/null
+++ b/code/modules/projectiles/ammunition/magnetic.dm
@@ -0,0 +1,13 @@
+/obj/item/weapon/magnetic_ammo
+ name = "flechette magazine"
+ desc = "A magazine containing steel flechettes."
+ icon = 'icons/obj/ammo.dmi'
+ icon_state = "5.56"
+ w_class = ITEMSIZE_SMALL
+ matter = list(DEFAULT_WALL_MATERIAL = 1800)
+ origin_tech = list(TECH_COMBAT = 1)
+ var/remaining = 9
+
+/obj/item/weapon/magnetic_ammo/examine(mob/user)
+ . = ..()
+ to_chat(user, "There [(remaining == 1)? "is" : "are"] [remaining] flechette\s left!")
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 2e739b6910..74b107e9bc 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -515,7 +515,7 @@
damage_mult = 1.5
P.damage *= damage_mult
-/obj/item/weapon/gun/proc/process_accuracy(obj/projectile, mob/user, atom/target, acc_mod, dispersion)
+/obj/item/weapon/gun/proc/process_accuracy(obj/projectile, mob/living/user, atom/target, acc_mod, dispersion)
var/obj/item/projectile/P = projectile
if(!istype(P))
return //default behaviour only applies to true projectiles
@@ -539,6 +539,13 @@
//As opposed to no-delay pew pew
P.accuracy += 2
+ // Some modifiers make it harder or easier to hit things.
+ for(var/datum/modifier/M in user.modifiers)
+ if(!isnull(M.accuracy))
+ P.accuracy += M.accuracy
+ if(!isnull(M.accuracy_dispersion))
+ P.dispersion = max(P.dispersion + M.accuracy_dispersion, 0)
+
//does the actual launching of the projectile
/obj/item/weapon/gun/proc/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null)
var/obj/item/projectile/P = projectile
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 07b78fc2ea..c8bba19087 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -36,7 +36,7 @@
item_state = "crossbow"
origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5)
matter = list(DEFAULT_WALL_MATERIAL = 2000)
- slot_flags = SLOT_BELT
+ slot_flags = SLOT_BELT | SLOT_HOLSTER
silenced = 1
fire_sound = 'sound/weapons/Genhit.ogg'
projectile_type = /obj/item/projectile/energy/bolt
@@ -54,6 +54,7 @@
w_class = ITEMSIZE_LARGE
force = 10
matter = list(DEFAULT_WALL_MATERIAL = 200000)
+ slot_flags = SLOT_BELT
projectile_type = /obj/item/projectile/energy/bolt/large
/obj/item/weapon/gun/energy/plasmastun
diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm
new file mode 100644
index 0000000000..130f4410df
--- /dev/null
+++ b/code/modules/projectiles/guns/magnetic/magnetic.dm
@@ -0,0 +1,195 @@
+/obj/item/weapon/gun/magnetic
+ name = "improvised coilgun"
+ desc = "A coilgun hastily thrown together out of a basic frame and advanced power storage components. Is it safe for it to be duct-taped together like that?"
+ icon_state = "coilgun"
+ item_state = "coilgun"
+ icon = 'icons/obj/railgun.dmi'
+// one_hand_penalty = 1
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_ILLEGAL = 2, TECH_MAGNET = 4)
+ w_class = ITEMSIZE_LARGE
+
+ var/obj/item/weapon/cell/cell // Currently installed powercell.
+ var/obj/item/weapon/stock_parts/capacitor/capacitor // Installed capacitor. Higher rating == faster charge between shots.
+ var/removable_components = TRUE // Whether or not the gun can be dismantled.
+ var/gun_unreliable = 15 // Percentage chance of detonating in your hands.
+
+ var/obj/item/loaded // Currently loaded object, for retrieval/unloading.
+ var/load_type = /obj/item/stack/rods // Type of stack to load with.
+ var/projectile_type = /obj/item/projectile/bullet/magnetic // Actual fire type, since this isn't throw_at rod launcher.
+
+ var/power_cost = 950 // Cost per fire, should consume almost an entire basic cell.
+ var/power_per_tick // Capacitor charge per process(). Updated based on capacitor rating.
+
+ fire_sound = 'sound/weapons/railgun.ogg'
+
+/obj/item/weapon/gun/magnetic/New()
+ processing_objects.Add(src)
+ if(capacitor)
+ power_per_tick = (power_cost*0.15) * capacitor.rating
+ update_icon()
+ . = ..()
+
+/obj/item/weapon/gun/magnetic/Destroy()
+ processing_objects.Remove(src)
+ qdel_null(cell)
+ qdel_null(loaded)
+ qdel_null(capacitor)
+ . = ..()
+
+/obj/item/weapon/gun/magnetic/process()
+ if(capacitor)
+ if(cell)
+ if(capacitor.charge < capacitor.max_charge && cell.checked_use(power_per_tick))
+ capacitor.charge(power_per_tick)
+ else
+ capacitor.use(capacitor.charge * 0.05)
+ update_icon()
+
+/obj/item/weapon/gun/magnetic/update_icon()
+ var/list/overlays_to_add = list()
+ if(removable_components)
+ if(cell)
+ overlays_to_add += image(icon, "[icon_state]_cell")
+ if(capacitor)
+ overlays_to_add += image(icon, "[icon_state]_capacitor")
+ if(!cell || !capacitor)
+ overlays_to_add += image(icon, "[icon_state]_red")
+ else if(capacitor.charge < power_cost)
+ overlays_to_add += image(icon, "[icon_state]_amber")
+ else
+ overlays_to_add += image(icon, "[icon_state]_green")
+ if(loaded)
+ overlays_to_add += image(icon, "[icon_state]_loaded")
+
+ overlays = overlays_to_add
+ ..()
+
+/obj/item/weapon/gun/magnetic/proc/show_ammo(var/mob/user)
+ if(loaded)
+ to_chat(user, "It has \a [loaded] loaded.")
+
+/obj/item/weapon/gun/magnetic/examine(var/mob/user)
+ . = ..(user, 2)
+ if(.)
+ show_ammo(user)
+
+ if(cell)
+ to_chat(user, "The installed [cell.name] has a charge level of [round((cell.charge/cell.maxcharge)*100)]%.")
+ if(capacitor)
+ to_chat(user, "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%.")
+
+ if(!cell || !capacitor)
+ to_chat(user, "The capacitor charge indicator is blinking red. Maybe you should check the cell or capacitor.")
+ else
+ if(capacitor.charge < power_cost)
+ to_chat(user, "The capacitor charge indicator is amber.")
+ else
+ to_chat(user, "The capacitor charge indicator is green.")
+ return TRUE
+
+/obj/item/weapon/gun/magnetic/attackby(var/obj/item/thing, var/mob/user)
+
+ if(removable_components)
+ if(istype(thing, /obj/item/weapon/cell))
+ if(cell)
+ to_chat(user, "\The [src] already has \a [cell] installed.")
+ return
+ cell = thing
+ user.drop_from_inventory(cell)
+ cell.forceMove(src)
+ playsound(loc, 'sound/machines/click.ogg', 10, 1)
+ user.visible_message("\The [user] slots \the [cell] into \the [src].")
+ update_icon()
+ return
+
+ if(isscrewdriver(thing))
+ if(!capacitor)
+ to_chat(user, "\The [src] has no capacitor installed.")
+ return
+ capacitor.forceMove(get_turf(src))
+ user.put_in_hands(capacitor)
+ user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].")
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ capacitor = null
+ update_icon()
+ return
+
+ if(istype(thing, /obj/item/weapon/stock_parts/capacitor))
+ if(capacitor)
+ to_chat(user, "\The [src] already has \a [capacitor] installed.")
+ return
+ capacitor = thing
+ user.drop_from_inventory(capacitor)
+ capacitor.forceMove(src)
+ playsound(loc, 'sound/machines/click.ogg', 10, 1)
+ power_per_tick = (power_cost*0.15) * capacitor.rating
+ user.visible_message("\The [user] slots \the [capacitor] into \the [src].")
+ update_icon()
+ return
+
+ if(istype(thing, load_type))
+
+ if(loaded)
+ to_chat(user, "\The [src] already has \a [loaded] loaded.")
+ return
+
+ // This is not strictly necessary for the magnetic gun but something using
+ // specific ammo types may exist down the track.
+ var/obj/item/stack/ammo = thing
+ if(!istype(ammo))
+ loaded = thing
+ user.drop_from_inventory(thing)
+ thing.forceMove(src)
+ else
+ loaded = new load_type(src, 1)
+ ammo.use(1)
+
+ user.visible_message("\The [user] loads \the [src] with \the [loaded].")
+ playsound(loc, 'sound/weapons/flipblade.ogg', 50, 1)
+ update_icon()
+ return
+ . = ..()
+
+/obj/item/weapon/gun/magnetic/attack_hand(var/mob/user)
+ if(user.get_inactive_hand() == src)
+ var/obj/item/removing
+
+ if(loaded)
+ removing = loaded
+ loaded = null
+ else if(cell && removable_components)
+ removing = cell
+ cell = null
+
+ if(removing)
+ removing.forceMove(get_turf(src))
+ user.put_in_hands(removing)
+ user.visible_message("\The [user] removes \the [removing] from \the [src].")
+ playsound(loc, 'sound/machines/click.ogg', 10, 1)
+ update_icon()
+ return
+ . = ..()
+
+/obj/item/weapon/gun/magnetic/proc/check_ammo()
+ return loaded
+
+/obj/item/weapon/gun/magnetic/proc/use_ammo()
+ qdel(loaded)
+ loaded = null
+
+/obj/item/weapon/gun/magnetic/consume_next_projectile()
+
+ if(!check_ammo() || !capacitor || capacitor.charge < power_cost)
+ return
+
+ use_ammo()
+ capacitor.use(power_cost)
+ update_icon()
+
+ if(gun_unreliable && prob(gun_unreliable))
+ spawn(3) // So that it will still fire - considered modifying Fire() to return a value but burst fire makes that annoying.
+ visible_message("\The [src] explodes with the force of the shot!")
+ explosion(get_turf(src), -1, 0, 2)
+ qdel(src)
+
+ return new projectile_type(src)
diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm
new file mode 100644
index 0000000000..0c3647458b
--- /dev/null
+++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm
@@ -0,0 +1,101 @@
+// We really need some datums for this.
+/obj/item/weapon/coilgun_assembly
+ name = "coilgun stock"
+ desc = "It might be a coilgun, someday."
+ icon = 'icons/obj/coilgun.dmi'
+ icon_state = "coilgun_construction_1"
+
+ var/construction_stage = 1
+
+/obj/item/weapon/coilgun_assembly/attackby(var/obj/item/thing, var/mob/user)
+
+ if(istype(thing, /obj/item/stack/material) && construction_stage == 1)
+ var/obj/item/stack/material/reinforcing = thing
+ var/material/reinforcing_with = reinforcing.get_material()
+ if(reinforcing_with.name == DEFAULT_WALL_MATERIAL) // Steel
+ if(reinforcing.get_amount() < 5)
+ to_chat(user, "You need at least 5 [reinforcing.singular_name]\s for this task.")
+ return
+ reinforcing.use(5)
+ user.visible_message("\The [user] shapes some steel sheets around \the [src] to form a body.")
+ increment_construction_stage()
+ return
+
+ if(istype(thing, /obj/item/weapon/tape_roll) && construction_stage == 2)
+ user.visible_message("\The [user] secures \the [src] together with \the [thing].")
+ increment_construction_stage()
+ return
+
+ if(istype(thing, /obj/item/pipe) && construction_stage == 3)
+ user.drop_from_inventory(thing)
+ qdel(thing)
+ user.visible_message("\The [user] jams \the [thing] into \the [src].")
+ increment_construction_stage()
+ return
+
+ if(istype(thing, /obj/item/weapon/weldingtool) && construction_stage == 4)
+ var/obj/item/weapon/weldingtool/welder = thing
+
+ if(!welder.isOn())
+ to_chat(user, "Turn it on first!")
+ return
+
+ if(!welder.remove_fuel(0,user))
+ to_chat(user, "You need more fuel!")
+ return
+
+ user.visible_message("\The [user] welds the barrel of \the [src] into place.")
+ playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ increment_construction_stage()
+ return
+
+ if(istype(thing, /obj/item/stack/cable_coil) && construction_stage == 5)
+ var/obj/item/stack/cable_coil/cable = thing
+ if(cable.get_amount() < 5)
+ to_chat(user, "You need at least 5 lengths of cable for this task.")
+ return
+ cable.use(5)
+ user.visible_message("\The [user] wires \the [src].")
+ increment_construction_stage()
+ return
+
+ if(istype(thing, /obj/item/weapon/smes_coil) && construction_stage >= 6 && construction_stage <= 8)
+ user.visible_message("\The [user] installs \a [thing] into \the [src].")
+ user.drop_from_inventory(thing)
+ qdel(thing)
+ increment_construction_stage()
+ return
+
+ if(isscrewdriver(thing) && construction_stage >= 9)
+ user.visible_message("\The [user] secures \the [src] and finishes it off.")
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/gun/magnetic/coilgun = new(loc)
+ var/put_in_hands
+ var/mob/M = src.loc
+ if(istype(M))
+ put_in_hands = M == user
+ M.drop_from_inventory(src)
+ if(put_in_hands)
+ user.put_in_hands(coilgun)
+ qdel(src)
+ return
+
+ return ..()
+
+/obj/item/weapon/coilgun_assembly/proc/increment_construction_stage()
+ if(construction_stage < 9)
+ construction_stage++
+ icon_state = "coilgun_construction_[construction_stage]"
+
+/obj/item/weapon/coilgun_assembly/examine(var/mob/user)
+ . = ..(user,2)
+ if(.)
+ switch(construction_stage)
+ if(2) to_chat(user, "It has a metal frame loosely shaped around the stock.")
+ if(3) to_chat(user, "It has a metal frame duct-taped to the stock.")
+ if(4) to_chat(user, "It has a length of pipe attached to the body.")
+ if(4) to_chat(user, "It has a length of pipe welded to the body.")
+ if(6) to_chat(user, "It has a cable mount and capacitor jack wired to the frame.")
+ if(7) to_chat(user, "It has a single superconducting coil threaded onto the barrel.")
+ if(8) to_chat(user, "It has a pair of superconducting coils threaded onto the barrel.")
+ if(9) to_chat(user, "It has three superconducting coils attached to the body, waiting to be secured.")
diff --git a/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm
new file mode 100644
index 0000000000..d731512bfa
--- /dev/null
+++ b/code/modules/projectiles/guns/magnetic/magnetic_railgun.dm
@@ -0,0 +1,104 @@
+/obj/item/weapon/gun/magnetic/railgun
+ name = "railgun"
+ desc = "The Mars Military Industries MI-76 Thunderclap. A man-portable mass driver for squad support anti-armour and destruction of fortifications and emplacements."
+ gun_unreliable = 0
+ icon_state = "railgun"
+ removable_components = FALSE
+ load_type = /obj/item/weapon/rcd_ammo
+ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 4, TECH_MAGNET = 4)
+ projectile_type = /obj/item/projectile/bullet/magnetic/slug
+ power_cost = 300
+ w_class = ITEMSIZE_HUGE
+ slot_flags = SLOT_BELT
+ loaded = /obj/item/weapon/rcd_ammo/large
+
+ var/initial_cell_type = /obj/item/weapon/cell/hyper
+ var/initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv
+ var/slowdown_held = 2
+ var/slowdown_worn = 1
+
+/obj/item/weapon/gun/magnetic/railgun/New()
+ capacitor = new initial_capacitor_type(src)
+ capacitor.charge = capacitor.max_charge
+
+ cell = new initial_cell_type(src)
+ if (ispath(loaded))
+ loaded = new loaded
+ . = ..()
+
+// Not going to check type repeatedly, if you code or varedit
+// load_type and get runtime errors, don't come crying to me.
+/obj/item/weapon/gun/magnetic/railgun/show_ammo(var/mob/user)
+ var/obj/item/weapon/rcd_ammo/ammo = loaded
+ if (ammo)
+ to_chat(user, "There are [ammo.remaining] shot\s remaining in \the [loaded].")
+ else
+ to_chat(user, "There is nothing loaded.")
+
+/obj/item/weapon/gun/magnetic/railgun/check_ammo()
+ var/obj/item/weapon/rcd_ammo/ammo = loaded
+ return ammo && ammo.remaining
+
+/obj/item/weapon/gun/magnetic/railgun/use_ammo()
+ var/obj/item/weapon/rcd_ammo/ammo = loaded
+ ammo.remaining--
+ if(ammo.remaining <= 0)
+ spawn(3)
+ playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 1)
+ out_of_ammo()
+
+/obj/item/weapon/gun/magnetic/railgun/proc/out_of_ammo()
+ qdel(loaded)
+ loaded = null
+ visible_message("\The [src] beeps and ejects its empty cartridge.")
+
+/obj/item/weapon/gun/magnetic/railgun/automatic // Adminspawn only, this shit is absurd.
+ name = "\improper RHR accelerator"
+ desc = "The Mars Military Industries MI-227 Meteor. Originally a vehicle-mounted turret weapon for heavy anti-vehicular and anti-structural fire, the fact that it was made man-portable is mindboggling in itself."
+ icon_state = "heavy_railgun"
+
+ initial_cell_type = /obj/item/weapon/cell/infinite
+ initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/super
+
+ slowdown_held = 3
+ slowdown_worn = 2
+
+ slot_flags = SLOT_BACK
+ w_class = ITEMSIZE_NO_CONTAINER
+
+ firemodes = list(
+ list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_hand_penalty=1, burst_accuracy=null, dispersion=null),
+ list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_hand_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
+ list(mode_name="long bursts", burst=6, fire_delay=null, move_delay=10, one_hand_penalty=2, burst_accuracy=list(0,-1,-1,-1,-2), dispersion=list(0.6, 0.6, 1.0, 1.0, 1.2)),
+ )
+
+/obj/item/weapon/gun/magnetic/railgun/automatic/examine(var/mob/user)
+ . = ..(user,1)
+ if(.)
+ to_chat(user, "Someone has scratched Ultima Ratio Regum onto the side of the barrel.")
+
+/obj/item/weapon/gun/magnetic/railgun/flechette
+ name = "flechette gun"
+ desc = "The MI-12 Skadi is a burst fire capable railgun that fires flechette rounds at high velocity. Deadly against armour, but much less effective against soft targets."
+ icon_state = "flechette_gun"
+ item_state = "z8carbine"
+ initial_cell_type = /obj/item/weapon/cell/hyper
+ initial_capacitor_type = /obj/item/weapon/stock_parts/capacitor/adv
+ slot_flags = SLOT_BACK
+ slowdown_held = 0
+ slowdown_worn = 0
+ power_cost = 100
+ load_type = /obj/item/weapon/magnetic_ammo
+ projectile_type = /obj/item/projectile/bullet/magnetic/flechette
+ loaded = /obj/item/weapon/magnetic_ammo
+ fire_sound = 'sound/weapons/rapidslice.ogg'
+
+ firemodes = list(
+ list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, one_hand_penalty=1, burst_accuracy=null, dispersion=null),
+ list(mode_name="short bursts", burst=3, fire_delay=null, move_delay=5, one_hand_penalty=2, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0)),
+ )
+
+/obj/item/weapon/gun/magnetic/railgun/flechette/out_of_ammo()
+ audible_message("\The [src] beeps to indicate the magazine is empty.")
+ playsound(loc, 'sound/weapons/smg_empty_alarm.ogg', 40, 1)
+ ..()
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index c4344c052b..5e599230cf 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -45,6 +45,8 @@
var/penetrating = 0 //If greater than zero, the projectile will pass through dense objects as specified by on_penetrate()
var/kill_count = 50 //This will de-increment every process(). When 0, it will delete the projectile.
//Effects
+ var/incendiary = 0 //1 for ignite on hit, 2 for trail of fire. 3 maybe later for burst of fire around the impact point. - Mech
+ var/flammability = 0 //Amount of fire stacks to add for the above.
var/stun = 0
var/weaken = 0
var/paralyze = 0
@@ -78,7 +80,7 @@
if(!isliving(target)) return 0
// if(isanimal(target)) return 0
var/mob/living/L = target
- L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
+ L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked, incendiary, flammability) // add in AGONY!
return 1
//called when the projectile stops flying because it collided with something
@@ -233,9 +235,18 @@
//if they have a neck grab on someone, that person gets hit instead
var/obj/item/weapon/grab/G = locate() in M
if(G && G.state >= GRAB_NECK)
- visible_message("\The [M] uses [G.affecting] as a shield!")
- if(Bump(G.affecting, forced=1))
- return //If Bump() returns 0 (keep going) then we continue on to attack M.
+ if(G.affecting.stat == DEAD)
+ var/shield_chance = min(80, (30 * (M.mob_size / 10))) //Small mobs have a harder time keeping a dead body as a shield than a human-sized one. Unathi would have an easier job, if they are made to be SIZE_LARGE in the future. -Mech
+ if(prob(shield_chance))
+ visible_message("\The [M] uses [G.affecting] as a shield!")
+ if(Bump(G.affecting, forced=1))
+ return
+ else
+ visible_message("\The [M] tries to use [G.affecting] as a shield, but fails!")
+ else
+ visible_message("\The [M] uses [G.affecting] as a shield!")
+ if(Bump(G.affecting, forced=1))
+ return //If Bump() returns 0 (keep going) then we continue on to attack M.
passthrough = !attack_mob(M, distance)
else
@@ -322,6 +333,10 @@
else if(!bumped)
tracer_effect(effect_transform)
+ if(incendiary >= 2)
+ var/trail_volume = (flammability * 0.10)
+ new /obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(src.loc, trail_volume, src.dir)
+
if(!hitscan)
sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon
@@ -404,6 +419,8 @@
return //cannot shoot yourself
if(istype(A, /obj/item/projectile))
return
+ if(istype(A, /obj/structure/foamedmetal)) //Turrets can detect through foamed metal, but will have to blast through it. Similar to windows, if someone runs behind it, a person should probably just not shoot.
+ return
if(istype(A, /mob/living) || istype(A, /obj/mecha) || istype(A, /obj/vehicle))
result = 2 //We hit someone, return 1!
return
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index a6237a604a..5b95ee6639 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -252,6 +252,31 @@
explosion(target, -1, 0, 2)
..()
+/* Incendiary */
+
+/obj/item/projectile/bullet/incendiary
+ name = "incendiary bullet"
+ icon_state = "bullet_alt"
+ damage = 15
+ damage_type = BURN
+ incendiary = 1
+ flammability = 2
+
+/obj/item/projectile/bullet/incendiary/flamethrower
+ name = "ball of fire"
+ desc = "Don't stand in the fire."
+ icon_state = "fireball"
+ damage = 10
+ embed_chance = 0
+ incendiary = 2
+ flammability = 4
+ agony = 30
+ kill_count = 4
+
+/obj/item/projectile/bullet/incendiary/flamethrower/large
+ damage = 15
+ kill_count = 6
+
/obj/item/projectile/bullet/blank
invisibility = 101
damage = 1
diff --git a/code/modules/projectiles/projectile/magnetic.dm b/code/modules/projectiles/projectile/magnetic.dm
new file mode 100644
index 0000000000..35f98833ef
--- /dev/null
+++ b/code/modules/projectiles/projectile/magnetic.dm
@@ -0,0 +1,21 @@
+// Rod for railguns. Slightly less nasty than the sniper round.
+/obj/item/projectile/bullet/magnetic
+ name = "rod"
+ icon_state = "rod"
+ damage = 65
+ stun = 1
+ weaken = 1
+ penetrating = 5
+ armor_penetration = 70
+
+/obj/item/projectile/bullet/magnetic/slug
+ name = "slug"
+ icon_state = "gauss_silenced"
+ damage = 75
+ armor_penetration = 90
+
+/obj/item/projectile/bullet/magnetic/flechette
+ name = "flechette"
+ icon_state = "flechette"
+ damage = 20
+ armor_penetration = 100
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index f23e37f516..6d07fcc159 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -63,7 +63,13 @@
return
var/removed = metabolism
if(!mrate_static == TRUE)
+ // Modifiers
+ for(var/datum/modifier/mod in M.modifiers)
+ if(!isnull(mod.metabolism_percent))
+ removed *= mod.metabolism_percent
+ // Species
removed *= M.species.metabolic_rate
+
if(ingest_met && (location == CHEM_INGEST))
removed = ingest_met
if(touch_met && (location == CHEM_TOUCH))
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index f2238cdb00..4f0279f698 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -189,7 +189,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin
name = "Griffeater Gin"
- desc = "A bottle of high quality gin, produced in the New London Space Station."
+ desc = "A bottle of high quality gin, produced in Alpha Centauri."
icon_state = "ginbottle"
center_of_mass = list("x"=16, "y"=4)
@@ -199,7 +199,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey
name = "Uncle Git's Special Reserve"
- desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
+ desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter."
icon_state = "whiskeybottle"
center_of_mass = list("x"=16, "y"=3)
@@ -219,7 +219,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/vodka
name = "Tunguska Triple Distilled"
- desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
+ desc = "Aah, vodka. Prime choice of drink and fuel by Russians worldwide."
icon_state = "vodkabottle"
center_of_mass = list("x"=17, "y"=3)
@@ -259,7 +259,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/rum
name = "Captain Pete's Cuban Spiced Rum"
- desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
+ desc = "This isn't just rum, oh no. It's practically Cuba in a bottle."
icon_state = "rumbottle"
center_of_mass = list("x"=16, "y"=8)
@@ -289,7 +289,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/kahlua
name = "Robert Robust's Coffee Liqueur"
- desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK"
+ desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936."
icon_state = "kahluabottle"
center_of_mass = list("x"=17, "y"=3)
@@ -309,7 +309,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/cognac
name = "Chateau De Baton Premium Cognac"
- desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
+ desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing."
icon_state = "cognacbottle"
center_of_mass = list("x"=16, "y"=6)
@@ -319,7 +319,7 @@
/obj/item/weapon/reagent_containers/food/drinks/bottle/wine
name = "Doublebeard Bearded Special Wine"
- desc = "A faint aura of unease and asspainery surrounds the bottle."
+ desc = "Cheap cooking wine pretending to be drinkable."
icon_state = "winebottle"
center_of_mass = list("x"=16, "y"=4)
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 374617c563..393ee201a8 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -112,6 +112,8 @@
user << "You set the label to \"[tmp_label]\"."
label_text = tmp_label
update_name_label()
+ if(istype(W,/obj/item/weapon/storage/bag))
+ ..()
/obj/item/weapon/reagent_containers/glass/proc/update_name_label()
if(label_text == "")
diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm
index a6e6a94850..c34f8d9454 100644
--- a/code/modules/research/designs.dm
+++ b/code/modules/research/designs.dm
@@ -671,7 +671,7 @@ other types of metals and chemistry for reagents).
id = "s-filter"
req_tech = list(TECH_DATA = 3, TECH_MAGNET = 3)
materials = list(DEFAULT_WALL_MATERIAL = 40, "silver" = 10)
- build_path = /obj/item/weapon/stock_parts/subspace/filter
+ build_path = /obj/item/weapon/stock_parts/subspace/sub_filter
sort_string = "UAAAB"
/datum/design/item/stock_part/subspace_amplifier
@@ -853,6 +853,25 @@ other types of metals and chemistry for reagents).
materials = list(DEFAULT_WALL_MATERIAL = 300, "silver" = 100)
build_path = /obj/item/weapon/crowbar/power
sort_string = "VASEA"
+
+/datum/design/item/device/t_scanner_upg
+ name = "Upgraded T-ray Scanner"
+ desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ id = "upgradedtscanner"
+ req_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 4, TECH_MATERIAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 500, "phoron" = 150)
+ build_path = /obj/item/device/t_scanner/upgraded
+ sort_string = "VASSA"
+
+
+/datum/design/item/device/t_scanner_adv
+ name = "Advanced T-ray Scanner"
+ desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
+ id = "advancedtscanner"
+ req_tech = list(TECH_MAGNET = 6, TECH_ENGINEERING = 6, TECH_MATERIAL = 6)
+ materials = list(DEFAULT_WALL_MATERIAL = 1250, "phoron" = 500, "silver" = 50)
+ build_path = /obj/item/device/t_scanner/advanced
+ sort_string = "VASSB"
/*
CIRCUITS BELOW
*/
diff --git a/code/modules/research/mechfab_designs.dm b/code/modules/research/mechfab_designs.dm
index 7ebdc5fbb6..4d7149c188 100644
--- a/code/modules/research/mechfab_designs.dm
+++ b/code/modules/research/mechfab_designs.dm
@@ -354,6 +354,30 @@
materials = list(DEFAULT_WALL_MATERIAL = 15000, "gold" = 4500, "uranium" = 4500)
build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang/limited
+/datum/design/item/mecha/weapon/flamer
+ name = "CR-3 Mark 8 Flamethrower"
+ desc = "A weapon that violates the CCWC at two hundred gallons per minute."
+ id = "mech_flamer_full"
+ req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 6, TECH_PHORON = 4, TECH_ILLEGAL = 4)
+ materials = list(DEFAULT_WALL_MATERIAL = 10000, "gold" = 2000, "uranium" = 3000, "phoron" = 8000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer
+
+/datum/design/item/mecha/weapon/flamer_rigged
+ name = "AA-CR-1 Mark 4 Flamethrower"
+ desc = "A weapon that accidentally violates the CCWC at one hundred gallons per minute."
+ id = "mech_flamer_rigged"
+ req_tech = list(TECH_MATERIAL = 3, TECH_COMBAT = 3, TECH_PHORON = 3, TECH_ILLEGAL = 2)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 1500, "silver" = 1500, "uranium" = 2000, "phoron" = 6000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/flamer/rigged
+
+/datum/design/item/mecha/weapon/flame_mg
+ name = "DR-AC 3 Incendiary Rotary MG"
+ desc = "A weapon that violates the CCWC at sixty rounds a minute."
+ id = "mech_lmg_flamer"
+ req_tech = list(TECH_MATERIAL = 4, TECH_COMBAT = 5, TECH_PHORON = 2, TECH_ILLEGAL = 1)
+ materials = list(DEFAULT_WALL_MATERIAL = 8000, "gold" = 2000, "silver" = 1750, "uranium" = 1500, "phoron" = 4000)
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/incendiary
+
// *** Nonweapon modules
/datum/design/item/mecha/wormhole_gen
name = "Wormhole generator"
diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm
index de1e307386..081ba95662 100644
--- a/code/modules/research/prosfab_designs.dm
+++ b/code/modules/research/prosfab_designs.dm
@@ -160,6 +160,38 @@
materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 5625)
// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+/datum/design/item/prosfab/pros/heart
+ name = "Prosthetic heart"
+ id = "pros_heart"
+ build_path = /obj/item/organ/internal/heart
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/lungs
+ name = "Prosthetic lungs"
+ id = "pros_lung"
+ build_path = /obj/item/organ/internal/lungs
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/liver
+ name = "Prosthetic liver"
+ id = "pros_liver"
+ build_path = /obj/item/organ/internal/liver
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
+/datum/design/item/prosfab/pros/kidneys
+ name = "Prosthetic liver"
+ id = "pros_kidney"
+ build_path = /obj/item/organ/internal/kidneys
+ time = 15
+ materials = list(DEFAULT_WALL_MATERIAL = 5625, "glass" = 1000)
+// req_tech = list(TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+
//////////////////// Cyborg Parts ////////////////////
/datum/design/item/prosfab/cyborg
category = "Cyborg Parts"
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index dcb07cb988..da600a2e68 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -12,6 +12,7 @@
var/datum/computer/file/embedded_program/docking/docking_controller //the controller itself. (micro-controller, not game controller)
var/arrive_time = 0 //the time at which the shuttle arrives when long jumping
+ var/depart_time = 0 //Similar to above, set when the shuttle leaves when long jumping, to compare against arrive time.
var/flags = SHUTTLE_FLAGS_PROCESS
var/category = /datum/shuttle
@@ -50,6 +51,14 @@
/datum/shuttle/proc/post_warmup_checks()
return TRUE
+// If you need an event to occur when the shuttle jumps in short or long jump, override this.
+/datum/shuttle/proc/on_shuttle_departure()
+ return
+
+// Similar to above, but when it finishes moving to the target. Short jump generally makes this occur immediately after the above proc.
+/datum/shuttle/proc/on_shuttle_arrival()
+ return
+
/datum/shuttle/proc/short_jump(var/area/origin,var/area/destination)
if(moving_status != SHUTTLE_IDLE)
return
@@ -70,9 +79,14 @@
make_sounds(origin, HYPERSPACE_END)
return //someone cancelled the launch
+ on_shuttle_departure()
+
moving_status = SHUTTLE_INTRANSIT //shouldn't matter but just to be safe
move(origin, destination)
moving_status = SHUTTLE_IDLE
+
+ on_shuttle_arrival()
+
make_sounds(destination, HYPERSPACE_END)
/datum/shuttle/proc/long_jump(var/area/departing, var/area/destination, var/area/interim, var/travel_time, var/direction)
@@ -98,7 +112,13 @@
return //someone cancelled the launch
arrive_time = world.time + travel_time*10
+
+ depart_time = world.time
+
+ on_shuttle_departure()
+
moving_status = SHUTTLE_INTRANSIT
+
move(departing, interim, direction)
if(process_longjump(departing, destination)) //VOREStation Edit - To hook custom shuttle code in
@@ -114,7 +134,10 @@
move(interim, destination, direction)
moving_status = SHUTTLE_IDLE
- //make_sounds(destination, HYPERSPACE_END) //VOREStation Edit. See above comment.
+
+ //on_shuttle_arrival()//VOREStation Edit.
+
+ //make_sounds(destination, HYPERSPACE_END)//VOREStation Edit. See above comment.
/datum/shuttle/proc/dock()
if (!docking_controller)
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index 0da9634b39..5e096fcd8f 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -40,7 +40,7 @@
else
shuttle_status = "Standing-by at offsite location."
if(WAIT_LAUNCH, FORCE_LAUNCH)
- shuttle_status = "Shuttle has recieved command and will depart shortly."
+ shuttle_status = "Shuttle has received command and will depart shortly."
if(WAIT_ARRIVE)
shuttle_status = "Proceeding to destination."
if(WAIT_FINISH)
diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm
new file mode 100644
index 0000000000..07ff4cbc93
--- /dev/null
+++ b/code/modules/shuttles/shuttles_web.dm
@@ -0,0 +1,274 @@
+//This shuttle traverses a "web" of route_datums to have a wider range of places to go and make flying feel like movement is actually occuring.
+/datum/shuttle/web_shuttle
+ flags = SHUTTLE_FLAGS_NONE
+ var/cloaked = FALSE
+ var/can_cloak = FALSE
+ var/cooldown = 5 SECONDS
+ var/last_move = 0 //the time at which we last moved
+ var/area/current_area = null
+ var/datum/shuttle_web_master/web_master = null
+ var/web_master_type = null
+ var/flight_time_modifier = 1.0
+ category = /datum/shuttle/web_shuttle
+
+/datum/shuttle/web_shuttle/New()
+ current_area = locate(current_area)
+ web_master = new web_master_type(src)
+ build_destinations()
+ ..()
+
+/datum/shuttle/web_shuttle/Destroy()
+ qdel(web_master)
+ return ..()
+
+
+/datum/shuttle/web_shuttle/current_dock_target()
+ if(web_master)
+ return web_master.current_dock_target()
+
+/datum/shuttle/web_shuttle/move(var/area/origin, var/area/destination)
+ ..()
+ last_move = world.time
+
+/datum/shuttle/web_shuttle/on_shuttle_departure()
+ web_master.on_shuttle_departure()
+
+/datum/shuttle/web_shuttle/on_shuttle_arrival()
+ web_master.on_shuttle_arrival()
+
+/datum/shuttle/web_shuttle/proc/build_destinations()
+ return
+
+/obj/machinery/computer/shuttle_control/web
+ name = "flight computer"
+ icon_state = "flightcomp_center"
+ icon_keyboard = "flight_center_key"
+ icon_screen = "flight_center"
+
+// Fairly copypasta-y.
+/obj/machinery/computer/shuttle_control/web/attack_hand(mob/user)
+ if(..(user))
+ return
+ src.add_fingerprint(user)
+
+ ui_interact(user)
+
+ /*
+ // If nanoUI falls over and you want a non-nanoUI UI, feel free to uncomment this section.
+ var/datum/shuttle/web_shuttle/WS = shuttle_controller.shuttles[shuttle_tag]
+ if(!istype(WS))
+ message_admins("ERROR: Shuttle computer ([src]) ([shuttle_tag]) could not find their shuttle in the shuttles list.")
+ return
+
+ var/list/dat = list()
+ dat += "[shuttle_tag] Ship Control
"
+
+ if(WS.moving_status != SHUTTLE_IDLE)
+ dat += "Location: Moving
"
+ else
+ var/area/areacheck = get_area(src)
+ dat += "Location: [areacheck.name]
"
+
+ if((WS.last_move + WS.cooldown) > world.time)
+ dat += "Engines charging.
"
+ else
+ dat += "Engines ready.
"
+
+ if(WS.can_cloak)
+ dat += "
Toggle cloaking field
"
+
+ for(var/datum/shuttle_route/route in WS.current_destination.routes)
+ dat += "[route.display_route(WS.current_destination)]
"
+
+
+ //Docking
+ dat += "
"
+ if(WS.skip_docking_checks())
+ dat += "Docking Status: Not in use."
+ else
+ var/override_en = WS.docking_controller.override_enabled
+ var/docking_status = WS.docking_controller.get_docking_status()
+
+ dat += "Docking Status: "
+ switch(docking_status)
+ if("undocked")
+ dat += "Undocked"
+ if("docking")
+ dat += "Docking"
+ if("undocking")
+ dat += "Undocking"
+ if("docked")
+ dat += "Docked"
+
+ if(override_en)
+ dat += " (Override Enabled)"
+
+ dat += ". \[Refresh\]
"
+
+ switch(docking_status)
+ if("undocked")
+ dat += "Dock"
+ if("docked")
+ dat += "Undock"
+ dat += ""
+
+ user << browse(dat.Join(), "window=[shuttle_tag]shuttlecontrol;size=300x300")
+ */
+
+
+/obj/machinery/computer/shuttle_control/web/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ var/data[0]
+ var/list/routes[0]
+ var/datum/shuttle/web_shuttle/shuttle = shuttle_controller.shuttles[shuttle_tag]
+ if(!istype(shuttle))
+ return
+
+ var/list/R = shuttle.web_master.get_available_routes()
+ for (var/i = 1 to length(R))
+ var/datum/shuttle_route/route = R[i]
+ var/travel_time = null
+ var/travel_modifier = shuttle.flight_time_modifier
+ if(route.travel_time == 0)
+ travel_time = "Instant"
+ else if( (route.travel_time * travel_modifier) >= 1 MINUTE)
+ travel_time = "[ (route.travel_time * travel_modifier) / (1 MINUTE)] minute\s"
+ else
+ travel_time = "[ (route.travel_time * travel_modifier) / (1 SECOND)] second\s"
+ routes.Add(list(list("name" = html_encode(capitalize(route.display_route(shuttle.web_master.current_destination) )), "index" = i, "travel_time" = travel_time)))
+
+
+ var/shuttle_location = shuttle.web_master.current_destination.name // Destination related, not loc.
+ var/future_location = null
+ if(shuttle.web_master.future_destination)
+ future_location = shuttle.web_master.future_destination.name
+
+ var/shuttle_state
+ switch(shuttle.moving_status)
+ if(SHUTTLE_IDLE)
+ shuttle_state = "idle"
+ if(SHUTTLE_WARMUP)
+ shuttle_state = "warmup"
+ if(SHUTTLE_INTRANSIT)
+ shuttle_state = "in_transit"
+
+
+ // For the progress bar.
+ var/elapsed_time = world.time - shuttle.depart_time
+ var/total_time = shuttle.arrive_time - shuttle.depart_time
+ var/percent_finished = 0
+
+ if(total_time) // Need to check or we might divide by zero.
+ percent_finished = (elapsed_time / total_time) * 100
+
+ data = list(
+ "shuttle_location" = shuttle_location,
+ "future_location" = future_location,
+ "shuttle_state" = shuttle_state,
+ "routes" = routes,
+ "has_docking" = shuttle.docking_controller? 1 : 0,
+ "skip_docking" = shuttle.skip_docking_checks(),
+ "is_moving" = shuttle.moving_status != SHUTTLE_IDLE,
+ "docking_status" = shuttle.docking_controller? shuttle.docking_controller.get_docking_status() : null,
+ "docking_override" = shuttle.docking_controller? shuttle.docking_controller.override_enabled : null,
+ "is_in_transit" = shuttle.has_arrive_time(),
+ "travel_progress" = between(0, percent_finished, 100),
+ "time_left" = round( (total_time - elapsed_time) / 10),
+ "can_cloak" = shuttle.can_cloak ? 1 : 0,
+ "cloaked" = shuttle.cloaked ? 1 : 0
+ )
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+
+ if(!ui)
+ ui = new(user, src, ui_key, "flight.tmpl", "[shuttle_tag] Flight Computer", 470, 500)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
+
+
+/obj/machinery/computer/shuttle_control/web/Topic(href, href_list)
+ if(..())
+ return 1
+
+ usr.set_machine(src)
+ src.add_fingerprint(usr)
+
+ var/datum/shuttle/web_shuttle/WS = shuttle_controller.shuttles[shuttle_tag]
+ if(!istype(WS))
+ message_admins("ERROR: Shuttle computer ([src]) ([shuttle_tag]) could not find their shuttle in the shuttles list.")
+ return
+
+ if(href_list["refresh"])
+ ui_interact(usr)
+
+ if (WS.moving_status != SHUTTLE_IDLE)
+ usr << "[shuttle_tag] vessel is busy moving."
+ return
+
+ if(href_list["dock_command"])
+ WS.dock()
+
+ if(href_list["undock_command"])
+ WS.undock()
+
+ if(href_list["cloak_command"])
+ if(!WS.can_cloak)
+ return
+ WS.cloaked = TRUE
+ to_chat(usr, "Ship stealth systems have been activated. The station will not be warned of our arrival.")
+
+ if(href_list["uncloak_command"])
+ if(!WS.can_cloak)
+ return
+ WS.cloaked = FALSE
+ to_chat(usr, "Ship stealth systems have been deactivated. The station will be warned of our arrival.")
+
+ if(href_list["traverse"])
+ if((WS.last_move + WS.cooldown) > world.time)
+ usr << "The ship's drive is inoperable while the engines are charging."
+ return
+
+ var/index = text2num(href_list["traverse"])
+ var/datum/shuttle_route/new_route = WS.web_master.current_destination.routes[index]
+ if(!istype(new_route))
+ message_admins("ERROR: Shuttle computer was asked to traverse a nonexistant route.")
+ return
+
+ if(!check_docking(WS))
+ // updateUsrDialog()
+ ui_interact(usr)
+ return
+
+ var/datum/shuttle_destination/target_destination = new_route.get_other_side(WS.web_master.current_destination)
+ if(!istype(target_destination))
+ message_admins("ERROR: Shuttle computer was asked to travel to a nonexistant destination.")
+ return
+
+ WS.web_master.future_destination = target_destination
+ to_chat(usr, "[shuttle_tag] flight computer received command.")
+
+ var/travel_time = new_route.travel_time * WS.flight_time_modifier
+
+ if(new_route.interim && new_route.travel_time)
+ WS.long_jump(WS.current_area, target_destination.my_area, new_route.interim, travel_time / 10)
+ else
+ WS.short_jump(WS.current_area, target_destination.my_area)
+
+ ui_interact(usr)
+
+// Props, for now.
+/obj/structure/flight_left
+ name = "flight computer meters"
+ desc = "You hope the pilot knows what this does."
+ icon = 'icons/obj/flight_computer.dmi'
+ icon_state = "left"
+ density = TRUE
+ anchored = TRUE
+
+/obj/structure/flight_right
+ name = "flight computer panel"
+ desc = "Probably shouldn't open it."
+ icon = 'icons/obj/flight_computer.dmi'
+ icon_state = "right"
+ density = TRUE
+ anchored = TRUE
diff --git a/code/modules/shuttles/web_datums.dm b/code/modules/shuttles/web_datums.dm
new file mode 100644
index 0000000000..17cd725725
--- /dev/null
+++ b/code/modules/shuttles/web_datums.dm
@@ -0,0 +1,192 @@
+// This file actually has three seperate datums.
+
+// This is the first datum, and it connects shuttle_destinations together.
+/datum/shuttle_route
+ var/datum/shuttle_destination/start = null // One of the two sides of this route. Start just means it was the creator of this route.
+ var/datum/shuttle_destination/end = null // The second side.
+ var/area/interim = null // Where the shuttle sits during the movement. Make sure no other shuttle shares this or Very Bad Things will happen.
+ var/travel_time = 0 // How long it takes to move from start to end, or end to start. Set to 0 for instant travel.
+ var/one_way = FALSE // If true, you can't travel from end to start.
+
+/datum/shuttle_route/New(var/_start, var/_end, var/_interim, var/_time = 0, var/_oneway = FALSE)
+ start = _start
+ end = _end
+ if(_interim)
+ interim = locate(_interim)
+ travel_time = _time
+ one_way = _oneway
+
+/datum/shuttle_route/Destroy()
+ start.routes -= src
+ end.routes -= src
+ return ..()
+
+/datum/shuttle_route/proc/get_other_side(var/datum/shuttle_destination/PoV)
+ if(PoV == start)
+ return end
+ if(PoV == end)
+ return start
+ return null
+
+/datum/shuttle_route/proc/display_route(var/datum/shuttle_destination/PoV)
+ var/datum/shuttle_destination/target = null
+ if(PoV == start)
+ target = end
+ else if(PoV == end)
+ target = start
+ else
+ return "ERROR"
+
+ return target.name
+
+// This is the second datum, and contains information on all the potential destinations for a specific shuttle.
+/datum/shuttle_destination
+ var/name = "a place" // Name of the destination, used for the flight computer.
+ var/area/my_area = null // Where the shuttle will move to when it actually arrives.
+ var/datum/shuttle_web_master/master = null // The datum that does the coordination with the actual shuttle datum.
+ var/list/routes = list() // Routes that are connected to this destination.
+ var/preferred_interim_area = null // When building a new route, use this interim area.
+
+ var/dock_target = null // The tag_id that the shuttle will use to try to dock to the destination, if able.
+
+ var/announcer = null // The name of the 'announcer' that will say the arrival/departure messages. Defaults to the map's boss name if blank.
+ var/arrival_message = null // Message said if the ship enters this destination. Not announced if the ship is cloaked.
+ var/departure_message = null // Message said if the ship exits this destination. Not announced if the ship is cloaked.
+
+ // When this destination is instantiated, it will go and instantiate other destinations in this assoc list and build routes between them.
+ // The list format is '/datum/shuttle_destination/subtype = 1 MINUTES'
+ var/list/destinations_to_create = list()
+
+ // When the web_master finishes creating all the destinations, it will go and build routes between this and them if they're on this list.
+ // The list format is '/datum/shuttle_destination/subtype = 1 MINUTES'
+ var/list/routes_to_make = list()
+
+/datum/shuttle_destination/New(var/new_master)
+ my_area = locate(my_area)
+ master = new_master
+
+/datum/shuttle_destination/Destroy()
+ for(var/datum/shuttle_route/R in routes)
+ qdel(R)
+ master = null
+ return ..()
+
+// build_destinations()
+
+// This builds destination instances connected to this instance, recursively.
+/datum/shuttle_destination/proc/build_destinations(var/list/already_made = list())
+ already_made += src.type
+ world << "SHUTTLES: [name] is going to build destinations. already_made list is \[[english_list(already_made)]\]"
+ for(var/type_to_make in destinations_to_create)
+ if(type_to_make in already_made) // Avoid circular initializations.
+ world << "SHUTTLES: [name] can't build [type_to_make] due to being a duplicate."
+ continue
+
+ // Instance the new destination, and call this proc on their 'downstream' destinations.
+ var/datum/shuttle_destination/new_dest = new type_to_make()
+ world << "SHUTTLES: [name] has created [new_dest.name] and will make it build their own destinations."
+ already_made += new_dest.build_destinations(already_made)
+
+ // Now link our new destination to us.
+ var/travel_delay = destinations_to_create[type_to_make]
+ link_destinations(new_dest, preferred_interim_area, travel_delay)
+ world << "SHUTTLES: [name] has linked themselves to [new_dest.name]"
+
+ world << "SHUTTLES: [name] has finished building destinations. already_made list is \[[english_list(already_made)]\]."
+ return already_made
+
+/datum/shuttle_destination/proc/enter(var/datum/shuttle_destination/old_destination)
+ announce_arrival()
+
+/datum/shuttle_destination/proc/exit(var/datum/shuttle_destination/new_destination)
+ announce_departure()
+
+
+/datum/shuttle_destination/proc/announce_departure()
+ if(isnull(departure_message) || master.my_shuttle.cloaked)
+ return
+
+ command_announcement.Announce(departure_message,(announcer ? announcer : "[using_map.boss_name]"))
+
+/datum/shuttle_destination/proc/announce_arrival()
+ if(isnull(arrival_message) || master.my_shuttle.cloaked)
+ return
+
+ command_announcement.Announce(arrival_message,(announcer ? announcer : "[using_map.boss_name]"))
+
+/datum/shuttle_destination/proc/link_destinations(var/datum/shuttle_destination/other_place, var/area/interim_area, var/travel_time = 0)
+ // First, check to make sure this doesn't cause a duplicate route.
+ for(var/datum/shuttle_route/R in routes)
+ if(R.start == other_place || R.end == other_place)
+ return
+
+ // Now we can connect them.
+ var/datum/shuttle_route/new_route = new(src, other_place, interim_area, travel_time)
+ routes += new_route
+ other_place.routes += new_route
+
+// Depending on certain circumstances, the shuttles can fail.
+// What happens depends on where the shuttle is. If it's in space, it just can't move until its fixed.
+// If it's flying in Sif, however, things get interesting.
+/datum/shuttle_destination/proc/flight_failure()
+ return
+
+// This is the third and final datum, which coordinates with the shuttle datum to tell it where it is, where it can go, and how long it will take.
+// It is also responsible for instancing all the destinations it has control over, and linking them together.
+/datum/shuttle_web_master
+ var/datum/shuttle/web_shuttle/my_shuttle = null // Ref to the shuttle this datum is coordinating with.
+ var/datum/shuttle_destination/current_destination = null // Where the shuttle currently is. Bit of a misnomer.
+ var/datum/shuttle_destination/future_destination = null // Where it will be in the near future.
+ var/datum/shuttle_destination/starting_destination = null // Where the shuttle will start at, generally at the home base.
+ var/list/destinations = list() // List of currently instanced destinations.
+ var/destination_class = null // Type to use in typesof(), to build destinations.
+
+/datum/shuttle_web_master/New(var/new_shuttle, var/new_destination_class = null)
+ my_shuttle = new_shuttle
+ if(new_destination_class)
+ destination_class = new_destination_class
+ build_destinations()
+ current_destination = get_destination_by_type(starting_destination)
+
+/datum/shuttle_web_master/Destroy()
+ my_shuttle = null
+ for(var/datum/shuttle_destination/D in destinations)
+ qdel(D)
+ return ..()
+
+/datum/shuttle_web_master/proc/build_destinations()
+ // First, instantiate all the destination subtypes relevant to this datum.
+ var/list/destination_types = typesof(destination_class) - destination_class
+ for(var/new_type in destination_types)
+ var/datum/shuttle_destination/D = new new_type(src)
+ destinations += D
+
+ // Now start the process of connecting all of them.
+ for(var/datum/shuttle_destination/D in destinations)
+ for(var/type_to_link in D.routes_to_make)
+ var/travel_delay = D.routes_to_make[type_to_link]
+ D.link_destinations(get_destination_by_type(type_to_link), D.preferred_interim_area, travel_delay)
+
+/datum/shuttle_web_master/proc/on_shuttle_departure()
+ current_destination.exit()
+
+/datum/shuttle_web_master/proc/on_shuttle_arrival()
+ if(future_destination)
+ future_destination.enter()
+ current_destination = future_destination
+ future_destination = null
+ my_shuttle.current_area = current_destination.my_area
+
+/datum/shuttle_web_master/proc/current_dock_target()
+ if(current_destination)
+ return current_destination.dock_target
+
+/datum/shuttle_web_master/proc/get_available_routes()
+ if(current_destination)
+ return current_destination.routes.Copy()
+
+/datum/shuttle_web_master/proc/get_current_destination()
+ return current_destination
+
+/datum/shuttle_web_master/proc/get_destination_by_type(var/type_to_get)
+ return locate(type_to_get) in destinations
\ No newline at end of file
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 3310ffe6a5..99fa33d1cb 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -27,13 +27,16 @@
var/obj/item/organ/external/P = target.organs_by_name[E.parent_organ]
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (affected)
- user << "Something is in the way! You can't attach [E] here!"
+ to_chat(user, "Something is in the way! You can't attach [E] here!")
return 0
if(!P)
- user << "There's nothing to attach [E] to!"
+ to_chat(user, "There's nothing to attach [E] to!")
return 0
else if((P.robotic >= ORGAN_ROBOT) && (E.robotic < ORGAN_ROBOT))
- user << "Attaching [E] to [P] wouldn't work well."
+ to_chat(user, "Attaching [E] to [P] wouldn't work well.")
+ return 0
+ else if(istype(E, /obj/item/organ/external/head) && E.robotic >= ORGAN_ROBOT && P.robotic < ORGAN_ROBOT)
+ to_chat(user, "Attaching [E] to [P] might break [E].")
return 0
else
return 1
diff --git a/html/changelogs/Woodrat-MultiZ.yml b/html/changelogs/Woodrat-MultiZ.yml
new file mode 100644
index 0000000000..0058ee3623
--- /dev/null
+++ b/html/changelogs/Woodrat-MultiZ.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Woodrat
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added 'see down' in open spaces from Vore."
+ - rscadd: "Added talking and visible messages upward through open space from Vore."
\ No newline at end of file
diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi
index 5f1898b857..930e724d22 100644
Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index cf74553237..1469c3e3ba 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index 68a12155d7..21ffdc5f00 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi
new file mode 100644
index 0000000000..a5aef28161
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi differ
diff --git a/icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi b/icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi
new file mode 100644
index 0000000000..e5fa42135b
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/xion/xion_alt4.dmi differ
diff --git a/icons/mob/human_races/r_skeleton.dmi b/icons/mob/human_races/r_skeleton.dmi
index c30eb60fde..30c368b1fc 100644
Binary files a/icons/mob/human_races/r_skeleton.dmi and b/icons/mob/human_races/r_skeleton.dmi differ
diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi
index 7b2b705c94..180f51236a 100644
Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ
diff --git a/icons/mob/items/lefthand_melee.dmi b/icons/mob/items/lefthand_melee.dmi
index 41f7617c3f..0f08605207 100644
Binary files a/icons/mob/items/lefthand_melee.dmi and b/icons/mob/items/lefthand_melee.dmi differ
diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi
index 7c05fbd61d..4fcc8b6b8d 100644
Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ
diff --git a/icons/mob/items/righthand_melee.dmi b/icons/mob/items/righthand_melee.dmi
index fb7baddc29..c1313715a6 100644
Binary files a/icons/mob/items/righthand_melee.dmi and b/icons/mob/items/righthand_melee.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index ec0e70ccdc..33133bda47 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index a0e5df9f9d..d259faec57 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/talk.dmi b/icons/mob/talk.dmi
index acd94a74c3..ef15e9da6d 100644
Binary files a/icons/mob/talk.dmi and b/icons/mob/talk.dmi differ
diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi
index d041818abb..4105a9f68e 100644
Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 0643d9105e..2d0695ec2f 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 5ba6b502fc..7b1b1b4085 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/rings.dmi b/icons/obj/clothing/rings.dmi
new file mode 100644
index 0000000000..5274bf8735
Binary files /dev/null and b/icons/obj/clothing/rings.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index d60b03c9aa..f16399d6db 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi
index 84117e2754..8f5aac8ff6 100644
Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ
diff --git a/icons/obj/coilgun.dmi b/icons/obj/coilgun.dmi
new file mode 100644
index 0000000000..238bbd9a3d
Binary files /dev/null and b/icons/obj/coilgun.dmi differ
diff --git a/icons/obj/computer.dmi b/icons/obj/computer.dmi
index 882f80253c..b3f6a15d3b 100644
Binary files a/icons/obj/computer.dmi and b/icons/obj/computer.dmi differ
diff --git a/icons/obj/flight_computer.dmi b/icons/obj/flight_computer.dmi
new file mode 100644
index 0000000000..61f0239ff8
Binary files /dev/null and b/icons/obj/flight_computer.dmi differ
diff --git a/icons/obj/railgun.dmi b/icons/obj/railgun.dmi
new file mode 100644
index 0000000000..0b00e7a156
Binary files /dev/null and b/icons/obj/railgun.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 30d846ddaf..6af3f71071 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index 6807e3fbc9..9b434f628d 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi
index 8ad45585ab..6e738afe28 100755
Binary files a/icons/turf/areas.dmi and b/icons/turf/areas.dmi differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 7c2f111e05..52d9d6330f 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 83de065a7b..4f8aedb853 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -8373,7 +8373,7 @@
"dfa" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos)
"dfb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/blue/full{dir = 8},/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Port"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfc" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dfd" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 2; tag_south = 1; tag_west = 3; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dfd" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 2; tag_south = 1; tag_west = 3; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dfe" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dff" = (/turf/simulated/wall,/area/engineering/atmos)
"dfg" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8660,7 +8660,7 @@
"dkB" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "n2_in"; use_power = 1},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dkC" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dkE" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dkE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkF" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkG" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dkH" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos)
@@ -8712,8 +8712,8 @@
"dlB" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/engineering/atmos)
"dlC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dlE" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
-"dlF" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dlE" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos)
+"dlF" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlG" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlH" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/engineering/atmos)
"dlI" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 5; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/wall/r_wall,/area/engineering/workshop)
@@ -9696,9 +9696,9 @@
"dEx" = (/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/engineering/aft_hallway)
"dEy" = (/turf/simulated/floor,/area/shuttle/constructionsite/station)
"dEz" = (/obj/structure/closet/crate,/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/shuttle/constructionsite/station)
-"dEA" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEA" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/obj/effect/engine_setup/atmo_filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dEB" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room)
-"dEC" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/obj/effect/engine_setup/filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
+"dEC" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/obj/effect/engine_setup/atmo_filter,/turf/simulated/floor/plating,/area/engineering/engine_room)
"dED" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/engineering/engine_room)
"dEE" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor,/area/engineering/engine_room)
"dEF" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_room)
@@ -9871,7 +9871,7 @@
"dHQ" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/structure/closet/emcloset,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
"dHR" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/jetpack/carbondioxide,/obj/item/clothing/shoes/magboots,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva)
"dHS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/light,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/northern_star/polaris-3.dmm b/maps/northern_star/polaris-3.dmm
index dd7fb784cf..eacc4adfb8 100644
--- a/maps/northern_star/polaris-3.dmm
+++ b/maps/northern_star/polaris-3.dmm
@@ -280,7 +280,7 @@
"fL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcomsat)
"fM" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/tcomsat)
"fN" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/turf/simulated/floor,/area/tcomsat)
-"fO" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/turf/simulated/floor,/area/tcomsat)
+"fO" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/turf/simulated/floor,/area/tcomsat)
"fP" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor,/area/tcomsat)
"fQ" = (/obj/machinery/telecomms/server/presets/medical,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"fR" = (/obj/machinery/telecomms/server/presets/science,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
diff --git a/maps/northern_star/polaris-4.dmm b/maps/northern_star/polaris-4.dmm
index a55043f632..456048f539 100644
--- a/maps/northern_star/polaris-4.dmm
+++ b/maps/northern_star/polaris-4.dmm
@@ -193,7 +193,7 @@
"dS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable,/turf/simulated/floor,/area/outpost/abandoned)
"dT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/outpost/abandoned)
"dU" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/abandoned)
-"dV" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/abandoned)
+"dV" = (/obj/machinery/atmospherics/omni/atmos_filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/abandoned)
"dW" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor,/area/outpost/abandoned)
"dX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/abandoned)
"dY" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/abandoned)
diff --git a/maps/northern_star/polaris-5.dmm b/maps/northern_star/polaris-5.dmm
index cf6ccecf5f..d228eccef0 100644
--- a/maps/northern_star/polaris-5.dmm
+++ b/maps/northern_star/polaris-5.dmm
@@ -246,7 +246,7 @@
"eL" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eM" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 2; tag_east_con = null; tag_north = 1; tag_north_con = 0.5; tag_south = 0; tag_south_con = null; tag_west = 1; tag_west_con = 0.5; use_power = 0},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eN" = (/obj/machinery/atmospherics/pipe/manifold/visible,/obj/machinery/meter,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/research/mixing)
-"eO" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1; use_power = 0},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
+"eO" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1; use_power = 0},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eP" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -29},/turf/simulated/floor/tiled,/area/outpost/research/mixing)
"eQ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/purple{dir = 9},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
"eR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway)
@@ -932,7 +932,7 @@
"rV" = (/obj/machinery/door/window/southright{name = "Spectrometry Lab"; req_access = list(65)},/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rW" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige/full{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Sample Preparation"; dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rX" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
-"rY" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 2; tag_west = 3},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
+"rY" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_south = 2; tag_west = 3},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"rZ" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly)
"sa" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/effect/floor_decal/industrial/warning,/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Anomalous Materials Port"; dir = 4},/obj/machinery/status_display{layer = 4; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"sb" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
@@ -1319,9 +1319,9 @@
"zs" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zt" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zu" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"zv" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"zw" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 7; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
-"zx" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 5; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"zv" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"zw" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 7; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
+"zx" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 5; tag_west = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zy" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics)
"zz" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/dorms)
"zA" = (/obj/structure/mirror{pixel_x = 30; pixel_y = -2},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/outpost/mining_main/dorms)
@@ -1747,7 +1747,7 @@
"HE" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored)
"HF" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics)
"HG" = (/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Atmospherics"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics)
-"HH" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
+"HH" = (/obj/machinery/atmospherics/omni/atmos_filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"HI" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"HJ" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/engineering/atmospherics)
"HK" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics)
@@ -1912,7 +1912,7 @@
"KN" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space)
"KO" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"KP" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/shuttles/crew_shuttles.dm b/maps/southern_cross/shuttles/crew_shuttles.dm
new file mode 100644
index 0000000000..764c7bccd7
--- /dev/null
+++ b/maps/southern_cross/shuttles/crew_shuttles.dm
@@ -0,0 +1,186 @@
+//Shuttle 1
+
+/obj/machinery/computer/shuttle_control/web/shuttle1
+ name = "shuttle control console"
+ shuttle_tag = "Shuttle 1"
+
+/datum/shuttle/web_shuttle/shuttle1
+ name = "Shuttle 1"
+ warmup_time = 0
+ current_area = /area/shuttle/shuttle1/start
+ docking_controller_tag = "shuttle1_shuttle"
+ web_master_type = /datum/shuttle_web_master/shuttle1
+
+/datum/shuttle_web_master/shuttle1
+ destination_class = /datum/shuttle_destination/shuttle1
+ starting_destination = /datum/shuttle_destination/shuttle1/root
+
+//Shuttle 2
+
+/obj/machinery/computer/shuttle_control/web/shuttle2
+ name = "shuttle control console"
+ shuttle_tag = "Shuttle 2"
+
+/datum/shuttle/web_shuttle/shuttle2
+ name = "Shuttle 2"
+ warmup_time = 0
+ current_area = /area/shuttle/shuttle2/start
+ docking_controller_tag = "shuttle2_shuttle"
+ web_master_type = /datum/shuttle_web_master/shuttle2
+
+/datum/shuttle_web_master/shuttle2
+ destination_class = /datum/shuttle_destination/shuttle2
+ starting_destination = /datum/shuttle_destination/shuttle2/root
+
+
+/datum/shuttle_destination/shuttle1/root
+ name = "Southern Cross Hangar One"
+ my_area = /area/shuttle/shuttle1/start
+ preferred_interim_area = /area/shuttle/shuttle1/transit
+
+ dock_target = "hangar_1"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, shuttle one has arrived to Hangar One."
+ departure_message = "Attention, shuttle one has departed Hangar One."
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle1/outside_SC = 0,
+ )
+
+/datum/shuttle_destination/shuttle2/root
+ name = "Southern Cross Hangar Two"
+ my_area = /area/shuttle/shuttle2/start
+ preferred_interim_area = /area/shuttle/shuttle2/transit
+
+ dock_target = "hangar_2"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, shuttle one has arrived to Hangar Two."
+ departure_message = "Attention, shuttle one has departed Hangar Two."
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle2/outside_SC = 0,
+ )
+
+
+/datum/shuttle_destination/shuttle1/outside_SC
+ name = "Outside of NLS Southern Cross"
+ my_area = /area/shuttle/shuttle1/seconddeck
+ preferred_interim_area = /area/shuttle/shuttle1/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle1/sif_orbit = 1 MINUTE,
+ /datum/shuttle_destination/shuttle1/docked_SC = 0
+ )
+
+/datum/shuttle_destination/shuttle2/outside_SC
+ name = "Outside of NLS Southern Cross"
+ my_area = /area/shuttle/shuttle2/seconddeck
+ preferred_interim_area = /area/shuttle/shuttle2/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle2/sif_orbit = 1 MINUTE,
+ /datum/shuttle_destination/shuttle2/docked_SC = 0
+ )
+
+
+/datum/shuttle_destination/shuttle1/docked_SC
+ name = "Southern Cross Docking Port"
+ my_area = /area/shuttle/shuttle1/arrivals_dock
+ preferred_interim_area = /area/shuttle/shuttle1/transit
+
+ dock_target = "shuttle1_dock_airlocksc"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, shuttle one has arrived to the Arrivals Dock."
+ departure_message = "Attention, shuttle one has departed the Arrivals Dock."
+
+/datum/shuttle_destination/shuttle2/docked_SC
+ name = "Southern Cross Docking Port"
+ my_area = /area/shuttle/shuttle2/arrivals_dock
+ preferred_interim_area = /area/shuttle/shuttle2/transit
+
+ dock_target = "shuttle2_dock_airlocksc"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, shuttle two has arrived to the Arrivals Dock."
+ departure_message = "Attention, shuttle two has departed the Arrivals Dock."
+
+
+/datum/shuttle_destination/shuttle1/sif_orbit
+ name = "Sif Orbit"
+ my_area = /area/shuttle/shuttle1/orbit
+ preferred_interim_area = /area/shuttle/shuttle1/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle1/sky = 1 MINUTE
+ )
+
+/datum/shuttle_destination/shuttle2/sif_orbit
+ name = "Sif Orbit"
+ my_area = /area/shuttle/shuttle2/orbit
+ preferred_interim_area = /area/shuttle/shuttle2/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle2/sky = 1 MINUTE
+ )
+
+
+/datum/shuttle_destination/shuttle1/sky
+ name = "Skies of Sif"
+ my_area = /area/shuttle/shuttle1/sky
+ preferred_interim_area = /area/shuttle/shuttle1/sky_transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle1/main_base = 30 SECONDS,
+ /datum/shuttle_destination/shuttle1/mining_base = 30 SECONDS
+ )
+
+/datum/shuttle_destination/shuttle2/sky
+ name = "Skies of Sif"
+ my_area = /area/shuttle/shuttle2/sky
+ preferred_interim_area = /area/shuttle/shuttle2/sky_transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/shuttle2/main_base = 30 SECONDS,
+ /datum/shuttle_destination/shuttle2/mining_base = 30 SECONDS
+ )
+
+
+/datum/shuttle_destination/shuttle1/main_base
+ name = "Main Outpost"
+ my_area = /area/shuttle/shuttle1/planet
+ preferred_interim_area = /area/shuttle/shuttle1/sky_transit
+
+ dock_target = "surface_dock_1"
+ announcer = "Outpost Automated ATC"
+ arrival_message = "Attention, shuttle one has arrived to the Main Outpost."
+ departure_message = "Attention, shuttle one has departed the Main Outpost."
+
+/datum/shuttle_destination/shuttle2/main_base
+ name = "Main Outpost"
+ my_area = /area/shuttle/shuttle2/planet
+ preferred_interim_area = /area/shuttle/shuttle2/sky_transit
+
+ dock_target = "surface_dock_2"
+ announcer = "Outpost Automated ATC"
+ arrival_message = "Attention, shuttle two has arrived to the Main Outpost."
+ departure_message = "Attention, shuttle two has departed the Main Outpost."
+
+
+/datum/shuttle_destination/shuttle1/mining_base
+ name = "Mining Outpost"
+ my_area = /area/shuttle/shuttle1/mining
+ preferred_interim_area = /area/shuttle/shuttle1/sky_transit
+
+ dock_target = "mining_dock_1"
+ announcer = "Outpost Automated ATC"
+ arrival_message = "Attention, shuttle one has arrived to the Mining Outpost."
+ departure_message = "Attention, shuttle one has departed the Mining Outpost."
+
+/datum/shuttle_destination/shuttle2/mining_base
+ name = "Mining Outpost"
+ my_area = /area/shuttle/shuttle2/mining
+ preferred_interim_area = /area/shuttle/shuttle2/sky_transit
+
+ dock_target = "mining_dock_2"
+ announcer = "Outpost Automated ATC"
+ arrival_message = "Attention, shuttle two has arrived to the Mining Outpost."
+ departure_message = "Attention, shuttle two has departed the Mining Outpost."
\ No newline at end of file
diff --git a/maps/southern_cross/shuttles/ert.dm b/maps/southern_cross/shuttles/ert.dm
new file mode 100644
index 0000000000..5c9aa8c0ba
--- /dev/null
+++ b/maps/southern_cross/shuttles/ert.dm
@@ -0,0 +1,124 @@
+/obj/machinery/computer/shuttle_control/multi/response
+ name = "response shuttle console"
+ shuttle_tag = "Response Operations"
+ req_access = list(access_cent_specops)
+/*
+/datum/shuttle/multi_shuttle/response
+ name = "Response Operations"
+ warmup_time = 5
+ origin = /area/shuttle/response_ship/start
+ interim = /area/shuttle/response_ship/transit
+ start_location = "Response Team Ship"
+ destinations = list(
+ "Northwest of First deck" = /area/shuttle/response_ship/firstdeck,
+ "Southeast of Second deck" = /area/shuttle/response_ship/seconddeck,
+ "Northeast of Third deck" = /area/shuttle/response_ship/thirddeck,
+ "Planetside Site" = /area/shuttle/response_ship/planet,
+ "Docking Port" = /area/shuttle/response_ship/arrivals_dock,
+ )
+ docking_controller_tag = "response_shuttle"
+ destination_dock_targets = list(
+ "Response Team Base" = "response_ship",
+ "Docking Port" = "response_shuttle_dock_airlock",
+ )
+*/
+/obj/machinery/computer/shuttle_control/web/ert
+ name = "response shuttle control console"
+ req_access = list(access_cent_specops)
+ shuttle_tag = "Response Operations"
+
+/datum/shuttle/web_shuttle/ert
+ name = "Response Operations"
+ warmup_time = 0
+ can_cloak = TRUE
+ cloaked = FALSE
+ current_area = /area/shuttle/response_ship/start
+ docking_controller_tag = "response_shuttle"
+ web_master_type = /datum/shuttle_web_master/ert
+ flight_time_modifier = 0.5 // High speed low drag etc
+
+/datum/shuttle_web_master/ert
+ destination_class = /datum/shuttle_destination/ert
+ starting_destination = /datum/shuttle_destination/ert/root
+
+
+/datum/shuttle_destination/ert/root
+ name = "Central Command"
+ my_area = /area/shuttle/response_ship/start
+ preferred_interim_area = /area/shuttle/response_ship/transit
+
+ dock_target = "response_base"
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ert/orbit = 2 MINUTES,
+ )
+
+/datum/shuttle_destination/ert/orbit
+ name = "Orbit of Sif"
+ my_area = /area/shuttle/response_ship/orbit
+ preferred_interim_area = /area/shuttle/response_ship/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ert/outside_SC_1d = 1 MINUTE,
+ /datum/shuttle_destination/ert/outside_SC_2d = 1 MINUTE,
+ /datum/shuttle_destination/ert/outside_SC_3d = 1 MINUTE,
+ /datum/shuttle_destination/ert/sky = 1 MINUTE
+ )
+
+/datum/shuttle_destination/ert/outside_SC_1d
+ name = "NLS Southern Cross - Fore Port of First Deck"
+ my_area = /area/shuttle/response_ship/firstdeck
+ preferred_interim_area = /area/shuttle/response_ship/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ert/outside_SC_2d = 0,
+ /datum/shuttle_destination/ert/outside_SC_3d = 0,
+ /datum/shuttle_destination/ert/docked_SC = 0
+ )
+
+
+/datum/shuttle_destination/ert/outside_SC_2d
+ name = "NLS Southern Cross - Aft Starboard of Second Deck"
+ my_area = /area/shuttle/response_ship/seconddeck
+ preferred_interim_area = /area/shuttle/response_ship/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ert/outside_SC_1d = 0,
+ /datum/shuttle_destination/ert/outside_SC_3d = 0,
+ /datum/shuttle_destination/ert/docked_SC = 0
+ )
+
+/datum/shuttle_destination/ert/outside_SC_3d
+ name = "NLS Southern Cross - Aft Starboard of Third Deck"
+ my_area = /area/shuttle/response_ship/thirddeck
+ preferred_interim_area = /area/shuttle/response_ship/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ert/outside_SC_1d = 0,
+ /datum/shuttle_destination/ert/outside_SC_2d = 0,
+ /datum/shuttle_destination/ert/docked_SC = 0
+ )
+
+/datum/shuttle_destination/ert/docked_SC
+ name = "NLS Southern Cross - Arrivals Docking Port"
+ my_area = /area/shuttle/response_ship/arrivals_dock
+ preferred_interim_area = /area/shuttle/response_ship/transit
+
+ dock_target = "response_shuttle_dock_airlock"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, the Emergency Response Team's shuttle has arrived to the Arrivals Dock."
+ departure_message = "Attention, the Emergency Response Team's shuttle has departed the Arrivals Dock."
+
+/datum/shuttle_destination/ert/sky
+ name = "Skies of Sif"
+ my_area = /area/shuttle/response_ship/sky
+ preferred_interim_area = /area/shuttle/response_ship/sky_transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ert/planet = 30 SECONDS
+ )
+
+/datum/shuttle_destination/ert/planet
+ name = "Sif Surface"
+ my_area = /area/shuttle/response_ship/planet
+ preferred_interim_area = /area/shuttle/response_ship/sky_transit
\ No newline at end of file
diff --git a/maps/southern_cross/shuttles/heist.dm b/maps/southern_cross/shuttles/heist.dm
new file mode 100644
index 0000000000..c44712ee0a
--- /dev/null
+++ b/maps/southern_cross/shuttles/heist.dm
@@ -0,0 +1,100 @@
+/obj/machinery/computer/shuttle_control/web/heist
+ name = "skipjack control console"
+ req_access = list(access_syndicate)
+ shuttle_tag = "Skipjack"
+
+/datum/shuttle/web_shuttle/heist
+ name = "Skipjack"
+ warmup_time = 0
+ can_cloak = TRUE
+ cloaked = TRUE
+ current_area = /area/skipjack_station/start
+// docking_controller_tag = "skipjack_shuttle"
+ web_master_type = /datum/shuttle_web_master/heist
+
+/datum/shuttle_web_master/heist
+ destination_class = /datum/shuttle_destination/heist
+ starting_destination = /datum/shuttle_destination/heist/root
+
+
+
+/datum/shuttle_destination/heist/root
+ name = "Raider Outpost"
+ my_area = /area/skipjack_station/arrivals_dock
+ preferred_interim_area = /area/skipjack_station/transit
+
+// dock_target = "skipjack_base"
+
+ routes_to_make = list(
+ /datum/shuttle_destination/heist/orbit = 1 MINUTE,
+ )
+
+/datum/shuttle_destination/heist/orbit
+ name = "Orbit of Sif"
+ my_area = /area/skipjack_station/orbit
+ preferred_interim_area = /area/skipjack_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/heist/outside_SC_1d = 1 MINUTE,
+ /datum/shuttle_destination/heist/outside_SC_2d = 1 MINUTE,
+ /datum/shuttle_destination/heist/outside_SC_3d = 1 MINUTE,
+ /datum/shuttle_destination/heist/sky = 1 MINUTE,
+ )
+
+/datum/shuttle_destination/heist/outside_SC_1d
+ name = "NLS Southern Cross - Aft of First Deck"
+ my_area = /area/skipjack_station/firstdeck
+ preferred_interim_area = /area/skipjack_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/heist/outside_SC_2d = 0,
+ /datum/shuttle_destination/heist/outside_SC_3d = 0,
+ /datum/shuttle_destination/heist/docked_SC = 0
+ )
+
+/datum/shuttle_destination/heist/outside_SC_2d
+ name = "NLS Southern Cross - Fore of Second Deck"
+ my_area = /area/skipjack_station/seconddeck
+ preferred_interim_area = /area/skipjack_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/heist/outside_SC_1d = 0,
+ /datum/shuttle_destination/heist/outside_SC_3d = 0,
+ /datum/shuttle_destination/heist/docked_SC = 0
+ )
+
+/datum/shuttle_destination/heist/outside_SC_3d
+ name = "NLS Southern Cross - Starboard of Third Deck"
+ my_area = /area/skipjack_station/thirddeck
+ preferred_interim_area = /area/skipjack_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/heist/outside_SC_1d = 0,
+ /datum/shuttle_destination/heist/outside_SC_2d = 0,
+ /datum/shuttle_destination/heist/docked_SC = 0
+ )
+
+
+/datum/shuttle_destination/heist/docked_SC
+ name = "NLS Southern Cross - Arrivals Docking Port"
+ my_area = /area/skipjack_station/arrivals_dock
+ preferred_interim_area = /area/skipjack_station/transit
+
+// dock_target = "skipjack_shuttle_dock_airlock"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, a shuttle has arrived to the Arrivals Dock."
+ departure_message = "Attention, a shuttle has departed the Arrivals Dock."
+
+/datum/shuttle_destination/heist/sky
+ name = "Skies of Sif"
+ my_area = /area/skipjack_station/sky
+ preferred_interim_area = /area/skipjack_station/sky_transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/heist/planet = 30 SECONDS
+ )
+
+/datum/shuttle_destination/heist/planet
+ name = "Sif Surface"
+ my_area = /area/skipjack_station/planet
+ preferred_interim_area = /area/skipjack_station/sky_transit
\ No newline at end of file
diff --git a/maps/southern_cross/shuttles/merc.dm b/maps/southern_cross/shuttles/merc.dm
new file mode 100644
index 0000000000..93321f8dac
--- /dev/null
+++ b/maps/southern_cross/shuttles/merc.dm
@@ -0,0 +1,128 @@
+/*
+/datum/shuttle/multi_shuttle/mercenary
+ name = "Mercenary"
+ warmup_time = 0
+ can_cloak = TRUE
+ cloaked = TRUE
+ origin = /area/syndicate_station/start
+ interim = /area/syndicate_station/transit
+ start_location = "Mercenary Ship"
+ destinations = list(
+ "Northwest of First Deck" = /area/syndicate_station/firstdeck,
+ "Northeast of the Second deck" = /area/syndicate_station/seconddeck,
+ "Southeast of Third deck" = /area/syndicate_station/thirddeck,
+ "Planetside" = /area/syndicate_station/planet,
+ "Docking Port" = /area/syndicate_station/arrivals_dock,
+ )
+ docking_controller_tag = "merc_shuttle"
+ destination_dock_targets = list(
+ "Forward Operating Base" = "merc_base",
+ "Docking Port" = "nuke_shuttle_dock_airlock",
+ )
+ announcer = "Southern Cross Docking Computer"
+
+/datum/shuttle/multi_shuttle/mercenary/New()
+ arrival_message = "Attention, vessel docking with the Southern Cross."
+ departure_message = "Attention, vessel docking with the Southern Cross."
+ ..()
+*/
+
+/obj/machinery/computer/shuttle_control/web/syndicate
+ name = "mercenary shuttle control console"
+ req_access = list(access_syndicate)
+ shuttle_tag = "Mercenary"
+
+/datum/shuttle/web_shuttle/syndicate
+ name = "Mercenary"
+ warmup_time = 0
+ can_cloak = TRUE
+ cloaked = TRUE
+ current_area = /area/syndicate_station/start
+ docking_controller_tag = "merc_shuttle"
+ web_master_type = /datum/shuttle_web_master/syndie
+
+/datum/shuttle_web_master/syndie
+ destination_class = /datum/shuttle_destination/syndie
+ starting_destination = /datum/shuttle_destination/syndie/root
+
+
+
+/datum/shuttle_destination/syndie/root
+ name = "Mercenary Asteroid"
+ my_area = /area/syndicate_station/start
+ preferred_interim_area = /area/syndicate_station/transit
+
+ dock_target = "merc_base"
+
+ routes_to_make = list(
+ /datum/shuttle_destination/syndie/orbit = 3 MINUTES,
+ )
+
+/datum/shuttle_destination/syndie/orbit
+ name = "Orbit of Sif"
+ my_area = /area/syndicate_station/orbit
+ preferred_interim_area = /area/syndicate_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/syndie/outside_SC_1d = 1 MINUTE,
+ /datum/shuttle_destination/syndie/outside_SC_2d = 1 MINUTE,
+ /datum/shuttle_destination/syndie/outside_SC_3d = 1 MINUTE,
+ /datum/shuttle_destination/syndie/sky = 1 MINUTE
+ )
+
+/datum/shuttle_destination/syndie/outside_SC_1d
+ name = "NLS Southern Cross - Fore Port of First Deck"
+ my_area = /area/syndicate_station/firstdeck
+ preferred_interim_area = /area/syndicate_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/syndie/outside_SC_2d = 0,
+ /datum/shuttle_destination/syndie/outside_SC_3d = 0,
+ /datum/shuttle_destination/syndie/docked_SC = 0
+ )
+
+/datum/shuttle_destination/syndie/outside_SC_2d
+ name = "NLS Southern Cross - Fore Starboard of Second Deck"
+ my_area = /area/syndicate_station/seconddeck
+ preferred_interim_area = /area/syndicate_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/syndie/outside_SC_1d = 0,
+ /datum/shuttle_destination/syndie/outside_SC_3d = 0,
+ /datum/shuttle_destination/syndie/docked_SC = 0
+ )
+
+/datum/shuttle_destination/syndie/outside_SC_3d
+ name = "NLS Southern Cross - Aft Starboard of Third Deck"
+ my_area = /area/syndicate_station/thirddeck
+ preferred_interim_area = /area/syndicate_station/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/syndie/outside_SC_1d = 0,
+ /datum/shuttle_destination/syndie/outside_SC_2d = 0,
+ /datum/shuttle_destination/syndie/docked_SC = 0
+ )
+
+/datum/shuttle_destination/syndie/docked_SC
+ name = "NLS Southern Cross - Arrivals Docking Port"
+ my_area = /area/syndicate_station/arrivals_dock
+ preferred_interim_area = /area/syndicate_station/transit
+
+ dock_target = "nuke_shuttle_dock_airlock"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, a shuttle has arrived to the Arrivals Dock."
+ departure_message = "Attention, a shuttle has departed the Arrivals Dock."
+
+/datum/shuttle_destination/syndie/sky
+ name = "Skies of Sif"
+ my_area = /area/syndicate_station/sky
+ preferred_interim_area = /area/syndicate_station/sky_transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/syndie/planet = 30 SECONDS
+ )
+
+/datum/shuttle_destination/syndie/planet
+ name = "Sif Surface"
+ my_area = /area/syndicate_station/planet
+ preferred_interim_area = /area/syndicate_station/sky_transit
\ No newline at end of file
diff --git a/maps/southern_cross/shuttles/ninja.dm b/maps/southern_cross/shuttles/ninja.dm
new file mode 100644
index 0000000000..c7fa6c68c8
--- /dev/null
+++ b/maps/southern_cross/shuttles/ninja.dm
@@ -0,0 +1,98 @@
+/obj/machinery/computer/shuttle_control/web/ninja
+ name = "stealth shuttle control console"
+ req_access = list(access_syndicate)
+ shuttle_tag = "Ninja"
+
+/datum/shuttle/web_shuttle/ninja
+ name = "Ninja"
+ warmup_time = 0
+ can_cloak = TRUE
+ cloaked = TRUE
+ current_area = /area/ninja_dojo/start
+ docking_controller_tag = "ninja_shuttle"
+ web_master_type = /datum/shuttle_web_master/ninja
+
+/datum/shuttle_web_master/ninja
+ destination_class = /datum/shuttle_destination/ninja
+ starting_destination = /datum/shuttle_destination/ninja/root
+
+/datum/shuttle_destination/ninja/root
+ name = "Dojo Outpost"
+ my_area = /area/ninja_dojo/start
+ preferred_interim_area = /area/ninja_dojo/sky_transit
+
+ dock_target = "ninja_base"
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ninja/sky = 30 SECONDS,
+ )
+
+/datum/shuttle_destination/ninja/orbit
+ name = "Orbit of Sif"
+ my_area = /area/ninja_dojo/orbit
+ preferred_interim_area = /area/ninja_dojo/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ninja/outside_SC_1d = 1 MINUTE,
+ /datum/shuttle_destination/ninja/outside_SC_2d = 1 MINUTE,
+ /datum/shuttle_destination/ninja/outside_SC_3d = 1 MINUTE,
+ /datum/shuttle_destination/ninja/sky = 1 MINUTE,
+ )
+
+/datum/shuttle_destination/ninja/outside_SC_1d
+ name = "NLS Southern Cross - Aft of First Deck"
+ my_area = /area/ninja_dojo/firstdeck
+ preferred_interim_area = /area/ninja_dojo/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ninja/outside_SC_2d = 0,
+ /datum/shuttle_destination/ninja/outside_SC_3d = 0,
+ /datum/shuttle_destination/ninja/docked_SC = 0
+ )
+
+/datum/shuttle_destination/ninja/outside_SC_2d
+ name = "NLS Southern Cross - Fore of Second Deck"
+ my_area = /area/ninja_dojo/seconddeck
+ preferred_interim_area = /area/ninja_dojo/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ninja/outside_SC_1d = 0,
+ /datum/shuttle_destination/ninja/outside_SC_3d = 0,
+ /datum/shuttle_destination/ninja/docked_SC = 0
+ )
+
+/datum/shuttle_destination/ninja/outside_SC_3d
+ name = "NLS Southern Cross - Starboard of Third Deck"
+ my_area = /area/ninja_dojo/thirddeck
+ preferred_interim_area = /area/ninja_dojo/transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ninja/outside_SC_1d = 0,
+ /datum/shuttle_destination/ninja/outside_SC_2d = 0,
+ /datum/shuttle_destination/ninja/docked_SC = 0
+ )
+
+
+/datum/shuttle_destination/ninja/docked_SC
+ name = "NLS Southern Cross - Arrivals Docking Port"
+ my_area = /area/ninja_dojo/arrivals_dock
+ preferred_interim_area = /area/ninja_dojo/transit
+
+ dock_target = "ninja_shuttle_dock_airlock"
+ announcer = "Southern Cross Docking Computer"
+ arrival_message = "Attention, a shuttle has arrived to the Arrivals Dock."
+ departure_message = "Attention, a shuttle has departed the Arrivals Dock."
+
+/datum/shuttle_destination/ninja/sky
+ name = "Skies of Sif"
+ my_area = /area/ninja_dojo/sky
+ preferred_interim_area = /area/ninja_dojo/sky_transit
+
+ routes_to_make = list(
+ /datum/shuttle_destination/ninja/planet = 30 SECONDS
+ )
+
+/datum/shuttle_destination/ninja/planet
+ name = "Sif Surface"
+ my_area = /area/ninja_dojo/planet
+ preferred_interim_area = /area/ninja_dojo/sky_transit
\ No newline at end of file
diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm
index a743a92c37..2ea4504976 100644
--- a/maps/southern_cross/southern_cross-1.dmm
+++ b/maps/southern_cross/southern_cross-1.dmm
@@ -284,9 +284,9 @@
"afx" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/steel,/area/hangar/three)
"afy" = (/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled/steel,/area/hangar/three)
"afz" = (/turf/simulated/shuttle/wall/voidcraft/hard_corner,/area/shuttle/shuttle1/start)
-"afA" = (/obj/machinery/computer/security/mining,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"afA" = (/obj/machinery/computer/shuttle_control/web/shuttle1,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"afB" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
-"afC" = (/obj/machinery/computer/shuttle_control/multi/shuttle1,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"afC" = (/obj/structure/flight_left,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"afD" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/hangar/one)
"afE" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"afF" = (/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"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
@@ -314,7 +314,7 @@
"agb" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = list(12)},/turf/simulated/floor/plating,/area/hangar/three)
"agc" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/hangar/three)
"agd" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/shuttle1/start)
-"age" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"age" = (/obj/structure/flight_right,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"agf" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"agg" = (/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"agh" = (/obj/effect/floor_decal/corner/green,/turf/simulated/floor/tiled,/area/hangar/one)
@@ -436,7 +436,7 @@
"ait" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hangar/three)
"aiu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/green{dir = 6},/turf/simulated/floor/tiled,/area/hangar/three)
"aiv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hangar/one)
-"aiw" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle1_shuttle"; pixel_y = 26},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "shuttle1_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"aiw" = (/obj/structure/bed/chair/comfy/blue{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"aix" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "shuttle1_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "shuttle1_sensor"; pixel_x = 0; pixel_y = 28},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"aiy" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"aiz" = (/obj/effect/floor_decal/corner/green{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fpcenter)
@@ -453,11 +453,11 @@
"aiK" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/extinguisher,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard)
"aiL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hangar/three)
"aiM" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/steel,/area/hangar/one)
-"aiN" = (/obj/machinery/door/airlock/voidcraft/vertical{id_tag = "shuttle1hatchside"; name = "shuttle side hatch"},/obj/machinery/button/remote/airlock{id = "shuttle1hatchside"; name = "Side Hatch Control"; pixel_y = -26},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
-"aiO" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_inner"; name = "Internal Access"},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle1"; name = "interior access button"; pixel_x = 0; pixel_y = -26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"aiN" = (/obj/machinery/door/airlock/centcom{req_one_access = list(67)},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"aiO" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle1_shuttle"; pixel_y = 26; tag_airpump = "shuttle1_pump"; tag_chamber_sensor = "shuttle1_sensor"; tag_exterior_door = "shuttle1_outer"; tag_interior_door = "shuttle1_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "shuttle1_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"aiP" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"aiQ" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
-"aiR" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_outer"; name = "External Access"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "shuttle1"; name = "exterior access button"; pixel_x = 0; pixel_y = 26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"aiR" = (/obj/machinery/door/airlock/voidcraft/vertical{icon_state = "door_locked"; id_tag = "shuttle1hatchside"; locked = 1; name = "shuttle side hatch"},/obj/machinery/button/remote/airlock{id = "shuttle1hatchside"; name = "Side Hatch Control"; pixel_y = -26; req_one_access = list(67); specialfunctions = 4},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"aiS" = (/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"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"aiT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/random/maintenance/cargo,/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/firstdeck/foreport)
"aiU" = (/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fpcenter)
@@ -516,7 +516,7 @@
"ajV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = -32; pixel_y = 0},/obj/effect/floor_decal/corner/green{dir = 9},/turf/simulated/floor/tiled,/area/hangar/one)
"ajW" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hangar/one)
"ajX" = (/turf/simulated/shuttle/plating,/area/shuttle/shuttle1/start)
-"ajY" = (/obj/machinery/door/blast/regular{dir = 8; id = "shuttle1hatch"; layer = 3.3; name = "Rear Hatch"},/obj/machinery/button/remote/blast_door{id = "shuttle1hatch"; name = "Rear Hatch Control"; pixel_x = -26; pixel_y = 0},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"ajY" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_inner"; name = "Internal Access"},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle1_shuttle"; name = "interior access button"; pixel_x = 0; pixel_y = -26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"ajZ" = (/obj/machinery/door/blast/regular{dir = 8; id = "shuttle1hatch"; layer = 3.3; name = "Rear Hatch"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"aka" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle1/start)
"akb" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/turf/simulated/shuttle/wall/voidcraft/no_join,/area/shuttle/shuttle1/start)
@@ -621,7 +621,7 @@
"alW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/hangar/one)
"alX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hangar/one)
"alY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/hangar/one)
-"alZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light,/turf/simulated/floor/tiled,/area/hangar/one)
+"alZ" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle1_outer"; name = "External Access"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "shuttle1_shuttle"; name = "exterior access button"; pixel_x = 0; pixel_y = 26; req_access = null},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
"ama" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hangar/one)
"amb" = (/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"},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/hangar/one)
"amc" = (/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"},/turf/simulated/floor/tiled,/area/hangar/one)
@@ -659,8 +659,8 @@
"amI" = (/obj/random/technology_scanner,/turf/simulated/floor/plating,/area/maintenance/firstdeck/centralstarboard)
"amJ" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_2_berth_hatch"; locked = 1; name = "Large Escape Pod 2"; req_access = list(13)},/turf/simulated/floor/plating,/area/hallway/secondary/escape/firstdeck/ep_port)
"amK" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/escape/firstdeck/ep_port)
-"amL" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/one)
-"amM" = (/obj/machinery/door/firedoor/border_only,/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"; pixel_y = 0},/obj/machinery/door/airlock/glass_mining{name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/one)
+"amL" = (/obj/machinery/door/blast/regular{dir = 8; id = "shuttle1hatch"; layer = 3.3; name = "Rear Hatch"},/obj/machinery/button/remote/blast_door{id = "shuttle1hatch"; name = "Rear Hatch Control"; pixel_x = -26; pixel_y = 0; req_one_access = list(67)},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle1/start)
+"amM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "hangar_1"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = -26; tag_door = "hangar_1_door"},/turf/simulated/floor/tiled,/area/hangar/one)
"amN" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hangar/one)
"amO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
"amP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/closet/emcloset,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport)
@@ -796,7 +796,7 @@
"app" = (/obj/machinery/telecomms/relay/preset/telecomms,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
"apq" = (/obj/machinery/light,/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
"apr" = (/obj/machinery/telecomms/broadcaster/preset_right,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
-"aps" = (/obj/machinery/telecomms/hub/preset,/obj/structure/sign/warning/nosmoking_2{pixel_y = -32},/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
+"aps" = (/obj/structure/sign/warning/nosmoking_2{pixel_y = -32},/obj/machinery/telecomms/hub/preset/southerncross,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
"apt" = (/obj/machinery/telecomms/receiver/preset_right,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
"apu" = (/obj/machinery/telecomms/server/presets/command,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
"apv" = (/obj/machinery/telecomms/server/presets/security,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcomm/chamber)
@@ -1285,7 +1285,7 @@
"ayK" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/apcenter)
"ayL" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
"ayM" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
-"ayN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
+"ayN" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{id_tag = "hangar_1_door"; name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/one)
"ayO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
"ayP" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
"ayQ" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
@@ -1309,7 +1309,7 @@
"azi" = (/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"azj" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"azk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled,/area/hangar/twocontrol)
-"azl" = (/turf/simulated/floor/tiled,/area/hangar/twocontrol)
+"azl" = (/obj/machinery/door/firedoor/border_only,/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"; pixel_y = 0},/obj/machinery/door/airlock/glass_mining{id_tag = "hangar_1_door"; name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/one)
"azm" = (/obj/structure/table/reinforced,/obj/machinery/alarm{dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled,/area/hangar/twocontrol)
"azn" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/construction/firstdeck/construction3)
"azo" = (/obj/item/clothing/head/soft/mime,/obj/item/clothing/mask/gas/mime,/obj/item/clothing/shoes/mime,/obj/item/clothing/under/mime,/obj/structure/closet/crate,/turf/simulated/floor,/area/construction/firstdeck/construction3)
@@ -1369,8 +1369,8 @@
"aAq" = (/turf/simulated/wall/r_wall,/area/hangar/two)
"aAr" = (/turf/simulated/wall,/area/hangar/two)
"aAs" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hangar/two)
-"aAt" = (/obj/machinery/door/firedoor/border_only,/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,/obj/machinery/door/airlock/glass_mining{name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/two)
-"aAu" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/two)
+"aAt" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/landmark/start{name = "Pilot"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
+"aAu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/landmark/start{name = "Pilot"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva/pilot)
"aAv" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "large_escape_pod_1_berth_hatch"; locked = 1; name = "Large Escape Pod 1"; req_access = list(13)},/turf/simulated/floor,/area/hallway/secondary/escape/firstdeck/ep_starboard2)
"aAw" = (/obj/effect/floor_decal/corner/brown/full{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"aAx" = (/obj/machinery/light/spot{dir = 1},/obj/effect/floor_decal/corner/brown{dir = 5},/turf/simulated/floor/tiled/steel,/area/quartermaster/storage)
@@ -1424,7 +1424,7 @@
"aBt" = (/obj/structure/cable{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/tiled,/area/hangar/two)
"aBu" = (/obj/structure/cable{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/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/hangar/two)
"aBv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/hangar/two)
-"aBw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hangar/two)
+"aBw" = (/obj/machinery/computer/shuttle_control/mining,/turf/simulated/floor/tiled,/area/hangar/twocontrol)
"aBx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hangar/two)
"aBy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/hangar/two)
"aBz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/hangar/two)
@@ -1669,7 +1669,7 @@
"aGe" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold4w/visible,/obj/machinery/meter,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aGf" = (/obj/machinery/door/airlock/voidcraft/vertical{frequency = 1380; id_tag = "shuttle2_inner"; name = "Internal Access"},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "shuttle2"; name = "interior access button"; pixel_x = 0; pixel_y = 26; req_access = null},/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aGg" = (/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
-"aGh" = (/obj/machinery/button/remote/airlock{id = "shuttle2hatchside"; name = "Side Hatch Control"; pixel_y = 26},/obj/machinery/door/airlock/voidcraft/vertical{id_tag = "shuttle2hatchside"; name = "shuttle side hatch"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"aGh" = (/obj/machinery/door/firedoor/border_only,/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,/obj/machinery/door/airlock/glass_mining{id_tag = "shuttle_2_door"; name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/two)
"aGi" = (/obj/machinery/camera/network/cargo{c_tag = "CRG - Cargo Bay Port"; dir = 4; name = "security camera"},/obj/effect/floor_decal/corner/brown{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/storage)
"aGj" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/quartermaster/storage)
"aGk" = (/obj/effect/floor_decal/corner/brown,/turf/simulated/floor/tiled,/area/quartermaster/storage)
@@ -1698,7 +1698,7 @@
"aGH" = (/obj/item/inflatable/door/torn,/obj/item/weapon/screwdriver,/turf/simulated/floor,/area/maintenance/firstdeck/aftstarboard)
"aGI" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aGJ" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "shuttle2_sensor"; pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "shuttle2_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
-"aGK" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle2_shuttle"; pixel_y = -26},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "shuttle2_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"aGK" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_mining{id_tag = "shuttle_2_door"; name = "Hangar Bay"},/turf/simulated/floor/tiled,/area/hangar/two)
"aGL" = (/obj/structure/grille,/obj/structure/window/reinforced/full,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/shuttle/plating,/area/shuttle/shuttle2/start)
"aGM" = (/obj/structure/lattice,/obj/structure/grille/broken,/obj/item/stack/rods,/turf/space,/area/space)
"aGN" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "QMLoad"},/turf/simulated/floor/tiled,/area/quartermaster/storage)
@@ -1842,7 +1842,7 @@
"aJv" = (/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"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aJw" = (/obj/effect/floor_decal/corner/green{dir = 1},/turf/simulated/floor/tiled,/area/hangar/two)
"aJx" = (/turf/simulated/floor/tiled,/area/hangar/two)
-"aJy" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"aJy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/machinery/light{dir = 1},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "hangar_2"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = 26; tag_door = "hangar_2_door"},/turf/simulated/floor/tiled,/area/hangar/two)
"aJz" = (/obj/structure/bed/chair/comfy/blue,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aJA" = (/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled/steel,/area/quartermaster/storage)
"aJB" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/steel,/area/quartermaster/storage)
@@ -1891,9 +1891,9 @@
"aKs" = (/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"},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aKt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard)
"aKu" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = list(5,12,25,27,28,35)},/turf/simulated/floor/plating,/area/hangar/two)
-"aKv" = (/obj/machinery/computer/shuttle_control/multi/shuttle2,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"aKv" = (/obj/machinery/button/remote/airlock{id = "shuttle2hatchside"; name = "Side Hatch Control"; pixel_y = 26; req_one_access = list(67); specialfunctions = 4},/obj/machinery/door/airlock/voidcraft/vertical{icon_state = "door_locked"; id_tag = "shuttle2hatchside"; locked = 1; name = "shuttle side hatch"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aKw" = (/obj/structure/table/reinforced,/obj/machinery/light,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
-"aKx" = (/obj/machinery/computer/security/mining,/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"aKx" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle2_shuttle"; pixel_y = -26; tag_airpump = "shuttle2_pump"; tag_chamber_sensor = "shuttle2_sensor"; tag_exterior_door = "shuttle2_outer"; tag_interior_door = "shuttle2_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "shuttle2_pump"},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"aKy" = (/obj/machinery/light/spot,/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled/steel,/area/quartermaster/storage)
"aKz" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled/steel,/area/quartermaster/storage)
"aKA" = (/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/storage)
@@ -8824,7 +8824,7 @@
"dnJ" = (/obj/structure/sign/warning/docking_area,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3)
"dnK" = (/obj/machinery/shield_diffuser,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "s1s_dock_outer"; locked = 1; name = "Dock One External Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "s1s_dock_airlock"; name = "exterior access button"; pixel_x = -5; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dnL" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "s1s_dock_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
-"dnM" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle1_shuttle"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "s1s_dock_pump"; tag_chamber_sensor = "s1s_dock_sensor"; tag_exterior_door = "s1s_dock_outer"; tag_interior_door = "s1s_dock_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "s1s_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "s1s_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dnM" = (/obj/machinery/door/airlock/centcom{req_one_access = list(67)},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"dnN" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "s1s_dock_inner"; locked = 1; name = "Dock One Internal Airlock"; req_access = list(13)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D1)
"dnO" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "s1s_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
"dnP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -8972,7 +8972,7 @@
"dqB" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dqC" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "s2s_dock_airlock"; name = "interior access button"; pixel_x = 28; pixel_y = -26; req_one_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dqD" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "s2s_dock_inner"; locked = 1; name = "Dock Three Internal Airlock"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
-"dqE" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "s2s_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle2_shuttle"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "s2s_dock_pump"; tag_chamber_sensor = "s2s_dock_sensor"; tag_exterior_door = "s2s_dock_outer"; tag_interior_door = "s2s_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "s2s_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
+"dqE" = (/obj/machinery/computer/shuttle_control/web/shuttle2{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
"dqF" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "s2s_dock_pump"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
"dqG" = (/obj/machinery/shield_diffuser,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "s2s_dock_outer"; locked = 1; name = "Dock Three External Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "s2s_dock_airlock"; name = "exterior access button"; pixel_x = 5; pixel_y = 26; req_one_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3)
"dqH" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 1},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
@@ -10111,6 +10111,10 @@
"dMw" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/shuttle/shuttle2/arrivals_dock)
"dMx" = (/obj/effect/landmark{name = "carpspawn"},/turf/space,/area/shuttle/response_ship/thirddeck)
"dMy" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{dir = 2; id = "Skynet_launch"; name = "Mech Bay"},/turf/simulated/floor/tiled/dark,/area/assembly/chargebay)
+"dMz" = (/obj/structure/flight_right{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"dMA" = (/obj/structure/flight_left{dir = 1},/turf/simulated/shuttle/floor/black,/area/shuttle/shuttle2/start)
+"dMB" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 4},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle1_dock_airlocksc"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "s1s_dock_pump"; tag_chamber_sensor = "s1s_dock_sensor"; tag_exterior_door = "s1s_dock_outer"; tag_interior_door = "s1s_dock_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1380; id_tag = "s1s_dock_pump"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "s1s_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1)
+"dMC" = (/obj/effect/floor_decal/industrial/warning/cee{icon_state = "warningcee"; dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "s2s_dock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "shuttle2_dock_airlocksc"; pixel_x = 0; pixel_y = 30; req_one_access = list(13); tag_airpump = "s2s_dock_pump"; tag_chamber_sensor = "s2s_dock_sensor"; tag_exterior_door = "s2s_dock_outer"; tag_interior_door = "s2s_dock_inner"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "s2s_dock_sensor"; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D3)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10219,22 +10223,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaadTadTadTadTadTadTadTadTadTadTadTadTadTadTadTadTadTaaaaaaaaaadfadfadUadVadWadDadXadYadZaeaaebaecadEaedaeeaedaefaefaegaehaeiabfabfaaaaaaaaaaejaekaejaaaaaaaaaabfaanadRaelaemadAadAaaaaaaaaaaenaenaenaenaenaenaenaenaenaenaenaenaenaenaenaenaenaaaaaaaaaaaaaadaaaaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafadTadTaeoaepaeqaeqaeqaeqaeqaeqaeqaeqaeqaeqaeqaeraeoadTadTaaiadfadfaesaetaeuaevadDaewaexaexaeyaeyaeyaeyaedaezaeAaeBaedaeCaeDaeEabfaaaaaaaeFaeFaeFaeGaeFaeFaeFaaaaaaaanaeHaelaeIaeIadAadAaanaenaenaeJaeKaeLaeLaeLaeLaeLaeLaeLaeLaeLaeLaeLaeMaeNaenaenaafaafaafaadaaaaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaadTaeOaeoaePaeQaeQaeQaeRaeSaeTaeUaeRaeQaeQaeQaeVaeoaeoadTaeWaeXaeYaeZafaafbafcadDafdaeyafeaexaeyaeyaffaedafgafhafiaedafjafkaflabfaaaaaaaeFafmafnafoafpafqaeFaaaaaaaanaeHaelafrafsaftafuafraenafvafvafvafwafwafwafwafwafwafwafwafwafwafwafxaeNafyaenaaaaaaaaaaadaaaaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaadaaaaaaaaaadTaeOaeoaePaeQaeQaeRafzafAafBafCafzaeRaeQaeQaeVaeoaeoafDaeWafEafFafGafHafIafJadDafKaeyaexaexafLaeyafMaedafNafOafPaedafQafRafQabfaaaaaaaeFafSafnafTafnafUaeFaaaaaaaanafVafWafXafYafZagaafragbafvaeJafvafwafwafwafwafwafwafwafwafwafwafwagcaeNafyaenaaaaaaaaaaadaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaadTaeOaeoaePaeQaeQagdageagfaggagfageagdaeQaeQaeVaeoaghadTagiagjagkagkaglagkagkadDagmagnaeyaexaexaexagoaedagpaedagqaedabWafkabWabfaaaaaaaeFagragsagtaguagvaeFaaaaaaagwagxagxagyagxagxagzagAaenaeNaeNaeJafwafwafwafwafwafwafwafwafwafwafwagcagBafyaenaaaaaaaaaaaaaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaagiadTagCagDaePaeQaeQaeRaeRagdagEagdaeRaeRaeQaeQaeVagFagGadTadTagHagkagIagJagKagLadDagMagNagOagPaexaexagQaedagRaedagSaedagTafkagUabfaaaaaaaeFagVafnagWagXagYaeFaaaaaaagwagZahaahbahcagxahdaenaenaheahfahgafwafwafwafwafwafwafwafwafwafwafwagcahhahiaenahjaaaaaaaaaaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaadaaaaaaaaaadTaeOaeoaePaeQaeQaeRafzafCafAageafzaeRaeQaeQaeVaeoaeoafDaeWafEafFafGafHafIafJadDafKaeyaexaexafLaeyafMaedafNafOafPaedafQafRafQabfaaaaaaaeFafSafnafTafnafUaeFaaaaaaaanafVafWafXafYafZagaafragbafvaeJafvafwafwafwafwafwafwafwafwafwafwafwagcaeNafyaenaaaaaaaaaaadaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaadTaeOaeoaePaeQaeQagdafBaiwaggaiwafBagdaeQaeQaeVaeoaghadTagiagjagkagkaglagkagkadDagmagnaeyaexaexaexagoaedagpaedagqaedabWafkabWabfaaaaaaaeFagragsagtaguagvaeFaaaaaaagwagxagxagyagxagxagzagAaenaeNaeNaeJafwafwafwafwafwafwafwafwafwafwafwagcagBafyaenaaaaaaaaaaaaaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaagiadTagCagDaePaeQaeQaeRaeRagdaiNagdaeRaeRaeQaeQaeVagFagGadTadTagHagkagIagJagKagLadDagMagNagOagPaexaexagQaedagRaedagSaedagTafkagUabfaaaaaaaeFagVafnagWagXagYaeFaaaaaaagwagZahaahbahcagxahdaenaenaheahfahgafwafwafwafwafwafwafwafwafwafwafwagcahhahiaenahjaaaaaaaaaaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafadTadTadTahkaePaeQaeQagdahlahlaggahlahlagdaeQaeQaeVahmadTadTagiahnagkahoahpahqahradDadDadDadDahsahsahsadDaefaefaefaefaefahtafkahuabfabfaafaeFaeFaeFaeFaeFaeFaeFaafagwagwagwahaahvahwagxahxahjaenaenahyahgafwafwafwafwafwafwafwafwafwafwafwagcahzaenaenaenaafaafaafaadaaaaaaadcadcadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaagiadTaeOahAaePaeQaeQahBahCaggaggaggahDahBaeQaeQaeVahAahEadTaeWahnahFahGahpahHahraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahIahJahKahLahMahNahIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwahOahvahaahPahxafraenahQahRahgafwafwafwafwafwafwafwafwafwafwafwagcahRahSaenahjaaaaaaaaaaadaadaaaaaaadcadcadcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaadaadaadaadaadaadaaaaaaaaaaaaaaaadTaeOahAaePaeQaeQaeRahTahUaggaggagfaeRaeQaeQaeVahAahEadTaeWahnagkahVahWahrahraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahIahXahYafkahZabDahIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagwagwaiaaibagxahxaicaenahQahRahgafwafwafwafwafwafwafwafwafwafwafwagcahRahSaenaaaaaaaaaaaaaaaaadaafaafaadaadaadaaRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaadTaidaieaePaeQaeRaeRaeRagdagEahBaeRaeRaeRaeQaeVaifaigadTaihahnagkahrahrahraaaaaaaaaaaaaaaaaaaiiaiiaijaijaijaiiaikabDailafkaflabDaimainaioaioaioainainaaaaaaaaaaaaaaaaaaagwagwagwagxaipaiqaenairaisahgafwafwafwafwafwafwafwafwafwafwafwagcaitaiuaenaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaadTaeOaivaePaeQaeRaggaggaggaggagdaiwaixaeRaeQaeVaivahEadTaiyahnaeWacHaaaaaaaaaaabaaaaaaaijaijaiiaizaiAaiBaiAaiCaiDabWabWafkabWabWaiEaiFaiGaiHaiGaiIainaioaioaaaaaaaabaaaaaaaaaacZaiJaipaiKaenahQaiLahgafwafwafwafwafwafwafwafwafwafwafwagcaiLahSaenaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaadTaeOaivaiMaeQaiNaggaggaggaggaiOaiPaiQaiRaeQaeVaivahEadTagiaiSaiTacHaaaaaaaaaaaaaaaaijaijaiUaiVaiWaiXaiYaiZaiZajaajbajcajdajeajbajfajgajgajhajiajjajkajlaioaioaaaaaaaaaaaaaaaacZajmajnahjaenahQaiLahgafwafwafwafwafwafwafwafwafwafwafwagcaiLahSaenaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaadTaeOaivaePaeQaeRaggaggaggaggagdaiOaixaeRaeQaeVaivahEadTaiyahnaeWacHaaaaaaaaaaabaaaaaaaijaijaiiaizaiAaiBaiAaiCaiDabWabWafkabWabWaiEaiFaiGaiHaiGaiIainaioaioaaaaaaaabaaaaaaaaaacZaiJaipaiKaenahQaiLahgafwafwafwafwafwafwafwafwafwafwafwagcaiLahSaenaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaadTaeOaivaiMaeQaiRaggaggaggaggajYaiPaiQalZaeQaeVaivahEadTagiaiSaiTacHaaaaaaaaaaaaaaaaijaijaiUaiVaiWaiXaiYaiZaiZajaajbajcajdajeajbajfajgajgajhajiajjajkajlaioaioaaaaaaaaaaaaaaaacZajmajnahjaenahQaiLahgafwafwafwafwafwafwafwafwafwafwafwagcaiLahSaenaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajoajoajoajoajoajoajoajoajoajoajoajoajoadTadTajpaiMaeQaeRajqajrajqajqajsajtajuaeRaeQaeVajvadTadTadTahnajwacHaaaaaaaaaaaaaijaijaiUajxajyajzajAajAajAajBajCajDajEajFajGajDajHajIajJajJajJajKajLajMajlaioaioaaaaaaaaaaaaacZajNahxaenaenaenajOahgafwafwafwafwafwafwafwafwafwafwafwagcajPaenaenajQajQajQajQajQajQajQajQajQajQajQajQajQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRajRajSajSajSajTajSajSajTajSajSajSajUadTajVajWaiMaeQaeRajXahBajYajZakaakbakcaeRaeQaeVakdakeadTagiahnacHacHaaaaaaaaaaijaijaiUaiUakfaiUakgakhakhakhakhakhakhakhakhakhakhakhakhakiakiakiakjajlakkajlajlaioaioaaaaaaaaaacZacZahxahjaenaklakmahgafwafwafwafwafwafwafwafwafwafwafwagcaknakoaenakpakpakpakpakpakpakpakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRajRajSajSajSajTajSajSajTajSajSajSajUadTajVajWaiMaeQaeRajXahBamLajZakaakbakcaeRaeQaeVakdakeadTagiahnacHacHaaaaaaaaaaijaijaiUaiUakfaiUakgakhakhakhakhakhakhakhakhakhakhakhakhakiakiakiakjajlakkajlajlaioaioaaaaaaaaaacZacZahxahjaenaklakmahgafwafwafwafwafwafwafwafwafwafwafwagcaknakoaenakpakpakpakpakpakpakpakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRajSakraksaktakuakvakwakxakyakzakAakBadTaeOaivaePaeQahBahBaeRaeQaeQaeQaeRahBahBaeQaeVaivakCadTakDahnadfaaaaaaaaaaaaaijaiUajxajyakEakgakhakhakhakhakhakhakhakhakhakhakhakhakhakiakiakiakiakjakFajLajMajlaioaaaaaaaaaaaaadAahxakGaenahQakHahgafwafwafwafwafwafwafwafwafwafwafwagcaiLafyaenakpakIakpakpakpakpakpakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRakJakKakLakLakLakLakLakLakLakMakAakBadTakNaivaePaeQakOakPaeQaeQaeQaeQaeQakOakPaeQaeVaivahEadTakQahnadfaaaaaaaaaaiiaiiakRakfaiUakgakSakhakhakhakTakUakVakWakXakYakZakWalaalbalcaldaleakialfakjajlakkalgainainaaaaaaaaaadAahxalhaenahQakHahgafwafwafwafwafwafwafwafwafwafwafwagcaiLaliaenakpakpakpakpakpakpaljakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRajSakralkallalmakLalnaloalpalqakAakBadTaidalralsaltaltaltaltaltaltaltaltaltaltaltalualvaigadTalwahnadfaaaaaaaaaaiialxalyalzakgalAalAalAakhakhalBalBalBalBalBalCalDalEalEalFalGalHalIakiakiakiakjalJalKalLainaaaaaaaaaadAahxalMaenairalNalOalPalPalPalPalPalPalPalPalPalPalPalQalRaiuaenakpakpakpakpakpalSalTakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRajRajSajSajSajTalUalUajTajSajSajSalVadTaeOalWalXalXalYalXalXalXalZamaambamcamcamcamcamdahEadTameahnacHacHaaaaaaaijamfamgamhalAalAamiamjalAakhamkamlammamnamoamoampamqamramsamtakiamuakiamvakiakiamwamxamyaioaaaaaaacZacZahxamzaenahQamAamBamBamBamBamCamDamEamFamFamFamGamFamFamHahSaenakpakpakpakpamIakpakpakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaajoajoajoajoajoajoajoamJamJamKamKamKamKamKadTadTadTadTadTadTadTadTamLagiamMadTamNamNamNadTadTadTadTaeWamOamPacHaaaaaaaijamQamRamSamTamUamVamWalAakhalBamXamYamZamoamoanaanbancandaneanfanganhanianjakiamwankanlaioaaaaaaacZanmannanoaenaenaenahjanpanpanpahjanqahjanrahjaenaenaenaenaenaenaenansansansansansantantajQajQajQajQajQajQajQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajRajRajSajSajSajTalUalUajTajSajSajSalVadTaeOalWalXalXalYalXalXalXamMamaambamcamcamcamcamdahEadTameahnacHacHaaaaaaaijamfamgamhalAalAamiamjalAakhamkamlammamnamoamoampamqamramsamtakiamuakiamvakiakiamwamxamyaioaaaaaaacZacZahxamzaenahQamAamBamBamBamBamCamDamEamFamFamFamGamFamFamHahSaenakpakpakpakpamIakpakpakpakpakpakpakpakqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaajoajoajoajoajoajoajoamJamJamKamKamKamKamKadTadTadTadTadTadTadTadTayNagiazladTamNamNamNadTadTadTadTaeWamOamPacHaaaaaaaijamQamRamSamTamUamVamWalAakhalBamXamYamZamoamoanaanbancandaneanfanganhanianjakiamwankanlaioaaaaaaacZanmannanoaenaenaenahjanpanpanpahjanqahjanrahjaenaenaenaenaenaenaenansansansansansantantajQajQajQajQajQajQajQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafajoajoanuanvanwanxanyajoanzanzanAanBanCanDanEanFanGanHanIanJanJanKanFanLanLanManNanOanPanQanNanRaeWacHanSanTanUacHaaaaaaaijamfanVanWalAanXanYanXalAakhalBalBalBalBalBanZaoaaoaaoaaobaocaodaoeaofaogaohakiamwaoiamyaioaaaaaaacZaojafraokaolaomaonaooaopaoqaoraooaosaotaotaouaovaowaowaoxaoyaozaouaoAaoBaoCaoDaoEaoFaoFajQaoGaoHaoIaoJaoKajQajQaafaafaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaajoajoaoLaoLanvaoMaoNaoNaoOaoPaoQaoRaoSaoTaoUaoVanFanGaoWaoXanJanJanJanFaoYaoYaoZapaapbapcapdanNapeapfapgaphapiapjacHaaaaaaaiiapkanVaizalAaplapmaplalAakhapnapoappapqaprapsaptapqapuapvapwapxapyapzapAapBakiapCaoiapDainaaaaaaacZapEafrafrafrafrafrapFapGapHapIapJapKapLapLaouapMapNaowapOaoyaoyaouapPapQapRapSapTapUapVapWapXapXapXapXapXapXajQajQaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaajoapYanvajoajoajoajoajoajoapZaqaaqaaqaaqbaqcaqbanFaqdanJaoXaqeaqfaqganFaqhaqiaqjanNaqkaqlaqmanNaqnaqoaqpaqqaqraqsacHaqtaqtaquaqvaqwaiDakSaplapmaplalAakhakhakhakhakhakhakhakhakhakhakhakiakiakialcaqxaqyakiaqzaqAaqBaqCaqDaqDacZaqEafraqFaqFaqFaqFaooaqGaqHaqIaooaqJaqKaqLaouaqMaqNaqOapOaqPaoyaouapVaqQapVaqRaqRaqRansajQajQajQajQajQajQakpakpajQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10244,24 +10248,24 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaafaaaaaaaaaarUanvaukajoaqTaqTaqTaqTaqTaulaumaunauoaupareauqaurausautasdauuauraurauvauwareauxauraurauyaupauzaumauraupauAauBauCauDauEauraupauFauGauHauIaszauJauKauLauMauNauOarparqarqarqarqarqarrauPauQauRarvatPauSauTarrauUauVarBauWauXauYauZavaavbasUauWavcavdaveavfauXauXauXavgarJauWavhauXaviavjatbauWavkavlarJateauWavcavmavlavnarTarTarTarTarTajQavoakpatjaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaajoanvanvajoavpaqTaqTaqTaqTapZavqavraqaavsavtavuavvavwavuavxavuavuavuavuavyareavzaqaaqaaqaaqaaqaaqaaqaaqaaqaavAavBaqaavCavDarkauFarmareavEarnaroavFarnarnarnarnarpavGarqarqarqarqarravHavIavJarvarwarxarwarrarzarAarBarCarCavKarFavLavMarFarFarFarFavNavNavNavNavOarIarJarKavPavPavPavPavQavPavRavSavTavUavVavWarCavXarSavYarTarTarTarTajQavZakpajQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaajoawaanvajoajoajoajoajoajoapZaqaaqaaqaawbanvavuawcawdaweawfawgawdawhavuawiawjawkavAawlawmawnawoawoawpawqawrawsawtavAaqtaqtawuawvawwawxawyawzawAawBawCawyawDawEawFawFawGawHawIawFarrarrarrarrarrarrawJarrarrawKawLawMawNaqDaqDavMawOawPawQawRawSawTavNawUawVawWavNawXawYawZavPaxaaxbavPaxcaxdaxeavPaxfaxgaxfaxhaxhaxhaxiajQajQajQajQajQajQapXakpajQaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaajoajoanvanvanvanvaoLaoLaoLaoLaoLaxjaxkaxkaxlavuawcawdawdawfawdawdawhavuaxmaxnaxnaxoawnawnaxpaxpaxpaxpaxpaxpaxpaxqavAaaaaaaaxraxsaxtaxuaxvaxwaxxaxyaxyaxvaxzaxAaxBaxCaxDaxDaxDaxEaxFaxGaxHaxIaxJaxKaxLaxMaxJaxNaxOaxPaxQaaaaaaavMaxRawPaxSaxSaxSaxSaxTaxUaxVaxWaxXaxYaxZaxZavPayaaybaycaxcaydayeavPayfaygayhayiayjaykaylaymaynaynayoapXapXapXajQajQaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafajoajoaypaypayqayraysaytayuayvavsaywaywaywavuawcayxawdayyawdayzayAavuayBayCayCayDayDayDayDayDayDayDayDayEayFayGavAaaaaaaayHayIayJayKayLayMayNayOayPayQayRaySayTayTayUayTayVayWaxFayXayYayZazaazbazcazdaxJazeaxOazfazgaaaaaaavMazhawPaxSaziazjazjavNazkazlazmavNaosaotaotavPaznazoavPazpaybazqavPazrazsaztazuazvazwazwajQazxakpazyazzazAajQajQaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaajoajoaypazBazBazBazBazCazCazBazBazDazBazBazBazBazBazBazBazBazBazEazFazGazHayDazIazJazKazLazMazNayDavAazOazPavAaaaaaaayHazQazRazSaxvazTazUazVazWazXazYazZaAaaAbaAcaxDaAdaAeaxFaAfaAgaAhaAiaAjaAkaAlaxJazeaAmaAnazgaaaaaaavMaAoaApaxSaAqaAqaAqaAraAsaAsaAsaAraAtaAraAuaAraAqaAqaAqaAqaAqaAqaAqaxiaxiaxiaxiaxiaAvaAvajQajQajQajQajQajQajQaaaaaaaaaaddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavsajRazCaAwaAxaAyaAzaAAaABaACaADaAEaAAaAFaAGaAHaAIaAJaAKaALaAMaANaAOaAOaAPaAQaARaASaASaASaATayDaAUaAVavAavAaaaaaaayHaAWaAXaAYaAZaAZawyawyawyawyaBaaBbaBcaBdaBeaBfaBgaBhaBiaBjaBkaBlaxJaBmaBnaxJaxJazeaBoazfazgaaaaaaavMavMaBpaBqaAqaBraBsaBtaBtaBtaBtaBuaBvaBwaBxaBxaBxaByaBxaBxaBzaBAaAqaBBaBCaBCaBCaBDaBEaBEaBFaBCaBCaBCaBGaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaajoajoanvanvanvanvaoLaoLaoLaoLaoLaxjaxkaxkaxlavuawcawdawdawfawdawdawhavuaxmaxnaxnaxoawnawnaxpaxpaxpaxpaxpaxpaxpaxqavAaaaaaaaxraxsaxtaxuaxvaxwaxxaxyaAtaxvaxzaxAaxBaxCaxDaxDaxDaxEaxFaxGaxHaxIaxJaxKaxLaxMaxJaxNaxOaxPaxQaaaaaaavMaxRawPaxSaxSaxSaxSaxTaxUaxVaxWaxXaxYaxZaxZavPayaaybaycaxcaydayeavPayfaygayhayiayjaykaylaymaynaynayoapXapXapXajQajQaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaafaafajoajoaypaypayqayraysaytayuayvavsaywaywaywavuawcayxawdayyawdayzayAavuayBayCayCayDayDayDayDayDayDayDayDayEayFayGavAaaaaaaayHayIayJayKayLayMaAuayOayPayQayRaySayTayTayUayTayVayWaxFayXayYayZazaazbazcazdaxJazeaxOazfazgaaaaaaavMazhawPaxSaziazjazjavNazkaBwazmavNaosaotaotavPaznazoavPazpaybazqavPazrazsaztazuazvazwazwajQazxakpazyazzazAajQajQaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaajoajoaypazBazBazBazBazCazCazBazBazDazBazBazBazBazBazBazBazBazBazEazFazGazHayDazIazJazKazLazMazNayDavAazOazPavAaaaaaaayHazQazRazSaxvazTazUazVazWazXazYazZaAaaAbaAcaxDaAdaAeaxFaAfaAgaAhaAiaAjaAkaAlaxJazeaAmaAnazgaaaaaaavMaAoaApaxSaAqaAqaAqaAraAsaAsaAsaAraGhaAraGKaAraAqaAqaAqaAqaAqaAqaAqaxiaxiaxiaxiaxiaAvaAvajQajQajQajQajQajQajQaaaaaaaaaaddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavsajRazCaAwaAxaAyaAzaAAaABaACaADaAEaAAaAFaAGaAHaAIaAJaAKaALaAMaANaAOaAOaAPaAQaARaASaASaASaATayDaAUaAVavAavAaaaaaaayHaAWaAXaAYaAZaAZawyawyawyawyaBaaBbaBcaBdaBeaBfaBgaBhaBiaBjaBkaBlaxJaBmaBnaxJaxJazeaBoazfazgaaaaaaavMavMaBpaBqaAqaBraBsaBtaBtaBtaBtaBuaBvaJyaBxaBxaBxaByaBxaBxaBzaBAaAqaBBaBCaBCaBCaBDaBEaBEaBFaBCaBCaBCaBGaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavsajRazCaBHaBIaBJaBKaBKaBLaBMaBMaBNaBOaBPaBQaBQaBRaADaBSaBTaBUaBVaBWaBXaBYaBZaCaaCbaASaASaCcaCdaAUaAVaCeaaaaaaaaaaxraCfaCgaChaCiawFawFaCjaCjaCkaClaCmaxDaxDaxDaCnaAdaCoaCpaCqaCraCsaxJaxJaxJaxJaCtaCuaCvaCwaxQaaaaaaaaaaCxaBpaCyaAqaCzaCAaCBaCCaCCaCCaCCaCCaCCaCCaCCaCCaCCaCCaCDaCEaCFaAqaCGaCHaCIaCJaCKaCLaCMaCNaCOaCPaCQaBCaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavsajRazCaBHaCRaCSaCTaCTaCTaCTaCTaCSaCUaCVaADaADaCWaADaADaCXaCYaCZaDaaAOaDbaASaASaDcaDdaDeaDfayDaAUaAVaCeaaaaaaaaaaxraxraDgaxuaxuaCiaCkawFaCjaCkaDhaDiaDjaDkaxDaDlaDmaDnaxFaDoaDpaDpaDqaxJaDraCtaDsaDtaDuaxQaxQaaaaaaaaaaCxaBpaDvaAqaBraDwaDxaDyaDzaDAaDyaDyaDyaDyaDyaDzaDAaDyaDBaDwaDCaAqaCGaCHaDDaCMaCMaCMaCMaCMaCMaCMaDEaDFaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavsajRazCaBHaCRaCTaCTaCTaCTaCTaCTaCTaCUaDGaADaADaCWaADaADaDHazGaDIaDJaAOaDKaDLaDMaDNaDOaDPaDQayDavAaDRaCeaaaaaaaaaaaaayHaxuaxuaxuaxuaCiawFawFawFaDSawFaDTaClaxDaxDaDUaClaDVaDWaDXaDYaxFaxFaCtaDZaEaaEbaDsazgaaaaaaaaaaaaaCxaBpaEcaAqaBraDwaDxaDyaEdaEdaEeaDyaDyaDyaEeaEdaEdaDyaDBaDwaEfaAqaCGaCHaEgaEhaEiaEjaEkaElaEmaEnaCQaBCaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavsajRazCaEoaCRaCTaCTaCTaCTaCTaCTaCTaEpaEqaEqaEqaCWaADaADaErazGaEsaEtaEuaBYaBYaDKaEvaBYaBYaBYaBYaEwawtavAavAaaaaaaaaaayHayHaxuaxuaxuaxuaCiaExaEyaEyaEyaEzaEAaEBaECaEDaEEaxFaxFaxFaxFaxFaCtaDsaDtaDsaDsazgazgaaaaaaaaaavMavMaBpaAraAqaEFaEGaDxaDyaEeaEHaEIaEJaEKaELaEMaENaEeaDyaDBaEOaEPaAqaEQaBCaBCaBCaBDaBCaBCaBFaBCaBCaBCaBGaBGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajoajoazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaERaERaERaESaCWaADaADaETaBUaEUaEtaEVaEWaEXaAOaEYaBUaAUaEZaFaaxpawtaFbavAaaaaaaaaaaaaayHayHaxuaxuaxuaChaFcaFcaFcaFdawxaFeaFfaFgaFhaFiaFjaFkaFlaFlaFlaFmaEaaEbaDsazgazgaaaaaaaaaaaaavMaFnaBpaAqaAqaAqaFoaDxaDyaEeaFpaFqaFraFsaFsaFtaFsaEeaDyaDBaFuaAqaAqajQajQajQajQajQajQajQajQajQajQajQajQajQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaFvaFwaFxaFwaFyaBQaBQaFzaFAaFBaFCaFDaFEaFFaFEaFGaFHaAUaEZaxpaxpaFIaFJavAaaaaaaaaaaaaaaaayHayHaxuaFKaFLaFMaFNaFOaFOaFPaFQaFRaFSaFTaFQaFUaFVaFVaFWaFXaFYaFZaDsazgazgaaaaaaaaaaaaaaaavMaGaaGbaAraAqaBraDwaDxaDyaGcaGdaGeaGfaGgaGgaGgaGgaGhaDyaDBaDwaBAaAqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaazBaGiaCRaCTaCTaCTaCTaCTaCTaCTaCUaADaADaGjaCWaGkaGlaGmaGnaGoaGpaGqaGraGsaGtaGuaBUaAUaGvaGwaxpawtaGxavAaaaaaaaaaaabaaaaaaayHayHaxrazSaGyaGzaGyaGAawxaFeaFeaGBaFeaFeaGCaGDaGEaGFaGEaGGaxQazgazgaaaaaaaabaaaaaaaaaavMaGHaBpaGIaAqaBraDwaDxaDyaEeaGJaGKaGLaGgaGgaGgaGgaEeaDyaDBaDwaBAaAqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaFvaFwaFxaFwaFyaBQaBQaFzaFAaFBaFCaFDaFEaFFaFEaFGaFHaAUaEZaxpaxpaFIaFJavAaaaaaaaaaaaaaaaayHayHaxuaFKaFLaFMaFNaFOaFOaFPaFQaFRaFSaFTaFQaFUaFVaFVaFWaFXaFYaFZaDsazgazgaaaaaaaaaaaaaaaavMaGaaGbaAraAqaBraDwaDxaDyaGcaGdaGeaGfaGgaGgaGgaGgaKvaDyaDBaDwaBAaAqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaazBaGiaCRaCTaCTaCTaCTaCTaCTaCTaCUaADaADaGjaCWaGkaGlaGmaGnaGoaGpaGqaGraGsaGtaGuaBUaAUaGvaGwaxpawtaGxavAaaaaaaaaaaabaaaaaaayHayHaxrazSaGyaGzaGyaGAawxaFeaFeaGBaFeaFeaGCaGDaGEaGFaGEaGGaxQazgazgaaaaaaaabaaaaaaaaaavMaGHaBpaGIaAqaBraDwaDxaDyaEeaGJaKxaGLaGgaGgaGgaGgaEeaDyaDBaDwaBAaAqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaGMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaEpaEqaGNaEqaGOazBazBazBazEazEazEaGPaGQaGRaGQaGQaBUavAavAavAavAawtaGSaGTaGTaGTaaaaaaaaaaaaaaaaaaaxraxrayHayHayHaxraxraGUaGVaGBaGWaGUaxQaxQazgazgazgaxQaxQaaaaaaaaaaaaaaaaaaaGXaGXaGXaGYaBpaGZaAqaCzaHaaDxaDyaEeaEeaEeaEdaHbaGLaEeaEeaEeaDyaDBaHcaCFaAqaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaHdaHdaHdaHeaHfazBaHgaHgaHgaHgaHgaGPaHhaHiaHjaGQaHkaHkaHkaHkavAawtaGSaHlaHmaGTaGTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHnaGUaHoaGBaHpaHqaHnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaGXaHraHsaGYaBpaxSaAqaBraHtaDxaDyaDyaEeaHuaGgaGgaHvaHwaEeaDyaDyaDBaHtaBAaAqaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaFvaFwaFwaFwaCWaHxaHgaHgaHgaHgaHgaGPaHyaHzaHAaGQaHBaxpaxpaxpaHCawtaHDaHEaHFaHGaGTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaHnaHHaHIaHJaHKaHLaHnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaGXaHMaHNaHOaHPaBpaHQaAqaBraHtaDxaDyaDyaEdaHRaGgaGgaGgaHSaEdaDyaDyaDBaHtaBAaAqaAraaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaazBaHTaCRaCTaCTaCTaCTaCTaCTaCTaCUaADaADaADaCWaHUaHgaHgaHgaHgaHgaGPaHVaHWaHXaGQaxpaxpaxpaHYavAaHZaGSaIaaHFaIbaGTaaaaaaaaaaaaaIcaIdaIeaIdaIfaaaaaaaIgaIgaIhaGBaIiaIjaIjaIjaIjaIjaIjaIkaIkaIkaIjaIjaIjaIjaGXaIlaHNaImaGYaBpaAraAqaAqaInaIoaDyaDyaGLaIpaIpaGgaIpaIpaGLaDyaDyaDBaIqaAqaAqaAqaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaCUaIraADaADaCWaIsaHgaHgaHgaHgaHgaGPaGQaItaGQaGQaIuaIvaIwaIxaIxaIyaGSaIzaHFaIAaGTaaaaaaaaaaaaaIBaICaIDaIEaIBaaaaaaaaaaIgaIFaGBaFeaIGaIHaIIaIJaIKaIkaILaIMaINaIOaIPaIQaIjaIRaISaHNaHOaGYaITaAqaAqaIUaIVaIoaDyaDyaEeaEeaGLaHbaGLaEeaEeaDyaDyaDBaIWaIXaAqaAraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaazBaBHaCRaCSaCTaCTaCTaCTaCTaCSaCUaIYaIZaJaaJbazBaJcaHgaHgaHgaHgaIxaAUaAUaAUavAavAavAavAaIxaJdaHZaGSaGSaJeaGSaGTaJfaJfaJfaJgaIBaJhaJiaJjaIBaJkaJfaJfaJfaFeaGBaFeaIjaIHaJlaJmaJnaJoaJpaJqaJraJsaJtaIQaIjaGYaGYaJuaGYaGYaJvaAraAqaJwaJxaIoaDyaDyaGLaJyaJzaGgaJzaJyaGLaDyaDyaDBaJxaBAaAqaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaazBaJAaJBaJCaJDaJDaJEaJFaJFaJGaJHaJIazCazCazCazBaIxaIxaIxaIxaIxaIxaJJaJJaJJaJKaJLavAaJMaJNaxpaJOaJPaJQaJRaJSaJTaJfaJUaJVaJWaJXaJYaJZaJYaJXaKaaKbaKcaJfaKdaKeaKdaIjaKfaKgaKhaKiaKjaKkaKlaINaKmaKnaIQaIjaKoaKpaKqaKraKsaKtaxSaKuaJxaJxaDxaDyaDyaEeaEMaKvaKwaKxaEMaEeaDyaDyaDBaJxaBAaAqaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaazBaBHaCRaCTaCTaCTaCTaCTaCTaCTaCUaIraADaADaCWaIsaHgaHgaHgaHgaHgaGPaGQaItaGQaGQaIuaIvaIwaIxaIxaIyaGSaIzaHFaIAaGTaaaaaaaaaaaaaIBaICaIDaIEaIBaaaaaaaaaaIgaIFaGBaFeaIGaIHaIIaIJaIKaIkaILaIMaINaIOaIPaIQaIjaIRaISaHNaHOaGYaITaAqaAqaIUaIVaIoaDyaDyaEeaEeaGLdnMaGLaEeaEeaDyaDyaDBaIWaIXaAqaAraaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaazBaBHaCRaCSaCTaCTaCTaCTaCTaCSaCUaIYaIZaJaaJbazBaJcaHgaHgaHgaHgaIxaAUaAUaAUavAavAavAavAaIxaJdaHZaGSaGSaJeaGSaGTaJfaJfaJfaJgaIBaJhaJiaJjaIBaJkaJfaJfaJfaFeaGBaFeaIjaIHaJlaJmaJnaJoaJpaJqaJraJsaJtaIQaIjaGYaGYaJuaGYaGYaJvaAraAqaJwaJxaIoaDyaDyaGLaKwaJzaGgaJzaKwaGLaDyaDyaDBaJxaBAaAqaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaazBaJAaJBaJCaJDaJDaJEaJFaJFaJGaJHaJIazCazCazCazBaIxaIxaIxaIxaIxaIxaJJaJJaJJaJKaJLavAaJMaJNaxpaJOaJPaJQaJRaJSaJTaJfaJUaJVaJWaJXaJYaJZaJYaJXaKaaKbaKcaJfaKdaKeaKdaIjaKfaKgaKhaKiaKjaKkaKlaINaKmaKnaIQaIjaKoaKpaKqaKraKsaKtaxSaKuaJxaJxaDxaDyaDyaEeaEMdMzdqEdMAaEMaEeaDyaDyaDBaJxaBAaAqaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafazBazBaKyaKzaKAaKAaKBaKAaKAaKCaKDaADazDaAUaKEaxpaxpaxpaKFaxpaxpaxpaxpaxpaKGaxpaxpaKHaxpaxpaxpaxpaxpaxpaxpaHZaKIaJfaKJaKJaKKaKLaKMaKNaKOaKPaKQaKJaKRaJfaGVaGBaKSaIjaKTaKUaKVaKWaKXaKWaKYaKZaLaaLbaLcaIjaLdaLeaLfaLgaLhaLiaxSaAqaJxaJxaDxaDyaDyaDyaEeaLjaLkaLlaEeaDyaDyaDyaDBaJxaBAaAqaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaazBazBazBazBazBazBazBazBazBazBazBazBaAUaKEaIxaCeaCeaCeaCeaCeaIxaLmaLnaIxaIxaIxaIxaIxaIxaIxaCeaCeaxpaxpawtaLoaJfaLpaKJaLqaLraLraLsaLtaLtaLuaKJaLvaJfaLwaLxaLyaIjaLzaLAaLBaLCaLDaLEaLFaLGaLHaLIaLJaIjaLKaLLaLMaLNaCxaCxaLOaAqaAqaJxaLPaLQaLQaLQaLQaLQaLQaLQaLQaLQaLQaLQaLRaJxaAqaAqaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaazBaIxaIxaIxaaaaaaaaaaaaaaaaIxaIxaIxaIxaaaaaaaaaaafaaaaaaaaaaCeaCeaxpawtawoaJfaLSaLTaLUaLVaLWaLXaLYaLZaMaaMbaJYaMcaMdaMeaHpaIjaIjaMfaMgaMhaIkaMiaMjaMkaMlaMmaMnaIjaMoaMpaMqaCxaCxaaaaaaaaaaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaAqaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10567,7 +10571,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkaaaaaaaaaaaaaaadmUdnhdnidnjaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaadnkdnldnmdnndnkaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaadnodnpdnqdneaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkdlkdlkaaaaaaaaadnjdmUdnrdnidnsaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaadntdnldnmdnndntaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaadnudnpdnvdnednoaaaaaaaaadnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkdlkdlkdnxdnydnjdnjdnzdnAdnBdnjaaaaaaaafaaaaaadnCdnCdnCdnCdnCdnCdnCaaaaaaaafaaaaaadnkdnldnDdnEdnkaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaadnodnFdnGdnHdnodnodnIdnJdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkdlkdlkdnKdnLdnMdnNdnOdnPdnQdmUaaaaaaaafaaadnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaafaaaaaadmYdnRdnmdnSdmYaaaaaaaafaaaaaadnTdnUdnUdnUdnUdnUdnTaaaaaaaafaaaaaadnednVdnWdnXdnYdnZdoadobdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkdlkdlkdnKdnLdMBdnNdnOdnPdnQdmUaaaaaaaafaaadnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaafaaaaaadmYdnRdnmdnSdmYaaaaaaaafaaaaaadnTdnUdnUdnUdnUdnUdnTaaaaaaaafaaaaaadnednVdnWdnXdnYdnZdoadobdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkdlkdlkdnydocdoddoedofdogdohdnjaaaaaaaafaafdnCdnCdnCdnCdnCdnCdnCdnCdnCaafaafaaaaaadnkdnndnmdnndnkaaaaaaaafaafdnTdoidojdojdojdojdojdoidnTaafaafaaaaaadnodokdoldomdondoodopdnIdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkdlkdlkdlkdlkdlkdlkaaaaaaaaadnjdnjdnhdoqdnjaaaaaadMqaaadnCdnCdnCdnCdnCdnCdnCdnCdnCaaadMqaaaaaadnkdnndnmdnndnkaaaaaadMqaaadnUdordosdosdojdosdosdordnUaaadMqaaaaaadnodotdnqdnodnoaaaaaaaaadnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwdnwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlNdlNdlNdlNdlNdlNdlNdlNdlNaaaaaadlOdlOdlOdlOdlOdlOdlOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlkdlkdlkaaaaaaaaadlkdlkdlkaaaaaaaaaaaadnjdnhdoudnjaaaaaaaafaaadnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaafaaaaaadnkdovdnmdnndnkaaaaaaaafaaadnTdojdowdojdojdojdowdojdnTaaaaafaaaaaadnodoxdnqdnoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10577,7 +10581,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnjdnhdpwdpbdpxdpydpzdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdpAdpBdpCdpidpDdnmdpkdpldpEdpFdpodoDdojdojdpGdpHdojdpGdpHdojdojdoDdppdpIdpJdpsdptdnqdnoaaaaaaaaaaaadpvdpvdpvaaaaaaaaadpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKaaaaaaaaaaaadnjdnjdpLdpMdoedpNdpOdnydnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdoSdpPdpQdoOdpRdpSdpTdnkdnkdoSdoSdpUdpVdojdpGdpHdpWdpGdpHdojdpXdpUdnIdnIdoVdnodpYdpZdnodnoaaaaaaaaadpvdpvdpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdqadqbdqcdoedqddogdohdqednjaaaaaadnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaaadnkdqfdnndnmdnndqgdnkaaaaaadnUdqhdojdpGdqidojdqjdpHdojdqkdnUaaaaaadnodqldokdoldqmdondqndqodnIdpvdpvdpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdqpdqqdqrdqsdqtdnPdoqdqudmUaaaaaadnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaaadmYdqvdnndqwdnndqxdmYaaaaaadnUdqydojdpGdqidMvdqjdpHdojdqAdnUaaaaaadnedqBdotdnWdqCdqDdqEdqFdqGdpvdpvdpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdqpdqqdqrdqsdqtdnPdoqdqudmUaaaaaadnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaaadmYdqvdnndqwdnndqxdmYaaaaaadnUdqydojdpGdqidMvdqjdpHdojdqAdnUaaaaaadnedqBdotdnWdqCdqDdMCdqFdqGdpvdpvdpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdnydnydnjdnjdqHdqIdqJdqednjaaaaaadnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCaaaaaadnkdqfdnndqKdqLdqgdnkaaaaaadnUdqhdojdpGdqidojdqjdpHdojdqkdnUaaaaaadnodqldqMdqNdqOdnodnodnIdnJdpvdpvdpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadpKdpKdpKdpKdpKdpKdpKdpKdpKdpKdpKaaaaaaaaaaaadnjdnjdqPdqQdoedoJdoKdnydnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdoSdoMdoNdoOdqRdqSdqTdnkdnkdoSdoSdpUdpVdojdpGdpHdojdpGdpHdojdpXdpUdnIdnIdoVdnodqUdqVdnodnoaaaaaaaaadpvdpvdpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnjdnhdqWdqXdqYdqZdradnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdnCdrbdrcdrddredpDdrfdpkdpldrgdpndpodoDdojdojdpGdpHdojdpGdpHdojdojdoDdppdpqdrhdpsdridnqdnoaaaaaaaaaaaaaaadpvdpvdpvdpvdpvdpvdpvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm
index e21fd0b5fe..b378e1e391 100644
--- a/maps/southern_cross/southern_cross-3.dmm
+++ b/maps/southern_cross/southern_cross-3.dmm
@@ -1036,7 +1036,7 @@
"tV" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/surface/outpost/main)
"tW" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/computer/guestpass{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/tiled,/area/surface/outpost/main)
"tX" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/engineering{name = "Generator Room"; req_one_access = list(12,47)},/turf/simulated/floor/plating,/area/surface/outpost/main/gen_room)
-"tY" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel/sif/planetuse,/area/surface/center)
+"tY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_dock_1"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = -26; tag_door = "mining_dock_1_door"},/turf/simulated/floor/outdoors/dirt/sif/planetuse,/area/surface/north)
"tZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel/sif/planetuse,/area/surface/outpost/main)
"ua" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/surface/outpost/main)
"ub" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor/tiled,/area/surface/outpost/main)
@@ -1744,6 +1744,22 @@
"HB" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/turf/simulated/floor/reinforced,/area/surface/outpost/research/xenoresearch/xenobiology)
"HC" = (/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/surface/outpost/research/xenoresearch/xenobiology)
"HD" = (/obj/effect/wingrille_spawn/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "xenobio2"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/window/reinforced/full,/turf/simulated/floor/plating,/area/surface/outpost/research/xenoresearch/xenobiology)
+"HE" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "mining_dock_2"; name = "shuttle bay controller"; pixel_x = 0; pixel_y = -26; tag_door = "mining_dock_2_door"},/turf/simulated/floor/outdoors/snow/sif/planetuse,/area/surface/north)
+"HF" = (/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/outpost/mining_main/gen_room)
+"HG" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HH" = (/obj/machinery/light{dir = 1},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/outpost/mining_main/gen_room)
+"HI" = (/obj/effect/floor_decal/industrial/warning,/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HJ" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HK" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HL" = (/turf/simulated/floor/plating/sif/planetuse,/area/shuttle/shuttle1/mining)
+"HM" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HN" = (/turf/simulated/floor/plating/sif/planetuse,/area/shuttle/shuttle2/mining)
+"HO" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HP" = (/obj/machinery/light,/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/outpost/mining_main/gen_room)
+"HQ" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HR" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/effect/overlay/snow/floor,/turf/simulated/floor/plating/sif/planetuse,/area/surface/north)
+"HS" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "surface_dock_1"; name = "shuttle bay controller"; pixel_x = 26; pixel_y = 0; tag_door = "surface_dock_1_door"},/turf/simulated/floor/outdoors/dirt/sif/planetuse,/area/surface/center)
+"HT" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "surface_dock_2"; name = "shuttle bay controller"; pixel_x = -26; pixel_y = 0; tag_door = "surface_dock_2_door"},/turf/simulated/floor/tiled/steel/sif/planetuse,/area/surface/center)
(1,1,1) = {"
aaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadaeaeaeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafaf
@@ -1783,25 +1799,25 @@ aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagkOkOkOkOkOkO
aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagkOkOkOkOkOkOkOkOkOagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaroMoNoNaraqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagkOkOkOkOkOkOkOagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananananananananananananananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagkOkOkOkOkOagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananananananananananananananananananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqaqaqaqananananananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqanananananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananankPkPanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
-aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqaqaqaqanananananananantYanananananananananananananananananananaqaqaqaqHEaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqanananananananananankQHFanananananananananHFkQHFananananananananaqHFkQaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananaqaqaqaqaqaqanananananaqaqaqaqananHHHGHIHIHIHIHIHIHIHIHIHJHHHGHIHIHIHIHIHIHIHIHIHJHHaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqananananaqaqaqaqaqaqaqananHKararHLHLHLHLHLararHMiwHKHNHNarararararHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqananananaqaqaqaqaqaqaqaqaqaqHKarHLHLHLHLHLHLHLarHMiwHKHNHNHNarararHNHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananankPkPanananaqaqaqaqaqaqaqaqaqaqaqHKarHLHLHLHLHLHLHLarHMiwHKHNHNHNHNHNHNHNHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananananananaqaqaqaqaqaqaqaqaqaqaqaqHKarHLHLHLHLHLHLHLarHMiwHKHNHNHNHNHNHNHNHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananananaqaqaqaqaqaqaqaqaqaqaqaqHKarHLHLHLHLHLHLHLarHMiwHKHNHNHNHNHNHNHNHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqHKarHLHLHLHLHLHLHLarHMiwHKHNHNHNHNHNHNHNHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqHKarHLHLHLHLHLHLHLarHMiwHKHNHNHNHNHNHNHNHNHNHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLHLHLHLHLHLHLHLHMiwHKarHNHNHNHNHNHNHNarHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLHLHLHLHLHLHLHLHMiwHKarHNHNHNHNHNHNHNarHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLHLHLHLHLHLHLHLHMiwHKarHNHNHNHNHNHNHNarHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLHLHLHLHLHLHLHLHMiwHKarHNHNHNHNHNHNHNarHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLHLHLHLHLHLHLHLHMiwHKarHNHNHNHNHNHNHNarHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLHLarararHLHLHLHMiwHKarHNHNHNHNHNHNHNarHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqHKHLHLarararararHLHLHMiwHKararHNHNHNHNHNararHMaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqHPHOHQHQHQHQHQHQHQHQHQHRHPHOHQHQHQHQHQHQHQHQHQHRHPaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
+aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqanananaqaqaqaqaqaqaqaqaqaqaqaqaqaqkQHFaqaqaqaqaqaqaqaqaqHFkQHFaqaqaqaqaqaqaqaqaqHFkQaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
aaagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagfUaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqananaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqajajajajajajajajajajajajajajajajajajajajajajajajaiaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoap
@@ -1872,7 +1888,7 @@ oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoU
oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUpkpkpkpkpkpkpnpnpkpkpkpkpkpkpkpkpkstpqprprprprprpqpqpqpqpqpqpqpqoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapasusvswswswswswswswsvsxpapaoWoWrprqrqrqtbrTtcrTrVrvrWsmtdrttetftgthtitjtktlrupapapapasusKsKsKsKsKsKsKsKsKsxpapapapapapapapapapapapapapapqpqprprpqpqpqpqpapapapapapapapapapapapapapapapapapapcpdpdpdpdpdpdpdpdpdpdpdpdpdphphphphphphphpepepepepepepepepepepepipbpbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUpkpkpkpkpkpkpnpnpnpnpnpkpkpkpkpkstpqpqpqpqpqpqpqpqpqpqpqoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapasusvswswswswswswswsvsxpapaoWoWrvrwrxtmtntotptqtrtstttutvrttwtftxtytztAtBtCrupapapapasusKsKsKsKsKsKsKsKsKsxpapapapapapapapapapapapapapapapqpqprprpqpqpqpapapapapapapapapapapapapapapapapapapcpdpdpdpdpdpdpdpdpdpdphphphphphphphphphphpepepepepepepepepepepepipbpbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUpkpkpkpkpkpkpkpkpnpnpkpkpkpkstpqpqpqpqpqpqpqoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapapapasusvswswswswswswswsvsxpapaoWoWrptDtErqrqrqrqrqrprptFtGtHrurutItJtKsptLtMtNrupapapapasusKsKsKsKsKsKsKsKsKsxpapapapapapapapapapapapapapapapqpqpqprprpqpqpqpapapapapapapapapapapapapapapapapapcpdpdpdpdpdpdpdphphphphphphphphphphphphphpepepepepepepepepepepepipbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
-oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUpkpkpkpkpkpkpkpkpkpkpkstpqpqoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapapapapapapapapasusvswswswswswswswsvsxoWpaoWoWrOrOrOrOtOtPtQtRrOtStTtUtVtWrurtrttXrtrOrOrOrOtYpapapasusKsKsKsKsKsKsKsKsKsxpapapapapapapapapapapapapapapapapqpqpqprprpqpqpapapapapapapapapapapapapapapapapapcpdpdpdpdphphphphphphphphphphphphphphphphpepepepepepepepepepepepipbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
+oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUpkpkpkpkpkpkpkpkpkpkpkstpqpqoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapapapapapapapapasusvswswswswswswswsvsxoWpaoWHSrOrOrOrOtOtPtQtRrOtStTtUtVtWrurtrttXrtrOrOrOrOHTpapapasusKsKsKsKsKsKsKsKsKsxpapapapapapapapapapapapapapapapapqpqpqprprpqpqpapapapapapapapapapapapapapapapapapcpdpdpdpdphphphphphphphphphphphphphphphphpepepepepepepepepepepepipbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUpkpkpkpkpkoUoUoUoPoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapapapapapapapapapapapasusvswswswswswswswsvsxoWoWoWtZuaubucudueufrWrWtFrWuguhuiujukulumunuoupuqurusutuuuuuuuvsKsKsKsKsKsKsKsKsKsxoWpapapapapapapapapapapapapapapapqpqpqprprpqpqpqpapapapapapapapapapapapapapapapapcpdpdphphphphphphphphphphphphphphphphphpepepepepepepepepepepeplpmpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoPoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapapapapapapapapapapapapapasuswswswswswswswswswsxoWoWoWuwuxuyuzuAuBuCuDuEuFuGuHuIuJuGuFuKuLuMuNuOuPuQuRtZoWoWoWuSsvsKsKsKsKsKsKsKsvsxoWoWpapapapapapapapapapapapapapapapqpqpqprpqpqpqpapapapapapapapapapaoWoWoWoWoWoWoQphphphphphpdpdpdpdpdpdpdphphphphphphphpepepepepepepepepepeplpmpbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
oTqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhqhoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoUoPoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVpapapapapapapapapapapapapapapapapapapapasuswswswswswswswswswsxpaoWoWuTrOuUuVrOuWuXuYuZtFrWvavbvcrWtFrWvdvevfrOvgvhrOvioWoWoWuSsvsKsKsKsKsKsKsKsvsxoWoWoWoWoWpapapapapapapapapapapapapqpqpqprprpqpqpqpapapapapapaoWoWoWoWoWoWoWoWoWoQphphphpdpdpdpdpdpdpdpdpdpdphphphphphphpepepepepepepepepepepipbpbpbpbpbpbpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjpjoZ
diff --git a/maps/southern_cross/southern_cross-6.dmm b/maps/southern_cross/southern_cross-6.dmm
index 810667d277..7f5fb18a45 100644
--- a/maps/southern_cross/southern_cross-6.dmm
+++ b/maps/southern_cross/southern_cross-6.dmm
@@ -338,13 +338,13 @@
"gz" = (/obj/structure/table/reinforced,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"gA" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"gB" = (/obj/structure/table/reinforced,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/obj/item/device/paicard,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"gC" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_ship"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"gC" = (/turf/simulated/shuttle/wall/dark/no_join,/area/centcom/specops)
"gD" = (/obj/structure/table/rack,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/storage/backpack/security,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/shoes/galoshes,/obj/item/clothing/head/bio_hood/janitor,/obj/item/clothing/suit/bio_suit/janitor,/obj/item/clothing/gloves/purple,/obj/item/clothing/glasses/science,/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/cleaner{pixel_x = 6; pixel_y = 3},/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/reagent_containers/spray/plantbgone,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gE" = (/obj/item/weapon/mop,/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gF" = (/obj/structure/reagent_dispensers/watertank,/obj/item/weapon/reagent_containers/glass/bucket{amount_per_transfer_from_this = 50},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gG" = (/obj/structure/sign/greencross{desc = "White cross in a green field, you can get medical aid here."; name = "First-Aid"},/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops)
"gH" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
-"gI" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_centcom_dock_door"; locked = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
+"gI" = (/obj/machinery/computer/shuttle_control/web/ert{tag = "icon-flightcomp_center (EAST)"; icon_state = "flightcomp_center"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"gJ" = (/obj/item/weapon/circuitboard/aiupload,/obj/item/weapon/circuitboard/borgupload,/obj/item/weapon/circuitboard/smes,/obj/item/weapon/aiModule/nanotrasen,/obj/item/weapon/aiModule/reset,/obj/item/weapon/aiModule/freeformcore,/obj/item/weapon/aiModule/protectStation,/obj/item/weapon/aiModule/quarantine,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/obj/item/weapon/aiModule/safeguard,/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gK" = (/obj/machinery/vending/assist,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gL" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -363,7 +363,7 @@
"gY" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"gZ" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/response_ship/start)
"ha" = (/turf/simulated/shuttle/wall/dark{join_group = "shuttle_ert"},/area/shuttle/response_ship/start)
-"hb" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_port_hatch"; locked = 1; name = "Port Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hb" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_shuttle"; pixel_x = 0; pixel_y = -25; tag_door = "response_shuttle_door"},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hc" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hd" = (/obj/structure/closet/crate/medical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"he" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
@@ -385,10 +385,10 @@
"hu" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/table/rack,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_vest,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/obj/item/clothing/accessory/storage/white_drop_pouches,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hv" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/response_ship/start)
"hw" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hx" = (/obj/machinery/computer/shuttle_control/multi/response,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hx" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_base_door"; locked = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops)
"hy" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hz" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_fore"; name = "forward docking hatch controller"; pixel_x = 0; pixel_y = -25; tag_door = "specops_shuttle_fore_hatch"},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hA" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_fore_hatch"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hz" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "response_shuttle_door"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hA" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "response_base"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "response_base_door"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops)
"hB" = (/obj/structure/reagent_dispensers/watertank,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hC" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hD" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/steel{amount = 50; pixel_x = 2; pixel_y = 2},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/plasteel{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/stack/material/glass/reinforced{amount = 50},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 3},/obj/structure/table/steel_reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -405,11 +405,11 @@
"hO" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hP" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/command,/obj/item/clothing/head/helmet/ert/command,/obj/item/weapon/storage/backpack/ert/commander,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hQ" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
-"hR" = (/obj/item/device/radio/intercom/specops{pixel_y = -21},/obj/structure/table/reinforced,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hS" = (/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hR" = (/obj/item/device/radio/intercom/specops{pixel_y = -21},/obj/machinery/computer/communications,/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hS" = (/obj/structure/flight_right{tag = "icon-right (EAST)"; icon_state = "right"; dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hU" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
-"hV" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "response_shuttle"; pixel_x = 0; pixel_y = -25; req_access = list(103)},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
+"hV" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"hW" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/red,/area/shuttle/response_ship/start)
"hX" = (/obj/structure/reagent_dispensers/fueltank,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
"hY" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops)
@@ -959,7 +959,7 @@
"sw" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_5_recovery_hatch"; locked = 1; name = "Recovery Shuttle Dock 5"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/centcom/evac)
"sx" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 3},/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade)
"sy" = (/obj/structure/table/standard,/obj/item/weapon/soap/deluxe,/turf/unsimulated/floor{icon_state = "white"},/area/shuttle/trade)
-"sz" = (/obj/structure/table/standard,/obj/item/weapon/permit,/obj/item/weapon/permit,/obj/item/weapon/permit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
+"sz" = (/obj/structure/table/standard,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/obj/item/clothing/accessory/permit,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"sA" = (/obj/structure/closet/wardrobe/white,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"sB" = (/obj/structure/closet/wardrobe/green,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
"sC" = (/obj/structure/closet/wardrobe/grey,/turf/unsimulated/floor{icon_state = "steel"},/area/shuttle/trade)
@@ -1679,16 +1679,16 @@
"Go" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo)
"Gp" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo)
"Gq" = (/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/ninja_dojo/dojo)
-"Gr" = (/obj/structure/table/rack,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/device/paicard,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
-"Gs" = (/obj/structure/table/rack,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"Gr" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/computer/security,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"Gs" = (/obj/structure/table/steel_reinforced,/obj/item/device/paicard,/obj/item/device/pda/syndicate,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"Gt" = (/turf/unsimulated/floor{icon = 'icons/turf/flooring/wood.dmi'; icon_state = "wood_broken1"; tag = "icon-wood"},/area/ninja_dojo/dojo)
-"Gu" = (/obj/structure/table/steel_reinforced,/obj/item/device/pda/syndicate,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"Gu" = (/obj/structure/flight_right{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"Gv" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/shuttle/floor/voidcraft/dark,/area/ninja_dojo/start)
"Gw" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/toolbox/syndicate{pixel_x = -1; pixel_y = 3},/obj/machinery/button/remote/blast_door{id = "ninjawindow"; name = "remote shutter control"; pixel_x = 0; pixel_y = -25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
"Gx" = (/obj/structure/table/bench/wooden,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/ninja_dojo/dojo)
-"Gy" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
-"Gz" = (/obj/machinery/computer/shuttle_control/multi/ninja,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
-"GA" = (/obj/machinery/computer/security,/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"Gy" = (/obj/structure/flight_left{dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"Gz" = (/obj/machinery/computer/shuttle_control/web/ninja{tag = "icon-flightcomp_center (NORTH)"; icon_state = "flightcomp_center"; dir = 1},/turf/simulated/shuttle/floor/voidcraft/light,/area/ninja_dojo/start)
+"GA" = (/obj/structure/flight_left,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
"GB" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/obj/item/toy/plushie/mouse{desc = "A plushie of a small fuzzy rodent."; name = "Woodrat"},/turf/unsimulated/beach/sand,/area/beach)
"GC" = (/obj/structure/bed/chair,/obj/effect/landmark{name = "endgame_exit"},/turf/unsimulated/beach/sand,/area/beach)
"GD" = (/mob/living/simple_animal/crab/Coffee,/turf/unsimulated/beach/sand,/area/beach)
@@ -1927,7 +1927,7 @@
"Lc" = (/obj/item/weapon/storage/box/syndie_kit/clerical,/obj/structure/table/standard,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_station)
"Ld" = (/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
"Le" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/turf/unsimulated/floor{icon_state = "lino"},/area/syndicate_station)
-"Lf" = (/obj/machinery/computer/shuttle_control/multi/skipjack,/turf/unsimulated/floor{icon_state = "steel_dirty"},/area/skipjack_station)
+"Lf" = (/obj/structure/flight_right,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
"Lg" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/skipjack_station)
"Lh" = (/obj/effect/decal/cleanable/cobweb2,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/skipjack_station)
"Li" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/turf/unsimulated/floor{icon_state = "steel"},/area/skipjack_station)
@@ -2022,10 +2022,10 @@
"MT" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 8},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"MU" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "vox_west_vent"; tag_exterior_door = "vox_northwest_lock"; frequency = 1331; id_tag = "vox_west_control"; tag_interior_door = "vox_southwest_lock"; pixel_x = 24; req_access = list(150); tag_chamber_sensor = "vox_west_sensor"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1331; id_tag = "vox_west_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"MV" = (/obj/machinery/computer/station_alert,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
-"MW" = (/obj/item/clothing/glasses/thermal/plain/monocle,/obj/item/clothing/head/pirate,/obj/structure/table/steel_reinforced,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
-"MX" = (/obj/machinery/computer/shuttle_control/multi/skipjack,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
-"MY" = (/obj/structure/table/steel_reinforced,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
-"MZ" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
+"MW" = (/obj/machinery/computer/shuttle_control/web/heist,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
+"MX" = (/obj/structure/table/steel_reinforced,/obj/item/clothing/head/pirate,/obj/item/clothing/glasses/thermal/plain/monocle,/turf/simulated/shuttle/floor/skipjack,/area/skipjack_station/start)
+"MY" = (/obj/structure/flight_right{tag = "icon-right (WEST)"; icon_state = "right"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"MZ" = (/obj/machinery/computer/shuttle_control/web/syndicate{dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"Na" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1331; id_tag = "skipjack_shuttle"; pixel_x = -24; req_access = list(150); tag_airpump = "vox_east_vent"; tag_chamber_sensor = "vox_east_sensor"; tag_exterior_door = "vox_northeast_lock"; tag_interior_door = "vox_southeast_lock"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1331; id_tag = "vox_east_vent"},/obj/machinery/light/small,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Nb" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4},/obj/machinery/meter,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"Nc" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1331; master_tag = "merc_shuttle"; name = "interior access button"; pixel_x = 25; pixel_y = 25; req_access = list(150)},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
@@ -2107,7 +2107,7 @@
"OA" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; tiles = 0},/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space)
"OB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/regular{id = "skipjackshutters"; name = "Skipjack Blast Shielding"},/obj/structure/window/reinforced/full,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
"OC" = (/obj/item/robot_parts/l_leg,/turf/simulated/shuttle/plating,/area/skipjack_station/start)
-"OD" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
+"OD" = (/obj/structure/flight_left{tag = "icon-left (WEST)"; icon_state = "left"; dir = 8},/turf/simulated/shuttle/floor/voidcraft,/area/syndicate_station/start)
"OE" = (/obj/structure/bed/chair/comfy/red{tag = "icon-comfychair_preview (WEST)"; icon_state = "comfychair_preview"; dir = 8},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"OF" = (/obj/machinery/door/airlock/voidcraft/vertical,/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
"OG" = (/mob/living/simple_animal/cat/kitten{name = "Enola"},/turf/simulated/shuttle/floor/voidcraft/light,/area/syndicate_station/start)
@@ -2273,17 +2273,17 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueueueueueufxefeieieieieieieieifyeffzfzeffAfAeffzfzefefefefeffBfBfBewewewewfCffffffffffffefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeueueueueueueueufDefeieieieieieieieifEeffFfGfHeieifIfJfKefeweweweffvfvfvfweweweweffLffeffMeffNefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeEfOeEfPeEfQeueufReffSfTfUfVfWfXeieifYeffZeieieieieieifKefgaefgaefeXeXeXewewgbgbeffLffefgcefgcefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzefgdgdefeffzfzfzfzfzgefAfAgeefeieieieieieieieigfeieieiefefefeffAfAefefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieiggghghgieieieigjgjgjgjeieifAeieieifAeieieieieieieieigkefewglgmefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieieieieieieieieigngogpgqeieifzeieieifzeieieieieieieieigkgrewewgsefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieigtgugugveieieieieieigwgxgxgyeieieigpgzgAgBeieifAeieieifAeieieieieigCeieigkefgDgEgFefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzeffAfAefeffzfzfzfzfzgGfAfAgGefeieigHgHgHgHeieiefeieieiefefefeffzfzefgIgIefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefgJgKgLgMgNgOeieigPefgQgRgSgTgUgVeieigWefgXeieieieieieigYefeieieiefeugZhahahahahbhbhahahahaeueuefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihcefhdheeiheeieieieihfefhghhfJeieihihjhkefeieieiefeuhlhmhnhohohohohphqhrhshaeuefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihtefeieieieieieieieihueffzfzeffAfAeffzfzefeieieiefeuhlhvhwhxhyhohohohohohzhAeuefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihBhChDhEeieihFefeieihGhHhIhJeieihKefhLhMhNeieihOhPhQefeieieiefeuhlhvhRhShThUhUhVhohWhshaeuefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihXhYhZiaeieiibefeieiicidieifeieiibefewewigeieieDewihefeieieiefeuiihahahahahahahahahahaeueuefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefijeieieieieieieiikefeieieieieieieieiilefimeweweieiewewinefeieieiefefioioioioioioioioioioioioioefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzefgdgdefeffzfzfzfzfzgefAfAgeefeieieieieieieieigfeieieiefefefeffAfAefefefefefefefefefefefefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieiggghghgieieieigjgjgjgjeieifAeieieifAeieieieieieieieieieieieieieieigkefewglgmefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieieieieieieieieieieieieieieieigngogpgqeieifzeieieifzeieieieieieieieieieieieieieieigkgrewewgsefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieigtgugugveieieieieieigwgxgxgyeieieigpgzgAgBeieifAeieieifAeieieieieieieieieieieieieieieigkefgDgEgFefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeffzfzfzfzfzeffAfAefeffzfzfzfzfzgGfAfAgGefeieigHgHgHgHeieiefeieieiefgCgCgCgCgCgCgCgCgCgCgCgCgCgCeieiefefefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefgJgKgLgMgNgOeieigPefgQgRgSgTgUgVeieigWefgXeieieieieieigYefeieieiefeugZhahahahahahahahahahaeugCeieifzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihcefhdheeiheeieieieihfefhghhfJeieihihjhkefeieieiefeuhlhmhnhohohohohphqhrhshagCeieifzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieieieieieieieihtefeieieieieieieieihueffzfzeffAfAeffzfzefeieieiefeuhlhvhwgIhyhohohohohohbhzhxhAeiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihBhChDhEeieihFefeieihGhHhIhJeieihKefhLhMhNeieihOhPhQefeieieiefeuhlhvhRhShThUhUhohohWhshagCefefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefeieihXhYhZiaeieiibefeieiicidieifeieiibefewewigeieieDewihefeieieiefeuiihahahahahahahahahahaeugCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefijeieieieieieieiikefeieieieieieieieiilefimeweweieiewewinefeieieiefefioioioioioioioioioioioioefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefipiqirisitiuivewiwefeieieieieieieieiixefewewigeieieDewiyefeieieiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefizizirisitiuiviAiwefiBiCiDiEiFiGiHiIiJefiKiLiMiNiOiPiQiRefeieieiefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefeffAefefaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -2410,9 +2410,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFHFIFJFeFtFtFtFKFLFLFLFMFtFtFtFeFNFNFeFoFoFOFPFQFRFSFTFOFoFoFjFjFjFfFhFlFlFlFlFGFUFVFGFlFlFlFlFlFlFlFlFlFlFlFhFfaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFWFWFWFXFtFtFtFKFLFLFLFMFtFtFtFYFNFNFYFZGaFoGbGcGcGcGdGeGfFoFjFjFjFfFhFlFlFlFlFGGgGhFGFlFlFAFlGiFlFlFlFlFlFlFhFfaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeGjGjGjFeFtFtFtFKFLFLFLFMFtFtFtFeFNFNFeFoGkGlGmGeGeGeGeGeGnFoFjFjFjFfFhFlFlFlFlFlFGFGFlFlFlFlFlFlFlFlFlFlFlFlFhFfaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFeFeFeFeFeFtFtGoGpGpGpGqFtFtFeFeFFFFFeFoFOFOGrGeGeGeGsFOFOFoFjFjFkFfFhFlFlFrFlFlFlFlFlFlFlFlFlFlFlFlFlFpFlFlFhFfaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjFjFjFjFeFtFtFtFtFtFtFtGtFtFeFjFjFjFjFjFoFOGuGeGvGeGwFOFoFjFjFjFjFfFhFlFlFAFrFlFlFlFlFlFlFlFlFlFlFlFlFrFlFlFhFfaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjFjFjFjFeGxGxGxFtFtFtGxGxGxFeFjFjFkFjFjFjFoFoGyGzGAFoFoFjFjFjFjFjFfFhFlFlFlFlFlFlFlGBFlGCFlGCFlGDFlFlFlFlFlFhFfaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFeFeFeFeFeFtFtGoGpGpGpGqFtFtFeFeFFFFFeFoFOFOhVGeGeGeGrFOFOFoFjFjFkFfFhFlFlFrFlFlFlFlFlFlFlFlFlFlFlFlFlFpFlFlFhFfaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjFjFjFjFeFtFtFtFtFtFtFtGtFtFeFjFjFjFjFjFoFOGsGeGvGeGwFOFoFjFjFjFjFfFhFlFlFAFrFlFlFlFlFlFlFlFlFlFlFlFlFrFlFlFhFfaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjFjFjFjFeGxGxGxFtFtFtGxGxGxFeFjFjFkFjFjFjFoFoGuGzGyFoFoFjFjFjFjFjFfFhFlFlFlFlFlFlFlGBFlGCFlGCFlGDFlFlFlFlFlFhFfaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjFjFjFjFeFeFeFeFFGEFFFeFeFeFeFjFjFjFjFjFjFjFoGFGGGHFoFjFjFjFjFjFjFfFhFlFlFlGIFlFlFlFlFlFlFlFlFlFlFlFlFlFlFlFhFfaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjGJFjFjFjFjGKGLGMGNGOGPGKFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFfFhGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQGQFhFfaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFeFjFjFjFjFjFjFjGLGMGNGOGPFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFjFfGRGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGSGRFfaaaa
@@ -2445,7 +2445,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHYHIJSJTJSJTKuKvHIIeIeIeIeIeIeIeIeIeIeIeIeIeKwKlIaKxKyKzIaHZabHYHYHYHYHYHFHFHFIiKAKBIiIiIiIiKCKDHFIiIiIiHFKEJKJKJKKFHFKGKdKdKHKIHFHYaaaaHUKJHUaaaaHYHYHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHYHIKKJwKLJwKMJwHIKlIeIeIeIeIeIeIeIeIeHIHIHIHZKNKlIaIaIaKOHZabHYHYHYHYHYHYHYHFHFIFIFHFKPKPHFIFIFHFHFIiIiHFHFHFKQHFHFHFHFKRHFHFHFHFHYaaaaaaaaaaaaaaHYHYHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHYHIHIHIHIHIHIHIHIKSKTKSHIHIHIHIHIHIHIHIHZHZHZHZKUIaIaIaKVHZabHYHYHYHYHYHYHYHYHFKWIiIiIiIiIiIiKXHFKYIiIiIFKZLaLbLbLcHFLdLdLeLeLeHFHFHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYabaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHIHIIdIeIeKlLfHILgLgLgLgLhHILiIeIeIeLjHIHIHZHZHZIaLkKyKyLlHZabHYHYHYHYHYHYHYHYHFKWIiIiLmLnIiIiLoHFLpIiIiHFLbLbLqLbLbHFLdLdLrLrLrLsHFHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYabaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHIHIIdIeIeKlKlHILgLgLgLgLhHILiIeIeIeLjHIHIHZHZHZIaLkKyKyLlHZabHYHYHYHYHYHYHYHYHFKWIiIiLmLnIiIiLoHFLpIiIiHFLbLbLqLbLbHFLdLdLrLrLrLsHFHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHIIeIeIeIeIeKlHILgLgLtLgLgHIIeIeIeIeKlKlHIHZHZHZLuIaIaIaIaHZabHYHYHYHYHYHYHYHYHFKWIiIiKWLvIiIiLwHFLxIiIiLyLbLzLALBLbLCLdLdLdLdLdLDHFHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHIIeIeIeIeIeIeKTLgLELFLGLgKTIeIeIeIeIeKlHIHZHYHZHZLHLIIaHZHZabHYHYHYHYHYHYHYHYHFKWIiIiLJLKIiIiLLHFLMIiIiHFLbLzLALBLbHFLdLdLrLrLrLNHFHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYHYHYHYHYHIKlIeHIKSKSKSHILgLELOLGLgHIKSKSKSHIIeIeHIHZHYHYHZHZHZLPIaHZabHYHYHYHYHYHYHYHYHFKWIiIiIiIiIiIiLLHFIiIiIiIFLbLbLQLbLbHFLRLRLeLeLeHFHFHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYHYabaaaa
@@ -2455,13 +2455,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYHYaaaaaaaaLZMaMaMbaaaaaaaaaaaaaaaaaaaaaaaaaaLZMaMaMbaaaaHYHYHYHYHYHYHYabHYHYHYHYHYHYHYHYHYaaaaaaaaaaaaaaaaaaMjMdMdMkaaaaaaaaaaaaMlMlMmMnMoMlMlMlMlMlMlMlaaaaaaHYHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpMqMrMpaaaaaaMpaaaaaaaaaaMpaaaaaaMpMsMtMpaaaaHYHYHYHYHYHYHYabHYHYHYHYHYHYHYHYHYaaaaaaaaaaaaaaaaaaMlMuMuMlaaaaaaMlMlMlMlMvMwMwMwMwMwMxMlMyMzMAaaaaaaaaHYHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpMBMCMpaaaaaaMpMDMEMEMEMFMpaaaaaaMpMGMHMpaaaaaaaaHYHYHYHYHYabHYHYHYHYHYHYHYHYaaaaaaaaaaaaMlMlMlMlMIMJMKMLMMMNMlMlMOMPMlMQMwMwMwMwMwMRMlMyMzMSaaaaaaaaaaHYHYHYHYHYHYHYabaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpMTMUMpaaaaMpMpMVMWMXMYMZMpMpaaaaMpNaNbMpaaaaaaaaaaHYHYHYHYabHYHYHYHYHYHYHYaaaaaaaaaaMlMlMlMwMwNcNdNeNfNgNhNiNiNjNkMwMlNlMwMwMwMlMlMlMlMyMzMSaaaaaaaaaaHYHYHYHYHYHYHYabaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpMTMUMpaaaaMpMpMVGAMWLfMXMpMpaaaaMpNaNbMpaaaaaaaaaaHYHYHYHYabHYHYHYHYHYHYHYaaaaaaaaaaMlMlMlMwMwNcNdNeNfNgNhNiNiNjNkMwMlNlMwMwMwMlMlMlMlMyMzMSaaaaaaaaaaHYHYHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpNmMpMpaaaaMpMpNnNoNpNoNqNrMpaaaaMpMpNsMpaaaaaaaaaaHYHYHYHYabHYHYHYHYHYHYaaaaaaaaMlMlMlMlNtMwMwMlNuMLMLMLNvMwMwMwMwNtMlNwMwMwNxMlNyNzMlMyMzNAaaaaaaaaaaaaHYHYHYHYHYHYabaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpNBNCMpMpMpMpNDNoNoNoNoNoNEMpMpMpMpNFNGMpaaaaaaaaaaHYHYHYHYabHYHYHYHYHYaaaaaaaaMlMlNHNIMlMwMwNJMlMwMwMwMwMlNKNLMwMwMlMlMlNMMwNNNONPNQMlMlMlMlMlaaaaaaaaaaaaHYHYHYHYHYabaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYHYaaaaaaaaaaMpNBNCMpMpMpMpNDNoNoNoNoNoNEMpMpMpMpNFNGMpaaaaaaaaaaHYHYHYHYabHYHYHYHYHYaaaaaaaaMlMlNHOTMlMwMwNJMlMwMwMwMwMlNKNLMwMwMlMlMlNMMwNNNONPNQMlMlMlMlMlaaaaaaaaaaaaHYHYHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabHYHYaaaaaaaaaaaaMpNRNSNTNUNVMpNWNoNoNoNoNoNWMpNXNYNZNSNRMpaaaaaaaaaaHYHYHYHYabHYHYHYHYaaaaaaaaaaOaObMwOcMlMwMwOdMlOeOfOfOgMlMlMlMlOhMlOiMlMNOhMlMlNPOjMlOkOlOmMlMlaaaaaaaaaaHYHYHYHYHYabaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOnHYaaaaaaaaaaaaaaMpNRNSNSNSOoMpOpOqOrOsOpOqOrMpOtNSNSOuNRMpaaaaaaaaaaHYHYHYHYabHYHYHYHYaaaaaaaaaaOvNIOfOwMlMwMwNJMlMwOfOfMwMlMwOxOyOfMwMwMwOxOfMwMlMlMlMlNPNPNPOzMlMlaaaaaaaaaaHYHYHYHYabaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaaaOBNRNSNSNSNSOsNoNoNoNoNoNoNoOsNSNSOCNSNROBaaaaaaaaaaaaHYHYHYabHYHYHYHYaaaaaaaaaaOvODOEOfOFOfOfOfOFOfOfOfOfOFOfOfOfOfOfOGOfOfOfNPNPNPNPOHNPNPNPNPOIMlaaaaaaaaaaaaHYHYHYabaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaaaOJOKNSOLOMNSMpONOONoNoNoOPOQMpNSORNSOSNROJaaaaaaaaaaaaHYHYHYabHYHYHYaaaaaaaaaaaaOvOTOfOUMlMwMwNJMlMwOfOfMwMlMwNMMwOfMwMwMwNMOfMwMlMlMlMlOVNPNPOWMlMlaaaaaaaaaaaaHYHYHYabaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOnHYaaaaaaaaaaaaaaMpNRNSNSNSOoMpOpOqOrOsOpOqOrMpOtNSNSOuNRMpaaaaaaaaaaHYHYHYHYabHYHYHYHYaaaaaaaaaaOvMYOfOwMlMwMwNJMlMwOfOfMwMlMwOxOyOfMwMwMwOxOfMwMlMlMlMlNPNPNPOzMlMlaaaaaaaaaaHYHYHYHYabaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaaaOBNRNSNSNSNSOsNoNoNoNoNoNoNoOsNSNSOCNSNROBaaaaaaaaaaaaHYHYHYabHYHYHYHYaaaaaaaaaaOvMZOEOfOFOfOfOfOFOfOfOfOfOFOfOfOfOfOfOGOfOfOfNPNPNPNPOHNPNPNPNPOIMlaaaaaaaaaaaaHYHYHYabaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaaaOJOKNSOLOMNSMpONOONoNoNoOPOQMpNSORNSOSNROJaaaaaaaaaaaaHYHYHYabHYHYHYaaaaaaaaaaaaOvODOfOUMlMwMwNJMlMwOfOfMwMlMwNMMwOfMwMwMwNMOfMwMlMlMlMlOVNPNPOWMlMlaaaaaaaaaaaaHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaaaOXOKNSNSMpOYMpMpMpOZPaPbMpMpMpPcMpPdPePfOXaaaaaaaaaaaaaaHYHYabHYHYHYaaaaaaaaaaaaPgPhMwPiMlMwMwOdMlOeOfOfOgMlMlMlMlOhMlPjMlMNOhMlMlPkPkMlPlPmPnMlMlaaaaaaaaaaaaaaHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaMpMpPoPpPpMpPqPrPqPsPtPuPvPsPwPxPyMpPzPAPBMpMpaaaaaaaaaaaaHYHYabHYHYaaaaaaaaaaaaaaMlMlPCNIMlMwMwNJMlMwMwMwMwMlPDPEMlMwMlMlMlPFOfPGOfPHPIMlMlMlMlMlaaaaaaaaaaaaaaaaHYHYHYabaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaOAaaaaaaaaaaaaaaMpMpPJPJMpMpPqPqPqPKPtPLPvPKPyPyPMMpMpPJPJMpMpaaaaaaaaaaaaHYHYabHYHYaaaaaaaaaaaaaaaaMlMlMlMlNtMwMwMlMlMlPNMlMlNPNPPOMwNJMlPPPQOfOfPRPSPTMlMyMzMAaaaaaaaaaaaaaaaaaaaaHYHYabaaaa
diff --git a/maps/southern_cross/southern_cross-7.dmm b/maps/southern_cross/southern_cross-7.dmm
index 63e2454f72..9b1384c2f5 100644
--- a/maps/southern_cross/southern_cross-7.dmm
+++ b/maps/southern_cross/southern_cross-7.dmm
@@ -1,286 +1,347 @@
-"a" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east,/area/space)
-"b" = (/turf/space,/area/space)
-"c" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north,/area/space)
-"d" = (/turf/space/transit/east,/area/space)
-"e" = (/turf/space/transit/north,/area/space)
-"f" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north,/area/space)
-"g" = (/turf/space/transit/north,/area/ninja_dojo/transit)
-"h" = (/turf/space/transit/north,/area/shuttle/escape_pod1/transit)
-"i" = (/turf/space/transit/north,/area/shuttle/escape_pod2/transit)
-"j" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east,/area/space)
-"k" = (/turf/space/transit/east,/area/shuttle/response_ship/transit)
-"l" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/east,/area/space)
-"m" = (/turf/space/transit/north,/area/shuttle/escape/transit)
-"n" = (/turf/space/transit/north,/area/skipjack_station/transit)
-"o" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east,/area/space)
-"p" = (/turf/space/transit/east,/area/shuttle/escape_pod3/transit)
-"q" = (/turf/space/transit/east,/area/shuttle/escape_pod5/transit)
-"r" = (/turf/space/transit/east,/area/shuttle/escape_pod4/transit)
-"s" = (/turf/space/transit/east,/area/shuttle/escape_pod6/transit)
-"t" = (/turf/space/transit/east,/area/syndicate_station/transit)
-"u" = (/turf/space/transit/east,/area/shuttle/escape_pod7/transit)
-"v" = (/turf/space/transit/east,/area/shuttle/escape_pod8/transit)
-"w" = (/turf/space/transit/east,/area/shuttle/large_escape_pod1/transit)
-"x" = (/turf/space/transit/east,/area/shuttle/cryo/transit)
-"y" = (/turf/space/transit/east,/area/shuttle/large_escape_pod2/transit)
-"z" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/north,/area/space)
-"A" = (/turf/space/transit/north,/area/shuttle/shuttle1/transit)
-"B" = (/turf/space/transit/north,/area/shuttle/shuttle2/transit)
+"aa" = (/turf/space,/area/space)
+"ab" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north,/area/space)
+"ac" = (/turf/space/transit/north,/area/space)
+"ad" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/north,/area/space)
+"ae" = (/turf/space/transit/north,/area/shuttle/escape_pod1/transit)
+"af" = (/turf/space/transit/north,/area/shuttle/escape_pod2/transit)
+"ag" = (/turf/space,/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/north,/area/space)
+"ah" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east,/area/space)
+"ai" = (/turf/space,/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/east,/area/space)
+"aj" = (/turf/space/transit/east,/area/space)
+"ak" = (/turf/space/transit/north,/area/shuttle/escape/transit)
+"al" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east,/area/space)
+"am" = (/turf/space/transit/east,/area/shuttle/escape_pod3/transit)
+"an" = (/turf/space/transit/east,/area/shuttle/escape_pod5/transit)
+"ao" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/moving/east,/area/space)
+"ap" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/east,/area/space)
+"aq" = (/turf/simulated/sky/moving/east,/area/space)
+"ar" = (/turf/simulated/sky/east,/area/space)
+"as" = (/turf/space/transit/east,/area/shuttle/escape_pod4/transit)
+"at" = (/turf/space/transit/east,/area/shuttle/escape_pod6/transit)
+"au" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/simulated/sky/moving/east,/area/space)
+"av" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/simulated/sky/east,/area/space)
+"aw" = (/turf/simulated/sky/moving/east,/area/shuttle/response_ship/sky_transit)
+"ax" = (/turf/simulated/sky/east,/area/shuttle/response_ship/sky)
+"ay" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/moving/east,/area/space)
+"az" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/east,/area/space)
+"aA" = (/turf/space/transit/east,/area/shuttle/escape_pod7/transit)
+"aB" = (/turf/space/transit/east,/area/shuttle/escape_pod8/transit)
+"aC" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space,/area/space)
+"aD" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/east,/area/space)
+"aE" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space,/area/space)
+"aF" = (/turf/space/transit/east,/area/shuttle/response_ship/transit)
+"aG" = (/turf/space,/area/shuttle/response_ship/orbit)
+"aH" = (/turf/space/transit/east,/area/shuttle/large_escape_pod1/transit)
+"aI" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/east,/area/space)
+"aJ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/space,/area/space)
+"aK" = (/turf/space/transit/east,/area/shuttle/cryo/transit)
+"aL" = (/turf/space/transit/east,/area/shuttle/large_escape_pod2/transit)
+"aM" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/moving/north,/area/space)
+"aN" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/north,/area/space)
+"aO" = (/turf/simulated/sky/moving/north,/area/space)
+"aP" = (/turf/simulated/sky/north,/area/space)
+"aQ" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/moving/north,/area/space)
+"aR" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/north,/area/space)
+"aS" = (/turf/simulated/sky/moving/north,/area/skipjack_station/sky_transit)
+"aT" = (/turf/simulated/sky/north,/area/skipjack_station/sky)
+"aU" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/moving/west,/area/space)
+"aV" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/west,/area/space)
+"aW" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/moving/south,/area/space)
+"aX" = (/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/simulated/sky/south,/area/space)
+"aY" = (/turf/simulated/sky/moving/west,/area/space)
+"aZ" = (/turf/simulated/sky/west,/area/space)
+"ba" = (/turf/simulated/sky/moving/south,/area/space)
+"bb" = (/turf/simulated/sky/south,/area/space)
+"bc" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/moving/south,/area/space)
+"bd" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/south,/area/space)
+"be" = (/turf/simulated/sky/moving/south,/area/ninja_dojo/sky_transit)
+"bf" = (/turf/simulated/sky/south,/area/ninja_dojo/sky)
+"bg" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/simulated/sky/moving/west,/area/space)
+"bh" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/simulated/sky/west,/area/space)
+"bi" = (/turf/simulated/sky/moving/west,/area/syndicate_station/sky_transit)
+"bj" = (/turf/simulated/sky/west,/area/syndicate_station/sky)
+"bk" = (/turf/space/transit/north,/area/ninja_dojo/transit)
+"bl" = (/turf/space,/area/ninja_dojo/orbit)
+"bm" = (/turf/space/transit/north,/area/skipjack_station/transit)
+"bn" = (/turf/space,/area/skipjack_station/orbit)
+"bo" = (/turf/space/transit/east,/area/syndicate_station/transit)
+"bp" = (/turf/space,/area/syndicate_station/orbit)
+"bq" = (/turf/space,/turf/space/transit/north,/area/space)
+"br" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/north,/area/space)
+"bs" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/moving/north,/area/space)
+"bt" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/moving/south,/area/space)
+"bu" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/south,/area/space)
+"bv" = (/obj/effect/step_trigger/teleporter/planetary_fall/sif,/turf/simulated/sky/moving/north,/area/space)
+"bw" = (/obj/effect/landmark/teleport_mark{landmark_id = "fall_sif"},/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/moving/north,/area/space)
+"bx" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/simulated/sky/north,/area/space)
+"by" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/simulated/sky/moving/north,/area/space)
+"bz" = (/turf/simulated/sky/north,/area/shuttle/shuttle2/sky)
+"bA" = (/turf/simulated/sky/moving/north,/area/shuttle/shuttle2/sky_transit)
+"bB" = (/turf/simulated/sky/moving/south,/area/shuttle/shuttle1/sky_transit)
+"bC" = (/turf/simulated/sky/south,/area/shuttle/shuttle1/sky)
+"bD" = (/turf/space/transit/north,/obj/effect/step_trigger/teleporter/random{affect_ghosts = 1; name = "escapeshuttle_leave"; teleport_x = 25; teleport_x_offset = 245; teleport_y = 25; teleport_y_offset = 245; teleport_z = 6; teleport_z_offset = 6},/turf/space/transit/south,/area/space)
+"bE" = (/turf/space/transit/north,/turf/space/transit/south,/area/space)
+"bF" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/space/transit/north,/area/space)
+"bG" = (/turf/space/transit/north,/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/space/transit/south,/area/space)
+"bH" = (/turf/space,/area/shuttle/shuttle2/orbit)
+"bI" = (/turf/space/transit/north,/area/shuttle/shuttle2/transit)
+"bJ" = (/turf/space/transit/north,/turf/space/transit/south,/area/shuttle/shuttle1/transit)
+"bK" = (/turf/space,/area/shuttle/shuttle1/orbit)
(1,1,1) = {"
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefffefffeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefgfefgfeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefgfefgfeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefgfffgfeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeefffgggggfffeeeeceeeeeefffffeeeeeeceeeeeefffffeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeffgggggggggffeeeceeeeeefhhhfeeeeeeceeeeeefiiifeeeeeec
-addddddddjjjjjjjjjjjjjdddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeefgggggggggggfeeeceeeeeefhhhfeeeeeeceeeeeefiiifeeeeeec
-addddddddjkkkkkkkkkkkjjddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeefgggggggggggfeeeceeeeeefhhhfeeeeeeceeeeeefiiifeeeeeec
-addddddddjkkkkkkkkkkkkjddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeefgggggggggggfeeeceeeeeefhhhfeeeeeeceeeeeefiiifeeeeeec
-addddddddjkkkkkkkkkkkkjddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeefgggggggggggfeeeceeeeeefhhhfeeeeeeceeeeeefiiifeeeeeec
-addddddddlkkkkkkkkkkkklddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeffgggggggggffeeeceeeeeefffffeeeeeeceeeeeefffffeeeeeec
-addddddddlkkkkkkkkkkkllddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeffgggggggffeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddllllllllllllldddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeffgggggffeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefffffffeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeec
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-addddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeefffffffffeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeffmmmmmmmffeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeffffffefffeeefffeffffffeeeeeeeceeeeeeefmmmmmmmmmfeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnfefnfffffnfefnnnnfeeeeeeeceeeeeeefmmmmmmmmmfeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnfffnnnnnnnfffnnnnfeeeeeeeceeeeeeefmmmmmmmmmfeeeeeeecbbbbb
-addddddoooooooddddddaddddddoooooooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnffnnnnnnnnnffnnnnfeeeeeeeceeeeeeffmmmmmmmmmffeeeeeecbbbbb
-addddddopppppoddddddaddddddoqqqqqoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnffnnnnnnnnnffnnnnfeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-addddddopppppoddddddaddddddoqqqqqoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnnnnnnnnnnnnnnnnnnfeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-addddddopppppoddddddaddddddoqqqqqoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnnnnnnnnnnnnnnnnnnfeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-addddddoooooooddddddaddddddoooooooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnnnnnnnnnnnnnnnnnnfeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnnnnnnnnnnnnnnnnnnfeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefnnnnnnnnnnnnnnnnnnnnnfeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeffnnnnnnnnnnnnnnnnnnnnnffeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefnnnnnnnnnnnnnnnnnnnnnnnfeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeefnnnnnnnnnnnnnnnnnnnnnnnfeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeffnnnnnnnnnnnnnnnnnnnnnffeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeefffffnnnnnnnnnnnnnfffffeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeefnnnnnnnnnnnnnfeeeeeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeefnnnnnnnnnnnnnfeeeeeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeefnnnnnnnnnnnnnfeeeeeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeefffnnnnnnnnnfffeeeeeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeffnnnnnnnffeeeeeeeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeefffffffffeeeeeeeeeeeeeeceeeeeefmmmmmmmmmmmfeeeeeecbbbbb
-addddddoooooooddddddaddddddoooooooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeffffmmmmmffffeeeeeecbbbbb
-addddddorrrrroddddddaddddddosssssoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeefffffffeeeeeeeeecbbbbb
-addddddorrrrroddddddaddddddosssssoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-addddddorrrrroddddddaddddddosssssoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-addddddoooooooddddddaddddddoooooooddddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeeeecbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadddddddddddddddddddddddddooooooooooooooddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddoooooodoooottttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddooooottttoootttttttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddooottttttttttttttttttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddooottttttttttttttttttttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddaddddddoottttttttttttttttttttttttttttttoodddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddaddddddottttttttttttttttttttttttttttttttooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoooooooddddddaddddddoooooooddddddaddddddotttttttttttttttttttttttttttttttttoodddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddouuuuuoddddddaddddddovvvvvoddddddaddddddottttttttttttttttttttttttttttttttttodddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddouuuuuoddddddaddddddovvvvvoddddddaddddddottttttttttttttttttttttttttttttttttodddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddouuuuuoddddddaddddddovvvvvoddddddaddddddottttttttttttttttttttttttttttttttttodddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoooooooddddddaddddddoooooooddddddaddddddotttttttttttttttttttttttttttttttttoodddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddaddddddottttttttttttttttttttttttttttttttooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddaddddddoottttttttttttttttttttttttttttttoodddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddooottttttttttttttttttttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddooottttttttttttttttttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddooooottttoootttttttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddadddddddddddddddddddadddddddddddddddoooooodoooottttttttttttoddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddddddddddddddddddddooooooooooooooddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddddddddddddddddddddddaddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddooooooooooooodddddddaddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddowwwwwwwwwwwooddddddaddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddowwwwwwwwwwwwoddddddaddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddowwwwwwwwwwwwoddddddaddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddowwwwwwwwwwwwoddddddaddddddddddddddddddddddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoooooooooddddddaddowwwwwwwwwwwooddddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddooooooooooooodddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddadddoooooooooooooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoxxxxxxxoddddddaddooyyyyyyyyyyyoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-addddddoooooooooddddddaddoyyyyyyyyyyyyoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddoyyyyyyyyyyyyoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddoyyyyyyyyyyyyoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddooyyyyyyyyyyyoddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddadddoooooooooooooddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-adddddddddddddddddddddaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-aaaaaaaaaaaaaaaaaaaaaaaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbaddddddddddddddddddddddabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
-cccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccc
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeefffffffeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezzzzeeezzzzeeeeeec
-ceeeeeeeffAAAAAffeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBzzezzBBzeeeeeec
-ceeeeeeefAAAAAAAfeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBBzzzBBBzeeeeeec
-ceeeeeeefAAAAAAAfeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBBBBBBBBzeeeeeec
-ceeeeeeefAAAAAAAfeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBBBBBBBBzeeeeeec
-ceeeeeeefAAAAAAAfeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBBBBBBBBzeeeeeec
-ceeeeeeefAAAAAAAfeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBBBBBBBBzeeeeeec
-ceeeeeeffAAAAAAAffeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezBBBBBBBBBzeeeeeec
-ceeeeeefAAAAAAAAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeezzBBBBBBBzzeeeeeec
-ceeeeeefAAAAAAAAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeezBBBBBBBzeeeeeeec
-ceeeeeefAAAAAAAAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeezBBBBBBBzeeeeeeec
-ceeeeeefAAAAAAAAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeezBBBBBBBzeeeeeeec
-ceeeeeefAAAAAAAAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeezBBBBBBBzeeeeeeec
-ceeeeeefAAAfffAAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeezBBBBBBBzeeeeeeec
-ceeeeeefAAffeffAAfeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeezzBBBBBzzeeeeeeec
-ceeeeeeffffeeeffffeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeezzzzzzzeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-ceeeeeeeeeeeeeeeeeeeeeeecbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbceeeeeeeeeeeeeeeeeeeeeeec
-cccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccc
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadadadadadacacacacacacabacacacacacacadadadadadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadaeaeaeadacacacacacacabacacacacacacadafafafadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadaeaeaeadacacacacacacabacacacacacacadafafafadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadaeaeaeadacacacacacacabacacacacacacadafafafadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadaeaeaeadacacacacacacabacacacacacacadafafafadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadaeaeaeadacacacacacacabacacacacacacadafafafadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacadadadadadacacacacacacabacacacacacacadadadadadacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacabacacacacacacacacacacacacacacacacacab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagagagagagagababababababababababababababababababababababababababababababab
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacadadadadadadadadadacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacadadakakakakakakakadadacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacadakakakakakakakakakadacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacadakakakakakakakakakadacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacadakakakakakakakakakadacacacacacacacabaaaaaaaaaa
+ahajajajajajajalalalalalalalajajajajajajahajajajajajajalalalalalalalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadadakakakakakakakakakadadacacacacacacabaaaaaaaaaa
+ahajajajajajajalamamamamamalajajajajajajahajajajajajajalanananananalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajalamamamamamalajajajajajajahajajajajajajalanananananalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajalamamamamamalajajajajajajahajajajajajajalanananananalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajalalalalalalalajajajajajajahajajajajajajalalalalalalalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaaapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadakakakakakakakakakakakadacacacacacacabaaaaaaaaaa
+ahajajajajajajalalalalalalalajajajajajajahajajajajajajalalalalalalalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacadadadadakakakakakadadadadacacacacacacabaaaaaaaaaa
+ahajajajajajajalasasasasasalajajajajajajahajajajajajajalatatatatatalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacadadadadadadadacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajalasasasasasalajajajajajajahajajajajajajalatatatatatalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajalasasasasasalajajajajajajahajajajajajajalatatatatatalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajalalalalalalalajajajajajajahajajajajajajalalalalalalalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqauauauauauauauauauauauauauaqaqaqaqaqaqaqaqaqaoaaapararararararararavavavavavavavavavavavavavarararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqauawawawawawawawawawawawauauaqaqaqaqaqaqaqaqaoaaapararararararararavaxaxaxaxaxaxaxaxaxaxaxavavararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqauawawawawawawawawawawawawauaqaqaqaqaqaqaqaqaoaaapararararararararavaxaxaxaxaxaxaxaxaxaxaxaxavararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaagacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqauawawawawawawawawawawawawauaqaqaqaqaqaqaqaqaoaaapararararararararavaxaxaxaxaxaxaxaxaxaxaxaxavararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacabaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqayawawawawawawawawawawawawayaqaqaqaqaqaqaqaqaoaaapararararararararazaxaxaxaxaxaxaxaxaxaxaxaxazararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqayawawawawawawawawawawawayayaqaqaqaqaqaqaqaqaoaaapararararararararazaxaxaxaxaxaxaxaxaxaxaxazazararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqayayayayayayayayayayayayayaqaqaqaqaqaqaqaqaqaoaaapararararararararazazazazazazazazazazazazazarararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalalalalalalalajajajajajajahajajajajajajalalalalalalalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaqaoaaapararararararararararararararararararararararararararararararapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaAaAaAaAaAalajajajajajajahajajajajajajalaBaBaBaBaBalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaoaaapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaAaAaAaAaAalajajajajajajahajajajajajajalaBaBaBaBaBalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaAaAaAaAaAalajajajajajajahajajajajajajalaBaBaBaBaBalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalalalalalalalajajajajajajahajajajajajajalalalalalalalajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaiaiaiaiaiaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaDaDaDaDaDaDaDaDaDaDaDaDaDajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaEaEaEaEaEaEaEaEaEaEaEaEaEaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalalalalalalalalalalalalalajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaDaFaFaFaFaFaFaFaFaFaFaFaDaDajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaEaGaGaGaGaGaGaGaGaGaGaGaEaEaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalaHaHaHaHaHaHaHaHaHaHaHalalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaDaFaFaFaFaFaFaFaFaFaFaFaFaDajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaEaGaGaGaGaGaGaGaGaGaGaGaGaEaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalaHaHaHaHaHaHaHaHaHaHaHaHalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaDaFaFaFaFaFaFaFaFaFaFaFaFaDajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaEaGaGaGaGaGaGaGaGaGaGaGaGaEaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalaHaHaHaHaHaHaHaHaHaHaHaHalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaIaFaFaFaFaFaFaFaFaFaFaFaFaIajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaJaGaGaGaGaGaGaGaGaGaGaGaGaJaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalaHaHaHaHaHaHaHaHaHaHaHaHalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaIaFaFaFaFaFaFaFaFaFaFaFaIaIajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaJaGaGaGaGaGaGaGaGaGaGaGaJaJaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalalalalalalalalalajajajajajajahajajalaHaHaHaHaHaHaHaHaHaHaHalalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajaIaIaIaIaIaIaIaIaIaIaIaIaIajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaJaJaJaJaJaJaJaJaJaJaJaJaJaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajalalalalalalalalalalalalalajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajajalalalalalalalalalalalalalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalaKaKaKaKaKaKaKalajajajajajajahajajalalaLaLaLaLaLaLaLaLaLaLaLalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajalalalalalalalalalajajajajajajahajajalaLaLaLaLaLaLaLaLaLaLaLaLalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalaLaLaLaLaLaLaLaLaLaLaLaLalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalaLaLaLaLaLaLaLaLaLaLaLaLalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaaaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajalalaLaLaLaLaLaLaLaLaLaLaLalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajajalalalalalalalalalalalalalajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahajajajajajajajajajajajajajajajajajajajajajahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ahahahahahahahahahahahahahahahahahahahahahahahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahajajajajajajajajajajajajajajajajajajajajajajahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaQaQaQaQaQaQaOaQaQaQaOaOaOaQaQaQaOaQaQaQaQaQaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaRaRaRaRaRaPaRaRaRaPaPaPaRaRaRaPaRaRaRaRaRaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahahahahahahahahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaQaSaSaSaSaQaOaQaSaQaQaQaQaQaSaQaOaQaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaRaPaRaTaRaRaRaRaRaTaRaPaRaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaQaSaSaSaSaQaQaQaSaSaSaSaSaSaSaQaQaQaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaRaRaRaTaTaTaTaTaTaTaRaRaRaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMaOaOaOaOaOaOaOaQaSaSaSaSaQaQaSaSaSaSaSaSaSaSaSaQaQaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaRaRaTaTaTaTaTaTaTaTaTaRaRaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaaaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaaaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaaaMaOaOaOaOaOaOaOaQaSaSaSaSaQaQaSaSaSaSaSaSaSaSaSaQaQaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaRaRaTaTaTaTaTaTaTaTaTaRaRaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaaWbababababababcbcbcbabcbcbcbabababababaaWaaaXbbbbbbbbbbbbbdbdbdbbbdbdbdbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaaWbababababababcbebcbabcbebcbabababababaaWaaaXbbbbbbbbbbbbbdbfbdbbbdbfbdbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaaWbababababababcbebcbabcbebcbabababababaaWaaaXbbbbbbbbbbbbbdbfbdbbbdbfbdbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaaWbababababababcbebcbcbcbebcbabababababaaWaaaXbbbbbbbbbbbbbdbfbdbdbdbfbdbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaQaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaQaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaRaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaRaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYbgbgbgbgbgbgbgbgbgbgbgbgbgbgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZbhbhbhbhbhbhbhbhbhbhbhbhbhbhaZaZaZaZaZaZaZaZaVaaaWbababababcbcbcbebebebebebcbcbcbabababaaWaaaXbbbbbbbbbdbdbdbfbfbfbfbfbdbdbdbbbbbbbbaXaaaMaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYbgbgbgbgbgbgaYbgbgbgbgbibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZbhbhbhbhbhbhaZbhbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWbabababcbcbebebebebebebebebebcbcbababaaWaaaXbbbbbbbdbdbfbfbfbfbfbfbfbfbfbdbdbbbbbbaXaaaMaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYbgbgbgbgbgbibibibibgbgbgbibibibibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZbhbhbhbhbhbjbjbjbjbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWbabababcbebebebebebebebebebebebcbababaaWaaaXbbbbbbbdbfbfbfbfbfbfbfbfbfbfbfbdbbbbbbaXaaaMaOaOaOaOaOaOaQaQaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaSaQaQaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaRaRaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaTaRaRaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYbgbgbgbibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWbabababcbebebebebebebebebebebebcbababaaWaaaXbbbbbbbdbfbfbfbfbfbfbfbfbfbfbfbdbbbbbbaXaaaMaOaOaOaOaOaOaOaQaQaQaQaQaSaSaSaSaSaSaSaSaSaSaSaSaSaQaQaQaQaQaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaRaRaRaRaRaTaTaTaTaTaTaTaTaTaTaTaTaTaRaRaRaRaRaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYbgbgbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWbabababcbebebebebebebebebebebebcbababaaWaaaXbbbbbbbdbfbfbfbfbfbfbfbfbfbfbfbdbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgbgaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhbhaZaZaZaZaZaZaZaVaaaWbabababcbebebebebebebebebebebebcbababaaWaaaXbbbbbbbdbfbfbfbfbfbfbfbfbfbfbfbdbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgbgaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhbhaZaZaZaZaZaZaVaaaWbabababcbcbebebebebebebebebebcbcbababaaWaaaXbbbbbbbdbdbfbfbfbfbfbfbfbfbfbdbdbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaQaSaSaSaSaSaSaSaSaSaSaSaSaSaQaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaRaTaTaTaTaTaTaTaTaTaTaTaTaTaRaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgbgaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhbhaZaZaZaZaZaVaaaWbababababcbcbebebebebebebebcbcbabababaaWaaaXbbbbbbbbbdbdbfbfbfbfbfbfbfbdbdbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaQaQaQaSaSaSaSaSaSaSaSaSaQaQaQaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaRaRaRaTaTaTaTaTaTaTaTaTaRaRaRaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaVaaaWbabababababcbcbebebebebebcbcbababababaaWaaaXbbbbbbbbbbbdbdbfbfbfbfbfbdbdbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaQaQaSaSaSaSaSaSaSaQaQaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaRaRaTaTaTaTaTaTaTaRaRaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaVaaaWbababababababcbcbcbcbcbcbcbabababababaaWaaaXbbbbbbbbbbbbbdbdbdbdbdbdbdbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaQaQaQaQaQaQaQaQaQaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaRaRaRaRaRaRaRaRaRaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgbgaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhbhaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgbgaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhbhaZaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYbgbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibibibgbgaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhbhaZaZaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYbgbgbgbibibibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYbgbgbgbibibibibibibibibibibibibibibibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWbababababababababababababababababababaaWaaaXbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaXaaaMaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaMaaaNaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYbgbgbgbgbgbibibibibgbgbgbibibibibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZbhbhbhbhbhbjbjbjbjbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaWaaaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaaaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaMaaaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYbgbgbgbgbgbgaYbgbgbgbgbibibibibibibibibibibibibgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZbhbhbhbhbhbhaZbhbhbhbhbjbjbjbjbjbjbjbjbjbjbjbjbhaZaZaZaZaZaZaZaZaVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYbgbgbgbgbgbgbgbgbgbgbgbgbgbgaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZbhbhbhbhbhbhbhbhbhbhbhbhbhbhaZaZaZaZaZaZaZaZaVaaababababababababababababababababababababagaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaabababababababababababababababababababababababababababababababababababababababaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaabacacacacacacacacacacacacacacacacacacacagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaabacacacacacacacacacacacacacacacacacacacagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaabacacacacacacadadadacadadadacacacacacacagaaaCaaaaaaaaaaaaaJaJaJaaaJaJaJaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaabacacacacacacadbkadacadbkadacacacacacacagaaaCaaaaaaaaaaaaaJblaJaaaJblaJaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaabacacacacacacadbkadacadbkadacacacacacacagaaaCaaaaaaaaaaaaaJblaJaaaJblaJaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaYaUaaaVaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaVaaabacacacacacacadbkadadadbkadacacacacacacagaaaCaaaaaaaaaaaaaJblaJaJaJblaJaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaUaaaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaVaaabacacacacadadadbkbkbkbkbkadadadacacacacagaaaCaaaaaaaaaJaJaJblblblblblaJaJaJaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacadadbkbkbkbkbkbkbkbkbkadadacacacagaaaCaaaaaaaJaJblblblblblblblblblaJaJaaaaaaaCaaabacacacacacacacadadadadadadacadadadacacacadadadacadadadadadadacacacacacacacabaaaCaaaaaaaaaaaaaaaJaJaJaJaJaJaaaJaJaJaaaaaaaJaJaJaaaJaJaJaJaJaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaabacacacadbkbkbkbkbkbkbkbkbkbkbkadacacacagaaaCaaaaaaaJblblblblblblblblblblblaJaaaaaaaCaaabacacacacacacacadbmbmbmbmadacadbmadadadadadbmadacadbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnaJaaaJbnaJaJaJaJaJbnaJaaaJbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacadbkbkbkbkbkbkbkbkbkbkbkadacacacagaaaCaaaaaaaJblblblblblblblblblblblaJaaaaaaaCaaabacacacacacacacadbmbmbmbmadadadbmbmbmbmbmbmbmadadadbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnaJaJaJbnbnbnbnbnbnbnaJaJaJbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacadbkbkbkbkbkbkbkbkbkbkbkadacacacagaaaCaaaaaaaJblblblblblblblblblblblaJaaaaaaaCaaabacacacacacacacadbmbmbmbmadadbmbmbmbmbmbmbmbmbmadadbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnaJaJbnbnbnbnbnbnbnbnbnaJaJbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacadbkbkbkbkbkbkbkbkbkbkbkadacacacagaaaCaaaaaaaJblblblblblblblblblblblaJaaaaaaaCaaabacacacacacacacadbmbmbmbmadadbmbmbmbmbmbmbmbmbmadadbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnaJaJbnbnbnbnbnbnbnbnbnaJaJbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacadadbkbkbkbkbkbkbkbkbkadadacacacagaaaCaaaaaaaJaJblblblblblblblblblaJaJaaaaaaaCaaabacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacadadbkbkbkbkbkbkbkadadacacacacagaaaCaaaaaaaaaJaJblblblblblblblaJaJaaaaaaaaaCaaabacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacadadbkbkbkbkbkadadacacacacacagaaaCaaaaaaaaaaaJaJblblblblblaJaJaaaaaaaaaaaCaaabacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajalalalalalalalalalalalalalalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacadadadadadadadacacacacacacagaaaCaaaaaaaaaaaaaJaJaJaJaJaJaJaaaaaaaaaaaaaCaaabacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajalalalalalalajalalalalboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacabaaaCaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajalalalalalboboboboalalalboboboboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacadadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadadacacacacacacabaaaCaaaaaaaaaaaaaJaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaJaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajalalalboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacabaaaCaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajalalalboboboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaagbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacabaaaCaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalalajajajajajajajahaaaCaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaagbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacadadbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmadadacacacacacacabaaaCaaaaaaaaaaaaaJaJbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnbnaJaJaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalalajajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaCaaagbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqbqagaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacadadadadadbmbmbmbmbmbmbmbmbmbmbmbmbmadadadadadacacacacacacacabaaaCaaaaaaaaaaaaaaaJaJaJaJaJbnbnbnbnbnbnbnbnbnbnbnbnbnaJaJaJaJaJaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalalajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaCaaagagagagagagagagagagagagagagagagagagagagagaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaabacacacacacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacadbmbmbmbmbmbmbmbmbmbmbmbmbmadacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaJbnbnbnbnbnbnbnbnbnbnbnbnbnaJaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacadadadbmbmbmbmbmbmbmbmbmadadadacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaJaJaJbnbnbnbnbnbnbnbnbnaJaJaJaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalalajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacadadbmbmbmbmbmbmbmadadacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaJaJbnbnbnbnbnbnbnaJaJaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalalajajajajajajahaaaCaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacadadadadadadadadadacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaJaJaJaJaJaJaJaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajalalboboboboboboboboboboboboboboboboboboboboboboboboboboboboboboalalajajajajajajajahaaaCaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajalalalboboboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajalalalboboboboboboboboboboboboboboboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajalalalalalboboboboalalalboboboboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpaaaaaabpbpbpbpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajalalalalalalajalalalalboboboboboboboboboboboboalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpbpbpbpbpbpbpbpbpbpbpbpaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajalalalalalalalalalalalalalalajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacabaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajahaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbraabsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaa
+aabtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtaabububububububububububububububububububububububububuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbvbvbvbvbvbvbvbvbvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaQaQaQaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaQbwaQaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaQaQaQaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbxbxbxaPaPaPbxbxbxbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybybybyaOaOaObybybybyaOaOaOaOaOaObsaa
+aabtbababababababababcbcbcbcbcbcbcbababababababababtaabubbbbbbbbbbbbbbbbbdbdbdbdbdbdbdbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbxbxaPbxbxbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbybyaObybybAbAbyaOaOaOaOaOaObsaa
+aabtbabababababababcbcbBbBbBbBbBbcbcbabababababababtaabubbbbbbbbbbbbbbbdbdbCbCbCbCbCbdbdbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbzbxbxbxbzbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbAbybybybAbAbAbyaOaOaOaOaOaObsaa
+aabtbabababababababcbBbBbBbBbBbBbBbcbabababababababtaabubbbbbbbbbbbbbbbdbCbCbCbCbCbCbCbdbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbzbzbzbzbzbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbAbAbAbAbAbAbAbyaOaOaOaOaOaObsaa
+aabtbabababababababcbBbBbBbBbBbBbBbcbabababababababtaabubbbbbbbbbbbbbbbdbCbCbCbCbCbCbCbdbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbzbzbzbzbzbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbAbAbAbAbAbAbAbyaOaOaOaOaOaObsaa
+aabtbabababababababcbBbBbBbBbBbBbBbcbabababababababtaabubbbbbbbbbbbbbbbdbCbCbCbCbCbCbCbdbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbzbzbzbzbzbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbAbAbAbAbAbAbAbyaOaOaOaOaOaObsaa
+aabtbabababababababcbBbBbBbBbBbBbBbcbabababababababtaabubbbbbbbbbbbbbbbdbCbCbCbCbCbCbCbdbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbzbzbzbzbzbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbAbAbAbAbAbAbAbyaOaOaOaOaOaObsaa
+aabtbabababababababcbBbBbBbBbBbBbBbcbabababababababtaabubbbbbbbbbbbbbbbdbCbCbCbCbCbCbCbdbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbzbzbzbzbzbzbzbzbzbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybAbAbAbAbAbAbAbAbAbyaOaOaOaOaOaObsaa
+aabtbababababababcbcbBbBbBbBbBbBbBbcbcbababababababtaabubbbbbbbbbbbbbdbdbCbCbCbCbCbCbCbdbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPbxbxbzbzbzbzbzbzbzbxbxaPaPaPaPaPaPbraabsaOaOaOaOaOaObybybAbAbAbAbAbAbAbybyaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbBbBbBbBbBbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbCbCbCbCbCbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPbxbzbzbzbzbzbzbzbxaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaObybAbAbAbAbAbAbAbyaOaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbBbBbBbBbBbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbCbCbCbCbCbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPbxbzbzbzbzbzbzbzbxaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaObybAbAbAbAbAbAbAbyaOaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbBbBbBbBbBbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbCbCbCbCbCbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPbxbzbzbzbzbzbzbzbxaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaObybAbAbAbAbAbAbAbyaOaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbBbBbBbBbBbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbCbCbCbCbCbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPbxbzbzbzbzbzbzbzbxaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaObybAbAbAbAbAbAbAbyaOaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbBbBbBbBbBbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbCbCbCbCbCbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPbxbzbzbzbzbzbzbzbxaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaObybAbAbAbAbAbAbAbyaOaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbBbcbcbcbBbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbCbdbdbdbCbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPbxbxbzbzbzbzbzbxbxaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaObybybAbAbAbAbAbybyaOaOaOaOaOaOaObsaa
+aabtbababababababcbBbBbcbcbabcbcbBbBbcbababababababtaabubbbbbbbbbbbbbdbCbCbdbdbbbdbdbCbCbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPbxbxbxbxbxbxbxaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaObybybybybybybyaOaOaOaOaOaOaOaObsaa
+aabtbababababababcbcbcbcbabababcbcbcbcbababababababtaabubbbbbbbbbbbbbdbdbdbdbbbbbbbdbdbdbdbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabraPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPaPbraabsaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaOaObsaa
+aabtbabababababababababababababababababababababababtaabubbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbraabsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsbsaa
+aabtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtbtaabububububububububububububububububububububububububuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaabababababababababababababababababababababababababaa
+aabDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacbFbFbFbFacacacbFbFbFbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbGbGbGbGbGbGbGbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHaaaaaaaaaabHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbFbFacbFbFbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbGbGbJbJbJbJbJbGbGbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaabKbKbKbKbKaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHbHaaaaaabHbHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbIbFbFbFbIbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbGbJbJbJbJbJbJbJbGbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaabKbKbKbKbKbKbKaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHbHbHbHbHbHbHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbIbIbIbIbIbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbGbJbJbJbJbJbJbJbGbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaabKbKbKbKbKbKbKaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHbHbHbHbHbHbHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbIbIbIbIbIbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbGbJbJbJbJbJbJbJbGbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaabKbKbKbKbKbKbKaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHbHbHbHbHbHbHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbIbIbIbIbIbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbGbJbJbJbJbJbJbJbGbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaabKbKbKbKbKbKbKaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHbHbHbHbHbHbHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbIbIbIbIbIbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbEbGbJbJbJbJbJbJbJbGbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaabKbKbKbKbKbKbKaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaabHbHbHbHbHbHbHbHbHaaaaaaaaaaaaaaaCaaabacacacacacacbFbIbIbIbIbIbIbIbIbIbFacacacacacacabaa
+aabDbEbEbEbEbEbEbGbGbJbJbJbJbJbJbJbGbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaabKbKbKbKbKbKbKaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaabHbHbHbHbHbHbHaaaaaaaaaaaaaaaaaCaaabacacacacacacbFbFbIbIbIbIbIbIbIbFbFacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbJbJbJbJbJbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKbKbKbKbKbKbKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaabHbHbHbHbHbHbHaaaaaaaaaaaaaaaaaCaaabacacacacacacacbFbIbIbIbIbIbIbIbFacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbJbJbJbJbJbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKbKbKbKbKbKbKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaabHbHbHbHbHbHbHaaaaaaaaaaaaaaaaaCaaabacacacacacacacbFbIbIbIbIbIbIbIbFacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbJbJbJbJbJbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKbKbKbKbKbKbKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaabHbHbHbHbHbHbHaaaaaaaaaaaaaaaaaCaaabacacacacacacacbFbIbIbIbIbIbIbIbFacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbJbJbJbJbJbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKbKbKbKbKbKbKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaabHbHbHbHbHbHbHaaaaaaaaaaaaaaaaaCaaabacacacacacacacbFbIbIbIbIbIbIbIbFacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbJbJbJbJbJbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKbKbKbKbKbKbKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaabHbHbHbHbHbHbHaaaaaaaaaaaaaaaaaCaaabacacacacacacacbFbIbIbIbIbIbIbIbFacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbJbGbGbGbJbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKbKaaaaaabKbKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaabHbHbHbHbHaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacbFbFbIbIbIbIbIbFbFacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbJbJbGbGbEbGbGbJbJbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaabKbKaaaaaaaaaabKbKaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacbFbFbFbFbFbFbFacacacacacacacacabaa
+aabDbEbEbEbEbEbEbGbGbGbGbEbEbEbGbGbGbGbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvaOaOaOaOaOaOaOaOaOaOaOaOaObvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaabacacacacacacacacacacacacacacacacacacacacacacacabaa
+aabDbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbDaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabvbvbvbvbvbvbvbvbvbvbvbvbvbvbvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaabababababababababababababababababababababababababaa
+aabDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDbDaaaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm
index f7def727c1..69c5ae6c1d 100644
--- a/maps/southern_cross/southern_cross.dm
+++ b/maps/southern_cross/southern_cross.dm
@@ -4,10 +4,17 @@
#include "southern_cross_areas.dm"
#include "southern_cross_defines.dm"
+ #include "southern_cross_jobs.dm"
#include "southern_cross_elevator.dm"
#include "southern_cross_presets.dm"
#include "southern_cross_shuttles.dm"
+ #include "shuttles/crew_shuttles.dm"
+ #include "shuttles/heist.dm"
+ #include "shuttles/merc.dm"
+ #include "shuttles/ninja.dm"
+ #include "shuttles/ert.dm"
+
#include "structures/closets/engineering.dm"
#include "structures/closets/medical.dm"
#include "structures/closets/misc.dm"
diff --git a/maps/southern_cross/southern_cross_areas.dm b/maps/southern_cross/southern_cross_areas.dm
index 0e3a811774..e3a8e6a43e 100644
--- a/maps/southern_cross/southern_cross_areas.dm
+++ b/maps/southern_cross/southern_cross_areas.dm
@@ -951,9 +951,24 @@ area/crew_quarters/heads/sc/hop/quarters
name = "\improper docked with Southern Cross"
icon_state = "shuttle"
+/area/shuttle/response_ship/orbit
+ name = "in orbit of Sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/space
+
+/area/shuttle/response_ship/sky
+ name = "hovering over skies of sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/simulated/sky/west
+
+/area/shuttle/response_ship/sky_transit
+ name = "in flight over sif"
+ icon_state = "shuttlered"
+ base_turf = /turf/simulated/sky/moving/west
+
/area/shuttle/response_ship/transit
name = "transit"
- icon_state = "shuttle"
+ icon_state = "shuttlered"
base_turf = /turf/space
//Shuttle One
@@ -962,7 +977,7 @@ area/crew_quarters/heads/sc/hop/quarters
name = "\improper Hangar Deck"
icon_state = "yellow"
requires_power = 0
- dynamic_lighting = 0
+ dynamic_lighting = 1
flags = RAD_SHIELDED
/area/shuttle/shuttle1/start
@@ -989,13 +1004,28 @@ area/crew_quarters/heads/sc/hop/quarters
/area/shuttle/shuttle1/transit
name = "transit"
- icon_state = "shuttle"
+ icon_state = "shuttlered"
base_turf = /turf/space/transit/north
+/area/shuttle/shuttle1/orbit
+ name = "in orbit of Sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/space
+
+/area/shuttle/shuttle1/sky
+ name = "hovering over skies of sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/simulated/sky
+
+/area/shuttle/shuttle1/sky_transit
+ name = "in flight over sif"
+ icon_state = "shuttlered"
+ base_turf = /turf/simulated/sky/moving
+
//Shuttle Two
/area/shuttle/shuttle2
- name = "\improper SEV Torch Hangar Deck"
+ name = "\improper Hangar Deck"
icon_state = "yellow"
requires_power = 0
dynamic_lighting = 0
@@ -1025,9 +1055,24 @@ area/crew_quarters/heads/sc/hop/quarters
/area/shuttle/shuttle2/transit
name = "transit"
- icon_state = "shuttle"
+ icon_state = "shuttlered"
base_turf = /turf/space/transit/north
+/area/shuttle/shuttle2/orbit
+ name = "in orbit of Sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/space
+
+/area/shuttle/shuttle2/sky
+ name = "hovering over skies of sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/simulated/sky
+
+/area/shuttle/shuttle2/sky_transit
+ name = "in flight over sif"
+ icon_state = "shuttlered"
+ base_turf = /turf/simulated/sky/moving
+
// Centcom Transport Shuttle
/area/shuttle/transport1/centcom
icon_state = "shuttle"
@@ -1090,9 +1135,24 @@ area/crew_quarters/heads/sc/hop/quarters
/area/syndicate_station/transit
name = " transit"
- icon_state = "shuttle"
+ icon_state = "shuttlered"
base_turf = /turf/space/transit/east
+/area/syndicate_station/orbit
+ name = "in orbit of Sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/space
+
+/area/syndicate_station/sky
+ name = "hovering over skies of sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/simulated/sky/west
+
+/area/syndicate_station/sky_transit
+ name = "in flight over sif"
+ icon_state = "shuttlered"
+ base_turf = /turf/simulated/sky/moving/west
+
/area/syndicate_station/arrivals_dock
name = "\improper docked with Southern Cross"
icon_state = "shuttle"
@@ -1108,7 +1168,7 @@ area/crew_quarters/heads/sc/hop/quarters
/area/skipjack_station/transit
name = "transit"
- icon_state = "shuttle"
+ icon_state = "shuttlered"
base_turf = /turf/space/transit/north
/area/skipjack_station/firstdeck
@@ -1132,6 +1192,21 @@ area/crew_quarters/heads/sc/hop/quarters
icon_state = "shuttlered"
base_turf = /turf/simulated/floor/outdoors/grass/sif/planetuse
+/area/skipjack_station/orbit
+ name = "in orbit of Sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/space
+
+/area/skipjack_station/sky
+ name = "hovering over skies of sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/simulated/sky/north
+
+/area/skipjack_station/sky_transit
+ name = "in flight over sif"
+ icon_state = "shuttlered"
+ base_turf = /turf/simulated/sky/moving/north
+
/area/skipjack_station/arrivals_dock
name = "\improper docked with Southern Cross"
icon_state = "shuttle"
@@ -1175,9 +1250,24 @@ area/crew_quarters/heads/sc/hop/quarters
/area/ninja_dojo/transit
name = "transit"
- icon_state = "shuttle"
+ icon_state = "shuttlered"
base_turf = /turf/space/transit/north
+/area/ninja_dojo/orbit
+ name = "in orbit of Sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/space
+
+/area/ninja_dojo/sky
+ name = "hovering over skies of sif"
+ icon_state = "shuttlegrn"
+ base_turf = /turf/simulated/sky/south
+
+/area/ninja_dojo/sky_transit
+ name = "in flight over sif"
+ icon_state = "shuttlered"
+ base_turf = /turf/simulated/sky/moving/south
+
/area/ninja_dojo/arrivals_dock
name = "\improper docked with Southern Cross"
icon_state = "shuttle"
diff --git a/maps/southern_cross/southern_cross_defines.dm b/maps/southern_cross/southern_cross_defines.dm
index 40f3d4ef40..ebd5aa6d38 100644
--- a/maps/southern_cross/southern_cross_defines.dm
+++ b/maps/southern_cross/southern_cross_defines.dm
@@ -21,7 +21,7 @@
zlevel_datum_type = /datum/map_z_level/southern_cross
- station_name = "Southern Cross"
+ station_name = "NLS Southern Cross"
station_short = "Southern Cross"
dock_name = "NCS Northern Star" // Now we're the centcom!
boss_name = "Central Command"
@@ -155,5 +155,6 @@
expected_z_levels = list(
Z_LEVEL_SURFACE,
Z_LEVEL_SURFACE_MINE,
- Z_LEVEL_SURFACE_WILD
+ Z_LEVEL_SURFACE_WILD,
+ Z_LEVEL_TRANSIT
)
\ No newline at end of file
diff --git a/maps/southern_cross/southern_cross_jobs.dm b/maps/southern_cross/southern_cross_jobs.dm
new file mode 100644
index 0000000000..f2a4146c94
--- /dev/null
+++ b/maps/southern_cross/southern_cross_jobs.dm
@@ -0,0 +1,35 @@
+// Pilots
+/var/const/PILOT =(1<<15)
+/var/const/access_pilot = 67
+
+/datum/access/pilot
+ id = access_pilot
+ desc = "Pilot"
+ region = ACCESS_REGION_SUPPLY
+
+/datum/job/pilot
+ title = "Pilot"
+ flag = PILOT
+ department = "Cargo"
+ department_flag = CIVILIAN
+ faction = "Station"
+ total_positions = 2
+ spawn_positions = 2
+ supervisors = "the quartermaster and the head of personnel"
+ selection_color = "#515151"
+ idtype = /obj/item/weapon/card/id/cargo
+ access = list(access_pilot, access_cargo, access_mining, access_mining_station)
+ minimal_access = list(access_pilot, access_cargo, access_mining, access_mining_station)
+
+/datum/job/pilot/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H)
+ return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo/alt(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/cargo(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/fakesunglasses/aviator(H), slot_glasses)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/bomber(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/fingerless(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/flatcap(H), slot_head)
+ return 1
\ No newline at end of file
diff --git a/maps/southern_cross/southern_cross_shuttles.dm b/maps/southern_cross/southern_cross_shuttles.dm
index b42cebcc82..6b8483b74c 100644
--- a/maps/southern_cross/southern_cross_shuttles.dm
+++ b/maps/southern_cross/southern_cross_shuttles.dm
@@ -1,87 +1,15 @@
-//ERT Response Shuttle
-
-/obj/machinery/computer/shuttle_control/multi/response
- name = "response shuttle console"
- shuttle_tag = "Response Operations"
- req_access = list(access_cent_specops)
-
-/datum/shuttle/multi_shuttle/response
- name = "Response Operations"
- warmup_time = 5
- origin = /area/shuttle/response_ship/start
- interim = /area/shuttle/response_ship/transit
- start_location = "Response Team Ship"
- destinations = list(
- "Northwest of First deck" = /area/shuttle/response_ship/firstdeck,
- "Southeast of Second deck" = /area/shuttle/response_ship/seconddeck,
- "Northeast of Third deck" = /area/shuttle/response_ship/thirddeck,
- "Planetside Site" = /area/shuttle/response_ship/planet,
- "Docking Port" = /area/shuttle/response_ship/arrivals_dock,
- )
- docking_controller_tag = "response_shuttle"
- destination_dock_targets = list(
- "Response Team Base" = "response_ship",
- "Docking Port" = "response_shuttle_dock_airlock",
- )
-
-//Shuttle 1
-
-/obj/machinery/computer/shuttle_control/multi/shuttle1
- name = "shuttle control console"
- shuttle_tag = "Shuttle 1"
- icon_screen = "shuttle"
-
-/datum/shuttle/multi_shuttle/shuttle1
- name = "Shuttle 1"
- warmup_time = 0
- origin = /area/shuttle/shuttle1/start
- interim = /area/shuttle/shuttle1/transit
- start_location = "Southern Cross Hangar One"
- destinations = list(
- "South of Second Deck" = /area/shuttle/shuttle1/seconddeck,
- "Planetside Site" = /area/shuttle/shuttle1/planet,
- "Docking Port" = /area/shuttle/shuttle1/arrivals_dock,
- )
- docking_controller_tag = "shuttle1_shuttle"
- destination_dock_targets = list(
- "Hangar One" = "hangar_ship",
- "Southern Cross Docking Port" = "shuttle1_dock_airlocksc",
- )
- announcer = "Southern Cross Docking Computer"
- // This look backwards because the code expects an outsider shuttle to be coming in, so we reverse it since the 'home' base is the station.
- arrival_message = "Attention, shuttle one departing. Clear Hangar Deck One."
- departure_message = "Attention, shuttle one returning. Clear Hangar Deck One."
-
-//Shuttle 2
-
-/obj/machinery/computer/shuttle_control/multi/shuttle2
- name = "shuttle control console"
- shuttle_tag = "Shuttle 2"
- icon_screen = "shuttle"
-
-/datum/shuttle/multi_shuttle/shuttle2
- name = "Shuttle 2"
- warmup_time = 0
- origin = /area/shuttle/shuttle2/start
- interim = /area/shuttle/shuttle2/transit
- start_location = "Southern Cross Hangar One"
- destinations = list(
- "South of Second Deck" = /area/shuttle/shuttle2/seconddeck,
- "Planetside Site" = /area/shuttle/shuttle2/planet,
- "Docking Port" = /area/shuttle/shuttle2/arrivals_dock,
- )
- docking_controller_tag = "shuttle2_shuttle"
- destination_dock_targets = list(
- "Hangar One" = "hangar_ship",
- "Southern Cross Docking Port" = "shuttle2_dock_airlocksc",
- )
- announcer = "Southern Cross Docking Computer"
- // This look backwards because the code expects an outsider shuttle to be coming in, so we reverse it since the 'home' base is the station.
- arrival_message = "Attention, shuttle one departing. Clear Hangar Deck Two."
- departure_message = "Attention, shuttle one returning. Clear Hangar Deck Two."
+// Cargo shuttle.
+/datum/shuttle/ferry/supply/cargo
+ name = "Supply"
+ location = 1
+ warmup_time = 10
+ area_offsite = /area/supply/dock
+ area_station = /area/supply/station
+ docking_controller_tag = "supply_shuttle"
+ dock_target_station = "cargo_bay"
+ flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY
//Admin
-
/obj/machinery/computer/shuttle_control/administration
name = "shuttle control console"
req_access = list(access_cent_general)
@@ -116,74 +44,26 @@
//Merc
-/obj/machinery/computer/shuttle_control/multi/syndicate
- name = "mercenary shuttle control console"
- req_access = list(access_syndicate)
- shuttle_tag = "Mercenary"
-
-/datum/shuttle/multi_shuttle/mercenary
- name = "Mercenary"
- warmup_time = 0
- can_cloak = TRUE
- cloaked = TRUE
- origin = /area/syndicate_station/start
- interim = /area/syndicate_station/transit
- start_location = "Mercenary Ship"
- destinations = list(
- "Northwest of First Deck" = /area/syndicate_station/firstdeck,
- "Northeast of the Second deck" = /area/syndicate_station/seconddeck,
- "Southeast of Third deck" = /area/syndicate_station/thirddeck,
- "Planetside" = /area/syndicate_station/planet,
- "Docking Port" = /area/syndicate_station/arrivals_dock,
- )
- docking_controller_tag = "merc_shuttle"
- destination_dock_targets = list(
- "Forward Operating Base" = "merc_base",
- "Docking Port" = "nuke_shuttle_dock_airlock",
- )
- announcer = "Southern Cross Docking Computer"
-
-/datum/shuttle/multi_shuttle/mercenary/New()
- arrival_message = "Attention, vessel docking with the Southern Cross."
- departure_message = "Attention, vessel docking with the Southern Cross."
- ..()
-
//Skipjack
-
+/*
/obj/machinery/computer/shuttle_control/multi/skipjack
name = "skipjack control console"
req_access = list(access_syndicate)
shuttle_tag = "Skipjack"
-/datum/shuttle/multi_shuttle/skipjack
- name = "Skipjack"
- warmup_time = 0
- can_cloak = TRUE
- cloaked = TRUE
- origin = /area/skipjack_station/start
- interim = /area/skipjack_station/transit
- destinations = list(
- "North of First deck" = /area/skipjack_station/firstdeck,
- "West of Second deck" = /area/skipjack_station/seconddeck,
- "East of Third deck" = /area/skipjack_station/thirddeck,
- "Planet" = /area/skipjack_station/planet,
- "Docking Port" = /area/skipjack_station/arrivals_dock,
- )
- docking_controller_tag = "skipjack_shuttle"
- destination_dock_targets = list(
- "Raider Outpost" = "skipjack_base",
- "Docking Port" = "skipjack_shuttle_dock_airlock",
- )
- announcer = "Automated Traffic Control"
+
/datum/shuttle/multi_shuttle/skipjack/New()
arrival_message = "Attention. Unidentified object approaching the station."
departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity."
..()
+*/
+
+
//Ninja Shuttle.
-
+/*
/obj/machinery/computer/shuttle_control/multi/ninja
name = "stealth shuttle control console"
req_access = list(access_syndicate)
@@ -210,6 +90,11 @@
announcer = "Southern Cross Sensor Array"
arrival_message = "Attention, anomalous sensor reading detected entering station proximity."
departure_message = "Attention, anomalous sensor reading detected leaving station proximity."
+*/
+
+
+
+
//Trade Ship
@@ -382,4 +267,43 @@
dock_target_station = "large_escape_pod_2_berth"
dock_target_offsite = "large_escape_pod_2_recovery"
transit_direction = EAST
- move_time = SHUTTLE_TRANSIT_DURATION_RETURN
\ No newline at end of file
+ move_time = SHUTTLE_TRANSIT_DURATION_RETURN
+
+
+
+// Destination datums
+
+
+
+// Mercenary Shuttle
+
+
+// Ninja shuttle
+/*
+/datum/shuttle/multi_shuttle/skipjack
+ name = "Skipjack"
+ warmup_time = 0
+ can_cloak = TRUE
+ cloaked = TRUE
+ origin = /area/skipjack_station/start
+ interim = /area/skipjack_station/transit
+ destinations = list(
+ "North of First deck" = /area/skipjack_station/firstdeck,
+ "West of Second deck" = /area/skipjack_station/seconddeck,
+ "East of Third deck" = /area/skipjack_station/thirddeck,
+ "Planet" = /area/skipjack_station/planet,
+ "Docking Port" = /area/skipjack_station/arrivals_dock,
+ )
+ docking_controller_tag = "skipjack_shuttle"
+ destination_dock_targets = list(
+ "Raider Outpost" = "skipjack_base",
+ "Docking Port" = "skipjack_shuttle_dock_airlock",
+ )
+ announcer = "Automated Traffic Control"
+*/
+
+
+
+// Heist shuttle
+
+
diff --git a/maps/tether/tether-01-surface.dmm b/maps/tether/tether-01-surface.dmm
index 9c40a74309..7bec65a7c0 100644
--- a/maps/tether/tether-01-surface.dmm
+++ b/maps/tether/tether-01-surface.dmm
@@ -1944,11 +1944,11 @@
"aLt" = (/obj/effect/floor_decal/techfloor,/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
"aLu" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
"aLv" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/binary/pump/high_power/on{dir = 4; icon_state = "map_on"; name = "Waste to Filtering"; tag = "icon-map_on (EAST)"},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
-"aLw" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
+"aLw" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 6; tag_south = 0; tag_west = 1},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
"aLx" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
"aLy" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
"aLz" = (/obj/effect/floor_decal/techfloor,/obj/machinery/camera/network/engineering{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
-"aLA" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/omni/filter{tag_east = 5; tag_north = 2; tag_south = 0; tag_west = 1},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
+"aLA" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 5; tag_north = 2; tag_south = 0; tag_west = 1},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing)
"aLB" = (/obj/machinery/light_switch{pixel_y = -25},/obj/machinery/atmospherics/pipe/simple/visible/black{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/effect/floor_decal/techfloor,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos/processing)
"aLC" = (/obj/machinery/light,/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/techfloor,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos/processing)
"aLD" = (/obj/effect/floor_decal/techfloor,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos/processing)
@@ -3329,7 +3329,7 @@
"bma" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/turf/simulated/open,/area/engineering/atmos)
"bmb" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
"bmc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
-"bmd" = (/obj/machinery/atmospherics/omni/filter{tag_east = 7; tag_north = 2; tag_south = 1},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
+"bmd" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 7; tag_north = 2; tag_south = 1},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bme" = (/obj/machinery/atmospherics/binary/pump/high_power/on{tag = "icon-map_on (EAST)"; icon_state = "map_on"; dir = 4},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bmf" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bmg" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
@@ -3339,7 +3339,7 @@
"bmk" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bml" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bmm" = (/obj/machinery/atmospherics/valve/digital/open{dir = 4; icon_state = "map_valve1"; tag = "icon-map_valve1 (WEST)"},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
-"bmn" = (/obj/machinery/atmospherics/omni/filter{tag_north = 1; tag_south = 2; tag_west = 4},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
+"bmn" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_north = 1; tag_south = 2; tag_west = 4},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bmo" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
"bmp" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
"bmq" = (/obj/structure/railing{dir = 8},/turf/simulated/open,/area/engineering/atmos)
@@ -3369,7 +3369,7 @@
"bmO" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south)
"bmP" = (/obj/effect/floor_decal/industrial/warning/dust{dir = 8},/obj/effect/floor_decal/industrial/warning/dust{dir = 4},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/engineering/atmos/intake)
"bmQ" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{dir = 6},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
-"bmR" = (/obj/machinery/atmospherics/omni/filter{tag_north = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
+"bmR" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_north = 1; tag_south = 2; tag_west = 3},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos)
"bmS" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
"bmT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
"bmU" = (/obj/machinery/light_switch{pixel_x = 25},/obj/effect/floor_decal/techfloor{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos)
@@ -3620,7 +3620,7 @@
"brF" = (/obj/machinery/exonet_node{anchored = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"brG" = (/obj/machinery/camera/network/telecom{dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"brH" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"})
-"brI" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/machinery/camera/network/telecom{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"})
+"brI" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/item/weapon/stock_parts/subspace/sub_filter,/obj/machinery/camera/network/telecom{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"})
"brJ" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"})
"brK" = (/obj/structure/sign/nosmoking_2{pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
"brL" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber)
diff --git a/maps/tether/tether-03-station.dmm b/maps/tether/tether-03-station.dmm
index 1ffbf286a8..176ba0e4a7 100644
--- a/maps/tether/tether-03-station.dmm
+++ b/maps/tether/tether-03-station.dmm
@@ -276,7 +276,7 @@
"afp" = (/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/machinery/door/blast/regular{dir = 4; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor,/area/engineering/engine_room)
"afq" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = "engine_access_hatch"; locked = 1; req_access = list(11)},/turf/simulated/floor/reinforced,/area/engineering/engine_room)
"afr" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; pixel_x = -25; pixel_y = 5; req_access = list(10)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine charging port."; id = "SupermatterPort"; name = "Reactor Blast Doors"; pixel_x = -25; pixel_y = -5; req_access = list(10)},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_room)
-"afs" = (/obj/machinery/atmospherics/omni/filter,/turf/simulated/floor,/area/engineering/engine_room)
+"afs" = (/obj/machinery/atmospherics/omni/atmos_filter,/turf/simulated/floor,/area/engineering/engine_room)
"aft" = (/obj/machinery/light/small,/turf/space,/area/maintenance/station/sec_upper)
"afu" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 1},/turf/simulated/floor,/area/engineering/engine_room)
"afv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_3)
@@ -928,7 +928,7 @@
"arR" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos/backup)
"arS" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/maintenance/station/sec_upper)
"arT" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 4},/obj/machinery/camera/network/engineering{dir = 8},/obj/machinery/meter,/obj/machinery/light_switch{dir = 8; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos/backup)
-"arU" = (/obj/machinery/atmospherics/omni/filter{tag_east = 2; tag_north = 1; tag_south = 4; tag_west = 3},/turf/simulated/floor/tiled,/area/engineering/atmos/backup)
+"arU" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 2; tag_north = 1; tag_south = 4; tag_west = 3},/turf/simulated/floor/tiled,/area/engineering/atmos/backup)
"arV" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -28},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled,/area/engineering/workshop)
"arW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/engineering/workshop)
"arX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/workshop)
diff --git a/maps/tether/tether-04-mining.dmm b/maps/tether/tether-04-mining.dmm
index f518e874a5..6ff4e01ac7 100644
--- a/maps/tether/tether-04-mining.dmm
+++ b/maps/tether/tether-04-mining.dmm
@@ -41,8 +41,8 @@
"aO" = (/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/obj/structure/grille,/turf/simulated/floor/plating,/area/outpost/mining_main/break_room)
"aP" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
"aQ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
-"aR" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 3; tag_south = 2},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
-"aS" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 4; tag_west = 2},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
+"aR" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 3; tag_south = 2},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
+"aS" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 1; tag_north = 4; tag_west = 2},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
"aT" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
"aU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/visible/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
"aV" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/techfloor{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics)
diff --git a/maps/tether/tether-05-solars.dmm b/maps/tether/tether-05-solars.dmm
index 9f417258f9..8d2115c57d 100644
--- a/maps/tether/tether-05-solars.dmm
+++ b/maps/tether/tether-05-solars.dmm
@@ -220,7 +220,7 @@
"el" = (/obj/machinery/atmospherics/pipe/simple/visible{icon_state = "intact"; dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 9},/obj/machinery/meter,/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
"em" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 5},/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
"en" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
-"eo" = (/obj/machinery/atmospherics/trinary/filter{dir = 4; name = "High Power Gas filter"; power_rating = 15000; use_power = 0},/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
+"eo" = (/obj/machinery/atmospherics/trinary/atmos_filter{dir = 4; name = "High Power Gas filter"; power_rating = 15000; use_power = 0},/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
"ep" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/black,/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
"eq" = (/obj/machinery/atmospherics/unary/heater{dir = 1; icon_state = "heater"},/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 10},/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/rnd/outpost/mixing)
"er" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/rnd/outpost/testing)
@@ -345,7 +345,7 @@
"gG" = (/obj/machinery/atmospherics/pipe/simple/visible/red{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor,/area/rnd/outpost/atmos)
"gH" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/red{dir = 6},/turf/simulated/floor,/area/rnd/outpost/atmos)
"gI" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/yellow{dir = 4},/turf/simulated/floor,/area/rnd/outpost/atmos)
-"gJ" = (/obj/machinery/atmospherics/omni/filter{tag_east = 3; tag_north = 4; tag_south = 2; tag_west = 1},/turf/simulated/floor,/area/rnd/outpost/atmos)
+"gJ" = (/obj/machinery/atmospherics/omni/atmos_filter{tag_east = 3; tag_north = 4; tag_south = 2; tag_west = 1},/turf/simulated/floor,/area/rnd/outpost/atmos)
"gK" = (/turf/simulated/wall/r_wall,/area/rnd/outpost/chamber)
"gL" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; external_pressure_bound = 0; frequency = 1445; icon_state = "map_vent_in"; id_tag = "burn_out"; initialize_directions = 4; layer = 2.4; pump_direction = 0},/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 10},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"gM" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 6},/obj/machinery/sparker{id = "burn_chamber"; pixel_x = -24},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
@@ -390,7 +390,7 @@
"hz" = (/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor,/area/rnd/outpost/atmos)
"hA" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 4},/turf/simulated/floor,/area/rnd/outpost/atmos)
"hB" = (/obj/machinery/portable_atmospherics/canister/empty/phoron,/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/rnd/outpost/atmos)
-"hC" = (/obj/machinery/atmospherics/trinary/filter/m_filter{filter_type = 0; filtered_out = list("phoron")},/turf/simulated/floor,/area/rnd/outpost/atmos)
+"hC" = (/obj/machinery/atmospherics/trinary/atmos_filter/m_filter{filter_type = 0; filtered_out = list("phoron")},/turf/simulated/floor,/area/rnd/outpost/atmos)
"hD" = (/obj/machinery/atmospherics/pipe/manifold/visible/black{dir = 4},/obj/machinery/door/blast/regular{dir = 2; id = "burn_chamber_p"; name = "Burn Chamber Purge"},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"hE" = (/obj/machinery/air_sensor{frequency = 1445; id_tag = "burn_sensor"; output = 63},/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/machinery/camera/network/research_outpost{dir = 8},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"hF" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -28},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/binary/pump/on{dir = 1; target_pressure = 200},/turf/simulated/floor/reinforced/virgo3b,/area/rnd/outpost/chamber)
@@ -407,7 +407,7 @@
"hQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/rnd/outpost/atmos)
"hR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/rnd/outpost/atmos)
"hS" = (/obj/machinery/portable_atmospherics/canister/empty/carbon_dioxide,/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/rnd/outpost/atmos)
-"hT" = (/obj/machinery/atmospherics/trinary/filter/m_filter{filter_type = 3; filtered_out = list("carbon_dioxide")},/turf/simulated/floor,/area/rnd/outpost/atmos)
+"hT" = (/obj/machinery/atmospherics/trinary/atmos_filter/m_filter{filter_type = 3; filtered_out = list("carbon_dioxide")},/turf/simulated/floor,/area/rnd/outpost/atmos)
"hU" = (/obj/machinery/atmospherics/pipe/manifold/visible/black,/obj/machinery/door/blast/regular{dir = 2; id = "burn_chamber_p"; name = "Burn Chamber Purge"},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"hV" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging,/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"hW" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/turf/simulated/floor/reinforced/virgo3b,/area/tether/outpost/solars_outside)
@@ -427,7 +427,7 @@
"ik" = (/turf/simulated/floor,/area/rnd/outpost/atmos)
"il" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor,/area/rnd/outpost/atmos)
"im" = (/obj/machinery/portable_atmospherics/canister/empty/sleeping_agent,/obj/machinery/atmospherics/pipe/simple/visible/black,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor,/area/rnd/outpost/atmos)
-"in" = (/obj/machinery/atmospherics/trinary/filter/m_filter{filter_type = 4; filtered_out = list("sleeping_agent")},/turf/simulated/floor,/area/rnd/outpost/atmos)
+"in" = (/obj/machinery/atmospherics/trinary/atmos_filter/m_filter{filter_type = 4; filtered_out = list("sleeping_agent")},/turf/simulated/floor,/area/rnd/outpost/atmos)
"io" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1445; id = "burn_in"; volume_rate = 700},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"ip" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction{dir = 1},/obj/machinery/sparker{id = "burn_chamber"; pixel_x = -24},/turf/simulated/floor/reinforced/airless,/area/rnd/outpost/chamber)
"iq" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/reinforced/virgo3b,/area/tether/outpost/solars_outside)
diff --git a/maps/tether/tether_phoronlock.dm b/maps/tether/tether_phoronlock.dm
index b97c3a48a0..61206cbcf0 100644
--- a/maps/tether/tether_phoronlock.dm
+++ b/maps/tether/tether_phoronlock.dm
@@ -32,7 +32,7 @@ obj/machinery/airlock_sensor/phoron/process()
signal.data["timestamp"] = world.time
signal.data["pressure"] = num2text(pressure)
signal.data["phoron"] = num2text(phoron)
- radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, radio_filter = RADIO_AIRLOCK)
previousPressure = pressure
previousPhoron = phoron
alert = (pressure < ONE_ATMOSPHERE*0.8) || (phoron > 0.5)
@@ -59,7 +59,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior
radio_controller.remove_object(src, frequency)
frequency = new_frequency
if(frequency)
- radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA)
+ radio_connection = radio_controller.add_object(src, frequency, radio_filter = RADIO_ATMOSIA)
/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary/receive_signal(datum/signal/signal)
if(!signal.data["tag"] || (signal.data["tag"] != scrub_id) || (signal.data["sigtype"] != "command"))
@@ -88,7 +88,7 @@ obj/machinery/airlock_sensor/phoron/airlock_exterior
"power" = on,
"sigtype" = "status"
)
- radio_connection.post_signal(src, signal, filter = RADIO_AIRLOCK)
+ radio_connection.post_signal(src, signal, radio_filter = RADIO_AIRLOCK)
return 1
//
diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl
index 2e8c6cad23..2cd4d576c0 100644
--- a/nano/templates/adv_med.tmpl
+++ b/nano/templates/adv_med.tmpl
@@ -18,9 +18,9 @@ Used In File(s): \code\game\machinery\adv_med.dm
Health:
- {{:helper.displayBar(data.occupant.health, 0, 100, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 25) ? 'average' : 'bad')}}
+ {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 25) ? 'average' : 'bad')}}
- {{:helper.round(data.occupant.health*10)/10}}%
+ {{:helper.round(data.occupant.health / data.occupant.maxHealth)*100}}%
diff --git a/nano/templates/flight.tmpl b/nano/templates/flight.tmpl
new file mode 100644
index 0000000000..b3c27dc9cd
--- /dev/null
+++ b/nano/templates/flight.tmpl
@@ -0,0 +1,121 @@
+
Shuttle Status
+{{if data.is_moving == 0}}
+
+
+ Current Location:
+
+
+ {{:data.shuttle_location}}
+
+
+{{/if}}
+
+
+
+
+ Engines:
+
+
+ {{if data.shuttle_state == "idle"}}
+ IDLE
+ {{else data.shuttle_state == "warmup"}}
+ SPINNING UP
+ {{else data.shuttle_state == "in_transit"}}
+ ENGAGED
+ {{else}}
+ ERROR
+ {{/if}}
+
+
+
+
+{{if data.is_moving == 0}}
+
+ {{if data.skip_docking == 0}}
+
+
+
+ Docking Status:
+
+
+ {{if data.docking_status == "docked"}}
+ DOCKED
+ {{else data.docking_status == "docking"}}
+ {{if !data.docking_override}}
+ DOCKING
+ {{else}}
+ DOCKING-MANUAL
+ {{/if}}
+ {{else data.docking_status == "undocking"}}
+ {{if !data.docking_override}}
+ UNDOCKING
+ {{else}}
+ UNDOCKING-MANUAL
+ {{/if}}
+ {{else data.docking_status == "undocked"}}
+ UNDOCKED
+ {{else}}
+ ERROR
+ {{/if}}
+
+
+ {{:helper.link('Dock', 'arrowthickstop-1-e', {'dock_command' : 1}, (data.docking_status != "undocked")? 'selected' : null)}}
+ {{:helper.link('Undock', 'arrowthickstop-1-e', {'undock_command' : 1}, (data.docking_status != "docked")? 'selected' : null)}}
+
+
+
+
+
+
+ {{/if}}
+
+ {{if data.can_cloak == 1}}
+
+
+ Shuttle Stealth System:
+
+
+ {{:helper.link('Cloak', 'radio-off', {'cloak_command' : 1}, (data.cloaked == 1)? 'selected' : null)}}
+ {{:helper.link('Uncloak', 'radio-on', {'uncloak_command' : 1}, (data.cloaked == 0)? 'selected' : null)}}
+
+
+ {{/if}}
+
+{{/if}}
+
+{{if data.is_moving == 0}}
+ Available Destinations
+
+
+
+ {{for data.routes}}
+
+
+ {{:value.name}}
+
+
+
+ {{:helper.link(value.travel_time, 'clock', {"traverse" : value.index})}}
+
+
+
+
+
+ {{/for}}
+
+{{/if}}
+
+{{if data.is_in_transit == 1}}
+ Destination ETA
+
+
+ Distance from target:
+
+
+ {{:helper.displayBar(data.travel_progress, 0, 100, "good")}}
+
+ {{:data.time_left}}s
+
+
+
+{{/if}}
diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl
index 7ee370e890..a0e9da787c 100644
--- a/nano/templates/sleeper.tmpl
+++ b/nano/templates/sleeper.tmpl
@@ -16,7 +16,7 @@
Occupant status:
- Health: {{:data.health}}% ({{:data.stat}}).
+ Health: {{:helper.round(data.health / data.maxHealth)*100}}% ({{:data.stat}}).
Pulse:
@@ -49,7 +49,7 @@
{{:helper.displayBar(data.tox, 0, 100, (data.tox <= 25) ? 'good' : (data.tox <= 50) ? 'average' : 'bad')}}{{:helper.round(data.tox)}}
- {{:helper.link(data.filtering ? "Dialysis active" : "Dialysis inactive", null, {'filter' : !data.filtering})}}
+ {{:helper.link(data.filtering ? "Dialysis active" : "Dialysis inactive", null, {'sleeper_filter' : !data.filtering})}}
{{:helper.link("Eject occupant", null, {'eject' : 0})}}
diff --git a/sound/ambience/alarm4old.ogg b/sound/ambience/alarm4old.ogg
new file mode 100644
index 0000000000..a86bfd155f
Binary files /dev/null and b/sound/ambience/alarm4old.ogg differ
diff --git a/sound/weapons/railgun.ogg b/sound/weapons/railgun.ogg
new file mode 100644
index 0000000000..0b939fd9a6
Binary files /dev/null and b/sound/weapons/railgun.ogg differ