diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md
index 40f9d1de62..60f2305a8c 100644
--- a/ATTRIBUTIONS.md
+++ b/ATTRIBUTIONS.md
@@ -66,4 +66,10 @@
**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/153)
**URL:** [Website](https://rogue-star.net/)
**License:** [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)
-**Notes:** Permission to use assets also given in writing. These new icon-states are modifications of existing icon-states.
\ No newline at end of file
+**Notes:** Permission to use assets also given in writing. These new icon-states are modifications of existing icon-states.
+
+**Folder:** `sound/vore/sunesound`
+**Title:** Vore Sounds
+**Creator:** Poojawa (https://github.com/VOREStation/VOREStation/pull/6052)
+**License:** [General License](sound/vore/sunesound/LICENSE.txt)
+**Notes:** Permission to use assets also given in writing. All files under this folder is NOT licensed under CC3. Seek separate permission before copying/using.
diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm
index 2cd7403096..ed391dec5f 100644
--- a/code/ATMOSPHERICS/components/unary/cold_sink.dm
+++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm
@@ -87,7 +87,7 @@
/obj/machinery/atmospherics/unary/freezer/tgui_act(action, params)
if(..())
return TRUE
-
+
. = TRUE
switch(action)
if("toggleStatus")
@@ -173,3 +173,5 @@
. = ..()
if(panel_open)
. += "The maintenance hatch is open."
+
+#undef FREEZER_PERF_MULT
diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm
index efd3a56d8b..85b0dcb821 100644
--- a/code/ATMOSPHERICS/components/unary/heat_source.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_source.dm
@@ -160,3 +160,5 @@
. = ..()
if(panel_open)
. += "The maintenance hatch is open."
+
+#undef HEATER_PERF_MULT
diff --git a/code/__defines/SDQL_2.dm b/code/__defines/SDQL_2.dm
new file mode 100644
index 0000000000..273d42158e
--- /dev/null
+++ b/code/__defines/SDQL_2.dm
@@ -0,0 +1,2 @@
+#define SDQL2_VALID_OPTION_TYPES list("proccall", "select", "priority", "autogc")
+#define SDQL2_VALID_OPTION_VALUES list("async", "blocking", "force_nulls", "skip_nulls", "high", "normal", "keep_alive")
diff --git a/code/__defines/_planes+layers_vr.dm b/code/__defines/_planes+layers_vr.dm
index 125f492cd7..a9266aa701 100644
--- a/code/__defines/_planes+layers_vr.dm
+++ b/code/__defines/_planes+layers_vr.dm
@@ -3,5 +3,6 @@
#define PLANE_CH_STATUS_R 27 //Right-side status icon
#define PLANE_CH_BACKUP 28 //Backup implant
#define PLANE_CH_VANTAG 29 //Vore Antag hud
+#define PLANE_CH_STOMACH -11 //Stomach Plane
#define PLANE_AUGMENTED 40 //Augmented-reality plane
diff --git a/code/__defines/action.dm b/code/__defines/action.dm
new file mode 100644
index 0000000000..bdbe228777
--- /dev/null
+++ b/code/__defines/action.dm
@@ -0,0 +1,5 @@
+#define AB_CHECK_RESTRAINED 1
+#define AB_CHECK_STUNNED 2
+#define AB_CHECK_LYING 4
+#define AB_CHECK_ALIVE 8
+#define AB_CHECK_INSIDE 16
diff --git a/code/__defines/airlock_control.dm b/code/__defines/airlock_control.dm
new file mode 100644
index 0000000000..51667f18cc
--- /dev/null
+++ b/code/__defines/airlock_control.dm
@@ -0,0 +1 @@
+#define AIRLOCK_CONTROL_RANGE 22
diff --git a/code/__defines/ammunition.dm b/code/__defines/ammunition.dm
new file mode 100644
index 0000000000..001e4bb5d6
--- /dev/null
+++ b/code/__defines/ammunition.dm
@@ -0,0 +1,4 @@
+//Gun loading types
+#define SINGLE_CASING 1 //The gun only accepts ammo_casings. ammo_magazines should never have this as their mag_type.
+#define SPEEDLOADER 2 //Transfers casings from the mag to the gun when used.
+#define MAGAZINE 4 //The magazine item itself goes inside the gun
diff --git a/code/__defines/assemblies.dm b/code/__defines/assemblies.dm
new file mode 100644
index 0000000000..898c4d9020
--- /dev/null
+++ b/code/__defines/assemblies.dm
@@ -0,0 +1,2 @@
+#define IC_COMPONENTS_BASE 20
+#define IC_COMPLEXITY_BASE 60
diff --git a/code/__defines/blueprints.dm b/code/__defines/blueprints.dm
new file mode 100644
index 0000000000..e00528d8af
--- /dev/null
+++ b/code/__defines/blueprints.dm
@@ -0,0 +1,5 @@
+//TG blueprints.
+#define AREA_ERRNONE 0
+#define AREA_STATION 1
+#define AREA_SPACE 2
+#define AREA_SPECIAL 3
diff --git a/code/__defines/chemistry_vr.dm b/code/__defines/chemistry_vr.dm
index cc2a46f46d..178fb8c73b 100644
--- a/code/__defines/chemistry_vr.dm
+++ b/code/__defines/chemistry_vr.dm
@@ -2,4 +2,5 @@
#define IS_CHIMERA 12
#define IS_SHADEKIN 13
#define IS_ALRAUNE 14
-#define IS_GREY 15 //ywedit
\ No newline at end of file
+#define IS_LLEILL 15
+#define IS_GREY 16 //ywedit
diff --git a/code/__defines/circuitboard.dm b/code/__defines/circuitboard.dm
new file mode 100644
index 0000000000..ca1227af12
--- /dev/null
+++ b/code/__defines/circuitboard.dm
@@ -0,0 +1,2 @@
+//Define a macro that we can use to assemble all the circuit board names
+#define T_BOARD(name) "circuit board (" + (name) + ")"
diff --git a/code/__defines/cloning.dm b/code/__defines/cloning.dm
new file mode 100644
index 0000000000..afe478f749
--- /dev/null
+++ b/code/__defines/cloning.dm
@@ -0,0 +1 @@
+#define CLONE_BIOMASS 30 //VOREstation Edit
diff --git a/code/__defines/construction_datum.dm b/code/__defines/construction_datum.dm
new file mode 100644
index 0000000000..7a0586d365
--- /dev/null
+++ b/code/__defines/construction_datum.dm
@@ -0,0 +1,2 @@
+#define FORWARD -1
+#define BACKWARD 1
diff --git a/code/__defines/dna.dm b/code/__defines/dna.dm
index cb1d2ad7e7..ecf85abcd9 100644
--- a/code/__defines/dna.dm
+++ b/code/__defines/dna.dm
@@ -74,3 +74,67 @@ var/HALLUCINATIONBLOCK = 0
var/NOPRINTSBLOCK = 0
var/SHOCKIMMUNITYBLOCK = 0
var/SMALLSIZEBLOCK = 0
+
+// Define block bounds (off-low,off-high,on-low,on-high)
+// Used in setupgame.dm
+#define DNA_DEFAULT_BOUNDS list(1,2049,2050,4095)
+#define DNA_HARDER_BOUNDS list(1,3049,3050,4095)
+#define DNA_HARD_BOUNDS list(1,3490,3500,4095)
+
+// UI Indices (can change to mutblock style, if desired)
+#define DNA_UI_HAIR_R 1
+#define DNA_UI_HAIR_G 2
+#define DNA_UI_HAIR_B 3
+#define DNA_UI_BEARD_R 4
+#define DNA_UI_BEARD_G 5
+#define DNA_UI_BEARD_B 6
+#define DNA_UI_SKIN_TONE 7
+#define DNA_UI_SKIN_R 8
+#define DNA_UI_SKIN_G 9
+#define DNA_UI_SKIN_B 10
+#define DNA_UI_EYES_R 11
+#define DNA_UI_EYES_G 12
+#define DNA_UI_EYES_B 13
+#define DNA_UI_GENDER 14
+#define DNA_UI_BEARD_STYLE 15
+#define DNA_UI_HAIR_STYLE 16
+#define DNA_UI_EAR_STYLE 17 // VOREStation snippet.
+#define DNA_UI_TAIL_STYLE 18
+#define DNA_UI_PLAYERSCALE 19
+#define DNA_UI_TAIL_R 20
+#define DNA_UI_TAIL_G 21
+#define DNA_UI_TAIL_B 22
+#define DNA_UI_TAIL2_R 23
+#define DNA_UI_TAIL2_G 24
+#define DNA_UI_TAIL2_B 25
+#define DNA_UI_TAIL3_R 26
+#define DNA_UI_TAIL3_G 27
+#define DNA_UI_TAIL3_B 28
+#define DNA_UI_EARS_R 29
+#define DNA_UI_EARS_G 30
+#define DNA_UI_EARS_B 31
+#define DNA_UI_EARS2_R 32
+#define DNA_UI_EARS2_G 33
+#define DNA_UI_EARS2_B 34
+#define DNA_UI_EARS3_R 35
+#define DNA_UI_EARS3_G 36
+#define DNA_UI_EARS3_B 37
+#define DNA_UI_WING_STYLE 38
+#define DNA_UI_WING_R 39
+#define DNA_UI_WING_G 40
+#define DNA_UI_WING_B 41
+#define DNA_UI_WING2_R 42
+#define DNA_UI_WING2_G 43
+#define DNA_UI_WING2_B 44
+#define DNA_UI_WING3_R 45
+#define DNA_UI_WING3_G 46
+#define DNA_UI_WING3_B 47 // VOREStation snippet end.
+#define DNA_UI_LENGTH 47 // VOREStation Edit - Needs to match the highest number above.
+
+#define DNA_SE_LENGTH 49 // VOREStation Edit (original was UI+11)
+
+//DNA modifiers
+// Buffer datatype flags.
+#define DNA2_BUF_UI 1
+#define DNA2_BUF_UE 2
+#define DNA2_BUF_SE 4
diff --git a/code/__defines/economy_misc.dm b/code/__defines/economy_misc.dm
new file mode 100644
index 0000000000..7059cc7aa2
--- /dev/null
+++ b/code/__defines/economy_misc.dm
@@ -0,0 +1,24 @@
+
+#define RIOTS 1
+#define WILD_ANIMAL_ATTACK 2
+#define INDUSTRIAL_ACCIDENT 3
+#define BIOHAZARD_OUTBREAK 4
+#define PIRATES 6
+#define CORPORATE_ATTACK 7
+#define ALIEN_RAIDERS 8
+#define AI_LIBERATION 9
+#define MOURNING 10
+#define CULT_CELL_REVEALED 11
+#define SECURITY_BREACH 12
+#define ANIMAL_RIGHTS_RAID 13
+#define FESTIVAL 14
+
+#define SECURITY 1
+#define FOOD 2
+#define ANIMALS 3
+#define MINERALS 4
+#define EMERGENCY 5
+#define GASEOUS 6
+#define MAINTENANCE 7
+#define ROBOTICS 8
+#define BIOMEDICAL 9
diff --git a/code/__defines/equipment_vendor.dm b/code/__defines/equipment_vendor.dm
new file mode 100644
index 0000000000..85ea963834
--- /dev/null
+++ b/code/__defines/equipment_vendor.dm
@@ -0,0 +1,2 @@
+
+#define EQUIPMENT(n, o, p) n = new /datum/data/mining_equipment(n, o, p)
diff --git a/code/modules/gamemaster/defines.dm b/code/__defines/events.dm
similarity index 67%
rename from code/modules/gamemaster/defines.dm
rename to code/__defines/events.dm
index 215e07ff91..f290638dbe 100644
--- a/code/modules/gamemaster/defines.dm
+++ b/code/__defines/events.dm
@@ -1,3 +1,3 @@
#define EVENT_CHAOS_THRESHOLD_HIGH_IMPACT 25
#define EVENT_CHAOS_THRESHOLD_MEDIUM_IMPACT 50
-#define EVENT_CHAOS_THRESHOLD_LOW_IMPACT 100
\ No newline at end of file
+#define EVENT_CHAOS_THRESHOLD_LOW_IMPACT 100
diff --git a/code/__defines/holder.dm b/code/__defines/holder.dm
new file mode 100644
index 0000000000..239ef8d290
--- /dev/null
+++ b/code/__defines/holder.dm
@@ -0,0 +1 @@
+#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times
diff --git a/code/__defines/implant.dm b/code/__defines/implant.dm
new file mode 100644
index 0000000000..5e3ca49741
--- /dev/null
+++ b/code/__defines/implant.dm
@@ -0,0 +1,2 @@
+#define MALFUNCTION_TEMPORARY 1
+#define MALFUNCTION_PERMANENT 2
diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm
index dfb8b9246a..b4e180deb0 100644
--- a/code/__defines/is_helpers.dm
+++ b/code/__defines/is_helpers.dm
@@ -51,6 +51,7 @@
#define issilicon(A) istype(A, /mob/living/silicon)
#define isAI(A) istype(A, /mob/living/silicon/ai)
#define isrobot(A) istype(A, /mob/living/silicon/robot)
+#define isshell(A) istype(A, /mob/living/silicon/robot/ai_shell)
#define ispAI(A) istype(A, /mob/living/silicon/pai)
#define isbot(A) istype(A, /mob/living/bot)
diff --git a/code/__defines/job_controller.dm b/code/__defines/job_controller.dm
new file mode 100644
index 0000000000..25148c2ce7
--- /dev/null
+++ b/code/__defines/job_controller.dm
@@ -0,0 +1,3 @@
+#define GET_RANDOM_JOB 0
+#define BE_ASSISTANT 1
+#define RETURN_TO_LOBBY 2
diff --git a/code/__defines/jukebox.dm b/code/__defines/jukebox.dm
new file mode 100644
index 0000000000..7cab3de4dd
--- /dev/null
+++ b/code/__defines/jukebox.dm
@@ -0,0 +1,4 @@
+#define JUKEMODE_NEXT 1 // Advance to next song in the track list
+#define JUKEMODE_RANDOM 2 // Not shuffle, randomly picks next each time.
+#define JUKEMODE_REPEAT_SONG 3 // Play the same song over and over
+#define JUKEMODE_PLAY_ONCE 4 // Play, then stop.
diff --git a/code/__defines/life.dm b/code/__defines/life.dm
new file mode 100644
index 0000000000..1f022dec9a
--- /dev/null
+++ b/code/__defines/life.dm
@@ -0,0 +1,20 @@
+//Note that gas heat damage is only applied once every FOUR ticks.
+#define HEAT_GAS_DAMAGE_LEVEL_1 2 //Amount of damage applied when the current breath's temperature just passes the 360.15k safety point
+#define HEAT_GAS_DAMAGE_LEVEL_2 4 //Amount of damage applied when the current breath's temperature passes the 400K point
+#define HEAT_GAS_DAMAGE_LEVEL_3 8 //Amount of damage applied when the current breath's temperature passes the 1000K point
+
+#define COLD_GAS_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when the current breath's temperature just passes the 260.15k safety point
+#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
+#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
+
+#define COLD_ALERT_SEVERITY_LOW 1 // Constants passed to the cold and heat alerts.
+#define COLD_ALERT_SEVERITY_MODERATE 2
+#define COLD_ALERT_SEVERITY_MAX 3
+#define ENVIRONMENT_COMFORT_MARKER_COLD 1
+
+#define HOT_ALERT_SEVERITY_LOW 1
+#define HOT_ALERT_SEVERITY_MODERATE 2
+#define HOT_ALERT_SEVERITY_MAX 3
+#define ENVIRONMENT_COMFORT_MARKER_HOT 2
+
+#define TECHNOMANCER_INSTABILITY_MIN_GLOW 10 // When above this number, the entity starts glowing, affecting others.
diff --git a/code/__defines/lighting_vr.dm b/code/__defines/lighting_vr.dm
index aa7cb6994d..83c34affed 100644
--- a/code/__defines/lighting_vr.dm
+++ b/code/__defines/lighting_vr.dm
@@ -5,4 +5,9 @@
//Fake ambient occlusion filter
#undef AMBIENT_OCCLUSION
-#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
\ No newline at end of file
+#define AMBIENT_OCCLUSION filter(type="drop_shadow", x=0, y=-1, size=2, offset=2, color="#04080F55") //VOREStation Edit for prettier visuals.
+
+#define LIGHT_OK 0
+#define LIGHT_EMPTY 1
+#define LIGHT_BROKEN 2
+#define LIGHT_BURNED 3
diff --git a/code/__defines/map.dm b/code/__defines/map.dm
index 9708190a17..24d967d27e 100644
--- a/code/__defines/map.dm
+++ b/code/__defines/map.dm
@@ -14,3 +14,5 @@
// Misc map defines.
#define SUBMAP_MAP_EDGE_PAD 8 // Automatically created submaps are forbidden from being this close to the main map's edge. //VOREStation Edit
+
+#define CELL_ALIVE(VAL) (VAL == cell_live_value)
diff --git a/code/__defines/mecha.dm b/code/__defines/mecha.dm
new file mode 100644
index 0000000000..5441794f5c
--- /dev/null
+++ b/code/__defines/mecha.dm
@@ -0,0 +1,26 @@
+#define MECHA_INT_FIRE 1
+#define MECHA_INT_TEMP_CONTROL 2
+#define MECHA_INT_SHORT_CIRCUIT 4
+#define MECHA_INT_TANK_BREACH 8
+#define MECHA_INT_CONTROL_LOST 16
+
+#define MECHA_PROC_MOVEMENT 1
+#define MECHA_PROC_DAMAGE 2
+#define MECHA_PROC_INT_TEMP 4
+
+#define MELEE 1
+#define RANGED 2
+
+#define MECH_FACTION_NT "nano"
+#define MECH_FACTION_SYNDI "syndi"
+#define MECH_FACTION_NONE "none"
+
+//Mecha Equipment
+#define EQUIP_HULL "hull"
+#define EQUIP_WEAPON "weapon"
+#define EQUIP_UTILITY "utility"
+#define EQUIP_SPECIAL "core"
+//VOREStation Addition begin: MICROMECHS
+#define EQUIP_MICRO_UTILITY "micro_utility"
+#define EQUIP_MICRO_WEAPON "micro_weapon"
+//VOREStation Addition end: MICROMECHS
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 52e8d86525..ae87b1c624 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -7,7 +7,9 @@
#define VIS_AUGMENTED 32
-#define VIS_COUNT 32
+#define VIS_CH_STOMACH 33
+
+#define VIS_COUNT 33
//Protean organs
#define O_ORCH "orchestrator"
@@ -33,6 +35,7 @@
#define SPECIES_ZORREN_HIGH "Zorren"
#define SPECIES_CUSTOM "Custom Species"
#define SPECIES_TAJARAN "Tajara"
+#define SPECIES_LLEILL "Lleill"
//monkey species
#define SPECIES_MONKEY_AKULA "Sobaka"
#define SPECIES_MONKEY_NEVREAN "Sparra"
@@ -54,3 +57,6 @@
#define MARKING_NONDIGI_ONLY (1 << 0)
#define MARKING_DIGITIGRADE_ONLY (1 << 1)
#define MARKING_ALL_LEGS MARKING_NONDIGI_ONLY|MARKING_DIGITIGRADE_ONLY
+
+//Grabs
+#define UPGRADE_COOLDOWN 40
diff --git a/code/__defines/objects.dm b/code/__defines/objects.dm
index d6530fecff..7378b766c8 100644
--- a/code/__defines/objects.dm
+++ b/code/__defines/objects.dm
@@ -49,3 +49,5 @@
#define MECH_ARMOR "Plating"
#define MECH_GAS "Life Support"
#define MECH_ELECTRIC "Firmware"
+
+#define DRINK_ICON_FILE 'icons/pdrink.dmi'
diff --git a/code/__defines/observer.dm b/code/__defines/observer.dm
new file mode 100644
index 0000000000..4a21eb68bb
--- /dev/null
+++ b/code/__defines/observer.dm
@@ -0,0 +1 @@
+#define OBSERVER_EVENT_DESTROY "OnDestroy"
diff --git a/code/__defines/organ_internal.dm b/code/__defines/organ_internal.dm
new file mode 100644
index 0000000000..252097aaa3
--- /dev/null
+++ b/code/__defines/organ_internal.dm
@@ -0,0 +1 @@
+#define PROCESS_ACCURACY 10
diff --git a/code/__defines/paicard.dm b/code/__defines/paicard.dm
new file mode 100644
index 0000000000..448c54d01a
--- /dev/null
+++ b/code/__defines/paicard.dm
@@ -0,0 +1,3 @@
+#define PP_FUNCTIONAL 0
+#define PP_BROKEN 1
+#define PP_MISSING 2
diff --git a/code/__defines/persistence.dm b/code/__defines/persistence.dm
index 1fde05bf22..5d9a0d5082 100644
--- a/code/__defines/persistence.dm
+++ b/code/__defines/persistence.dm
@@ -1 +1,7 @@
-#define PERSISTENCE_VARIABLE_TOKEN_LENGTH -1
\ No newline at end of file
+#define PERSIST_SPAWN 0x01 // Persist spawnpoint based on location of despawn/logout.
+#define PERSIST_WEIGHT 0x02 // Persist mob weight
+#define PERSIST_ORGANS 0x04 // Persist the status (normal/amputated/robotic/etc) and model (for robotic) status of organs
+#define PERSIST_MARKINGS 0x08 // Persist markings
+#define PERSIST_SIZE 0x10 // Persist size
+#define PERSIST_COUNT 5 // Number of valid bits in this bitflag. Keep this updated!
+#define PERSIST_DEFAULT PERSIST_SPAWN|PERSIST_ORGANS|PERSIST_MARKINGS|PERSIST_SIZE // Default setting for new folks
diff --git a/code/__defines/planets_vr.dm b/code/__defines/planets_vr.dm
index be6553cd4d..07c9122467 100644
--- a/code/__defines/planets_vr.dm
+++ b/code/__defines/planets_vr.dm
@@ -1 +1,47 @@
-#define WEATHER_PARTY "party"
\ No newline at end of file
+#define WEATHER_PARTY "party"
+
+//Atmosphere properties
+#define VIRGO3B_ONE_ATMOSPHERE 82.4 //kPa
+#define VIRGO3B_AVG_TEMP 234 //kelvin
+
+#define VIRGO3B_PER_N2 0.16 //percent
+#define VIRGO3B_PER_O2 0.00
+#define VIRGO3B_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm
+#define VIRGO3B_PER_CO2 0.12
+#define VIRGO3B_PER_PHORON 0.72
+
+//Math only beyond this point
+#define VIRGO3B_MOL_PER_TURF (VIRGO3B_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3B_AVG_TEMP*R_IDEAL_GAS_EQUATION))
+#define VIRGO3B_MOL_N2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2)
+#define VIRGO3B_MOL_O2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_O2)
+#define VIRGO3B_MOL_N2O (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2O)
+#define VIRGO3B_MOL_CO2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_CO2)
+#define VIRGO3B_MOL_PHORON (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_PHORON)
+
+//Turfmakers
+#define VIRGO3B_SET_ATMOS nitrogen=VIRGO3B_MOL_N2;oxygen=VIRGO3B_MOL_O2;carbon_dioxide=VIRGO3B_MOL_CO2;phoron=VIRGO3B_MOL_PHORON;temperature=VIRGO3B_AVG_TEMP
+#define VIRGO3B_TURF_CREATE(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP;x/virgo3b/outdoors=TRUE;x/virgo3b/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
+#define VIRGO3B_TURF_CREATE_UN(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP
+
+//Atmosphere properties
+#define VIRGO3BB_ONE_ATMOSPHERE 101.325 //kPa
+#define VIRGO3BB_AVG_TEMP 293.15 //kelvin
+
+#define VIRGO3BB_PER_N2 0.78 //percent
+#define VIRGO3BB_PER_O2 0.21
+#define VIRGO3BB_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm
+#define VIRGO3BB_PER_CO2 0.01
+#define VIRGO3BB_PER_PHORON 0.00
+
+//Math only beyond this point
+#define VIRGO3BB_MOL_PER_TURF (VIRGO3BB_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3BB_AVG_TEMP*R_IDEAL_GAS_EQUATION))
+#define VIRGO3BB_MOL_N2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_N2)
+#define VIRGO3BB_MOL_O2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_O2)
+#define VIRGO3BB_MOL_N2O (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_N2O)
+#define VIRGO3BB_MOL_CO2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_CO2)
+#define VIRGO3BB_MOL_PHORON (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_PHORON)
+
+//Turfmakers
+#define VIRGO3BB_SET_ATMOS nitrogen=VIRGO3BB_MOL_N2;oxygen=VIRGO3BB_MOL_O2;carbon_dioxide=VIRGO3BB_MOL_CO2;phoron=VIRGO3BB_MOL_PHORON;temperature=VIRGO3BB_AVG_TEMP
+#define VIRGO3BB_TURF_CREATE(x) x/virgo3b_better/nitrogen=VIRGO3BB_MOL_N2;x/virgo3b_better/oxygen=VIRGO3BB_MOL_O2;x/virgo3b_better/carbon_dioxide=VIRGO3BB_MOL_CO2;x/virgo3b_better/phoron=VIRGO3BB_MOL_PHORON;x/virgo3b_better/temperature=VIRGO3BB_AVG_TEMP;x/virgo3b_better/outdoors=TRUE;x/virgo3b_better/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
+#define VIRGO3BB_TURF_CREATE_UN(x) x/virgo3b_better/nitrogen=VIRGO3BB_MOL_N2;x/virgo3b_better/oxygen=VIRGO3BB_MOL_O2;x/virgo3b_better/carbon_dioxide=VIRGO3BB_MOL_CO2;x/virgo3b_better/phoron=VIRGO3BB_MOL_PHORON;x/virgo3b_better/temperature=VIRGO3BB_AVG_TEMP
diff --git a/code/__defines/power.dm b/code/__defines/power.dm
new file mode 100644
index 0000000000..ea32aa1470
--- /dev/null
+++ b/code/__defines/power.dm
@@ -0,0 +1,2 @@
+#define I_SINGULO "singulo"
+#define EMITTER_DAMAGE_POWER_TRANSFER 450 //used to transfer power to containment field generators
diff --git a/code/__defines/preferences.dm b/code/__defines/preferences.dm
index 880d9318d8..ba0abca8cf 100644
--- a/code/__defines/preferences.dm
+++ b/code/__defines/preferences.dm
@@ -12,4 +12,6 @@
#define MULTILINGUAL_DOUBLE_DELIMITER 2
#define MULTILINGUAL_OFF 3
-#define MULTILINGUAL_MODE_MAX 4
\ No newline at end of file
+#define MULTILINGUAL_MODE_MAX 4
+
+#define SAVE_RESET -1
diff --git a/code/__defines/projectile.dm b/code/__defines/projectile.dm
new file mode 100644
index 0000000000..5152cd76fc
--- /dev/null
+++ b/code/__defines/projectile.dm
@@ -0,0 +1,3 @@
+#define HOLD_CASINGS 0 //do not do anything after firing. Manual action, like pump shotguns, or guns that want to define custom behaviour
+#define EJECT_CASINGS 1 //drop spent casings on the ground after firing
+#define CYCLE_CASINGS 2 //experimental: cycle casings, like a revolver. Also works for multibarrelled guns
diff --git a/code/__defines/recipe.dm b/code/__defines/recipe.dm
new file mode 100644
index 0000000000..e0577711f4
--- /dev/null
+++ b/code/__defines/recipe.dm
@@ -0,0 +1,9 @@
+// Recipe type defines. Used to determine what machine makes them.
+#define MICROWAVE 0x1
+#define FRYER 0x2
+#define OVEN 0x4
+#define GRILL 0x8
+#define CANDYMAKER 0x10
+#define CEREALMAKER 0x20
+
+#define RECIPE_REAGENT_REPLACE 0 //Reagents in the ingredients are discarded.
diff --git a/code/__defines/request_console.dm b/code/__defines/request_console.dm
new file mode 100644
index 0000000000..96997f9348
--- /dev/null
+++ b/code/__defines/request_console.dm
@@ -0,0 +1,4 @@
+//Request Console Department Types
+#define RC_ASSIST 1 //Request Assistance
+#define RC_SUPPLY 2 //Request Supplies
+#define RC_INFO 4 //Relay Info
diff --git a/code/__defines/robot.dm b/code/__defines/robot.dm
new file mode 100644
index 0000000000..30026857d7
--- /dev/null
+++ b/code/__defines/robot.dm
@@ -0,0 +1 @@
+#define DEFAULT_ROBOT_SPRITE_NAME "M-USE NanoTrasen"
diff --git a/code/__defines/simple_mob.dm b/code/__defines/simple_mob.dm
new file mode 100644
index 0000000000..995f0178f7
--- /dev/null
+++ b/code/__defines/simple_mob.dm
@@ -0,0 +1,8 @@
+// Flags for specifying which states we have vore icon_states for.
+#define SA_ICON_LIVING 0x01
+#define SA_ICON_DEAD 0x02
+#define SA_ICON_REST 0x04
+
+// Hivebots are tuned towards how many default lasers are needed to kill them.
+// As such, if laser damage is ever changed, you should change this define.
+#define LASERS_TO_KILL * 40
diff --git a/code/__defines/size.dm b/code/__defines/size.dm
new file mode 100644
index 0000000000..d9418b700e
--- /dev/null
+++ b/code/__defines/size.dm
@@ -0,0 +1,3 @@
+
+#define MAX_VOICE_FREQ 70000
+#define MIN_VOICE_FREQ 15000
diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm
index ec9165653d..146fcb86ab 100644
--- a/code/__defines/species_languages_vr.dm
+++ b/code/__defines/species_languages_vr.dm
@@ -17,3 +17,4 @@
#define LANGUAGE_MOUSE "Mouse"
#define LANGUAGE_SHADEKIN "Shadekin Empathy"
+#define LANGUAGE_LLEILL "Glamour Speak"
diff --git a/code/__defines/spells.dm b/code/__defines/spells.dm
new file mode 100644
index 0000000000..e349a9c6a9
--- /dev/null
+++ b/code/__defines/spells.dm
@@ -0,0 +1,5 @@
+
+#define OFFENSIVE_SPELLS "Offensive"
+#define DEFENSIVE_SPELLS "Defensive"
+#define UTILITY_SPELLS "Utility"
+#define SUPPORT_SPELLS "Support"
diff --git a/code/__defines/traits.dm b/code/__defines/traits.dm
new file mode 100644
index 0000000000..994f1a3247
--- /dev/null
+++ b/code/__defines/traits.dm
@@ -0,0 +1,2 @@
+#define ORGANICS 1
+#define SYNTHETICS 2
diff --git a/code/__defines/update_icons.dm b/code/__defines/update_icons.dm
new file mode 100644
index 0000000000..4fa21751be
--- /dev/null
+++ b/code/__defines/update_icons.dm
@@ -0,0 +1 @@
+#define MOB_WATER_LAYER 36
diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 1cda5c811f..2ded9ae75a 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -52,8 +52,9 @@
input = copytext(input,1,max_length)
if(extra)
+ input = replacetext(input, new/regex("^\[\\n\]+|\[\\n\]+$", "g"), "")// strip leading and trailing new lines
var/temp_input = replace_characters(input, list("\n"=" ","\t"=" "))//one character is replaced by two
- if(length(input) < (length(temp_input) - 6))//6 is the number of linebreaks allowed per message
+ if(length(input) < (length(temp_input) - 18))//18 is the number of linebreaks allowed per message
input = replace_characters(temp_input,list(" "=" "))//replace again, this time the double spaces with single ones
if(encode)
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 20c38938a5..8a722ac767 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -1580,6 +1580,7 @@ GLOBAL_REAL_VAR(list/stack_trace_storage)
. += new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100
. += new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status
. += new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags
+ . += new /obj/screen/plane_master{plane = PLANE_CH_STOMACH} //Stomachs
. += new /obj/screen/plane_master{plane = PLANE_AUGMENTED} //Augmented reality
//VOREStation Add End
/proc/CallAsync(datum/source, proctype, list/arguments)
diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm
index d725fb8064..288c479922 100644
--- a/code/_onclick/hud/action.dm
+++ b/code/_onclick/hud/action.dm
@@ -3,12 +3,6 @@
#define AB_INNATE 3
#define AB_GENERIC 4
-#define AB_CHECK_RESTRAINED 1
-#define AB_CHECK_STUNNED 2
-#define AB_CHECK_LYING 4
-#define AB_CHECK_ALIVE 8
-#define AB_CHECK_INSIDE 16
-
/datum/action
var/name = "Generic Action"
@@ -226,4 +220,9 @@
/datum/action/innate/
- action_type = AB_INNATE
\ No newline at end of file
+ action_type = AB_INNATE
+
+#undef AB_ITEM
+#undef AB_SPELL
+#undef AB_INNATE
+#undef AB_GENERIC
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index af26526846..8dfcdf9b5b 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -507,3 +507,5 @@ var/list/global_huds = list(
/datum/hud/proc/update_ammo_hud(mob/living/user, obj/item/weapon/gun/G)
var/obj/screen/ammo/ammo_hud = ammo_hud_list[G]
ammo_hud?.update_hud(user, G)
+
+#undef MAX_AMMO_HUD_POSSIBLE
diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm
index fa568b8614..32725ec5ae 100644
--- a/code/_onclick/hud/radial.dm
+++ b/code/_onclick/hud/radial.dm
@@ -316,4 +316,7 @@ GLOBAL_LIST_EMPTY(radial_menus)
var/answer = menu.selected_choice
QDEL_NULL(menu)
GLOB.radial_menus -= uniqueid
- return answer
\ No newline at end of file
+ return answer
+
+#undef NEXT_PAGE_ID
+#undef DEFAULT_CHECK_DELAY
diff --git a/code/_onclick/hud/skybox.dm b/code/_onclick/hud/skybox.dm
index 97f3999b7e..fbe3088c91 100644
--- a/code/_onclick/hud/skybox.dm
+++ b/code/_onclick/hud/skybox.dm
@@ -63,5 +63,6 @@
client.update_skybox()
client.skybox?.scale_to_view(client.view)
+#undef SKYBOX_PADDING
#undef SKYBOX_PIXELS
#undef SKYBOX_TURFS
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 76214eb64d..289c9345d9 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -1019,6 +1019,12 @@ var/list/gamemode_cache = list()
if("asset_cdn_url")
config.asset_cdn_url = value
+ if("allow_robot_recolor")
+ config.allow_robot_recolor = TRUE
+
+ if("allow_simple_mob_recolor")
+ config.allow_simple_mob_recolor = TRUE
+
else
log_misc("Unknown setting in configuration: '[name]'")
@@ -1087,10 +1093,6 @@ var/list/gamemode_cache = list()
if("loadout_whitelist")
config.loadout_whitelist = text2num(value)
- if("allow_robot_recolor")
- config.allow_robot_recolor = 1
- if("allow_simple_mob_recolor")
- config.allow_simple_mob_recolor = 1
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm
index 7b63084af2..3e369f1271 100644
--- a/code/controllers/master_controller.dm
+++ b/code/controllers/master_controller.dm
@@ -43,9 +43,9 @@ var/global/pipe_processing_killed = 0
admin_notice("Initializations complete. ", R_DEBUG)
// #if UNIT_TEST
-// #define CHECK_SLEEP_MASTER // For unit tests we don't care about a smooth lobby screen experience. We care about speed.
+// # define CHECK_SLEEP_MASTER // For unit tests we don't care about a smooth lobby screen experience. We care about speed.
// #else
-// #define CHECK_SLEEP_MASTER if(++initialized_objects > 500) { initialized_objects=0;sleep(world.tick_lag); }
+// # define CHECK_SLEEP_MASTER if(++initialized_objects > 500) { initialized_objects=0;sleep(world.tick_lag); }
// #endif
/datum/controller/game_controller/proc/setup_objects()
@@ -53,4 +53,4 @@ var/global/pipe_processing_killed = 0
populate_antag_type_list()
//Set up spawn points.
- populate_spawn_points()
\ No newline at end of file
+ populate_spawn_points()
diff --git a/code/controllers/observer_listener/atom/observer.dm b/code/controllers/observer_listener/atom/observer.dm
index 8c3e93f4fc..fe56294346 100644
--- a/code/controllers/observer_listener/atom/observer.dm
+++ b/code/controllers/observer_listener/atom/observer.dm
@@ -1,5 +1,3 @@
-#define OBSERVER_EVENT_DESTROY "OnDestroy"
-
/atom
var/list/observer_events
diff --git a/code/controllers/subsystems/plants.dm b/code/controllers/subsystems/plants.dm
index f21cc1cb2c..f90d533eb6 100644
--- a/code/controllers/subsystems/plants.dm
+++ b/code/controllers/subsystems/plants.dm
@@ -126,7 +126,7 @@ SUBSYSTEM_DEF(plants)
// Caching
var/list/currentrun = src.currentrun
-
+
while(currentrun.len)
var/obj/effect/plant/P = currentrun[currentrun.len]
--currentrun.len
@@ -158,3 +158,5 @@ SUBSYSTEM_DEF(plants)
for(var/mask in SSplants.gene_tag_masks)
to_chat(usr, "[mask]: [SSplants.gene_tag_masks[mask]]")
+
+#undef PLANT_TICK_TIME
diff --git a/code/controllers/subsystems/robot_sprites.dm b/code/controllers/subsystems/robot_sprites.dm
index 8fd72b0a15..88fa331451 100644
--- a/code/controllers/subsystems/robot_sprites.dm
+++ b/code/controllers/subsystems/robot_sprites.dm
@@ -1,5 +1,3 @@
-#define DEFAULT_ROBOT_SPRITE_NAME "M-USE NanoTrasen"
-
SUBSYSTEM_DEF(robot_sprites)
name = "Robot Sprites"
init_order = INIT_ORDER_ROBOT_SPRITES
@@ -112,4 +110,4 @@ SUBSYSTEM_DEF(robot_sprites)
if(RS.whitelist_ckey == ckey && RS.whitelist_charname == spritename)
. |= RS
- return
\ No newline at end of file
+ return
diff --git a/code/controllers/subsystems/throwing.dm b/code/controllers/subsystems/throwing.dm
index 101c71a147..0cad319b7d 100644
--- a/code/controllers/subsystems/throwing.dm
+++ b/code/controllers/subsystems/throwing.dm
@@ -208,3 +208,6 @@ SUBSYSTEM_DEF(throwing)
if(hit_thing)
finalize(hit=TRUE, t_target=hit_thing)
return TRUE
+
+#undef MAX_THROWING_DIST
+#undef MAX_TICKS_TO_MAKE_UP
diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index d39d012832..453652928b 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -1,7 +1,7 @@
///If the machine is used/deleted in the crafting process
-#define CRAFTING_MACHINERY_CONSUME 1
+//# define CRAFTING_MACHINERY_CONSUME 1 Unused
///If the machine is only "used" i.e. it checks to see if it's nearby and allows crafting, but doesn't delete it
-#define CRAFTING_MACHINERY_USE 0
+//# define CRAFTING_MACHINERY_USE 0 Unused
/datum/crafting_recipe
var/name = "" //in-game display name
@@ -48,7 +48,7 @@
/datum/crafting_recipe/proc/on_craft_completion(mob/user, atom/result)
return
-// Computes the total reagents volume
+// Computes the total reagents volume
/datum/crafting_recipe/proc/get_parts_reagents_volume()
. = 0
for(var/list/L in parts)
diff --git a/code/datums/components/resize_guard.dm b/code/datums/components/resize_guard.dm
index 33799cb828..d708002cc1 100644
--- a/code/datums/components/resize_guard.dm
+++ b/code/datums/components/resize_guard.dm
@@ -15,5 +15,5 @@
var/area/A = get_area(parent)
if(A?.limit_mob_size)
var/mob/living/L = parent
- L.resize(L.size_multiplier)
+ L.resize(L.size_multiplier, ignore_prefs = TRUE)
qdel(src)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 17d8fb17ed..7c37c10f52 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -486,7 +486,6 @@ var/global/list/PDA_Manifest = list()
R.fields["ma_crim"] = "None"
R.fields["ma_crim_d"] = "No major crime convictions."
R.fields["notes"] = "No notes."
- R.fields["notes"] = "No notes."
if(hidden)
hidden_security += R
else
diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm
index be38a7a5a2..d2d3136e88 100644
--- a/code/datums/helper_datums/construction_datum.dm
+++ b/code/datums/helper_datums/construction_datum.dm
@@ -1,7 +1,3 @@
-#define FORWARD -1
-#define BACKWARD 1
-
-
// As of August 4th, 2018, these datums are only used in Mech construction.
/datum/construction
var/list/steps
@@ -158,4 +154,4 @@
return 0
/datum/construction/reversible/custom_action(index, diff, I, user)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/datums/looping_sounds/sequence.dm b/code/datums/looping_sounds/sequence.dm
index f14b43184b..5c1a54dceb 100644
--- a/code/datums/looping_sounds/sequence.dm
+++ b/code/datums/looping_sounds/sequence.dm
@@ -173,3 +173,4 @@
#undef MORSE_DOT
#undef MORSE_DASH
+#undef MORSE_BASE_DELAY
diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm
index 229ce682be..8fccfc1dfc 100644
--- a/code/datums/wires/mines.dm
+++ b/code/datums/wires/mines.dm
@@ -79,6 +79,8 @@
..()
+#undef WIRE_TRAP
+
/datum/wires/mines/interactable(mob/user)
var/obj/effect/mine/M = holder
return M.panel_open
diff --git a/code/defines/procs/radio.dm b/code/defines/procs/radio.dm
index 0ee38f3b12..954004b313 100644
--- a/code/defines/procs/radio.dm
+++ b/code/defines/procs/radio.dm
@@ -61,6 +61,11 @@
return TELECOMMS_RECEPTION_RECEIVER
return TELECOMMS_RECEPTION_NONE
+#undef TELECOMMS_RECEPTION_NONE
+#undef TELECOMMS_RECEPTION_SENDER
+#undef TELECOMMS_RECEPTION_RECEIVER
+#undef TELECOMMS_RECEPTION_BOTH
+
/proc/get_reception(var/atom/sender, var/receiver, var/message = "", var/do_sleep = 1)
var/datum/reception/reception = new
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index a370f614d6..2be00fb258 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -254,13 +254,6 @@
// new lighting behaviour with obj lights
icon_state = null
-
-/*
-#define EQUIP 1
-#define LIGHT 2
-#define ENVIRON 3
-*/
-
/area/proc/powered(var/chan) // return true if the area has power to given channel
if(!requires_power)
@@ -553,4 +546,4 @@ GLOBAL_DATUM(spoiler_obfuscation_image, /image)
if(should_obfuscate)
add_overlay(GLOB.spoiler_obfuscation_image)
else
- cut_overlay(GLOB.spoiler_obfuscation_image)
\ No newline at end of file
+ cut_overlay(GLOB.spoiler_obfuscation_image)
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index c00ccbd9f2..5e78698f48 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -10,65 +10,8 @@
#define DNA_ON_LOWERBOUND 3
#define DNA_ON_UPPERBOUND 4
-// Define block bounds (off-low,off-high,on-low,on-high)
-// Used in setupgame.dm
-#define DNA_DEFAULT_BOUNDS list(1,2049,2050,4095)
-#define DNA_HARDER_BOUNDS list(1,3049,3050,4095)
-#define DNA_HARD_BOUNDS list(1,3490,3500,4095)
-
-// UI Indices (can change to mutblock style, if desired)
-#define DNA_UI_HAIR_R 1
-#define DNA_UI_HAIR_G 2
-#define DNA_UI_HAIR_B 3
-#define DNA_UI_BEARD_R 4
-#define DNA_UI_BEARD_G 5
-#define DNA_UI_BEARD_B 6
-#define DNA_UI_SKIN_TONE 7
-#define DNA_UI_SKIN_R 8
-#define DNA_UI_SKIN_G 9
-#define DNA_UI_SKIN_B 10
-#define DNA_UI_EYES_R 11
-#define DNA_UI_EYES_G 12
-#define DNA_UI_EYES_B 13
-#define DNA_UI_GENDER 14
-#define DNA_UI_BEARD_STYLE 15
-#define DNA_UI_HAIR_STYLE 16
-#define DNA_UI_EAR_STYLE 17 // VOREStation snippet.
-#define DNA_UI_TAIL_STYLE 18
-#define DNA_UI_PLAYERSCALE 19
-#define DNA_UI_TAIL_R 20
-#define DNA_UI_TAIL_G 21
-#define DNA_UI_TAIL_B 22
-#define DNA_UI_TAIL2_R 23
-#define DNA_UI_TAIL2_G 24
-#define DNA_UI_TAIL2_B 25
-#define DNA_UI_TAIL3_R 26
-#define DNA_UI_TAIL3_G 27
-#define DNA_UI_TAIL3_B 28
-#define DNA_UI_EARS_R 29
-#define DNA_UI_EARS_G 30
-#define DNA_UI_EARS_B 31
-#define DNA_UI_EARS2_R 32
-#define DNA_UI_EARS2_G 33
-#define DNA_UI_EARS2_B 34
-#define DNA_UI_EARS3_R 35
-#define DNA_UI_EARS3_G 36
-#define DNA_UI_EARS3_B 37
-#define DNA_UI_WING_STYLE 38
-#define DNA_UI_WING_R 39
-#define DNA_UI_WING_G 40
-#define DNA_UI_WING_B 41
-#define DNA_UI_WING2_R 42
-#define DNA_UI_WING2_G 43
-#define DNA_UI_WING2_B 44
-#define DNA_UI_WING3_R 45
-#define DNA_UI_WING3_G 46
-#define DNA_UI_WING3_B 47 // VOREStation snippet end.
-#define DNA_UI_LENGTH 47 // VOREStation Edit - Needs to match the highest number above.
-
-#define DNA_SE_LENGTH 49 // VOREStation Edit (original was UI+11)
// For later:
-//#define DNA_SE_LENGTH 50 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
+//# define DNA_SE_LENGTH 50 // Was STRUCDNASIZE, size 27. 15 new blocks added = 42, plus room to grow.
// Defines which values mean "on" or "off".
@@ -515,3 +458,8 @@ var/global/list/datum/dna/gene/dna_genes[0]
unique_enzymes = md5(character.real_name)
reg_dna[unique_enzymes] = character.real_name
+
+#undef DNA_OFF_LOWERBOUND
+#undef DNA_OFF_UPPERBOUND
+#undef DNA_ON_LOWERBOUND
+#undef DNA_ON_UPPERBOUND
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 0e8e0ba43c..572583ef9e 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -1,10 +1,5 @@
#define DNA_BLOCK_SIZE 3
-// Buffer datatype flags.
-#define DNA2_BUF_UI 1
-#define DNA2_BUF_UE 2
-#define DNA2_BUF_SE 4
-
#define PAGE_UI "ui"
#define PAGE_SE "se"
#define PAGE_BUFFER "buffer"
@@ -792,6 +787,7 @@
else
return FALSE
+#undef DNA_BLOCK_SIZE
#undef PAGE_UI
#undef PAGE_SE
diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index a63723ec23..2c4a8c925d 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -1,8 +1,4 @@
#define ALL_SPELLS "All"
-#define OFFENSIVE_SPELLS "Offensive"
-#define DEFENSIVE_SPELLS "Defensive"
-#define UTILITY_SPELLS "Utility"
-#define SUPPORT_SPELLS "Support"
var/list/all_technomancer_spells = subtypesof(/datum/technomancer/spell)
var/list/all_technomancer_equipment = subtypesof(/datum/technomancer/equipment)
@@ -385,3 +381,5 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
qdel(AM)
return
to_chat(user, "\The [src] is unable to refund \the [AM]. ")
+
+#undef ALL_SPELLS
diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm
index a7cf71b8f0..c41c2ea8dc 100644
--- a/code/game/gamemodes/technomancer/instability.dm
+++ b/code/game/gamemodes/technomancer/instability.dm
@@ -6,7 +6,6 @@
// 0.95 is 14 ticks.
#define TECHNOMANCER_INSTABILITY_MIN_DECAY 0.1 // Minimum removed every Life() tick, always.
#define TECHNOMANCER_INSTABILITY_PRECISION 0.1 // Instability is rounded to this.
-#define TECHNOMANCER_INSTABILITY_MIN_GLOW 10 // When above this number, the entity starts glowing, affecting others.
/mob/living
@@ -288,3 +287,6 @@
to_chat(src, "The purple glow makes you feel strange... ")
adjust_instability(amount)
+#undef TECHNOMANCER_INSTABILITY_DECAY
+#undef TECHNOMANCER_INSTABILITY_MIN_DECAY
+#undef TECHNOMANCER_INSTABILITY_PRECISION
diff --git a/code/game/jobs/job/captain_vr.dm b/code/game/jobs/job/captain_vr.dm
index f80cfb7de1..3e2541bdec 100644
--- a/code/game/jobs/job/captain_vr.dm
+++ b/code/game/jobs/job/captain_vr.dm
@@ -15,7 +15,7 @@
title = "Captain"
/datum/job/captain/get_request_reasons()
- return list("Training crew")
+ return list("Training crew", "Assembling expedition team")
/datum/job/hop
disallow_jobhop = TRUE
@@ -53,7 +53,7 @@
title = "First Mate"
/datum/job/hop/get_request_reasons()
- return list("ID modification", "Training crew")
+ return list("ID modification", "Training crew", "Assembling expedition team")
/datum/job/secretary
diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm
index 31d69c1a89..9934d9dea9 100644
--- a/code/game/jobs/job/civilian_vr.dm
+++ b/code/game/jobs/job/civilian_vr.dm
@@ -106,6 +106,9 @@
/datum/alt_title/excavator
title = "Excavator"
+/datum/job/mining/get_request_reasons()
+ return list("Assembling expedition team")
+
/datum/job/janitor //Lots of janitor substations on station.
total_positions = 3
@@ -236,6 +239,9 @@
/datum/alt_title/helmsman
title = "Helmsman"
+/datum/job/pilot/get_request_reasons()
+ return list("Assembling expedition team")
+
//////////////////////////////////
// Entertainer
//////////////////////////////////
diff --git a/code/game/jobs/job/engineering_vr.dm b/code/game/jobs/job/engineering_vr.dm
index d41f80ef7f..336fce4b48 100644
--- a/code/game/jobs/job/engineering_vr.dm
+++ b/code/game/jobs/job/engineering_vr.dm
@@ -24,7 +24,7 @@
title = "Maintenance Manager"
/datum/job/chief_engineer/get_request_reasons()
- return list("Engine setup", "Construction project", "Repairs necessary", "Training crew")
+ return list("Engine setup", "Construction project", "Repairs necessary", "Training crew", "Assembling expedition team")
/datum/job/engineer
@@ -42,7 +42,7 @@
title_blurb = "An Engineering Contractor fulfills similar duties to other engineers, but isn't directly employed by NT proper."
/datum/job/engineer/get_request_reasons()
- return list("Engine setup", "Construction project", "Repairs necessary")
+ return list("Engine setup", "Construction project", "Repairs necessary", "Assembling expedition team")
@@ -67,7 +67,7 @@
title = "Fuel Technician"
/datum/job/atmos/get_request_reasons()
- return list("Construction project", "Repairs necessary")
+ return list("Construction project", "Repairs necessary", "Assembling expedition team")
// YW Alt Titles
/datum/alt_title/station_engineer
diff --git a/code/game/jobs/job/medical_vr.dm b/code/game/jobs/job/medical_vr.dm
index 8c6543e8f8..8b566a21d5 100644
--- a/code/game/jobs/job/medical_vr.dm
+++ b/code/game/jobs/job/medical_vr.dm
@@ -22,7 +22,7 @@
title = "Healthcare Manager"
/datum/job/cmo/get_request_reasons()
- return list("Surgery pending", "Viral outbreak", "Training crew")
+ return list("Surgery pending", "Viral outbreak", "Training crew", "Assembling expedition team")
/datum/job/doctor
@@ -49,7 +49,7 @@
title_blurb = "A Medical Contractor can be anything from a full-blown doctor to the likes of a nurse or orderly, but isn't directly employed by NT proper."
/datum/job/doctor/get_request_reasons()
- return list("Surgery pending", "Viral outbreak")
+ return list("Surgery pending", "Viral outbreak", "Assembling expedition team")
/datum/job/chemist
@@ -92,3 +92,6 @@
/datum/alt_title/sar
title = "Search and Rescue"
+
+/datum/job/paramedic/get_request_reasons()
+ return list("Assembling expedition team")
diff --git a/code/game/jobs/job/science_vr.dm b/code/game/jobs/job/science_vr.dm
index 37bc168901..fd95a95409 100644
--- a/code/game/jobs/job/science_vr.dm
+++ b/code/game/jobs/job/science_vr.dm
@@ -26,7 +26,7 @@
title = "Head Scientist"
/datum/job/rd/get_request_reasons()
- return list("Repairs needed", "Training crew")
+ return list("Repairs needed", "Training crew", "Assembling expedition team")
/datum/job/scientist
@@ -69,6 +69,8 @@
title_blurb = "A Circuit Programmer is a Scientist whose expertise is working with integrated circuits. They are familar with the workings and programming of those devices. \
They work to create various useful devices using the capabilities of integrated circuitry."
+/datum/job/scientist/get_request_reasons()
+ return list("Assembling expedition team")
/datum/job/xenobiologist
spawn_positions = 3
@@ -123,4 +125,4 @@
title = "Xenoflorist"
/datum/alt_title/xenohydroponicist
- title = "Xenohydroponicist"
\ No newline at end of file
+ title = "Xenohydroponicist"
diff --git a/code/game/jobs/job/security_vr.dm b/code/game/jobs/job/security_vr.dm
index c6657abec7..8980381d6a 100644
--- a/code/game/jobs/job/security_vr.dm
+++ b/code/game/jobs/job/security_vr.dm
@@ -17,7 +17,7 @@
title = "Security Manager"
/datum/job/hos/get_request_reasons()
- return list("Wildlife management", "Forensic investigation", "Training crew")
+ return list("Wildlife management", "Forensic investigation", "Training crew", "Assembling expedition team")
/datum/job/warden
@@ -72,4 +72,4 @@
title = "Security Contractor"
/datum/job/officer/get_request_reasons()
- return list("Wildlife management")
\ No newline at end of file
+ return list("Wildlife management", "Assembling expedition team")
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index 6091fc0e7b..4ce8780cf4 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -1,9 +1,5 @@
var/global/datum/controller/occupations/job_master
-#define GET_RANDOM_JOB 0
-#define BE_ASSISTANT 1
-#define RETURN_TO_LOBBY 2
-
/datum/controller/occupations
//List of all jobs
var/list/occupations = list()
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index b73df5ca3a..87d4146259 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -205,6 +205,11 @@
occupantData["bodyTempF"] = (((H.bodytemperature-T0C) * 1.8) + 32)
occupantData["hasBorer"] = H.has_brain_worms()
+ occupantData["colourblind"] = null
+ for(var/datum/modifier/M in H.modifiers)
+ if(!isnull(M.wire_colors_replace))
+ occupantData["colourblind"] = LAZYLEN(M.wire_colors_replace)
+ break
var/bloodData[0]
if(H.vessel)
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index c8da98c9df..0374f9eab8 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -846,3 +846,21 @@
#undef LOAD_TLV_VALUES
#undef TEST_TLV_VALUES
#undef DECLARE_TLV_VALUES
+
+#undef AALARM_MODE_SCRUBBING
+#undef AALARM_MODE_REPLACEMENT
+#undef AALARM_MODE_PANIC
+#undef AALARM_MODE_CYCLE
+#undef AALARM_MODE_FILL
+#undef AALARM_MODE_OFF
+
+#undef AALARM_SCREEN_MAIN
+#undef AALARM_SCREEN_VENT
+#undef AALARM_SCREEN_SCRUB
+#undef AALARM_SCREEN_MODE
+#undef AALARM_SCREEN_SENSORS
+
+#undef AALARM_REPORT_TIMEOUT
+
+#undef MAX_TEMPERATURE
+#undef MIN_TEMPERATURE
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index da958671e7..a536042cc5 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -23,7 +23,6 @@
break
return selected
-#define CLONE_BIOMASS 30 //VOREstation Edit
#define MINIMUM_HEAL_LEVEL 40
/obj/machinery/clonepod
@@ -479,6 +478,8 @@
healthstring = "ERROR"
return healthstring
+#undef MINIMUM_HEAL_LEVEL
+
//Disk stuff.
//The return of data disks?? Just for transferring between genetics machine/cloning machine.
//TO-DO: Make the genetics machine accept them.
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index dc8375f1e7..9fa837889b 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -310,3 +310,5 @@
// Please for the love of all that is holy, someone make surgery steps
// have names so I don't have to do this stupid pretty_type shit.
. += "[pretty_type(S)]: [english_list(allowed_tools_by_name)]"
+
+#undef OP_COMPUTER_COOLDOWN
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index c54fb1ffb8..8efe7003af 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -510,5 +510,11 @@
circuit = /obj/item/weapon/circuitboard/med_data/pcu
density = FALSE
+#undef MED_DATA_R_LIST
+#undef MED_DATA_MAINT
+#undef MED_DATA_RECORD
+#undef MED_DATA_V_DATA
+#undef MED_DATA_MEDBOT
+
#undef FIELD
#undef MED_FIELD
diff --git a/code/game/machinery/computer/prisonshuttle.dm b/code/game/machinery/computer/prisonshuttle.dm
index 2c6b4c7ced..7716f527a5 100644
--- a/code/game/machinery/computer/prisonshuttle.dm
+++ b/code/game/machinery/computer/prisonshuttle.dm
@@ -213,3 +213,7 @@ var/prison_shuttle_timeleft = 0
hacked = 1
to_chat(user, "You disable the lock. ")
return 1
+
+#undef PRISON_MOVETIME
+#undef PRISON_STATION_AREATYPE
+#undef PRISON_DOCK_AREATYPE
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index e239a6cf06..53cdeec5f7 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -512,4 +512,8 @@
/obj/machinery/computer/secure_data/detective_computer
icon_state = "messyfiles"
+#undef SEC_DATA_R_LIST
+#undef SEC_DATA_MAINT
+#undef SEC_DATA_RECORD
+
#undef FIELD
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 876a2009d1..d157d964f5 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -385,3 +385,9 @@
continue
..(severity)
+
+#undef GENERAL_RECORD_LIST
+#undef GENERAL_RECORD_MAINT
+#undef GENERAL_RECORD_DATA
+
+#undef FIELD
diff --git a/code/game/machinery/computer/specops_shuttle.dm b/code/game/machinery/computer/specops_shuttle.dm
index cc8727343c..ac510ee19f 100644
--- a/code/game/machinery/computer/specops_shuttle.dm
+++ b/code/game/machinery/computer/specops_shuttle.dm
@@ -329,3 +329,8 @@ var/specops_shuttle_timeleft = 0
add_fingerprint(usr)
updateUsrDialog()
return
+
+#undef SPECOPS_MOVETIME
+#undef SPECOPS_STATION_AREATYPE
+#undef SPECOPS_DOCK_AREATYPE
+#undef SPECOPS_RETURN_DELAY
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 3a394b1973..d431c700d6 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -366,3 +366,5 @@
/datum/data/function/proc/display()
return
+
+#undef HEAT_CAPACITY_HUMAN
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 38b48ee76a..49dcdbafe7 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -86,7 +86,7 @@
/obj/machinery/computer/cryopod/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
- ui = new(user, src, "CryoStorageVr", storage_name) // VOREStation Edit - Use our own template for our custom data
+ ui = new(user, src, "CryoStorage", storage_name) // VOREStation Edit - Use our own template for our custom data
ui.open()
/obj/machinery/computer/cryopod/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
diff --git a/code/game/machinery/doors/airlock_angled_bay.dm b/code/game/machinery/doors/airlock_angled_bay.dm
index 4d5eac48a4..00741a1fd3 100644
--- a/code/game/machinery/doors/airlock_angled_bay.dm
+++ b/code/game/machinery/doors/airlock_angled_bay.dm
@@ -8,7 +8,7 @@
* icons being built at runtime to afford the luxury of not needing to pre-bake
* all the icons like we have in the past, but preventing the overlay thrashing that
* Bay's seem to encounter. All the heavy lifting is just done once at initialization.
- *
+ *
* The input state names from the various Bay files are:
* preview: Only in base_icon for mapping
* closed: static, when closed
@@ -16,7 +16,7 @@
* closing: anim, from open to closed transition
* opening: anim, from closed to open transition
* deny: static/anim, when denying a mob access
- *
+ *
* The output state names to our system are:
* door_closed: closed
* door_locked: closed+bolted lights
@@ -28,7 +28,7 @@
* o_door_closing: closing+panel
* door_opening_stat: opening
* door_closing_stat: closing
- *
+ *
* These do not include the door icon and are overlays:
* panel_open: bare panel overlay
* welded: bare welded overlay
@@ -114,7 +114,7 @@
icon = mine
update_icon()
return // hooray
-
+
// Base layer - the bare metal - absolutely required sprites
var/icon/door_closed = icon(base_icon, "closed")
var/icon/door_open = icon(base_icon, "open")
@@ -127,7 +127,7 @@
var/icon/door_closing_stat = icon(base_icon, "closing")
var/icon/o_door_opening = icon(base_icon, "opening")
var/icon/o_door_closing = icon(base_icon, "closing")
-
+
// Optional icons
var/icon/panel_open
var/icon/welded_closed
@@ -135,26 +135,26 @@
var/icon/sparks_damaged
var/icon/sparks_open
var/icon/sparks_broken
-
+
if(panel_icon)
panel_open = icon(panel_icon, "closed")
else
panel_open = icon('icons/effects/effects.dmi', "nothing")
-
+
if(welded_icon)
welded_closed = icon(welded_icon, "closed")
welded_open = icon(welded_icon, "open") // only used on firedoors far as I can tell
else
welded_closed = icon('icons/effects/effects.dmi', "nothing")
welded_open = icon('icons/effects/effects.dmi', "nothing")
-
+
if(spark_damaged_icon)
sparks_damaged = icon(spark_damaged_icon, "closed")
sparks_open = icon(spark_damaged_icon, "open")
else
sparks_damaged = icon('icons/effects/effects.dmi', "nothing")
sparks_open = icon('icons/effects/effects.dmi', "nothing")
-
+
if(spark_broken_icon)
sparks_broken = icon(spark_broken_icon, "closed")
else
@@ -231,10 +231,10 @@
o_door_opening.Blend(icon(lights_green_icon, "opening"), ICON_OVERLAY)
door_closing.Blend(icon(lights_green_icon, "closing"), ICON_OVERLAY)
o_door_closing.Blend(icon(lights_green_icon, "closing"), ICON_OVERLAY)
-
+
if(lights_deny_icon)
door_deny.Blend(icon(lights_deny_icon, "deny"), ICON_OVERLAY)
-
+
if(lights_bolts_icon)
door_locked.Blend(icon(lights_bolts_icon, "closed"), ICON_OVERLAY)
@@ -462,3 +462,8 @@
else
bound_width = world.icon_size
bound_height = width * world.icon_size
+
+#undef FILL_NONE
+#undef FILL_METAL
+#undef FILL_GLASS
+#undef FILL_COLOR
diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm
index 3c91bd7c02..bbc0b5e5ed 100644
--- a/code/game/machinery/doors/airlock_control.dm
+++ b/code/game/machinery/doors/airlock_control.dm
@@ -1,5 +1,3 @@
-#define AIRLOCK_CONTROL_RANGE 22
-
// This code allows for airlocks to be controlled externally by setting an id_tag and comm frequency (disables ID access)
/obj/machinery/door/airlock
var/id_tag
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index f1aa9051cc..ea187cd583 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -292,3 +292,9 @@
#undef FONT_COLOR
#undef FONT_STYLE
#undef CHARS_PER_LINE
+
+#undef MAX_TIMER
+
+#undef PRESET_SHORT
+#undef PRESET_MEDIUM
+#undef PRESET_LONG
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 3493ec1dc7..bc80533df2 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -1,6 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
-#define DOOR_REPAIR_AMOUNT 50 //amount of health regained per stack amount used
-
/obj/machinery/door
name = "Door"
desc = "It opens and closes."
diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm
index 7c13792724..78dadca5e9 100644
--- a/code/game/machinery/embedded_controller/docking_program.dm
+++ b/code/game/machinery/embedded_controller/docking_program.dm
@@ -306,4 +306,6 @@
#undef MODE_NONE
#undef MODE_SERVER
-#undef MODE_CLIENT
\ No newline at end of file
+#undef MODE_CLIENT
+
+#undef MESSAGE_RESEND_TIME
diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm
index 31c7233c7d..caaaaef648 100644
--- a/code/game/machinery/jukebox.dm
+++ b/code/game/machinery/jukebox.dm
@@ -3,11 +3,6 @@
// Rewritten by Leshana from existing Polaris code, merging in D2K5 and N3X15 work
//
-#define JUKEMODE_NEXT 1 // Advance to next song in the track list
-#define JUKEMODE_RANDOM 2 // Not shuffle, randomly picks next each time.
-#define JUKEMODE_REPEAT_SONG 3 // Play the same song over and over
-#define JUKEMODE_PLAY_ONCE 4 // Play, then stop.
-
/obj/machinery/media/jukebox
name = "space jukebox"
desc = "Filled with songs both past and present!"
diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm
index 1784635d59..fc942c4fa9 100644
--- a/code/game/machinery/nuclear_bomb.dm
+++ b/code/game/machinery/nuclear_bomb.dm
@@ -410,6 +410,8 @@ var/bomb_set
return
return
+#undef NUKERANGE
+
/obj/item/weapon/disk/nuclear/New()
..()
nuke_disks |= src
diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm
index 027de127b2..85b79e233f 100644
--- a/code/game/machinery/overview.dm
+++ b/code/game/machinery/overview.dm
@@ -1,4 +1,4 @@
-//#define AMAP
+//# define AMAP
/obj/machinery/computer/security/verb/station_map()
set name = ".map"
set category = "Object"
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 11eb234e26..2738b35918 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -1,11 +1,6 @@
/******************** Requests Console ********************/
/** Originally written by errorage, updated by: Carn, needs more work though. I just added some security fixes */
-//Request Console Department Types
-#define RC_ASSIST 1 //Request Assistance
-#define RC_SUPPLY 2 //Request Supplies
-#define RC_INFO 4 //Relay Info
-
//Request Console Screens
#define RCS_MAINMENU 0 // Main menu
#define RCS_RQASSIST 1 // Request supplies
@@ -289,3 +284,13 @@ var/list/obj/machinery/requests_console/allConsoles = list()
announcement.announcer = ""
if(mainmenu)
screen = RCS_MAINMENU
+
+#undef RCS_MAINMENU
+#undef RCS_RQASSIST
+#undef RCS_RQSUPPLY
+#undef RCS_SENDINFO
+#undef RCS_SENTPASS
+#undef RCS_SENTFAIL
+#undef RCS_VIEWMSGS
+#undef RCS_MESSAUTH
+#undef RCS_ANNOUNCE
diff --git a/code/game/machinery/requests_console_vr.dm b/code/game/machinery/requests_console_vr.dm
index fa40e4c2e9..90504d49dc 100644
--- a/code/game/machinery/requests_console_vr.dm
+++ b/code/game/machinery/requests_console_vr.dm
@@ -2,9 +2,9 @@
// By using these presets we can rename the departments easily.
//Request Console Department Types
-// #define RC_ASSIST 1 //Request Assistance
-// #define RC_SUPPLY 2 //Request Supplies
-// #define RC_INFO 4 //Relay Info
+// # define RC_ASSIST 1 //Request Assistance
+// # define RC_SUPPLY 2 //Request Supplies
+// # define RC_INFO 4 //Relay Info
/obj/machinery/requests_console/preset
name = ""
diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm
index 117279cf65..35df877443 100644
--- a/code/game/magic/archived_book.dm
+++ b/code/game/magic/archived_book.dm
@@ -3,7 +3,6 @@
#define BOOK_VERSION_MIN 1
#define BOOK_VERSION_MAX 2
#define BOOK_PATH "data/books/"
-#define BOOKS_USE_SQL 0 // no guarentee for this branch to work right with sql
var/global/datum/book_manager/book_mgr = new()
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index 80c16c4a65..f7be915eda 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -1,13 +1,5 @@
//DO NOT ADD MECHA PARTS TO THE GAME WITH THE DEFAULT "SPRITE ME" SPRITE!
//I'm annoyed I even have to tell you this! SPRITE FIRST, then commit.
-#define EQUIP_HULL "hull"
-#define EQUIP_WEAPON "weapon"
-#define EQUIP_UTILITY "utility"
-#define EQUIP_SPECIAL "core"
-//VOREStation Addition begin: MICROMECHS
-#define EQUIP_MICRO_UTILITY "micro_utility"
-#define EQUIP_MICRO_WEAPON "micro_weapon"
-//VOREStation Addition end: MICROMECHS
/obj/item/mecha_parts/mecha_equipment
name = "mecha equipment"
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 1e054279ca..f8275a4d3d 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1,26 +1,9 @@
-#define MECHA_INT_FIRE 1
-#define MECHA_INT_TEMP_CONTROL 2
-#define MECHA_INT_SHORT_CIRCUIT 4
-#define MECHA_INT_TANK_BREACH 8
-#define MECHA_INT_CONTROL_LOST 16
-
-#define MECHA_PROC_MOVEMENT 1
-#define MECHA_PROC_DAMAGE 2
-#define MECHA_PROC_INT_TEMP 4
-
-#define MELEE 1
-#define RANGED 2
-
#define MECHA_OPERATING 0
#define MECHA_BOLTS_SECURED 1
#define MECHA_PANEL_LOOSE 2
#define MECHA_CELL_OPEN 3
#define MECHA_CELL_OUT 4
-#define MECH_FACTION_NT "nano"
-#define MECH_FACTION_SYNDI "syndi"
-#define MECH_FACTION_NONE "none"
-
/obj/mecha
name = "Mecha"
desc = "Exosuit"
@@ -2911,3 +2894,9 @@
playsound(src, 'sound/effects/attackblob.ogg', 50, 1)
return ..()
+
+#undef MECHA_OPERATING
+#undef MECHA_BOLTS_SECURED
+#undef MECHA_PANEL_LOOSE
+#undef MECHA_CELL_OPEN
+#undef MECHA_CELL_OUT
diff --git a/code/game/mecha/micro/mecha_vr.dm b/code/game/mecha/micro/mecha_vr.dm
index a0dd1b43e9..9a89e98e16 100644
--- a/code/game/mecha/micro/mecha_vr.dm
+++ b/code/game/mecha/micro/mecha_vr.dm
@@ -45,3 +45,5 @@
/obj/item/weapon/circuitboard/mecha/weasel/main
name = T_BOARD_MICRO_MECHA("Weasel central control")
icon_state = "mainboard"
+
+#undef T_BOARD_MICRO_MECHA
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 16a0515e63..50fec106cc 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -193,7 +193,6 @@ var/global/list/image/splatter_cache=list()
icon = blood
cut_overlays()
- add_overlay(janhud)
add_overlay(giblets)
/obj/effect/decal/cleanable/blood/gibs/up
@@ -252,3 +251,5 @@ var/global/list/image/splatter_cache=list()
/obj/effect/decal/cleanable/mucus/mapped/Destroy()
virus2.Cut()
return ..()
+
+#undef DRYING_TIME
diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm
index 41b5498340..3d9e74ca6a 100644
--- a/code/game/objects/effects/decals/Cleanable/tracks.dm
+++ b/code/game/objects/effects/decals/Cleanable/tracks.dm
@@ -1,15 +1,5 @@
// Stolen en masse from N3X15 of /vg/station with much gratitude.
-// The idea is to have 4 bits for coming and 4 for going.
-#define TRACKS_COMING_NORTH 1
-#define TRACKS_COMING_SOUTH 2
-#define TRACKS_COMING_EAST 4
-#define TRACKS_COMING_WEST 8
-#define TRACKS_GOING_NORTH 16
-#define TRACKS_GOING_SOUTH 32
-#define TRACKS_GOING_EAST 64
-#define TRACKS_GOING_WEST 128
-
// 5 seconds
#define TRACKS_CRUSTIFY_TIME 50
@@ -130,7 +120,6 @@ var/global/list/image/fluidtrack_cache=list()
/obj/effect/decal/cleanable/blood/tracks/update_icon()
cut_overlays()
- add_overlay(janhud)
color = "#FFFFFF"
var/truedir=0
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index a3c5dc6a4b..8d8e52f6f1 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -12,7 +12,7 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for
var/generic_filth = FALSE
var/age = 0
var/list/random_icon_states = list()
- var/list/janhud = list()
+ var/obj/effect/decal/jan_hud/jan_icon = null
/obj/effect/decal/cleanable/Initialize(var/mapload, var/_age)
if(!isnull(_age))
@@ -21,13 +21,12 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for
src.icon_state = pick(src.random_icon_states)
if(!mapload || !config.persistence_ignore_mapload)
SSpersistence.track_value(src, /datum/persistent/filth)
- janhud += gen_hud_image(ingame_hud, src, "janhud[rand(1,9)]", plane = PLANE_JANHUD)
- add_overlay(janhud)
+ jan_icon = new/obj/effect/decal/jan_hud(src.loc)
. = ..()
/obj/effect/decal/cleanable/Destroy()
SSpersistence.forget_value(src, /datum/persistent/filth)
- cut_overlays()
+ QDEL_NULL(jan_icon)
. = ..()
/obj/effect/decal/cleanable/clean_blood(var/ignore = 0)
@@ -40,3 +39,14 @@ generic_filth = TRUE means when the decal is saved, it will be switched out for
if (random_icon_states && length(src.random_icon_states) > 0)
src.icon_state = pick(src.random_icon_states)
..()
+
+/obj/effect/decal/jan_hud
+ plane = PLANE_JANHUD
+ layer = BELOW_MOB_LAYER
+ vis_flags = VIS_HIDE
+ persist_storable = FALSE
+ icon = 'icons/mob/hud.dmi'
+ mouse_opacity = 0
+
+/obj/effect/decal/jan_hud/Initialize()
+ src.icon_state = "janhud[rand(1,9)]"
diff --git a/code/game/objects/empulse.dm b/code/game/objects/empulse.dm
index 949eb71eaf..31bc2b804d 100644
--- a/code/game/objects/empulse.dm
+++ b/code/game/objects/empulse.dm
@@ -2,7 +2,7 @@
// If emp_act() takes more than defined deciseconds (1/10 seconds) an admin message and log is created.
// I do not recommend having this uncommented on main server, it probably causes a bit more lag, espicially with larger EMPs.
-// #define EMPDEBUG 10
+// # define EMPDEBUG 10
/proc/empulse(turf/epicenter, first_range, second_range, third_range, fourth_range, log=0)
if(!epicenter) return
@@ -71,4 +71,4 @@
if((world.timeofday - time) >= EMPDEBUG)
log_and_message_admins("EMPDEBUG: [T.name] - [T.type] - took [world.timeofday - time]ds to process emp_act()!")
#endif
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm
index 31039c7fbc..fa8cf298fe 100644
--- a/code/game/objects/items/blueprints.dm
+++ b/code/game/objects/items/blueprints.dm
@@ -5,10 +5,6 @@
icon_state = "blueprints"
attack_verb = list("attacked", "bapped", "hit")
preserve_item = 1
- var/const/AREA_ERRNONE = 0
- var/const/AREA_STATION = 1
- var/const/AREA_SPACE = 2
- var/const/AREA_SPECIAL = 3
var/const/BORDER_ERROR = 0
var/const/BORDER_NONE = 1
diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm
index 93bd466de6..6b924f31ab 100644
--- a/code/game/objects/items/blueprints_vr.dm
+++ b/code/game/objects/items/blueprints_vr.dm
@@ -55,14 +55,6 @@
/area/submap/casino_event
name = "\improper Space Casino"
-
-
-//TG blueprints.
-#define AREA_ERRNONE 0
-#define AREA_STATION 1
-#define AREA_SPACE 2
-#define AREA_SPECIAL 3
-
/obj/item/areaeditor
name = "area modification item"
icon = 'icons/obj/items.dmi'
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index f188f05431..64c28a8333 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -32,12 +32,6 @@
//
// The explosion cannot insta-kill anyone with 30% or more health.
-#define LIGHT_OK 0
-#define LIGHT_EMPTY 1
-#define LIGHT_BROKEN 2
-#define LIGHT_BURNED 3
-
-
/obj/item/device/lightreplacer
name = "light replacer"
@@ -223,8 +217,3 @@
return 1
else
return 0
-
-#undef LIGHT_OK
-#undef LIGHT_EMPTY
-#undef LIGHT_BROKEN
-#undef LIGHT_BURNED
\ No newline at end of file
diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm
index e299a4d390..5f4891cef1 100644
--- a/code/game/objects/items/devices/modkit.dm
+++ b/code/game/objects/items/devices/modkit.dm
@@ -62,6 +62,10 @@
user.drop_from_inventory(src)
qdel(src)
+#undef MODKIT_HELMET
+#undef MODKIT_SUIT
+#undef MODKIT_FULL
+
/obj/item/device/modkit/examine(mob/user)
. = ..()
. += "It looks as though it modifies hardsuits to fit [target_species] users."
diff --git a/code/game/objects/items/devices/paicard_vr.dm b/code/game/objects/items/devices/paicard_vr.dm
index 7283966d47..26dcdc7912 100644
--- a/code/game/objects/items/devices/paicard_vr.dm
+++ b/code/game/objects/items/devices/paicard_vr.dm
@@ -1,7 +1,3 @@
-#define PP_FUNCTIONAL 0
-#define PP_BROKEN 1
-#define PP_MISSING 2
-
var/global/list/paikeys = list()
/obj/item/device/paicard
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index fe41bc658f..ace8fde636 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -62,6 +62,7 @@
/obj/item/borg/upgrade/utility/rename/action(var/mob/living/silicon/robot/R)
if(..()) return 0
+ if(isshell(R)) return 0
R.notify_ai(ROBOT_NOTIFICATION_NEW_NAME, R.name, heldname)
R.name = heldname
R.custom_name = heldname
diff --git a/code/game/objects/items/uav.dm b/code/game/objects/items/uav.dm
index 20bb85d69b..39f95514f6 100644
--- a/code/game/objects/items/uav.dm
+++ b/code/game/objects/items/uav.dm
@@ -365,4 +365,5 @@
#undef UAV_OFF
#undef UAV_ON
+#undef UAV_PAIRING
#undef UAV_PACKED
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
index a083027713..3e806915a4 100644
--- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm
+++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
@@ -1,9 +1,3 @@
-//Define a macro that we can use to assemble all the circuit board names
-#ifdef T_BOARD
-#error T_BOARD already defined elsewhere, we can't use it.
-#endif
-#define T_BOARD(name) "circuit board (" + (name) + ")"
-
/obj/item/weapon/circuitboard
name = "circuit board"
icon = 'icons/obj/module.dmi'
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 7ff8063e32..395c51fa19 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -1,7 +1,3 @@
-#define MALFUNCTION_TEMPORARY 1
-#define MALFUNCTION_PERMANENT 2
-
-
/obj/item/weapon/implant
name = "implant"
icon = 'icons/obj/device.dmi'
diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm
index 7f16d57a1c..c9524bf48c 100644
--- a/code/game/objects/items/weapons/material/material_armor.dm
+++ b/code/game/objects/items/weapons/material/material_armor.dm
@@ -163,6 +163,7 @@ Protectiveness | Armor %
result = abs(result - 100)
return round(result)
+#undef MATERIAL_ARMOR_COEFFICENT
/obj/item/clothing/proc/update_armor()
if(material)
@@ -410,4 +411,4 @@ Protectiveness | Armor %
icon_state = "material_armor_makeshift"
/obj/item/clothing/head/helmet/material/makeshift/durasteel
- default_material = "durasteel"
\ No newline at end of file
+ default_material = "durasteel"
diff --git a/code/game/objects/items/weapons/picnic_blankets.dm b/code/game/objects/items/weapons/picnic_blankets.dm
index ab76b8efa7..0986c46e6f 100644
--- a/code/game/objects/items/weapons/picnic_blankets.dm
+++ b/code/game/objects/items/weapons/picnic_blankets.dm
@@ -119,3 +119,6 @@
unfold()
if(unfoldable)
verbs -= /obj/structure/picnic_blanket_deployed/verb/fold_up
+
+#undef CENTER
+#undef SIDE
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index c1cb09fecb..880f5f2491 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -669,3 +669,5 @@ var/list/global/tank_gauge_cache = list()
unsense_proximity(callback = /atom/proc/HasProximity, center = old_loc)
if(isturf(loc))
sense_proximity(callback = /atom/proc/HasProximity)
+
+#undef TANK_IDEAL_PRESSURE
diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm
index 56366d7cdd..b3370c2792 100644
--- a/code/game/objects/random/maintenance.dm
+++ b/code/game/objects/random/maintenance.dm
@@ -112,7 +112,9 @@ something, make sure it's not in one of the other lists.*/
prob(2);/obj/item/toy/tennis/blue,
prob(2);/obj/item/toy/tennis/purple,
prob(1);/obj/item/toy/baseball,
- prob(1);/obj/item/pizzavoucher
+ prob(1);/obj/item/pizzavoucher,
+ prob(5);/obj/item/weapon/material/fishing_net/butterfly_net,
+ prob(2);/obj/item/weapon/cracker
/* VOREStation Edit End */
)
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index 1cb0175267..a4e4b13702 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -1138,5 +1138,13 @@
prob(8);/obj/item/capture_crystal/random,
prob(10);/obj/item/weapon/bluespace_harpoon,
prob(10);/obj/item/weapon/bluespace_crystal,
- prob(1);/obj/item/clothing/glasses/graviton
+ prob(1);/obj/item/clothing/glasses/graviton,
+ prob(10);/obj/item/weapon/cracker,
+ prob(1);/obj/item/weapon/cracker/shrinking,
+ prob(1);/obj/item/weapon/cracker/growing,
+ prob(1);/obj/item/weapon/cracker/invisibility,
+ prob(1);/obj/item/weapon/cracker/drugged,
+ prob(1);/obj/item/weapon/cracker/knockover,
+ prob(1);/obj/item/weapon/cracker/vore,
+ prob(1);/obj/item/weapon/cracker/money
)
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index 5eec312418..157354f2c9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -18,7 +18,8 @@
/obj/item/weapon/reagent_containers/spray/plantbgone,
/obj/item/clothing/suit/storage/hooded/wintercoat/hydro,
/obj/item/clothing/shoes/boots/winter/hydro,
- /obj/item/weapon/storage/belt/hydro)
+ /obj/item/weapon/storage/belt/hydro,
+ /obj/item/weapon/material/fishing_net/butterfly_net)
/obj/structure/closet/secure_closet/hydroponics/Initialize()
if(prob(50))
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 2a7bda2d3f..6dcb5da2b8 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -227,8 +227,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
if (!( A.anchored ))
A.forceMove(src)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
- //src.connected = null
- qdel(src.connected)
+ qdel_null(connected)
else if (src.locked == 0)
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
src.connected = new /obj/structure/m_tray/c_tray( src.loc )
@@ -242,8 +241,7 @@ GLOBAL_LIST_BOILERPLATE(all_crematoriums, /obj/structure/morgue/crematorium)
A.forceMove(src.connected.loc)
src.connected.icon_state = "cremat"
else
- //src.connected = null
- qdel(src.connected)
+ qdel_null(connected)
src.add_fingerprint(user)
update()
diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm
index 968ff4b66d..90f885bc40 100644
--- a/code/game/objects/structures/props/prop.dm
+++ b/code/game/objects/structures/props/prop.dm
@@ -52,6 +52,13 @@
icon_state = "ship_memorial"
bound_width = 64
+/obj/structure/prop/big_skeleton
+ name = "large skeleton"
+ desc = "Whatever it is, it doesn't look too healthy."
+ icon = 'icons/obj/props/decor96x96.dmi'
+ icon_state = "big_skeleton"
+ density = 0
+
/**
*
Notes on change_state
diff --git a/code/game/objects/structures/props/rocks.dm b/code/game/objects/structures/props/rocks.dm
index b76c477367..253a36bda5 100644
--- a/code/game/objects/structures/props/rocks.dm
+++ b/code/game/objects/structures/props/rocks.dm
@@ -59,4 +59,49 @@
/obj/structure/prop/rock/crystal_dust
name = "crystal dust"
icon = 'icons/obj/props/decor.dmi'
- icon_state = "bsc_dust"
\ No newline at end of file
+ icon_state = "bsc_dust"
+
+/obj/structure/prop/rock/ice
+ icon_state = "ice2"
+
+/obj/structure/prop/rock/ice/spike
+ icon_state = "ice1"
+
+/obj/structure/prop/rock/ice/flat
+ icon_state = "ice3"
+
+/obj/structure/prop/rock/ice/round
+ icon_state = "ice4"
+
+/obj/structure/prop/rock/ice/small
+ name = "small rocks"
+ icon_state = "icesmall1"
+ density = FALSE
+
+/obj/structure/prop/rock/ice/small/alt
+ icon_state = "icesmall2"
+
+// glamour things for whitespace
+/obj/structure/prop/rock/glamour
+ name = "glamour"
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "pillar_1"
+
+/obj/structure/prop/rock/glamour/double
+ icon_state = "pillar_3"
+
+/obj/structure/prop/rock/glamour/triple
+ icon_state = "pillar_2"
+
+/obj/structure/prop/rock/glamour/small
+ icon_state = "gems_1"
+ density = FALSE
+
+/obj/structure/prop/rock/glamour/small/alt1
+ icon_state = "gems_2"
+
+/obj/structure/prop/rock/glamour/small/alt2
+ icon_state = "gems_3"
+
+/obj/structure/prop/rock/glamour/small/alt3
+ icon_state = "gems_4"
\ No newline at end of file
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index c08a9d1951..b0d9a6bed8 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -39,6 +39,8 @@
src.add_fingerprint(user)
return
+#undef NEST_RESIST_TIME
+
/obj/structure/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob)
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
return
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 2387293584..e4fd0a5141 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -96,6 +96,7 @@
to_chat(user, "You put [I] in [src]. ")
update_icon()
+#undef TANK_DISPENSER_CAPACITY
/obj/structure/dispenser/tgui_act(action, params)
if(..())
@@ -119,4 +120,4 @@
oxygentanks--
. = TRUE
playsound(src, 'sound/items/drop/gascan.ogg', 100, 1, 1)
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/game/objects/structures/trash_pile_vr.dm b/code/game/objects/structures/trash_pile_vr.dm
index 6b63271978..65552088f7 100644
--- a/code/game/objects/structures/trash_pile_vr.dm
+++ b/code/game/objects/structures/trash_pile_vr.dm
@@ -282,6 +282,7 @@
prob(4);/obj/item/weapon/gun/energy/sizegun,
prob(4);/obj/item/device/slow_sizegun,
prob(4);/obj/item/clothing/accessory/collar/shock/bluespace,
+ prob(3);/obj/item/weapon/cracker,
prob(3);/obj/item/weapon/material/butterfly,
prob(3);/obj/item/weapon/material/butterfly/switchblade,
prob(3);/obj/item/clothing/gloves/knuckledusters,
@@ -314,7 +315,8 @@
prob(1);/obj/item/device/perfect_tele/one_beacon,
prob(1);/obj/item/clothing/gloves/bluespace,
prob(1);/obj/item/weapon/gun/energy/mouseray,
- prob(1);/obj/item/clothing/accessory/collar/shock/bluespace/modified)
+ prob(1);/obj/item/clothing/accessory/collar/shock/bluespace/modified,
+ prob(1);/obj/item/weapon/gun/energy/sizegun/backfire)
var/obj/item/I = new path()
return I
diff --git a/code/game/turfs/simulated/outdoors/snow.dm b/code/game/turfs/simulated/outdoors/snow.dm
index 9f8982ebb2..94933d7532 100644
--- a/code/game/turfs/simulated/outdoors/snow.dm
+++ b/code/game/turfs/simulated/outdoors/snow.dm
@@ -80,3 +80,17 @@
desc = "Looks slippery."
movement_cost = 4
edge_blending_priority = 0
+
+// Extra cold variants
+
+/turf/simulated/floor/outdoors/snow/v5
+ temperature = 150
+ oxygen = 8
+ nitrogen = 17
+ carbon_dioxide = 75
+
+/turf/simulated/floor/outdoors/ice/v5
+ temperature = 150
+ oxygen = 8
+ nitrogen = 17
+ carbon_dioxide = 75
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index a396b29d29..56a8f07710 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -270,3 +270,14 @@ var/list/shoreline_icon_cache = list()
to_chat(L, "You get drenched in blood from entering \the [src]! ")
AM.water_act(5)
..()
+
+/turf/simulated/floor/water/glamour
+ name = "glamour"
+ desc = "A body of glamour. It seems shallow enough to walk through, if needed."
+ icon = 'icons/turf/flooring/glamour.dmi'
+ icon_state = "water"
+ water_icon = 'icons/turf/flooring/glamour.dmi'
+ water_state = "water"
+ under_state = "glamour"
+ reagent_type = "water"
+
diff --git a/code/game/turfs/unsimulated/planetary_vr.dm b/code/game/turfs/unsimulated/planetary_vr.dm
index 144379a6f6..82fccbdaed 100644
--- a/code/game/turfs/unsimulated/planetary_vr.dm
+++ b/code/game/turfs/unsimulated/planetary_vr.dm
@@ -1,49 +1,3 @@
-//Atmosphere properties
-#define VIRGO3B_ONE_ATMOSPHERE 82.4 //kPa
-#define VIRGO3B_AVG_TEMP 234 //kelvin
-
-#define VIRGO3B_PER_N2 0.16 //percent
-#define VIRGO3B_PER_O2 0.00
-#define VIRGO3B_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm
-#define VIRGO3B_PER_CO2 0.12
-#define VIRGO3B_PER_PHORON 0.72
-
-//Math only beyond this point
-#define VIRGO3B_MOL_PER_TURF (VIRGO3B_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3B_AVG_TEMP*R_IDEAL_GAS_EQUATION))
-#define VIRGO3B_MOL_N2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2)
-#define VIRGO3B_MOL_O2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_O2)
-#define VIRGO3B_MOL_N2O (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_N2O)
-#define VIRGO3B_MOL_CO2 (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_CO2)
-#define VIRGO3B_MOL_PHORON (VIRGO3B_MOL_PER_TURF * VIRGO3B_PER_PHORON)
-
-//Turfmakers
-#define VIRGO3B_SET_ATMOS nitrogen=VIRGO3B_MOL_N2;oxygen=VIRGO3B_MOL_O2;carbon_dioxide=VIRGO3B_MOL_CO2;phoron=VIRGO3B_MOL_PHORON;temperature=VIRGO3B_AVG_TEMP
-#define VIRGO3B_TURF_CREATE(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP;x/virgo3b/outdoors=TRUE;x/virgo3b/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
-#define VIRGO3B_TURF_CREATE_UN(x) x/virgo3b/nitrogen=VIRGO3B_MOL_N2;x/virgo3b/oxygen=VIRGO3B_MOL_O2;x/virgo3b/carbon_dioxide=VIRGO3B_MOL_CO2;x/virgo3b/phoron=VIRGO3B_MOL_PHORON;x/virgo3b/temperature=VIRGO3B_AVG_TEMP
-
-//Atmosphere properties
-#define VIRGO3BB_ONE_ATMOSPHERE 101.325 //kPa
-#define VIRGO3BB_AVG_TEMP 293.15 //kelvin
-
-#define VIRGO3BB_PER_N2 0.78 //percent
-#define VIRGO3BB_PER_O2 0.21
-#define VIRGO3BB_PER_N2O 0.00 //Currently no capacity to 'start' a turf with this. See turf.dm
-#define VIRGO3BB_PER_CO2 0.01
-#define VIRGO3BB_PER_PHORON 0.00
-
-//Math only beyond this point
-#define VIRGO3BB_MOL_PER_TURF (VIRGO3BB_ONE_ATMOSPHERE*CELL_VOLUME/(VIRGO3BB_AVG_TEMP*R_IDEAL_GAS_EQUATION))
-#define VIRGO3BB_MOL_N2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_N2)
-#define VIRGO3BB_MOL_O2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_O2)
-#define VIRGO3BB_MOL_N2O (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_N2O)
-#define VIRGO3BB_MOL_CO2 (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_CO2)
-#define VIRGO3BB_MOL_PHORON (VIRGO3BB_MOL_PER_TURF * VIRGO3BB_PER_PHORON)
-
-//Turfmakers
-#define VIRGO3BB_SET_ATMOS nitrogen=VIRGO3BB_MOL_N2;oxygen=VIRGO3BB_MOL_O2;carbon_dioxide=VIRGO3BB_MOL_CO2;phoron=VIRGO3BB_MOL_PHORON;temperature=VIRGO3BB_AVG_TEMP
-#define VIRGO3BB_TURF_CREATE(x) x/virgo3b_better/nitrogen=VIRGO3BB_MOL_N2;x/virgo3b_better/oxygen=VIRGO3BB_MOL_O2;x/virgo3b_better/carbon_dioxide=VIRGO3BB_MOL_CO2;x/virgo3b_better/phoron=VIRGO3BB_MOL_PHORON;x/virgo3b_better/temperature=VIRGO3BB_AVG_TEMP;x/virgo3b_better/outdoors=TRUE;x/virgo3b_better/update_graphic(list/graphic_add = null, list/graphic_remove = null) return 0
-#define VIRGO3BB_TURF_CREATE_UN(x) x/virgo3b_better/nitrogen=VIRGO3BB_MOL_N2;x/virgo3b_better/oxygen=VIRGO3BB_MOL_O2;x/virgo3b_better/carbon_dioxide=VIRGO3BB_MOL_CO2;x/virgo3b_better/phoron=VIRGO3BB_MOL_PHORON;x/virgo3b_better/temperature=VIRGO3BB_AVG_TEMP
-
// This is a wall you surround the area of your "planet" with, that makes the atmosphere inside stay within bounds, even if canisters
// are opened or other strange things occur.
/turf/unsimulated/wall/planetary/virgo3b
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 65c8afb298..f59a6ad811 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -48,3 +48,5 @@
else
to_chat(src, "Error: admin_investigate: Href Logging is not on. ")
return
+
+#undef INVESTIGATE_DIR
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index e04b578c95..99628c244a 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -168,9 +168,6 @@ Example: USING PROCCALL = BLOCKING, SELECT = FORCE_NULLS, PRIORITY = HIGH SELECT
#define SDQL2_STATE_SWITCHING 5
#define SDQL2_STATE_HALTING 6
-#define SDQL2_VALID_OPTION_TYPES list("proccall", "select", "priority", "autogc")
-#define SDQL2_VALID_OPTION_VALUES list("async", "blocking", "force_nulls", "skip_nulls", "high", "normal", "keep_alive")
-
#define SDQL2_OPTION_SELECT_OUTPUT_SKIP_NULLS (1<<0)
#define SDQL2_OPTION_BLOCKING_CALLS (1<<1)
#define SDQL2_OPTION_HIGH_PRIORITY (1<<2) //High priority SDQL query, allow using almost all of the tick.
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index ef5987e4be..ebfdd9b195 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -877,3 +877,4 @@
#undef BUILDMODE_LIGHTS
#undef BUILDMODE_AI
#undef LAST_BUILDMODE
+#undef BUILDMODE_DROP
diff --git a/code/modules/admin/verbs/get_player_status.dm b/code/modules/admin/verbs/get_player_status.dm
index c409deab65..c852c81fd3 100644
--- a/code/modules/admin/verbs/get_player_status.dm
+++ b/code/modules/admin/verbs/get_player_status.dm
@@ -42,3 +42,5 @@
message += "#### Over all, there are [players] eligible players, of which [inactives] were hidden due to inactivity. ####"
to_chat(usr, SPAN_NOTICE(message))
+
+#undef INACTIVITY_CAP
diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm
index e048ff4e5c..0b6b3e2661 100644
--- a/code/modules/admin/verbs/lightning_strike.dm
+++ b/code/modules/admin/verbs/lightning_strike.dm
@@ -95,5 +95,6 @@
C.ear_deaf += 10
to_chat(L, span("danger", "Lightning struck nearby, and the thunderclap is deafening!"))
+#undef LIGHTNING_REDIRECT_RANGE
#undef LIGHTNING_ZAP_RANGE
#undef LIGHTNING_POWER
diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm
index f381c06968..4d4f0096b9 100644
--- a/code/modules/admin/verbs/modify_robot.dm
+++ b/code/modules/admin/verbs/modify_robot.dm
@@ -76,7 +76,7 @@
var/obj/item/weapon/robot_module/robot/robot_type = new module_type(robot)
robot.emag_items = 1
if(!istype(robot_type, /obj/item/weapon/robot_module/robot/))
- robot.Destroy()
+ qdel(robot)
break
var/list/all_modules = robot.module.modules
all_modules += robot.module.emag
@@ -134,7 +134,7 @@
target.module.synths.Add(item_with_matter.plastic)
else
item_with_matter.plastic = target.module.synths[found]
- robot.Destroy()
+ qdel(robot)
if(MODIFIY_ROBOT_MODULE_REMOVE)
while(TRUE)
var/list/active_modules = target.module.modules
@@ -326,7 +326,7 @@
target.hud_used.update_robot_modules_display(TRUE)
target.modtype = initial(target.modtype)
target.module.Reset(target)
- target.module.Destroy()
+ qdel(target.module)
target.modtype = selected_module
var/module_type = robot_modules[selected_module]
target.transform_with_anim()
diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm
index f8bf5cd9dc..14128dfbb1 100644
--- a/code/modules/ai/ai_holder.dm
+++ b/code/modules/ai/ai_holder.dm
@@ -535,3 +535,8 @@
#undef AI_NO_PROCESS
#undef AI_PROCESSING
#undef AI_FASTPROCESSING
+
+#undef START_AIPROCESSING
+#undef STOP_AIPROCESSING
+#undef START_AIFASTPROCESSING
+#undef STOP_AIFASTPROCESSING
diff --git a/code/modules/ai/ai_holder_subtypes/simple_mob_ai_vr.dm b/code/modules/ai/ai_holder_subtypes/simple_mob_ai_vr.dm
index 6c78d38d8f..ef75fb502d 100644
--- a/code/modules/ai/ai_holder_subtypes/simple_mob_ai_vr.dm
+++ b/code/modules/ai/ai_holder_subtypes/simple_mob_ai_vr.dm
@@ -1,4 +1,6 @@
#define VIRGO_AI_NORETURN_CREATE(x) x/returnhome/returns_home=1;x/returnhome/max_home_distance=8
VIRGO_AI_NORETURN_CREATE(/datum/ai_holder/simple_mob/melee/evasive)
-VIRGO_AI_NORETURN_CREATE(/datum/ai_holder/simple_mob/ranged/kiting/threatening)
\ No newline at end of file
+VIRGO_AI_NORETURN_CREATE(/datum/ai_holder/simple_mob/ranged/kiting/threatening)
+
+#undef VIRGO_AI_NORETURN_CREATE
diff --git a/code/modules/alarm/alarm.dm b/code/modules/alarm/alarm.dm
index 3ad1df433f..89fe38a38f 100644
--- a/code/modules/alarm/alarm.dm
+++ b/code/modules/alarm/alarm.dm
@@ -43,6 +43,8 @@
AS.duration = 0
AS.end_time = world.time + ALARM_RESET_DELAY
+#undef ALARM_RESET_DELAY
+
/datum/alarm/proc/set_source_data(var/atom/source, var/duration, var/severity, var/hidden)
var/datum/alarm_source/AS = sources_assoc[source]
if(!AS)
diff --git a/code/modules/alarm/alarm_handler.dm b/code/modules/alarm/alarm_handler.dm
index 4064d700d2..b49402d7ff 100644
--- a/code/modules/alarm/alarm_handler.dm
+++ b/code/modules/alarm/alarm_handler.dm
@@ -75,6 +75,9 @@
C.remove_network(category)
notify_listeners(alarm, was_raised)
+#undef ALARM_RAISED
+#undef ALARM_CLEARED
+
/datum/alarm_handler/proc/get_alarm_severity_for_origin(var/atom/origin)
if(!origin)
return
@@ -113,4 +116,4 @@
if(A.hidden || (z && !(A.origin?.z in map_levels)))
continue
visible_alarms.Add(A)
- return visible_alarms
\ No newline at end of file
+ return visible_alarms
diff --git a/code/modules/busy_space_vr/air_traffic.dm b/code/modules/busy_space_vr/air_traffic.dm
index 347617558e..46adabfcb2 100644
--- a/code/modules/busy_space_vr/air_traffic.dm
+++ b/code/modules/busy_space_vr/air_traffic.dm
@@ -460,4 +460,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
//Ship sends response to ATC
msg(full_closure,"[prefix] [shipname]")
return
-*/
\ No newline at end of file
+*/
+
+#undef MIN_MSG_DELAY
+#undef MAX_MSG_DELAY
diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm
index d5516efed1..04e89cbaba 100644
--- a/code/modules/casino/casino.dm
+++ b/code/modules/casino/casino.dm
@@ -529,9 +529,9 @@
if(ishuman(usr) || istype(usr, /mob/living/silicon/robot))
interval = tgui_input_number(usr, "Put the desired interval (1-1000)", "Set Interval", null, 1000, 1)
if(interval>1000 || interval<1)
- usr << "Invalid interval. "
+ to_chat(usr, span_notice("Invalid interval."))
return
- usr << "You set the interval to [interval] "
+ to_chat(usr, span_notice("You set the interval to [interval]"))
return
//
diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm
index df7bebcefc..10b9437d1a 100644
--- a/code/modules/casino/casino_prize_vendor.dm
+++ b/code/modules/casino/casino_prize_vendor.dm
@@ -350,3 +350,5 @@
/obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now
if(stat & (BROKEN|NOPOWER))
return
+
+#undef CASINO_PRIZE
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index d09aa71fa3..ea1b3db4f3 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -5,7 +5,7 @@
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
//I would just like the code ready should it ever need to be used.
-//#define TOPIC_DEBUGGING 1
+//# define TOPIC_DEBUGGING 1
/*
When somebody clicks a link in game, this Topic is called first.
diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm
index 61603361f5..21e6602863 100644
--- a/code/modules/client/preference_setup/loadout/loadout.dm
+++ b/code/modules/client/preference_setup/loadout/loadout.dm
@@ -155,17 +155,17 @@ var/list/gear_datums = list()
. += "
"
for(var/datum/gear_tweak/tweak in G.gear_tweaks)
@@ -252,6 +252,7 @@ var/list/gear_datums = list()
var/cost = 1 //Number of points used. Items in general cost 1 point, storage/armor/gloves/special use costs 2 points.
var/slot //Slot to equip to.
var/list/allowed_roles //Roles that can spawn with this item.
+ var/show_roles = TRUE //Show the role restrictions on this item?
var/whitelisted //Term to check the whitelist for..
var/sort_category = "General"
var/list/gear_tweaks = list() //List of datums which will alter the item after it has been spawned.
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index 9ea615df08..9b7839801e 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -75,7 +75,7 @@
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(wcoats))
/datum/gear/accessory/holster
- display_name = "holster selection (Security, CD, HoP)"
+ display_name = "holster selection"
path = /obj/item/clothing/accessory/holster
allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective", "Blueshield Guard","Security Pilot") //YW ADDITIONS
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
index c6f689e4cc..c1c6ce0c8d 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
@@ -57,35 +57,35 @@
path = /obj/item/clothing/accessory/collar/holo/indigestible
/datum/gear/accessory/holster
- display_name = "holster selection (Security, SM, HoP, Exploration)" //YW ADDITIONS, Sec pilot, Exploration
- allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Field Medic","Explorer","Pathfinder","Talon Captain","Talon Guard","Field Medic","Explorer","Pathfinder","Blueshield Guard","Security Pilot") //YW ADDITIONS, Sec pilot, Exploration
+ display_name = "holster selection"
+ allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Talon Captain","Talon Guard","Field Medic","Explorer","Pathfinder","Blueshield Guard","Security Pilot") //YW ADDITIONS, Sec pilot, Exploration
/datum/gear/accessory/brown_vest
- display_name = "webbing, brown (Eng, Sec, Med, Miner, Exploration)" //YW ADDITIONS, Sec pilot, Exploration
+ display_name = "webbing, brown"
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Blueshield, Sec pilot, Exploration
/datum/gear/accessory/black_vest
- display_name = "webbing, black (Eng, Sec, Med, Miner, Exploration)" //YW ADDITIONS, Sec pilot, Exploration
+ display_name = "webbing, black"
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Sec pilot, Exploration
/datum/gear/accessory/white_vest
- display_name = "webbing, white (Medical)"
+ display_name = "webbing, white"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Talon Doctor","Field Medic") //YW ADDITIONS, field medic
/datum/gear/accessory/brown_drop_pouches
- display_name = "drop pouches, brown (Eng, Sec, Med, Miner, Exploration)" //YW ADDITIONS, Exploration
- allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Exploration
+ display_name = "drop pouches, brown"
+ allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Exploration
/datum/gear/accessory/black_drop_pouches
- display_name = "drop pouches, black (Eng, Sec, Med, Exploration, Miner)" //YW ADDITIONS, Exploration
- allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Sec pilot, Exploration
+ display_name = "drop pouches, black"
+ allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Talon Miner","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Sec pilot, Exploration
/datum/gear/accessory/white_drop_pouches
- display_name = "drop pouches, white (Medical)"
+ display_name = "drop pouches, white"
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Talon Doctor","Field Medic") //YW ADDITIONS, field medic
/datum/gear/accessory/bluespace
- display_name = "bluespace badge (Eng, Sec, Med, Miner, Pilot, Exploration)" //YW ADDITIONS, Exploration
+ display_name = "bluespace badge"
path = /obj/item/clothing/accessory/storage/bluespace
allowed_roles = list("Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard","Talon Miner","Pilot","Field Medic","Explorer","Pathfinder","Security Pilot") //YW ADDITIONS, Exploration
cost = 2
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
index 842a77a673..50617425f1 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm
@@ -68,76 +68,76 @@
path = /obj/item/clothing/glasses/science
/datum/gear/eyes/security
- display_name = "Security HUD (Security)"
+ display_name = "Security HUD"
path = /obj/item/clothing/glasses/hud/security
allowed_roles = list("Security Officer","Head of Security","Warden", "Detective","Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/eyes/security/prescriptionsec
- display_name = "Security HUD, prescription (Security)"
+ display_name = "Security HUD, prescription"
path = /obj/item/clothing/glasses/hud/security/prescription
/datum/gear/eyes/security/sunglasshud
- display_name = "Security HUD, sunglasses (Security)"
+ display_name = "Security HUD, sunglasses"
path = /obj/item/clothing/glasses/sunglasses/sechud
/datum/gear/eyes/security/aviator
- display_name = "Security HUD Aviators (Security)"
+ display_name = "Security HUD Aviators"
path = /obj/item/clothing/glasses/sunglasses/sechud/aviator
/datum/gear/eyes/security/aviator/prescription
- display_name = "Security HUD Aviators, prescription (Security)"
+ display_name = "Security HUD Aviators, prescription"
path = /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription
/datum/gear/eyes/medical
- display_name = "Medical HUD (Medical)"
+ display_name = "Medical HUD"
path = /obj/item/clothing/glasses/hud/health
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Search and Rescue")
/datum/gear/eyes/medical/prescriptionmed
- display_name = "Medical HUD, prescription (Medical)"
+ display_name = "Medical HUD, prescription"
path = /obj/item/clothing/glasses/hud/health/prescription
/datum/gear/eyes/medical/aviator
- display_name = "Medical HUD Aviators (Medical)"
+ display_name = "Medical HUD Aviators"
path = /obj/item/clothing/glasses/hud/health/aviator
/datum/gear/eyes/medical/aviator/prescription
- display_name = "Medical HUD Aviators, prescription (Medical)"
+ display_name = "Medical HUD Aviators, prescription"
path = /obj/item/clothing/glasses/hud/health/aviator/prescription
/datum/gear/eyes/janitor
- display_name = "Contaminant HUD (Janitor)"
+ display_name = "Contaminant HUD"
path = /obj/item/clothing/glasses/hud/janitor
allowed_roles = list("Janitor")
/datum/gear/eyes/janitor/prescriptionjan
- display_name = "Contaminant HUD, prescription (Janitor)"
+ display_name = "Contaminant HUD, prescription"
path = /obj/item/clothing/glasses/hud/janitor/prescription
/datum/gear/eyes/meson
- display_name = "Optical Meson Scanners (Engineering, Science, Mining)"
+ display_name = "Optical Meson Scanners"
path = /obj/item/clothing/glasses/meson
allowed_roles = list("Engineer","Chief Engineer","Atmospheric Technician", "Scientist", "Research Director", "Shaft Miner")
/datum/gear/eyes/meson/prescription
- display_name = "Optical Meson Scanners, prescription (Engineering, Science, Mining)"
+ display_name = "Optical Meson Scanners, prescription"
path = /obj/item/clothing/glasses/meson/prescription
/datum/gear/eyes/material
- display_name = "Optical Material Scanners (Mining)"
+ display_name = "Optical Material Scanners"
path = /obj/item/clothing/glasses/material
allowed_roles = list("Shaft Miner","Quartermaster")
/datum/gear/eyes/material/prescription
- display_name = "Prescription Optical Material Scanners (Mining)"
+ display_name = "Prescription Optical Material Scanners"
path = /obj/item/clothing/glasses/material/prescription
/datum/gear/eyes/meson/aviator
- display_name = "Optical Meson Aviators, (Engineering, Science, Mining)"
+ display_name = "Optical Meson Aviators"
path = /obj/item/clothing/glasses/meson/aviator
/datum/gear/eyes/meson/aviator/prescription
- display_name = "Optical Meson Aviators, prescription (Engineering, Science, Mining)"
+ display_name = "Optical Meson Aviators, prescription"
path = /obj/item/clothing/glasses/meson/aviator/prescription
/datum/gear/eyes/glasses/fakesun
@@ -149,16 +149,16 @@
path = /obj/item/clothing/glasses/fakesunglasses/aviator
/datum/gear/eyes/sun
- display_name = "Sunglasses (Security/Command)"
+ display_name = "sunglasses (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses
allowed_roles = list("Security Officer","Head of Security","Warden","Site Manager","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective", "Blueshield Guard","Security Pilot") //YW ADDITIONS
/datum/gear/eyes/sun/shades
- display_name = "Sunglasses, fat (Security/Command)"
+ display_name = "sunglasses, fat (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/big
/datum/gear/eyes/sun/aviators
- display_name = "Sunglasses, aviators (Security/Command)"
+ display_name = "sunglasses, aviators (Security/Command)"
path = /obj/item/clothing/glasses/sunglasses/aviator
/datum/gear/eyes/sun/prescriptionsun
@@ -170,17 +170,17 @@
path = /obj/item/clothing/glasses/circuitry
/datum/gear/eyes/glasses/rimless
- display_name = "Glasses, rimless"
+ display_name = "glasses, rimless"
path = /obj/item/clothing/glasses/rimless
/datum/gear/eyes/glasses/prescriptionrimless
- display_name = "Glasses, prescription rimless"
+ display_name = "glasses, prescription rimless"
path = /obj/item/clothing/glasses/regular/rimless
/datum/gear/eyes/glasses/thin
- display_name = "Glasses, thin frame"
+ display_name = "glasses, thin frame"
path = /obj/item/clothing/glasses/thin
/datum/gear/eyes/glasses/prescriptionthin
- display_name = "Glasses, prescription thin frame"
+ display_name = "glasses, prescription thin frame"
path = /obj/item/clothing/glasses/regular/thin
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
index e90d0e120f..9f402d25c9 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
@@ -21,27 +21,27 @@
path = /obj/item/clothing/glasses/omnihud/prescription
/datum/gear/eyes/arglasses/sec
- display_name = "AR-S glasses (Sec)"
+ display_name = "AR-Security glasses"
path = /obj/item/clothing/glasses/omnihud/sec
allowed_roles = list("Security Officer","Head of Security","Warden","Detective")
/datum/gear/eyes/arglasses/sci
- display_name = "AR-R glasses (Sci)"
+ display_name = "AR-Research glasses"
path = /obj/item/clothing/glasses/omnihud/rnd
allowed_roles = list("Research Director","Scientist","Xenobiologist","Xenobotanist","Roboticist")
/datum/gear/eyes/arglasses/eng
- display_name = "AR-E glasses (Eng)"
+ display_name = "AR-Engineering glasses"
path = /obj/item/clothing/glasses/omnihud/eng
allowed_roles = list("Engineer","Chief Engineer","Atmospheric Technician")
/datum/gear/eyes/arglasses/med
- display_name = "AR-M glasses (Medical)"
+ display_name = "AR-Medical glasses"
path = /obj/item/clothing/glasses/omnihud/med
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") // YW EDIT Field medic
/datum/gear/eyes/arglasses/all
- display_name = "AR-B glasses (SM, HoP)"
+ display_name = "AR-Command glasses"
path = /obj/item/clothing/glasses/omnihud/all
cost = 2
allowed_roles = list("Site Manager","Head of Personnel")
@@ -55,7 +55,7 @@
path = /obj/item/clothing/glasses/fluff/science_proper
/datum/gear/eyes/meson/retinal
- display_name = "retinal projector, meson (Eng, Sci, Explo)"
+ display_name = "retinal projector, meson"
path = /obj/item/clothing/glasses/omnihud/eng/meson
/datum/gear/eyes/security/secpatch
@@ -67,7 +67,7 @@
path = /obj/item/clothing/glasses/hud/security/eyepatch2
/datum/gear/eyes/security/tac_sec_visor
- display_name = "Tactical AR visor (Security)"
+ display_name = "Tactical AR visor"
path = /obj/item/clothing/glasses/sunglasses/sechud/tactical_sec_vis
/datum/gear/eyes/medical/medpatch
diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
index 1720d50315..1cc15975e2 100644
--- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm
@@ -10,16 +10,16 @@
ckeywhitelist = list("This entry should never be choosable with this variable set.") //If it does, then that means somebody fucked up the whitelist system pretty hard
character_name = list("This entry should never be choosable with this variable set.")
cost = 0
+
/*
/datum/gear/fluff/testhorn
path = /obj/item/weapon/bikehorn
display_name = "Airhorn - Example Item"
description = "An example item that you probably shouldn't see!"
- ckeywhitelist = list("mewchild")
+ ckeywhitelist = list("your_ckey_here")
allowed_roles = list("Engineer")
*/
-
/datum/gear/fluff/collar //Use this as a base path for collars if you'd like to set tags in loadout. Make sure you don't use apostrophes in the display name or this breaks!
slot = slot_tie
diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
index 6530edf321..3571142448 100644
--- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm
@@ -52,7 +52,7 @@
cost = 3
/datum/gear/gloves/forensic
- display_name = "gloves, forensic (Detective)"
+ display_name = "gloves, forensic"
path = /obj/item/clothing/gloves/forensic
allowed_roles = list("Detective")
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index 6ee1985c7f..c1f5f29b3d 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -146,6 +146,7 @@
display_name = "labcoat selection, cmo"
path = /obj/item/clothing/suit/storage/toggle/labcoat/cmo
allowed_roles = list("Chief Medical Officer")
+ show_roles = FALSE
/datum/gear/suit/labcoat_cmo/New()
..()
@@ -165,6 +166,7 @@
display_name = "labcoat, research director"
path = /obj/item/clothing/suit/storage/toggle/labcoat/rd
allowed_roles = list("Research Director")
+ show_roles = FALSE
/datum/gear/suit/miscellaneous/labcoat
display_name = "plague doctor's coat"
@@ -256,42 +258,49 @@
display_name = "cloak, head of security"
path = /obj/item/clothing/accessory/poncho/roles/cloak/hos
allowed_roles = list("Head of Security")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_cmo
display_name = "cloak, chief medical officer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/cmo
allowed_roles = list("Chief Medical Officer")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_ce
display_name = "cloak, chief engineer"
path = /obj/item/clothing/accessory/poncho/roles/cloak/ce
allowed_roles = list("Chief Engineer")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_rd
display_name = "cloak, research director"
path = /obj/item/clothing/accessory/poncho/roles/cloak/rd
allowed_roles = list("Research Director")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_qm
display_name = "cloak, quartermaster"
path = /obj/item/clothing/accessory/poncho/roles/cloak/qm
allowed_roles = list("Quartermaster")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_captain
display_name = "cloak, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/captain
allowed_roles = list("Site Manager")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/roles/cloak_hop
display_name = "cloak, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/hop
allowed_roles = list("Head of Personnel")
+ show_roles = FALSE
cost = 1
/datum/gear/suit/cloak_custom //A colorable cloak
@@ -346,7 +355,7 @@
path = /obj/item/clothing/suit/suspenders
/datum/gear/suit/forensics
- display_name = "forensics uniform selection (Detective)"
+ display_name = "forensics uniform selection"
path = /obj/item/clothing/suit/storage/forensics/red/long
allowed_roles = list("Detective")
@@ -364,11 +373,13 @@
display_name = "coat, quartermaster"
path = /obj/item/clothing/suit/storage/qm
allowed_roles = list("Quartermaster")
+ show_roles = FALSE
/datum/gear/suit/cargo_coat
display_name = "coat, cargo tech"
path = /obj/item/clothing/suit/storage/cargo
allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel")
+ show_roles = FALSE
// winter coats go here
/datum/gear/suit/wintercoat
@@ -379,116 +390,139 @@
display_name = "winter coat, site manager"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain
allowed_roles = list("Site Manager")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/hop
display_name = "winter coat, head of personnel"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/hop
allowed_roles = list("Head of Personnel")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/security
display_name = "winter coat, security"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/security
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective","Blueshield Guard","Security Pilot") //YW ADDITIONS
+ show_roles = FALSE
/datum/gear/suit/wintercoat/security/hos
display_name = "winter coat, head of security"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/security/hos
allowed_roles = list("Head of Security")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical
display_name = "winter coat, medical"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") // YW EDIT Field medic
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical/alt
display_name = "winter coat, medical alt"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/alt
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Field Medic") // YW EDIT Field medic
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical/viro
display_name = "winter coat, virologist"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/viro
allowed_roles = list("Medical Doctor","Chief Medical Officer")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical/para
display_name = "winter coat, paramedic"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/para
allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic", "Field Medic") // YW EDIT Field medic
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical/chemist
display_name = "winter coat, chemist"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/chemist
allowed_roles = list("Chief Medical Officer","Chemist")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical/cmo
display_name = "winter coat, chief medical officer"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/cmo
allowed_roles = list("Chief Medical Officer")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/medical/sar
display_name = "winter coat, search and rescue"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/medical/sar
allowed_roles = list("Chief Medical Officer","Paramedic", "Field Medic") // YW EDIT Field medic
+ show_roles = FALSE
/datum/gear/suit/wintercoat/science
display_name = "winter coat, science"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/science/robotics
display_name = "winter coat, robotics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science/robotics
allowed_roles = list("Research Director", "Roboticist")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/science/rd
display_name = "winter coat, research director"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/science/rd
allowed_roles = list("Research Director")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/engineering
display_name = "winter coat, engineering"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/engineering/atmos
display_name = "winter coat, atmospherics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos
allowed_roles = list("Chief Engineer", "Atmospheric Technician")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/engineering/ce
display_name = "winter coat, chief engineer"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/ce
allowed_roles = list("Chief Engineer")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/hydro
display_name = "winter coat, hydroponics"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/hydro
allowed_roles = list("Botanist", "Xenobotanist")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/cargo
display_name = "winter coat, cargo"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo
allowed_roles = list("Quartermaster","Cargo Technician")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/miner
display_name = "winter coat, mining"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/miner
allowed_roles = list("Shaft Miner")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/cargo/qm
display_name = "winter coat, quartermaster"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/cargo/qm
allowed_roles = list("Quartermaster")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/bar
display_name = "winter coat, bartender"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/bar
allowed_roles = list("Bartender")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/janitor
display_name = "winter coat, janitor"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/janitor
allowed_roles = list("Janitor")
+ show_roles = FALSE
/datum/gear/suit/wintercoat/aformal
display_name = "winter coat, assistant formal"
@@ -611,35 +645,56 @@
display_name = "snowsuit"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit
-/datum/gear/suit/snowsuit/command
+/datum/gear/suit/snowsuit/command_vore // YW EDIT command to command_vore
display_name = "snowsuit, command"
+ path = /obj/item/clothing/suit/storage/snowsuit/command
+ allowed_roles = list("Site Manager","Research Director","Head of Personnel","Head of Security","Chief Engineer","Command Secretary","Blueshield Guard") //YW ADDITIONS
+ show_roles = FALSE
+
+/datum/gear/suit/snowsuit/security_vore //YW EDIT security to security_vore
+ display_name = "snowsuit, security"
+ path = /obj/item/clothing/suit/storage/snowsuit/security
+ allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective")
+ show_roles = FALSE
+
+// YW Addition START
+/datum/gear/suit/snowsuit/command
+ display_name = "snowsuit, command (Yawn)"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit/command
allowed_roles = list("Site Manager","Research Director","Head of Personnel","Head of Security","Chief Engineer","Command Secretary","Blueshield Guard") //YW ADDITIONS
+ show_roles = FALSE
/datum/gear/suit/snowsuit/security
- display_name = "snowsuit, security"
+ display_name = "snowsuit, security (Yawn)"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit/security
allowed_roles = list("Security Officer", "Head of Security", "Warden", "Detective","Blueshield Guard","Security Pilot")
+ show_roles = FALSE
+
+// YW Addition END
/datum/gear/suit/snowsuit/medical
display_name = "snowsuit, medical"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit/medical
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist", "Psychiatrist", "Search and Rescue")
+ show_roles = FALSE
/datum/gear/suit/snowsuit/science
display_name = "snowsuit, science"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit/science
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
+ show_roles = FALSE
/datum/gear/suit/snowsuit/engineering
display_name = "snowsuit, engineering"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit/engineering
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer")
+ show_roles = FALSE
/datum/gear/suit/snowsuit/cargo
display_name = "snowsuit, supply"
path = /obj/item/clothing/suit/storage/hooded/wintercoat/snowsuit/cargo
allowed_roles = list("Quartermaster","Shaft Miner","Cargo Technician","Head of Personnel")
+ show_roles = FALSE
/datum/gear/suit/miscellaneous/cardigan
display_name = "cardigan, colorable"
@@ -653,6 +708,7 @@
display_name = "command dress jacket"
path = /obj/item/clothing/suit/storage/toggle/cmddressjacket
allowed_roles = list("Site Manager", "Head of Personnel", "Command Secretary")
+ show_roles = FALSE
/datum/gear/suit/miscellaneous/kimono
display_name = "traditional kimono, colorable"
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
index 48cb8b88e7..4ad9c7bfe7 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
@@ -55,7 +55,7 @@
//Detective alternative
/datum/gear/suit/detective_alt
- display_name = "sleek modern coat selection, detective"
+ display_name = "sleek modern coat selection"
path = /obj/item/clothing/suit/storage/det_trench/alt
allowed_roles = list("Head of Security", "Detective")
@@ -112,12 +112,12 @@ Talon winter coat
/datum/gear/suit/armor/combat/crusader_explo
display_name = "knight, explo"
path = /obj/item/clothing/suit/armor/combat/crusader_explo
- allowed_roles = list("Explorer","Pathfinder", "Field Medic") // YW EDIT Field medic
+ //allowed_roles = list("Explorer","Pathfinder", "Field Medic") // YW EDIT Field medic
/datum/gear/suit/armor/combat/crusader_explo/FM
display_name = "knight, Field Medic"
path = /obj/item/clothing/suit/armor/combat/crusader_explo/FM
- allowed_roles = list ("Paramedic")
+ allowed_roles = list ("Paramedic", "Field Medic") // YW EDIT Field medic
//Long fur coat
/datum/gear/suit/russofurcoat
@@ -232,11 +232,13 @@ Talon winter coat
display_name = "boat cloak, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/cap
allowed_roles = list("Site Manager")
+ show_roles = FALSE
/datum/gear/suit/roles/hopboatcloak
display_name = "boat cloak, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/boat/hop
allowed_roles = list("Head of Personnel")
+ show_roles = FALSE
/datum/gear/suit/roles/boatcloaks
display_name = "boat cloak selection"
@@ -268,11 +270,13 @@ Talon winter coat
display_name = "shroud, site manager"
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/cap
allowed_roles = list("Site Manager")
+ show_roles = FALSE
/datum/gear/suit/roles/hopshroud
display_name = "shroud, head of personnel"
path = /obj/item/clothing/accessory/poncho/roles/cloak/shroud/hop
allowed_roles = list("Head of Personnel")
+ show_roles = FALSE
/datum/gear/suit/roles/shrouds
display_name = "shroud selection"
diff --git a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm
index 5e56cca10e..e7628c7981 100644
--- a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm
@@ -5,6 +5,7 @@
display_name = "DEPT - BLANK's Uniforms"
description = "Select from a range of outfits available to all BLANK personnel."
allowed_roles = list("")
+ show_roles = FALSE
path =
slot = slot_w_uniform
sort_category = "Uniforms"
@@ -23,6 +24,7 @@
display_name = "Command - Site Manager's Uniforms"
description = "Select from a range of outfits available to all Site Managers."
allowed_roles = list("Site Manager")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_captain
sort_category = "Uniforms"
cost = 1
@@ -52,6 +54,7 @@
display_name = "Command - Head of Personnel's Uniforms"
description = "Select from a range of outfits available to all Heads of Personnel."
allowed_roles = list("Head of Personnel")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_hop
sort_category = "Uniforms"
cost = 1
@@ -83,6 +86,7 @@
display_name = "Civilian - Pilot's Uniforms"
description = "Select from a range of outfits available to all Pilots."
allowed_roles = list("Pilot")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_pilot
sort_category = "Uniforms"
cost = 1
@@ -101,6 +105,7 @@
display_name = "Civilian - Janitor's Uniforms"
description = "Select from a range of outfits available to all Janitorial personnel."
allowed_roles = list("Janitor")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_janitor
sort_category = "Uniforms"
cost = 1
@@ -184,6 +189,7 @@
display_name = "Security - Basic Uniforms"
description = "Select from a range of outfits available to all Security personnel."
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer","Blueshield Guard","Security Pilot") //YW ADDITIONS
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/security/corp
sort_category = "Uniforms"
cost = 1
@@ -229,6 +235,7 @@
display_name = "Security - Warden's Uniforms"
description = "Select from a range of outfits available to Wardens."
allowed_roles = list("Head of Security","Warden")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/warden/corp
sort_category = "Uniforms"
cost = 1
@@ -250,6 +257,7 @@
display_name = "Security - Detective's Uniforms"
description = "Select from a range of outfits available to all Detectives."
allowed_roles = list("Head of Security","Detective")
+ show_roles = FALSE
path = /obj/item/clothing/under/det/corporate
sort_category = "Uniforms"
cost = 1
@@ -266,6 +274,7 @@
display_name = "Security - Head's Uniforms"
description = "Select from a range of outfits available to all Heads of Security."
allowed_roles = list("Head of Security")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/head_of_security/corp
sort_category = "Uniforms"
cost = 1
@@ -305,6 +314,7 @@
display_name = "Cargo - Quartermaster's Uniforms"
description = "Select from a range of outfits available to all Quartermasters."
allowed_roles = list("Quartermaster")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/cargo/jeans
sort_category = "Uniforms"
cost = 1
@@ -336,6 +346,7 @@
display_name = "Cargo - Basic Uniforms"
description = "Select from a range of outfits available to all Cargo personnel."
allowed_roles = list("Cargo Technician","Shaft Miner","Quartermaster")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/cargotech/jeans
sort_category = "Uniforms"
cost = 1
@@ -364,6 +375,7 @@
display_name = "Cargo - Miner's Uniforms"
description = "Select from a range of outfits available to all Mining personnel."
allowed_roles = list("Shaft Miner","Quartermaster")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_miner
sort_category = "Uniforms"
cost = 1
@@ -382,6 +394,7 @@
display_name = "Engineering - Chief Engineer's Uniforms"
description = "Select from a range of outfits available to all Chief Engineers."
allowed_roles = list("Chief Engineer")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_chiefengi
sort_category = "Uniforms"
cost = 1
@@ -406,6 +419,7 @@
display_name = "Engineering - Basic Uniforms"
description = "Select from a range of outfits available to all Engineering personnel."
allowed_roles = list("Chief Engineer","Engineer","Atmospheric Technician")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_engi
sort_category = "Uniforms"
cost = 1
@@ -433,6 +447,7 @@
display_name = "Engineering - Atmos Tech's Uniforms"
description = "Select from a range of outfits available to all Atmospherics Technicians."
allowed_roles = list("Chief Engineer","Atmospheric Technician")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/atmospheric_technician/skirt
sort_category = "Uniforms"
cost = 1
@@ -452,6 +467,7 @@
display_name = "Medical - Basic Uniforms"
description = "Select from a range of outfits available to all Medical personnel."
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") // YW EDIT Field medic
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_med
sort_category = "Uniforms"
cost = 1
@@ -484,6 +500,7 @@
display_name = "Medical - Chemist's Uniforms"
description = "Select from a range of outfits available to all Chemists."
allowed_roles = list("Chief Medical Officer","Chemist")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_chem
sort_category = "Uniforms"
cost = 1
@@ -503,6 +520,7 @@
display_name = "Medical - Paramedic's Uniforms"
description = "Select from a range of outfits available to all Paramedics."
allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/paramedunidark
sort_category = "Uniforms"
cost = 1
@@ -525,6 +543,7 @@
display_name = "Medical - Chief Medical Officer's Uniforms"
description = "Select from a range of outfits available to all Chief Medical Officers."
allowed_roles = list("Chief Medical Officer")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_cmo
sort_category = "Uniforms"
cost = 2
@@ -553,6 +572,7 @@
display_name = "Science - Research Director's Uniforms"
description = "Select from a range of outfits available to all Research Directors."
allowed_roles = list("Research Director")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_rd_suit
sort_category = "Uniforms"
cost = 1
@@ -578,6 +598,7 @@
display_name = "Science - Basic Uniforms"
description = "Select from a range of outfits available to all Science personnel."
allowed_roles = list("Scientist","Research Director","Roboticist","Xenobiologist","Xenobotanist")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_science
sort_category = "Uniforms"
cost = 1
@@ -602,6 +623,7 @@
display_name = "Science - Roboticist's Uniforms"
description = "Select from a range of outfits available to all Roboticists."
allowed_roles = list("Research Director","Roboticist")
+ show_roles = FALSE
path = /obj/item/clothing/under/rank/neo_robo
sort_category = "Uniforms"
cost = 1
diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm
index 41cc5aa037..d0b1a2cef6 100644
--- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm
@@ -554,16 +554,19 @@
display_name = "warden belted cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/wrdn
allowed_roles = list("Head of Security","Warden")
+ sort_category = "Xenowear"
/datum/gear/suit/dept/beltcloak/jani
display_name = "janitor belted cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/jani
allowed_roles = list("Janitor")
+ sort_category = "Xenowear"
/datum/gear/suit/dept/beltcloak/cmd
display_name = "command belted cloak (Teshari)"
path = /obj/item/clothing/suit/storage/teshari/beltcloak/jobs/command
allowed_roles = list("Site Manager","Head of Personnel","Head of Security","Chief Engineer","Chief Medical Officer","Research Director")
+ sort_category = "Xenowear"
/datum/gear/suit/cloak_hood
display_name = "hooded cloak selection (Teshari)"
diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm
index 530706c0e2..599424723c 100644
--- a/code/modules/client/preference_setup/vore/02_size.dm
+++ b/code/modules/client/preference_setup/vore/02_size.dm
@@ -3,8 +3,6 @@
#define WEIGHT_MAX 500
#define WEIGHT_CHANGE_MIN 0
#define WEIGHT_CHANGE_MAX 100
-#define MAX_VOICE_FREQ 70000
-#define MIN_VOICE_FREQ 15000
// Define a place to save in character setup
/datum/preferences
@@ -252,3 +250,8 @@
SEND_SOUND(user, S)
return ..();
+
+#undef WEIGHT_MIN
+#undef WEIGHT_MAX
+#undef WEIGHT_CHANGE_MIN
+#undef WEIGHT_CHANGE_MAX
diff --git a/code/modules/client/preference_setup/vore/05_persistence.dm b/code/modules/client/preference_setup/vore/05_persistence.dm
index 2d8846a3dd..330a21a73b 100644
--- a/code/modules/client/preference_setup/vore/05_persistence.dm
+++ b/code/modules/client/preference_setup/vore/05_persistence.dm
@@ -1,11 +1,3 @@
-#define PERSIST_SPAWN 0x01 // Persist spawnpoint based on location of despawn/logout.
-#define PERSIST_WEIGHT 0x02 // Persist mob weight
-#define PERSIST_ORGANS 0x04 // Persist the status (normal/amputated/robotic/etc) and model (for robotic) status of organs
-#define PERSIST_MARKINGS 0x08 // Persist markings
-#define PERSIST_SIZE 0x10 // Persist size
-#define PERSIST_COUNT 5 // Number of valid bits in this bitflag. Keep this updated!
-#define PERSIST_DEFAULT PERSIST_SPAWN|PERSIST_ORGANS|PERSIST_MARKINGS|PERSIST_SIZE // Default setting for new folks
-
// Define a place to save in character setup
/datum/preferences
var/persistence_settings = PERSIST_DEFAULT // Control what if anything is persisted for this character between rounds.
diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm
index 644bc955dc..96255f095e 100644
--- a/code/modules/client/preference_setup/vore/07_traits.dm
+++ b/code/modules/client/preference_setup/vore/07_traits.dm
@@ -2,9 +2,6 @@
#define NEUTRAL_MODE 2
#define NEGATIVE_MODE 3
-#define ORGANICS 1
-#define SYNTHETICS 2
-
var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","silver","gold","slimejelly") //allowlist-based so people don't make their blood restored by alcohol or something really silly. use reagent IDs!
/datum/preferences
diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm
index bde733d4c8..963354baea 100644
--- a/code/modules/client/preference_setup/vore/09_misc.dm
+++ b/code/modules/client/preference_setup/vore/09_misc.dm
@@ -11,6 +11,7 @@
S["capture_crystal"] >> pref.capture_crystal
S["auto_backup_implant"] >> pref.auto_backup_implant
S["borg_petting"] >> pref.borg_petting
+ S["stomach_vision"] >> pref.stomach_vision
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
S["show_in_directory"] << pref.show_in_directory
@@ -21,12 +22,21 @@
S["capture_crystal"] << pref.capture_crystal
S["auto_backup_implant"] << pref.auto_backup_implant
S["borg_petting"] << pref.borg_petting
+ S["stomach_vision"] << pref.stomach_vision
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
if(pref.sensorpref > 5 || pref.sensorpref < 1)
pref.sensorpref = 5
character.sensorpref = pref.sensorpref
character.capture_crystal = pref.capture_crystal
+ //Vore Stomach Sprite Preference
+ character.stomach_vision = pref.stomach_vision
+ if((character && !istype(character,/mob/living/carbon/human/dummy)) && character.stomach_vision && !(VIS_CH_STOMACH in character.vis_enabled))
+ character.plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
+ character.vis_enabled += VIS_CH_STOMACH
+ else if((character && !istype(character,/mob/living/carbon/human/dummy)) && !character.stomach_vision && (VIS_CH_STOMACH in character.vis_enabled))
+ character.plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
+ character.vis_enabled -= VIS_CH_STOMACH
/datum/category_item/player_setup_item/vore/misc/sanitize_character()
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
@@ -36,6 +46,7 @@
pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal))
pref.auto_backup_implant = sanitize_integer(pref.auto_backup_implant, 0, 1, initial(pref.auto_backup_implant))
pref.borg_petting = sanitize_integer(pref.borg_petting, 0, 1, initial(pref.borg_petting))
+ pref.stomach_vision = sanitize_integer(pref.stomach_vision, 0, 1, initial(pref.stomach_vision))
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
. += " "
@@ -47,6 +58,7 @@
. += "Capture Crystal Preference: [pref.capture_crystal ? "Yes" : "No"] "
. += "Spawn With Backup Implant: [pref.auto_backup_implant ? "Yes" : "No"] "
. += "Allow petting as robot: [pref.borg_petting ? "Yes" : "No"] "
+ . += "Enable Stomach Sprites: [pref.stomach_vision ? "Yes" : "No"] "
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
if(href_list["toggle_show_in_directory"])
@@ -84,4 +96,7 @@
else if(href_list["toggle_borg_petting"])
pref.borg_petting = pref.borg_petting ? 0 : 1;
return TOPIC_REFRESH
+ else if(href_list["toggle_stomach_vision"])
+ pref.stomach_vision = pref.stomach_vision ? 0 : 1;
+ return TOPIC_REFRESH
return ..();
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 844bc73c54..7a3b86ec84 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1,5 +1,3 @@
-#define SAVE_RESET -1
-
var/list/preferences_datums = list()
/datum/preferences
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index ee3363dff5..f1cfc4413a 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -7,6 +7,7 @@
var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals
var/auto_backup_implant = FALSE //Whether someone starts with a backup implant or not.
var/borg_petting = TRUE //Whether someone can be petted as a borg or not.
+ var/stomach_vision = TRUE //Whether or not someone can view stomach sprites
var/job_talon_high = 0
var/job_talon_med = 0
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index ebf17c84b6..cd26d6da78 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -210,6 +210,13 @@
if(Adjacent(user) && src.loc == user)
. += "You are currently facing [dir2text(user.dir)]. The micro beacon is [gps.tracking ? "on" : "off"]. "
var/TB = src.loc.loc
+ if(istype(TB, /turf/)) //no point returning light level if we're not on a turf (might be *in* someone!)
+ var/turf/TL = TB
+ var/light_level = TL.get_lumcount()
+ if(light_level)
+ . += "Light Level: [TL.get_lumcount()] "
+ else
+ . += "It's too dark to see the light level! "
if(istype(TB, /turf/simulated)) //no point returning atmospheric data from unsimulated tiles (they don't track pressure anyway, only temperature)
var/turf/simulated/T = TB
var/datum/gas_mixture/env = T.return_air()
diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm
index 8b147a4dc3..9d98e3273c 100644
--- a/code/modules/clothing/spacesuits/void/ert_vr.dm
+++ b/code/modules/clothing/spacesuits/void/ert_vr.dm
@@ -171,6 +171,7 @@
sprite_sheets = list(
SPECIES_HUMAN = 'icons/inventory/suit/mob_vr.dmi',
SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi',
SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi',
SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_vr_unathi.dmi',
@@ -201,13 +202,15 @@
SPECIES_NEVREAN = 'icons/inventory/suit/item_vr.dmi',
SPECIES_RAPALA = 'icons/inventory/suit/item_vr.dmi',
SPECIES_ALRAUNE = 'icons/inventory/suit/item_vr.dmi',
- SPECIES_ZADDAT = 'icons/inventory/suit/item_vr.dmi'
+ SPECIES_ZADDAT = 'icons/inventory/suit/item_vr.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/item_vr.dmi'
)
/obj/item/clothing/head/helmet/space/void/responseteam
sprite_sheets = list(
SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi',
SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi',
SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi',
SPECIES_XENOHYBRID = 'icons/inventory/head/mob_vr_unathi.dmi',
@@ -238,5 +241,6 @@
SPECIES_NEVREAN = 'icons/inventory/head/item_vr.dmi',
SPECIES_RAPALA = 'icons/inventory/head/item_vr.dmi',
SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi',
- SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi'
+ SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/item_vr.dmi'
)
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 34246de082..8a66d99327 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -46,6 +46,8 @@
desc = "Replica armor commonly worn by Dominion Of Mu'tu'bi soldiers from the hit series Spacer Trail. Modified for Laser Tag (Red Team)."
icon_state = "redtag2"
+#undef LASER_TAG_HEALTH
+
/*
* 80s
*/
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 4c310c4a53..8bb91fdbfd 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -480,3 +480,8 @@ log transactions
human_user.put_in_hands(E)
E.worth = sum
E.owner_name = authenticated_account.owner_name
+
+#undef NO_SCREEN
+#undef CHANGE_SECURITY_LEVEL
+#undef TRANSFER_FUNDS
+#undef VIEW_TRANSACTION_LOGS
diff --git a/code/modules/economy/casinocash.dm b/code/modules/economy/casinocash.dm
index 79a057b636..e5749504a9 100644
--- a/code/modules/economy/casinocash.dm
+++ b/code/modules/economy/casinocash.dm
@@ -17,7 +17,7 @@
else
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
- user << "You insert [I] into [src]. "
+ to_chat(user, span_info("You insert [I] into [src]."))
spawn_casinochips(round(I:worth/5), src.loc)
src.attack_hand(user)
qdel(I)
@@ -29,7 +29,7 @@
else
playsound(loc, 'sound/items/polaroid2.ogg', 50, 1)
- user << "You insert [I] into [src]. "
+ to_chat(user, span_info("You insert [I] into [src]."))
spawn_money(round(I:worth*5), src.loc)
src.attack_hand(user)
qdel(I)
@@ -64,7 +64,7 @@
h_user.drop_from_inventory(src)
h_user.drop_from_inventory(SC)
h_user.put_in_hands(SC)
- user << "You combine the casino chips to a stack of [SC.worth] casino credits. "
+ to_chat(user, span_notice("You combine the casino chips to a stack of [SC.worth] casino credits."))
qdel(src)
/obj/item/weapon/spacecasinocash/update_icon()
diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm
index 1b029ac74a..1aa32484f5 100644
--- a/code/modules/economy/economy_misc.dm
+++ b/code/modules/economy/economy_misc.dm
@@ -1,29 +1,3 @@
-
-#define RIOTS 1
-#define WILD_ANIMAL_ATTACK 2
-#define INDUSTRIAL_ACCIDENT 3
-#define BIOHAZARD_OUTBREAK 4
-#define PIRATES 6
-#define CORPORATE_ATTACK 7
-#define ALIEN_RAIDERS 8
-#define AI_LIBERATION 9
-#define MOURNING 10
-#define CULT_CELL_REVEALED 11
-#define SECURITY_BREACH 12
-#define ANIMAL_RIGHTS_RAID 13
-#define FESTIVAL 14
-
-#define SECURITY 1
-#define FOOD 2
-#define ANIMALS 3
-#define MINERALS 4
-#define EMERGENCY 5
-#define GASEOUS 6
-#define MAINTENANCE 7
-#define ROBOTICS 8
-#define BIOMEDICAL 9
-
-
//---- The following corporations are friendly with NanoTrasen and loosely enable trade and travel:
//Corporation NanoTrasen - Generalised / high tech research and phoron exploitation.
//Corporation Vessel Contracting - Ship and station construction, materials research.
diff --git a/code/modules/examine/descriptions/armor.dm b/code/modules/examine/descriptions/armor.dm
index b1cf96af6e..e83c739473 100644
--- a/code/modules/examine/descriptions/armor.dm
+++ b/code/modules/examine/descriptions/armor.dm
@@ -43,7 +43,6 @@
else
return "It's difficult to tell how much it'll influence your speed."
-
/obj/item/clothing/get_description_info()
var/armor_stats = description_info + "\
"
@@ -70,28 +69,18 @@
if(flags & AIRTIGHT)
armor_stats += "It is airtight. \n"
- if(min_pressure_protection == 0 && max_pressure_protection >= WARNING_HIGH_PRESSURE) //0 to 325
- armor_stats += "Wearing this will protect you from the vacuum of space and from high pressures. \n"
- else if(min_pressure_protection <= WARNING_LOW_PRESSURE && max_pressure_protection >= WARNING_HIGH_PRESSURE) //50 to 325
- armor_stats += "Wearing this will protect you from both low and high pressures, but not the vacuum of space. \n"
- else if(min_pressure_protection == 0)
- armor_stats += "Wearing this will protect you from the vacuum of space. \n"
- else if(min_pressure_protection <= WARNING_LOW_PRESSURE) //50 or below
- armor_stats += "Wearing this will protect you from low pressures, but not the vacuum of space. \n"
- else if(max_pressure_protection >= WARNING_HIGH_PRESSURE) //325 or higher
- armor_stats += "Wearing this will protect you from high pressures. \n"
+ if(min_pressure_protection != null)
+ armor_stats += "It is rated for pressures as low as [min_pressure_protection] kPa. \n"
+ if(max_pressure_protection)
+ armor_stats += "It is rated for pressures as high as [max_pressure_protection] kPa. \n"
if(flags & THICKMATERIAL) //stops syringes
armor_stats += "The material is exceptionally thick. \n"
- if(max_heat_protection_temperature >= FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE && min_cold_protection_temperature <= SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE) //30000 or higher and as low as 2
- armor_stats += "It provides exceptional protection from extremely high and low temperatures alike. \n"
- else if(max_heat_protection_temperature >= SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE && min_cold_protection_temperature <= SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE) //5000 or above, but less than 30000
- armor_stats += "It provides very good protection against hazardous temperatures at both extremes, but may not be sufficient for very high-intensity situations. \n"
- else if(max_heat_protection_temperature >= FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE) //30000 or above
- armor_stats += "It provides exceptional protection from extremely high temperatures. \n"
- else if(min_cold_protection_temperature <= SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE) //2 or less
- armor_stats += "It provides exceptional protection against very low temperatures. \n"
+ if(min_cold_protection_temperature)
+ armor_stats += "It is rated for temperatures as low as [min_cold_protection_temperature] Kelvin. \n"
+ if(max_heat_protection_temperature)
+ armor_stats += "It is rated for temperatures as high as [max_heat_protection_temperature] Kelvin. \n"
var/list/covers = list()
var/list/slots = list()
diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm
index 9d4f8a9c0b..a97dc00bfd 100644
--- a/code/modules/examine/examine.dm
+++ b/code/modules/examine/examine.dm
@@ -195,3 +195,5 @@
results = list("You were unable to examine that. Tell a developer!")
to_chat(src, jointext(results, " "))
update_examine_panel(B)
+
+#undef EXAMINE_PANEL_PADDING
diff --git a/code/modules/fireworks/firework_stars.dm b/code/modules/fireworks/firework_stars.dm
index 31cb9d3c59..62123a2512 100644
--- a/code/modules/fireworks/firework_stars.dm
+++ b/code/modules/fireworks/firework_stars.dm
@@ -145,4 +145,6 @@
if(temp_shape == "none" || !temp_shape)
return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky!"
else
- return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky, forming into shape of [current_shape]!"
\ No newline at end of file
+ return "You see a [pick(firework_adjectives)] explosion of [current_color] sparks in the sky, forming into shape of [current_shape]!"
+
+#undef T_FIREWORK_WEATHER_STAR
diff --git a/code/modules/fishing/fishing_net.dm b/code/modules/fishing/fishing_net.dm
index 8c98448427..19a3a461f1 100644
--- a/code/modules/fishing/fishing_net.dm
+++ b/code/modules/fishing/fishing_net.dm
@@ -107,3 +107,117 @@
else
slowdown = initial(slowdown)
reach = initial(reach)
+
+/obj/item/weapon/material/fishing_net/butterfly_net
+ name = "butterfly net"
+ desc = "A butterfly net."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "butterfly_net"
+ item_state = "butterfly_net"
+ description_info = "This object can be used to capture certain creatures easily, most commonly butterflies. \
+ It can be emptied by activating it in-hand."
+
+ empty_state = "butterfly_net"
+ contain_state = "butterfly_net_full"
+
+ w_class = ITEMSIZE_SMALL
+ flags = NOBLUDGEON
+
+ reach = 1
+
+ default_material = "cloth"
+
+ accepted_mobs = list(/mob/living/simple_mob/animal/sif/glitterfly, /mob/living/carbon/human)
+
+/obj/item/weapon/material/fishing_net/butterfly_net/afterattack(var/atom/A, var/mob/user, var/proximity)
+ if(get_dist(get_turf(src), A) > reach)
+ return
+
+ if(istype(A, /turf))
+ var/mob/living/Target
+ for(var/type in accepted_mobs)
+ Target = locate(type) in A.contents
+ if(Target)
+ afterattack(Target, user, proximity)
+ break
+
+ if(istype(A, /mob))
+ var/accept = FALSE
+ for(var/D in accepted_mobs)
+ if(istype(A, D))
+ var/mob/M = A
+ if(istype(M, /mob/living/carbon/human) && M.size_multiplier > 0.5)
+ accept = FALSE
+ else if(A == user)
+ accept = FALSE
+ else
+ accept = TRUE
+ for(var/atom/At in src.contents)
+ if(isliving(At))
+ to_chat(user, "Your net is already holding something! ")
+ accept = FALSE
+ if(!accept)
+ to_chat(user, "[A] can't be trapped in \the [src]. ")
+ return
+ var/mob/L = A
+ user.visible_message("[user] snatches [L] with \the [src]. ", "You snatch [L] with \the [src]. ")
+ L.forceMove(src)
+ playsound(src, 'sound/effects/plop.ogg', 50, 1)
+ update_icon()
+ update_weight()
+ return
+ return ..()
+
+/obj/item/weapon/material/fishing_net/butterfly_net/attack_self(var/mob/user)
+ for(var/mob/living/M in src)
+ if(!user.get_inactive_hand()) //Check if the inactive hand is empty
+ M.forceMove(get_turf(src))
+ M.attempt_to_scoop(user)
+ user.visible_message("[user] scoops [M] out from \the [src]. ", "You pull [M] from \the [src]. ")
+ else
+ M.forceMove(get_turf(src))
+ user.visible_message("[user] releases [M] from \the [src]. ", "You release [M] from \the [src]. ")
+ for(var/obj/item/I in src)
+ I.forceMove(get_turf(src))
+ user.visible_message("[user] dumps \the [I] out of \the [src]. ", "You dump \the [I] out of \the [src]. ")
+ update_icon()
+ update_weight()
+ return
+
+/obj/item/weapon/material/fishing_net/butterfly_net/container_resist(mob/living/M)
+ if(prob(20))
+ M.forceMove(get_turf(src))
+ to_chat(M, "You climb out of \the [src]. ")
+ update_icon()
+ update_weight()
+ else
+ to_chat(M, "You fail to escape \the [src]. ")
+
+/obj/item/weapon/material/fishing_net/butterfly_net/update_icon() // Also updates name and desc
+ underlays.Cut()
+ cut_overlays()
+
+ name = initial(name)
+ desc = initial(desc)
+ var/contains_mob = FALSE
+ for(var/mob/M in src)
+ name = "filled butterfly net"
+ desc = "A net with [M] inside."
+ contains_mob = TRUE
+
+ if(contains_mob)
+ icon_state = contain_state
+
+ else
+ icon_state = empty_state
+
+ return
+
+/datum/crafting_recipe/butterfly_net
+ name = "butterfly net"
+ result = /obj/item/weapon/material/fishing_net/butterfly_net
+ reqs = list(
+ list(/obj/item/stack/material/cloth = 2)
+ )
+ time = 20
+ category = CAT_MISC
diff --git a/code/modules/food/drinkingglass/drinkingglass.dm b/code/modules/food/drinkingglass/drinkingglass.dm
index 1ef6ebfdcd..0b556fafc9 100644
--- a/code/modules/food/drinkingglass/drinkingglass.dm
+++ b/code/modules/food/drinkingglass/drinkingglass.dm
@@ -1,5 +1,3 @@
-#define DRINK_ICON_FILE 'icons/pdrink.dmi'
-
/var/const/DRINK_FIZZ = "fizz"
/var/const/DRINK_ICE = "ice"
/var/const/DRINK_ICON_DEFAULT = ""
@@ -163,4 +161,4 @@
if(afterattack(target, user)) //Check to see if harm intent & splash.
return
else
- ..() //If they're splashed, no need to do anything else.
\ No newline at end of file
+ ..() //If they're splashed, no need to do anything else.
diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm
index 84a651ba3c..9c2944df26 100644
--- a/code/modules/food/food/drinks.dm
+++ b/code/modules/food/food/drinks.dm
@@ -179,7 +179,16 @@
return ..()
/obj/item/weapon/reagent_containers/food/drinks/self_feed_message(var/mob/user)
- to_chat(user, "You swallow a gulp from \the [src]. ")
+ if(amount_per_transfer_from_this == volume) //I wanted to use a switch, but switch statements can't use vars and the maximum volume of containers varies
+ to_chat(user, "You knock back the entire [src] in one go! ")
+ else if(amount_per_transfer_from_this <= 4) //below the standard 5
+ to_chat(user, "You take a modest sip from \the [src]. ")
+ else if(amount_per_transfer_from_this <= 10) //the standard five to a bit more
+ to_chat(user, "You swallow a gulp from \the [src]. ")
+ else if(amount_per_transfer_from_this <= 30)
+ to_chat(user, "You take a long drag from \the [src]. ")
+ else //default message as a fallback
+ to_chat(user, "You swallow a gulp from \the [src]. ")
/obj/item/weapon/reagent_containers/food/drinks/feed_sound(var/mob/user)
playsound(src, 'sound/items/drink.ogg', rand(10, 50), 1)
diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm
index 2b25369016..5c2889c5a9 100644
--- a/code/modules/food/food/drinks/bottle.dm
+++ b/code/modules/food/food/drinks/bottle.dm
@@ -180,6 +180,25 @@
var/obj/item/weapon/broken_bottle/B = smash(target.loc, target)
user.put_in_active_hand(B)
+/obj/item/weapon/reagent_containers/food/drinks/bottle/verb/spin_bottle()
+ set name = "Spin The Bottle"
+ set category = "Object"
+ set src in view(1)
+
+ if(isobserver(usr) || usr.stat)
+ return
+
+ if(!isturf(src.loc))
+ to_chat(usr, "\The [src] needs to be on the floor to spin. ")
+ return
+
+ var/spin_rotation = (rand(0,359))
+ usr.visible_message("\The [usr] spins \the [src]! ","You spin \the [src]! ")
+ SpinAnimation(3,10)
+ spawn(30)
+ icon_rotation = spin_rotation
+ update_transform()
+
//Keeping this here for now, I'll ask if I should keep it here.
/obj/item/weapon/broken_bottle
name = "Broken Bottle"
diff --git a/code/modules/food/recipe.dm b/code/modules/food/recipe.dm
index c967687e1f..fac396caf3 100644
--- a/code/modules/food/recipe.dm
+++ b/code/modules/food/recipe.dm
@@ -29,14 +29,6 @@
* /datum/recipe/proc/check_items(var/obj/container as obj)
*
* */
-
-// Recipe type defines. Used to determine what machine makes them.
-#define MICROWAVE 0x1
-#define FRYER 0x2
-#define OVEN 0x4
-#define GRILL 0x8
-#define CANDYMAKER 0x10
-#define CEREALMAKER 0x20
/datum/recipe
var/list/reagents // Example: = list("berryjuice" = 5) // do not list same reagent twice
@@ -50,8 +42,7 @@
var/result // Example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal
var/result_quantity = 1 // Number of instances of result that are created.
var/time = 100 // 1/10 part of second
-
- #define RECIPE_REAGENT_REPLACE 0 //Reagents in the ingredients are discarded.
+
//Only the reagents present in the result at compiletime are used
#define RECIPE_REAGENT_MAX 1 //The result will contain the maximum of each reagent present between the two pools. Compiletime result, and sum of ingredients
#define RECIPE_REAGENT_MIN 2 //As above, but the minimum, ignoring zero values.
@@ -74,7 +65,7 @@
/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents, var/exact = FALSE)
if(!reagents || !reagents.len)
return TRUE
-
+
if(!avail_reagents)
return FALSE
@@ -86,7 +77,7 @@
. = FALSE
else
return FALSE
-
+
if((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len)
return FALSE
return .
@@ -117,7 +108,7 @@
/datum/recipe/proc/check_items(var/obj/container as obj, var/exact = FALSE)
if(!items || !items.len)
return TRUE
-
+
. = TRUE
if(items && items.len)
var/list/checklist = list()
@@ -332,3 +323,7 @@
/datum/recipe/proc/after_cook(obj/container) // Called When the Microwave is finished.
+
+#undef RECIPE_REAGENT_MAX
+#undef RECIPE_REAGENT_MIN
+#undef RECIPE_REAGENT_SUM
diff --git a/code/modules/hydroponics/seedtypes/flowers.dm b/code/modules/hydroponics/seedtypes/flowers.dm
index e71e707e63..e6c2e86f59 100644
--- a/code/modules/hydroponics/seedtypes/flowers.dm
+++ b/code/modules/hydroponics/seedtypes/flowers.dm
@@ -65,7 +65,7 @@
set_trait(TRAIT_MATURATION,7)
set_trait(TRAIT_PRODUCTION,5)
set_trait(TRAIT_YIELD,5)
- set_trait(TRAIT_PRODUCT_ICON,"lavender")
+ set_trait(TRAIT_PRODUCT_ICON,"flower6")
set_trait(TRAIT_PRODUCT_COLOUR,"#B57EDC")
set_trait(TRAIT_PLANT_COLOUR,"#6B8C5E")
set_trait(TRAIT_PLANT_ICON,"flower4")
diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm
index 224c7ee0c7..a81f2919c1 100644
--- a/code/modules/hydroponics/spreading/spreading.dm
+++ b/code/modules/hydroponics/spreading/spreading.dm
@@ -317,3 +317,6 @@
/obj/effect/plant/proc/is_mature()
return (health >= (max_health/3) && world.time > mature_time)
+
+#undef DEFAULT_SEED
+#undef VINE_GROWTH_STAGES
diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm
index f38420fd37..2927b0ddba 100644
--- a/code/modules/instruments/songs/editor.dm
+++ b/code/modules/instruments/songs/editor.dm
@@ -191,7 +191,7 @@
stop_playing()
else if(href_list["setlinearfalloff"])
- var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration")
+ var/amount = tgui_input_number(usr, "Set linear sustain duration in seconds", "Linear Sustain Duration", round_value=FALSE)
if(!isnull(amount))
set_linear_falloff_duration(round(amount * 10, world.tick_lag))
diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm
index 8262768d3a..1ce496ba4d 100644
--- a/code/modules/integrated_electronics/core/assemblies.dm
+++ b/code/modules/integrated_electronics/core/assemblies.dm
@@ -1,6 +1,3 @@
-#define IC_COMPONENTS_BASE 20
-#define IC_COMPLEXITY_BASE 60
-
// Here is where the base definition lives.
// Specific subtypes are in their own folder.
diff --git a/code/modules/library/lib_readme.dm b/code/modules/library/lib_readme.dm
index 0150ed6ba8..85a8fc1a08 100644
--- a/code/modules/library/lib_readme.dm
+++ b/code/modules/library/lib_readme.dm
@@ -6,11 +6,11 @@
// Deprecated! See global.dm for new SQL config vars -- TLE
/*
-#define SQL_ADDRESS ""
-#define SQL_DB ""
-#define SQL_PORT "3306"
-#define SQL_LOGIN ""
-#define SQL_PASS ""
+# define SQL_ADDRESS ""
+# define SQL_DB ""
+# define SQL_PORT "3306"
+# define SQL_LOGIN ""
+# define SQL_PASS ""
*/
//*******************************
diff --git a/code/modules/maps/writer.dm b/code/modules/maps/writer.dm
index 81c6a39603..1d4d403684 100644
--- a/code/modules/maps/writer.dm
+++ b/code/modules/maps/writer.dm
@@ -171,4 +171,11 @@ dmm_suite{
return key
}
}
- }
\ No newline at end of file
+ }
+
+#undef DMM_IGNORE_AREAS
+#undef DMM_IGNORE_TURFS
+#undef DMM_IGNORE_OBJS
+#undef DMM_IGNORE_NPCS
+#undef DMM_IGNORE_PLAYERS
+#undef DMM_IGNORE_MOBS
diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm
index 12fd714283..adc522546f 100644
--- a/code/modules/media/mediamanager.dm
+++ b/code/modules/media/mediamanager.dm
@@ -59,7 +59,7 @@
set_new_volume(usr)
/client/proc/set_new_volume(var/mob/user)
- if(!QDELETED(src.media) || !istype(src.media))
+ if(QDELETED(src.media) || !istype(src.media))
to_chat(user, "You have no media datum to change, if you're not in the lobby tell an admin. ")
return
var/value = input(usr, "Choose your Jukebox volume.", "Jukebox volume", media.volume)
@@ -179,3 +179,9 @@
targetVolume = M.volume
//MP_DEBUG("Found audio source: [M.media_url] @ [(world.time - start_time) / 10]s.")
push_music(targetURL, targetStartTime, targetVolume)
+
+
+#ifdef DEBUG_MEDIAPLAYER
+#undef DEBUG_MEDIAPLAYER
+#undef MP_DEBUG
+#endif
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index c82fdb8e3c..7cf35610dc 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -745,3 +745,26 @@ var/list/mining_overlay_cache = list()
mineral = GLOB.ore_data[mineral_name]
UpdateMineral()
update_icon()
+
+// V5 turfs
+
+/turf/simulated/mineral/icey/v5
+ temperature = 202
+ oxygen = 8
+ nitrogen = 17
+ carbon_dioxide = 75
+ ignore_cavegen = TRUE
+
+/turf/simulated/mineral/crystal/v5
+ temperature = 202
+ oxygen = 8
+ nitrogen = 17
+ carbon_dioxide = 75
+ ignore_cavegen = TRUE
+
+/turf/simulated/mineral/crystal_shiny/v5
+ temperature = 202
+ oxygen = 8
+ nitrogen = 17
+ carbon_dioxide = 75
+ ignore_cavegen = TRUE
diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
index 764fbc56ae..b9e2c2d75e 100644
--- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
+++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
@@ -2,8 +2,6 @@
// * n — The proper name of the purchasable
// * o — The object type path of the purchasable to spawn
// * p — The price of the purchasable in mining points
-#define EQUIPMENT(n, o, p) n = new /datum/data/mining_equipment(n, o, p)
-
/**********************Mining Equipment Locker**************************/
/obj/machinery/mineral/equipment_vendor
diff --git a/code/modules/mob/freelook/visualnet.dm b/code/modules/mob/freelook/visualnet.dm
index 271572abe8..2af7ffacd6 100644
--- a/code/modules/mob/freelook/visualnet.dm
+++ b/code/modules/mob/freelook/visualnet.dm
@@ -159,3 +159,5 @@
var/datum/chunk/chunk = cameranet.getCameraChunk(x, y, z)
usr.client.debug_variables(chunk)
*/
+
+#undef CHUNK_SIZE
diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm
index e966ddc38f..6750fc07f1 100644
--- a/code/modules/mob/language/station_vr.dm
+++ b/code/modules/mob/language/station_vr.dm
@@ -152,6 +152,21 @@
/datum/language/echosong/scramble(var/input, var/list/known_languages)
return stars(input)
+/datum/language/lleill
+ name = LANGUAGE_LLEILL
+ desc = "An ancient, gutteral language involving a lot of spitting."
+ speech_verb = "speaks"
+ ask_verb = "ponders"
+ exclaim_verb = "calls"
+ colour = "echosong"
+ key = "L"
+ syllables = list(
+ "llyn", "bren", "gwyn", "gwyr", "ddys", "dath", "llio", "cym", "ddrai", "ffyr", "lle", "dy", "eto", "uno", "dydno", "llego", "bryth", "ffair",
+ "ynys", "ed", "fore", "oe", "hen", "wladd", "ty", "nha", "dwy", "mae", "dros", "pob", "ia", "wyll", "gwdd", "fi"
+ )
+ machine_understands = FALSE
+ flags = WHITELISTED
+
/datum/language/echosong/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
log_say("(INAUDIBLE) [message]", speaker)
speaker.say_signlang(format_message(message), pick(signlang_verb), pick(signlang_verb_understood), src, 2)
diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm
index ffbd20a6f1..7c9870a79c 100644
--- a/code/modules/mob/living/bot/cleanbot.dm
+++ b/code/modules/mob/living/bot/cleanbot.dm
@@ -15,6 +15,7 @@
var/cleaning = 0
var/wet_floors = 0
var/spray_blood = 0
+ var/blood = 1
var/list/target_types = list()
/mob/living/bot/cleanbot/New()
@@ -138,7 +139,8 @@
if(prob(20))
custom_emote(2, "begins to clean up \the [loc]")
if(do_after(src, cleantime * cTimeMult))
- clean_blood()
+ if(blood)
+ clean_blood()
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
T.dirt = 0
@@ -186,6 +188,7 @@
data["on"] = on
data["open"] = open
data["locked"] = locked
+ data["blood"] = blood
data["patrol"] = will_patrol
data["vocal"] = vocal
@@ -207,6 +210,9 @@
else
turn_on()
. = TRUE
+ if("blood")
+ blood = !blood
+ . = TRUE
if("patrol")
will_patrol = !will_patrol
patrol_path = null
diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm
index 3a8265f352..0d976fef89 100644
--- a/code/modules/mob/living/bot/edCLNbot.dm
+++ b/code/modules/mob/living/bot/edCLNbot.dm
@@ -213,4 +213,4 @@
user.drop_item()
qdel(W)
user.drop_from_inventory(src)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm
index 938ed1d8e0..396c42fb43 100644
--- a/code/modules/mob/living/bot/farmbot.dm
+++ b/code/modules/mob/living/bot/farmbot.dm
@@ -419,4 +419,9 @@
created_name = t
/obj/item/weapon/farmbot_arm_assembly/attack_hand(mob/user as mob)
- return //it's a converted watertank, no you cannot pick it up and put it in your backpack
\ No newline at end of file
+ return //it's a converted watertank, no you cannot pick it up and put it in your backpack
+
+#undef FARMBOT_COLLECT
+#undef FARMBOT_WATER
+#undef FARMBOT_UPROOT
+#undef FARMBOT_NUTRIMENT
diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm
index 22584ae359..e281609cdb 100644
--- a/code/modules/mob/living/bot/floorbot.dm
+++ b/code/modules/mob/living/bot/floorbot.dm
@@ -2,7 +2,7 @@
// This can be a problem if it tries to pave over space or shuttles. That should be fixed but...
// If it can see space outside windows, it can be laggy since it keeps wondering if it should fix them.
// Therefore that functionality is disabled for now. But it can be turned on by uncommenting this.
-// #define FLOORBOT_PATCHES_HOLES 1
+// # define FLOORBOT_PATCHES_HOLES 1
/mob/living/bot/floorbot
name = "Floorbot"
diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm
index 22cd01b4fe..9596a2024d 100644
--- a/code/modules/mob/living/bot/medbot.dm
+++ b/code/modules/mob/living/bot/medbot.dm
@@ -572,3 +572,8 @@
#undef MEDBOT_PANIC_FUCK
#undef MEDBOT_PANIC_ENDING
#undef MEDBOT_PANIC_END
+
+#undef MEDBOT_MIN_INJECTION
+#undef MEDBOT_MAX_INJECTION
+#undef MEDBOT_MIN_HEAL
+#undef MEDBOT_MAX_HEAL
diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm
index 02638226bf..cb8e2acb13 100644
--- a/code/modules/mob/living/bot/mulebot.dm
+++ b/code/modules/mob/living/bot/mulebot.dm
@@ -331,3 +331,11 @@
AM.layer = initial(AM.layer)
AM.pixel_y = initial(AM.pixel_y)
busy = 0
+
+#undef MULE_IDLE
+#undef MULE_MOVING
+#undef MULE_UNLOAD
+#undef MULE_LOST
+#undef MULE_CALC_MIN
+#undef MULE_CALC_MAX
+#undef MULE_PATH_DONE
diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm
index 0d32705542..31e0854d00 100644
--- a/code/modules/mob/living/bot/secbot.dm
+++ b/code/modules/mob/living/bot/secbot.dm
@@ -479,3 +479,7 @@
if(!in_range(src, user) && loc != user)
return
created_name = t
+
+#undef SECBOT_WAIT_TIME
+#undef SECBOT_THREAT_ARREST
+#undef SECBOT_THREAT_ATTACK
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 674c470e5b..f157d12a3d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -7,6 +7,17 @@
has_huds = TRUE //We do have HUDs (like health, wanted, status, not inventory slots)
+
+ var/vore_capacity = 3
+ var/vore_capacity_ex = list("stomach" = 3, "taur belly" = 3)
+ var/vore_fullness_ex = list("stomach" = 0, "taur belly" = 0)
+ var/vore_icon_bellies = list("stomach", "taur belly")
+ var/struggle_anim_stomach = FALSE
+ var/struggle_anim_taur = FALSE
+ var/vore_sprite_color = list("stomach" = "#FFFFFF", "taur belly" = "#FFFFFF")
+ var/vore_sprite_multiply = list("stomach" = TRUE, "taur belly" = TRUE)
+ var/vore_fullness = 0
+
var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us.
var/obj/item/weapon/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
var/last_push_time //For human_attackhand.dm, keeps track of the last use of disarm
@@ -19,6 +30,9 @@
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm
var/active_regen_delay = 300
+ var/list/teleporters = list() //Used for lleill abilities
+
+ var/rest_dir = 0 //To lay down in a specific direction
/mob/living/carbon/human/Initialize(mapload, var/new_species = null)
if(!dna)
@@ -1276,6 +1290,7 @@
vessel.maximum_volume = species.blood_volume
fixblood()
species.update_attack_types() //VOREStation Edit - Required for any trait that updates unarmed_types in setup.
+ species.update_vore_belly_def_variant()
// Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them.
update_hud()
@@ -1777,3 +1792,35 @@
/mob/living/carbon/human/get_mob_riding_slots()
return list(back, head, wear_suit)
+
+/mob/living/carbon/human/proc/update_fullness()
+ var/list/new_fullness = list()
+ vore_fullness = 0
+ for(var/belly_class in vore_icon_bellies)
+ new_fullness[belly_class] = 0
+ for(var/obj/belly/B as anything in vore_organs)
+ new_fullness[B.belly_sprite_to_affect] += B.GetFullnessFromBelly()
+ for(var/belly_class in vore_icon_bellies)
+ new_fullness[belly_class] /= size_multiplier //Divided by pred's size so a macro mob won't get macro belly from a regular prey.
+ new_fullness[belly_class] = round(new_fullness[belly_class], 1) // Because intervals of 0.25 are going to make sprite artists cry.
+ vore_fullness_ex[belly_class] = min(vore_capacity_ex[belly_class], new_fullness[belly_class])
+ vore_fullness += new_fullness[belly_class]
+ vore_fullness = min(vore_capacity, vore_fullness)
+ update_vore_belly_sprite()
+ update_vore_tail_sprite()
+
+/mob/living/carbon/human/verb/lay_down_left()
+ set name = "Rest-Left"
+
+ rest_dir = -1
+ resting = !resting
+ to_chat(src, "You are now [resting ? "resting" : "getting up"]. ")
+ update_canmove()
+
+/mob/living/carbon/human/verb/lay_down_right()
+ set name = "Rest-Right"
+
+ rest_dir = 1
+ resting = !resting
+ to_chat(src, "You are now [resting ? "resting" : "getting up"]. ")
+ update_canmove()
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 692f121ba8..c531ef5086 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -192,6 +192,15 @@
compiled_vis |= VIS_CH_VANTAG
//VOREStation Add End
+ //Vore Stomach addition start. This goes here.
+ if(stomach_vision && !(VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
+ compiled_vis += VIS_CH_STOMACH
+ else if(!stomach_vision && (VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
+ compiled_vis -= VIS_CH_STOMACH
+ //Vore Stomach addition end
+
if(!compiled_vis.len && !vis_enabled.len)
return //Nothin' doin'.
diff --git a/code/modules/mob/living/carbon/human/human_species_vr.dm b/code/modules/mob/living/carbon/human/human_species_vr.dm
index a747280df8..dd3134420a 100644
--- a/code/modules/mob/living/carbon/human/human_species_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_species_vr.dm
@@ -31,3 +31,6 @@
/mob/living/carbon/human/altevian/New(var/new_loc)
..(new_loc, SPECIES_ALTEVIAN)
+
+/mob/living/carbon/human/lleill/New(var/new_loc)
+ ..(new_loc, SPECIES_LLEILL)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 3f884c362c..53e5e240d6 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -12,25 +12,6 @@
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
#define COLD_DAMAGE_LEVEL_3 3 //Amount of damage applied when your body temperature passes the 120K point
-//Note that gas heat damage is only applied once every FOUR ticks.
-#define HEAT_GAS_DAMAGE_LEVEL_1 2 //Amount of damage applied when the current breath's temperature just passes the 360.15k safety point
-#define HEAT_GAS_DAMAGE_LEVEL_2 4 //Amount of damage applied when the current breath's temperature passes the 400K point
-#define HEAT_GAS_DAMAGE_LEVEL_3 8 //Amount of damage applied when the current breath's temperature passes the 1000K point
-
-#define COLD_GAS_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when the current breath's temperature just passes the 260.15k safety point
-#define COLD_GAS_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when the current breath's temperature passes the 200K point
-#define COLD_GAS_DAMAGE_LEVEL_3 3 //Amount of damage applied when the current breath's temperature passes the 120K point
-
-#define COLD_ALERT_SEVERITY_LOW 1 // Constants passed to the cold and heat alerts.
-#define COLD_ALERT_SEVERITY_MODERATE 2
-#define COLD_ALERT_SEVERITY_MAX 3
-#define ENVIRONMENT_COMFORT_MARKER_COLD 1
-
-#define HOT_ALERT_SEVERITY_LOW 1
-#define HOT_ALERT_SEVERITY_MODERATE 2
-#define HOT_ALERT_SEVERITY_MAX 3
-#define ENVIRONMENT_COMFORT_MARKER_HOT 2
-
#define RADIATION_SPEED_COEFFICIENT 0.1
#define HUMAN_COMBUSTION_TEMP 524 //524k is the sustained combustion temperature of human fat
@@ -2147,3 +2128,14 @@
#undef HUMAN_MAX_OXYLOSS
#undef HUMAN_CRIT_MAX_OXYLOSS
+
+#undef HEAT_DAMAGE_LEVEL_1
+#undef HEAT_DAMAGE_LEVEL_2
+#undef HEAT_DAMAGE_LEVEL_3
+
+#undef COLD_DAMAGE_LEVEL_1
+#undef COLD_DAMAGE_LEVEL_2
+#undef COLD_DAMAGE_LEVEL_3
+
+#undef RADIATION_SPEED_COEFFICIENT
+#undef HUMAN_COMBUSTION_TEMP
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
new file mode 100644
index 0000000000..48146df8e8
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
@@ -0,0 +1,178 @@
+/datum/species/lleill
+
+ name = SPECIES_LLEILL
+ name_plural = "Lleill"
+ icobase = 'icons/mob/human_races/r_lleill.dmi'
+ deform = 'icons/mob/human_races/r_lleill.dmi'
+ color_mult = 1
+ tail = "tail"
+ icobase_tail = 1
+ blurb = "A species that appears to originate somewhere in redspace. Their forms are not consistent, \
+ they do not care for consistency, and are working under a constant never-ending drive to improve themselves \
+ and the world around them. With little care for whether the world itself wants to change." //PLACEHOLDER
+
+ blood_color = "#FFFFFF"
+ blood_name = "glamour"
+ flesh_color = "#FFFFFF"
+ reagent_tag = IS_LLEILL
+
+ num_alternate_languages = 3
+ species_language = LANGUAGE_LLEILL
+ language = LANGUAGE_LLEILL
+ name_language = LANGUAGE_LLEILL
+
+ flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT | NO_HALLUCINATION
+ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
+
+ max_age = 200
+
+ economic_modifier = 15
+
+ digi_allowed = TRUE
+
+ //Specific abilities
+
+ darksight = 10 //Can see in dark
+
+ burn_mod = 0.25 //Very resistant to fire
+ pain_mod = 0.25 //Whilst not resistant to brute or stunning, they are quite resistant to pain, making them tanky in their own way.
+
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+ warning_high_pressure = 300
+ hazard_high_pressure = 10000 //Can be killed by pressure but you're going to need a hell of a lot
+
+ cold_level_1 = -1 //Safe in space
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 1500 //Very resiliant to heat
+ heat_level_2 = 2500
+ heat_level_3 = 5000
+
+ can_space_freemove = TRUE //Have no issue moving through space.
+ can_zero_g_move = TRUE
+
+ chem_strength_alcohol = 0 //Can't get drunk
+
+ oxy_mod = 0.25 //Suffocates very slowly, but does ultimately need to breathe, will outpace heal most oxygen damage.
+ poison_type = null //Not harmed by phoron.
+ water_breather = TRUE
+
+ var/list/valid_transform_species = list(
+ "Human", "Unathi", "Tajara", "Skrell",
+ "Diona", "Teshari", "Monkey","Sergal",
+ "Akula","Nevrean","Zorren",
+ "Fennec", "Vulpkanin", "Vasilissan",
+ "Rapala", "Neaera", "Stok", "Farwa", "Sobaka",
+ "Wolpin", "Saru", "Sparra", "Lleill")
+
+ // Looks like a lot but the majority of these are just to change their appearance.
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/lleill_select_colour,
+ /mob/living/carbon/human/proc/lleill_select_shape,
+ /mob/living/carbon/human/proc/shapeshifter_select_hair,
+ /mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
+ /mob/living/carbon/human/proc/shapeshifter_select_gender,
+ /mob/living/carbon/human/proc/shapeshifter_select_wings,
+ /mob/living/carbon/human/proc/shapeshifter_select_tail,
+ /mob/living/carbon/human/proc/shapeshifter_select_ears,
+ /mob/living/proc/set_size,
+ /mob/living/carbon/human/proc/lleill_invisibility,
+ /mob/living/carbon/human/proc/lleill_transmute,
+ /mob/living/carbon/human/proc/lleill_rings)
+
+ //organs, going with just the basics for now
+
+ has_organ = list(
+ O_HEART = /obj/item/organ/internal/heart,
+ O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
+ O_LIVER = /obj/item/organ/internal/liver,
+ O_KIDNEYS = /obj/item/organ/internal/kidneys,
+ O_BRAIN = /obj/item/organ/internal/brain,
+ O_APPENDIX = /obj/item/organ/internal/appendix,
+ O_SPLEEN = /obj/item/organ/internal/spleen,
+ O_EYES = /obj/item/organ/internal/eyes,
+ O_STOMACH = /obj/item/organ/internal/stomach,
+ O_INTESTINE = /obj/item/organ/internal/intestine
+ )
+
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/lleill),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
+ )
+
+ base_species = SPECIES_LLEILL
+
+// Shapeshifters have some behaviour that doesn't play well with this species so I have taken the main parts needed for here.
+
+/datum/species/lleill/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
+ return valid_transform_species
+
+/datum/species/lleill/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
+ if(!H) return ..(null, get_deform)
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.type == src.type) return ..(H, get_deform)
+ return S.get_icobase(H,get_deform)
+
+/datum/species/lleill/get_race_key(var/mob/living/carbon/human/H)
+ return "[..()]-[wrapped_species_by_ref["\ref[H]"]]"
+
+/datum/species/lleill/get_bodytype(var/mob/living/carbon/human/H)
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!H || !S) return ..()
+ if(S.type == src.type) return ..(H)
+ return S.get_bodytype(H)
+
+/datum/species/lleill/get_blood_mask(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_blood_mask(H)
+
+/datum/species/lleill/get_damage_mask(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_damage_mask(H)
+
+/datum/species/lleill/get_damage_overlays(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_damage_overlays(H)
+
+/datum/species/lleill/get_tail(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_tail(H)
+
+/datum/species/lleill/get_tail_animation(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_tail_animation(H)
+
+/datum/species/lleill/get_tail_hair(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_tail_hair(H)
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
new file mode 100644
index 0000000000..97ee036c8a
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
@@ -0,0 +1,179 @@
+/datum/power/lleill
+
+// Simple ability to become invisible. Does not phase you out of the world, you can still interact with things and can not pass through walls.
+// Essentially the same as traitor cloaking, using the same proc for it.
+
+/datum/power/lleill/invisibility
+ name = "Invisibility"
+ desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
+ verbpath = /mob/living/carbon/human/proc/lleill_invisibility
+
+/mob/living/carbon/human/proc/lleill_invisibility()
+ set name = "Invisibility"
+ set desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
+ set category = "Abilities"
+
+ if(stat)
+ to_chat(src, "You can't go invisible when weakened like this. ")
+ return
+
+ if(!cloaked)
+ cloak()
+ to_chat(src, "Your fur shimmers and shifts around you, hiding you from the naked eye. ")
+ else
+ uncloak()
+ to_chat(src, "The brustling of your fur settles down and you become visible once again. ")
+
+/mob/living/carbon/human/proc/lleill_select_shape()
+
+ set name = "Select Body Shape"
+ set category = "Abilities"
+
+ if(stat || world.time < last_special)
+ return
+
+ last_special = world.time + 50
+
+ var/new_species = null
+ new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", species.get_valid_shapeshifter_forms(src))
+
+ if(!new_species || !GLOB.all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
+ return
+ lleill_change_shape(new_species)
+
+/mob/living/carbon/human/proc/lleill_change_shape(var/new_species = null)
+ if(!new_species)
+ return
+
+ wrapped_species_by_ref["\ref[src]"] = new_species
+ dna.base_species = new_species
+ species.base_species = new_species
+ visible_message("\The [src] shifts and contorts, taking the form of \a [new_species]!")
+ regenerate_icons()
+
+/mob/living/carbon/human/proc/lleill_select_colour()
+
+ set name = "Select Body Colour"
+ set category = "Abilities"
+
+ if(stat || world.time < last_special)
+ return
+
+ last_special = world.time + 50
+
+ var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", rgb(r_skin, g_skin, b_skin)) as null|color
+ if(!new_skin)
+ return
+ lleill_set_colour(new_skin)
+
+/mob/living/carbon/human/proc/lleill_set_colour(var/new_skin)
+
+ r_skin = hex2num(copytext(new_skin, 2, 4))
+ g_skin = hex2num(copytext(new_skin, 4, 6))
+ b_skin = hex2num(copytext(new_skin, 6, 8))
+ r_synth = r_skin
+ g_synth = g_skin
+ b_synth = b_skin
+
+ for(var/obj/item/organ/external/E in organs)
+ E.sync_colour_to_human(src)
+
+ regenerate_icons()
+
+/mob/living/carbon/human/proc/lleill_transmute()
+ set name = "Transmute Object"
+ set desc = "Convert an object into a piece of glamour."
+ set category = "Abilities"
+
+ var/list/transmute_list = list(
+ /obj/item/weapon/potion_material/glamour_transparent,
+ /obj/item/weapon/potion_material/glamour_shrinking,
+ /obj/item/weapon/potion_material/glamour_twinkling,
+ /obj/item/weapon/potion_material/glamour_shard,
+ /obj/item/capture_crystal/glamour,
+ /obj/item/glamour_face,
+ /obj/item/device/universal_translator/glamour
+ )
+
+ if(stat)
+ to_chat(src, "You can't go do that when weakened like this. ")
+ return
+
+ var/obj/item/I = get_active_hand()
+ if(!I)
+ to_chat(src, "You have no item in your active hand. ")
+ return
+
+ var/obj/item/transmute_product = tgui_input_list(src, "Choose an glamour to transmute the item into:", "Transmutation", transmute_list)
+ if(!get_active_hand(I))
+ to_chat(src, "The item is no longer in your hands. ")
+ return
+ else
+ visible_message("\The [src] begins to change the form of \the [I].")
+ if(!do_after(usr, 10 SECONDS, I, exclusive = TASK_USER_EXCLUSIVE))
+ visible_message("\The [src] leaves \the [I] in its original form.")
+ return 0
+ visible_message("\The [src] transmutes \the [I] into a \the [transmute_product.name].")
+ drop_item(I)
+ qdel(I)
+ var/spawnloc = get_turf(usr)
+ var/obj/item/N = new transmute_product(spawnloc)
+ put_in_active_hand(N)
+
+/mob/living/carbon/human/proc/lleill_rings()
+ set name = "Place/Use Rings"
+ set desc = "Place or teleport to a glamour ring."
+ set category = "Abilities"
+
+ if(stat)
+ to_chat(src, "You can't go do that when weakened like this. ")
+ return
+ if(buckled)
+ to_chat(src,"You can't do that when restrained. ")
+
+ var/r_action = tgui_alert(src, "What would you like to do with your rings?", "Actions", list("Spawn New Ring", "Teleport to Ring", "Cancel"))
+ if(r_action == "Cancel")
+ return
+ if(r_action == "Spawn New Ring")
+ if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ src.visible_message("\The [src] begins to form white rings on the ground.")
+ return 0
+ to_chat(src, "You place a new glamour ring at your feet. ")
+ var/spawnloc = get_turf(src)
+ var/obj/structure/glamour_ring/R = new(spawnloc)
+ src.teleporters |= R
+ if(r_action == "Teleport to Ring")
+ if(!src.teleporters.len)
+ to_chat(src, "You need to place rings to teleport to them. ")
+ return
+ else
+ var/obj/structure/glamour_ring/R = tgui_input_list(src, "Where do you wish to teleport?", "Teleport", src.teleporters)
+
+ var/datum/effect/effect/system/spark_spread/spk
+ spk = new(src)
+
+ var/T = get_turf(src)
+ spk.set_up(5, 0, src)
+ spk.attach(src)
+ playsound(T, "sparks", 50, 1)
+ anim(T,src,'icons/mob/mob.dmi',,"phaseout",,src.dir)
+
+ var/S = get_turf(R)
+ src.forceMove(S)
+
+ spk.start()
+ playsound(S, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(S, 'sound/effects/sparks2.ogg', 50, 1)
+ anim(S,src,'icons/mob/mob.dmi',,"phasein",,src.dir)
+ spk.set_up(5, 0, src)
+ spk.attach(src)
+
+ //Would be fun to eat people standing on your ring...
+ if(can_be_drop_pred && vore_selected)
+ var/list/target_list = src.living_mobs(0)
+ if(target_list.len)
+ for(var/mob/living/M in target_list)
+ if(M.devourable && M.can_be_drop_prey)
+ M.forceMove(vore_selected)
+ to_chat(M,"In a bright flash of white light, you suddenly find yourself trapped in \the [src]'s [vore_selected.name]! ")
+
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
new file mode 100644
index 0000000000..8b724fe8b6
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
@@ -0,0 +1,198 @@
+//Transparent Glamour (invisibility potion)
+
+/obj/item/weapon/potion_material/glamour_transparent
+ name = "transparent glamour"
+ desc = "A shard of hardened white crystal that is clearly translucent."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "transparent"
+ base_reagent = /obj/item/weapon/potion_base/aqua_regia
+ product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/invisibility
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/invisibility
+ name = "transparent potion"
+ desc = "A small white potion, the clear liquid inside can barely be seen at all."
+ prefill = list("transparent glamour" = 1)
+
+/datum/reagent/glamour_transparent
+ name = "Clear Glamour"
+ id = "transparent glamour"
+ description = "This material is from somewhere else, it can barely be seen by the naked eye."
+ taste_description = "nothingness"
+ reagent_state = LIQUID
+ color = "#ffffff"
+ scannable = 1
+
+/datum/reagent/glamour_transparent/affect_blood(var/mob/living/carbon/target, var/removed)
+ if(!target.cloaked)
+ target.visible_message("\The [target] vanishes from sight.")
+ target.cloak()
+ target.bloodstr.clear_reagents() //instantly clears reagents afterwards
+ target.ingested.clear_reagents()
+ target.touching.clear_reagents()
+ spawn(600)
+ if(target.cloaked)
+ target.uncloak()
+ target.visible_message("\The [target] appears as if from thin air.")
+
+//Shrinking Glamour (scaling potion)
+
+/obj/item/weapon/potion_material/glamour_shrinking
+ name = "shrinking glamour"
+ desc = "A soft clump of white material that seems to shrink at your touch."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "shrinking"
+ base_reagent = /obj/item/weapon/potion_base/aqua_regia
+ product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/scaling
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/scaling
+ name = "scaling potion"
+ desc = "A small white potion, the clear liquid inside can barely be seen at all."
+ prefill = list("scaling glamour" = 1)
+
+/datum/reagent/glamour_scaling
+ name = "Scaling Glamour"
+ id = "scaling glamour"
+ description = "This material is from somewhere else, it appears to change volumes readily at a glance."
+ taste_description = "difficult to discern"
+ reagent_state = LIQUID
+ color = "#ffffff"
+ scannable = 1
+
+/datum/reagent/glamour_scaling/affect_blood(var/mob/living/carbon/target, var/removed)
+ if(!(/mob/living/proc/set_size in target.verbs))
+ to_chat(target, "You feel as though you could change size at any moment. ")
+ target.verbs |= /mob/living/proc/set_size
+ target.bloodstr.clear_reagents() //instantly clears reagents afterwards
+ target.ingested.clear_reagents()
+ target.touching.clear_reagents()
+
+//Twinkling Glamour (Sparkling potion - Gives darksight)
+
+/obj/item/weapon/potion_material/glamour_twinkling
+ name = "twinkling glamour"
+ desc = "A sheet of white material that twinkles on its own accord."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "twinkling"
+ base_reagent = /obj/item/weapon/potion_base/aqua_regia
+ product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/darksight
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/darksight
+ name = "twinling potion"
+ desc = "A small white potion, the thin white liquid inside twinkles brightly."
+ prefill = list("twinkling glamour" = 1)
+
+/datum/reagent/glamour_twinkling
+ name = "Twinkling Glamour"
+ id = "twinkling glamour"
+ description = "This material is from somewhere else, it appears to be twinkling."
+ taste_description = "bright"
+ reagent_state = LIQUID
+ color = "#ffffff"
+ scannable = 1
+
+/datum/reagent/glamour_twinkling/affect_blood(var/mob/living/carbon/human/target, var/removed)
+ if(target.species.darksight < 10)
+ to_chat(target, "You can suddenly see much better than before. ")
+ target.species.darksight = 10
+ if(target.disabilities & NEARSIGHTED)
+ target.disabilities &= ~NEARSIGHTED
+ to_chat(target, "Everything is much less blurry. ")
+ target.bloodstr.clear_reagents() //instantly clears reagents afterwards
+ target.ingested.clear_reagents()
+ target.touching.clear_reagents()
+
+//Glamour Cell (variant of capture crystal)
+
+/obj/item/capture_crystal/glamour
+ name = "glamour cell"
+ desc = "A large but light round ball of glamour that glows from somewhere within."
+ icon = 'icons/obj/glamour.dmi'
+
+/obj/item/capture_crystal/glamour/animate_action(atom/thing)
+ var/image/coolanimation = image('icons/obj/glamour.dmi', null, "animation")
+ coolanimation.plane = PLANE_LIGHTING_ABOVE
+ thing.overlays += coolanimation
+ sleep(14)
+ thing.overlays -= coolanimation
+
+//Face of Glamour (creates a clone of a target)
+
+/obj/item/glamour_face
+ name = "face of glamour"
+ desc = "A piece of glamour that is formed vaguely into the shape of a face."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "face"
+ var/mob/living/homunculus = 0
+
+/obj/item/glamour_face/attack_self(var/mob/user)
+ if(!homunculus)
+ var/list/targets = list()
+ for(var/mob/living/carbon/human/M in mob_list)
+ if(M.z != user.z || get_dist(user,M) > 10)
+ continue
+ if(istype(M) && M.resleeve_lock && M.ckey != M.resleeve_lock)
+ continue
+ targets |= M
+
+ if(!targets)
+ to_chat(user, "There are no appropriate targets in range. ")
+ return
+
+ var/mob/living/carbon/human/chosen_target = tgui_input_list(user, "Which target do you wish to create a homunculus of?", "homunculus", targets)
+
+ var/spawnloc = get_turf(user)
+ var/mob/living/simple_mob/homunculus/H = new(spawnloc)
+ H.name = chosen_target.name
+ H.desc = chosen_target.desc
+ H.icon = chosen_target.icon
+ H.icon_state = chosen_target.icon_state
+ H.copy_overlays(chosen_target, TRUE)
+ H.resize(chosen_target.size_multiplier, ignore_prefs = TRUE)
+ homunculus = H
+ H.owner = src
+ return
+ if(homunculus)
+ var/mob/living/simple_mob/homunculus/H = homunculus
+ var/h_action = tgui_alert(user, "What would you like to do with your homunculus?", "Actions", list("Recall", "Speak Through", "Cancel"))
+ if(h_action == "Cancel")
+ return
+ if(h_action == "Recall")
+ H.visible_message("\The [H] returns to the face.")
+ qdel(H)
+ homunculus = 0
+ return
+ if(h_action == "Speak Through")
+ var/words_to_say = tgui_input_text(user, "What should the homunculus say:", "Speak Through")
+ H.say(words_to_say)
+ return
+
+
+//Speaking Glamour (universal translator)
+
+/obj/item/device/universal_translator/glamour
+ name = "speaking glamour"
+ desc = "A shard of glamour that translates all known language for the user."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "translator"
+
+//Teleporter ring
+
+/obj/structure/glamour_ring
+ name = "glamour ring"
+ desc = "A ring of glowing white, oddly reflective material."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "ring"
+ density = 0
+ anchored = 1
+
+ var/connected_mob
+ var/area_name
+
+/obj/structure/glamour_ring/Initialize()
+ . = ..()
+ var/area/A = get_area(src)
+ area_name = A.name
+ name = "[area_name] glamour ring"
+
+//Glamour Floor
+//Glamour Wall
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 9f68957cee..3b471a84a3 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -108,7 +108,7 @@
var/chem_strength_heal = 1 // Multiplier to most beneficial chem strength
var/chem_strength_pain = 1 // Multiplier to painkiller strength (could be used in a negative trait to simulate long-term addiction reducing effects, etc.)
var/chem_strength_tox = 1 // Multiplier to toxic chem strength (inc. chloral/sopo/mindbreaker/etc. thresholds)
- var/chem_strength_alcohol = 1 // Multiplier to alcohol strength; 0.5 = half, 0 = no effect at all, 2 = double, etc.
+ var/chem_strength_alcohol = 1 // Multiplier to alcohol effect thresholds; higher means more is needed to reach a given effect tier
var/chemOD_threshold = 1 // Multiplier to overdose threshold; lower = easier overdosing
var/chemOD_mod = 1 // Damage modifier for overdose; higher = more damage from ODs
@@ -222,6 +222,8 @@
var/rarity_value = 1 // Relative rarity/collector value for this species.
var/economic_modifier = 2 // How much money this species makes
+ var/vore_belly_default_variant = "H"
+
// Determines the organs that the species spawns with and
var/list/has_organ = list( // which required-organ checks are conducted.
O_HEART = /obj/item/organ/internal/heart,
diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm
index e7499467a3..f6bf1a7a88 100644
--- a/code/modules/mob/living/carbon/human/species/species_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/species_vr.dm
@@ -45,6 +45,9 @@
var/list/food_preference = list() //RS edit
var/food_preference_bonus = 0
+/datum/species/unathi
+ vore_belly_default_variant = "L"
+
/datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane.
unarmed_attacks = list()
unarmed_types += /datum/unarmed_attack/bite/sharp/numbing
@@ -114,3 +117,11 @@
/datum/species/get_bodytype()
return base_species
+
+/datum/species/proc/update_vore_belly_def_variant()
+ // Determine the actual vore_belly_default_variant, if the base species in the VORE tab is set
+ switch (base_species)
+ if("Teshari")
+ vore_belly_default_variant = "T"
+ if("Unathi")
+ vore_belly_default_variant = "L"
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
index b3c1a86697..1574a1636e 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm
@@ -61,7 +61,7 @@ var/datum/species/shapeshifter/promethean/prometheans
item_slowdown_mod = 1.33
throwforce_absorb_threshold = 10
- chem_strength_alcohol = 2
+ chem_strength_alcohol = 0.5
cloning_modifier = /datum/modifier/cloning_sickness/promethean
diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index 1e1a32d94b..f76e23ce9f 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -71,7 +71,7 @@
name_language = LANGUAGE_UNATHI
species_language = LANGUAGE_UNATHI
health_hud_intensity = 2.5
- chem_strength_alcohol = 0.75
+ chem_strength_alcohol = 1.25
throwforce_absorb_threshold = 10
digi_allowed = TRUE
@@ -198,7 +198,7 @@
name_language = LANGUAGE_SIIK
species_language = LANGUAGE_SIIK
health_hud_intensity = 2.5
- chem_strength_alcohol = 1.25
+ chem_strength_alcohol = 0.75
digi_allowed = TRUE
min_age = 18
@@ -303,7 +303,7 @@
species_language = LANGUAGE_SKRELLIAN
assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX, LANGUAGE_PROMETHEAN)
health_hud_intensity = 2
- chem_strength_alcohol = 5
+ chem_strength_alcohol = 0.2
water_movement = -3
@@ -522,7 +522,7 @@
show_ssd = "completely quiescent"
health_hud_intensity = 2.5
item_slowdown_mod = 0.1
- chem_strength_alcohol = 0
+ chem_strength_alcohol = 10000 //a little hacky, maybe? but whatever. nobody plays diona anyway.
throwforce_absorb_threshold = 5
num_alternate_languages = 3
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index f4b8023562..ffdbfcc3a9 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -148,6 +148,7 @@
revive()
mutations.Remove(HUSK)
setBrainLoss(braindamage)
+ species.update_vore_belly_def_variant()
if(!uninjured)
nutrition = old_nutrition * 0.5
@@ -1529,3 +1530,145 @@
if(Adjacent(target)) //We leapt at them but we didn't manage to hit them, let's see if we're next to them
target.Weaken(2) //get knocked down, idiot
+
+
+/mob/living/proc/injection() // Allows the user to inject reagents into others somehow, like stinging, or biting.
+ set name = "Injection"
+ set category = "Abilities"
+ set desc = "Inject another being with something!"
+
+ if(stat || paralysis || weakened || stunned || world.time < last_special) //Epic copypasta from tongue grabbing.
+ to_chat(src, "You can't do that in your current state. ")
+ return
+
+ last_special = world.time + 10 //Anti-spam.
+
+ var/list/choices = list("Inject")
+
+ if(trait_injection_reagents.len > 1) //Should never happen, but who knows!
+ choices += "Change reagent"
+ else if(!trait_injection_selected)
+ trait_injection_selected = trait_injection_reagents[1]
+
+ choices += "Change amount"
+ choices += "Change verb"
+ choices += "Chemical Refresher"
+
+ var/choice = tgui_alert(src, "Do you wish to inject somebody, or adjust settings?", "Selection List", choices)
+
+ if(choice == "Change reagent")
+ var/reagent_choice = tgui_input_list(usr, "Choose which reagent to inject!", "Select reagent", trait_injection_reagents)
+ if(reagent_choice)
+ trait_injection_selected = reagent_choice
+ to_chat(src, "You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."] ")
+ return
+ if(choice == "Change amount")
+ var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0)
+ if(amount_choice >= 0)
+ trait_injection_amount = amount_choice
+ to_chat(src, "You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."] ")
+ return
+ if(choice == "Change verb")
+ var/verb_choice = tgui_input_text(usr, "Choose the percieved manner of injection, such as 'bites' or 'stings', don't be misleading or abusive. This will show up in game as ('X' 'Verb' 'Y'. Example: X bites Y.)", "How are you injecting?", trait_injection_verb, max_length = 60) //Whoaa there cowboy don't put a novel in there.
+ if(verb_choice)
+ trait_injection_verb = verb_choice
+ to_chat(src, "You will [trait_injection_verb] your targets. ")
+ return
+ if(choice == "Chemical Refresher")
+ var/output = {"Chemical Refresher!
+ Options for venoms
+
+ Size Chemicals
+ Microcillin: Will make someone shrink.
+ Macrocillin: Will make someone grow.
+ Normalcillin: Will make someone normal size.
+ Note: 1 unit = 100% size diff. 0.01 unit = 1% size diff.
+ Note: Normacillin stops at 100% size.
+
+ Gender Chemicals
+ Androrovir: Will transform someone's sex to male.
+ Gynorovir: Will transform someone's sex to female.
+ Androgynorovir: Will transform someone's sex to plural.
+
+ Special Chemicals
+ Stoxin: Will make someone drowsy.
+ Rainbow Toxin: Will make someone see rainbows.
+ Paralysis Toxin: Will make someone paralyzed.
+ Numbing Enzyme: Will make someone unable to feel pain.
+ Pain Enzyme: Will make someone feel amplified pain.
+
+ Side Notes
+ You can select a value of 0 to inject nothing!
+ Overdose threshold for most chemicals is 30 units.
+ Exceptions to OD is: (Numbing Enzyme:20)
+ You can also bite synthetics, but due to how synths work, they won't have anything injected into them.
+
+ "}
+ usr << browse(output,"window=chemicalrefresher")
+ return
+ else
+ var/list/targets = list() //IF IT IS NOT BROKEN. DO NOT FIX IT. AND KEEP COPYPASTING IT (Pointing Rick Dalton: "That's my code!" ~CL)
+
+ for(var/mob/living/carbon/L in living_mobs(1, TRUE)) //Noncarbons don't even process reagents so don't bother listing others.
+ if(!istype(L, /mob/living/carbon))
+ continue
+ if(L == src) //no getting high off your own supply, get a nif or something, nerd.
+ continue
+ if(!L.resizable && (trait_injection_selected == "macrocillin" || trait_injection_selected == "microcillin" || trait_injection_selected == "normalcillin")) // If you're using a size reagent, ignore those with pref conflicts.
+ continue
+ if(!L.allow_spontaneous_tf && (trait_injection_selected == "androrovir" || trait_injection_selected == "gynorovir" || trait_injection_selected == "androgynorovir")) // If you're using a TF reagent, ignore those with pref conflicts.
+ continue
+ targets += L
+
+ if(!(targets.len))
+ to_chat(src, "No eligible targets found. ")
+ return
+
+ var/mob/living/target = tgui_input_list(src, "Please select a target.", "Victim", targets)
+
+ if(!target)
+ return
+
+ if(!istype(target, /mob/living/carbon)) //Safety.
+ to_chat(src, "That won't work on that kind of creature! (Only works on crew/monkeys) ")
+ return
+
+
+ var/synth = 0
+ if(target.isSynthetic())
+ synth = 1
+
+ if(!trait_injection_selected)
+ to_chat(src, "You need to select a reagent. ")
+ return
+
+ if(!trait_injection_verb)
+ to_chat(src, "Somehow, you forgot your means of injecting. (Select a verb!) ")
+ return
+
+ if(do_after(src, 50, target)) //A decent enough timer.
+ add_attack_logs(src,target,"Injection trait ([trait_injection_selected], [trait_injection_amount])")
+ if(target.reagents && (trait_injection_amount > 0) && !synth)
+ target.reagents.add_reagent(trait_injection_selected, trait_injection_amount)
+ var/ourmsg = "[usr] [trait_injection_verb] [target] "
+ switch(zone_sel.selecting)
+ if(BP_HEAD)
+ ourmsg += "on the head!"
+ if(BP_TORSO)
+ ourmsg += "on the chest!"
+ if(BP_GROIN)
+ ourmsg += "on the groin!"
+ if(BP_R_ARM, BP_L_ARM)
+ ourmsg += "on the arm!"
+ if(BP_R_HAND, BP_L_HAND)
+ ourmsg += "on the hand!"
+ if(BP_R_LEG, BP_L_LEG)
+ ourmsg += "on the leg!"
+ if(BP_R_FOOT, BP_L_FOOT)
+ ourmsg += "on the foot!"
+ if("mouth")
+ ourmsg += "on the mouth!"
+ if("eyes")
+ ourmsg += "on the eyes!"
+ ourmsg += " "
+ visible_message(ourmsg)
diff --git a/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm b/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm
index 8b9b319b9a..1625a87e8d 100644
--- a/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/teshari_vr.dm
@@ -17,6 +17,8 @@
male_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
female_sneeze_sound = list('sound/effects/mob_effects/tesharisneeze.ogg','sound/effects/mob_effects/tesharisneezeb.ogg')
+ vore_belly_default_variant = "T" //Teshari belly sprite
+
inherent_verbs = list(
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/proc/hide,
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index 83a5fc1d19..4805df6703 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -144,6 +144,45 @@ YW change end */
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_finalize
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_lethal
+/datum/trait/neutral/venom_bite
+ name = "Venomous Injection"
+ desc = "Allows for injecting prey through one method or another to inject them with a variety of chemicals with varying effects!"
+ tutorial = "This trait allows you to bite prey with varying effects! \
+ Options for venoms: \
+ =====Size Chemicals ===== \
+ Microcillin: Will make someone shrink. (This is 1% per 0.01 units. So 1 unit = 100% size change) \
+ Macrocillin: Will make someone grow. (This is 1% per 0.01 units. So 1 unit = 100% size change) \
+ Normalcillin: Will make someone normal size. (This is 1% per 0.01 units. So 1 unit = 100% size change) Stops at 100% size. \
+ ===== Gender Chemicals ===== \
+ Androrovir: Will transform someone's sex to male. \
+ Gynorovir: Will transform someone's sex to female. \
+ Androgynorovir: Will transform someone's sex to pleural. \
+ ===== Special Chemicals ===== \
+ Stoxin: Will make someone drowsy. \
+ Rainbow Toxin: Will make someone see rainbows. \
+ Paralysis Toxin: Will make someone paralyzed. \
+ Numbing Enzyme: Will make someone unable to feel pain. \
+ Pain Enzyme: Will make someone feel pain, amplifieed \
+ ===== Side Notes ===== \
+ You aren't required to inject anything if you prefer to just use it as a normal bite!"
+ cost = 0
+ custom_only = FALSE
+
+/datum/trait/neutral/venom_bite/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ ..()
+ H.verbs |= /mob/living/proc/injection
+ H.trait_injection_reagents += "microcillin" // get small
+ H.trait_injection_reagents += "macrocillin" // get BIG
+ H.trait_injection_reagents += "normalcillin" // normal
+ H.trait_injection_reagents += "numbenzyme" // no feelings
+ H.trait_injection_reagents += "androrovir" // -> MALE
+ H.trait_injection_reagents += "gynorovir" // -> FEMALE
+ H.trait_injection_reagents += "androgynorovir" // -> PLURAL
+ H.trait_injection_reagents += "stoxin" // night night chem
+ H.trait_injection_reagents += "rainbowtoxin" // Funny flashing lights.
+ H.trait_injection_reagents += "paralysistoxin" // Paralysis!
+ H.trait_injection_reagents += "painenzyme" // Pain INCREASER
+
/datum/trait/neutral/long_vore
name = "Long Predatorial Reach"
desc = "Makes you able to use an unspecified appendage to grab creatures."
@@ -484,21 +523,21 @@ YW change end */
desc = "The only way you can hold a drink is if it's in your own two hands, and even then you'd best not inhale too deeply near it. Alcohol hits you three times as hard as they do other people."
cost = 0
custom_only = FALSE
- var_changes = list("chem_strength_alcohol" = 3)
+ var_changes = list("chem_strength_alcohol" = 0.33)
/datum/trait/neutral/alcohol_intolerance_basic
name = "Liver of Lilies"
desc = "You have a hard time with alcohol. Maybe you just never took to it, or maybe it doesn't agree with your system... either way, alcohol hits you twice as hard."
cost = 0
custom_only = FALSE
- var_changes = list("chem_strength_alcohol" = 2)
+ var_changes = list("chem_strength_alcohol" = 0.5)
/datum/trait/neutral/alcohol_intolerance_slight
name = "Liver of Tulips"
desc = "You are what some might call 'a bit of a lightweight', but you can still keep your drinks down... most of the time. Alcohol hits you fifty percent harder."
cost = 0
custom_only = FALSE
- var_changes = list("chem_strength_alcohol" = 1.5)
+ var_changes = list("chem_strength_alcohol" = 0.75)
/datum/trait/neutral/alcohol_tolerance_reset
name = "Liver of Unremarkableness"
@@ -513,21 +552,21 @@ YW change end */
desc = "You can hold drinks much better than those lily-livered land-lubbers! Arr! Alcohol's effects on you are reduced by about a quarter."
cost = 0
custom_only = FALSE
- var_changes = list("chem_strength_alcohol" = 0.75)
+ var_changes = list("chem_strength_alcohol" = 1.25)
/datum/trait/neutral/alcohol_tolerance_advanced
name = "Liver of Steel"
desc = "Drinks tremble before your might! You can hold your alcohol twice as well as those blue-bellied barnacle boilers! Alcohol has just half the effect on you as it does on others."
cost = 0
custom_only = FALSE
- var_changes = list("chem_strength_alcohol" = 0.5)
+ var_changes = list("chem_strength_alcohol" = 2)
/datum/trait/neutral/alcohol_immunity
name = "Liver of Durasteel"
desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed."
cost = 0
custom_only = FALSE
- var_changes = list("chem_strength_alcohol" = 0.25)
+ var_changes = list("chem_strength_alcohol" = 4)
// Alcohol Traits End Here.
YW CHANGE STOP*/
diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm
index 216208d0c6..d635523b76 100644
--- a/code/modules/mob/living/carbon/human/stripping.dm
+++ b/code/modules/mob/living/carbon/human/stripping.dm
@@ -53,6 +53,17 @@
suit.accessories -= A
update_inv_w_uniform()
return
+ if("underwear")
+ var/datum/category_group/underwear/UWC = tgui_input_list(user, "Choose underwear. (Do not do this without OOC permission from the other player)", "Show/hide underwear", global_underwear.categories)
+ if(!UWC) return
+ var/datum/category_item/underwear/UWI = all_underwear[UWC.name]
+ if(!UWI || UWI.name == "None")
+ to_chat(user, "\The [src] does not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "a [UWC.display_name]"]. ")
+ return
+ hide_underwear[UWC.name] = !hide_underwear[UWC.name]
+ update_underwear(1)
+ visible_message("\The [user] [hide_underwear[UWC.name] ? "takes off" : "puts on"] \the [src]'s [UWC.display_name]. ")
+ return
// Are we placing or stripping?
var/stripping
@@ -67,7 +78,7 @@
var/obj/item/weapon/grab/grab = held
if(istype(grab) && grab.affecting == src)
stripping = TRUE
-
+
if(stripping)
if(!istype(target_slot)) // They aren't holding anything valid and there's nothing to remove, why are we even here?
return
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 5dc3b6e48a..c27553b787 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -95,9 +95,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
#define TAIL_UPPER_LAYER_ALT 33 //Modified tail-sprite layer. Tend to be larger.
#define MODIFIER_EFFECTS_LAYER 34 //Effects drawn by modifiers
#define FIRE_LAYER 35 //'Mob on fire' overlay layer
-#define MOB_WATER_LAYER 36 //'Mob submerged' overlay layer
+// # define MOB_WATER_LAYER 36 //'Mob submerged' overlay layer // Moved to global defines
#define TARGETED_LAYER 37 //'Aimed at' overlay layer
-#define TOTAL_LAYERS 37 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
+#define VORE_BELLY_LAYER 38
+#define VORE_TAIL_LAYER 39
+
+#define TOTAL_LAYERS 39 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
//////////////////////////////////
/mob/living/carbon/human
@@ -158,11 +161,19 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
update_tail_showing()
M.Scale(desired_scale_x, desired_scale_y)
else
- var/randn = rand(1, 2)
- if(randn <= 1) // randomly choose a rotation
- M.Turn(-90)
+ if(rest_dir)
+ if(rest_dir < 0)
+ M.Turn(-90)
+ rest_dir = 0
+ else
+ M.Turn(90)
+ rest_dir = 0
else
- M.Turn(90)
+ var/randn = rand(1, 2)
+ if(randn <= 1) // randomly choose a rotation
+ M.Turn(-90)
+ else
+ M.Turn(90)
if(species.icon_height == 64)
M.Translate(13,-22)
else
@@ -421,6 +432,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
//tail
update_tail_showing()
update_wing_showing()
+ update_vore_belly_sprite()
+ update_vore_tail_sprite()
/mob/living/carbon/human/proc/update_skin()
if(QDESTROYING(src))
@@ -1060,7 +1073,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
apply_layer(tail_layer)
return
- var/species_tail = species.get_tail(src) // Species tail icon_state prefix.
+ var/species_tail = species?.get_tail(src) // Species tail icon_state prefix.
//This one is actually not that bad I guess.
if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
@@ -1393,9 +1406,78 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if((. = ..()))
update_wing_showing()
+/mob/living/carbon/human/proc/update_vore_belly_sprite()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(VORE_BELLY_LAYER)
+
+ var/image/vore_belly_image = get_vore_belly_image()
+ if(vore_belly_image)
+ vore_belly_image.layer = BODY_LAYER+VORE_BELLY_LAYER
+ overlays_standing[VORE_BELLY_LAYER] = vore_belly_image
+ vore_belly_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
+
+ apply_layer(VORE_BELLY_LAYER)
+
+/mob/living/carbon/human/proc/get_vore_belly_image()
+ if(!(wear_suit && wear_suit.flags_inv & HIDETAIL))
+ var/vs_fullness = vore_fullness_ex["stomach"]
+ var/icon/vorebelly_s = new/icon(icon = 'icons/mob/vore/Bellies.dmi', icon_state = "[species.vore_belly_default_variant]Belly[vs_fullness][struggle_anim_stomach ? "" : " idle"]")
+ vorebelly_s.Blend(vore_sprite_color["stomach"], vore_sprite_multiply["stomach"] ? ICON_MULTIPLY : ICON_ADD)
+ var/image/working = image(vorebelly_s)
+ working.overlays += em_block_image_generic(working)
+ return working
+ return null
+
+/mob/living/carbon/human/proc/vore_belly_animation()
+ if(!struggle_anim_stomach)
+ struggle_anim_stomach = TRUE
+ update_vore_belly_sprite()
+ spawn(12)
+ struggle_anim_stomach = FALSE
+ update_vore_belly_sprite()
+
+/mob/living/carbon/human/proc/update_vore_tail_sprite()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(VORE_TAIL_LAYER)
+
+ var/image/vore_tail_image = get_vore_tail_image()
+ if(vore_tail_image)
+ vore_tail_image.layer = BODY_LAYER+VORE_TAIL_LAYER
+ overlays_standing[VORE_TAIL_LAYER] = vore_tail_image
+ vore_tail_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
+
+ apply_layer(VORE_TAIL_LAYER)
+
+/mob/living/carbon/human/proc/get_vore_tail_image()
+ if(tail_style && istaurtail(tail_style) && tail_style:vore_tail_sprite_variant)
+ var/vs_fullness = vore_fullness_ex["taur belly"]
+ var/loaf_alt = lying && tail_style:belly_variant_when_loaf
+ var/fullness_icons = min(tail_style.fullness_icons, vs_fullness)
+ var/icon/vorebelly_s = new/icon(icon = tail_style.bellies_icon_path, icon_state = "Taur[tail_style:vore_tail_sprite_variant]-Belly-[fullness_icons][loaf_alt ? " loaf" : (struggle_anim_taur ? "" : " idle")]")
+ vorebelly_s.Blend(vore_sprite_color["taur belly"], vore_sprite_multiply["taur belly"] ? ICON_MULTIPLY : ICON_ADD)
+ var/image/working = image(vorebelly_s)
+ working.pixel_x = -16
+ if(tail_style.em_block)
+ working.overlays += em_block_image_generic(working)
+ return working
+ return null
+
+/mob/living/carbon/human/proc/vore_tail_animation()
+ if(tail_style.struggle_anim && !struggle_anim_taur)
+ struggle_anim_taur = TRUE
+ update_vore_tail_sprite()
+ spawn(12)
+ struggle_anim_taur = FALSE
+ update_vore_tail_sprite()
+
//Human Overlays Indexes/////////
#undef MUTATIONS_LAYER
#undef SKIN_LAYER
+#undef BLOOD_LAYER
#undef MOB_DAM_LAYER
#undef SURGERY_LAYER
#undef UNDERWEAR_LAYER
@@ -1408,19 +1490,24 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
#undef SUIT_LAYER
#undef TAIL_UPPER_LAYER
#undef TAIL_LOWER_LAYER
+#undef WING_LOWER_LAYER
#undef GLASSES_LAYER
#undef BELT_LAYER_ALT
#undef SUIT_STORE_LAYER
#undef BACK_LAYER
#undef HAIR_LAYER
+#undef HAIR_ACCESSORY_LAYER
#undef EARS_LAYER
#undef EYES_LAYER
#undef FACEMASK_LAYER
+#undef GLASSES_LAYER_ALT
#undef HEAD_LAYER
#undef HANDCUFF_LAYER
#undef LEGCUFF_LAYER
#undef L_HAND_LAYER
#undef R_HAND_LAYER
+#undef WING_LAYER
+#undef TAIL_UPPER_LAYER_ALT
#undef MODIFIER_EFFECTS_LAYER
#undef FIRE_LAYER
#undef WATER_LAYER
diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm
index 9e6fbdb2d2..c7476f2ab7 100644
--- a/code/modules/mob/living/silicon/robot/analyzer.dm
+++ b/code/modules/mob/living/silicon/robot/analyzer.dm
@@ -56,8 +56,8 @@
user.show_message("\t Damage Specifics: [span_orange("[BU]")] - [span_red("[BR]")]")
if(M.tod && M.stat == DEAD)
user.show_message(span_blue("Time of Disable: [M.tod]"))
- var/mob/living/silicon/robot/H = M
- var/obj/item/weapon/cell/cell = H.get_cell()
+ var/mob/living/silicon/robot/R = M
+ var/obj/item/weapon/cell/cell = R.get_cell()
if(cell)
var/cell_charge = round(cell.percent())
var/cell_text
@@ -72,7 +72,7 @@
else
cell_text = span_red("[cell_charge] ")
user.show_message("\t Power Cell Status: [span_blue("[capitalize(cell.name)]")] at [cell_text]% charge")
- var/list/damaged = H.get_damaged_components(1,1,1)
+ var/list/damaged = R.get_damaged_components(1,1,1)
user.show_message(span_blue("Localized Damage:"),1)
if(length(damaged)>0)
for(var/datum/robot_component/org in damaged)
@@ -85,12 +85,12 @@
(org.powered) ? "Power ON" : "[span_red("Power OFF")]")),1)
else
user.show_message(span_blue("\t Components are OK."),1)
- if(H.emagged && prob(5))
+ if(R.emagged && prob(5))
user.show_message(span_red("\t ERROR: INTERNAL SYSTEMS COMPROMISED"),1)
user.show_message(span_blue("Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)"), 1)
else
- var/mob/living/silicon/robot/H = M
- var/obj/item/weapon/cell/cell = H.get_cell()
+ var/mob/living/silicon/robot/R = M
+ var/obj/item/weapon/cell/cell = R.get_cell()
user.show_message(span_blue("Upgrade Analyzing Results for [M]:"))
if(cell)
user.show_message("\t Power Cell Details: [span_blue("[capitalize(cell.name)]")] with a capacity of [cell.maxcharge] at [round(cell.percent())]% charge")
@@ -98,12 +98,12 @@
for(var/datum/design/item/prosfab/robot_upgrade/utility/upgrade)
var/obj/item/borg/upgrade/utility/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
- if((!H.module && needs_module) || !initial(upgrade.name) || (H.stat != DEAD && initial(upgrade.name) == "Emergency Restart Module"))
+ if((!R.module && needs_module) || !initial(upgrade.name) || (R.stat != DEAD && (upgrade_type == /obj/item/borg/upgrade/utility/restart)) || (isshell(R) && (upgrade_type == /obj/item/borg/upgrade/utility/rename)))
continue
if(show_title)
user.show_message("\t Utility Modules, used for modifying purposes:")
show_title = FALSE
- if(H.stat == DEAD)
+ if(R.stat == DEAD)
if(initial(upgrade.name) == "Emergency Restart Module")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_green("Usable")]"))
else
@@ -112,55 +112,55 @@
for(var/datum/design/item/prosfab/robot_upgrade/basic/upgrade)
var/obj/item/borg/upgrade/basic/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
- if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD)
+ if((!R.module && needs_module) || !initial(upgrade.name) || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Basic Modules, used for direct upgrade purposes:")
show_title = FALSE
- if(H.has_basic_upgrade(initial(upgrade.build_path)) == "")
+ if(R.has_basic_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR ")]"))
else
- user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_basic_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
+ user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_basic_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/advanced/upgrade)
var/obj/item/borg/upgrade/advanced/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
- if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD)
+ if((!R.module && needs_module) || !initial(upgrade.name) || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Advanced Modules, used for module upgrade purposes:")
show_title = FALSE
- if(H.has_advanced_upgrade(initial(upgrade.build_path)) == "")
+ if(R.has_advanced_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR ")]"))
else
- user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_advanced_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
+ user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_advanced_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade)
var/obj/item/borg/upgrade/restricted/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
- if((!H.module && needs_module) || !initial(upgrade.name) || !H.supports_upgrade(initial(upgrade.build_path)) || H.stat == DEAD)
+ if((!R.module && needs_module) || !initial(upgrade.name) || !R.supports_upgrade(initial(upgrade.build_path)) || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Restricted Modules, used for module upgrade purposes on specific chassis:")
show_title = FALSE
- if(H.has_restricted_upgrade(initial(upgrade.build_path)) == "")
+ if(R.has_restricted_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR ")]"))
else
- user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_restricted_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
+ user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_restricted_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
show_title = TRUE
for(var/datum/design/item/prosfab/robot_upgrade/no_prod/upgrade)
var/obj/item/borg/upgrade/no_prod/upgrade_type = initial(upgrade.build_path)
var/needs_module = initial(upgrade_type.require_module)
var/hidden = initial(upgrade_type.hidden_from_scan)
- if((!H.module && needs_module) || !initial(upgrade.name) || hidden || H.stat == DEAD)
+ if((!R.module && needs_module) || !initial(upgrade.name) || hidden || R.stat == DEAD)
continue
if(show_title)
user.show_message("\t Special Modules, used for recreation purposes:")
show_title = FALSE
- if(H.has_no_prod_upgrade(initial(upgrade.build_path)) == "")
+ if(R.has_no_prod_upgrade(initial(upgrade.build_path)) == "")
user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR ")]"))
else
- user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_no_prod_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
+ user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [R.has_no_prod_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]"))
if("prosthetics")
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_console.dm b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
index 2b8d37c7ae..fd092f3003 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_console.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_console.dm
@@ -42,7 +42,7 @@
//VOREStation Edit - multiz lol
if(D.foreign_droid)
continue
-
+
drones.Add(list(list(
"name" = D.real_name,
"active" = D.stat != 2,
@@ -56,7 +56,10 @@
data["fabricator"] = dronefab
data["fabPower"] = dronefab?.produce_drones
- data["areas"] = GLOB.tagger_locations
+ var/list/areas = list()
+ for(var/area in GLOB.tagger_locations)
+ areas += area
+ data["areas"] = areas
data["selected_area"] = "[drone_call_area]"
return data
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 98e91cdcdd..5972874617 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -255,9 +255,14 @@
else
to_chat(src, "You need to disable a module first! ")
return
- after_equip()
+ after_equip(O)
-/mob/living/silicon/robot/proc/after_equip()
+/mob/living/silicon/robot/proc/after_equip(var/obj/item/O)
+ if(istype(O, /obj/item/device/gps))
+ var/obj/item/device/gps/tracker = O
+ if(tracker.tracking)
+ tracker.tracking = FALSE
+ tracker.toggle_tracking()
if(sight_mode & BORGANOMALOUS)
var/obj/item/weapon/dogborg/pounce/pounce = has_upgrade_module(/obj/item/weapon/dogborg/pounce)
if(pounce)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 858a253c0b..6d850186ba 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -427,7 +427,7 @@
set category = "Robot Commands"
if(custom_name)
- to_chat(usr, "You can't pick another custom name. Go ask for a name change.")
+ to_chat(usr, "You can't pick another custom name. [isshell(src) ? "" : "Go ask for a name change."]")
return 0
spawn(0)
@@ -836,7 +836,7 @@
if(notify)
notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, module.name)
module.Reset(src)
- module.Destroy()
+ qdel(module)
module = null
updatename("Default")
has_recoloured = FALSE
@@ -1704,3 +1704,5 @@
/mob/living/silicon/robot/proc/has_upgrade(var/given_type)
return (has_basic_upgrade(given_type) || has_advanced_upgrade(given_type) || has_restricted_upgrade(given_type) || has_no_prod_upgrade(given_type))
+
+#undef CYBORG_POWER_USAGE_MULTIPLIER
diff --git a/code/modules/mob/living/silicon/robot/sprites/fluff.dm b/code/modules/mob/living/silicon/robot/sprites/fluff.dm
index cc91b97e07..becbde2deb 100644
--- a/code/modules/mob/living/silicon/robot/sprites/fluff.dm
+++ b/code/modules/mob/living/silicon/robot/sprites/fluff.dm
@@ -109,4 +109,6 @@
pixel_x = -16
whitelist_ckey = "lunarfleet"
- whitelist_charname = "Clea-Nor"
\ No newline at end of file
+ whitelist_charname = "Clea-Nor"
+
+#undef CUSTOM_BORGSPRITE
diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
index 69c0ed52d8..77dbac0c06 100644
--- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm
+++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm
@@ -1,8 +1,3 @@
-// Flags for specifying which states we have vore icon_states for.
-#define SA_ICON_LIVING 0x01
-#define SA_ICON_DEAD 0x02
-#define SA_ICON_REST 0x04
-
/mob/living/simple_mob
melee_attack_delay = 1
base_attack_cooldown = 10
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/homunculus.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/homunculus.dm
new file mode 100644
index 0000000000..3a65edf7b6
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/homunculus.dm
@@ -0,0 +1,35 @@
+/mob/living/simple_mob/homunculus
+ name = "homunculus"
+ desc = "A strange misshapen humanoid creature made purely from glamour!"
+
+ icon_dead = "homunculus"
+ icon_living = "homunculus"
+ icon_state = "homunculus"
+ icon = 'icons/mob/vore.dmi'
+
+ ai_holder_type = /datum/ai_holder/simple_mob/passive
+
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+
+ var/owner
+
+/mob/living/simple_mob/homunculus/death()
+ if(owner)
+ var/obj/item/glamour_face/O = owner
+ O.homunculus = 0
+ qdel(src)
+
+/mob/living/simple_mob/homunculus/update_icon()
+ return
+
+/mob/living/simple_mob/homunculus/update_icons()
+ return
+
diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm
index b1494bc268..7c5f3a6cf7 100644
--- a/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/hivebot/hivebot.dm
@@ -1,7 +1,3 @@
-// Hivebots are tuned towards how many default lasers are needed to kill them.
-// As such, if laser damage is ever changed, you should change this define.
-#define LASERS_TO_KILL * 40
-
/mob/living/simple_mob/mechanical/hivebot
name = "hivebot"
desc = "A robot. It appears to be somewhat resilient, but lacks a true weapon."
@@ -57,4 +53,4 @@
can_flee = FALSE // Fearless dumb machines.
/decl/mob_organ_names/hivebot
- hit_zones = list("central chassis", "positioning servo", "head", "sensor suite", "manipulator arm", "shoulder weapon mount", "weapons array", "front right leg", "front left leg", "rear left leg", "rear right leg")
\ No newline at end of file
+ hit_zones = list("central chassis", "positioning servo", "head", "sensor suite", "manipulator arm", "shoulder weapon mount", "weapons array", "front right leg", "front left leg", "rear left leg", "rear right leg")
diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm b/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm
index 514b2087b6..f6c65b9ed3 100644
--- a/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm
@@ -344,4 +344,12 @@
pointblank = TRUE
intelligence_level = AI_SMART
vision_range = 9
- closest_distance = 4
\ No newline at end of file
+ closest_distance = 4
+
+#undef GA_ADS
+#undef GA_CALLDOWN
+#undef GA_SPEEDUP
+#undef GA_ILLUSION
+#undef GA_BULLETHELL
+#undef GA_LINES
+#undef GA_CONFUSION
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
index 6d3d58f40a..8dae71b3bf 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm
@@ -376,3 +376,5 @@
prey_body.forceMove(parent_morph.vore_selected)
log_and_message_admins("[key_name_admin(prey_body)] and [key_name_admin(parent_morph)] have been returned to their original bodies. [get_area(src)] - [COORD(src)].")
qdel(src)
+
+#undef MORPH_COOLDOWN
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
index c1102a6050..8fe1626976 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm
@@ -15,8 +15,6 @@ List of things solar grubs should be able to do:
Therefore, if you see the grubs, kill them while they're small, or things might escalate." // TODO: PORT SOLAR MOTHS - Rykka
value = CATALOGUER_REWARD_EASY
-#define SINK_POWER 1
-
/mob/living/simple_mob/vore/solargrub
name = "juvenile solargrub"
desc = "A young sparkling solargrub"
diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm
index 619cfe5940..0eaed29131 100644
--- a/code/modules/mob/mob_defines_vr.dm
+++ b/code/modules/mob/mob_defines_vr.dm
@@ -1,5 +1,6 @@
/mob
var/vantag_hud = 0 // Do I have the HUD enabled?
+ var/stomach_vision = 1 // By default, you will see stomachs.
var/mob/temporary_form // For holding onto a temporary form
var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index e0a628eb90..e5c84c6928 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -1,4 +1,3 @@
-#define UPGRADE_COOLDOWN 40
#define UPGRADE_KILL_TIMER 100
///Process_Grab()
@@ -417,3 +416,5 @@
qdel(hud)
hud = null
return ..()
+
+#undef UPGRADE_KILL_TIMER
diff --git a/code/modules/mob/mob_helpers_vr.dm b/code/modules/mob/mob_helpers_vr.dm
index 663cfc7f4a..81ae7da305 100644
--- a/code/modules/mob/mob_helpers_vr.dm
+++ b/code/modules/mob/mob_helpers_vr.dm
@@ -1,5 +1,13 @@
/mob/recalculate_vis()
. = ..()
+
+ if(stomach_vision && !(VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
+ vis_enabled += VIS_CH_STOMACH
+ else if(!stomach_vision && (VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
+ vis_enabled -= VIS_CH_STOMACH
+
if(!plane_holder || !vis_enabled)
return
@@ -12,3 +20,33 @@
plane_holder.set_vis(VIS_CH_VANTAG,FALSE)
vis_enabled -= VIS_CH_VANTAG
return
+
+
+/mob/verb/toggle_stomach_vision()
+ set name = "Toggle Stomach Sprites"
+ set category = "Preferences"
+ set desc = "Toggle the ability to see stomachs or not"
+
+ var/toggle
+ toggle = tgui_alert(src, "Would you like to see visible stomachs?", "Visible Tummy?", list("Yes", "No"))
+ if(toggle =="Yes")
+ stomach_vision = 1 //Simple! Easy!
+ if(!(VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
+ vis_enabled += VIS_CH_STOMACH
+ to_chat("You can now see stomachs!")
+ else
+ stomach_vision = 0
+ if(VIS_CH_STOMACH in vis_enabled)
+ plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
+ vis_enabled -= VIS_CH_STOMACH
+ to_chat("You will no longer see stomachs!")
+
+/* //Leaving this in as an example of 'how to properly enable a plane to hide/show itself' for future PRs.
+if(stomach_vision && !(VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,TRUE)
+ vis_enabled += VIS_CH_STOMACH
+else if(!stomach_vision && (VIS_CH_STOMACH in vis_enabled))
+ plane_holder.set_vis(VIS_CH_STOMACH,FALSE)
+ vis_enabled -= VIS_CH_STOMACH
+*/
diff --git a/code/modules/mob/mob_planes_vr.dm b/code/modules/mob/mob_planes_vr.dm
index b23067733f..9f5b30f579 100644
--- a/code/modules/mob/mob_planes_vr.dm
+++ b/code/modules/mob/mob_planes_vr.dm
@@ -4,6 +4,7 @@
plane_masters[VIS_CH_HEALTH_VR] = new /obj/screen/plane_master{plane = PLANE_CH_HEALTH_VR} //Health bar but transparent at 100
plane_masters[VIS_CH_BACKUP] = new /obj/screen/plane_master{plane = PLANE_CH_BACKUP} //Backup implant status
plane_masters[VIS_CH_VANTAG] = new /obj/screen/plane_master{plane = PLANE_CH_VANTAG} //Vore Antags
+ plane_masters[VIS_CH_STOMACH] = new /obj/screen/plane_master{plane = PLANE_CH_STOMACH} //Stomach
plane_masters[VIS_AUGMENTED] = new /obj/screen/plane_master/augmented(M = my_mob) //Augmented reality
..()
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index a8ea0ebfeb..217cf5fb7a 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/ears_vr.dmi'
do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_GREY_YW, SPECIES_SHADEKIN_YW) //This lets all races use //YW EDIT
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_GREY_YW, SPECIES_SHADEKIN_YW) //This lets all races use //YW EDIT
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
// Species-unique ears
@@ -30,6 +30,17 @@
do_colouration = 1
extra_overlay = "shadekin-round-inner"
+/datum/sprite_accessory/ears/lleill
+ name = "Lleill Ears, colorable"
+ desc = ""
+ icon = 'icons/mob/vore/ears_32x64.dmi'
+ icon_state = "lleill"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "lleill-antlers"
+ species_allowed = list(SPECIES_LLEILL)
+
+
// Ears avaliable to anyone
/datum/sprite_accessory/ears/alien_slug
diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm
index a4f1e457f5..b1f6a930a7 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail.dm
@@ -1058,3 +1058,12 @@
extra_overlay2 = "zorgoia_fluff_top"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/lleill
+ name = "Lleill tail"
+ desc = ""
+ icon = 'icons/mob/species/lleill/tail.dmi'
+ icon_state = "tail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "tail_marking"
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index b71cede427..67f07f57b5 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -13,7 +13,7 @@
var/mob_offset_x = 0
var/mob_offset_y = 0
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
var/list/lower_layer_dirs = list(SOUTH)
var/icon_loaf = null
diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm
index 0e052d9c50..89a264c82e 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur.dm
@@ -1,3 +1,10 @@
+/datum/sprite_accessory/tail
+ var/vore_tail_sprite_variant = ""
+ var/belly_variant_when_loaf = FALSE
+ var/fullness_icons = 0
+ var/struggle_anim = FALSE
+ var/bellies_icon_path = 'icons/mob/vore/Taur_Bellies.dmi'
+
/datum/riding/taur
keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack!
nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
@@ -355,4 +362,70 @@
/datum/sprite_accessory/tail/taur/zorgoia/fat
name = "Zorgoia (Fat Taur)"
- extra_overlay = "zorgoia_fat"
\ No newline at end of file
+ extra_overlay = "zorgoia_fat"
+
+
+/datum/sprite_accessory/tail/taur/wolf
+ vore_tail_sprite_variant = "N"
+ fullness_icons = 3
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/naga/naga_2c
+ vore_tail_sprite_variant = "Naga"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/horse
+ vore_tail_sprite_variant = "Horse"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/cow
+ vore_tail_sprite_variant = "Cow"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/lizard
+ vore_tail_sprite_variant = "Lizard"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/lizard/synthlizard
+ vore_tail_sprite_variant = "SynthLiz"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/feline
+ vore_tail_sprite_variant = "Feline"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/slug
+ vore_tail_sprite_variant = "Slug"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/drake
+ vore_tail_sprite_variant = "Drake"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/otie
+ vore_tail_sprite_variant = "Otie"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/deer
+ vore_tail_sprite_variant = "Deer"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/skunk
+ vore_tail_sprite_variant = "Skunk"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
index 17e716fd4e..2a85dda15f 100644
--- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm
@@ -60,6 +60,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 4
+ vore_tail_sprite_variant = "N"
+ fullness_icons = 3
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/wolf/fatwolf
name = "Fat Wolf (Taur)"
@@ -131,6 +134,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 3
+ vore_tail_sprite_variant = "Skunk" //Sadly there appears to be no sprites... For now!
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/naga
name = "Naga (Taur)"
@@ -165,34 +172,43 @@
msg_prey_stepunder = "You jump over %prey's thick tail."
msg_owner_stepunder = "%owner bounds over your tail."
-/datum/sprite_accessory/tail/taur/naga/naga_2c
+/datum/sprite_accessory/tail/taur/naga/vore_compatable
+ name = "Naga (Taur) (Vore Compatable)"
+ vore_tail_sprite_variant = "Naga"
+ fullness_icons = 1
+ struggle_anim = TRUE
+
+/datum/sprite_accessory/tail/taur/naga/vore_compatable/naga_2c
name = "Naga dual-color (Taur)"
icon_state = "naga_s"
extra_overlay = "naga_markings"
//icon_sprite_tag = "naga2c"
+ vore_tail_sprite_variant = "Naga"
+ fullness_icons = 1
+ struggle_anim = TRUE
-/datum/sprite_accessory/tail/taur/naga/alt_2c
+/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_2c
name = "Naga alt style dual-color (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
//icon_sprite_tag = "altnaga2c"
-/datum/sprite_accessory/tail/taur/naga/alt_3c
+/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_3c
name = "Naga alt style tri-color (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
extra_overlay2 = "altnaga_stripes"
-/datum/sprite_accessory/tail/taur/naga/alt_3c_rattler
+/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_3c_rattler
name = "Naga alt style tri-color, rattler (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
extra_overlay2 = "altnaga_rattler"
-/datum/sprite_accessory/tail/taur/naga/alt_3c_tailmaw
+/datum/sprite_accessory/tail/taur/naga/vore_compatable/alt_3c_tailmaw
name = "Naga alt style tri-color, tailmaw (Taur)"
suit_sprites = 'icons/mob/taursuits_naga_alt_vr.dmi'
icon_state = "altnagatailmaw_s"
@@ -208,6 +224,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 4
+ vore_tail_sprite_variant = "Horse"
+ fullness_icons = 1
+ struggle_anim = TRUE
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
@@ -242,6 +261,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 3
+ vore_tail_sprite_variant = "Cow"
+ fullness_icons = 1
+ struggle_anim = TRUE
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
@@ -267,6 +289,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 7
+ vore_tail_sprite_variant = "Deer"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
msg_owner_disarm_run = "You quickly push %prey to the ground with your hoof!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their hoof!"
@@ -303,6 +329,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 5
+ vore_tail_sprite_variant = "Lizard"
+ fullness_icons = 1
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard/fatlizard
name = "Fat Lizard (Taur)"
@@ -349,6 +378,9 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 3
+ vore_tail_sprite_variant = "SynthLiz"
+ fullness_icons = 1
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard/fatsynthlizard
name = "Fat SynthLizard dual-color (Taur)"
@@ -424,6 +456,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 5
+ vore_tail_sprite_variant = "Feline"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/fatfeline
name = "Fat Feline (Taur)"
@@ -529,6 +565,9 @@
icon_state = "slug_s"
suit_sprites = 'icons/mob/taursuits_slug_vr.dmi'
icon_sprite_tag = "slug"
+ vore_tail_sprite_variant = "Slug"
+ fullness_icons = 1
+ struggle_anim = TRUE
msg_owner_help_walk = "You carefully slither around %prey."
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
@@ -599,6 +638,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 6
+ vore_tail_sprite_variant = "Drake"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/drake/fat
name = "Fat Drake (Taur)"
@@ -626,6 +669,10 @@
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
loaf_offset = 5
+ vore_tail_sprite_variant = "Otie"
+ belly_variant_when_loaf = TRUE
+ fullness_icons = 1
+ struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/alraune/alraune_2c
name = "Alraune (dual color)"
@@ -1071,4 +1118,4 @@
offset_x = -32
offset_y = -11
mob_offset_y = 11
-*/
\ No newline at end of file
+*/
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index a29e4ebba0..142dfdf432 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -6,7 +6,7 @@
/datum/sprite_accessory/hair
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_SHADEKIN_YW, SPECIES_KIGYAR_YW, SPECIES_TVAOAN_KIGYAR_YW, SPECIES_SANGHEILI_YW, SPECIES_UNGGOY_YW) //This lets all races use the default hairstyles. // yw edit shadekin and covenants
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_SHADEKIN_YW, SPECIES_KIGYAR_YW, SPECIES_TVAOAN_KIGYAR_YW, SPECIES_SANGHEILI_YW, SPECIES_UNGGOY_YW) //This lets all races use the default hairstyles. // yw edit shadekin and covenants
/datum/sprite_accessory/hair/astolfo
name = "Astolfo"
@@ -485,20 +485,20 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
color_blend_mode = ICON_MULTIPLY
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the facial hair styles.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use the facial hair styles.
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
icon_state = "bald"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This needed to be manually defined, apparantly.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This needed to be manually defined, apparantly.
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
icon = 'icons/mob/human_face_or_vr.dmi'
icon_state = "facial_neckfluff"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN)
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL)
/datum/sprite_accessory/facial_hair/vulp_none
name = "None"
diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
index 1e8f6d4919..8bd27ee746 100644
--- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/wings_vr.dmi'
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
var/wing_offset = 0
var/multi_dir = FALSE // Does it use different sprites at different layers? _front will be added for sprites on low layer, _back to high layer
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index 1956139fce..32e609ad90 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -254,6 +254,7 @@
to_chat(user,message)
to_chat(user, "^ This message was NOT SENT ^ -- It was [length] characters, and the limit is [MAX_MESSAGE_LEN]. It would fit in [posts] separate messages. ")
#undef MAX_HUGE_MESSAGE_LEN
+#undef POST_DELIMITER_STR
///// PSAY /////
diff --git a/code/modules/modular_computers/file_system/programs/command/comm.dm b/code/modules/modular_computers/file_system/programs/command/comm.dm
index 61b6e97c8c..ade5f40adb 100644
--- a/code/modules/modular_computers/file_system/programs/command/comm.dm
+++ b/code/modules/modular_computers/file_system/programs/command/comm.dm
@@ -1,8 +1,3 @@
-#define STATE_DEFAULT 1
-#define STATE_MESSAGELIST 2
-#define STATE_VIEWMESSAGE 3
-#define STATE_STATUSDISPLAY 4
-#define STATE_ALERT_LEVEL 5
/datum/computer_file/program/comm
filename = "comm"
filedesc = "Command and Communications Program"
diff --git a/code/modules/multiz/portals_vr.dm b/code/modules/multiz/portals_vr.dm
index 4f6756ad49..a7a4c9c75b 100644
--- a/code/modules/multiz/portals_vr.dm
+++ b/code/modules/multiz/portals_vr.dm
@@ -93,7 +93,7 @@
if(portal_type == "Weird Green")
portal_icon_selection = "type-b-portal"
if(portal_type == "Pulsing")
- var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow"))
+ var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow", "White"))
if(portal_subtype == "Blue")
portal_icon_selection = "type-c-blue-portal"
if(portal_subtype == "Red")
@@ -102,6 +102,8 @@
portal_icon_selection = "type-c-mix-portal"
if(portal_subtype == "Yellow")
portal_icon_selection = "type-c-yellow-portal"
+ if(portal_subtype == "White")
+ portal_icon_selection = "type-c-white-portal"
return portal_icon_selection
/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj)
diff --git a/code/modules/multiz/stairs.dm b/code/modules/multiz/stairs.dm
index fd9702b9de..cbdbf6f43c 100644
--- a/code/modules/multiz/stairs.dm
+++ b/code/modules/multiz/stairs.dm
@@ -1,5 +1,3 @@
-#define STAIR_MOVE_DELAY 10 // Animation delay for non-living objects moving up/down stairs
-
/obj/structure/stairs
name = "Stairs"
desc = "Stairs leading to another deck. Not too useful if the gravity goes out."
diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm
index dd6a91b5aa..854c6b9035 100644
--- a/code/modules/nifsoft/nif.dm
+++ b/code/modules/nifsoft/nif.dm
@@ -37,6 +37,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
var/tmp/list/nifsofts[TOTAL_NIF_SOFTWARE] // All our nifsofts
var/tmp/list/nifsofts_life = list() // Ones that want to be talked to on life()
var/owner // Owner character name
+ var/owner_key // Account associated with the nif
var/examine_msg //Message shown on examine.
var/tmp/vision_flags = 0 // Flags implants set for faster lookups
@@ -158,6 +159,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
return
if(H.mind)
owner = H.mind.name
+ owner_key = H.ckey
implant(H)
return TRUE
@@ -286,16 +288,18 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
//Firsties
if(!install_done)
if(human.mind.name == owner)
+ owner_key = human.ckey
install_done = world.time + 1 MINUTE
notify("Welcome back, [owner]! Performing quick-calibration...")
else if(!owner)
+ owner_key = human.ckey
install_done = world.time + 35 MINUTES
notify("Adapting to new user...")
sleep(5 SECONDS)
notify("Adjoining optic [human.isSynthetic() ? "interface" : "nerve"], please be patient.",TRUE)
else
notify("You are not an authorized user for this device. Please contact [owner].",TRUE)
- unimplant()
+ unimplant(human)
stat = NIF_TEMPFAIL
return FALSE
diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm
index 5c0bad4294..a6e91a9efb 100644
--- a/code/modules/nifsoft/software/13_soulcatcher.dm
+++ b/code/modules/nifsoft/software/13_soulcatcher.dm
@@ -610,3 +610,10 @@
if(message)
var/sane_message = sanitize(message)
soulcatcher.emote_into(sane_message,src,null)
+
+#undef NIF_SC_CATCHING_ME
+#undef NIF_SC_CATCHING_OTHERS
+#undef NIF_SC_ALLOW_EARS
+#undef NIF_SC_ALLOW_EYES
+#undef NIF_SC_BACKUPS
+#undef NIF_SC_PROJECTING
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 7d820c54f1..bea81b6e87 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -429,3 +429,5 @@ var/const/CE_STABLE_THRESHOLD = 0.5
B.fluorescent = 0
B.invisibility = 0
return B
+
+#undef BLOOD_MINIMUM_STOP_PROCESS
diff --git a/code/modules/organs/internal/_organ_internal.dm b/code/modules/organs/internal/_organ_internal.dm
index 58ed176505..38a5d4009b 100644
--- a/code/modules/organs/internal/_organ_internal.dm
+++ b/code/modules/organs/internal/_organ_internal.dm
@@ -1,5 +1,3 @@
-#define PROCESS_ACCURACY 10
-
/****************************************************
INTERNAL ORGANS DEFINES
****************************************************/
@@ -61,4 +59,3 @@
if(. >= 3 && antibiotics < ANTIBIO_OD) //INFECTION_LEVEL_THREE
if (prob(50))
take_damage(1,silent=prob(15))
-
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 7ca9cde39e..7fe0d25607 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -1431,3 +1431,7 @@ Note that amputating the affected organ does in fact remove the infection from t
var/datum/sprite_accessory/marking/mark = markings[M]["datum"]
if(mark.hide_body_parts && (organ_tag in mark.hide_body_parts))
return 1
+
+#undef DROPLIMB_THRESHOLD_EDGE
+#undef DROPLIMB_THRESHOLD_TEAROFF
+#undef DROPLIMB_THRESHOLD_DESTROY
diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm
index c67a3235d0..f4e044463d 100644
--- a/code/modules/organs/organ_internal.dm
+++ b/code/modules/organs/organ_internal.dm
@@ -1,5 +1,3 @@
-#define PROCESS_ACCURACY 10
-
/****************************************************
INTERNAL ORGANS DEFINES
****************************************************/
diff --git a/code/modules/organs/subtypes/lleill.dm b/code/modules/organs/subtypes/lleill.dm
new file mode 100644
index 0000000000..bd50b6ebff
--- /dev/null
+++ b/code/modules/organs/subtypes/lleill.dm
@@ -0,0 +1,3 @@
+/obj/item/organ/external/head/lleill
+ eye_icon_location = 'icons/mob/human_face_vr.dmi'
+ eye_icon = "eyes_lleill"
diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm
index 9252358757..35208c7285 100644
--- a/code/modules/overmap/ships/ship.dm
+++ b/code/modules/overmap/ships/ship.dm
@@ -44,7 +44,7 @@
var/last_sound = 0 //The last time a ship sound was played //VOREStation add
var/sound_cooldown = 10 SECONDS //VOREStation add
- /// Vis contents overlay holding the ship's vector when in motion
+ /// Vis contents overlay holding the ship's vector when in motion
var/obj/effect/overlay/vis/vector
/obj/effect/overmap/visitable/ship/Initialize()
@@ -72,18 +72,18 @@
/obj/effect/overmap/visitable/ship/get_scan_data(mob/user)
. = ..()
-
+
if(!is_still())
. += {"\n\[i\]Heading\[/i\]: [get_heading_degrees()]\n\[i\]Velocity\[/i\]: [get_speed() * 1000]"}
else
. += {"\n\[i\]Vessel was stationary at time of scan.\[/i\]\n"}
-
+
var/life = 0
-
+
for(var/mob/living/L in living_mob_list)
if(L.z in map_z) //Things inside things we'll consider shielded, otherwise we'd want to use get_z(L)
life++
-
+
. += {"\[i\]Life Signs\[/i\]: [life ? life : "None"]"}
//Projected acceleration based on information from engines
@@ -301,6 +301,7 @@
var/y_to_use = T?.y || "UNK"
return "\[X:[x_to_use], Y:[y_to_use], VEL:[get_speed() * 1000], HDG:[get_heading_degrees()]\]"
+#undef SHIP_MOVE_RESOLUTION
#undef MOVING
#undef SANITIZE_SPEED
-#undef CHANGE_SPEED_BY
\ No newline at end of file
+#undef CHANGE_SPEED_BY
diff --git a/code/modules/pda/cart_apps.dm b/code/modules/pda/cart_apps.dm
index 857b7bbc04..74086c27b5 100644
--- a/code/modules/pda/cart_apps.dm
+++ b/code/modules/pda/cart_apps.dm
@@ -229,7 +229,7 @@
for(var/datum/supply_order/SO as anything in SSsupply.shoppinglist)
supplyOrderCount++
- supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.ordered_by, "Comment" = html_encode(SO.comment))
+ supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.approved_by, "Comment" = html_encode(SO.comment))
supplyData["approved"] = supplyOrderData
supplyData["approved_count"] = supplyOrderCount
diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm
index 94c30cea65..6e6ab50076 100644
--- a/code/modules/pda/core_apps.dm
+++ b/code/modules/pda/core_apps.dm
@@ -314,7 +314,9 @@
// Compile all the newscasts
for(var/datum/feed_channel/channel in news_network.network_channels)
if(!channel.censored)
+ var/index = 0
for(var/datum/feed_message/FM in channel.messages)
+ index++
var/body = replacetext(FM.body, "\n", " ")
news[++news.len] = list(
"channel" = channel.channel_name,
@@ -324,7 +326,8 @@
"time_stamp" = FM.time_stamp,
"has_image" = (FM.img != null),
"caption" = FM.caption,
- "time" = FM.post_time
+ "time" = FM.post_time,
+ "index" = index
)
// Cut out all but the youngest three
diff --git a/code/modules/persistence/effects/paper.dm b/code/modules/persistence/effects/paper.dm
index 26cbd83f95..35c13510db 100644
--- a/code/modules/persistence/effects/paper.dm
+++ b/code/modules/persistence/effects/paper.dm
@@ -17,6 +17,8 @@
var/obj/item/weapon/paper/paper = new paper_type(creating)
paper.info = token["message"]
paper.name = token["title"]
+ if(!paper.name)
+ paper.name = "No Title"
paper.last_modified_ckey = token["author"]
paper.age = token["age"]+1
if(requires_noticeboard)
diff --git a/code/modules/planet/virgo3c_vr.dm b/code/modules/planet/virgo3c_vr.dm
index c80ac3e78e..c0664319a4 100644
--- a/code/modules/planet/virgo3c_vr.dm
+++ b/code/modules/planet/virgo3c_vr.dm
@@ -723,3 +723,23 @@ VIRGO3C_TURF_CREATE(/turf/simulated/floor/tiled/asteroid_steel/outdoors)
/turf/simulated/floor/outdoors/grass/forest/virgo3c/notrees
tree_chance = 0
+
+#undef VIRGO3C_ONE_ATMOSPHERE
+#undef VIRGO3C_AVG_TEMP
+
+#undef VIRGO3C_PER_N2
+#undef VIRGO3C_PER_O2
+#undef VIRGO3C_PER_N2O
+#undef VIRGO3C_PER_CO2
+#undef VIRGO3C_PER_PHORON
+
+#undef VIRGO3C_MOL_PER_TURF
+#undef VIRGO3C_MOL_N2
+#undef VIRGO3C_MOL_O2
+#undef VIRGO3C_MOL_N2O
+#undef VIRGO3C_MOL_CO2
+#undef VIRGO3C_MOL_PHORON
+
+#undef VIRGO3C_SET_ATMOS
+#undef VIRGO3C_TURF_CREATE
+#undef VIRGO3C_TURF_CREATE_UN
diff --git a/code/modules/power/antimatter/computer.dm b/code/modules/power/antimatter/computer.dm
index 973828b6e0..018d4d0325 100644
--- a/code/modules/power/antimatter/computer.dm
+++ b/code/modules/power/antimatter/computer.dm
@@ -93,3 +93,6 @@
user << browse(dat, "window=communications;size=400x500")
onclose(user, "communications")
+#undef STATE_DEFAULT
+#undef STATE_INJECTOR
+#undef STATE_ENGINE
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index cd33c821b1..8f387b20d9 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -804,7 +804,7 @@ GLOBAL_LIST_EMPTY(apcs)
"emagged" = emagged,
"isOperating" = operating,
"externalPower" = main_status,
- "powerCellStatus" = cell ? cell.percent() : null,
+ "powerCellStatus" = cell ? cell.percent() : 0,
"chargeMode" = chargemode,
"chargingStatus" = charging,
"totalLoad" = round(lastused_total),
@@ -1380,6 +1380,32 @@ GLOBAL_LIST_EMPTY(apcs)
/obj/machinery/power/apc/get_cell()
return cell
+#undef CRITICAL_APC_EMP_PROTECTION
+
+#undef UPDATE_CELL_IN
+#undef UPDATE_OPENED1
+#undef UPDATE_OPENED2
+#undef UPDATE_MAINT
+#undef UPDATE_BROKE
+#undef UPDATE_BLUESCREEN
+#undef UPDATE_WIREEXP
+#undef UPDATE_ALLGOOD
+
+#undef APC_UPOVERLAY_CHARGEING0
+#undef APC_UPOVERLAY_CHARGEING1
+#undef APC_UPOVERLAY_CHARGEING2
+#undef APC_UPOVERLAY_EQUIPMENT0
+#undef APC_UPOVERLAY_EQUIPMENT1
+#undef APC_UPOVERLAY_EQUIPMENT2
+#undef APC_UPOVERLAY_LIGHTING0
+#undef APC_UPOVERLAY_LIGHTING1
+#undef APC_UPOVERLAY_LIGHTING2
+#undef APC_UPOVERLAY_ENVIRON0
+#undef APC_UPOVERLAY_ENVIRON1
+#undef APC_UPOVERLAY_ENVIRON2
+#undef APC_UPOVERLAY_LOCKED
+#undef APC_UPOVERLAY_OPERATING
+
#undef APC_UPDATE_ICON_COOLDOWN
#undef APC_EXTERNAL_POWER_NOTCONNECTED
@@ -1389,3 +1415,12 @@ GLOBAL_LIST_EMPTY(apcs)
#undef APC_HAS_ELECTRONICS_NONE
#undef APC_HAS_ELECTRONICS_WIRED
#undef APC_HAS_ELECTRONICS_SECURED
+
+#undef POWERCHAN_OFF
+#undef POWERCHAN_OFF_AUTO
+#undef POWERCHAN_ON
+#undef POWERCHAN_ON_AUTO
+
+#undef NIGHTSHIFT_AUTO
+#undef NIGHTSHIFT_NEVER
+#undef NIGHTSHIFT_ALWAYS
diff --git a/code/modules/power/batteryrack.dm b/code/modules/power/batteryrack.dm
index dcf8dab1bd..62b162a1d9 100644
--- a/code/modules/power/batteryrack.dm
+++ b/code/modules/power/batteryrack.dm
@@ -319,4 +319,11 @@
update_icon()
RefreshParts()
update_maxcharge()
- return TRUE
\ No newline at end of file
+ return TRUE
+
+#undef PSU_OFFLINE
+#undef PSU_OUTPUT
+#undef PSU_INPUT
+#undef PSU_AUTO
+
+#undef PSU_MAXCELLS
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 2fe1fc821b..954231a6ab 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -998,3 +998,5 @@ var/list/possible_cable_coil_colours = list(
else
..()
return
+
+#undef MAXCOIL
diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm
index 9be55a9ce0..18d6a6834a 100644
--- a/code/modules/power/fusion/core/core_field.dm
+++ b/code/modules/power/fusion/core/core_field.dm
@@ -325,7 +325,7 @@
var/obj/S = new Mat.stack_type
dormant_reactant_quantities[particle] -= 20
S.throw_at_random(FALSE, 7, 3)
-
+
else
dormant_reactant_quantities[particle] = 0
@@ -684,5 +684,6 @@
return
#undef FUSION_HEAT_CAP
+#undef FUSION_ENERGY_PER_K
#undef FUSION_MAX_ENVIRO_HEAT
#undef PLASMA_TEMP_RADIATION_DIVISIOR
diff --git a/code/modules/power/fusion/magpower.dm b/code/modules/power/fusion/magpower.dm
index 81ab2e5ce5..9d5f9bb649 100644
--- a/code/modules/power/fusion/magpower.dm
+++ b/code/modules/power/fusion/magpower.dm
@@ -71,3 +71,6 @@
if (FF.plasma_temperature <= MINIMUM_PLASMA_TEMPERATURE)
icon_state = "mag_trap0"
return
+
+#undef ENERGY_PER_K
+#undef MINIMUM_PLASMA_TEMPERATURE
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 3c4403c221..a81c88e35b 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -4,10 +4,6 @@
// status values shared between lighting fixtures and items
-#define LIGHT_OK 0
-#define LIGHT_EMPTY 1
-#define LIGHT_BROKEN 2
-#define LIGHT_BURNED 3
#define LIGHT_BULB_TEMPERATURE 400 //K - used value for a 60W bulb
#define LIGHTING_POWER_FACTOR 2 //5W per luminosity * range //VOREStation Edit: why the fuck are lights eating so much power, 2W per thing
#define LIGHT_EMERGENCY_POWER_USE 0.2 //How much power emergency lights will consume per tick
@@ -1187,3 +1183,7 @@ var/global/list/light_type_cache = list()
icon = 'icons/obj/lighting.dmi'
icon_state = "lampshade"
w_class = ITEMSIZE_TINY
+
+#undef LIGHT_BULB_TEMPERATURE
+#undef LIGHTING_POWER_FACTOR
+#undef LIGHT_EMERGENCY_POWER_USE
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index d4fbd73a41..17896de426 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -417,3 +417,7 @@
//no special effects, but the explosion is pretty big (same as a supermatter shard).
explosion(src.loc, 3, 6, 12, 16, 1)
qdel(src)
+
+
+#undef TEMPERATURE_DIVISOR
+#undef TEMPERATURE_CHANGE_MAX
diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm
index 4d92e37c4e..51c53138fa 100644
--- a/code/modules/power/singularity/act.dm
+++ b/code/modules/power/singularity/act.dm
@@ -1,5 +1,3 @@
-#define I_SINGULO "singulo"
-
/atom/proc/singularity_act()
return
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index e14b59f09b..85b10c8b00 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -1,5 +1,3 @@
-#define EMITTER_DAMAGE_POWER_TRANSFER 450 //used to transfer power to containment field generators
-
/obj/machinery/power/emitter
name = "emitter"
desc = "It is a heavy duty industrial laser."
diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm
index af901342d5..b0ced621a2 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm
@@ -416,4 +416,7 @@
required_atmos_temp_min = 400
required_atmos_temp_max = 20000
- probability = 20
\ No newline at end of file
+ probability = 20
+
+#undef PS_RESULT_STACK
+#undef PS_RESULT_ITEM
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index cc8ed45f3b..a64f2c7861 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -3,8 +3,8 @@
GLOBAL_LIST_EMPTY(smeses)
-#define SMESMAXCHARGELEVEL 250000
-#define SMESMAXOUTPUT 250000
+//# define SMESMAXCHARGELEVEL 250000 Unused
+//# define SMESMAXOUTPUT 250000 Unused
/obj/machinery/power/smes
name = "power storage unit"
@@ -511,4 +511,4 @@ GLOBAL_LIST_EMPTY(smeses)
// Description: Sets output setting on this SMES. Trims it if limits are exceeded.
/obj/machinery/power/smes/proc/set_output(var/new_output = 0)
output_level = between(0, new_output, output_level_max)
- update_icon()
\ No newline at end of file
+ update_icon()
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 60c42b037c..94d46d8581 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -1,4 +1,4 @@
-//#define SOLAR_MAX_DIST 40 //VOREStation Removal
+//# define SOLAR_MAX_DIST 40 //VOREStation Removal
#define SOLAR_AUTO_START_NO 0 // Will never start itself.
#define SOLAR_AUTO_START_YES 1 // Will always start itself.
#define SOLAR_AUTO_START_CONFIG 2 // Will start itself if config allows it (default is no).
@@ -552,3 +552,7 @@ GLOBAL_LIST_EMPTY(solars_list)
/obj/item/weapon/paper/solar
name = "paper- 'Going green! Setup your own solar array instructions.'"
info = "Welcome At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or phoron! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.
You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!
Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the SSsun.sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the SSsun.sun's movements and to send commands to the solar panels to change direction with the SSsun.sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.
Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.
That's all to it, be safe, be green!
"
+
+#undef SOLAR_AUTO_START_NO
+#undef SOLAR_AUTO_START_YES
+#undef SOLAR_AUTO_START_CONFIG
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index dfd733d934..e4d976a3b6 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -550,6 +550,12 @@
STOP_PROCESSING(SSobj, src)
return ..()
+#undef POWER_FACTOR
+#undef DECAY_FACTOR
+#undef CRITICAL_TEMPERATURE
+#undef CHARGING_FACTOR
+#undef DAMAGE_RATE_LIMIT
+
#undef NITROGEN_RETARDATION_FACTOR
#undef THERMAL_RELEASE_MODIFIER
#undef PHORON_RELEASE_MODIFIER
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index fe85a12f87..d7440f2315 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -314,3 +314,6 @@
if (EB.energy > 0)
EB.energy -= min(EB.energy, max(10, round(EB.energy * 0.05)))
// VOREStation Edit End
+
+#undef TESLA_DEFAULT_POWER
+#undef TESLA_MINI_POWER
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 772e190282..b9693bf59d 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -89,11 +89,6 @@
if (!BB)
. += "This one is spent."
-//Gun loading types
-#define SINGLE_CASING 1 //The gun only accepts ammo_casings. ammo_magazines should never have this as their mag_type.
-#define SPEEDLOADER 2 //Transfers casings from the mag to the gun when used.
-#define MAGAZINE 4 //The magazine item itself goes inside the gun
-
//An item that holds casings and can be used to put them inside guns
/obj/item/ammo_magazine
name = "magazine"
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
index 689be8359d..40e9d37f96 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
@@ -30,6 +30,10 @@
if(environment.temperature > HEATMODE_TEMP - 30)
. = TRUE
+#undef LAVALAND_EQUIPMENT_EFFECT_PRESSURE
+#undef HEATMODE_ATMOSPHERE
+#undef HEATMODE_TEMP
+
/proc/offsite_environment_check(turf/simulated/T)
. = TRUE
if(!istype(T))
@@ -343,7 +347,6 @@
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf)
K.color = color
-
//Modkits
/obj/item/borg/upgrade/modkit
name = "kinetic accelerator modification kit"
@@ -732,3 +735,7 @@
/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
bolt_color = input(user,"","Choose Color",bolt_color) as color|null
+
+#undef KA_ENVIRO_TYPE_COLD
+#undef KA_ENVIRO_TYPE_HOT
+#undef KA_ENVIRO_TYPE_OFFSITE
diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm
index 21077bb05a..b390d48ff0 100644
--- a/code/modules/projectiles/guns/magnetic/bore.dm
+++ b/code/modules/projectiles/guns/magnetic/bore.dm
@@ -270,3 +270,8 @@
/obj/item/weapon/gun/magnetic/matfed/phoronbore/loaded
cell = /obj/item/weapon/cell/apc
capacitor = /obj/item/weapon/stock_parts/capacitor
+
+#undef GEN_STARTING
+#undef GEN_OFF
+#undef GEN_IDLE
+#undef GEN_ACTIVE
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 11758b9c8a..4627a611ae 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -1,7 +1,3 @@
-#define HOLD_CASINGS 0 //do not do anything after firing. Manual action, like pump shotguns, or guns that want to define custom behaviour
-#define EJECT_CASINGS 1 //drop spent casings on the ground after firing
-#define CYCLE_CASINGS 2 //experimental: cycle casings, like a revolver. Also works for multibarrelled guns
-
/obj/item/weapon/gun/projectile
name = "gun"
desc = "A gun that fires bullets."
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index fe438ead6d..d8274ed23e 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -852,3 +852,6 @@
if(silenced)
volume = 5
playsound(A, hitsound_wall, volume, 1, -1)
+
+#undef MOVES_HITSCAN
+#undef MUZZLE_EFFECT_PIXEL_INCREMENT
diff --git a/code/modules/random_map/automata/automata.dm b/code/modules/random_map/automata/automata.dm
index 544b625a33..50b53577c5 100644
--- a/code/modules/random_map/automata/automata.dm
+++ b/code/modules/random_map/automata/automata.dm
@@ -1,4 +1,3 @@
-#define CELL_ALIVE(VAL) (VAL == cell_live_value)
#define KILL_CELL(CELL, NEXT_MAP) NEXT_MAP[CELL] = cell_dead_value;
#define REVIVE_CELL(CELL, NEXT_MAP) NEXT_MAP[CELL] = cell_live_value;
@@ -68,4 +67,4 @@
return
#undef KILL_CELL
-#undef REVIVE_CELL
\ No newline at end of file
+#undef REVIVE_CELL
diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm
index dace62feee..5e57f76923 100644
--- a/code/modules/random_map/drop/droppod.dm
+++ b/code/modules/random_map/drop/droppod.dm
@@ -226,3 +226,9 @@
return
new /datum/random_map/droppod(null, usr.x-1, usr.y-1, usr.z, supplied_drops = spawned_mobs, automated = automatic_pod)
+
+#undef SD_FLOOR_TILE
+#undef SD_WALL_TILE
+#undef SD_DOOR_TILE
+#undef SD_EMPTY_TILE
+#undef SD_SUPPLY_TILE
diff --git a/code/modules/reagents/holder/holder.dm b/code/modules/reagents/holder/holder.dm
index 28f133c840..96bd9a6e05 100644
--- a/code/modules/reagents/holder/holder.dm
+++ b/code/modules/reagents/holder/holder.dm
@@ -1,5 +1,3 @@
-#define PROCESS_REACTION_ITER 5 //when processing a reaction, iterate this many times
-
/datum/reagents
var/list/datum/reagent/reagent_list = list()
var/total_volume = 0
diff --git a/code/modules/reagents/machinery/dispenser/_defines.dm b/code/modules/reagents/machinery/dispenser/_defines.dm
index 8d52cf5cd0..c3331cb418 100644
--- a/code/modules/reagents/machinery/dispenser/_defines.dm
+++ b/code/modules/reagents/machinery/dispenser/_defines.dm
@@ -4,5 +4,4 @@
// Chemistry dispenser starts with 21
// ERT dispenser starts with 28
-#define DISPENSER_MAX_CARTRIDGES 30
-
+// #define DISPENSER_MAX_CARTRIDGES 30 //changed to var
diff --git a/code/modules/reagents/machinery/dispenser/dispenser2.dm b/code/modules/reagents/machinery/dispenser/dispenser2.dm
index bd9c85b24c..be5090e2e7 100644
--- a/code/modules/reagents/machinery/dispenser/dispenser2.dm
+++ b/code/modules/reagents/machinery/dispenser/dispenser2.dm
@@ -14,6 +14,7 @@
var/accept_drinking = 0
var/amount = 30
+ var/max_catriges = 30
use_power = USE_POWER_IDLE
idle_power_usage = 100
@@ -28,7 +29,7 @@
/obj/machinery/chemical_dispenser/examine(mob/user)
. = ..()
- . += "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more."
+ . += "It has [cartridges.len] cartridges installed, and has space for [max_catriges - cartridges.len] more."
/obj/machinery/chemical_dispenser/verb/rotate_clockwise()
set name = "Rotate Dispenser Clockwise"
@@ -47,7 +48,7 @@
to_chat(user, "\The [C] will not fit in \the [src]! ")
return
- if(cartridges.len >= DISPENSER_MAX_CARTRIDGES)
+ if(cartridges.len >= max_catriges)
if(user)
to_chat(user, "\The [src] does not have any slots open for \the [C] to fit into! ")
return
@@ -151,7 +152,7 @@
var/chemicals[0]
for(var/label in cartridges)
var/obj/item/weapon/reagent_containers/chem_disp_cartridge/C = cartridges[label]
- chemicals.Add(list(list("title" = label, "id" = label, "amount" = C.reagents.total_volume))) // list in a list because Byond merges the first list...
+ chemicals.Add(list(list("name" = label, "id" = label, "volume" = C.reagents.total_volume))) // list in a list because Byond merges the first list...
data["chemicals"] = chemicals
return data
diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
index 007669286e..e7ed52ea84 100644
--- a/code/modules/reagents/reagent_containers/patch.dm
+++ b/code/modules/reagents/reagent_containers/patch.dm
@@ -40,7 +40,7 @@
to_chat(H, "\The [src] is placed on your [affecting]. ")
M.drop_from_inventory(src) //icon update
if(reagents.total_volume)
- reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH)
+ reagents.trans_to_mob(M, reagents.total_volume, CHEM_BLOOD) //CHEM_TOUCH
qdel(src)
return 1
@@ -74,7 +74,7 @@
M.drop_from_inventory(src) //icon update
if(reagents.total_volume)
- reagents.trans_to_mob(M, reagents.total_volume, CHEM_TOUCH)
+ reagents.trans_to_mob(M, reagents.total_volume, CHEM_BLOOD) //CHEM_TOUCH
qdel(src)
return 1
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 74434dd9cc..45dcf88de2 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -5,11 +5,14 @@
#define SYRINGE_INJECT 1
#define SYRINGE_BROKEN 2
+#define SYRINGE_CAPPED 10
+
+
/obj/item/weapon/reagent_containers/syringe
name = "syringe"
desc = "A syringe."
description_fluff = "This could be used to engrave messages on suitable surfaces if you really put your mind to it! Alt-click a floor or wall to engrave with it." //This way it's not a completely hidden, arcane art to engrave.
- icon = 'icons/obj/syringe.dmi'
+ icon = 'icons/goonstation/objects/syringe_vr.dmi'
item_state = "syringe_0"
icon_state = "0"
center_of_mass = list("x" = 16,"y" = 14)
@@ -21,14 +24,34 @@
slot_flags = SLOT_EARS
sharp = TRUE
unacidable = TRUE //glass
- var/mode = SYRINGE_DRAW
+ var/mode = SYRINGE_CAPPED
var/image/filling //holds a reference to the current filling overlay
var/visible_name = "a syringe"
var/time = 30
var/drawing = 0
+ var/used = FALSE
+ var/dirtiness = 0
+ var/list/targets
+ var/list/datum/disease2/disease/viruses
drop_sound = 'sound/items/drop/glass.ogg'
pickup_sound = 'sound/items/pickup/glass.ogg'
+
+/obj/item/weapon/reagent_containers/syringe/Initialize()
+ . = ..()
+ update_icon()
+
+/obj/item/weapon/reagent_containers/syringe/Destroy()
+ QDEL_LIST_NULL(viruses)
+ LAZYCLEARLIST(targets)
+ return ..()
+
+/obj/item/weapon/reagent_containers/syringe/process()
+ dirtiness = min(dirtiness + targets.len,75)
+ if(dirtiness >= 75)
+ STOP_PROCESSING(SSobj, src)
+ return 1
+
/obj/item/weapon/reagent_containers/syringe/on_reagent_change()
update_icon()
@@ -42,6 +65,9 @@
/obj/item/weapon/reagent_containers/syringe/attack_self(mob/user as mob)
switch(mode)
+ if(SYRINGE_CAPPED)
+ mode = SYRINGE_DRAW
+ to_chat(user,"You uncap the syringe. ")
if(SYRINGE_DRAW)
mode = SYRINGE_INJECT
if(SYRINGE_INJECT)
@@ -229,36 +255,8 @@
to_chat(user, "The syringe is empty. ")
// dirty(target,affected) //VOREStation Add -- Removed by Request
-
return
-/* VOREStation Edit - See syringes_vr.dm
-/obj/item/weapon/reagent_containers/syringe/update_icon()
- cut_overlays()
- if(mode == SYRINGE_BROKEN)
- icon_state = "broken"
- return
-
- var/rounded_vol = round(reagents.total_volume, round(reagents.maximum_volume / 3))
- if(ismob(loc))
- var/injoverlay
- switch(mode)
- if (SYRINGE_DRAW)
- injoverlay = "draw"
- if (SYRINGE_INJECT)
- injoverlay = "inject"
- add_overlay(injoverlay)
- icon_state = "[rounded_vol]"
- item_state = "syringe_[rounded_vol]"
-
- if(reagents.total_volume)
- filling = image('icons/obj/reagentfillings.dmi', src, "syringe10")
-
- filling.icon_state = "syringe[rounded_vol]"
-
- filling.color = reagents.get_color()
- add_overlay(filling)
-*/
/obj/item/weapon/reagent_containers/syringe/proc/syringestab(mob/living/carbon/target as mob, mob/living/carbon/user as mob)
if(istype(target, /mob/living/carbon/human))
@@ -390,3 +388,93 @@
..()
//reagents.add_reagent("adrenaline",5) //VOREStation Edit - No thanks.
reagents.add_reagent("hyperzine",10)
+
+/obj/item/weapon/reagent_containers/syringe/proc/dirty(var/mob/living/carbon/human/target, var/obj/item/organ/external/eo)
+ if(!ishuman(loc))
+ return //Avoid borg syringe problems.
+ LAZYINITLIST(targets)
+
+ //We can't keep a mob reference, that's a bad idea, so instead name+ref should suffice.
+ var/name_to_use = ismob(target) ? target.real_name : target.name
+ var/hash = md5(name_to_use + "\ref[target]")
+
+ //Just once!
+ targets |= hash
+
+ //Grab any viruses they have
+ if(iscarbon(target) && LAZYLEN(target.virus2.len))
+ LAZYINITLIST(viruses)
+ var/datum/disease2/disease/virus = pick(target.virus2.len)
+ viruses[hash] = virus.getcopy()
+
+ //Dirtiness should be very low if you're the first injectee. If you're spam-injecting 4 people in a row around you though,
+ //This gives the last one a 30% chance of infection.
+ var/infect_chance = dirtiness //Start with dirtiness
+ if(infect_chance <= 10 && (hash in targets)) //Extra fast uses on target is free
+ infect_chance = 0
+ infect_chance += (targets.len-1)*10 //Extra 10% per extra target
+ if(prob(infect_chance))
+ log_and_message_admins("[loc] infected [target]'s [eo.name] with \the [src].")
+ infect_limb(eo)
+
+ //75% chance to spread a virus if we have one
+ if(LAZYLEN(viruses) && prob(75))
+ var/old_hash = pick(viruses)
+ if(hash != old_hash) //Same virus you already had?
+ var/datum/disease2/disease/virus = viruses[old_hash]
+ infect_virus2(target,virus.getcopy())
+
+ if(!used)
+ START_PROCESSING(SSobj, src)
+
+/obj/item/weapon/reagent_containers/syringe/proc/infect_limb(var/obj/item/organ/external/eo)
+ src = null
+ var/datum/weakref/limb_ref = WEAKREF(eo)
+ spawn(rand(5 MINUTES,10 MINUTES))
+ var/obj/item/organ/external/found_limb = limb_ref.resolve()
+ if(istype(found_limb))
+ eo.germ_level += INFECTION_LEVEL_ONE+30
+
+//Allow for capped syringe mode
+
+//Allow for capped syringes
+/obj/item/weapon/reagent_containers/syringe/update_icon()
+ cut_overlays()
+
+ var/matrix/tf = matrix()
+ if(isstorage(loc))
+ tf.Turn(-90) //Vertical for storing compact-ly
+ tf.Translate(-3,0) //Could do this with pixel_x but let's just update the appearance once.
+ transform = tf
+
+ if(mode == SYRINGE_BROKEN)
+ icon_state = "broken"
+ return
+
+ if(mode == SYRINGE_CAPPED)
+ icon_state = "capped"
+ return
+
+ var/rounded_vol = round(reagents.total_volume, round(reagents.maximum_volume / 3))
+ if(reagents.total_volume)
+ filling = image(icon, src, "filler[rounded_vol]")
+ filling.color = reagents.get_color()
+ add_overlay(filling)
+
+ if(ismob(loc))
+ var/injoverlay
+ switch(mode)
+ if (SYRINGE_DRAW)
+ injoverlay = "draw"
+ if (SYRINGE_INJECT)
+ injoverlay = "inject"
+ add_overlay(injoverlay)
+
+ icon_state = "[rounded_vol]"
+ item_state = "syringe_[rounded_vol]"
+
+#undef SYRINGE_DRAW
+#undef SYRINGE_INJECT
+#undef SYRINGE_BROKEN
+
+#undef SYRINGE_CAPPED
diff --git a/code/modules/reagents/reagent_containers/syringes_vr.dm b/code/modules/reagents/reagent_containers/syringes_vr.dm
deleted file mode 100644
index 1e69c63322..0000000000
--- a/code/modules/reagents/reagent_containers/syringes_vr.dm
+++ /dev/null
@@ -1,122 +0,0 @@
-#define SYRINGE_CAPPED 10
-
-/obj/item/weapon/reagent_containers/syringe
- icon = 'icons/goonstation/objects/syringe_vr.dmi'
- mode = SYRINGE_CAPPED //Override
- var/used = FALSE
- var/dirtiness = 0
- var/list/targets
- var/list/datum/disease2/disease/viruses
-
-/obj/item/weapon/reagent_containers/syringe/Initialize()
- . = ..()
- update_icon()
-
-/obj/item/weapon/reagent_containers/syringe/Destroy()
- QDEL_LIST_NULL(viruses)
- LAZYCLEARLIST(targets)
- return ..()
-
-/obj/item/weapon/reagent_containers/syringe/process()
- dirtiness = min(dirtiness + targets.len,75)
- if(dirtiness >= 75)
- STOP_PROCESSING(SSobj, src)
- return 1
-
-/obj/item/weapon/reagent_containers/syringe/proc/dirty(var/mob/living/carbon/human/target, var/obj/item/organ/external/eo)
- if(!ishuman(loc))
- return //Avoid borg syringe problems.
- LAZYINITLIST(targets)
-
- //We can't keep a mob reference, that's a bad idea, so instead name+ref should suffice.
- var/name_to_use = ismob(target) ? target.real_name : target.name
- var/hash = md5(name_to_use + "\ref[target]")
-
- //Just once!
- targets |= hash
-
- //Grab any viruses they have
- if(iscarbon(target) && LAZYLEN(target.virus2.len))
- LAZYINITLIST(viruses)
- var/datum/disease2/disease/virus = pick(target.virus2.len)
- viruses[hash] = virus.getcopy()
-
- //Dirtiness should be very low if you're the first injectee. If you're spam-injecting 4 people in a row around you though,
- //This gives the last one a 30% chance of infection.
- var/infect_chance = dirtiness //Start with dirtiness
- if(infect_chance <= 10 && (hash in targets)) //Extra fast uses on target is free
- infect_chance = 0
- infect_chance += (targets.len-1)*10 //Extra 10% per extra target
- if(prob(infect_chance))
- log_and_message_admins("[loc] infected [target]'s [eo.name] with \the [src].")
- infect_limb(eo)
-
- //75% chance to spread a virus if we have one
- if(LAZYLEN(viruses) && prob(75))
- var/old_hash = pick(viruses)
- if(hash != old_hash) //Same virus you already had?
- var/datum/disease2/disease/virus = viruses[old_hash]
- infect_virus2(target,virus.getcopy())
-
- if(!used)
- START_PROCESSING(SSobj, src)
-
-/obj/item/weapon/reagent_containers/syringe/proc/infect_limb(var/obj/item/organ/external/eo)
- src = null
- var/datum/weakref/limb_ref = WEAKREF(eo)
- spawn(rand(5 MINUTES,10 MINUTES))
- var/obj/item/organ/external/found_limb = limb_ref.resolve()
- if(istype(found_limb))
- eo.germ_level += INFECTION_LEVEL_ONE+30
-
-//Allow for capped syringe mode
-/obj/item/weapon/reagent_containers/syringe/attack_self(mob/user as mob)
- switch(mode)
- if(SYRINGE_CAPPED)
- mode = SYRINGE_DRAW
- to_chat(user,"You uncap the syringe. ")
- if(SYRINGE_DRAW)
- mode = SYRINGE_INJECT
- if(SYRINGE_INJECT)
- mode = SYRINGE_DRAW
- if(SYRINGE_BROKEN)
- return
- update_icon()
-
-//Allow for capped syringes
-/obj/item/weapon/reagent_containers/syringe/update_icon()
- cut_overlays()
-
- var/matrix/tf = matrix()
- if(isstorage(loc))
- tf.Turn(-90) //Vertical for storing compact-ly
- tf.Translate(-3,0) //Could do this with pixel_x but let's just update the appearance once.
- transform = tf
-
- if(mode == SYRINGE_BROKEN)
- icon_state = "broken"
- return
-
- if(mode == SYRINGE_CAPPED)
- icon_state = "capped"
- return
-
- var/rounded_vol = round(reagents.total_volume, round(reagents.maximum_volume / 3))
- if(reagents.total_volume)
- filling = image(icon, src, "filler[rounded_vol]")
- filling.color = reagents.get_color()
- add_overlay(filling)
-
- if(ismob(loc))
- var/injoverlay
- switch(mode)
- if (SYRINGE_DRAW)
- injoverlay = "draw"
- if (SYRINGE_INJECT)
- injoverlay = "inject"
- add_overlay(injoverlay)
-
- icon_state = "[rounded_vol]"
- item_state = "syringe_[rounded_vol]"
-
-#undef SYRINGE_CAPPED
diff --git a/code/modules/reagents/reagents/core.dm b/code/modules/reagents/reagents/core.dm
index 0d803b63d3..c0d0d2dd8e 100644
--- a/code/modules/reagents/reagents/core.dm
+++ b/code/modules/reagents/reagents/core.dm
@@ -156,6 +156,7 @@
..()
#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L)
+
/datum/reagent/water
name = "Water"
id = "water"
@@ -250,6 +251,8 @@
..()
//VOREStation Edit End,
+#undef WATER_LATENT_HEAT
+
/datum/reagent/fuel
name = "Welding fuel"
id = "fuel"
diff --git a/code/modules/reagents/reagents/dispenser.dm b/code/modules/reagents/reagents/dispenser.dm
index 4942567dc0..34440009ff 100644
--- a/code/modules/reagents/reagents/dispenser.dm
+++ b/code/modules/reagents/reagents/dispenser.dm
@@ -113,7 +113,7 @@
if(issmall(M))
removed *= 2
- var/strength_mod = 3 * M.species.chem_strength_alcohol //Alcohol is 3x stronger when injected into the veins.
+ var/strength_mod = 3 //Alcohol is 3x stronger when injected into the veins.
if(!strength_mod)
return
@@ -121,19 +121,19 @@
M.add_chemical_effect(CE_ALCOHOL, 1)
var/effective_dose = dose * strength_mod * (1 + volume/60) //drinking a LOT will make you go down faster
- if(effective_dose >= strength) // Early warning
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol)) // Early warning
M.make_dizzy(18) // It is decreased at the speed of 3 per tick
- if(effective_dose >= strength * 2) // Slurring
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 2) // Slurring
M.slurring = max(M.slurring, 90)
- if(effective_dose >= strength * 3) // Confusion - walking in random directions
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 3) // Confusion - walking in random directions
M.Confuse(60)
- if(effective_dose >= strength * 4) // Blurry vision
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 4) // Blurry vision
M.eye_blurry = max(M.eye_blurry, 30)
- if(effective_dose >= strength * 5) // Drowsyness - periodically falling asleep
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 5) // Drowsyness - periodically falling asleep
M.drowsyness = max(M.drowsyness, 60)
- if(effective_dose >= strength * 6) // Toxic dose
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 6) // Toxic dose
M.add_chemical_effect(CE_ALCOHOL_TOXIC, toxicity*3)
- if(effective_dose >= strength * 7) // Pass out
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 7) // Pass out
M.Paralyse(60)
M.Sleeping(90)
@@ -160,26 +160,26 @@
if(M.isSynthetic() && M.nutrition < 500 && M.species.robo_ethanol_proc)
M.adjust_nutrition(round(max(0,ep_base_power - strength) * removed)/ep_final_mod) //the stronger it is, the more juice you gain
- var/effective_dose = dose * M.species.chem_strength_alcohol
+ var/effective_dose = dose
if(!effective_dose)
return
if(M.species.robo_ethanol_drunk || !(M.isSynthetic()))
M.add_chemical_effect(CE_ALCOHOL, 1)
- if(effective_dose >= strength) // Early warning
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol)) // Early warning
M.make_dizzy(6) // It is decreased at the speed of 3 per tick
- if(effective_dose >= strength * 2) // Slurring
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 2) // Slurring
M.slurring = max(M.slurring, 30)
- if(effective_dose >= strength * 3) // Confusion - walking in random directions
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 3) // Confusion - walking in random directions
M.Confuse(20)
- if(effective_dose >= strength * 4) // Blurry vision
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 4) // Blurry vision
M.eye_blurry = max(M.eye_blurry, 10)
- if(effective_dose >= strength * 5) // Drowsyness - periodically falling asleep
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 5) // Drowsyness - periodically falling asleep
M.drowsyness = max(M.drowsyness, 20)
- if(effective_dose >= strength * 6) // Toxic dose
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 6) // Toxic dose
M.add_chemical_effect(CE_ALCOHOL_TOXIC, toxicity)
- if(effective_dose >= strength * 7) // Pass out
+ if(effective_dose >= (strength * M.species.chem_strength_alcohol) * 7) // Pass out
M.Paralyse(20)
M.Sleeping(30)
diff --git a/code/modules/reagents/reagents/vore_vr.dm b/code/modules/reagents/reagents/vore_vr.dm
index 42e3906562..4b56d19fc9 100644
--- a/code/modules/reagents/reagents/vore_vr.dm
+++ b/code/modules/reagents/reagents/vore_vr.dm
@@ -186,3 +186,59 @@
H.change_gender_identity(PLURAL)
H.visible_message("[H] suddenly twitches as some of their features seem to contort and reshape, adjusting... In the end, it seems they are now of mixed gender. ",
"Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became of mixed gender. ")
+
+
+////////////////////////// Misc Drugs //////////////////////////
+
+/datum/reagent/drugs/rainbow_toxin /// Replaces Space Drugs.
+ name = "Rainbow Toxin"
+ id = "rainbowtoxin"
+ description = "Known for providing a euphoric high, this psychoactive drug is often injected into unknowing prey by serpents and other fanged beasts. Highly valuable and frequently sought after by hypno-enthusiasts and party-goers."
+ taste_description = "mixed euphoria"
+ taste_mult = 0.8 //You ARE going to taste this!
+ scannable = 1 //Sure! If you manage to milk a snake for some of this, go ahead and scan it and mass produce it. Your local club will love you!
+
+/datum/reagent/drugs/rainbow_toxin/affect_blood(mob/living/carbon/M, var/alien, var/removed)
+ ..()
+ var/drug_strength = 20
+ M.druggy = max(M.druggy, drug_strength)
+
+/datum/reagent/drugs/bliss/overdose(var/mob/living/M as mob)
+ if(prob_proc == TRUE && prob(20))
+ M.hallucination = max(M.hallucination, 5)
+ prob_proc = FALSE
+ M.adjustBrainLoss(0.25*REM) //Too much isn't good for your long term health...
+ M.adjustToxLoss(0.01*REM) //Enough that it'll make your HUD dummy update, but not enough that you'll vomit mid scene. (Sorry emetophiliacs!)
+ ..()
+
+/datum/reagent/paralysis_toxin
+ name = "Tetrodotoxin"
+ id = "paralysistoxin"
+ description = "A potent toxin commonly found in a plethora of species. When exposed to the toxin, causes extreme, paralysis for a prolonged period, with only essential functions of the body being unhindered. Commonly used by covert operatives and used as a crowd control tool."
+ taste_description = "bitterness"
+ reagent_state = LIQUID
+ color = "#37007f"
+ metabolism = REM * 0.25
+ overdose = REAGENTS_OVERDOSE
+ scannable = 0 //YOU ARE NOT SCANNING THE FUNNY PARALYSIS TOXIN. NO. BAD. STAY AWAY.
+
+/datum/reagent/paralysis_toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(M.weakened < 50) //Let's not leave them PERMA stuck, after all.
+ M.AdjustWeakened(5) //Stand in for paralyze so you can still talk/emote/see
+
+/datum/reagent/pain_enzyme
+ name = "Pain Enzyme"
+ id = "painenzyme"
+ description = "An enzyme found in a variety of species. When exposed to the toxin, will cause severe, agonizing pain. The effects can last for hours depending on the dose. Only known cure is an equally strong painkiller or dialysis."
+ taste_description = "sourness"
+ reagent_state = LIQUID
+ color = "#04b8fa" //Light blue in honor of Perry.
+ metabolism = 0.1 //Lasts up to 50 seconds if you give 5 units.
+ mrate_static = TRUE
+ overdose = 100 //There is no OD. You already are taking the worst of it.
+ scannable = 0 //Let's not have medical mechs able to make an extremely strong 'I hit you you fall down in agony' chem.
+
+/datum/reagent/pain_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.add_chemical_effect(CE_PAINKILLER, -200)
+ if(prob(0.01)) //1 in 10000 chance per tick. Extremely rare.
+ to_chat(M,"Your body feels as though it's on fire! ")
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index e8c31672b1..6075e3e715 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -196,6 +196,10 @@
if((. = ..()))
update()
+#undef OFF
+#undef FORWARDS
+#undef BACKWARDS
+
// the conveyor control switch
//
//
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 8eff337f57..5bc3241e00 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -1265,7 +1265,7 @@
/obj/structure/disposalpipe/tagger/New()
. = ..()
dpdir = dir | turn(dir, 180)
- if(sort_tag) GLOB.tagger_locations |= sort_tag
+ if(sort_tag) GLOB.tagger_locations |= list("[sort_tag]" = get_z(src))
updatename()
updatedesc()
update()
@@ -1331,7 +1331,7 @@
/obj/structure/disposalpipe/sortjunction/New()
. = ..()
- if(sortType) GLOB.tagger_locations |= sortType
+ if(sortType) GLOB.tagger_locations |= list("[sortType]" = get_z(src))
updatedir()
updatename()
@@ -1646,3 +1646,7 @@
dirs = alldirs.Copy()
src.streak(dirs)
+
+#undef SEND_PRESSURE
+#undef PRESSURE_TANK_VOLUME
+#undef PUMP_MAX_FLOW_RATE
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index b8b091444e..a341e07336 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -348,11 +348,23 @@
ui = new(user, src, "DestinationTagger", name)
ui.open()
+/obj/item/device/destTagger/tgui_static_data(mob/user)
+ var/list/data = ..()
+ var/list/taggers = list()
+ var/list/tagger_levels = list()
+ for(var/tag in GLOB.tagger_locations)
+ var/z_level = GLOB.tagger_locations[tag]
+ taggers += list(list("tag" = tag, "level" = z_level))
+ tagger_levels += list(list("z" = z_level, "location" = using_map.get_zlevel_name(z_level)))
+ data["taggerLevels"] = tagger_levels
+ data["taggerLocs"] = taggers
+
+ return data
+
/obj/item/device/destTagger/tgui_data(mob/user, datum/tgui/ui)
var/list/data = ..()
data["currTag"] = currTag
- data["taggerLocs"] = GLOB.tagger_locations
return data
diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm
index 294992f9e4..20a9c682e3 100644
--- a/code/modules/resleeving/designer.dm
+++ b/code/modules/resleeving/designer.dm
@@ -454,3 +454,9 @@
new /obj/item/weapon/disk/body_record(src)
#undef MOB_HEX_COLOR
+
+#undef MENU_MAIN
+#undef MENU_BODYRECORDS
+#undef MENU_STOCKRECORDS
+#undef MENU_SPECIFICRECORD
+#undef MENU_OOCNOTES
diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm
index 66ea0637cf..5287c55dff 100644
--- a/code/modules/scripting/Interpreter/Interpreter.dm
+++ b/code/modules/scripting/Interpreter/Interpreter.dm
@@ -307,3 +307,6 @@ S - The scope the variable resides in. If it is null, a scope with the varia
//TODO: check for invalid name
S.variables["[name]"] = value
+#undef RETURNING
+#undef BREAKING
+#undef CONTINUING
diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm
index 1e25c9be69..480b73f5a9 100644
--- a/code/modules/scripting/Parser/Expressions.dm
+++ b/code/modules/scripting/Parser/Expressions.dm
@@ -308,3 +308,8 @@ See Also:
*/
/n_Parser/nS_Parser/proc/ParseParamExpression()
return ParseExpression(list(",", ")"))
+
+#undef OPERATOR
+#undef VALUE
+#undef SHIFT
+#undef REDUCE
diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm
index be391bddde..915540257b 100644
--- a/code/modules/scripting/Scanner/Scanner.dm
+++ b/code/modules/scripting/Scanner/Scanner.dm
@@ -271,3 +271,4 @@ Reads a comment and outputs the type of comment
if(comm == 2)
errors+=new/scriptError/UnterminatedComment()
+#undef COL
diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm
index 7490887c20..aa966b582a 100644
--- a/code/modules/shuttles/escape_pods.dm
+++ b/code/modules/shuttles/escape_pods.dm
@@ -55,9 +55,9 @@
. = list(
"docking_status" = docking_program.get_docking_status(),
"override_enabled" = docking_program.override_enabled,
- "exterior_status" = docking_program.memory["door_status"],
- "can_force" = pod.can_force() || (emergency_shuttle.departed && pod.can_launch()), //allow players to manually launch ahead of time if the shuttle leaves
- "armed" = pod.arming_controller.armed,
+ "exterior_status" = docking_program.memory["door_status"], // TGUI DATA fails silently when there's no linked pod, leading to UI crashes
+ "can_force" = pod?.can_force() || (emergency_shuttle.departed && pod?.can_launch()), //allow players to manually launch ahead of time if the shuttle leaves
+ "armed" = pod?.arming_controller.armed,
"internalTemplateName" = "EscapePodConsole",
)
diff --git a/code/modules/stockmarket/events.dm b/code/modules/stockmarket/events.dm
index 8b6d2c8e70..0b4b595740 100644
--- a/code/modules/stockmarket/events.dm
+++ b/code/modules/stockmarket/events.dm
@@ -230,4 +230,6 @@
else
article += "[tname] has a prior history of similar misdeeds and we're confident the charges will stand. For investors, now would be an ideal time to %sell%"
A.article = A.detokenize(article, company.industry.tokens)
- return A
\ No newline at end of file
+ return A
+
+#undef TIME_MULTIPLIER
diff --git a/code/modules/tgui/modules/admin/player_notes.dm b/code/modules/tgui/modules/admin/player_notes.dm
index 6f20bdc11d..38555479e9 100644
--- a/code/modules/tgui/modules/admin/player_notes.dm
+++ b/code/modules/tgui/modules/admin/player_notes.dm
@@ -329,3 +329,5 @@
if("filter")
PlayerNotesFilterLegacy()
return
+
+#undef PLAYER_NOTES_ENTRIES_PER_PAGE
diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm
index e55296c902..9eeb4de664 100644
--- a/code/modules/tgui/modules/appearance_changer.dm
+++ b/code/modules/tgui/modules/appearance_changer.dm
@@ -1,4 +1,3 @@
-
/datum/tgui_module/appearance_changer
name = "Appearance Editor"
tgui_id = "AppearanceChanger"
@@ -63,6 +62,9 @@
cam_background.del_on_map_removal = FALSE
update_active_camera_screen()
+ if(customize_usr)
+ if(ishuman(usr))
+ H = usr
owner = H
if(owner)
owner.AddComponent(/datum/component/recursive_move)
@@ -184,8 +186,8 @@
instance = null
if(!istype(instance) && !params["clear"])
return FALSE
- owner.ear_style = instance
- owner.update_hair()
+ target.ear_style = instance
+ target.update_hair()
update_dna()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE)
return TRUE
@@ -197,7 +199,7 @@
target.g_ears = hex2num(copytext(new_hair, 4, 6))
target.b_ears = hex2num(copytext(new_hair, 6, 8))
update_dna()
- owner.update_hair()
+ target.update_hair()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("ears2_color")
@@ -208,7 +210,7 @@
target.g_ears2 = hex2num(copytext(new_hair, 4, 6))
target.b_ears2 = hex2num(copytext(new_hair, 6, 8))
update_dna()
- owner.update_hair()
+ target.update_hair()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("tail")
@@ -218,8 +220,8 @@
instance = null
if(!istype(instance) && !params["clear"])
return FALSE
- owner.tail_style = instance
- owner.update_tail_showing()
+ target.tail_style = instance
+ target.update_tail_showing()
update_dna()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE)
return TRUE
@@ -231,7 +233,7 @@
target.g_tail = hex2num(copytext(new_hair, 4, 6))
target.b_tail = hex2num(copytext(new_hair, 6, 8))
update_dna()
- owner.update_tail_showing()
+ target.update_tail_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("tail2_color")
@@ -242,7 +244,7 @@
target.g_tail2 = hex2num(copytext(new_hair, 4, 6))
target.b_tail2 = hex2num(copytext(new_hair, 6, 8))
update_dna()
- owner.update_tail_showing()
+ target.update_tail_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("wing")
@@ -252,8 +254,8 @@
instance = null
if(!istype(instance) && !params["clear"])
return FALSE
- owner.wing_style = instance
- owner.update_wing_showing()
+ target.wing_style = instance
+ target.update_wing_showing()
update_dna()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE)
return TRUE
@@ -265,7 +267,7 @@
target.g_wing = hex2num(copytext(new_hair, 4, 6))
target.b_wing = hex2num(copytext(new_hair, 6, 8))
update_dna()
- owner.update_wing_showing()
+ target.update_wing_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("wing2_color")
@@ -276,7 +278,7 @@
target.g_wing2 = hex2num(copytext(new_hair, 4, 6))
target.b_wing2 = hex2num(copytext(new_hair, 6, 8))
update_dna()
- owner.update_wing_showing()
+ target.update_wing_showing()
changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR)
return 1
if("marking")
diff --git a/code/modules/tgui/modules/communications.dm b/code/modules/tgui/modules/communications.dm
index 6a726aae9c..ab1a5755e4 100644
--- a/code/modules/tgui/modules/communications.dm
+++ b/code/modules/tgui/modules/communications.dm
@@ -485,3 +485,14 @@
if(M.stat == 0)
return 1
return 0
+
+#undef COMM_SCREEN_MAIN
+#undef COMM_SCREEN_STAT
+#undef COMM_SCREEN_MESSAGES
+
+#undef COMM_AUTHENTICATION_NONE
+#undef COMM_AUTHENTICATION_MIN
+#undef COMM_AUTHENTICATION_MAX
+
+#undef COMM_MSGLEN_MINIMUM
+#undef COMM_CCMSGLEN_MINIMUM
diff --git a/code/modules/tgui/modules/rcon.dm b/code/modules/tgui/modules/rcon.dm
index 0a29153d76..7f1f0822a9 100644
--- a/code/modules/tgui/modules/rcon.dm
+++ b/code/modules/tgui/modules/rcon.dm
@@ -13,7 +13,7 @@
var/number_pages = 0
/datum/tgui_module/rcon/proc/filter_smeslist(var/page)
- number_pages = known_SMESs.len / SMES_PER_PAGE
+ number_pages = known_SMESs.len / SMES_PER_PAGE
if(number_pages != round(number_pages))
number_pages = round(number_pages) + 1
@@ -136,7 +136,9 @@
/datum/tgui_module/rcon/ntos
ntos = TRUE
-
+
/datum/tgui_module/rcon/robot
/datum/tgui_module/rcon/robot/tgui_state(mob/user)
- return GLOB.tgui_self_state
\ No newline at end of file
+ return GLOB.tgui_self_state
+
+#undef SMES_PER_PAGE
diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm
index efb640f25f..e9f6429f25 100644
--- a/code/modules/tgui_panel/tgui_panel.dm
+++ b/code/modules/tgui_panel/tgui_panel.dm
@@ -54,6 +54,7 @@
// Other setup
request_telemetry()
addtimer(CALLBACK(src, PROC_REF(on_initialize_timed_out)), 5 SECONDS)
+ window.send_message("testTelemetryCommand")
/**
* private
diff --git a/code/modules/virus2/diseasesplicer.dm b/code/modules/virus2/diseasesplicer.dm
index afc875a76e..cdb7948bdd 100644
--- a/code/modules/virus2/diseasesplicer.dm
+++ b/code/modules/virus2/diseasesplicer.dm
@@ -82,7 +82,7 @@
if(dish.growth >= 50)
var/list/effects[0]
for (var/datum/disease2/effectholder/e in dish.virus2.effects)
- effects.Add(list(list("name" = (dish.analysed ? e.effect.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]")))
+ effects.Add(list(list("name" = (dish.analysed ? e.effect.name : "Unknown"), "stage" = (e.stage), "reference" = "\ref[e]"), "badness" = e.effect.badness))
data["effects"] = effects
else
data["info"] = "Insufficient cell growth for gene splicing."
@@ -191,4 +191,3 @@
if("disk")
burning = 10
. = TRUE
-
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 21602a1c27..23b0796789 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -8,6 +8,12 @@
//
// Parent type of all the various "belly" varieties.
//
+
+#define DM_FLAG_VORESPRITE_TAIL 0x2
+#define DM_FLAG_VORESPRITE_MARKING 0x4
+#define DM_FLAG_VORESPRITE_ARTICLE 0x8
+
+
/obj/belly
name = "belly" // Name of this location
desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
@@ -60,6 +66,30 @@
var/belly_item_mult = 1 //Multiplier for how filling items are in borg borg bellies. Items are also weighted on item size
var/belly_overall_mult = 1 //Multiplier applied ontop of any other specific multipliers
+
+ var/vore_sprite_flags = DM_FLAG_VORESPRITE_ARTICLE
+ var/tmp/static/list/vore_sprite_flag_list= list(
+ "Normal Belly Sprite" = DM_FLAG_VORESPRITE_ARTICLE,
+ //"Tail adjustment" = DM_FLAG_VORESPRITE_TAIL,
+ //"Marking addition" = DM_FLAG_VORESPRITE_MARKING
+ )
+ var/affects_vore_sprites = FALSE
+ var/count_absorbed_prey_for_sprite = TRUE
+ var/absorbed_multiplier = 1
+ var/count_liquid_for_sprite = FALSE
+ var/liquid_multiplier = 1
+ var/count_items_for_sprite = FALSE
+ var/item_multiplier = 1
+ var/health_impacts_size = TRUE
+ var/resist_triggers_animation = TRUE
+ var/size_factor_for_sprite = 1
+ var/belly_sprite_to_affect = "stomach"
+ var/datum/sprite_accessory/tail/tail_to_change_to = FALSE
+ var/tail_colouration = FALSE
+ var/tail_extra_overlay = FALSE
+ var/tail_extra_overlay2 = FALSE
+ var/undergarment_chosen = "Underwear, bottom"
+
// Generally just used by AI
var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location
var/autotransferwait = 10 // Time between trying to transfer.
@@ -345,6 +375,15 @@
"belly_item_mult",
"belly_overall_mult",
"drainmode",
+ "vore_sprite_flags",
+ "affects_vore_sprites",
+ "count_absorbed_prey_for_sprite",
+ "resist_triggers_animation",
+ "size_factor_for_sprite",
+ "belly_sprite_to_affect",
+ "health_impacts_size",
+ "count_items_for_sprite",
+ "item_multiplier"
)
if (save_digest_mode == 1)
@@ -426,6 +465,10 @@
if(M.ai_holder)
M.ai_holder.handle_eaten()
+ if (istype(owner, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hum = owner
+ hum.update_fullness()
+
// Intended for simple mobs
if(!owner.client && autotransferlocation && autotransferchance > 0)
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/belly, check_autotransfer), thing, autotransferlocation), autotransferwait)
@@ -444,6 +487,10 @@
L.toggle_hud_vis()
if((L.stat != DEAD) && L.ai_holder)
L.ai_holder.go_wake()
+ if (istype(owner, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hum = owner
+ hum.update_fullness()
+
/obj/belly/proc/vore_fx(mob/living/L)
if(!istype(L))
@@ -1757,6 +1804,15 @@
dupe.belly_mob_mult = belly_mob_mult
dupe.belly_item_mult = belly_item_mult
dupe.belly_overall_mult = belly_overall_mult
+ dupe.vore_sprite_flags = vore_sprite_flags
+ dupe.affects_vore_sprites = affects_vore_sprites
+ dupe.count_absorbed_prey_for_sprite = count_absorbed_prey_for_sprite
+ dupe.resist_triggers_animation = resist_triggers_animation
+ dupe.size_factor_for_sprite = size_factor_for_sprite
+ dupe.belly_sprite_to_affect = belly_sprite_to_affect
+ dupe.health_impacts_size = health_impacts_size
+ dupe.count_items_for_sprite = count_items_for_sprite
+ dupe.item_multiplier = item_multiplier
//// Object-holding variables
//struggle_messages_outside - strings
@@ -1955,3 +2011,38 @@
/obj/belly/container_resist(mob/M)
return relay_resist(M)
+
+/obj/belly/proc/GetFullnessFromBelly()
+ if(!affects_vore_sprites)
+ return 0
+ var/belly_fullness = 0
+ for(var/mob/living/M in src)
+ if(count_absorbed_prey_for_sprite || !M.absorbed)
+ var/fullness_to_add = M.size_multiplier
+ fullness_to_add *= M.mob_size / 20
+ if(M.absorbed)
+ fullness_to_add *= absorbed_multiplier
+ if(health_impacts_size)
+ fullness_to_add *= M.health / M.getMaxHealth()
+ belly_fullness += fullness_to_add
+ if(count_liquid_for_sprite)
+ belly_fullness += (reagents.total_volume / 100) * liquid_multiplier
+ if(count_items_for_sprite)
+ for(var/obj/item/I in src)
+ var/fullness_to_add = 0
+ if(I.w_class == ITEMSIZE_TINY)
+ fullness_to_add = ITEMSIZE_COST_TINY
+ else if(I.w_class == ITEMSIZE_SMALL)
+ fullness_to_add = ITEMSIZE_COST_SMALL
+ else if(I.w_class == ITEMSIZE_NORMAL)
+ fullness_to_add = ITEMSIZE_COST_NORMAL
+ else if(I.w_class == ITEMSIZE_LARGE)
+ fullness_to_add = ITEMSIZE_COST_LARGE
+ else if(I.w_class == ITEMSIZE_HUGE)
+ fullness_to_add = ITEMSIZE_COST_HUGE
+ else
+ fullness_to_add = ITEMSIZE_COST_NO_CONTAINER
+ fullness_to_add /= 32
+ belly_fullness += fullness_to_add * item_multiplier
+ belly_fullness *= size_factor_for_sprite
+ return belly_fullness
diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm
index b372dc2ce9..9c49d8f93f 100644
--- a/code/modules/vore/eating/bellymodes_datum_vr.dm
+++ b/code/modules/vore/eating/bellymodes_datum_vr.dm
@@ -35,6 +35,10 @@ GLOBAL_LIST_INIT(digest_modes, list())
else
SEND_SOUND(L, sound(get_sfx("fancy_death_prey")))
B.handle_digestion_death(L)
+ if(!L)
+ if (istype(B.owner, /mob/living/carbon/human))
+ var/mob/living/carbon/human/howner = B.owner
+ howner.update_fullness()
if(!B.fancy_vore)
return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("classic_death_sounds")))
return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("fancy_death_pred")))
@@ -61,6 +65,11 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
var/difference = B.owner.size_multiplier / L.size_multiplier
+ if(B.health_impacts_size)
+ if (istype(B.owner, /mob/living/carbon/human))
+ var/mob/living/carbon/human/howner = B.owner
+ howner.update_fullness()
+
consider_healthbar(L, old_health, B.owner)
if(isrobot(B.owner))
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 1979fc925c..186f1ec215 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -11,7 +11,7 @@
P.id = null
for(var/mob/living/voice/V in possessed_voice) // Delete voices.
- V.Destroy() //Destroy the voice.
+ qdel(V)
for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion
M.forceMove(item_storage)
for(var/obj/item/O in contents)
@@ -44,7 +44,7 @@
if(P.id)
P.id = null
for(var/mob/living/voice/V in possessed_voice) // Delete voices.
- V.Destroy() //Destroy the voice.
+ qdel(V)
for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion
M.forceMove(item_storage)
for(var/obj/item/O in contents)
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index f4bf873316..9e78aebd3d 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -34,6 +34,10 @@
'sound/effects/mob_effects/xenochimera/regen_5.ogg'
)
var/trash_catching = FALSE //Toggle for trash throw vore from chompstation
+ var/list/trait_injection_reagents = list() //List of all the reagents allowed to be used for injection via venom bite
+ var/trait_injection_selected = null //RSEdit: What trait reagent you're injecting.
+ var/trait_injection_amount = 5 //RSEdit: How much you're injecting with traits.
+ var/trait_injection_verb = "bites" //RSEdit: Which fluffy manner you're doing the injecting.
//
// Hook for generic creation of stuff on new creatures
@@ -256,6 +260,8 @@
P.weight_message_visible = src.weight_message_visible
P.weight_messages = src.weight_messages
+ P.vore_sprite_color = istype(src, /mob/living/carbon/human) ? src:vore_sprite_color : null
+
var/list/serialized = list()
for(var/obj/belly/B as anything in src.vore_organs)
serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks.
@@ -306,6 +312,10 @@
weight_message_visible = P.weight_message_visible
weight_messages = P.weight_messages
+
+ if (istype(src, /mob/living/carbon/human))
+ src:vore_sprite_color = P.vore_sprite_color
+
if(bellies)
if(isliving(src))
var/mob/living/L = src
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 7888cdb010..d7fe76ed5a 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -69,6 +69,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/step_mechanics_pref = FALSE
var/pickup_pref = TRUE
+ var/vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
+
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
var/vore_smell = "nothing in particular"
@@ -193,6 +195,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
weight_message_visible = json_from_file["weight_message_visible"]
weight_messages = json_from_file["weight_messages"]
eating_privacy_global = json_from_file["eating_privacy_global"]
+ vore_sprite_color = json_from_file["vore_sprite_color"]
//Quick sanitize
if(isnull(digestable))
@@ -279,7 +282,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
else if(weight_messages.len < 10)
while(weight_messages.len < 10)
weight_messages.Add("")
-
+ if(isnull(vore_sprite_color))
+ vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
return TRUE
/datum/vore_preferences/proc/save_vore()
@@ -320,6 +324,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"weight_message_visible" = weight_message_visible,
"weight_messages" = weight_messages,
"eating_privacy_global" = eating_privacy_global,
+ "vore_sprite_color" = vore_sprite_color,
)
//List to JSON
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index bb59b7c7ad..d2286f78b5 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -227,7 +227,23 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"belly_item_mult" = selected.belly_item_mult,
"belly_overall_mult" = selected.belly_overall_mult,
"drainmode" = selected.drainmode,
-
+ "affects_voresprite" = selected.affects_vore_sprites,
+ "absorbed_voresprite" = selected.count_absorbed_prey_for_sprite,
+ "absorbed_multiplier" = selected.absorbed_multiplier,
+ "liquid_voresprite" = selected.count_liquid_for_sprite,
+ "liquid_multiplier" = selected.liquid_multiplier,
+ "item_voresprite" = selected.count_items_for_sprite,
+ "item_multiplier" = selected.item_multiplier,
+ "health_voresprite" = selected.health_impacts_size,
+ "resist_animation" = selected.resist_triggers_animation,
+ "voresprite_size_factor" = selected.size_factor_for_sprite,
+ "belly_sprite_to_affect" = selected.belly_sprite_to_affect,
+ "belly_sprite_option_shown" = istype(host, /mob/living/carbon/human) ? (LAZYLEN(host:vore_icon_bellies) >= 1 ? TRUE : FALSE) : FALSE, // TODO: FIX THIS (It won't be fixed)
+ "tail_option_shown" = istype(host, /mob/living/carbon/human),
+ "tail_to_change_to" = selected.tail_to_change_to,
+ "tail_colouration" = selected.tail_colouration,
+ "tail_extra_overlay" = selected.tail_extra_overlay,
+ "tail_extra_overlay2" = selected.tail_extra_overlay2
)
var/list/addons = list()
@@ -236,6 +252,13 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
addons.Add(flag_name)
selected_list["addons"] = addons
+ var/list/vs_flags = list()
+ for(var/flag_name in selected.vore_sprite_flag_list)
+ if(selected.vore_sprite_flags & selected.vore_sprite_flag_list[flag_name])
+ vs_flags.Add(flag_name)
+ selected_list["vore_sprite_flags"] = vs_flags
+
+
selected_list["egg_type"] = selected.egg_type
selected_list["contaminates"] = selected.contaminates
selected_list["contaminate_flavor"] = null
@@ -609,6 +632,20 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
host.weight_message_visible = !host.weight_message_visible
unsaved_changes = TRUE
return TRUE
+ if("set_vs_color")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/belly_choice = tgui_input_list(usr, "Which vore sprite are you going to edit the color of?", "Vore Sprite Color", hhost.vore_icon_bellies)
+ var/newcolor = input(usr, "Choose a color.", "", hhost.vore_sprite_color[belly_choice]) as color|null
+ if(newcolor)
+ hhost.vore_sprite_color[belly_choice] = newcolor
+ var/multiply = tgui_input_list(usr, "Set the color to be applied multiplicatively or additively? Currently in [hhost.vore_sprite_multiply[belly_choice] ? "Multiply" : "Add"]", "Vore Sprite Color", list("Multiply", "Add"))
+ if(multiply == "Multiply")
+ hhost.vore_sprite_multiply[belly_choice] = TRUE
+ else if(multiply == "Add")
+ hhost.vore_sprite_multiply[belly_choice] = FALSE
+ hhost.update_icons_body()
+ return TRUE
/datum/vore_look/proc/pick_from_inside(mob/user, params)
var/atom/movable/target = locate(params["pick"])
@@ -1680,6 +1717,98 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
qdel(host.vore_selected)
host.vore_selected = host.vore_organs[1]
. = TRUE
-
+ if("b_belly_sprite_to_affect")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/belly_choice = tgui_input_list(usr, "Which belly sprite do you want your [lowertext(hhost.vore_selected.name)] to affect?","Select Region", hhost.vore_icon_bellies)
+ if(!belly_choice) //They cancelled, no changes
+ return FALSE
+ else
+ hhost.vore_selected.belly_sprite_to_affect = belly_choice
+ hhost.update_fullness()
+ . = TRUE
+ if("b_affects_vore_sprites")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ hhost.vore_selected.affects_vore_sprites = !hhost.vore_selected.affects_vore_sprites
+ hhost.update_fullness()
+ . = TRUE
+ if("b_count_absorbed_prey_for_sprites")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ hhost.vore_selected.count_absorbed_prey_for_sprite = !hhost.vore_selected.count_absorbed_prey_for_sprite
+ hhost.update_fullness()
+ . = TRUE
+ if("b_absorbed_multiplier")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/absorbed_multiplier_input = input(user, "Set the impact absorbed prey's size have on your vore sprite. 1 means no scaling, 0.5 means absorbed prey count half as much, 2 means absorbed prey count double. (Range from 0.1 - 3)", "Absorbed Multiplier") as num|null
+ if(!isnull(absorbed_multiplier_input))
+ hhost.vore_selected.absorbed_multiplier = CLAMP(absorbed_multiplier_input, 0.1, 3)
+ hhost.update_fullness()
+ . = TRUE
+ if("b_count_items_for_sprites")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ hhost.vore_selected.count_items_for_sprite = !hhost.vore_selected.count_items_for_sprite
+ hhost.update_fullness()
+ . = TRUE
+ if("b_item_multiplier")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/item_multiplier_input = input(user, "Set the impact items will have on your vore sprite. 1 means a belly with 8 normal-sized items will count as 1 normal sized prey-thing's worth, 0.5 means items count half as much, 2 means items count double. (Range from 0.1 - 10)", "Item Multiplier") as num|null
+ if(!isnull(item_multiplier_input))
+ hhost.vore_selected.item_multiplier = CLAMP(item_multiplier_input, 0.1, 10)
+ hhost.update_fullness()
+ . = TRUE
+ if("b_health_impacts_size")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ hhost.vore_selected.health_impacts_size = !hhost.vore_selected.health_impacts_size
+ hhost.update_fullness()
+ . = TRUE
+ if("b_resist_animation")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ hhost.vore_selected.resist_triggers_animation = !hhost.vore_selected.resist_triggers_animation
+ . = TRUE
+ if("b_size_factor_sprites")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/size_factor_input = input(user, "Set the impact all belly content's collective size has on your vore sprite. 1 means no scaling, 0.5 means content counts half as much, 2 means contents count double. (Range from 0.1 - 3)", "Size Factor") as num|null
+ if(!isnull(size_factor_input))
+ hhost.vore_selected.size_factor_for_sprite = CLAMP(size_factor_input, 0.1, 3)
+ hhost.update_fullness()
+ . = TRUE
+ if("b_tail_to_change_to")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/tail_choice = tgui_input_list(usr, "Which tail sprite do you want to use when your [lowertext(host.vore_selected.name)] is filled?","Select Sprite", global.tail_styles_list)
+ if(!tail_choice) //They cancelled, no changes
+ return FALSE
+ else
+ hhost.vore_selected.tail_to_change_to = tail_choice
+ . = TRUE
+ if("b_tail_color")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/newcolor = input(usr, "Choose tail color.", "", hhost.vore_selected.tail_colouration) as color|null
+ if(newcolor)
+ hhost.vore_selected.tail_colouration = newcolor
+ . = TRUE
+ if("b_tail_color2")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/newcolor = input(usr, "Choose tail secondary color.", "", hhost.vore_selected.tail_extra_overlay) as color|null
+ if(newcolor)
+ hhost.vore_selected.tail_extra_overlay = newcolor
+ . = TRUE
+ if("b_tail_color3")
+ if (istype(host, /mob/living/carbon/human))
+ var/mob/living/carbon/human/hhost = host
+ var/newcolor = input(usr, "Choose tail tertiary color.", "", hhost.vore_selected.tail_extra_overlay2) as color|null
+ if(newcolor)
+ hhost.vore_selected.tail_extra_overlay2 = newcolor
+ . = TRUE
if(.)
unsaved_changes = TRUE
diff --git a/code/modules/vore/persist/persist_vr.dm b/code/modules/vore/persist/persist_vr.dm
index 69113596fe..67bb1103c0 100644
--- a/code/modules/vore/persist/persist_vr.dm
+++ b/code/modules/vore/persist/persist_vr.dm
@@ -218,6 +218,9 @@
var/obj/item/device/nif/nif = H.nif
+ if(nif && H.ckey != nif.owner_key)
+ return
+
//If they have one, and if it's not installing without an owner, because
//Someone who joins and immediately leaves again (wrong job choice, maybe)
//should keep it even though it was probably doing the quick-calibrate, and their
diff --git a/code/modules/vore/resizing/crackers.dm b/code/modules/vore/resizing/crackers.dm
new file mode 100644
index 0000000000..b88a87cb2a
--- /dev/null
+++ b/code/modules/vore/resizing/crackers.dm
@@ -0,0 +1,177 @@
+//A bluespace cracker item that can be pulled between two characters.
+//The winner of the pull has an effect applied to them.
+//Crackers do already exist, but these ones are a more memey scene item.
+
+/obj/item/weapon/cracker
+ name = "bluespace cracker" //I have no idea why this was called shrink ray when this increased and decreased size.
+ desc = "A celebratory little game with a bluespace twist! Pull it between two people until it snaps, and the person who recieves the larger end gets a prize!"
+ icon = 'icons/obj/crackers.dmi'
+ icon_state = "blue"
+ item_icons = list(
+ slot_l_hand_str = 'icons/mob/items/lefthand_cracker.dmi',
+ slot_r_hand_str = 'icons/mob/items/righthand_cracker.dmi',
+ )
+ item_state = "blue"
+ var/rigged = 0 //So that they can be rigged by varedits to go one way or the other. positive values mean holder always wins, negative values mean target always wins.
+ var/list/prizes = list("shrinking","growing","drugged","invisibility","knocked over","teleport","wealth")
+ var/list/jokes = list(
+ "When is a boat just like snow? When it’s adrift.",
+ "What happens to naughty elves? Santa gives them the sack.",
+ "What do you call an old snowman? Water.",
+ "Why has Santa been banned from sooty chimneys? Carbon footprints.",
+ "What goes down but doesn't come up? A yo.",
+ "What's green and fuzzy, has four legs and would kill you if it fell from a tree? A pool table.",
+ "Why did the blind man fall into the well? Because he couldn't see that well.",
+ "What did the pirate get on his report card? Seven Cs",
+ "What do you call a fish with no eyes? Fsh",
+ "How do you make an egg roll? You push it.",
+ "What do you call a deer with no eyes? NO EYED DEER!",
+ "What's red, and smells like blue paint? Red paint.",
+ "Where do cows go to dance? A meat ball.",
+ "What do you call a person who steals all your toenail clippings? A cliptoemaniac.",
+ "What’s brown and sticky? A stick.",
+ "What's the best way to kill a circus? Go for the juggler.",
+ "What do you call a cow with no legs? Ground Beef.",
+ "Why'd the scarecrow win the Nobel prize? He was outstanding in his field.")
+
+/obj/item/weapon/cracker/attack(atom/A, mob/living/user, adjacent, params)
+ var/mob/living/carbon/human/target = A
+ if(!istype(target))
+ return
+ if(target.stat)
+ return
+ if(target == user)
+ to_chat(user, "You can't pull \the [src] by yourself, that would just be sad! ")
+ return
+ var/check_pull = tgui_alert(target, "\The [user] is offering to pull \the [src] with you, do you want to pull it?", "Pull Cracker", list("Yes", "No"))
+ if(check_pull == "No")
+ to_chat(user, "\The [target] chose not to pull \the [src]! ")
+ return
+ if(!adjacent)
+ to_chat(user, "\The [target] is not standing close enough to pull \the [src]! ")
+ return
+ var/prize = pick(prizes)
+ var/joke = pick(jokes)
+ var/mob/living/carbon/human/winner
+ var/mob/living/carbon/human/loser
+ if(!rigged)
+ if(prob(50))
+ winner = user
+ loser = target
+ else
+ winner = target
+ loser = user
+ else
+ if(rigged > 0)
+ winner = user
+ loser = target
+ else
+ winner = target
+ loser = user
+
+ var/spawnloc = get_turf(winner)
+
+ winner.visible_message("\The [winner] wins the cracker prize! ","You win the cracker prize! ")
+ if(prize == "shrinking")
+ winner.resize(0.25)
+ winner.visible_message("\The [winner] shrinks suddenly!")
+ if(prize == "growing")
+ winner.resize(2)
+ winner.visible_message("\The [winner] grows in height suddenly.")
+ if(prize == "drugged")
+ winner.druggy = max(winner.druggy, 50)
+ if(prize == "invisibility")
+ if(!winner.cloaked)
+ winner.visible_message("\The [winner] vanishes from sight.")
+ winner.cloak()
+ spawn(600)
+ if(winner.cloaked)
+ winner.uncloak()
+ winner.visible_message("\The [winner] appears as if from thin air.")
+ if(prize == "knocked over")
+ winner.visible_message("\The [winner] is suddenly knocked to the ground.")
+ winner.weakened = max(winner.weakened,50)
+ if(prize == "teleport")
+ if(loser.can_be_drop_pred && loser.vore_selected)
+ if(winner.devourable && winner.can_be_drop_prey)
+ winner.visible_message("\The [winner] is teleported to somewhere nearby...")
+ var/datum/effect/effect/system/spark_spread/spk
+ spk = new(winner)
+
+ var/T = get_turf(winner)
+ spk.set_up(5, 0, winner)
+ spk.attach(winner)
+ playsound(T, "sparks", 50, 1)
+ anim(T,winner,'icons/mob/mob.dmi',,"phaseout",,winner.dir)
+ winner.forceMove(loser.vore_selected)
+ if(prize == "wealth")
+ new /obj/random/cash/huge(spawnloc)
+ new /obj/random/cash/huge(spawnloc)
+ winner.visible_message("\The [winner] has a whole load of cash fall at their feet!")
+
+ playsound(user, 'sound/effects/snap.ogg', 50, 1)
+ user.drop_item(src)
+ new /obj/random/toy(spawnloc)
+ new /obj/item/clothing/head/paper_crown(spawnloc)
+ var/obj/item/weapon/paper/cracker_joke/J = new(spawnloc)
+ J.info = joke
+ qdel(src)
+
+/obj/item/weapon/cracker/Initialize()
+ var/list/styles = list("blue","green","yellow","red","heart","hazard")
+ var/style = pick(styles)
+ icon_state = style
+ item_state = style
+ ..()
+
+/obj/item/weapon/cracker/shrinking
+ name = "shrinking bluespace cracker"
+ prizes = list("shrinking")
+
+/obj/item/weapon/cracker/growing
+ name = "growing bluespace cracker"
+ prizes = list("growing")
+
+/obj/item/weapon/cracker/invisibility
+ name = "cloaking bluespace cracker"
+ prizes = list("invisibility")
+
+/obj/item/weapon/cracker/drugged
+ name = "psychedelic bluespace cracker"
+ prizes = list("drugged")
+
+/obj/item/weapon/cracker/knockover
+ name = "forceful bluespace cracker"
+ prizes = list("knocked over")
+
+/obj/item/weapon/cracker/vore
+ name = "teleporting bluespace cracker"
+ prizes = list("teleport")
+
+/obj/item/weapon/cracker/money
+ name = "fortuitous bluespace cracker"
+ prizes = list("wealth")
+
+/obj/item/clothing/head/paper_crown
+ name = "paper crown"
+ icon_state = "paper_crown_blue"
+ item_state = "paper_crown_blue"
+ item_icons = list(slot_head_str = 'icons/inventory/head/mob.dmi')
+ desc = "A paper crown so thin that you can see through it."
+ flags_inv = 0
+ body_parts_covered = 0
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
+/obj/item/clothing/head/paper_crown/Initialize()
+ var/list/styles = list("paper_crown_blue","paper_crown_green","paper_crown_yellow","paper_crown_red","paper_crown_pink")
+ var/style = pick(styles)
+ icon_state = style
+ item_state = style
+ ..()
+
+/obj/item/weapon/paper/cracker_joke
+ name = "joke"
+ icon_state = "joke"
+
+/obj/item/weapon/paper/cracker_joke/update_icon()
+ return
diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm
index 4bbaaff043..2bbd601035 100644
--- a/code/modules/vore/resizing/sizegun_vr.dm
+++ b/code/modules/vore/resizing/sizegun_vr.dm
@@ -15,6 +15,7 @@
origin_tech = list(TECH_BLUESPACE = 4)
modifystate = "sizegun-shrink"
battery_lock = 1
+ var/backfire = 0
var/size_set_to = 1
firemodes = list(
list(mode_name = "select size",
@@ -133,6 +134,54 @@
size_set_to = clamp((size_select/100), 0, 1000) //eheh
to_chat(usr, "You set the size to [size_select]% ")
+/obj/item/weapon/gun/energy/sizegun/afterattack(atom/A, mob/living/user, adjacent, params)
+ if(adjacent) return //A is adjacent, is the user, or is on the user's person
+
+ if(backfire)
+ if(prob(50))
+ to_chat(user, "\The [src] backfires and consumes its entire charge! ")
+ Fire(user, user)
+ power_supply.charge = 0
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src)
+ return
+ else
+ return ..()
+ else
+ return ..()
+
+/obj/item/weapon/gun/energy/sizegun/attack(atom/A, mob/living/user, adjacent, params)
+ if(backfire)
+ if(prob(50))
+ to_chat(user, "\The [src] backfires and consumes its entire charge! ")
+ Fire(user, user)
+ power_supply.charge = 0
+ var/mob/living/M = loc // TGMC Ammo HUD
+ if(istype(M)) // TGMC Ammo HUD
+ M?.hud_used.update_ammo_hud(M, src)
+ return
+ else
+ return ..()
+ else
+ return ..()
+
+
+/obj/item/weapon/gun/energy/sizegun/attackby(var/obj/item/A as obj, mob/user as mob)
+ if(A.has_tool_quality(TOOL_WIRECUTTER))
+ if(backfire)
+ to_chat(user, "You repair the damage to the \the [src]. ")
+ backfire = 0
+ name = "size gun"
+ else
+ to_chat(user, "You snip a wire on \the [src], making it less reliable. ")
+ backfire = 1
+ name = "unstable size gun"
+ ..()
+
+/obj/item/weapon/gun/energy/sizegun/backfire
+ name = "unstable size gun"
+ backfire = 1
/obj/item/weapon/gun/energy/sizegun/mounted
name = "mounted size gun"
diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm
index 196543a256..e4ac65403a 100644
--- a/code/modules/xenobio2/machinery/injector_computer.dm
+++ b/code/modules/xenobio2/machinery/injector_computer.dm
@@ -46,6 +46,7 @@
..()
+//Is missing a tgui interface?
/obj/machinery/computer/xenobio2/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!user)
return
diff --git a/code/modules/xenobio2/mob/slime/slime life.dm b/code/modules/xenobio2/mob/slime/slime life.dm
index cc784a63d1..f6e91f4912 100644
--- a/code/modules/xenobio2/mob/slime/slime life.dm
+++ b/code/modules/xenobio2/mob/slime/slime life.dm
@@ -52,4 +52,7 @@ Slime specific life events go here.
return 0 //Everything worked okay
- return //xeno/Life() returned 0.
\ No newline at end of file
+ return //xeno/Life() returned 0.
+
+#undef HAPPYLEVEL
+#undef ANGRYLEVEL
diff --git a/code/modules/xenobio2/mob/slime/slime procs.dm b/code/modules/xenobio2/mob/slime/slime procs.dm
index ac03f788c3..2bd5912958 100644
--- a/code/modules/xenobio2/mob/slime/slime procs.dm
+++ b/code/modules/xenobio2/mob/slime/slime procs.dm
@@ -126,3 +126,7 @@ Slime specific procs go here.
GenerateChild()
else
GenerateAdult()
+
+#undef SHINYOVERLAY
+#undef LIGHTOVERLAY
+#undef MAXOVERLAY
diff --git a/code/modules/xenobio2/mob/xeno.dm b/code/modules/xenobio2/mob/xeno.dm
index 9996be9e61..f53659b17b 100644
--- a/code/modules/xenobio2/mob/xeno.dm
+++ b/code/modules/xenobio2/mob/xeno.dm
@@ -102,6 +102,5 @@ Also includes Life and New
..()
/mob/living/simple_mob/xeno/Destroy()
- traitdat.Destroy() //Let's clean up after ourselves.
- traitdat = null
- ..()
\ No newline at end of file
+ QDEL_NULL(traitdat)
+ ..()
diff --git a/icons/inventory/head/item.dmi b/icons/inventory/head/item.dmi
index 538c3a57ee..7897ed2207 100644
Binary files a/icons/inventory/head/item.dmi and b/icons/inventory/head/item.dmi differ
diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi
index 635188fbad..8f7e232b3d 100644
Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ
diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi
index ea687def73..5da8720d00 100644
Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ
diff --git a/icons/mob/human_races/r_lleill.dmi b/icons/mob/human_races/r_lleill.dmi
new file mode 100644
index 0000000000..a3f6d1429b
Binary files /dev/null and b/icons/mob/human_races/r_lleill.dmi differ
diff --git a/icons/mob/items/lefthand_cracker.dmi b/icons/mob/items/lefthand_cracker.dmi
new file mode 100644
index 0000000000..6e2d5776fc
Binary files /dev/null and b/icons/mob/items/lefthand_cracker.dmi differ
diff --git a/icons/mob/items/righthand_cracker.dmi b/icons/mob/items/righthand_cracker.dmi
new file mode 100644
index 0000000000..0818ed3ebc
Binary files /dev/null and b/icons/mob/items/righthand_cracker.dmi differ
diff --git a/icons/mob/species/lleill/tail.dmi b/icons/mob/species/lleill/tail.dmi
new file mode 100644
index 0000000000..3ff9003890
Binary files /dev/null and b/icons/mob/species/lleill/tail.dmi differ
diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi
index 2aabf0438b..e11ef54c8d 100644
Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ
diff --git a/icons/mob/vore/Bellies.dmi b/icons/mob/vore/Bellies.dmi
new file mode 100644
index 0000000000..4f0d94f008
Binary files /dev/null and b/icons/mob/vore/Bellies.dmi differ
diff --git a/icons/mob/vore/Taur_Bellies.dmi b/icons/mob/vore/Taur_Bellies.dmi
new file mode 100644
index 0000000000..e606c64d18
Binary files /dev/null and b/icons/mob/vore/Taur_Bellies.dmi differ
diff --git a/icons/mob/vore/ears_32x64.dmi b/icons/mob/vore/ears_32x64.dmi
index cfae3acbcb..1e73072d94 100644
Binary files a/icons/mob/vore/ears_32x64.dmi and b/icons/mob/vore/ears_32x64.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 5c0531f5b7..61365297d2 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/crackers.dmi b/icons/obj/crackers.dmi
new file mode 100644
index 0000000000..ac657f46f9
Binary files /dev/null and b/icons/obj/crackers.dmi differ
diff --git a/icons/obj/flora/rocks.dmi b/icons/obj/flora/rocks.dmi
index 1b5e67e3f7..6b5d942473 100644
Binary files a/icons/obj/flora/rocks.dmi and b/icons/obj/flora/rocks.dmi differ
diff --git a/icons/obj/glamour.dmi b/icons/obj/glamour.dmi
new file mode 100644
index 0000000000..2682d7badc
Binary files /dev/null and b/icons/obj/glamour.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 866c4136c8..495abac477 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/overmap_vr.dmi b/icons/obj/overmap_vr.dmi
index dae175f214..6d756663ae 100644
Binary files a/icons/obj/overmap_vr.dmi and b/icons/obj/overmap_vr.dmi differ
diff --git a/icons/obj/props/decor96x96.dmi b/icons/obj/props/decor96x96.dmi
index 9aabbf68d2..31130c4220 100644
Binary files a/icons/obj/props/decor96x96.dmi and b/icons/obj/props/decor96x96.dmi differ
diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi
index e181299f13..6b5dc5dab5 100644
Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ
diff --git a/icons/obj/stationobjs_vr.dmi b/icons/obj/stationobjs_vr.dmi
index aa6df06395..8ce777ec97 100644
Binary files a/icons/obj/stationobjs_vr.dmi and b/icons/obj/stationobjs_vr.dmi differ
diff --git a/icons/skybox/virgo5.dmi b/icons/skybox/virgo5.dmi
new file mode 100644
index 0000000000..94e275dd15
Binary files /dev/null and b/icons/skybox/virgo5.dmi differ
diff --git a/icons/turf/flooring/glamour.dmi b/icons/turf/flooring/glamour.dmi
index 74ee643065..8f60748a65 100644
Binary files a/icons/turf/flooring/glamour.dmi and b/icons/turf/flooring/glamour.dmi differ
diff --git a/icons/turf/walls.dmi b/icons/turf/walls.dmi
index 86243a853f..b979f1a00e 100644
Binary files a/icons/turf/walls.dmi and b/icons/turf/walls.dmi differ
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 53b0689fb1..9c8f8a5ec0 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -720,6 +720,12 @@ macro "hotkeymode"
elem
name = "U"
command = "Rest"
+ elem
+ name = "SHIFT+U"
+ command = "Rest-Left"
+ elem
+ name = "CTRL+U"
+ command = "Rest-Right"
elem
name = "B"
command = "Resist"
diff --git a/maps/groundbase/groundbase_defines.dm b/maps/groundbase/groundbase_defines.dm
index 219fc11c6c..412e2bd01d 100644
--- a/maps/groundbase/groundbase_defines.dm
+++ b/maps/groundbase/groundbase_defines.dm
@@ -224,7 +224,8 @@
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town"),
list("Redgate - Laserdome"),
list("Redgate - Cascading Falls"),
- list("Redgate - Jungle Underground", "Redgate - Jungle")
+ list("Redgate - Jungle Underground", "Redgate - Jungle"),
+ list("Redgate - Facility")
)
lateload_gb_north = list(
diff --git a/maps/offmap_vr/common_offmaps.dm b/maps/offmap_vr/common_offmaps.dm
index b761c46e55..7d97d7b926 100644
--- a/maps/offmap_vr/common_offmaps.dm
+++ b/maps/offmap_vr/common_offmaps.dm
@@ -351,6 +351,11 @@
/obj/effect/landmark/map_data/jungle
height = 2
+/datum/map_template/common_lateload/redgate/facility
+ name = "Redgate - Facility"
+ desc = "A facility full of unusual experiments."
+ mappath = 'maps/redgate/facility.dmm'
+
//////////////////////////////////////////////////////////////////////////////////////
// Admin-use z-levels for loading whenever an admin feels like
#if AWAY_MISSION_TEST
diff --git a/maps/redgate/facility.dmm b/maps/redgate/facility.dmm
new file mode 100644
index 0000000000..02fa83ec07
--- /dev/null
+++ b/maps/redgate/facility.dmm
@@ -0,0 +1,37168 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aau" = (
+/obj/structure/closet/secure_closet/medical2,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"abl" = (
+/obj/machinery/light/spot{
+ dir = 1;
+ invisibility = 101
+ },
+/turf/simulated/floor/glamour,
+/area/redgate/facility/ne)
+"abp" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"aca" = (
+/obj/structure/table/standard,
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"adz" = (
+/obj/structure/window/basic/full,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"agb" = (
+/obj/machinery/light/spot{
+ dir = 8;
+ invisibility = 101
+ },
+/turf/simulated/floor/glamour,
+/area/redgate/facility/ne)
+"agH" = (
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"ahj" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/potion_material/glamour_shard,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"ahx" = (
+/obj/machinery/light/spot{
+ dir = 4;
+ invisibility = 101
+ },
+/turf/simulated/floor/glamour,
+/area/redgate/facility/ne)
+"aih" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"aix" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/bboulder1,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"aiz" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/cheap,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"aju" = (
+/obj/structure/closet,
+/obj/random/awayloot/nofail,
+/obj/random/forgotten_tram,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"ajx" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/item/weapon/shield/riot,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"akB" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/item/clothing/suit/storage/vest/heavy/officer{
+ pixel_x = -4;
+ pixel_y = 4
+ },
+/obj/item/clothing/suit/storage/vest/heavy/officer{
+ pixel_x = -4;
+ pixel_y = -6
+ },
+/obj/item/clothing/suit/storage/vest/heavy/officer{
+ pixel_x = 5;
+ pixel_y = -6
+ },
+/obj/item/clothing/suit/storage/vest/heavy/officer{
+ pixel_x = 5;
+ pixel_y = 4
+ },
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"alk" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/technology_scanner,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"alo" = (
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"alz" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/item/weapon/reagent_containers/glass/bucket,
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"alP" = (
+/obj/machinery/atmospherics/pipe/simple/visible/red{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"alV" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/flash/synthetic,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"aml" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"amu" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"amK" = (
+/obj/structure/filingcabinet/chestdrawer,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"ank" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"anp" = (
+/mob/living/simple_mob/vore/wolf/direwolf/sec{
+ ai_holder_type = /datum/ai_holder/simple_mob/vore
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"aou" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"apm" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell12)
+"apV" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"aqi" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/sw)
+"aqk" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"aqU" = (
+/obj/structure/table/darkglass,
+/obj/item/glamourcrystal,
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/ne)
+"arY" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"asm" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/ne)
+"asn" = (
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 6
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 5
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"asB" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/closet,
+/obj/random/forgotten_tram,
+/obj/random/forgotten_tram,
+/obj/random/coin,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"asX" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/closet,
+/obj/random/forgotten_tram,
+/obj/random/forgotten_tram,
+/obj/random/mainttoyloot/nofail,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"atr" = (
+/obj/effect/floor_decal/corner/white/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"atA" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/ne)
+"atH" = (
+/obj/structure/closet/secure_closet/security,
+/obj/random/grenade/less_lethal,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"atT" = (
+/obj/structure/table/steel,
+/obj/item/weapon/folder/red,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"avL" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"aww" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/entrance)
+"awQ" = (
+/obj/structure/bed/chair/office/dark,
+/obj/effect/floor_decal/spline/plain{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"axo" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"axq" = (
+/obj/structure/bed/chair/office/dark,
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"axO" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"axR" = (
+/obj/machinery/door/airlock/angled_tgmc/security{
+ name = "red door";
+ req_access = list(801);
+ req_one_access = list(801)
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"ayj" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell5)
+"ayW" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"azr" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"azC" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"aAi" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"aAk" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"aAV" = (
+/obj/random/empty_or_lootable_crate,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"aAZ" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aBI" = (
+/obj/structure/table/hardwoodtable,
+/obj/random/maintenance,
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"aCo" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/elite,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"aCN" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"aDG" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/obj/effect/floor_decal/spline/plain{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"aEA" = (
+/obj/machinery/door/airlock/angled_tgmc/engineering{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"aFv" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"aFP" = (
+/obj/structure/railing,
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aHL" = (
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"aHS" = (
+/obj/structure/flora/ausbushes/reedbush,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell13)
+"aIg" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"aIj" = (
+/obj/random/junk,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"aIB" = (
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"aIF" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/nw)
+"aJT" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aKz" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"aMu" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"aMv" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/sofa/corp/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"aME" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"aNb" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"aND" = (
+/obj/structure/closet/emcloset,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"aOu" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"aOv" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/sw)
+"aOx" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/obj/random/vendorall,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"aOX" = (
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"aPN" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/medbay)
+"aQv" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aRG" = (
+/obj/effect/floor_decal/industrial/warning/corner,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aSb" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/machinery/atmospherics/portables_connector,
+/obj/effect/floor_decal/techfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"aSw" = (
+/obj/structure/table/reinforced,
+/obj/item/broken_device/random,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"aSC" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell11)
+"aSR" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aTL" = (
+/obj/structure/prop/rock/flat,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"aUc" = (
+/obj/structure/closet,
+/obj/random/grenade/less_lethal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aUp" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"aUF" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"aVC" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"aWd" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"aWA" = (
+/obj/structure/dogbed,
+/mob/living/simple_mob/vore/scrubble,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"aWE" = (
+/obj/random/tank,
+/obj/structure/table/rack/steel,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"aXn" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell26)
+"aXy" = (
+/obj/structure/closet,
+/obj/random/maintenance,
+/obj/random/bluespace,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"aXB" = (
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/nw)
+"aXE" = (
+/obj/machinery/door/blast/multi_tile/three_tile_hor{
+ id = "glamour"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"aXR" = (
+/obj/machinery/door/airlock/angled_tgmc/wide/generic{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"baa" = (
+/obj/structure/table/woodentable,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/item/weapon/folder/white,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"bay" = (
+/obj/structure/closet/walllocker/wooden/east,
+/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/cheeseburger,
+/obj/item/weapon/reagent_containers/food/snacks/cheeseburger,
+/obj/item/weapon/reagent_containers/food/snacks/fishburger,
+/obj/item/weapon/reagent_containers/food/snacks/fishburger,
+/obj/item/weapon/reagent_containers/food/snacks/jellyburger,
+/obj/item/weapon/reagent_containers/food/snacks/jellyburger,
+/obj/item/weapon/reagent_containers/food/snacks/superbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/superbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/superbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/bearburger,
+/obj/item/weapon/reagent_containers/food/snacks/bearburger,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"baM" = (
+/obj/structure/table/standard,
+/obj/random/slimecore,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"bbg" = (
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"bbE" = (
+/obj/structure/closet,
+/obj/random/fantasy_item/better,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/nw)
+"bbP" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/random/maintenance,
+/obj/machinery/light,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/ne)
+"bbX" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell6)
+"bcD" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"bcI" = (
+/obj/structure/closet/walllocker_double/science/north,
+/obj/item/weapon/storage/fancy/egg_box,
+/obj/item/weapon/storage/fancy/egg_box,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"bcZ" = (
+/mob/living/simple_mob/vore/raptor,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"beK" = (
+/obj/structure/bed/chair/sofa/corp/left,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"bfA" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bfF" = (
+/obj/structure/bed/chair/sofa/corp{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"bgg" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloor,
+/obj/random/tetheraid,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bil" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"bip" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"bjJ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"bka" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bkc" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bkn" = (
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"bkw" = (
+/obj/structure/bed/chair/office/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bkY" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"blh" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bll" = (
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 1
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 8
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"blm" = (
+/obj/structure/table/bench/standard,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"blB" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"bmu" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"bmy" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bmJ" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"bmY" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bnz" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"bnH" = (
+/obj/structure/table/reinforced,
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"bnU" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"boO" = (
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
+ },
+/obj/machinery/atmospherics/pipe/simple/visible/green,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"boT" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bpL" = (
+/obj/structure/table/woodentable,
+/obj/item/device/flashlight/lamp/green{
+ pixel_y = 8
+ },
+/turf/simulated/floor/carpet/blue,
+/area/redgate/facility/office2)
+"bpW" = (
+/obj/item/weapon/paper,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bqd" = (
+/obj/structure/reagent_dispensers/water_cooler/full,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bqp" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bqM" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"brr" = (
+/obj/effect/floor_decal/atoll/stairs,
+/turf/simulated/floor/atoll,
+/area/redgate/facility/cell16)
+"brA" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/table/reinforced,
+/obj/machinery/microwave/advanced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"btj" = (
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"bua" = (
+/obj/structure/table/wooden_reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"buD" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{
+ pixel_x = 9;
+ pixel_y = 17
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"buS" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/item/weapon/bone/ribs,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"bvQ" = (
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"bwp" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab1)
+"bwG" = (
+/obj/structure/table/glass,
+/obj/machinery/microscope,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"bwJ" = (
+/obj/machinery/vending/loadout,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"bwP" = (
+/obj/structure/table/borosilicate,
+/obj/item/clothing/under/hyperfiber,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"byg" = (
+/obj/structure/reagent_dispensers/coolanttank,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"byq" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"byD" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"bzV" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"bzX" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bAJ" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"bAM" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"bAP" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bBH" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue/diagonal,
+/obj/effect/floor_decal/steeldecal/steel_decals10,
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"bCO" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"bCT" = (
+/obj/machinery/shower{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/paleblue/diagonal,
+/obj/effect/floor_decal/steeldecal/steel_decals10,
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"bDp" = (
+/turf/simulated/floor/tiled/eris/techmaint_cargo,
+/area/redgate/facility/sw)
+"bEa" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"bEp" = (
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"bFb" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"bFj" = (
+/turf/simulated/floor/tiled/dark,
+/area/redgate/facility/cell10)
+"bFr" = (
+/obj/machinery/light/floortube,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bFt" = (
+/obj/structure/table/bench/steel,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"bFw" = (
+/obj/structure/closet,
+/obj/random/cash/big,
+/obj/random/bomb_supply,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bGk" = (
+/obj/structure/closet/l3closet/medical,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"bHr" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bHz" = (
+/obj/structure/closet,
+/obj/random/mouseray,
+/obj/random/forgotten_tram,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/nw)
+"bHE" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/ne)
+"bIi" = (
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -24
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"bIj" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bIo" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/ne)
+"bIw" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bIQ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"bIT" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"bJh" = (
+/mob/living/simple_mob/vore/devil,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"bJm" = (
+/obj/machinery/button/remote/blast_door{
+ id = "core_experiment";
+ pixel_y = 25
+ },
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bJy" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"bJI" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"bKb" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 5
+ },
+/obj/effect/floor_decal/transit/orange,
+/obj/item/device/geiger/wall/east,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bKf" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"bKC" = (
+/obj/structure/crystalholder,
+/turf/simulated/floor/tiled/eris/bcircuit,
+/area/redgate/facility/ne)
+"bLQ" = (
+/obj/machinery/light/small,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell20)
+"bMm" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bML" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"bMN" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/entrance)
+"bNV" = (
+/obj/machinery/shower{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/paleblue/diagonal,
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 8
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 1
+ },
+/obj/item/weapon/bikehorn/rubberducky,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"bOm" = (
+/obj/item/weapon/circuitboard/fluidpump,
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"bOo" = (
+/obj/structure/closet/cabinet,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"bOz" = (
+/obj/structure/table/woodentable,
+/obj/item/device/flashlight/lamp/green,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"bOV" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/ne)
+"bPs" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell16)
+"bPx" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"bPy" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bPT" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bQf" = (
+/obj/structure/table/woodentable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/elite,
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"bRn" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bSl" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"bSn" = (
+/obj/item/device/geiger/wall/north,
+/obj/effect/floor_decal/corner/black/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bSz" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/wood,
+/area/redgate/facility/cell2)
+"bSA" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"bSN" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"bTo" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Squarepants"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/machinery/light,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"bTz" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"bTV" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/dark,
+/area/redgate/facility/cell10)
+"bUh" = (
+/obj/structure/table/steel,
+/obj/random/maintenance/security,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"bUq" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"bUL" = (
+/obj/structure/closet,
+/obj/random/drinkbottle,
+/obj/random/drinkbottle,
+/obj/random/drinkbottle,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bVf" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/obj/random/cigarettes,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"bVl" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"bVp" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/greendouble,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"bVI" = (
+/obj/machinery/atmospherics/unary/cryo_cell,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"bXd" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/orangedouble,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"bXi" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/bluedouble,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"bXk" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell14)
+"bXL" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/nw)
+"bXN" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/nw)
+"bYo" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"bYT" = (
+/obj/machinery/door/blast/regular/open{
+ id = "core_experiment"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"bYX" = (
+/obj/machinery/door/blast/regular{
+ id = "core_experiment"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"bZr" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"cam" = (
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"cbQ" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/flora/ausbushes/ppflowers,
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"cbV" = (
+/obj/structure/closet/secure_closet/personal/patient,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"ccG" = (
+/obj/machinery/button/windowtint{
+ id = "cell_4";
+ pixel_x = 22
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"cdr" = (
+/obj/machinery/crystalexperimenter,
+/turf/simulated/floor/tiled/eris/dark/monofloor,
+/area/redgate/facility/ne)
+"cdC" = (
+/obj/structure/bed/chair/sofa/corp/right,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"cdP" = (
+/obj/machinery/button/remote/experimenter{
+ dir = 8;
+ pixel_x = 27
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"cdT" = (
+/obj/machinery/door/blast/regular{
+ id = "vault1"
+ },
+/turf/simulated/floor/tiled/eris/bcircuit,
+/area/redgate/facility/ne)
+"ceb" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"cek" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/obj/machinery/light/broken,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"ceo" = (
+/obj/structure/table/steel,
+/obj/item/device/integrated_electronics/detailer,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"ceN" = (
+/obj/structure/bed/chair/sofa/left/lime{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"ceR" = (
+/obj/structure/bed/chair/sofa/left/orange{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cfF" = (
+/obj/effect/floor_decal/corner_steel_grid{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"cfI" = (
+/obj/structure/bed/chair/sofa/left/blue{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cht" = (
+/obj/effect/floor_decal/corner/orange/border,
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"chH" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/random/vendorall,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"chP" = (
+/obj/effect/floor_decal/corner/lime/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"chX" = (
+/obj/structure/railing/grey,
+/obj/machinery/atmospherics/pipe/simple/visible/red{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"cie" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/ne)
+"ciB" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ dir = 1;
+ id_tag = "cell_8"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"cjl" = (
+/obj/structure/table/glass,
+/obj/item/weapon/book/manual/resleeving,
+/obj/effect/floor_decal/borderfloor{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"cjt" = (
+/obj/structure/closet,
+/obj/fiftyspawner/glass,
+/obj/item/stack/material/plasteel{
+ amount = 10
+ },
+/obj/random/material/precious,
+/obj/random/material/precious,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"cjS" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"cka" = (
+/obj/structure/closet,
+/obj/item/clothing/suit/storage/toggle/labcoat,
+/obj/item/weapon/melee/baton/cattleprod,
+/obj/random/maintenance/morestuff,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"ckD" = (
+/obj/structure/window/reinforced/polarized/full,
+/obj/structure/grille,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"clt" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"cmj" = (
+/mob/living/simple_mob/vore/stalker,
+/obj/effect/floor_decal/corner/black/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"cmH" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"cnj" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_x = 16;
+ pixel_y = 27
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"cnp" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"cnr" = (
+/obj/structure/table/wooden_reinforced,
+/obj/item/weapon/gun/energy/sizegun,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"cnG" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"cnI" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"cnQ" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"cqX" = (
+/obj/machinery/door/blast/regular/open{
+ id = "vault4"
+ },
+/turf/simulated/floor/tiled/eris/bcircuit,
+/area/redgate/facility/ne)
+"crn" = (
+/obj/structure/salvageable/console,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"crv" = (
+/obj/structure/closet,
+/obj/random/contraband/nofail,
+/obj/random/fishing_junk,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"crB" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"crQ" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"crX" = (
+/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi{
+ ai_holder_type = /datum/ai_holder/simple_mob/vore
+ },
+/turf/simulated/floor/gorefloor,
+/area/redgate/facility/ne)
+"csa" = (
+/obj/structure/toilet{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"csz" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"csM" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"ctF" = (
+/obj/structure/bed/chair/sofa/right/lime{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "facility_dorm_4";
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"ctH" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microwave,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cuN" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"cvb" = (
+/obj/structure/bed/chair/sofa/right/yellow{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "facility_dorm_5";
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cvl" = (
+/obj/structure/toilet/prison{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"cvm" = (
+/obj/structure/bed/chair/sofa/right/blue{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "facility_dorm_6";
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cwq" = (
+/turf/simulated/wall/tgmc/redstripe,
+/area/redgate/facility/securitylobby)
+"cxn" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"czm" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/nw)
+"czn" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"czL" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/machinery/light,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/ne)
+"czS" = (
+/obj/structure/closet/secure_closet/engineering_welding/double,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"cBa" = (
+/obj/structure/closet/toolcloset,
+/obj/random/tool/alien,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"cBx" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"cCk" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"cCs" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_9"
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"cCu" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"cCV" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"cDe" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell3)
+"cDs" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"cDt" = (
+/obj/structure/girder,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"cDW" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"cEL" = (
+/obj/structure/salvageable/console{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"cFH" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"cFX" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"cGq" = (
+/obj/machinery/door/blast/regular/open{
+ id = "vault2"
+ },
+/turf/simulated/floor/tiled/eris/bcircuit,
+/area/redgate/facility/ne)
+"cHb" = (
+/obj/random/soap_common,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"cHe" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/obj/structure/bed/chair/sofa/right/brown,
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/sw)
+"cHl" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12;
+ pixel_y = 3
+ },
+/obj/structure/mirror{
+ dir = 8;
+ pixel_x = 26;
+ pixel_y = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"cHD" = (
+/obj/structure/table/standard,
+/obj/item/weapon/storage/laundry_basket,
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"cIQ" = (
+/obj/machinery/power/emitter{
+ anchored = 1;
+ icon_state = "emitter1";
+ state = 1
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"cJa" = (
+/obj/structure/undies_wardrobe,
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"cJT" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "facility_dorm_4"
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cJV" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "facility_dorm_5"
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cJZ" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "facility_dorm_6"
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"cKz" = (
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/bread,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"cKL" = (
+/obj/structure/bed/chair/sofa/corp/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"cLb" = (
+/obj/effect/floor_decal/corner/blue/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"cLj" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"cLm" = (
+/obj/structure/disposaloutlet{
+ density = 0;
+ pixel_y = 18
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"cMH" = (
+/obj/structure/bed/chair/sofa/corp/right,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"cMZ" = (
+/obj/machinery/atmospherics/pipe/simple/visible/red{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"cNo" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"cNH" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"cNI" = (
+/obj/structure/table/glass,
+/obj/item/device/sleevemate,
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"cPg" = (
+/obj/structure/salvageable/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"cPo" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell27)
+"cPB" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4;
+ locked = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"cPU" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/storage/toolbox/electrical{
+ pixel_x = 1;
+ pixel_y = 6
+ },
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/ne)
+"cQh" = (
+/obj/machinery/autolathe{
+ dir = 1;
+ hacked = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"cQi" = (
+/obj/item/weapon/circuitboard/broken,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"cQv" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/nw)
+"cQR" = (
+/obj/machinery/vending/radren,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"cRb" = (
+/obj/effect/floor_decal/industrial/loading{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"cRi" = (
+/obj/item/weapon/material/shard,
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "cell_20";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"cRP" = (
+/obj/structure/closet/radiation,
+/obj/random/cargopod,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"cSl" = (
+/obj/structure/bed/chair/bay{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"cSN" = (
+/turf/simulated/shuttle/floor/white,
+/area/redgate/facility/tram)
+"cUw" = (
+/obj/structure/table/darkglass,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"cUy" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"cUF" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"cUG" = (
+/obj/machinery/light/floortube{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"cUI" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"cWc" = (
+/obj/structure/prop/rock/round,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"cWB" = (
+/obj/machinery/door/blast/regular{
+ id = "vault3"
+ },
+/turf/simulated/floor/tiled/eris/bcircuit,
+/area/redgate/facility/ne)
+"cXI" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/manifold/visible/green{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"cZu" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"cZA" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/gorefloor,
+/area/redgate/facility/ne)
+"dao" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"daB" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"daP" = (
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dbk" = (
+/obj/structure/bed/chair/sofa/corp/right{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dbD" = (
+/obj/structure/table/hardwoodtable,
+/obj/random/powercell/device,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"dcx" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/item/weapon/reagent_containers/glass/rag,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dcE" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/elite,
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/ne)
+"ddd" = (
+/obj/structure/closet,
+/obj/random/unidentified_medicine/combat_medicine,
+/obj/random/forgotten_tram,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"ddi" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"deI" = (
+/obj/structure/sign/levels/medical/cloning,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/ne)
+"dfe" = (
+/obj/structure/table/glass,
+/obj/item/weapon/gun/energy/mouseray/medical,
+/obj/effect/floor_decal/borderfloor{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"dfL" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/cell_charger,
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/ne)
+"dhj" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"dhF" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell7)
+"dhM" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"djb" = (
+/obj/item/stack/cable_coil,
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/ne)
+"djP" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"dki" = (
+/obj/machinery/mecha_part_fabricator{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"dkR" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"dlw" = (
+/obj/machinery/gear_painter,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 4
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dmN" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"dmQ" = (
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dpy" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"dpL" = (
+/obj/structure/loot_pile/mecha/ripley/random_sprite,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"dqe" = (
+/obj/random/multiple/corp_crate/no_weapons,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"drT" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell9)
+"dss" = (
+/obj/machinery/clonepod/transhuman,
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"dtr" = (
+/obj/effect/floor_decal/corner/black/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"dtI" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"dua" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/gorefloor2,
+/area/redgate/facility/ne)
+"duq" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"duw" = (
+/obj/structure/bed/chair/sofa/right/orange{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/black/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"duH" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/obj/effect/floor_decal/techfloor{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"dvj" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"dvk" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dvS" = (
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dwV" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dwY" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dxJ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dxX" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = -4;
+ pixel_y = -4
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = 8;
+ pixel_y = -4
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = -4;
+ pixel_y = 12
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = 8;
+ pixel_y = 12
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = -4
+ },
+/obj/item/weapon/reagent_containers/food/drinks/cup{
+ pixel_x = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dyp" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"dyR" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/storage/toolbox/mechanical,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"dzj" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/geiger{
+ pixel_x = 7;
+ pixel_y = 6
+ },
+/obj/item/device/geiger,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"dzk" = (
+/obj/structure/dispenser{
+ phorontanks = 0
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"dzA" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"dzX" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell20)
+"dAc" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_perforated,
+/area/redgate/facility/ne)
+"dAl" = (
+/obj/machinery/recharge_station,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dBA" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"dBC" = (
+/obj/effect/floor_decal/corner/pink/bordercorner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"dBD" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"dCb" = (
+/obj/structure/closet/secure_closet/personal,
+/obj/item/clothing/under/bathrobe,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 8
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dCf" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "facility_dorm_1"
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dCJ" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"dCX" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "facility_dorm_2"
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dEq" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "facility_dorm_3"
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dEA" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/chemical_dispenser/bar_coffee/full{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dFt" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/item/weapon/gun/energy/taser,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"dFD" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"dGd" = (
+/turf/simulated/floor/water/contaminated,
+/area/redgate/facility/office1)
+"dGr" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"dGD" = (
+/obj/structure/table/glass,
+/obj/item/bodybag/cryobag{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/effect/floor_decal/borderfloor{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"dGF" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/ne)
+"dHH" = (
+/obj/structure/closet,
+/obj/item/weapon/storage/belt/utility,
+/obj/item/weapon/tool/crowbar,
+/obj/item/device/multitool{
+ pixel_x = 3
+ },
+/obj/item/clothing/head/welding/engie,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"dHN" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"dID" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"dIZ" = (
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"dJc" = (
+/obj/structure/table/standard,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"dJK" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/janusmodule,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"dJR" = (
+/obj/structure/table/hardwoodtable,
+/obj/structure/closet/walllocker_double/medical/south,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"dKn" = (
+/obj/structure/window/plastitanium/full,
+/obj/structure/grille,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"dKH" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/recharger,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"dKV" = (
+/obj/structure/railing,
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell4)
+"dLa" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dLd" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/structure/railing/grey{
+ dir = 8
+ },
+/obj/machinery/button/remote/blast_door{
+ id = "vault1"
+ },
+/obj/machinery/light/floortube,
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"dLl" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/machinery/button/remote/blast_door{
+ id = "vault2"
+ },
+/obj/machinery/light/floortube,
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"dLs" = (
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = 32
+ },
+/obj/effect/floor_decal/spline/fancy/wood,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"dNj" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"dNQ" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"dOH" = (
+/obj/structure/bed/chair/sofa/left/orange{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ id = "facility_dorm_1";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dOY" = (
+/obj/structure/bed/chair/sofa/left/purp{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ id = "facility_dorm_2";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dPQ" = (
+/obj/structure/bed/chair/sofa/left/brown{
+ dir = 4
+ },
+/obj/machinery/button/remote/airlock{
+ id = "facility_dorm_3";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dQf" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/item/weapon/reagent_containers/food/drinks/glass2/square{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/food/drinks/glass2/square{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/food/drinks/glass2/square{
+ pixel_x = 8;
+ pixel_y = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"dQn" = (
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"dQq" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"dSD" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ locked = 1;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"dST" = (
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"dSW" = (
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = -32
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"dTg" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"dTI" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/obj/structure/railing/grey{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"dTW" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/syringe/steroid,
+/obj/structure/closet/walllocker_double/science/north,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"dTZ" = (
+/obj/structure/bed/chair/sofa/left/orange,
+/obj/effect/floor_decal/corner/black/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"dUv" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"dVq" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"dVA" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell20)
+"dWb" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"dXn" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"dXo" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"dXO" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/lavendergrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell26)
+"dXS" = (
+/obj/structure/frame,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"dYC" = (
+/obj/effect/floor_decal/arrivals/right,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"dZf" = (
+/obj/structure/bed/chair/sofa/right/orange{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"dZr" = (
+/obj/structure/bed/chair/sofa/right/purp{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"eah" = (
+/obj/structure/bed/chair/sofa/right/brown{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"eaI" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"eaR" = (
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"eaY" = (
+/obj/structure/bed/chair/sofa/corp/right{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"ebb" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"ebj" = (
+/turf/simulated/floor/glamour,
+/area/redgate/facility/ne)
+"ebm" = (
+/obj/structure/sink{
+ pixel_y = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"ebq" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/bboulder2,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"ebR" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"ecQ" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"edo" = (
+/obj/structure/railing,
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"edp" = (
+/obj/structure/prop/rock/sharp,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"edZ" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"eeb" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell2)
+"eet" = (
+/obj/structure/prop/rock,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"eew" = (
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"efc" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"efA" = (
+/obj/machinery/light,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"efC" = (
+/obj/effect/floor_decal/spline/fancy/wood,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"egX" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell18)
+"ehw" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"ehD" = (
+/obj/structure/railing,
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/toolbox/emergency,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"ehY" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eid" = (
+/obj/machinery/door/airlock/angled_tgmc/command{
+ dir = 4;
+ name = "blue door";
+ req_access = list(802);
+ req_one_access = list(802)
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eiO" = (
+/obj/machinery/light/flicker,
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"ejb" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "I. P. Freely"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"ejr" = (
+/obj/structure/table/glass,
+/obj/item/selectable_item/chemistrykit/gender{
+ pixel_y = 11
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"eku" = (
+/obj/machinery/telecomms/allinone,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab3)
+"ekR" = (
+/obj/structure/salvageable/computer,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"elH" = (
+/obj/machinery/door/window,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/freezer,
+/area/redgate/facility/sw)
+"emh" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"emH" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"eoP" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/reddouble,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"epk" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"epA" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/purpledouble,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"equ" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office2)
+"eqY" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/lab3)
+"erk" = (
+/obj/item/weapon/bedsheet/pillow/black,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"erx" = (
+/obj/structure/table/standard,
+/obj/random/soap,
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"esm" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/browndouble,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"esq" = (
+/obj/structure/table/reinforced,
+/obj/machinery/microwave/advanced,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"esr" = (
+/obj/structure/bed/chair/sofa/corp/corner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"esz" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ete" = (
+/obj/structure/bed/chair/sofa/corp/right{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"etR" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"eue" = (
+/obj/effect/floor_decal/corner/black/bordercorner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"euo" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/light/broken,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eus" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"euH" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"euN" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/toy/desk/newtoncradle,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"evB" = (
+/obj/random/trash_pile,
+/obj/structure/railing,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"evK" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/railing/grey,
+/obj/structure/railing/grey{
+ dir = 8
+ },
+/obj/machinery/button/remote/blast_door{
+ id = "vault3"
+ },
+/obj/machinery/light/floortube{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"evN" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/railing/grey,
+/obj/machinery/button/remote/blast_door{
+ id = "vault4"
+ },
+/obj/machinery/light/floortube{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"ewh" = (
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"ewo" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"ewK" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"exj" = (
+/obj/structure/table/borosilicate,
+/obj/item/device/radio,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"exB" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/modular_computer/laptop,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"exZ" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"eyA" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"eyQ" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"ezP" = (
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"eAd" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"eAO" = (
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"eBv" = (
+/obj/structure/table/reinforced,
+/obj/random/mug,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"eBS" = (
+/obj/structure/bed/chair/sofa/corp,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"eCd" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/random/maintenance/misc,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"eCE" = (
+/obj/structure/railing,
+/turf/simulated/floor,
+/area/redgate/facility/cell19)
+"eCN" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"eCT" = (
+/obj/structure/salvageable/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"eDj" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"eDD" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"eDG" = (
+/obj/machinery/door/airlock/angled_tgmc/wide/generic{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"eEs" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/spray/cleaner{
+ desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back.";
+ name = "Surgery Cleaner";
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eFb" = (
+/obj/structure/flora/ausbushes/leafybush,
+/obj/item/weapon/bone,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"eFo" = (
+/obj/machinery/computer/centrifuge,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"eGK" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell27)
+"eHZ" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/gloves{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eIu" = (
+/turf/simulated/wall/tgmc/redstripe,
+/area/redgate/facility/security)
+"eJr" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/mmi/digital/robot,
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"eJY" = (
+/obj/structure/closet/secure_closet/medical_wall/anesthetics,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"eKa" = (
+/obj/structure/closet,
+/obj/random/cash/huge,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"eKf" = (
+/obj/structure/table/bench/padded,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"eKG" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"eKY" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/rugged,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"eLA" = (
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"eLJ" = (
+/obj/structure/closet{
+ name = "experimental tools"
+ },
+/obj/random/flashlight,
+/obj/random/flashlight,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"eMl" = (
+/obj/effect/floor_decal/corner/white/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"eMA" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/item/trash/rkibble,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eMJ" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"eMY" = (
+/obj/structure/bed/chair/sofa/corp/corner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"eNm" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"eNP" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/orangedouble,
+/turf/simulated/floor,
+/area/redgate/facility/office3)
+"eOs" = (
+/obj/machinery/portable_atmospherics/hydroponics,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/lab8)
+"eOx" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"eOC" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light,
+/obj/item/weapon/toy/desk/fan,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"eOF" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/mug,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"eOU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"ePT" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"eQB" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eRX" = (
+/obj/machinery/appliance/cooker/fryer,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"eSb" = (
+/obj/random/trash_pile,
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"eSO" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/hosdouble,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"eTa" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"eTB" = (
+/obj/structure/bed/chair/office/dark,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"eTL" = (
+/obj/structure/table/glass,
+/obj/item/stack/nanopaste,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eUm" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/storage/firstaid/surgery,
+/obj/item/device/robotanalyzer,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"eUE" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"eUU" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"eVn" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"eVD" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"eWk" = (
+/obj/item/weapon/weldingtool/mini,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"eWF" = (
+/obj/random/cutout,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"eYb" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/item/modular_computer/laptop/preset/custom_loadout/elite,
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"eYi" = (
+/obj/machinery/light/flicker{
+ dir = 4
+ },
+/obj/structure/salvageable/server,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"eZe" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell21)
+"eZB" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"eZG" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell24)
+"faz" = (
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"fbb" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fbr" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = -4;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = 6;
+ pixel_y = 8
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = -7;
+ pixel_y = 4
+ },
+/obj/item/weapon/reagent_containers/glass/bottle/biomass{
+ pixel_x = 4;
+ pixel_y = 6
+ },
+/obj/effect/floor_decal/borderfloor,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fbT" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/window/northright{
+ dir = 2;
+ name = "Cargo Ordering";
+ req_access = list(50)
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fcf" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"fcq" = (
+/obj/structure/closet/walllocker_double/generic_civ/west,
+/obj/item/weapon/reagent_containers/food/condiment/enzyme{
+ layer = 5
+ },
+/obj/item/weapon/reagent_containers/food/condiment/enzyme{
+ layer = 5
+ },
+/obj/item/weapon/storage/box/beakers{
+ name = "box of measuring cups";
+ pixel_x = 2;
+ pixel_y = 3;
+ starts_with = list(/obj/item/weapon/reagent_containers/glass/beaker/measuring_cup = 7)
+ },
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fcr" = (
+/obj/structure/table/hardwoodtable,
+/obj/structure/closet/walllocker_double/medical/south,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/obj/item/weapon/reagent_containers/food/snacks/burger/bacon,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"fcs" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/sink/countertop{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fcz" = (
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"fdh" = (
+/obj/machinery/computer/operating,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fex" = (
+/obj/machinery/chem_master,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"ffr" = (
+/obj/structure/filingcabinet/chestdrawer{
+ desc = "A large drawer filled with autopsy reports.";
+ name = "Autopsy Reports"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"ffv" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ffI" = (
+/obj/item/weapon/storage/box/bodybags,
+/obj/item/weapon/storage/box/bodybags,
+/obj/item/weapon/storage/box/bodybags,
+/obj/structure/closet/walllocker_double/medical/north,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fgq" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"fgB" = (
+/obj/structure/table/steel,
+/obj/item/weapon/card/id/keycard,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fgH" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/defib_kit/jumper_kit,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"fgM" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"fhd" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"fhI" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/sink/countertop{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fhP" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/techfloor{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"fil" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell14)
+"fiY" = (
+/obj/structure/table/woodentable,
+/obj/random/maintenance/research,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"fjn" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"fjI" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"fjS" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/item/weapon/material/knife/butch,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fjU" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/random/maintenance,
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/ne)
+"fkl" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"flb" = (
+/obj/structure/bed/chair/sofa/corp/left,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"flg" = (
+/obj/random/fantasy_item,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"flt" = (
+/obj/structure/salvageable/implant_container,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"flE" = (
+/obj/structure/closet/l3closet/scientist,
+/obj/random/maintenance/morestuff,
+/obj/random/maintenance/engineering,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"fms" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/obj/structure/filingcabinet/filingcabinet{
+ density = 0;
+ pixel_x = -6;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"fmt" = (
+/obj/structure/table/hardwoodtable,
+/obj/random/maintenance,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"fmS" = (
+/obj/structure/salvageable/autolathe,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"fnl" = (
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"fny" = (
+/obj/machinery/vending/hydronutrients,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"fnR" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"foz" = (
+/obj/effect/floor_decal/atoll/moss/random,
+/obj/structure/flora/pottedplant/bamboo{
+ layer = 4;
+ pixel_y = 11
+ },
+/turf/simulated/floor/atoll,
+/area/redgate/facility/cell16)
+"fpf" = (
+/obj/machinery/light/floortube{
+ dir = 8;
+ pixel_x = -6
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"fqo" = (
+/obj/machinery/light/floortube{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/nw)
+"fqE" = (
+/turf/simulated/floor/maglev,
+/area/redgate/facility/nw)
+"frw" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"frx" = (
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_4"
+ },
+/obj/structure/grille,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"frO" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/backed_grey{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"frV" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/tree/jungle{
+ icon_scale_x = 1.5;
+ icon_scale_y = 1.5
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"fse" = (
+/turf/simulated/shuttle/wall,
+/area/redgate/facility/tram)
+"fsj" = (
+/obj/machinery/light/flamp,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/cell2)
+"ftt" = (
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"ftN" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/ywflowers,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"fub" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell15)
+"fug" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"fuo" = (
+/obj/machinery/washing_machine,
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fuY" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell10)
+"fvf" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"fvM" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"fvS" = (
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"fwk" = (
+/obj/structure/table/reinforced,
+/obj/effect/floor_decal/spline/plain{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"fxe" = (
+/obj/effect/floor_decal/corner/blue/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"fxx" = (
+/obj/structure/closet/chefcloset,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fys" = (
+/obj/machinery/power/emitter{
+ anchored = 1;
+ icon_state = "emitter1";
+ state = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"fyM" = (
+/obj/structure/toilet/prison{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"fzd" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/sofa/corp,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"fzm" = (
+/obj/structure/dancepole,
+/mob/living/simple_mob/vore/succubus,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"fzq" = (
+/obj/structure/medical_stand,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fzK" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"fAc" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"fAe" = (
+/obj/structure/table/standard,
+/obj/item/weapon/storage/box/monkeycubes,
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 4;
+ pixel_y = 28
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"fAs" = (
+/mob/living/simple_mob/vore/alienanimals/succlet,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"fAP" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"fBu" = (
+/obj/structure/closet/walllocker_double/science/south,
+/obj/random/maintenance/foodstuff,
+/obj/random/maintenance/foodstuff,
+/obj/random/maintenance/foodstuff,
+/obj/random/maintenance/foodstuff,
+/obj/random/maintenance/foodstuff,
+/obj/random/maintenance/foodstuff,
+/obj/random/maintenance/foodstuff,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"fBP" = (
+/obj/effect/floor_decal/corner/orange/border,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"fBW" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"fCk" = (
+/obj/effect/floor_decal/steeldecal/steel_decals6,
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 4
+ },
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fCx" = (
+/obj/effect/floor_decal/corner/pink/bordercorner,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"fCI" = (
+/obj/structure/prop/rock/sharp,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"fEd" = (
+/obj/random/junk,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"fEG" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"fER" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fFU" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite,
+/obj/item/weapon/storage/box/gloves,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"fFX" = (
+/obj/structure/table/glass,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"fGa" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"fGx" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"fHh" = (
+/obj/machinery/optable,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fHH" = (
+/obj/structure/table/steel,
+/obj/item/weapon/autopsy_scanner,
+/obj/item/weapon/surgical/scalpel,
+/obj/item/weapon/surgical/cautery,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fHQ" = (
+/obj/effect/floor_decal/arrivals,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"fHW" = (
+/obj/machinery/mecha_part_fabricator/pros{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"fIw" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fIH" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"fIS" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/computer/arcade,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"fIW" = (
+/obj/structure/table/reinforced,
+/obj/random/maintenance/foodstuff,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"fJS" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/tree/jungle_small,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"fKj" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"fKl" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"fKo" = (
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"fKY" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell9)
+"fLJ" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"fLK" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"fLR" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"fMx" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"fNe" = (
+/obj/machinery/chem_master/condimaster,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fNY" = (
+/obj/effect/decal/cleanable/blood/drip,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"fOy" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"fOI" = (
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"fOO" = (
+/obj/structure/table/woodentable,
+/obj/item/clothing/glasses/regular,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"fPE" = (
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"fPQ" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/medbay)
+"fPZ" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"fQa" = (
+/obj/structure/table/glass,
+/obj/item/device/defib_kit/loaded,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fQY" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/firstaid/surgery,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fRB" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"fRR" = (
+/obj/structure/morgue,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fRU" = (
+/obj/structure/morgue{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"fSN" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/structure/flora/pottedplant/crystal,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"fTs" = (
+/obj/effect/floor_decal/techfloor{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"fTR" = (
+/obj/item/clothing/shoes/heels,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"fUe" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"fUG" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"fUR" = (
+/obj/structure/closet,
+/obj/random/mainttoyloot/nofail,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"fVc" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/prop/rock/round,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"fVF" = (
+/obj/structure/bed/chair/office/dark,
+/obj/effect/floor_decal/carpet/blue,
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"fVL" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"fVM" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"fVS" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/structure/closet/walllocker_double/medical/west,
+/obj/item/device/megaphone,
+/turf/simulated/floor/wood,
+/area/redgate/facility/cell2)
+"fVZ" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fWl" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"fWF" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fWP" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border,
+/obj/item/device/defib_kit/loaded,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"fXP" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{
+ pixel_x = -3
+ },
+/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{
+ pixel_x = 3
+ },
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fYA" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"fZn" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"gaJ" = (
+/obj/random/forgotten_tram,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"gba" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Kleiner"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"gbm" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/storage/box/bodybags{
+ pixel_x = -1;
+ pixel_y = -2
+ },
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"gbT" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/flashlight/lamp,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"gcd" = (
+/mob/living/simple_mob/vore/alienanimals/catslug{
+ color = "#fda000";
+ name = "subject 24601"
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gcQ" = (
+/obj/structure/table/standard,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gdk" = (
+/obj/machinery/door/window{
+ dir = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"gdl" = (
+/obj/structure/smolebuilding/houses,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"gdx" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"gee" = (
+/obj/structure/bed/double/padded,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gen" = (
+/obj/effect/floor_decal/techfloor{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"ghg" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ghq" = (
+/obj/structure/disposalpipe/broken{
+ dir = 1
+ },
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/ne)
+"ghu" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ghx" = (
+/obj/effect/floor_decal/carpet/blue{
+ dir = 8
+ },
+/obj/effect/floor_decal/carpet/blue{
+ dir = 1
+ },
+/obj/effect/floor_decal/carpet/blue{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"ghA" = (
+/obj/machinery/atmospherics/pipe/simple/visible/green{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"ghT" = (
+/obj/structure/table/steel,
+/obj/item/device/integrated_circuit_printer,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"giI" = (
+/obj/effect/floor_decal/corner_steel_grid{
+ dir = 10
+ },
+/obj/machinery/bodyscanner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"gka" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 8
+ },
+/obj/structure/table/rack/steel,
+/obj/item/weapon/towel/random,
+/obj/random/soap,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"gki" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"gkp" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"gkx" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/sw)
+"gkS" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/mob/living/simple_mob/vore/raptor/yellow,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"gkW" = (
+/obj/structure/table/glass,
+/obj/machinery/chemical_dispenser/full,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"glb" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"glE" = (
+/turf/simulated/floor/carpet/blue,
+/area/redgate/facility/office2)
+"glW" = (
+/obj/effect/floor_decal/corner/grey/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"glX" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gmg" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"gmu" = (
+/turf/simulated/floor/wood,
+/area/redgate/facility/cell2)
+"gmH" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"gmR" = (
+/obj/machinery/computer/centrifuge,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"gmU" = (
+/obj/structure/table/woodentable,
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"gnc" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/storage/briefcase/inflatable{
+ pixel_y = 3
+ },
+/obj/item/weapon/storage/briefcase/inflatable{
+ pixel_x = -3
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"gnn" = (
+/obj/machinery/vending/dinnerware,
+/obj/effect/floor_decal/corner/beige{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gnz" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gnL" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"gpa" = (
+/obj/structure/morgue,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"gpX" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gqM" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"gqP" = (
+/obj/structure/morgue{
+ dir = 8
+ },
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"grC" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"gsA" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"gsB" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"gsU" = (
+/obj/structure/dogbed,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gsY" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"gtm" = (
+/mob/living/simple_mob/vore/alienanimals/succlet/big,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gtp" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"gty" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gtF" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"gtV" = (
+/obj/effect/floor_decal/techfloor/orange,
+/obj/structure/railing,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/tram)
+"guK" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/ne)
+"gvW" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/sink{
+ pixel_y = 22
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gvX" = (
+/obj/machinery/light/small,
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "cell_17";
+ pixel_x = -8;
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"gwD" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gxm" = (
+/obj/effect/floor_decal/carpet/blue{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"gyj" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell24)
+"gyS" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/tram)
+"gzb" = (
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"gzA" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/structure/disposaloutlet{
+ density = 0;
+ dir = 8;
+ pixel_x = 20
+ },
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"gzV" = (
+/obj/structure/closet/walllocker_double/science/east,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"gAk" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/sw)
+"gAm" = (
+/obj/effect/floor_decal/techfloor/orange{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/tram)
+"gAt" = (
+/obj/structure/closet/secure_closet/engineering_electrical/double{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"gAV" = (
+/obj/effect/floor_decal/spline/plain,
+/obj/structure/closet/walllocker_double/medical/west,
+/obj/item/clothing/under/suit_jacket/extravagant,
+/obj/item/clothing/under/suit_jacket/female/skirt,
+/obj/item/clothing/under/suit_jacket,
+/obj/item/clothing/shoes/dress,
+/turf/simulated/floor/wood,
+/area/redgate/facility/cell2)
+"gBc" = (
+/obj/structure/closet/wardrobe/pjs,
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gBz" = (
+/turf/simulated/floor/tiled/eris/bcircuit,
+/area/redgate/facility/ne)
+"gBF" = (
+/obj/item/stack/cable_coil,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"gCf" = (
+/turf/simulated/wall/tgmc/darkwall,
+/area/redgate/facility/nw)
+"gDA" = (
+/obj/effect/floor_decal/corner_steel_grid{
+ dir = 10
+ },
+/obj/machinery/sleeper{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"gDB" = (
+/obj/structure/smolebuilding/warehouses,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"gDM" = (
+/obj/structure/closet/secure_closet/security,
+/obj/machinery/light,
+/obj/random/grenade/less_lethal,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"gDT" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen,
+/obj/machinery/button/windowtint{
+ id = "cell_10";
+ pixel_x = 22
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"gEf" = (
+/obj/effect/floor_decal/industrial/warning/corner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"gEi" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gEo" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gFs" = (
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"gFU" = (
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/cell14)
+"gGp" = (
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gGD" = (
+/mob/living/simple_mob/vore/fennec/huge{
+ autodoom = 0;
+ ghostjoin = 1;
+ vore_bump_chance = 25;
+ vore_pounce_chance = 50
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gGG" = (
+/obj/structure/reagent_dispensers/virusfood{
+ pixel_x = 32;
+ pixel_y = -2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"gHp" = (
+/obj/machinery/disposal/wall{
+ dir = 4
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/table/reinforced,
+/obj/machinery/button/remote/blast_door{
+ dir = 4;
+ id = "raptor";
+ pixel_x = -24
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"gHz" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gIb" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gJa" = (
+/obj/structure/toilet{
+ pixel_y = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"gJq" = (
+/obj/effect/floor_decal/carpet/blue,
+/obj/effect/floor_decal/carpet/blue{
+ dir = 8
+ },
+/obj/effect/floor_decal/carpet/blue{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"gJu" = (
+/obj/machinery/recharge_station,
+/obj/effect/floor_decal/techfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"gJT" = (
+/obj/machinery/door/blast/regular{
+ id = "raptor"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"gKb" = (
+/obj/structure/closet/walllocker_double/science/east,
+/obj/random/pouch,
+/obj/random/medical/lite,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"gKi" = (
+/obj/structure/disposalpipe/segment{
+ dir = 2;
+ icon_state = "pipe-c"
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab5)
+"gLc" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ id_tag = "cell_7"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"gNW" = (
+/obj/structure/grille,
+/obj/item/weapon/material/shard,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"gOc" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"gOw" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office11)
+"gOZ" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gPt" = (
+/obj/structure/sign/levels/medical/cloning{
+ dir = 1
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/ne)
+"gPW" = (
+/obj/structure/table/standard,
+/obj/structure/table/standard,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"gQm" = (
+/obj/machinery/disease2/isolator,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"gQy" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gQH" = (
+/obj/random/junk,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"gRu" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office2)
+"gRw" = (
+/obj/structure/table/glass,
+/obj/item/weapon/tool/wrench,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"gSw" = (
+/obj/machinery/door/airlock/angled_tgmc/prep{
+ name = "green door";
+ req_access = list(803);
+ req_one_access = list(803)
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gSI" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"gSZ" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"gTf" = (
+/obj/structure/closet/emcloset,
+/obj/random/maintenance/engineering,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/button/remote/blast_door{
+ id = "facility_engine";
+ pixel_x = 9;
+ pixel_y = 26
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"gTQ" = (
+/obj/item/weapon/potion_material/glowing_gem,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gTY" = (
+/obj/structure/railing,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"gUC" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gVF" = (
+/obj/structure/closet,
+/obj/random/contraband/nofail,
+/obj/random/forgotten_tram,
+/obj/item/weapon/card/id/keycard/green,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"gVH" = (
+/obj/structure/table/hardwoodtable,
+/obj/machinery/light,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"gVZ" = (
+/obj/structure/flora/log2,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell24)
+"gWb" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/obj/structure/railing/grey,
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"gWp" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/item/clothing/accessory/stethoscope,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"gWC" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"gYD" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell2)
+"gYM" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/reagent_dispensers/water_cooler/full,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"gZj" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8;
+ pixel_y = 5
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"gZx" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hbE" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ id_tag = "cell_10"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"hbP" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light,
+/obj/structure/bed/chair/backed_grey{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"hcJ" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/ne)
+"hcR" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "office_4";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/structure/bed/psych,
+/obj/item/modular_computer/telescreen{
+ pixel_y = 25
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"hcZ" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/nw)
+"hdd" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hee" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hey" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"hez" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell24)
+"heL" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microwave/advanced,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"hfA" = (
+/obj/structure/prop/rock/water,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell26)
+"hgj" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell20)
+"hgB" = (
+/obj/random/trash_pile,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"hgH" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"hgV" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hho" = (
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"hhE" = (
+/obj/structure/flora/log1,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell3)
+"hhG" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"hhQ" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hhZ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"hjm" = (
+/obj/machinery/disposal/wall{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/obj/effect/floor_decal/corner/black/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hjo" = (
+/turf/simulated/wall/wood,
+/area/redgate/facility/ne)
+"hjQ" = (
+/obj/structure/reagent_dispensers/coolanttank,
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/ne)
+"hkg" = (
+/mob/living/simple_mob/animal/passive/fish/measelshark,
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/ne)
+"hlm" = (
+/obj/structure/table/standard,
+/obj/item/device/mass_spectrometer/adv,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"hly" = (
+/obj/random/junk,
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"hmI" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/obj/machinery/light/floortube{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hnz" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hnA" = (
+/obj/structure/table/glass,
+/obj/item/bodybag/cryobag{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/item/bodybag/cryobag,
+/obj/item/bodybag/cryobag{
+ pixel_x = 1;
+ pixel_y = 1
+ },
+/obj/item/bodybag/cryobag{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"hnC" = (
+/turf/unsimulated/wall/glamour,
+/area/redgate/facility/ne)
+"hom" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hpN" = (
+/obj/structure/bed/chair/shuttle{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor/white,
+/area/redgate/facility/tram)
+"hqg" = (
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/nw)
+"hqi" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hqB" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"hqL" = (
+/obj/effect/floor_decal/corner/lime/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hrq" = (
+/obj/structure/closet/masks,
+/obj/random/cash,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"hrw" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12;
+ pixel_y = 3
+ },
+/obj/structure/mirror{
+ dir = 8;
+ pixel_x = 26;
+ pixel_y = 5
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hrF" = (
+/obj/structure/table/standard,
+/obj/item/weapon/material/kitchen/rollingpin,
+/obj/item/weapon/material/knife/butch,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hrI" = (
+/obj/structure/table/borosilicate,
+/obj/random/maintenance/engineering,
+/obj/effect/floor_decal/techfloor,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"hrT" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/obj/random/vendorall,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hsn" = (
+/obj/structure/closet/l3closet/janitor,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"hso" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/nw)
+"hsx" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hsB" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/ne)
+"htr" = (
+/obj/machinery/atmospherics/pipe/simple/visible/green{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"htQ" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/dropper,
+/obj/item/weapon/reagent_containers/glass/beaker{
+ pixel_x = 5
+ },
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"htX" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"htY" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hul" = (
+/obj/effect/floor_decal/corner_steel_grid{
+ dir = 10
+ },
+/obj/machinery/sleep_console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"hum" = (
+/obj/structure/table/standard,
+/obj/item/clothing/gloves/sterile/nitrile,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"huJ" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"hwd" = (
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"hwl" = (
+/obj/structure/toilet{
+ dir = 1
+ },
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office2)
+"hwo" = (
+/obj/effect/floor_decal/industrial/warning,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hyx" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"hyG" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hze" = (
+/obj/machinery/door/airlock/angled_tgmc/wide/generic,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hzN" = (
+/obj/machinery/disposal/wall{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/obj/effect/floor_decal/corner/lime/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hAl" = (
+/obj/effect/floor_decal/corner/lime/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hAX" = (
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"hCa" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ dir = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hEa" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/nw)
+"hEA" = (
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"hFv" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"hFK" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"hFS" = (
+/obj/structure/flora/ausbushes/leafybush,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/structure/disposaloutlet{
+ pixel_y = 18
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"hGa" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hGU" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hGY" = (
+/obj/structure/table/glass,
+/obj/item/roller,
+/obj/item/roller{
+ pixel_y = 8
+ },
+/obj/item/roller{
+ pixel_y = 16
+ },
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"hHs" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/floor_decal/industrial/loading{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hHy" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hHB" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell3)
+"hHI" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"hHS" = (
+/obj/structure/table/standard,
+/obj/random/maintenance/foodstuff,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hIB" = (
+/obj/structure/flora/tree/jungle{
+ icon_scale_x = 1.5;
+ icon_scale_y = 1.5
+ },
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"hIR" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/tree/jungle_small,
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"hJp" = (
+/obj/structure/closet,
+/obj/random/bluespace,
+/obj/machinery/light,
+/obj/random/carp_plushie,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hJz" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_sec"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office10)
+"hJD" = (
+/obj/structure/closet,
+/obj/random/contraband/nofail,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hJO" = (
+/obj/structure/bed/chair/sofa/corp/corner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hKh" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/obj/item/stack/cable_coil,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"hKi" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/nw)
+"hKV" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell27)
+"hLa" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/stamp/denied{
+ pixel_x = 4;
+ pixel_y = -2
+ },
+/obj/item/weapon/stamp/accepted,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hLq" = (
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"hLH" = (
+/turf/unsimulated/wall/dark,
+/area/redgate/facility/cell9)
+"hLT" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"hMK" = (
+/obj/structure/flora/ausbushes/leafybush,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/obj/structure/disposaloutlet{
+ pixel_y = 18
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"hMN" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/nw)
+"hNb" = (
+/obj/structure/table/woodentable,
+/obj/item/device/flashlight/lamp/green{
+ pixel_y = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"hNR" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"hNU" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{
+ pixel_x = 9;
+ pixel_y = 17
+ },
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hNY" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hOu" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office9)
+"hON" = (
+/obj/structure/closet,
+/obj/random/forgotten_tram,
+/obj/random/forgotten_tram,
+/obj/random/tank,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/nw)
+"hOS" = (
+/mob/living/simple_mob/vore/sonadile,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"hOT" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/floor_decal/industrial/loading{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hPg" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"hRM" = (
+/turf/simulated/shuttle/floor/black,
+/area/redgate/facility/cell19)
+"hRO" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"hSt" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/leafybush,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"hTi" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/structure/bed/chair/sofa/corp{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"hTy" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"hTz" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"hTP" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ id_tag = "cell_2"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell1)
+"hTY" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell13)
+"hUI" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 10
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hVM" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office6)
+"hWk" = (
+/obj/effect/floor_decal/corner/lime/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"hWM" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"hXi" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hXt" = (
+/obj/effect/floor_decal/corner/blue/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"hXH" = (
+/obj/structure/bed/chair/sofa/corner/orange{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/black/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hXX" = (
+/obj/item/weapon/paper/crumpled,
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"hYb" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"hYC" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/bottle/dermaline,
+/obj/item/weapon/reagent_containers/glass/bottle/dermaline,
+/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
+/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"hYS" = (
+/obj/machinery/light/small,
+/obj/structure/lattice,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"hZW" = (
+/obj/structure/salvageable/implant_container,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"iai" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"iaS" = (
+/obj/effect/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"icc" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"icD" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"icP" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/office1)
+"idc" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/stalkybush,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"idD" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"idZ" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/ne)
+"ief" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 1
+ },
+/obj/machinery/disposal/wall{
+ dir = 8
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"iew" = (
+/obj/structure/fireplace{
+ dir = 4;
+ pixel_x = -7
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"ieY" = (
+/obj/machinery/power/rad_collector,
+/turf/simulated/floor/tiled/monotile,
+/area/redgate/facility/cell29)
+"ifo" = (
+/mob/living/simple_mob/vore/cryptdrake/albedo,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"ifG" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"ifI" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"igb" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"igk" = (
+/obj/structure/table/steel,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"igu" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"igR" = (
+/obj/structure/grille/broken,
+/obj/item/weapon/material/shard,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"igU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"ihg" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"iiy" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"iiS" = (
+/obj/structure/bed/chair/sofa/right/orange{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ijj" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"ijU" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 6
+ },
+/obj/effect/floor_decal/transit/orange{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"ijV" = (
+/obj/effect/floor_decal/corner/red/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"ikz" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ikK" = (
+/obj/effect/floor_decal/borderfloorwhite,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"ilo" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"ilT" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"imo" = (
+/obj/structure/salvageable/data,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"imr" = (
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"ims" = (
+/obj/structure/prop/rock/small,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"ino" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 1
+ },
+/obj/structure/window/reinforced/tinted{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office2)
+"inz" = (
+/obj/structure/flora/tree/jungle,
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"inN" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/leafybush,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"inU" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"inW" = (
+/obj/structure/prop/rock/sharp,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"iod" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"iop" = (
+/mob/living/simple_mob/animal/space/alien/drone{
+ ai_holder_type = /datum/ai_holder/simple_mob/vore
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"ioF" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_4"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"ioW" = (
+/obj/structure/closet/secure_closet/personal,
+/obj/item/clothing/under/bathrobe,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"ipg" = (
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_2"
+ },
+/obj/structure/grille,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell1)
+"ipG" = (
+/obj/effect/floor_decal/corner/white/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"ipH" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"iqw" = (
+/obj/structure/table/woodentable,
+/obj/random/snack,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"iqH" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"iqJ" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"irw" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"irW" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell13)
+"isf" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"isi" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"isw" = (
+/obj/machinery/door/airlock/angled_tgmc/engineering{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/monotile,
+/area/redgate/facility/cell29)
+"isI" = (
+/obj/random/vendorall{
+ dir = 4;
+ pixel_x = -8
+ },
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"itM" = (
+/obj/structure/table/hardwoodtable,
+/obj/structure/table/hardwoodtable,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"iue" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iuk" = (
+/obj/structure/girder,
+/obj/machinery/atmospherics/pipe/simple/visible/green{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"iuq" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"iuu" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab5)
+"iuM" = (
+/obj/item/weapon/paper/crumpled,
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iuQ" = (
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"ivl" = (
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ivv" = (
+/obj/structure/table/reinforced,
+/obj/random/smes_coil,
+/obj/machinery/light,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"iwj" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"ixw" = (
+/obj/structure/flora/tree/jungle{
+ icon_scale_x = 1.5;
+ icon_scale_y = 1.5
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"ixX" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/vending/snlvend{
+ dir = 4;
+ pixel_x = -8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"ixZ" = (
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/ne)
+"izU" = (
+/obj/machinery/atmospherics/pipe/simple/visible/green{
+ dir = 4
+ },
+/obj/random/maintenance,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"iAU" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"iBl" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"iBw" = (
+/turf/simulated/wall/tgmc/redstripe,
+/area/redgate/facility/office10)
+"iBR" = (
+/obj/structure/bed/chair/bay/chair/padded/red/bignest,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"iCc" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "office_5"
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"iCi" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"iDb" = (
+/obj/structure/closet,
+/obj/random/instrument,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iDk" = (
+/obj/machinery/light,
+/turf/simulated/floor/water/contaminated,
+/area/redgate/facility/ne)
+"iEk" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/table/reinforced,
+/obj/structure/sink/countertop{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"iEm" = (
+/obj/structure/bed/chair/sofa/left/orange{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iEH" = (
+/obj/machinery/button/remote/blast_door{
+ dir = 8;
+ id = "creature";
+ pixel_x = 25
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"iEJ" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/visible/red,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"iFb" = (
+/obj/structure/closet,
+/obj/random/energy/sec,
+/obj/random/flashlight,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iFi" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"iHH" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"iHJ" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/obj/structure/sink{
+ pixel_y = 16
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"iHL" = (
+/obj/effect/floor_decal/rust,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"iIy" = (
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/vehicle/train/engine{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"iIY" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell25)
+"iJi" = (
+/obj/structure/prop/rock/flat,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"iJk" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"iJw" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/mob/living/simple_mob/vore/aggressive/giant_snake{
+ ai_holder_type = /datum/ai_holder/simple_mob/vore;
+ vore_bump_chance = 50;
+ vore_default_mode = "Hold";
+ vore_digest_chance = 0;
+ vore_pounce_chance = 100
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"iJy" = (
+/obj/structure/closet/secure_closet/freezer/fridge,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/item/weapon/reagent_containers/food/snacks/superbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/superbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/superbiteburger,
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake,
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake,
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake,
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake,
+/obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake,
+/obj/item/weapon/reagent_containers/food/snacks/pancakes,
+/obj/item/weapon/reagent_containers/food/snacks/onionrings,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"iKG" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/reagent_containers/food/snacks/nachos,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"iLu" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "office_5";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = 9
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"iMT" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"iNs" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"iPx" = (
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"iQz" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iQO" = (
+/obj/structure/closet,
+/obj/random/tool/alien,
+/obj/item/device/megaphone,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iRl" = (
+/obj/item/modular_computer/console,
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iRw" = (
+/obj/structure/table/standard,
+/obj/machinery/microwave,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"iSB" = (
+/obj/structure/table/standard,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iSE" = (
+/obj/machinery/door/window{
+ dir = 8
+ },
+/obj/machinery/door/window,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"iSV" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/turf/unsimulated/shuttle/plating,
+/area/redgate/facility/tram)
+"iTs" = (
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"iTw" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/reagent_containers/food/drinks/teapot,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"iUd" = (
+/obj/structure/bed/chair/sofa/corner/orange{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/black/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iUq" = (
+/obj/structure/table/standard,
+/obj/random/coin,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iUt" = (
+/mob/living/simple_mob/vore/jelly,
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"iUA" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/office1)
+"iVl" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"iVL" = (
+/obj/item/weapon/paper,
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iWh" = (
+/obj/item/weapon/paper/crumpled/bloody{
+ info = "Report: The Canidfelanis specimens have take a sudden disliking to the lights in their study cell. It's becoming difficult to obser
+ },
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"iXt" = (
+/obj/structure/table/reinforced,
+/obj/random/powercell,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"iXT" = (
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/vehicle/train/trolley{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"iYe" = (
+/turf/simulated/shuttle/floor/alien,
+/area/redgate/facility/cell19)
+"iYV" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/mech_toy,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"iZa" = (
+/obj/structure/table/rack/steel,
+/obj/item/weapon/gun/energy/sickshot,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"iZh" = (
+/obj/structure/flora/ausbushes/reedbush,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jab" = (
+/obj/structure/flora/ausbushes/fernybush,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell27)
+"jbs" = (
+/obj/structure/prop/rock,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jbG" = (
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"jbI" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"jbN" = (
+/obj/effect/floor_decal/corner/white/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"jcf" = (
+/obj/structure/table/standard,
+/obj/item/weapon/entrepreneur/emf,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"jcm" = (
+/obj/structure/table/woodentable,
+/obj/structure/sink/countertop{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jcT" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"jcX" = (
+/obj/structure/table/glass,
+/obj/item/device/healthanalyzer,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jfC" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_5"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office9)
+"jhi" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/potion_base/aqua_regia,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"jhV" = (
+/obj/effect/floor_decal/corner_steel_grid{
+ dir = 10
+ },
+/obj/structure/medical_stand,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"jiV" = (
+/obj/structure/table/standard,
+/obj/item/instrument/saxophone/spectral,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"jjY" = (
+/obj/structure/table/standard,
+/obj/item/clothing/ears/earmuffs,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jkm" = (
+/obj/structure/prop/machine/alien_tank/starts_broken,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"jkQ" = (
+/obj/structure/table/glass,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"jkW" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"jkX" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen/fountain3,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"jla" = (
+/obj/item/weapon/card/id/keycard/blue,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"jlr" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"jlE" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jlP" = (
+/obj/structure/table/reinforced,
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"jmv" = (
+/turf/simulated/wall/solidrock,
+/area/redgate/facility/cell20)
+"jmw" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jmK" = (
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jmP" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/office1)
+"jmR" = (
+/obj/machinery/disposal/wall,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"jnT" = (
+/obj/structure/table/rack/shelf,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"joV" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"joZ" = (
+/obj/machinery/light/broken,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"jqH" = (
+/obj/structure/table/reinforced,
+/obj/machinery/cell_charger,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"jrc" = (
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/vehicle/train/trolley{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"jrI" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"jrO" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_4";
+ opacity = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"jrR" = (
+/obj/structure/table/reinforced,
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"jsE" = (
+/obj/structure/prop/rock/watersharp,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell3)
+"jsN" = (
+/obj/structure/prop/rock/round,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jtc" = (
+/obj/item/weapon/material/shard,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"jvQ" = (
+/obj/structure/flora/tree/jungle,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jwg" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"jws" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microwave,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jwL" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -24
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"jxW" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"jxX" = (
+/obj/effect/floor_decal/rust,
+/obj/random/maintenance,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"jyY" = (
+/obj/structure/flora/rocks1,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jzn" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/tram)
+"jAq" = (
+/obj/machinery/appliance/cooker/oven,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jAG" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Q. T. Gutslut"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"jAJ" = (
+/obj/structure/table/rack/shelf/wood,
+/obj/item/device/slow_sizegun,
+/obj/machinery/light,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jBu" = (
+/obj/structure/closet/cabinet,
+/obj/item/clothing/under/dress/bluedress,
+/obj/machinery/button/windowtint{
+ id = "cell_2";
+ pixel_x = 22
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jBv" = (
+/obj/machinery/atmospherics/pipe/simple/visible/green,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"jCi" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"jCk" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"jCv" = (
+/obj/structure/closet/walllocker_double/science/east,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"jCw" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"jDE" = (
+/obj/item/weapon/storage/vore_egg/slimeglob{
+ name = "sect egg clutch"
+ },
+/turf/simulated/floor/tiled/dark,
+/area/redgate/facility/cell10)
+"jDH" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"jEd" = (
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/cell12)
+"jFd" = (
+/obj/structure/bed/chair/bay/chair/padded/red/bignest,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"jFf" = (
+/obj/structure/closet,
+/obj/random/unidentified_medicine,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jFi" = (
+/obj/effect/floor_decal/rust,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"jFt" = (
+/mob/living/simple_mob/vore/jelly,
+/obj/effect/floor_decal/rust,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"jGJ" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell22)
+"jGO" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jHC" = (
+/obj/machinery/light/floortube{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/nw)
+"jHO" = (
+/obj/structure/prop/rock/small/wateralt,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell3)
+"jIr" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"jIy" = (
+/turf/simulated/floor/tiled/eris/dark/monofloor,
+/area/redgate/facility/ne)
+"jIJ" = (
+/obj/machinery/light,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell3)
+"jJi" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"jJk" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/leafybush,
+/obj/machinery/light,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jJy" = (
+/obj/structure/table/glass,
+/obj/random/firstaid,
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"jKM" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"jLd" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell3)
+"jLf" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell23)
+"jLi" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"jLq" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jLP" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office8)
+"jMI" = (
+/obj/structure/table/woodentable,
+/obj/machinery/recharger,
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/cell2)
+"jMW" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jNH" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jOf" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"jOx" = (
+/obj/machinery/optable,
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/item/device/mmi/digital/posibrain,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"jOG" = (
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "office_3";
+ pixel_x = 8;
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -24
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"jPg" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jPl" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 8
+ },
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"jPE" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/obj/structure/closet/walllocker_double/medical/north,
+/obj/random/medical/pillbottle,
+/obj/random/medical/pillbottle,
+/obj/random/medical{
+ pixel_x = -4;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"jPH" = (
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = -32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"jQJ" = (
+/obj/structure/flora/ausbushes/stalkybush,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"jRh" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light/flicker,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jRo" = (
+/turf/simulated/floor/maglev,
+/area/redgate/facility/sw)
+"jRK" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"jSd" = (
+/obj/structure/filingcabinet/chestdrawer,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"jSy" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"jSB" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"jTs" = (
+/obj/item/weapon/potion_material/folded_dark,
+/turf/unsimulated/floor/dark,
+/area/redgate/facility/cell9)
+"jUm" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"jUM" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/mmi,
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"jUS" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jUV" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"jVG" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"jVL" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"jVY" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"jWd" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"jWJ" = (
+/obj/structure/closet/walllocker/wooden/north,
+/obj/item/toy/russian_revolver/trick_revolver,
+/obj/item/toy/russian_revolver/trick_revolver,
+/obj/item/clothing/gloves/sterile/nitrile,
+/obj/item/clothing/gloves/sterile/nitrile,
+/obj/item/clothing/gloves/sterile/nitrile,
+/obj/item/clothing/suit/storage/toggle/labcoat,
+/turf/simulated/floor,
+/area/redgate/facility/office3)
+"jXN" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"jYL" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"jYX" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"jZd" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"jZu" = (
+/obj/structure/bed/chair/backed_grey,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"jZX" = (
+/obj/structure/bed/double/padded{
+ icon_scale_x = 2;
+ icon_scale_y = 2
+ },
+/obj/item/weapon/bedsheet/rddouble{
+ icon_scale_x = 2;
+ icon_scale_y = 2
+ },
+/obj/item/toy/plushie/bigcat{
+ layer = 5
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"kaO" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"kaX" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/sofa/corp/left,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"kcS" = (
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"kdu" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kek" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"keC" = (
+/obj/structure/railing,
+/obj/structure/closet/boxinggloves,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"kfj" = (
+/obj/machinery/vr_sleeper,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/office2)
+"kfk" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "J. Doe"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kfs" = (
+/obj/machinery/replicator/vore,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/office2)
+"kfZ" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/entrance)
+"kgn" = (
+/obj/random/trash_pile,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"kgN" = (
+/obj/structure/flora/pottedplant/unusual,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"kgZ" = (
+/turf/simulated/floor/maglev,
+/area/redgate/facility/tram)
+"khn" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/gun/energy/sizegun,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/office2)
+"khA" = (
+/obj/item/weapon/bedsheet/pillow/black,
+/turf/unsimulated/floor/dark,
+/area/redgate/facility/cell9)
+"kjk" = (
+/obj/effect/floor_decal/corner/pink/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"kjq" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/clothing/accessory/collar/shock/bluespace,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/office2)
+"kjS" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"kkq" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office2)
+"klF" = (
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -24
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"klI" = (
+/obj/machinery/appliance/cooker/grill,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"klU" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/obj/machinery/atmospherics/portables_connector,
+/obj/effect/floor_decal/techfloor{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"klV" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"knI" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell24)
+"kok" = (
+/obj/machinery/power/emitter{
+ anchored = 1;
+ icon_state = "emitter1";
+ state = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"koA" = (
+/obj/effect/decal/cleanable/blood,
+/turf/simulated/floor,
+/area/redgate/facility/office2)
+"koE" = (
+/obj/structure/railing,
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"koI" = (
+/turf/simulated/shuttle/floor/alienplating,
+/area/redgate/facility/cell19)
+"kpd" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell8)
+"kpe" = (
+/turf/simulated/floor,
+/area/redgate/facility/tram)
+"kpi" = (
+/obj/structure/railing,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"kqK" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"krr" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/tool/power,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/office2)
+"ktr" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/se)
+"ktG" = (
+/obj/machinery/optable,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/office2)
+"ktI" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/assembly/signaler,
+/obj/item/device/assembly/signaler,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/office2)
+"ktY" = (
+/obj/machinery/light/broken{
+ dir = 8
+ },
+/obj/machinery/recharge_station,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"kuz" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"kuI" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell13)
+"kvg" = (
+/obj/machinery/light/floortube{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/tram)
+"kvy" = (
+/obj/machinery/light/floortube{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/tram)
+"kwc" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kwz" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/office2)
+"kxZ" = (
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"kyf" = (
+/turf/simulated/wall/tgmc/whitewall{
+ can_open = 1
+ },
+/area/redgate/facility/office2)
+"kyg" = (
+/obj/item/stack/cable_coil,
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"kyI" = (
+/obj/random/trash_pile,
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"kzH" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"kzP" = (
+/obj/structure/table/standard,
+/obj/item/device/flashlight/lamp/green,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"kzS" = (
+/obj/structure/railing,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"kAx" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/microscope,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kBo" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell24)
+"kBE" = (
+/obj/structure/closet/secure_closet/freezer/fridge,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kBS" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"kBV" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"kCk" = (
+/obj/structure/table/woodentable,
+/obj/item/device/flashlight/lamp/green{
+ pixel_y = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office3)
+"kEd" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/maintenance/research,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kEo" = (
+/obj/machinery/door/blast/regular{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/sw)
+"kEE" = (
+/obj/effect/floor_decal/borderfloor,
+/obj/effect/floor_decal/corner/lightgrey/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kEJ" = (
+/obj/structure/closet/secure_closet/egg/xenomorph,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"kER" = (
+/obj/machinery/power/rad_collector,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"kFg" = (
+/obj/effect/floor_decal/industrial/warning,
+/obj/machinery/atmospherics/pipe/simple/hidden/cyan,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/lab2)
+"kGt" = (
+/obj/structure/table/woodentable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kGK" = (
+/obj/structure/table/borosilicate,
+/obj/item/device/pda,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"kHg" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"kHs" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"kIf" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kIA" = (
+/obj/structure/table/reinforced,
+/obj/random/tech_supply/nofail,
+/obj/machinery/light,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"kKl" = (
+/obj/effect/floor_decal/corner/black/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"kKm" = (
+/obj/structure/bed/double/padded,
+/obj/item/weapon/bedsheet/hopdouble,
+/turf/simulated/floor/carpet/blue,
+/area/redgate/facility/office2)
+"kKp" = (
+/obj/structure/flora/ausbushes/fernybush,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"kKs" = (
+/obj/structure/janitorialcart,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"kKK" = (
+/obj/machinery/door/blast/multi_tile/two_tile_hor{
+ id = "lab_explo"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/securitylobby)
+"kLg" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"kLu" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"kLB" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell19)
+"kLN" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"kLO" = (
+/obj/random/vendorall{
+ dir = 4;
+ pixel_x = -8
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kNc" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/ne)
+"kNT" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"kOt" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kPd" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"kPt" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"kPP" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/random/vendorall{
+ dir = 4;
+ pixel_x = -8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"kQh" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "office_2";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kQT" = (
+/obj/structure/table/woodentable,
+/obj/item/trash/plate,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/obj/item/weapon/reagent_containers/food/snacks/variable/cookie,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"kRs" = (
+/obj/structure/smoletrack/roadS,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"kRX" = (
+/obj/structure/flora/ausbushes/reedbush,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell27)
+"kSx" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"kSD" = (
+/obj/machinery/door/window{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office2)
+"kTf" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"kTY" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell24)
+"kWe" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"kWx" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/fountain3,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"kXk" = (
+/obj/item/weapon/mop,
+/obj/item/weapon/reagent_containers/glass/bucket,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"kXM" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"kYa" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"kYi" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/securitylobby)
+"kYk" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/computer/security{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"kZb" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"kZk" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/nw)
+"kZJ" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"kZK" = (
+/obj/structure/reagent_dispensers/water_cooler/full,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"lbm" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"lbB" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/vending/coffee,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"lbD" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"lbS" = (
+/obj/structure/closet/secure_closet/freezer/meat,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"lcc" = (
+/obj/machinery/porta_turret/lasertag{
+ name = "containment turret"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"lcG" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"ldG" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/ne)
+"leA" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/structure/reagent_dispensers/water_cooler/full,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"leM" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"lgq" = (
+/obj/structure/bed/chair/shuttle{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor/white,
+/area/redgate/facility/tram)
+"lgS" = (
+/obj/random/vendorall{
+ dir = 4;
+ pixel_x = -8
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lhN" = (
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"lhQ" = (
+/obj/structure/table/standard,
+/obj/item/weapon/towel/random,
+/obj/item/weapon/towel/random,
+/obj/item/weapon/towel/random,
+/obj/item/weapon/towel/random,
+/obj/effect/floor_decal/corner/grey{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"lil" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"lis" = (
+/obj/effect/floor_decal/atoll/border{
+ dir = 1
+ },
+/turf/simulated/floor/atoll,
+/area/redgate/facility/cell16)
+"lje" = (
+/obj/machinery/light,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"ljM" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lkv" = (
+/obj/machinery/deployable/barrier,
+/obj/effect/floor_decal/industrial/hatch/yellow,
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 4;
+ pixel_y = 29
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"lkT" = (
+/turf/simulated/floor,
+/area/redgate/facility/cell15)
+"llb" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/structure/table/woodentable,
+/turf/simulated/floor/wood,
+/area/redgate/facility/cell2)
+"llf" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 10
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 9
+ },
+/obj/structure/curtain/open/shower,
+/obj/machinery/shower{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office2)
+"llG" = (
+/obj/structure/closet/cabinet,
+/turf/simulated/floor/carpet/blue,
+/area/redgate/facility/office2)
+"lnj" = (
+/obj/structure/closet/jequipcloset,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"lnr" = (
+/obj/machinery/chem_master,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"lnw" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "cell_13";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"lof" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"lot" = (
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "custodial_closet_1";
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"loS" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"lpm" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/reagent_containers/food/snacks/packaged/scotchegg,
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"lqI" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/obj/machinery/button/windowtint{
+ id = "office_sec";
+ pixel_x = -22
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"lrk" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "office_sec";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 26;
+ pixel_y = -9
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"lrp" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"lrx" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/material/knife/butch,
+/obj/effect/floor_decal/industrial/warning,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"lrQ" = (
+/obj/structure/flora/tree/jungle,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"lsa" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"lsB" = (
+/obj/machinery/vending/bepis,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"lsE" = (
+/obj/machinery/porta_turret/lasertag{
+ name = "containment turret"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"lsF" = (
+/obj/machinery/porta_turret/lasertag{
+ name = "containment turret"
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell2)
+"ltn" = (
+/obj/structure/table/woodentable,
+/obj/machinery/alembic{
+ pixel_y = 7
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"ltK" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"ltM" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/cell10)
+"luh" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"luA" = (
+/obj/machinery/recharge_station,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"luR" = (
+/obj/effect/floor_decal/corner/white/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lvB" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lvV" = (
+/obj/structure/smolebuilding/museum,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"lwQ" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "custodial_closet_1";
+ name = "custodial closet"
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"lwV" = (
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab3)
+"lxJ" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/ne)
+"lyw" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"lzj" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"lAj" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"lAv" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"lAR" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"lBd" = (
+/obj/machinery/door/airlock/angled_tgmc/security{
+ id_tag = "office_sec"
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"lBQ" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"lCS" = (
+/obj/structure/reagent_dispensers/water_cooler/full{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"lEn" = (
+/obj/machinery/porta_turret/lasertag{
+ name = "containment turret"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell13)
+"lEz" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"lFA" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell13)
+"lFI" = (
+/obj/structure/table/woodentable,
+/obj/structure/sink/countertop,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"lGB" = (
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"lHt" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/obj/machinery/light_switch{
+ dir = 1;
+ pixel_y = -24
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"lHL" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"lJe" = (
+/obj/structure/reagent_dispensers/foam,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"lJy" = (
+/obj/structure/closet,
+/obj/random/mainttoyloot/nofail,
+/obj/random/cargopod,
+/obj/random/cargopod,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"lKA" = (
+/obj/structure/flora/tree/jungle_small,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"lLo" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"lLp" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"lMF" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lNc" = (
+/obj/machinery/door/blast/regular{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/nw)
+"lOs" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lOu" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lPE" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"lQg" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"lQM" = (
+/obj/machinery/door/blast/regular/open,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"lQW" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/tram)
+"lRc" = (
+/obj/structure/bed/chair/office/dark,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"lRe" = (
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"lRl" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/salvageable/personal,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"lRn" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"lRs" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"lSe" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"lSf" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"lSn" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"lSt" = (
+/obj/structure/disposalpipe/trunk{
+ dir = 8
+ },
+/obj/structure/disposaloutlet{
+ density = 0;
+ dir = 4;
+ pixel_x = -20
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"lSA" = (
+/obj/structure/closet,
+/obj/random/forgotten_tram,
+/obj/item/weapon/folder,
+/obj/item/weapon/folder,
+/obj/random/material/precious,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"lTA" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"lTL" = (
+/mob/living/simple_mob/vore/aggressive/frog{
+ ai_holder_type = /datum/ai_holder/simple_mob/retaliate
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"lUw" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"lUF" = (
+/obj/structure/flora/tree/jungle_small,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"lUK" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"lWt" = (
+/obj/structure/flora/ausbushes/stalkybush,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"lWz" = (
+/obj/structure/flora/pottedplant/mysterious{
+ pixel_y = 2
+ },
+/obj/machinery/door/window{
+ dir = 2;
+ pixel_y = -4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/office11)
+"lWC" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/microwave,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"lXb" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "office_2"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office2)
+"lZK" = (
+/obj/structure/closet/walllocker_double/generic_civ/north,
+/obj/random/medical/lite,
+/obj/random/material/precious,
+/obj/random/tool/power,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"maG" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/sw)
+"maY" = (
+/obj/structure/bed/chair/shuttle{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor/white,
+/area/redgate/facility/tram)
+"mbN" = (
+/obj/machinery/light/broken{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"mbR" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"mcu" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell22)
+"mcS" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"mdz" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"mdO" = (
+/obj/effect/floor_decal/emblem/aronai{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"mdS" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"mdU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/pink/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"meR" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"mfa" = (
+/obj/effect/floor_decal/techfloor{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"mfk" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"mfn" = (
+/obj/machinery/door/blast/regular/open,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mgh" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mgp" = (
+/obj/random/trash_pile,
+/obj/structure/railing{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell10)
+"mgu" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_22"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell27)
+"mgJ" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"mgQ" = (
+/obj/effect/floor_decal/techfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"mgU" = (
+/obj/machinery/computer/transhuman/resleeving,
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"mhH" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"mim" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office7)
+"miz" = (
+/obj/structure/table/woodentable,
+/obj/random/mug,
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"miQ" = (
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"mjq" = (
+/obj/structure/flora/ausbushes/fernybush,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell13)
+"mjP" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab5)
+"mkd" = (
+/obj/structure/closet,
+/obj/item/weapon/gun/energy/sizegun,
+/obj/item/weapon/storage/fancy/vials,
+/obj/item/weapon/storage/box/syringes,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"mkB" = (
+/obj/structure/closet/secure_closet/freezer/meat,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"mlk" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"mlo" = (
+/obj/effect/floor_decal/shuttle/handicap/yellow,
+/turf/simulated/shuttle/floor/white,
+/area/redgate/facility/tram)
+"mlx" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"mlM" = (
+/obj/structure/redgate/away,
+/turf/simulated/shuttle/floor/white,
+/area/redgate/facility/tram)
+"mmj" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"mmm" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/obj/effect/floor_decal/shuttle/loading/yellow{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"mmt" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"mnq" = (
+/obj/machinery/conveyor_switch/oneway{
+ id = "facility_Q"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/nw)
+"mnJ" = (
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"mnQ" = (
+/obj/structure/table/steel,
+/obj/item/weapon/storage/box/donut,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"moY" = (
+/obj/structure/grille/broken,
+/turf/simulated/floor,
+/area/redgate/facility/cell25)
+"mpg" = (
+/obj/structure/flora/pottedplant/unusual,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"mpt" = (
+/obj/machinery/button/windowtint{
+ id = "office_10";
+ pixel_x = -22
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"mqf" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mqg" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/window/plastitanium{
+ dir = 1
+ },
+/obj/structure/window/plastitanium{
+ dir = 8
+ },
+/obj/item/weapon/storage/box/donut,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mqH" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/fountain5,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"mqU" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/window/plastitanium{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mqZ" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"mrq" = (
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"mrs" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/champagne,
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"mse" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_3";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"msm" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"mtg" = (
+/obj/structure/table/steel,
+/obj/item/weapon/circuitboard/telecomms/pda_multicaster,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"mtn" = (
+/obj/machinery/vending/loadout/uniform,
+/obj/effect/floor_decal/borderfloor{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"mtA" = (
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell19)
+"mub" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"mvC" = (
+/obj/structure/bed/chair/sofa/corp/right,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"mwh" = (
+/obj/machinery/light/broken,
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"mwC" = (
+/obj/structure/closet/walllocker_double/security/west,
+/obj/item/weapon/melee/baton/cattleprod,
+/obj/random/maintenance/security,
+/obj/random/maintenance/security,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"mxL" = (
+/obj/structure/table/standard,
+/obj/machinery/recharger/wallcharger{
+ pixel_y = 23
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"mxS" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/nw)
+"mxV" = (
+/obj/structure/table/steel,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"mye" = (
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"myz" = (
+/obj/structure/table/glass,
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"myT" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"mza" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border,
+/obj/item/device/healthanalyzer,
+/obj/item/device/healthanalyzer,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"mzf" = (
+/obj/structure/bookcase/manuals/xenoarchaeology,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"mzU" = (
+/turf/simulated/wall/tgmc/darkwall,
+/area/redgate/facility/sw)
+"mBz" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/window/plastitanium{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mBP" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"mCf" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/backed_grey{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"mCg" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"mDx" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"mEs" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mEB" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/cyan,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"mEK" = (
+/obj/item/broken_device/random,
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"mEP" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"mFv" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mFW" = (
+/obj/structure/sink{
+ pixel_y = 8
+ },
+/obj/structure/mirror/raider{
+ pixel_y = 27
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"mGb" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"mGI" = (
+/turf/simulated/floor,
+/area/redgate/facility/cell25)
+"mGO" = (
+/obj/machinery/button/remote/airlock{
+ id = "cell_3";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"mHl" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ dir = 2
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"mHs" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"mHF" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"mHL" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"mHR" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/storage/fancy/vials,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"mHW" = (
+/obj/structure/table/glass,
+/obj/item/weapon/material/minihoe,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"mJl" = (
+/obj/structure/table/steel,
+/obj/item/weapon/paper_bin{
+ pixel_x = 4;
+ pixel_y = 7
+ },
+/obj/item/weapon/pen/blue{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"mKv" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "office_1"
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"mKC" = (
+/obj/structure/table/woodentable,
+/obj/machinery/cell_charger,
+/obj/random/powercell,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"mKF" = (
+/obj/structure/closet/secure_closet/personal/patient,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"mKQ" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"mLc" = (
+/turf/simulated/floor/tiled,
+/area/redgate/facility/entrance)
+"mLn" = (
+/obj/structure/closet,
+/obj/item/clothing/under/rank/security/corp,
+/obj/item/weapon/handcuffs,
+/obj/item/clothing/shoes/boots/duty,
+/obj/item/clothing/gloves/black,
+/obj/item/clothing/head/helmet/solgov/security,
+/obj/item/device/ticket_printer,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"mMd" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"mMr" = (
+/obj/structure/closet/radiation,
+/obj/item/weapon/storage/mre/random,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"mMN" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"mOM" = (
+/obj/structure/salvageable/machine,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"mPf" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/machinery/door/blast/regular{
+ id = "creature"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell13)
+"mQI" = (
+/obj/structure/table/woodentable,
+/obj/random/mainttoyloot/nofail,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"mQQ" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/brown,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"mRw" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_10"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell6)
+"mRU" = (
+/obj/machinery/door/window/eastright{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"mSi" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"mSx" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"mSE" = (
+/obj/effect/floor_decal/corner/lime/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"mST" = (
+/obj/item/weapon/inflatable_duck,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell13)
+"mTa" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"mTj" = (
+/obj/machinery/light/broken,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"mTv" = (
+/obj/structure/table/glass,
+/obj/item/seeds/random,
+/obj/item/seeds/random,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"mVc" = (
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"mVQ" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"mWK" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border,
+/obj/machinery/light,
+/obj/random/unidentified_medicine/fresh_medicine,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"mYj" = (
+/obj/machinery/field_generator{
+ anchored = 1;
+ state = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"mYN" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"mYV" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "office_1";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"mZr" = (
+/obj/structure/closet/walllocker_double/generic_civ/east,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/obj/random/medical/lite,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"mZu" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"mZN" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"nam" = (
+/obj/structure/flora/log1,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell27)
+"naL" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"naO" = (
+/obj/effect/floor_decal/steeldecal/steel_decals_central6,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"ndu" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"ndS" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"nep" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "sec_2";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"nev" = (
+/obj/machinery/field_generator{
+ anchored = 1;
+ state = 1
+ },
+/turf/simulated/floor/tiled/monotile,
+/area/redgate/facility/cell29)
+"nfd" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/se)
+"nfr" = (
+/obj/machinery/door/airlock/angled_tgmc/security_glass,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nfI" = (
+/obj/structure/bed/chair/bay{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nfT" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"ngo" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"nhG" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell19)
+"nhX" = (
+/obj/structure/table/reinforced,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"nix" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell13)
+"niR" = (
+/obj/machinery/light,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"nje" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab2)
+"njf" = (
+/obj/structure/bed/chair/office/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"njs" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"njB" = (
+/obj/machinery/light,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell13)
+"nkg" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"nkn" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"nll" = (
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -10
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"nlY" = (
+/obj/structure/prop/rock/small,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"nmp" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"nnr" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"nod" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"nqb" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_1"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office1)
+"nql" = (
+/obj/structure/closet/walllocker_double/generic_civ/east,
+/obj/item/weapon/storage/toolbox/mechanical{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/item/weapon/storage/belt/utility,
+/obj/random/tool/power,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"nqK" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 10
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 9
+ },
+/obj/structure/curtain/open/shower,
+/obj/machinery/shower{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office4)
+"nqV" = (
+/obj/machinery/door/airlock/angled_tgmc/security{
+ dir = 4;
+ id_tag = "sec_2"
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"nrr" = (
+/turf/simulated/wall/tgmc/redstripe,
+/area/redgate/facility/se)
+"nsc" = (
+/obj/structure/filingcabinet/chestdrawer,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nsG" = (
+/obj/structure/table/rack/steel,
+/obj/item/weapon/gun/energy/netgun,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nsV" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"nsX" = (
+/obj/machinery/door/airlock/angled_tgmc/security{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"ntp" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell14)
+"ntZ" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4;
+ id_tag = "cell_17"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"nud" = (
+/obj/structure/closet/alien,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"nue" = (
+/obj/structure/closet/crate/freezer,
+/obj/item/weapon/reagent_containers/blood/OMinus,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"nun" = (
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell6)
+"nuH" = (
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"nvI" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"nwx" = (
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"nyk" = (
+/obj/structure/closet/secure_closet/freezer/meat,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"nyx" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nyG" = (
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"nyJ" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"nyT" = (
+/obj/machinery/light/broken,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"nzb" = (
+/obj/structure/table/reinforced,
+/obj/random/mainttoyloot,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"nzw" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/machinery/door/blast/regular{
+ id = "creature"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell13)
+"nzY" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "office_10";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"nAy" = (
+/obj/structure/table/standard,
+/obj/machinery/librarypubliccomp,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"nAS" = (
+/obj/effect/floor_decal/corner/white/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"nAU" = (
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"nAW" = (
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"nAY" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/stock_parts/scanning_module{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/obj/item/device/assembly/prox_sensor{
+ pixel_x = -8;
+ pixel_y = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"nBE" = (
+/turf/simulated/floor/gorefloor,
+/area/redgate/facility/ne)
+"nCg" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/signevent{
+ desc = "Endo ONLY, OV/AV, fulltour.";
+ pixel_x = -27
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nDC" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nDD" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"nFh" = (
+/obj/structure/bed/chair/sofa/corp/corner,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"nFj" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nFA" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"nFM" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 10
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"nFY" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"nGm" = (
+/obj/machinery/recharge_station,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"nGv" = (
+/obj/effect/floor_decal/corner/blue/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"nGN" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell16)
+"nHn" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"nHH" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nHW" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"nIl" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"nIR" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/closet/secure_closet/freezer/fridge,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/obj/random/snack,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"nIW" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/item/weapon/material/knife/butch,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"nJc" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
+/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
+/obj/item/weapon/reagent_containers/glass/bottle/spaceacillin,
+/obj/item/weapon/reagent_containers/glass/bottle/spaceacillin,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/random/tetheraid,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"nJx" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nJF" = (
+/obj/structure/sign/signnew/radiation,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/ne)
+"nJN" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nKq" = (
+/obj/item/stack/cable_coil,
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"nKN" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nLf" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nLu" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell10)
+"nMg" = (
+/obj/structure/bed/chair/sofa/corp/right{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"nMW" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microscope,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"nOR" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 5
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 6
+ },
+/obj/structure/curtain/open/shower,
+/obj/machinery/shower{
+ pixel_y = 15
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office5)
+"nPl" = (
+/obj/machinery/door/airlock/angled_tgmc/security{
+ dir = 4;
+ id_tag = "sec_1"
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"nPn" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"nPs" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ req_one_access = null
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"nRx" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"nSZ" = (
+/obj/machinery/vending/loadout/clothing,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"nTp" = (
+/obj/structure/bed/chair/sofa/brown,
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/sw)
+"nTy" = (
+/obj/structure/table/marble,
+/obj/item/weapon/flame/candle/everburn{
+ pixel_x = 8
+ },
+/obj/item/weapon/flame/candle/everburn{
+ pixel_x = -8
+ },
+/turf/simulated/floor/atoll,
+/area/redgate/facility/cell16)
+"nTE" = (
+/obj/random/vendorall{
+ dir = 4;
+ pixel_x = -8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"nUe" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 5
+ },
+/obj/item/device/mass_spectrometer/adv,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"nUg" = (
+/obj/effect/floor_decal/corner/red/bordercorner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nUy" = (
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nUC" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"nVk" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"nVy" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"nWh" = (
+/obj/structure/closet/secure_closet/scientist{
+ locked = 0
+ },
+/obj/item/clothing/gloves/purple,
+/obj/item/clothing/suit/storage/hooded/wintercoat/science,
+/obj/item/clothing/under/circuitry,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"nYQ" = (
+/obj/structure/closet/l3closet/scientist,
+/obj/random/medical/pillbottle,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"nYS" = (
+/obj/machinery/space_heater,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"obC" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 6
+ },
+/obj/item/weapon/reagent_containers/spray/cleaner{
+ desc = "Someone has crossed out the 'Space' from Space Cleaner and written in Chemistry. Scrawled on the back is, 'Okay, whoever filled this with polytrinic acid, it was only funny the first time. It was hard enough replacing the CMO's first cat!'";
+ name = "Chemistry Cleaner"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"obE" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microwave,
+/turf/simulated/floor/carpet/blue,
+/area/redgate/facility/office2)
+"obH" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"oce" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell12)
+"ocf" = (
+/obj/machinery/light/flicker{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"ocO" = (
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"odq" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"odv" = (
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/white/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"oeb" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"oew" = (
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/pink/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"oex" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "cell_8";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"oez" = (
+/obj/effect/floor_decal/corner/white/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"oeH" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/table/reinforced,
+/obj/random/snack,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"oeJ" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/green,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"oeT" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"ogp" = (
+/obj/effect/floor_decal/corner_steel_grid{
+ dir = 10
+ },
+/obj/machinery/body_scanconsole{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"ogF" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/pen,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"ohm" = (
+/obj/structure/closet/crate/wooden,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"ohR" = (
+/obj/structure/table/woodentable,
+/obj/item/device/flashlight/lamp/green,
+/obj/machinery/button/windowtint{
+ id = "office_1";
+ pixel_x = -22
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"oip" = (
+/obj/structure/table/woodentable,
+/obj/random/maintenance/research,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"oiG" = (
+/obj/structure/bed/chair/office/dark,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"oiI" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "sec_1";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"ojc" = (
+/obj/structure/table/rack/steel,
+/obj/item/weapon/handcuffs/legcuffs/bola,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"ojh" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"ojr" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"ojx" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/storage/box/donut,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"ojH" = (
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -24
+ },
+/obj/machinery/light,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"okv" = (
+/obj/structure/railing,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"ola" = (
+/obj/structure/table/woodentable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/advanced,
+/turf/simulated/floor,
+/area/redgate/facility/office3)
+"ols" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"olu" = (
+/obj/effect/mouse_hole_spawner{
+ chance_to_spawn = 100;
+ dir = 1
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"olG" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/structure/disposaloutlet{
+ density = 0;
+ pixel_y = 18
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell26)
+"olP" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"olX" = (
+/obj/structure/smoletrack/roadS{
+ dir = 4
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"omE" = (
+/obj/structure/table/reinforced,
+/obj/random/miniature,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"omI" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell14)
+"omT" = (
+/obj/structure/closet,
+/obj/random/projectile/scrapped_dartgun,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ooI" = (
+/obj/structure/smoletrack/roadturn,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"opw" = (
+/obj/structure/railing,
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"opI" = (
+/obj/structure/salvageable/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"opJ" = (
+/obj/structure/closet/emcloset,
+/turf/simulated/floor,
+/area/redgate/facility/cell14)
+"opR" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_7";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"opZ" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/syringes,
+/obj/item/weapon/storage/box/gloves{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/box/beakers{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"oqe" = (
+/obj/machinery/seed_storage/random,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"orz" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"orZ" = (
+/obj/machinery/door/window{
+ dir = 1
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"osl" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"osz" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"osS" = (
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/item/seeds/random,
+/obj/item/seeds/random,
+/obj/item/seeds/random,
+/obj/item/weapon/material/minihoe,
+/obj/item/device/analyzer/plant_analyzer,
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"oti" = (
+/obj/structure/closet,
+/obj/item/clothing/under/rank/security/corp,
+/obj/item/weapon/handcuffs,
+/obj/item/clothing/shoes/boots/duty,
+/obj/item/clothing/gloves/black,
+/obj/item/clothing/head/helmet/solgov/security,
+/obj/item/device/ticket_printer,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"otx" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/reagent_containers/food/snacks/egg/rainbow,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"otO" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"otW" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/brown,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"oui" = (
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"ouy" = (
+/obj/structure/closet/secure_closet/personal{
+ locked = 0
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"ouP" = (
+/obj/item/clothing/glasses/sunglasses,
+/obj/structure/table/steel,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell12)
+"ovf" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"owm" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"oxv" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/ne)
+"oyh" = (
+/obj/machinery/r_n_d/circuit_imprinter{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oyl" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oyG" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell5)
+"ozg" = (
+/obj/machinery/door/blast/regular/open{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"ozi" = (
+/obj/structure/table/reinforced,
+/obj/random/material/refined,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"ozD" = (
+/obj/structure/bed/chair/office/dark,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/ne)
+"oAk" = (
+/obj/machinery/recharge_station,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oAC" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"oAY" = (
+/turf/simulated/wall/tgmc/darkwall,
+/area/redgate/facility/cell9)
+"oEf" = (
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oEx" = (
+/turf/simulated/floor/gorefloor2,
+/area/redgate/facility/ne)
+"oFg" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor,
+/area/redgate/facility/cell15)
+"oFO" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"oGT" = (
+/obj/structure/table/rack,
+/obj/random/bluespace,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"oGU" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"oHI" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"oHL" = (
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"oId" = (
+/obj/structure/flora/ausbushes/ppflowers,
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"oIP" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/nw)
+"oJh" = (
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"oJR" = (
+/obj/structure/bed/padded,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"oKk" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"oKF" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"oKR" = (
+/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -24
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oKS" = (
+/obj/effect/floor_decal/corner/white/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"oMu" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell20)
+"oMH" = (
+/turf/simulated/wall/tgmc/darkwall/deco3,
+/area/redgate/facility/cell9)
+"oNA" = (
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell14)
+"oNI" = (
+/obj/structure/table/rack,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/item/weapon/gun/energy/sizegun,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"oNV" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"oOd" = (
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell24)
+"oOF" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/obj/structure/lattice,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"oPl" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"oPv" = (
+/obj/item/weapon/paper/crumpled,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"oRY" = (
+/obj/structure/prop/rock,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"oSb" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell9)
+"oSA" = (
+/turf/simulated/floor,
+/area/redgate/facility/entrance)
+"oSY" = (
+/obj/structure/table/glass,
+/obj/machinery/chemical_dispenser/xenoflora/full,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"oTm" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"oTq" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Freewoman"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/item/weapon/tool/crowbar/brass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"oUz" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"oUS" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"oVl" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell26)
+"oVu" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"oVL" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"oVX" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"oWf" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"oXb" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/robotanalyzer,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oXm" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"oXQ" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"oYX" = (
+/obj/structure/flora/pottedplant/overgrown,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"oZb" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/powercell,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell14)
+"oZQ" = (
+/obj/structure/table/standard,
+/obj/machinery/computer/med_data/laptop,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"oZU" = (
+/obj/structure/closet/secure_closet/medical3,
+/obj/item/device/glasses_kit,
+/obj/item/weapon/storage/box/bloodpacks,
+/obj/item/weapon/storage/box/autoinjectors,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"pag" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"pbm" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"pbL" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/office2)
+"pbO" = (
+/obj/structure/table/standard,
+/obj/item/device/slime_scanner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"pck" = (
+/obj/structure/flora/lily1,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell27)
+"pcs" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/clipboard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"pdn" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pdt" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pec" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"ped" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"pem" = (
+/obj/structure/table/standard,
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"peR" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"peW" = (
+/obj/structure/prop/rock/small/alt,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"pfx" = (
+/obj/structure/salvageable/console,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"pfD" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"phT" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"piE" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pjb" = (
+/obj/machinery/computer/rdconsole/robotics{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pjC" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell27)
+"pkp" = (
+/obj/machinery/door/window,
+/obj/structure/window/basic,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/freezer,
+/area/redgate/facility/sw)
+"pli" = (
+/obj/structure/table/steel_reinforced,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell14)
+"pls" = (
+/obj/structure/sink{
+ pixel_y = 8
+ },
+/obj/structure/mirror{
+ pixel_y = 27
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"plz" = (
+/obj/structure/bed/chair/bay/chair/padded/red/bignest,
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/cell14)
+"plJ" = (
+/obj/machinery/autolathe{
+ dir = 1;
+ hacked = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pnc" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"pol" = (
+/obj/structure/table/glass,
+/obj/machinery/reagentgrinder,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"poE" = (
+/obj/effect/floor_decal/corner/blue/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"poR" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"ppm" = (
+/obj/machinery/shower{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/paleblue/diagonal,
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 8
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"ppo" = (
+/obj/structure/bed/chair/sofa/corp,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"pqb" = (
+/obj/structure/bed/chair/wood/wings{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"pqC" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"prt" = (
+/obj/structure/table/standard,
+/obj/item/weapon/weldingtool,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"prT" = (
+/obj/effect/floor_decal/corner/black/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light/broken,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"prX" = (
+/obj/structure/table/bench/steel,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/entrance)
+"psv" = (
+/obj/effect/floor_decal/corner/white/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"psK" = (
+/obj/effect/floor_decal/corner/blue/border,
+/obj/random/maintenance/medical,
+/obj/random/maintenance/medical,
+/obj/item/weapon/cane,
+/obj/structure/closet/walllocker_double/medical/south,
+/obj/item/weapon/storage/briefcase,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"psL" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/machinery/light,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"psT" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pth" = (
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/nw)
+"ptY" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/vending/sol{
+ dir = 8;
+ pixel_x = 7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"puv" = (
+/obj/structure/toilet{
+ pixel_y = 10
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"puD" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pvk" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"pvt" = (
+/obj/structure/flora/lily2,
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/cell27)
+"pwj" = (
+/obj/machinery/vending/loadout/accessory,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"pwO" = (
+/obj/machinery/seed_extractor,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"pyi" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"pys" = (
+/obj/structure/table/glass,
+/obj/item/weapon/autopsy_scanner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"pyE" = (
+/obj/machinery/recharge_station,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pyK" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pzp" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pzN" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pzX" = (
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"pAo" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/cyan,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"pAp" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pAM" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/lab2)
+"pAV" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pBg" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/tool/alien,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/obj/item/clothing/glasses/goggles,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell14)
+"pBJ" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"pCm" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"pCw" = (
+/turf/simulated/wall/tgmc/whitewall{
+ can_open = 1
+ },
+/area/redgate/facility/entrance)
+"pCN" = (
+/obj/machinery/vending/bepis{
+ dir = 8;
+ pixel_x = 7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pDo" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pDH" = (
+/obj/structure/closet/radiation,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"pEr" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"pEF" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pFo" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/bone/skull,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"pFq" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"pFD" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"pFQ" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pFR" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/effect/floor_decal/corner/white/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pGy" = (
+/obj/effect/floor_decal/steeldecal/steel_decals_central6,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"pIi" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"pIE" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"pJA" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"pJE" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/masks,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"pJK" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "cell_2";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 26;
+ pixel_y = -9
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"pJU" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"pKm" = (
+/turf/simulated/floor,
+/area/redgate/facility/office3)
+"pLg" = (
+/obj/random/junk,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"pLq" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/structure/salvageable/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/entrance)
+"pLT" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"pMz" = (
+/obj/machinery/door/blast/regular{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/tram)
+"pMQ" = (
+/obj/machinery/telecomms/relay/preset/station,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab3)
+"pNr" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/entrance)
+"pNt" = (
+/obj/structure/table/standard,
+/obj/random/donkpocketbox,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pNv" = (
+/obj/machinery/vending/desatti{
+ dir = 8;
+ pixel_x = 7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pNw" = (
+/mob/living/simple_mob/vore/sect_queen{
+ ai_holder_type = /datum/ai_holder/simple_mob/vore
+ },
+/turf/simulated/floor/tiled/dark,
+/area/redgate/facility/cell10)
+"pOp" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pOB" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell9)
+"pOH" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ name = "Hospital Lobby"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"pPr" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/lab2)
+"pQb" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"pQc" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/ne)
+"pQk" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pQD" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/toolbox,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"pQF" = (
+/mob/living/simple_mob/animal/giant_spider{
+ ai_holder_type = /datum/ai_holder/simple_mob/passive;
+ size_multiplier = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"pQY" = (
+/mob/living/simple_mob/vore/alienanimals/teppi{
+ size_multiplier = 0.4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"pRa" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"pRC" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"pSC" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"pSF" = (
+/obj/structure/closet/alien,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 5
+ },
+/obj/random/rigsuit,
+/turf/simulated/floor/tiled/dark,
+/area/redgate/facility/entrance)
+"pSP" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Quacks"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/random/instrument,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pTl" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/entrance)
+"pUk" = (
+/obj/structure/table/standard,
+/obj/machinery/microwave,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pVH" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"pVI" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell26)
+"pVX" = (
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = -8
+ },
+/obj/structure/mirror{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"pXy" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 6
+ },
+/obj/structure/flora/pottedplant/large,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"pXQ" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell3)
+"pXY" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"pZe" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/structure/bed/chair/sofa/corp/corner,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"pZB" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 9
+ },
+/obj/structure/bed/chair/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"pZR" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 5
+ },
+/obj/structure/bed/chair/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"pZS" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"qax" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/medical,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 9
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qaY" = (
+/obj/structure/bed/chair/wheelchair,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qbj" = (
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/cell2)
+"qby" = (
+/obj/machinery/light,
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "office_10";
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"qbY" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/medical,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 5
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qcp" = (
+/obj/structure/table/woodentable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"qcw" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"qcE" = (
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell26)
+"qdC" = (
+/obj/machinery/portable_atmospherics/hydroponics/soil,
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"qdH" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/item/weapon/bone,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"qep" = (
+/obj/structure/table/borosilicate,
+/obj/item/modular_computer/laptop/preset/custom_loadout/rugged,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"qeN" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/office1)
+"qfn" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+"qfF" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/sofa/corp,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qgk" = (
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"qgE" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"qgN" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"qgS" = (
+/obj/structure/bed/chair/sofa/corner/purp{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"qho" = (
+/obj/machinery/atmospherics/unary/freezer{
+ dir = 4
+ },
+/obj/structure/sign/signnew/cryogenics{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qhP" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell19)
+"qia" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "cell_20";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"qis" = (
+/obj/item/weapon/material/shard,
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"qiF" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell4)
+"qjA" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qjB" = (
+/obj/structure/table/glass,
+/obj/structure/sign/signnew/cryogenics{
+ pixel_y = 32
+ },
+/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{
+ pixel_x = -4
+ },
+/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{
+ pixel_x = 7;
+ pixel_y = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qjM" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor,
+/area/redgate/facility/cell14)
+"qki" = (
+/obj/effect/floor_decal/borderfloor,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/entrance)
+"qkm" = (
+/obj/structure/railing,
+/obj/machinery/atmospherics/pipe/tank/oxygen,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"qkK" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"qlc" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/obj/structure/bed/chair/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qlC" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 4
+ },
+/obj/structure/bed/chair/shuttle{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qlX" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/obj/random/medical{
+ pixel_x = -4;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qmh" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qmv" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office1)
+"qmR" = (
+/obj/machinery/button/windowtint{
+ id = "office_4";
+ pixel_x = -22
+ },
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -10
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"qoK" = (
+/obj/structure/loot_pile/surface/bones,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"qpK" = (
+/obj/item/stack/material/plastic,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"qpO" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/obj/machinery/button/windowtint{
+ id = "office_5";
+ pixel_x = -22;
+ pixel_y = 21
+ },
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"qqv" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"qqy" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/window/plastitanium{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"qrN" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_10"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office11)
+"qsl" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "office_4"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qsu" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qsy" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"qsE" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"qsP" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"qsU" = (
+/obj/machinery/disease2/diseaseanalyser,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qtt" = (
+/obj/structure/window/basic,
+/obj/item/weapon/storage/vore_egg/rock,
+/turf/simulated/floor/tiled/freezer,
+/area/redgate/facility/sw)
+"qtY" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"que" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"qug" = (
+/obj/structure/table/reinforced,
+/obj/random/toolbox,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"qux" = (
+/obj/structure/closet/radiation,
+/obj/random/bomb_supply,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"quW" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"qvf" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qvq" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"qvt" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/wood,
+/area/redgate/facility/cell2)
+"qvO" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/ne)
+"qwx" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/obj/random/medical/lite,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qwT" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 4
+ },
+/obj/random/medical/pillbottle,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qxN" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qxW" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"qys" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"qyI" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"qzQ" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qAp" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"qBh" = (
+/obj/machinery/sleep_console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qBp" = (
+/obj/machinery/cryopod,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"qBK" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/techmaint_cargo,
+/area/redgate/facility/sw)
+"qBT" = (
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"qCq" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/entrance)
+"qCS" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell13)
+"qDz" = (
+/obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgoprime{
+ name = "Ringed planet"
+ },
+/turf/unsimulated/fake_space,
+/area/redgate/facility/cell15)
+"qEg" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"qFr" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 9
+ },
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/nw)
+"qGI" = (
+/obj/structure/closet/secure_closet/hydroponics/sci{
+ locked = 0;
+ req_access = list(77)
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"qGO" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/internal_organ,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"qGP" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"qGQ" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell10)
+"qGT" = (
+/obj/effect/floor_decal/corner/orange/border,
+/obj/machinery/light/floortube{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"qGV" = (
+/obj/structure/closet/secure_closet/freezer/fridge,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"qHc" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"qHr" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"qHO" = (
+/obj/random/junk,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"qIt" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"qIQ" = (
+/obj/structure/reagent_dispensers/water_cooler/full{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qJl" = (
+/turf/simulated/floor,
+/area/redgate/facility/cell17)
+"qJU" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qKi" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell1)
+"qKO" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"qLz" = (
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"qMo" = (
+/obj/machinery/disease2/incubator,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qNh" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"qNC" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qOd" = (
+/obj/item/broken_device/random,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"qOn" = (
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"qPj" = (
+/obj/structure/window/basic,
+/obj/item/weapon/storage/vore_egg/slimeglob{
+ name = "sect egg clutch"
+ },
+/turf/simulated/floor/tiled/freezer,
+/area/redgate/facility/sw)
+"qPn" = (
+/obj/structure/table/hardwoodtable,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/item/modular_computer/laptop/preset/custom_loadout/rugged,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/ne)
+"qQl" = (
+/obj/machinery/space_heater,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qQL" = (
+/obj/machinery/computer/diseasesplicer,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qQY" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"qSb" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qSC" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 6
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals_central6,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"qSM" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 10
+ },
+/obj/structure/flora/pottedplant/large,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qVa" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/medical,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 10
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qVu" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"qVL" = (
+/obj/structure/flora/ausbushes/reedbush,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"qXg" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/medical,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 6
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"qYB" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"qZT" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"ram" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/beaker/noreact,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"rbz" = (
+/obj/structure/closet,
+/obj/random/plushie,
+/obj/random/plushie,
+/obj/random/plushie,
+/obj/item/clothing/under/rank/medical/scrubs,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/sw)
+"rbC" = (
+/obj/machinery/cryopod,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"rbW" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"rbY" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"rcz" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"rcN" = (
+/obj/structure/table/standard,
+/obj/random/snack,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"rcO" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"rdK" = (
+/obj/item/weapon/reagent_containers/food/snacks/snackplanet/phoron,
+/turf/unsimulated/fake_space,
+/area/redgate/facility/cell15)
+"reE" = (
+/obj/effect/floor_decal/industrial/warning/tile,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"rfl" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell10)
+"rfz" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"rgk" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"rhF" = (
+/mob/living/simple_mob/animal/passive/mouse{
+ size_multiplier = 3
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"rie" = (
+/obj/structure/closet/l3closet/scientist,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"riW" = (
+/obj/machinery/botany/editor,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"riY" = (
+/obj/machinery/door/window,
+/obj/machinery/door/window{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rjc" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/paper_bin,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"rjr" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rjK" = (
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rkz" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "cell_9";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"rkC" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rlC" = (
+/obj/structure/window/basic,
+/obj/structure/prop/machine/green_egg,
+/turf/simulated/floor/tiled/freezer,
+/area/redgate/facility/sw)
+"rlN" = (
+/obj/structure/table/standard,
+/obj/structure/closet/walllocker_double/science/north,
+/obj/item/weapon/storage/box/syringes{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/box/masks,
+/obj/item/weapon/storage/box/gloves{
+ pixel_x = 4;
+ pixel_y = 4
+ },
+/obj/item/weapon/storage/fancy/vials,
+/obj/item/weapon/storage/lockbox/vials,
+/obj/item/weapon/storage/box/monkeycubes,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rmF" = (
+/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rmZ" = (
+/obj/structure/disposalpipe/segment,
+/obj/random/forgotten_tram,
+/obj/random/maintenance,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"rnj" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rpb" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_4";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"rpF" = (
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell27)
+"rpQ" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ name = "Hospital Lobby"
+ },
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"rpT" = (
+/obj/machinery/door/airlock/angled_tgmc/medical,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"rpU" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell15)
+"rpZ" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"rqq" = (
+/obj/structure/closet/walllocker_double/north,
+/obj/random/mainttoyloot/nofail,
+/obj/random/maintenance/research,
+/obj/random/maintenance/security,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"rqR" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,
+/obj/machinery/atmospherics/portables_connector{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"rqZ" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 5
+ },
+/obj/structure/closet/crate/bin{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"rrd" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/se)
+"rrU" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"rsp" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12;
+ pixel_y = 3
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"rsr" = (
+/obj/structure/reagent_dispensers/bloodbarrel,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"rsv" = (
+/obj/effect/mouse_hole_spawner{
+ chance_to_spawn = 100
+ },
+/obj/effect/floor_decal/industrial/warning/tile,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"rty" = (
+/obj/machinery/biogenerator,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"ruf" = (
+/obj/machinery/light/broken{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"ruD" = (
+/obj/machinery/botany/extractor,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"ruE" = (
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rvc" = (
+/obj/structure/closet{
+ name = "experimental tools"
+ },
+/obj/item/weapon/gun/energy/taser,
+/obj/item/weapon/gun/energy/sizegun,
+/obj/item/weapon/material/knife/butch,
+/obj/item/weapon/handcuffs/legcuffs,
+/obj/item/weapon/handcuffs,
+/obj/item/clothing/glasses/sunglasses/thinblindfold,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"rvw" = (
+/turf/simulated/floor/tiled,
+/area/redgate/facility/office3)
+"rvG" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rwj" = (
+/turf/unsimulated/fake_space,
+/area/redgate/facility/cell15)
+"rwD" = (
+/obj/structure/closet/secure_closet/egg/xenomorph,
+/turf/simulated/floor/tiled/freezer,
+/area/redgate/facility/sw)
+"rwN" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = 8
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rya" = (
+/obj/machinery/photocopier,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"ryq" = (
+/obj/item/weapon/material/shard,
+/obj/item/broken_device/random,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"ryO" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"ryZ" = (
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"rzg" = (
+/obj/structure/table/woodentable,
+/obj/structure/disposaloutlet{
+ density = 0;
+ pixel_y = 18
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"rzk" = (
+/obj/structure/table/glass,
+/obj/random/mug,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"rzP" = (
+/obj/structure/sink{
+ pixel_y = 20
+ },
+/obj/structure/mirror{
+ pixel_y = 38
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"rzR" = (
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"rzV" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/bottle/bicaridine,
+/obj/item/weapon/reagent_containers/glass/bottle/bicaridine,
+/obj/item/weapon/reagent_containers/glass/bottle/dexalinp,
+/obj/item/weapon/reagent_containers/glass/bottle/dexalinp,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"rBd" = (
+/turf/simulated/wall/tgmc/redstripe,
+/area/redgate/facility/office4)
+"rBl" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/medical,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"rBs" = (
+/obj/machinery/vending/medical,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"rBH" = (
+/obj/machinery/door/window/brigdoor/eastleft,
+/obj/machinery/door/window/brigdoor/eastleft{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"rCl" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/obj/machinery/vitals_monitor,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"rCY" = (
+/obj/structure/closet,
+/obj/item/clothing/suit/storage/toggle/labcoat{
+ color = "#ff54f6"
+ },
+/obj/item/clothing/shoes/slippers,
+/obj/item/clothing/under/pants/black,
+/obj/random/tetheraid,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"rDk" = (
+/obj/random/plushielarge,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"rDl" = (
+/obj/structure/table/glass,
+/obj/random/firstaid,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"rDt" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/medical,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"rDZ" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 6
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,
+/obj/machinery/atmospherics/portables_connector{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"rEb" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rEw" = (
+/obj/structure/table/glass,
+/obj/item/weapon/material/minihoe,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"rFo" = (
+/obj/structure/table/steel,
+/obj/item/weapon/storage/toolbox/mechanical{
+ pixel_x = 2;
+ pixel_y = 3
+ },
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"rGl" = (
+/obj/machinery/field_generator{
+ anchored = 1;
+ state = 1
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"rGD" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/office3)
+"rHb" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/botanydisk,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"rIw" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"rII" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"rJt" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rJR" = (
+/obj/machinery/papershredder,
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"rJY" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell26)
+"rKF" = (
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/cell27)
+"rKP" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"rLZ" = (
+/obj/structure/table/woodentable,
+/obj/structure/theonepizza{
+ pixel_y = 0
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"rMp" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/dark,
+/area/redgate/facility/cell10)
+"rMq" = (
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"rMx" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"rNs" = (
+/obj/machinery/light_switch{
+ dir = 8;
+ pixel_x = 26;
+ pixel_y = -9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"rNw" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 8
+ },
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"rNF" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "medical_2";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"rNO" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"rOo" = (
+/obj/structure/prop/rock/flat,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"rOM" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/cell10)
+"rPE" = (
+/obj/structure/filingcabinet/filingcabinet{
+ density = 0;
+ pixel_x = -11
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"rQg" = (
+/obj/machinery/light/broken{
+ dir = 8
+ },
+/obj/structure/toilet{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"rQF" = (
+/obj/structure/table/borosilicate,
+/obj/item/stack/cable_coil{
+ pixel_x = 3;
+ pixel_y = 3
+ },
+/obj/effect/floor_decal/techfloor,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"rQR" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"rSt" = (
+/obj/effect/floor_decal/corner/red/bordercorner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"rSN" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"rTl" = (
+/obj/structure/loot_pile/surface/bones,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"rTF" = (
+/obj/structure/bed/padded,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"rTK" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 6
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/ne)
+"rTL" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"rUr" = (
+/obj/structure/table/reinforced,
+/obj/item/device/radio/off{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/obj/item/device/radio/off{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"rUI" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"rUV" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"rUY" = (
+/turf/simulated/floor/water/contaminated,
+/area/redgate/facility/ne)
+"rVn" = (
+/obj/machinery/atmospherics/pipe/vent,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"rVR" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/lab2)
+"rWr" = (
+/obj/structure/railing/grey,
+/obj/machinery/atmospherics/pipe/simple/visible/red{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/visible/green,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"rWB" = (
+/obj/structure/closet/l3closet/scientist,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"rWG" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"rWH" = (
+/obj/structure/disposalpipe/segment,
+/obj/random/trash_pile,
+/obj/structure/railing,
+/turf/simulated/floor,
+/area/redgate/facility/cell4)
+"rXl" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/tree/jungle,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell24)
+"rXr" = (
+/obj/structure/closet/walllocker/wooden/west,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/reagent_containers/food/condiment/carton/flour,
+/obj/item/weapon/storage/fancy/egg_box,
+/obj/item/weapon/storage/fancy/egg_box,
+/obj/item/weapon/reagent_containers/glass/beaker/measuring_cup,
+/obj/item/weapon/reagent_containers/glass/beaker/measuring_cup,
+/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
+/obj/item/weapon/reagent_containers/food/drinks/bottle/milk,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/carton/sugar,
+/obj/item/weapon/reagent_containers/food/condiment/enzyme,
+/obj/item/weapon/reagent_containers/food/condiment/enzyme,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"rXY" = (
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"rZd" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/bucket,
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"sac" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"saC" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1;
+ icon_scale_x = 1.5;
+ icon_scale_y = 1.5
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"saX" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/toy/desk/officetoy,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"sbR" = (
+/obj/machinery/door/airlock/angled_tgmc/wide/generic,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"sbT" = (
+/obj/structure/table/borosilicate,
+/obj/item/clothing/gloves/circuitry,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"sdd" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/nw)
+"sdw" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"sdL" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"sdT" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"see" = (
+/obj/machinery/button/remote/airlock{
+ id = "cell_5";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"seU" = (
+/obj/machinery/door/blast/regular/open{
+ id = "creature"
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell13)
+"sgn" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"sgr" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"sgt" = (
+/obj/machinery/door/airlock/angled_tgmc/medical{
+ dir = 8;
+ id_tag = "medical_1"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"sgA" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"sgK" = (
+/obj/structure/filingcabinet/filingcabinet{
+ density = 0;
+ pixel_x = -11
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"sgX" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"shc" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"shd" = (
+/obj/structure/flora/lily3,
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell27)
+"shr" = (
+/obj/machinery/porta_turret/alien/destroyed{
+ dir = 5;
+ name = "broken containment turret"
+ },
+/obj/effect/map_effect/interval/effect_emitter/sparks,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"shD" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell7)
+"shU" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"siH" = (
+/obj/effect/floor_decal/corner/beige{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"sjF" = (
+/obj/effect/floor_decal/industrial/outline/yellow,
+/obj/random/multiple/random_size_crate/no_weapons,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"skx" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"skO" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"skS" = (
+/obj/random/internal_organ,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"skW" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"slj" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"slz" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"slB" = (
+/obj/structure/smolebuilding/houses,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"slW" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"smg" = (
+/obj/structure/smoletrack/roadT,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"smu" = (
+/obj/structure/smoletrack/roadturn{
+ dir = 8
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"smS" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"smZ" = (
+/obj/structure/grille/broken,
+/obj/item/weapon/material/shard,
+/turf/simulated/floor,
+/area/redgate/facility/cell25)
+"snf" = (
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"snl" = (
+/turf/unsimulated/floor/dark,
+/area/redgate/facility/cell9)
+"snB" = (
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"soz" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"soO" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 1;
+ pixel_y = -32
+ },
+/obj/effect/floor_decal/corner/pink/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"soP" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/office2)
+"spe" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"spC" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"sqj" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ dir = 2
+ },
+/obj/effect/floor_decal/corner/red/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"ssb" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"stb" = (
+/obj/structure/table/rack/shelf,
+/obj/item/weapon/storage/box/monkeycubes,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"stt" = (
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"stZ" = (
+/obj/machinery/disposal/wall{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"sup" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"suv" = (
+/obj/structure/table/standard,
+/obj/random/soap,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"suF" = (
+/obj/structure/closet/wardrobe/engineering_yellow,
+/obj/random/maintenance/engineering,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"suT" = (
+/obj/structure/lattice,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"svl" = (
+/obj/structure/bed/chair/sofa/corp/left,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"svp" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "cell_1";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/obj/effect/floor_decal/techfloor{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"svw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"svQ" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell2)
+"svW" = (
+/obj/structure/prop/rock/small/alt,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"sww" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = -11
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"swP" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"sxk" = (
+/obj/structure/table/glass,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"sxL" = (
+/mob/living/simple_mob/vore/stalker,
+/obj/effect/floor_decal/corner/black/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"sze" = (
+/obj/structure/disposalpipe/broken,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"szw" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "cell_11";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"sAf" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"sAu" = (
+/obj/item/weapon/bone/arm,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"sAK" = (
+/obj/structure/closet,
+/obj/item/clothing/under/rank/security/corp,
+/obj/item/weapon/handcuffs,
+/obj/item/clothing/shoes/boots/duty,
+/obj/item/clothing/gloves/black,
+/obj/item/clothing/head/helmet/solgov/security,
+/obj/item/device/ticket_printer,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office10)
+"sAM" = (
+/obj/structure/table/standard,
+/obj/item/weapon/storage/smolebrickcase,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"sAQ" = (
+/obj/structure/table/hardwoodtable,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"sBr" = (
+/turf/simulated/wall/tgmc/window/darkwall,
+/area/redgate/facility/cell9)
+"sBD" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"sCG" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/device/multitool{
+ pixel_x = 3
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"sCO" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ dir = 8;
+ pixel_x = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"sEm" = (
+/obj/effect/floor_decal/corner/red/border,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"sEo" = (
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"sFc" = (
+/obj/structure/cable{
+ dir = 1
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"sFz" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"sGw" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ icon_state = "pipe-c"
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab5)
+"sIe" = (
+/obj/structure/railing/grey{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/random/junk,
+/obj/random/mainttoyloot/nofail,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"sIR" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = null;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"sJl" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office4)
+"sKR" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/computer/arcade,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"sMa" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell5)
+"sMt" = (
+/obj/structure/salvageable/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"sML" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"sNw" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"sNG" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell4)
+"sOT" = (
+/obj/machinery/light_switch{
+ dir = 4;
+ pixel_x = -24;
+ pixel_y = -10
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "cell_4";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"sPR" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/cell_charger,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"sQv" = (
+/obj/structure/bed/chair/sofa/right/purp{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"sQy" = (
+/obj/structure/bed/double/padded{
+ icon_scale_x = 3;
+ icon_scale_y = 3
+ },
+/obj/item/weapon/bedsheet/hosdouble{
+ icon_scale_x = 3;
+ icon_scale_y = 3
+ },
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"sQK" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"sRk" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"sRJ" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"sSE" = (
+/obj/structure/closet,
+/obj/item/clothing/suit/storage/toggle/labcoat,
+/obj/random/medical/pillbottle,
+/obj/random/medical/pillbottle,
+/obj/random/tetheraid,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"sSG" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 10
+ },
+/obj/machinery/recharger,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"sTb" = (
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"sTL" = (
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"sTU" = (
+/obj/effect/floor_decal/corner/blue/border,
+/obj/machinery/vending/blood,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"sTZ" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = -11
+ },
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"sUa" = (
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/lime/border,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"sUI" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/item/weapon/gun/launcher/syringe/rapid,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office7)
+"sUQ" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "I. M. Board"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"sUT" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"sVc" = (
+/obj/structure/sign/levels/cryo,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab2)
+"sVe" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/standard,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"sVo" = (
+/obj/machinery/door/airlock/multi_tile/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"sVJ" = (
+/obj/structure/prop/transmitter,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab3)
+"sVM" = (
+/obj/structure/bed/chair/wood/wings{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt/panel,
+/area/redgate/facility/cell2)
+"sWr" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"sWX" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "cell_11";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"sXg" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"sXk" = (
+/obj/effect/floor_decal/corner/blue/bordercorner{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/blue/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"sXx" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/food/snacks/snackplanet/moon,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"sXK" = (
+/obj/structure/smoletrack/roadT{
+ dir = 4
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"sXT" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"sYs" = (
+/obj/structure/smoletrack/roadF,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"sZE" = (
+/obj/structure/table/steel,
+/obj/item/device/electronic_assembly/large/default,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"tbG" = (
+/obj/structure/smoletrack/roadT{
+ dir = 8
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"tbS" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"tdl" = (
+/obj/effect/decal/cleanable/blood/oil,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"tdG" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"tdP" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell29)
+"teZ" = (
+/obj/structure/table/steel,
+/obj/item/weapon/storage/toolbox/electrical,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"tfK" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab4)
+"tge" = (
+/obj/structure/cable{
+ dir = 8
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tgs" = (
+/obj/effect/floor_decal/carpet/blue,
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"tgG" = (
+/obj/machinery/button/remote/airlock{
+ dir = 4;
+ id = "medical_1";
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office7)
+"ths" = (
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"thx" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"tiA" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"tiI" = (
+/obj/machinery/button/remote/airlock{
+ id = "cell_14b";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"tiL" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"tiT" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tjA" = (
+/obj/structure/closet/crate/bin,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"tjQ" = (
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"tjX" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ dir = 8;
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tkR" = (
+/obj/structure/cable{
+ dir = 4
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tkS" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"tld" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"tlP" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"tlQ" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"tmC" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "cell_13";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"tnf" = (
+/obj/structure/table/reinforced,
+/obj/random/snack,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"tnq" = (
+/obj/structure/table/steel,
+/obj/fiftyspawner/steel,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"tnZ" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/closet/secure_closet/egg/xenomorph,
+/obj/random/tool/alien,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"toi" = (
+/obj/machinery/seed_storage/xenobotany,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"toC" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"toO" = (
+/obj/machinery/button/remote/blast_door{
+ id = "core_experiment";
+ pixel_y = 25
+ },
+/obj/effect/floor_decal/corner/black/border{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"tpg" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"tpr" = (
+/obj/structure/railing,
+/turf/simulated/floor,
+/area/redgate/facility/cell4)
+"tpI" = (
+/obj/structure/bed/chair/sofa/left/purp{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"tqa" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"tqh" = (
+/obj/machinery/button/remote/blast_door{
+ id = "creature";
+ pixel_y = 25
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell13)
+"tqs" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/sw)
+"tqN" = (
+/obj/machinery/light,
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"trT" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"trZ" = (
+/obj/random/trash_pile,
+/obj/structure/railing,
+/turf/simulated/floor,
+/area/redgate/facility/cell4)
+"tsC" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"tsX" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"ttF" = (
+/turf/simulated/wall/solidrock/mossyrockpoi,
+/area/redgate/facility/cell26)
+"tuI" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell17)
+"tvf" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/nw)
+"tvp" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/medbay)
+"tvs" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"tvO" = (
+/obj/structure/closet/l3closet/general,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"twx" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"twT" = (
+/obj/item/broken_device/random,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell21)
+"twU" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"txk" = (
+/obj/structure/table/glass,
+/obj/random/bomb_supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"txv" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"txw" = (
+/obj/structure/lightpost/atoll,
+/turf/simulated/floor/atoll,
+/area/redgate/facility/cell16)
+"txy" = (
+/obj/machinery/light{
+ stat = 0
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"txD" = (
+/obj/item/weapon/bone/ribs,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"txE" = (
+/obj/effect/floor_decal/corner/brown/diagonal,
+/obj/machinery/vending/cigarette,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"txQ" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"tyO" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/lab4)
+"tzr" = (
+/obj/machinery/camera{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"tAe" = (
+/obj/item/weapon/bone/skull/tajaran,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"tAi" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"tAu" = (
+/obj/structure/table/standard,
+/obj/item/weapon/gun/energy/sizegun,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"tAT" = (
+/obj/structure/smolebuilding/business,
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"tBb" = (
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell3)
+"tBu" = (
+/obj/structure/table/reinforced,
+/obj/item/device/gps/engineering{
+ pixel_y = 3
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"tBC" = (
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tCe" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ dir = 8;
+ icon_state = "1-4"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tCh" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"tCL" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"tCX" = (
+/obj/structure/table/standard,
+/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{
+ pixel_x = -9;
+ pixel_y = 17
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"tDX" = (
+/obj/structure/table/standard,
+/obj/item/weapon/storage/box/beakers,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"tEq" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"tFx" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office6)
+"tGn" = (
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/ne)
+"tGO" = (
+/obj/machinery/vending/bepis{
+ dir = 4;
+ pixel_x = -7
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"tGQ" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"tHb" = (
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"tHl" = (
+/obj/structure/window/reinforced/tinted{
+ dir = 8
+ },
+/obj/structure/table/rack/steel,
+/obj/item/weapon/towel/random,
+/obj/random/soap,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"tHw" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"tHA" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/sw)
+"tHM" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell13)
+"tIw" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/structure/mopbucket,
+/turf/simulated/floor,
+/area/redgate/facility/office3)
+"tIz" = (
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"tII" = (
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"tIS" = (
+/obj/machinery/transhuman/resleever,
+/obj/effect/floor_decal/borderfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"tIX" = (
+/obj/structure/table/reinforced,
+/obj/random/maintenance/foodstuff,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"tIY" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell20)
+"tJa" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"tJz" = (
+/obj/structure/signevent/blue{
+ desc = "Head east here to find digestion focused characters";
+ pixel_x = 29
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"tKn" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"tLi" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"tLD" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/obj/effect/decal/cleanable/blood/drip,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"tNn" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"tPN" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 10
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"tPO" = (
+/obj/structure/smoletrack/roadturn{
+ dir = 1
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"tRh" = (
+/obj/machinery/recharge_station/ghost_pod_recharger,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell21)
+"tRB" = (
+/obj/structure/smoletrack/roadT{
+ dir = 1
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"tSC" = (
+/obj/structure/smoletrack/roadturn{
+ dir = 4
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"tSQ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"tTv" = (
+/obj/machinery/conveyor{
+ dir = 4;
+ id = "facility_Q"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/nw)
+"tTI" = (
+/obj/structure/table/standard,
+/obj/machinery/reagentgrinder,
+/obj/item/stack/material/phoron{
+ amount = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"tUg" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/se)
+"tUz" = (
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"tVa" = (
+/obj/machinery/processor,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"tVt" = (
+/obj/machinery/vending/snlvend{
+ dir = 4;
+ pixel_x = -8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"tVK" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"tVM" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"tWF" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"tXN" = (
+/obj/structure/table/standard,
+/obj/random/pouch,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"tXQ" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 8
+ },
+/obj/machinery/light/floortube{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"tXR" = (
+/obj/effect/floor_decal/corner/pink/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"tYm" = (
+/obj/random/maintenance/engineering,
+/turf/simulated/floor/tiled/monotile,
+/area/redgate/facility/cell29)
+"tYH" = (
+/obj/structure/disposalpipe/segment{
+ dir = 1;
+ icon_state = "pipe-c"
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"tZu" = (
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"uag" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/powercell/device,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell14)
+"uaM" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/beaker/large,
+/obj/item/weapon/reagent_containers/dropper,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"ubE" = (
+/obj/machinery/vending/loadout/overwear,
+/obj/effect/floor_decal/corner/grey{
+ dir = 10
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"uce" = (
+/obj/item/modular_computer/console,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"uct" = (
+/obj/structure/table/glass,
+/obj/item/weapon/storage/box/gloves,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"ucB" = (
+/obj/structure/prop/fantasy/shinto{
+ layer = 5;
+ pixel_y = 8
+ },
+/obj/effect/floor_decal/atoll/border{
+ dir = 1
+ },
+/turf/simulated/floor/atoll,
+/area/redgate/facility/cell16)
+"ucM" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/office5)
+"udo" = (
+/obj/machinery/the_singularitygen,
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"udQ" = (
+/obj/structure/table/borosilicate,
+/obj/random/maintenance/research,
+/obj/effect/floor_decal/techfloor,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"udW" = (
+/turf/simulated/floor,
+/area/redgate/facility/office2)
+"ufK" = (
+/obj/structure/table/borosilicate,
+/obj/random/technology_scanner,
+/obj/effect/floor_decal/techfloor{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"ugf" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/full,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/obj/structure/window/reinforced,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"ugm" = (
+/turf/simulated/wall/tgmc/redstripe,
+/area/redgate/facility/office5)
+"ugx" = (
+/obj/structure/table/standard,
+/obj/item/weapon/gun/energy/taser/xeno,
+/obj/item/weapon/melee/baton/slime/loaded,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"ugM" = (
+/obj/machinery/vending/sol{
+ dir = 4;
+ pixel_x = -8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"uhd" = (
+/obj/effect/floor_decal/corner/white/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"uhl" = (
+/obj/structure/dogbed{
+ icon_scale_x = 2;
+ icon_scale_y = 2
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"uhG" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"ujd" = (
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"ujr" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"ujy" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12;
+ pixel_y = 3
+ },
+/obj/structure/mirror{
+ dir = 8;
+ pixel_x = 26;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"ukh" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Nerd"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"ulm" = (
+/obj/machinery/telecomms/bus,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab3)
+"ulv" = (
+/obj/structure/table/glass,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"ulE" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/ne)
+"ulT" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"umj" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"umG" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"umQ" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_3"
+ },
+/turf/simulated/floor,
+/area/redgate/facility/office8)
+"una" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 10
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/office1)
+"unc" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"uoz" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"uoG" = (
+/obj/structure/table/glass,
+/obj/random/flashlight,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"uoO" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"upk" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Sciencemann"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"uta" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/obj/effect/floor_decal/carpet/blue{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"uts" = (
+/obj/structure/closet,
+/obj/item/clothing/suit/kimono/blue,
+/obj/item/clothing/shoes/sandal,
+/obj/item/weapon/storage/box/matches,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"utW" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"utX" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 8
+ },
+/obj/item/modular_computer/console,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"utZ" = (
+/obj/machinery/appliance/cooker/oven,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"uuj" = (
+/obj/structure/table/glass,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"uuI" = (
+/obj/structure/railing{
+ dir = 1
+ },
+/obj/structure/table/rack/steel,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"uvV" = (
+/obj/structure/table/glass,
+/obj/machinery/chemical_dispenser/biochemistry/full,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"uwd" = (
+/obj/machinery/disposal/wall{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"uxJ" = (
+/obj/structure/closet,
+/obj/item/clothing/under/rank/security/corp,
+/obj/item/weapon/handcuffs,
+/obj/item/clothing/shoes/boots/duty,
+/obj/item/clothing/gloves/black,
+/obj/item/clothing/head/helmet/solgov/security,
+/obj/item/device/ticket_printer,
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"uxP" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"uzf" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell12)
+"uzn" = (
+/obj/machinery/optable,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"uzu" = (
+/obj/structure/table/standard,
+/obj/item/weapon/storage/box/syringes,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"uAd" = (
+/obj/structure/girder,
+/obj/machinery/atmospherics/pipe/simple/visible/red{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"uAe" = (
+/obj/machinery/vending/radren{
+ dir = 4;
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"uAx" = (
+/obj/structure/table/woodentable,
+/obj/machinery/microwave,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"uBE" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"uBR" = (
+/obj/structure/closet/l3closet/janitor,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"uCR" = (
+/obj/structure/table/reinforced,
+/obj/structure/salvageable/personal,
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"uCW" = (
+/obj/effect/floor_decal/borderfloorwhite/corner,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"uDj" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"uDl" = (
+/obj/structure/bookcase/manuals/research_and_development,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office1)
+"uEG" = (
+/obj/random/junk,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"uEI" = (
+/turf/simulated/floor/water/pool,
+/area/redgate/facility/cell13)
+"uFh" = (
+/obj/effect/floor_decal/borderfloorwhite/corner{
+ dir = 8
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"uGh" = (
+/obj/structure/table/standard,
+/obj/random/flashlight,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"uGi" = (
+/obj/machinery/floodlight{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"uGj" = (
+/obj/machinery/atmospherics/pipe/vent,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"uGy" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 9
+ },
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"uGz" = (
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"uGP" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"uGZ" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"uHs" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ id_tag = "cell_14b";
+ locked = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"uHK" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "Bouqet"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"uHO" = (
+/obj/structure/table/hardwoodtable,
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/rugged,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"uIp" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 8
+ },
+/obj/structure/bed/chair/sofa/corp/right,
+/turf/simulated/floor/carpet/purcarpet,
+/area/redgate/facility/cell1)
+"uIT" = (
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"uJD" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/item/weapon/bone/skull,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"uJU" = (
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"uKk" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/obj/machinery/button/remote/airlock{
+ id = "cell_22";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/obj/machinery/button/windowtint{
+ id = "cell_22";
+ pixel_x = 22
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"uKS" = (
+/obj/structure/closet/walllocker_double/science/west,
+/obj/item/selectable_item/chemistrykit/gender,
+/obj/item/selectable_item/chemistrykit/gender,
+/obj/item/selectable_item/chemistrykit/gender,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"uLu" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab3)
+"uLv" = (
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"uLz" = (
+/obj/structure/prop/rock/small,
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"uLN" = (
+/obj/machinery/floodlight{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"uLO" = (
+/obj/structure/bed/chair/sofa/corp/right{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell9)
+"uMg" = (
+/obj/machinery/telecomms/server,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab3)
+"uMq" = (
+/obj/structure/closet/walllocker_double/science/east,
+/obj/item/weapon/book/manual/virology,
+/obj/item/device/antibody_scanner,
+/obj/item/device/antibody_scanner,
+/obj/item/weapon/reagent_containers/glass/beaker,
+/obj/item/weapon/virusdish/random,
+/obj/item/weapon/virusdish/random,
+/obj/item/weapon/virusdish/random,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"uNl" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"uNo" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell26)
+"uNu" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"uNy" = (
+/obj/structure/table/standard,
+/obj/item/weapon/storage/firstaid/surgery,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"uOS" = (
+/obj/structure/bed/chair/office/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"uQl" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"uQm" = (
+/obj/structure/disposalpipe/segment{
+ dir = 1;
+ icon_state = "pipe-c"
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab5)
+"uQp" = (
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
+ },
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab5)
+"uRI" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell5)
+"uSb" = (
+/obj/effect/floor_decal/corner/pink/bordercorner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"uSJ" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "lab_office"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"uUk" = (
+/obj/machinery/light,
+/obj/structure/bed/chair/sofa/purp{
+ dir = 1
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"uUr" = (
+/obj/machinery/vending/desatti{
+ dir = 4;
+ pixel_x = -8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"uUQ" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"uUR" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"uVI" = (
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = 32
+ },
+/obj/random/plushie,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"uWT" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/green,
+/area/redgate/facility/sw)
+"uXg" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"uXt" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "cell_10";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"uXJ" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"uYc" = (
+/obj/item/weapon/material/shard,
+/turf/simulated/floor,
+/area/redgate/facility/cell6)
+"uYg" = (
+/obj/machinery/floodlight{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"uYm" = (
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"uYJ" = (
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"uZl" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/beaker/large,
+/obj/item/weapon/reagent_containers/dropper,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"uZo" = (
+/obj/effect/floor_decal/corner/black/bordercorner,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"uZs" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/lab5)
+"vbz" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"vcx" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vcT" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 1
+ },
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/elite,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"vdv" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"vdM" = (
+/obj/structure/table/glass,
+/obj/random/soap_common,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"vdS" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"veD" = (
+/turf/simulated/floor/grass,
+/area/redgate/facility/office1)
+"vfp" = (
+/obj/machinery/door/window{
+ dir = 8
+ },
+/obj/machinery/door/window/eastright,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"vfQ" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/beige{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"vgq" = (
+/obj/machinery/atmospherics/pipe/simple/visible/red,
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"vgS" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"vhe" = (
+/obj/structure/closet/cabinet,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/obj/random/pizzabox,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"vhU" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/structure/bed/chair/sofa/corp/right{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"vhX" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell23)
+"vio" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"vjh" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office11)
+"vjk" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/hos,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"vjE" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"vjP" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite,
+/obj/item/weapon/storage/box/beakers,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vjS" = (
+/obj/structure/table/wooden_reinforced,
+/obj/item/weapon/clipboard,
+/obj/machinery/button/remote/airlock{
+ id = "lab_office";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"vkJ" = (
+/obj/structure/table/glass,
+/obj/machinery/chemical_dispenser/biochemistry/full,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office8)
+"vkS" = (
+/obj/random/mech/old,
+/obj/machinery/mech_recharger,
+/turf/simulated/floor/tiled/milspec/raised,
+/area/redgate/facility/ne)
+"vkW" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"vkZ" = (
+/obj/machinery/vending/cola{
+ dir = 4;
+ pixel_x = -7
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"vlS" = (
+/obj/random/plushie,
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = -32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"vmd" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor,
+/area/redgate/facility/ne)
+"vmf" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"vmt" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"vmx" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor/black,
+/area/redgate/facility/cell19)
+"vmZ" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "cell_10";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"vnp" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 1
+ },
+/obj/machinery/light/floortube,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"vok" = (
+/obj/structure/grille/broken,
+/turf/simulated/floor,
+/area/redgate/facility/cell6)
+"vph" = (
+/obj/structure/sign/signnew/cryogenics{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"vpr" = (
+/obj/effect/floor_decal/spline/fancy/wood{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/blue2,
+/area/redgate/facility/office1)
+"vpJ" = (
+/turf/simulated/floor/water/deep/pool,
+/area/redgate/facility/cell6)
+"vqd" = (
+/obj/structure/closet/secure_closet/medical1,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vqp" = (
+/obj/machinery/power/rad_collector,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"vqJ" = (
+/obj/structure/closet/wardrobe/chemistry_white,
+/obj/item/weapon/storage/box/syringes,
+/obj/item/weapon/storage/box/syringes,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vqO" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vrp" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"vsA" = (
+/obj/structure/table/glass,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vsY" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/obj/machinery/button/windowtint{
+ id = "office_3";
+ pixel_x = -22
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"vuD" = (
+/obj/machinery/button/remote/airlock{
+ dir = 8;
+ id = "cell_6";
+ pixel_x = -25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"vva" = (
+/obj/structure/table/standard,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"vvH" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"vvJ" = (
+/obj/effect/rune{
+ icon_scale_x = 3;
+ icon_scale_y = 3
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"vvP" = (
+/obj/structure/table/steel_reinforced,
+/obj/structure/window/plastitanium{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"vvV" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 12;
+ pixel_y = 3
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"vwv" = (
+/obj/structure/closet/firecloset,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"vwC" = (
+/obj/machinery/atmospherics/pipe/simple/visible/red,
+/obj/machinery/atmospherics/pipe/simple/visible/green{
+ dir = 4
+ },
+/obj/random/forgotten_tram,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"vzb" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"vzp" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/cyan{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"vzJ" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ dir = 8;
+ icon_state = "1-4"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"vAp" = (
+/obj/structure/bed/chair/office/light,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell8)
+"vAH" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"vAV" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = 26
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"vBj" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/cable{
+ dir = 8;
+ icon_state = "1-4"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"vBZ" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"vCg" = (
+/obj/structure/closet/secure_closet/egg/xenomorph,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell5)
+"vCK" = (
+/obj/item/weapon/material/shard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"vDA" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"vEb" = (
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 8
+ },
+/obj/machinery/injector_maker{
+ pixel_x = -27
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vEL" = (
+/obj/effect/floor_decal/corner/white/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"vFk" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 4
+ },
+/obj/random/medical/lite,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vFv" = (
+/obj/item/weapon/material/shard,
+/obj/effect/floor_decal/industrial/warning{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell22)
+"vFG" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet/blue,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vGy" = (
+/obj/effect/floor_decal/industrial/warning/dust{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"vGF" = (
+/obj/effect/floor_decal/corner/orange/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"vHn" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"vHD" = (
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 6
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"vHH" = (
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell17)
+"vIk" = (
+/obj/structure/table/glass,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vIA" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell18)
+"vIJ" = (
+/obj/structure/table/borosilicate,
+/obj/effect/floor_decal/techfloor,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"vJp" = (
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"vKd" = (
+/obj/structure/closet/walllocker_double/science/east,
+/obj/item/weapon/folder/blue,
+/obj/item/weapon/folder,
+/obj/item/weapon/clipboard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vKi" = (
+/obj/effect/floor_decal/corner/orange/bordercorner,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"vKH" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"vLF" = (
+/obj/effect/floor_decal/corner/blue/border{
+ dir = 1
+ },
+/obj/structure/table/glass,
+/obj/random/tetheraid,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"vMh" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "cell_6";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"vMw" = (
+/obj/item/device/geiger/wall/north,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"vMO" = (
+/obj/structure/bed/chair/sofa/corp,
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"vNd" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"vNs" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/obj/structure/bed/chair/sofa/left/brown,
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/sw)
+"vNL" = (
+/obj/structure/closet/walllocker_double/science/south,
+/obj/random/maintenance/research,
+/obj/random/maintenance/research,
+/obj/random/toy,
+/obj/item/device/camera,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell10)
+"vOj" = (
+/obj/item/modular_computer/console{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"vPa" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/security)
+"vPf" = (
+/obj/structure/bed/padded,
+/obj/item/weapon/bedsheet,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell18)
+"vPh" = (
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"vPy" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"vPE" = (
+/obj/structure/railing,
+/obj/structure/table/bench/steel,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"vPG" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance{
+ dir = 4;
+ id_tag = "cell_17"
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"vPI" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"vPN" = (
+/obj/structure/table/standard,
+/obj/random/drinksoft,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"vQf" = (
+/turf/simulated/floor/tiled/monotile,
+/area/redgate/facility/cell29)
+"vQz" = (
+/obj/structure/cable,
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"vQS" = (
+/obj/structure/cable{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/unsimulated/floor/techfloor_grid{
+ name = "singularity flooring"
+ },
+/area/redgate/facility/cell29)
+"vRj" = (
+/obj/machinery/papershredder,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"vSh" = (
+/obj/machinery/photocopier,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"vSn" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"vSw" = (
+/obj/effect/floor_decal/borderfloorwhite/corner{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"vTt" = (
+/obj/effect/floor_decal/borderfloorwhite/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"vTw" = (
+/obj/machinery/door/blast/regular{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell3)
+"vUT" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"vUW" = (
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 8
+ },
+/obj/structure/flora/pottedplant/overgrown,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vVp" = (
+/obj/effect/floor_decal/borderfloorwhite/corner,
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 7;
+ pixel_y = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"vVM" = (
+/obj/item/modular_computer/console{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vVP" = (
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "cell_14";
+ pixel_x = -8;
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 7;
+ pixel_y = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"vXh" = (
+/obj/structure/filingcabinet/filingcabinet{
+ density = 0;
+ pixel_x = -11
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"vXi" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 7;
+ pixel_y = -30
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"vXG" = (
+/obj/machinery/porta_turret/lasertag{
+ name = "containment turret"
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"vYw" = (
+/obj/structure/smolebuilding/houses,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/smole,
+/area/redgate/facility/cell15)
+"vYy" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7;
+ pixel_y = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"waw" = (
+/obj/structure/bed/chair/sofa/corp/left{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"waV" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell6)
+"wbd" = (
+/obj/random/trash_pile,
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/ne)
+"wbk" = (
+/obj/effect/decal/cleanable/blood/oil,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"wbo" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"wbX" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/reagent_containers/food/snacks/chocolateegg,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wcy" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/lab8)
+"wcz" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"wcX" = (
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"wdI" = (
+/obj/effect/floor_decal/techfloor{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"wez" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell17)
+"wfv" = (
+/obj/structure/closet/walllocker_double/science/north,
+/obj/item/weapon/surgical/scalpel,
+/obj/item/clothing/gloves/sterile/nitrile,
+/obj/item/clothing/gloves/sterile/nitrile,
+/obj/item/clothing/gloves/sterile/nitrile,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wfz" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"wgi" = (
+/obj/machinery/atmospherics/pipe/simple/visible/red{
+ dir = 5
+ },
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"wgj" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 5
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/ne)
+"wgM" = (
+/obj/random/multiple/random_size_crate/no_weapons,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"wij" = (
+/obj/structure/closet/walllocker_double/security/east,
+/obj/random/contraband/nofail,
+/obj/random/contraband/nofail,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"wjn" = (
+/obj/structure/bed/chair/office/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"wkn" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell19)
+"wkL" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 5
+ },
+/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,
+/obj/machinery/atmospherics/portables_connector{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/lab2)
+"wlM" = (
+/obj/structure/table/borosilicate,
+/obj/item/weapon/implantcase/tracking,
+/obj/item/weapon/implanter,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"wlO" = (
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell26)
+"wlS" = (
+/obj/machinery/door/airlock/angled_tgmc/engineering,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"wmm" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/weapon/book/manual/robotics_manual,
+/turf/simulated/floor/tiled/steel_grid,
+/area/redgate/facility/ne)
+"wmn" = (
+/obj/machinery/photocopier,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"wmB" = (
+/obj/structure/table/wooden_reinforced,
+/obj/machinery/cell_charger,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/lab5)
+"wmT" = (
+/obj/structure/table/glass,
+/obj/item/device/defib_kit/loaded,
+/obj/effect/floor_decal/borderfloor,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"wnn" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab8)
+"woC" = (
+/turf/simulated/wall/tgmc/rwall,
+/area/redgate/facility/cell8)
+"wpO" = (
+/obj/machinery/field_generator{
+ anchored = 1;
+ state = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"wpY" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ id_tag = "cell_4"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell4)
+"wqT" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ name = "Research Facility"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab4)
+"wqX" = (
+/obj/structure/grille,
+/obj/structure/window/reinforced/polarized/full{
+ id = "office_2"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office2)
+"wrO" = (
+/obj/structure/bed/chair/sofa/corp/right,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"wsg" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell26)
+"wsU" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_14";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"wsW" = (
+/obj/structure/closet/radiation,
+/obj/random/maintenance/engineering,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"wtc" = (
+/obj/structure/table/steel,
+/obj/machinery/recharger,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"wtl" = (
+/obj/structure/table/reinforced,
+/obj/item/weapon/reagent_containers/food/snacks/egg/green,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wty" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"wua" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "office_3"
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office8)
+"wum" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell2)
+"wuJ" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ locked = 1
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/sw)
+"wuV" = (
+/obj/machinery/organ_printer/flesh,
+/obj/effect/floor_decal/borderfloor{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"wvE" = (
+/obj/structure/table/darkglass,
+/obj/item/weapon/bikehorn/rubberducky/grey,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"wwn" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"wwB" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell21)
+"wxd" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/ne)
+"wyg" = (
+/obj/structure/closet/toolcloset,
+/obj/random/tool/power,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"wys" = (
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/obj/structure/table/standard,
+/obj/structure/salvageable/personal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"wyO" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"wzb" = (
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/sw)
+"wzE" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"wBd" = (
+/obj/structure/table/glass,
+/obj/item/weapon/reagent_containers/glass/beaker/vial/microcillin,
+/obj/item/weapon/reagent_containers/glass/beaker/vial/microcillin,
+/obj/item/weapon/reagent_containers/glass/beaker/vial/macrocillin,
+/obj/item/weapon/reagent_containers/glass/beaker/vial/macrocillin,
+/obj/item/weapon/reagent_containers/glass/beaker/vial/normalcillin,
+/obj/item/weapon/reagent_containers/glass/beaker/vial/normalcillin,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office11)
+"wBO" = (
+/obj/structure/bed/chair/office/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"wCE" = (
+/obj/structure/table/woodentable,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"wCZ" = (
+/obj/machinery/conveyor{
+ dir = 8;
+ id = "facility_Q"
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/nw)
+"wDx" = (
+/turf/simulated/wall/solidrock,
+/area/redgate/facility/cell26)
+"wDL" = (
+/obj/structure/table/woodentable,
+/obj/random/forgotten_tram,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office9)
+"wDV" = (
+/obj/machinery/sleeper{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"wEe" = (
+/obj/structure/closet/l3closet/janitor,
+/obj/random/tool/alien,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"wFo" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ id_tag = "cell_9";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"wFP" = (
+/obj/effect/floor_decal/corner/red/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"wGc" = (
+/obj/machinery/media/jukebox,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"wGw" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"wGy" = (
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"wGJ" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell18)
+"wGW" = (
+/obj/random/bluespace,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"wHb" = (
+/turf/simulated/wall/tgmc/darkwall,
+/area/redgate/facility/tram)
+"wHu" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"wHy" = (
+/obj/structure/closet/secure_closet/personal{
+ name = "U. C. Weiner"
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/lightgrey{
+ dir = 6
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/random/forgotten_tram,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"wIG" = (
+/obj/item/weapon/reagent_containers/food/drinks/cans/bepis{
+ pixel_x = 13;
+ pixel_y = 10
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell22)
+"wJW" = (
+/obj/structure/bed/chair/backed_grey{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"wKl" = (
+/obj/machinery/button/remote/airlock{
+ dir = 1;
+ id = "cell_15";
+ pixel_x = -8;
+ pixel_y = -24;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"wLb" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4;
+ locked = 1;
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/lab3)
+"wLo" = (
+/obj/structure/closet,
+/obj/random/contraband/nofail,
+/obj/random/meat,
+/obj/random/meat,
+/obj/random/meat,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"wLp" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"wLs" = (
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"wMg" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"wMh" = (
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 9
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals6{
+ dir = 10
+ },
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"wMB" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wMW" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wOa" = (
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wOh" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wOP" = (
+/obj/machinery/door/airlock/angled_tgmc/medical{
+ dir = 8;
+ id_tag = "medical_2"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/office6)
+"wPL" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"wQB" = (
+/obj/machinery/door/airlock/angled_tgmc/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/cell23)
+"wQZ" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/white/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"wRm" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_15";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"wRU" = (
+/obj/structure/curtain/open{
+ anchored = 1;
+ dir = 4;
+ pixel_x = 32
+ },
+/turf/simulated/floor/carpet/oracarpet,
+/area/redgate/facility/cell5)
+"wSu" = (
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"wSx" = (
+/obj/random/vendorall,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wSy" = (
+/obj/structure/particle_accelerator/particle_emitter/left{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"wTD" = (
+/obj/structure/particle_accelerator/particle_emitter/center{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"wTX" = (
+/obj/structure/particle_accelerator/particle_emitter/right{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"wUe" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 1;
+ pixel_y = -32
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab5)
+"wVH" = (
+/obj/effect/floor_decal/spline/plain,
+/turf/simulated/floor/carpet/tealcarpet,
+/area/redgate/facility/ne)
+"wVY" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"wWk" = (
+/obj/effect/floor_decal/corner/pink/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"wWn" = (
+/obj/machinery/door/airlock/angled_tgmc/cell,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"wWT" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"wXX" = (
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"wYy" = (
+/obj/structure/closet/hydrant{
+ pixel_y = 32
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"wZD" = (
+/obj/effect/floor_decal/industrial/warning,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell15)
+"xag" = (
+/obj/effect/floor_decal/rust,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell25)
+"xan" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xaD" = (
+/obj/effect/wingrille_spawn/reinforced_phoron,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell8)
+"xaM" = (
+/obj/structure/closet/walllocker_double/north,
+/obj/random/maintenance/security,
+/obj/random/mre,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"xcb" = (
+/obj/structure/filingcabinet/filingcabinet{
+ pixel_x = 11
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"xcj" = (
+/obj/structure/prop/machine/alien_tank,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"xcU" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xdg" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xer" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xes" = (
+/obj/structure/particle_accelerator/power_box{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"xeF" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"xeT" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_5";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"xeW" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"xfG" = (
+/obj/machinery/portable_atmospherics/canister/empty,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"xgR" = (
+/obj/structure/sink{
+ dir = 1;
+ pixel_y = -8
+ },
+/obj/structure/mirror{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/entrance)
+"xgW" = (
+/obj/item/weapon/paper/crumpled,
+/obj/machinery/light/broken{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"xhK" = (
+/obj/machinery/door/airlock/angled_tgmc/wide/generic_steel{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"xhO" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_16";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"xhT" = (
+/turf/simulated/wall/tgmc/whitewall{
+ can_open = 1
+ },
+/area/redgate/facility/sw)
+"xiu" = (
+/obj/structure/table/standard,
+/obj/item/weapon/paper_bin{
+ pixel_y = 4
+ },
+/obj/item/weapon/pen{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"xiY" = (
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"xjD" = (
+/obj/machinery/button/remote/blast_door{
+ id = "core_experiment";
+ pixel_y = 25
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"xjV" = (
+/obj/machinery/button/windowtint{
+ id = "cell_9";
+ pixel_x = 22
+ },
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"xkn" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"xnp" = (
+/obj/effect/floor_decal/corner/orange/bordercorner{
+ dir = 1
+ },
+/obj/machinery/light/floortube,
+/turf/simulated/floor/tiled/eris/dark/techfloor_grid,
+/area/redgate/facility/ne)
+"xnq" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xny" = (
+/obj/machinery/light,
+/obj/effect/floor_decal/corner/red/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xpa" = (
+/obj/machinery/door/blast/multi_tile/three_tile_hor{
+ id = "facility_engine"
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell29)
+"xpn" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xps" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/bordercorner,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xpu" = (
+/obj/effect/floor_decal/corner/red/border,
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xpv" = (
+/obj/item/toy/plushie/slimeplushie,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"xqf" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"xqm" = (
+/obj/machinery/light,
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"xqA" = (
+/obj/machinery/door/airlock/angled_tgmc/personal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xqU" = (
+/obj/machinery/door/blast/regular/open,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell27)
+"xrx" = (
+/obj/effect/floor_decal/corner/red/bordercorner{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xrJ" = (
+/obj/machinery/power/terminal,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"xrN" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"xrX" = (
+/obj/machinery/particle_accelerator/control_box,
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"xsE" = (
+/obj/structure/particle_accelerator/fuel_chamber{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"xsN" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/weapon/paper_bin,
+/obj/item/weapon/pen/blue,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"xth" = (
+/obj/effect/floor_decal/industrial/warning/corner,
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/ne)
+"xtG" = (
+/obj/structure/cable{
+ dir = 8;
+ icon_state = "1-4"
+ },
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"xua" = (
+/obj/effect/floor_decal/carpet/blue{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/bcarpet,
+/area/redgate/facility/ne)
+"xuj" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/table/reinforced,
+/obj/item/device/t_scanner/advanced,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"xul" = (
+/obj/structure/closet,
+/obj/item/weapon/storage/bag/circuits/basic,
+/obj/item/integrated_circuit/output/led/blue,
+/obj/item/integrated_circuit/output/led/orange,
+/obj/item/weapon/circuitboard/gyrotron,
+/obj/fiftyspawner/steel,
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"xus" = (
+/obj/effect/floor_decal/corner/black/border{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xuu" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/pink/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"xuI" = (
+/turf/simulated/wall/tgmc/window/redstripe_r,
+/area/redgate/facility/security)
+"xuW" = (
+/obj/item/modular_computer/console,
+/obj/effect/floor_decal/techfloor{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell8)
+"xvb" = (
+/obj/structure/table/glass,
+/obj/random/firstaid,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab1)
+"xvi" = (
+/obj/effect/floor_decal/industrial/warning/corner{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"xwi" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"xxc" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/bed/chair/office/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xxi" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"xyp" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"xyt" = (
+/obj/item/weapon/paper,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"xyV" = (
+/obj/structure/table/steel_reinforced,
+/obj/random/maintenance/foodstuff,
+/turf/simulated/floor/tiled/eris/steel/gray_platform,
+/area/redgate/facility/ne)
+"xAG" = (
+/obj/machinery/shower{
+ dir = 1
+ },
+/obj/structure/curtain/open/shower,
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 9
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals10{
+ dir = 10
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/cell4)
+"xAO" = (
+/obj/structure/closet/walllocker_double/science/east,
+/obj/random/maintenance/research,
+/obj/random/mainttoyloot,
+/obj/random/tool/power,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"xAT" = (
+/obj/machinery/light,
+/turf/simulated/shuttle/floor/alienplating,
+/area/redgate/facility/cell19)
+"xBb" = (
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"xBi" = (
+/obj/machinery/computer/arcade/battle,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell1)
+"xBl" = (
+/turf/simulated/mineral/floor/ignore_cavegen/cave,
+/area/redgate/facility/cell20)
+"xBu" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/cell26)
+"xCz" = (
+/obj/machinery/button/remote/airlock{
+ id = "cell_16";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"xDe" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4;
+ id_tag = "cell_1"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell8)
+"xDC" = (
+/obj/structure/closet/walllocker_double/science/north,
+/obj/item/weapon/folder,
+/obj/random/mainttoyloot/nofail,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"xDR" = (
+/obj/structure/table/reinforced,
+/obj/structure/window/reinforced,
+/obj/item/weapon/paper_bin{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/obj/item/weapon/pen/red{
+ pixel_x = 2;
+ pixel_y = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"xDU" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell3)
+"xEc" = (
+/obj/structure/table/standard,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"xEz" = (
+/obj/effect/floor_decal/industrial/warning{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"xFK" = (
+/turf/simulated/wall/tgmc/window/white/reinf,
+/area/redgate/facility/lab8)
+"xGT" = (
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"xHm" = (
+/obj/machinery/floodlight,
+/turf/simulated/floor/tiled/steel,
+/area/redgate/facility/cell11)
+"xHt" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_12";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"xHM" = (
+/obj/structure/table/hardwoodtable,
+/obj/item/modular_computer/laptop/preset/custom_loadout/hybrid,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/ne)
+"xHY" = (
+/obj/machinery/door/airlock/angled_tgmc/personal{
+ id_tag = "cell_22";
+ name = "Research Facility"
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"xId" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell25)
+"xIi" = (
+/obj/structure/window/reinforced/polarized/full{
+ id = "cell_22"
+ },
+/obj/structure/grille,
+/turf/simulated/floor,
+/area/redgate/facility/cell27)
+"xIs" = (
+/obj/structure/flora/ausbushes/leafybush,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"xIE" = (
+/obj/structure/table/steel_reinforced,
+/obj/machinery/button/remote/blast_door{
+ id = "lab_explo"
+ },
+/obj/machinery/door/window/eastright{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/securitylobby)
+"xIZ" = (
+/obj/structure/reagent_dispensers/water_cooler/full,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell7)
+"xJF" = (
+/obj/effect/floor_decal/corner/blue/bordercorner,
+/obj/effect/floor_decal/corner/blue/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"xJK" = (
+/obj/effect/floor_decal/corner/lime/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"xJX" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 10
+ },
+/obj/structure/bed/chair/comfy/black{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xKn" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 6
+ },
+/obj/machinery/recharge_station,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xKB" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/vent{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xKL" = (
+/obj/machinery/power/smes,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"xKN" = (
+/obj/structure/table/glass,
+/obj/effect/floor_decal/corner/blue/border,
+/obj/item/bodybag/cryobag,
+/obj/item/bodybag/cryobag{
+ pixel_x = -2;
+ pixel_y = -2
+ },
+/obj/item/bodybag/cryobag{
+ pixel_x = 1;
+ pixel_y = 1
+ },
+/obj/item/bodybag/cryobag{
+ pixel_x = 2;
+ pixel_y = 2
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/medbay)
+"xKP" = (
+/obj/structure/particle_accelerator/end_cap{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/dark/gray_platform,
+/area/redgate/facility/cell29)
+"xKY" = (
+/obj/structure/flora/tree/palm,
+/obj/structure/flora/ausbushes/fullgrass,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"xMp" = (
+/obj/random/maintenance,
+/turf/simulated/floor,
+/area/redgate/facility/sw)
+"xMt" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"xNc" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 8
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/se)
+"xNA" = (
+/obj/structure/bed/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/techmaint_cargo,
+/area/redgate/facility/sw)
+"xNS" = (
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"xNT" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"xNY" = (
+/obj/structure/bed/chair/office/light,
+/obj/structure/extinguisher_cabinet{
+ dir = 4;
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"xOB" = (
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/machinery/light,
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"xOO" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell9)
+"xOU" = (
+/obj/effect/floor_decal/corner/black/bordercorner{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xPu" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xQu" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell26)
+"xQL" = (
+/obj/structure/disposaloutlet{
+ density = 0;
+ dir = 1;
+ pixel_y = -20
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/redgate/facility/lab5)
+"xQR" = (
+/obj/structure/table/bench/standard,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/nw)
+"xRa" = (
+/obj/structure/bed/chair/office/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"xRq" = (
+/obj/machinery/portable_atmospherics/canister/empty,
+/obj/machinery/light,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell29)
+"xRx" = (
+/obj/machinery/button/windowtint{
+ id = "office_2";
+ pixel_x = -22
+ },
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/office2)
+"xRG" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"xSi" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/effect/floor_decal/corner/red/border{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"xSp" = (
+/obj/effect/floor_decal/spline/plain{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/ne)
+"xSO" = (
+/turf/simulated/floor/carpet/brown,
+/area/redgate/facility/ne)
+"xTL" = (
+/obj/random/trash_pile,
+/turf/simulated/floor,
+/area/redgate/facility/cell19)
+"xTS" = (
+/obj/structure/filingcabinet/chestdrawer{
+ pixel_x = -7
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"xTT" = (
+/turf/simulated/floor/carpet/blucarpet,
+/area/redgate/facility/office9)
+"xVt" = (
+/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/lab2)
+"xVy" = (
+/obj/machinery/button/remote/airlock{
+ id = "cell_12";
+ pixel_y = 25;
+ specialfunctions = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"xWb" = (
+/obj/effect/floor_decal/corner/pink/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/sw)
+"xWl" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell16)
+"xWX" = (
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xWZ" = (
+/obj/structure/grille/broken,
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/cell21)
+"xXg" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xXz" = (
+/obj/structure/table/standard,
+/obj/effect/floor_decal/corner/grey/diagonal,
+/obj/fruitspawner/lettuce,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/ne)
+"xXX" = (
+/obj/item/modular_computer/console,
+/obj/structure/railing/grey{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/eris/steel/monofloor,
+/area/redgate/facility/ne)
+"xYt" = (
+/obj/structure/closet/walllocker_double/north,
+/obj/item/weapon/entrepreneur/spirit_board,
+/obj/random/maintenance/research,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell27)
+"xZv" = (
+/turf/simulated/wall/tgmc/whitewall,
+/area/redgate/facility/cell29)
+"xZD" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/redgate/facility/nw)
+"xZX" = (
+/obj/structure/flora/ausbushes/fullgrass,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"yaj" = (
+/turf/simulated/floor,
+/area/redgate/facility/se)
+"yaw" = (
+/obj/structure/flora/ausbushes/sparsegrass,
+/obj/structure/flora/ausbushes/ywflowers,
+/turf/simulated/floor/grass,
+/area/redgate/facility/cell27)
+"ybb" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"ycP" = (
+/turf/simulated/floor/tiled/eris/steel/gray_perforated,
+/area/redgate/facility/ne)
+"ycU" = (
+/obj/machinery/power/smes,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"yel" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"yew" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/light,
+/turf/simulated/floor/tiled/eris/dark/orangecorner,
+/area/redgate/facility/cell29)
+"yeR" = (
+/obj/structure/table/steel,
+/obj/item/device/integrated_electronics/debugger{
+ pixel_x = -5
+ },
+/obj/item/device/integrated_electronics/wirer{
+ pixel_x = 5
+ },
+/turf/simulated/floor/tiled/eris/techmaint_perforated,
+/area/redgate/facility/sw)
+"yeS" = (
+/obj/random/junk,
+/turf/simulated/floor,
+/area/redgate/facility/nw)
+"yeY" = (
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/redgate/facility/cell8)
+"yfJ" = (
+/obj/item/modular_computer/console{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell9)
+"ygd" = (
+/turf/simulated/floor/tiled/techfloor/grid,
+/area/redgate/facility/cell26)
+"ygi" = (
+/obj/machinery/door/window{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/tram)
+"ygp" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/redgate/facility/securitylobby)
+"ygq" = (
+/obj/machinery/disposal/wall{
+ dir = 1
+ },
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"yhk" = (
+/obj/structure/table/rack/shelf,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/item/weapon/reagent_containers/food/snacks/meat,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell26)
+"yhz" = (
+/obj/structure/toilet{
+ pixel_y = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell11)
+"yhP" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"yid" = (
+/obj/machinery/vending/food,
+/turf/simulated/floor/wood/alt,
+/area/redgate/facility/cell4)
+"yiy" = (
+/obj/structure/bed/chair/office/light,
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/cell19)
+"yiG" = (
+/obj/machinery/door/airlock/angled_tgmc/cell{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor/black,
+/area/redgate/facility/cell19)
+"yjb" = (
+/obj/effect/floor_decal/corner/red/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 5
+ },
+/turf/simulated/floor/tiled/white,
+/area/redgate/facility/se)
+"ykE" = (
+/obj/structure/table/rack/shelf/steel,
+/obj/item/weapon/storage/box/trackimp{
+ pixel_x = 5;
+ pixel_y = 1
+ },
+/obj/machinery/light{
+ dir = 1;
+ stat = 0
+ },
+/turf/simulated/floor/tiled/milspec,
+/area/redgate/facility/ne)
+
+(1,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+mzU
+mzU
+mzU
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(2,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+fqo
+cQv
+cQv
+cQv
+cQv
+fqo
+cQv
+cQv
+cQv
+cQv
+fqo
+cQv
+cQv
+cQv
+cQv
+fqo
+cQv
+cQv
+cQv
+cQv
+fqo
+gAk
+gAk
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(3,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+gAk
+gAk
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(4,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+jRo
+jRo
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(5,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+gAk
+gAk
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(6,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+gAk
+gAk
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(7,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+fqE
+jRo
+jRo
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(8,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+cQv
+gAk
+gAk
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(9,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+lNc
+fqo
+cQv
+cQv
+cQv
+cQv
+fqo
+cQv
+hdd
+hmI
+hwo
+wCZ
+hKi
+tTv
+iai
+hmI
+iwj
+cQv
+cQv
+cQv
+cQv
+jHC
+gAk
+gAk
+kEo
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+jVL
+fPE
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(10,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+gCf
+xZD
+rzR
+mDx
+wCZ
+mnq
+tTv
+xEz
+rzR
+xqm
+gCf
+gCf
+gCf
+gCf
+gCf
+mzU
+mzU
+mzU
+mzU
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+fPE
+fPE
+fPE
+fPE
+qHO
+jVL
+fPE
+fPE
+jVL
+aOv
+iuu
+iuu
+iuu
+iuu
+iuu
+iuu
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(11,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rzR
+rzR
+uoz
+hHs
+vHn
+hOT
+xvi
+rzR
+wgM
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+fPE
+fPE
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+aOv
+iuu
+qgk
+qgk
+iuu
+qgk
+qgk
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(12,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xrN
+tvf
+tvf
+hcZ
+rzR
+rzR
+rzR
+rzR
+rzR
+rzR
+iXt
+jqH
+hcZ
+hcZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+aOv
+iuu
+tld
+qgk
+iuu
+qgk
+utW
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(13,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fnR
+fnR
+hyG
+hHy
+hLa
+rzR
+iaS
+iaS
+rzR
+rzR
+rzR
+rzR
+hcZ
+hcZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+qIQ
+vrp
+ruE
+aOv
+fPE
+aOv
+sGw
+cLm
+qgk
+iuu
+qgk
+xQL
+uQm
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(14,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hee
+daB
+fnR
+fbT
+wGy
+rzR
+sjF
+sjF
+rzR
+iIy
+iXT
+jrc
+hcZ
+hcZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+wSx
+vrp
+oWf
+aOv
+fRB
+aOv
+mjP
+rBH
+tCh
+iuu
+ugf
+rBH
+mjP
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(15,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+aND
+rgk
+fnR
+xDR
+mZu
+hPg
+iaS
+sjF
+xqm
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+mzU
+mzU
+mzU
+mzU
+mzU
+mzU
+mzU
+aOv
+oeJ
+vrp
+mKF
+aOv
+rEb
+soz
+gKi
+jmR
+sXT
+tTI
+sXT
+uwd
+uQp
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(16,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+csa
+hcZ
+csa
+hcZ
+dAl
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rgk
+fnR
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+mzU
+fPE
+fPE
+jVL
+fPE
+fPE
+mzU
+aOv
+aOv
+riY
+aOv
+aOv
+twU
+kjk
+qAp
+sXT
+sXT
+sXT
+sXT
+wUe
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(17,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xrN
+hcZ
+xrN
+hcZ
+xrN
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+rgk
+hze
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+mzU
+fPE
+fPE
+fPE
+fPE
+fPE
+mzU
+aOv
+qMo
+vrp
+vrp
+aOv
+twU
+soO
+iuu
+tlP
+sXT
+baM
+sXT
+wUe
+iuu
+iuu
+iuu
+iuu
+iuu
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(18,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+trT
+fnR
+fnR
+fnR
+ceb
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+frw
+crQ
+crQ
+iqJ
+gyj
+oOd
+oOd
+kTY
+hnz
+pvk
+pXQ
+vmt
+hSt
+icc
+ims
+vmt
+dST
+iZh
+jsE
+tBb
+jHO
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+mzU
+fPE
+fPE
+fPE
+pLg
+fPE
+mzU
+aOv
+gQm
+vrp
+oWf
+aOv
+lQg
+kjk
+uZs
+sXT
+sXT
+baM
+sXT
+uxP
+iuu
+vjE
+ojr
+vRj
+wmn
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(19,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hrw
+cHl
+daB
+ujy
+ujy
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+rXl
+iqJ
+fVc
+crQ
+iqJ
+oOd
+oOd
+kBo
+tAi
+mSE
+vTw
+vmt
+xDU
+vmt
+vmt
+xDU
+iJi
+vmt
+qVL
+hhE
+tBb
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+mzU
+mzU
+mzU
+fPE
+mzU
+mzU
+mzU
+aOv
+oZQ
+rjr
+vrp
+tqs
+twU
+kjk
+uZs
+tlQ
+sXT
+baM
+sXT
+sXT
+uSJ
+ojr
+ojr
+ojr
+ojr
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(20,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+pJU
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+iqJ
+iqJ
+iqJ
+crQ
+iqJ
+iqJ
+gVZ
+kBo
+tAi
+mSE
+vTw
+dST
+dST
+dST
+inz
+vmt
+vmt
+jbs
+dST
+tBb
+jIJ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+mzU
+fPE
+mzU
+aOv
+aOv
+aOv
+rlN
+vrp
+vrp
+tqs
+twU
+kjk
+uZs
+prt
+sXT
+sXT
+sXT
+uzu
+iuu
+vjS
+vBZ
+ojr
+wmB
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(21,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+trT
+bBH
+bBH
+bBH
+bBH
+ceb
+hcZ
+cHD
+glW
+dvS
+dCb
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+iqJ
+fJS
+iqJ
+iqJ
+crQ
+iqJ
+oOd
+kBo
+tAi
+mSE
+pXQ
+hLq
+dST
+xDU
+vmt
+dST
+dST
+lUF
+vmt
+jyY
+tBb
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+wHb
+kpe
+wHb
+jzn
+aOv
+qsU
+vrp
+vrp
+oWf
+aOv
+twU
+kjk
+iuu
+fAe
+tDX
+tVa
+ugx
+pbO
+iuu
+bua
+gtp
+gtp
+cnr
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(22,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xQR
+fnR
+ppm
+ppm
+ppm
+ppm
+fnR
+hcZ
+erx
+fnR
+rgk
+ioW
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+iqJ
+iqJ
+crQ
+gkS
+crQ
+crQ
+iqJ
+kBo
+tAi
+mSE
+cDe
+xDU
+vmt
+idc
+inN
+vmt
+vmt
+vmt
+xDU
+dST
+qVL
+jzn
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+lQW
+wHb
+wHb
+aOv
+qQL
+qNC
+rjK
+rvG
+rJt
+pzN
+spe
+ayj
+ayj
+ayj
+ayj
+ayj
+ayj
+ayj
+ayj
+ayj
+ayj
+iuu
+iuu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(23,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xQR
+fnR
+hcZ
+hcZ
+hcZ
+hcZ
+fnR
+hcZ
+lhQ
+tNn
+xqf
+nSZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+frV
+iqJ
+iqJ
+iqJ
+iqJ
+iqJ
+iqJ
+kBo
+tAi
+mSE
+cDe
+vmt
+xDU
+xDU
+vmt
+vmt
+xDU
+vmt
+dST
+lUF
+vmt
+jzn
+wHb
+pMz
+gyS
+gyS
+kvg
+gyS
+gyS
+gyS
+kvg
+gyS
+gyS
+gyS
+gyS
+gyS
+kvg
+gyS
+gyS
+gyS
+gyS
+gyS
+kvg
+gyS
+gyS
+gyS
+kvg
+gyS
+gyS
+pMz
+wHb
+aOv
+gmR
+gGG
+uMq
+bUq
+aOv
+twU
+uJU
+ayj
+tnf
+tGO
+tVt
+ugM
+uAe
+uUr
+vkZ
+tIX
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(24,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+blm
+tNn
+bCT
+bCT
+bCT
+bCT
+tNn
+csM
+jbG
+tNn
+xqf
+bwJ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+iqJ
+iqJ
+fLJ
+iqJ
+crQ
+gzA
+iqJ
+iqJ
+kTY
+hom
+mSE
+cDe
+vmt
+dST
+dST
+dST
+ixw
+idc
+xDU
+vmt
+vmt
+vmt
+jzn
+wHb
+pMz
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+fse
+fse
+iSV
+iSV
+fse
+fse
+fse
+fse
+iSV
+iSV
+fse
+fse
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+pMz
+wHb
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+twU
+xWb
+ayj
+qxW
+cBx
+cBx
+cBx
+cBx
+cBx
+cBx
+cBx
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(25,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xQR
+fnR
+ppm
+ppm
+bNV
+ppm
+ceb
+hcZ
+gBc
+fnR
+rgk
+ubE
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kTY
+eZG
+kTY
+kTY
+kBo
+kBo
+knI
+gJT
+gJT
+kTY
+tAi
+mSE
+cDe
+fAP
+vmt
+vmt
+vmt
+xDU
+iJw
+hSt
+xDU
+vmt
+jJk
+jzn
+wHb
+pMz
+kgZ
+kgZ
+kgZ
+kgZ
+kgZ
+fse
+fse
+lgq
+hpN
+hpN
+hpN
+mlo
+mlo
+hpN
+hpN
+hpN
+lgq
+fse
+fse
+kgZ
+kgZ
+kgZ
+kgZ
+kgZ
+kgZ
+pMz
+wHb
+aOv
+qtt
+qPj
+rlC
+rwD
+aOv
+twU
+xWb
+sIR
+cBx
+cBx
+tVM
+uhG
+uBE
+uUQ
+cBx
+cBx
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(26,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xQR
+fnR
+hcZ
+hcZ
+hcZ
+hcZ
+fnR
+hcZ
+fuo
+fnR
+rgk
+pwj
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+hcZ
+kTY
+fVL
+glb
+gHp
+bcD
+bcD
+kTY
+tAi
+mSE
+cDe
+vmt
+xDU
+vmt
+vmt
+vmt
+inN
+vmt
+jsN
+vmt
+xDU
+jzn
+wHb
+pMz
+gyS
+gyS
+gyS
+gyS
+gyS
+iSV
+cSN
+hpN
+hpN
+hpN
+hpN
+cSN
+cSN
+hpN
+hpN
+hpN
+hpN
+cSN
+iSV
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+pMz
+wHb
+aOv
+pkp
+pkp
+pkp
+elH
+aOv
+twU
+xWb
+ayj
+cBx
+rbY
+fIW
+rbY
+rbY
+tIX
+rbY
+cBx
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(27,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+xQR
+fnR
+bBH
+bBH
+bBH
+bBH
+fnR
+hcZ
+fuo
+fnR
+dwV
+sTb
+dNj
+dXn
+emH
+exZ
+btj
+hcZ
+eew
+hcZ
+kTY
+bcD
+bcD
+bcD
+bcD
+bcD
+hez
+tAi
+mSE
+cDe
+dST
+dST
+lUF
+xDU
+vmt
+vmt
+xDU
+vmt
+vmt
+vmt
+jzn
+wHb
+pMz
+gyS
+gyS
+gyS
+gyS
+gyS
+iSV
+cSN
+cSN
+cSN
+cSN
+cSN
+mlM
+cSN
+cSN
+cSN
+cSN
+cSN
+cSN
+iSV
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+pMz
+wHb
+aOv
+xRG
+vrp
+vrp
+oWf
+aOv
+twU
+uJU
+ayj
+ayj
+uRI
+oyG
+uRI
+uRI
+uRI
+uRI
+ayj
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(28,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+trT
+ppm
+ppm
+ppm
+ppm
+ceb
+hcZ
+cJa
+daP
+dmQ
+dlw
+hcZ
+hcZ
+yeS
+kNT
+dXn
+eOU
+eew
+hcZ
+kTY
+fVM
+gmg
+gzV
+gKb
+gmg
+kTY
+hom
+mSE
+cDe
+xDU
+vmt
+vmt
+inW
+vmt
+vmt
+vmt
+vmt
+xDU
+vmt
+jzn
+wHb
+pMz
+gyS
+gyS
+gyS
+gyS
+gyS
+iSV
+cSN
+hpN
+hpN
+hpN
+hpN
+cSN
+cSN
+hpN
+hpN
+hpN
+hpN
+cSN
+iSV
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+pMz
+wHb
+aOv
+nVk
+qQl
+rmF
+vrp
+tqs
+twU
+xWb
+ayj
+tnZ
+jPH
+dSW
+jPH
+jPH
+jPH
+vlS
+ovf
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(29,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fbb
+lzj
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+emh
+fcf
+hcZ
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+kTY
+tAi
+mSE
+cDe
+fAP
+vmt
+vmt
+vmt
+dST
+dST
+dST
+jvQ
+vmt
+jKM
+jzn
+wHb
+pMz
+kgZ
+kgZ
+kgZ
+kgZ
+kgZ
+fse
+fse
+hpN
+hpN
+hpN
+maY
+cSN
+cSN
+maY
+hpN
+hpN
+hpN
+fse
+fse
+kgZ
+kgZ
+kgZ
+kgZ
+kgZ
+kgZ
+pMz
+wHb
+aOv
+wfv
+xkn
+wtl
+vrp
+tqs
+rVn
+ssb
+sMa
+kEJ
+rDk
+kHs
+uhG
+uBE
+cBx
+cBx
+cBx
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(30,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bOo
+hqg
+ceN
+ctF
+hcZ
+fbb
+lzj
+hcZ
+dOH
+dZf
+hqg
+bOo
+hcZ
+kNT
+mcS
+emH
+dXn
+dXn
+dXn
+emH
+dXn
+dXn
+dNj
+hqi
+mSE
+cDe
+vmt
+xDU
+vmt
+xDU
+dST
+dST
+xDU
+vmt
+xDU
+vmt
+jzn
+wHb
+pMz
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+fse
+fse
+iSV
+iSV
+fse
+cSN
+cSN
+fse
+iSV
+iSV
+fse
+fse
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+gyS
+pMz
+wHb
+aOv
+bcI
+otx
+mMd
+vrp
+tqs
+twU
+xWb
+ayj
+cBx
+cBx
+cBx
+cBx
+cBx
+cBx
+cBx
+vCg
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(31,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hqg
+hqg
+hqg
+hqg
+cJT
+fbb
+lzj
+dCf
+hqg
+hqg
+hqg
+hqg
+hcZ
+eew
+wum
+wum
+wum
+wum
+wum
+wum
+wum
+wum
+wum
+tAi
+hzN
+hHB
+hMK
+vmt
+idD
+vmt
+xDU
+vmt
+idD
+vmt
+vmt
+dST
+jzn
+wHb
+wHb
+wHb
+wHb
+kvy
+gyS
+gyS
+gyS
+gyS
+gyS
+gtV
+lLo
+lLo
+mmm
+mmm
+lLo
+lLo
+lLo
+gAm
+gyS
+gyS
+gyS
+gyS
+gyS
+kvy
+wHb
+wHb
+wHb
+wHb
+aOv
+vrp
+wbX
+lpm
+vrp
+tqs
+twU
+xWb
+ayj
+toC
+tGQ
+tWF
+cBx
+cBx
+rbY
+tIX
+ovf
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(32,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bOz
+bVp
+hqg
+ctH
+hcZ
+fbb
+dwY
+hcZ
+ctH
+hqg
+eoP
+bOz
+hcZ
+nwx
+wum
+fsj
+qbj
+fVS
+gmu
+gAV
+qbj
+fsj
+wum
+tAi
+sUa
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+pXQ
+jLd
+jzn
+jzn
+jzn
+jzn
+wHb
+wHb
+gyS
+gyS
+gyS
+kvy
+gyS
+gtV
+fHQ
+wVY
+wVY
+wVY
+wVY
+wVY
+fHQ
+gAm
+gyS
+kvy
+gyS
+gyS
+gyS
+wHb
+wHb
+jzn
+jzn
+jzn
+aOv
+qtY
+vrp
+pdt
+vrp
+tqs
+twU
+uJU
+ayj
+vAV
+uhl
+efC
+cBx
+cBx
+tIX
+rbY
+cBx
+ayj
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(33,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fbb
+lzj
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+yeS
+wum
+jMI
+qbj
+bSz
+llb
+qvt
+qbj
+qbj
+eeb
+tAi
+mSE
+hHI
+eew
+eew
+bmu
+eew
+eew
+eew
+yeS
+bmu
+eew
+eew
+aOv
+aOv
+aOv
+aOv
+jzn
+wHb
+wHb
+gyS
+gyS
+gyS
+gyS
+gtV
+dYC
+wVY
+wVY
+wVY
+wVY
+wVY
+dYC
+gAm
+gyS
+gyS
+gyS
+gyS
+wHb
+wHb
+jzn
+aww
+pLq
+pSF
+aww
+esq
+vrp
+pdt
+rwN
+aOv
+twU
+xWb
+ayj
+nAU
+wRU
+dLs
+ujd
+ujd
+uVI
+ujd
+cBx
+ayj
+fPE
+fPE
+ujr
+fPE
+fPE
+xMp
+ujr
+fPE
+fPE
+fPE
+fPE
+ujr
+pLg
+iIY
+iIY
+tEq
+tEq
+ewo
+tEq
+tEq
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(34,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bOo
+hqg
+ceR
+cvb
+hcZ
+fbb
+lzj
+hcZ
+dOY
+dZr
+hqg
+bOo
+hcZ
+eew
+wum
+qbj
+qbj
+qbj
+qbj
+qbj
+qbj
+qbj
+eeb
+tAi
+mSE
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+fPE
+jVL
+fPE
+fPE
+jzn
+jzn
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+jzn
+mbR
+mnQ
+mxV
+mJl
+mVc
+jzn
+wHb
+wHb
+wHb
+wHb
+wHb
+wHb
+jzn
+jzn
+mLc
+kfZ
+qki
+aww
+aOv
+aOv
+rnj
+aOv
+aOv
+twU
+xWb
+ayj
+ayj
+uRI
+uRI
+uRI
+uRI
+uRI
+uRI
+ayj
+ayj
+fRB
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+iIY
+iIY
+tEq
+iIY
+iIY
+iIY
+tEq
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(35,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hqg
+hqg
+hqg
+hqg
+cJV
+fbb
+lzj
+dCX
+hqg
+hqg
+hqg
+hqg
+hcZ
+eew
+wum
+sVM
+sVM
+sVM
+qbj
+sVM
+sVM
+sVM
+eeb
+tAi
+mSE
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+aOv
+aOv
+aOv
+fPE
+kpe
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+wVY
+ygi
+sUT
+gdk
+klV
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+jzn
+pCw
+aww
+aww
+aww
+rEb
+qSb
+bZr
+jUm
+jUm
+qvf
+pEF
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+wMB
+soz
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+fPE
+iIY
+iIY
+dUv
+iIY
+iIY
+iIY
+dUv
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(36,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bOz
+bXd
+hqg
+ctH
+hcZ
+fbb
+dwY
+hcZ
+ctH
+hqg
+epA
+bOz
+hcZ
+nwx
+wum
+sVM
+sVM
+sVM
+qbj
+sVM
+sVM
+sVM
+eeb
+tAi
+mSE
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+bmu
+eew
+hcZ
+hcZ
+jzn
+jzn
+jzn
+jzn
+wVY
+jzn
+lil
+jzn
+klV
+jzn
+jzn
+jzn
+jzn
+aww
+aww
+oTq
+ltK
+jcT
+jcT
+kEE
+pSP
+aww
+twU
+pdt
+rkC
+vbz
+vbz
+vbz
+vbz
+rkC
+tpg
+vrp
+tXR
+vbz
+vbz
+rkC
+vbz
+vbz
+vbz
+vbz
+kBS
+kjk
+aOv
+xul
+xMt
+yeR
+ceo
+yeR
+xMt
+kgN
+aOv
+fPE
+iIY
+hZW
+cQi
+opI
+iIY
+tEq
+tEq
+tEq
+tEq
+tEq
+tEq
+tEq
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(37,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fbb
+lzj
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+wum
+sVM
+sVM
+sVM
+qbj
+sVM
+sVM
+sVM
+eeb
+tAi
+mSE
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+fIH
+jZd
+fIH
+qKi
+hcZ
+hcZ
+eew
+hcZ
+hcZ
+kLO
+lgS
+aww
+aww
+mdz
+aww
+aww
+aww
+mVQ
+aww
+aww
+kLO
+lgS
+aww
+aww
+ejb
+ltK
+prX
+prX
+kEE
+bTo
+aww
+twU
+xWb
+qiF
+qiF
+qiF
+qiF
+qiF
+qiF
+cdC
+ojh
+kjk
+bbX
+bbX
+bbX
+vmZ
+bbX
+bbX
+bbX
+cuN
+kjk
+aOv
+rFo
+bDp
+bDp
+bDp
+bDp
+bDp
+wtc
+aOv
+stt
+iIY
+uCR
+xyt
+qpK
+smZ
+tEq
+tEq
+tEq
+tEq
+tEq
+xag
+sze
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(38,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bOo
+hqg
+cfI
+cvm
+hcZ
+fbb
+lzj
+hcZ
+dPQ
+eah
+hqg
+bOo
+hcZ
+eew
+wum
+sVM
+sVM
+sVM
+qbj
+sVM
+sVM
+sVM
+eeb
+tAi
+sUa
+qKi
+hNb
+fIH
+iew
+fIH
+ixX
+iJy
+jcm
+jws
+jAq
+qKi
+fIH
+vvJ
+fIH
+qKi
+hcZ
+hcZ
+eew
+hcZ
+hcZ
+vEL
+oKS
+luh
+vmf
+vmf
+vmf
+luh
+vmf
+dhj
+vmf
+luh
+uhd
+eMl
+aww
+aww
+kfk
+ltK
+mLc
+mLc
+kEE
+jAG
+aww
+twU
+xWb
+qiF
+rya
+rJR
+rWB
+stb
+qiF
+vMO
+ojh
+kjk
+bbX
+uBR
+uXt
+tiL
+tiL
+vSh
+bbX
+cuN
+kjk
+aOv
+ghT
+xNA
+bDp
+bDp
+bDp
+qBK
+tnq
+aOv
+fPE
+iIY
+mdS
+xId
+xId
+mGI
+tEq
+tEq
+iop
+tEq
+xag
+xag
+tEq
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(39,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hqg
+hqg
+hqg
+hqg
+cJZ
+fbb
+lzj
+dEq
+hqg
+hqg
+hqg
+hqg
+hcZ
+eew
+wum
+fsj
+qbj
+qbj
+qbj
+qbj
+qbj
+fsj
+wum
+tAi
+mSE
+qKi
+uIp
+pRa
+pRa
+pRa
+dkR
+fIH
+fIH
+fIH
+fIH
+jLq
+fIH
+fIH
+fIH
+qKi
+kpi
+eew
+wbk
+hcZ
+hcZ
+wQZ
+jcT
+jcT
+jcT
+jcT
+jcT
+jcT
+jcT
+kwc
+jcT
+jcT
+jcT
+odv
+aww
+aww
+ukh
+ltK
+mLc
+mLc
+kEE
+gba
+aww
+twU
+xWb
+qiF
+lsa
+lsa
+lsa
+fBu
+qiF
+nFh
+tHb
+qSC
+bbX
+sdT
+tiL
+tiL
+tiL
+tiL
+bbX
+cuN
+kjk
+aOv
+sZE
+bDp
+bDp
+bDp
+bDp
+bDp
+wtc
+aOv
+fPE
+iIY
+xgW
+ryq
+odq
+moY
+tEq
+tEq
+tEq
+tEq
+tEq
+tEq
+xag
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(40,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bOz
+bXi
+hqg
+ctH
+hcZ
+fbb
+dwY
+hcZ
+ctH
+hqg
+esm
+bOz
+hcZ
+nwx
+wum
+wum
+eeb
+eeb
+eeb
+wum
+gLc
+wum
+wum
+tAi
+mSE
+qKi
+eBS
+iqw
+iqw
+fKo
+ths
+iKG
+pqb
+fIH
+fIH
+qKi
+qKi
+qKi
+qKi
+qKi
+evB
+eew
+eew
+eew
+hHI
+vEL
+jcT
+jcT
+jcT
+jcT
+jcT
+jcT
+jcT
+kwc
+jcT
+jcT
+jcT
+eMl
+aww
+aww
+wHy
+ltK
+prX
+prX
+kEE
+sUQ
+aww
+twU
+xWb
+rpb
+lsa
+lsa
+lsa
+aqk
+qiF
+qiF
+aOv
+fRB
+bbX
+pfx
+tiL
+tiL
+vCK
+vSn
+bbX
+cuN
+oew
+aOv
+uce
+xNS
+xNS
+xNS
+xNS
+xNS
+mpg
+aOv
+fPE
+iIY
+wEe
+xId
+cRi
+iIY
+nud
+thx
+tEq
+tEq
+tEq
+ruf
+tEq
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(41,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fbb
+lzj
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+wum
+fug
+fLK
+fWl
+fWl
+byq
+byq
+byq
+wum
+tAi
+mSE
+qKi
+ppo
+iqw
+iqw
+fKo
+ths
+fOO
+pqb
+fIH
+jAJ
+qKi
+fIH
+jZd
+fIH
+qKi
+kzS
+kaO
+eew
+hcZ
+hcZ
+vEL
+jcT
+jcT
+jcT
+jcT
+jcT
+mye
+uDj
+kwc
+jcT
+jcT
+jcT
+eMl
+aww
+aww
+upk
+pdn
+uDj
+jcT
+kEE
+uHK
+aww
+twU
+uJU
+qiF
+ryO
+rKP
+lsa
+lsa
+qiF
+tpr
+fPE
+fPE
+bbX
+kBV
+tiL
+tiL
+waV
+gDT
+bbX
+cuN
+kjk
+aOv
+aOv
+tqs
+tqs
+tqs
+aOv
+oXm
+aOv
+aOv
+fRB
+iIY
+iIY
+qia
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+iIY
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(42,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fbb
+fbb
+fbb
+lzj
+fbb
+fbb
+fbb
+fbb
+fbb
+hcZ
+eew
+wum
+byq
+byq
+svQ
+byq
+gEf
+gOc
+gOc
+wum
+hom
+mSE
+qKi
+pZe
+hTi
+ifI
+iod
+iAU
+fIH
+fIH
+fIH
+fIH
+jLq
+fIH
+jZX
+fIH
+qKi
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+vEL
+jcT
+ipG
+lMF
+mdO
+pFR
+pFR
+ljM
+ljM
+nnr
+nAS
+gdx
+oez
+aww
+aww
+aww
+aww
+kwc
+jcT
+aww
+aww
+aww
+twU
+xWb
+qiF
+fGx
+ogF
+rWG
+stZ
+sNG
+rWH
+tHw
+tYH
+bbX
+hbE
+uYc
+vok
+mRw
+bbX
+bbX
+cuN
+wWk
+qJU
+qJU
+qJU
+qJU
+qJU
+qJU
+qJU
+puD
+qJU
+qJU
+qJU
+puD
+qJU
+qJU
+qJU
+qJU
+puD
+qSb
+jUm
+jUm
+pXY
+osz
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(43,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+cxn
+cKL
+dbk
+xqf
+fnR
+fnR
+eaR
+esr
+eyA
+hcZ
+eew
+wum
+fvS
+fMx
+byq
+byq
+oGU
+lsF
+gYD
+wum
+tAi
+mSE
+qKi
+xBi
+fIH
+pJK
+fIH
+fIH
+fIH
+fIH
+fIH
+jBu
+qKi
+fIH
+fIH
+fIH
+qKi
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+vEL
+jcT
+eMl
+aww
+nAy
+iMT
+myT
+iMT
+iMT
+aww
+vEL
+jcT
+jbN
+orz
+orz
+orz
+orz
+psv
+jcT
+aww
+pTl
+pNr
+twU
+xWb
+qiF
+frx
+frx
+qiF
+wpY
+qiF
+qiF
+aOv
+svw
+bbX
+tiL
+tiL
+tiL
+tiL
+tiL
+bbX
+wMW
+uSb
+osl
+xuu
+osl
+osl
+osl
+osl
+osl
+osl
+osl
+osl
+osl
+osl
+osl
+nPn
+osl
+osl
+osl
+ilo
+osl
+osl
+iVl
+xWb
+aOv
+aMv
+vhU
+uUR
+frO
+frO
+gYM
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(44,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+chH
+fbb
+flb
+umj
+rgk
+fnR
+fnR
+umj
+nuH
+fbb
+hcZ
+ePT
+wum
+wum
+wum
+wum
+gmH
+wum
+wum
+wum
+wum
+tAi
+mSE
+qKi
+qKi
+hTP
+qKi
+ipg
+ipg
+ipg
+ipg
+ipg
+qKi
+qKi
+qKi
+qKi
+qKi
+qKi
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+kOt
+gdx
+luR
+lOs
+axo
+eZB
+jcT
+eZB
+jcT
+nod
+vEL
+jcT
+ipG
+kdu
+kdu
+lvB
+kdu
+atr
+jcT
+pNr
+oSA
+aww
+twU
+xWb
+qiF
+vhe
+jIr
+rXr
+jIr
+sOT
+tpI
+aOv
+mZN
+bbX
+uCW
+uYm
+uYm
+uYm
+vSw
+mRw
+cuN
+kjk
+woC
+woC
+xaD
+xaD
+xaD
+xaD
+xaD
+xaD
+woC
+xDe
+woC
+woC
+aOv
+txQ
+uLu
+uLu
+uLu
+wLb
+uLu
+uLu
+twU
+xWb
+tqs
+fzd
+inU
+dVq
+jrR
+fwk
+hbP
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(45,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+lbB
+fbb
+fnR
+fnR
+dxJ
+tNn
+tNn
+tNn
+tNn
+eyQ
+eDG
+aME
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+hqL
+hAl
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+jRK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+xJK
+hWk
+jcT
+eMl
+aww
+xcb
+jcT
+jcT
+jcT
+mYN
+aww
+vEL
+jcT
+eMl
+aww
+aww
+aww
+aww
+tCL
+jcT
+aww
+aww
+aww
+twU
+xWb
+frx
+yid
+jIr
+jIr
+jIr
+qcp
+uUk
+aOv
+mZN
+bbX
+ikK
+nun
+nun
+nun
+ezP
+mRw
+cuN
+oew
+woC
+xuW
+wdI
+wdI
+wdI
+wdI
+wdI
+wdI
+svp
+wdI
+fTs
+woC
+aOv
+slW
+uLu
+uMg
+dmN
+dHN
+teZ
+uLu
+twU
+sup
+gkx
+qfF
+fKl
+ipH
+jlP
+bnH
+mCf
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(46,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+txE
+fbb
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+fbb
+fnR
+qYB
+dLa
+dLa
+dLa
+fWF
+dLa
+dLa
+dLa
+dLa
+fWF
+rcz
+dLa
+dLa
+dLa
+dLa
+fWF
+dLa
+dLa
+dLa
+fnR
+dLa
+dLa
+fWF
+fVZ
+dLa
+dLa
+dLa
+dLa
+fWF
+dLa
+dLa
+dLa
+chP
+jcT
+eMl
+aww
+bMN
+qCq
+qCq
+qCq
+qCq
+aww
+vEL
+jcT
+eMl
+aww
+aww
+oUz
+oUz
+kwc
+jcT
+pNt
+pUk
+aww
+lQg
+xWb
+ioF
+qcp
+qcp
+jIr
+jIr
+sQv
+qgS
+aOv
+mZN
+bbX
+ikK
+nun
+vpJ
+nun
+ezP
+mRw
+cuN
+kjk
+woC
+mgQ
+dIZ
+dIZ
+dIZ
+dvj
+dIZ
+dIZ
+kpd
+kpd
+rQF
+woC
+aOv
+jSy
+uLu
+ulm
+hRO
+dHN
+dHN
+eqY
+twU
+oew
+tqs
+kaX
+eAd
+uGz
+naL
+jPl
+uUR
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(47,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+leA
+fbb
+cMH
+umj
+fnR
+fnR
+fnR
+umj
+ete
+fbb
+hcZ
+hcZ
+hcZ
+xrN
+hcZ
+hcZ
+hcZ
+hcZ
+tvf
+tvf
+hcZ
+fnR
+hCa
+hcZ
+tvf
+hcZ
+hOu
+hOu
+iCc
+hOu
+jfC
+jfC
+hOu
+hOu
+pIE
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+wQZ
+jcT
+oKS
+lOu
+gsA
+vmf
+vmf
+vmf
+vmf
+lOu
+uhd
+jcT
+odv
+aww
+aww
+rcN
+pem
+psT
+gdx
+gdx
+uDj
+qCq
+twU
+xWb
+ioF
+qcp
+rLZ
+saC
+jIr
+jIr
+jIr
+aOv
+mZN
+bbX
+ikK
+nun
+nun
+nun
+ezP
+mRw
+cuN
+kjk
+woC
+gJu
+dIZ
+dIZ
+kGK
+wlM
+qep
+dIZ
+kpd
+kpd
+hrI
+woC
+aOv
+slW
+uLu
+lwV
+hRO
+dHN
+dHN
+eqY
+twU
+kjk
+aOv
+uUR
+eAd
+uGz
+uGz
+nyG
+uUR
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(48,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+cxn
+hJO
+waw
+fnR
+fnR
+fnR
+eaY
+eMY
+eyA
+hcZ
+eRX
+fcq
+vio
+fNe
+hcZ
+gnn
+bJy
+gOZ
+gOZ
+hgV
+bJy
+bJy
+gOZ
+gOZ
+hUI
+hOu
+irw
+jOf
+iLu
+qpO
+xTT
+jDH
+hOu
+gnL
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+eew
+hHI
+vEL
+jcT
+jcT
+jcT
+kwc
+jcT
+jcT
+jcT
+jcT
+jcT
+jcT
+jcT
+eMl
+aww
+aww
+hgH
+hgH
+jcT
+jcT
+jcT
+kwc
+qCq
+twU
+xWb
+qiF
+rzg
+gmU
+jrI
+jrI
+sQy
+tqN
+tHA
+tZu
+bbX
+uFh
+uYJ
+uYJ
+uYJ
+vTt
+mRw
+cuN
+kjk
+woC
+ufK
+dIZ
+dIZ
+exj
+bwP
+sbT
+dIZ
+kpd
+vAp
+vIJ
+woC
+aOv
+slW
+uLu
+pMQ
+hRO
+dHN
+dHN
+eqY
+twU
+kjk
+sdw
+uUR
+eAd
+uGz
+uGz
+nyG
+nIR
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(49,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+fbb
+fbb
+fbb
+fbb
+fbb
+fbb
+fbb
+fbb
+fbb
+hcZ
+utZ
+vio
+vio
+vio
+xxi
+dvk
+jZu
+aca
+buD
+wJW
+fnR
+jZu
+iHH
+hNU
+mEP
+hOu
+lSA
+jOf
+eDD
+bQf
+jxW
+xTT
+hOu
+gnL
+kaO
+eew
+eew
+eew
+eew
+kaO
+btj
+hcZ
+kPt
+kdu
+lvB
+lPE
+mdU
+kdu
+lvB
+kdu
+kdu
+kdu
+kdu
+kdu
+oeT
+aww
+aww
+tjA
+peR
+ptY
+pCN
+pNv
+kwc
+aww
+twU
+xWb
+qiF
+heL
+jIr
+jIr
+bay
+ccG
+jIr
+aOv
+fPE
+bbX
+tiL
+tiL
+tiL
+tiL
+tiL
+bbX
+cuN
+kjk
+woC
+aSb
+xNT
+yeY
+pag
+dIZ
+dIZ
+dIZ
+kpd
+kpd
+udQ
+woC
+aOv
+slW
+uLu
+sVJ
+hRO
+dHN
+dHN
+eqY
+twU
+kjk
+aOv
+uUR
+eAd
+uGz
+uGz
+nyG
+iEk
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(50,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+dcx
+xxi
+xxi
+xxi
+vio
+hcZ
+hcZ
+hcZ
+klI
+vio
+vio
+vio
+xxi
+dvk
+jZu
+aca
+tCX
+wJW
+fnR
+jZu
+iHH
+tCX
+mEP
+hOu
+mQI
+jOf
+eDD
+miz
+xTT
+xTT
+hOu
+gnL
+hcZ
+equ
+equ
+equ
+equ
+equ
+equ
+equ
+equ
+lXb
+equ
+twU
+xWb
+qmv
+qmv
+mKv
+qmv
+nqb
+nqb
+nqb
+qmv
+qmv
+qmv
+qmv
+aww
+aww
+aww
+aww
+kwc
+aww
+twU
+xWb
+qiF
+qiF
+jIr
+sbR
+qiF
+qiF
+qiF
+aOv
+fPE
+bbX
+bbX
+bbX
+bbX
+bbX
+bbX
+bbX
+cuN
+kjk
+woC
+klU
+duH
+fhP
+gen
+gen
+gen
+gen
+fhP
+gen
+mfa
+woC
+aOv
+jSy
+uLu
+eku
+hRO
+mtg
+igk
+uLu
+twU
+oew
+tqs
+sKR
+uWT
+iBl
+iBl
+duq
+xOB
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(51,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+pfD
+vio
+vio
+vio
+ecQ
+hcZ
+hcZ
+hcZ
+qGV
+vio
+vio
+vio
+fXP
+dvk
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+siH
+hOu
+wDL
+jOf
+eDD
+xTT
+xTT
+xTT
+hOu
+gnL
+hcZ
+equ
+khn
+krr
+pbL
+equ
+kAx
+kEd
+kQh
+ojH
+equ
+twU
+xWb
+qmv
+mzf
+klF
+mYV
+lCS
+nAW
+nMg
+ohR
+osS
+oId
+qdC
+aww
+puv
+nod
+jcT
+kwc
+aww
+aMu
+uJU
+qiF
+rzP
+lsa
+lsa
+suv
+qiF
+trZ
+fPE
+fPE
+pLg
+fPE
+tII
+aOv
+aOv
+aOv
+aOv
+cuN
+oew
+woC
+woC
+woC
+woC
+woC
+woC
+woC
+woC
+woC
+woC
+woC
+woC
+aOv
+gQH
+uLu
+uLu
+uLu
+uLu
+uLu
+uLu
+twU
+kjk
+aOv
+fIS
+uUR
+uUR
+uUR
+oeH
+brA
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(52,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gvW
+vio
+vio
+vio
+vio
+hcZ
+hcZ
+hcZ
+mkB
+vio
+vio
+vio
+xxi
+dvk
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+fnR
+siH
+hOu
+baa
+iCi
+iNs
+xTT
+xTT
+jFd
+hOu
+gnL
+hcZ
+kfj
+soP
+soP
+pbL
+equ
+lZK
+fLR
+fLR
+fLR
+wqX
+twU
+xWb
+qmv
+uDl
+fvf
+fvf
+jmP
+qeN
+una
+fvf
+alz
+veD
+qdC
+aww
+aww
+aww
+jcT
+xgR
+aww
+twU
+xWb
+qiF
+gJa
+lsa
+sdL
+xAG
+qiF
+dKV
+fPE
+fPE
+fPE
+uGj
+jYX
+jYX
+vDA
+jYX
+phT
+wOa
+kjk
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+njs
+fGa
+fPE
+jVL
+fPE
+fPE
+wty
+twU
+kjk
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(53,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+dxX
+dEA
+dQf
+hcZ
+hcZ
+hcZ
+hcZ
+hrF
+vio
+vio
+vio
+xxi
+dvk
+jZu
+gPW
+buD
+wJW
+fnR
+jZu
+iHH
+buD
+mEP
+hOu
+hOu
+hOu
+hOu
+hOu
+hOu
+hOu
+hOu
+gnL
+hcZ
+equ
+soP
+ktG
+kwz
+equ
+wCE
+kGt
+kQT
+fLR
+wqX
+twU
+xWb
+qmv
+nWh
+fvf
+fvf
+iUA
+vpr
+icP
+fvf
+orZ
+veD
+qdC
+aww
+puv
+nod
+jcT
+xgR
+aww
+twU
+xWb
+mim
+mim
+mim
+mim
+mim
+mim
+mim
+fPE
+fPE
+ujr
+eSb
+hgB
+aOv
+aOv
+aOv
+aOv
+cuN
+kjk
+wty
+fPE
+fPE
+fPE
+jVL
+fPE
+fPE
+fPE
+tIz
+fPE
+jVL
+fPE
+fPE
+oPl
+slW
+tII
+lJe
+aOv
+aOv
+aOv
+jLi
+nIl
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(54,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+iRw
+vio
+vio
+ecQ
+hcZ
+dvk
+jZu
+iHH
+tCX
+wJW
+fnR
+jZu
+hHS
+tCX
+mEP
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+kfs
+soP
+soP
+pbL
+kyf
+xRx
+tVK
+fiY
+fLR
+wqX
+twU
+xWb
+qmv
+uAx
+fvf
+fvf
+fvf
+fvf
+fvf
+fvf
+cbQ
+veD
+dGd
+aww
+aww
+aww
+pOp
+pVX
+aww
+twU
+xWb
+mim
+rzV
+msm
+sgr
+sww
+sRk
+mim
+fPE
+fPE
+tfK
+tfK
+tfK
+tfK
+tfK
+tfK
+tfK
+cuN
+kjk
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+jSy
+aOv
+nLu
+nLu
+nLu
+nLu
+gSZ
+ciB
+nLu
+nLu
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(55,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+htQ
+fcs
+fxx
+vio
+fYA
+gnz
+gEi
+vfQ
+vfQ
+hhQ
+hhQ
+hhQ
+vfQ
+hNY
+hWM
+hcZ
+hcZ
+isf
+dXn
+emH
+dXn
+dXn
+dXn
+jSB
+hcZ
+equ
+kjq
+ktI
+pbL
+equ
+jSd
+fLR
+fLR
+lje
+equ
+lQg
+xWb
+qmv
+iTw
+mKC
+mZr
+nql
+nAY
+nMW
+oip
+cbQ
+dGd
+dGd
+aww
+pyE
+nod
+iJk
+cHb
+aww
+twU
+xWb
+mim
+hYC
+msm
+msm
+abp
+msm
+mim
+fPE
+fPE
+tfK
+uGy
+uZl
+vqd
+vEb
+vUW
+tfK
+cuN
+kjk
+oSb
+oSb
+oSb
+oSb
+oAY
+oAY
+oAY
+oAY
+oAY
+oAY
+oAY
+oAY
+oAY
+aOv
+slW
+aOv
+nLu
+nLu
+fAc
+gtF
+gSZ
+gSZ
+oex
+kPP
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(56,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+iuq
+iuq
+iuq
+hcZ
+hcZ
+hcZ
+hcZ
+isf
+sFz
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+equ
+equ
+equ
+equ
+equ
+equ
+kIf
+equ
+equ
+equ
+twU
+xWb
+qmv
+qmv
+qmv
+qmv
+qmv
+qmv
+qmv
+qmv
+qmv
+qmv
+qmv
+aww
+aww
+aww
+aww
+aww
+aww
+twU
+uJU
+mim
+nJc
+rMx
+rMx
+sUI
+sRJ
+mim
+fPE
+fPE
+tfK
+uvV
+nkn
+rUI
+pZS
+pZS
+wqT
+wOa
+oew
+oSb
+xwi
+xNY
+yfJ
+sBr
+qLz
+bfF
+bfF
+bfF
+bfF
+uLO
+cUw
+oAY
+aOv
+slW
+aOv
+bFj
+rMp
+gSZ
+gSZ
+gSZ
+gSZ
+gSZ
+vNL
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(57,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+aOx
+hrT
+aOx
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+pIE
+hcZ
+equ
+equ
+equ
+equ
+equ
+kBE
+fLR
+kSD
+llf
+equ
+twU
+mfk
+jUm
+jUm
+jUm
+naO
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+jUm
+slj
+jUm
+pXY
+jUm
+qvf
+cNo
+mim
+cZu
+cZu
+cZu
+pCm
+cZu
+mim
+fPE
+stt
+tfK
+lnr
+pLT
+gkp
+pLT
+vVp
+tfK
+cuN
+kjk
+xeT
+oKk
+oKk
+rjc
+sBr
+rpZ
+rpZ
+rpZ
+rpZ
+erk
+rpZ
+rpZ
+oMH
+aOv
+slW
+aOv
+bFj
+nLu
+aNb
+hLT
+omE
+mBP
+nzb
+aNb
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(58,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+igU
+isi
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+vPE
+udW
+kkq
+udW
+equ
+equ
+lFI
+fLR
+ino
+hwl
+equ
+twU
+dBC
+vbz
+vbz
+rkC
+vbz
+vbz
+vbz
+rkC
+vbz
+vbz
+vbz
+rkC
+vbz
+pyK
+fCx
+vbz
+vbz
+vbz
+vbz
+nIl
+mim
+rBl
+rNs
+cZu
+tgG
+sSE
+mim
+fPE
+fPE
+tfK
+qvq
+pZS
+dao
+pLT
+fFU
+tyO
+cuN
+kjk
+oSb
+xyp
+oKk
+pcs
+sBr
+rpZ
+rpZ
+erk
+rpZ
+rpZ
+rpZ
+rpZ
+oAY
+aOv
+slW
+aOv
+bTV
+nLu
+nLu
+qGQ
+qGQ
+qGQ
+qGQ
+nLu
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(59,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bmu
+eew
+eew
+eew
+bmu
+yeS
+eew
+eew
+wbk
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+emh
+vPE
+udW
+udW
+udW
+equ
+equ
+obE
+glE
+glE
+glE
+equ
+twU
+xWb
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+twU
+xWb
+fPQ
+fPQ
+aPN
+aPN
+fPQ
+mim
+mim
+mim
+sgt
+mim
+mim
+mim
+fPE
+fPE
+tfK
+gkW
+kLg
+pLT
+pLT
+vjP
+tyO
+cuN
+kjk
+fKY
+oKk
+oKk
+oKk
+sBr
+rpZ
+rpZ
+rpZ
+rpZ
+rpZ
+rpZ
+snl
+hLH
+aOv
+jSy
+aOv
+bFj
+nLu
+bFj
+bFj
+bFj
+bFj
+jDE
+jDE
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(60,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+btj
+dQn
+edo
+etR
+eew
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+nwx
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+sdd
+sdd
+sdd
+sdd
+sdd
+hcZ
+jVG
+okv
+udW
+koA
+udW
+equ
+equ
+bpL
+kKm
+glE
+llG
+equ
+lQg
+xWb
+aOv
+rBd
+rBd
+rBd
+rBd
+rBd
+ugm
+ugm
+ugm
+ugm
+aOv
+rEb
+pzp
+uJU
+fPQ
+pZB
+qlc
+qlc
+qSM
+fPQ
+rBs
+rNw
+djP
+djP
+sSG
+fPQ
+fPE
+fPE
+tfK
+nUe
+pol
+vqJ
+vFk
+obC
+tfK
+cuN
+kjk
+fKY
+xAO
+oKk
+oKk
+sBr
+erk
+rpZ
+rpZ
+erk
+rpZ
+snl
+snl
+hLH
+aOv
+slW
+aOv
+bFj
+rMp
+bFj
+bFj
+bFj
+bFj
+bFj
+jDE
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(61,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+bbg
+bmu
+btj
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+jla
+okv
+eew
+eew
+hcZ
+eSO
+sdd
+fyM
+fOI
+sdd
+hcZ
+eew
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+fjI
+sdd
+sdd
+sdd
+fZn
+hcZ
+hrq
+keC
+udW
+gRu
+udW
+equ
+equ
+equ
+equ
+equ
+equ
+equ
+aMu
+xWb
+aOv
+rBd
+mLn
+sJl
+nqK
+rBd
+nOR
+blB
+oti
+ugm
+aOv
+luA
+vrp
+xWb
+pOH
+lAR
+aAi
+aAi
+nGv
+rpQ
+hXt
+aAi
+aAi
+aAi
+xKN
+fPQ
+fPE
+fPE
+dhF
+dhF
+dhF
+dhF
+dhF
+dhF
+dhF
+cuN
+kjk
+oSb
+oSb
+xOO
+oSb
+oAY
+see
+rpZ
+rpZ
+rpZ
+snl
+jTs
+snl
+hLH
+aOv
+slW
+aOv
+nLu
+nLu
+bFj
+bFj
+bFj
+bFj
+bFj
+bFj
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(62,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+jXN
+wfz
+wfz
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+jXN
+wfz
+olP
+eew
+eew
+hcZ
+fjI
+sdd
+sdd
+sdd
+fZn
+hcZ
+eew
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+btj
+gnL
+hcZ
+sdd
+sdd
+jiV
+sdd
+sdd
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rGD
+rGD
+kCk
+kKs
+kWe
+lnj
+rGD
+twU
+xWb
+aOv
+rBd
+sJl
+sJl
+gka
+rBd
+tHl
+blB
+blB
+ugm
+aOv
+kZK
+vrp
+xWb
+aAi
+lAR
+aAi
+aAi
+poE
+mlx
+fxe
+aAi
+sgA
+aAi
+fWP
+fPQ
+fPE
+fPE
+dhF
+pVH
+pVH
+vqO
+pVH
+dhF
+dhF
+cuN
+oew
+oSb
+oSb
+pOB
+pOB
+drT
+rpZ
+rpZ
+rpZ
+snl
+khA
+snl
+snl
+hLH
+aOv
+slW
+fPE
+mgp
+nLu
+bFj
+bFj
+bFj
+bFj
+jDE
+jDE
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(63,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eVD
+eew
+eew
+eew
+eew
+bmu
+eew
+eew
+eew
+bmu
+eew
+eew
+eew
+wbk
+eew
+eew
+nwx
+hcZ
+sdd
+fcz
+sdd
+sdd
+sdd
+hcZ
+eew
+eew
+eew
+eew
+bmu
+eew
+eew
+eew
+eew
+ihg
+hcZ
+sdd
+sdd
+sdd
+sdd
+sdd
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rGD
+rGD
+ola
+qqv
+rvw
+rvw
+lwQ
+twU
+xWb
+aOv
+rBd
+mMN
+sJl
+sJl
+rBd
+blB
+blB
+otO
+ugm
+aOv
+aOv
+twU
+xWb
+fPQ
+pZR
+qlC
+qlC
+pXy
+fPQ
+iHJ
+aAi
+hul
+aAi
+cLb
+fPQ
+tIz
+stt
+dhF
+pVH
+pVH
+pVH
+pVH
+dhF
+wrO
+cuN
+kjk
+oSb
+oSb
+oSb
+oSb
+oAY
+oAY
+oAY
+oAY
+hLH
+hLH
+hLH
+hLH
+hLH
+aOv
+slW
+fPE
+mgp
+nLu
+jDE
+bFj
+pNw
+bFj
+bFj
+jDE
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(64,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+wbk
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+eew
+hcZ
+fjI
+sdd
+fzm
+sdd
+gaJ
+hcZ
+eew
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gnL
+hcZ
+fjI
+sdd
+sdd
+sdd
+fZn
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rGD
+rGD
+jWJ
+pKm
+rvw
+lot
+rGD
+twU
+xWb
+aOv
+rBd
+slz
+ndu
+sJl
+rBd
+blB
+oiG
+ucM
+ugm
+aOv
+aOv
+twU
+xWb
+fPQ
+fPQ
+fPQ
+fPQ
+fPQ
+fPQ
+jPE
+aAi
+gDA
+aAi
+cLb
+fPQ
+fPE
+fPE
+dhF
+pVH
+pVH
+pVH
+pVH
+dhF
+svl
+cuN
+kjk
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+slW
+fPE
+ltM
+nLu
+bFj
+bFj
+bFj
+bFj
+bFj
+bFj
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(65,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+azr
+gsY
+aIF
+aXB
+bbE
+hcZ
+eew
+hcZ
+bHz
+pth
+pth
+pth
+czm
+hcZ
+ddd
+dyp
+dFD
+dQq
+edZ
+hcZ
+eew
+hcZ
+sdd
+sdd
+sdd
+sdd
+sdd
+hcZ
+gFs
+hcZ
+gsY
+hhZ
+gsY
+gsY
+hhZ
+hON
+hcZ
+gnL
+hcZ
+sdd
+sdd
+sdd
+sdd
+sdd
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rGD
+rGD
+eNP
+tIw
+kXk
+hsn
+rGD
+lQg
+xWb
+aOv
+rBd
+sJl
+sJl
+sJl
+rBd
+blB
+blB
+blB
+ugm
+aOv
+aOv
+twU
+uJU
+fPQ
+qax
+qlX
+qwx
+qVa
+fPQ
+nDD
+aAi
+cfF
+aAi
+cLb
+fPQ
+pLg
+fPE
+dhF
+pVH
+pVH
+pVH
+vFG
+dhF
+xIZ
+cuN
+kjk
+wty
+fPE
+jVL
+fPE
+fPE
+fPE
+pLg
+jVL
+fPE
+fPE
+fPE
+jVL
+fPE
+fPE
+hYb
+fGa
+rOM
+nLu
+jDE
+bFj
+bFj
+bFj
+bFj
+bFj
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(66,1,1) = {"
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+gsY
+gsY
+hMN
+kZk
+aXB
+hcZ
+nwx
+hcZ
+pth
+pth
+bXN
+pth
+pth
+hcZ
+gsY
+oIP
+mxS
+bXL
+gsY
+hcZ
+eew
+hcZ
+eTa
+hcZ
+tvf
+tvf
+tvf
+hcZ
+eew
+hcZ
+gsY
+qFr
+hso
+hEa
+gsY
+gsY
+hcZ
+gnL
+hcZ
+eTa
+hcZ
+tvf
+tvf
+tvf
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+hcZ
+rGD
+rGD
+rGD
+rGD
+rGD
+rGD
+rGD
+twU
+xWb
+aOv
+rBd
+mQQ
+nep
+sJl
+rBd
+blB
+oiI
+otW
+ugm
+aOv
+aOv
+twU
+xWb
+aPN
+lAR
+aAi
+aAi
+xJF
+rpT
+sXk
+aAi
+jhV
+aAi
+cLb
+tvp
+fPE
+fPE
+dhF
+uHs
+shD
+shD
+shD
+dhF
+dhF
+cuN
+kjk
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+slW
+fuY
+nLu
+jDE
+jDE
+bFj
+bFj
+bFj
+jDE
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(67,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aAk
+sTL
+qvO
+bIo
+bbP
+pQc
+qOn
+pQc
+bHE
+bOV
+qPn
+cie
+czL
+pQc
+aAk
+lRs
+agH
+iPx
+efA
+pQc
+qOn
+pQc
+xWX
+xWX
+pBJ
+vUT
+gcQ
+pQc
+qOn
+pQc
+sTL
+ozD
+dcE
+wVH
+sTL
+sTL
+pQc
+iqH
+pQc
+xWX
+iQz
+jjY
+nHW
+vUT
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+cwq
+cwq
+cwq
+lQM
+mfn
+cwq
+cwq
+cwq
+rBd
+nqV
+rBd
+nPl
+ugm
+ugm
+ugm
+aOv
+aOv
+aMu
+xWb
+aPN
+qaY
+aAi
+aAi
+psK
+fPQ
+lAR
+aAi
+giI
+aAi
+cLb
+fPQ
+fPE
+tIz
+dhF
+tiI
+rzk
+vsA
+vIk
+vVM
+dhF
+cuN
+oew
+wsg
+wsg
+xQu
+ygd
+aXn
+rJY
+ttF
+ttF
+ttF
+ttF
+wDx
+wDx
+wDx
+wDx
+wsg
+slW
+rfl
+nLu
+jDE
+jDE
+jDE
+bFj
+jDE
+jDE
+nLu
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(68,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+sTL
+sTL
+kek
+sTL
+pQc
+qOn
+pQc
+sTL
+sTL
+kek
+sTL
+sTL
+pQc
+sTL
+lof
+qHr
+rTK
+sTL
+pQc
+aHL
+pQc
+xXg
+xWX
+qgE
+xWX
+jUS
+pQc
+aHL
+pQc
+sTL
+kNc
+fjU
+dGF
+sTL
+sTL
+pQc
+lSn
+pQc
+xXg
+xWX
+xWX
+qgE
+xWX
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+ygp
+ygp
+htX
+csz
+hey
+mqf
+csz
+csz
+eIu
+tUz
+nCg
+tUz
+ojc
+eIu
+nfd
+aOv
+aOv
+twU
+xWb
+aPN
+cbV
+aAi
+aAi
+cLb
+aPN
+rCl
+aAi
+ogp
+aAi
+sTU
+fPQ
+fPE
+stt
+dhF
+kSx
+pVH
+igu
+pVH
+pVH
+wsU
+cuN
+kjk
+wsg
+wsg
+oVl
+wsg
+wsg
+pVI
+rJY
+dXO
+rJY
+wlO
+edp
+wDx
+wDx
+wDx
+wsg
+tdl
+cDs
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(69,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aAV
+sTL
+sTL
+sTL
+sTL
+pQc
+qOn
+pQc
+sTL
+sTL
+sTL
+sTL
+sTL
+pQc
+sTL
+sTL
+sTL
+sTL
+sTL
+pQc
+qOn
+pQc
+lJy
+ffv
+xWX
+xWX
+icD
+pQc
+qOn
+pQc
+gZj
+sTL
+sTL
+sTL
+sTL
+sTL
+pQc
+iqH
+pQc
+iDb
+xWX
+xWX
+xWX
+xWX
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+ygp
+lsE
+htX
+csz
+hey
+csz
+csz
+csz
+eIu
+nsc
+tUz
+tUz
+nsG
+eIu
+nfd
+oUS
+phT
+pzN
+pDo
+aPN
+lAR
+aAi
+aAi
+cLb
+aPN
+vLF
+aAi
+ngo
+aAi
+mWK
+fPQ
+fPE
+fPE
+dhF
+flE
+vcx
+jCv
+vKd
+vVP
+dhF
+cuN
+kjk
+xBu
+xBb
+vvH
+ygq
+uNo
+olG
+dXO
+rJY
+wlO
+wlO
+wlO
+wlO
+nlY
+wDx
+wsg
+slW
+stt
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(70,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQb
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQb
+pQc
+pQc
+pQc
+pQc
+pQc
+pQb
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQc
+bzX
+pQc
+pQc
+igb
+pQc
+ldG
+ldG
+ldG
+pQc
+pQb
+pQc
+pQc
+iiy
+pQc
+pQc
+pQc
+bzX
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+kXM
+tsX
+lyw
+csz
+hey
+mqg
+mBz
+mRU
+eIu
+kWx
+tUz
+tUz
+iZa
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+aPN
+lAR
+aAi
+aAi
+cLb
+aPN
+oZU
+aAi
+aAi
+aAi
+mza
+fPQ
+fPE
+fPE
+dhF
+dhF
+dhF
+dhF
+dhF
+dhF
+dhF
+cuN
+kjk
+xBu
+vvH
+vvH
+eUE
+xBu
+rJY
+pVI
+wlO
+ifo
+wlO
+wlO
+wlO
+wlO
+wDx
+wsg
+slW
+fPE
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(71,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aAZ
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+aQv
+xus
+wyO
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+kKK
+csz
+csz
+csz
+csz
+mgh
+vvP
+csz
+csz
+eIu
+nDC
+nFj
+tUz
+vPa
+eIu
+nfd
+slW
+aOv
+twU
+uJU
+fPQ
+qbY
+qmh
+qwT
+qXg
+fPQ
+rqZ
+mlx
+mlx
+mlx
+hGY
+fPQ
+tII
+fPE
+ujr
+fPE
+fPE
+fPE
+ujr
+fPE
+wty
+cuN
+kjk
+wsg
+xCz
+vvH
+fKj
+xBu
+pVI
+wlO
+wlO
+wlO
+wlO
+wlO
+wlO
+qcE
+wDx
+wsg
+slW
+pLg
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(72,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+aih
+sTL
+aou
+sTL
+sTL
+pQc
+mKQ
+dtr
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+ehY
+eue
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+gQy
+gZx
+eue
+gQy
+hXi
+hXi
+hXi
+hXi
+lbm
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+jMW
+eue
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+kYi
+kYa
+kYa
+kYa
+kYa
+cUy
+xIE
+mEs
+csz
+eIu
+nDC
+tUz
+tUz
+uxJ
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+fPQ
+fPQ
+fPQ
+fPQ
+fPQ
+hVM
+hVM
+hVM
+wOP
+hVM
+hVM
+hVM
+jLP
+jLP
+jLP
+jLP
+jLP
+jLP
+jLP
+jLP
+jLP
+cuN
+kjk
+xhO
+vvH
+xRa
+dNQ
+xBu
+pVI
+jQJ
+rOo
+wlO
+wlO
+wlO
+qcE
+qcE
+wDx
+wsg
+slW
+fPE
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(73,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+sTL
+ank
+xsN
+asm
+atA
+pQc
+mKQ
+eQB
+pQc
+pQc
+ldG
+ldG
+ldG
+ldG
+pQc
+pQc
+pQc
+pQc
+pQc
+bzX
+deI
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pQc
+ldG
+ldG
+ldG
+ldG
+pQc
+pQc
+igb
+pQc
+mKQ
+kKl
+pQc
+pQc
+ldG
+ldG
+ldG
+ldG
+ldG
+pQc
+pQc
+pQc
+igb
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+nHn
+loS
+lAv
+csz
+hey
+qqy
+csz
+csz
+nfr
+tUz
+tUz
+tUz
+uxJ
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+aOv
+qcw
+qmR
+qys
+qZT
+hVM
+rCY
+rNF
+jwL
+eKG
+sTZ
+hVM
+jLP
+uaM
+ulv
+uKS
+bAM
+vsY
+vKH
+vXh
+jLP
+cuN
+kjk
+wsg
+xDC
+vvH
+dNQ
+xBu
+eet
+svW
+wlO
+wlO
+kKp
+qcE
+hfA
+wDx
+wDx
+wsg
+slW
+fPE
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(74,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+aiz
+kTf
+fmt
+idZ
+xSO
+axO
+mKQ
+kKl
+pQc
+aRG
+bfA
+bfA
+bfA
+bfA
+bIj
+bPy
+pQc
+cjl
+cCk
+qVu
+qVu
+cCk
+dGD
+pQc
+mKQ
+kKl
+pQc
+eEs
+eTL
+fdh
+fzq
+fQa
+jVY
+pQc
+qOn
+pQc
+mKQ
+eQB
+pQc
+oFO
+oFO
+oFO
+rTL
+rUY
+rUY
+rUY
+pQc
+pQc
+qOn
+pQc
+esz
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+ygp
+lsE
+htX
+csz
+hey
+qqy
+mFv
+csz
+eIu
+tUz
+tUz
+tUz
+ojx
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+jrO
+cHe
+aqi
+dhM
+fcr
+hVM
+amK
+efc
+hTy
+eKG
+eKG
+hVM
+jLP
+vkJ
+jJi
+jJi
+vcT
+jCw
+jkX
+jOG
+jLP
+cuN
+oew
+wsg
+czn
+vvH
+yhk
+wsg
+ttF
+ttF
+ttF
+ttF
+wDx
+wDx
+wDx
+wDx
+wDx
+wsg
+slW
+stt
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(75,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+sTL
+kek
+sTL
+wgj
+xSp
+pQc
+mKQ
+kKl
+aJT
+ped
+xcj
+ebb
+ebb
+ebb
+xcj
+rfz
+pQc
+dss
+xWX
+xWX
+xWX
+xWX
+bgg
+ldG
+mKQ
+eQB
+pQc
+xWX
+kqK
+fCk
+glX
+xWX
+jcX
+pQc
+qOn
+pQc
+mKQ
+kKl
+pQc
+hFK
+hIB
+rTL
+oFO
+rUY
+rUY
+iDk
+pQc
+qOn
+qOn
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cwq
+ygp
+ygp
+htX
+csz
+hey
+mqU
+kzH
+kzH
+eIu
+tUz
+nFA
+tUz
+lWC
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+jrO
+nTp
+wzb
+dhM
+dJR
+hVM
+efc
+efc
+tFx
+swP
+eKG
+hVM
+jLP
+nYQ
+jJi
+jJi
+bAM
+fOy
+eaI
+eaI
+wua
+cuN
+kjk
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+wsg
+slW
+fPE
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(76,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+aju
+sTL
+qsy
+sTL
+sTL
+pQc
+mKQ
+kKl
+gPt
+ped
+xcj
+ebb
+byg
+ebb
+jkm
+rfz
+pQc
+mgU
+xWX
+xWX
+xWX
+xWX
+wmT
+ldG
+mKQ
+kKl
+aJT
+xWX
+asn
+uzn
+wMh
+xWX
+aau
+pQc
+aHL
+pQc
+mKQ
+kKl
+ozg
+rTL
+rTL
+bcZ
+oFO
+oFO
+rUY
+rUY
+pQc
+qBT
+qOn
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+iBw
+cwq
+cwq
+cwq
+cwq
+lQM
+mfn
+cwq
+cwq
+cwq
+eIu
+nsX
+eIu
+nsX
+eIu
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+jrO
+vNs
+maG
+dhM
+dhM
+hVM
+efc
+efc
+fFX
+mCg
+eKG
+hVM
+jLP
+ejr
+umG
+jJi
+bAM
+eaI
+eaI
+vXi
+jLP
+cuN
+kjk
+wty
+fPE
+fPE
+jVL
+fPE
+fPE
+fPE
+jVL
+fPE
+fPE
+fPE
+jVL
+fEd
+jYX
+jYX
+gSI
+wXX
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(77,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+ped
+xcj
+ebb
+ebb
+ebb
+jkm
+rfz
+pQc
+tIS
+xWX
+xWX
+xWX
+xWX
+fbr
+ldG
+mKQ
+kKl
+pQc
+xWX
+poR
+bll
+kjS
+xWX
+pys
+pQc
+qOn
+pQc
+mKQ
+kKl
+ozg
+rTL
+oFO
+oFO
+rTL
+oFO
+rTL
+rUY
+pQc
+qBT
+qOn
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+iBw
+kLN
+kYk
+lqI
+iBw
+tUg
+rrd
+nrr
+eIu
+tUz
+nfI
+tUz
+xuI
+tUz
+tUz
+eIu
+nfd
+slW
+aOv
+twU
+uJU
+aOv
+hcR
+dhM
+qyI
+rbz
+hVM
+rDt
+rNO
+gWp
+eKG
+eKG
+hVM
+jLP
+jkQ
+jJi
+jJi
+bAM
+eaI
+eaI
+cka
+jLP
+cuN
+kjk
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+slW
+arY
+sWr
+sWr
+sWr
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(78,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+eQB
+pQc
+aSR
+bka
+bka
+bka
+bka
+bIw
+bPT
+pQc
+mtn
+cCu
+cNI
+dfe
+cCu
+wuV
+pQc
+mKQ
+kKl
+pQc
+eHZ
+pJE
+rsp
+nue
+fQY
+jVY
+pQc
+qOn
+pQc
+mKQ
+eQB
+pQc
+oFO
+rTL
+oFO
+oFO
+rTL
+oFO
+rTL
+pQc
+qOn
+qOn
+pQc
+esz
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+iBw
+ifG
+eTB
+euH
+hJz
+ktr
+rrd
+nrr
+eIu
+tUz
+gbT
+tUz
+xuI
+nFj
+tUz
+eIu
+nfd
+slW
+aOv
+twU
+xWb
+aOv
+aOv
+qsl
+aOv
+aOv
+hVM
+hVM
+hVM
+hVM
+hVM
+hVM
+hVM
+jLP
+jLP
+umQ
+umQ
+umQ
+umQ
+umQ
+jLP
+jLP
+cuN
+oew
+aOv
+xpv
+xpv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+slW
+uuI
+ryZ
+ujr
+ryZ
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+"}
+(79,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+ajx
+qfn
+apV
+qfn
+atH
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+mKQ
+kKl
+ldG
+oFO
+hIR
+oFO
+oFO
+rTL
+rTL
+oFO
+pQc
+qOn
+qOn
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+iBw
+fPZ
+ifG
+euH
+hJz
+ktr
+rrd
+nrr
+eIu
+tUz
+cSl
+tUz
+xuI
+tUz
+nsc
+eIu
+nfd
+slW
+aOv
+pAp
+pEF
+jUm
+jUm
+jUm
+pXY
+jUm
+jUm
+jUm
+jUm
+pXY
+jUm
+jUm
+jUm
+jUm
+pXY
+slj
+jUm
+jUm
+jUm
+jUm
+pXY
+jUm
+wOh
+pec
+xhT
+xpv
+xpv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+slW
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(80,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+ykE
+qfn
+eKf
+qfn
+gDM
+pQc
+mKQ
+kKl
+aOu
+qOn
+aCN
+aIj
+qOn
+qOn
+aCN
+qOn
+vPh
+aCN
+qOn
+qOn
+aIj
+aCN
+qOn
+aOu
+mKQ
+eQB
+pQc
+aCN
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+pQc
+mKQ
+kKl
+ldG
+rTL
+bcZ
+oFO
+oFO
+hIB
+bcZ
+oFO
+pQc
+qOn
+qOn
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+iBw
+sAK
+kZJ
+lrk
+lBd
+ktr
+rrd
+nrr
+eIu
+eIu
+eIu
+eIu
+eIu
+eIu
+eIu
+eIu
+nfd
+slW
+aOv
+jLi
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+unc
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+vbz
+qSC
+aOv
+xpv
+xpv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+slW
+hgj
+jmv
+jmv
+jmv
+jmv
+jmv
+jmv
+jmv
+jmv
+jmv
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(81,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+lkv
+anp
+eKf
+qfn
+qfn
+axR
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cPB
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+hjm
+hsB
+hFS
+wxd
+rTL
+oFO
+rTL
+wxd
+oFO
+pQc
+qOn
+qOn
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+iBw
+iBw
+iBw
+iBw
+iBw
+tUg
+rrd
+nrr
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+slW
+nje
+nje
+nje
+nje
+nje
+nje
+nje
+rVR
+rVR
+rVR
+nje
+nje
+nje
+nje
+bwp
+bwp
+fjn
+mHl
+bwp
+bwp
+bwp
+aOv
+tqs
+wuJ
+tqs
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+aOv
+tdl
+hgj
+jmv
+jmv
+qoK
+xBl
+xBl
+xBl
+cWc
+uLz
+jmv
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(82,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+lkv
+qfn
+eKf
+qfn
+qfn
+pQc
+mKQ
+kKl
+pQc
+aUc
+bkc
+bmy
+ldG
+bip
+bIQ
+bip
+pQc
+cjt
+cCV
+lxJ
+lxJ
+cCV
+dID
+pQc
+mKQ
+kKl
+pQc
+qOn
+pQc
+ffr
+fER
+fRR
+fRR
+gpa
+fRR
+pQc
+mKQ
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+qOn
+pQc
+esz
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+lBQ
+yaj
+yaj
+yaj
+uEG
+yaj
+yaj
+yaj
+yaj
+yaj
+oeb
+nje
+nje
+nje
+nje
+qho
+qsu
+qzQ
+wkL
+rqR
+rDZ
+rPE
+sgK
+sxk
+nje
+tvO
+tJa
+fjn
+bYo
+uLv
+uLv
+bwp
+nfd
+vXG
+bSl
+vXG
+aSC
+xiu
+xEc
+bSl
+bSl
+bSl
+jCk
+bSl
+bSl
+bSl
+kzP
+uGh
+nfd
+lTA
+hgj
+jmv
+oRY
+xBl
+xBl
+xBl
+xBl
+xBl
+xBl
+qoK
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(83,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+akB
+qfn
+eKf
+qfn
+atT
+pQc
+mKQ
+eQB
+pQc
+xXg
+xWX
+nHW
+ldG
+bip
+bip
+bip
+pQc
+dHH
+ebb
+ebb
+ebb
+ebb
+alV
+ldG
+mKQ
+kKl
+pQc
+qOn
+pQc
+lxJ
+lxJ
+lxJ
+lxJ
+lxJ
+lxJ
+pQc
+mKQ
+kKl
+aOu
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+eLA
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+oui
+vJp
+oeb
+nje
+tqa
+pFq
+pPr
+xVt
+mEB
+mEB
+qxN
+qxN
+vzp
+jCi
+jCi
+gRw
+nje
+bGk
+fjn
+fjn
+bYo
+fjn
+fjn
+bwp
+nfd
+bSl
+wvE
+bSl
+aSC
+bSl
+bSl
+bSl
+bSl
+uYg
+bSl
+uYg
+bSl
+bSl
+bSl
+uGh
+nfd
+oeb
+hgj
+jmv
+xBl
+xBl
+xBl
+xBl
+xBl
+xBl
+xBl
+ohm
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(84,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+dFt
+qfn
+qfn
+qfn
+bUh
+pQc
+mKQ
+kKl
+aJT
+xWX
+bkw
+nHW
+ldG
+bip
+bJh
+bip
+pQc
+lxJ
+ebb
+cPU
+dfL
+ebb
+iYV
+ldG
+mKQ
+kKl
+aOu
+aHL
+pQc
+ffI
+fHh
+lxJ
+lxJ
+lxJ
+lxJ
+gSw
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+oce
+oce
+mgJ
+mgJ
+nvI
+mgJ
+mgJ
+oce
+jEd
+yaj
+oeb
+nje
+tqa
+bVI
+kFg
+pAo
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+sgX
+myz
+sVc
+tKn
+fjn
+fjn
+bYo
+fjn
+vdv
+bwp
+nfd
+vXG
+bSl
+vXG
+aSC
+bSl
+bSl
+dKn
+dKn
+dKn
+iSE
+dKn
+dKn
+dKn
+bSl
+bSl
+nfd
+oeb
+hgj
+jmv
+qoK
+xBl
+xBl
+xBl
+peW
+xBl
+qoK
+jmv
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(85,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+fnl
+fnl
+fnl
+fnl
+fnl
+pQc
+mKQ
+kKl
+pQc
+aWd
+xWX
+bmy
+ldG
+bip
+bip
+bip
+pQc
+lxJ
+cDt
+vkS
+ixZ
+ebb
+lxJ
+pQc
+mKQ
+eQB
+pQc
+qOn
+pQc
+lxJ
+lxJ
+lxJ
+lxJ
+lxJ
+lxJ
+pQc
+bRn
+kKl
+pQc
+bip
+bIQ
+bip
+bip
+bIQ
+bip
+pQc
+iQO
+hGa
+xWX
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+lRn
+wFP
+oce
+oce
+mSi
+oce
+oce
+oce
+mgJ
+oce
+jEd
+oJh
+oVu
+nje
+pAM
+pAM
+pPr
+qjA
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+sML
+meR
+nje
+vph
+fjn
+uct
+uoG
+fjn
+fjn
+bwp
+nfd
+aSC
+aSC
+aSC
+aSC
+bSl
+xHm
+dKn
+sQK
+sQK
+sQK
+wBO
+rrU
+dKn
+uGi
+bSl
+nfd
+oeb
+hgj
+jmv
+jmv
+fCI
+xBl
+xBl
+xBl
+aTL
+jmv
+jmv
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(86,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+fnl
+fnl
+fnl
+fnl
+fnl
+pQc
+mKQ
+kKl
+pQc
+pQc
+bkY
+pQc
+pQc
+bip
+bip
+bip
+pQc
+lxJ
+tsC
+ixZ
+djb
+ebb
+lxJ
+dSD
+mKQ
+kKl
+pQc
+qOn
+pQc
+fgB
+fHH
+fRU
+fRU
+gqP
+fRU
+pQc
+mKQ
+kKl
+ldG
+bip
+bip
+bip
+bip
+bip
+bip
+bML
+xWX
+xWX
+xWX
+ldG
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+oce
+mGb
+hTz
+gqM
+oce
+oce
+nPs
+oce
+oce
+nfd
+oeb
+nje
+tqa
+bVI
+kFg
+pAo
+jCi
+qBh
+jCi
+qBh
+jCi
+qBh
+sML
+jCi
+sVo
+fjn
+fjn
+jJy
+hEA
+fjn
+fjn
+bwp
+nfd
+aSC
+aSC
+aSC
+aSC
+xiY
+bSl
+dKn
+yhz
+sQK
+sQK
+sQK
+rrU
+dKn
+bSl
+txy
+nfd
+oeb
+hgj
+jmv
+jmv
+uLz
+xBl
+xBl
+xBl
+jmv
+jmv
+jmv
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(87,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+fnl
+fnl
+fnl
+fnl
+fnl
+pQc
+mKQ
+kKl
+pQc
+pQc
+cnI
+ebb
+byD
+bip
+lUw
+bip
+pQc
+lxJ
+ebb
+ebb
+ebb
+ebb
+lxJ
+pQc
+mKQ
+kKl
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+ldG
+bip
+bip
+hOS
+bip
+bip
+bip
+pQc
+iRl
+xWX
+xWX
+ldG
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+mse
+hTz
+hTz
+eBv
+apm
+mgJ
+mgJ
+mgJ
+ouy
+nfd
+oeb
+nje
+tqa
+bVI
+kFg
+pAo
+jCi
+wDV
+jCi
+wDV
+jCi
+wDV
+shU
+bPx
+bPx
+twx
+twx
+xvb
+ram
+fjn
+fjn
+bwp
+nfd
+vYy
+wzE
+sQK
+wWn
+bSl
+bSl
+dKn
+ebm
+sQK
+oJR
+sQK
+sQK
+dKn
+bSl
+bSl
+nfd
+oeb
+hgj
+jmv
+jmv
+xBl
+xBl
+xBl
+xBl
+xBl
+dzX
+dVA
+jmv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(88,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+alo
+ixZ
+ixZ
+ixZ
+avL
+pQc
+mKQ
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+cjS
+cEL
+cQh
+dki
+dyR
+dJK
+pQc
+bRn
+kKl
+pQc
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+aCN
+qOn
+aOu
+mKQ
+kKl
+ldG
+bip
+bip
+bip
+bip
+bip
+bip
+ldG
+vUT
+jlE
+xWX
+pQc
+esz
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+oce
+mGO
+njf
+pEr
+apm
+mgJ
+mgJ
+mgJ
+mgJ
+nfd
+oVL
+nje
+pAM
+pAM
+pPr
+qjA
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+meR
+nje
+vph
+fjn
+uuj
+mnJ
+fjn
+fjn
+bwp
+nfd
+eLJ
+sQK
+sQK
+aSC
+bSl
+xHm
+dKn
+sQK
+sQK
+sQK
+sQK
+sQK
+dKn
+uGi
+bSl
+nfd
+lTA
+hgj
+hgj
+hgj
+oMu
+oMu
+oMu
+oMu
+hgj
+hgj
+dVA
+hgj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(89,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+qfn
+ixZ
+aqU
+ixZ
+qfn
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+ldG
+ldG
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+bRn
+kKl
+ldG
+bip
+bip
+bip
+bip
+bip
+bip
+ldG
+nHW
+xWX
+xWX
+aJT
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+oce
+uzf
+njf
+pEr
+apm
+mgJ
+mgJ
+mgJ
+mgJ
+nfd
+oeb
+nje
+tqa
+bVI
+kFg
+vzp
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+hnA
+nje
+tKn
+fjn
+fjn
+bYo
+fjn
+vdv
+bwp
+nfd
+sQK
+sQK
+rrU
+cCs
+bSl
+bSl
+dKn
+dKn
+dKn
+dKn
+dKn
+dKn
+dKn
+bSl
+bSl
+nfd
+oeb
+hgj
+hgj
+hlm
+tIY
+aml
+aml
+hum
+ddi
+hgj
+bLQ
+hgj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(90,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+alo
+ixZ
+ixZ
+ixZ
+avL
+pQc
+mKQ
+xOU
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+uXg
+kKl
+pQc
+eJY
+eUm
+fgH
+fHW
+bvQ
+bvQ
+gsB
+bvQ
+pQc
+mKQ
+kKl
+pQc
+bip
+lUw
+bip
+bip
+lUw
+bip
+pQc
+iSB
+xWX
+icD
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+lRn
+wFP
+oce
+rqq
+hTz
+nfT
+apm
+mgJ
+nRx
+ols
+ouP
+nfd
+oeb
+nje
+tqa
+pFD
+pPr
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+jCi
+bwG
+nje
+txk
+fjn
+fjn
+bYo
+fjn
+fjn
+bwp
+nfd
+wbo
+wBO
+wPL
+cCs
+bSl
+bSl
+bSl
+bSl
+uLN
+bSl
+uLN
+bSl
+bSl
+bSl
+bSl
+nfd
+oeb
+hgj
+hgj
+dTW
+bCO
+ehw
+ehw
+ehw
+ehw
+dzX
+dVA
+hgj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(91,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+qfn
+qfn
+qfn
+qfn
+qfn
+pQc
+gEo
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+pIi
+xWX
+cmj
+xer
+xer
+xer
+xer
+xer
+xer
+pIi
+kKl
+ldG
+xth
+lUK
+pSC
+cRb
+bvQ
+gbm
+wmm
+bvQ
+ldG
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+oce
+lHL
+mSx
+gqM
+oce
+oce
+oce
+oce
+oce
+nfd
+oeb
+nje
+nje
+nje
+nje
+qjB
+jCi
+qBp
+rbC
+rbC
+rbC
+qBp
+jCi
+rDl
+nje
+jwg
+tJz
+fjn
+bYo
+uNu
+vdM
+bwp
+nfd
+rkz
+sQK
+huJ
+aSC
+xjV
+bSl
+bSl
+bSl
+bSl
+bSl
+bSl
+bSl
+bSl
+bSl
+bSl
+nfd
+oeb
+hgj
+hgj
+fms
+aKz
+ehw
+lnw
+sCO
+eFo
+hgj
+hgj
+hgj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(92,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQb
+pQc
+pQc
+pQc
+mKQ
+xWX
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+ldG
+nVy
+jOx
+kHg
+bvQ
+bvQ
+jUM
+eJr
+bvQ
+ldG
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+wFP
+oce
+oce
+oce
+oce
+oce
+nGm
+nTE
+oce
+oce
+nfd
+oVX
+nje
+nje
+nje
+nje
+nje
+nje
+nje
+rVR
+rVR
+rVR
+nje
+nje
+nje
+nje
+bwp
+bwp
+fjn
+mHl
+bwp
+bwp
+bwp
+nfd
+aSC
+wFo
+aSC
+aSC
+aSC
+cCs
+cCs
+cCs
+cCs
+cCs
+cCs
+cCs
+cCs
+cCs
+aSC
+nfd
+oVX
+hgj
+hgj
+hgj
+hgj
+tmC
+hgj
+hgj
+hgj
+hgj
+hgj
+hgj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(93,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+aou
+sTL
+aou
+sTL
+pQc
+mKQ
+xWX
+kKl
+pQc
+cQR
+bip
+dzj
+dKH
+pQc
+mKQ
+eQB
+pQc
+utX
+xeW
+jbI
+bvQ
+bvQ
+bvQ
+bvQ
+bvQ
+pQc
+bRn
+kKl
+pQc
+pQc
+pQc
+pQc
+hXH
+iiS
+isI
+iEm
+iUd
+pQc
+pQc
+pQc
+esz
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+qNh
+mhH
+mub
+jUV
+jUV
+jUV
+nyx
+jUV
+jUV
+jUV
+jUV
+jUV
+uGZ
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+jUV
+uGZ
+jUV
+jUV
+jUV
+jUV
+jUV
+ulT
+xPu
+xPu
+xnq
+xPu
+xPu
+xPu
+xPu
+xPu
+xPu
+xPu
+xPu
+xPu
+xPu
+bjJ
+bnz
+xPu
+xPu
+xPu
+bjJ
+yjb
+sBD
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(94,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aWA
+sTL
+bmJ
+bzV
+bFb
+pQc
+bRn
+xWX
+kKl
+aJT
+bip
+bip
+bip
+ulE
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+bzX
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+dTZ
+jVY
+xWX
+jVY
+duw
+pQc
+pQc
+pQc
+esz
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+qOn
+yaj
+lbD
+yaj
+lBQ
+lSe
+qHc
+vAH
+vAH
+vAH
+vAH
+xdg
+nHH
+nUg
+vAH
+vAH
+oKF
+tiA
+vAH
+vAH
+vAH
+oKF
+vAH
+vAH
+vAH
+vAH
+oKF
+vAH
+vAH
+vAH
+vAH
+oKF
+vAH
+vAH
+vAH
+tiA
+oKF
+vAH
+vAH
+vAH
+vAH
+xdg
+vAH
+wWT
+rSt
+wwn
+xSi
+wwn
+wwn
+wwn
+wwn
+xSi
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+tkS
+ijV
+wwn
+xKB
+ybb
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(95,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+sTL
+eYb
+oxv
+cDW
+pQc
+mKQ
+xWX
+kKl
+pQc
+bip
+bip
+bip
+bip
+pQc
+mKQ
+xOU
+xus
+aQv
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+aQv
+uXg
+xOU
+aQv
+xus
+xus
+aQv
+uXg
+ikz
+iue
+xWX
+xOU
+aQv
+xus
+xus
+jNH
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+hTY
+hTY
+hTY
+hTY
+hTY
+crB
+hTY
+hTY
+hTY
+hTY
+hTY
+gki
+faz
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+nfd
+vNd
+nfd
+nfd
+tuI
+tuI
+tuI
+szw
+tuI
+tuI
+tuI
+tuI
+vIA
+vIA
+vIA
+vIA
+vMh
+vIA
+vIA
+vIA
+qNh
+wFP
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+vNd
+jGJ
+sgn
+sqj
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(96,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+sTL
+bIT
+azC
+fvM
+pQc
+bSn
+xWX
+kKl
+pQc
+cRP
+bip
+bip
+bFt
+pQc
+mKQ
+dtr
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+pIi
+uZo
+hXi
+hXi
+hXi
+hXi
+hXi
+hXi
+amu
+uQl
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+lbS
+lrx
+lEn
+lSf
+dpy
+mwC
+mHF
+lAj
+nhX
+hTY
+gki
+faz
+bXk
+oyh
+oKR
+oXb
+piE
+bXk
+bXk
+bXk
+qjM
+yaj
+yaj
+yaj
+yaj
+tuI
+rQR
+skx
+wez
+sWX
+txv
+tuI
+tuI
+vIA
+uNy
+vdS
+vuD
+bIi
+rIw
+wGw
+vIA
+qNh
+wFP
+nhG
+xTS
+yhP
+qkK
+nhG
+koI
+koI
+koI
+koI
+koI
+nhG
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(97,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aXy
+qsy
+sTL
+qsy
+epk
+pQc
+toO
+xer
+uQl
+pQc
+mMr
+bip
+bip
+bFt
+pQc
+mKQ
+kKl
+pQc
+pQc
+bzX
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+prT
+pQc
+pQc
+bzX
+pQc
+ldG
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+iEH
+hqB
+aUp
+ief
+dpy
+dpy
+dpy
+mHL
+lAj
+hTY
+nJx
+faz
+omI
+tvs
+tvs
+tvs
+tvs
+bXk
+bXk
+bXk
+opJ
+yaj
+vJp
+yaj
+rsr
+tuI
+wez
+wez
+sAf
+wez
+wez
+tLi
+vHH
+vIA
+dJc
+uGP
+rIw
+rIw
+rIw
+rIw
+vIA
+qNh
+xny
+nhG
+shc
+bAJ
+nyJ
+wkn
+koI
+iYe
+iYe
+iYe
+koI
+nhG
+snB
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(98,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nJF
+bYT
+nJF
+pQc
+pDH
+bip
+bip
+bFt
+pQc
+mKQ
+eQB
+pQc
+eKa
+sTL
+sTL
+pQc
+bip
+bip
+bip
+bip
+gTQ
+bip
+ldG
+pzX
+hGa
+hJp
+pQc
+mKQ
+kLu
+pQc
+iFb
+xWX
+hGa
+xWX
+jFf
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+hTY
+seU
+seU
+kuI
+dpy
+dpy
+dpy
+eMJ
+nix
+hTY
+gki
+faz
+bXk
+oyl
+tvs
+tvs
+tvs
+pAV
+tvs
+bXk
+bXk
+nfd
+snB
+nfd
+nfd
+tuI
+rSN
+skO
+kZb
+sXg
+wez
+tuI
+vHH
+vIA
+mxL
+rIw
+rIw
+rIw
+wcz
+rIw
+vIA
+qNh
+wFP
+xHt
+bAJ
+yiy
+dBD
+wkn
+koI
+iYe
+iYe
+iYe
+xAT
+nhG
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(99,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+xjD
+ebb
+dGr
+pQc
+qux
+bip
+bip
+bFt
+pQc
+mKQ
+kKl
+ldG
+sTL
+sTL
+sTL
+pQc
+bip
+gcd
+bip
+gGp
+bip
+bip
+ldG
+vUT
+gpX
+xWX
+ldG
+mKQ
+kLu
+pQc
+xxc
+xWX
+xWX
+xWX
+jUS
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+hTY
+tqh
+lFA
+kuI
+irW
+irW
+irW
+irW
+hTY
+hTY
+nJN
+faz
+bXk
+alk
+tvs
+oXQ
+pjb
+bXk
+tvs
+bXk
+bXk
+nfd
+yaj
+nfd
+nfd
+tuI
+tuI
+tuI
+tuI
+tuI
+tuI
+tuI
+vHH
+vIA
+rvc
+rIw
+rIw
+vOj
+qgN
+wGJ
+vIA
+qNh
+wFP
+nhG
+xVy
+bAJ
+nyJ
+wkn
+koI
+iYe
+iYe
+iYe
+koI
+nhG
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(100,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+vMw
+ebb
+dGr
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+ldG
+eKY
+xsN
+efA
+pQc
+cKz
+bip
+gsU
+bip
+bip
+bip
+ldG
+nHW
+xWX
+xWX
+ldG
+mKQ
+kLu
+pQc
+vUT
+iUq
+jmw
+xWX
+xWX
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+hTY
+hTY
+mPf
+nzw
+kuI
+miQ
+gzb
+gzb
+gzb
+niR
+hTY
+gki
+faz
+bXk
+bXk
+fil
+fil
+bXk
+bXk
+pFQ
+bXk
+bXk
+nfd
+yaj
+nfd
+nfd
+tuI
+rTl
+ftt
+vHH
+skS
+txD
+tuI
+fNY
+vIA
+vIA
+vfp
+egX
+egX
+vIA
+vIA
+vIA
+qNh
+wFP
+nhG
+xaM
+bAJ
+jnT
+nhG
+koI
+koI
+koI
+koI
+koI
+nhG
+yaj
+jGJ
+hho
+mwh
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(101,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+bYX
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+kek
+sTL
+sTL
+pQc
+cKz
+bip
+bip
+lUw
+bip
+bip
+bML
+xWX
+xWX
+xWX
+ldG
+mKQ
+kLu
+pQc
+pQc
+ldG
+ldG
+pQc
+joV
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+gzb
+gzb
+gzb
+lSt
+rbW
+gzb
+gzb
+gzb
+uEI
+irW
+gki
+faz
+bXk
+oAk
+tvs
+tvs
+tvs
+tvs
+tvs
+tvs
+bXk
+nfd
+yaj
+yaj
+nfd
+tuI
+ftt
+vHH
+fNY
+fNY
+fNY
+tLD
+fNY
+vIA
+vIA
+tbS
+vva
+vva
+vIA
+vIA
+vIA
+qNh
+xny
+nhG
+nhG
+yiG
+nhG
+nhG
+nhG
+yiG
+nhG
+nhG
+nhG
+nhG
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(102,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+bJm
+bAP
+bAP
+bAP
+cFH
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+rII
+sTL
+sTL
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+bqp
+xWX
+xWX
+ldG
+mKQ
+kLu
+pQc
+rMq
+rMq
+rMq
+rMq
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+vPh
+pQc
+hTY
+lcG
+rbW
+rbW
+rbW
+lKA
+rbW
+gzb
+mjq
+uEI
+irW
+gki
+nUy
+bXk
+dCJ
+ntp
+ntp
+ntp
+ntp
+ntp
+pQk
+bXk
+nfd
+yaj
+snB
+nfd
+tuI
+pFo
+ftt
+vHH
+vHH
+vHH
+tuI
+tuI
+vIA
+vIA
+qQY
+tbS
+tbS
+vIA
+vIA
+vIA
+wYy
+wFP
+nhG
+nhG
+hRM
+hRM
+vmx
+hRM
+hRM
+nhG
+xTL
+mtA
+eCE
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(103,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+blh
+xnp
+nsV
+cam
+cnG
+tXQ
+cFH
+pQc
+pQc
+pQc
+pQc
+mKQ
+eQB
+pQc
+pQc
+pQc
+pQc
+pQc
+bip
+bip
+bip
+bip
+fAs
+bip
+ldG
+pzX
+xWX
+xWX
+ldG
+mKQ
+prT
+pQc
+iHL
+rMq
+rMq
+rMq
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+tHM
+lrQ
+rbW
+rbW
+rbW
+gzb
+gzb
+uEI
+uEI
+irW
+gki
+faz
+bXk
+tvs
+oNA
+oZb
+pli
+pBg
+ntp
+tvs
+bXk
+nfd
+yaj
+yaj
+nfd
+tuI
+qGO
+vHH
+ftt
+ftt
+tzr
+tuI
+tuI
+vIA
+vIA
+cvl
+vvV
+vPf
+vIA
+vIA
+vIA
+qNh
+wFP
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+nhG
+qhP
+qhP
+kLB
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(104,1,1) = {"
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+pQc
+pQc
+pQc
+blh
+bmY
+aOX
+vmd
+jIy
+cht
+aOX
+cUF
+cFH
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+eLA
+aCN
+fhd
+pQc
+bip
+bip
+gtm
+gGp
+bip
+bip
+ldG
+vUT
+gpX
+jUS
+pQc
+mKQ
+kLu
+ldG
+rMq
+iUt
+rMq
+rMq
+jFi
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+gzb
+rbW
+lGB
+gzb
+gzb
+gzb
+lWt
+uEI
+uEI
+irW
+gki
+faz
+bXk
+tvs
+ntp
+gFU
+gFU
+gFU
+ntp
+tvs
+bXk
+nfd
+yaj
+yaj
+nfd
+tuI
+vHH
+skS
+vHH
+vHH
+vHH
+tuI
+tuI
+vIA
+vIA
+vIA
+vIA
+vIA
+vIA
+vIA
+vIA
+qNh
+wFP
+nfd
+nfd
+yaj
+lbD
+yaj
+yaj
+yaj
+lbD
+vJp
+yaj
+yaj
+yaj
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(105,1,1) = {"
+hnC
+ebj
+ebj
+agb
+ebj
+ebj
+ebj
+agb
+ebj
+ebj
+ebj
+agb
+hnC
+pQc
+pQc
+blh
+bmY
+aOX
+aOX
+vmd
+jIy
+cht
+aOX
+aOX
+cUF
+cFH
+pQc
+pQc
+mKQ
+kKl
+aOu
+qOn
+eWk
+hwd
+pQc
+bip
+bip
+bip
+fAs
+bip
+bip
+ldG
+gcQ
+xWX
+xWX
+aJT
+mKQ
+kLu
+ldG
+rMq
+rMq
+rMq
+rMq
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+gzb
+gzb
+gzb
+lTL
+gzb
+gzb
+uEI
+uEI
+uEI
+irW
+gki
+faz
+bXk
+tvs
+ntp
+gFU
+plz
+gFU
+ntp
+tvs
+bXk
+uEG
+yaj
+yaj
+rXY
+tuI
+vHH
+vHH
+sAu
+ftt
+vHH
+tuI
+qJl
+lbD
+yaj
+yaj
+yaj
+yaj
+lbD
+yaj
+lBQ
+qNh
+wFP
+lBQ
+yaj
+yaj
+yaj
+yaj
+yaj
+vJp
+yaj
+yaj
+uEG
+yaj
+snB
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(106,1,1) = {"
+hnC
+ebj
+hjo
+hjo
+hjo
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+pQc
+blh
+bmY
+aOX
+bFr
+nsV
+bSA
+jIy
+cnQ
+cnG
+cUG
+aOX
+cUF
+cFH
+ldG
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+bip
+bip
+bip
+lUw
+bip
+bip
+bML
+xWX
+xWX
+xWX
+pQc
+mKQ
+kLu
+ldG
+rMq
+rMq
+rMq
+iUt
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+hTY
+gzb
+gzb
+gzb
+gzb
+gzb
+gzb
+uEI
+uEI
+uEI
+irW
+gki
+faz
+bXk
+oEf
+ntp
+ntp
+ntp
+ntp
+ntp
+tvs
+bXk
+bEp
+yaj
+yaj
+rXY
+tuI
+rTF
+vHH
+vHH
+vHH
+tAe
+tuI
+qJl
+yaj
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+qNh
+xny
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+vwv
+yaj
+uEG
+yaj
+jGJ
+hho
+eiO
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(107,1,1) = {"
+hnC
+ebj
+adz
+ahj
+sTL
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+aXE
+vGF
+aOX
+aOX
+aOX
+vmd
+jIy
+jIy
+jIy
+cht
+aOX
+aOX
+aOX
+fBP
+ldG
+mKQ
+kKl
+pQc
+nyk
+gWC
+fhI
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+bqp
+xWX
+xWX
+ldG
+mKQ
+kLu
+ldG
+rMq
+rMq
+rMq
+rMq
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+gzb
+gzb
+rbW
+gzb
+gzb
+gzb
+uEI
+uEI
+uEI
+irW
+gki
+nUy
+bXk
+sPR
+ntp
+ntp
+ntp
+ntp
+ntp
+pQD
+bXk
+yaj
+yaj
+yaj
+snB
+tuI
+tuI
+tuI
+tuI
+tuI
+tuI
+tuI
+qJl
+yaj
+nfd
+nfd
+vwv
+vPy
+wcX
+nfd
+nfd
+qNh
+wFP
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+nfd
+jGJ
+mEK
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(108,1,1) = {"
+hnC
+abl
+hjo
+ltn
+sTL
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+lxJ
+vnp
+aOX
+aOX
+aOX
+vmd
+jIy
+cdr
+jIy
+cht
+aOX
+aOX
+aOX
+qGT
+ldG
+mKQ
+kKl
+pQc
+gWC
+gWC
+nIW
+pQc
+fTR
+bip
+bip
+bip
+bip
+bip
+ldG
+pzX
+xWX
+xWX
+ldG
+mKQ
+kLu
+ldG
+rMq
+iUt
+rMq
+jxX
+jFt
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+gzb
+gzb
+lKA
+rbW
+gzb
+uEI
+uEI
+uEI
+uEI
+irW
+gki
+faz
+bXk
+uag
+tvs
+tvs
+plJ
+tvs
+oEf
+sCG
+bXk
+qsE
+yaj
+uEG
+yaj
+yaj
+yaj
+skW
+yaj
+yaj
+yaj
+lbD
+yaj
+yaj
+yaj
+lbD
+yaj
+eNm
+tjQ
+nfd
+nfd
+qNh
+wFP
+eGK
+xYt
+spC
+fzK
+spC
+lHt
+eGK
+eGK
+eGK
+eGK
+eGK
+nfd
+jGJ
+sgn
+mrq
+jGJ
+ebR
+ebR
+ebR
+ebR
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(109,1,1) = {"
+hnC
+ebj
+hjo
+jhi
+sTL
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+lxJ
+vGF
+aOX
+aOX
+aOX
+vmd
+jIy
+jIy
+jIy
+cht
+aOX
+aOX
+aOX
+fBP
+ldG
+mKQ
+kKl
+aJT
+gWC
+gWC
+eVn
+pQc
+bip
+bip
+bip
+gGp
+bip
+bip
+ldG
+vUT
+gpX
+xWX
+ldG
+mKQ
+kLu
+ldG
+rMq
+rMq
+rMq
+rMq
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+lcG
+gzb
+rbW
+gzb
+mjq
+uEI
+uEI
+mST
+uEI
+irW
+gki
+faz
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+bXk
+yaj
+yaj
+yaj
+yaj
+yaj
+yaj
+yaj
+yaj
+yaj
+yaj
+uEG
+yaj
+rXY
+nfd
+nfd
+yaj
+eNm
+iTs
+nfd
+nfd
+qNh
+wFP
+xHY
+fzK
+fzK
+fEG
+fzK
+fzK
+hKV
+cPo
+pjC
+eGK
+eGK
+nfd
+jGJ
+sgn
+mrq
+mcu
+ebR
+dbD
+que
+ebR
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(110,1,1) = {"
+hnC
+ebj
+hjo
+hjo
+hjo
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+ebj
+pQc
+mmt
+bnU
+aOX
+bFr
+bJI
+bSN
+bSN
+bSN
+cFX
+cUG
+dpL
+vKi
+cUI
+ldG
+mKQ
+euo
+pQc
+gWC
+gWC
+eVn
+pQc
+bip
+bip
+bip
+gGD
+bip
+bip
+ldG
+nHW
+xWX
+xWX
+ldG
+mKQ
+prT
+pQc
+iHL
+rMq
+rMq
+rMq
+rMq
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+hTY
+gzb
+gzb
+gzb
+lWt
+qCS
+uEI
+uEI
+aHS
+njB
+hTY
+gki
+faz
+lBQ
+yaj
+lbD
+yaj
+yaj
+yaj
+uEG
+lbD
+vJp
+yaj
+yaj
+yaj
+bEp
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+jLf
+jLf
+jLf
+vPG
+jLf
+jLf
+jLf
+qNh
+wFP
+eGK
+uKk
+jcf
+bil
+bil
+mmj
+eGK
+cPo
+cPo
+eGK
+eGK
+nfd
+jGJ
+sgn
+kyg
+jGJ
+ebR
+sAQ
+tdG
+sAQ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(111,1,1) = {"
+hnC
+ebj
+ebj
+ahx
+ebj
+ebj
+ebj
+ahx
+ebj
+ebj
+ebj
+ahx
+hnC
+pQc
+pQc
+mmt
+bnU
+aOX
+aOX
+aOX
+fpf
+aOX
+aOX
+aOX
+vKi
+cUI
+pQc
+pQc
+mKQ
+kKl
+ldG
+eMA
+gWC
+fjS
+pQc
+fUe
+gee
+bip
+lUw
+bip
+bip
+bML
+xWX
+xWX
+xWX
+ldG
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+kgn
+kuz
+qOn
+aHL
+pQc
+hTY
+hTY
+hTY
+hTY
+hTY
+hTY
+hTY
+hTY
+hTY
+hTY
+hTY
+gki
+faz
+rpU
+lkT
+lkT
+lkT
+lkT
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+sAM
+sXx
+tAu
+rpU
+rpU
+rpU
+jLf
+vgq
+vwC
+iEJ
+wgi
+wGW
+jLf
+qNh
+wFP
+eGK
+eGK
+mgu
+mgu
+mgu
+eGK
+eGK
+xqU
+xqU
+eGK
+eGK
+nfd
+jGJ
+sgn
+mrq
+hNR
+ebR
+ebR
+xNc
+ebR
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(112,1,1) = {"
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+hnC
+pQc
+pQc
+pQc
+mmt
+bnU
+aOX
+aOX
+aOX
+aOX
+aOX
+vKi
+cUI
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+nyk
+gWC
+xXz
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+htY
+hGU
+hJD
+pQc
+mKQ
+kLu
+aOu
+aCN
+qOn
+vPh
+aIj
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+yaj
+yaj
+lbD
+yaj
+yaj
+yaj
+lbD
+yaj
+yaj
+yaj
+lBQ
+gki
+nUy
+rpU
+oFg
+lkT
+lkT
+lkT
+rpU
+sac
+sac
+sac
+rpU
+qDz
+rwj
+rwj
+rpU
+uIT
+slB
+uIT
+uIT
+uIT
+slB
+uIT
+rpU
+jLf
+oOF
+iuk
+suT
+uAd
+hYS
+jLf
+lRn
+wFP
+eGK
+xZX
+xIs
+yaw
+quW
+eUU
+xIs
+owm
+owm
+quW
+eGK
+nfd
+jGJ
+hho
+mwh
+jGJ
+dXo
+ebR
+ebR
+ebR
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(113,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mmt
+bnU
+bTz
+bTz
+bTz
+vKi
+cUI
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pQc
+ldG
+pQc
+pQc
+pQc
+aAZ
+xus
+gHz
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+fhd
+aIj
+kxZ
+kyI
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+gki
+faz
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+sac
+pQF
+sac
+rpU
+rwj
+rdK
+rwj
+rpU
+gdl
+ooI
+kRs
+sXK
+kRs
+tPO
+gdl
+rpU
+jLf
+rmZ
+cXI
+boO
+rWr
+jBv
+jLf
+qNh
+wFP
+xIi
+owm
+xKY
+owm
+nam
+kRX
+quW
+ftN
+xKY
+owm
+eGK
+nfd
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(114,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+bKb
+eus
+cdP
+eus
+ijU
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+xOU
+xus
+xus
+xus
+xus
+xus
+xus
+uXg
+xWX
+xOU
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+uXg
+ilT
+iuM
+xus
+xus
+xus
+xus
+iuM
+gHz
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+gki
+faz
+rpU
+oGT
+oNI
+sac
+pnc
+rpU
+sac
+sac
+sac
+rpU
+rwj
+rwj
+rwj
+rpU
+gdl
+olX
+gdl
+olX
+tAT
+olX
+gdl
+rpU
+jLf
+qKO
+ghA
+iBR
+chX
+sIe
+jLf
+qNh
+wFP
+mgu
+yaw
+aix
+rpF
+rpF
+rpF
+jab
+quW
+quW
+bKf
+eGK
+nfd
+jGJ
+sgn
+mrq
+jGJ
+pls
+mbN
+mqZ
+xqA
+ktY
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(115,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+xWX
+xWX
+xWX
+xWX
+xWX
+dtr
+xer
+cLj
+xer
+xer
+xer
+xer
+cLj
+xer
+xer
+xer
+cLj
+hXX
+tPN
+hXi
+hXi
+iVL
+hXi
+hXi
+gZx
+jPg
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+gki
+faz
+rpU
+hyx
+sac
+sac
+sac
+rpU
+fub
+fub
+fub
+rpU
+fub
+fub
+fub
+rpU
+uIT
+olX
+gdl
+olX
+gDB
+olX
+gdl
+rpU
+jLf
+iFi
+htr
+vhX
+alP
+gvX
+jLf
+qNh
+wFP
+mgu
+owm
+owm
+pck
+rKF
+rKF
+rpF
+rpF
+eFb
+aUF
+eGK
+nfd
+jGJ
+sgn
+mrq
+jGJ
+mFW
+mqZ
+mqZ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(116,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aIj
+qOn
+aCN
+qOn
+qOn
+aOu
+gEo
+xer
+cLj
+xer
+xer
+pIi
+kKl
+pQc
+pQc
+ldG
+ldG
+ldG
+ldG
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQc
+bzX
+pQc
+pQc
+pQc
+sxL
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+gki
+faz
+opR
+sac
+sac
+sac
+sac
+sac
+sac
+sac
+sac
+qsP
+wZD
+reE
+rsv
+rpU
+olu
+smg
+kRs
+sYs
+kRs
+tRB
+gdl
+rpU
+jLf
+vhX
+izU
+vhX
+cMZ
+flg
+jLf
+qNh
+wFP
+mgu
+xIs
+rpF
+rpF
+rKF
+rKF
+shd
+rpF
+owm
+owm
+eGK
+nfd
+jGJ
+sgn
+mrq
+hNR
+mqZ
+mqZ
+mqZ
+xqA
+rQg
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(117,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aCN
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pzX
+xWX
+ped
+qkm
+tGn
+tGn
+pQc
+pQc
+qOn
+pQc
+pQc
+imo
+ivl
+xWX
+iWh
+jmK
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nKN
+faz
+rpU
+sac
+oNV
+sac
+sac
+rpU
+fub
+fub
+fub
+rpU
+fub
+fub
+fub
+rpU
+uIT
+olX
+lvV
+olX
+gdl
+olX
+gdl
+rpU
+jLf
+jLf
+ntZ
+jLf
+jLf
+jLf
+jLf
+qNh
+wFP
+mgu
+owm
+kRX
+rpF
+pvt
+rpF
+rpF
+xIs
+quW
+ftN
+eGK
+nfd
+jGJ
+nKq
+mrq
+jGJ
+pls
+mqZ
+mqZ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(118,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+vPh
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+dqe
+dzA
+mqH
+dTg
+dTg
+euN
+eCd
+dqe
+pQc
+mKQ
+euo
+pQc
+pzX
+xWX
+ped
+qkm
+tGn
+tGn
+pQc
+qOn
+qOn
+qBT
+pQc
+wys
+oPv
+xWX
+bpW
+nyT
+pQc
+mKQ
+prT
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+gki
+faz
+rpU
+oHI
+qIt
+pbm
+pqC
+rpU
+sac
+sac
+sac
+rpU
+sac
+sac
+sac
+rpU
+gdl
+olX
+gDB
+olX
+gdl
+olX
+gdl
+rpU
+jLf
+lhN
+lhN
+jLf
+jLf
+jLf
+jLf
+lRn
+wFP
+mgu
+quW
+xIs
+jab
+rpF
+kRX
+owm
+quW
+ebq
+psL
+eGK
+nfd
+jGJ
+ocf
+mwh
+jGJ
+pls
+aIB
+mqZ
+xqA
+rQg
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(119,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+gBz
+gBz
+pQc
+pQc
+pQc
+pQc
+hFv
+bkn
+bkn
+aVC
+aVC
+bkn
+bkn
+bkn
+pQc
+mKQ
+kKl
+aJT
+xWX
+xWX
+ped
+gTY
+tGn
+tGn
+pQc
+hwd
+qOn
+aHL
+pQc
+qEg
+nHW
+nHW
+sMt
+xWX
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+gOw
+gOw
+gOw
+gOw
+gOw
+gOw
+gki
+faz
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+sac
+pQY
+sac
+rpU
+sac
+rhF
+sac
+rpU
+gdl
+smu
+kRs
+tbG
+kRs
+tSC
+gdl
+rpU
+jLf
+lhN
+jLf
+jLf
+lhN
+lhN
+wQB
+qNh
+wFP
+mgu
+owm
+xKY
+owm
+owm
+yaw
+owm
+xKY
+owm
+uJD
+eGK
+nfd
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(120,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+bKC
+gBz
+cdT
+cqX
+cGq
+cWB
+bkn
+ycP
+ycP
+ycP
+ycP
+ycP
+ycP
+bkn
+pQc
+mKQ
+kKl
+pQc
+ghg
+gty
+gIb
+ehD
+hcJ
+hjQ
+pQc
+qBT
+qOn
+qOn
+pQc
+ldG
+ldG
+ldG
+pQc
+joV
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+mkd
+aIg
+aIg
+mTa
+nll
+nzY
+gki
+faz
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+sac
+sac
+sac
+rpU
+sac
+sac
+sac
+rpU
+uIT
+vYw
+gdl
+gdl
+gdl
+vYw
+uIT
+rpU
+jLf
+lhN
+lhN
+vPI
+wij
+lhN
+jLf
+qNh
+wFP
+eGK
+xZX
+owm
+yaw
+xIs
+qdH
+quW
+owm
+buS
+owm
+eGK
+nfd
+jGJ
+sgn
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(121,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+gBz
+gBz
+pQc
+pQc
+pQc
+pQc
+dtI
+ycP
+dLd
+dTI
+dTI
+evK
+ycP
+eOx
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+qOn
+pQc
+bip
+bip
+bip
+bip
+bip
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+bEa
+aIg
+aIg
+vjh
+qby
+gOw
+gki
+faz
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+rpU
+jLf
+jLf
+jLf
+jLf
+jLf
+jLf
+jLf
+qNh
+wFP
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+eGK
+jGJ
+jGJ
+jGJ
+aSw
+sgn
+bOm
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(122,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aCN
+qOn
+qOn
+qOn
+qOn
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+saX
+ycP
+xXX
+ocO
+vkW
+gWb
+ycP
+uXJ
+pQc
+mKQ
+euo
+pQc
+tGn
+guK
+tGn
+tGn
+tGn
+guK
+tGn
+pQc
+qOn
+qOn
+pQc
+bip
+bip
+bip
+bip
+bip
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+mvC
+aIg
+mHR
+sVe
+mlk
+qrN
+nLf
+nUC
+xPu
+xPu
+xPu
+dBA
+xPu
+xPu
+xPu
+xPu
+dBA
+xPu
+xPu
+xPu
+xPu
+xPu
+dBA
+yjb
+sBD
+bPs
+bPs
+txw
+lis
+uoO
+uoO
+vgS
+vzb
+fgq
+fgq
+wHu
+bPs
+lRn
+wFP
+nfd
+nfd
+xZv
+cBa
+snf
+nYS
+snf
+wyg
+xZv
+jGJ
+wGc
+jGJ
+lsB
+wIG
+mrq
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(123,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+exB
+ycP
+xXX
+dWb
+ocO
+gWb
+ycP
+mqH
+pQc
+mKQ
+kKl
+pQc
+ghq
+tGn
+tGn
+tGn
+tGn
+tGn
+tGn
+pQc
+qOn
+qOn
+pQc
+bip
+bip
+bip
+bip
+bip
+pQc
+mKQ
+jRh
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+beK
+aIg
+fgM
+ndS
+mpt
+qrN
+mHs
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+jkW
+faz
+bPs
+bPs
+foz
+ucB
+fgq
+uOS
+fgq
+nGN
+vPN
+fgq
+fgq
+bPs
+qNh
+xpn
+xJX
+nfd
+xZv
+qug
+vQf
+vQf
+vQf
+rUr
+xZv
+jGJ
+jGJ
+jGJ
+jGJ
+hho
+mwh
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(124,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+boT
+sTL
+bFw
+sTL
+bUL
+aou
+crv
+sTL
+pQc
+nFY
+ycP
+dLl
+ocO
+ocO
+evN
+ycP
+eOC
+pQc
+mKQ
+kKl
+ldG
+tGn
+tGn
+tGn
+tGn
+tGn
+hkg
+tGn
+pQc
+qOn
+qBT
+pQc
+imr
+bip
+bip
+bip
+joZ
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+fSN
+uNl
+uNl
+uNl
+uNl
+gOw
+nfd
+wcy
+wcy
+wcy
+wcy
+xFK
+xFK
+xFK
+xFK
+xFK
+xFK
+xFK
+xFK
+wcy
+wcy
+wcy
+wcy
+gki
+sEm
+bPs
+bPs
+nTy
+brr
+fgq
+fgq
+fgq
+nGN
+uoO
+wjn
+fgq
+wRm
+qNh
+xps
+xKn
+nfd
+xZv
+gnc
+vQf
+vQf
+vQf
+tBu
+xZv
+nfd
+jGJ
+jGJ
+jGJ
+sgn
+mrq
+jGJ
+jGJ
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(125,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+cnj
+sTL
+sTL
+sTL
+sTL
+sTL
+sTL
+sTL
+pQc
+eAO
+dAc
+ycP
+ycP
+ycP
+ycP
+ycP
+fBW
+pQc
+mKQ
+kKl
+ldG
+tGn
+tGn
+tGn
+tGn
+tGn
+tGn
+tGn
+pQc
+qOn
+aHL
+pQc
+bip
+bip
+bip
+bip
+bip
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+lWz
+vGy
+sNw
+sNw
+sNw
+nmp
+gOw
+gOw
+wcy
+opZ
+oHL
+oSY
+fex
+pyi
+pyi
+pGy
+pyi
+pyi
+pyi
+qGI
+rie
+rty
+rEw
+wcy
+gki
+faz
+bPs
+bPs
+foz
+lis
+fgq
+fgq
+fgq
+nGN
+jYL
+fgq
+wKl
+bPs
+qNh
+wFP
+nfd
+nfd
+xZv
+xZv
+xZv
+isw
+xZv
+xZv
+xZv
+nfd
+jGJ
+lcc
+qis
+nkg
+nkg
+hKh
+shr
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(126,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+sTL
+sTL
+bHr
+bMm
+bHr
+bMm
+bHr
+bMm
+pQc
+mqH
+bkn
+bkn
+bkn
+bkn
+bkn
+eCN
+exB
+pQc
+sxL
+kKl
+pQc
+ghu
+gwD
+gwD
+gUC
+tGn
+tGn
+tGn
+pQc
+qOn
+qOn
+pQc
+bip
+bip
+bip
+bip
+bip
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+oYX
+wBd
+mHW
+mTv
+sNw
+nzY
+sNw
+obH
+pyi
+pyi
+jlr
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+wnn
+rZd
+wcy
+gki
+faz
+bPs
+bPs
+txw
+lis
+uts
+xWl
+vjk
+bPs
+lRe
+xWl
+wLo
+bPs
+qNh
+wFP
+nfd
+nfd
+xZv
+iuQ
+snf
+snf
+snf
+suF
+xZv
+nfd
+jGJ
+rcO
+jtc
+nkg
+nkg
+vFv
+cek
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(127,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+asB
+sTL
+sTL
+sTL
+sTL
+aou
+pQc
+pQc
+bqd
+sTL
+bqM
+sTL
+bVf
+sTL
+xsN
+qsy
+pQc
+xyV
+grC
+bkn
+bkn
+bkn
+bkn
+grC
+eOF
+pQc
+mKQ
+euo
+pQc
+hsx
+ffv
+xWX
+aFP
+tGn
+hcJ
+tGn
+pQc
+qOn
+hwd
+pQc
+bip
+bip
+bip
+bip
+bip
+pQc
+mKQ
+kLu
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+gOw
+gOw
+gOw
+gOw
+gOw
+gOw
+gOw
+gOw
+wcy
+oqe
+pyi
+pyi
+vHD
+eOs
+eOs
+eOs
+eOs
+eOs
+nFM
+pyi
+pyi
+cnp
+leM
+rUV
+smS
+faz
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+bPs
+xan
+xpu
+nfd
+nfd
+xZv
+jWd
+vQf
+vQf
+vQf
+ivv
+xZv
+nfd
+jGJ
+crn
+gBF
+nkg
+nkg
+qOd
+cPg
+jGJ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(128,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+awQ
+ayW
+aBI
+aDG
+sTL
+pQc
+pQc
+pQc
+bzX
+pQc
+ldG
+ldG
+ldG
+ldG
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+eid
+pQc
+pQc
+pQc
+pQc
+mKQ
+kKl
+pQc
+pQc
+pQc
+bzX
+pQc
+pQc
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+mKQ
+prT
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+wcy
+toi
+pyi
+pyi
+vHD
+eOs
+eOs
+eOs
+eOs
+eOs
+nFM
+pyi
+pyi
+pyi
+pyi
+wcy
+clt
+nUC
+dBA
+xPu
+xPu
+xPu
+dBA
+xPu
+xPu
+xPu
+dBA
+xPu
+xPu
+xPu
+xcU
+xrx
+jUV
+sBD
+xhK
+snf
+vQf
+vQf
+vQf
+ozi
+xZv
+nfd
+eZe
+eZe
+ckD
+xWZ
+igR
+gNW
+eZe
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(129,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+lRc
+mrs
+lLp
+hhG
+sTL
+aXR
+aAZ
+aQv
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+aQv
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+xus
+fkl
+fIw
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+fUG
+jGO
+lrp
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+wcy
+fny
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+pyi
+rHb
+wcy
+lSe
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+wwn
+ybb
+snf
+snf
+vQf
+vQf
+vQf
+ozi
+xZv
+nfd
+eZe
+cNH
+cNH
+cNH
+cNH
+cNH
+cNH
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(130,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+lRc
+kPd
+lLp
+hhG
+sTL
+xWX
+gEo
+xer
+xer
+xer
+xer
+bVl
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+xer
+cLj
+xer
+xer
+xer
+xer
+cLj
+xer
+xer
+xer
+xer
+xer
+cLj
+xer
+xer
+xer
+xer
+xer
+cLj
+xer
+xer
+xer
+xer
+cLj
+xer
+xer
+xer
+uQl
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+wcy
+pwO
+pyi
+oTm
+pyi
+pyi
+pyi
+pJA
+pRC
+pyi
+pyi
+qGP
+riW
+ruD
+cmH
+wcy
+xZv
+xZv
+tdP
+tdP
+tdP
+tdP
+tdP
+tdP
+tdP
+tdP
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+jWd
+vQf
+vQf
+vQf
+kIA
+xZv
+nfd
+eZe
+cNH
+twT
+wwB
+wwB
+wwB
+cNH
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(131,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+sTL
+axq
+oAC
+aCo
+aFv
+sTL
+pQc
+pQc
+pQc
+bzX
+pQc
+pQc
+pQc
+ldG
+ldG
+ldG
+ldG
+pQc
+pQc
+igb
+pQc
+pQc
+bzX
+pQc
+ldG
+ldG
+pQc
+pQc
+pQc
+pQc
+pQb
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+kgn
+koE
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+wcy
+xZv
+sEo
+tge
+tge
+tge
+tge
+tge
+tge
+tge
+tge
+sEo
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+iuQ
+snf
+snf
+snf
+suF
+xZv
+nfd
+eZe
+kcS
+tRh
+wwB
+wwB
+wwB
+mTj
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(132,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+asX
+sTL
+sTL
+sTL
+sTL
+qsy
+pQc
+pQc
+xWX
+xWX
+bmy
+ldG
+bIQ
+bip
+nBE
+nBE
+nBE
+dua
+pQc
+qOn
+pQc
+ekR
+bip
+bip
+bip
+eWF
+flt
+pQc
+fUR
+sTL
+sTL
+sTL
+gVF
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+wbd
+opw
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tiT
+tBC
+tSQ
+tSQ
+tSQ
+tSQ
+tSQ
+vzJ
+vQz
+xZv
+wLp
+wLs
+wLs
+xrJ
+xKL
+ycU
+xZv
+xZv
+xZv
+aEA
+xZv
+xZv
+xZv
+nfd
+eZe
+cNH
+wwB
+wwB
+wwB
+wwB
+cNH
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(133,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+igb
+pQc
+pQc
+pQc
+xWX
+xWX
+lEz
+ldG
+bip
+nBE
+nBE
+oEx
+oEx
+oEx
+pQc
+qOn
+pQc
+ulE
+bip
+bip
+bip
+bip
+bip
+pQc
+fmt
+ghx
+gxm
+gJq
+kTf
+pQc
+qOn
+vPh
+aCN
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+qOn
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tiT
+sEo
+sEo
+sEo
+sEo
+sEo
+sEo
+vBj
+vQz
+tdP
+wLs
+wSu
+wSu
+wSu
+wSu
+yel
+xZv
+gTf
+snf
+snf
+wpO
+rGl
+xZv
+nfd
+eZe
+cNH
+cNH
+cNH
+cNH
+cNH
+cNH
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(134,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+bqp
+xWX
+tXN
+ldG
+bip
+nBE
+crX
+oEx
+oEx
+oEx
+pQc
+aHL
+pQc
+lRl
+bip
+bip
+bip
+bip
+bip
+pQc
+itM
+xua
+hAX
+tgs
+gVH
+pQc
+hly
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tiT
+sEo
+sEo
+sEo
+sEo
+sEo
+sEo
+vBj
+vQz
+tdP
+wLs
+wSy
+wSu
+xrX
+wSu
+yel
+xpa
+dXS
+vQf
+vQf
+nev
+mYj
+xZv
+nfd
+eZe
+eZe
+eZe
+eZe
+eZe
+eZe
+eZe
+eZe
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(135,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aHL
+pQc
+pQc
+pQc
+mOM
+xWX
+xWX
+pQc
+bip
+nBE
+nBE
+nBE
+oEx
+oEx
+pQc
+qOn
+pQc
+ulE
+ewh
+eCT
+eCT
+eYi
+fmS
+pQc
+uHO
+uta
+hAX
+fVF
+xHM
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tiT
+sEo
+sEo
+udo
+sEo
+sEo
+sEo
+vBj
+vQz
+tdP
+wLs
+wTD
+xes
+xsE
+xKP
+yel
+snf
+snf
+vQf
+vQf
+vQf
+xGT
+xGT
+ijj
+czS
+xfG
+xRq
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(136,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+omT
+xWX
+xWX
+bML
+bip
+lUw
+bip
+nBE
+cZA
+oEx
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+xsN
+xua
+hAX
+tgs
+xsN
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tiT
+sEo
+sEo
+sEo
+sEo
+sEo
+sEo
+vBj
+vQz
+tdP
+wLs
+wTX
+wSu
+wSu
+wSu
+yel
+snf
+snf
+vQf
+vQf
+ieY
+kER
+xZv
+xGT
+tYm
+vQf
+gAt
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(137,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+aIj
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+ewK
+eDj
+wbd
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tiT
+sEo
+sEo
+sEo
+sEo
+sEo
+sEo
+vBj
+vQz
+tdP
+wLs
+wSu
+wSu
+wSu
+wSu
+yel
+xZv
+wsW
+dzk
+aWE
+kER
+vqp
+xZv
+xGT
+vQf
+vQf
+xGT
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(138,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+vPh
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+qOn
+aCN
+qOn
+qOn
+qOn
+aHL
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sFc
+tjX
+tCe
+tCe
+tCe
+tCe
+tCe
+tCe
+tjX
+vQS
+xZv
+wLp
+wLs
+wLs
+xtG
+wMg
+yew
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+kok
+fys
+fys
+cIQ
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(139,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+sEo
+tkR
+tkR
+tkR
+tkR
+tkR
+tkR
+tkR
+tkR
+tBC
+wlS
+wMg
+wMg
+xeF
+xuj
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
+(140,1,1) = {"
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+pQc
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+xZv
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+nfd
+"}
diff --git a/maps/redgate/fantasy_dungeon.dmm b/maps/redgate/fantasy_dungeon.dmm
index 02cbdea6c8..96aef51a37 100644
--- a/maps/redgate/fantasy_dungeon.dmm
+++ b/maps/redgate/fantasy_dungeon.dmm
@@ -559,10 +559,7 @@
/turf/simulated/floor/wmarble,
/area/redgate/fantasy/dungeon)
"me" = (
-/mob/living/simple_mob/vore/demon/engorge{
- ai_holder_type = /datum/ai_holder/simple_mob/vore;
- vore_pounce_chance = 50
- },
+/mob/living/simple_mob/vore/sonadile,
/turf/simulated/floor/cult,
/area/redgate/fantasy/dungeon)
"ml" = (
@@ -1625,14 +1622,7 @@
/turf/simulated/floor/concrete,
/area/redgate/fantasy/ratbasement)
"Hn" = (
-/mob/living/simple_mob/vore/demon{
- ai_holder_type = /datum/ai_holder/simple_mob/vore;
- harm_intent_damage = 8;
- health = 300;
- melee_damage_lower = 5;
- melee_damage_upper = 2;
- vore_pounce_chance = 50
- },
+/mob/living/simple_mob/vore/devil,
/turf/simulated/floor/cult,
/area/redgate/fantasy/dungeon)
"Hx" = (
@@ -11776,7 +11766,7 @@ kn
jI
ah
ah
-Hn
+ah
ah
Xp
hR
@@ -12346,7 +12336,7 @@ ah
ah
ah
ah
-Hn
+ah
ah
kn
kn
diff --git a/maps/redgate/jungle.dmm b/maps/redgate/jungle.dmm
index 4c5e0f0f1e..9308753680 100644
--- a/maps/redgate/jungle.dmm
+++ b/maps/redgate/jungle.dmm
@@ -728,14 +728,7 @@
/turf/simulated/shuttle/wall,
/area/redgate/jungle/westcaves)
"ik" = (
-/mob/living/simple_mob/vore/demon{
- ai_holder_type = /datum/ai_holder/simple_mob/vore;
- harm_intent_damage = 8;
- health = 300;
- melee_damage_lower = 5;
- melee_damage_upper = 2;
- vore_pounce_chance = 50
- },
+/mob/living/simple_mob/vore/devil,
/turf/simulated/floor/gorefloor,
/area/redgate/jungle/temple)
"il" = (
@@ -3510,13 +3503,6 @@
},
/turf/simulated/floor/outdoors/grass/forest,
/area/redgate/jungle/aboveground)
-"PG" = (
-/mob/living/simple_mob/vore/demon/engorge{
- ai_holder_type = /datum/ai_holder/simple_mob/vore;
- vore_pounce_chance = 50
- },
-/turf/simulated/floor/gorefloor2,
-/area/redgate/jungle/temple)
"PK" = (
/obj/item/weapon/bedsheet/pillow,
/turf/simulated/mineral/floor/cave,
@@ -9402,7 +9388,7 @@ Ji
Ji
pL
GT
-ik
+GT
GT
GT
rI
@@ -9545,7 +9531,7 @@ Ji
ue
GT
GT
-GT
+ik
GT
rI
rI
@@ -9689,7 +9675,7 @@ GT
GT
GT
rI
-PG
+rI
rI
pL
pL
diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm
index afafa0fa2f..944baf45ec 100644
--- a/maps/stellar_delight/stellar_delight1.dmm
+++ b/maps/stellar_delight/stellar_delight1.dmm
@@ -15656,13 +15656,6 @@
/turf/simulated/floor,
/area/stellardelight/deck1/explobriefing)
"Hf" = (
-/obj/machinery/door/airlock/angled_bay/standard/glass{
- dir = 4;
- door_color = "#333333";
- name = "Auxiliary EVA Equipment Room";
- req_one_access = list(18,19,43);
- stripe_color = "#5a19a8"
- },
/obj/structure/cable/green{
color = "#42038a";
icon_state = "1-2"
@@ -15671,6 +15664,12 @@
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
/obj/structure/disposalpipe/segment,
/obj/machinery/door/firedoor/glass,
+/obj/machinery/door/airlock/angled_bay/hatch{
+ door_color = "#333333";
+ name = "Auxiliary EVA Equipment";
+ req_one_access = list(18,19,43);
+ stripe_color = "#5a19a8"
+ },
/turf/simulated/floor,
/area/stellardelight/deck1/exploequipment)
"Hg" = (
diff --git a/maps/stellar_delight/stellar_delight_defines.dm b/maps/stellar_delight/stellar_delight_defines.dm
index 6393c600ff..450a72379d 100644
--- a/maps/stellar_delight/stellar_delight_defines.dm
+++ b/maps/stellar_delight/stellar_delight_defines.dm
@@ -181,7 +181,8 @@
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town"),
list("Redgate - Laserdome"),
list("Redgate - Cascading Falls"),
- list("Redgate - Jungle Underground", "Redgate - Jungle")
+ list("Redgate - Jungle Underground", "Redgate - Jungle"),
+ list("Redgate - Facility")
)
ai_shell_restricted = TRUE
diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm
index 88f85e616e..4afd2103c2 100644
--- a/maps/tether/tether_defines.dm
+++ b/maps/tether/tether_defines.dm
@@ -211,7 +211,8 @@
list("Redgate - Fantasy Dungeon", "Redgate - Fantasy Town"),
list("Redgate - Laserdome"),
list("Redgate - Cascading Falls"),
- list("Redgate - Jungle Underground", "Redgate - Jungle")
+ list("Redgate - Jungle Underground", "Redgate - Jungle"),
+ list("Redgate - Facility")
)
ai_shell_restricted = TRUE
diff --git a/sound/effects/plop.ogg b/sound/effects/plop.ogg
new file mode 100644
index 0000000000..11f138e24c
Binary files /dev/null and b/sound/effects/plop.ogg differ
diff --git a/tgui/packages/common/type-utils.ts b/tgui/packages/common/type-utils.ts
new file mode 100644
index 0000000000..a73c0c1d59
--- /dev/null
+++ b/tgui/packages/common/type-utils.ts
@@ -0,0 +1,41 @@
+/**
+ * Helps visualize highly complex ui data on the fly.
+ * @example
+ * ```tsx
+ * const { data } = useBackend();
+ * logger.log(getShallowTypes(data));
+ * ```
+ */
+export function getShallowTypes(
+ data: Record,
+): Record {
+ const output = {};
+
+ for (const key in data) {
+ if (Array.isArray(data[key])) {
+ const arr: any[] = data[key];
+
+ // Return the first array item if it exists
+ if (data[key].length > 0) {
+ output[key] = arr[0];
+ continue;
+ }
+
+ output[key] = 'emptyarray';
+ } else if (typeof data[key] === 'object' && data[key] !== null) {
+ // Please inspect it further and make a new type for it
+ output[key] = 'object (inspect) || Record';
+ } else if (typeof data[key] === 'number') {
+ const num = Number(data[key]);
+
+ // 0 and 1 could be booleans from byond
+ if (num === 1 || num === 0) {
+ output[key] = `${num}, BooleanLike?`;
+ continue;
+ }
+ output[key] = data[key];
+ }
+ }
+
+ return output;
+}
diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx b/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx
index 903dacf284..f101d7da03 100644
--- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx
+++ b/tgui/packages/tgui-panel/audio/NowPlayingWidget.jsx
@@ -7,6 +7,7 @@
import { toFixed } from 'common/math';
import { useDispatch, useSelector } from 'tgui/backend';
import { Button, Collapsible, Flex, Knob, Section } from 'tgui/components';
+
import { useSettings } from '../settings';
import { selectAudio } from './selectors';
diff --git a/tgui/packages/tgui-panel/chat/middleware.js b/tgui/packages/tgui-panel/chat/middleware.js
index 57dab303b5..f1745b353b 100644
--- a/tgui/packages/tgui-panel/chat/middleware.js
+++ b/tgui/packages/tgui-panel/chat/middleware.js
@@ -170,7 +170,7 @@ export const chatMiddleware = (store) => {
settings.interleaveColor,
);
// Load the chat once settings are loaded
- if (!initialized && settings.initialized) {
+ if (!initialized && (settings.initialized || settings.firstLoad)) {
initialized = true;
setInterval(() => {
saveChatToStorage(store);
diff --git a/tgui/packages/tgui-panel/chat/renderer.jsx b/tgui/packages/tgui-panel/chat/renderer.jsx
index 1461491b4f..37538350ff 100644
--- a/tgui/packages/tgui-panel/chat/renderer.jsx
+++ b/tgui/packages/tgui-panel/chat/renderer.jsx
@@ -88,6 +88,11 @@ const interleaveMessage = (node, interleave, color) => {
return node;
};
+const stripNewLineFlood = (text) => {
+ text = text.replace(/((\n)\2{2})\2+/g, '$1');
+ return text;
+};
+
const createReconnectedNode = () => {
const node = document.createElement('div');
node.className = 'Chat__reconnected';
@@ -507,12 +512,14 @@ class ChatRenderer {
node = createMessageNode();
// Payload is plain text
if (message.text) {
+ message.text = stripNewLineFlood(message.text); // Do not allow more than 3 new lines in a row
node.textContent = this.prependTimestamps
? getChatTimestamp(message) + message.text
: message.text;
}
// Payload is HTML
else if (message.html) {
+ message.html = stripNewLineFlood(message.html); // Do not allow more than 3 new lines in a row
node.innerHTML = this.prependTimestamps
? getChatTimestamp(message) + message.html
: message.html;
diff --git a/tgui/packages/tgui-panel/settings/reducer.js b/tgui/packages/tgui-panel/settings/reducer.js
index cf5467831c..c34ccf554a 100644
--- a/tgui/packages/tgui-panel/settings/reducer.js
+++ b/tgui/packages/tgui-panel/settings/reducer.js
@@ -57,6 +57,7 @@ const initialState = {
exportEnd: 0,
lastId: null,
initialized: false,
+ firstLoad: false,
storedTypes: {},
hideImportantInAdminTab: false,
interleave: false,
@@ -82,6 +83,7 @@ export const settingsReducer = (state = initialState, action) => {
if (type === loadSettings.type) {
// Validate version and/or migrate state
if (!payload?.version) {
+ state.firstLoad = true;
return state;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index a92d02427c..e39563df93 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -1235,6 +1235,24 @@ $border-width-px: $border-width * 1px;
flex-direction: column;
}
+.ooc_alert {
+ background: #4d4100;
+ border: 1px solid #cca300;
+ margin: 0.5em;
+ padding: 0.5em 0.5em 0.5em 0.2em;
+ color: #ffffff;
+ font-weight: bold;
+ display: flex;
+ flex-direction: column;
+}
+
+.ooc_announcement_text {
+ color: #cca300;
+ padding: 0.5em 0 0 0.35em;
+ display: flex;
+ flex-direction: column;
+}
+
@each $color-name, $color-value in $alert-stripe-colors {
.chat_alert_#{$color-name} {
color: #ffffff;
@@ -1400,4 +1418,5 @@ $border-width-px: $border-width * 1px;
font-size: 150%;
font-weight: bold;
font-family: 'Gabriola', cursive, sans-serif;
+ line-height: 0.3;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 5d83c32be2..749da15f90 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -1262,6 +1262,24 @@ $border-width-px: $border-width * 1px;
flex-direction: column;
}
+.ooc_alert {
+ background: #bdc8ff;
+ border: 1px solid #002eb8;
+ margin: 0.5em;
+ padding: 0.5em 0.5em 0.5em 0.2em;
+ color: #00283a;
+ font-weight: bold;
+ display: flex;
+ flex-direction: column;
+}
+
+.ooc_announcement_text {
+ color: #002eb8;
+ padding: 0.5em 0 0 0.35em;
+ display: flex;
+ flex-direction: column;
+}
+
@each $color-name, $color-value in $alert-stripe-colors {
.chat_alert_#{$color-name} {
color: #ffffff;
@@ -1433,4 +1451,5 @@ $border-width-px: $border-width * 1px;
font-size: 150%;
font-weight: bold;
font-family: 'Gabriola', cursive, sans-serif;
+ line-height: 0.3;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss
index aa15f6ee67..ea6251931b 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss
@@ -1236,6 +1236,24 @@ $border-width-px: $border-width * 1px;
flex-direction: column;
}
+.ooc_alert {
+ background: #4d4100;
+ border: 1px solid #cca300;
+ margin: 0.5em;
+ padding: 0.5em 0.5em 0.5em 0.2em;
+ color: #ffffff;
+ font-weight: bold;
+ display: flex;
+ flex-direction: column;
+}
+
+.ooc_announcement_text {
+ color: #cca300;
+ padding: 0.5em 0 0 0.35em;
+ display: flex;
+ flex-direction: column;
+}
+
@each $color-name, $color-value in $alert-stripe-colors {
.chat_alert_#{$color-name} {
color: #ffffff;
@@ -1401,4 +1419,5 @@ $border-width-px: $border-width * 1px;
font-size: 150%;
font-weight: bold;
font-family: 'Gabriola', cursive, sans-serif;
+ line-height: 0.3;
}
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss
index 279dd7bc21..0d8f5347a3 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss
@@ -1260,6 +1260,24 @@ $border-width-px: $border-width * 1px;
flex-direction: column;
}
+.ooc_alert {
+ background: #bdc8ff;
+ border: 1px solid #002eb8;
+ margin: 0.5em;
+ padding: 0.5em 0.5em 0.5em 0.2em;
+ color: #00283a;
+ font-weight: bold;
+ display: flex;
+ flex-direction: column;
+}
+
+.ooc_announcement_text {
+ color: #002eb8;
+ padding: 0.5em 0 0 0.35em;
+ display: flex;
+ flex-direction: column;
+}
+
@each $color-name, $color-value in $alert-stripe-colors {
.chat_alert_#{$color-name} {
color: #ffffff;
@@ -1431,4 +1449,5 @@ $border-width-px: $border-width * 1px;
font-size: 150%;
font-weight: bold;
font-family: 'Gabriola', cursive, sans-serif;
+ line-height: 0.3;
}
diff --git a/tgui/packages/tgui-panel/telemetry.js b/tgui/packages/tgui-panel/telemetry.js
index 3b1eb9a950..581d32f306 100644
--- a/tgui/packages/tgui-panel/telemetry.js
+++ b/tgui/packages/tgui-panel/telemetry.js
@@ -36,6 +36,14 @@ export const telemetryMiddleware = (store) => {
Byond.sendMessage('telemetry', { connections });
return;
}
+ // For whatever reason we didn't get the telemetry, re-request
+ if (type === 'testTelemetryCommand') {
+ setTimeout(() => {
+ if (!telemetry) {
+ Byond.sendMessage('ready');
+ }
+ }, 500);
+ }
// Keep telemetry up to date
if (type === 'backend/update') {
next(action);
diff --git a/tgui/packages/tgui/backend.ts b/tgui/packages/tgui/backend.ts
index 4af2e7418c..9d10d3f41f 100644
--- a/tgui/packages/tgui/backend.ts
+++ b/tgui/packages/tgui/backend.ts
@@ -262,6 +262,8 @@ type BackendState = {
status: number;
interface: string;
refreshing: boolean;
+ map: string; // Vorestation Add
+ mapZLevel: number; // Vorestation Add
window: {
key: string;
size: [number, number];
diff --git a/tgui/packages/tgui/components/Collapsible.tsx b/tgui/packages/tgui/components/Collapsible.tsx
index b470ed5ce6..8f53e7d92b 100644
--- a/tgui/packages/tgui/components/Collapsible.tsx
+++ b/tgui/packages/tgui/components/Collapsible.tsx
@@ -13,11 +13,12 @@ type Props = Partial<{
buttons: ReactNode;
open: boolean;
title: ReactNode;
+ child_mt: number; // Vorestation Add
}> &
BoxProps;
export function Collapsible(props: Props) {
- const { children, color, title, buttons, ...rest } = props;
+ const { children, color, title, buttons, child_mt = 1, ...rest } = props;
const [open, setOpen] = useState(props.open);
return (
@@ -38,7 +39,7 @@ export function Collapsible(props: Props) {
{buttons}
)}
- {open && {children} }
+ {open && {children} }
);
}
diff --git a/tgui/packages/tgui/components/NoticeBox.tsx b/tgui/packages/tgui/components/NoticeBox.tsx
index db4f821d6b..73abc74322 100644
--- a/tgui/packages/tgui/components/NoticeBox.tsx
+++ b/tgui/packages/tgui/components/NoticeBox.tsx
@@ -11,7 +11,7 @@ import { Box, BoxProps } from './Box';
type Props = ExclusiveProps & BoxProps;
/** You MUST use only one or none */
-type NoticeType = 'info' | 'success' | 'danger';
+type NoticeType = 'info' | 'success' | 'warning' | 'danger';
type None = {
[K in NoticeType]?: undefined;
@@ -25,12 +25,15 @@ type ExclusiveProps =
| (Omit & {
success: boolean;
})
+ | (Omit & {
+ warning: boolean;
+ })
| (Omit & {
danger: boolean;
});
export function NoticeBox(props: Props) {
- const { className, color, info, success, danger, ...rest } = props;
+ const { className, color, info, success, danger, warning, ...rest } = props;
return (
void;
rightSlot: ReactNode;
@@ -57,6 +58,7 @@ const Tab = (props: TabProps) => {
selected,
color,
icon,
+ iconSpin, // Vorestation Add
leftSlot,
rightSlot,
children,
@@ -87,7 +89,7 @@ const Tab = (props: TabProps) => {
{(canRender(leftSlot) && {leftSlot}
) ||
(!!icon && (
-
+
))}
{children}
diff --git a/tgui/packages/tgui/interfaces/AICard.jsx b/tgui/packages/tgui/interfaces/AICard.tsx
similarity index 86%
rename from tgui/packages/tgui/interfaces/AICard.jsx
rename to tgui/packages/tgui/interfaces/AICard.tsx
index 1c2125e5d7..2d4dc59ad7 100644
--- a/tgui/packages/tgui/interfaces/AICard.jsx
+++ b/tgui/packages/tgui/interfaces/AICard.tsx
@@ -1,11 +1,26 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ name: string;
+ has_ai: BooleanLike;
+ integrity: number;
+ backup_capacitor: number;
+ flushing: BooleanLike;
+ has_laws: BooleanLike;
+ laws: string[];
+ wireless: BooleanLike;
+ radio: BooleanLike;
+};
+
export const AICard = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
+ name,
has_ai,
integrity,
backup_capacitor,
@@ -16,7 +31,7 @@ export const AICard = (props) => {
radio,
} = data;
- if (has_ai === 0) {
+ if (!has_ai) {
return (
@@ -29,7 +44,7 @@ export const AICard = (props) => {
);
} else {
- let integrityColor = null; // Handles changing color of the integrity bar
+ let integrityColor: string | undefined; // Handles changing color of the integrity bar
if (integrity >= 75) {
integrityColor = 'green';
} else if (integrity >= 25) {
@@ -38,7 +53,7 @@ export const AICard = (props) => {
integrityColor = 'red';
}
- let powerColor = null;
+ let powerColor: string | undefined;
if (backup_capacitor >= 75) {
powerColor = 'green';
}
@@ -52,7 +67,7 @@ export const AICard = (props) => {
-
+
{name}
@@ -77,7 +92,7 @@ export const AICard = (props) => {
{(!!has_laws && (
{laws.map((value, key) => (
-
+
{value}
))}
diff --git a/tgui/packages/tgui/interfaces/APC.jsx b/tgui/packages/tgui/interfaces/APC.tsx
similarity index 67%
rename from tgui/packages/tgui/interfaces/APC.jsx
rename to tgui/packages/tgui/interfaces/APC.tsx
index 032e5fb8bb..9df33fc68a 100644
--- a/tgui/packages/tgui/interfaces/APC.jsx
+++ b/tgui/packages/tgui/interfaces/APC.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -12,14 +14,46 @@ import { Window } from '../layouts';
import { FullscreenNotice } from './common/FullscreenNotice';
import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox';
+type Data = {
+ gridCheck: BooleanLike;
+ failTime: number;
+ locked: BooleanLike;
+ normallyLocked: BooleanLike;
+ siliconUser: BooleanLike;
+ externalPower;
+ chargingStatus;
+ powerChannels: {
+ title: string;
+ powerLoad: number;
+ status: number;
+ topicParams: {
+ auto: Record;
+ on: Record;
+ off: Record;
+ }[];
+ };
+ powerCellStatus: number;
+ emagged: BooleanLike;
+ isOperating: BooleanLike;
+ chargeMode: BooleanLike;
+ totalCharging: number;
+ totalLoad: number;
+ coverLocked: BooleanLike;
+ nightshiftLights: BooleanLike;
+ nightshiftSetting: number;
+ emergencyLights: boolean;
+};
+
export const APC = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
+ const { gridCheck, failTime } = data;
let body = ;
- if (data.gridCheck) {
+ if (gridCheck) {
body = ;
- } else if (data.failTime) {
+ } else if (failTime) {
body = ;
}
@@ -30,7 +64,13 @@ export const APC = (props) => {
);
};
-const powerStatusMap = {
+type powerStatus = {
+ color: string;
+ externalPowerText: string;
+ chargingText: string;
+};
+
+const powerStatusMap: Record = {
2: {
color: 'good',
externalPowerText: 'External Power',
@@ -48,7 +88,10 @@ const powerStatusMap = {
},
};
-const malfMap = {
+const malfMap: Record<
+ number,
+ { icon: string; content: string; action: string }
+> = {
1: {
icon: 'terminal',
content: 'Override Programming',
@@ -72,21 +115,38 @@ const malfMap = {
};
const ApcContent = (props) => {
- const { act, data } = useBackend();
- const locked = data.locked && !data.siliconUser;
- const normallyLocked = data.normallyLocked;
- const externalPowerStatus =
- powerStatusMap[data.externalPower] || powerStatusMap[0];
- const chargingStatus =
- powerStatusMap[data.chargingStatus] || powerStatusMap[0];
- const channelArray = data.powerChannels || [];
+ const { act, data } = useBackend();
+
+ const {
+ locked,
+ siliconUser,
+ externalPower,
+ chargingStatus,
+ powerChannels,
+ powerCellStatus,
+ emagged,
+ isOperating,
+ chargeMode,
+ totalCharging,
+ totalLoad,
+ coverLocked,
+ nightshiftSetting,
+ emergencyLights,
+ } = data;
+
+ const is_locked: BooleanLike = locked && !siliconUser;
+ const externalPowerStatus: powerStatus =
+ powerStatusMap[externalPower] || powerStatusMap[0];
+ const chargingPowerStatus: powerStatus =
+ powerStatusMap[chargingStatus] || powerStatusMap[0];
+ const channelArray: any = powerChannels || [];
// const malfStatus = malfMap[data.malfStatus] || null;
- const adjustedCellChange = data.powerCellStatus / 100;
+ const adjustedCellChange: number = powerCellStatus / 100;
return (
<>
@@ -103,13 +163,13 @@ const ApcContent = (props) => {
color={externalPowerStatus.color}
buttons={
act('breaker')}
>
- {data.isOperating ? 'On' : 'Off'}
+ {isOperating ? 'On' : 'Off'}
}
>
@@ -120,19 +180,19 @@ const ApcContent = (props) => {
act('charge')}
>
- {data.chargeMode ? 'Auto' : 'Off'}
+ {chargeMode ? 'Auto' : 'Off'}
}
>
- [ {chargingStatus.chargingText} ]
+ [ {chargingPowerStatus.chargingText} ]
@@ -156,26 +216,26 @@ const ApcContent = (props) => {
act('channel', topicParams.auto)}
>
Auto
act('channel', topicParams.on)}
>
On
act('channel', topicParams.off)}
>
Off
@@ -188,12 +248,12 @@ const ApcContent = (props) => {
);
})}
- {data.totalCharging ? (
+ {totalCharging ? (
- {data.totalLoad} W (+ {data.totalCharging} W charging)
+ {totalLoad} W (+ {totalCharging} W charging)
) : (
- {data.totalLoad} W
+ {totalLoad} W
)}
@@ -213,12 +273,12 @@ const ApcContent = (props) => {
label="Cover Lock"
buttons={
act('cover')}
>
- {data.coverLocked ? 'Engaged' : 'Disengaged'}
+ {coverLocked ? 'Engaged' : 'Disengaged'}
}
/>
@@ -228,7 +288,7 @@ const ApcContent = (props) => {
<>
act('nightshift', {
nightshift: 2,
@@ -239,7 +299,7 @@ const ApcContent = (props) => {
act('nightshift', {
nightshift: 1,
@@ -250,7 +310,7 @@ const ApcContent = (props) => {
act('nightshift', {
nightshift: 3,
@@ -267,10 +327,10 @@ const ApcContent = (props) => {
buttons={
act('emergency_lighting')}
>
- {data.emergencyLights ? 'Enabled' : 'Disabled'}
+ {emergencyLights ? 'Enabled' : 'Disabled'}
}
/>
@@ -299,7 +359,9 @@ const GridCheck = (props) => {
};
const ApcFailure = (props) => {
- const { data, act } = useBackend();
+ const { data, act } = useBackend();
+
+ const { locked, siliconUser, failTime } = data;
let rebootOptions = (
act('reboot')}>
@@ -307,7 +369,7 @@ const ApcFailure = (props) => {
);
- if (data.locked && !data.siliconUser) {
+ if (locked && !siliconUser) {
rebootOptions = Swipe an ID card for manual reboot. ;
}
@@ -321,7 +383,7 @@ const ApcFailure = (props) => {
I/O regulators malfunction detected! Waiting for system reboot...
- Automatic reboot in {data.failTime} seconds...
+ Automatic reboot in {failTime} seconds...
{rebootOptions}
);
diff --git a/tgui/packages/tgui/interfaces/AccountsTerminal.jsx b/tgui/packages/tgui/interfaces/AccountsTerminal.tsx
similarity index 82%
rename from tgui/packages/tgui/interfaces/AccountsTerminal.jsx
rename to tgui/packages/tgui/interfaces/AccountsTerminal.tsx
index 9831a56063..ba2fd43bb5 100644
--- a/tgui/packages/tgui/interfaces/AccountsTerminal.jsx
+++ b/tgui/packages/tgui/interfaces/AccountsTerminal.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend, useSharedState } from '../backend';
import {
Box,
@@ -10,8 +12,36 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ id_inserted: BooleanLike;
+ id_card: string;
+ access_level: number;
+ machine_id: string;
+ creating_new_account: BooleanLike;
+ detailed_account_view: boolean;
+ station_account_number: number;
+ account_number: number | null;
+ owner_name: string | null;
+ money: number | null;
+ suspended: BooleanLike;
+ transactions: {
+ date: string;
+ time: string;
+ target_name: string;
+ purpose: string;
+ amount: number;
+ source_terminal: string;
+ }[];
+ accounts: {
+ account_number: number;
+ owner_name: string;
+ suspended: string;
+ account_index: number;
+ }[];
+};
+
export const AccountsTerminal = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { id_inserted, id_card, access_level, machine_id } = data;
@@ -41,7 +71,7 @@ export const AccountsTerminal = (props) => {
};
const AccountTerminalContent = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { creating_new_account, detailed_account_view } = data;
@@ -56,18 +86,14 @@ const AccountTerminalContent = (props) => {
Home
act('create_account')}
>
New Account
{!creating_new_account ? (
- act('print')}
- >
+ act('print')}>
Print
) : (
@@ -81,13 +107,13 @@ const AccountTerminalContent = (props) => {
};
const NewAccountView = (props) => {
- const { act } = useBackend();
+ const { act } = useBackend();
const [holder, setHolder] = useSharedState('holder', '');
const [newMoney, setMoney] = useSharedState('money', '');
return (
-
+
setHolder(val)} />
@@ -115,7 +141,7 @@ const NewAccountView = (props) => {
};
const DetailedView = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
access_level,
@@ -130,7 +156,6 @@ const DetailedView = (props) => {
return (
{
{suspended ? 'SUSPENDED' : 'Active'}
-
+
{access_level >= 2 && (
-
+
act('add_funds')}>
Add Funds
@@ -178,7 +203,7 @@ const DetailedView = (props) => {
)}
-
+
Timestamp
@@ -205,18 +230,18 @@ const DetailedView = (props) => {
};
const ListView = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { accounts } = data;
return (
-
+
{(accounts.length && (
{accounts.map((acc) => (
{
{State[state]}
{State[state] === State.open ? (
- {opened_at_date} ({Math.round((opened_at / 600) * 10) / 10}{' '}
- minutes ago.)
+ {opened_at_date +
+ ' (' +
+ toFixed(round((opened_at / 600) * 10, 0) / 10, 1) +
+ ' minutes ago.)'}
) : (
- {closed_at_date} ({Math.round((closed_at / 600) * 10) / 10}{' '}
- minutes ago.){' '}
+ {closed_at_date +
+ ' (' +
+ toFixed(round((closed_at / 600) * 10, 0) / 10, 1) +
+ ' minutes ago.)'}
act('reopen')}>Reopen
)}
diff --git a/tgui/packages/tgui/interfaces/AiAirlock.jsx b/tgui/packages/tgui/interfaces/AiAirlock.tsx
similarity index 54%
rename from tgui/packages/tgui/interfaces/AiAirlock.jsx
rename to tgui/packages/tgui/interfaces/AiAirlock.tsx
index e13cf1331b..169a0ea897 100644
--- a/tgui/packages/tgui/interfaces/AiAirlock.jsx
+++ b/tgui/packages/tgui/interfaces/AiAirlock.tsx
@@ -1,8 +1,40 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
-const dangerMap = {
+type Data = {
+ power: {
+ main: number;
+ main_timeleft: number;
+ backup: number;
+ backup_timeleft: number;
+ };
+ wires: {
+ main_1: BooleanLike;
+ main_2: BooleanLike;
+ backup_1: BooleanLike;
+ backup_2: BooleanLike;
+ shock: BooleanLike;
+ id_scanner: BooleanLike;
+ bolts: BooleanLike;
+ lights: BooleanLike;
+ safe: BooleanLike;
+ timing: BooleanLike;
+ };
+ shock: number;
+ shock_timeleft: number;
+ id_scanner: BooleanLike;
+ lights: BooleanLike;
+ locked: BooleanLike;
+ safe: BooleanLike;
+ speed: BooleanLike;
+ opened: BooleanLike;
+ welded: BooleanLike;
+};
+
+const dangerMap: Record = {
2: {
color: 'good',
localStatusText: 'Optimal',
@@ -18,10 +50,25 @@ const dangerMap = {
};
export const AiAirlock = (props) => {
- const { act, data } = useBackend();
- const statusMain = dangerMap[data.power.main] || dangerMap[0];
- const statusBackup = dangerMap[data.power.backup] || dangerMap[0];
- const statusElectrify = dangerMap[data.shock] || dangerMap[0];
+ const { act, data } = useBackend();
+
+ const {
+ power,
+ wires,
+ shock,
+ shock_timeleft,
+ id_scanner,
+ lights,
+ locked,
+ safe,
+ speed,
+ opened,
+ welded,
+ } = data;
+
+ const statusMain = dangerMap[power.main] || dangerMap[0];
+ const statusBackup = dangerMap[power.backup] || dangerMap[0];
+ const statusElectrify = dangerMap[shock] || dangerMap[0];
return (
@@ -33,18 +80,16 @@ export const AiAirlock = (props) => {
buttons={
act('disrupt-main')}
>
Disrupt
}
>
- {data.power.main ? 'Online' : 'Offline'}{' '}
- {((!data.wires.main_1 || !data.wires.main_2) &&
- '[Wires have been cut!]') ||
- (data.power.main_timeleft > 0 &&
- `[${data.power.main_timeleft}s]`)}
+ {power.main ? 'Online' : 'Offline'}{' '}
+ {((!wires.main_1 || !wires.main_2) && '[Wires have been cut!]') ||
+ (power.main_timeleft > 0 && `[${power.main_timeleft}s]`)}
{
buttons={
act('disrupt-backup')}
>
Disrupt
}
>
- {data.power.backup ? 'Online' : 'Offline'}{' '}
- {((!data.wires.backup_1 || !data.wires.backup_2) &&
+ {power.backup ? 'Online' : 'Offline'}{' '}
+ {((!wires.backup_1 || !wires.backup_2) &&
'[Wires have been cut!]') ||
- (data.power.backup_timeleft > 0 &&
- `[${data.power.backup_timeleft}s]`)}
+ (power.backup_timeleft > 0 && `[${power.backup_timeleft}s]`)}
{
<>
act('shock-restore')}
>
Restore
act('shock-temp')}
>
Temporary
act('shock-perm')}
>
Permanent
@@ -94,10 +138,10 @@ export const AiAirlock = (props) => {
>
}
>
- {data.shock === 2 ? 'Safe' : 'Electrified'}{' '}
- {(!data.wires.shock && '[Wires have been cut!]') ||
- (data.shock_timeleft > 0 && `[${data.shock_timeleft}s]`) ||
- (data.shock_timeleft === -1 && '[Permanent]')}
+ {shock === 2 ? 'Safe' : 'Electrified'}{' '}
+ {(!wires.shock && '[Wires have been cut!]') ||
+ (shock_timeleft > 0 && `[${shock_timeleft}s]`) ||
+ (shock_timeleft === -1 && '[Permanent]')}
@@ -108,16 +152,16 @@ export const AiAirlock = (props) => {
color="bad"
buttons={
act('idscan-toggle')}
>
- {data.id_scanner ? 'Enabled' : 'Disabled'}
+ {id_scanner ? 'Enabled' : 'Disabled'}
}
>
- {!data.wires.id_scanner && '[Wires have been cut!]'}
+ {!wires.id_scanner && '[Wires have been cut!]'}
{
color="bad"
buttons={
act('bolt-toggle')}
>
- {data.locked ? 'Lowered' : 'Raised'}
+ {locked ? 'Lowered' : 'Raised'}
}
>
- {!data.wires.bolts && '[Wires have been cut!]'}
+ {!wires.bolts && '[Wires have been cut!]'}
act('light-toggle')}
>
- {data.lights ? 'Enabled' : 'Disabled'}
+ {lights ? 'Enabled' : 'Disabled'}
}
>
- {!data.wires.lights && '[Wires have been cut!]'}
+ {!wires.lights && '[Wires have been cut!]'}
act('safe-toggle')}
>
- {data.safe ? 'Enabled' : 'Disabled'}
+ {safe ? 'Enabled' : 'Disabled'}
}
>
- {!data.wires.safe && '[Wires have been cut!]'}
+ {!wires.safe && '[Wires have been cut!]'}
act('speed-toggle')}
>
- {data.speed ? 'Enabled' : 'Disabled'}
+ {speed ? 'Enabled' : 'Disabled'}
}
>
- {!data.wires.timing && '[Wires have been cut!]'}
+ {!wires.timing && '[Wires have been cut!]'}
{
color="bad"
buttons={
act('open-close')}
>
- {data.opened ? 'Open' : 'Closed'}
+ {opened ? 'Open' : 'Closed'}
}
>
- {!!(data.locked || data.welded) && (
+ {!!(locked || welded) && (
- [Door is {data.locked ? 'bolted' : ''}
- {data.locked && data.welded ? ' and ' : ''}
- {data.welded ? 'welded' : ''}!]
+ [Door is {locked ? 'bolted' : ''}
+ {locked && welded ? ' and ' : ''}
+ {welded ? 'welded' : ''}!]
)}
diff --git a/tgui/packages/tgui/interfaces/AiRestorer.jsx b/tgui/packages/tgui/interfaces/AiRestorer.tsx
similarity index 87%
rename from tgui/packages/tgui/interfaces/AiRestorer.jsx
rename to tgui/packages/tgui/interfaces/AiRestorer.tsx
index c6b4c81cca..7db847a58c 100644
--- a/tgui/packages/tgui/interfaces/AiRestorer.jsx
+++ b/tgui/packages/tgui/interfaces/AiRestorer.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -9,6 +11,17 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ AI_present: boolean;
+ error: string | null;
+ name: string;
+ laws: string[];
+ isDead: boolean;
+ restoring: BooleanLike;
+ health: number;
+ ejectable: boolean;
+};
+
export const AiRestorer = () => {
return (
@@ -20,7 +33,7 @@ export const AiRestorer = () => {
};
export const AiRestorerContent = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
AI_present,
error,
@@ -81,7 +94,7 @@ export const AiRestorerContent = (props) => {
>
Begin Reconstruction
-
+
{laws.map((law) => (
{law}
diff --git a/tgui/packages/tgui/interfaces/AiSupermatter.jsx b/tgui/packages/tgui/interfaces/AiSupermatter.tsx
similarity index 87%
rename from tgui/packages/tgui/interfaces/AiSupermatter.jsx
rename to tgui/packages/tgui/interfaces/AiSupermatter.tsx
index 0e8105c65c..bf46960446 100644
--- a/tgui/packages/tgui/interfaces/AiSupermatter.jsx
+++ b/tgui/packages/tgui/interfaces/AiSupermatter.tsx
@@ -1,13 +1,21 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Icon, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
import { FullscreenNotice } from './common/FullscreenNotice';
-export const AiSupermatter = (props) => {
- const { data } = useBackend();
+type Data = {
+ detonating: BooleanLike;
+ integrity_percentage: number;
+ ambient_temp: number;
+ ambient_pressure: number;
+};
- const { integrity_percentage, ambient_temp, ambient_pressure, detonating } =
- data;
+export const AiSupermatter = (props) => {
+ const { data } = useBackend();
+
+ const { detonating } = data;
let body = ;
if (detonating) {
@@ -38,7 +46,7 @@ const AiSupermatterDetonation = (props) => (
);
const AiSupermatterContent = (props) => {
- const { data } = useBackend();
+ const { data } = useBackend();
const { integrity_percentage, ambient_temp, ambient_pressure } = data;
diff --git a/tgui/packages/tgui/interfaces/AirAlarm.jsx b/tgui/packages/tgui/interfaces/AirAlarm.tsx
similarity index 78%
rename from tgui/packages/tgui/interfaces/AirAlarm.jsx
rename to tgui/packages/tgui/interfaces/AirAlarm.tsx
index 451c1c1b61..ebdbdaf331 100644
--- a/tgui/packages/tgui/interfaces/AirAlarm.jsx
+++ b/tgui/packages/tgui/interfaces/AirAlarm.tsx
@@ -1,4 +1,5 @@
import { toFixed } from 'common/math';
+import { BooleanLike } from 'common/react';
import { Fragment, useState } from 'react';
import { useBackend } from '../backend';
@@ -6,10 +7,57 @@ import { Box, Button, LabeledList, Section } from '../components';
import { getGasColor, getGasLabel } from '../constants';
import { Window } from '../layouts';
import { Scrubber, Vent } from './common/AtmosControls';
+import { single_scrubber, single_vent } from './common/CommonTypes';
import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox';
+type Data = {
+ locked: BooleanLike;
+ siliconUser: BooleanLike;
+ remoteUser: BooleanLike;
+ environment_data: {
+ name: string;
+ value: number;
+ unit: string;
+ danger_level: number;
+ }[];
+ danger_level: number;
+ target_temperature: string;
+ rcon: number;
+ atmos_alarm: BooleanLike;
+ fire_alarm: BooleanLike;
+ emagged: BooleanLike; // Seems unused
+ mode: number;
+ thresholds: thresholds[];
+ scrubbers: single_scrubber[];
+ vents: single_vent[];
+ modes: {
+ name: string;
+ mode: number;
+ selected: BooleanLike;
+ danger: BooleanLike;
+ }[];
+};
+
+type thresholds = {
+ name: string;
+ settings: {
+ env: string;
+ val: number;
+ selected: {
+ oxygen: number[];
+ carbon_dioxide: number;
+ phoron: number;
+ other: number;
+ pressure: number;
+ temperature: number;
+ };
+ }[];
+};
+
export const AirAlarm = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
+ const { locked, siliconUser, remoteUser } = data;
const [screen, setScreen] = useState('');
@@ -17,14 +65,14 @@ export const AirAlarm = (props) => {
setScreen(value);
}
- const locked = data.locked && !data.siliconUser && !data.remoteUser;
+ const is_locked: BooleanLike = locked && !siliconUser && !remoteUser;
return (
- {!locked && (
+ {!is_locked && (
)}
@@ -33,24 +81,28 @@ export const AirAlarm = (props) => {
};
const AirAlarmStatus = (props) => {
- const { data } = useBackend();
- const entries = (data.environment_data || []).filter(
+ const { data } = useBackend();
+
+ const { environment_data, atmos_alarm, fire_alarm, emagged } = data;
+
+ const entries = (environment_data || []).filter(
(entry) => entry.value >= 0.01,
);
- const dangerMap = {
- 0: {
- color: 'good',
- localStatusText: 'Optimal',
- },
- 1: {
- color: 'average',
- localStatusText: 'Caution',
- },
- 2: {
- color: 'bad',
- localStatusText: 'Danger (Internals Required)',
- },
- };
+ const dangerMap: Record =
+ {
+ 0: {
+ color: 'good',
+ localStatusText: 'Optimal',
+ },
+ 1: {
+ color: 'average',
+ localStatusText: 'Caution',
+ },
+ 2: {
+ color: 'bad',
+ localStatusText: 'Danger (Internals Required)',
+ },
+ };
const localStatus = dangerMap[data.danger_level] || dangerMap[0];
return (
@@ -75,10 +127,10 @@ const AirAlarmStatus = (props) => {
- {(data.atmos_alarm && 'Atmosphere Alarm') ||
- (data.fire_alarm && 'Fire Alarm') ||
+ {(atmos_alarm && 'Atmosphere Alarm') ||
+ (fire_alarm && 'Fire Alarm') ||
'Nominal'}
>
@@ -87,7 +139,7 @@ const AirAlarmStatus = (props) => {
Cannot obtain air sample for analysis.
)}
- {!!data.emagged && (
+ {!!emagged && (
Safety measures offline. Device may exhibit abnormal behavior.
@@ -98,7 +150,7 @@ const AirAlarmStatus = (props) => {
};
const AirAlarmUnlockedControl = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { target_temperature, rcon } = data;
return (
@@ -179,7 +231,7 @@ const AirAlarmControl = (props) => {
// --------------------------------------------------------
const AirAlarmControlHome = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { mode, atmos_alarm } = data;
return (
<>
@@ -226,7 +278,7 @@ const AirAlarmControlHome = (props) => {
// --------------------------------------------------------
const AirAlarmControlVents = (props) => {
- const { data } = useBackend();
+ const { data } = useBackend();
const { vents } = data;
if (!vents || vents.length === 0) {
return 'Nothing to show';
@@ -238,7 +290,7 @@ const AirAlarmControlVents = (props) => {
// --------------------------------------------------------
const AirAlarmControlScrubbers = (props) => {
- const { data } = useBackend();
+ const { data } = useBackend();
const { scrubbers } = data;
if (!scrubbers || scrubbers.length === 0) {
return 'Nothing to show';
@@ -252,7 +304,7 @@ const AirAlarmControlScrubbers = (props) => {
// --------------------------------------------------------
const AirAlarmControlModes = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { modes } = data;
if (!modes || modes.length === 0) {
return 'Nothing to show';
@@ -276,7 +328,7 @@ const AirAlarmControlModes = (props) => {
// --------------------------------------------------------
const AirAlarmControlThresholds = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { thresholds } = data;
return (
diff --git a/tgui/packages/tgui/interfaces/AlgaeFarm.jsx b/tgui/packages/tgui/interfaces/AlgaeFarm.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/AlgaeFarm.jsx
rename to tgui/packages/tgui/interfaces/AlgaeFarm.tsx
index a8a219f82d..3774fdd5ce 100644
--- a/tgui/packages/tgui/interfaces/AlgaeFarm.jsx
+++ b/tgui/packages/tgui/interfaces/AlgaeFarm.tsx
@@ -12,8 +12,28 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ usePower: number;
+ materials: {
+ name: string;
+ display: string;
+ qty: number;
+ max: number;
+ percent: number;
+ }[];
+ last_flow_rate: number;
+ last_power_draw: number;
+ inputDir: string;
+ outputDir: string;
+ input: gas;
+ output: gas;
+ errorText: string | null;
+};
+
+type gas = { pressure: number; name: string; percent: number; moles: number };
+
export const AlgaeFarm = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
usePower,
materials,
@@ -31,7 +51,7 @@ export const AlgaeFarm = (props) => {
{errorText && (
-
+
{errorText}
diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger.jsx b/tgui/packages/tgui/interfaces/AppearanceChanger.jsx
deleted file mode 100644
index 9a7d0fb83b..0000000000
--- a/tgui/packages/tgui/interfaces/AppearanceChanger.jsx
+++ /dev/null
@@ -1,523 +0,0 @@
-import { sortBy } from 'common/collections';
-import { capitalize, decodeHtmlEntities } from 'common/string';
-import { useState } from 'react';
-
-import { useBackend } from '../backend';
-import {
- Box,
- Button,
- ByondUi,
- ColorBox,
- Flex,
- LabeledList,
- Section,
- Tabs,
-} from '../components';
-import { Window } from '../layouts';
-
-export const AppearanceChanger = (props) => {
- const { act, config, data } = useBackend();
-
- const {
- name,
- specimen,
- gender,
- gender_id,
- hair_style,
- facial_hair_style,
- ear_style,
- tail_style,
- wing_style,
- markings,
- change_race,
- change_gender,
- change_eye_color,
- change_skin_tone,
- change_skin_color,
- change_hair_color,
- change_facial_hair_color,
- change_hair,
- change_facial_hair,
- mapRef,
- } = data;
-
- const { title } = config;
-
- const change_color =
- change_eye_color ||
- change_skin_tone ||
- change_skin_color ||
- change_hair_color ||
- change_facial_hair_color;
-
- let firstAccesibleTab = -1;
- if (change_race) {
- firstAccesibleTab = 0;
- } else if (change_gender) {
- firstAccesibleTab = 1;
- } else if (change_color) {
- firstAccesibleTab = 2;
- } else if (change_hair) {
- firstAccesibleTab = 4;
- } else if (change_facial_hair) {
- firstAccesibleTab = 5;
- }
-
- const [tabIndex, setTabIndex] = useState(firstAccesibleTab);
-
- return (
-
-
-
-
-
-
- {name}
-
- {specimen}
-
-
- {gender ? capitalize(gender) : 'Not Set'}
-
-
- {gender_id ? capitalize(gender_id) : 'Not Set'}
-
-
- {hair_style ? capitalize(hair_style) : 'Not Set'}
-
-
- {facial_hair_style
- ? capitalize(facial_hair_style)
- : 'Not Set'}
-
-
- {ear_style ? capitalize(ear_style) : 'Not Set'}
-
-
- {tail_style ? capitalize(tail_style) : 'Not Set'}
-
-
- {wing_style ? capitalize(wing_style) : 'Not Set'}
-
-
-
-
-
-
-
-
-
- {change_race ? (
- setTabIndex(0)}>
- Race
-
- ) : null}
- {change_gender ? (
- setTabIndex(1)}>
- Gender & Sex
-
- ) : null}
- {change_color ? (
- setTabIndex(2)}>
- Colors
-
- ) : null}
- {change_hair ? (
- <>
- setTabIndex(3)}
- >
- Hair
-
- setTabIndex(5)}
- >
- Ear
-
- setTabIndex(6)}
- >
- Tail
-
- setTabIndex(7)}
- >
- Wing
-
- setTabIndex(8)}
- >
- Markings
-
- >
- ) : null}
- {change_facial_hair ? (
- setTabIndex(4)}>
- Facial Hair
-
- ) : null}
-
-
- {change_race && tabIndex === 0 ? : null}
- {change_gender && tabIndex === 1 ? : null}
- {change_color && tabIndex === 2 ? : null}
- {change_hair && tabIndex === 3 ? : null}
- {change_facial_hair && tabIndex === 4 ? (
-
- ) : null}
- {change_hair && tabIndex === 5 ? : null}
- {change_hair && tabIndex === 6 ? : null}
- {change_hair && tabIndex === 7 ? : null}
- {change_hair && tabIndex === 8 ? : null}
-
-
-
- );
-};
-
-const AppearanceChangerSpecies = (props) => {
- const { act, data } = useBackend();
- const { species, specimen } = data;
-
- const sortedSpecies = sortBy((val) => val.specimen)(species || []);
-
- return (
-
- {sortedSpecies.map((spec) => (
- act('race', { race: spec.specimen })}
- >
- {spec.specimen}
-
- ))}
-
- );
-};
-
-const AppearanceChangerGender = (props) => {
- const { act, data } = useBackend();
-
- const { gender, gender_id, genders, id_genders } = data;
-
- return (
-
-
-
- {genders.map((g) => (
- act('gender', { gender: g.gender_key })}
- >
- {g.gender_name}
-
- ))}
-
-
- {id_genders.map((g) => (
- act('gender_id', { gender_id: g.gender_key })}
- >
- {g.gender_name}
-
- ))}
-
-
-
- );
-};
-
-const AppearanceChangerColors = (props) => {
- const { act, data } = useBackend();
-
- const {
- change_eye_color,
- change_skin_tone,
- change_skin_color,
- change_hair_color,
- change_facial_hair_color,
- eye_color,
- skin_color,
- hair_color,
- facial_hair_color,
- ears_color,
- ears2_color,
- tail_color,
- tail2_color,
- wing_color,
- wing2_color,
- } = data;
-
- return (
-
- {change_eye_color ? (
-
-
- act('eye_color')}>Change Eye Color
-
- ) : null}
- {change_skin_tone ? (
-
- act('skin_tone')}>Change Skin Tone
-
- ) : null}
- {change_skin_color ? (
-
-
- act('skin_color')}>Change Skin Color
-
- ) : null}
- {change_hair_color ? (
- <>
-
-
- act('hair_color')}>Change Hair Color
-
-
-
- act('ears_color')}>Change Ears Color
-
-
-
- act('ears2_color')}>
- Change Secondary Ears Color
-
-
-
-
- act('tail_color')}>Change Tail Color
-
-
-
- act('tail2_color')}>
- Change Secondary Tail Color
-
-
-
-
- act('wing_color')}>Change Wing Color
-
-
-
- act('wing2_color')}>
- Change Secondary Wing Color
-
-
- >
- ) : null}
- {change_facial_hair_color ? (
-
-
- act('facial_hair_color')}>
- Change Facial Hair Color
-
-
- ) : null}
-
- );
-};
-
-const AppearanceChangerHair = (props) => {
- const { act, data } = useBackend();
-
- const { hair_style, hair_styles } = data;
-
- return (
-
- {hair_styles.map((hair) => (
- act('hair', { hair: hair.hairstyle })}
- selected={hair.hairstyle === hair_style}
- >
- {hair.hairstyle}
-
- ))}
-
- );
-};
-
-const AppearanceChangerFacialHair = (props) => {
- const { act, data } = useBackend();
-
- const { facial_hair_style, facial_hair_styles } = data;
-
- return (
-
- {facial_hair_styles.map((hair) => (
-
- act('facial_hair', { facial_hair: hair.facialhairstyle })
- }
- selected={hair.facialhairstyle === facial_hair_style}
- >
- {hair.facialhairstyle}
-
- ))}
-
- );
-};
-
-const AppearanceChangerEars = (props) => {
- const { act, data } = useBackend();
-
- const { ear_style, ear_styles } = data;
-
- return (
-
- act('ear', { clear: true })}
- selected={ear_style === null}
- >
- -- Not Set --
-
- {sortBy((e) => e.name.toLowerCase())(ear_styles).map((ear) => (
- act('ear', { ref: ear.instance })}
- selected={ear.name === ear_style}
- >
- {ear.name}
-
- ))}
-
- );
-};
-
-const AppearanceChangerTails = (props) => {
- const { act, data } = useBackend();
-
- const { tail_style, tail_styles } = data;
-
- return (
-
- act('tail', { clear: true })}
- selected={tail_style === null}
- >
- -- Not Set --
-
- {sortBy((e) => e.name.toLowerCase())(tail_styles).map((tail) => (
- act('tail', { ref: tail.instance })}
- selected={tail.name === tail_style}
- >
- {tail.name}
-
- ))}
-
- );
-};
-
-const AppearanceChangerWings = (props) => {
- const { act, data } = useBackend();
-
- const { wing_style, wing_styles } = data;
-
- return (
-
- act('wing', { clear: true })}
- selected={wing_style === null}
- >
- -- Not Set --
-
- {sortBy((e) => e.name.toLowerCase())(wing_styles).map((wing) => (
- act('wing', { ref: wing.instance })}
- selected={wing.name === wing_style}
- >
- {wing.name}
-
- ))}
-
- );
-};
-
-const AppearanceChangerMarkings = (props) => {
- const { act, data } = useBackend();
-
- const { markings } = data;
-
- return (
-
-
- act('marking', { todo: 1, name: 'na' })}>
- Add Marking
-
-
-
- {markings.map((m) => (
-
-
- act('marking', { todo: 4, name: m.marking_name })}
- >
- Change Color
-
- act('marking', { todo: 0, name: m.marking_name })}
- >
- -
-
- act('marking', { todo: 3, name: m.marking_name })}
- >
- Move down
-
- act('marking', { todo: 2, name: m.marking_name })}
- >
- Move up
-
-
- ))}
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx
new file mode 100644
index 0000000000..66cfcbb886
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerBody.tsx
@@ -0,0 +1,139 @@
+import { sortBy } from 'common/collections';
+
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section } from '../../components';
+import { Data, species, styles } from './types';
+
+export const AppearanceChangerSpecies = (props) => {
+ const { act, data } = useBackend();
+ const { species, specimen } = data;
+
+ const sortedSpecies = sortBy((val: species) => val.specimen)(species || []);
+
+ return (
+
+ {sortedSpecies.map((spec) => (
+ act('race', { race: spec.specimen })}
+ >
+ {spec.specimen}
+
+ ))}
+
+ );
+};
+
+export const AppearanceChangerGender = (props) => {
+ const { act, data } = useBackend();
+
+ const { gender, gender_id, genders, id_genders } = data;
+
+ return (
+
+
+
+ {genders.map((g) => (
+ act('gender', { gender: g.gender_key })}
+ >
+ {g.gender_name}
+
+ ))}
+
+
+ {id_genders.map((g) => (
+ act('gender_id', { gender_id: g.gender_key })}
+ >
+ {g.gender_name}
+
+ ))}
+
+
+
+ );
+};
+
+export const AppearanceChangerEars = (props) => {
+ const { act, data } = useBackend();
+
+ const { ear_style, ear_styles } = data;
+
+ return (
+
+ act('ear', { clear: true })}
+ selected={ear_style === null}
+ >
+ -- Not Set --
+
+ {sortBy((e: styles) => e.name.toLowerCase())(ear_styles).map((ear) => (
+ act('ear', { ref: ear.instance })}
+ selected={ear.name === ear_style}
+ >
+ {ear.name}
+
+ ))}
+
+ );
+};
+
+export const AppearanceChangerTails = (props) => {
+ const { act, data } = useBackend();
+
+ const { tail_style, tail_styles } = data;
+
+ return (
+
+ act('tail', { clear: true })}
+ selected={tail_style === null}
+ >
+ -- Not Set --
+
+ {sortBy((e: styles) => e.name.toLowerCase())(tail_styles).map((tail) => (
+ act('tail', { ref: tail.instance })}
+ selected={tail.name === tail_style}
+ >
+ {tail.name}
+
+ ))}
+
+ );
+};
+
+export const AppearanceChangerWings = (props) => {
+ const { act, data } = useBackend();
+
+ const { wing_style, wing_styles } = data;
+
+ return (
+
+ act('wing', { clear: true })}
+ selected={wing_style === null}
+ >
+ -- Not Set --
+
+ {sortBy((e: styles) => e.name.toLowerCase())(wing_styles).map((wing) => (
+ act('wing', { ref: wing.instance })}
+ selected={wing.name === wing_style}
+ >
+ {wing.name}
+
+ ))}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx
new file mode 100644
index 0000000000..c5d2f403b7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerDetails.tsx
@@ -0,0 +1,142 @@
+import { useBackend } from '../../backend';
+import { Box, Button, ColorBox, LabeledList, Section } from '../../components';
+import { Data } from './types';
+
+export const AppearanceChangerColors = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ change_eye_color,
+ change_skin_tone,
+ change_skin_color,
+ change_hair_color,
+ change_facial_hair_color,
+ eye_color,
+ skin_color,
+ hair_color,
+ facial_hair_color,
+ ears_color,
+ ears2_color,
+ tail_color,
+ tail2_color,
+ wing_color,
+ wing2_color,
+ } = data;
+
+ return (
+
+ {change_eye_color ? (
+
+
+ act('eye_color')}>Change Eye Color
+
+ ) : (
+ ''
+ )}
+ {change_skin_tone ? (
+
+ act('skin_tone')}>Change Skin Tone
+
+ ) : (
+ ''
+ )}
+ {change_skin_color ? (
+
+
+ act('skin_color')}>Change Skin Color
+
+ ) : (
+ ''
+ )}
+ {change_hair_color ? (
+ <>
+
+
+ act('hair_color')}>Change Hair Color
+
+
+
+ act('ears_color')}>Change Ears Color
+
+
+
+ act('ears2_color')}>
+ Change Secondary Ears Color
+
+
+
+
+ act('tail_color')}>Change Tail Color
+
+
+
+ act('tail2_color')}>
+ Change Secondary Tail Color
+
+
+
+
+ act('wing_color')}>Change Wing Color
+
+
+
+ act('wing2_color')}>
+ Change Secondary Wing Color
+
+
+ >
+ ) : null}
+ {change_facial_hair_color ? (
+
+
+ act('facial_hair_color')}>
+ Change Facial Hair Color
+
+
+ ) : null}
+
+ );
+};
+
+export const AppearanceChangerMarkings = (props) => {
+ const { act, data } = useBackend();
+
+ const { markings } = data;
+
+ return (
+
+
+ act('marking', { todo: 1, name: 'na' })}>
+ Add Marking
+
+
+
+ {markings.map((m) => (
+
+
+ act('marking', { todo: 4, name: m.marking_name })}
+ >
+ Change Color
+
+ act('marking', { todo: 0, name: m.marking_name })}
+ >
+ -
+
+ act('marking', { todo: 3, name: m.marking_name })}
+ >
+ Move down
+
+ act('marking', { todo: 2, name: m.marking_name })}
+ >
+ Move up
+
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerHairs.tsx b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerHairs.tsx
new file mode 100644
index 0000000000..9e61a2c1a7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AppearanceChanger/AppearanceChangerHairs.tsx
@@ -0,0 +1,45 @@
+import { useBackend } from '../../backend';
+import { Button, Section } from '../../components';
+import { Data } from './types';
+
+export const AppearanceChangerHair = (props) => {
+ const { act, data } = useBackend();
+
+ const { hair_style, hair_styles } = data;
+
+ return (
+
+ {hair_styles.map((hair) => (
+ act('hair', { hair: hair.hairstyle })}
+ selected={hair.hairstyle === hair_style}
+ >
+ {hair.hairstyle}
+
+ ))}
+
+ );
+};
+
+export const AppearanceChangerFacialHair = (props) => {
+ const { act, data } = useBackend();
+
+ const { facial_hair_style, facial_hair_styles } = data;
+
+ return (
+
+ {facial_hair_styles.map((hair) => (
+
+ act('facial_hair', { facial_hair: hair.facialhairstyle })
+ }
+ selected={hair.facialhairstyle === facial_hair_style}
+ >
+ {hair.facialhairstyle}
+
+ ))}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/index.tsx b/tgui/packages/tgui/interfaces/AppearanceChanger/index.tsx
new file mode 100644
index 0000000000..48935191fa
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AppearanceChanger/index.tsx
@@ -0,0 +1,269 @@
+import { capitalize, decodeHtmlEntities } from 'common/string';
+import { useState } from 'react';
+
+import { useBackend } from '../../backend';
+import {
+ Box,
+ ByondUi,
+ Flex,
+ LabeledList,
+ Section,
+ Tabs,
+} from '../../components';
+import { Window } from '../../layouts';
+import {
+ AppearanceChangerEars,
+ AppearanceChangerGender,
+ AppearanceChangerSpecies,
+ AppearanceChangerTails,
+ AppearanceChangerWings,
+} from './AppearanceChangerBody';
+import {
+ AppearanceChangerColors,
+ AppearanceChangerMarkings,
+} from './AppearanceChangerDetails';
+import {
+ AppearanceChangerFacialHair,
+ AppearanceChangerHair,
+} from './AppearanceChangerHairs';
+import { Data } from './types';
+
+export const AppearanceChanger = (props) => {
+ const { act, config, data } = useBackend();
+
+ const {
+ name,
+ specimen,
+ gender,
+ gender_id,
+ hair_style,
+ facial_hair_style,
+ ear_style,
+ tail_style,
+ wing_style,
+ change_race,
+ change_gender,
+ change_eye_color,
+ change_skin_tone,
+ change_skin_color,
+ change_hair_color,
+ change_facial_hair_color,
+ change_hair,
+ change_facial_hair,
+ mapRef,
+ } = data;
+
+ const { title } = config;
+
+ const tab: React.JSX.Element[] = [];
+
+ const change_color =
+ change_eye_color ||
+ change_skin_tone ||
+ change_skin_color ||
+ change_hair_color ||
+ change_facial_hair_color;
+
+ const disabled = ;
+
+ tab[-1] = ;
+ tab[0] = change_race ? (
+
+ ) : (
+
+ );
+ tab[1] = change_gender ? (
+
+ ) : (
+
+ );
+ tab[2] = change_color ? (
+
+ ) : (
+
+ );
+ tab[3] = change_hair ? (
+
+ ) : (
+
+ );
+ tab[4] = change_facial_hair ? (
+
+ ) : (
+
+ );
+ tab[5] = change_hair ? (
+
+ ) : (
+
+ );
+ tab[6] = change_hair ? (
+
+ ) : (
+
+ );
+ tab[7] = change_hair ? (
+
+ ) : (
+
+ );
+ tab[8] = change_hair ? (
+
+ ) : (
+
+ );
+
+ let firstAccesibleTab = -1;
+ if (change_race) {
+ firstAccesibleTab = 0;
+ } else if (change_gender) {
+ firstAccesibleTab = 1;
+ } else if (change_color) {
+ firstAccesibleTab = 2;
+ } else if (change_hair) {
+ firstAccesibleTab = 4;
+ } else if (change_facial_hair) {
+ firstAccesibleTab = 5;
+ }
+
+ const [tabIndex, setTabIndex] = useState(firstAccesibleTab);
+
+ return (
+
+
+
+
+
+
+ {name}
+
+ {specimen}
+
+
+ {gender ? capitalize(gender) : 'Not Set'}
+
+
+ {gender_id ? capitalize(gender_id) : 'Not Set'}
+
+
+ {hair_style ? capitalize(hair_style) : 'Not Set'}
+
+
+ {facial_hair_style
+ ? capitalize(facial_hair_style)
+ : 'Not Set'}
+
+
+ {ear_style ? capitalize(ear_style) : 'Not Set'}
+
+
+ {tail_style ? capitalize(tail_style) : 'Not Set'}
+
+
+ {wing_style ? capitalize(wing_style) : 'Not Set'}
+
+
+
+
+
+
+
+
+
+ {change_race ? (
+ setTabIndex(0)}>
+ Race
+
+ ) : null}
+ {change_gender ? (
+ setTabIndex(1)}>
+ Gender & Sex
+
+ ) : null}
+ {change_color ? (
+ setTabIndex(2)}>
+ Colors
+
+ ) : null}
+ {change_hair ? (
+ <>
+ setTabIndex(3)}
+ >
+ Hair
+
+ setTabIndex(5)}
+ >
+ Ear
+
+ setTabIndex(6)}
+ >
+ Tail
+
+ setTabIndex(7)}
+ >
+ Wing
+
+ setTabIndex(8)}
+ >
+ Markings
+
+ >
+ ) : null}
+ {change_facial_hair ? (
+ setTabIndex(4)}>
+ Facial Hair
+
+ ) : null}
+
+ {tab[tabIndex]}
+
+
+ );
+};
+
+export const AppearanceChangerDefaultError = (props) => {
+ return Disabled ;
+};
diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts b/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts
new file mode 100644
index 0000000000..4d62e13177
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/AppearanceChanger/types.ts
@@ -0,0 +1,53 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ name: string;
+ specimen: string;
+ species: species[];
+ gender: string;
+ gender_id: string;
+ hair_style: string;
+ facial_hair_style: string;
+ ear_style: string;
+ ear_styles: styles[];
+ wing_style: string;
+ wing_styles: styles[];
+ tail_style: string;
+ tail_styles: styles[];
+ markings: { marking_name: string; marking_color: string }[];
+ change_race: BooleanLike;
+ change_gender: BooleanLike;
+ genders: genders;
+ id_genders: genders;
+ change_eye_color: BooleanLike;
+ change_skin_tone: BooleanLike;
+ change_skin_color: BooleanLike;
+ change_hair_color: BooleanLike;
+ change_facial_hair_color: BooleanLike;
+ change_hair: BooleanLike;
+ change_facial_hair: BooleanLike;
+ mapRef: string;
+ eye_color: string;
+ skin_color: string;
+ hair_color: string;
+ facial_hair_color: string;
+ ears_color: string;
+ ears2_color: string;
+ tail_color: string;
+ tail2_color: string;
+ wing_color: string;
+ wing2_color: string;
+ facial_hair_styles: { facialhairstyle: string }[];
+ hair_styles: { hairstyle: string }[];
+};
+
+type genders = { gender_name: string; gender_key: string }[];
+
+export type styles = {
+ name: string;
+ instance: string;
+ color: boolean;
+ second_color: boolean;
+};
+
+export type species = { specimen: string };
diff --git a/tgui/packages/tgui/interfaces/ArcadeBattle.jsx b/tgui/packages/tgui/interfaces/ArcadeBattle.tsx
similarity index 93%
rename from tgui/packages/tgui/interfaces/ArcadeBattle.jsx
rename to tgui/packages/tgui/interfaces/ArcadeBattle.tsx
index 9ffead3baf..f1300c7338 100644
--- a/tgui/packages/tgui/interfaces/ArcadeBattle.jsx
+++ b/tgui/packages/tgui/interfaces/ArcadeBattle.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -9,18 +11,27 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ name: string;
+ temp: string;
+ enemyAction: string;
+ enemyName: string;
+ playerHP: number;
+ playerMP: number;
+ enemyHP: number;
+ gameOver: BooleanLike;
+};
+
export const ArcadeBattle = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
- name,
temp,
enemyAction,
enemyName,
playerHP,
playerMP,
enemyHP,
- enemyMP,
gameOver,
} = data;
diff --git a/tgui/packages/tgui/interfaces/AreaScrubberControl.jsx b/tgui/packages/tgui/interfaces/AreaScrubberControl.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/AreaScrubberControl.jsx
rename to tgui/packages/tgui/interfaces/AreaScrubberControl.tsx
index e9aa25cc8a..22e404dc84 100644
--- a/tgui/packages/tgui/interfaces/AreaScrubberControl.jsx
+++ b/tgui/packages/tgui/interfaces/AreaScrubberControl.tsx
@@ -1,3 +1,4 @@
+import { BooleanLike } from 'common/react';
import { toTitleCase } from 'common/string';
import { useState } from 'react';
@@ -5,10 +6,24 @@ import { useBackend } from '../backend';
import { Box, Button, Flex, LabeledList, Section } from '../components';
import { Window } from '../layouts';
-export const AreaScrubberControl = (props) => {
- const { act, data } = useBackend();
+type scrubber = {
+ id: string;
+ name: string;
+ on: BooleanLike;
+ pressure: number;
+ flow_rate: number;
+ load: number;
+ area: string;
+};
- const [showArea, setShowArea] = useState(false);
+type Data = {
+ scrubbers: scrubber[];
+};
+
+export const AreaScrubberControl = (props) => {
+ const { act, data } = useBackend();
+
+ const [showArea, setShowArea] = useState(false);
const { scrubbers } = data;
@@ -83,7 +98,7 @@ export const AreaScrubberControl = (props) => {
);
};
-const BigScrubber = (props) => {
+const BigScrubber = (props: { scrubber: scrubber; showArea: boolean }) => {
const { act } = useBackend();
const { scrubber, showArea } = props;
diff --git a/tgui/packages/tgui/interfaces/AssemblyProx.jsx b/tgui/packages/tgui/interfaces/AssemblyProx.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/AssemblyProx.jsx
rename to tgui/packages/tgui/interfaces/AssemblyProx.tsx
index 7e1761bef7..a08e6f768a 100644
--- a/tgui/packages/tgui/interfaces/AssemblyProx.jsx
+++ b/tgui/packages/tgui/interfaces/AssemblyProx.tsx
@@ -1,12 +1,21 @@
import { round } from 'common/math';
+import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import { Button, LabeledList, NumberInput, Section } from '../components';
import { formatTime } from '../format';
import { Window } from '../layouts';
+type Data = {
+ timing: number;
+ time: number;
+ range: number;
+ maxRange: number;
+ scanning: BooleanLike;
+};
+
export const AssemblyProx = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { timing, time, range, maxRange, scanning } = data;
return (
@@ -31,8 +40,8 @@ export const AssemblyProx = (props) => {
value={time}
minValue={0}
maxValue={600}
- format={(val) => formatTime(round(val * 10))}
- onDrag={(e, val) => act('set_time', { time: val })}
+ format={(val: number) => formatTime(round(val * 10, 0))}
+ onDrag={(e, val: string) => act('set_time', { time: val })}
/>
@@ -44,7 +53,7 @@ export const AssemblyProx = (props) => {
minValue={1}
value={range}
maxValue={maxRange}
- onDrag={(e, val) => act('range', { range: val })}
+ onDrag={(e, val: string) => act('range', { range: val })}
/>
diff --git a/tgui/packages/tgui/interfaces/AssemblyTimer.jsx b/tgui/packages/tgui/interfaces/AssemblyTimer.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/AssemblyTimer.jsx
rename to tgui/packages/tgui/interfaces/AssemblyTimer.tsx
index 02d6f8b0e6..9fd6c8fb94 100644
--- a/tgui/packages/tgui/interfaces/AssemblyTimer.jsx
+++ b/tgui/packages/tgui/interfaces/AssemblyTimer.tsx
@@ -5,8 +5,10 @@ import { Button, LabeledList, NumberInput, Section } from '../components';
import { formatTime } from '../format';
import { Window } from '../layouts';
+type Data = { timing: number; time: number };
+
export const AssemblyTimer = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { timing, time } = data;
return (
@@ -31,8 +33,8 @@ export const AssemblyTimer = (props) => {
value={time}
minValue={0}
maxValue={600}
- format={(val) => formatTime(round(val * 10))}
- onDrag={(e, val) => act('set_time', { time: val })}
+ format={(val: number) => formatTime(round(val * 10, 0))}
+ onDrag={(e, val: string) => act('set_time', { time: val })}
/>
diff --git a/tgui/packages/tgui/interfaces/AtmosAlertConsole.jsx b/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx
similarity index 74%
rename from tgui/packages/tgui/interfaces/AtmosAlertConsole.jsx
rename to tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx
index c722c954c0..b2658aa66b 100644
--- a/tgui/packages/tgui/interfaces/AtmosAlertConsole.jsx
+++ b/tgui/packages/tgui/interfaces/AtmosAlertConsole.tsx
@@ -2,19 +2,24 @@ import { useBackend } from '../backend';
import { Button, Section } from '../components';
import { Window } from '../layouts';
+type alarm = { name: string; ref: string };
+
+type Data = { priority_alarms: alarm[]; minor_alarms: alarm[] };
+
export const AtmosAlertConsole = (props) => {
- const { act, data } = useBackend();
- const priorityAlerts = data.priority_alarms || [];
- const minorAlerts = data.minor_alarms || [];
+ const { act, data } = useBackend();
+
+ const { priority_alarms = [], minor_alarms = [] } = data;
+
return (
- {priorityAlerts.length === 0 && (
+ {priority_alarms.length === 0 && (
No Priority Alerts
)}
- {priorityAlerts.map((alert) => (
+ {priority_alarms.map((alert) => (
{
))}
- {minorAlerts.length === 0 && (
+ {minor_alarms.length === 0 && (
No Minor Alerts
)}
- {minorAlerts.map((alert) => (
+ {minor_alarms.map((alert) => (
{
return (
@@ -18,9 +30,9 @@ export const AtmosControl = (props) => {
};
export const AtmosControlContent = (props) => {
- const { act, data, config } = useBackend();
+ const { act, data, config } = useBackend();
- let sortedAlarms = sortBy((alarm) => alarm.name)(data.alarms || []);
+ let sortedAlarms = sortBy((alarm: alarm) => alarm.name)(data.alarms || []);
// sortedAlarms = sortedAlarms.slice(1, 3);
diff --git a/tgui/packages/tgui/interfaces/AtmosFilter.jsx b/tgui/packages/tgui/interfaces/AtmosFilter.tsx
similarity index 73%
rename from tgui/packages/tgui/interfaces/AtmosFilter.jsx
rename to tgui/packages/tgui/interfaces/AtmosFilter.tsx
index 615ef09107..a2ed22a2e0 100644
--- a/tgui/packages/tgui/interfaces/AtmosFilter.jsx
+++ b/tgui/packages/tgui/interfaces/AtmosFilter.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
@@ -9,9 +11,19 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ rate: number;
+ max_rate: number;
+ last_flow_rate: number;
+ filter_types: { name: string; f_type: number; selected: number }[];
+};
+
export const AtmosFilter = (props) => {
- const { act, data } = useBackend();
- const filterTypes = data.filter_types || [];
+ const { act, data } = useBackend();
+
+ const { on, rate, max_rate, last_flow_rate, filter_types = [] } = data;
+
return (
@@ -19,28 +31,28 @@ export const AtmosFilter = (props) => {
act('power')}
>
- {data.on ? 'On' : 'Off'}
+ {on ? 'On' : 'Off'}
val + ' L/s'}
/>
+ onDrag={(e, value: number) =>
act('rate', {
rate: value,
})
@@ -49,7 +61,7 @@ export const AtmosFilter = (props) => {
act('rate', {
rate: 'max',
@@ -60,7 +72,7 @@ export const AtmosFilter = (props) => {
- {filterTypes.map((filter) => (
+ {filter_types.map((filter) => (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
+ const {
+ on,
+ set_pressure,
+ max_pressure,
+ node1_concentration,
+ node2_concentration,
+ node1_dir,
+ node2_dir,
+ } = data;
+
return (
@@ -11,23 +34,23 @@ export const AtmosMixer = (props) => {
act('power')}
>
- {data.on ? 'On' : 'Off'}
+ {on ? 'On' : 'Off'}
+ onChange={(e, value: number) =>
act('pressure', {
pressure: value,
})
@@ -36,7 +59,7 @@ export const AtmosMixer = (props) => {
act('pressure', {
pressure: 'max',
@@ -50,32 +73,32 @@ export const AtmosMixer = (props) => {
Concentrations
-
+
+ onDrag={(e, value: number) =>
act('node1', {
concentration: value,
})
}
/>
-
+
+ onDrag={(e, value: number) =>
act('node2', {
concentration: value,
})
diff --git a/tgui/packages/tgui/interfaces/Autolathe.jsx b/tgui/packages/tgui/interfaces/Autolathe.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/Autolathe.jsx
rename to tgui/packages/tgui/interfaces/Autolathe.tsx
index 9fd18051ca..97c00ad02e 100644
--- a/tgui/packages/tgui/interfaces/Autolathe.jsx
+++ b/tgui/packages/tgui/interfaces/Autolathe.tsx
@@ -1,21 +1,23 @@
import { filter, sortBy } from 'common/collections';
import { flow } from 'common/fp';
+import { BooleanLike } from 'common/react';
import { createSearch, toTitleCase } from 'common/string';
import { useBackend, useSharedState } from '../backend';
import { Box, Button, Dropdown, Flex, Input, Section } from '../components';
import { Window } from '../layouts';
+import { mat } from './common/CommonTypes';
import { Materials } from './ExosuitFabricator';
-const canBeMade = (recipe, materials, mult = 1) => {
+const canBeMade = (recipe, materials, mult: number = 1) => {
if (recipe.requirements === null) {
return true;
}
- let recipeRequiredMaterials = Object.keys(recipe.requirements);
+ let recipeRequiredMaterials: string[] = Object.keys(recipe.requirements);
for (let mat_id of recipeRequiredMaterials) {
- let material = materials.find((val) => val.name === mat_id);
+ let material = materials.find((val: mat) => val.name === mat_id);
if (!material) {
continue; // yes, if we cannot find the material, we just ignore it :V
}
@@ -26,9 +28,26 @@ const canBeMade = (recipe, materials, mult = 1) => {
return true;
};
+type Data = {
+ recipes: recipe[];
+ categories: string[];
+ busy: string;
+ materials: mat[];
+};
+
+type recipe = {
+ category: string;
+ name: string;
+ ref: string;
+ requirements: Record;
+ hidden: BooleanLike;
+ coeff_applies: BooleanLike;
+ is_stack: BooleanLike;
+};
export const Autolathe = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
const { recipes, busy, materials, categories } = data;
const [category, setCategory] = useSharedState('category', 0);
@@ -37,9 +56,9 @@ export const Autolathe = (props) => {
const testSearch = createSearch(searchText, (recipe) => recipe.name);
const recipesToShow = flow([
- filter((recipe) => recipe.category === categories[category]),
+ filter((recipe: recipe) => recipe.category === categories[category]),
searchText && filter(testSearch),
- sortBy((recipe) => recipe.name.toLowerCase()),
+ sortBy((recipe: recipe) => recipe.name.toLowerCase()),
])(recipes);
return (
@@ -63,7 +82,7 @@ export const Autolathe = (props) => {
fluid
placeholder="Search for..."
value={searchText}
- onInput={(e, v) => setSearchText(v)}
+ onInput={(e, v: string) => setSearchText(v)}
mb={1}
/>
{recipesToShow.map((recipe) => (
diff --git a/tgui/packages/tgui/interfaces/Batteryrack.jsx b/tgui/packages/tgui/interfaces/Batteryrack.tsx
similarity index 89%
rename from tgui/packages/tgui/interfaces/Batteryrack.jsx
rename to tgui/packages/tgui/interfaces/Batteryrack.tsx
index 24a29f2157..0adbbbbf16 100644
--- a/tgui/packages/tgui/interfaces/Batteryrack.jsx
+++ b/tgui/packages/tgui/interfaces/Batteryrack.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
@@ -10,8 +12,25 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ mode: number;
+ transfer_max: number;
+ output_load: number;
+ input_load: number;
+ equalise: BooleanLike;
+ blink_tick: BooleanLike;
+ cells_max: number;
+ cells_cur: number;
+ cells_list: {
+ slot: number;
+ used: BooleanLike;
+ percentage: number;
+ id: number;
+ }[];
+};
+
export const Batteryrack = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
mode,
@@ -20,8 +39,6 @@ export const Batteryrack = (props) => {
input_load,
equalise,
blink_tick,
- cells_max,
- cells_cur,
cells_list,
} = data;
diff --git a/tgui/packages/tgui/interfaces/BeaconLocator.jsx b/tgui/packages/tgui/interfaces/BeaconLocator.tsx
similarity index 86%
rename from tgui/packages/tgui/interfaces/BeaconLocator.jsx
rename to tgui/packages/tgui/interfaces/BeaconLocator.tsx
index 362dac5308..c177e3b457 100644
--- a/tgui/packages/tgui/interfaces/BeaconLocator.jsx
+++ b/tgui/packages/tgui/interfaces/BeaconLocator.tsx
@@ -11,8 +11,16 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ scan_ticks: number;
+ degrees: number | null;
+ rawfreq: number;
+ minFrequency: number;
+ maxFrequency: number;
+};
+
export const BeaconLocator = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { scan_ticks, degrees, rawfreq, minFrequency, maxFrequency } = data;
@@ -49,9 +57,9 @@ export const BeaconLocator = (props) => {
maxValue={maxFrequency / 10}
value={rawfreq / 10}
format={(value) => toFixed(value, 1)}
- onDrag={(e, value) =>
+ onDrag={(e, value: number) =>
act('setFrequency', {
- freq: round(value * 10),
+ freq: round(value * 10, 0),
})
}
/>
diff --git a/tgui/packages/tgui/interfaces/Biogenerator.jsx b/tgui/packages/tgui/interfaces/Biogenerator.tsx
similarity index 66%
rename from tgui/packages/tgui/interfaces/Biogenerator.jsx
rename to tgui/packages/tgui/interfaces/Biogenerator.tsx
index ed31a5ed5f..8669b01eb7 100644
--- a/tgui/packages/tgui/interfaces/Biogenerator.jsx
+++ b/tgui/packages/tgui/interfaces/Biogenerator.tsx
@@ -1,3 +1,4 @@
+import { BooleanLike } from 'common/react';
import { createSearch } from 'common/string';
import { useState } from 'react';
@@ -13,48 +14,66 @@ import {
} from '../components';
import { Window } from '../layouts';
+type sortable = {
+ name: string;
+ affordable: number;
+ price: number;
+ reagent: BooleanLike;
+};
+type Data = {
+ items: Record;
+ build_eff: number;
+ points: number;
+ processing: BooleanLike;
+ beaker: boolean;
+};
+
const sortTypes = {
- Alphabetical: (a, b) => a.name > b.name,
- 'By availability': (a, b) => -(a.affordable - b.affordable),
- 'By price': (a, b) => a.price - b.price,
+ Alphabetical: (a: sortable, b: sortable) => a.name > b.name,
+ 'By availability': (a: sortable, b: sortable) =>
+ -(a.affordable - b.affordable),
+ 'By price': (a: sortable, b: sortable) => a.price - b.price,
};
export const Biogenerator = (props) => {
- const { act, data } = useBackend();
- const [searchText, setSearchText] = useState('');
- const [sortOrder, setSortOrder] = useState('Alphabetical');
- const [descending, setDescending] = useState(false);
+ const { act, data } = useBackend();
- function handleSearchText(value) {
+ const { processing, points, beaker } = data;
+
+ const [searchText, setSearchText] = useState('');
+ const [sortOrder, setSortOrder] = useState('Alphabetical');
+ const [descending, setDescending] = useState(false);
+
+ function handleSearchText(value: string) {
setSearchText(value);
}
- function handleSortOrder(value) {
+ function handleSortOrder(value: string) {
setSortOrder(value);
}
- function handleDescending(value) {
+ function handleDescending(value: boolean) {
setDescending(value);
}
return (
- {(data.processing && (
+ {(processing && (
The biogenerator is processing reagents!
)) || (
<>
- {data.points} points available.
+ {points} points available.
act('activate')}>
Activate
act('detach')}
>
Eject Beaker
@@ -72,9 +91,6 @@ export const Biogenerator = (props) => {
searchText={searchText}
sortOrder={sortOrder}
descending={descending}
- onSearchText={handleSearchText}
- onSortOrder={handleSortOrder}
- onDescending={handleDescending}
/>
>
)}
@@ -83,20 +99,24 @@ export const Biogenerator = (props) => {
);
};
-const BiogeneratorItems = (props) => {
- const { act, data } = useBackend();
- const { points, items } = data;
+const BiogeneratorItems = (props: {
+ searchText: string;
+ sortOrder: string;
+ descending: boolean;
+}) => {
+ const { act, data } = useBackend();
+ const { points, items = [], build_eff, beaker } = data;
// Search thingies
- const searcher = createSearch(props.searchText, (item) => {
+ const searcher = createSearch(props.searchText, (item: sortable) => {
return item[0];
});
let has_contents = false;
- let contents = Object.entries(items).map((kv, _i) => {
+ let contents = Object.entries(items).map((kv) => {
let items_in_cat = Object.entries(kv[1])
.filter(searcher)
.map((kv2) => {
- kv2[1].affordable = points >= kv2[1].price / data.build_eff;
+ kv2[1].affordable = +(points >= kv2[1].price / build_eff);
return kv2[1];
})
.sort(sortTypes[props.sortOrder]);
@@ -113,6 +133,8 @@ const BiogeneratorItems = (props) => {
key={kv[0]}
title={kv[0]}
items={items_in_cat}
+ build_eff={build_eff}
+ beaker={beaker}
/>
);
});
@@ -129,7 +151,14 @@ const BiogeneratorItems = (props) => {
);
};
-const BiogeneratorSearch = (props) => {
+const BiogeneratorSearch = (props: {
+ searchText: string;
+ sortOrder: string;
+ descending: boolean;
+ onSearchText: Function;
+ onSortOrder: Function;
+ onDescending: Function;
+}) => {
return (
@@ -138,7 +167,7 @@ const BiogeneratorSearch = (props) => {
placeholder="Search by item name.."
value={props.searchText}
width="100%"
- onInput={(_e, value) => props.onSearchText(value)}
+ onInput={(e, value: string) => props.onSearchText(value)}
/>
@@ -165,25 +194,31 @@ const BiogeneratorSearch = (props) => {
);
};
-const canBuyItem = (item, data) => {
+const canBuyItem = (item: sortable, beaker: BooleanLike) => {
if (!item.affordable) {
return false;
}
- if (item.reagent && !data.beaker) {
+ if (item.reagent && !beaker) {
return false;
}
return true;
};
-const BiogeneratorItemsCategory = (props) => {
+const BiogeneratorItemsCategory = (props: {
+ key: string;
+ title: string;
+ items: sortable[];
+ build_eff: number;
+ beaker: BooleanLike;
+}) => {
const { act, data } = useBackend();
- const { title, items, ...rest } = props;
+ const { title, items, build_eff, beaker, ...rest } = props;
return (
{items.map((item) => (
{
{item.name}
{
})
}
>
- {(item.price / data.build_eff).toLocaleString('en-US')}
+ {(item.price / build_eff).toLocaleString('en-US')}
{
+ const { act } = useBackend();
+ const { bodyrecords } = props;
+ return (
+ act('menu', { menu: 'Main' })}>
+ Back
+
+ }
+ >
+ {bodyrecords
+ ? bodyrecords.map((record) => (
+ act('view_brec', { view_brec: record.recref })}
+ >
+ {record.name}
+
+ ))
+ : ''}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerMain.tsx b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerMain.tsx
new file mode 100644
index 0000000000..5da0f60516
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerMain.tsx
@@ -0,0 +1,16 @@
+import { useBackend } from '../../backend';
+import { Button, Section } from '../../components';
+
+export const BodyDesignerMain = (props) => {
+ const { act } = useBackend();
+ return (
+
+ act('menu', { menu: 'Body Records' })}>
+ View Individual Body Records
+
+ act('menu', { menu: 'Stock Records' })}>
+ View Stock Body Records
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerOOCNotes.tsx b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerOOCNotes.tsx
new file mode 100644
index 0000000000..f57b2f868c
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerOOCNotes.tsx
@@ -0,0 +1,29 @@
+import { useBackend } from '../../backend';
+import { Button, Section } from '../../components';
+import { activeBodyRecord } from './types';
+
+export const BodyDesignerOOCNotes = (props: {
+ activeBodyRecord: activeBodyRecord;
+}) => {
+ const { act } = useBackend();
+ const { activeBodyRecord } = props;
+ return (
+ act('menu', { menu: 'Specific Record' })}
+ >
+ Back
+
+ }
+ style={{ wordBreak: 'break-all' }}
+ >
+ {(activeBodyRecord && activeBodyRecord.booc) ||
+ 'ERROR: Body record not found!'}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyDesigner.jsx b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerSpecificRecord.tsx
similarity index 66%
rename from tgui/packages/tgui/interfaces/BodyDesigner.jsx
rename to tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerSpecificRecord.tsx
index 3a9fcd4483..b6fd5e67f4 100644
--- a/tgui/packages/tgui/interfaces/BodyDesigner.jsx
+++ b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerSpecificRecord.tsx
@@ -1,6 +1,6 @@
import { capitalize } from 'common/string';
-import { useBackend } from '../backend';
+import { useBackend } from '../../backend';
import {
Box,
Button,
@@ -9,115 +9,15 @@ import {
Flex,
LabeledList,
Section,
-} from '../components';
-import { Window } from '../layouts';
+} from '../../components';
+import { activeBodyRecord } from './types';
-export const BodyDesigner = (props) => {
- const { act, data } = useBackend();
-
- const { menu, disk, diskStored, activeBodyRecord } = data;
-
- let body = MenuToTemplate[menu];
-
- return (
-
-
- {disk ? (
-
- act('savetodisk')}
- disabled={!activeBodyRecord}
- >
- Save To Disk
-
- act('loadfromdisk')}
- disabled={!diskStored}
- >
- Load From Disk
-
- act('ejectdisk')}>
- Eject
-
-
- ) : null}
- {body}
-
-
- );
-};
-
-const BodyDesignerMain = (props) => {
- const { act, data } = useBackend();
- return (
-
- act('menu', { menu: 'Body Records' })}>
- View Individual Body Records
-
- act('menu', { menu: 'Stock Records' })}>
- View Stock Body Records
-
-
- );
-};
-
-const BodyDesignerBodyRecords = (props) => {
- const { act, data } = useBackend();
- const { bodyrecords } = data;
- return (
- act('menu', { menu: 'Main' })}>
- Back
-
- }
- >
- {bodyrecords
- ? bodyrecords.map((record) => (
- act('view_brec', { view_brec: record.recref })}
- >
- {record.name}
-
- ))
- : ''}
-
- );
-};
-
-const BodyDesignerStockRecords = (props) => {
- const { act, data } = useBackend();
- const { stock_bodyrecords } = data;
- return (
- act('menu', { menu: 'Main' })}>
- Back
-
- }
- >
- {stock_bodyrecords.map((record) => (
- act('view_stock_brec', { view_stock_brec: record })}
- >
- {record}
-
- ))}
-
- );
-};
-
-const BodyDesignerSpecificRecord = (props) => {
- const { act, data } = useBackend();
- const { activeBodyRecord, mapRef } = data;
+export const BodyDesignerSpecificRecord = (props: {
+ activeBodyRecord: activeBodyRecord;
+ mapRef: string;
+}) => {
+ const { act } = useBackend();
+ const { activeBodyRecord, mapRef } = props;
return activeBodyRecord ? (
@@ -325,35 +225,3 @@ const BodyDesignerSpecificRecord = (props) => {
ERROR: Record Not Found!
);
};
-
-const BodyDesignerOOCNotes = (props) => {
- const { act, data } = useBackend();
- const { activeBodyRecord } = data;
- return (
- act('menu', { menu: 'Specific Record' })}
- >
- Back
-
- }
- style={{ 'word-break': 'break-all' }}
- >
- {(activeBodyRecord && activeBodyRecord.booc) ||
- 'ERROR: Body record not found!'}
-
- );
-};
-
-const MenuToTemplate = {
- Main: ,
- 'Body Records': ,
- 'Stock Records': ,
- 'Specific Record': ,
- 'OOC Notes': ,
-};
diff --git a/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerStockRecords.tsx b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerStockRecords.tsx
new file mode 100644
index 0000000000..71195d4f6d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyDesigner/BodyDesignerStockRecords.tsx
@@ -0,0 +1,29 @@
+import { useBackend } from '../../backend';
+import { Button, Section } from '../../components';
+
+export const BodyDesignerStockRecords = (props: {
+ stock_bodyrecords: string[];
+}) => {
+ const { act } = useBackend();
+ const { stock_bodyrecords } = props;
+ return (
+ act('menu', { menu: 'Main' })}>
+ Back
+
+ }
+ >
+ {stock_bodyrecords.map((record) => (
+ act('view_stock_brec', { view_stock_brec: record })}
+ >
+ {record}
+
+ ))}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyDesigner/index.tsx b/tgui/packages/tgui/interfaces/BodyDesigner/index.tsx
new file mode 100644
index 0000000000..be2178696f
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyDesigner/index.tsx
@@ -0,0 +1,71 @@
+import { useBackend } from '../../backend';
+import { Box, Button } from '../../components';
+import { Window } from '../../layouts';
+import { BodyDesignerBodyRecords } from './BodyDesignerBodyRecords';
+import { BodyDesignerMain } from './BodyDesignerMain';
+import { BodyDesignerOOCNotes } from './BodyDesignerOOCNotes';
+import { BodyDesignerSpecificRecord } from './BodyDesignerSpecificRecord';
+import { BodyDesignerStockRecords } from './BodyDesignerStockRecords';
+import { Data } from './types';
+
+export const BodyDesigner = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ menu,
+ disk,
+ diskStored,
+ activeBodyRecord,
+ stock_bodyrecords,
+ bodyrecords,
+ mapRef,
+ } = data;
+
+ const MenuToTemplate = {
+ Main: ,
+ 'Body Records': ,
+ 'Stock Records': (
+
+ ),
+ 'Specific Record': (
+
+ ),
+ 'OOC Notes': ,
+ };
+
+ let body = MenuToTemplate[menu];
+
+ return (
+
+
+ {disk ? (
+
+ act('savetodisk')}
+ disabled={!activeBodyRecord}
+ >
+ Save To Disk
+
+ act('loadfromdisk')}
+ disabled={!diskStored}
+ >
+ Load From Disk
+
+ act('ejectdisk')}>
+ Eject
+
+
+ ) : (
+ ''
+ )}
+ {body}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyDesigner/types.ts b/tgui/packages/tgui/interfaces/BodyDesigner/types.ts
new file mode 100644
index 0000000000..3ec032ee1e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyDesigner/types.ts
@@ -0,0 +1,63 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ mapRef: string;
+ bodyrecords: bodyrecord[];
+ stock_bodyrecords: string[];
+ activeBodyRecord: activeBodyRecord;
+ menu: string;
+ temp: {
+ styleHref: string;
+ style: string;
+ color: string | undefined;
+ colorHref: string | undefined;
+ color2?: string | undefined;
+ colorHref2?: string | undefined;
+ };
+ disk: BooleanLike;
+ diskStored: BooleanLike;
+};
+
+export type bodyrecord = { name: string; recref: string };
+
+export type activeBodyRecord = {
+ real_name: string;
+ speciesname: string;
+ gender: string;
+ synthetic: string;
+ locked: string;
+ scale: string;
+ booc: string;
+ styles: {
+ Ears: colourableStyle;
+ Tail: colourableStyle;
+ Wing: colourableStyle;
+ Hair: simpleStyle;
+ Facial: simpleStyle;
+ Eyes: colourStyle;
+ 'Body Color': colourStyle;
+ Bodytype: { styleHref: string; style: string };
+ };
+ markings: { name: Record }; // Record entries match BP regions
+};
+
+type colourableStyle = {
+ styleHref: string;
+ style: string;
+ color: string | undefined;
+ colorHref: string | undefined;
+ color2: string | undefined;
+ colorHref2: string | undefined;
+};
+
+type simpleStyle = {
+ styleHref: string;
+ style: string;
+ colorHref: string;
+ color: string;
+};
+
+type colourStyle = {
+ colorHref: string;
+ color: string;
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner.jsx b/tgui/packages/tgui/interfaces/BodyScanner.jsx
deleted file mode 100644
index 9afdb71823..0000000000
--- a/tgui/packages/tgui/interfaces/BodyScanner.jsx
+++ /dev/null
@@ -1,500 +0,0 @@
-import { round } from 'common/math';
-
-import { useBackend } from '../backend';
-import {
- AnimatedNumber,
- Box,
- Button,
- Flex,
- Icon,
- LabeledList,
- ProgressBar,
- Section,
- Table,
- Tooltip,
-} from '../components';
-import { Window } from '../layouts';
-
-const stats = [
- ['good', 'Alive'],
- ['average', 'Unconscious'],
- ['bad', 'DEAD'],
-];
-
-const abnormalities = [
- [
- 'hasBorer',
- 'bad',
- (occupant) =>
- 'Large growth detected in frontal lobe,' +
- ' possibly cancerous. Surgical removal is recommended.',
- ],
- ['hasVirus', 'bad', (occupant) => 'Viral pathogen detected in blood stream.'],
- ['blind', 'average', (occupant) => 'Cataracts detected.'],
- [
- 'colourblind',
- 'average',
- (occupant) => 'Photoreceptor abnormalities detected.',
- ],
- ['nearsighted', 'average', (occupant) => 'Retinal misalignment detected.'],
- /* VOREStation Add */
- [
- 'humanPrey',
- 'average',
- (occupant) => {
- return 'Foreign Humanoid(s) detected: ' + occupant.humanPrey;
- },
- ],
- [
- 'livingPrey',
- 'average',
- (occupant) => {
- return 'Foreign Creature(s) detected: ' + occupant.livingPrey;
- },
- ],
- [
- 'objectPrey',
- 'average',
- (occupant) => {
- return 'Foreign Object(s) detected: ' + occupant.objectPrey;
- },
- ],
- /* VOREStation Add End */
-];
-
-const damages = [
- ['Respiratory', 'oxyLoss'],
- ['Brain', 'brainLoss'],
- ['Toxin', 'toxLoss'],
- ['Radiation', 'radLoss'],
- ['Brute', 'bruteLoss'],
- ['Genetic', 'cloneLoss'],
- ['Burn', 'fireLoss'],
- ['Paralysis', 'paralysis'],
-];
-
-const damageRange = {
- average: [0.25, 0.5],
- bad: [0.5, Infinity],
-};
-
-const mapTwoByTwo = (a, c) => {
- let result = [];
- for (let i = 0; i < a.length; i += 2) {
- result.push(c(a[i], a[i + 1], i));
- }
- return result;
-};
-
-const reduceOrganStatus = (A) => {
- return A.length > 0
- ? A.reduce((a, s) =>
- a === null ? (
- s
- ) : (
- <>
- {a}
- {!!s && {s} }
- >
- ),
- )
- : null;
-};
-
-const germStatus = (i) => {
- if (i > 100) {
- if (i < 300) {
- return 'mild infection';
- }
- if (i < 400) {
- return 'mild infection+';
- }
- if (i < 500) {
- return 'mild infection++';
- }
- if (i < 700) {
- return 'acute infection';
- }
- if (i < 800) {
- return 'acute infection+';
- }
- if (i < 900) {
- return 'acute infection++';
- }
- if (i >= 900) {
- return 'septic';
- }
- }
-
- return '';
-};
-
-export const BodyScanner = (props) => {
- const { data } = useBackend();
- const { occupied, occupant = {} } = data;
- const body = occupied ? (
-
- ) : (
-
- );
- return (
-
-
- {body}
-
-
- );
-};
-
-const BodyScannerMain = (props) => {
- const { occupant } = props;
- return (
-
-
-
-
-
-
-
-
- );
-};
-
-const BodyScannerMainOccupant = (props) => {
- const { act, data } = useBackend();
- const { occupant } = data;
- return (
-
- act('ejectify')}>
- Eject
-
- act('print_p')}>
- Print Report
-
- >
- }
- >
-
- {occupant.name}
-
-
-
-
- {stats[occupant.stat][1]}
-
-
-
- °C,
-
- °F
-
-
- {' '}
- units (
-
- %)
-
- {/* VOREStation Add */}
-
- {round(data.occupant.weight) +
- 'lbs, ' +
- round(data.occupant.weight / 2.20463) +
- 'kgs'}
-
- {/* VOREStation Add End */}
-
-
- );
-};
-
-const BodyScannerMainReagents = (props) => {
- const { occupant } = props;
-
- return (
- <>
-
- {occupant.reagents ? (
-
-
- Reagent
- Amount
-
- {occupant.reagents.map((reagent) => (
-
- {reagent.name}
-
- {reagent.amount} Units{' '}
- {reagent.overdose ? OVERDOSING : null}
-
-
- ))}
-
- ) : (
- No Blood Reagents Detected
- )}
-
-
- {occupant.ingested ? (
-
-
- Reagent
- Amount
-
- {occupant.ingested.map((reagent) => (
-
- {reagent.name}
-
- {reagent.amount} Units{' '}
- {reagent.overdose ? OVERDOSING : null}
-
-
- ))}
-
- ) : (
- No Stomach Reagents Detected
- )}
-
- >
- );
-};
-
-const BodyScannerMainAbnormalities = (props) => {
- const { occupant } = props;
-
- let hasAbnormalities =
- occupant.hasBorer ||
- occupant.blind ||
- occupant.colourblind ||
- occupant.nearsighted ||
- occupant.hasVirus;
-
- /* VOREStation Add */
- hasAbnormalities =
- hasAbnormalities ||
- occupant.humanPrey ||
- occupant.livingPrey ||
- occupant.objectPrey;
- /* VOREStation Add End */
-
- if (!hasAbnormalities) {
- return (
-
- No abnormalities found.
-
- );
- }
-
- return (
-
- {abnormalities.map((a, i) => {
- if (occupant[a[0]]) {
- return (
-
- {a[2](occupant)}
-
- );
- }
- })}
-
- );
-};
-
-const BodyScannerMainDamage = (props) => {
- const { occupant } = props;
- return (
-
-
- {mapTwoByTwo(damages, (d1, d2, i) => (
- <>
-
- {d1[0]}:
- {!!d2 && d2[0] + ':'}
-
-
-
-
-
-
- {!!d2 && }
-
-
- >
- ))}
-
-
- );
-};
-
-const BodyScannerMainDamageBar = (props) => {
- return (
-
- {round(props.value, 0)}
-
- );
-};
-
-const BodyScannerMainOrgansExternal = (props) => {
- if (props.organs.length === 0) {
- return (
-
- );
- }
-
- return (
-
-
-
- Name
- Damage
- Injuries
-
- {props.organs.map((o, i) => (
-
- {o.name}
-
- 0 && '0.5rem'}
- value={o.totalLoss / 100}
- ranges={damageRange}
- >
-
- {!!o.bruteLoss && (
-
-
- {round(o.bruteLoss, 0)}
-
-
- )}
- {!!o.fireLoss && (
-
-
- {round(o.fireLoss, 0)}
-
-
- )}
-
- {round(o.totalLoss, 0)}
-
-
-
-
- {reduceOrganStatus([
- o.internalBleeding && 'Internal bleeding',
- !!o.status.bleeding && 'External bleeding',
- o.lungRuptured && 'Ruptured lung',
- o.destroyed && 'Destroyed',
- !!o.status.broken && o.status.broken,
- germStatus(o.germ_level),
- !!o.open && 'Open incision',
- ])}
-
-
- {reduceOrganStatus([
- !!o.status.splinted && 'Splinted',
- !!o.status.robotic && 'Robotic',
- !!o.status.dead && DEAD ,
- ])}
- {reduceOrganStatus(
- o.implants.map((s) => (s.known ? s.name : 'Unknown object')),
- )}
-
-
-
- ))}
-
-
- );
-};
-
-const BodyScannerMainOrgansInternal = (props) => {
- if (props.organs.length === 0) {
- return (
-
- );
- }
-
- return (
-
-
-
- Name
- Damage
- Injuries
-
- {props.organs.map((o, i) => (
-
- {o.name}
-
- 0 && '0.5rem'}
- ranges={damageRange}
- >
- {round(o.damage, 0)}
-
-
-
-
- {reduceOrganStatus([
- germStatus(o.germ_level),
- !!o.inflamed && 'Appendicitis detected.',
- ])}
-
-
- {reduceOrganStatus([
- o.robotic === 1 && 'Robotic',
- o.robotic === 2 && 'Assisted',
- !!o.dead && DEAD ,
- ])}
-
-
-
- ))}
-
-
- );
-};
-
-const BodyScannerEmpty = () => {
- return (
-
-
-
-
-
- No occupant detected.
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerEmpty.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerEmpty.tsx
new file mode 100644
index 0000000000..e6f0f4bae9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerEmpty.tsx
@@ -0,0 +1,15 @@
+import { Flex, Icon, Section } from '../../components';
+
+export const BodyScannerEmpty = () => {
+ return (
+
+
+
+
+
+ No occupant detected.
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMain.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMain.tsx
new file mode 100644
index 0000000000..28237b0b04
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMain.tsx
@@ -0,0 +1,22 @@
+import { Box } from '../../components';
+import { BodyScannerMainAbnormalities } from './BodyScannerMainAbnormalities';
+import { BodyScannerMainDamage } from './BodyScannerMainDamage';
+import { BodyScannerMainOccupant } from './BodyScannerMainOccupant';
+import { BodyScannerMainOrgansExternal } from './BodyScannerMainOrgansExternal';
+import { BodyScannerMainOrgansInternal } from './BodyScannerMainOrgansInternal';
+import { BodyScannerMainReagents } from './BodyScannerMainReagents';
+import { occupant } from './types';
+
+export const BodyScannerMain = (props: { occupant: occupant }) => {
+ const { occupant } = props;
+ return (
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainAbnormalities.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainAbnormalities.tsx
new file mode 100644
index 0000000000..e68604d909
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainAbnormalities.tsx
@@ -0,0 +1,42 @@
+import { Box, Section } from '../../components';
+import { abnormalities } from './constants';
+import { occupant } from './types';
+
+export const BodyScannerMainAbnormalities = (props: { occupant: occupant }) => {
+ const { occupant } = props;
+
+ let hasAbnormalities =
+ occupant.hasBorer ||
+ occupant.blind ||
+ occupant.colourblind ||
+ occupant.nearsighted ||
+ occupant.hasVirus;
+
+ hasAbnormalities =
+ hasAbnormalities ||
+ occupant.humanPrey ||
+ occupant.livingPrey ||
+ occupant.objectPrey;
+
+ if (!hasAbnormalities) {
+ return (
+
+ No abnormalities found.
+
+ );
+ }
+
+ return (
+
+ {abnormalities.map((a, i) => {
+ if (occupant[a[0] as string]) {
+ return (
+
+ {(a[2] as (occupant: occupant) => string)(occupant)}
+
+ );
+ }
+ })}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainDamage.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainDamage.tsx
new file mode 100644
index 0000000000..6b84636138
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainDamage.tsx
@@ -0,0 +1,54 @@
+import { toFixed } from 'common/math';
+
+import { ProgressBar, Section, Table } from '../../components';
+import { damageRange, damages } from './constants';
+import { mapTwoByTwo } from './functions';
+import { occupant } from './types';
+
+export const BodyScannerMainDamage = (props: { occupant: occupant }) => {
+ const { occupant } = props;
+ return (
+
+
+ {mapTwoByTwo(damages, (d1: string[], d2: string[], i: number) => (
+ <>
+
+ {d1[0]}:
+ {!!d2 && d2[0] + ':'}
+
+
+
+
+
+
+ {!!d2 && }
+
+
+ >
+ ))}
+
+
+ );
+};
+
+const BodyScannerMainDamageBar = (props: {
+ value: number;
+ marginBottom?: boolean;
+}) => {
+ const { value, marginBottom } = props;
+ return (
+
+ {toFixed(value)}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOccupant.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOccupant.tsx
new file mode 100644
index 0000000000..95f54a5cd9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOccupant.tsx
@@ -0,0 +1,81 @@
+import { toFixed } from 'common/math';
+
+import { useBackend } from '../../backend';
+import {
+ AnimatedNumber,
+ Button,
+ LabeledList,
+ ProgressBar,
+ Section,
+} from '../../components';
+import { stats } from './constants';
+import { occupant } from './types';
+
+export const BodyScannerMainOccupant = (props: { occupant: occupant }) => {
+ const { act } = useBackend();
+ const { occupant } = props;
+ return (
+
+ act('ejectify')}>
+ Eject
+
+ act('print_p')}>
+ Print Report
+
+ >
+ }
+ >
+
+ {occupant.name}
+
+
+
+
+ {stats[occupant.stat][1]}
+
+
+ toFixed(value)}
+ />
+ °C,
+ toFixed(value)}
+ />
+ °F
+
+
+ toFixed(value)}
+ />
+ units (
+ toFixed(value)}
+ />
+ %)
+
+
+ {toFixed(occupant.weight) +
+ 'lbs, ' +
+ toFixed(occupant.weight / 2.20463) +
+ 'kgs'}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOrgansExternal.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOrgansExternal.tsx
new file mode 100644
index 0000000000..cd32c84a4a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOrgansExternal.tsx
@@ -0,0 +1,99 @@
+import { toFixed } from 'common/math';
+
+import {
+ Box,
+ Icon,
+ ProgressBar,
+ Section,
+ Table,
+ Tooltip,
+} from '../../components';
+import { damageRange } from './constants';
+import { germStatus, reduceOrganStatus } from './functions';
+import { externalOrgan } from './types';
+
+export const BodyScannerMainOrgansExternal = (props: {
+ organs: externalOrgan[];
+}) => {
+ const { organs } = props;
+
+ if (organs.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+
+ Name
+ Damage
+ Injuries
+
+ {organs.map((o, i) => (
+
+ {o.name}
+
+ 0 && '0.5rem'}
+ value={o.totalLoss / 100}
+ ranges={damageRange}
+ >
+
+ {!!o.bruteLoss && (
+
+
+ {toFixed(o.bruteLoss)}
+
+
+ )}
+ {!!o.fireLoss && (
+
+
+ {toFixed(o.fireLoss)}
+
+
+ )}
+
+ {toFixed(o.totalLoss)}
+
+
+
+
+ {reduceOrganStatus([
+ o.internalBleeding && 'Internal bleeding',
+ !!o.status.bleeding && 'External bleeding',
+ o.lungRuptured && 'Ruptured lung',
+ o.status.destroyed && 'Destroyed',
+ !!o.status.broken && o.status.broken,
+ germStatus(o.germ_level),
+ !!o.open && 'Open incision',
+ ])}
+
+
+ {reduceOrganStatus([
+ !!o.status.splinted && 'Splinted',
+ !!o.status.robotic && 'Robotic',
+ !!o.status.dead && DEAD ,
+ ])}
+ {reduceOrganStatus(
+ o.implants.map((s) => (s.known ? s.name : 'Unknown object')),
+ )}
+
+
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOrgansInternal.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOrgansInternal.tsx
new file mode 100644
index 0000000000..af44217f2d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainOrgansInternal.tsx
@@ -0,0 +1,63 @@
+import { toFixed } from 'common/math';
+
+import { Box, ProgressBar, Section, Table } from '../../components';
+import { damageRange } from './constants';
+import { germStatus, reduceOrganStatus } from './functions';
+import { internalOrgan } from './types';
+
+export const BodyScannerMainOrgansInternal = (props: {
+ organs: internalOrgan[];
+}) => {
+ const { organs } = props;
+
+ if (organs.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+
+ Name
+ Damage
+ Injuries
+
+ {organs.map((o, i) => (
+
+ {o.name}
+
+ 0 && '0.5rem'}
+ ranges={damageRange}
+ >
+ {toFixed(o.damage)}
+
+
+
+
+ {reduceOrganStatus([
+ germStatus(o.germ_level),
+ !!o.inflamed && 'Appendicitis detected.',
+ ])}
+
+
+ {reduceOrganStatus([
+ o.robotic === 1 && 'Robotic',
+ o.robotic === 2 && 'Assisted',
+ !!o.dead && DEAD ,
+ ])}
+
+
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainReagents.tsx b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainReagents.tsx
new file mode 100644
index 0000000000..922cb4059a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/BodyScannerMainReagents.tsx
@@ -0,0 +1,53 @@
+import { Box, Section, Table } from '../../components';
+import { occupant } from './types';
+
+export const BodyScannerMainReagents = (props: { occupant: occupant }) => {
+ const { occupant } = props;
+
+ return (
+ <>
+
+ {occupant.reagents ? (
+
+
+ Reagent
+ Amount
+
+ {occupant.reagents.map((reagent) => (
+
+ {reagent.name}
+
+ {reagent.amount} Units{' '}
+ {reagent.overdose ? OVERDOSING : null}
+
+
+ ))}
+
+ ) : (
+ No Blood Reagents Detected
+ )}
+
+
+ {occupant.ingested ? (
+
+
+ Reagent
+ Amount
+
+ {occupant.ingested.map((reagent) => (
+
+ {reagent.name}
+
+ {reagent.amount} Units{' '}
+ {reagent.overdose ? OVERDOSING : null}
+
+
+ ))}
+
+ ) : (
+ No Stomach Reagents Detected
+ )}
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/constants.ts b/tgui/packages/tgui/interfaces/BodyScanner/constants.ts
new file mode 100644
index 0000000000..14dfe60770
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/constants.ts
@@ -0,0 +1,62 @@
+import { occupant } from './types';
+
+export const stats: string[][] = [
+ ['good', 'Alive'],
+ ['average', 'Unconscious'],
+ ['bad', 'DEAD'],
+];
+
+export const abnormalities: (string | ((occupant: occupant) => string))[][] = [
+ [
+ 'hasBorer',
+ 'bad',
+ (occupant) =>
+ 'Large growth detected in frontal lobe,' +
+ ' possibly cancerous. Surgical removal is recommended.',
+ ],
+ ['hasVirus', 'bad', (occupant) => 'Viral pathogen detected in blood stream.'],
+ ['blind', 'average', (occupant) => 'Cataracts detected.'],
+ [
+ 'colourblind',
+ 'average',
+ (occupant) => 'Photoreceptor abnormalities detected.',
+ ],
+ ['nearsighted', 'average', (occupant) => 'Retinal misalignment detected.'],
+ [
+ 'humanPrey',
+ 'average',
+ (occupant) => {
+ return 'Foreign Humanoid(s) detected: ' + occupant.humanPrey;
+ },
+ ],
+ [
+ 'livingPrey',
+ 'average',
+ (occupant) => {
+ return 'Foreign Creature(s) detected: ' + occupant.livingPrey;
+ },
+ ],
+ [
+ 'objectPrey',
+ 'average',
+ (occupant) => {
+ return 'Foreign Object(s) detected: ' + occupant.objectPrey;
+ },
+ ],
+];
+
+export const damages: string[][] = [
+ ['Respiratory', 'oxyLoss'],
+ ['Brain', 'brainLoss'],
+ ['Toxin', 'toxLoss'],
+ ['Radiation', 'radLoss'],
+ ['Brute', 'bruteLoss'],
+ ['Genetic', 'cloneLoss'],
+ ['Burn', 'fireLoss'],
+ ['Paralysis', 'paralysis'],
+];
+
+export const damageRange: Record = {
+ average: [0.25, 0.5],
+ bad: [0.5, Infinity],
+};
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/functions.tsx b/tgui/packages/tgui/interfaces/BodyScanner/functions.tsx
new file mode 100644
index 0000000000..3c43d892f0
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/functions.tsx
@@ -0,0 +1,58 @@
+import { BooleanLike } from 'common/react';
+
+import { Box } from '../../components';
+
+/*
+ */
+export function mapTwoByTwo(a: any[][], c: any) {
+ let result: any[] = [];
+ for (let i = 0; i < a.length; i += 2) {
+ result.push(c(a[i], a[i + 1], i));
+ }
+ return result;
+}
+
+export function reduceOrganStatus(
+ A: (string | BooleanLike | React.ReactElement)[],
+) {
+ return A.length > 0
+ ? A.reduce((a, s) =>
+ a === null ? (
+ s
+ ) : (
+ <>
+ {a}
+ {!!s && {s} }
+ >
+ ),
+ )
+ : null;
+}
+
+export function germStatus(i: number): string {
+ if (i > 100) {
+ if (i < 300) {
+ return 'mild infection';
+ }
+ if (i < 400) {
+ return 'mild infection+';
+ }
+ if (i < 500) {
+ return 'mild infection++';
+ }
+ if (i < 700) {
+ return 'acute infection';
+ }
+ if (i < 800) {
+ return 'acute infection+';
+ }
+ if (i < 900) {
+ return 'acute infection++';
+ }
+ if (i >= 900) {
+ return 'septic';
+ }
+ }
+
+ return '';
+}
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/index.tsx b/tgui/packages/tgui/interfaces/BodyScanner/index.tsx
new file mode 100644
index 0000000000..d44bc0d78b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/index.tsx
@@ -0,0 +1,23 @@
+import { useBackend } from '../../backend';
+import { Window } from '../../layouts';
+import { BodyScannerEmpty } from './BodyScannerEmpty';
+import { BodyScannerMain } from './BodyScannerMain';
+import { Data, occupant } from './types';
+
+export const BodyScanner = (props) => {
+ const { data } = useBackend();
+ const { occupied, occupant = {} as occupant } = data;
+ const body = occupied ? (
+
+ ) : (
+
+ );
+ return (
+
+
+ {body}
+
+
+ );
+};
+6;
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/types.ts b/tgui/packages/tgui/interfaces/BodyScanner/types.ts
new file mode 100644
index 0000000000..45aacd61ce
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/BodyScanner/types.ts
@@ -0,0 +1,77 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ occupied: BooleanLike;
+ occupant: occupant;
+};
+
+export type occupant = {
+ name: string;
+ stat: number;
+ health: number;
+ maxHealth: number;
+ hasVirus: number;
+ bruteLoss: number;
+ oxyLoss: number;
+ toxLoss: number;
+ fireLoss: number;
+ radLoss: number;
+ cloneLoss: number;
+ brainLoss: number;
+ paralysis: number;
+ paralysisSeconds: number;
+ bodyTempC: number;
+ bodyTempF: number;
+ hasBorer: BooleanLike;
+ colourblind: BooleanLike;
+ blood: { volume: number; percent: number };
+ reagents: reagent[];
+ ingested: reagent[];
+ extOrgan: externalOrgan[];
+ intOrgan: internalOrgan[];
+ blind: BooleanLike;
+ nearsighted: BooleanLike;
+ livingPrey: number;
+ humanPrey: number;
+ objectPrey: number;
+ weight: number;
+};
+
+type reagent = { name: string; amount: number; overdose: BooleanLike };
+
+export type internalOrgan = {
+ name: string;
+ desc: string | null;
+ germ_level: number;
+ damage: number;
+ maxHealth: number;
+ bruised: number;
+ broken: number;
+ robotic: BooleanLike;
+ dead: BooleanLike;
+ inflamed: BooleanLike;
+};
+
+export type externalOrgan = {
+ name: string;
+ open: BooleanLike;
+ germ_level: number;
+ bruteLoss: number;
+ fireLoss: number;
+ totalLoss: number;
+ maxHealth: number;
+ bruised: number;
+ broken: number;
+ implants: { name: string; known: BooleanLike }[];
+ implants_len: number;
+ status: {
+ destroyed: BooleanLike;
+ broken: string;
+ robotic: BooleanLike;
+ splinted: BooleanLike;
+ bleeding: BooleanLike;
+ dead: BooleanLike;
+ };
+ lungRuptured: BooleanLike;
+ internalBleeding: BooleanLike;
+};
diff --git a/tgui/packages/tgui/interfaces/BombTester.jsx b/tgui/packages/tgui/interfaces/BombTester.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/BombTester.jsx
rename to tgui/packages/tgui/interfaces/BombTester.tsx
index c1e1a2afe9..1fe140210f 100644
--- a/tgui/packages/tgui/interfaces/BombTester.jsx
+++ b/tgui/packages/tgui/interfaces/BombTester.tsx
@@ -1,11 +1,23 @@
+import { BooleanLike } from 'common/react';
import { Component } from 'react';
import { useBackend } from '../backend';
import { Box, Button, Icon, LabeledList, Section, Slider } from '../components';
import { Window } from '../layouts';
+type Data = {
+ simulating: BooleanLike;
+ mode: number;
+ tank1: string;
+ tank1ref: string;
+ tank2: string;
+ tank2ref: string;
+ canister: string | null;
+ sim_canister_output: number;
+};
+
export const BombTester = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
simulating,
@@ -96,7 +108,7 @@ export const BombTester = (props) => {
minValue={0}
value={sim_canister_output}
maxValue={1013.25}
- onDrag={(e, val) =>
+ onDrag={(e, val: number) =>
act('set_can_pressure', { pressure: val })
}
/>
@@ -120,16 +132,26 @@ export const BombTester = (props) => {
);
};
+type stateType = {
+ reverseX: boolean;
+ reverseY: boolean;
+ x: number;
+ y: number;
+};
+
class BombTesterSimulation extends Component {
+ process: NodeJS.Timeout;
+ state: stateType;
+
constructor(props) {
super(props);
- const BOUND_X = 340;
- const BOUND_Y = 205;
- const MOVEMENT_SPEED = 2;
+ const BOUND_X: number = 340;
+ const BOUND_Y: number = 205;
+ const MOVEMENT_SPEED: number = 2;
- let startRight = Math.random() > 0.5;
- let startBottom = Math.random() > 0.5;
+ let startRight: boolean = Math.random() > 0.5;
+ let startBottom: boolean = Math.random() > 0.5;
this.state = {
x: startRight ? BOUND_X : 0,
@@ -139,7 +161,7 @@ class BombTesterSimulation extends Component {
};
this.process = setInterval(() => {
- this.setState((prevState) => {
+ this.setState((prevState: stateType) => {
const state = { ...prevState };
if (state.reverseX) {
if (state.x - MOVEMENT_SPEED < -5) {
diff --git a/tgui/packages/tgui/interfaces/BotanyEditor.jsx b/tgui/packages/tgui/interfaces/BotanyEditor.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/BotanyEditor.jsx
rename to tgui/packages/tgui/interfaces/BotanyEditor.tsx
index 5210e31dd7..b870981289 100644
--- a/tgui/packages/tgui/interfaces/BotanyEditor.jsx
+++ b/tgui/packages/tgui/interfaces/BotanyEditor.tsx
@@ -1,9 +1,20 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, NoticeBox, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ activity: BooleanLike;
+ degradation: number;
+ disk: BooleanLike;
+ loaded: string | number;
+ sourceName: string;
+ locus: string[];
+};
+
export const BotanyEditor = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { activity, degradation, disk, sourceName, locus, loaded } = data;
diff --git a/tgui/packages/tgui/interfaces/BotanyIsolator.jsx b/tgui/packages/tgui/interfaces/BotanyIsolator.tsx
similarity index 91%
rename from tgui/packages/tgui/interfaces/BotanyIsolator.jsx
rename to tgui/packages/tgui/interfaces/BotanyIsolator.tsx
index b46e434268..12c8e45e2c 100644
--- a/tgui/packages/tgui/interfaces/BotanyIsolator.jsx
+++ b/tgui/packages/tgui/interfaces/BotanyIsolator.tsx
@@ -1,9 +1,21 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, NoticeBox, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ geneMasks: { tag: string; mask: string }[];
+ activity: BooleanLike;
+ degradation: number;
+ disk: BooleanLike;
+ loaded: string | number;
+ hasGenetics: BooleanLike;
+ sourceName: string;
+};
+
export const BotanyIsolator = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
geneMasks,
diff --git a/tgui/packages/tgui/interfaces/BrigTimer.jsx b/tgui/packages/tgui/interfaces/BrigTimer.tsx
similarity index 60%
rename from tgui/packages/tgui/interfaces/BrigTimer.jsx
rename to tgui/packages/tgui/interfaces/BrigTimer.tsx
index 44e693a609..a0ab78e35d 100644
--- a/tgui/packages/tgui/interfaces/BrigTimer.jsx
+++ b/tgui/packages/tgui/interfaces/BrigTimer.tsx
@@ -1,12 +1,36 @@
import { round } from 'common/math';
+import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import { Button, Flex, NumberInput, Section } from '../components';
import { formatTime } from '../format';
import { Window } from '../layouts';
+type Data = {
+ time_left: number;
+ max_time_left: number;
+ timing: BooleanLike;
+ flash_found: BooleanLike;
+ flash_charging: BooleanLike;
+ preset_short: number;
+ preset_medium: number;
+ preset_long: number;
+};
+
export const BrigTimer = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
+ const {
+ time_left,
+ max_time_left,
+ timing,
+ flash_found,
+ flash_charging,
+ preset_short,
+ preset_medium,
+ preset_long,
+ } = data;
+
return (
@@ -16,18 +40,18 @@ export const BrigTimer = (props) => {
<>
act(data.timing ? 'stop' : 'start')}
+ selected={timing}
+ onClick={() => act(timing ? 'stop' : 'start')}
>
- {data.timing ? 'Stop' : 'Start'}
+ {timing ? 'Stop' : 'Start'}
- {(data.flash_found && (
+ {(flash_found && (
act('flash')}
>
- {data.flash_charging ? 'Recharging' : 'Flash'}
+ {flash_charging ? 'Recharging' : 'Flash'}
)) ||
null}
@@ -37,11 +61,11 @@ export const BrigTimer = (props) => {
formatTime(round(val * 10))}
- onDrag={(e, val) => act('time', { time: val })}
+ maxValue={max_time_left / 10}
+ format={(val: number) => formatTime(round(val * 10, 0))}
+ onDrag={(e, val: number) => act('time', { time: val })}
/>
@@ -50,7 +74,7 @@ export const BrigTimer = (props) => {
icon="hourglass-start"
onClick={() => act('preset', { preset: 'short' })}
>
- {'Add ' + formatTime(data.preset_short)}
+ {'Add ' + formatTime(preset_short)}
@@ -59,7 +83,7 @@ export const BrigTimer = (props) => {
icon="hourglass-start"
onClick={() => act('preset', { preset: 'medium' })}
>
- {'Add ' + formatTime(data.preset_medium)}
+ {'Add ' + formatTime(preset_medium)}
@@ -68,7 +92,7 @@ export const BrigTimer = (props) => {
icon="hourglass-start"
onClick={() => act('preset', { preset: 'long' })}
>
- {'Add ' + formatTime(data.preset_long)}
+ {'Add ' + formatTime(preset_long)}
diff --git a/tgui/packages/tgui/interfaces/CameraConsole.jsx b/tgui/packages/tgui/interfaces/CameraConsole.tsx
similarity index 74%
rename from tgui/packages/tgui/interfaces/CameraConsole.jsx
rename to tgui/packages/tgui/interfaces/CameraConsole.tsx
index 29ee68a38a..f558de6398 100644
--- a/tgui/packages/tgui/interfaces/CameraConsole.jsx
+++ b/tgui/packages/tgui/interfaces/CameraConsole.tsx
@@ -1,6 +1,6 @@
import { filter, sortBy } from 'common/collections';
import { flow } from 'common/fp';
-import { classes } from 'common/react';
+import { BooleanLike, classes } from 'common/react';
import { createSearch } from 'common/string';
import { useState } from 'react';
@@ -8,11 +8,25 @@ import { useBackend } from '../backend';
import { Button, ByondUi, Dropdown, Flex, Input, Section } from '../components';
import { Window } from '../layouts';
+type activeCamera = { name: string; status: BooleanLike } | null;
+
+type camera = { name: string; networks: string[] };
+
+export type Data = {
+ activeCamera: activeCamera;
+ mapRef: string;
+ cameras: camera[];
+ allNetworks: string[];
+};
+
/**
* Returns previous and next camera names relative to the currently
* active camera.
*/
-export const prevNextCamera = (cameras, activeCamera) => {
+export const prevNextCamera = (
+ cameras: camera[],
+ activeCamera: activeCamera,
+) => {
if (!activeCamera) {
return [];
}
@@ -22,32 +36,43 @@ export const prevNextCamera = (cameras, activeCamera) => {
return [cameras[index - 1]?.name, cameras[index + 1]?.name];
};
+function notEmpty(value: TValue | null | undefined): value is TValue {
+ return value !== null && value !== undefined;
+}
+
/**
* Camera selector.
*
* Filters cameras, applies search terms and sorts the alphabetically.
*/
-export const selectCameras = (cameras, searchText = '', networkFilter = '') => {
- const testSearch = createSearch(searchText, (camera) => camera.name);
+export const selectCameras = (
+ cameras: camera[],
+ searchText: string = '',
+ networkFilter: string = '',
+) => {
+ const testSearch = createSearch(searchText, (camera: camera) => camera.name);
return flow([
// Null camera filter
- filter((camera) => camera?.name),
+ filter((camera: camera) => notEmpty(camera?.name)),
// Optional search term
searchText && filter(testSearch),
// Optional network filter
networkFilter &&
- filter((camera) => camera.networks.includes(networkFilter)),
+ filter((camera: camera) => camera.networks.includes(networkFilter)),
// Slightly expensive, but way better than sorting in BYOND
- sortBy((camera) => camera.name),
+ sortBy((camera: camera) => camera.name),
])(cameras);
};
export const CameraConsole = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { mapRef, activeCamera } = data;
- const cameras = selectCameras(data.cameras);
- const [prevCameraName, nextCameraName] = prevNextCamera(
- cameras,
+
+ const { cameras } = data;
+
+ const selected_cameras: camera[] = selectCameras(cameras);
+ const [prevCameraName, nextCameraName]: string[] = prevNextCamera(
+ selected_cameras,
activeCamera,
);
return (
@@ -101,12 +126,16 @@ export const CameraConsole = (props) => {
};
export const CameraConsoleContent = (props) => {
- const { act, data } = useBackend();
- const [searchText, setSearchText] = useState('');
- const [networkFilter, setNetworkFilter] = useState('');
- const { activeCamera, allNetworks } = data;
+ const { act, data } = useBackend();
+ const [searchText, setSearchText] = useState('');
+ const [networkFilter, setNetworkFilter] = useState('');
+ const { activeCamera, allNetworks, cameras } = data;
allNetworks.sort();
- const cameras = selectCameras(data.cameras, searchText, networkFilter);
+ const selected_cameras: camera[] = selectCameras(
+ cameras,
+ searchText,
+ networkFilter,
+ );
return (
@@ -115,7 +144,7 @@ export const CameraConsoleContent = (props) => {
fluid
mt={1}
placeholder="Search for a camera"
- onInput={(e, value) => setSearchText(value)}
+ onInput={(e, value: string) => setSearchText(value)}
/>
@@ -147,7 +176,7 @@ export const CameraConsoleContent = (props) => {
- {cameras.map((camera) => (
+ {selected_cameras.map((camera) => (
// We're not using the component here because performance
// would be absolutely abysmal (50+ ms for each re-render).
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend
();
const {
connected,
can_relabel,
@@ -66,7 +79,7 @@ export const Canister = (props) => {
minValue={minReleasePressure}
maxValue={maxReleasePressure}
stepPixelSize={1}
- onDrag={(e, value) =>
+ onDrag={(e, value: number) =>
act('pressure', {
pressure: value,
})
diff --git a/tgui/packages/tgui/interfaces/Canvas.jsx b/tgui/packages/tgui/interfaces/Canvas.tsx
similarity index 69%
rename from tgui/packages/tgui/interfaces/Canvas.jsx
rename to tgui/packages/tgui/interfaces/Canvas.tsx
index 4d5d7015ee..d54eb7e66c 100644
--- a/tgui/packages/tgui/interfaces/Canvas.jsx
+++ b/tgui/packages/tgui/interfaces/Canvas.tsx
@@ -1,4 +1,5 @@
-import { Component, createRef } from 'react';
+import { BooleanLike } from 'common/react';
+import { Component, createRef, RefObject } from 'react';
import { useBackend } from '../backend';
import { Box, Button } from '../components';
@@ -6,7 +7,17 @@ import { Window } from '../layouts';
const PX_PER_UNIT = 24;
-class PaintCanvas extends Component {
+type PaintCanvasProps = Partial<{
+ onCanvasClick: (x: number, y: number) => void;
+ value: string[][];
+ dotsize: number;
+ res: number;
+}>;
+
+class PaintCanvas extends Component {
+ canvasRef: RefObject;
+ onCVClick: (x: number, y: number) => void;
+
constructor(props) {
super(props);
this.canvasRef = createRef();
@@ -21,16 +32,20 @@ class PaintCanvas extends Component {
this.drawCanvas(this.props);
}
- drawCanvas(propSource) {
- const ctx = this.canvasRef.current.getContext('2d');
+ drawCanvas(propSource: PaintCanvasProps) {
+ const canvas = this.canvasRef.current!;
+ const ctx = canvas.getContext('2d')!;
const grid = propSource.value;
+ if (!grid) {
+ return;
+ }
const x_size = grid.length;
if (!x_size) {
return;
}
const y_size = grid[0].length;
- const x_scale = Math.round(this.canvasRef.current.width / x_size);
- const y_scale = Math.round(this.canvasRef.current.height / y_size);
+ const x_scale = Math.round(canvas.width / x_size);
+ const y_scale = Math.round(canvas.height / y_size);
ctx.save();
ctx.scale(x_scale, y_scale);
for (let x = 0; x < grid.length; x++) {
@@ -44,14 +59,19 @@ class PaintCanvas extends Component {
ctx.restore();
}
- clickwrapper(event) {
- const x_size = this.props.value.length;
+ clickwrapper(event: React.MouseEvent) {
+ const value = this.props.value;
+ if (!value) {
+ return;
+ }
+ const x_size = value.length;
if (!x_size) {
return;
}
const y_size = this.props.value[0].length;
- const x_scale = this.canvasRef.current.width / x_size;
- const y_scale = this.canvasRef.current.height / y_size;
+ const canvas = this.canvasRef.current!;
+ const x_scale = canvas.width / x_size;
+ const y_scale = canvas.height / y_size;
const x = Math.floor(event.nativeEvent.offsetX / x_scale) + 1;
const y = Math.floor(event.nativeEvent.offsetY / y_scale) + 1;
this.onCVClick(x, y);
@@ -80,8 +100,15 @@ const getImageSize = (value) => {
return [width, height];
};
+type Data = {
+ grid: string[][];
+ name: string;
+ finalized: BooleanLike;
+};
+
export const Canvas = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
const dotsize = PX_PER_UNIT;
const [width, height] = getImageSize(data.grid);
return (
diff --git a/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.jsx b/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/CasinoPrizeDispenser.jsx
rename to tgui/packages/tgui/interfaces/CasinoPrizeDispenser.tsx
index 8e03666a51..6c13f446db 100644
--- a/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.jsx
+++ b/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.tsx
@@ -13,26 +13,36 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ items: Record;
+};
+
+type sortable = {
+ name: string;
+ affordable: number;
+ price: number;
+ restriction: string;
+};
+
const sortTypes = {
- Alphabetical: (a, b) => a.name > b.name,
- 'By availability': (a, b) => -(a.affordable - b.affordable),
- 'By price': (a, b) => a.price - b.price,
+ Alphabetical: (a: sortable, b: sortable) => a.name > b.name,
+ 'By price': (a: sortable, b: sortable) => a.price - b.price,
};
export const CasinoPrizeDispenser = () => {
- const [searchText, setSearchText] = useState('');
- const [sortOrder, setSortOrder] = useState('Alphabetical');
- const [descending, setDescending] = useState(false);
+ const [searchText, setSearchText] = useState('');
+ const [sortOrder, setSortOrder] = useState('Alphabetical');
+ const [descending, setDescending] = useState(false);
- function handleSearchText(value) {
+ function handleSearchText(value: string) {
setSearchText(value);
}
- function handleSortOrder(value) {
+ function handleSortOrder(value: string) {
setSortOrder(value);
}
- function handleDescending(value) {
+ function handleDescending(value: boolean) {
setDescending(value);
}
@@ -52,9 +62,6 @@ export const CasinoPrizeDispenser = () => {
searchText={searchText}
sortOrder={sortOrder}
descending={descending}
- onSearchText={handleSearchText}
- onSortOrder={handleSortOrder}
- onDescending={handleDescending}
/>
>
@@ -98,19 +105,18 @@ const CasinoPrizeDispenserSearch = (props) => {
};
const CasinoPrizeDispenserItems = (props) => {
- const { act, data } = useBackend();
- const { points, items } = data;
+ const { act, data } = useBackend();
+ const { items } = data;
// Search thingies
const searcher = createSearch(props.searchText, (item) => {
return item[0];
});
let has_contents = false;
- let contents = Object.entries(items).map((kv, _i) => {
+ let contents = Object.entries(items).map((kv) => {
let items_in_cat = Object.entries(kv[1])
.filter(searcher)
.map((kv2) => {
- kv2[1].affordable = points >= kv2[1].price;
return kv2[1];
})
.sort(sortTypes[props.sortOrder]);
@@ -143,15 +149,19 @@ const CasinoPrizeDispenserItems = (props) => {
);
};
-const CasinoPrizeDispenserItemsCategory = (props) => {
- const { act, data } = useBackend();
+const CasinoPrizeDispenserItemsCategory = (props: {
+ key: string;
+ title: string;
+ items: sortable[];
+}) => {
+ const { act } = useBackend();
const { title, items, ...rest } = props;
return (
{items.map((item) => (
{
+const getTagColor = (tag: string) => {
switch (tag) {
case 'Unset':
return 'label';
@@ -23,19 +24,36 @@ const getTagColor = (tag) => {
}
};
+type Data = {
+ personalVisibility: BooleanLike;
+ personalTag: string;
+ personalErpTag: string;
+ directory: character[];
+};
+
+type character = {
+ name: string;
+ species: string;
+ ooc_notes: string;
+ tag: string;
+ erptag: string;
+ character_ad: string;
+ flavor_text: string;
+};
+
export const CharacterDirectory = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { personalVisibility, personalTag, personalErpTag } = data;
- const [overlay, setOverlay] = useState(null);
- const [overwritePrefs, setOverwritePrefs] = useState(false);
+ const [overlay, setOverlay] = useState(null);
+ const [overwritePrefs, setOverwritePrefs] = useState(false);
- function handleOverlay(value) {
+ function handleOverlay(value: character | null) {
setOverlay(value);
}
return (
-
+
{(overlay && (
@@ -119,29 +137,29 @@ const ViewCharacter = (props) => {
}
>
-
+
-
+
-
+
-
-
+
+
{props.overlay.character_ad || 'Unset.'}
-
-
+
+
{props.overlay.ooc_notes || 'Unset.'}
-
-
+
+
{props.overlay.flavor_text || 'Unset.'}
@@ -150,17 +168,17 @@ const ViewCharacter = (props) => {
};
const CharacterDirectoryList = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { directory } = data;
- const [sortId, setSortId] = useState('name');
- const [sortOrder, setSortOrder] = useState('name');
+ const [sortId, setSortId] = useState('name');
+ const [sortOrder, setSortOrder] = useState('name');
- function handleSortId(value) {
+ function handleSortId(value: string) {
setSortId(value);
}
- function handleSortOrder(value) {
+ function handleSortOrder(value: string) {
setSortOrder(value);
}
@@ -243,9 +261,14 @@ const CharacterDirectoryList = (props) => {
);
};
-const SortButton = (props) => {
- const { act, data } = useBackend();
-
+const SortButton = (props: {
+ id: string;
+ sortId: string;
+ sortOrder: string;
+ onSortId: Function;
+ onSortOrder: Function;
+ children: ReactNode | string;
+}) => {
const { id, children } = props;
// Hey, same keys mean same data~
diff --git a/tgui/packages/tgui/interfaces/CheckboxInput.tsx b/tgui/packages/tgui/interfaces/CheckboxInput.tsx
index 30ed63d08b..de6fe94eff 100644
--- a/tgui/packages/tgui/interfaces/CheckboxInput.tsx
+++ b/tgui/packages/tgui/interfaces/CheckboxInput.tsx
@@ -97,7 +97,7 @@ export const CheckboxInput = (props) => {
setSearchQuery(value)}
+ onInput={(e, value: string) => setSearchQuery(value)}
/>
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.jsx b/tgui/packages/tgui/interfaces/ChemDispenser.jsx
deleted file mode 100644
index 801fe33dd3..0000000000
--- a/tgui/packages/tgui/interfaces/ChemDispenser.jsx
+++ /dev/null
@@ -1,175 +0,0 @@
-import { useBackend } from '../backend';
-import { Box, Button, Flex, LabeledList, Section, Slider } from '../components';
-import { BeakerContents } from '../interfaces/common/BeakerContents';
-import { Window } from '../layouts';
-
-const dispenseAmounts = [5, 10, 20, 30, 40, 60];
-const removeAmounts = [1, 5, 10];
-
-export const ChemDispenser = (props) => {
- return (
-
-
-
-
-
-
-
- );
-};
-
-const ChemDispenserSettings = (properties) => {
- const { act, data } = useBackend();
- const { amount } = data;
- return (
-
-
-
- {dispenseAmounts.map((a, i) => (
-
- act('amount', {
- amount: a,
- })
- }
- >
- {a + 'u'}
-
- ))}
-
-
-
- act('amount', {
- amount: value,
- })
- }
- />
-
-
-
- );
-};
-
-const ChemDispenserChemicals = (properties) => {
- const { act, data } = useBackend();
- const { chemicals = [] } = data;
- const flexFillers = [];
- for (let i = 0; i < (chemicals.length + 1) % 3; i++) {
- flexFillers.push(true);
- }
- return (
-
-
- {chemicals.map((c, i) => (
-
-
- act('dispense', {
- reagent: c.id,
- })
- }
- >
- {c.title + ' (' + c.amount + ')'}
-
-
- ))}
- {flexFillers.map((_, i) => (
-
- ))}
-
-
- );
-};
-
-const ChemDispenserBeaker = (properties) => {
- const { act, data } = useBackend();
- const {
- isBeakerLoaded,
- beakerCurrentVolume,
- beakerMaxVolume,
- beakerContents = [],
- } = data;
- return (
-
- {!!isBeakerLoaded && (
-
- {beakerCurrentVolume} / {beakerMaxVolume} units
-
- )}
- act('ejectBeaker')}
- >
- Eject
-
-
- }
- >
- (
- <>
-
- act('remove', {
- reagent: chemical.id,
- amount: -1,
- })
- }
- >
- Isolate
-
- {removeAmounts.map((a, i) => (
-
- act('remove', {
- reagent: chemical.id,
- amount: a,
- })
- }
- >
- {a}
-
- ))}
-
- act('remove', {
- reagent: chemical.id,
- amount: chemical.volume,
- })
- }
- >
- ALL
-
- >
- )}
- />
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx
new file mode 100644
index 0000000000..b9946802ac
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserBeaker.tsx
@@ -0,0 +1,81 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { BeakerContents } from '.././common/BeakerContents';
+import { removeAmounts } from './constants';
+import { Data } from './types';
+
+export const ChemDispenserBeaker = (props) => {
+ const { act, data } = useBackend();
+ const {
+ isBeakerLoaded,
+ beakerCurrentVolume,
+ beakerMaxVolume,
+ beakerContents = [],
+ } = data;
+ return (
+
+ {!!isBeakerLoaded && (
+
+ {beakerCurrentVolume} / {beakerMaxVolume} units
+
+ )}
+ act('ejectBeaker')}
+ >
+ Eject
+
+
+ }
+ >
+ (
+ <>
+
+ act('remove', {
+ reagent: chemical.id,
+ amount: -1,
+ })
+ }
+ >
+ Isolate
+
+ {removeAmounts.map((a, i) => (
+
+ act('remove', {
+ reagent: chemical.id,
+ amount: a,
+ })
+ }
+ >
+ {a}
+
+ ))}
+
+ act('remove', {
+ reagent: chemical.id,
+ amount: chemical.volume,
+ })
+ }
+ >
+ ALL
+
+ >
+ )}
+ />
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserChemicals.tsx b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserChemicals.tsx
new file mode 100644
index 0000000000..06160da65f
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserChemicals.tsx
@@ -0,0 +1,41 @@
+import { useBackend } from '../../backend';
+import { Button, Flex, Section } from '../../components';
+import { Data } from './types';
+
+export const ChemDispenserChemicals = (props) => {
+ const { act, data } = useBackend();
+ const { chemicals = [] } = data;
+ const flexFillers: boolean[] = [];
+ for (let i = 0; i < (chemicals.length + 1) % 3; i++) {
+ flexFillers.push(true);
+ }
+ return (
+
+
+ {chemicals.map((c, i) => (
+
+
+ act('dispense', {
+ reagent: c.id,
+ })
+ }
+ >
+ {c.name + ' (' + c.volume + ')'}
+
+
+ ))}
+ {flexFillers.map((_, i) => (
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx
new file mode 100644
index 0000000000..2a55775822
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/ChemDispenserSettings.tsx
@@ -0,0 +1,46 @@
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section, Slider } from '../../components';
+import { dispenseAmounts } from './constants';
+import { Data } from './types';
+
+export const ChemDispenserSettings = (props) => {
+ const { act, data } = useBackend();
+ const { amount } = data;
+ return (
+
+
+
+ {dispenseAmounts.map((a, i) => (
+
+ act('amount', {
+ amount: a,
+ })
+ }
+ >
+ {a + 'u'}
+
+ ))}
+
+
+
+ act('amount', {
+ amount: value,
+ })
+ }
+ />
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/constants.ts b/tgui/packages/tgui/interfaces/ChemDispenser/constants.ts
new file mode 100644
index 0000000000..8555508f50
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/constants.ts
@@ -0,0 +1,2 @@
+export const dispenseAmounts: number[] = [5, 10, 20, 30, 40, 60];
+export const removeAmounts: number[] = [1, 5, 10];
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/index.tsx b/tgui/packages/tgui/interfaces/ChemDispenser/index.tsx
new file mode 100644
index 0000000000..9e47296c17
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/index.tsx
@@ -0,0 +1,16 @@
+import { Window } from '../../layouts';
+import { ChemDispenserBeaker } from './ChemDispenserBeaker';
+import { ChemDispenserChemicals } from './ChemDispenserChemicals';
+import { ChemDispenserSettings } from './ChemDispenserSettings';
+
+export const ChemDispenser = (props) => {
+ return (
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemDispenser/types.ts b/tgui/packages/tgui/interfaces/ChemDispenser/types.ts
new file mode 100644
index 0000000000..f558816663
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemDispenser/types.ts
@@ -0,0 +1,13 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ amount: number;
+ isBeakerLoaded: BooleanLike;
+ glass: BooleanLike;
+ beakerContents: reagent[];
+ beakerCurrentVolume: number | null;
+ beakerMaxVolume: number | null;
+ chemicals: reagent[];
+};
+
+type reagent = { name: string; id: string; volume: number };
diff --git a/tgui/packages/tgui/interfaces/ChemMaster.jsx b/tgui/packages/tgui/interfaces/ChemMaster.jsx
deleted file mode 100644
index 8e154bf0b9..0000000000
--- a/tgui/packages/tgui/interfaces/ChemMaster.jsx
+++ /dev/null
@@ -1,496 +0,0 @@
-import { classes } from '../.././common/react';
-import { useBackend } from '../backend';
-import { Box, Button, Flex, Icon, LabeledList, Section } from '../components';
-import { Window } from '../layouts';
-import { BeakerContents } from './common/BeakerContents';
-import {
- ComplexModal,
- modalOpen,
- modalRegisterBodyOverride,
-} from './common/ComplexModal';
-
-const transferAmounts = [1, 5, 10, 30, 60];
-const bottleStyles = [
- 'bottle.png',
- 'small_bottle.png',
- 'wide_bottle.png',
- 'round_bottle.png',
- 'reagent_bottle.png',
-];
-
-const analyzeModalBodyOverride = (modal) => {
- const { act, data } = useBackend();
- const result = modal.args.analysis;
- return (
-
-
-
- {result.name}
-
- {(result.desc || '').length > 0 ? result.desc : 'N/A'}
-
- {result.blood_type && (
- <>
-
- {result.blood_type}
-
-
- {result.blood_dna}
-
- >
- )}
- {!data.condi && (
-
- act('print', {
- idx: result.idx,
- beaker: modal.args.beaker,
- })
- }
- >
- Print
-
- )}
-
-
-
- );
-};
-
-export const ChemMaster = (props) => {
- const { data } = useBackend();
- const {
- condi,
- beaker,
- beaker_reagents = [],
- buffer_reagents = [],
- mode,
- } = data;
- return (
-
-
-
- 0}
- />
-
- 0}
- />
- {/* */}
-
-
- );
-};
-
-const ChemMasterBeaker = (props) => {
- const { act, data } = useBackend();
- const { beaker, beakerReagents, bufferNonEmpty } = props;
-
- let headerButton = bufferNonEmpty ? (
- act('eject')}
- >
- Eject and Clear Buffer
-
- ) : (
- act('eject')}>
- Eject and Clear Buffer
-
- );
-
- return (
-
- {beaker ? (
- (
-
-
- modalOpen('analyze', {
- idx: i + 1,
- beaker: 1,
- })
- }
- >
- Analyze
-
- {transferAmounts.map((am, j) => (
-
- act('add', {
- id: chemical.id,
- amount: am,
- })
- }
- >
- {am}
-
- ))}
-
- act('add', {
- id: chemical.id,
- amount: chemical.volume,
- })
- }
- >
- All
-
-
- modalOpen('addcustom', {
- id: chemical.id,
- })
- }
- >
- Custom..
-
-
- )}
- />
- ) : (
- No beaker loaded.
- )}
-
- );
-};
-
-const ChemMasterBuffer = (props) => {
- const { act } = useBackend();
- const { mode, bufferReagents = [] } = props;
- return (
-
- Transferring to
- act('toggle')}
- >
- {mode ? 'Beaker' : 'Disposal'}
-
-
- }
- >
- {bufferReagents.length > 0 ? (
- (
-
-
- modalOpen('analyze', {
- idx: i + 1,
- beaker: 0,
- })
- }
- >
- Analyze
-
- {transferAmounts.map((am, i) => (
-
- act('remove', {
- id: chemical.id,
- amount: am,
- })
- }
- >
- {am}
-
- ))}
-
- act('remove', {
- id: chemical.id,
- amount: chemical.volume,
- })
- }
- >
- All
-
-
- modalOpen('removecustom', {
- id: chemical.id,
- })
- }
- >
- Custom..
-
-
- )}
- />
- ) : (
- Buffer is empty.
- )}
-
- );
-};
-
-const ChemMasterProduction = (props) => {
- const { act, data } = useBackend();
- if (!props.bufferNonEmpty) {
- return (
- act('ejectp')}
- >
- {data.loaded_pill_bottle
- ? data.loaded_pill_bottle_name +
- ' (' +
- data.loaded_pill_bottle_contents_len +
- '/' +
- data.loaded_pill_bottle_storage_slots +
- ')'
- : 'No pill bottle loaded'}
-
- }
- >
-
-
-
-
- Buffer is empty.
-
-
-
- );
- }
-
- return (
- act('ejectp')}
- >
- {data.loaded_pill_bottle
- ? data.loaded_pill_bottle_name +
- ' (' +
- data.loaded_pill_bottle_contents_len +
- '/' +
- data.loaded_pill_bottle_storage_slots +
- ')'
- : 'No pill bottle loaded'}
-
- }
- >
- {!props.isCondiment ? (
-
- ) : (
-
- )}
-
- );
-};
-
-const ChemMasterProductionChemical = (props) => {
- const { act, data } = useBackend();
- return (
-
-
- modalOpen('create_pill')}
- >
- One (60u max)
-
- modalOpen('create_pill_multiple')}
- >
- Multiple
-
-
- modalOpen('change_pill_style')}>
-
-
-
- Style
-
-
-
- modalOpen('create_patch')}
- >
- One (60u max)
-
- modalOpen('create_patch_multiple')}
- >
- Multiple
-
-
-
- modalOpen('create_bottle')}
- >
- Create bottle (60u max)
-
- modalOpen('create_bottle_multiple')}
- >
- Multiple
-
-
- modalOpen('change_bottle_style')}>
-
-
-
- Style
-
-
-
- );
-};
-
-const ChemMasterProductionCondiment = (props) => {
- const { act } = useBackend();
- return (
- <>
- modalOpen('create_condi_pack')}
- >
- Create condiment pack (10u max)
-
-
- act('create_condi_bottle')}
- >
- Create bottle (60u max)
-
- >
- );
-};
-
-// const ChemMasterCustomization = (props) => {
-// const { act, data } = useBackend();
-// if (!data.loaded_pill_bottle) {
-// return (
-//
-//
-// None loaded.
-//
-//
-// );
-// }
-
-// return (
-//
-// act('ejectp')}
-// >
-// {data.loaded_pill_bottle
-// ? (
-// data.loaded_pill_bottle_name
-// + " ("
-// + data.loaded_pill_bottle_contents_len
-// + "/"
-// + data.loaded_pill_bottle_storage_slots
-// + ")"
-// )
-// : "None loaded"}
-//
-//
-// );
-// };
-
-modalRegisterBodyOverride('analyze', analyzeModalBodyOverride);
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterAnalyzeModalBodyOverride.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterAnalyzeModalBodyOverride.tsx
new file mode 100644
index 0000000000..f51100d3e1
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterAnalyzeModalBodyOverride.tsx
@@ -0,0 +1,53 @@
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, Section } from '../../components';
+import { Data, modalData } from './types';
+
+export const analyzeModalBodyOverride = (modal: modalData) => {
+ const { act, data } = useBackend();
+ const result = modal.args.analysis;
+ return (
+
+
+
+ {result.name}
+
+ {(result.desc || '').length > 0 ? result.desc : 'N/A'}
+
+ {result.blood_type && (
+ <>
+
+ {result.blood_type}
+
+
+ {result.blood_dna}
+
+ >
+ )}
+ {!data.condi && (
+
+ act('print', {
+ idx: result.idx,
+ beaker: modal.args.beaker,
+ })
+ }
+ >
+ Print
+
+ )}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx
new file mode 100644
index 0000000000..e42b4a3207
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBeaker.tsx
@@ -0,0 +1,94 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { BeakerContents } from '.././common/BeakerContents';
+import { modalOpen } from '.././common/ComplexModal';
+import { transferAmounts } from './constants';
+import { reagent } from './types';
+
+export const ChemMasterBeaker = (props: {
+ beaker: BooleanLike;
+ beakerReagents: reagent[];
+ bufferNonEmpty: BooleanLike;
+}) => {
+ const { act } = useBackend();
+ const { beaker, beakerReagents, bufferNonEmpty } = props;
+
+ let headerButton = bufferNonEmpty ? (
+ act('eject')}
+ >
+ Eject and Clear Buffer
+
+ ) : (
+ act('eject')}>
+ Eject and Clear Buffer
+
+ );
+
+ return (
+
+ {beaker ? (
+ (
+
+
+ modalOpen('analyze', {
+ idx: i + 1,
+ beaker: 1,
+ })
+ }
+ >
+ Analyze
+
+ {transferAmounts.map((am, j) => (
+
+ act('add', {
+ id: chemical.id,
+ amount: am,
+ })
+ }
+ >
+ {am}
+
+ ))}
+
+ act('add', {
+ id: chemical.id,
+ amount: chemical.volume,
+ })
+ }
+ >
+ All
+
+
+ modalOpen('addcustom', {
+ id: chemical.id,
+ })
+ }
+ >
+ Custom..
+
+
+ )}
+ />
+ ) : (
+ No beaker loaded.
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx
new file mode 100644
index 0000000000..3bd477b685
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterBuffer.tsx
@@ -0,0 +1,92 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { BeakerContents } from '.././common/BeakerContents';
+import { modalOpen } from '.././common/ComplexModal';
+import { transferAmounts } from './constants';
+import { reagent } from './types';
+
+export const ChemMasterBuffer = (props: {
+ mode: BooleanLike;
+ bufferReagents: reagent[];
+}) => {
+ const { act } = useBackend();
+ const { mode, bufferReagents = [] } = props;
+ return (
+
+ Transferring to
+ act('toggle')}
+ >
+ {mode ? 'Beaker' : 'Disposal'}
+
+
+ }
+ >
+ {bufferReagents.length > 0 ? (
+ (
+
+
+ modalOpen('analyze', {
+ idx: i + 1,
+ beaker: 0,
+ })
+ }
+ >
+ Analyze
+
+ {transferAmounts.map((am, i) => (
+
+ act('remove', {
+ id: chemical.id,
+ amount: am,
+ })
+ }
+ >
+ {am}
+
+ ))}
+
+ act('remove', {
+ id: chemical.id,
+ amount: chemical.volume,
+ })
+ }
+ >
+ All
+
+
+ modalOpen('removecustom', {
+ id: chemical.id,
+ })
+ }
+ >
+ Custom..
+
+
+ )}
+ />
+ ) : (
+ Buffer is empty.
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterCustomization.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterCustomization.tsx
new file mode 100644
index 0000000000..3e70da5f8e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterCustomization.tsx
@@ -0,0 +1,55 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { modalOpen } from '.././common/ComplexModal';
+
+export const ChemMasterCustomization = (props: {
+ loaded_pill_bottle: BooleanLike;
+ loaded_pill_bottle_name: string;
+ loaded_pill_bottle_contents_len: number;
+ loaded_pill_bottle_storage_slots: number;
+}) => {
+ const { act } = useBackend();
+
+ const {
+ loaded_pill_bottle,
+ loaded_pill_bottle_name,
+ loaded_pill_bottle_contents_len,
+ loaded_pill_bottle_storage_slots,
+ } = props;
+
+ if (!loaded_pill_bottle) {
+ return (
+
+ );
+ }
+
+ return (
+
+ modalOpen('change_pill_bottle_style')}
+ >
+ Customize Bottle Color
+
+ act('ejectp')}
+ >
+ {loaded_pill_bottle
+ ? loaded_pill_bottle_name +
+ ' (' +
+ loaded_pill_bottle_contents_len +
+ '/' +
+ loaded_pill_bottle_storage_slots +
+ ')'
+ : 'None loaded'}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProduction.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProduction.tsx
new file mode 100644
index 0000000000..59f9619c64
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProduction.tsx
@@ -0,0 +1,97 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import { Button, Flex, Icon, Section } from '../../components';
+import { ChemMasterProductionChemical } from './ChemMasterProductionChemical';
+import { ChemMasterProductionCondiment } from './ChemMasterProductionCondiment';
+
+export const ChemMasterProduction = (props: {
+ bufferNonEmpty: boolean;
+ isCondiment: BooleanLike;
+ loaded_pill_bottle: BooleanLike;
+ loaded_pill_bottle_name: string;
+ loaded_pill_bottle_contents_len: number;
+ loaded_pill_bottle_storage_slots: number;
+ pillsprite: string;
+ bottlesprite: string;
+}) => {
+ const { act } = useBackend();
+
+ const {
+ bufferNonEmpty,
+ isCondiment,
+ loaded_pill_bottle,
+ loaded_pill_bottle_name,
+ loaded_pill_bottle_contents_len,
+ loaded_pill_bottle_storage_slots,
+ pillsprite,
+ bottlesprite,
+ } = props;
+
+ if (!bufferNonEmpty) {
+ return (
+ act('ejectp')}
+ >
+ {loaded_pill_bottle
+ ? loaded_pill_bottle_name +
+ ' (' +
+ loaded_pill_bottle_contents_len +
+ '/' +
+ loaded_pill_bottle_storage_slots +
+ ')'
+ : 'No pill bottle loaded'}
+
+ }
+ >
+
+
+
+
+ Buffer is empty.
+
+
+
+ );
+ }
+
+ return (
+ act('ejectp')}
+ >
+ {loaded_pill_bottle
+ ? loaded_pill_bottle_name +
+ ' (' +
+ loaded_pill_bottle_contents_len +
+ '/' +
+ loaded_pill_bottle_storage_slots +
+ ')'
+ : 'No pill bottle loaded'}
+
+ }
+ >
+ {!isCondiment ? (
+
+ ) : (
+
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProductionChemical.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProductionChemical.tsx
new file mode 100644
index 0000000000..3b7a4c2e13
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProductionChemical.tsx
@@ -0,0 +1,111 @@
+import { classes } from '../../.././common/react';
+import { Box, Button, LabeledList } from '../../components';
+import { modalOpen } from '.././common/ComplexModal';
+
+export const ChemMasterProductionChemical = (props: {
+ pillsprite: string;
+ bottlesprite: string;
+}) => {
+ const { pillsprite, bottlesprite } = props;
+
+ return (
+
+
+ modalOpen('create_pill')}
+ >
+ One (60u max)
+
+ modalOpen('create_pill_multiple')}
+ >
+ Multiple
+
+
+ modalOpen('change_pill_style')}>
+
+
+
+ Style
+
+
+
+ modalOpen('create_patch')}
+ >
+ One (60u max)
+
+ modalOpen('create_patch_multiple')}
+ >
+ Multiple
+
+
+
+ modalOpen('create_bottle')}
+ >
+ Create bottle (60u max)
+
+ modalOpen('create_bottle_multiple')}
+ >
+ Multiple
+
+
+ modalOpen('change_bottle_style')}>
+
+
+
+ Style
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProductionCondiment.tsx b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProductionCondiment.tsx
new file mode 100644
index 0000000000..fd58ec8228
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/ChemMasterProductionCondiment.tsx
@@ -0,0 +1,26 @@
+import { useBackend } from '../../backend';
+import { Button } from '../../components';
+import { modalOpen } from '.././common/ComplexModal';
+
+export const ChemMasterProductionCondiment = (props) => {
+ const { act } = useBackend();
+ return (
+ <>
+ modalOpen('create_condi_pack')}
+ >
+ Create condiment pack (10u max)
+
+
+ act('create_condi_bottle')}
+ >
+ Create bottle (60u max)
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/constants.ts b/tgui/packages/tgui/interfaces/ChemMaster/constants.ts
new file mode 100644
index 0000000000..8fa1d18fa3
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/constants.ts
@@ -0,0 +1,8 @@
+export const transferAmounts: number[] = [1, 5, 10, 30, 60];
+export const bottleStyles: string[] = [
+ 'bottle.png',
+ 'small_bottle.png',
+ 'wide_bottle.png',
+ 'round_bottle.png',
+ 'reagent_bottle.png',
+];
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/index.tsx b/tgui/packages/tgui/interfaces/ChemMaster/index.tsx
new file mode 100644
index 0000000000..658ffc8f3c
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/index.tsx
@@ -0,0 +1,65 @@
+import { useBackend } from '../../backend';
+import { Window } from '../../layouts';
+import {
+ ComplexModal,
+ modalRegisterBodyOverride,
+} from '.././common/ComplexModal';
+import { analyzeModalBodyOverride } from './ChemMasterAnalyzeModalBodyOverride';
+import { ChemMasterBeaker } from './ChemMasterBeaker';
+import { ChemMasterBuffer } from './ChemMasterBuffer';
+import { ChemMasterProduction } from './ChemMasterProduction';
+import { Data } from './types';
+
+export const ChemMaster = (props) => {
+ const { data } = useBackend();
+ const {
+ condi,
+ beaker,
+ beaker_reagents = [],
+ buffer_reagents = [],
+ mode,
+ loaded_pill_bottle,
+ loaded_pill_bottle_name,
+ loaded_pill_bottle_contents_len,
+ loaded_pill_bottle_storage_slots,
+ pillsprite,
+ bottlesprite,
+ } = data;
+ return (
+
+
+
+ 0}
+ />
+
+ 0}
+ loaded_pill_bottle={loaded_pill_bottle}
+ loaded_pill_bottle_name={loaded_pill_bottle_name || ''}
+ loaded_pill_bottle_contents_len={loaded_pill_bottle_contents_len || 0}
+ loaded_pill_bottle_storage_slots={
+ loaded_pill_bottle_storage_slots || 0
+ }
+ pillsprite={pillsprite}
+ bottlesprite={bottlesprite}
+ />
+ {/* Vorestation Remove
+
+ */}
+
+
+ );
+};
+
+modalRegisterBodyOverride('analyze', analyzeModalBodyOverride);
diff --git a/tgui/packages/tgui/interfaces/ChemMaster/types.ts b/tgui/packages/tgui/interfaces/ChemMaster/types.ts
new file mode 100644
index 0000000000..a5b6dcdca0
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ChemMaster/types.ts
@@ -0,0 +1,40 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ condi: BooleanLike;
+ loaded_pill_bottle: BooleanLike;
+ loaded_pill_bottle_name: string | undefined;
+ loaded_pill_bottle_contents_len: number | undefined;
+ loaded_pill_bottle_storage_slots: number | undefined;
+ beaker: BooleanLike;
+ beaker_reagents: reagent[] | undefined;
+ buffer_reagents: reagent[] | undefined;
+ pillsprite: string;
+ bottlesprite: string;
+ mode: BooleanLike;
+ printing: BooleanLike;
+ modal: modalData;
+};
+
+export type reagent = {
+ name: string;
+ volume: number;
+ description: string;
+ id: string;
+};
+
+export type modalData = {
+ id: string;
+ text: string;
+ args: {
+ analysis: {
+ idx: string;
+ name: string;
+ desc: string;
+ blood_type: string | null;
+ blood_dna: string | null;
+ };
+ beaker: number;
+ };
+ type: string;
+};
diff --git a/tgui/packages/tgui/interfaces/ClawMachine.jsx b/tgui/packages/tgui/interfaces/ClawMachine.tsx
similarity index 91%
rename from tgui/packages/tgui/interfaces/ClawMachine.jsx
rename to tgui/packages/tgui/interfaces/ClawMachine.tsx
index a25e9e0395..3b43c19352 100644
--- a/tgui/packages/tgui/interfaces/ClawMachine.jsx
+++ b/tgui/packages/tgui/interfaces/ClawMachine.tsx
@@ -2,8 +2,15 @@ import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar } from '../components';
import { Window } from '../layouts';
+type Data = {
+ wintick: number;
+ instructions: string;
+ gameStatus: string;
+ winscreen: string;
+};
+
export const ClawMachine = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { wintick, instructions, gameStatus, winscreen } = data;
let body;
@@ -39,7 +46,7 @@ export const ClawMachine = (props) => {
average: [1, 7],
good: [8, Infinity],
}}
- value={data.wintick}
+ value={wintick}
minValue={0}
maxValue={10}
/>
diff --git a/tgui/packages/tgui/interfaces/Cleanbot.jsx b/tgui/packages/tgui/interfaces/Cleanbot.tsx
similarity index 91%
rename from tgui/packages/tgui/interfaces/Cleanbot.jsx
rename to tgui/packages/tgui/interfaces/Cleanbot.tsx
index 09632130d3..e66624a11e 100644
--- a/tgui/packages/tgui/interfaces/Cleanbot.jsx
+++ b/tgui/packages/tgui/interfaces/Cleanbot.tsx
@@ -1,9 +1,27 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ open: BooleanLike;
+ locked: BooleanLike;
+ patrol: BooleanLike;
+ vocal: BooleanLike;
+ wet_floors: BooleanLike;
+ spray_blood: BooleanLike;
+ version: string;
+ blood: BooleanLike;
+ rgbpanel: BooleanLike;
+ red_switch: BooleanLike;
+ green_switch: BooleanLike;
+ blue_switch: BooleanLike;
+};
+
export const Cleanbot = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
on,
@@ -11,7 +29,6 @@ export const Cleanbot = (props) => {
locked,
version,
blood,
- patrol,
vocal,
wet_floors,
spray_blood,
diff --git a/tgui/packages/tgui/interfaces/CloningConsole.jsx b/tgui/packages/tgui/interfaces/CloningConsole.jsx
deleted file mode 100644
index 99d10942ef..0000000000
--- a/tgui/packages/tgui/interfaces/CloningConsole.jsx
+++ /dev/null
@@ -1,458 +0,0 @@
-import { round } from 'common/math';
-
-import { resolveAsset } from '../assets';
-import { useBackend } from '../backend';
-import {
- Box,
- Button,
- Flex,
- Icon,
- LabeledList,
- NoticeBox,
- ProgressBar,
- Section,
- Tabs,
-} from '../components';
-import { COLORS } from '../constants';
-import {
- ComplexModal,
- modalRegisterBodyOverride,
-} from '../interfaces/common/ComplexModal';
-import { Window } from '../layouts';
-
-const viewRecordModalBodyOverride = (modal) => {
- const { act, data } = useBackend();
- const { activerecord, realname, health, unidentity, strucenzymes } =
- modal.args;
- const damages = health.split(' - ');
- return (
-
-
- {realname}
-
- {damages.length > 1 ? (
- <>
-
- {damages[0]}
-
- |
-
- {damages[2]}
-
- |
-
- {damages[3]}
-
- |
-
- {damages[1]}
-
- >
- ) : (
- Unknown
- )}
-
-
- {unidentity}
-
-
- {strucenzymes}
-
-
-
- act('disk', {
- option: 'load',
- })
- }
- >
- Import
-
-
- act('disk', {
- option: 'save',
- savetype: 'ui',
- })
- }
- >
- Export UI
-
-
- act('disk', {
- option: 'save',
- savetype: 'ue',
- })
- }
- >
- Export UI and UE
-
-
- act('disk', {
- option: 'save',
- savetype: 'se',
- })
- }
- >
- Export SE
-
-
-
-
- act('clone', {
- ref: activerecord,
- })
- }
- >
- Clone
-
- act('del_rec')}>
- Delete
-
-
-
-
- );
-};
-
-export const CloningConsole = (props) => {
- const { act, data } = useBackend();
- const { menu } = data;
- modalRegisterBodyOverride('view_rec', viewRecordModalBodyOverride);
- return (
-
-
-
-
-
-
-
-
-
- );
-};
-
-const CloningConsoleNavigation = (props) => {
- const { act, data } = useBackend();
- const { menu } = data;
- return (
-
-
- act('menu', {
- num: 1,
- })
- }
- >
- Main
-
-
- act('menu', {
- num: 2,
- })
- }
- >
- Records
-
-
- );
-};
-
-const CloningConsoleBody = (props) => {
- const { data } = useBackend();
- const { menu } = data;
- let body;
- if (menu === 1) {
- body = ;
- } else if (menu === 2) {
- body = ;
- }
- return body;
-};
-
-const CloningConsoleMain = (props) => {
- const { act, data } = useBackend();
- const {
- loading,
- scantemp,
- occupant,
- locked,
- can_brainscan,
- scan_mode,
- numberofpods,
- pods,
- selected_pod,
- } = data;
- const isLocked = locked && !!occupant;
- return (
- <>
-
-
- Scanner Lock:
-
- act('lock')}
- >
- {isLocked ? 'Engaged' : 'Disengaged'}
-
- act('eject')}
- >
- Eject Occupant
-
- >
- }
- >
-
-
- {loading ? (
-
-
- Scanning...
-
- ) : (
- {scantemp.text}
- )}
-
- {!!can_brainscan && (
-
- act('toggle_mode')}
- >
- {scan_mode ? 'Brain' : 'Body'}
-
-
- )}
-
- act('scan')}
- >
- Scan Occupant
-
-
-
- {numberofpods ? (
- pods.map((pod, i) => {
- let podAction;
- if (pod.status === 'cloning') {
- podAction = (
-
- {round(pod.progress, 0) + '%'}
-
- );
- } else if (pod.status === 'mess') {
- podAction = (
-
- ERROR
-
- );
- } else {
- podAction = (
-
- act('selectpod', {
- ref: pod.pod,
- })
- }
- >
- Select
-
- );
- }
-
- return (
-
-
- Pod #{i + 1}
- = 150 ? 'good' : 'bad'} inline>
- = 150 ? 'circle' : 'circle-o'} />
-
- {pod.biomass}
-
- {podAction}
-
- );
- })
- ) : (
- No pods detected. Unable to clone.
- )}
-
- >
- );
-};
-
-const CloningConsoleRecords = (props) => {
- const { act, data } = useBackend();
- const { records } = data;
- if (!records.length) {
- return (
-
-
-
-
- No records found.
-
-
- );
- }
- return (
-
- {records.map((record, i) => (
-
- act('view_rec', {
- ref: record.record,
- })
- }
- >
- {record.realname}
-
- ))}
-
- );
-};
-
-const CloningConsoleTemp = (props) => {
- const { act, data } = useBackend();
- const { temp } = data;
- if (!temp || !temp.text || temp.text.length <= 0) {
- return;
- }
-
- const tempProp = { [temp.style]: true };
- return (
-
-
- {temp.text}
-
- act('cleartemp')}
- />
-
-
- );
-};
-
-const CloningConsoleStatus = (props) => {
- const { act, data } = useBackend();
- const { scanner, numberofpods, autoallowed, autoprocess, disk } = data;
- return (
-
- {!!autoallowed && (
- <>
-
- Auto-processing:
-
-
- act('autoprocess', {
- on: autoprocess ? 0 : 1,
- })
- }
- >
- {autoprocess ? 'Enabled' : 'Disabled'}
-
- >
- )}
-
- act('disk', {
- option: 'eject',
- })
- }
- >
- Eject Disk
-
- >
- }
- >
-
-
- {scanner ? (
- Connected
- ) : (
- Not connected!
- )}
-
-
- {numberofpods ? (
- {numberofpods} connected
- ) : (
- None connected!
- )}
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleBodyOverride.tsx b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleBodyOverride.tsx
new file mode 100644
index 0000000000..fb6a649152
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleBodyOverride.tsx
@@ -0,0 +1,115 @@
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, Section } from '../../components';
+import { COLORS } from '../../constants';
+import { Data, modalData } from './types';
+
+export const viewRecordModalBodyOverride = (modal: modalData) => {
+ const { act, data } = useBackend();
+
+ const { disk, podready } = data;
+
+ const { activerecord, realname, health, unidentity, strucenzymes } =
+ modal.args;
+ const damages = health.split(' - ');
+ return (
+
+
+ {realname}
+
+ {damages.length > 1 ? (
+ <>
+
+ {damages[0]}
+
+ |
+
+ {damages[2]}
+
+ |
+
+ {damages[3]}
+
+ |
+
+ {damages[1]}
+
+ >
+ ) : (
+ Unknown
+ )}
+
+
+ {unidentity}
+
+
+ {strucenzymes}
+
+
+
+ act('disk', {
+ option: 'load',
+ })
+ }
+ >
+ Import
+
+
+ act('disk', {
+ option: 'save',
+ savetype: 'ui',
+ })
+ }
+ >
+ Export UI
+
+
+ act('disk', {
+ option: 'save',
+ savetype: 'ue',
+ })
+ }
+ >
+ Export UI and UE
+
+
+ act('disk', {
+ option: 'save',
+ savetype: 'se',
+ })
+ }
+ >
+ Export SE
+
+
+
+
+ act('clone', {
+ ref: activerecord,
+ })
+ }
+ >
+ Clone
+
+ act('del_rec')}>
+ Delete
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleNavigation.tsx b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleNavigation.tsx
new file mode 100644
index 0000000000..d06866ca50
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleNavigation.tsx
@@ -0,0 +1,34 @@
+import { useBackend } from '../../backend';
+import { Tabs } from '../../components';
+import { Data } from './types';
+
+export const CloningConsoleNavigation = (props) => {
+ const { act, data } = useBackend();
+ const { menu } = data;
+ return (
+
+
+ act('menu', {
+ num: 1,
+ })
+ }
+ >
+ Main
+
+
+ act('menu', {
+ num: 2,
+ })
+ }
+ >
+ Records
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleStatus.tsx b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleStatus.tsx
new file mode 100644
index 0000000000..4034d3fed6
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleStatus.tsx
@@ -0,0 +1,92 @@
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, NoticeBox, Section } from '../../components';
+import { Data } from './types';
+
+export const CloningConsoleTemp = (props) => {
+ const { act, data } = useBackend();
+ const { temp } = data;
+ if (!temp || !temp.text || temp.text.length <= 0) {
+ return;
+ }
+
+ const tempProp = { [temp.style]: true };
+ return (
+
+
+ {temp.text}
+
+ act('cleartemp')}
+ />
+
+
+ );
+};
+
+export const CloningConsoleStatus = (props) => {
+ const { act, data } = useBackend();
+ const { scanner, numberofpods, autoallowed, autoprocess, disk } = data;
+ return (
+
+ {!!autoallowed && (
+ <>
+
+ Auto-processing:
+
+
+ act('autoprocess', {
+ on: autoprocess ? 0 : 1,
+ })
+ }
+ >
+ {autoprocess ? 'Enabled' : 'Disabled'}
+
+ >
+ )}
+
+ act('disk', {
+ option: 'eject',
+ })
+ }
+ >
+ Eject Disk
+
+ >
+ }
+ >
+
+
+ {scanner ? (
+ Connected
+ ) : (
+ Not connected!
+ )}
+
+
+ {numberofpods ? (
+ {numberofpods} connected
+ ) : (
+ None connected!
+ )}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleTabs.tsx b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleTabs.tsx
new file mode 100644
index 0000000000..4399d2a3b5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole/CloningConsoleTabs.tsx
@@ -0,0 +1,192 @@
+import { toFixed } from 'common/math';
+
+import { resolveAsset } from '../../assets';
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ Flex,
+ Icon,
+ Image,
+ LabeledList,
+ ProgressBar,
+ Section,
+} from '../../components';
+import { Data } from './types';
+
+export const CloningConsoleMain = (props) => {
+ const { act, data } = useBackend();
+ const {
+ loading,
+ scantemp,
+ occupant,
+ locked,
+ can_brainscan,
+ scan_mode,
+ numberofpods,
+ pods,
+ selected_pod,
+ } = data;
+ const isLocked = locked && !!occupant;
+ return (
+ <>
+
+
+ Scanner Lock:
+
+ act('lock')}
+ >
+ {isLocked ? 'Engaged' : 'Disengaged'}
+
+ act('eject')}
+ >
+ Eject Occupant
+
+ >
+ }
+ >
+
+
+ {loading ? (
+
+
+ Scanning...
+
+ ) : (
+ {scantemp.text}
+ )}
+
+ {!!can_brainscan && (
+
+ act('toggle_mode')}
+ >
+ {scan_mode ? 'Brain' : 'Body'}
+
+
+ )}
+
+ act('scan')}
+ >
+ Scan Occupant
+
+
+
+ {numberofpods ? (
+ pods.map((pod, i) => {
+ let podAction;
+ if (pod.status === 'cloning') {
+ podAction = (
+
+ {toFixed(pod.progress) + '%'}
+
+ );
+ } else if (pod.status === 'mess') {
+ podAction = (
+
+ ERROR
+
+ );
+ } else {
+ podAction = (
+
+ act('selectpod', {
+ ref: pod.pod,
+ })
+ }
+ >
+ Select
+
+ );
+ }
+
+ return (
+
+
+ Pod #{i + 1}
+ = 150 ? 'good' : 'bad'} inline>
+ = 150 ? 'circle' : 'circle-o'} />
+
+ {pod.biomass}
+
+ {podAction}
+
+ );
+ })
+ ) : (
+ No pods detected. Unable to clone.
+ )}
+
+ >
+ );
+};
+
+export const CloningConsoleRecords = (props) => {
+ const { act, data } = useBackend();
+ const { records } = data;
+ if (!records.length) {
+ return (
+
+
+
+
+ No records found.
+
+
+ );
+ }
+ return (
+
+ {records.map((record, i) => (
+
+ act('view_rec', {
+ ref: record.record,
+ })
+ }
+ >
+ {record.realname}
+
+ ))}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CloningConsole/index.tsx b/tgui/packages/tgui/interfaces/CloningConsole/index.tsx
new file mode 100644
index 0000000000..7957732fd7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole/index.tsx
@@ -0,0 +1,44 @@
+import { useBackend } from '../../backend';
+import { Box, Section } from '../../components';
+import {
+ ComplexModal,
+ modalRegisterBodyOverride,
+} from '../../interfaces/common/ComplexModal';
+import { Window } from '../../layouts';
+import { viewRecordModalBodyOverride } from './CloningConsoleBodyOverride';
+import { CloningConsoleNavigation } from './CloningConsoleNavigation';
+import {
+ CloningConsoleStatus,
+ CloningConsoleTemp,
+} from './CloningConsoleStatus';
+import {
+ CloningConsoleMain,
+ CloningConsoleRecords,
+} from './CloningConsoleTabs';
+import { Data } from './types';
+
+export const CloningConsole = (props) => {
+ const { data } = useBackend();
+
+ const { menu } = data;
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[1] = ;
+ tab[2] = ;
+
+ modalRegisterBodyOverride('view_rec', viewRecordModalBodyOverride);
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CloningConsole/types.ts b/tgui/packages/tgui/interfaces/CloningConsole/types.ts
new file mode 100644
index 0000000000..1c82f25fcd
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CloningConsole/types.ts
@@ -0,0 +1,41 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ menu: number;
+ scanner: string | null;
+ numberofpods: number | null;
+ pods: {
+ pod: string;
+ name: string;
+ biomass: number;
+ status: string;
+ progress: number;
+ }[];
+ loading: BooleanLike;
+ autoprocess: BooleanLike;
+ can_brainscan: BooleanLike;
+ scan_mode: BooleanLike;
+ autoallowed: BooleanLike;
+ occupant: string;
+ locked: BooleanLike;
+ temp: { text: string; style: string };
+ scantemp: { text: string; color: string };
+ disk: string | null;
+ selected_pod: string;
+ records: { record: string; realname: string }[];
+ podready: BooleanLike;
+ modal: modalData;
+};
+
+export type modalData = {
+ id: string;
+ text: string;
+ args: {
+ activerecord: string;
+ realname: string;
+ health: string;
+ unidentity: string;
+ strucenzymes: string;
+ };
+ modal_type: string;
+};
diff --git a/tgui/packages/tgui/interfaces/ColorMate.jsx b/tgui/packages/tgui/interfaces/ColorMate.jsx
deleted file mode 100644
index dab5b5dd37..0000000000
--- a/tgui/packages/tgui/interfaces/ColorMate.jsx
+++ /dev/null
@@ -1,401 +0,0 @@
-import { useBackend } from '../backend';
-import {
- Button,
- Icon,
- NoticeBox,
- NumberInput,
- Section,
- Slider,
- Table,
- Tabs,
-} from '../components';
-import { Window } from '../layouts';
-
-export const ColorMate = (props, context) => {
- const { act, data } = useBackend(context);
- const { activemode, temp } = data;
- const item = data.item || [];
- return (
-
-
-
- {temp ? {temp} : null}
- {Object.keys(item).length ? (
- <>
-
-
-
- Item:
-
-
-
-
-
- Preview:
-
-
-
-
-
-
- act('switch_modes', {
- mode: 1,
- })
- }
- >
- Tint coloring (Simple)
-
-
- act('switch_modes', {
- mode: 2,
- })
- }
- >
- HSV coloring (Normal)
-
-
- act('switch_modes', {
- mode: 3,
- })
- }
- >
- Matrix coloring (Advanced)
-
-
- Coloring: {item.name}
-
-
- act('paint')}>
- Paint
-
- act('clear')}>
- Clear
-
- act('drop')}>
- Eject
-
-
-
- {activemode === 1 ? (
-
- ) : activemode === 2 ? (
-
- ) : (
-
- )}
-
-
- >
- ) : (
- No item inserted.
- )}
-
-
-
- );
-};
-
-export const ColorMateTint = (props, context) => {
- const { act, data } = useBackend(context);
- return (
- act('choose_color')}>
- Select new color
-
- );
-};
-
-export const ColorMateMatrix = (props, context) => {
- const { act, data } = useBackend(context);
- const matrixcolors = data.matrixcolors || [];
- return (
-
-
-
- RR:{' '}
-
- act('set_matrix_color', {
- color: 1,
- value,
- })
- }
- />
-
-
- GR:{' '}
-
- act('set_matrix_color', {
- color: 4,
- value,
- })
- }
- />
-
-
- BR:{' '}
-
- act('set_matrix_color', {
- color: 7,
- value,
- })
- }
- />
-
-
-
-
- RG:{' '}
-
- act('set_matrix_color', {
- color: 2,
- value,
- })
- }
- />
-
-
- GG:{' '}
-
- act('set_matrix_color', {
- color: 5,
- value,
- })
- }
- />
-
-
- BG:{' '}
-
- act('set_matrix_color', {
- color: 8,
- value,
- })
- }
- />
-
-
-
-
- RB:{' '}
-
- act('set_matrix_color', {
- color: 3,
- value,
- })
- }
- />
-
-
- GB:{' '}
-
- act('set_matrix_color', {
- color: 6,
- value,
- })
- }
- />
-
-
- BB:{' '}
-
- act('set_matrix_color', {
- color: 9,
- value,
- })
- }
- />
-
-
-
-
- CR:{' '}
-
- act('set_matrix_color', {
- color: 10,
- value,
- })
- }
- />
-
-
- CG:{' '}
-
- act('set_matrix_color', {
- color: 11,
- value,
- })
- }
- />
-
-
- CB:{' '}
-
- act('set_matrix_color', {
- color: 12,
- value,
- })
- }
- />
-
-
-
- RG means red will become
- this much green.
-
- CR means this much red will
- be added.
-
-
- );
-};
-
-export const ColorMateHSV = (props, context) => {
- const { act, data } = useBackend(context);
- const { buildhue, buildsat, buildval } = data;
- return (
-
-
- Hue:
-
-
- act('set_hue', {
- buildhue: value,
- })
- }
- />
-
-
-
- Saturation:
-
-
- act('set_sat', {
- buildsat: value,
- })
- }
- />
-
-
-
- Value:
-
-
- act('set_val', {
- buildval: value,
- })
- }
- />
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/ColorMate/ColorMateColor.tsx b/tgui/packages/tgui/interfaces/ColorMate/ColorMateColor.tsx
new file mode 100644
index 0000000000..a5efd4024a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ColorMate/ColorMateColor.tsx
@@ -0,0 +1,76 @@
+import { toFixed } from 'common/math';
+
+import { useBackend } from '../../backend';
+import { Button, Slider, Table } from '../../components';
+import { Data } from './types';
+
+export const ColorMateTint = (props) => {
+ const { act } = useBackend();
+
+ return (
+ act('choose_color')}>
+ Select new color
+
+ );
+};
+
+export const ColorMateHSV = (props) => {
+ const { act, data } = useBackend();
+
+ const { buildhue, buildsat, buildval } = data;
+ return (
+
+
+ Hue:
+
+ toFixed(value)}
+ onDrag={(e, value: number) =>
+ act('set_hue', {
+ buildhue: value,
+ })
+ }
+ />
+
+
+
+ Saturation:
+
+ toFixed(value, 2)}
+ onDrag={(e, value: number) =>
+ act('set_sat', {
+ buildsat: value,
+ })
+ }
+ />
+
+
+
+ Value:
+
+ toFixed(value, 2)}
+ onDrag={(e, value: number) =>
+ act('set_val', {
+ buildval: value,
+ })
+ }
+ />
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ColorMate/ColorMateMatrix.tsx b/tgui/packages/tgui/interfaces/ColorMate/ColorMateMatrix.tsx
new file mode 100644
index 0000000000..c9c0c5fc0d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ColorMate/ColorMateMatrix.tsx
@@ -0,0 +1,235 @@
+import { toFixed } from 'common/math';
+
+import { useBackend } from '../../backend';
+import { Icon, NumberInput, Table } from '../../components';
+import { Data } from './types';
+
+export const ColorMateMatrix = (props) => {
+ const { act, data } = useBackend();
+
+ const { matrixcolors } = data;
+
+ return (
+
+
+
+ RR:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 1,
+ value,
+ })
+ }
+ />
+
+
+ GR:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 4,
+ value,
+ })
+ }
+ />
+
+
+ BR:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 7,
+ value,
+ })
+ }
+ />
+
+
+
+
+ RG:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 2,
+ value,
+ })
+ }
+ />
+
+
+ GG:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 5,
+ value,
+ })
+ }
+ />
+
+
+ BG:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 8,
+ value,
+ })
+ }
+ />
+
+
+
+
+ RB:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 3,
+ value,
+ })
+ }
+ />
+
+
+ GB:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 6,
+ value,
+ })
+ }
+ />
+
+
+ BB:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 9,
+ value,
+ })
+ }
+ />
+
+
+
+
+ CR:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 10,
+ value,
+ })
+ }
+ />
+
+
+ CG:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 11,
+ value,
+ })
+ }
+ />
+
+
+ CB:
+ toFixed(value, 2)}
+ onChange={(e, value: number) =>
+ act('set_matrix_color', {
+ color: 12,
+ value,
+ })
+ }
+ />
+
+
+
+ RG means red will become
+ this much green.
+
+ CR means this much red will
+ be added.
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ColorMate/index.tsx b/tgui/packages/tgui/interfaces/ColorMate/index.tsx
new file mode 100644
index 0000000000..8bbe62e705
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ColorMate/index.tsx
@@ -0,0 +1,120 @@
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ Image,
+ NoticeBox,
+ Section,
+ Table,
+ Tabs,
+} from '../../components';
+import { Window } from '../../layouts';
+import { ColorMateHSV, ColorMateTint } from './ColorMateColor';
+import { ColorMateMatrix } from './ColorMateMatrix';
+import { Data } from './types';
+
+export const ColorMate = (props) => {
+ const { act, data } = useBackend();
+
+ const { activemode, temp, item } = data;
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[1] = ;
+ tab[2] = ;
+ tab[3] = ;
+
+ return (
+
+
+
+ {temp ? {temp} : null}
+ {item && Object.keys(item).length ? (
+ <>
+
+
+
+ act('switch_modes', {
+ mode: 1,
+ })
+ }
+ >
+ Tint coloring (Simple)
+
+
+ act('switch_modes', {
+ mode: 2,
+ })
+ }
+ >
+ HSV coloring (Normal)
+
+
+ act('switch_modes', {
+ mode: 3,
+ })
+ }
+ >
+ Matrix coloring (Advanced)
+
+
+ Coloring: {item.name}
+
+
+ act('paint')}>
+ Paint
+
+ act('clear')}>
+ Clear
+
+ act('drop')}>
+ Eject
+
+
+
+ {tab[activemode] || Error }
+
+
+ >
+ ) : (
+ No item inserted.
+ )}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ColorMate/types.ts b/tgui/packages/tgui/interfaces/ColorMate/types.ts
new file mode 100644
index 0000000000..a56bab9c7b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ColorMate/types.ts
@@ -0,0 +1,22 @@
+export type Data = {
+ activemode: number;
+ matrixcolors: {
+ rr: number;
+ rg: number;
+ rb: number;
+ gr: number;
+ gg: number;
+ gb: number;
+ br: number;
+ bg: number;
+ bb: number;
+ cr: number;
+ cg: number;
+ cb: number;
+ };
+ buildhue: number;
+ buildsat: number;
+ buildval: number;
+ temp: string | null;
+ item: { name: string; sprite: string; preview: string } | null;
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx b/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx
deleted file mode 100644
index 857364e55d..0000000000
--- a/tgui/packages/tgui/interfaces/CommunicationsConsole.jsx
+++ /dev/null
@@ -1,364 +0,0 @@
-import { useBackend } from '../backend';
-import { Box, Button, LabeledList, Section } from '../components';
-import { Window } from '../layouts';
-
-export const CommunicationsConsole = (props) => {
- return (
-
-
-
-
-
- );
-};
-
-export const CommunicationsConsoleContent = (props) => {
- const { act, data } = useBackend();
-
- const { menu_state } = data;
-
- let mainTemplate = (
-
- ERRROR. Unknown menu_state: {menu_state}
- Please report this to NT Technical Support.
-
- );
-
- // 1 = main screen
- if (menu_state === 1) {
- mainTemplate = ;
- } else if (menu_state === 2) {
- // 2 = status screen
- mainTemplate = ;
- } else if (menu_state === 3) {
- // 3 = messages screen
- mainTemplate = ;
- }
-
- return (
- <>
-
- {mainTemplate}
- >
- );
-};
-
-const CommunicationsConsoleMain = (props) => {
- const { act, data } = useBackend();
-
- const {
- messages,
- msg_cooldown,
- emagged,
- cc_cooldown,
- str_security_level,
- levels,
- authmax,
- security_level,
- security_level_color,
- authenticated,
- atcsquelch,
- boss_short,
- } = data;
-
- let reportText = 'View (' + messages.length + ')';
- let announceText = 'Make Priority Announcement';
- if (msg_cooldown > 0) {
- announceText += ' (' + msg_cooldown + 's)';
- }
- let ccMessageText = emagged ? 'Message [UNKNOWN]' : 'Message ' + boss_short;
- if (cc_cooldown > 0) {
- ccMessageText += ' (' + cc_cooldown + 's)';
- }
-
- let alertLevelText = str_security_level;
- let alertLevelButtons = levels.map((slevel) => {
- return (
- act('newalertlevel', { level: slevel.id })}
- >
- {slevel.name}
-
- );
- });
-
- return (
- <>
-
-
-
- 0}
- onClick={() => act('announce')}
- >
- {announceText}
-
-
- {(!!emagged && (
-
- 0}
- onClick={() => act('MessageSyndicate')}
- >
- {ccMessageText}
-
- act('RestoreBackup')}
- >
- Reset Relays
-
-
- )) || (
-
- 0}
- onClick={() => act('MessageCentCom')}
- >
- {ccMessageText}
-
-
- )}
-
-
-
-
-
- {alertLevelText}
-
-
- {alertLevelButtons}
-
-
- act('status')}
- >
- Change Status Displays
-
-
-
- act('messagelist')}
- >
- {reportText}
-
-
-
- act('toggleatc')}
- >
- {!atcsquelch ? 'ATC Relay Enabled' : 'ATC Relay Disabled'}
-
-
-
-
- >
- );
-};
-
-const CommunicationsConsoleAuth = (props) => {
- const { act, data } = useBackend();
-
- const { authenticated, is_ai, esc_status, esc_callable, esc_recallable } =
- data;
-
- let authReadable;
- if (!authenticated) {
- authReadable = 'Not Logged In';
- } else if (is_ai) {
- authReadable = 'AI';
- } else if (authenticated === 1) {
- authReadable = 'Command';
- } else if (authenticated === 2) {
- authReadable = 'Site Director';
- } else {
- authReadable = 'ERROR: Report This Bug!';
- }
-
- return (
- <>
-
-
- {(is_ai && (
- AI
- )) || (
-
- act('auth')}
- >
- {authenticated ? 'Log Out (' + authReadable + ')' : 'Log In'}
-
-
- )}
-
-
-
-
- {!!esc_status && (
- {esc_status}
- )}
- {!!esc_callable && (
-
- act('callshuttle')}
- >
- Call Shuttle
-
-
- )}
- {!!esc_recallable && (
-
- act('cancelshuttle')}
- >
- Recall Shuttle
-
-
- )}
-
-
- >
- );
-};
-
-const CommunicationsConsoleMessage = (props) => {
- const { act, data } = useBackend();
-
- const { message_current, message_deletion_allowed, authenticated, messages } =
- data;
-
- if (message_current) {
- return (
- act('messagelist')}
- >
- Return To Message List
-
- }
- >
- {message_current.contents}
-
- );
- }
-
- let messageRows = messages.map((m) => {
- return (
-
- act('messagelist', { msgid: m.id })}
- >
- View
-
- act('delmessage', { msgid: m.id })}
- >
- Delete
-
-
- );
- });
-
- return (
- act('main')}>
- Back To Main Menu
-
- }
- >
-
- {(messages.length && messageRows) || (
-
- No messages.
-
- )}
-
-
- );
-};
-
-const CommunicationsConsoleStatusDisplay = (props) => {
- const { act, data } = useBackend();
-
- const { stat_display, authenticated } = data;
-
- let presetButtons = stat_display['presets'].map((pb) => {
- return (
- act('setstat', { statdisp: pb.name })}
- >
- {pb.label}
-
- );
- });
- return (
- act('main')}>
- Back To Main Menu
-
- }
- >
-
- {presetButtons}
-
- act('setmsg1')}
- >
- {stat_display.line_1}
-
-
-
- act('setmsg2')}
- >
- {stat_display.line_2}
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleAuth.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleAuth.tsx
new file mode 100644
index 0000000000..24b814ebee
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleAuth.tsx
@@ -0,0 +1,74 @@
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicationsConsoleAuth = (props) => {
+ const { act, data } = useBackend();
+
+ const { authenticated, is_ai, esc_status, esc_callable, esc_recallable } =
+ data;
+
+ let authReadable;
+ if (!authenticated) {
+ authReadable = 'Not Logged In';
+ } else if (is_ai) {
+ authReadable = 'AI';
+ } else if (authenticated === 1) {
+ authReadable = 'Command';
+ } else if (authenticated === 2) {
+ authReadable = 'Site Director';
+ } else {
+ authReadable = 'ERROR: Report This Bug!';
+ }
+
+ return (
+ <>
+
+
+ {(is_ai && (
+ AI
+ )) || (
+
+ act('auth')}
+ >
+ {authenticated ? 'Log Out (' + authReadable + ')' : 'Log In'}
+
+
+ )}
+
+
+
+
+ {!!esc_status && (
+ {esc_status}
+ )}
+ {!!esc_callable && (
+
+ act('callshuttle')}
+ >
+ Call Shuttle
+
+
+ )}
+ {!!esc_recallable && (
+
+ act('cancelshuttle')}
+ >
+ Recall Shuttle
+
+
+ )}
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleContent.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleContent.tsx
new file mode 100644
index 0000000000..57826b88f3
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleContent.tsx
@@ -0,0 +1,37 @@
+import { useBackend } from '../../backend';
+import { Box } from '../../components';
+import { CommunicationsConsoleAuth } from './CommunicationsConsoleAuth';
+import { CommunicationsConsoleMain } from './CommunicationsConsoleMain';
+import { CommunicationsConsoleMessage } from './CommunicationsConsoleMessage';
+import { CommunicationsConsoleStatusDisplay } from './CommunicationsConsoleStatusDisplay';
+import { Data } from './types';
+
+export const CommunicationsConsoleContent = (props) => {
+ const { data } = useBackend();
+
+ const { menu_state } = data;
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[1] = ;
+ tab[2] = ;
+ tab[3] = ;
+
+ return (
+ <>
+
+ {tab[menu_state] || }
+ >
+ );
+};
+
+const DefaultError = (props: { menu_state: string }) => {
+ const { menu_state } = props;
+
+ return (
+
+ ERRROR. Unknown menu_state: {menu_state}
+ Please report this to NT Technical Support.
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleMain.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleMain.tsx
new file mode 100644
index 0000000000..caa937b1fc
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleMain.tsx
@@ -0,0 +1,132 @@
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicationsConsoleMain = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ messages,
+ msg_cooldown,
+ emagged,
+ cc_cooldown,
+ str_security_level,
+ levels,
+ authmax,
+ security_level,
+ security_level_color,
+ authenticated,
+ atcsquelch,
+ boss_short,
+ } = data;
+
+ const reportText = 'View (' + messages.length + ')';
+ let announceText = 'Make Priority Announcement';
+ if (msg_cooldown > 0) {
+ announceText += ' (' + msg_cooldown + 's)';
+ }
+ let ccMessageText = emagged ? 'Message [UNKNOWN]' : 'Message ' + boss_short;
+ if (cc_cooldown > 0) {
+ ccMessageText += ' (' + cc_cooldown + 's)';
+ }
+
+ const alertLevelText = str_security_level;
+ const alertLevelButtons = levels.map((slevel) => {
+ return (
+ act('newalertlevel', { level: slevel.id })}
+ >
+ {slevel.name}
+
+ );
+ });
+
+ return (
+ <>
+
+
+
+ 0}
+ onClick={() => act('announce')}
+ >
+ {announceText}
+
+
+ {(!!emagged && (
+
+ 0}
+ onClick={() => act('MessageSyndicate')}
+ >
+ {ccMessageText}
+
+ act('RestoreBackup')}
+ >
+ Reset Relays
+
+
+ )) || (
+
+ 0}
+ onClick={() => act('MessageCentCom')}
+ >
+ {ccMessageText}
+
+
+ )}
+
+
+
+
+
+ {alertLevelText}
+
+
+ {alertLevelButtons}
+
+
+ act('status')}
+ >
+ Change Status Displays
+
+
+
+ act('messagelist')}
+ >
+ {reportText}
+
+
+
+ act('toggleatc')}
+ >
+ {!atcsquelch ? 'ATC Relay Enabled' : 'ATC Relay Disabled'}
+
+
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleMessage.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleMessage.tsx
new file mode 100644
index 0000000000..e70a61bae5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleMessage.tsx
@@ -0,0 +1,69 @@
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicationsConsoleMessage = (props) => {
+ const { act, data } = useBackend();
+
+ const { message_current, message_deletion_allowed, authenticated, messages } =
+ data;
+
+ if (message_current) {
+ return (
+ act('messagelist')}
+ >
+ Return To Message List
+
+ }
+ >
+ {message_current.contents}
+
+ );
+ }
+
+ let messageRows = messages.map((m) => {
+ return (
+
+ act('messagelist', { msgid: m.id })}
+ >
+ View
+
+ act('delmessage', { msgid: m.id })}
+ >
+ Delete
+
+
+ );
+ });
+
+ return (
+ act('main')}>
+ Back To Main Menu
+
+ }
+ >
+
+ {(messages.length && messageRows) || (
+
+ No messages.
+
+ )}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleStatusDisplay.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleStatusDisplay.tsx
new file mode 100644
index 0000000000..6ea5a7c319
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/CommunicationsConsoleStatusDisplay.tsx
@@ -0,0 +1,54 @@
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicationsConsoleStatusDisplay = (props) => {
+ const { act, data } = useBackend();
+
+ const { stat_display, authenticated } = data;
+
+ let presetButtons = stat_display['presets'].map((pb) => {
+ return (
+ act('setstat', { statdisp: pb.name })}
+ >
+ {pb.label}
+
+ );
+ });
+ return (
+ act('main')}>
+ Back To Main Menu
+
+ }
+ >
+
+ {presetButtons}
+
+ act('setmsg1')}
+ >
+ {stat_display.line_1}
+
+
+
+ act('setmsg2')}
+ >
+ {stat_display.line_2}
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/index.tsx b/tgui/packages/tgui/interfaces/CommunicationsConsole/index.tsx
new file mode 100644
index 0000000000..891947d278
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/index.tsx
@@ -0,0 +1,12 @@
+import { Window } from '../../layouts';
+import { CommunicationsConsoleContent } from './CommunicationsConsoleContent';
+
+export const CommunicationsConsole = (props) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts b/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts
new file mode 100644
index 0000000000..3b3d1ac327
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CommunicationsConsole/types.ts
@@ -0,0 +1,33 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ is_ai: BooleanLike;
+ menu_state: string;
+ emagged: BooleanLike;
+ authenticated: BooleanLike;
+ authmax: BooleanLike;
+ atcsquelch: BooleanLike;
+ boss_short: string;
+ stat_display: {
+ type: string;
+ line_1: string;
+ line_2: string;
+ presets: { name: string; label: string; desc: string }[];
+ };
+ security_level: number;
+ security_level_color: string;
+ str_security_level: string;
+ levels: { id: number; name: string; icon: string }[];
+ messages: message[];
+ message_deletion_allowed: BooleanLike;
+ message_current_id: number;
+ message_current: message;
+ current_viewing_message: number;
+ msg_cooldown: number;
+ cc_cooldown: number;
+ esc_callable: BooleanLike;
+ esc_recallable: BooleanLike;
+ esc_status: BooleanLike | string;
+};
+
+type message = { id: string; title: String; contents: string };
diff --git a/tgui/packages/tgui/interfaces/Communicator.tsx b/tgui/packages/tgui/interfaces/Communicator.tsx
deleted file mode 100644
index 0bd2dd4d6b..0000000000
--- a/tgui/packages/tgui/interfaces/Communicator.tsx
+++ /dev/null
@@ -1,1307 +0,0 @@
-import { filter } from 'common/collections';
-import { BooleanLike } from 'common/react';
-import { decodeHtmlEntities, toTitleCase } from 'common/string';
-import { useState } from 'react';
-
-import { useBackend } from '../backend';
-import {
- Box,
- Button,
- ByondUi,
- Flex,
- Icon,
- Input,
- LabeledList,
- Section,
- Table,
-} from '../components';
-import { Window } from '../layouts';
-import { CrewManifestContent } from './CrewManifest';
-
-const HOMETAB = 1;
-const PHONTAB = 2;
-const CONTTAB = 3;
-const MESSTAB = 4;
-const MESSSUBTAB = 40;
-const NEWSTAB = 5;
-const NOTETAB = 6;
-const WTHRTAB = 7;
-const MANITAB = 8;
-const SETTTAB = 9;
-
-let TABS = [
- HOMETAB,
- PHONTAB,
- CONTTAB,
- MESSTAB,
- MESSSUBTAB,
- NEWSTAB,
- NOTETAB,
- WTHRTAB,
- MANITAB,
- SETTTAB,
-];
-
-let TabToTemplate = {}; // Populated under each template
-
-type Data = {
- // GENERAL
- currentTab: number;
- video_comm: BooleanLike;
- mapRef: string;
-
- // FOOTER
- time: string;
- connectionStatus: BooleanLike;
- owner: string;
- occupation: string;
-
- // HEADER
- flashlight: BooleanLike;
-
- // HOMETAB
- homeScreen: { number: number; module: string; icon: string }[];
-
- // PHONETAB
- targetAddress: string;
- voice_mobs: { name: string; true_name: string; ref: string }[];
- communicating: {
- address: string;
- name: string;
- true_name: string;
- ref: string;
- }[];
- requestsReceived: { address: string; name: string; ref: string }[];
- invitesSent: { address: string; name: string }[];
- phone_video_comm: string;
- selfie_mode: BooleanLike;
-
- // MESSAGING
- imContacts: { address: string; name: string }[];
- targetAddressName: string;
- imList: { address: string; to_address: string; im: string }[];
-
- // SETTINGS
- address: string;
- visible: BooleanLike;
- ring: BooleanLike;
-
- // NEWSTAB
- feeds: { index: number; name: string }[];
- target_feed: { name: string; author: string; messages: NewsMessage[] };
- latest_news: NewsMessage[];
-
- // NOTETAB
- note: string;
-};
-
-type NewsMessage = {
- ref: string;
- body: string;
- img: string;
- caption: string;
- message_type: string;
- author: string;
- time_stamp: string;
-
- index: number;
- channel: string;
-};
-
-function notFound(val) {
- return TABS.includes(val);
-}
-
-export const Communicator = (props) => {
- const { act, data } = useBackend();
-
- const {
- currentTab,
- video_comm,
- owner,
- occupation,
- connectionStatus,
- address,
- visible,
- ring,
- selfie_mode,
- homeScreen,
- targetAddress,
- voice_mobs,
- phone_video_comm,
- communicating,
- requestsReceived,
- invitesSent,
- imContacts,
- targetAddressName,
- imList,
- feeds,
- target_feed,
- latest_news,
- note,
- } = data;
-
- const validCharacters = [
- '0',
- '1',
- '2',
- '3',
- '4',
- '5',
- '6',
- '7',
- '8',
- '9',
- 'A',
- 'B',
- 'C',
- 'D',
- 'E',
- 'F',
- ];
-
- let buttonArray = validCharacters.map((char) => (
- act('add_hex', { add_hex: char })}
- >
- {char}
-
- ));
-
- let finalArray: any[] = [];
-
- for (let i = 0; i < buttonArray.length; i += 4) {
- finalArray.push(
-
- {buttonArray[i]}
- {buttonArray[i + 1]}
- {buttonArray[i + 2]}
- {buttonArray[i + 3]}
- ,
- );
- }
- /* 0: Fullscreen Video
- * 1: Popup Video
- * 2: Minimized Video
- */
- const [videoSetting, setVideoSetting] = useState(0);
- const [clipboardMode, setClipboardMode] = useState(false);
-
- return (
-
-
- {video_comm && (
-
- )}
- {(!video_comm || videoSetting !== 0) && (
- <>
-
-
- {(currentTab === HOMETAB && (
-
- {homeScreen.map((app) => (
-
-
- act('switch_tab', { switch_tab: app.number })
- }
- >
-
-
- {app.module}
-
- ))}
-
- )) ||
- (currentTab === PHONTAB && (
-
-
-
-
-
-
- act('write_target_address', { val: val })
- }
- />
-
-
- act('clear_target_address')}
- />
-
-
-
-
-
-
-
-
-
- {/* Dial */}
-
-
- act('dial', { dial: targetAddress })
- }
- >
-
-
- Dial
-
- {/* Message */}
-
- {
- act('message', { message: targetAddress });
- act('switch_tab', { switch_tab: MESSTAB });
- }}
- >
-
-
- Message
-
- {/* Hang Up */}
-
- act('hang_up')}
- >
-
-
- Hang Up
-
-
-
-
-
-
-
- act('selfie_mode')}>
- {selfie_mode
- ? 'Front-facing Camera'
- : 'Rear-facing Camera'}
-
-
-
-
- {(!!voice_mobs.length && (
-
- {voice_mobs.map((mob) => (
-
-
- act('disconnect', {
- disconnect: mob.true_name,
- })
- }
- >
- Disconnect
-
-
- ))}
-
- )) || No connections }
-
-
- {(!!communicating.length && (
-
- {communicating.map((comm) => (
-
-
- {decodeHtmlEntities(comm.name)}
-
-
-
- act('disconnect', {
- disconnect: comm.true_name,
- })
- }
- >
- Disconnect
-
- {(video_comm === null && (
-
- act('startvideo', {
- startvideo: comm.ref,
- })
- }
- >
- Start Video
-
- )) ||
- (phone_video_comm === comm.ref && (
-
- act('endvideo', {
- endvideo: comm.true_name,
- })
- }
- >
- Stop Video
-
- ))}
-
-
- ))}
-
- )) || No connections }
-
-
- {(!!requestsReceived.length && (
-
- {requestsReceived.map((request) => (
-
- {decodeHtmlEntities(request.address)}
-
-
- act('dial', { dial: request.address })
- }
- >
- Accept
-
-
- act('decline', { decline: request.ref })
- }
- >
- Decline
-
-
-
- ))}
-
- )) || No requests received. }
-
-
- {(!!invitesSent.length && (
-
- {invitesSent.map((invite) => (
-
- {decodeHtmlEntities(invite.address)}
-
- {
- act('copy', { copy: invite.address });
- }}
- >
- Copy
-
-
-
- ))}
-
- )) || No invites sent. }
-
-
-
- )) ||
- (currentTab === CONTTAB && ) ||
- (currentTab === MESSTAB && (
-
- {(imContacts.length && (
-
- {imContacts.map((device) => (
-
-
- {decodeHtmlEntities(device.name)}:
-
-
- {device.address}
-
- {
- act('copy', { copy: device.address });
- act('copy_name', {
- copy_name: device.name,
- });
- act('switch_tab', {
- switch_tab: MESSSUBTAB,
- });
- }}
- >
- View Conversation
-
-
-
-
- ))}
-
- )) || (
-
- You haven't sent any messages yet.
-
- act('switch_tab', { switch_tab: CONTTAB })
- }
- >
- Contacts
-
-
- )}
-
- )) ||
- (currentTab === MESSSUBTAB &&
- (clipboardMode ? (
-
- {enforceLengthLimit(
- 'Conversation with ',
- decodeHtmlEntities(targetAddressName),
- 30,
- )}
-
- }
- buttons={
- setClipboardMode(!clipboardMode)}
- />
- }
- height="100%"
- stretchContents
- >
-
- {imList.map(
- (im, i) =>
- (im.to_address === targetAddress ||
- im.address === targetAddress) && (
-
- {IsIMOurs(im, targetAddress) ? 'You' : 'Them'}:{' '}
- {im.im}
-
- ),
- )}
-
-
- act('message', { message: targetAddress })
- }
- >
- Message
-
-
- ) : (
-
- {enforceLengthLimit(
- 'Conversation with ',
- decodeHtmlEntities(targetAddressName),
- 30,
- )}
-
- }
- buttons={
- setClipboardMode(!clipboardMode)}
- />
- }
- height="100%"
- stretchContents
- >
-
- {imList.map(
- (im, i, filterArr) =>
- (im.to_address === targetAddress ||
- im.address === targetAddress) && (
-
-
- {decodeHtmlEntities(im.im)}
-
-
- ),
- )}
-
-
- act('message', { message: targetAddress })
- }
- >
- Message
-
-
- ))) ||
- (currentTab === NEWSTAB && (
-
- {(!feeds.length && (
-
- Error: No newsfeeds available. Please try again later.
-
- )) ||
- (target_feed && (
-
- act('newsfeed', { newsfeed: null })
- }
- >
- Back
-
- }
- >
- {target_feed.messages.map((message) => (
-
- - {decodeHtmlEntities(message.body)}
- {!!message.img && (
-
-
- {decodeHtmlEntities(message.caption) || null}
-
- )}
-
- [{message.message_type} by{' '}
- {decodeHtmlEntities(message.author)} -{' '}
- {message.time_stamp}]
-
-
- ))}
-
- )) || (
- <>
-
-
- {latest_news.map((news) => (
-
-
- {decodeHtmlEntities(news.channel)}
-
- act('newsfeed', {
- newsfeed: news.index,
- })
- }
- >
- Go to
-
-
- - {decodeHtmlEntities(news.body)}
- {!!news.img && (
-
- [image omitted, view story for more
- details]
- {news.caption || null}
-
- )}
-
- [{news.message_type} by{' '}
-
- {news.author}
- {' '}
- - {news.time_stamp}]
-
-
- ))}
-
-
-
- {feeds.map((feed) => (
-
- act('newsfeed', { newsfeed: feed.index })
- }
- >
- {feed.name}
-
- ))}
-
- >
- )}
-
- )) ||
- (currentTab === NOTETAB && (
- act('edit')}>
- Edit Notes
-
- }
- >
-
-
- )) ||
- (currentTab === WTHRTAB && ) ||
- (currentTab === MANITAB && ) ||
- (currentTab === SETTTAB && (
-
-
-
- act('rename')}>
- {decodeHtmlEntities(owner)}
-
-
-
- act('selfie_mode')}>
- {selfie_mode
- ? 'Front-facing Camera'
- : 'Rear-facing Camera'}
-
-
-
- {decodeHtmlEntities(occupation)}
-
-
- {connectionStatus === 1 ? (
- Connected
- ) : (
- Disconnected
- )}
-
-
- {address}
-
-
- act('toggle_visibility')}
- >
- {visible
- ? 'This device can be seen by other devices.'
- : 'This device is invisible to other devices.'}
-
-
-
- act('toggle_ringer')}
- >
- {ring ? 'Ringer on.' : 'Ringer off.'}
-
- act('set_ringer_tone')}>
- Set Ringer Tone
-
-
-
-
- )) ||
- (notFound(currentTab) && )}
-
-
- >
- )}
-
-
- );
-};
-
-const VideoComm = (props) => {
- const { act, data } = useBackend();
-
- const { video_comm, mapRef } = data;
-
- const { videoSetting, setVideoSetting } = props;
-
- if (videoSetting === 0) {
- return (
-
-
-
-
- setVideoSetting(1)}
- />
-
-
- act('endvideo')}
- />
-
-
- act('hang_up')}
- />
-
-
-
- );
- } else if (videoSetting === 1) {
- return (
-
-
-
-
- setVideoSetting(2)}
- />
-
-
- setVideoSetting(0)}
- />
-
-
- act('endvideo')}
- />
-
-
- act('hang_up')}
- />
-
-
-
-
-
- );
- }
- return null;
-};
-
-const TemplateError = (props) => {
- const { act, data } = useBackend();
-
- const { currentTab } = data;
-
- return (
-
- You tried to access tab #{currentTab}, but there was no template defined!
-
- );
-};
-
-const CommunicatorHeader = (props) => {
- const { act, data } = useBackend();
-
- const { time, connectionStatus, owner, occupation } = data;
-
- return (
-
-
- {time}
-
-
-
- {decodeHtmlEntities(owner)}
- {decodeHtmlEntities(occupation)}
-
-
- );
-};
-
-const CommunicatorFooter = (props) => {
- const { act, data } = useBackend();
-
- const { flashlight } = data;
-
- const { videoSetting, setVideoSetting } = props;
-
- return (
-
-
- act('switch_tab', { switch_tab: HOMETAB })}
- />
-
-
- act('Light')}
- />
-
- {videoSetting === 2 && (
-
- setVideoSetting(1)}
- />
-
- )}
-
- );
-};
-
-/* Helper for notifications (yes this is a mess, but whatever, it works) */
-const hasNotifications = (app) => {
- const { data } = useBackend();
-
- const {
- /* Phone Notifications */
- voice_mobs,
- communicating,
- requestsReceived,
- invitesSent,
- video_comm,
- } = data;
-
- if (app === 'Phone') {
- if (
- voice_mobs.length ||
- communicating.length ||
- requestsReceived.length ||
- invitesSent.length ||
- video_comm
- ) {
- return true;
- }
- }
-
- return false;
-};
-
-type ContactsTabData = {
- knownDevices: { address: string; name: string }[];
-};
-
-/* Contacts */
-const ContactsTab = (props) => {
- const { act, data } = useBackend();
-
- const { knownDevices } = data;
-
- return (
-
- {(knownDevices.length && (
-
- {knownDevices.map((device) => (
-
-
- {decodeHtmlEntities(device.name)}
-
-
- {device.address}
-
- {
- act('copy', { copy: device.address });
- act('switch_tab', { switch_tab: PHONTAB });
- }}
- >
- Copy
-
- {
- act('dial', { dial: device.address });
- act('copy', { copy: device.address });
- act('switch_tab', { switch_tab: PHONTAB });
- }}
- >
- Call
-
- {
- act('copy', { copy: device.address });
- act('copy_name', { copy_name: device.name });
- act('switch_tab', { switch_tab: MESSSUBTAB });
- }}
- >
- Msg
-
-
-
-
- ))}
-
- )) || No devices detected on your local NTNet region. }
-
- );
-};
-/* Actual messaging conversation */
-const IsIMOurs = (im, targetAddress) => {
- return im.address !== targetAddress;
-};
-
-const enforceLengthLimit = (prefix: string, name: string, length: number) => {
- if ((prefix + name).length > length) {
- if (name.length > length) {
- return name.slice(0, length) + '...';
- }
- return name;
- }
- return prefix + name;
-};
-
-const findClassMessage = (im, targetAddress, lastIndex, filterArray) => {
- if (lastIndex < 0 || lastIndex > filterArray.length) {
- return IsIMOurs(im, targetAddress)
- ? 'TinderMessage_First_Sent'
- : 'TinderMessage_First_Received';
- }
-
- let thisSent = IsIMOurs(im, targetAddress);
- let lastSent = IsIMOurs(filterArray[lastIndex], targetAddress);
- if (thisSent && lastSent) {
- return 'TinderMessage_Subsequent_Sent';
- } else if (!thisSent && !lastSent) {
- return 'TinderMessage_Subsequent_Received';
- }
- return thisSent ? 'TinderMessage_First_Sent' : 'TinderMessage_First_Received';
-};
-
-/* Weather App */
-const getItemColor = (value, min2, min1, max1, max2) => {
- if (value < min2) {
- return 'bad';
- } else if (value < min1) {
- return 'average';
- } else if (value > max1) {
- return 'average';
- } else if (value > max2) {
- return 'bad';
- }
- return 'good';
-};
-
-type WeatherTabData = {
- aircontents: AirContent[];
- weather: Weather[];
-};
-
-type AirContent = {
- entry: string;
- val;
- bad_low: number;
- poor_low: number;
- poor_high: number;
- bad_high: number;
- units;
-};
-
-type Weather = {
- Planet: string;
- Time: string;
- Weather: string;
- Temperature;
- High;
- Low;
- WindDir;
- WindSpeed;
- Forecast: string;
-};
-
-const WeatherTab = (props) => {
- const { act, data } = useBackend();
-
- const { aircontents, weather } = data;
-
- let deg = '\u00B0';
-
- return (
-
-
-
- {filter(
- (i: AirContent) =>
- i.val !== '0' ||
- i.entry === 'Pressure' ||
- i.entry === 'Temperature',
- )(aircontents).map((item: AirContent) => (
-
- {item.val}
- {decodeHtmlEntities(item.units)}
-
- ))}
-
-
-
- {(!!weather.length && (
-
- {weather.map((wr) => (
-
-
- {wr.Time}
-
- {toTitleCase(wr.Weather)}
-
-
- Current: {wr.Temperature.toFixed()} {deg}C | High:{' '}
- {wr.High.toFixed()} {deg}C | Low: {wr.Low.toFixed()} {deg}C
-
-
- {wr.WindDir}
-
-
- {wr.WindSpeed}
-
-
- {decodeHtmlEntities(wr.Forecast)}
-
-
-
- ))}
-
- )) || (
-
- No weather reports available. Please check back later.
-
- )}
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorContactTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorContactTab.tsx
new file mode 100644
index 0000000000..d5fb473ca6
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorContactTab.tsx
@@ -0,0 +1,67 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section, Table } from '../../components';
+import { MESSSUBTAB, PHONTAB } from './constants';
+import { ContactsTabData } from './types';
+
+export const CommunicatorContactTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { knownDevices } = data;
+
+ return (
+
+ {(knownDevices.length && (
+
+ {knownDevices.map((device) => (
+
+
+ {decodeHtmlEntities(device.name)}
+
+
+ {device.address}
+
+ {
+ act('copy', { copy: device.address });
+ act('switch_tab', { switch_tab: PHONTAB });
+ }}
+ >
+ Copy
+
+ {
+ act('dial', { dial: device.address });
+ act('copy', { copy: device.address });
+ act('switch_tab', { switch_tab: PHONTAB });
+ }}
+ >
+ Call
+
+ {
+ act('copy', { copy: device.address });
+ act('copy_name', { copy_name: device.name });
+ act('switch_tab', { switch_tab: MESSSUBTAB });
+ }}
+ >
+ Msg
+
+
+
+
+ ))}
+
+ )) || No devices detected on your local NTNet region. }
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorGeneral.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorGeneral.tsx
new file mode 100644
index 0000000000..7a752a13f9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorGeneral.tsx
@@ -0,0 +1,209 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, ByondUi, Flex, Icon, Section } from '../../components';
+import { HOMETAB } from './constants';
+import { Data } from './types';
+
+export const TemplateError = (props: { currentTab: number }) => {
+ return (
+
+ You tried to access tab #{props.currentTab}, but there was no template
+ defined!
+
+ );
+};
+export const CommunicatorHeader = (props) => {
+ const { act, data } = useBackend();
+
+ const { time, connectionStatus, owner, occupation } = data;
+
+ return (
+
+
+ {time}
+
+
+
+ {decodeHtmlEntities(owner)}
+ {decodeHtmlEntities(occupation)}
+
+
+ );
+};
+
+export const CommunicatorFooter = (props: {
+ videoSetting: number;
+ setVideoSetting: Function;
+}) => {
+ const { act, data } = useBackend();
+
+ const { flashlight } = data;
+
+ const { videoSetting, setVideoSetting } = props;
+
+ return (
+
+
+ act('switch_tab', { switch_tab: HOMETAB })}
+ />
+
+
+ act('Light')}
+ />
+
+ {videoSetting === 2 && (
+
+ setVideoSetting(1)}
+ />
+
+ )}
+
+ );
+};
+
+export const VideoComm = (props: {
+ videoSetting: number;
+ setVideoSetting: Function;
+}) => {
+ const { act, data } = useBackend();
+
+ const { mapRef } = data;
+
+ const { videoSetting, setVideoSetting } = props;
+
+ if (videoSetting === 0) {
+ return (
+
+
+
+
+ setVideoSetting(1)}
+ />
+
+
+ act('endvideo')}
+ />
+
+
+ act('hang_up')}
+ />
+
+
+
+ );
+ } else if (videoSetting === 1) {
+ return (
+
+
+
+
+ setVideoSetting(2)}
+ />
+
+
+ setVideoSetting(0)}
+ />
+
+
+ act('endvideo')}
+ />
+
+
+ act('hang_up')}
+ />
+
+
+
+
+
+ );
+ }
+ return null;
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorHomeTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorHomeTab.tsx
new file mode 100644
index 0000000000..9e8809cc77
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorHomeTab.tsx
@@ -0,0 +1,67 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Flex, Icon } from '../../components';
+import { Data } from './types';
+
+export const CommunicatorHomeTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { homeScreen } = data;
+
+ return (
+
+ {homeScreen.map((app) => (
+
+ act('switch_tab', { switch_tab: app.number })}
+ >
+
+
+ {app.module}
+
+ ))}
+
+ );
+};
+
+/* Helper for notifications (yes this is a mess, but whatever, it works) */
+const hasNotifications = (app: string | null) => {
+ const { data } = useBackend();
+
+ const {
+ /* Phone Notifications */
+ voice_mobs,
+ communicating,
+ requestsReceived,
+ invitesSent,
+ video_comm,
+ } = data;
+
+ if (app === 'Phone') {
+ if (
+ voice_mobs.length ||
+ communicating.length ||
+ requestsReceived.length ||
+ invitesSent.length ||
+ video_comm
+ ) {
+ return true;
+ }
+ }
+
+ return false;
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorMessageSubTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorMessageSubTab.tsx
new file mode 100644
index 0000000000..5e15ccfb36
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorMessageSubTab.tsx
@@ -0,0 +1,190 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicatorMessageSubTab = (props: {
+ clipboardMode: boolean;
+ onClipboardMode: Function;
+}) => {
+ const { act, data } = useBackend();
+
+ const { clipboardMode, onClipboardMode } = props;
+
+ const { targetAddress, targetAddressName, imList } = data;
+
+ return clipboardMode ? (
+
+ {enforceLengthLimit(
+ 'Conversation with ',
+ decodeHtmlEntities(targetAddressName),
+ 30,
+ )}
+
+ }
+ buttons={
+ onClipboardMode(!clipboardMode)}
+ />
+ }
+ height="100%"
+ stretchContents
+ >
+
+ {imList.map(
+ (im, i) =>
+ (im.to_address === targetAddress ||
+ im.address === targetAddress) && (
+
+ {IsIMOurs(im, targetAddress) ? 'You' : 'Them'}: {im.im}
+
+ ),
+ )}
+
+ act('message', { message: targetAddress })}
+ >
+ Message
+
+
+ ) : (
+
+ {enforceLengthLimit(
+ 'Conversation with ',
+ decodeHtmlEntities(targetAddressName),
+ 30,
+ )}
+
+ }
+ buttons={
+ onClipboardMode(!clipboardMode)}
+ />
+ }
+ height="100%"
+ stretchContents
+ >
+
+ {imList.map(
+ (im, i, filterArr) =>
+ (im.to_address === targetAddress ||
+ im.address === targetAddress) && (
+
+
+ {decodeHtmlEntities(im.im)}
+
+
+ ),
+ )}
+
+ act('message', { message: targetAddress })}
+ >
+ Message
+
+
+ );
+};
+
+/* Actual messaging conversation */
+const IsIMOurs = (
+ im: { address: string; to_address: string; im: string },
+ targetAddress: string,
+) => {
+ return im.address !== targetAddress;
+};
+
+const enforceLengthLimit = (prefix: string, name: string, length: number) => {
+ if ((prefix + name).length > length) {
+ if (name.length > length) {
+ return name.slice(0, length) + '...';
+ }
+ return name;
+ }
+ return prefix + name;
+};
+
+const findClassMessage = (
+ im: { address: string; to_address: string; im: string },
+ targetAddress: string,
+ lastIndex: number,
+ filterArray: {
+ address: string;
+ to_address: string;
+ im: string;
+ }[],
+) => {
+ if (lastIndex < 0 || lastIndex > filterArray.length) {
+ return IsIMOurs(im, targetAddress)
+ ? 'TinderMessage_First_Sent'
+ : 'TinderMessage_First_Received';
+ }
+
+ let thisSent = IsIMOurs(im, targetAddress);
+ let lastSent = IsIMOurs(filterArray[lastIndex], targetAddress);
+ if (thisSent && lastSent) {
+ return 'TinderMessage_Subsequent_Sent';
+ } else if (!thisSent && !lastSent) {
+ return 'TinderMessage_Subsequent_Received';
+ }
+ return thisSent ? 'TinderMessage_First_Sent' : 'TinderMessage_First_Received';
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorMessageTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorMessageTab.tsx
new file mode 100644
index 0000000000..6fe344719a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorMessageTab.tsx
@@ -0,0 +1,63 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section, Table } from '../../components';
+import { CONTTAB, MESSSUBTAB } from './constants';
+import { Data } from './types';
+
+export const CommunicatorMessageTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { imContacts } = data;
+
+ return (
+
+ {(imContacts.length && (
+
+ {imContacts.map((device) => (
+
+
+ {decodeHtmlEntities(device.name)}:
+
+
+ {device.address}
+
+ {
+ act('copy', { copy: device.address });
+ act('copy_name', {
+ copy_name: device.name,
+ });
+ act('switch_tab', {
+ switch_tab: MESSSUBTAB,
+ });
+ }}
+ >
+ View Conversation
+
+
+
+
+ ))}
+
+ )) || (
+
+ You haven't sent any messages yet.
+ act('switch_tab', { switch_tab: CONTTAB })}
+ >
+ Contacts
+
+
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorNewsTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorNewsTab.tsx
new file mode 100644
index 0000000000..5ed6049bfd
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorNewsTab.tsx
@@ -0,0 +1,105 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicatorNewsTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { feeds, target_feed, latest_news } = data;
+
+ return (
+
+ {(!feeds.length && (
+
+ Error: No newsfeeds available. Please try again later.
+
+ )) ||
+ (target_feed && (
+ act('newsfeed', { newsfeed: null })}
+ >
+ Back
+
+ }
+ >
+ {target_feed.messages.map((message) => (
+
+ - {decodeHtmlEntities(message.body)}
+ {!!message.img && (
+
+
+ {decodeHtmlEntities(message.caption) || null}
+
+ )}
+
+ [{message.message_type} by{' '}
+ {decodeHtmlEntities(message.author)} - {message.time_stamp}]
+
+
+ ))}
+
+ )) || (
+ <>
+
+
+ {latest_news.map((news) => (
+
+
+ {decodeHtmlEntities(news.channel)}
+
+ act('newsfeed', {
+ newsfeed: news.index,
+ })
+ }
+ >
+ Go to
+
+
+ - {decodeHtmlEntities(news.body)}
+ {!!news.img && (
+
+ [image omitted, view story for more details]
+ {news.caption || null}
+
+ )}
+
+ [{news.message_type} by{' '}
+
+ {news.author}
+ {' '}
+ - {news.time_stamp}]
+
+
+ ))}
+
+
+
+ {feeds.map((feed) => (
+ act('newsfeed', { newsfeed: feed.index })}
+ >
+ {feed.name}
+
+ ))}
+
+ >
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorNoteTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorNoteTab.tsx
new file mode 100644
index 0000000000..35edfc6a61
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorNoteTab.tsx
@@ -0,0 +1,34 @@
+import { useBackend } from '../../backend';
+import { Button, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicatorNoteTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { note } = data;
+
+ return (
+ act('edit')}>
+ Edit Notes
+
+ }
+ >
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorPhoneTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorPhoneTab.tsx
new file mode 100644
index 0000000000..4e50303131
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorPhoneTab.tsx
@@ -0,0 +1,328 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ Flex,
+ Icon,
+ Input,
+ LabeledList,
+ Section,
+ Table,
+} from '../../components';
+import { MESSTAB } from './constants';
+import { Data } from './types';
+
+export const CommunicatorPhoneTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { selfie_mode, targetAddress } = data;
+
+ const validCharacters = [
+ '0',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ 'A',
+ 'B',
+ 'C',
+ 'D',
+ 'E',
+ 'F',
+ ];
+
+ const buttonArray = validCharacters.map((char) => (
+ act('add_hex', { add_hex: char })}
+ >
+ {char}
+
+ ));
+
+ let finalArray: React.JSX.Element[] = [];
+
+ for (let i = 0; i < buttonArray.length; i += 4) {
+ finalArray.push(
+
+ {buttonArray[i]}
+ {buttonArray[i + 1]}
+ {buttonArray[i + 2]}
+ {buttonArray[i + 3]}
+ ,
+ );
+ }
+
+ return (
+
+ );
+};
+
+const CommunicatorPhoneTabExternal = (props) => {
+ const { act, data } = useBackend();
+
+ const { voice_mobs } = data;
+
+ return (
+
+ {(!!voice_mobs.length && (
+
+ {voice_mobs.map((mob) => (
+
+
+ act('disconnect', {
+ disconnect: mob.true_name,
+ })
+ }
+ >
+ Disconnect
+
+
+ ))}
+
+ )) || No connections }
+
+ );
+};
+
+const CommunicatorPhoneTabInternal = (props) => {
+ const { act, data } = useBackend();
+
+ const { communicating, video_comm, phone_video_comm } = data;
+
+ return (
+
+ {(!!communicating.length && (
+
+ {communicating.map((comm) => (
+
+
+ {decodeHtmlEntities(comm.name)}
+
+
+
+ act('disconnect', {
+ disconnect: comm.true_name,
+ })
+ }
+ >
+ Disconnect
+
+ {(video_comm === null && (
+
+ act('startvideo', {
+ startvideo: comm.ref,
+ })
+ }
+ >
+ Start Video
+
+ )) ||
+ (phone_video_comm === comm.ref && (
+
+ act('endvideo', {
+ endvideo: comm.true_name,
+ })
+ }
+ >
+ Stop Video
+
+ ))}
+
+
+ ))}
+
+ )) || No connections }
+
+ );
+};
+
+const CommunicatorPhoneTabRequest = (props) => {
+ const { act, data } = useBackend();
+
+ const { requestsReceived } = data;
+
+ return (
+
+ {(!!requestsReceived.length && (
+
+ {requestsReceived.map((request) => (
+
+ {decodeHtmlEntities(request.address)}
+
+ act('dial', { dial: request.address })}
+ >
+ Accept
+
+ act('decline', { decline: request.ref })}
+ >
+ Decline
+
+
+
+ ))}
+
+ )) || No requests received. }
+
+ );
+};
+
+const CommunicatorPhoneTabInvite = (props) => {
+ const { act, data } = useBackend();
+
+ const { invitesSent } = data;
+
+ return (
+
+ {(!!invitesSent.length && (
+
+ {invitesSent.map((invite) => (
+
+ {decodeHtmlEntities(invite.address)}
+
+ {
+ act('copy', { copy: invite.address });
+ }}
+ >
+ Copy
+
+
+
+ ))}
+
+ )) || No invites sent. }
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorSettingsTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorSettingsTab.tsx
new file mode 100644
index 0000000000..3cfcb217b1
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorSettingsTab.tsx
@@ -0,0 +1,74 @@
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, Section } from '../../components';
+import { Data } from './types';
+
+export const CommunicatorSettingsTab = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ address,
+ selfie_mode,
+ owner,
+ occupation,
+ connectionStatus,
+ visible,
+ ring,
+ } = data;
+
+ return (
+
+
+
+ act('rename')}>
+ {decodeHtmlEntities(owner)}
+
+
+
+ act('selfie_mode')}>
+ {selfie_mode ? 'Front-facing Camera' : 'Rear-facing Camera'}
+
+
+
+ {decodeHtmlEntities(occupation)}
+
+
+ {connectionStatus === 1 ? (
+ Connected
+ ) : (
+ Disconnected
+ )}
+
+
+ {address}
+
+
+ act('toggle_visibility')}
+ >
+ {visible
+ ? 'This device can be seen by other devices.'
+ : 'This device is invisible to other devices.'}
+
+
+
+ act('toggle_ringer')}
+ >
+ {ring ? 'Ringer on.' : 'Ringer off.'}
+
+ act('set_ringer_tone')}>
+ Set Ringer Tone
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/CommunicatorWeatherTab.tsx b/tgui/packages/tgui/interfaces/Communicator/CommunicatorWeatherTab.tsx
new file mode 100644
index 0000000000..5c7412253d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/CommunicatorWeatherTab.tsx
@@ -0,0 +1,97 @@
+import { filter } from 'common/collections';
+import { decodeHtmlEntities, toTitleCase } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, LabeledList, Section } from '../../components';
+import { AirContent, WeatherTabData } from './types';
+
+export const CommunicatorWeatherTab = (props) => {
+ const { act, data } = useBackend();
+
+ const { aircontents, weather } = data;
+
+ const deg: string = '\u00B0';
+
+ return (
+
+
+
+ {filter(
+ (i: AirContent) =>
+ i.val !== '0' ||
+ i.entry === 'Pressure' ||
+ i.entry === 'Temperature',
+ )(aircontents).map((item: AirContent) => (
+
+ {item.val}
+ {decodeHtmlEntities(item.units)}
+
+ ))}
+
+
+
+ {(!!weather.length && (
+
+ {weather.map((wr) => (
+
+
+ {wr.Time}
+
+ {toTitleCase(wr.Weather)}
+
+
+ Current: {wr.Temperature.toFixed()} {deg}C | High:{' '}
+ {wr.High.toFixed()} {deg}C | Low: {wr.Low.toFixed()} {deg}C
+
+
+ {wr.WindDir}
+
+
+ {wr.WindSpeed}
+
+
+ {decodeHtmlEntities(wr.Forecast)}
+
+
+
+ ))}
+
+ )) || (
+
+ No weather reports available. Please check back later.
+
+ )}
+
+
+ );
+};
+
+/* Weather App */
+const getItemColor = (
+ value: number,
+ min2: number,
+ min1: number,
+ max1: number,
+ max2: number,
+) => {
+ if (value < min2) {
+ return 'bad';
+ } else if (value < min1) {
+ return 'average';
+ } else if (value > max1) {
+ return 'average';
+ } else if (value > max2) {
+ return 'bad';
+ }
+ return 'good';
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/constants.ts b/tgui/packages/tgui/interfaces/Communicator/constants.ts
new file mode 100644
index 0000000000..f37d974320
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/constants.ts
@@ -0,0 +1,27 @@
+export const HOMETAB = 1;
+export const PHONTAB = 2;
+export const CONTTAB = 3;
+export const MESSTAB = 4;
+export const MESSSUBTAB = 40;
+export const NEWSTAB = 5;
+export const NOTETAB = 6;
+export const WTHRTAB = 7;
+export const MANITAB = 8;
+export const SETTTAB = 9;
+
+export const tabs = [
+ HOMETAB,
+ PHONTAB,
+ CONTTAB,
+ MESSTAB,
+ MESSSUBTAB,
+ NEWSTAB,
+ NOTETAB,
+ WTHRTAB,
+ MANITAB,
+ SETTTAB,
+];
+
+export function notFound(val) {
+ return tabs.includes(val);
+}
diff --git a/tgui/packages/tgui/interfaces/Communicator/index.tsx b/tgui/packages/tgui/interfaces/Communicator/index.tsx
new file mode 100644
index 0000000000..0194169071
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/index.tsx
@@ -0,0 +1,88 @@
+import { useState } from 'react';
+
+import { useBackend } from '../../backend';
+import { Box } from '../../components';
+import { Window } from '../../layouts';
+import { CrewManifestContent } from '../CrewManifest';
+import { CommunicatorContactTab } from './CommunicatorContactTab';
+import {
+ CommunicatorFooter,
+ CommunicatorHeader,
+ TemplateError,
+ VideoComm,
+} from './CommunicatorGeneral';
+import { CommunicatorHomeTab } from './CommunicatorHomeTab';
+import { CommunicatorMessageSubTab } from './CommunicatorMessageSubTab';
+import { CommunicatorMessageTab } from './CommunicatorMessageTab';
+import { CommunicatorNewsTab } from './CommunicatorNewsTab';
+import { CommunicatorNoteTab } from './CommunicatorNoteTab';
+import { CommunicatorPhoneTab } from './CommunicatorPhoneTab';
+import { CommunicatorSettingsTab } from './CommunicatorSettingsTab';
+import { CommunicatorWeatherTab } from './CommunicatorWeatherTab';
+import { notFound, tabs } from './constants';
+import { Data } from './types';
+
+export const Communicator = () => {
+ const { act, data } = useBackend();
+
+ const { currentTab, video_comm } = data;
+
+ const tab: React.JSX.Element[] = [];
+
+ const [videoSetting, setVideoSetting] = useState(0);
+ const [clipboardMode, setClipboardMode] = useState(false);
+
+ function handleClipboardMode(value: boolean) {
+ setClipboardMode(value);
+ }
+
+ tab[tabs[0]] = ;
+ tab[tabs[1]] = ;
+ tab[tabs[2]] = ;
+ tab[tabs[3]] = ;
+ tab[tabs[4]] = (
+
+ );
+ tab[tabs[5]] = ;
+ tab[tabs[6]] = ;
+ tab[tabs[7]] = ;
+ tab[tabs[8]] = ;
+ tab[tabs[9]] = ;
+
+ return (
+
+
+ {video_comm && (
+
+ )}
+ {(!video_comm || videoSetting !== 0) && (
+ <>
+
+
+ {tab[currentTab] ||
+ (notFound(currentTab) && (
+
+ ))}
+
+
+ >
+ )}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Communicator/types.ts b/tgui/packages/tgui/interfaces/Communicator/types.ts
new file mode 100644
index 0000000000..7d32b0e34b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Communicator/types.ts
@@ -0,0 +1,96 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ // GENERAL
+ currentTab: number;
+ video_comm: BooleanLike;
+ mapRef: string;
+
+ // FOOTER
+ time: string;
+ connectionStatus: BooleanLike;
+ owner: string;
+ occupation: string;
+
+ // HEADER
+ flashlight: BooleanLike;
+
+ // HOMETAB
+ homeScreen: { number: number; module: string; icon: string }[];
+
+ // PHONETAB
+ targetAddress: string;
+ voice_mobs: { name: string; true_name: string; ref: string }[];
+ communicating: {
+ address: string;
+ name: string;
+ true_name: string;
+ ref: string;
+ }[];
+ requestsReceived: { address: string; name: string; ref: string }[];
+ invitesSent: { address: string; name: string }[];
+ phone_video_comm: string;
+ selfie_mode: BooleanLike;
+
+ // MESSAGING
+ imContacts: { address: string; name: string }[];
+ targetAddressName: string;
+ imList: { address: string; to_address: string; im: string }[];
+
+ // SETTINGS
+ address: string;
+ visible: BooleanLike;
+ ring: BooleanLike;
+
+ // NEWSTAB
+ feeds: { index: number; name: string }[];
+ target_feed: { name: string; author: string; messages: NewsMessage[] } | null;
+ latest_news: NewsMessage[];
+
+ // NOTETAB
+ note: string;
+};
+
+type NewsMessage = {
+ ref: string;
+ body: string;
+ img: string;
+ caption: string;
+ message_type: string;
+ author: string;
+ time_stamp: string;
+
+ index: number;
+ channel: string;
+};
+
+export type ContactsTabData = {
+ knownDevices: { address: string; name: string }[];
+};
+
+export type WeatherTabData = {
+ aircontents: AirContent[];
+ weather: Weather[];
+};
+
+export type AirContent = {
+ entry: string;
+ val;
+ bad_low: number;
+ poor_low: number;
+ poor_high: number;
+ bad_high: number;
+ units;
+};
+
+type Weather = {
+ Planet: string;
+ Time: string;
+ Weather: string;
+ Temperature;
+ High;
+ Low;
+ WindDir;
+ WindSpeed;
+ Forecast: string;
+};
diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep1.tsx b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep1.tsx
new file mode 100644
index 0000000000..e950bdad7c
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep1.tsx
@@ -0,0 +1,53 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section, Table } from '../../components';
+
+// This had a pretty gross backend so this was unfortunately one of the
+// best ways of doing it.
+export const CfStep1 = (props) => {
+ const { act } = useBackend();
+ return (
+
+
+ Choose your Device
+
+
+
+
+
+
+ act('pick_device', {
+ pick: '1',
+ })
+ }
+ >
+ Laptop
+
+
+
+
+ act('pick_device', {
+ pick: '2',
+ })
+ }
+ >
+ Tablet
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator.jsx b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep2.tsx
similarity index 67%
rename from tgui/packages/tgui/interfaces/ComputerFabricator.jsx
rename to tgui/packages/tgui/interfaces/ComputerFabricator/CfStep2.tsx
index 619f5c0feb..6975129674 100644
--- a/tgui/packages/tgui/interfaces/ComputerFabricator.jsx
+++ b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep2.tsx
@@ -1,91 +1,31 @@
import { multiline } from 'common/string';
-import { useBackend } from '../backend';
-import { Box, Button, Section, Table, Tooltip } from '../components';
-import { Window } from '../layouts';
+import { useBackend } from '../../backend';
+import { Box, Button, Section, Table, Tooltip } from '../../components';
+import { Data } from './types';
-export const ComputerFabricator = (props) => {
- const { act, data } = useBackend();
- return (
-
-
-
- Your perfect device, only three steps away...
-
- {data.state !== 0 && (
- act('clean_order')}>
- Clear Order
-
- )}
- {data.state === 0 && }
- {data.state === 1 && }
- {data.state === 2 && }
- {data.state === 3 && }
-
-
- );
-};
+export const CfStep2 = (props) => {
+ const { act, data } = useBackend();
-// This had a pretty gross backend so this was unfortunately one of the
-// best ways of doing it.
-const CfStep1 = (props) => {
- const { act, data } = useBackend();
- return (
-
-
- Choose your Device
-
-
-
-
-
-
- act('pick_device', {
- pick: '1',
- })
- }
- >
- Laptop
-
-
-
-
- act('pick_device', {
- pick: '2',
- })
- }
- >
- Tablet
-
-
-
-
-
-
- );
-};
+ const {
+ totalprice,
+ hw_battery,
+ hw_disk,
+ hw_netcard,
+ hw_nanoprint,
+ hw_card,
+ devtype,
+ hw_cpu,
+ hw_tesla,
+ } = data;
-const CfStep2 = (props) => {
- const { act, data } = useBackend();
return (
- {data.totalprice}â‚®
+ {totalprice}â‚®
}
>
@@ -103,7 +43,7 @@ const CfStep2 = (props) => {
act('hw_battery', {
battery: '1',
@@ -115,7 +55,7 @@ const CfStep2 = (props) => {
act('hw_battery', {
battery: '2',
@@ -127,7 +67,7 @@ const CfStep2 = (props) => {
act('hw_battery', {
battery: '3',
@@ -151,7 +91,7 @@ const CfStep2 = (props) => {
act('hw_disk', {
disk: '1',
@@ -163,7 +103,7 @@ const CfStep2 = (props) => {
act('hw_disk', {
disk: '2',
@@ -175,7 +115,7 @@ const CfStep2 = (props) => {
act('hw_disk', {
disk: '3',
@@ -201,7 +141,7 @@ const CfStep2 = (props) => {
act('hw_netcard', {
netcard: '0',
@@ -213,7 +153,7 @@ const CfStep2 = (props) => {
act('hw_netcard', {
netcard: '1',
@@ -225,7 +165,7 @@ const CfStep2 = (props) => {
act('hw_netcard', {
netcard: '2',
@@ -251,7 +191,7 @@ const CfStep2 = (props) => {
act('hw_nanoprint', {
print: '0',
@@ -263,7 +203,7 @@ const CfStep2 = (props) => {
act('hw_nanoprint', {
print: '1',
@@ -290,7 +230,7 @@ const CfStep2 = (props) => {
act('hw_card', {
card: '0',
@@ -302,7 +242,7 @@ const CfStep2 = (props) => {
act('hw_card', {
card: '1',
@@ -313,7 +253,7 @@ const CfStep2 = (props) => {
- {data.devtype !== 2 && (
+ {devtype !== 2 && (
Processor Unit:
@@ -329,7 +269,7 @@ const CfStep2 = (props) => {
act('hw_cpu', {
cpu: '1',
@@ -341,7 +281,7 @@ const CfStep2 = (props) => {
act('hw_cpu', {
cpu: '2',
@@ -368,7 +308,7 @@ const CfStep2 = (props) => {
act('hw_tesla', {
tesla: '0',
@@ -380,7 +320,7 @@ const CfStep2 = (props) => {
act('hw_tesla', {
tesla: '1',
@@ -406,35 +346,3 @@ const CfStep2 = (props) => {
);
};
-
-const CfStep3 = (props) => {
- const { act, data } = useBackend();
- return (
-
-
- Your device is ready for fabrication...
-
-
- Please swipe your ID now to authorize payment of:
-
-
- {data.totalprice}â‚®
-
-
-
- );
-};
-
-const CfStep4 = (props) => {
- return (
-
-
- Thank you for your purchase!
-
-
- If you experience any difficulties with your new device, please contact
- your local network administrator.
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep3.tsx b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep3.tsx
new file mode 100644
index 0000000000..668b739f29
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep3.tsx
@@ -0,0 +1,19 @@
+import { Box, Section } from '../../components';
+
+export const CfStep3 = (props: { totalprice: number }) => {
+ const { totalprice } = props;
+ return (
+
+
+ Your device is ready for fabrication...
+
+
+ Please swipe your ID now to authorize payment of:
+
+
+ {totalprice}â‚®
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep4.tsx b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep4.tsx
new file mode 100644
index 0000000000..62fb59fa85
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ComputerFabricator/CfStep4.tsx
@@ -0,0 +1,15 @@
+import { Box, Section } from '../../components';
+
+export const CfStep4 = (props) => {
+ return (
+
+
+ Thank you for your purchase!
+
+
+ If you experience any difficulties with your new device, please contact
+ your local network administrator.
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator/index.tsx b/tgui/packages/tgui/interfaces/ComputerFabricator/index.tsx
new file mode 100644
index 0000000000..b3919e0d0a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ComputerFabricator/index.tsx
@@ -0,0 +1,37 @@
+import { useBackend } from '../../backend';
+import { Button, Section } from '../../components';
+import { Window } from '../../layouts';
+import { CfStep1 } from './CfStep1';
+import { CfStep2 } from './CfStep2';
+import { CfStep3 } from './CfStep3';
+import { CfStep4 } from './CfStep4';
+import { Data } from './types';
+
+export const ComputerFabricator = (props) => {
+ const { act, data } = useBackend();
+
+ const { state, totalprice } = data;
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[0] = ;
+ tab[1] = ;
+ tab[2] = ;
+ tab[3] = ;
+
+ return (
+
+
+
+ Your perfect device, only three steps away...
+
+ {state !== 0 && (
+ act('clean_order')}>
+ Clear Order
+
+ )}
+ {tab[state]}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ComputerFabricator/types.ts b/tgui/packages/tgui/interfaces/ComputerFabricator/types.ts
new file mode 100644
index 0000000000..405a1007bd
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ComputerFabricator/types.ts
@@ -0,0 +1,14 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ state: number;
+ devtype: number | undefined;
+ hw_battery: number | undefined;
+ hw_disk: number | undefined;
+ hw_netcard: number | undefined;
+ hw_tesla: BooleanLike;
+ hw_nanoprint: BooleanLike;
+ hw_card: BooleanLike;
+ hw_cpu: number | undefined;
+ totalprice: number | undefined;
+};
diff --git a/tgui/packages/tgui/interfaces/CookingAppliance.jsx b/tgui/packages/tgui/interfaces/CookingAppliance.tsx
similarity index 87%
rename from tgui/packages/tgui/interfaces/CookingAppliance.jsx
rename to tgui/packages/tgui/interfaces/CookingAppliance.tsx
index 4efa443a6a..7b951cd5db 100644
--- a/tgui/packages/tgui/interfaces/CookingAppliance.jsx
+++ b/tgui/packages/tgui/interfaces/CookingAppliance.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
@@ -9,8 +11,22 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ temperature: number;
+ optimalTemp: number;
+ temperatureEnough: BooleanLike;
+ efficiency: number;
+ containersRemovable: BooleanLike;
+ our_contents: {
+ empty: BooleanLike;
+ progress: number;
+ progressText: string;
+ container: string | null;
+ }[];
+};
+
export const CookingAppliance = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
temperature,
diff --git a/tgui/packages/tgui/interfaces/CrewMonitor.jsx b/tgui/packages/tgui/interfaces/CrewMonitor.jsx
deleted file mode 100644
index 0dfb9c3955..0000000000
--- a/tgui/packages/tgui/interfaces/CrewMonitor.jsx
+++ /dev/null
@@ -1,188 +0,0 @@
-import { sortBy } from 'common/collections';
-import { flow } from 'common/fp';
-import { useState } from 'react';
-
-import { useBackend } from '../backend';
-import { Box, Button, Icon, NanoMap, Table, Tabs } from '../components';
-import { Window } from '../layouts';
-
-const getStatText = (cm) => {
- if (cm.dead) {
- return 'Deceased';
- }
- if (parseInt(cm.stat, 10) === 1) {
- // Unconscious
- return 'Unconscious';
- }
- return 'Living';
-};
-
-const getStatColor = (cm) => {
- if (cm.dead) {
- return 'red';
- }
- if (parseInt(cm.stat, 10) === 1) {
- // Unconscious
- return 'orange';
- }
- return 'green';
-};
-
-export const CrewMonitor = () => {
- const [tabIndex, setTabIndex] = useState(0);
- const [zoom, setZoom] = useState(1);
-
- function handleTabIndex(value) {
- setTabIndex(value);
- }
-
- function handleZoom(value) {
- setZoom(value);
- }
-
- return (
-
-
-
-
-
- );
-};
-
-export const CrewMonitorContent = (props) => {
- const { act, data, config } = useBackend();
-
- const crew = flow([
- sortBy((cm) => cm.name),
- sortBy((cm) => cm?.x),
- sortBy((cm) => cm?.y),
- sortBy((cm) => cm?.realZ),
- ])(data.crewmembers || []);
-
- let body;
- // Data view
- if (props.tabIndex === 0) {
- body = (
-
-
- Name
- Status
- Location
-
- {crew.map((cm) => (
-
-
- {cm.name} ({cm.assignment})
-
-
-
- {getStatText(cm)}
-
- {cm.sensor_type >= 2 ? (
-
- {'('}
-
- {cm.brute}
-
- {'|'}
-
- {cm.fire}
-
- {'|'}
-
- {cm.tox}
-
- {'|'}
-
- {cm.oxy}
-
- {')'}
-
- ) : null}
-
-
- {cm.sensor_type === 3 ? (
- data.isAI ? (
-
- act('track', {
- track: cm.ref,
- })
- }
- >
- {cm.area + ' (' + cm.x + ', ' + cm.y + ')'}
-
- ) : (
- cm.area + ' (' + cm.x + ', ' + cm.y + ', ' + cm.z + ')'
- )
- ) : (
- 'Not Available'
- )}
-
-
- ))}
-
- );
- } else if (props.tabIndex === 1) {
- // Please note, if you ever change the zoom values,
- // you MUST update styles/components/Tooltip.scss
- // and change the @for scss to match.
- body = ;
- } else {
- body = 'ERROR';
- }
-
- return (
- <>
-
- props.onTabIndex(0)}
- >
- Data View
-
- props.onTabIndex(1)}
- >
- Map View
-
-
- {body}
- >
- );
-};
-
-const CrewMonitorMapView = (props) => {
- const { act, config, data } = useBackend();
- return (
-
- props.onZoom(v)}>
- {data.crewmembers
- .filter(
- (x) => x.sensor_type === 3 && ~~x.realZ === ~~config.mapZLevel,
- )
- .map((cm) => (
-
- ))}
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/CrewMonitor.tsx b/tgui/packages/tgui/interfaces/CrewMonitor.tsx
new file mode 100644
index 0000000000..385f158dd8
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/CrewMonitor.tsx
@@ -0,0 +1,231 @@
+import { sortBy } from 'common/collections';
+import { flow } from 'common/fp';
+import { BooleanLike } from 'common/react';
+import { useState } from 'react';
+
+import { useBackend } from '../backend';
+import { Box, Button, Icon, NanoMap, Table, Tabs } from '../components';
+import { Window } from '../layouts';
+
+type Data = {
+ zoomScale: number;
+ isAI: BooleanLike;
+ map_levels: number[];
+ crewmembers: crewmember[];
+};
+
+type crewmember = {
+ sensor_type: number;
+ name: string;
+ rank: string;
+ assignment: string;
+ dead: BooleanLike;
+ stat: number;
+ oxy: number;
+ tox: number;
+ fire: number;
+ brute: number;
+ area: string;
+ x: number;
+ y: number;
+ realZ: number;
+ z: number;
+ ref: string;
+};
+
+const getStatText = (cm: crewmember) => {
+ if (cm.dead) {
+ return 'Deceased';
+ }
+ if (cm.stat === 1) {
+ // Unconscious
+ return 'Unconscious';
+ }
+ return 'Living';
+};
+
+const getStatColor = (cm: crewmember) => {
+ if (cm.dead) {
+ return 'red';
+ }
+ if (cm.stat === 1) {
+ // Unconscious
+ return 'orange';
+ }
+ return 'green';
+};
+
+export const CrewMonitor = () => {
+ const [tabIndex, setTabIndex] = useState(0);
+ const [zoom, setZoom] = useState(1);
+
+ function handleTabIndex(value: number) {
+ setTabIndex(value);
+ }
+
+ function handleZoom(value: number) {
+ setZoom(value);
+ }
+
+ return (
+
+
+
+
+
+ );
+};
+
+export const CrewMonitorContent = (props: {
+ tabIndex: number;
+ zoom: number;
+ onTabIndex: Function;
+ onZoom: Function;
+}) => {
+ const { data } = useBackend();
+
+ const { crewmembers = [] } = data;
+
+ const crew: crewmember[] = flow([
+ sortBy((cm: crewmember) => cm.name),
+ sortBy((cm: crewmember) => cm?.x),
+ sortBy((cm: crewmember) => cm?.y),
+ sortBy((cm: crewmember) => cm?.realZ),
+ ])(crewmembers);
+
+ const tab: React.JSX.Element[] = [];
+ // Data view
+ // Please note, if you ever change the zoom values,
+ // you MUST update styles/components/Tooltip.scss
+ // and change the @for scss to match.
+ tab[0] = ;
+
+ tab[1] = ;
+
+ return (
+ <>
+
+ props.onTabIndex(0)}
+ >
+ Data View
+
+ props.onTabIndex(1)}
+ >
+ Map View
+
+
+ {tab[props.tabIndex] || ERROR }
+ >
+ );
+};
+
+const CrewMonitorCrew = (props: { crew: crewmember[] }) => {
+ const { act, data } = useBackend();
+
+ const { crew } = props;
+
+ const { isAI } = data;
+
+ return (
+
+
+ Name
+ Status
+ Location
+
+ {crew.map((cm) => (
+
+
+ {cm.name} ({cm.assignment})
+
+
+
+ {getStatText(cm)}
+
+ {cm.sensor_type >= 2 ? (
+
+ {'('}
+
+ {cm.brute}
+
+ {'|'}
+
+ {cm.fire}
+
+ {'|'}
+
+ {cm.tox}
+
+ {'|'}
+
+ {cm.oxy}
+
+ {')'}
+
+ ) : null}
+
+
+ {cm.sensor_type === 3 ? (
+ isAI ? (
+
+ act('track', {
+ track: cm.ref,
+ })
+ }
+ >
+ {cm.area + ' (' + cm.x + ', ' + cm.y + ')'}
+
+ ) : (
+ cm.area + ' (' + cm.x + ', ' + cm.y + ', ' + cm.z + ')'
+ )
+ ) : (
+ 'Not Available'
+ )}
+
+
+ ))}
+
+ );
+};
+
+const CrewMonitorMapView = (props: { zoom: number; onZoom: Function }) => {
+ const { config, data } = useBackend();
+
+ const { zoomScale, crewmembers } = data;
+
+ return (
+
+ props.onZoom(v)}>
+ {crewmembers
+ .filter(
+ (x) => x.sensor_type === 3 && ~~x.realZ === ~~config.mapZLevel,
+ )
+ .map((cm) => (
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Cryo.jsx b/tgui/packages/tgui/interfaces/Cryo/CryoContent.tsx
similarity index 70%
rename from tgui/packages/tgui/interfaces/Cryo.jsx
rename to tgui/packages/tgui/interfaces/Cryo/CryoContent.tsx
index 5ec9994bb3..9ac1a8dff4 100644
--- a/tgui/packages/tgui/interfaces/Cryo.jsx
+++ b/tgui/packages/tgui/interfaces/Cryo/CryoContent.tsx
@@ -1,4 +1,6 @@
-import { useBackend } from '../backend';
+import { toFixed } from 'common/math';
+
+import { useBackend } from '../../backend';
import {
AnimatedNumber,
Box,
@@ -8,50 +10,16 @@ import {
LabeledList,
ProgressBar,
Section,
-} from '../components';
-import { Window } from '../layouts';
+} from '../../components';
+import { damageTypes, statNames } from './constants';
+import { Data } from './types';
-const damageTypes = [
- {
- label: 'Resp.',
- type: 'oxyLoss',
- },
- {
- label: 'Toxin',
- type: 'toxLoss',
- },
- {
- label: 'Brute',
- type: 'bruteLoss',
- },
- {
- label: 'Burn',
- type: 'fireLoss',
- },
-];
-
-const statNames = [
- ['good', 'Conscious'],
- ['average', 'Unconscious'],
- ['bad', 'DEAD'],
-];
-
-export const Cryo = (props) => {
- return (
-
-
-
-
-
- );
-};
-
-const CryoContent = (props) => {
- const { act, data } = useBackend();
+export const CryoContent = (props) => {
+ const { act, data } = useBackend();
const {
isOperating,
hasOccupant,
- occupant = [],
+ occupant,
cellTemperature,
cellTemperatureStatus,
isBeakerLoaded,
@@ -60,7 +28,7 @@ const CryoContent = (props) => {
<>
{
0 ? 'good' : 'average'}
>
-
+ toFixed(value)}
+ />
{
{statNames[occupant.stat][1]}
-
- {' K'}
+ toFixed(value) + ' K'}
+ />
- {damageTypes.map((damageType) => (
-
+ {damageTypes.map((damageType, i) => (
+
toFixed(value)}
/>
@@ -113,7 +87,7 @@ const CryoContent = (props) => {
) : (
-
+
No occupant detected.
@@ -155,7 +129,7 @@ const CryoContent = (props) => {
};
const CryoBeaker = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { isBeakerLoaded, beakerLabel, beakerVolume } = data;
if (isBeakerLoaded) {
return (
@@ -165,7 +139,7 @@ const CryoBeaker = (props) => {
{beakerVolume ? (
Math.round(v) + ' units remaining'}
+ format={(v) => toFixed(v) + ' units remaining'}
/>
) : (
'Beaker is empty'
diff --git a/tgui/packages/tgui/interfaces/Cryo/constants.ts b/tgui/packages/tgui/interfaces/Cryo/constants.ts
new file mode 100644
index 0000000000..b300a5f982
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Cryo/constants.ts
@@ -0,0 +1,24 @@
+export const damageTypes: { label: string; type: string }[] = [
+ {
+ label: 'Resp.',
+ type: 'oxyLoss',
+ },
+ {
+ label: 'Toxin',
+ type: 'toxLoss',
+ },
+ {
+ label: 'Brute',
+ type: 'bruteLoss',
+ },
+ {
+ label: 'Burn',
+ type: 'fireLoss',
+ },
+];
+
+export const statNames: string[][] = [
+ ['good', 'Conscious'],
+ ['average', 'Unconscious'],
+ ['bad', 'DEAD'],
+];
diff --git a/tgui/packages/tgui/interfaces/Cryo/index.tsx b/tgui/packages/tgui/interfaces/Cryo/index.tsx
new file mode 100644
index 0000000000..481740ce71
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Cryo/index.tsx
@@ -0,0 +1,12 @@
+import { Window } from '../../layouts';
+import { CryoContent } from './CryoContent';
+
+export const Cryo = (props) => {
+ return (
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Cryo/types.ts b/tgui/packages/tgui/interfaces/Cryo/types.ts
new file mode 100644
index 0000000000..49d2d2e303
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Cryo/types.ts
@@ -0,0 +1,23 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ isOperating: BooleanLike;
+ hasOccupant: BooleanLike;
+ occupant: {
+ name: string;
+ stat: number;
+ health: number;
+ maxHealth: number;
+ minHealth: number;
+ bruteLoss: number;
+ oxyLoss: number;
+ toxLoss: number;
+ fireLoss: number;
+ bodyTemperature: number;
+ };
+ cellTemperature: number;
+ cellTemperatureStatus: string;
+ isBeakerLoaded: BooleanLike;
+ beakerLabel: string | null;
+ beakerVolume: number;
+};
diff --git a/tgui/packages/tgui/interfaces/CryoStorage.jsx b/tgui/packages/tgui/interfaces/CryoStorage.tsx
similarity index 61%
rename from tgui/packages/tgui/interfaces/CryoStorage.jsx
rename to tgui/packages/tgui/interfaces/CryoStorage.tsx
index d947810e38..b564e95578 100644
--- a/tgui/packages/tgui/interfaces/CryoStorage.jsx
+++ b/tgui/packages/tgui/interfaces/CryoStorage.tsx
@@ -1,16 +1,29 @@
+import { BooleanLike } from 'common/react';
import { useState } from 'react';
import { useBackend } from '../backend';
-import { Box, Button, NoticeBox, Section, Tabs } from '../components';
+import { Box, NoticeBox, Section, Tabs } from '../components';
import { Window } from '../layouts';
+export type Data = {
+ real_name: string;
+ allow_items: BooleanLike;
+ crew: string[];
+ items: string[];
+};
+
export const CryoStorage = (props) => {
- const { act, data } = useBackend();
+ const { data } = useBackend();
const { real_name, allow_items } = data;
const [tab, setTab] = useState(0);
+ const tabs: React.JSX.Element[] = [];
+
+ tabs[0] = ;
+ tabs[1] = allow_items ? : ;
+
return (
@@ -25,15 +38,14 @@ export const CryoStorage = (props) => {
)}
Welcome, {real_name}.
- {tab === 0 && }
- {!!allow_items && tab === 1 && }
+ {tabs[tab]}
);
};
export const CryoStorageCrew = (props) => {
- const { act, data } = useBackend();
+ const { data } = useBackend();
const { crew } = data;
@@ -50,7 +62,29 @@ export const CryoStorageCrew = (props) => {
};
export const CryoStorageItems = (props) => {
- const { act, data } = useBackend();
+ const { data } = useBackend();
+
+ const { items } = data;
+
+ return (
+
+ {(items.length &&
+ items.map((item) => (
+
+ {item}
+
+ ))) || No items stored. }
+
+ );
+};
+
+export const CryoStorageDefaultError = (props) => {
+ return Disabled ;
+};
+
+/* Unused here
+export const CryoStorageItems = (props) => {
+ const { act, data } = useBackend();
const { items } = data;
@@ -76,3 +110,4 @@ export const CryoStorageItems = (props) => {
);
};
+*/
diff --git a/tgui/packages/tgui/interfaces/CryoStorageVr.jsx b/tgui/packages/tgui/interfaces/CryoStorageVr.jsx
deleted file mode 100644
index 173842a7a8..0000000000
--- a/tgui/packages/tgui/interfaces/CryoStorageVr.jsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { useState } from 'react';
-
-import { useBackend } from '../backend';
-import { Box, NoticeBox, Section, Tabs } from '../components';
-import { Window } from '../layouts';
-import { CryoStorageCrew } from './CryoStorage';
-
-export const CryoStorageVr = (props) => {
- const { act, data } = useBackend();
-
- const { real_name, allow_items } = data;
-
- const [tab, setTab] = useState(0);
-
- return (
-
-
-
- setTab(0)}>
- Crew
-
- {!!allow_items && (
- setTab(1)}>
- Items
-
- )}
-
- Welcome, {real_name}.
- {tab === 0 && }
- {!!allow_items && tab === 1 && }
-
-
- );
-};
-
-export const CryoStorageItemsVr = (props) => {
- const { act, data } = useBackend();
-
- const { items } = data;
-
- return (
-
- {(items.length &&
- items.map((item) => (
-
- {item}
-
- ))) || No items stored. }
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/DNAForensics.jsx b/tgui/packages/tgui/interfaces/DNAForensics.tsx
similarity index 89%
rename from tgui/packages/tgui/interfaces/DNAForensics.jsx
rename to tgui/packages/tgui/interfaces/DNAForensics.tsx
index b1dc785183..ab160dc8ef 100644
--- a/tgui/packages/tgui/interfaces/DNAForensics.jsx
+++ b/tgui/packages/tgui/interfaces/DNAForensics.tsx
@@ -1,9 +1,18 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ scan_progress: number;
+ scanning: BooleanLike;
+ bloodsamp: string;
+ bloodsamp_desc: string;
+};
+
export const DNAForensics = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { scan_progress, scanning, bloodsamp, bloodsamp_desc } = data;
return (
diff --git a/tgui/packages/tgui/interfaces/DNAModifier.jsx b/tgui/packages/tgui/interfaces/DNAModifier.jsx
deleted file mode 100644
index 72560e1470..0000000000
--- a/tgui/packages/tgui/interfaces/DNAModifier.jsx
+++ /dev/null
@@ -1,701 +0,0 @@
-import { useBackend } from '../backend';
-import {
- Box,
- Button,
- Dimmer,
- Flex,
- Icon,
- Knob,
- LabeledList,
- ProgressBar,
- Section,
- Tabs,
-} from '../components';
-import { Window } from '../layouts';
-import { ComplexModal } from './common/ComplexModal';
-
-const stats = [
- ['good', 'Alive'],
- ['average', 'Unconscious'],
- ['bad', 'DEAD'],
-];
-
-const operations = [
- ['ui', 'Modify U.I.', 'dna'],
- ['se', 'Modify S.E.', 'dna'],
- ['buffer', 'Transfer Buffers', 'syringe'],
- ['rejuvenators', 'Rejuvenators', 'flask'],
-];
-
-const rejuvenatorsDoses = [5, 10, 20, 30, 50];
-
-export const DNAModifier = (props) => {
- const { act, data } = useBackend();
- const { irradiating, dnaBlockSize, occupant } = data;
- const isDNAInvalid =
- !occupant.isViableSubject ||
- !occupant.uniqueIdentity ||
- !occupant.structuralEnzymes;
- let radiatingModal;
- if (irradiating) {
- radiatingModal = ;
- }
- return (
-
-
- {radiatingModal}
-
-
-
-
-
- );
-};
-
-const DNAModifierOccupant = (props) => {
- const { act, data } = useBackend();
- const { locked, hasOccupant, occupant } = data;
- return (
-
-
- Door Lock:
-
- act('toggleLock')}
- >
- {locked ? 'Engaged' : 'Disengaged'}
-
- act('ejectOccupant')}
- >
- Eject
-
- >
- }
- >
- {hasOccupant ? (
- <>
-
-
- {occupant.name}
-
-
-
-
- {stats[occupant.stat][1]}
-
-
-
-
- {props.isDNAInvalid ? (
-
-
- The occupant's DNA structure is ruined beyond
- recognition, please insert a subject with an intact DNA structure.
-
- ) : (
-
-
-
-
-
- {data.occupant.uniqueEnzymes ? (
- data.occupant.uniqueEnzymes
- ) : (
-
-
- Unknown
-
- )}
-
-
- )}
- >
- ) : (
- Cell unoccupied.
- )}
-
- );
-};
-
-const DNAModifierMain = (props) => {
- const { act, data } = useBackend();
- const { selectedMenuKey, hasOccupant, occupant } = data;
- if (!hasOccupant) {
- return (
-
-
-
-
-
- No occupant in DNA modifier.
-
-
-
- );
- } else if (props.isDNAInvalid) {
- return (
-
-
-
-
-
- No operation possible on this subject.
-
-
-
- );
- }
- let body;
- if (selectedMenuKey === 'ui') {
- body = (
- <>
-
-
- >
- );
- } else if (selectedMenuKey === 'se') {
- body = (
- <>
-
-
- >
- );
- } else if (selectedMenuKey === 'buffer') {
- body = ;
- } else if (selectedMenuKey === 'rejuvenators') {
- body = ;
- }
- return (
-
-
- {operations.map((op, i) => (
- act('selectMenuKey', { key: op[0] })}
- >
-
- {op[1]}
-
- ))}
-
- {body}
-
- );
-};
-
-const DNAModifierMainUI = (props) => {
- const { act, data } = useBackend();
- const {
- selectedUIBlock,
- selectedUISubBlock,
- selectedUITarget,
- dnaBlockSize,
- occupant,
- } = data;
- return (
-
-
-
-
- value.toString(16).toUpperCase()}
- ml="0"
- onChange={(e, val) => act('changeUITarget', { value: val })}
- />
-
-
- act('pulseUIRadiation')}
- >
- Irradiate Block
-
-
- );
-};
-
-const DNAModifierMainSE = (props) => {
- const { act, data } = useBackend();
- const { selectedSEBlock, selectedSESubBlock, dnaBlockSize, occupant } = data;
- return (
-
-
- act('pulseSERadiation')}>
- Irradiate Block
-
-
- );
-};
-
-const DNAModifierMainRadiationEmitter = (props) => {
- const { act, data } = useBackend();
- const { radiationIntensity, radiationDuration } = data;
- return (
-
-
-
- act('radiationIntensity', { value: val })}
- />
-
-
- act('radiationDuration', { value: val })}
- />
-
-
- act('pulseRadiation')}
- >
- Pulse Radiation
-
-
- );
-};
-
-const DNAModifierMainBuffers = (props) => {
- const { act, data } = useBackend();
- const { buffers } = data;
- let bufferElements = buffers.map((buffer, i) => (
-
- ));
- return (
- <>
-
-
- >
- );
-};
-
-const DNAModifierMainBuffersElement = (props) => {
- const { act, data } = useBackend();
- const { id, name, buffer } = props;
- const isInjectorReady = data.isInjectorReady;
- const realName = name + (buffer.data ? ' - ' + buffer.label : '');
- return (
-
-
-
- act('bufferOption', {
- option: 'clear',
- id: id,
- })
- }
- >
- Clear
-
-
- act('bufferOption', {
- option: 'changeLabel',
- id: id,
- })
- }
- >
- Rename
-
-
- act('bufferOption', {
- option: 'saveDisk',
- id: id,
- })
- }
- >
- Export
-
- >
- }
- >
-
-
-
- act('bufferOption', {
- option: 'saveUI',
- id: id,
- })
- }
- >
- Subject U.I
-
-
- act('bufferOption', {
- option: 'saveUIAndUE',
- id: id,
- })
- }
- >
- Subject U.I and U.E.
-
-
- act('bufferOption', {
- option: 'saveSE',
- id: id,
- })
- }
- >
- Subject S.E.
-
-
- act('bufferOption', {
- option: 'loadDisk',
- id: id,
- })
- }
- >
- From Disk
-
-
- {!!buffer.data && (
- <>
-
- {buffer.owner || Unknown }
-
-
- {buffer.type === 'ui'
- ? 'Unique Identifiers'
- : 'Structural Enzymes'}
- {!!buffer.ue && ' and Unique Enzymes'}
-
-
-
- act('bufferOption', {
- option: 'createInjector',
- id: id,
- })
- }
- >
- Injector
-
-
- act('bufferOption', {
- option: 'createInjector',
- id: id,
- block: 1,
- })
- }
- >
- Block Injector
-
-
- act('bufferOption', {
- option: 'transfer',
- id: id,
- })
- }
- >
- Subject
-
-
- >
- )}
-
- {!buffer.data && (
-
- This buffer is empty.
-
- )}
-
-
- );
-};
-
-const DNAModifierMainBuffersDisk = (props) => {
- const { act, data } = useBackend();
- const { hasDisk, disk } = data;
- return (
-
- act('wipeDisk')}
- >
- Wipe
-
- act('ejectDisk')}
- >
- Eject
-
- >
- }
- >
- {hasDisk ? (
- disk.data ? (
-
-
- {disk.label ? disk.label : 'No label'}
-
-
- {disk.owner ? disk.owner : Unknown }
-
-
- {disk.type === 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}
- {!!disk.ue && ' and Unique Enzymes'}
-
-
- ) : (
- Disk is blank.
- )
- ) : (
-
-
-
- No disk inserted.
-
- )}
-
- );
-};
-
-const DNAModifierMainRejuvenators = (props) => {
- const { act, data } = useBackend();
- const { isBeakerLoaded, beakerVolume, beakerLabel } = data;
- return (
- act('ejectBeaker')}
- >
- Eject
-
- }
- >
- {isBeakerLoaded ? (
-
-
- {rejuvenatorsDoses.map((a, i) => (
- beakerVolume}
- icon="syringe"
- onClick={() =>
- act('injectRejuvenators', {
- amount: a,
- })
- }
- >
- {a}
-
- ))}
-
- act('injectRejuvenators', {
- amount: beakerVolume,
- })
- }
- >
- All
-
-
-
- {beakerLabel ? beakerLabel : 'No label'}
- {beakerVolume ? (
-
- {beakerVolume} unit{beakerVolume === 1 ? '' : 's'} remaining
-
- ) : (
- Empty
- )}
-
-
- ) : (
-
-
-
- No beaker loaded.
-
- )}
-
- );
-};
-
-const DNAModifierIrradiating = (props) => {
- return (
-
-
-
-
-
-
- Irradiating occupant
-
-
-
-
-
- For {props.duration} second{props.duration === 1 ? '' : 's'}
-
-
-
- );
-};
-
-const DNAModifierBlocks = (props) => {
- const { act, data } = useBackend();
- const { dnaString, selectedBlock, selectedSubblock, blockSize, action } =
- props;
-
- const characters = dnaString.split('');
- let curBlock = 0;
- let dnaBlocks = [];
- for (let block = 0; block < characters.length; block += blockSize) {
- const realBlock = block / blockSize + 1;
- let subBlocks = [];
- for (let subblock = 0; subblock < blockSize; subblock++) {
- const realSubblock = subblock + 1;
- subBlocks.push(
-
- act(action, {
- block: realBlock,
- subblock: realSubblock,
- })
- }
- >
- {characters[block + subblock]}
- ,
- );
- }
- dnaBlocks.push(
-
-
- {realBlock}
-
- {subBlocks}
- ,
- );
- }
- return {dnaBlocks} ;
-};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierBlocks.tsx b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierBlocks.tsx
new file mode 100644
index 0000000000..1d465d3e5a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierBlocks.tsx
@@ -0,0 +1,59 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Flex } from '../../components';
+
+export const DNAModifierBlocks = (props: {
+ dnaString: string;
+ selectedBlock: number;
+ selectedSubblock: number;
+ blockSize: number;
+ action: string;
+}) => {
+ const { act } = useBackend();
+
+ const { dnaString, selectedBlock, selectedSubblock, blockSize, action } =
+ props;
+
+ const characters: string[] = dnaString.split('');
+ let dnaBlocks: React.JSX.Element[] = [];
+ for (let block = 0; block < characters.length; block += blockSize) {
+ const realBlock: number = block / blockSize + 1;
+ let subBlocks: React.JSX.Element[] = [];
+ for (let subblock = 0; subblock < blockSize; subblock++) {
+ const realSubblock: number = subblock + 1;
+ subBlocks.push(
+
+ act(action, {
+ block: realBlock,
+ subblock: realSubblock,
+ })
+ }
+ >
+ {characters[block + subblock]}
+ ,
+ );
+ }
+ dnaBlocks.push(
+
+
+ {realBlock}
+
+ {subBlocks}
+ ,
+ );
+ }
+ return {dnaBlocks} ;
+};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierIrradiating.tsx b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierIrradiating.tsx
new file mode 100644
index 0000000000..1b6c04d76e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierIrradiating.tsx
@@ -0,0 +1,22 @@
+import { Box, Dimmer, Icon } from '../../components';
+
+export const DNAModifierIrradiating = (props: { duration: number }) => {
+ return (
+
+
+
+
+
+
+ Irradiating occupant
+
+
+
+
+
+ For {props.duration} second{props.duration === 1 ? '' : 's'}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierMain.tsx b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierMain.tsx
new file mode 100644
index 0000000000..aa08e16013
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierMain.tsx
@@ -0,0 +1,265 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ Flex,
+ Icon,
+ Knob,
+ LabeledList,
+ Section,
+ Tabs,
+} from '../../components';
+import { operations, rejuvenatorsDoses } from './constants';
+import { DNAModifierBlocks } from './DNAModifierBlocks';
+import { DNAModifierMainBuffers } from './DNAModifierMainBuffers';
+import { Data } from './types';
+
+export const DNAModifierMain = (props: { isDNAInvalid: BooleanLike }) => {
+ const { act, data } = useBackend();
+
+ const { selectedMenuKey, hasOccupant } = data;
+
+ if (!hasOccupant) {
+ return (
+
+
+
+
+
+ No occupant in DNA modifier.
+
+
+
+ );
+ } else if (props.isDNAInvalid) {
+ return (
+
+
+
+
+
+ No operation possible on this subject.
+
+
+
+ );
+ }
+ let body;
+ if (selectedMenuKey === 'ui') {
+ body = (
+ <>
+
+
+ >
+ );
+ } else if (selectedMenuKey === 'se') {
+ body = (
+ <>
+
+
+ >
+ );
+ } else if (selectedMenuKey === 'buffer') {
+ body = ;
+ } else if (selectedMenuKey === 'rejuvenators') {
+ body = ;
+ }
+ return (
+
+
+ {operations.map((op, i) => (
+ act('selectMenuKey', { key: op[0] })}
+ >
+
+ {op[1]}
+
+ ))}
+
+ {body}
+
+ );
+};
+
+const DNAModifierMainUI = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ selectedUIBlock,
+ selectedUISubBlock,
+ selectedUITarget,
+ dnaBlockSize,
+ occupant,
+ } = data;
+
+ return (
+
+
+
+
+ value.toString(16).toUpperCase()}
+ ml="0"
+ onChange={(e, val) => act('changeUITarget', { value: val })}
+ />
+
+
+ act('pulseUIRadiation')}
+ >
+ Irradiate Block
+
+
+ );
+};
+
+const DNAModifierMainSE = (props) => {
+ const { act, data } = useBackend();
+
+ const { selectedSEBlock, selectedSESubBlock, dnaBlockSize, occupant } = data;
+
+ return (
+
+
+ act('pulseSERadiation')}>
+ Irradiate Block
+
+
+ );
+};
+
+const DNAModifierMainRadiationEmitter = (props) => {
+ const { act, data } = useBackend();
+
+ const { radiationIntensity, radiationDuration } = data;
+
+ return (
+
+
+
+ act('radiationIntensity', { value: val })}
+ />
+
+
+ act('radiationDuration', { value: val })}
+ />
+
+
+ act('pulseRadiation')}
+ >
+ Pulse Radiation
+
+
+ );
+};
+
+const DNAModifierMainRejuvenators = (props) => {
+ const { act, data } = useBackend();
+
+ const { isBeakerLoaded, beakerVolume, beakerLabel } = data;
+
+ return (
+ act('ejectBeaker')}
+ >
+ Eject
+
+ }
+ >
+ {isBeakerLoaded ? (
+
+
+ {rejuvenatorsDoses.map((a, i) => (
+ beakerVolume}
+ icon="syringe"
+ onClick={() =>
+ act('injectRejuvenators', {
+ amount: a,
+ })
+ }
+ >
+ {a}
+
+ ))}
+
+ act('injectRejuvenators', {
+ amount: beakerVolume,
+ })
+ }
+ >
+ All
+
+
+
+ {beakerLabel ? beakerLabel : 'No label'}
+ {beakerVolume ? (
+
+ {beakerVolume} unit{beakerVolume === 1 ? '' : 's'} remaining
+
+ ) : (
+ Empty
+ )}
+
+
+ ) : (
+
+
+
+ No beaker loaded.
+
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierMainBuffers.tsx b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierMainBuffers.tsx
new file mode 100644
index 0000000000..d3efe7678d
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierMainBuffers.tsx
@@ -0,0 +1,254 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Icon, LabeledList, Section } from '../../components';
+import { buffData, Data } from './types';
+
+export const DNAModifierMainBuffers = (props) => {
+ const { data } = useBackend();
+
+ const { buffers } = data;
+
+ let bufferElements = buffers.map((buffer, i) => (
+
+ ));
+ return (
+ <>
+
+
+ >
+ );
+};
+
+const DNAModifierMainBuffersElement = (props: {
+ id: number;
+ name: string;
+ buffer: buffData;
+}) => {
+ const { act, data } = useBackend();
+ const { id, name, buffer } = props;
+ const { isInjectorReady } = data;
+ const realName: string = name + (buffer.data ? ' - ' + buffer.label : '');
+ return (
+
+
+
+ act('bufferOption', {
+ option: 'clear',
+ id: id,
+ })
+ }
+ >
+ Clear
+
+
+ act('bufferOption', {
+ option: 'changeLabel',
+ id: id,
+ })
+ }
+ >
+ Rename
+
+
+ act('bufferOption', {
+ option: 'saveDisk',
+ id: id,
+ })
+ }
+ >
+ Export
+
+ >
+ }
+ >
+
+
+
+ act('bufferOption', {
+ option: 'saveUI',
+ id: id,
+ })
+ }
+ >
+ Subject U.I
+
+
+ act('bufferOption', {
+ option: 'saveUIAndUE',
+ id: id,
+ })
+ }
+ >
+ Subject U.I and U.E.
+
+
+ act('bufferOption', {
+ option: 'saveSE',
+ id: id,
+ })
+ }
+ >
+ Subject S.E.
+
+
+ act('bufferOption', {
+ option: 'loadDisk',
+ id: id,
+ })
+ }
+ >
+ From Disk
+
+
+ {!!buffer.data && (
+ <>
+
+ {buffer.owner || Unknown }
+
+
+ {buffer.type === 'ui'
+ ? 'Unique Identifiers'
+ : 'Structural Enzymes'}
+ {!!buffer.ue && ' and Unique Enzymes'}
+
+
+
+ act('bufferOption', {
+ option: 'createInjector',
+ id: id,
+ })
+ }
+ >
+ Injector
+
+
+ act('bufferOption', {
+ option: 'createInjector',
+ id: id,
+ block: 1,
+ })
+ }
+ >
+ Block Injector
+
+
+ act('bufferOption', {
+ option: 'transfer',
+ id: id,
+ })
+ }
+ >
+ Subject
+
+
+ >
+ )}
+
+ {!buffer.data && (
+
+ This buffer is empty.
+
+ )}
+
+
+ );
+};
+
+const DNAModifierMainBuffersDisk = (props) => {
+ const { act, data } = useBackend();
+ const { hasDisk, disk } = data;
+ return (
+
+ act('wipeDisk')}
+ >
+ Wipe
+
+ act('ejectDisk')}
+ >
+ Eject
+
+ >
+ }
+ >
+ {hasDisk ? (
+ disk.data ? (
+
+
+ {disk.label ? disk.label : 'No label'}
+
+
+ {disk.owner ? disk.owner : Unknown }
+
+
+ {disk.type === 'ui' ? 'Unique Identifiers' : 'Structural Enzymes'}
+ {!!disk.ue && ' and Unique Enzymes'}
+
+
+ ) : (
+ Disk is blank.
+ )
+ ) : (
+
+
+
+ No disk inserted.
+
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierOccupant.tsx b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierOccupant.tsx
new file mode 100644
index 0000000000..b8fd28b5ce
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/DNAModifierOccupant.tsx
@@ -0,0 +1,103 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ Icon,
+ LabeledList,
+ ProgressBar,
+ Section,
+} from '../../components';
+import { stats } from './constants';
+import { Data } from './types';
+
+export const DNAModifierOccupant = (props: { isDNAInvalid: BooleanLike }) => {
+ const { act, data } = useBackend();
+
+ const { locked, hasOccupant, occupant } = data;
+
+ return (
+
+
+ Door Lock:
+
+ act('toggleLock')}
+ >
+ {locked ? 'Engaged' : 'Disengaged'}
+
+ act('ejectOccupant')}
+ >
+ Eject
+
+ >
+ }
+ >
+ {hasOccupant ? (
+ <>
+
+
+ {occupant.name}
+
+
+
+
+ {stats[occupant.stat!][1]}
+
+
+
+
+ {props.isDNAInvalid ? (
+
+
+ The occupant's DNA structure is ruined beyond
+ recognition, please insert a subject with an intact DNA structure.
+
+ ) : (
+
+
+
+
+
+ {data.occupant.uniqueEnzymes ? (
+ data.occupant.uniqueEnzymes
+ ) : (
+
+
+ Unknown
+
+ )}
+
+
+ )}
+ >
+ ) : (
+ Cell unoccupied.
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/constants.ts b/tgui/packages/tgui/interfaces/DNAModifier/constants.ts
new file mode 100644
index 0000000000..d247c8a51a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/constants.ts
@@ -0,0 +1,14 @@
+export const stats: string[][] = [
+ ['good', 'Alive'],
+ ['average', 'Unconscious'],
+ ['bad', 'DEAD'],
+];
+
+export const operations: string[][] = [
+ ['ui', 'Modify U.I.', 'dna'],
+ ['se', 'Modify S.E.', 'dna'],
+ ['buffer', 'Transfer Buffers', 'syringe'],
+ ['rejuvenators', 'Rejuvenators', 'flask'],
+];
+
+export const rejuvenatorsDoses: number[] = [5, 10, 20, 30, 50];
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/index.tsx b/tgui/packages/tgui/interfaces/DNAModifier/index.tsx
new file mode 100644
index 0000000000..220f72de66
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/index.tsx
@@ -0,0 +1,29 @@
+import { useBackend } from '../../backend';
+import { Window } from '../../layouts';
+import { ComplexModal } from '../common/ComplexModal';
+import { DNAModifierIrradiating } from './DNAModifierIrradiating';
+import { DNAModifierMain } from './DNAModifierMain';
+import { DNAModifierOccupant } from './DNAModifierOccupant';
+import { Data } from './types';
+
+export const DNAModifier = (props) => {
+ const { data } = useBackend();
+
+ const { irradiating, occupant } = data;
+
+ const isDNAInvalid: boolean =
+ !occupant.isViableSubject ||
+ !occupant.uniqueIdentity ||
+ !occupant.structuralEnzymes;
+
+ return (
+
+
+ {irradiating && }
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/DNAModifier/types.ts b/tgui/packages/tgui/interfaces/DNAModifier/types.ts
new file mode 100644
index 0000000000..73907fe9e7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DNAModifier/types.ts
@@ -0,0 +1,54 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ selectedMenuKey: string;
+ locked: BooleanLike;
+ hasOccupant: BooleanLike;
+ isInjectorReady: BooleanLike;
+ hasDisk: BooleanLike;
+ disk: buffData;
+ buffers: buffData[];
+ radiationIntensity: number;
+ radiationDuration: number;
+ irradiating: number;
+ dnaBlockSize: number;
+ selectedUIBlock: number;
+ selectedUISubBlock: number;
+ selectedSEBlock: number;
+ selectedSESubBlock: number;
+ selectedUITarget: number;
+ selectedUITargetHex: string;
+ occupant: {
+ name: string | null;
+ stat: number | null;
+ isViableSubject: BooleanLike | null;
+ health: number | null;
+ maxHealth: number | null;
+ minHealth: number | null;
+ uniqueEnzymes: string | null;
+ uniqueIdentity: string | null;
+ structuralEnzymes: string | null;
+ radiationLevel: number | null;
+ };
+ isBeakerLoaded: BooleanLike;
+ beakerLabel: string | null;
+ beakerVolume: number;
+ modal: modalData;
+};
+
+type modalData = {
+ id: string;
+ text: string;
+ args: {
+ id: string;
+ };
+ modal_type: string;
+};
+
+export type buffData = {
+ data: number[] | null;
+ owner: string | null;
+ label: string | null;
+ type: string | null;
+ ue: BooleanLike;
+};
diff --git a/tgui/packages/tgui/interfaces/DestinationTagger.jsx b/tgui/packages/tgui/interfaces/DestinationTagger.jsx
deleted file mode 100644
index ee46aa1fba..0000000000
--- a/tgui/packages/tgui/interfaces/DestinationTagger.jsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import { useBackend } from '../backend';
-import { Button, Flex, Section } from '../components';
-import { Window } from '../layouts';
-
-export const DestinationTagger = (props) => {
- const { act, data } = useBackend();
-
- const { currTag, taggerLocs } = data;
-
- return (
-
-
-
-
- {taggerLocs.sort().map((tag) => (
-
- act('set_tag', { tag: tag })}
- >
- {tag}
-
-
- ))}
-
-
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/DestinationTagger.tsx b/tgui/packages/tgui/interfaces/DestinationTagger.tsx
new file mode 100644
index 0000000000..a55eef5fc4
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/DestinationTagger.tsx
@@ -0,0 +1,50 @@
+import { useBackend } from '../backend';
+import { Button, Flex, Section } from '../components';
+import { Window } from '../layouts';
+
+type Data = {
+ currTag: string;
+ taggerLevels: { z: number; location: string }[];
+ taggerLocs: { tag: string; level: number }[];
+};
+
+export const DestinationTagger = (props) => {
+ const { act, data } = useBackend();
+
+ const { currTag, taggerLevels = [], taggerLocs } = data;
+
+ const unique_levels = taggerLevels.filter((obj, index) => {
+ return index === taggerLevels.findIndex((o) => obj.location === o.location);
+ });
+
+ return (
+
+
+
+ {unique_levels.map((level) => (
+
+
+ {taggerLocs.map(
+ (tag) =>
+ level.z === tag.level && (
+
+ act('set_tag', { tag: tag.tag })}
+ >
+ {tag.tag}
+
+
+ ),
+ )}
+
+
+ ))}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/DiseaseSplicer.jsx b/tgui/packages/tgui/interfaces/DiseaseSplicer.tsx
similarity index 76%
rename from tgui/packages/tgui/interfaces/DiseaseSplicer.jsx
rename to tgui/packages/tgui/interfaces/DiseaseSplicer.tsx
index 4db3567cff..f962aa1628 100644
--- a/tgui/packages/tgui/interfaces/DiseaseSplicer.jsx
+++ b/tgui/packages/tgui/interfaces/DiseaseSplicer.tsx
@@ -1,9 +1,24 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ dish_inserted: BooleanLike;
+ buffer: { name: string; stage: number } | null;
+ species_buffer: string | null;
+ busy: string | null;
+ growth: number;
+ effects:
+ | { name: string; stage: number; reference: string; badness: number }[]
+ | null;
+ info: string;
+ affected_species: string[] | null;
+};
+
export const DiseaseSplicer = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { busy } = data;
@@ -28,7 +43,7 @@ export const DiseaseSplicer = (props) => {
};
const DiseaseSplicerVirusDish = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { dish_inserted, effects, info, growth, affected_species } = data;
@@ -60,12 +75,12 @@ const DiseaseSplicerVirusDish = (props) => {
{info ? (
-
+
) : (
<>
-
+
{(effects &&
effects.map((effect) => (
@@ -74,23 +89,25 @@ const DiseaseSplicerVirusDish = (props) => {
))) || No virus sample loaded. }
-
- {!affected_species || !affected_species.length ? 'None' : null}
- {affected_species.sort().join(', ')}
+
+ {!affected_species || !affected_species.length
+ ? 'None'
+ : affected_species.sort().join(', ')}
-
+
CAUTION: Reverse engineering will destroy the viral sample.
- {effects.map((e) => (
- act('grab', { grab: e.reference })}
- >
- {e.stage}
-
- ))}
+ {effects &&
+ effects.map((e) => (
+ act('grab', { grab: e.reference })}
+ >
+ {e.stage}
+
+ ))}
act('affected_species')}>
Species
@@ -102,18 +119,9 @@ const DiseaseSplicerVirusDish = (props) => {
};
const DiseaseSplicerStorage = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const {
- dish_inserted,
- buffer,
- species_buffer,
- effects,
- info,
- growth,
- affected_species,
- busy,
- } = data;
+ const { buffer, species_buffer, info } = data;
return (
@@ -173,7 +181,7 @@ const DiseaseSplicerStorage = (props) => {
act('splice', { splice: 5 })}
>
Splice Species
diff --git a/tgui/packages/tgui/interfaces/DishIncubator.jsx b/tgui/packages/tgui/interfaces/DishIncubator.tsx
similarity index 91%
rename from tgui/packages/tgui/interfaces/DishIncubator.jsx
rename to tgui/packages/tgui/interfaces/DishIncubator.tsx
index 004de9c101..da30b0aaef 100644
--- a/tgui/packages/tgui/interfaces/DishIncubator.jsx
+++ b/tgui/packages/tgui/interfaces/DishIncubator.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -10,8 +12,26 @@ import {
import { formatCommaNumber } from '../format';
import { Window } from '../layouts';
+type Data = {
+ chemicals_inserted: BooleanLike;
+ dish_inserted: BooleanLike;
+ food_supply: number;
+ radiation: number;
+ toxins: number;
+ on: BooleanLike;
+ system_in_use: BooleanLike;
+ chemical_volume: number;
+ max_chemical_volume: number;
+ virus: string | null;
+ growth: number;
+ infection_rate: number;
+ analysed: BooleanLike;
+ can_breed_virus: BooleanLike;
+ blood_already_infected: string | null;
+};
+
export const DishIncubator = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
on,
diff --git a/tgui/packages/tgui/interfaces/DroneConsole.jsx b/tgui/packages/tgui/interfaces/DroneConsole.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/DroneConsole.jsx
rename to tgui/packages/tgui/interfaces/DroneConsole.tsx
index ecc75c5e39..2670a9cf59 100644
--- a/tgui/packages/tgui/interfaces/DroneConsole.jsx
+++ b/tgui/packages/tgui/interfaces/DroneConsole.tsx
@@ -1,9 +1,26 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, Dropdown, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ drones: {
+ name: string;
+ active: BooleanLike;
+ charge: number;
+ maxCharge: number;
+ loc: string;
+ ref: string;
+ }[];
+ fabricator: string;
+ fabPower: BooleanLike;
+ areas: string[];
+ selected_area: string;
+};
+
export const DroneConsole = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { drones, areas, selected_area, fabricator, fabPower } = data;
@@ -36,7 +53,7 @@ export const DroneConsole = (props) => {
act('set_dcall_area', { area: val })}
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController.jsx b/tgui/packages/tgui/interfaces/EmbeddedController.jsx
deleted file mode 100644
index 8c52e3514e..0000000000
--- a/tgui/packages/tgui/interfaces/EmbeddedController.jsx
+++ /dev/null
@@ -1,757 +0,0 @@
-import { useBackend } from '../backend';
-import {
- Box,
- Button,
- Flex,
- Icon,
- LabeledList,
- ProgressBar,
- Section,
-} from '../components';
-import { Window } from '../layouts';
-import { createLogger } from '../logging';
-const logger = createLogger('fuck');
-
-// This UI uses an internal routing system for the many different variants of
-// embedded controllers in use.
-let primaryRoutes = {};
-
-/**
- * This is an all-in-one replacement for the following NanoUI Templates:
- * - advanced_airlock_console.tmpl
- * - docking_airlock_console.tmpl
- * - door_access_console.tmpl
- * - escape_pod_console.tmpl
- * - escape_pod_berth_console.tmpl
- * - multi_docking_console.tmpl
- * - phoron_airlock_console.tmpl
- * - simple_airlock_console.tmpl
- * - simple_docking_console.tmpl
- * - simple_docking_console_pod.tmpl -- Funny enough, wasn't used anywhere.
- */
-
-/**
- * Let's cover all of the attributes of `data` for this UI right here.
- * For those unfamiliar with JSDoc syntax, [param] indicates
- * an optional parameter.
- */
-
-/**
- * Interior/Exterior Door Status
- * @typedef {Object} doorStatus
- * @property {('open'|'closed')} state
- * @property {('locked'|'unlocked')} lock
- */
-
-/**
- * Dock Status
- * @typedef {('undocked'|'undocking'|'docking'|'docked')} dockStatus
- */
-
-/**
- * All possible data attributes.
- * @typedef {Object} Data
- * @property {string} internalTemplateName - to use.
- * @property {number} chamber_pressure - The current pressure of the airlock.
- * @property {boolean} processing - Whether or not the airlock is currently
- * cycling.
- * @property {number} [external_pressure] - Pressure on the "external" side.
- * @property {number} [internal_pressure] - Pressure on the "internal" side.
- * @property {boolean} [purge] - Airlock currently purging?
- * @property {boolean} [secure] - Airlock doors locked?
- * @property {doorStatus} [exterior_status] - Describes the status of the
- * exterior-side door.
- * @property {doorStatus} [interior_status] - Describes the status of the
- * interior-side door.
- *
- * @property {dockStatus} [docking_status] - Used exclusivly for "Docking" type
- * controllers, describes the state of the dock.
- * @property {boolean} [airlock_disabled] - Airlock disabled?
- * @property {boolean} [override_enabled] - Forces the shuttle to undock.
- * @property {string} [docking_codes] - The secret codes to dock a shuttle here
- * @property {string} [name] - Name of the dock.
- */
-
-/**
- * Entrypoint of the UI. This handles finding the correct route to use.
- */
-export const EmbeddedController = (props) => {
- const { act, data } = useBackend();
- const { internalTemplateName } = data;
-
- const Component = primaryRoutes[internalTemplateName];
- if (!Component) {
- throw Error(
- 'Unable to find Component for template name: ' + internalTemplateName,
- );
- }
-
- return (
-
-
-
-
-
- );
-};
-
-/** ***************************************************************************\
-* HELPER COMPONENTS *
-\******************************************************************************/
-
-/**
- * @typedef {Object} BarProp
- * @property {number} minValue - Minimum value of the bar.
- * @property {number} maxValue - Maximum value of the bar.
- * @property {number} value - Current value between min/max.
- * @property {string} label - Label next to the bar.
- * @property {string} textValue - Value in text.
- */
-
-/**
- * @typedef {Object} StatusDisplayProps
- * @property {array[BarProp]} bars - The bars to display.
- */
-
-/**
- * Used for the upper status display that is used on 90% of these UIs.
- * @param {StatusDisplayProps} props
- */
-const StatusDisplay = (props) => {
- const { bars } = props;
-
- return (
-
-
- {bars.map((bar) => (
-
-
- {bar.textValue}
-
-
- ))}
-
-
- );
-};
-
-/**
- * This is just a quick helper for most airlock controllers. They usually all
- * have the "Cycle out, cycle in, force out, force in" buttons, so we just have
- * a single component that adjusts for the mild data structure differences
- * on it's own.
- */
-const StandardControls = (props) => {
- const { data, act } = useBackend();
-
- let externalForceSafe = true;
- if (data['interior_status'] && data.interior_status.state === 'open') {
- externalForceSafe = false;
- } else if (data['external_pressure'] && data['chamber_pressure']) {
- externalForceSafe = !(
- Math.abs(data['external_pressure'] - data['chamber_pressure']) > 5
- );
- }
-
- let internalForceSafe = true;
- if (data['exterior_status'] && data.exterior_status.state === 'open') {
- internalForceSafe = false;
- } else if (data['internal_pressure'] && data['chamber_pressure']) {
- internalForceSafe = !(
- Math.abs(data['internal_pressure'] - data['chamber_pressure']) > 5
- );
- }
-
- return (
- <>
-
- act('cycle_ext')}
- >
- Cycle to Exterior
-
- act('cycle_int')}
- >
- Cycle to Interior
-
-
-
- act('force_ext')}
- >
- Force Exterior Door
-
- act('force_int')}
- >
- Force Interior Door
-
-
- >
- );
-};
-
-/**
- * This is a shared component between the EscapePodConsole
- * and the EscapePodBerthConsole. They previously had different data structures
- * but I got rid of that stupid shit.
- */
-const EscapePodStatus = (props) => {
- const { data, act } = useBackend();
-
- const statusToHtml = {
- docked: ,
- undocking: EJECTING-STAND CLEAR! ,
- undocked: POD EJECTED ,
- docking: INITIALIZING... ,
- };
-
- let dockHatch = ERROR ;
-
- if (data.exterior_status.state === 'open') {
- dockHatch = OPEN ;
- } else if (data.exterior_status.lock === 'unlocked') {
- dockHatch = UNSECURED ;
- } else if (data.exterior_status.lock === 'locked') {
- dockHatch = SECURED ;
- }
-
- return (
-
-
-
- {statusToHtml[data.docking_status]}
-
- {dockHatch}
-
-
- );
-};
-
-/**
- * Sub-subcomponent for escape pods.
- * Just shows "ARMED" or "SYSTEMS OK" depending on armed status.
- * Keeps me from having to write like, two lines of code.
- */
-const Armed = (props) => {
- const { data, act } = useBackend();
- return data.armed ? (
- ARMED
- ) : (
- SYSTEMS OK
- );
-};
-
-/**
- * Shared controls between the berth and the pod itself.
- * Basically just external door control.
- */
-const EscapePodControls = (props) => {
- const { data, act } = useBackend();
-
- return (
-
- act('force_door')}
- >
- Force Exterior Door
-
- act('toggle_override')}
- >
- Override
-
-
- );
-};
-
-/**
- * Just a neat little helper for all the different states of dock.
- */
-const DockStatus = (props) => {
- const { data, act } = useBackend();
-
- const statusToHtml = {
- docked: DOCKED ,
- docking: DOCKING ,
- undocking: UNDOCKING ,
- undocked: NOT IN USE ,
- };
-
- let dockStatus = statusToHtml[data.docking_status];
-
- if (data.override_enabled) {
- dockStatus = (
-
- {data.docking_status.toUpperCase()}-OVERRIDE ENABLED
-
- );
- }
-
- return dockStatus;
-};
-
-/** ***************************************************************************\
-* ROUTES *
-\******************************************************************************/
-
-/**
- * Advanced airlock consoles display the external pressure,
- * the internal pressure, and the chamber pressure separately.
- * They also have a PURGE and SECURE option for safety.
- * Replaces advanced_airlock_console.tmpl
- */
-const AirlockConsoleAdvanced = (props) => {
- const { act, data } = useBackend();
-
- const color = (value) => {
- return value < 80 || value > 120
- ? 'bad'
- : value < 95 || value > 110
- ? 'average'
- : 'good';
- };
-
- const bars = [
- {
- minValue: 0,
- maxValue: 202,
- value: data.external_pressure,
- label: 'External Pressure',
- textValue: data.external_pressure + ' kPa',
- color: color,
- },
- {
- minValue: 0,
- maxValue: 202,
- value: data.chamber_pressure,
- label: 'Chamber Pressure',
- textValue: data.chamber_pressure + ' kPa',
- color: color,
- },
- {
- minValue: 0,
- maxValue: 202,
- value: data.internal_pressure,
- label: 'Internal Pressure',
- textValue: data.internal_pressure + ' kPa',
- color: color,
- },
- ];
-
- return (
- <>
-
-
-
-
- act('purge')}>
- Purge
-
- act('secure')}>
- Secure
-
-
-
- act('abort')}
- >
- Abort
-
-
-
- >
- );
-};
-primaryRoutes['AirlockConsoleAdvanced'] = AirlockConsoleAdvanced;
-
-/**
- * Simple airlock consoles are the least complicated airlock controller.
- * They show the current chamber pressure, two cycle buttons, and two
- * force door buttons. That's it.
- * Replaces simple_airlock_console.tmpl
- */
-const AirlockConsoleSimple = (props) => {
- const { act, data } = useBackend();
-
- const bars = [
- {
- minValue: 0,
- maxValue: 202,
- value: data.chamber_pressure,
- label: 'Chamber Pressure',
- textValue: data.chamber_pressure + ' kPa',
- color: (value) => {
- return value < 80 || value > 120
- ? 'bad'
- : value < 95 || value > 110
- ? 'average'
- : 'good';
- },
- },
- ];
-
- return (
- <>
-
-
-
-
- act('abort')}
- >
- Abort
-
-
-
- >
- );
-};
-primaryRoutes['AirlockConsoleSimple'] = AirlockConsoleSimple;
-
-/**
- * Phoron airlock consoles don't actually cycle *pressure*, they cycle
- * phoron, for use on transitioning to the outside environment of a phoron
- * atmosphere planet.
- * Replaces phoron_airlock_console.tmpl
- */
-const AirlockConsolePhoron = (props) => {
- const { act, data } = useBackend();
-
- const bars = [
- {
- minValue: 0,
- maxValue: 202,
- value: data.chamber_pressure,
- label: 'Chamber Pressure',
- textValue: data.chamber_pressure + ' kPa',
- color: (value) => {
- return value < 80 || value > 120
- ? 'bad'
- : value < 95 || value > 110
- ? 'average'
- : 'good';
- },
- },
- {
- minValue: 0,
- maxValue: 100,
- value: data.chamber_phoron,
- label: 'Chamber Phoron',
- textValue: data.chamber_phoron + ' mol',
- color: (value) => {
- return value > 5 ? 'bad' : value > 0.5 ? 'average' : 'good';
- },
- },
- ];
-
- return (
- <>
-
-
-
-
- act('abort')}
- >
- Abort
-
-
-
- >
- );
-};
-primaryRoutes['AirlockConsolePhoron'] = AirlockConsolePhoron;
-
-/**
- * This is a mix airlock & docking console. It lets you control the dock status
- * as well as the attached airlock.
- * Replaces docking_airlock_console.tmpl
- */
-const AirlockConsoleDocking = (props) => {
- const { act, data } = useBackend();
-
- const bars = [
- {
- minValue: 0,
- maxValue: 202,
- value: data.chamber_pressure,
- label: 'Chamber Pressure',
- textValue: data.chamber_pressure + ' kPa',
- color: (value) => {
- return value < 80 || value > 120
- ? 'bad'
- : value < 95 || value > 110
- ? 'average'
- : 'good';
- },
- },
- ];
-
- return (
- <>
- act('toggle_override')}
- >
- Override
-
- ) : null
- }
- >
-
-
-
-
-
-
- act('abort')}
- >
- Abort
-
-
-
- >
- );
-};
-primaryRoutes['AirlockConsoleDocking'] = AirlockConsoleDocking;
-
-/**
- * Simple docking consoles do not allow you to cycle the airlock. They can
- * force the doors in an emergency, but there is no facility for cycling.
- * They're primarily just there to display the status of the dock.
- * Replaces simple_docking_console.tmpl
- */
-const DockingConsoleSimple = (props) => {
- const { act, data } = useBackend();
-
- let dockHatch = ERROR ;
-
- if (data.exterior_status.state === 'open') {
- dockHatch = OPEN ;
- } else if (data.exterior_status.lock === 'unlocked') {
- dockHatch = UNSECURED ;
- } else if (data.exterior_status.lock === 'locked') {
- dockHatch = SECURED ;
- }
-
- return (
-
- act('force_door')}
- >
- Force exterior door
-
- act('toggle_override')}
- >
- Override
-
- >
- }
- >
-
-
-
-
- {dockHatch}
-
-
- );
-};
-primaryRoutes['DockingConsoleSimple'] = DockingConsoleSimple;
-
-/**
- * Shockingly, the multi docking console is the simplest docking console.
- * It has no functionality except to display the status of multiple airlocks,
- * for bigger shuttles.
- * Replaces multi_docking_console.tmpl
- */
-const DockingConsoleMulti = (props) => {
- const { data } = useBackend();
- return (
- <>
-
-
- {data.airlocks.length ? (
-
- {data.airlocks.map((airlock) => (
-
- {airlock.override_enabled ? 'OVERRIDE ENABLED' : 'STATUS OK'}
-
- ))}
-
- ) : (
-
-
-
-
- No airlocks found.
-
-
- )}
-
- >
- );
-};
-primaryRoutes['DockingConsoleMulti'] = DockingConsoleMulti;
-
-/**
- * Airlock but without anything other than doors. Separates clean rooms.
- * Replaces door_access_console.tmpl
- */
-const DoorAccessConsole = (props) => {
- const { act, data } = useBackend();
-
- let interiorOpen =
- data.interior_status.state === 'open' ||
- data.exterior_status.state === 'closed';
- let exteriorOpen =
- data.exterior_status.state === 'open' ||
- data.interior_status.state === 'closed';
-
- return (
-
- {/* Interior Button */}
- {
- act(interiorOpen ? 'cycle_ext_door' : 'force_ext');
- }}
- >
- {interiorOpen ? 'Cycle To Exterior' : 'Lock Exterior Door'}
-
- {/* Exterior Button */}
- {
- act(exteriorOpen ? 'cycle_int_door' : 'force_int');
- }}
- >
- {exteriorOpen ? 'Cycle To Interior' : 'Lock Interior Door'}
-
- >
- }
- >
-
-
- {data.exterior_status.state === 'closed' ? 'Locked' : 'Open'}
-
-
- {data.interior_status.state === 'closed' ? 'Locked' : 'Open'}
-
-
-
- );
-};
-primaryRoutes['DoorAccessConsole'] = DoorAccessConsole;
-
-/**
- * These are the least airlock-like UIs here, but they're "close enough".
- * Replaces escape_pod_console.tmpl
- */
-const EscapePodConsole = (props) => {
- const { act, data } = useBackend();
- return (
- <>
-
-
-
-
- act('manual_arm')}
- >
- ARM
-
- act('force_launch')}
- >
- MANUAL EJECT
-
-
-
- >
- );
-};
-primaryRoutes['EscapePodConsole'] = EscapePodConsole;
-
-/**
- * These are the least airlock-like UIs here, but they're "close enough".
- * Replaces escape_pod_berth_console.tmpl
- */
-const EscapePodBerthConsole = (props) => {
- const { data } = useBackend();
- return (
- <>
-
-
- >
- );
-};
-primaryRoutes['EscapePodBerthConsole'] = EscapePodBerthConsole;
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx
new file mode 100644
index 0000000000..0977fc9d54
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleAdvanced.tsx
@@ -0,0 +1,85 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { StandardControls, StatusDisplay } from './EmbeddedControllerHelpers';
+import { AirlockConsoleAdvancedData } from './types';
+
+/**
+ * Advanced airlock consoles display the external pressure,
+ * the internal pressure, and the chamber pressure separately.
+ * They also have a PURGE and SECURE option for safety.
+ * Replaces advanced_airlock_console.tmpl
+ */
+export const AirlockConsoleAdvanced = (props) => {
+ const { act, data } = useBackend();
+
+ const { external_pressure, chamber_pressure, internal_pressure, processing } =
+ data;
+
+ const pressure_range = {
+ external_pressure,
+ internal_pressure,
+ chamber_pressure,
+ };
+
+ function color(value: number): string {
+ return value < 80 || value > 120
+ ? 'bad'
+ : value < 95 || value > 110
+ ? 'average'
+ : 'good';
+ }
+
+ const bars = [
+ {
+ minValue: 0,
+ maxValue: 202,
+ value: external_pressure,
+ label: 'External Pressure',
+ textValue: external_pressure + ' kPa',
+ color: color,
+ },
+ {
+ minValue: 0,
+ maxValue: 202,
+ value: chamber_pressure,
+ label: 'Chamber Pressure',
+ textValue: chamber_pressure + ' kPa',
+ color: color,
+ },
+ {
+ minValue: 0,
+ maxValue: 202,
+ value: internal_pressure,
+ label: 'Internal Pressure',
+ textValue: internal_pressure + ' kPa',
+ color: color,
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+ act('purge')}>
+ Purge
+
+ act('secure')}>
+ Secure
+
+
+
+ act('abort')}
+ >
+ Abort
+
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleDocking.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleDocking.tsx
new file mode 100644
index 0000000000..b17d1f08d5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleDocking.tsx
@@ -0,0 +1,84 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import {
+ DockStatus,
+ StandardControls,
+ StatusDisplay,
+} from './EmbeddedControllerHelpers';
+import { AirlockConsoleDockingData } from './types';
+
+/**
+ * This is a mix airlock & docking console. It lets you control the dock status
+ * as well as the attached airlock.
+ * Replaces docking_airlock_console.tmpl
+ */
+export const AirlockConsoleDocking = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ interior_status,
+ exterior_status,
+ chamber_pressure,
+ airlock_disabled,
+ override_enabled,
+ docking_status,
+ processing,
+ } = data;
+
+ const status_range = { interior_status, exterior_status };
+
+ const bars = [
+ {
+ minValue: 0,
+ maxValue: 202,
+ value: chamber_pressure,
+ label: 'Chamber Pressure',
+ textValue: chamber_pressure + ' kPa',
+ color: (value: number) => {
+ return value < 80 || value > 120
+ ? 'bad'
+ : value < 95 || value > 110
+ ? 'average'
+ : 'good';
+ },
+ },
+ ];
+
+ return (
+ <>
+ act('toggle_override')}
+ >
+ Override
+
+ ) : null
+ }
+ >
+
+
+
+
+
+
+ act('abort')}
+ >
+ Abort
+
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsolePhoron.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsolePhoron.tsx
new file mode 100644
index 0000000000..860f580583
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsolePhoron.tsx
@@ -0,0 +1,70 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { StandardControls, StatusDisplay } from './EmbeddedControllerHelpers';
+import { AirlockConsolePhoronData } from './types';
+
+/**
+ * Phoron airlock consoles don't actually cycle *pressure*, they cycle
+ * phoron, for use on transitioning to the outside environment of a phoron
+ * atmosphere planet.
+ * Replaces phoron_airlock_console.tmpl
+ */
+export const AirlockConsolePhoron = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ chamber_pressure,
+ chamber_phoron,
+ interior_status,
+ exterior_status,
+ processing,
+ } = data;
+
+ const status_range = { interior_status, exterior_status };
+
+ const bars = [
+ {
+ minValue: 0,
+ maxValue: 202,
+ value: chamber_pressure,
+ label: 'Chamber Pressure',
+ textValue: chamber_pressure + ' kPa',
+ color: (value: number) => {
+ return value < 80 || value > 120
+ ? 'bad'
+ : value < 95 || value > 110
+ ? 'average'
+ : 'good';
+ },
+ },
+ {
+ minValue: 0,
+ maxValue: 100,
+ value: chamber_phoron,
+ label: 'Chamber Phoron',
+ textValue: chamber_phoron + ' mol',
+ color: (value: number) => {
+ return value > 5 ? 'bad' : value > 0.5 ? 'average' : 'good';
+ },
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+ act('abort')}
+ >
+ Abort
+
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx
new file mode 100644
index 0000000000..bed9c73472
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/AirlockConsoleSimple.tsx
@@ -0,0 +1,55 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import { StandardControls, StatusDisplay } from './EmbeddedControllerHelpers';
+import { AirlockConsoleSimpleData } from './types';
+
+/**
+ * Simple airlock consoles are the least complicated airlock controller.
+ * They show the current chamber pressure, two cycle buttons, and two
+ * force door buttons. That's it.
+ * Replaces simple_airlock_console.tmpl
+ */
+export const AirlockConsoleSimple = (props) => {
+ const { act, data } = useBackend();
+
+ const { exterior_status, chamber_pressure, processing, interior_status } =
+ data;
+
+ const status_range = { interior_status, exterior_status };
+
+ const bars = [
+ {
+ minValue: 0,
+ maxValue: 202,
+ value: chamber_pressure,
+ label: 'Chamber Pressure',
+ textValue: chamber_pressure + ' kPa',
+ color: (value: number) => {
+ return value < 80 || value > 120
+ ? 'bad'
+ : value < 95 || value > 110
+ ? 'average'
+ : 'good';
+ },
+ },
+ ];
+
+ return (
+ <>
+
+
+
+
+ act('abort')}
+ >
+ Abort
+
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/DockingConsoleMulti.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/DockingConsoleMulti.tsx
new file mode 100644
index 0000000000..5f13b3c036
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/DockingConsoleMulti.tsx
@@ -0,0 +1,47 @@
+import { useBackend } from '../../backend';
+import { Flex, Icon, LabeledList, Section } from '../../components';
+import { DockStatus } from './EmbeddedControllerHelpers';
+import { DockingConsoleMultiData } from './types';
+
+/**
+ * Shockingly, the multi docking console is the simplest docking console.
+ * It has no functionality except to display the status of multiple airlocks,
+ * for bigger shuttles.
+ * Replaces multi_docking_console.tmpl
+ */
+export const DockingConsoleMulti = (props) => {
+ const { data } = useBackend();
+
+ const { docking_status } = data;
+
+ return (
+ <>
+
+
+ {data.airlocks.length ? (
+
+ {data.airlocks.map((airlock) => (
+
+ {airlock.override_enabled ? 'OVERRIDE ENABLED' : 'STATUS OK'}
+
+ ))}
+
+ ) : (
+
+
+
+
+ No airlocks found.
+
+
+ )}
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/DockingConsoleSimple.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/DockingConsoleSimple.tsx
new file mode 100644
index 0000000000..5358fc49ce
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/DockingConsoleSimple.tsx
@@ -0,0 +1,50 @@
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section } from '../../components';
+import { DockingStatus, DockStatus } from './EmbeddedControllerHelpers';
+import { DockingConsoleSimpleData } from './types';
+
+/**
+ * Simple docking consoles do not allow you to cycle the airlock. They can
+ * force the doors in an emergency, but there is no facility for cycling.
+ * They're primarily just there to display the status of the dock.
+ * Replaces simple_docking_console.tmpl
+ */
+export const DockingConsoleSimple = (props) => {
+ const { act, data } = useBackend();
+
+ const { exterior_status, override_enabled, docking_status } = data;
+
+ return (
+
+ act('force_door')}
+ >
+ Force exterior door
+
+ act('toggle_override')}
+ >
+ Override
+
+ >
+ }
+ >
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx
new file mode 100644
index 0000000000..9de6aa36c5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/DoorAccessConsole.tsx
@@ -0,0 +1,55 @@
+import { useBackend } from '../../backend';
+import { Button, LabeledList, Section } from '../../components';
+import { DoorAccessConsoleData } from './types';
+
+/**
+ * Airlock but without anything other than doors. Separates clean rooms.
+ * Replaces door_access_console.tmpl
+ */
+export const DoorAccessConsole = (props) => {
+ const { act, data } = useBackend();
+
+ const { interior_status, exterior_status } = data;
+
+ const interiorOpen =
+ interior_status.state === 'open' || exterior_status.state === 'closed';
+ const exteriorOpen =
+ exterior_status.state === 'open' || interior_status.state === 'closed';
+
+ return (
+
+ {/* Interior Button */}
+ {
+ act(interiorOpen ? 'cycle_ext_door' : 'force_ext');
+ }}
+ >
+ {interiorOpen ? 'Cycle To Exterior' : 'Lock Exterior Door'}
+
+ {/* Exterior Button */}
+ {
+ act(exteriorOpen ? 'cycle_int_door' : 'force_int');
+ }}
+ >
+ {exteriorOpen ? 'Cycle To Interior' : 'Lock Interior Door'}
+
+ >
+ }
+ >
+
+
+ {exterior_status.state === 'closed' ? 'Locked' : 'Open'}
+
+
+ {interior_status.state === 'closed' ? 'Locked' : 'Open'}
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/EmbeddedControllerHelpers.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/EmbeddedControllerHelpers.tsx
new file mode 100644
index 0000000000..cd5f7fb674
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/EmbeddedControllerHelpers.tsx
@@ -0,0 +1,284 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ LabeledList,
+ ProgressBar,
+ Section,
+} from '../../components';
+import { status } from './types';
+
+/** ***************************************************************************\
+* HELPER COMPONENTS *
+\******************************************************************************/
+
+/**
+ * @typedef {Object} BarProp
+ * @property {number} minValue - Minimum value of the bar.
+ * @property {number} maxValue - Maximum value of the bar.
+ * @property {number} value - Current value between min/max.
+ * @property {string} label - Label next to the bar.
+ * @property {string} textValue - Value in text.
+ */
+
+/**
+ * @typedef {Object} StatusDisplayProps
+ * @property {array[BarProp]} bars - The bars to display.
+ */
+
+/**
+ * Used for the upper status display that is used on 90% of these UIs.
+ * @param {StatusDisplayProps} props
+ */
+export const StatusDisplay = (props: {
+ bars: {
+ minValue: number;
+ maxValue: number;
+ value: number;
+ label: string;
+ textValue: string;
+ color: (value: number) => string;
+ }[];
+}) => {
+ const { bars } = props;
+
+ return (
+
+
+ {bars.map((bar) => (
+
+
+ {bar.textValue}
+
+
+ ))}
+
+
+ );
+};
+
+/**
+ * This is just a quick helper for most airlock controllers. They usually all
+ * have the "Cycle out, cycle in, force out, force in" buttons, so we just have
+ * a single component that adjusts for the mild data structure differences
+ * on it's own.
+ */
+export const StandardControls = (props: {
+ status_range?:
+ | {
+ interior_status: status;
+ exterior_status: status;
+ }
+ | undefined;
+ pressure_range?:
+ | {
+ external_pressure: number;
+ internal_pressure: number;
+ chamber_pressure: number;
+ }
+ | undefined;
+ airlock_disabled?: BooleanLike;
+}) => {
+ const { act } = useBackend();
+
+ const { status_range, pressure_range, airlock_disabled } = props;
+
+ const { interior_status, exterior_status } =
+ status_range ||
+ ({} as {
+ interior_status: status;
+ exterior_status: status;
+ });
+
+ const { external_pressure, internal_pressure, chamber_pressure } =
+ pressure_range ||
+ ({} as {
+ external_pressure: number;
+ internal_pressure: number;
+ chamber_pressure: number;
+ });
+
+ let externalForceSafe = true;
+ if (interior_status && interior_status.state === 'open') {
+ externalForceSafe = false;
+ } else if (external_pressure && chamber_pressure) {
+ externalForceSafe = !(Math.abs(external_pressure - chamber_pressure) > 5);
+ }
+
+ let internalForceSafe = true;
+ if (exterior_status && exterior_status.state === 'open') {
+ internalForceSafe = false;
+ } else if (internal_pressure && chamber_pressure) {
+ internalForceSafe = !(Math.abs(internal_pressure - chamber_pressure) > 5);
+ }
+
+ return (
+ <>
+
+ act('cycle_ext')}
+ >
+ Cycle to Exterior
+
+ act('cycle_int')}
+ >
+ Cycle to Interior
+
+
+
+ act('force_ext')}
+ >
+ Force Exterior Door
+
+ act('force_int')}
+ >
+ Force Interior Door
+
+
+ >
+ );
+};
+
+/**
+ * This is a shared component between the EscapePodConsole
+ * and the EscapePodBerthConsole. They previously had different data structures
+ * but I got rid of that stupid shit.
+ */
+export const EscapePodStatus = (props: {
+ exterior_status: status;
+ docking_status: string;
+ armed: BooleanLike;
+}) => {
+ const { exterior_status, docking_status, armed } = props;
+
+ const statusToHtml = {
+ docked: ,
+ undocking: EJECTING-STAND CLEAR! ,
+ undocked: POD EJECTED ,
+ docking: INITIALIZING... ,
+ };
+
+ return (
+
+
+
+ {statusToHtml[docking_status]}
+
+
+
+
+ );
+};
+
+export const DockingStatus = (props: { state: string }) => {
+ const { state } = props;
+
+ const dockHatch: React.JSX.Element[] = [];
+
+ dockHatch['open'] = OPEN ;
+ dockHatch['unlocked'] = UNSECURED ;
+ dockHatch['locked'] = SECURED ;
+ return (
+
+ {dockHatch[state] || ERROR }
+
+ );
+};
+
+/**
+ * Sub-subcomponent for escape pods.
+ * Just shows "ARMED" or "SYSTEMS OK" depending on armed status.
+ * Keeps me from having to write like, two lines of code.
+ */
+const Armed = (props: { armed: BooleanLike }) => {
+ const { armed } = props;
+
+ return armed ? (
+ ARMED
+ ) : (
+ SYSTEMS OK
+ );
+};
+
+/**
+ * Shared controls between the berth and the pod itself.
+ * Basically just external door control.
+ */
+export const EscapePodControls = (props: {
+ docking_status: string;
+ override_enabled: BooleanLike;
+}) => {
+ const { act } = useBackend();
+
+ const { docking_status, override_enabled } = props;
+
+ return (
+
+ act('force_door')}
+ >
+ Force Exterior Door
+
+ act('toggle_override')}
+ >
+ Override
+
+
+ );
+};
+
+/**
+ * Just a neat little helper for all the different states of dock.
+ */
+export const DockStatus = (props: {
+ docking_status: string;
+ override_enabled: BooleanLike;
+}) => {
+ const { docking_status, override_enabled } = props;
+
+ const statusToHtml = {
+ docked: DOCKED ,
+ docking: DOCKING ,
+ undocking: UNDOCKING ,
+ undocked: NOT IN USE ,
+ };
+
+ let dockStatus = statusToHtml[docking_status];
+
+ if (override_enabled) {
+ dockStatus = (
+ {docking_status.toUpperCase()}-OVERRIDE ENABLED
+ );
+ }
+
+ return dockStatus;
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/EscapePodBerthConsole.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/EscapePodBerthConsole.tsx
new file mode 100644
index 0000000000..729c886f9e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/EscapePodBerthConsole.tsx
@@ -0,0 +1,33 @@
+import { useBackend } from '../../backend';
+import { Section } from '../../components';
+import {
+ EscapePodControls,
+ EscapePodStatus,
+} from './EmbeddedControllerHelpers';
+import { EscapePodBerthConsoleData } from './types';
+
+/**
+ * These are the least airlock-like UIs here, but they're "close enough".
+ * Replaces escape_pod_berth_console.tmpl
+ */
+export const EscapePodBerthConsole = (props) => {
+ const { data } = useBackend();
+
+ const { exterior_status, docking_status, armed, override_enabled } = data;
+
+ return (
+ <>
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/EscapePodConsole.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/EscapePodConsole.tsx
new file mode 100644
index 0000000000..547542b8b1
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/EscapePodConsole.tsx
@@ -0,0 +1,57 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section } from '../../components';
+import {
+ EscapePodControls,
+ EscapePodStatus,
+} from './EmbeddedControllerHelpers';
+import { EscapePodConsoleData } from './types';
+
+/**
+ * These are the least airlock-like UIs here, but they're "close enough".
+ * Replaces escape_pod_console.tmpl
+ */
+export const EscapePodConsole = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ exterior_status,
+ docking_status,
+ override_enabled,
+ armed,
+ can_force,
+ } = data;
+
+ return (
+ <>
+
+
+
+
+ act('manual_arm')}
+ >
+ ARM
+
+ act('force_launch')}
+ >
+ MANUAL EJECT
+
+
+
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx b/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx
new file mode 100644
index 0000000000..eb4504e351
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/index.tsx
@@ -0,0 +1,105 @@
+import { useBackend } from '../../backend';
+import { Window } from '../../layouts';
+import { AirlockConsoleAdvanced } from './AirlockConsoleAdvanced';
+import { AirlockConsoleDocking } from './AirlockConsoleDocking';
+import { AirlockConsolePhoron } from './AirlockConsolePhoron';
+import { AirlockConsoleSimple } from './AirlockConsoleSimple';
+import { DockingConsoleMulti } from './DockingConsoleMulti';
+import { DockingConsoleSimple } from './DockingConsoleSimple';
+import { DoorAccessConsole } from './DoorAccessConsole';
+import { EscapePodBerthConsole } from './EscapePodBerthConsole';
+import { EscapePodConsole } from './EscapePodConsole';
+import { Data } from './types';
+
+/**
+ * This is an all-in-one replacement for the following NanoUI Templates:
+ * - advanced_airlock_console.tmpl
+ * - docking_airlock_console.tmpl
+ * - door_access_console.tmpl
+ * - escape_pod_console.tmpl
+ * - escape_pod_berth_console.tmpl
+ * - multi_docking_console.tmpl
+ * - phoron_airlock_console.tmpl
+ * - simple_airlock_console.tmpl
+ * - simple_docking_console.tmpl
+ * - simple_docking_console_pod.tmpl -- Funny enough, wasn't used anywhere.
+ */
+
+/**
+ * Let's cover all of the attributes of `data` for this UI right here.
+ * For those unfamiliar with JSDoc syntax, [param] indicates
+ * an optional parameter.
+ */
+
+/**
+ * Interior/Exterior Door Status
+ * @typedef {Object} doorStatus
+ * @property {('open'|'closed')} state
+ * @property {('locked'|'unlocked')} lock
+ */
+
+/**
+ * Dock Status
+ * @typedef {('undocked'|'undocking'|'docking'|'docked')} dockStatus
+ */
+
+/**
+ * All possible data attributes.
+ * @typedef {Object} Data
+ * @property {string} internalTemplateName - to use.
+ * @property {number} chamber_pressure - The current pressure of the airlock.
+ * @property {boolean} processing - Whether or not the airlock is currently
+ * cycling.
+ * @property {number} [external_pressure] - Pressure on the "external" side.
+ * @property {number} [internal_pressure] - Pressure on the "internal" side.
+ * @property {boolean} [purge] - Airlock currently purging?
+ * @property {boolean} [secure] - Airlock doors locked?
+ * @property {doorStatus} [exterior_status] - Describes the status of the
+ * exterior-side door.
+ * @property {doorStatus} [interior_status] - Describes the status of the
+ * interior-side door.
+ *
+ * @property {dockStatus} [docking_status] - Used exclusivly for "Docking" type
+ * controllers, describes the state of the dock.
+ * @property {boolean} [airlock_disabled] - Airlock disabled?
+ * @property {boolean} [override_enabled] - Forces the shuttle to undock.
+ * @property {string} [docking_codes] - The secret codes to dock a shuttle here
+ * @property {string} [name] - Name of the dock.
+ */
+
+/**
+ * Entrypoint of the UI. This handles finding the correct route to use.
+ */
+export const EmbeddedController = (props) => {
+ const { data } = useBackend();
+ const { internalTemplateName } = data;
+
+ /** ***************************************************************************\
+ * ROUTES *
+ \******************************************************************************/
+
+ const primaryRoutes: Record = {};
+
+ primaryRoutes['AirlockConsoleAdvanced'] = ;
+ primaryRoutes['AirlockConsoleSimple'] = ;
+ primaryRoutes['AirlockConsolePhoron'] = ;
+ primaryRoutes['AirlockConsoleDocking'] = ;
+ primaryRoutes['DockingConsoleSimple'] = ;
+ primaryRoutes['DockingConsoleMulti'] = ;
+ primaryRoutes['DoorAccessConsole'] = ;
+ primaryRoutes['EscapePodConsole'] = ;
+ primaryRoutes['EscapePodBerthConsole'] = ;
+
+ const Component: React.JSX.Element = primaryRoutes[internalTemplateName];
+ if (!Component) {
+ throw Error(
+ 'Unable to find Component for template name: ' + internalTemplateName,
+ );
+ }
+
+ return (
+
+ {Component}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/EmbeddedController/types.ts b/tgui/packages/tgui/interfaces/EmbeddedController/types.ts
new file mode 100644
index 0000000000..d6b9c37487
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/EmbeddedController/types.ts
@@ -0,0 +1,82 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = { internalTemplateName: string };
+
+export type AirlockConsoleDockingData = {
+ chamber_pressure: number;
+ exterior_status: status;
+ interior_status: status;
+ processing: BooleanLike;
+ docking_status: string;
+ airlock_disabled: BooleanLike;
+ override_enabled: BooleanLike;
+ docking_codes?: string;
+ name?: string;
+ internalTemplateName: string;
+};
+
+export type DockingConsoleSimpleData = {
+ docking_status: string;
+ override_enabled: BooleanLike;
+ exterior_status: status;
+ internalTemplateName: string;
+};
+
+export type EscapePodBerthConsoleData = {
+ docking_status: string;
+ override_enabled: BooleanLike;
+ exterior_status: status;
+ armed: BooleanLike;
+ internalTemplateName: string;
+};
+
+export type DockingConsoleMultiData = {
+ docking_status: string;
+ airlocks: { name: string; override_enabled: BooleanLike }[];
+ internalTemplateName: string;
+};
+
+export type AirlockConsoleAdvancedData = {
+ chamber_pressure: number;
+ external_pressure: number;
+ internal_pressure: number;
+ processing: BooleanLike;
+ purge: BooleanLike;
+ secure: BooleanLike;
+ internalTemplateName: string;
+};
+
+export type AirlockConsoleSimpleData = {
+ chamber_pressure: number;
+ exterior_status: status;
+ interior_status: status;
+ processing: BooleanLike;
+ internalTemplateName: string;
+};
+
+export type AirlockConsolePhoronData = {
+ chamber_pressure: number;
+ chamber_phoron: number;
+ exterior_status: status;
+ interior_status: status;
+ processing: BooleanLike;
+ internalTemplateName: string;
+};
+
+export type DoorAccessConsoleData = {
+ exterior_status: status;
+ interior_status: status;
+ processing: BooleanLike;
+ internalTemplateName: string;
+};
+
+export type EscapePodConsoleData = {
+ docking_status: string;
+ override_enabled: BooleanLike;
+ exterior_status: status;
+ can_force: BooleanLike;
+ armed: BooleanLike;
+ internalTemplateName: string;
+};
+
+export type status = { state: string; lock: string };
diff --git a/tgui/packages/tgui/interfaces/Farmbot.jsx b/tgui/packages/tgui/interfaces/Farmbot.tsx
similarity index 87%
rename from tgui/packages/tgui/interfaces/Farmbot.jsx
rename to tgui/packages/tgui/interfaces/Farmbot.tsx
index e5a66ec96d..f61df96523 100644
--- a/tgui/packages/tgui/interfaces/Farmbot.jsx
+++ b/tgui/packages/tgui/interfaces/Farmbot.tsx
@@ -1,9 +1,25 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ tank: BooleanLike;
+ tankVolume: number;
+ tankMaxVolume: number;
+ locked: BooleanLike;
+ waters_trays: BooleanLike;
+ refills_water: BooleanLike;
+ uproots_weeds: BooleanLike;
+ replaces_nutriment: BooleanLike;
+ collects_produce: BooleanLike;
+ removes_dead: BooleanLike;
+};
+
export const Farmbot = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
on,
@@ -48,7 +64,7 @@ export const Farmbot = (props) => {
{(!locked && (
-
+
-
+
-
+
{/* VOREStation Edit: No automatic hydroponics with the lagbot */}
- {/*
+ {/*
{
- const { data } = useBackend();
+ const { data } = useBackend();
const { authenticated, copyItem } = data;
- let variableHeight = 340;
+ let variableHeight: number = 340;
if (copyItem) {
variableHeight = 358;
}
@@ -37,10 +52,9 @@ export const Fax = (props) => {
};
export const FaxContent = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const { bossName, copyItem, cooldown, destination, adminDepartments } = data;
- const staffRequestDepartment = new Set(adminDepartments);
+ const { bossName, copyItem, cooldown, destination } = data;
return (
@@ -86,7 +100,7 @@ export const FaxContent = (props) => {
};
const RemoveItem = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { copyItem } = data;
@@ -104,10 +118,10 @@ const RemoveItem = (props) => {
};
const AutomatedStaffRequest = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { adminDepartments, destination, copyItem } = data;
- const staffRequestDepartment = new Set(adminDepartments);
+ const staffRequestDepartment: Set = new Set(adminDepartments);
let flexiblePadding = '1rem';
if (copyItem) {
diff --git a/tgui/packages/tgui/interfaces/FileCabinet.jsx b/tgui/packages/tgui/interfaces/FileCabinet.tsx
similarity index 78%
rename from tgui/packages/tgui/interfaces/FileCabinet.jsx
rename to tgui/packages/tgui/interfaces/FileCabinet.tsx
index c799575b74..b8deaa03c5 100644
--- a/tgui/packages/tgui/interfaces/FileCabinet.jsx
+++ b/tgui/packages/tgui/interfaces/FileCabinet.tsx
@@ -4,13 +4,17 @@ import { useBackend } from '../backend';
import { Button, Section } from '../components';
import { Window } from '../layouts';
+type Data = { contents: content[] };
+
+type content = { name: string; ref: string };
+
export const FileCabinet = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { contents } = data;
// Wow, the filing cabinets sort themselves in 2320.
- const sortedContents = sortBy((val) => val.name)(contents || []);
+ const sortedContents = sortBy((val: content) => val.name)(contents || []);
return (
diff --git a/tgui/packages/tgui/interfaces/Floorbot.jsx b/tgui/packages/tgui/interfaces/Floorbot.tsx
similarity index 89%
rename from tgui/packages/tgui/interfaces/Floorbot.jsx
rename to tgui/packages/tgui/interfaces/Floorbot.tsx
index eac4979749..7326902fa4 100644
--- a/tgui/packages/tgui/interfaces/Floorbot.jsx
+++ b/tgui/packages/tgui/interfaces/Floorbot.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
@@ -8,8 +10,21 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ open: BooleanLike;
+ locked: BooleanLike;
+ vocal: BooleanLike;
+ amount: number;
+ possible_bmode: string[];
+ improvefloors: BooleanLike;
+ eattiles: BooleanLike;
+ maketiles: BooleanLike;
+ bmode: string | null;
+};
+
export const Floorbot = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
on,
@@ -96,8 +111,7 @@ export const Floorbot = (props) => {
act('bridgemode', { dir: val })}
/>
diff --git a/tgui/packages/tgui/interfaces/GasPump.jsx b/tgui/packages/tgui/interfaces/GasPump.tsx
similarity index 79%
rename from tgui/packages/tgui/interfaces/GasPump.jsx
rename to tgui/packages/tgui/interfaces/GasPump.tsx
index ab29ba9d21..7242932cea 100644
--- a/tgui/packages/tgui/interfaces/GasPump.jsx
+++ b/tgui/packages/tgui/interfaces/GasPump.tsx
@@ -1,3 +1,6 @@
+import { toFixed } from 'common/math';
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
@@ -9,8 +12,16 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ pressure_set: number;
+ last_flow_rate: number;
+ last_power_draw: number;
+ max_power_draw: number;
+};
+
export const GasPump = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { on, pressure_set, last_flow_rate, last_power_draw, max_power_draw } =
data;
@@ -21,7 +32,10 @@ export const GasPump = (props) => {
- L/s
+ toFixed(value, 1) + ' L/s'}
+ />
{
}
>
-
+
act('set_press', { press: 'min' })}
@@ -67,7 +81,7 @@ export const GasPump = (props) => {
- {pressure_set / 100} kPa
+ {toFixed(pressure_set / 100, 2)} kPa
diff --git a/tgui/packages/tgui/interfaces/GasTemperatureSystem.jsx b/tgui/packages/tgui/interfaces/GasTemperatureSystem.tsx
similarity index 83%
rename from tgui/packages/tgui/interfaces/GasTemperatureSystem.jsx
rename to tgui/packages/tgui/interfaces/GasTemperatureSystem.tsx
index 14ea4321d4..1291bfa1e1 100644
--- a/tgui/packages/tgui/interfaces/GasTemperatureSystem.jsx
+++ b/tgui/packages/tgui/interfaces/GasTemperatureSystem.tsx
@@ -1,4 +1,5 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
+import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import {
@@ -12,8 +13,19 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ gasPressure: number;
+ gasTemperature: number;
+ minGasTemperature: number;
+ maxGasTemperature: number;
+ targetGasTemperature: number;
+ powerSetting: number;
+ gasTemperatureClass: string;
+};
+
export const GasTemperatureSystem = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
on,
@@ -27,7 +39,7 @@ export const GasTemperatureSystem = (props) => {
} = data;
return (
-
+
{
maxValue={maxGasTemperature}
fillValue={gasTemperature}
value={targetGasTemperature}
- format={(value) => gasTemperature + ' / ' + round(value)}
+ format={(value) => gasTemperature + ' / ' + toFixed(value)}
unit="K"
color={gasTemperatureClass}
onChange={(e, val) => act('setGasTemperature', { temp: val })}
diff --git a/tgui/packages/tgui/interfaces/Gps.jsx b/tgui/packages/tgui/interfaces/Gps.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/Gps.jsx
rename to tgui/packages/tgui/interfaces/Gps.tsx
index ee734d8273..5730bee979 100644
--- a/tgui/packages/tgui/interfaces/Gps.jsx
+++ b/tgui/packages/tgui/interfaces/Gps.tsx
@@ -1,6 +1,9 @@
+// Currently not used!
+
import { map, sortBy } from 'common/collections';
import { flow } from 'common/fp';
import { clamp } from 'common/math';
+import { BooleanLike } from 'common/react';
import { vecLength, vecSubtract } from 'common/vector';
import { useBackend } from '../backend';
@@ -9,31 +12,44 @@ import { Window } from '../layouts';
const coordsToVec = (coords) => map(parseFloat)(coords.split(', '));
+type Data = {
+ currentArea: string;
+ power: BooleanLike;
+ tag: string;
+ updating: BooleanLike;
+ currentCoords: string; // "x, y, z"
+ globalmode: BooleanLike;
+ signals: signal[];
+};
+
+type signal = {
+ entrytag: string;
+ coords: string;
+ dist: number;
+ degrees: number;
+};
+
export const Gps = (props) => {
- const { act, data } = useBackend();
- const {
- currentArea,
- currentCoords,
- currentCoordsText,
- globalmode,
- power,
- tag,
- updating,
- } = data;
+ const { act, data } = useBackend();
+ const { currentArea, currentCoords, globalmode, power, tag, updating } = data;
const signals = flow([
- map((signal, index) => {
+ map((signal: signal, index) => {
// Calculate distance to the target. BYOND distance is capped to 127,
// that's why we roll our own calculations here.
const dist =
signal.dist &&
- Math.round(vecLength(vecSubtract(currentCoords, signal.coords)));
+ Math.round(
+ vecLength(
+ vecSubtract(coordsToVec(currentCoords), coordsToVec(signal.coords)),
+ ),
+ );
return { ...signal, dist, index };
}),
sortBy(
// Signals with distance metric go first
- (signal) => signal.dist === undefined,
+ (signal: signal) => signal.dist === undefined,
// Sort alphabetically
- (signal) => signal.entrytag,
+ (signal: signal) => signal.entrytag,
),
])(data.signals || []);
return (
@@ -81,7 +97,7 @@ export const Gps = (props) => {
<>
- {currentArea} ({currentCoordsText})
+ {currentArea} ({currentCoords})
@@ -116,7 +132,7 @@ export const Gps = (props) => {
)}
{signal.dist !== undefined && signal.dist + 'm'}
- {signal.coordsText}
+ {signal.coords}
))}
diff --git a/tgui/packages/tgui/interfaces/GravityGenerator.jsx b/tgui/packages/tgui/interfaces/GravityGenerator.tsx
similarity index 85%
rename from tgui/packages/tgui/interfaces/GravityGenerator.jsx
rename to tgui/packages/tgui/interfaces/GravityGenerator.tsx
index 9dec3c5289..15d3ee9c88 100644
--- a/tgui/packages/tgui/interfaces/GravityGenerator.jsx
+++ b/tgui/packages/tgui/interfaces/GravityGenerator.tsx
@@ -1,11 +1,21 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
-export const GravityGenerator = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ breaker: BooleanLike;
+ charge_count: number;
+ charging_state: number;
+ on: BooleanLike;
+ operational: BooleanLike;
+};
- const { breaker, charge_count, charging_state, on, operational } = data;
+export const GravityGenerator = (props) => {
+ const { act, data } = useBackend();
+
+ const { breaker, charge_count } = data;
let genstatus = 'Offline';
if (breaker && charge_count < 100) {
diff --git a/tgui/packages/tgui/interfaces/GuestPass.jsx b/tgui/packages/tgui/interfaces/GuestPass.tsx
similarity index 82%
rename from tgui/packages/tgui/interfaces/GuestPass.jsx
rename to tgui/packages/tgui/interfaces/GuestPass.tsx
index 89538442d5..82e2cf0bbb 100644
--- a/tgui/packages/tgui/interfaces/GuestPass.jsx
+++ b/tgui/packages/tgui/interfaces/GuestPass.tsx
@@ -1,15 +1,29 @@
/* eslint react/no-danger: "off" */
import { sortBy } from 'common/collections';
+import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
-export const GuestPass = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ access: number[] | null;
+ area: area[];
+ giver: string | null;
+ giveName: string;
+ reason: String;
+ duration: number;
+ mode: BooleanLike;
+ log: string[];
+ uid: number;
+};
- const { access, area, giver, giveName, reason, duration, mode, log, uid } =
- data;
+type area = { area: string; area_name: string; on: BooleanLike };
+
+export const GuestPass = (props) => {
+ const { act, data } = useBackend();
+
+ const { area, giver, giveName, reason, duration, mode, log, uid } = data;
return (
@@ -30,7 +44,7 @@ export const GuestPass = (props) => {
act('print')} fluid mb={1}>
Print
-
+
{/* These are internally generated only. */}
{(log.length &&
log.map((l) => (
@@ -66,8 +80,8 @@ export const GuestPass = (props) => {
act('issue')}>
Issue Pass
-
- {sortBy((a) => a.area_name)(area).map((a) => (
+
+ {sortBy((a: area) => a.area_name)(area).map((a) => (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
supportedPrograms,
diff --git a/tgui/packages/tgui/interfaces/ICAssembly.jsx b/tgui/packages/tgui/interfaces/ICAssembly.tsx
similarity index 77%
rename from tgui/packages/tgui/interfaces/ICAssembly.jsx
rename to tgui/packages/tgui/interfaces/ICAssembly.tsx
index 6bd079efcd..8672bbf175 100644
--- a/tgui/packages/tgui/interfaces/ICAssembly.jsx
+++ b/tgui/packages/tgui/interfaces/ICAssembly.tsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -12,8 +12,22 @@ import {
import { formatPower } from '../format';
import { Window } from '../layouts';
+type Data = {
+ total_parts: number;
+ max_components: number;
+ total_complexity: number;
+ max_complexity: number;
+ battery_charge: number;
+ battery_max: number;
+ net_power: number;
+ unremovable_circuits: circuit[];
+ removable_circuits: circuit[];
+};
+
+type circuit = { name: string; ref: string };
+
export const ICAssembly = (props) => {
- const { act, data } = useBackend();
+ const { data } = useBackend();
const {
total_parts,
@@ -42,8 +56,12 @@ export const ICAssembly = (props) => {
value={total_parts / max_components}
maxValue={1}
>
- {total_parts} / {max_components} (
- {round((total_parts / max_components) * 100, 1)}%)
+ {total_parts +
+ ' / ' +
+ max_components +
+ ' (' +
+ toFixed((total_parts / max_components) * 100, 1) +
+ '%)'}
@@ -56,8 +74,12 @@ export const ICAssembly = (props) => {
value={total_complexity / max_complexity}
maxValue={1}
>
- {total_complexity} / {max_complexity} (
- {round((total_complexity / max_complexity) * 100, 1)}%)
+ {total_complexity +
+ ' / ' +
+ max_complexity +
+ ' (' +
+ toFixed((total_complexity / max_complexity) * 100, 1) +
+ '%)'}
@@ -71,8 +93,12 @@ export const ICAssembly = (props) => {
value={battery_charge / battery_max}
maxValue={1}
>
- {battery_charge} / {battery_max} (
- {round((battery_charge / battery_max) * 100, 1)}%)
+ {battery_charge +
+ ' / ' +
+ battery_max +
+ ' (' +
+ toFixed((battery_charge / battery_max) * 100, 1) +
+ '%)'}
)) || No cell detected. }
@@ -105,7 +131,7 @@ export const ICAssembly = (props) => {
);
};
-const ICAssemblyCircuits = (props) => {
+const ICAssemblyCircuits = (props: { title: string; circuits: circuit[] }) => {
const { act } = useBackend();
const { title, circuits } = props;
diff --git a/tgui/packages/tgui/interfaces/ICCircuit.jsx b/tgui/packages/tgui/interfaces/ICCircuit.tsx
similarity index 82%
rename from tgui/packages/tgui/interfaces/ICCircuit.jsx
rename to tgui/packages/tgui/interfaces/ICCircuit.tsx
index e47fdf934e..35ce453179 100644
--- a/tgui/packages/tgui/interfaces/ICCircuit.jsx
+++ b/tgui/packages/tgui/interfaces/ICCircuit.tsx
@@ -1,3 +1,4 @@
+import { BooleanLike } from 'common/react';
import { decodeHtmlEntities } from 'common/string';
import { useBackend } from '../backend';
@@ -5,14 +6,48 @@ import { Box, Button, Flex, LabeledList, Section } from '../components';
import { formatPower } from '../format';
import { Window } from '../layouts';
+type Data = {
+ name: string;
+ desc: string;
+ displayed_name: string;
+ removable: BooleanLike;
+ complexity: number;
+ power_draw_idle: number;
+ power_draw_per_use: number;
+ extended_desc: string | null;
+ inputs: pin[];
+ outputs: pin[];
+ activators: activator[];
+};
+
+type pin = {
+ type: string;
+ name: string;
+ data: string;
+ ref: string;
+ linked: link[];
+};
+
+type activator = {
+ ref: string;
+ name: string;
+ pulse_out: string;
+ linked: link[];
+};
+
+type link = {
+ ref: string;
+ name: string;
+ holder_ref: string;
+ holder_name: string;
+};
+
export const ICCircuit = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
- name,
desc,
displayed_name,
- removable,
complexity,
power_draw_idle,
power_draw_per_use,
@@ -23,7 +58,7 @@ export const ICCircuit = (props) => {
} = data;
return (
-
+
{
);
};
-const ICIODisplay = (props) => {
+const ICIODisplay = (props: { list: pin[] }) => {
const { act } = useBackend();
const { list } = props;
@@ -118,7 +153,7 @@ const ICIODisplay = (props) => {
));
};
-const ICLinkDisplay = (props) => {
+const ICLinkDisplay = (props: { pin: activator | pin }) => {
const { act } = useBackend();
const { pin } = props;
diff --git a/tgui/packages/tgui/interfaces/ICDetailer.jsx b/tgui/packages/tgui/interfaces/ICDetailer.tsx
similarity index 84%
rename from tgui/packages/tgui/interfaces/ICDetailer.jsx
rename to tgui/packages/tgui/interfaces/ICDetailer.tsx
index 542b876336..4afaf93498 100644
--- a/tgui/packages/tgui/interfaces/ICDetailer.jsx
+++ b/tgui/packages/tgui/interfaces/ICDetailer.tsx
@@ -4,8 +4,10 @@ import { useBackend } from '../backend';
import { Button, Section } from '../components';
import { Window } from '../layouts';
+type Data = { detail_color: string; color_list: Record };
+
export const ICDetailer = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { detail_color, color_list } = data;
@@ -29,10 +31,10 @@ export const ICDetailer = (props) => {
color_list[key] === detail_color
? {
border: '4px solid black',
- 'border-radius': 0,
+ borderRadius: '0',
}
: {
- 'border-radius': 0,
+ borderRadius: '0',
}
}
backgroundColor={color_list[key]}
diff --git a/tgui/packages/tgui/interfaces/ICPrinter.jsx b/tgui/packages/tgui/interfaces/ICPrinter.tsx
similarity index 71%
rename from tgui/packages/tgui/interfaces/ICPrinter.jsx
rename to tgui/packages/tgui/interfaces/ICPrinter.tsx
index 9991f14f1b..3fec1ae2a1 100644
--- a/tgui/packages/tgui/interfaces/ICPrinter.jsx
+++ b/tgui/packages/tgui/interfaces/ICPrinter.tsx
@@ -1,4 +1,5 @@
import { filter, sortBy } from 'common/collections';
+import { BooleanLike } from 'common/react';
import { useBackend, useSharedState } from '../backend';
import {
@@ -12,19 +13,31 @@ import {
} from '../components';
import { Window } from '../layouts';
-export const ICPrinter = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ categories: category[];
+ metal: number;
+ max_metal: number;
+ metal_per_sheet: number;
+ debug: BooleanLike;
+ upgraded: BooleanLike;
+ can_clone: BooleanLike;
+ assembly_to_clone: string;
+};
- const {
- metal,
- max_metal,
- metal_per_sheet,
- debug,
- upgraded,
- can_clone,
- assembly_to_clone,
- categories,
- } = data;
+type category = { name: string; items: item[] };
+
+type item = {
+ name: string;
+ desc: string;
+ can_build: BooleanLike;
+ cost: number;
+ path: string;
+};
+
+export const ICPrinter = (props) => {
+ const { data } = useBackend();
+
+ const { metal, max_metal, metal_per_sheet, upgraded, can_clone } = data;
return (
@@ -54,7 +67,7 @@ export const ICPrinter = (props) => {
);
};
-const canBuild = (item, data) => {
+function canBuild(item: item, data: Data) {
if (!item.can_build) {
return false;
}
@@ -64,28 +77,28 @@ const canBuild = (item, data) => {
}
return true;
-};
+}
const ICPrinterCategories = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const { categories, debug } = data;
+ const { categories } = data;
- const [categoryTarget, setcategoryTarget] = useSharedState(
+ const [categoryTarget, setcategoryTarget] = useSharedState(
'categoryTarget',
- null,
+ '',
);
- const selectedCategory = filter((cat) => cat.name === categoryTarget)(
- categories,
- )[0];
+ const selectedCategory = filter(
+ (cat: category) => cat.name === categoryTarget,
+ )(categories)[0];
return (
- {sortBy((cat) => cat.name)(categories).map((cat) => (
+ {sortBy((cat: category) => cat.name)(categories).map((cat) => (
setcategoryTarget(cat.name)}
@@ -97,10 +110,10 @@ const ICPrinterCategories = (props) => {
- {(selectedCategory && (
+ {selectedCategory ? (
- {sortBy((item) => item.name)(selectedCategory.items).map(
+ {sortBy((item: item) => item.name)(selectedCategory.items).map(
(item) => (
{
)}
- )) ||
- 'No category selected.'}
+ ) : (
+ No category selected.
+ )}
diff --git a/tgui/packages/tgui/interfaces/IDCard.jsx b/tgui/packages/tgui/interfaces/IDCard.tsx
similarity index 77%
rename from tgui/packages/tgui/interfaces/IDCard.jsx
rename to tgui/packages/tgui/interfaces/IDCard.tsx
index cdb0cef0dd..3c05e478bb 100644
--- a/tgui/packages/tgui/interfaces/IDCard.jsx
+++ b/tgui/packages/tgui/interfaces/IDCard.tsx
@@ -1,10 +1,22 @@
import { useBackend } from '../backend';
-import { Box, Flex, Icon, LabeledList, Section } from '../components';
+import { Box, Flex, Icon, Image, LabeledList, Section } from '../components';
import { Window } from '../layouts';
import { RankIcon } from './common/RankIcon';
+type Data = {
+ registered_name: string;
+ sex: string;
+ species: string;
+ age: string | number;
+ assignment: string;
+ fingerprint_hash: string;
+ blood_type: string;
+ dna_hash: string;
+ photo_front: string;
+};
+
export const IDCard = (props) => {
- const { data } = useBackend();
+ const { data } = useBackend();
const {
registered_name,
@@ -18,7 +30,10 @@ export const IDCard = (props) => {
photo_front,
} = data;
- const dataIter = [
+ const dataIter: {
+ name: string;
+ val: string | number;
+ }[] = [
{ name: 'Sex', val: sex },
{ name: 'Species', val: species },
{ name: 'Age', val: age },
@@ -43,12 +58,11 @@ export const IDCard = (props) => {
}}
>
{(photo_front && (
-
)) || }
@@ -74,7 +88,7 @@ export const IDCard = (props) => {
-
+
diff --git a/tgui/packages/tgui/interfaces/IdentificationComputer.jsx b/tgui/packages/tgui/interfaces/IdentificationComputer.tsx
similarity index 69%
rename from tgui/packages/tgui/interfaces/IdentificationComputer.jsx
rename to tgui/packages/tgui/interfaces/IdentificationComputer.tsx
index f22c1426de..0335e0f85b 100644
--- a/tgui/packages/tgui/interfaces/IdentificationComputer.jsx
+++ b/tgui/packages/tgui/interfaces/IdentificationComputer.tsx
@@ -1,4 +1,5 @@
import { sortBy } from 'common/collections';
+import { BooleanLike } from 'common/react';
import { decodeHtmlEntities } from 'common/string';
import { Fragment } from 'react';
@@ -16,6 +17,40 @@ import {
import { Window } from '../layouts';
import { CrewManifestContent } from './CrewManifest';
+type Data = {
+ manifest: { cat: string; elems: manifestEntry[] }[];
+ station_name: string;
+ mode: BooleanLike;
+ printing: BooleanLike;
+ have_id_slot: BooleanLike;
+ have_printer: BooleanLike;
+ target_name: string | null;
+ target_owner: string | null;
+ target_rank: string;
+ scan_name: string;
+ authenticated: BooleanLike;
+ has_modify: BooleanLike;
+ account_number: number | null;
+ centcom_access: BooleanLike;
+ all_centcom_access: access[];
+ regions: region[] | null;
+ id_rank: string | null;
+ departments: {
+ department_name: string;
+ jobs: { display_name: string; target_rank: string; job: string }[];
+ }[];
+};
+
+type manifestEntry = { name: string; rank: string; active: string };
+
+type region = { name: string; accesses: access[] };
+
+type access = {
+ desc: string;
+ ref: string;
+ allowed: BooleanLike;
+};
+
export const IdentificationComputer = () => {
return (
@@ -27,14 +62,16 @@ export const IdentificationComputer = () => {
};
export const IdentificationComputerContent = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { ntos } = props;
- const { mode, has_modify, printing } = data;
+ const { mode, has_modify, printing, have_id_slot, have_printer } = data;
- let body = ;
- if (ntos && !data.have_id_slot) {
+ let body: React.JSX.Element = (
+
+ );
+ if (ntos && !have_id_slot) {
body = ;
} else if (printing) {
body = ;
@@ -45,7 +82,7 @@ export const IdentificationComputerContent = (props) => {
return (
<>
- {(!ntos || !!data.have_id_slot) && (
+ {(!ntos || !!have_id_slot) && (
{
Crew Manifest
{!ntos ||
- (!!data.have_printer && (
+ (!!have_printer && (
act('print')}
- disabled={!mode && !has_modify}
- color=""
+ onClick={() => (mode || has_modify) && act('print')}
+ color={!mode && !has_modify ? 'transparent' : ''}
>
Print
@@ -83,8 +121,10 @@ export const IdentificationComputerPrinting = (props) => {
return ;
};
-export const IdentificationComputerAccessModification = (props) => {
- const { act, data } = useBackend();
+export const IdentificationComputerAccessModification = (props: {
+ ntos: boolean;
+}) => {
+ const { act, data } = useBackend();
const { ntos } = props;
@@ -98,7 +138,6 @@ export const IdentificationComputerAccessModification = (props) => {
account_number,
centcom_access,
all_centcom_access,
- regions,
id_rank,
departments,
} = data;
@@ -126,7 +165,7 @@ export const IdentificationComputerAccessModification = (props) => {
{!!authenticated && !!has_modify && (
<>
-
+
-
+
{departments.map((dept) => (
@@ -199,7 +238,7 @@ export const IdentificationComputerAccessModification = (props) => {
{(!!centcom_access && (
-
+
{all_centcom_access.map((access) => (
{
))}
)) || (
-
+
)}
@@ -228,8 +267,8 @@ export const IdentificationComputerAccessModification = (props) => {
);
};
-export const IdentificationComputerRegions = (props) => {
- const { act, data } = useBackend();
+export const IdentificationComputerRegions = (props: { actName: string }) => {
+ const { act, data } = useBackend();
const { actName } = props;
@@ -237,28 +276,29 @@ export const IdentificationComputerRegions = (props) => {
return (
- {sortBy((r) => r.name)(regions).map((region) => (
-
-
- {sortBy((a) => a.desc)(region.accesses).map((access) => (
-
-
- act(actName, {
- access_target: access.ref,
- allowed: access.allowed,
- })
- }
- >
- {decodeHtmlEntities(access.desc)}
-
-
- ))}
-
-
- ))}
+ {regions &&
+ sortBy((r: region) => r.name)(regions).map((region) => (
+
+
+ {sortBy((a: access) => a.desc)(region.accesses).map((access) => (
+
+
+ act(actName, {
+ access_target: access.ref,
+ allowed: access.allowed,
+ })
+ }
+ >
+ {decodeHtmlEntities(access.desc)}
+
+
+ ))}
+
+
+ ))}
);
};
diff --git a/tgui/packages/tgui/interfaces/InventoryPanelHuman.jsx b/tgui/packages/tgui/interfaces/InventoryPanelHuman.tsx
similarity index 83%
rename from tgui/packages/tgui/interfaces/InventoryPanelHuman.jsx
rename to tgui/packages/tgui/interfaces/InventoryPanelHuman.tsx
index b393c3f18b..a1946e47af 100644
--- a/tgui/packages/tgui/interfaces/InventoryPanelHuman.jsx
+++ b/tgui/packages/tgui/interfaces/InventoryPanelHuman.tsx
@@ -1,14 +1,35 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ slots: slot[];
+ specialSlots: slot[];
+ internals: string;
+ internalsValid: BooleanLike;
+ sensors: BooleanLike;
+ handcuffed: BooleanLike;
+ handcuffedParams: { slot: number };
+ legcuffed: BooleanLike;
+ legcuffedParams: { slot: number };
+ accessory: BooleanLike;
+};
+
+type slot = {
+ name: string;
+ item: string;
+ act: string;
+ params: { slot: number };
+};
+
export const InventoryPanelHuman = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
slots,
specialSlots,
- internals,
internalsValid,
sensors,
handcuffed,
@@ -67,6 +88,13 @@ export const InventoryPanelHuman = (props) => {
>
Empty Pockets
+ act('targetSlot', { slot: 'underwear' })}
+ >
+ Remove or Replace Underwear
+
{(internalsValid && (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { busy, antibodies, pathogens, is_antibody_sample, sample_inserted } =
data;
@@ -18,9 +28,7 @@ export const IsolationCentrifuge = (props) => {
} else {
blood_sample = (
<>
- {antibodies ? (
-
- ) : null}
+ {antibodies ? : ''}
{pathogens.length ? (
@@ -31,7 +39,9 @@ export const IsolationCentrifuge = (props) => {
))}
- ) : null}
+ ) : (
+ ''
+ )}
>
);
}
@@ -84,7 +94,9 @@ export const IsolationCentrifuge = (props) => {
{antibodies}
- ) : null}
+ ) : (
+ ''
+ )}
{pathogens.length ? (
{pathogens.map((virus) => (
@@ -99,10 +111,14 @@ export const IsolationCentrifuge = (props) => {
))}
- ) : null}
+ ) : (
+ ''
+ )}
- ) : null}
+ ) : (
+ ''
+ )}
>
)}
diff --git a/tgui/packages/tgui/interfaces/JanitorCart.jsx b/tgui/packages/tgui/interfaces/JanitorCart.tsx
similarity index 75%
rename from tgui/packages/tgui/interfaces/JanitorCart.jsx
rename to tgui/packages/tgui/interfaces/JanitorCart.tsx
index ec136982fa..03cba6190c 100644
--- a/tgui/packages/tgui/interfaces/JanitorCart.jsx
+++ b/tgui/packages/tgui/interfaces/JanitorCart.tsx
@@ -1,11 +1,21 @@
import { useBackend } from '../backend';
-import { Button, Icon } from '../components';
+import { Button, Icon, Image } from '../components';
import { Window } from '../layouts';
-export const JanitorCart = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ mybag: string | null;
+ mybucket: string | null;
+ mymop: string | null;
+ myspray: string | null;
+ myreplacer: string | null;
+ signs: string | null;
+ icons: Record;
+};
- const { mybag, mybucket, mymop, myspray, myreplacer, signs, icons } = data;
+export const JanitorCart = (props) => {
+ const { act, data } = useBackend();
+
+ const { mybag, mybucket, mymop, myspray, myreplacer, signs } = data;
return (
@@ -18,7 +28,7 @@ export const JanitorCart = (props) => {
tooltipPosition="bottom-end"
color={mybag ? 'grey' : 'transparent'}
style={{
- border: mybag ? null : '2px solid grey',
+ border: mybag ? undefined : '2px solid grey',
}}
onClick={() => act('bag')}
>
@@ -32,7 +42,7 @@ export const JanitorCart = (props) => {
tooltipPosition="bottom"
color={mybucket ? 'grey' : 'transparent'}
style={{
- border: mybucket ? null : '2px solid grey',
+ border: mybucket ? undefined : '2px solid grey',
}}
onClick={() => act('bucket')}
>
@@ -46,7 +56,7 @@ export const JanitorCart = (props) => {
tooltipPosition="bottom-end"
color={mymop ? 'grey' : 'transparent'}
style={{
- border: mymop ? null : '2px solid grey',
+ border: mymop ? undefined : '2px solid grey',
}}
onClick={() => act('mop')}
>
@@ -60,7 +70,7 @@ export const JanitorCart = (props) => {
tooltipPosition="top-end"
color={myspray ? 'grey' : 'transparent'}
style={{
- border: myspray ? null : '2px solid grey',
+ border: myspray ? undefined : '2px solid grey',
}}
onClick={() => act('spray')}
>
@@ -74,7 +84,7 @@ export const JanitorCart = (props) => {
tooltipPosition="top"
color={myreplacer ? 'grey' : 'transparent'}
style={{
- border: myreplacer ? null : '2px solid grey',
+ border: myreplacer ? undefined : '2px solid grey',
}}
onClick={() => act('replacer')}
>
@@ -88,7 +98,7 @@ export const JanitorCart = (props) => {
tooltipPosition="top-start"
color={signs ? 'grey' : 'transparent'}
style={{
- border: signs ? null : '2px solid grey',
+ border: signs ? undefined : '2px solid grey',
}}
onClick={() => act('sign')}
>
@@ -99,7 +109,7 @@ export const JanitorCart = (props) => {
);
};
-const iconkeysToIcons = {
+const iconkeysToIcons: Record = {
mybag: 'trash',
mybucket: 'fill',
mymop: 'broom',
@@ -108,8 +118,8 @@ const iconkeysToIcons = {
signs: 'sign',
};
-const JanicartIcon = (props) => {
- const { data } = useBackend();
+const JanicartIcon = (props: { iconkey: string }) => {
+ const { data } = useBackend();
const { iconkey } = props;
@@ -117,17 +127,16 @@ const JanicartIcon = (props) => {
if (iconkey in icons) {
return (
-
);
@@ -138,9 +147,9 @@ const JanicartIcon = (props) => {
style={{
position: 'absolute',
left: '4px',
- right: 0,
+ right: '0',
top: '20px',
- bottom: 0,
+ bottom: '0',
width: '64px',
height: '64px',
}}
diff --git a/tgui/packages/tgui/interfaces/Jukebox.jsx b/tgui/packages/tgui/interfaces/Jukebox.tsx
similarity index 85%
rename from tgui/packages/tgui/interfaces/Jukebox.jsx
rename to tgui/packages/tgui/interfaces/Jukebox.tsx
index d265ad7c80..5328135c05 100644
--- a/tgui/packages/tgui/interfaces/Jukebox.jsx
+++ b/tgui/packages/tgui/interfaces/Jukebox.tsx
@@ -1,4 +1,5 @@
-import { round } from 'common/math';
+import { round, toFixed } from 'common/math';
+import { BooleanLike } from 'common/react';
import { capitalize } from 'common/string';
import { useState } from 'react';
@@ -19,8 +20,28 @@ import {
import { formatTime } from '../format';
import { Window } from '../layouts';
+type Data = {
+ playing: BooleanLike;
+ loop_mode: number;
+ volume: number;
+ current_track_ref: string | null;
+ current_track: track | null;
+ current_genre: string | null;
+ percent: number;
+ tracks: track[];
+ admin: BooleanLike;
+};
+
+type track = {
+ ref: string;
+ title: string;
+ artist: string;
+ genre: string;
+ duration: number;
+};
+
export const Jukebox = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
playing,
@@ -47,14 +68,14 @@ export const Jukebox = (props) => {
let true_genre = playing && (current_genre || 'Uncategorized');
- const [newTitle, setNewTitle] = useState('Unknown');
- const [newUrl, setNewUrl] = useState('');
- const [newDuration, setNewDuration] = useState(0);
- const [newArtist, setNewArtist] = useState('Unknown');
- const [newGenre, setNewGenre] = useState('Admin');
- const [newSecret, setNewSecret] = useState(false);
- const [newLobby, setNewLobby] = useState(false);
- const [unlockGenre, setUnlockGenre] = useState(false);
+ const [newTitle, setNewTitle] = useState('Unknown');
+ const [newUrl, setNewUrl] = useState('');
+ const [newDuration, setNewDuration] = useState(0);
+ const [newArtist, setNewArtist] = useState('Unknown');
+ const [newGenre, setNewGenre] = useState('Admin');
+ const [newSecret, setNewSecret] = useState(false);
+ const [newLobby, setNewLobby] = useState(false);
+ const [unlockGenre, setUnlockGenre] = useState(false);
function handleUnlockGenre() {
if (unlockGenre) {
@@ -135,7 +156,7 @@ export const Jukebox = (props) => {
average: [25, 75],
bad: [0, 25],
}}
- format={(val) => round(val, 1) + '%'}
+ format={(val) => toFixed(val, 1) + '%'}
onChange={(e, val) =>
act('volume', { val: round(val / 100, 2) })
}
@@ -156,7 +177,7 @@ export const Jukebox = (props) => {
color={true_genre === genre ? 'green' : 'default'}
child_mt={0}
>
-
+
{genre_songs[genre].map((track) => (
{
color={true_genre === genre ? 'green' : 'default'}
child_mt={0}
>
-
+
{genre_songs[genre].map((track) => (
@@ -232,14 +253,14 @@ export const Jukebox = (props) => {
setNewTitle(val)}
+ onChange={(e, val: string) => setNewTitle(val)}
/>
setNewUrl(val)}
+ onChange={(e, val: string) => setNewUrl(val)}
/>
@@ -247,15 +268,15 @@ export const Jukebox = (props) => {
value={newDuration}
minValue={0}
maxValue={3600}
- onChange={(e, val) => setNewDuration(val)}
- format={(val) => formatTime(round(val * 10))}
+ onChange={(e, val: number) => setNewDuration(val)}
+ format={(val) => formatTime(round(val * 10, 0))}
/>
setNewArtist(val)}
+ onChange={(e, val: string) => setNewArtist(val)}
/>
@@ -265,7 +286,7 @@ export const Jukebox = (props) => {
setNewGenre(val)}
+ onChange={(e, val: string) => setNewGenre(val)}
/>
) : (
{newGenre}
@@ -275,7 +296,7 @@ export const Jukebox = (props) => {
handleUnlockGenre()}
+ onClick={() => handleUnlockGenre()}
/>
@@ -283,13 +304,13 @@ export const Jukebox = (props) => {
setNewSecret(!newSecret)}
+ onClick={() => setNewSecret(!newSecret)}
/>
setNewLobby(!newLobby)}
+ onClick={() => setNewLobby(!newLobby)}
/>
diff --git a/tgui/packages/tgui/interfaces/LawManager.jsx b/tgui/packages/tgui/interfaces/LawManager.tsx
similarity index 61%
rename from tgui/packages/tgui/interfaces/LawManager.jsx
rename to tgui/packages/tgui/interfaces/LawManager.tsx
index de820e06a4..3632166b60 100644
--- a/tgui/packages/tgui/interfaces/LawManager.jsx
+++ b/tgui/packages/tgui/interfaces/LawManager.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend, useSharedState } from '../backend';
import {
Button,
@@ -10,16 +12,63 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ ion_law_nr: string;
+ ion_law: string;
+ zeroth_law: string;
+ inherent_law: string;
+ supplied_law: string;
+ supplied_law_position: number;
+ zeroth_laws: law[];
+ ion_laws: law[];
+ inherent_laws: law[];
+ supplied_laws: law[];
+ has_zeroth_laws: number;
+ has_ion_laws: number;
+ has_inherent_laws: number;
+ has_supplied_laws: number;
+ isAI: BooleanLike;
+ isMalf: BooleanLike;
+ isSlaved: BooleanLike;
+ isAdmin: BooleanLike;
+ channel: string;
+ channels: { channel: string }[];
+ law_sets: law_pack[];
+};
+
+type law_pack = {
+ name: string;
+ header: string;
+ ref: string;
+ laws: {
+ zeroth_laws: law[];
+ has_zeroth_laws: number;
+ ion_laws: law[];
+ has_ion_laws: number;
+ inherent_laws: law[];
+ has_inherent_laws: number;
+ supplied_laws: law[];
+ has_supplied_laws: number;
+ };
+};
+
+type law = {
+ law: string;
+ index: number;
+ state: number;
+ ref: string;
+ zero: boolean; // Local UI var
+};
+
export const LawManager = (props) => {
- const { act, data } = useBackend();
+ const { data } = useBackend
();
const { isSlaved } = data;
return (
- {(isSlaved && Law-synced to {isSlaved} ) ||
- null}
+ {isSlaved ? Law-synced to {isSlaved} : ''}
@@ -27,7 +76,12 @@ export const LawManager = (props) => {
};
const LawManagerContent = (props) => {
- const [tabIndex, setTabIndex] = useSharedState('lawsTabIndex', 0);
+ const [tabIndex, setTabIndex] = useSharedState('lawsTabIndex', 0);
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[0] = ;
+ tab[1] = ;
return (
<>
@@ -39,14 +93,13 @@ const LawManagerContent = (props) => {
Law Sets
- {(tabIndex === 0 && ) || null}
- {(tabIndex === 1 && ) || null}
+ {tab[tabIndex]}
>
);
};
const LawManagerLaws = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
ion_law_nr,
@@ -79,19 +132,22 @@ const LawManagerLaws = (props) => {
return (
- {(has_ion_laws && (
+ {has_ion_laws ? (
- )) ||
- null}
- {((has_zeroth_laws || has_inherent_laws) && (
+ ) : (
+ ''
+ )}
+ {has_zeroth_laws || has_inherent_laws ? (
- )) ||
- null}
- {(has_supplied_laws && (
+ ) : (
+ ''
+ )}
+ {has_supplied_laws ? (
- )) ||
- null}
-
+ ) : (
+ ''
+ )}
+
{channels.map((chan) => (
@@ -111,18 +167,19 @@ const LawManagerLaws = (props) => {
State Laws
- {(isAI && (
+ {isAI ? (
act('notify_laws')}>
Notify
- )) ||
- null}
+ ) : (
+ ''
+ )}
- {(isMalf && (
-
+ {isMalf ? (
+
Type
@@ -130,14 +187,14 @@ const LawManagerLaws = (props) => {
Index
Add
- {(isAdmin && !has_zeroth_laws && (
+ {isAdmin && !has_zeroth_laws ? (
Zero
+ onChange={(e, val: string) =>
act('change_zeroth_law', { val: val })
}
/>
@@ -149,15 +206,18 @@ const LawManagerLaws = (props) => {
- )) ||
- null}
+ ) : (
+ ''
+ )}
Ion
act('change_ion_law', { val: val })}
+ onChange={(e, val: string) =>
+ act('change_ion_law', { val: val })
+ }
/>
N/A
@@ -173,7 +233,7 @@ const LawManagerLaws = (props) => {
+ onChange={(e, val: string) =>
act('change_inherent_law', { val: val })
}
/>
@@ -191,7 +251,7 @@ const LawManagerLaws = (props) => {
+ onChange={(e, val: string) =>
act('change_supplied_law', { val: val })
}
/>
@@ -212,39 +272,47 @@ const LawManagerLaws = (props) => {
- )) ||
- null}
+ ) : (
+ ''
+ )}
);
};
-const LawsTable = (props) => {
- const { act, data } = useBackend();
+const LawsTable = (props: {
+ title: string;
+ noButtons?: BooleanLike;
+ [rest: string]: any;
+}) => {
+ const { act, data } = useBackend();
const { isMalf, isAdmin } = data;
const { laws, title, noButtons, ...rest } = props;
return (
-
+
Index
Law
- {(!noButtons && State ) || null}
- {(isMalf && !noButtons && (
+ {!noButtons ? State : ''}
+ {isMalf && !noButtons ? (
<>
Edit
Delete
>
- )) ||
- null}
+ ) : (
+ ''
+ )}
- {laws.map((law) => (
+ {laws.map((law: law) => (
{law.index}.
- {law.law}
- {(!noButtons && (
+
+ {law.law}
+
+ {!noButtons ? (
{
{law.state ? 'Yes' : 'No'}
- )) ||
- null}
- {(isMalf && !noButtons && (
+ ) : (
+ ''
+ )}
+ {isMalf && !noButtons ? (
<>
{
>
- )) ||
- null}
+ ) : (
+ ''
+ )}
))}
@@ -291,9 +361,9 @@ const LawsTable = (props) => {
};
const LawManagerLawSets = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const { isMalf, law_sets } = data;
+ const { isMalf, law_sets, ion_law_nr } = data;
return (
<>
@@ -301,60 +371,63 @@ const LawManagerLawSets = (props) => {
Remember: Stating laws other than those currently loaded may be grounds
for decommissioning! - NanoTrasen
- {(law_sets.length &&
- law_sets.map((laws) => (
-
-
- act('transfer_laws', { transfer_laws: laws.ref })
- }
- >
- Load Laws
-
-
- act('state_law_set', { state_law_set: laws.ref })
- }
- >
- State Laws
-
- >
- }
- >
- {(laws.laws.has_ion_laws && (
-
- )) ||
- null}
- {((laws.laws.has_zeroth_laws || laws.laws.has_inherent_laws) && (
-
- )) ||
- null}
- {(laws.laws.has_supplied_laws && (
-
- )) ||
- null}
-
- ))) ||
- null}
+ {law_sets.length
+ ? law_sets.map((laws) => (
+
+
+ act('transfer_laws', { transfer_laws: laws.ref })
+ }
+ >
+ Load Laws
+
+
+ act('state_law_set', { state_law_set: laws.ref })
+ }
+ >
+ State Laws
+
+ >
+ }
+ >
+ {laws.laws.has_ion_laws ? (
+
+ ) : (
+ ''
+ )}
+ {laws.laws.has_zeroth_laws || laws.laws.has_inherent_laws ? (
+
+ ) : (
+ ''
+ )}
+ {laws.laws.has_supplied_laws ? (
+
+ ) : (
+ ''
+ )}
+
+ ))
+ : ''}
>
);
};
diff --git a/tgui/packages/tgui/interfaces/LookingGlass.jsx b/tgui/packages/tgui/interfaces/LookingGlass.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/LookingGlass.jsx
rename to tgui/packages/tgui/interfaces/LookingGlass.tsx
index 4ddbc51f15..6182fe1f35 100644
--- a/tgui/packages/tgui/interfaces/LookingGlass.jsx
+++ b/tgui/packages/tgui/interfaces/LookingGlass.tsx
@@ -1,9 +1,18 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ supportedPrograms: string[];
+ currentProgram: string;
+ immersion: BooleanLike;
+ gravity: BooleanLike;
+};
+
export const LookingGlass = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { supportedPrograms, currentProgram, immersion, gravity } = data;
diff --git a/tgui/packages/tgui/interfaces/MechaControlConsole.jsx b/tgui/packages/tgui/interfaces/MechaControlConsole.tsx
similarity index 86%
rename from tgui/packages/tgui/interfaces/MechaControlConsole.jsx
rename to tgui/packages/tgui/interfaces/MechaControlConsole.tsx
index d625017f56..41f0a86be4 100644
--- a/tgui/packages/tgui/interfaces/MechaControlConsole.jsx
+++ b/tgui/packages/tgui/interfaces/MechaControlConsole.tsx
@@ -12,17 +12,37 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ beacons: {
+ ref: string;
+ charge: string;
+ name: string;
+ health: number;
+ maxHealth: number;
+ cell: string;
+ cellCharge: number;
+ cellMaxCharge: number;
+ airtank: number;
+ pilot: string;
+ location: string;
+ active: string | null;
+ cargoUsed: number;
+ cargoMax: number;
+ }[];
+ stored_data: { time: string; year: number; message: string }[];
+};
+
export const MechaControlConsole = (props) => {
- const { act, data } = useBackend();
- const { beacons, stored_data } = data;
+ const { act, data } = useBackend();
+ const { beacons = [], stored_data = [] } = data;
return (
- {(stored_data.length && (
+ {stored_data.length ? (
act('clear_log')} />
@@ -38,8 +58,9 @@ export const MechaControlConsole = (props) => {
))}
- )) ||
- null}
+ ) : (
+ ''
+ )}
{(beacons.length &&
beacons.map((beacon) => (
{
{beacon.active || 'None'}
- {(beacon.cargoMax && (
+ {beacon.cargoMax ? (
{
maxValue={beacon.cargoMax}
/>
- )) ||
- null}
+ ) : (
+ ''
+ )}
))) || No mecha beacons found. }
diff --git a/tgui/packages/tgui/interfaces/Medbot.jsx b/tgui/packages/tgui/interfaces/Medbot.tsx
similarity index 85%
rename from tgui/packages/tgui/interfaces/Medbot.jsx
rename to tgui/packages/tgui/interfaces/Medbot.tsx
index f3cb03315c..b4d09e6cc6 100644
--- a/tgui/packages/tgui/interfaces/Medbot.jsx
+++ b/tgui/packages/tgui/interfaces/Medbot.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -9,8 +11,25 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ on: BooleanLike;
+ open: BooleanLike;
+ beaker: BooleanLike;
+ beaker_total: number;
+ beaker_max: number;
+ locked: BooleanLike;
+ heal_threshold: number | null;
+ heal_threshold_max: number;
+ injection_amount_min: number;
+ injection_amount: number | null;
+ injection_amount_max: number;
+ use_beaker: BooleanLike;
+ declare_treatment: BooleanLike;
+ vocal: BooleanLike;
+};
+
export const Medbot = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
on,
@@ -82,7 +101,9 @@ export const Medbot = (props) => {
minValue={0}
maxValue={heal_threshold_max}
value={heal_threshold}
- onDrag={(e, val) => act('adj_threshold', { val: val })}
+ onDrag={(e, val: number) =>
+ act('adj_threshold', { val: val })
+ }
/>
@@ -91,7 +112,7 @@ export const Medbot = (props) => {
minValue={injection_amount_min}
maxValue={injection_amount_max}
value={injection_amount}
- onDrag={(e, val) => act('adj_inject', { val: val })}
+ onDrag={(e, val: number) => act('adj_inject', { val: val })}
/>
diff --git a/tgui/packages/tgui/interfaces/MentorTicketPanel.tsx b/tgui/packages/tgui/interfaces/MentorTicketPanel.tsx
index 4e2c397061..bb338b486e 100644
--- a/tgui/packages/tgui/interfaces/MentorTicketPanel.tsx
+++ b/tgui/packages/tgui/interfaces/MentorTicketPanel.tsx
@@ -1,4 +1,6 @@
/* eslint react/no-danger: "off" */
+import { round, toFixed } from 'common/math';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
@@ -26,7 +28,6 @@ export const MentorTicketPanel = (props) => {
const { act, data } = useBackend();
const {
id,
- title,
name,
state,
opened_at,
@@ -57,13 +58,17 @@ export const MentorTicketPanel = (props) => {
{State[state]}
{State[state] === State.open ? (
- {opened_at_date} ({Math.round((opened_at / 600) * 10) / 10}
- minutes ago.)
+ {opened_at_date +
+ ' (' +
+ toFixed(round((opened_at / 600) * 10, 0) / 10, 1) +
+ ' minutes ago.)'}
) : (
- {closed_at_date} ({Math.round((closed_at / 600) * 10) / 10}
- minutes ago.)
+ {closed_at_date +
+ ' (' +
+ toFixed(round((closed_at / 600) * 10, 0) / 10, 1) +
+ ' minutes ago.)'}
act('reopen')}>Reopen
)}
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor.jsx b/tgui/packages/tgui/interfaces/MessageMonitor.jsx
deleted file mode 100644
index 74f68a9abe..0000000000
--- a/tgui/packages/tgui/interfaces/MessageMonitor.jsx
+++ /dev/null
@@ -1,440 +0,0 @@
-import { decodeHtmlEntities } from 'common/string';
-import { useState } from 'react';
-
-import { useBackend } from '../backend';
-import {
- Box,
- Button,
- Dropdown,
- Flex,
- Icon,
- Input,
- LabeledList,
- Section,
- Tabs,
-} from '../components';
-import { Window } from '../layouts';
-import { FullscreenNotice } from './common/FullscreenNotice';
-import { TemporaryNotice } from './common/TemporaryNotice';
-
-export const MessageMonitor = (props) => {
- const { act, data } = useBackend();
-
- const { auth, linkedServer, message, hacking, emag } = data;
-
- let body;
- if (hacking || emag) {
- body = ;
- } else if (!auth) {
- body = ;
- } else if (linkedServer) {
- body = ;
- } else {
- body = ERROR ;
- }
-
- return (
-
-
-
- {body}
-
-
- );
-};
-
-const MessageMonitorHack = (props) => {
- const { act, data } = useBackend();
-
- const { isMalfAI } = data;
-
- return (
-
- {isMalfAI ? (
-
- Brute-forcing for server key. It will take 20 seconds for every
- character that the password has.
-
- ) : (
-
- 01000010011100100111010101110100011001010010110
-
- 10110011001101111011100100110001101101001011011100110011
-
- 10010000001100110011011110111001000100000011100110110010
-
- 10111001001110110011001010111001000100000011010110110010
-
- 10111100100101110001000000100100101110100001000000111011
-
- 10110100101101100011011000010000001110100011000010110101
-
- 10110010100100000001100100011000000100000011100110110010
-
- 10110001101101111011011100110010001110011001000000110011
-
- 00110111101110010001000000110010101110110011001010111001
-
- 00111100100100000011000110110100001100001011100100110000
-
- 10110001101110100011001010111001000100000011101000110100
-
- 00110000101110100001000000111010001101000011001010010000
-
- 00111000001100001011100110111001101110111011011110111001
-
- 00110010000100000011010000110000101110011001011100010000
-
- 00100100101101110001000000111010001101000011001010010000
-
- 00110110101100101011000010110111001110100011010010110110
-
- 10110010100101100001000000111010001101000011010010111001
-
- 10010000001100011011011110110111001110011011011110110110
-
- 00110010100100000011000110110000101101110001000000111001
-
- 00110010101110110011001010110000101101100001000000111100
-
- 10110111101110101011100100010000001110100011100100111010
-
- 10110010100100000011010010110111001110100011001010110111
-
- 00111010001101001011011110110111001110011001000000110100
-
- 10110011000100000011110010110111101110101001000000110110
-
- 00110010101110100001000000111001101101111011011010110010
-
- 10110111101101110011001010010000001100001011000110110001
-
- 10110010101110011011100110010000001101001011101000010111
-
- 00010000001001101011000010110101101100101001000000111001
-
- 10111010101110010011001010010000001101110011011110010000
-
- 00110100001110101011011010110000101101110011100110010000
-
- 00110010101101110011101000110010101110010001000000111010
-
- 00110100001100101001000000111001001101111011011110110110
-
- 10010000001100100011101010111001001101001011011100110011
-
- 10010000001110100011010000110000101110100001000000111010
-
- 001101001011011010110010100101110
-
- )}
-
- );
-};
-
-const MessageMonitorLogin = (props) => {
- const { act, data } = useBackend();
-
- const { isMalfAI } = data;
-
- return (
-
-
-
- Unauthorized
-
-
- Decryption Key:
- act('auth', { key: val })}
- />
-
- {!!isMalfAI && (
- act('hack')}>
- Hack
-
- )}
-
- Please authenticate with the server in order to show additional options.
-
-
- );
-};
-
-const MessageMonitorContent = (props) => {
- const { act, data } = useBackend();
-
- const { linkedServer } = data;
-
- const [tabIndex, setTabIndex] = useState(0);
-
- let body;
- if (tabIndex === 0) {
- body = ;
- } else if (tabIndex === 1) {
- body = ;
- } else if (tabIndex === 2) {
- body = ;
- } else if (tabIndex === 3) {
- body = ;
- } else if (tabIndex === 4) {
- body = ;
- }
-
- return (
- <>
-
- setTabIndex(0)}
- >
- Main Menu
-
- setTabIndex(1)}
- >
- Message Logs
-
- setTabIndex(2)}
- >
- Request Logs
-
- setTabIndex(3)}
- >
- Admin Messaging
-
- setTabIndex(4)}
- >
- Spam Filter
-
- act('deauth')}>
- Log Out
-
-
- {body}
- >
- );
-};
-
-const MessageMonitorMain = (props) => {
- const { act, data } = useBackend();
-
- const { linkedServer } = data;
-
- return (
-
- act('find')}>
- Server Link
-
- act('active')}
- >
- {'Server ' + (linkedServer.active ? 'Enabled' : 'Disabled')}
-
- >
- }
- >
-
-
- Good
-
-
- act('pass')}>
- Set Custom Key
-
-
- Clear Message Logs
-
-
- Clear Request Logs
-
-
- );
-};
-
-const MessageMonitorLogs = (props) => {
- const { act, data } = useBackend();
-
- const { logs, pda, rc } = props;
-
- return (
- act(pda ? 'del_pda' : 'del_rc')}
- >
- Delete All
-
- }
- >
-
- {logs.map((log, i) => (
-
- ' + log.recipient}
- buttons={
-
- act('delete', {
- id: log.ref,
- type: rc ? 'rc' : 'pda',
- })
- }
- />
- }
- >
- {rc ? (
-
-
- {log.message}
-
-
- {decodeHtmlEntities(log.id_auth)}
-
- {log.stamp}
-
- ) : (
- log.message
- )}
-
-
- ))}
-
-
- );
-};
-
-const MessageMonitorAdmin = (props) => {
- const { act, data } = useBackend();
-
- const {
- possibleRecipients,
- customsender,
- customrecepient,
- customjob,
- custommessage,
- } = data;
-
- const recipientOptions = Object.keys(possibleRecipients);
-
- return (
-
- );
-};
-
-const MessageMonitorSpamFilter = (props) => {
- const { act, data } = useBackend();
-
- const { linkedServer } = data;
-
- return (
-
-
- {linkedServer.spamFilter.map((spam) => (
- act('deltoken', { deltoken: spam.index })}
- >
- Delete
-
- }
- >
- {spam.token}
-
- ))}
-
- act('addtoken')}>
- Add New Entry
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorContent.tsx b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorContent.tsx
new file mode 100644
index 0000000000..744bb72097
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorContent.tsx
@@ -0,0 +1,73 @@
+import { useState } from 'react';
+
+import { useBackend } from '../../backend';
+import { Box, Icon, Tabs } from '../../components';
+import {
+ MessageMonitorAdmin,
+ MessageMonitorLogs,
+ MessageMonitorMain,
+ MessageMonitorSpamFilter,
+} from './MessageMonitorTabs';
+import { Data } from './types';
+
+export const MessageMonitorContent = (props) => {
+ const { act, data } = useBackend();
+
+ const { linkedServer } = data;
+
+ const [tabIndex, setTabIndex] = useState(0);
+
+ let tab: React.JSX.Element[] = [];
+
+ tab[0] = ;
+ tab[1] = ;
+ tab[2] = ;
+ tab[3] = ;
+ tab[4] = ;
+
+ return (
+ <>
+
+ setTabIndex(0)}
+ >
+ Main Menu
+
+ setTabIndex(1)}
+ >
+ Message Logs
+
+ setTabIndex(2)}
+ >
+ Request Logs
+
+ setTabIndex(3)}
+ >
+ Admin Messaging
+
+ setTabIndex(4)}
+ >
+ Spam Filter
+
+ act('deauth')}>
+ Log Out
+
+
+ {tab[tabIndex]}
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorHack.tsx b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorHack.tsx
new file mode 100644
index 0000000000..6e76a83eec
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorHack.tsx
@@ -0,0 +1,93 @@
+import { useBackend } from '../../backend';
+import { Box } from '../../components';
+import { FullscreenNotice } from '../common/FullscreenNotice';
+import { Data } from './types';
+
+export const MessageMonitorHack = (props) => {
+ const { data } = useBackend();
+
+ const { isMalfAI } = data;
+
+ return (
+
+ {isMalfAI ? (
+
+ Brute-forcing for server key. It will take 20 seconds for every
+ character that the password has.
+
+ ) : (
+
+ 01000010011100100111010101110100011001010010110
+
+ 10110011001101111011100100110001101101001011011100110011
+
+ 10010000001100110011011110111001000100000011100110110010
+
+ 10111001001110110011001010111001000100000011010110110010
+
+ 10111100100101110001000000100100101110100001000000111011
+
+ 10110100101101100011011000010000001110100011000010110101
+
+ 10110010100100000001100100011000000100000011100110110010
+
+ 10110001101101111011011100110010001110011001000000110011
+
+ 00110111101110010001000000110010101110110011001010111001
+
+ 00111100100100000011000110110100001100001011100100110000
+
+ 10110001101110100011001010111001000100000011101000110100
+
+ 00110000101110100001000000111010001101000011001010010000
+
+ 00111000001100001011100110111001101110111011011110111001
+
+ 00110010000100000011010000110000101110011001011100010000
+
+ 00100100101101110001000000111010001101000011001010010000
+
+ 00110110101100101011000010110111001110100011010010110110
+
+ 10110010100101100001000000111010001101000011010010111001
+
+ 10010000001100011011011110110111001110011011011110110110
+
+ 00110010100100000011000110110000101101110001000000111001
+
+ 00110010101110110011001010110000101101100001000000111100
+
+ 10110111101110101011100100010000001110100011100100111010
+
+ 10110010100100000011010010110111001110100011001010110111
+
+ 00111010001101001011011110110111001110011001000000110100
+
+ 10110011000100000011110010110111101110101001000000110110
+
+ 00110010101110100001000000111001101101111011011010110010
+
+ 10110111101101110011001010010000001100001011000110110001
+
+ 10110010101110011011100110010000001101001011101000010111
+
+ 00010000001001101011000010110101101100101001000000111001
+
+ 10111010101110010011001010010000001101110011011110010000
+
+ 00110100001110101011011010110000101101110011100110010000
+
+ 00110010101101110011101000110010101110010001000000111010
+
+ 00110100001100101001000000111001001101111011011110110110
+
+ 10010000001100100011101010111001001101001011011100110011
+
+ 10010000001110100011010000110000101110100001000000111010
+
+ 001101001011011010110010100101110
+
+ )}
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorLogin.tsx b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorLogin.tsx
new file mode 100644
index 0000000000..39e09203a7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorLogin.tsx
@@ -0,0 +1,40 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Icon, Input } from '../../components';
+import { FullscreenNotice } from '../common/FullscreenNotice';
+import { Data } from './types';
+
+export const MessageMonitorLogin = (props) => {
+ const { act, data } = useBackend();
+
+ const { isMalfAI } = data;
+
+ return (
+
+
+
+ Unauthorized
+
+
+ Decryption Key:
+ act('auth', { key: val })}
+ />
+
+ {!!isMalfAI && (
+ act('hack')}>
+ Hack
+
+ )}
+
+ Please authenticate with the server in order to show additional options.
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorTabs.tsx b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorTabs.tsx
new file mode 100644
index 0000000000..57cdd89c55
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MessageMonitor/MessageMonitorTabs.tsx
@@ -0,0 +1,230 @@
+import { BooleanLike } from 'common/react';
+import { decodeHtmlEntities } from 'common/string';
+
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Button,
+ Dropdown,
+ Flex,
+ Input,
+ LabeledList,
+ Section,
+} from '../../components';
+import { Data } from './types';
+
+export const MessageMonitorMain = (props) => {
+ const { act, data } = useBackend();
+
+ const { linkedServer } = data;
+
+ return (
+
+ act('find')}>
+ Server Link
+
+ act('active')}
+ >
+ {'Server ' + (linkedServer.active ? 'Enabled' : 'Disabled')}
+
+ >
+ }
+ >
+
+
+ Good
+
+
+ act('pass')}>
+ Set Custom Key
+
+
+ Clear Message Logs
+
+
+ Clear Request Logs
+
+
+ );
+};
+
+export const MessageMonitorLogs = (props: {
+ logs: {
+ ref: string;
+ sender: string;
+ recipient: string;
+ message: string;
+ stamp?: string;
+ id_auth?: string;
+ priority?: string;
+ }[];
+ pda?: BooleanLike;
+ rc?: BooleanLike;
+}) => {
+ const { act } = useBackend();
+
+ const { logs, pda, rc } = props;
+
+ return (
+ act(pda ? 'del_pda' : 'del_rc')}
+ >
+ Delete All
+
+ }
+ >
+
+ {logs.map((log, i) => (
+
+ ' + log.recipient}
+ buttons={
+
+ act('delete', {
+ id: log.ref,
+ type: rc ? 'rc' : 'pda',
+ })
+ }
+ />
+ }
+ >
+ {rc ? (
+
+
+ {log.message}
+
+
+ {decodeHtmlEntities(log.id_auth)}
+
+ {log.stamp}
+
+ ) : (
+ log.message
+ )}
+
+
+ ))}
+
+
+ );
+};
+
+export const MessageMonitorAdmin = (props) => {
+ const { act, data } = useBackend();
+
+ const {
+ possibleRecipients,
+ customsender,
+ customrecepient,
+ customjob,
+ custommessage,
+ } = data;
+
+ const recipientOptions = Object.keys(possibleRecipients);
+
+ return (
+
+ );
+};
+
+export const MessageMonitorSpamFilter = (props) => {
+ const { act, data } = useBackend();
+
+ const { linkedServer } = data;
+
+ return (
+
+
+ {linkedServer.spamFilter.map((spam) => (
+ act('deltoken', { deltoken: spam.index })}
+ >
+ Delete
+
+ }
+ >
+ {spam.token}
+
+ ))}
+
+ act('addtoken')}>
+ Add New Entry
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor/index.tsx b/tgui/packages/tgui/interfaces/MessageMonitor/index.tsx
new file mode 100644
index 0000000000..11b59c7c7b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MessageMonitor/index.tsx
@@ -0,0 +1,34 @@
+import { useBackend } from '../../backend';
+import { Box } from '../../components';
+import { Window } from '../../layouts';
+import { TemporaryNotice } from '../common/TemporaryNotice';
+import { MessageMonitorContent } from './MessageMonitorContent';
+import { MessageMonitorHack } from './MessageMonitorHack';
+import { MessageMonitorLogin } from './MessageMonitorLogin';
+import { Data } from './types';
+
+export const MessageMonitor = (props) => {
+ const { data } = useBackend();
+
+ const { auth, linkedServer, hacking, emag } = data;
+
+ let body: React.JSX.Element;
+ if (hacking || emag) {
+ body = ;
+ } else if (!auth) {
+ body = ;
+ } else if (linkedServer) {
+ body = ;
+ } else {
+ body = ERROR ;
+ }
+
+ return (
+
+
+
+ {body}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/MessageMonitor/types.ts b/tgui/packages/tgui/interfaces/MessageMonitor/types.ts
new file mode 100644
index 0000000000..9ec9d76c23
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/MessageMonitor/types.ts
@@ -0,0 +1,38 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ customsender: string;
+ customrecepient: string;
+ customjob: string;
+ custommessage: string;
+ temp: string | null;
+ hacking: BooleanLike;
+ emag: BooleanLike;
+ auth: BooleanLike;
+ linkedServer: {
+ active: BooleanLike;
+ broke: BooleanLike;
+ pda_msgs: pda_msgs[];
+ rc_msgs: rc_message[];
+ spamFilter: { index: number; token: string }[];
+ };
+ possibleRecipients: Record[];
+ isMalfAI: BooleanLike;
+};
+
+type pda_msgs = {
+ ref: string;
+ sender: string;
+ recipient: string;
+ message: string;
+};
+
+type rc_message = {
+ ref: string;
+ sender: string;
+ recipient: string;
+ message: string;
+ stamp: string;
+ id_auth: string;
+ priority: string;
+};
diff --git a/tgui/packages/tgui/interfaces/Microwave.jsx b/tgui/packages/tgui/interfaces/Microwave.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/Microwave.jsx
rename to tgui/packages/tgui/interfaces/Microwave.tsx
index 6b40c58074..e087adc9e9 100644
--- a/tgui/packages/tgui/interfaces/Microwave.jsx
+++ b/tgui/packages/tgui/interfaces/Microwave.tsx
@@ -1,9 +1,18 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ broken: BooleanLike;
+ operating: BooleanLike;
+ dirty: BooleanLike;
+ items: { name: string; amt: number; extra: string }[];
+};
+
export const Microwave = (props) => {
- const { act, config, data } = useBackend();
+ const { act, config, data } = useBackend();
const { broken, operating, dirty, items } = data;
@@ -35,7 +44,6 @@ export const Microwave = (props) => {
)) ||
(items.length && (
diff --git a/tgui/packages/tgui/interfaces/MiningOreProcessingConsole.jsx b/tgui/packages/tgui/interfaces/MiningOreProcessingConsole.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/MiningOreProcessingConsole.jsx
rename to tgui/packages/tgui/interfaces/MiningOreProcessingConsole.tsx
index c37d74c7cd..169e171f8d 100644
--- a/tgui/packages/tgui/interfaces/MiningOreProcessingConsole.jsx
+++ b/tgui/packages/tgui/interfaces/MiningOreProcessingConsole.tsx
@@ -1,3 +1,4 @@
+import { BooleanLike } from 'common/react';
import { toTitleCase } from 'common/string';
import { useBackend } from '../backend';
@@ -12,10 +13,23 @@ import {
import { Window } from '../layouts';
import { MiningUser } from './common/Mining';
-export const MiningOreProcessingConsole = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ unclaimedPoints: number;
+ ores: {
+ ore: string;
+ name: string;
+ amount: number;
+ processing: number;
+ }[];
+ showAllOres: BooleanLike;
+ power: BooleanLike;
+ speed: BooleanLike;
+};
- const { unclaimedPoints, ores, showAllOres, power, speed } = data;
+export const MiningOreProcessingConsole = (props) => {
+ const { act, data } = useBackend();
+
+ const { unclaimedPoints, power, speed } = data;
return (
@@ -113,8 +127,8 @@ const oreSorter = (a, b) => {
};
const MOPCOres = (props) => {
- const { act, data } = useBackend();
- const { ores, showAllOres, power } = data;
+ const { act, data } = useBackend();
+ const { ores, showAllOres } = data;
return (
{
(ore.processing === 0 && 'red') ||
(ore.processing === 1 && 'green') ||
(ore.processing === 2 && 'blue') ||
- (ore.processing === 3 && 'yellow')
+ (ore.processing === 3 && 'yellow') ||
+ undefined
}
options={processingOptions}
selected={processingOptions[ore.processing]}
diff --git a/tgui/packages/tgui/interfaces/MiningStackingConsole.jsx b/tgui/packages/tgui/interfaces/MiningStackingConsole.tsx
similarity index 92%
rename from tgui/packages/tgui/interfaces/MiningStackingConsole.jsx
rename to tgui/packages/tgui/interfaces/MiningStackingConsole.tsx
index 7db2960f4a..7a797473db 100644
--- a/tgui/packages/tgui/interfaces/MiningStackingConsole.jsx
+++ b/tgui/packages/tgui/interfaces/MiningStackingConsole.tsx
@@ -10,8 +10,13 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ stacktypes: { type: string; amt: number }[];
+ stackingAmt: number;
+};
+
export const MiningStackingConsole = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { stacktypes, stackingAmt } = data;
diff --git a/tgui/packages/tgui/interfaces/MiningVendor.jsx b/tgui/packages/tgui/interfaces/MiningVendor.tsx
similarity index 74%
rename from tgui/packages/tgui/interfaces/MiningVendor.jsx
rename to tgui/packages/tgui/interfaces/MiningVendor.tsx
index 151ed8a193..10502a73a7 100644
--- a/tgui/packages/tgui/interfaces/MiningVendor.jsx
+++ b/tgui/packages/tgui/interfaces/MiningVendor.tsx
@@ -14,10 +14,19 @@ import {
import { Window } from '../layouts';
import { MiningUser } from './common/Mining';
+type Data = {
+ has_id: boolean;
+ id: { id: string; points: number };
+ items: Record;
+};
+
+type sortable = { name: string; affordable: number; price: number };
+
const sortTypes = {
- Alphabetical: (a, b) => a.name > b.name,
- 'By availability': (a, b) => -(a.affordable - b.affordable),
- 'By price': (a, b) => a.price - b.price,
+ Alphabetical: (a: sortable, b: sortable) => a.name > b.name,
+ 'By availability': (a: sortable, b: sortable) =>
+ -(a.affordable - b.affordable),
+ 'By price': (a: sortable, b: sortable) => a.price - b.price,
};
export const MiningVendor = (props) => {
@@ -25,15 +34,15 @@ export const MiningVendor = (props) => {
const [sortOrder, setSortOrder] = useState('Alphabetical');
const [descending, setDescending] = useState(false);
- function handleSearchText(value) {
+ function handleSearchText(value: string) {
setSearchText(value);
}
- function handleSortOrder(value) {
+ function handleSortOrder(value: string) {
setSortOrder(value);
}
- function handleDescending(value) {
+ function handleDescending(value: boolean) {
setDescending(value);
}
@@ -53,20 +62,21 @@ export const MiningVendor = (props) => {
searchText={searchText}
sortOrder={sortOrder}
descending={descending}
- onSearchText={handleSearchText}
- onSortOrder={handleSortOrder}
- onDescending={handleDescending}
/>
);
};
-const MiningVendorItems = (props) => {
- const { act, data } = useBackend();
+const MiningVendorItems = (props: {
+ searchText: string;
+ sortOrder: string;
+ descending: boolean;
+}) => {
+ const { act, data } = useBackend();
const { has_id, id, items } = data;
// Search thingies
- const searcher = createSearch(props.searchText, (item) => {
+ const searcher = createSearch(props.searchText, (item: sortable) => {
return item[0];
});
@@ -75,7 +85,7 @@ const MiningVendorItems = (props) => {
let items_in_cat = Object.entries(kv[1])
.filter(searcher)
.map((kv2) => {
- kv2[1].affordable = has_id && id.points >= kv2[1].price;
+ kv2[1].affordable = +(has_id && id.points >= kv2[1].price);
return kv2[1];
})
.sort(sortTypes[props.sortOrder]);
@@ -108,20 +118,28 @@ const MiningVendorItems = (props) => {
);
};
-const MiningVendorSearch = (props) => {
+const MiningVendorSearch = (props: {
+ searchText: string;
+ sortOrder: string;
+ descending: boolean;
+ onSearchText: Function;
+ onSortOrder: Function;
+ onDescending: Function;
+}) => {
return (
props.onSearchText(value)}
/>
{
);
};
-const MiningVendorItemsCategory = (props) => {
- const { act, data } = useBackend();
+const MiningVendorItemsCategory = (props: {
+ key: string;
+ title: string;
+ items: sortable[];
+}) => {
+ const { act, data } = useBackend();
+
+ const { has_id, id } = data;
+
const { title, items, ...rest } = props;
return (
{items.map((item) => (
{
{item.name}
{
- const { act, data } = useBackend();
+ const { data } = useBackend();
- const [tabIndex, setTabIndex] = useState(0);
- const [radius, setRadius] = useState(0);
- const [forceUpdate, renderData] = useState();
- const [x, setX] = useState(data.initial_x);
- const [y, setY] = useState(data.initial_y);
- const [z, setZ] = useState(data.initial_z);
- const [sizeMultiplier, setSizeMultiplier] = useState(100);
- const [amount, setAmount] = useState(1);
+ const [tabIndex, setTabIndex] = useState(0);
+ const [radius, setRadius] = useState(0);
+ const [forceUpdate, renderData] = useState();
+ const [x, setX] = useState(data.initial_x);
+ const [y, setY] = useState(data.initial_y);
+ const [z, setZ] = useState(data.initial_z);
+ const [sizeMultiplier, setSizeMultiplier] = useState(100);
+ const [amount, setAmount] = useState(1);
- function handleHealth(value) {
+ function handleHealth(value: number) {
data.health = value;
renderData(value);
}
- function handleMaxHealth(value) {
+ function handleMaxHealth(value: number) {
data.max_health = value;
renderData(value);
}
- function handleMeleeDamageLower(value) {
+ function handleMeleeDamageLower(value: number) {
data.melee_damage_lower = value;
renderData(value);
}
- function handleMeleeDamageupper(value) {
+ function handleMeleeDamageupper(value: number) {
data.melee_damage_upper = value;
renderData(value);
}
- function handleName(value) {
+ function handleName(value: string) {
data.path_name = value;
renderData(value);
}
- function handleDesc(value) {
+ function handleDesc(value: string) {
data.desc = value;
renderData(value);
}
- function handleFlavor(value) {
+ function handleFlavor(value: string) {
data.flavor_text = value;
renderData(value);
}
- function handleRadius(value) {
+ function handleRadius(value: number) {
setRadius(value);
}
- function handleX(value) {
+ function handleX(value: number) {
setX(value);
}
- function handleY(value) {
+ function handleY(value: number) {
setY(value);
}
- function handleZ(value) {
+ function handleZ(value: number) {
setZ(value);
}
- function handleSizeMultiplier(value) {
+ function handleSizeMultiplier(value: number) {
setSizeMultiplier(value);
}
- function handleAmount(value) {
+ function handleAmount(value: number) {
setAmount(value);
}
- const tabs: any = [];
+ const tabs: React.JSX.Element[] = [];
tabs[0] = (
{
onHealth={handleHealth}
onMaxHealth={handleMaxHealth}
onMeleeDamageLower={handleMeleeDamageLower}
- onMeleeDamageupper={handleMeleeDamageupper}
+ onMeleeDamageUpper={handleMeleeDamageupper}
onName={handleName}
onDesc={handleDesc}
onFlavor={handleFlavor}
@@ -160,7 +160,27 @@ export const MobSpawner = (props) => {
);
};
-const GeneralMobSettings = (props) => {
+const GeneralMobSettings = (props: {
+ radius: number;
+ x: number;
+ y: number;
+ z: number;
+ sizeMultiplier: number;
+ amount: number;
+ onRadius: Function;
+ onHealth: Function;
+ onMaxHealth: Function;
+ onMeleeDamageLower: Function;
+ onMeleeDamageUpper: Function;
+ onName: Function;
+ onDesc: Function;
+ onFlavor: Function;
+ onX: Function;
+ onY: Function;
+ onZ: Function;
+ onSizeMultiplier: Function;
+ onAmount: Function;
+}) => {
const { act, data } = useBackend();
return (
<>
@@ -170,7 +190,7 @@ const GeneralMobSettings = (props) => {
props.onName(val)}
+ onChange={(e, val: string) => props.onName(val)}
/>
@@ -183,7 +203,7 @@ const GeneralMobSettings = (props) => {
value={props.amount}
minValue={0}
maxValue={256}
- onChange={(e, val) => props.onAmount(val)}
+ onChange={(e, val: number) => props.onAmount(val)}
/>
@@ -192,7 +212,7 @@ const GeneralMobSettings = (props) => {
minValue={50}
maxValue={200}
unit="%"
- onChange={(e, val) => props.onSizeMultiplier(val)}
+ onChange={(e, val: number) => props.onSizeMultiplier(val)}
/>
@@ -207,19 +227,19 @@ const GeneralMobSettings = (props) => {
value={data.loc_lock ? data.loc_x : props.x}
minValue={0}
maxValue={256}
- onChange={(e, val) => props.onX(val)}
+ onChange={(e, val: number) => props.onX(val)}
/>
props.onY(val)}
+ onChange={(e, val: number) => props.onY(val)}
/>
props.onZ(val)}
+ onChange={(e, val: number) => props.onZ(val)}
/>
{
disabled
minValue={0}
maxValue={256}
- onChange={(e, val) => props.onRadius(val)}
+ onChange={(e, val: number) => props.onRadius(val)}
/>
@@ -280,13 +300,13 @@ const GeneralMobSettings = (props) => {
props.onMaxHealth(val)}
+ onChange={(e, val: number) => props.onMaxHealth(val)}
/>
props.onHealth(val)}
+ onChange={(e, val: number) => props.onHealth(val)}
/>
@@ -298,13 +318,17 @@ const GeneralMobSettings = (props) => {
props.onMeleeDamageLower(val)}
+ onChange={(e, val: number) =>
+ props.onMeleeDamageLower(val)
+ }
/>
props.onMeleeDamageUpper(val)}
+ onChange={(e, val: number) =>
+ props.onMeleeDamageUpper(val)
+ }
/>
>
@@ -322,7 +346,7 @@ const GeneralMobSettings = (props) => {
@@ -332,7 +356,7 @@ const GeneralMobSettings = (props) => {
@@ -364,8 +388,6 @@ const GeneralMobSettings = (props) => {
};
const VoreMobSettings = (props) => {
- const { act, data } = useBackend();
-
return (
This Tab is still under construction!
diff --git a/tgui/packages/tgui/interfaces/NTNetRelay.jsx b/tgui/packages/tgui/interfaces/NTNetRelay.tsx
similarity index 84%
rename from tgui/packages/tgui/interfaces/NTNetRelay.jsx
rename to tgui/packages/tgui/interfaces/NTNetRelay.tsx
index f1ab3747ef..74400fa60c 100644
--- a/tgui/packages/tgui/interfaces/NTNetRelay.jsx
+++ b/tgui/packages/tgui/interfaces/NTNetRelay.tsx
@@ -1,14 +1,23 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, Icon, LabeledList, Section } from '../components';
import { Window } from '../layouts';
import { FullscreenNotice } from './common/FullscreenNotice';
+type Data = {
+ enabled: BooleanLike;
+ dos_capacity: number;
+ dos_overload: number;
+ dos_crashed: BooleanLike;
+};
+
export const NTNetRelay = (props) => {
- const { act, data } = useBackend();
+ const { data } = useBackend();
- const { dos_crashed, enabled, dos_overload, dos_capacity } = data;
+ const { dos_crashed } = data;
- let body = ;
+ let body: React.JSX.Element = ;
if (dos_crashed) {
body = ;
@@ -22,9 +31,9 @@ export const NTNetRelay = (props) => {
};
const NTNetRelayContent = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const { dos_crashed, enabled, dos_overload, dos_capacity } = data;
+ const { enabled, dos_overload, dos_capacity } = data;
return (
{
};
const NTNetRelayCrash = (props) => {
- const { act, data } = useBackend();
+ const { act } = useBackend();
return (
diff --git a/tgui/packages/tgui/interfaces/NtosAccessDecrypter.tsx b/tgui/packages/tgui/interfaces/NtosAccessDecrypter.tsx
index 1fbb9b7657..a6ccf8a55b 100644
--- a/tgui/packages/tgui/interfaces/NtosAccessDecrypter.tsx
+++ b/tgui/packages/tgui/interfaces/NtosAccessDecrypter.tsx
@@ -6,7 +6,7 @@ import { NtosWindow } from '../layouts';
import { IdentificationComputerRegions } from './IdentificationComputer';
type Data = {
- message: string;
+ message: string | null;
running: BooleanLike;
rate: number;
factor: number;
diff --git a/tgui/packages/tgui/interfaces/NtosArcade.jsx b/tgui/packages/tgui/interfaces/NtosArcade.tsx
similarity index 75%
rename from tgui/packages/tgui/interfaces/NtosArcade.jsx
rename to tgui/packages/tgui/interfaces/NtosArcade.tsx
index 1db4b7f428..99590e5ec2 100644
--- a/tgui/packages/tgui/interfaces/NtosArcade.jsx
+++ b/tgui/packages/tgui/interfaces/NtosArcade.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { resolveAsset } from '../assets';
import { useBackend } from '../backend';
import {
@@ -11,8 +13,31 @@ import {
} from '../components';
import { NtosWindow } from '../layouts';
+type Data = {
+ Hitpoints: number;
+ PlayerHitpoints: number;
+ PlayerMP: number;
+ TicketCount: number;
+ GameActive: BooleanLike;
+ PauseState: BooleanLike;
+ Status: string;
+ BossID: string;
+};
+
export const NtosArcade = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
+
+ const {
+ PlayerHitpoints,
+ PlayerMP,
+ PauseState,
+ Status,
+ Hitpoints,
+ BossID,
+ GameActive,
+ TicketCount,
+ } = data;
+
return (
@@ -25,7 +50,7 @@ export const NtosArcade = (props) => {
{
bad: [-Infinity, 10],
}}
>
- {data.PlayerHitpoints}HP
+ {PlayerHitpoints}HP
{
bad: [-Infinity, 3],
}}
>
- {data.PlayerMP}MP
+ {PlayerMP}MP
- {data.Status}
+ {Status}
{
bad: [-Infinity, 5],
}}
>
-
+
HP
-
+
@@ -88,7 +111,7 @@ export const NtosArcade = (props) => {
icon="fist-raised"
tooltip="Go in for the kill!"
tooltipPosition="top"
- disabled={data.GameActive === 0 || data.PauseState === 1}
+ disabled={GameActive === 0 || PauseState === 1}
onClick={() => act('Attack')}
>
Attack!
@@ -97,7 +120,7 @@ export const NtosArcade = (props) => {
icon="band-aid"
tooltip="Heal yourself!"
tooltipPosition="top"
- disabled={data.GameActive === 0 || data.PauseState === 1}
+ disabled={GameActive === 0 || PauseState === 1}
onClick={() => act('Heal')}
>
Heal!
@@ -106,7 +129,7 @@ export const NtosArcade = (props) => {
icon="magic"
tooltip="Recharge your magic!"
tooltipPosition="top"
- disabled={data.GameActive === 0 || data.PauseState === 1}
+ disabled={GameActive === 0 || PauseState === 1}
onClick={() => act('Recharge_Power')}
>
Recharge!
@@ -117,7 +140,7 @@ export const NtosArcade = (props) => {
icon="sync-alt"
tooltip="One more game couldn't hurt."
tooltipPosition="top"
- disabled={data.GameActive === 1}
+ disabled={GameActive === 1}
onClick={() => act('Start_Game')}
>
Begin Game
@@ -126,14 +149,14 @@ export const NtosArcade = (props) => {
icon="ticket-alt"
tooltip="Claim at your local Arcade Computer for Prizes!"
tooltipPosition="top"
- disabled={data.GameActive === 1}
+ disabled={GameActive === 1}
onClick={() => act('Dispense_Tickets')}
>
Claim Tickets
- = 1 ? 'good' : 'normal'}>
- Earned Tickets: {data.TicketCount}
+ = 1 ? 'good' : 'normal'}>
+ Earned Tickets: {TicketCount}
diff --git a/tgui/packages/tgui/interfaces/NtosCameraConsole.jsx b/tgui/packages/tgui/interfaces/NtosCameraConsole.tsx
similarity index 59%
rename from tgui/packages/tgui/interfaces/NtosCameraConsole.jsx
rename to tgui/packages/tgui/interfaces/NtosCameraConsole.tsx
index 5c299ac46e..b5ce8e7c6e 100644
--- a/tgui/packages/tgui/interfaces/NtosCameraConsole.jsx
+++ b/tgui/packages/tgui/interfaces/NtosCameraConsole.tsx
@@ -1,51 +1,19 @@
-import { filter, sortBy } from '../../common/collections';
-import { flow } from '../../common/fp';
-import { createSearch } from '../../common/string';
import { useBackend } from '../backend';
import { Button, ByondUi } from '../components';
import { NtosWindow } from '../layouts';
-import { CameraConsoleContent } from './CameraConsole';
-
-/**
- * Returns previous and next camera names relative to the currently
- * active camera.
- */
-export const prevNextCamera = (cameras, activeCamera) => {
- if (!activeCamera) {
- return [];
- }
- const index = cameras.findIndex(
- (camera) => camera.name === activeCamera.name,
- );
- return [cameras[index - 1]?.name, cameras[index + 1]?.name];
-};
-
-/**
- * Camera selector.
- *
- * Filters cameras, applies search terms and sorts the alphabetically.
- */
-export const selectCameras = (cameras, searchText = '', networkFilter = '') => {
- const testSearch = createSearch(searchText, (camera) => camera.name);
- return flow([
- // Null camera filter
- filter((camera) => camera?.name),
- // Optional search term
- searchText && filter(testSearch),
- // Optional network filter
- networkFilter &&
- filter((camera) => camera.networks.includes(networkFilter)),
- // Slightly expensive, but way better than sorting in BYOND
- sortBy((camera) => camera.name),
- ])(cameras);
-};
+import {
+ CameraConsoleContent,
+ Data,
+ prevNextCamera,
+ selectCameras,
+} from './CameraConsole';
export const NtosCameraConsole = (props) => {
- const { act, data } = useBackend();
- const { mapRef, activeCamera } = data;
- const cameras = selectCameras(data.cameras);
+ const { act, data } = useBackend();
+ const { mapRef, activeCamera, cameras } = data;
+ const selected_cameras = selectCameras(cameras);
const [prevCameraName, nextCameraName] = prevNextCamera(
- cameras,
+ selected_cameras,
activeCamera,
);
return (
diff --git a/tgui/packages/tgui/interfaces/NtosCommunicationsConsole.tsx b/tgui/packages/tgui/interfaces/NtosCommunicationsConsole.tsx
index 05ee11cc00..46870cc808 100644
--- a/tgui/packages/tgui/interfaces/NtosCommunicationsConsole.tsx
+++ b/tgui/packages/tgui/interfaces/NtosCommunicationsConsole.tsx
@@ -1,5 +1,5 @@
import { NtosWindow } from '../layouts';
-import { CommunicationsConsoleContent } from './CommunicationsConsole';
+import { CommunicationsConsoleContent } from './CommunicationsConsole/CommunicationsConsoleContent';
export const NtosCommunicationsConsole = () => {
return (
diff --git a/tgui/packages/tgui/interfaces/NtosEmailClient.jsx b/tgui/packages/tgui/interfaces/NtosEmailClient.jsx
index 69f0b6e0d0..6ca82c3caf 100644
--- a/tgui/packages/tgui/interfaces/NtosEmailClient.jsx
+++ b/tgui/packages/tgui/interfaces/NtosEmailClient.jsx
@@ -1,5 +1,5 @@
/* eslint react/no-danger: "off" */
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -54,8 +54,12 @@ const NtosEmailClientDownloading = (props) => {
- {down_progress}/{down_size} (
- {round((down_progress / down_size) * 100, 1)}%)
+ {down_progress +
+ '/' +
+ down_size +
+ ' (' +
+ toFixed((down_progress / down_size) * 100, 1) +
+ '%)'}
diff --git a/tgui/packages/tgui/interfaces/NtosNetDownloader.jsx b/tgui/packages/tgui/interfaces/NtosNetDownloader.jsx
index 3df287ca21..632029c0b8 100644
--- a/tgui/packages/tgui/interfaces/NtosNetDownloader.jsx
+++ b/tgui/packages/tgui/interfaces/NtosNetDownloader.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -94,8 +94,8 @@ const Program = (props) => {
maxValue={downloadsize}
value={downloadcompletion}
>
- {round((downloadcompletion / downloadsize) * 100, 1)}% (
- {downloadspeed}GQ/s)
+ {toFixed((downloadcompletion / downloadsize) * 100, 1)}%
+ {'(' + downloadspeed + 'GQ/s)'}
)) ||
(downloads_queue.indexOf(program.filename) !== -1 && (
diff --git a/tgui/packages/tgui/interfaces/OperatingComputer.jsx b/tgui/packages/tgui/interfaces/OperatingComputer.jsx
index 43100bad48..2271d65f90 100644
--- a/tgui/packages/tgui/interfaces/OperatingComputer.jsx
+++ b/tgui/packages/tgui/interfaces/OperatingComputer.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -112,7 +112,7 @@ const OperatingComputerPatient = (props) => {
value={occupant[d[1]] / 100}
ranges={damageRange}
>
- {round(occupant[d[1]])}
+ {toFixed(occupant[d[1]])}
))}
@@ -123,7 +123,8 @@ const OperatingComputerPatient = (props) => {
value={occupant.bodyTemperature / occupant.maxTemp}
color={tempColors[occupant.temperatureSuitability + 3]}
>
- {round(occupant.btCelsius)}°C, {round(occupant.btFaren)}°F
+ {toFixed(occupant.btCelsius)}°C, {toFixed(occupant.btFaren)}
+ °F
{!!occupant.hasBlood && (
diff --git a/tgui/packages/tgui/interfaces/Pda.jsx b/tgui/packages/tgui/interfaces/Pda.jsx
index be5f73fa4d..180bdc8be4 100644
--- a/tgui/packages/tgui/interfaces/Pda.jsx
+++ b/tgui/packages/tgui/interfaces/Pda.jsx
@@ -6,12 +6,12 @@ import { Window } from '../layouts';
/* This is all basically stolen from routes.js. */
import { routingError } from '../routes';
-const requirePdaInterface = require.context('./pda', false, /\.jsx$/);
+const requirePdaInterface = require.context('./pda', false, /\.tsx$/);
const getPdaApp = (name) => {
let appModule;
try {
- appModule = requirePdaInterface(`./${name}.jsx`);
+ appModule = requirePdaInterface(`./${name}.tsx`);
} catch (err) {
if (err.code === 'MODULE_NOT_FOUND') {
return routingError('notFound', name);
diff --git a/tgui/packages/tgui/interfaces/PipeDispenser.jsx b/tgui/packages/tgui/interfaces/PipeDispenser.tsx
similarity index 83%
rename from tgui/packages/tgui/interfaces/PipeDispenser.jsx
rename to tgui/packages/tgui/interfaces/PipeDispenser.tsx
index 0ed7e6f956..7553fecf70 100644
--- a/tgui/packages/tgui/interfaces/PipeDispenser.jsx
+++ b/tgui/packages/tgui/interfaces/PipeDispenser.tsx
@@ -1,3 +1,4 @@
+import { BooleanLike } from 'common/react';
import { useState } from 'react';
import { useBackend } from '../backend';
@@ -5,8 +6,24 @@ import { Box, Button, Section, Tabs } from '../components';
import { Window } from '../layouts';
import { ICON_BY_CATEGORY_NAME } from './RapidPipeDispenser';
+type Data = {
+ disposals: BooleanLike;
+ p_layer: number;
+ pipe_layers: {
+ Regular: number;
+ Supply: number;
+ Scrubber: number;
+ Fuel: number;
+ Aux: number;
+ }[];
+ categories: {
+ cat_name: string;
+ recipes: { pipe_name: string; ref: string; bent: BooleanLike }[];
+ }[];
+};
+
export const PipeDispenser = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { disposals, p_layer, pipe_layers, categories = [] } = data;
const [categoryName, setCategoryName] = useState('categoryName');
@@ -38,9 +55,8 @@ export const PipeDispenser = (props) => {
)}
- {categories.map((category, i) => (
+ {categories.map((category) => (
{
key={recipe.pipe_name}
fluid
ellipsis
- title={recipe.pipe_name}
onClick={() =>
act('dispense_pipe', {
ref: recipe.ref,
diff --git a/tgui/packages/tgui/interfaces/PlantAnalyzer.jsx b/tgui/packages/tgui/interfaces/PlantAnalyzer.tsx
similarity index 76%
rename from tgui/packages/tgui/interfaces/PlantAnalyzer.jsx
rename to tgui/packages/tgui/interfaces/PlantAnalyzer.tsx
index 3c9cb2254b..228dcb832d 100644
--- a/tgui/packages/tgui/interfaces/PlantAnalyzer.jsx
+++ b/tgui/packages/tgui/interfaces/PlantAnalyzer.tsx
@@ -1,17 +1,36 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ no_seed: BooleanLike;
+ seed: {
+ name: string;
+ uid: number;
+ endurance: string;
+ yield: string;
+ maturation_time: string;
+ production_time: string;
+ potency: string;
+ trait_info: string[];
+ };
+ reagents: { name: string; volume: number }[];
+};
+
export const PlantAnalyzer = (props) => {
- const { data } = useBackend();
+ const { data } = useBackend();
+
+ const { seed, reagents } = data;
let calculatedHeight = 250;
- if (data.seed) {
- calculatedHeight += 18 * data.seed.trait_info.length;
+ if (seed) {
+ calculatedHeight += 18 * seed.trait_info.length;
}
- if (data.reagents && data.reagents.length) {
+ if (reagents && reagents.length) {
calculatedHeight += 55;
- calculatedHeight += 20 * data.reagents.length;
+ calculatedHeight += 20 * reagents.length;
}
// Resizable just in case the calculatedHeight fails
@@ -25,7 +44,7 @@ export const PlantAnalyzer = (props) => {
};
const PlantAnalyzerContent = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { no_seed, seed, reagents } = data;
@@ -68,7 +87,7 @@ const PlantAnalyzerContent = (props) => {
{seed.potency}
{(reagents.length && (
-
+
{reagents.map((r) => (
@@ -79,7 +98,7 @@ const PlantAnalyzerContent = (props) => {
)) ||
null}
-
+
{seed.trait_info.map((trait) => (
{trait}
diff --git a/tgui/packages/tgui/interfaces/PointDefenseControl.tsx b/tgui/packages/tgui/interfaces/PointDefenseControl.tsx
index 654fd6dfd0..a8c052b73b 100644
--- a/tgui/packages/tgui/interfaces/PointDefenseControl.tsx
+++ b/tgui/packages/tgui/interfaces/PointDefenseControl.tsx
@@ -10,9 +10,9 @@ type Data = {
id: string;
active: BooleanLike;
ref: string;
- effective_range;
- reaction_wheel_delay;
- recharge_time;
+ effective_range: string;
+ reaction_wheel_delay: string;
+ recharge_time: string;
}[];
};
diff --git a/tgui/packages/tgui/interfaces/PortableGenerator.jsx b/tgui/packages/tgui/interfaces/PortableGenerator.tsx
similarity index 54%
rename from tgui/packages/tgui/interfaces/PortableGenerator.jsx
rename to tgui/packages/tgui/interfaces/PortableGenerator.tsx
index fcd46b1589..ddb1455d89 100644
--- a/tgui/packages/tgui/interfaces/PortableGenerator.jsx
+++ b/tgui/packages/tgui/interfaces/PortableGenerator.tsx
@@ -1,4 +1,5 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
+import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import {
@@ -11,37 +12,74 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ fuel_stored: number;
+ fuel_capacity: number;
+ anchored: BooleanLike;
+ active: BooleanLike;
+ ready_to_boot: BooleanLike;
+ sheet_name: string;
+ fuel_usage: number;
+ temperature_current: number;
+ temperature_max: number;
+ temperature_overheat: number;
+ unsafe_output: BooleanLike;
+ power_output: number;
+ power_generated: number;
+ connected: BooleanLike;
+ power_available: number;
+};
+
export const PortableGenerator = (props) => {
- const { act, data } = useBackend();
- const stack_percent = data.fuel_stored / data.fuel_capacity;
- const stackPercentState =
+ const { act, data } = useBackend();
+
+ const {
+ fuel_stored,
+ fuel_capacity,
+ anchored,
+ active,
+ ready_to_boot,
+ sheet_name,
+ fuel_usage,
+ temperature_current,
+ temperature_max,
+ temperature_overheat,
+ unsafe_output,
+ power_output,
+ power_generated,
+ connected,
+ power_available,
+ } = data;
+
+ const stack_percent: number = fuel_stored / fuel_capacity;
+ const stackPercentState: string =
(stack_percent >= 0.5 && 'good') ||
(stack_percent > 0.15 && 'average') ||
'bad';
return (
- {!data.anchored && Generator not anchored. }
+ {!anchored && Generator not anchored. }
act('toggle_power')}
- selected={data.active}
- disabled={!data.ready_to_boot}
+ selected={active}
+ disabled={!ready_to_boot}
>
- {data.active ? 'On' : 'Off'}
+ {active ? 'On' : 'Off'}
= 1 && (
+ fuel_stored >= 1 && (
act('eject')}
>
Eject
@@ -50,31 +88,31 @@ export const PortableGenerator = (props) => {
}
>
- {data.fuel_stored}cm³ {data.sheet_name}
+ {fuel_stored}cm³ {sheet_name}
- {data.fuel_stored}cm³ / {data.fuel_capacity}cm³
+ {fuel_stored}cm³ / {fuel_capacity}cm³
- {data.fuel_usage} cm³/s
+ {fuel_usage} cm³/s
- {round(data.temperature_current)}°C
+ {toFixed(temperature_current)}°C
@@ -83,21 +121,21 @@ export const PortableGenerator = (props) => {
- {data.power_output}
+ {power_output}
act('lower_power')}>
- {data.power_generated}
+ {power_generated}
act('higher_power')}>
- {data.power_generated}
+ {power_generated}
-
- {data.connected ? data.power_available : 'Unconnected'}
+
+ {connected ? power_available : 'Unconnected'}
diff --git a/tgui/packages/tgui/interfaces/PortablePump.jsx b/tgui/packages/tgui/interfaces/PortablePump.tsx
similarity index 90%
rename from tgui/packages/tgui/interfaces/PortablePump.jsx
rename to tgui/packages/tgui/interfaces/PortablePump.tsx
index 23145a5bcf..824d2a6ff3 100644
--- a/tgui/packages/tgui/interfaces/PortablePump.jsx
+++ b/tgui/packages/tgui/interfaces/PortablePump.tsx
@@ -1,10 +1,20 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, Section, Slider } from '../components';
import { Window } from '../layouts';
import { PortableBasicInfo } from './common/PortableAtmos';
+type Data = {
+ direction: BooleanLike;
+ target_pressure: number;
+ default_pressure: number;
+ min_pressure: number;
+ max_pressure: number;
+};
+
export const PortablePump = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
direction,
target_pressure,
diff --git a/tgui/packages/tgui/interfaces/PortableTurret.jsx b/tgui/packages/tgui/interfaces/PortableTurret.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/PortableTurret.jsx
rename to tgui/packages/tgui/interfaces/PortableTurret.tsx
index 4c020c49ae..df2d9766b7 100644
--- a/tgui/packages/tgui/interfaces/PortableTurret.jsx
+++ b/tgui/packages/tgui/interfaces/PortableTurret.tsx
@@ -1,9 +1,27 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, NoticeBox, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ locked: BooleanLike;
+ on: BooleanLike;
+ lethal: BooleanLike;
+ lethal_is_configurable: BooleanLike;
+ targetting_is_configurable: BooleanLike;
+ check_weapons: BooleanLike;
+ neutralize_noaccess: BooleanLike;
+ neutralize_norecord: BooleanLike;
+ neutralize_criminals: BooleanLike;
+ neutralize_all: BooleanLike;
+ neutralize_nonsynth: BooleanLike;
+ neutralize_unidentified: BooleanLike;
+ neutralize_down: BooleanLike;
+};
+
export const PortableTurret = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
locked,
on,
diff --git a/tgui/packages/tgui/interfaces/RCON.jsx b/tgui/packages/tgui/interfaces/RCON.jsx
index f38974d0a8..e598f6f753 100644
--- a/tgui/packages/tgui/interfaces/RCON.jsx
+++ b/tgui/packages/tgui/interfaces/RCON.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { capitalize } from 'common/string';
import { useState } from 'react';
@@ -141,8 +141,12 @@ const SMESItem = (props) => {
bad: [-Infinity, 0.15],
}}
>
- {round(charge / (1000 * 60), 1)} kWh /{' '}
- {round(capacity / (1000 * 60))} kWh ({capacityPercent}%)
+ {toFixed(charge / (1000 * 60), 1) +
+ 'kWh / ' +
+ toFixed(capacity / (1000 * 60)) +
+ 'kWh (' +
+ capacityPercent +
+ '%)'}
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole.jsx b/tgui/packages/tgui/interfaces/ResearchConsole.jsx
deleted file mode 100644
index 719d8b6d13..0000000000
--- a/tgui/packages/tgui/interfaces/ResearchConsole.jsx
+++ /dev/null
@@ -1,921 +0,0 @@
-import { toTitleCase } from 'common/string';
-import { Fragment, useEffect, useState } from 'react';
-
-import { useBackend, useSharedState } from '../backend';
-import {
- Box,
- Button,
- Divider,
- Flex,
- Icon,
- Input,
- LabeledList,
- NumberInput,
- ProgressBar,
- Section,
- Table,
- Tabs,
-} from '../components';
-import { Window } from '../layouts';
-
-const ResearchConsoleViewResearch = (props) => {
- const { act, data } = useBackend();
-
- const { tech } = data;
-
- return (
- act('print', { print: 1 })}>
- Print This Page
-
- }
- >
-
- {tech.map((thing) => (
-
-
- {thing.name}
- - Level {thing.level}
-
-
- {thing.desc}
-
-
- ))}
-
-
- );
-};
-
-const PaginationTitle = (props) => {
- const { data } = useBackend();
-
- const { title, target } = props;
-
- let page = data[target];
- if (typeof page === 'number') {
- return title + ' - Page ' + (page + 1);
- }
-
- return title;
-};
-
-const PaginationChevrons = (props) => {
- const { act } = useBackend();
-
- const { target } = props;
-
- return (
- <>
- act(target, { reset: true })} />
- act(target, { reverse: -1 })}
- />
- act(target, { reverse: 1 })}
- />
- >
- );
-};
-
-const ResearchConsoleViewDesigns = (props) => {
- const { act, data } = useBackend();
-
- const { designs } = data;
-
- return (
-
- }
- buttons={
- <>
- act('print', { print: 2 })}>
- Print This Page
-
- { || null}
- >
- }
- >
- act('search', { search: v })}
- mb={1}
- />
- {(designs && designs.length && (
-
- {designs.map((design) => (
-
- {design.desc}
-
- ))}
-
- )) || No designs found. }
-
- );
-};
-
-const TechDisk = (props) => {
- const { act, data } = useBackend();
-
- const { tech } = data;
-
- const { disk } = props;
-
- if (!disk || !disk.present) {
- return null;
- }
-
- if (props.saveDialog) {
- return (
- props.onSaveDialog(false)}>
- Back
-
- }
- >
-
- {tech.map((level) => (
-
- {
- props.onSaveDialog(false);
- act('copy_tech', { copy_tech_ID: level.id });
- }}
- >
- Copy To Disk
-
-
- ))}
-
-
- );
- }
-
- return (
-
-
-
- (Technology Data Disk)
-
-
- {(disk.stored && (
-
- {disk.name}
- Level: {disk.level}
- Description: {disk.desc}
-
- act('updt_tech')}>
- Upload to Database
-
- act('clear_tech')}>
- Clear Disk
-
- act('eject_tech')}>
- Eject Disk
-
-
-
- )) || (
-
- This disk has no data stored on it.
- props.onSaveDialog(true)}>
- Load Tech To Disk
-
- act('eject_tech')}>
- Eject Disk
-
-
- )}
-
- );
-};
-
-const DataDisk = (props) => {
- const { act, data } = useBackend();
-
- const { designs } = data;
-
- const { disk } = props;
-
- if (!disk || !disk.present) {
- return null;
- }
-
- if (props.saveDialog) {
- return (
-
- }
- buttons={
- <>
- props.onSaveDialog(false)}>
- Back
-
- { || null}
- >
- }
- >
- act('search', { search: v })}
- mb={1}
- />
- {(designs && designs.length && (
-
- {designs.map((item) => (
-
- {
- props.onSaveDialog(false);
- act('copy_design', { copy_design_ID: item.id });
- }}
- >
- Copy To Disk
-
-
- ))}
-
- )) || No designs found. }
-
- );
- }
-
- return (
-
- {(disk.stored && (
-
-
- {disk.name}
-
- {disk.build_type}
-
-
- {Object.keys(disk.materials).map((mat) => (
-
- {mat} x {disk.materials[mat]}
-
- ))}
-
-
-
- act('updt_design')}>
- Upload to Database
-
- act('clear_design')}>
- Clear Disk
-
- act('eject_design')}>
- Eject Disk
-
-
-
- )) || (
-
- This disk has no data stored on it.
- props.onSaveDialog(true)}>
- Load Design To Disk
-
- act('eject_design')}>
- Eject Disk
-
-
- )}
-
- );
-};
-
-const ResearchConsoleDisk = (props) => {
- const { act, data } = useBackend();
-
- const { d_disk, t_disk } = data.info;
-
- if (!d_disk.present && !t_disk.present) {
- return ;
- }
-
- return (
-
- );
-};
-
-const ResearchConsoleDestructiveAnalyzer = (props) => {
- const { act, data } = useBackend();
-
- const { linked_destroy } = data.info;
-
- if (!linked_destroy.present) {
- return (
-
- No destructive analyzer found.
-
- );
- }
-
- const { loaded_item, origin_tech } = linked_destroy;
-
- return (
-
- {(loaded_item && (
-
-
- {loaded_item}
-
-
- {(origin_tech.length &&
- origin_tech.map((tech) => (
-
- {tech.level}
- {tech.current && '(Current: ' + tech.current + ')'}
-
- ))) || (
-
- No origin tech found.
-
- )}
-
-
-
- act('deconstruct')}
- >
- Deconstruct Item
-
- act('eject_item')}>
- Eject Item
-
-
- )) || No Item Loaded. Standing-by... }
-
- );
-};
-
-const ResearchConsoleBuildMenu = (props) => {
- const { act, data } = useBackend();
-
- const { target, designs, buildName, buildFiveName } = props;
-
- if (!target) {
- return Error ;
- }
-
- return (
- }
- buttons={ }
- >
- act('search', { search: v })}
- mb={1}
- />
- {designs && designs.length ? (
- designs.map((design) => (
-
-
-
- {design.name}
-
-
-
- act(buildName, { build: design.id, imprint: design.id })
- }
- >
- Build
-
- {buildFiveName && (
-
- act(buildFiveName, {
- build: design.id,
- imprint: design.id,
- })
- }
- >
- x5
-
- )}
-
-
-
- {design.mat_list.join(' ')}
-
-
- {design.chem_list.join(' ')}
-
-
-
-
-
- ))
- ) : (
-
- No items could be found matching the parameters (page or search).
-
- )}
-
- );
-};
-
-/* Lathe + Circuit Imprinter all in one */
-const ResearchConsoleConstructor = (props) => {
- const { act, data } = useBackend();
-
- const { name } = props;
-
- let linked = null;
- let designs = null;
-
- if (name === 'Protolathe') {
- linked = data.info.linked_lathe;
- designs = data.lathe_designs;
- } else {
- linked = data.info.linked_imprinter;
- designs = data.imprinter_designs;
- }
-
- if (!linked || !linked.present) {
- return ;
- }
-
- const {
- total_materials,
- max_materials,
- total_volume,
- max_volume,
- busy,
- mats,
- reagents,
- queue,
- } = linked;
-
- let queueColor = 'transparent';
- let queueSpin = false;
- let queueIcon = 'layer-group';
- if (busy) {
- queueIcon = 'hammer';
- queueColor = 'average';
- queueSpin = true;
- } else if (queue && queue.length) {
- queueIcon = 'sync';
- queueColor = 'green';
- queueSpin = true;
- }
-
- // Proto vs Circuit differences
- let removeQueueAction = name === 'Protolathe' ? 'removeP' : 'removeI';
- let ejectSheetAction =
- name === 'Protolathe' ? 'lathe_ejectsheet' : 'imprinter_ejectsheet';
- let ejectChemAction = name === 'Protolathe' ? 'disposeP' : 'disposeI';
- let ejectAllChemAction =
- name === 'Protolathe' ? 'disposeallP' : 'disposeallI';
-
- return (
- ) || null}>
-
-
-
- {total_materials} cm³ / {max_materials} cm³
-
-
-
-
- {total_volume}u / {max_volume}u
-
-
-
-
- props.onProtoTab(0)}
- >
- Build
-
- props.onProtoTab(1)}
- >
- Queue
-
- props.onProtoTab(2)}
- >
- Mat Storage
-
- props.onProtoTab(3)}
- >
- Chem Storage
-
-
- {(props.protoTab === 0 && (
-
- )) ||
- (props.protoTab === 1 && (
-
- {(queue.length &&
- queue.map((item, index) => {
- if (item.index === 1) {
- return (
-
- {!busy ? (
-
- (Awaiting Materials)
-
- act(removeQueueAction, {
- [removeQueueAction]: item.index,
- })
- }
- >
- Remove
-
-
- ) : (
-
- Remove
-
- )}
-
- );
- }
- return (
-
-
- act(removeQueueAction, {
- [removeQueueAction]: item.index,
- })
- }
- >
- Remove
-
-
- );
- })) || Queue Empty. }
-
- )) ||
- (props.protoTab === 2 && (
-
- {mats.map((mat) => {
- return (
-
-
- props.onMatsState({
- ...props.matsStates,
- [mat.name]: val,
- })
- }
- />
- {
- props.onMatsState({
- ...props.matsStates,
- [mat.name]: 0,
- });
- act(ejectSheetAction, {
- [ejectSheetAction]: mat.name,
- amount: props.matsStates[mat.name] || 0,
- });
- }}
- >
- Num
-
-
- act(ejectSheetAction, {
- [ejectSheetAction]: mat.name,
- amount: 50,
- })
- }
- >
- All
-
- >
- }
- >
- {mat.amount} cm³
-
- );
- })}
-
- )) ||
- (props.protoTab === 3 && (
-
-
- {(reagents.length &&
- reagents.map((chem) => (
-
- {chem.volume}u
- act(ejectChemAction, { dispose: chem.id })}
- >
- Purge
-
-
- ))) || (
-
- No chems detected
-
- )}
-
- act(ejectAllChemAction)}>
- Disposal All Chemicals In Storage
-
-
- )) || Error }
-
- );
-};
-
-const ResearchConsoleSettings = (props) => {
- const { act, data } = useBackend();
-
- const { is_public, sync, linked_destroy, linked_imprinter, linked_lathe } =
- data.info;
-
- return (
-
-
- props.onSettingsTab(0)}
- selected={props.settingsTab === 0}
- >
- General
-
- props.onSettingsTab(1)}
- selected={props.settingsTab === 1}
- >
- Device Linkages
-
-
- {(props.settingsTab === 0 && (
-
- {!is_public &&
- ((sync && (
- <>
- act('sync')}>
- Sync Database with Network
-
- act('togglesync')}>
- Disconnect from Research Network
-
- >
- )) || (
- act('togglesync')}>
- Connect to Research Network
-
- ))}
- act('lock')}>
- Lock Console
-
- act('reset')}>
- Reset R&D Database
-
-
- )) ||
- (props.settingsTab === 1 && (
-
- act('find_device')}>
- Re-sync with Nearby Devices
-
-
- {(linked_destroy.present && (
-
- act('disconnect', { disconnect: 'destroy' })}
- >
- Disconnect
-
-
- )) ||
- null}
- {(linked_lathe.present && (
-
- act('disconnect', { disconnect: 'lathe' })}
- >
- Disconnect
-
-
- )) ||
- null}
- {(linked_imprinter.present && (
-
-
- act('disconnect', { disconnect: 'imprinter' })
- }
- >
- Disconnect
-
-
- )) ||
- null}
-
-
- )) || Error }
-
- );
-};
-
-const menus = [
- {
- name: 'Protolathe',
- icon: 'wrench',
- },
- {
- name: 'Circuit Imprinter',
- icon: 'digital-tachograph',
- },
- {
- name: 'Destructive Analyzer',
- icon: 'eraser',
- },
- {
- name: 'Settings',
- icon: 'cog',
- },
- {
- name: 'Research List',
- icon: 'flask',
- },
- {
- name: 'Design List',
- icon: 'file',
- },
- { name: 'Disk Operations', icon: 'save' },
-];
-
-export const ResearchConsole = (props) => {
- const { act, data } = useBackend();
-
- const { busy_msg, locked } = data;
-
- const [menu, setMenu] = useSharedState('rdmenu', 0);
- const [protoTab, setProtoTab] = useSharedState('protoTab', 0);
- const [settingsTab, setSettingsTab] = useSharedState('settingsTab', 0);
- const [saveDialogTech, setSaveDialogTech] = useSharedState(
- 'saveDialogTech',
- false,
- );
- const [saveDialogDesign, setSaveDialogDesign] = useSharedState(
- 'saveDialogData',
- false,
- );
-
- const [matsStates, setMatsState] = useState({});
-
- useEffect(() => {
- setMatsState({});
- }, [menu]);
-
- let allTabsDisabled = false;
- if (busy_msg || locked) {
- allTabsDisabled = true;
- }
-
- return (
-
-
-
- {menus.map((obj, i) => (
- setMenu(i)}
- >
- {obj.name}
-
- ))}
-
- {(busy_msg && ) ||
- (locked && (
-
- act('lock')} icon="lock-open">
- Unlock
-
-
- )) ||
- (menu === 0 ? (
-
- ) : (
- ''
- )) ||
- (menu === 1 && (
-
- )) ||
- (menu === 2 && (
-
- )) ||
- (menu === 3 && (
-
- )) ||
- (menu === 4 && ) ||
- (menu === 5 && ) ||
- (menu === 6 && (
-
- ))}
-
-
- );
-};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleBuildMenu.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleBuildMenu.tsx
new file mode 100644
index 0000000000..6a670814f4
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleBuildMenu.tsx
@@ -0,0 +1,99 @@
+import { Fragment } from 'react';
+
+import { useBackend } from '../../backend';
+import { Box, Button, Divider, Flex, Input, Section } from '../../components';
+import { paginationTitle } from './constants';
+import { Data, design } from './types';
+
+export const ResearchConsoleBuildMenu = (props) => {
+ const { act, data } = useBackend();
+
+ const { target, designs, buildName, buildFiveName } = props;
+
+ if (!target) {
+ return Error ;
+ }
+
+ return (
+ }
+ >
+ act('search', { search: v })}
+ mb={1}
+ />
+ {designs && designs.length ? (
+ designs.map((design: design) => (
+
+
+
+ {design.name}
+
+
+
+ act(buildName, { build: design.id, imprint: design.id })
+ }
+ >
+ Build
+
+ {buildFiveName && (
+
+ act(buildFiveName, {
+ build: design.id,
+ imprint: design.id,
+ })
+ }
+ >
+ x5
+
+ )}
+
+
+
+ {design.mat_list.join(' ')}
+
+
+ {design.chem_list.join(' ')}
+
+
+
+
+
+ ))
+ ) : (
+
+ No items could be found matching the parameters (page or search).
+
+ )}
+
+ );
+};
+
+export const PaginationChevrons = (props: { target: string }) => {
+ const { act } = useBackend();
+
+ const { target } = props;
+
+ return (
+ <>
+ act(target, { reset: true })} />
+ act(target, { reverse: -1 })}
+ />
+ act(target, { reverse: 1 })}
+ />
+ >
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleConstructor.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleConstructor.tsx
new file mode 100644
index 0000000000..fee9a2fcfb
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleConstructor.tsx
@@ -0,0 +1,139 @@
+import { useBackend } from '../../backend';
+import {
+ Box,
+ Icon,
+ LabeledList,
+ ProgressBar,
+ Section,
+ Tabs,
+} from '../../components';
+import {
+ ResearchConsoleConstructorChems,
+ ResearchConsoleConstructorMats,
+ ResearchConsoleConstructorMenue,
+ ResearchConsoleConstructorQueue,
+} from './ResearchConsoleConstructorTabs';
+import { Data, design, mat, modularDevice } from './types';
+
+/* Lathe + Circuit Imprinter all in one */
+export const ResearchConsoleConstructor = (props: {
+ name: string;
+ linked: modularDevice;
+ designs: design[];
+ protoTab: number;
+ matsStates: mat[];
+ onProtoTab: Function;
+ onMatsState: Function;
+}) => {
+ const { act, data } = useBackend();
+
+ const {
+ name,
+ matsStates,
+ onMatsState,
+ protoTab,
+ onProtoTab,
+ linked,
+ designs,
+ } = props;
+
+ if (!linked || !linked.present) {
+ return ;
+ }
+
+ const {
+ total_materials,
+ max_materials,
+ total_volume,
+ max_volume,
+ busy,
+ mats,
+ reagents,
+ queue,
+ } = linked;
+
+ let queueColor: string = 'transparent';
+ let queueSpin: boolean = false;
+ let queueIcon: string = 'layer-group';
+ if (busy) {
+ queueIcon = 'hammer';
+ queueColor = 'average';
+ queueSpin = true;
+ } else if (queue && queue.length) {
+ queueIcon = 'sync';
+ queueColor = 'green';
+ queueSpin = true;
+ }
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[0] = (
+
+ );
+ tab[1] = (
+
+ );
+ tab[2] = (
+
+ );
+ tab[3] = ;
+
+ return (
+ ) || null}>
+
+
+
+ {total_materials} cm³ / {max_materials} cm³
+
+
+
+
+ {total_volume}u / {max_volume}u
+
+
+
+
+ onProtoTab(0)}
+ >
+ Build
+
+ onProtoTab(1)}
+ >
+ Queue
+
+ onProtoTab(2)}
+ >
+ Mat Storage
+
+ onProtoTab(3)}
+ >
+ Chem Storage
+
+
+ {tab[protoTab] || Error }
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleConstructorTabs.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleConstructorTabs.tsx
new file mode 100644
index 0000000000..d39fac8ca2
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleConstructorTabs.tsx
@@ -0,0 +1,201 @@
+import { BooleanLike } from 'common/react';
+import { toTitleCase } from 'common/string';
+
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, NumberInput } from '../../components';
+import { ResearchConsoleBuildMenu } from './ResearchConsoleBuildMenu';
+import { Data, design, mat, modularDevice, reagent } from './types';
+
+export const ResearchConsoleConstructorMenue = (props: {
+ name: string;
+ linked: modularDevice;
+ designs: design[];
+}) => {
+ const { name, linked, designs } = props;
+
+ return (
+
+ );
+};
+
+export const ResearchConsoleConstructorQueue = (props: {
+ name: string;
+ busy: BooleanLike;
+ queue: { name: string; index: number }[];
+}) => {
+ const { act } = useBackend();
+
+ const { queue, name, busy } = props;
+
+ const removeQueueAction: string =
+ name === 'Protolathe' ? 'removeP' : 'removeI';
+ return (
+
+ {(queue.length &&
+ queue.map((item, index) => {
+ if (item.index === 1) {
+ return (
+
+ {!busy ? (
+
+ (Awaiting Materials)
+
+ act(removeQueueAction, {
+ [removeQueueAction]: item.index,
+ })
+ }
+ >
+ Remove
+
+
+ ) : (
+
+ Remove
+
+ )}
+
+ );
+ }
+ return (
+
+
+ act(removeQueueAction, {
+ [removeQueueAction]: item.index,
+ })
+ }
+ >
+ Remove
+
+
+ );
+ })) || Queue Empty. }
+
+ );
+};
+
+export const ResearchConsoleConstructorMats = (props: {
+ name: string;
+ mats: mat[];
+ matsStates: mat[];
+ onMatsState: Function;
+}) => {
+ const { act } = useBackend();
+
+ const { name, mats } = props;
+
+ const ejectSheetAction: string =
+ name === 'Protolathe' ? 'lathe_ejectsheet' : 'imprinter_ejectsheet';
+
+ return (
+
+ {mats.map((mat) => {
+ return (
+
+
+ props.onMatsState({
+ ...props.matsStates,
+ [mat.name]: val,
+ })
+ }
+ />
+ {
+ props.onMatsState({
+ ...props.matsStates,
+ [mat.name]: 0,
+ });
+ act(ejectSheetAction, {
+ [ejectSheetAction]: mat.name,
+ amount: props.matsStates[mat.name] || 0,
+ });
+ }}
+ >
+ Num
+
+
+ act(ejectSheetAction, {
+ [ejectSheetAction]: mat.name,
+ amount: 50,
+ })
+ }
+ >
+ All
+
+ >
+ }
+ >
+ {mat.amount} cm³
+
+ );
+ })}
+
+ );
+};
+
+export const ResearchConsoleConstructorChems = (props: {
+ name: string;
+ reagents: reagent[];
+}) => {
+ const { act } = useBackend();
+
+ const { name, reagents } = props;
+
+ const ejectChemAction: string =
+ name === 'Protolathe' ? 'disposeP' : 'disposeI';
+ const ejectAllChemAction: string =
+ name === 'Protolathe' ? 'disposeallP' : 'disposeallI';
+ return (
+
+
+ {(reagents.length &&
+ reagents.map((chem) => (
+
+ {chem.volume}u
+ act(ejectChemAction, { dispose: chem.id })}
+ >
+ Purge
+
+
+ ))) || (
+ No chems detected
+ )}
+
+ act(ejectAllChemAction)}
+ >
+ Disposal All Chemicals In Storage
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleDestructiveAnalyzer.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleDestructiveAnalyzer.tsx
new file mode 100644
index 0000000000..4d77a554e2
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleDestructiveAnalyzer.tsx
@@ -0,0 +1,56 @@
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, Section } from '../../components';
+import { Data, destroyer } from './types';
+
+export const ResearchConsoleDestructiveAnalyzer = (props: {
+ name: string;
+ linked_destroy: destroyer;
+}) => {
+ const { act, data } = useBackend();
+
+ const { linked_destroy, name } = props;
+
+ if (!linked_destroy.present) {
+ return No destructive analyzer found. ;
+ }
+
+ const { loaded_item, origin_tech } = linked_destroy;
+
+ return (
+
+ {(loaded_item && (
+
+
+ {loaded_item}
+
+
+ {(origin_tech.length &&
+ origin_tech.map((tech) => (
+
+ {tech.level}
+ {tech.current && '(Current: ' + tech.current + ')'}
+
+ ))) || (
+
+ No origin tech found.
+
+ )}
+
+
+
+ act('deconstruct')}
+ >
+ Deconstruct Item
+
+ act('eject_item')}>
+ Eject Item
+
+
+ )) || No Item Loaded. Standing-by... }
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleDisk.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleDisk.tsx
new file mode 100644
index 0000000000..10652d7add
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleDisk.tsx
@@ -0,0 +1,217 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Input, LabeledList, Section } from '../../components';
+import { paginationTitle } from './constants';
+import { PaginationChevrons } from './ResearchConsoleBuildMenu';
+import { d_disk, Data, t_disk } from './types';
+
+export const TechDisk = (props) => {
+ const { act, data } = useBackend();
+
+ const { tech } = data;
+
+ const { disk, saveDialog, onSaveDialog } = props;
+
+ if (!disk || !disk.present) {
+ return null;
+ }
+
+ if (saveDialog) {
+ return (
+ onSaveDialog(false)}>
+ Back
+
+ }
+ >
+
+ {tech.map((level) => (
+
+ {
+ onSaveDialog(false);
+ act('copy_tech', { copy_tech_ID: level.id });
+ }}
+ >
+ Copy To Disk
+
+
+ ))}
+
+
+ );
+ }
+
+ return (
+
+
+
+ (Technology Data Disk)
+
+
+ {(disk.stored && (
+
+ {disk.name}
+ Level: {disk.level}
+ Description: {disk.desc}
+
+ act('updt_tech')}>
+ Upload to Database
+
+ act('clear_tech')}>
+ Clear Disk
+
+ act('eject_tech')}>
+ Eject Disk
+
+
+
+ )) || (
+
+ This disk has no data stored on it.
+ onSaveDialog(true)}>
+ Load Tech To Disk
+
+ act('eject_tech')}>
+ Eject Disk
+
+
+ )}
+
+ );
+};
+
+const DataDisk = (props) => {
+ const { act, data } = useBackend();
+
+ const { designs } = data;
+
+ const { disk, saveDialog, onSaveDialog } = props;
+
+ if (!disk || !disk.present) {
+ return null;
+ }
+
+ if (saveDialog) {
+ return (
+
+ );
+ }
+
+ return (
+
+ {(disk.stored && (
+
+
+ {disk.name}
+
+ {disk.build_type}
+
+
+ {Object.keys(disk.materials).map((mat) => (
+
+ {mat} x {disk.materials[mat]}
+
+ ))}
+
+
+
+ act('updt_design')}>
+ Upload to Database
+
+ act('clear_design')}>
+ Clear Disk
+
+ act('eject_design')}>
+ Eject Disk
+
+
+
+ )) || (
+
+ This disk has no data stored on it.
+ onSaveDialog(true)}>
+ Load Design To Disk
+
+ act('eject_design')}>
+ Eject Disk
+
+
+ )}
+
+ );
+};
+
+export const ResearchConsoleDisk = (props: {
+ saveDialogTech: boolean;
+ saveDialogDesign: boolean;
+ onSaveDialogTech: Function;
+ onSaveDialogDesign: Function;
+ d_disk: d_disk;
+ t_disk: t_disk;
+}) => {
+ const { d_disk, t_disk } = props;
+
+ const {
+ saveDialogTech,
+ onSaveDialogTech,
+ saveDialogDesign,
+ onSaveDialogDesign,
+ } = props;
+
+ if (!d_disk.present && !t_disk.present) {
+ return ;
+ }
+
+ return (
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleSettings.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleSettings.tsx
new file mode 100644
index 0000000000..2452070760
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleSettings.tsx
@@ -0,0 +1,139 @@
+import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../../backend';
+import { Box, Button, LabeledList, Section, Tabs } from '../../components';
+import { Data, destroyer, info, modularDevice } from './types';
+
+export const ResearchConsoleSettings = (props: {
+ info: info;
+ settingsTab: number;
+ onSettingsTab: Function;
+}) => {
+ const { data } = useBackend();
+
+ const { settingsTab, onSettingsTab, info } = props;
+
+ const { is_public, sync, linked_destroy, linked_imprinter, linked_lathe } =
+ info;
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[0] = ;
+ tab[1] = (
+
+ );
+
+ return (
+
+
+ onSettingsTab(0)}
+ selected={settingsTab === 0}
+ >
+ General
+
+ onSettingsTab(1)}
+ selected={settingsTab === 1}
+ >
+ Device Linkages
+
+
+ {tab[settingsTab] || Error }
+
+ );
+};
+
+const ResearchConsoleSettingsSync = (props: {
+ is_public: BooleanLike;
+ sync: BooleanLike;
+}) => {
+ const { act } = useBackend();
+
+ const { sync, is_public } = props;
+
+ return (
+
+ {!is_public &&
+ ((sync && (
+ <>
+ act('sync')}>
+ Sync Database with Network
+
+ act('togglesync')}>
+ Disconnect from Research Network
+
+ >
+ )) || (
+ act('togglesync')}>
+ Connect to Research Network
+
+ ))}
+ act('lock')}>
+ Lock Console
+
+ act('reset')}>
+ Reset R&D Database
+
+
+ );
+};
+
+const ResearchConsoleSettingsLink = (props: {
+ linked_destroy: destroyer;
+ linked_lathe: modularDevice;
+ linked_imprinter: modularDevice;
+}) => {
+ const { act } = useBackend();
+
+ const { linked_destroy, linked_lathe, linked_imprinter } = props;
+
+ return (
+
+ act('find_device')}>
+ Re-sync with Nearby Devices
+
+
+ {(linked_destroy.present && (
+
+ act('disconnect', { disconnect: 'destroy' })}
+ >
+ Disconnect
+
+
+ )) ||
+ null}
+ {(linked_lathe.present && (
+
+ act('disconnect', { disconnect: 'lathe' })}
+ >
+ Disconnect
+
+
+ )) ||
+ null}
+ {(linked_imprinter.present && (
+
+ act('disconnect', { disconnect: 'imprinter' })}
+ >
+ Disconnect
+
+
+ )) ||
+ null}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleViewDesigns.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleViewDesigns.tsx
new file mode 100644
index 0000000000..2c9b8a87c8
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleViewDesigns.tsx
@@ -0,0 +1,45 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Input, LabeledList, Section } from '../../components';
+import { paginationTitle } from './constants';
+import { PaginationChevrons } from './ResearchConsoleBuildMenu';
+import { Data } from './types';
+
+export const ResearchConsoleViewDesigns = (props) => {
+ const { act, data } = useBackend();
+
+ const { designs } = data;
+
+ return (
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleViewResearch.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleViewResearch.tsx
new file mode 100644
index 0000000000..c115721480
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/ResearchConsoleViewResearch.tsx
@@ -0,0 +1,34 @@
+import { useBackend } from '../../backend';
+import { Box, Button, Section, Table } from '../../components';
+import { Data } from './types';
+
+export const ResearchConsoleViewResearch = (props) => {
+ const { act, data } = useBackend();
+
+ const { tech } = data;
+
+ return (
+ act('print', { print: 1 })}>
+ Print This Page
+
+ }
+ >
+
+ {tech.map((thing) => (
+
+
+ {thing.name}
+ - Level {thing.level}
+
+
+ {thing.desc}
+
+
+ ))}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/constants.ts b/tgui/packages/tgui/interfaces/ResearchConsole/constants.ts
new file mode 100644
index 0000000000..15fb7a2eb7
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/constants.ts
@@ -0,0 +1,37 @@
+import { menue } from './types';
+
+export const menus: menue = [
+ {
+ name: 'Protolathe',
+ icon: 'wrench',
+ },
+ {
+ name: 'Circuit Imprinter',
+ icon: 'digital-tachograph',
+ },
+ {
+ name: 'Destructive Analyzer',
+ icon: 'eraser',
+ },
+ {
+ name: 'Settings',
+ icon: 'cog',
+ },
+ {
+ name: 'Research List',
+ icon: 'flask',
+ },
+ {
+ name: 'Design List',
+ icon: 'file',
+ },
+ { name: 'Disk Operations', icon: 'save' },
+];
+
+export function paginationTitle(title: string, page: number) {
+ if (typeof page === 'number') {
+ return title + ' - Page ' + (page + 1);
+ }
+
+ return title;
+}
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/index.tsx b/tgui/packages/tgui/interfaces/ResearchConsole/index.tsx
new file mode 100644
index 0000000000..af16487a36
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/index.tsx
@@ -0,0 +1,129 @@
+import { useEffect, useState } from 'react';
+
+import { useBackend, useSharedState } from '../../backend';
+import { Box, Button, Section, Tabs } from '../../components';
+import { Window } from '../../layouts';
+import { menus } from './constants';
+import { ResearchConsoleConstructor } from './ResearchConsoleConstructor';
+import { ResearchConsoleDestructiveAnalyzer } from './ResearchConsoleDestructiveAnalyzer';
+import { ResearchConsoleDisk } from './ResearchConsoleDisk';
+import { ResearchConsoleSettings } from './ResearchConsoleSettings';
+import { ResearchConsoleViewDesigns } from './ResearchConsoleViewDesigns';
+import { ResearchConsoleViewResearch } from './ResearchConsoleViewResearch';
+import { Data, mat } from './types';
+
+export const ResearchConsole = (props) => {
+ const { act, data } = useBackend();
+
+ const { busy_msg, locked, info, imprinter_designs, lathe_designs } = data;
+
+ const [menu, setMenu] = useSharedState('rdmenu', 0);
+ const [protoTab, setProtoTab] = useSharedState('protoTab', 0);
+ const [settingsTab, setSettingsTab] = useSharedState(
+ 'settingsTab',
+ 0,
+ );
+ const [saveDialogTech, setSaveDialogTech] = useSharedState(
+ 'saveDialogTech',
+ false,
+ );
+ const [saveDialogDesign, setSaveDialogDesign] = useSharedState(
+ 'saveDialogData',
+ false,
+ );
+
+ const [matsStates, setMatsState] = useState({} as mat[]);
+
+ useEffect(() => {
+ setMatsState({} as mat[]);
+ }, [menu]);
+
+ let allTabsDisabled = false;
+ if (busy_msg || locked) {
+ allTabsDisabled = true;
+ }
+
+ const tab: React.JSX.Element[] = [];
+
+ tab[0] = (info && (
+
+ )) || ;
+
+ tab[1] = (info && (
+
+ )) || ;
+
+ tab[2] = (info && (
+
+ )) || ;
+
+ tab[3] = (info && (
+
+ )) || ;
+
+ tab[4] = ;
+
+ tab[5] = ;
+
+ tab[6] = (info && (
+
+ )) || ;
+
+ return (
+
+
+
+ {menus.map((obj, i) => (
+ setMenu(i)}
+ >
+ {obj.name}
+
+ ))}
+
+ {(busy_msg && ) ||
+ (locked && (
+
+ act('lock')} icon="lock-open">
+ Unlock
+
+
+ )) ||
+ tab[menu]}
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/ResearchConsole/types.ts b/tgui/packages/tgui/interfaces/ResearchConsole/types.ts
new file mode 100644
index 0000000000..4b4a6dc30f
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/ResearchConsole/types.ts
@@ -0,0 +1,76 @@
+import { BooleanLike } from 'common/react';
+
+export type Data = {
+ tech: { name: string; level: number; desc: string; id: string }[];
+ designs: { name: string; desc: string; id: string }[];
+ lathe_designs: design[];
+ imprinter_designs: design[];
+ locked: BooleanLike;
+ busy_msg: string | null;
+ search: string | null;
+ builder_page: number;
+ design_page: number;
+ info: info | null;
+};
+
+export type menue = { name: string; icon: string }[];
+
+export type destroyer = {
+ present: BooleanLike;
+ loaded_item: string | undefined;
+ origin_tech: { name: string; level: number; current: number | null }[];
+};
+
+export type modularDevice = {
+ present: BooleanLike;
+ total_materials: number;
+ max_materials: number;
+ total_volume: number;
+ max_volume: number;
+ busy: BooleanLike;
+ mats: mat[];
+ reagents: reagent[];
+ queue: { name: string; index: number }[];
+};
+
+export type design = {
+ name: string;
+ id: string;
+ mat_list: string[];
+ chem_list: string[];
+};
+
+export type mat = {
+ name: string;
+ amount: number;
+ sheets: number;
+ removable: BooleanLike;
+};
+
+export type reagent = { name: string; id: string; volume: number };
+
+export type info = {
+ sync: BooleanLike;
+ is_public: BooleanLike;
+ linked_destroy: destroyer;
+ linked_lathe: modularDevice;
+ linked_imprinter: modularDevice;
+ t_disk: t_disk;
+ d_disk: d_disk;
+};
+
+export type d_disk = {
+ present: BooleanLike;
+ stored: BooleanLike;
+ name: string | undefined;
+ build_type: number | undefined;
+ materials: Record[] | undefined;
+};
+
+export type t_disk = {
+ present: BooleanLike;
+ stored: BooleanLike;
+ name: string | undefined;
+ level: number | undefined;
+ desc: string | undefined;
+};
diff --git a/tgui/packages/tgui/interfaces/ResleevingConsole.jsx b/tgui/packages/tgui/interfaces/ResleevingConsole.jsx
index 7cc8380cf1..8cbdcacef1 100644
--- a/tgui/packages/tgui/interfaces/ResleevingConsole.jsx
+++ b/tgui/packages/tgui/interfaces/ResleevingConsole.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { resolveAsset } from '../assets';
import { useBackend } from '../backend';
@@ -323,7 +323,7 @@ const ResleevingConsolePodGrowers = (props) => {
}}
mt="0.5rem"
>
- {round(pod.progress, 0) + '%'}
+ {toFixed(pod.progress) + '%'}
);
} else if (pod.status === 'mess') {
@@ -443,7 +443,7 @@ const ResleevingConsolePodSpods = (props) => {
}}
mt="0.5rem"
>
- {round(pod.progress, 0) + '%'}
+ {toFixed(pod.progress) + '%'}
);
} else if (pod.status === 'mess') {
diff --git a/tgui/packages/tgui/interfaces/ShieldCapacitor.jsx b/tgui/packages/tgui/interfaces/ShieldCapacitor.jsx
index 611f1af487..16c0e53e82 100644
--- a/tgui/packages/tgui/interfaces/ShieldCapacitor.jsx
+++ b/tgui/packages/tgui/interfaces/ShieldCapacitor.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { round, toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -51,12 +51,11 @@ export const ShieldCapacitor = (props) => {
formatSiUnit(val, 0, 'J')}
- />{' '}
- (
+ />
' (' + toFixed(value, 1) + '%)'}
/>
- %)
{
)}
- {round(average_field_strength, 2)} Renwick (
- {(target_field_strength &&
- round(
- (100 * average_field_strength) / target_field_strength,
- 1,
- )) ||
- 'NA'}
- %)
+ {toFixed(average_field_strength, 2) +
+ ' Renwick (' +
+ (target_field_strength &&
+ toFixed(
+ (100 * average_field_strength) / target_field_strength,
+ 1,
+ ) + '%)') || 'NA)'}
{formatPower(upkeep)}
@@ -107,9 +106,13 @@ const ShieldGeneratorContent = (props) => {
)}
- {formatSiUnit(cap.stored_charge, 0, 'J')} (
- {100 * round(cap.stored_charge / cap.max_charge, 2)}
- %)
+ {formatSiUnit(cap.stored_charge, 0, 'J') +
+ ' (' +
+ toFixed(
+ 100 * (cap.stored_charge / cap.max_charge),
+ 2,
+ ) +
+ '%)'}
{cap.failing ? (
@@ -173,7 +176,7 @@ const ShieldGeneratorContent = (props) => {
step={0.1}
maxValue={max_strengthen_rate}
value={strengthen_rate}
- format={(val) => round(val, 1)}
+ format={(val) => toFixed(val, 1)}
unit="Renwick/s"
onDrag={(e, val) => act('strengthen_rate', { val: val })}
/>
diff --git a/tgui/packages/tgui/interfaces/Sleeper.jsx b/tgui/packages/tgui/interfaces/Sleeper.jsx
index 4ded4ee1ec..8a042ad78e 100644
--- a/tgui/packages/tgui/interfaces/Sleeper.jsx
+++ b/tgui/packages/tgui/interfaces/Sleeper.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -115,7 +115,7 @@ const SleeperOccupant = (props) => {
bad: [-Infinity, 0],
}}
>
- {round(occupant.health, 0)}
+ {toFixed(occupant.health)}
@@ -128,8 +128,8 @@ const SleeperOccupant = (props) => {
value={occupant.bodyTemperature / occupant.maxTemp}
color={tempColors[occupant.temperatureSuitability + 3]}
>
- {round(occupant.btCelsius, 0)}°C,
- {round(occupant.btFaren, 0)}°F
+ {toFixed(occupant.btCelsius)}°C,
+ {toFixed(occupant.btFaren)}°F
{!!occupant.hasBlood && (
@@ -173,7 +173,7 @@ const SleeperDamage = (props) => {
value={occupant[d[1]] / 100}
ranges={damageRange}
>
- {round(occupant[d[1]], 0)}
+ {toFixed(occupant[d[1]])}
))}
diff --git a/tgui/packages/tgui/interfaces/Smes.jsx b/tgui/packages/tgui/interfaces/Smes.jsx
index 093a0bc946..686e49a1c0 100644
--- a/tgui/packages/tgui/interfaces/Smes.jsx
+++ b/tgui/packages/tgui/interfaces/Smes.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -49,8 +49,12 @@ export const Smes = (props) => {
bad: [-Infinity, 0.15],
}}
>
- {round(charge / (1000 * 60), 1)} kWh /
- {round(capacity / (1000 * 60))} kWh ({capacityPercent}%)
+ {toFixed(charge / (1000 * 60), 1) +
+ ' kWh / ' +
+ toFixed(capacity / (1000 * 60)) +
+ ' kWh (' +
+ capacityPercent +
+ '%)'}
diff --git a/tgui/packages/tgui/interfaces/SolarControl.jsx b/tgui/packages/tgui/interfaces/SolarControl.jsx
index 22c3405a5b..54a7ce2c59 100644
--- a/tgui/packages/tgui/interfaces/SolarControl.jsx
+++ b/tgui/packages/tgui/interfaces/SolarControl.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import {
@@ -116,7 +116,7 @@ export const SolarControl = (props) => {
value={array_angle}
format={(rate) => {
const sign = Math.sign(rate) > 0 ? ' (CW)' : ' (CCW)';
- return Math.abs(round(rate)) + sign;
+ return toFixed(Math.abs(rate)) + sign;
}}
onDrag={(e, value) => act('azimuth', { value })}
/>
@@ -131,7 +131,7 @@ export const SolarControl = (props) => {
value={rotation_rate}
format={(rate) => {
const sign = Math.sign(rate) > 0 ? ' (CW)' : ' (CCW)';
- return Math.abs(round(rate)) + sign;
+ return toFixed(Math.abs(rate)) + sign;
}}
onDrag={(e, value) => act('azimuth_rate', { value })}
/>
diff --git a/tgui/packages/tgui/interfaces/SupermatterMonitor.jsx b/tgui/packages/tgui/interfaces/SupermatterMonitor.jsx
index 12bb05a511..61af33d3e2 100644
--- a/tgui/packages/tgui/interfaces/SupermatterMonitor.jsx
+++ b/tgui/packages/tgui/interfaces/SupermatterMonitor.jsx
@@ -1,4 +1,4 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { toTitleCase } from 'common/string';
import { useBackend } from '../backend';
@@ -122,7 +122,7 @@ const SupermatterMonitorActive = (props) => {
}
>
round(val, 2) + ' MeV/cm³'}
+ format={(val) => toFixed(val, 2) + ' MeV/cm³'}
value={SM_power}
/>
@@ -136,7 +136,7 @@ const SupermatterMonitorActive = (props) => {
}
>
round(val, 2) + ' K'}
+ format={(val) => toFixed(val, 2) + ' K'}
value={SM_ambienttemp}
/>
@@ -150,7 +150,7 @@ const SupermatterMonitorActive = (props) => {
}
>
round(val, 2) + ' kPa'}
+ format={(val) => toFixed(val, 2) + ' kPa'}
value={SM_ambientpressure}
/>
@@ -159,7 +159,7 @@ const SupermatterMonitorActive = (props) => {
4 && 'bad') || (SM_EPR > 1 && 'average') || 'good'}
>
- round(val, 2)} value={SM_EPR} />
+ toFixed(val, 2)} value={SM_EPR} />
diff --git a/tgui/packages/tgui/interfaces/TEGenerator.jsx b/tgui/packages/tgui/interfaces/TEGenerator.tsx
similarity index 79%
rename from tgui/packages/tgui/interfaces/TEGenerator.jsx
rename to tgui/packages/tgui/interfaces/TEGenerator.tsx
index 1212d4c5a9..983ec5e458 100644
--- a/tgui/packages/tgui/interfaces/TEGenerator.jsx
+++ b/tgui/packages/tgui/interfaces/TEGenerator.tsx
@@ -1,12 +1,30 @@
-import { round } from 'common/math';
+import { toFixed } from 'common/math';
import { useBackend } from '../backend';
import { Box, Flex, LabeledList, ProgressBar, Section } from '../components';
import { formatPower, formatSiUnit } from '../format';
import { Window } from '../layouts';
+type Data = {
+ totalOutput: number;
+ maxTotalOutput: number;
+ thermalOutput: number;
+ primary: circulator;
+ secondary: circulator;
+};
+
+type circulator = {
+ dir: string;
+ output: number;
+ flowCapacity: number;
+ inletPressure: number;
+ inletTemperature: number;
+ outletPressure: number;
+ outletTemperature: number;
+};
+
export const TEGenerator = (props) => {
- const { data } = useBackend();
+ const { data } = useBackend();
const { totalOutput, maxTotalOutput, thermalOutput, primary, secondary } =
data;
@@ -46,7 +64,7 @@ export const TEGenerator = (props) => {
);
};
-const TEGCirculator = (props) => {
+const TEGCirculator = (props: { name: string; values: circulator }) => {
const { name, values } = props;
const {
@@ -66,19 +84,19 @@ const TEGCirculator = (props) => {
{formatPower(output)}
- {round(flowCapacity, 2)}%
+ {toFixed(flowCapacity, 2)}%
{formatSiUnit(inletPressure * 1000, 0, 'Pa')}
- {round(inletTemperature, 2)} K
+ {toFixed(inletTemperature, 2)} K
{formatSiUnit(outletPressure * 1000, 0, 'Pa')}
- {round(outletTemperature, 2)} K
+ {toFixed(outletTemperature, 2)} K
diff --git a/tgui/packages/tgui/interfaces/Tank.jsx b/tgui/packages/tgui/interfaces/Tank.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/Tank.jsx
rename to tgui/packages/tgui/interfaces/Tank.tsx
index 2aabef35de..ba0bb7e159 100644
--- a/tgui/packages/tgui/interfaces/Tank.jsx
+++ b/tgui/packages/tgui/interfaces/Tank.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Button,
@@ -8,8 +10,19 @@ import {
} from '../components';
import { Window } from '../layouts';
+type Data = {
+ connected: BooleanLike;
+ showToggle: BooleanLike;
+ maskConnected: BooleanLike;
+ tankPressure: number;
+ releasePressure: number;
+ defaultReleasePressure: number;
+ minReleasePressure: number;
+ maxReleasePressure: number;
+};
+
export const Tank = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
connected,
@@ -72,7 +85,7 @@ export const Tank = (props) => {
/>
{
{server.totalTraffic >= 1024
- ? round(server.totalTraffic / 1024) + ' Terrabytes'
+ ? toFixed(server.totalTraffic / 1024) + ' Terrabytes'
: server.totalTraffic + ' Gigabytes'}
diff --git a/tgui/packages/tgui/interfaces/TraitTutorial.tsx b/tgui/packages/tgui/interfaces/TraitTutorial.tsx
index 5b05e98972..db82435351 100644
--- a/tgui/packages/tgui/interfaces/TraitTutorial.tsx
+++ b/tgui/packages/tgui/interfaces/TraitTutorial.tsx
@@ -6,9 +6,9 @@ import { Window } from '../layouts';
type data = {
namae: string;
names: string[];
- descriptions: { key: string; val: string }[];
- categories: { key: string; val: string }[];
- tutorials: { key: string; val: string }[];
+ descriptions: Record[];
+ categories: Record[];
+ tutorials: Record[];
selection: string;
};
diff --git a/tgui/packages/tgui/interfaces/TurbineControl.jsx b/tgui/packages/tgui/interfaces/TurbineControl.tsx
similarity index 90%
rename from tgui/packages/tgui/interfaces/TurbineControl.jsx
rename to tgui/packages/tgui/interfaces/TurbineControl.tsx
index 721c466429..1b47ed8505 100644
--- a/tgui/packages/tgui/interfaces/TurbineControl.jsx
+++ b/tgui/packages/tgui/interfaces/TurbineControl.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
@@ -9,11 +11,22 @@ import {
import { formatPower } from '../format';
import { Window } from '../layouts';
+type Data = {
+ connected: BooleanLike;
+ compressor_broke: BooleanLike;
+ turbine_broke: BooleanLike;
+ broken: BooleanLike;
+ door_status: BooleanLike;
+ online: BooleanLike;
+ power: number;
+ rpm: number;
+ temp: number;
+};
+
export const TurbineControl = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
- connected,
compressor_broke,
turbine_broke,
broken,
diff --git a/tgui/packages/tgui/interfaces/VorePanel.jsx b/tgui/packages/tgui/interfaces/VorePanel.jsx
index 6471013b1b..bd5106c600 100644
--- a/tgui/packages/tgui/interfaces/VorePanel.jsx
+++ b/tgui/packages/tgui/interfaces/VorePanel.jsx
@@ -342,6 +342,7 @@ const VoreSelectedBellyDescriptions = (props) => {
message_mode,
escapable,
interacts,
+ emote_active,
} = belly;
return (
@@ -448,10 +449,14 @@ const VoreSelectedBellyDescriptions = (props) => {
mode={mode}
/>
)}
-
+ {emote_active ? (
+
+ ) : (
+ ''
+ )}
{
belly_fullscreen_color_trinary,
mapRef,
colorization_enabled,
+ vore_sprite_flags,
+ affects_voresprite,
+ absorbed_voresprite,
+ absorbed_multiplier,
+ item_voresprite,
+ item_multiplier,
+ health_voresprite,
+ resist_animation,
+ voresprite_size_factor,
+ belly_sprite_option_shown,
+ belly_sprite_to_affect,
+ undergarment_chosen,
+ undergarment_if_none,
+ undergarment_color,
+ tail_option_shown,
+ tail_to_change_to,
+ tail_colouration,
+ tail_extra_overlay,
+ tail_extra_overlay2,
} = belly;
return (
<>
+
+
+
+
+
+ act('set_attribute', { attribute: 'b_affects_vore_sprites' })
+ }
+ icon={affects_voresprite ? 'toggle-on' : 'toggle-off'}
+ selected={affects_voresprite}
+ >
+ {affects_voresprite ? 'Yes' : 'No'}
+
+
+ {affects_voresprite ? (
+
+
+ {(vore_sprite_flags.length && vore_sprite_flags.join(', ')) ||
+ 'None'}
+
+ act('set_attribute', { attribute: 'b_vore_sprite_flags' })
+ }
+ ml={1}
+ icon="plus"
+ />
+
+
+
+ act('set_attribute', {
+ attribute: 'b_count_absorbed_prey_for_sprites',
+ })
+ }
+ icon={absorbed_voresprite ? 'toggle-on' : 'toggle-off'}
+ selected={absorbed_voresprite}
+ >
+ {absorbed_voresprite ? 'Yes' : 'No'}
+
+
+
+
+ act('set_attribute', {
+ attribute: 'b_absorbed_multiplier',
+ })
+ }
+ >
+ {absorbed_multiplier}
+
+
+
+
+ act('set_attribute', {
+ attribute: 'b_count_items_for_sprites',
+ })
+ }
+ icon={item_voresprite ? 'toggle-on' : 'toggle-off'}
+ selected={item_voresprite}
+ >
+ {item_voresprite ? 'Yes' : 'No'}
+
+
+
+
+ act('set_attribute', { attribute: 'b_item_multiplier' })
+ }
+ >
+ {item_multiplier}
+
+
+
+
+ act('set_attribute', {
+ attribute: 'b_health_impacts_size',
+ })
+ }
+ icon={health_voresprite ? 'toggle-on' : 'toggle-off'}
+ selected={health_voresprite}
+ >
+ {health_voresprite ? 'Yes' : 'No'}
+
+
+
+
+ act('set_attribute', { attribute: 'b_resist_animation' })
+ }
+ icon={resist_animation ? 'toggle-on' : 'toggle-off'}
+ selected={resist_animation}
+ >
+ {resist_animation ? 'Yes' : 'No'}
+
+
+
+
+ act('set_attribute', {
+ attribute: 'b_size_factor_sprites',
+ })
+ }
+ >
+ {voresprite_size_factor}
+
+
+ {belly_sprite_option_shown ? (
+
+
+ act('set_attribute', {
+ attribute: 'b_belly_sprite_to_affect',
+ })
+ }
+ >
+ {belly_sprite_to_affect}
+
+
+ ) : (
+ ''
+ )}
+ {tail_option_shown &&
+ vore_sprite_flags.includes('Undergarment addition') ? (
+
+
+
+ act('set_attribute', {
+ attribute: 'b_undergarment_choice',
+ })
+ }
+ >
+ {undergarment_chosen}
+
+
+
+
+ act('set_attribute', {
+ attribute: 'b_undergarment_if_none',
+ })
+ }
+ >
+ {undergarment_if_none}
+
+
+
+ ) : (
+ ''
+ )}
+ {tail_option_shown &&
+ vore_sprite_flags.includes('Tail adjustment') ? (
+
+
+ act('set_attribute', {
+ attribute: 'b_tail_to_change_to',
+ })
+ }
+ >
+ {tail_to_change_to}
+
+
+ ) : (
+ ''
+ )}
+
+ ) : (
+ ''
+ )}
+
+
+
{
+
+ act('set_vs_color')}>
+ Vore Sprite Color
+
+
diff --git a/tgui/packages/tgui/interfaces/Wires.jsx b/tgui/packages/tgui/interfaces/Wires.tsx
similarity index 86%
rename from tgui/packages/tgui/interfaces/Wires.jsx
rename to tgui/packages/tgui/interfaces/Wires.tsx
index c3e3fb2379..e197b96618 100644
--- a/tgui/packages/tgui/interfaces/Wires.jsx
+++ b/tgui/packages/tgui/interfaces/Wires.tsx
@@ -1,11 +1,25 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
-export const Wires = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ wires: {
+ seen_color: string;
+ color_name: string;
+ color: string;
+ wire: string | null;
+ cut: BooleanLike;
+ attached: BooleanLike;
+ }[];
+ status: string[];
+};
- const wires = data.wires || [];
+export const Wires = (props) => {
+ const { act, data } = useBackend();
+
+ const { wires = [] } = data;
const statuses = data.status || [];
return (
diff --git a/tgui/packages/tgui/interfaces/XenoarchArtifactHarvester.jsx b/tgui/packages/tgui/interfaces/XenoarchArtifactHarvester.tsx
similarity index 78%
rename from tgui/packages/tgui/interfaces/XenoarchArtifactHarvester.jsx
rename to tgui/packages/tgui/interfaces/XenoarchArtifactHarvester.tsx
index 4802fba6a7..521cd06816 100644
--- a/tgui/packages/tgui/interfaces/XenoarchArtifactHarvester.jsx
+++ b/tgui/packages/tgui/interfaces/XenoarchArtifactHarvester.tsx
@@ -1,9 +1,26 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
+type Data = {
+ info: {
+ no_scanner: BooleanLike;
+ harvesting: number;
+ inserted_battery: battery;
+ };
+};
+
+type battery = {
+ name: string;
+ stored_charge: number;
+ capacity: number;
+ artifact_id: string;
+};
+
export const XenoarchArtifactHarvester = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { no_scanner, harvesting, inserted_battery } = data.info;
@@ -19,7 +36,9 @@ export const XenoarchArtifactHarvester = (props) => {
Please wait. Harvesting in progress.
-
+
{
Please wait. Energy dump in progress.
-
+
{
{inserted_battery.name}
-
+
{inserted_battery.artifact_id}
@@ -82,10 +105,8 @@ export const XenoarchArtifactHarvester = (props) => {
);
};
-const ArtHarvestBatteryProgress = (props) => {
- const { act, data } = useBackend();
-
- const { inserted_battery } = data.info;
+const ArtHarvestBatteryProgress = (props: { inserted_battery: battery }) => {
+ const { inserted_battery } = props;
if (!Object.keys(inserted_battery).length) {
return No battery inserted. ;
diff --git a/tgui/packages/tgui/interfaces/XenoarchHandheldPowerUtilizer.tsx b/tgui/packages/tgui/interfaces/XenoarchHandheldPowerUtilizer.tsx
index 1ae54733da..597309ba05 100644
--- a/tgui/packages/tgui/interfaces/XenoarchHandheldPowerUtilizer.tsx
+++ b/tgui/packages/tgui/interfaces/XenoarchHandheldPowerUtilizer.tsx
@@ -13,13 +13,13 @@ import { Window } from '../layouts';
type Data = {
inserted_battery: BooleanLike;
- anomaly: string;
- charge: number;
- capacity: number;
- timeleft: number;
+ anomaly: string | null;
+ charge: number | null;
+ capacity: number | null;
+ timeleft: number | null;
activated: BooleanLike;
- duration: number;
- interval: number;
+ duration: number | null;
+ interval: number | null;
};
export const XenoarchHandheldPowerUtilizer = (props) => {
@@ -60,7 +60,7 @@ export const XenoarchHandheldPowerUtilizer = (props) => {
{anomaly || 'N/A'}
-
+
{charge} / {capacity}
@@ -80,7 +80,7 @@ export const XenoarchHandheldPowerUtilizer = (props) => {
value={duration}
stepPixelSize={4}
maxValue={30}
- onDrag={(e, val) =>
+ onDrag={(e, val: number) =>
act('changeduration', { duration: val * 10 })
}
/>
@@ -93,7 +93,7 @@ export const XenoarchHandheldPowerUtilizer = (props) => {
value={interval}
stepPixelSize={10}
maxValue={10}
- onDrag={(e, val) =>
+ onDrag={(e, val: number) =>
act('changeinterval', { interval: val * 10 })
}
/>
diff --git a/tgui/packages/tgui/interfaces/XenoarchReplicator.tsx b/tgui/packages/tgui/interfaces/XenoarchReplicator.tsx
index 5f8ad32a73..9d1dca8527 100644
--- a/tgui/packages/tgui/interfaces/XenoarchReplicator.tsx
+++ b/tgui/packages/tgui/interfaces/XenoarchReplicator.tsx
@@ -1,9 +1,10 @@
import { useBackend } from '../backend';
import { Button } from '../components';
import { Window } from '../layouts';
+import { tgui_construction } from './common/CommonTypes';
type Data = {
- tgui_construction: { key; background; icon; foreground }[];
+ tgui_construction: tgui_construction;
};
export const XenoarchReplicator = (props) => {
diff --git a/tgui/packages/tgui/interfaces/XenoarchReplicator_clothing_vr.jsx b/tgui/packages/tgui/interfaces/XenoarchReplicator_clothing_vr.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/XenoarchReplicator_clothing_vr.jsx
rename to tgui/packages/tgui/interfaces/XenoarchReplicator_clothing_vr.tsx
index 71d0322d08..cafaa0a326 100644
--- a/tgui/packages/tgui/interfaces/XenoarchReplicator_clothing_vr.jsx
+++ b/tgui/packages/tgui/interfaces/XenoarchReplicator_clothing_vr.tsx
@@ -1,9 +1,14 @@
import { useBackend } from '../backend';
import { Button } from '../components';
import { Window } from '../layouts';
+import { tgui_construction } from './common/CommonTypes';
+
+type Data = {
+ tgui_construction: tgui_construction;
+};
export const XenoarchReplicator_clothing_vr = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { tgui_construction } = data;
diff --git a/tgui/packages/tgui/interfaces/XenoarchReplicator_voremob_vr.jsx b/tgui/packages/tgui/interfaces/XenoarchReplicator_voremob_vr.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/XenoarchReplicator_voremob_vr.jsx
rename to tgui/packages/tgui/interfaces/XenoarchReplicator_voremob_vr.tsx
index c4572f05bd..3792f3cc46 100644
--- a/tgui/packages/tgui/interfaces/XenoarchReplicator_voremob_vr.jsx
+++ b/tgui/packages/tgui/interfaces/XenoarchReplicator_voremob_vr.tsx
@@ -1,9 +1,14 @@
import { useBackend } from '../backend';
import { Button } from '../components';
import { Window } from '../layouts';
+import { tgui_construction } from './common/CommonTypes';
+
+type Data = {
+ tgui_construction: tgui_construction;
+};
export const XenoarchReplicator_voremob_vr = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { tgui_construction } = data;
diff --git a/tgui/packages/tgui/interfaces/common/AtmosControls.jsx b/tgui/packages/tgui/interfaces/common/AtmosControls.tsx
similarity index 94%
rename from tgui/packages/tgui/interfaces/common/AtmosControls.jsx
rename to tgui/packages/tgui/interfaces/common/AtmosControls.tsx
index 7bae683d66..213269f9cf 100644
--- a/tgui/packages/tgui/interfaces/common/AtmosControls.jsx
+++ b/tgui/packages/tgui/interfaces/common/AtmosControls.tsx
@@ -2,8 +2,12 @@ import { decodeHtmlEntities } from 'common/string';
import { useBackend } from '../../backend';
import { Button, LabeledList, NumberInput, Section } from '../../components';
+import { single_scrubber, single_vent } from './CommonTypes';
-export const Vent = (props) => {
+type vent = { vent: single_vent };
+type scrubber = { scrubber: single_scrubber };
+
+export const Vent = (props: vent) => {
const { vent } = props;
const { act } = useBackend();
const {
@@ -21,7 +25,6 @@ export const Vent = (props) => {
} = vent;
return (
{
);
};
-export const Scrubber = (props) => {
+export const Scrubber = (props: scrubber) => {
const { scrubber } = props;
const { act } = useBackend();
- const { long_name, power, scrubbing, id_tag, widenet, filters } = scrubber;
+ const { long_name, power, scrubbing, id_tag, filters } = scrubber;
return (
{
act(filter.command, {
diff --git a/tgui/packages/tgui/interfaces/common/BeakerContents.jsx b/tgui/packages/tgui/interfaces/common/BeakerContents.tsx
similarity index 100%
rename from tgui/packages/tgui/interfaces/common/BeakerContents.jsx
rename to tgui/packages/tgui/interfaces/common/BeakerContents.tsx
diff --git a/tgui/packages/tgui/interfaces/common/CommonTypes.ts b/tgui/packages/tgui/interfaces/common/CommonTypes.ts
new file mode 100644
index 0000000000..841a987559
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/common/CommonTypes.ts
@@ -0,0 +1,39 @@
+import { BooleanLike } from 'common/react';
+
+export type single_vent = {
+ id_tag: string;
+ long_name: string;
+ power: BooleanLike;
+ checks: BooleanLike;
+ excheck: BooleanLike;
+ incheck: BooleanLike;
+ direction: string;
+ external: number;
+ internal: number;
+ extdefault: BooleanLike;
+ intdefault: BooleanLike;
+};
+
+export type single_scrubber = {
+ id_tag: string;
+ long_name: string;
+ power: BooleanLike;
+ scrubbing: BooleanLike;
+ panic: BooleanLike;
+ filters: { name: string; command: string; val: BooleanLike }[];
+};
+
+export type mat = {
+ name: string;
+ ref: string;
+ amount: number;
+ sheets: number;
+ removable: BooleanLike;
+};
+
+export type tgui_construction = {
+ key: string;
+ background: string;
+ icon: string;
+ foreground: string;
+}[];
diff --git a/tgui/packages/tgui/interfaces/common/ComplexModal.jsx b/tgui/packages/tgui/interfaces/common/ComplexModal.tsx
similarity index 60%
rename from tgui/packages/tgui/interfaces/common/ComplexModal.jsx
rename to tgui/packages/tgui/interfaces/common/ComplexModal.tsx
index c60cd1ce37..31931bdfb2 100644
--- a/tgui/packages/tgui/interfaces/common/ComplexModal.jsx
+++ b/tgui/packages/tgui/interfaces/common/ComplexModal.tsx
@@ -1,6 +1,9 @@
+import React from 'react';
+
import { useBackend } from '../../backend';
import { Box, Button, Dropdown, Flex, Input, Modal } from '../../components';
+type Data = { modal: { id: string; args: {}; text: string; type: string } };
let bodyOverrides = {};
/**
@@ -8,9 +11,12 @@ let bodyOverrides = {};
* @param {string} id The identifier of the modal
* @param {object=} args The arguments to pass to the modal
*/
-export const modalOpen = (id, args) => {
- const { act, data } = useBackend();
- const newArgs = Object.assign(data.modal ? data.modal.args : {}, args || {});
+export const modalOpen = (id, args = {}) => {
+ const { act, data } = useBackend();
+
+ const { modal } = data;
+
+ const newArgs = Object.assign(modal ? modal.args : {}, args || {});
act('modal_open', {
id: id,
@@ -24,17 +30,23 @@ export const modalOpen = (id, args) => {
* @param {function} bodyOverride The override function that returns the
* modal contents
*/
-export const modalRegisterBodyOverride = (id, bodyOverride) => {
+export const modalRegisterBodyOverride = (
+ id: string,
+ bodyOverride: Function,
+) => {
bodyOverrides[id] = bodyOverride;
};
-const modalAnswer = (id, answer, args) => {
- const { act, data } = useBackend();
- if (!data.modal) {
+const modalAnswer = (id: string, answer: string, args: {}) => {
+ const { act, data } = useBackend();
+
+ const { modal } = data;
+
+ if (!modal) {
return;
}
- const newArgs = Object.assign(data.modal.args || {}, args || {});
+ const newArgs = Object.assign(modal.args || {}, args || {});
act('modal_answer', {
id: id,
answer: answer,
@@ -42,13 +54,23 @@ const modalAnswer = (id, answer, args) => {
});
};
-const modalClose = (id) => {
+const modalClose = (id: string | null) => {
const { act } = useBackend();
act('modal_close', {
id: id,
});
};
+type complexData = Data &
+ Partial<{
+ modal: {
+ value: string;
+ choices: string[];
+ no_text: string;
+ yes_text: string;
+ };
+ }>;
+
/**
* Displays a modal and its actions. Passed data must have a valid modal field
*
@@ -66,30 +88,33 @@ const modalClose = (id) => {
* @param {object} props
*/
export const ComplexModal = (props) => {
- const { data } = useBackend();
- if (!data.modal) {
+ const { data } = useBackend();
+
+ const { modal } = data;
+
+ if (!modal) {
return;
}
- const { id, text, type } = data.modal;
+ const { id, text, type } = modal;
- let modalOnEnter;
- let modalBody;
- let modalFooter = (
- modalClose()}>
+ let modalOnEnter: Function | undefined;
+ let modalBody: React.JSX.Element | undefined;
+ let modalFooter: React.JSX.Element = (
+ modalClose(null)}>
Cancel
);
// Different contents depending on the type
if (bodyOverrides[id]) {
- modalBody = bodyOverrides[id](data.modal);
+ modalBody = bodyOverrides[id](modal);
} else if (type === 'input') {
- let curValue = data.modal.value;
- modalOnEnter = (e) => modalAnswer(id, curValue);
+ let curValue = modal.value;
+ modalOnEnter = (e) => modalAnswer(id, curValue, {});
modalBody = (
{
);
modalFooter = (
- modalClose()}>
+ modalClose(null)}>
Cancel
modalAnswer(id, curValue)}
+ onClick={() => modalAnswer(id, curValue, {})}
>
Confirm
-
+
);
} else if (type === 'choice') {
const realChoices =
- typeof data.modal.choices === 'object'
- ? Object.values(data.modal.choices)
- : data.modal.choices;
+ typeof modal.choices === 'object'
+ ? Object.values(modal.choices)
+ : modal.choices;
modalBody = (
modalAnswer(id, val)}
+ onSelected={(val) => modalAnswer(id, val, {})}
/>
);
} else if (type === 'bento') {
modalBody = (
- {data.modal.choices.map((c, i) => (
+ {modal.choices.map((c, i) => (
modalAnswer(id, i + 1)}
+ selected={i + 1 === parseInt(modal.value, 10)}
+ onClick={() => modalAnswer(id, (i + 1).toString(), {})}
>
@@ -149,11 +180,11 @@ export const ComplexModal = (props) => {
} else if (type === 'bentospritesheet') {
modalBody = (
- {data.modal.choices.map((c, i) => (
+ {modal.choices.map((c, i) => (
modalAnswer(id, i + 1)}
+ selected={i + 1 === parseInt(modal.value, 10)}
+ onClick={() => modalAnswer(id, (i + 1).toString(), {})}
>
@@ -167,22 +198,30 @@ export const ComplexModal = (props) => {
modalAnswer(id, 0)}
+ onClick={() => modalAnswer(id, '0', {})}
>
- {data.modal.no_text}
+ {modal.no_text}
modalAnswer(id, 1)}
+ onClick={() => modalAnswer(id, '1', {})}
>
- {data.modal.yes_text}
+ {modal.yes_text}
-
+
);
}
diff --git a/tgui/packages/tgui/interfaces/common/FullscreenNotice.jsx b/tgui/packages/tgui/interfaces/common/FullscreenNotice.tsx
similarity index 78%
rename from tgui/packages/tgui/interfaces/common/FullscreenNotice.jsx
rename to tgui/packages/tgui/interfaces/common/FullscreenNotice.tsx
index 2f58b56025..e84a5dae75 100644
--- a/tgui/packages/tgui/interfaces/common/FullscreenNotice.jsx
+++ b/tgui/packages/tgui/interfaces/common/FullscreenNotice.tsx
@@ -3,7 +3,10 @@ import { Flex, Section } from '../../components';
/**
* Just a generic wrapper for fullscreen notices.
*/
-export const FullscreenNotice = (props) => {
+export const FullscreenNotice = (props: {
+ children?: React.ReactNode | undefined;
+ title?: string;
+}) => {
const { children, title = 'Welcome' } = props;
return (
diff --git a/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx b/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx
similarity index 89%
rename from tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx
rename to tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx
index d2612ec546..63ef8f6624 100644
--- a/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx
+++ b/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx
@@ -1,6 +1,14 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../../backend';
import { Button, Flex, NoticeBox } from '../../components';
+type Data = {
+ siliconUser: BooleanLike;
+ locked: BooleanLike;
+ preventLocking: BooleanLike;
+};
+
/**
* This component by expects the following fields to be returned
* from ui_data:
@@ -16,7 +24,7 @@ import { Button, Flex, NoticeBox } from '../../components';
* it's preferred to stick to defaults.
*/
export const InterfaceLockNoticeBox = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
siliconUser = data.siliconUser,
locked = data.locked,
diff --git a/tgui/packages/tgui/interfaces/common/LoginInfo.jsx b/tgui/packages/tgui/interfaces/common/LoginInfo.tsx
similarity index 72%
rename from tgui/packages/tgui/interfaces/common/LoginInfo.jsx
rename to tgui/packages/tgui/interfaces/common/LoginInfo.tsx
index 0f45f70d58..a25c1f5d1f 100644
--- a/tgui/packages/tgui/interfaces/common/LoginInfo.jsx
+++ b/tgui/packages/tgui/interfaces/common/LoginInfo.tsx
@@ -1,6 +1,8 @@
import { useBackend } from '../../backend';
import { Box, Button, NoticeBox } from '../../components';
+type Data = { authenticated: string; rank: string };
+
/**
* Displays a notice box showing the
* `authenticated` and `rank` data fields if they exist.
@@ -9,25 +11,31 @@ import { Box, Button, NoticeBox } from '../../components';
* @param {object} _properties
*/
export const LoginInfo = (_properties) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { authenticated, rank } = data;
if (!data) {
return;
}
return (
-
+
Logged in as: {authenticated} ({rank})
act('logout')}
>
Logout and Eject ID
-
+
);
};
diff --git a/tgui/packages/tgui/interfaces/common/LoginScreen.jsx b/tgui/packages/tgui/interfaces/common/LoginScreen.tsx
similarity index 86%
rename from tgui/packages/tgui/interfaces/common/LoginScreen.jsx
rename to tgui/packages/tgui/interfaces/common/LoginScreen.tsx
index 7d27cf7d60..c97c47614a 100644
--- a/tgui/packages/tgui/interfaces/common/LoginScreen.jsx
+++ b/tgui/packages/tgui/interfaces/common/LoginScreen.tsx
@@ -1,7 +1,12 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../../backend';
import { Box, Button, Icon } from '../../components';
import { FullscreenNotice } from './FullscreenNotice';
+type machine = { machineType: string };
+type Data = { scan: BooleanLike; isAI: BooleanLike; isRobot: BooleanLike };
+
/**
* Displays a login screen that users can interact with
* using an ID card in their hand.
@@ -25,8 +30,8 @@ import { FullscreenNotice } from './FullscreenNotice';
* The AI and robot login buttons are only visible if the user is one
* @param {object} _properties
*/
-export const LoginScreen = (_properties) => {
- const { act, data } = useBackend();
+export const LoginScreen = (_properties: machine) => {
+ const { act, data } = useBackend();
const { scan, isAI, isRobot } = data;
const { machineType } = _properties;
return (
@@ -78,7 +83,7 @@ export const LoginScreen = (_properties) => {
)}
-
+
);
@@ -90,12 +95,12 @@ export const LoginScreen = (_properties) => {
* specialType definitions are defined in LoginScreen.js SpecialMachineInteraction
* currently supported: "Fax"
*/
-export const SpecialMachineInteraction = (_properties) => {
+export const SpecialMachineInteraction = (_properties: machine) => {
const { act } = useBackend();
- const { specialType } = _properties;
- if (!specialType) {
+ const { machineType } = _properties;
+ if (!machineType) {
return null;
- } else if (specialType === 'Fax') {
+ } else if (machineType === 'Fax') {
return (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { insertIdText } = props;
const { has_id, id } = data;
return (
@@ -10,7 +12,7 @@ export const MiningUser = (props) => {
{has_id ? (
<>
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { disableLimiterControls } = props;
@@ -14,7 +24,7 @@ export const OvermapFlightData = (props) => {
{ETAnext}
- {speed} Gm/h
+ {toFixed(speed, 2)} Gm/h
{accel} Gm/h
{heading}°
diff --git a/tgui/packages/tgui/interfaces/common/PortableAtmos.jsx b/tgui/packages/tgui/interfaces/common/PortableAtmos.tsx
similarity index 88%
rename from tgui/packages/tgui/interfaces/common/PortableAtmos.jsx
rename to tgui/packages/tgui/interfaces/common/PortableAtmos.tsx
index a2d3da6c0d..67960f96bb 100644
--- a/tgui/packages/tgui/interfaces/common/PortableAtmos.jsx
+++ b/tgui/packages/tgui/interfaces/common/PortableAtmos.tsx
@@ -1,3 +1,5 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../../backend';
import {
AnimatedNumber,
@@ -8,8 +10,18 @@ import {
Section,
} from '../../components';
+type Data = {
+ connected: BooleanLike;
+ holding: { name: string; pressure: number } | null;
+ on: BooleanLike;
+ pressure: number;
+ powerDraw: number;
+ cellCharge: number;
+ cellMaxCharge: number;
+};
+
export const PortableBasicInfo = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const {
connected,
diff --git a/tgui/packages/tgui/interfaces/common/RankIcon.jsx b/tgui/packages/tgui/interfaces/common/RankIcon.tsx
similarity index 97%
rename from tgui/packages/tgui/interfaces/common/RankIcon.jsx
rename to tgui/packages/tgui/interfaces/common/RankIcon.tsx
index f520af5cb3..646a4e43ad 100644
--- a/tgui/packages/tgui/interfaces/common/RankIcon.jsx
+++ b/tgui/packages/tgui/interfaces/common/RankIcon.tsx
@@ -100,7 +100,9 @@ const rank2icon = {
'Emergency Responder': 'fighter-jet',
};
-export const RankIcon = (props) => {
+type rank_icon = { rank: string; color: string };
+
+export const RankIcon = (props: rank_icon) => {
const { rank, color = 'label' } = props;
let rankObj = rank2icon[rank];
diff --git a/tgui/packages/tgui/interfaces/common/TemporaryNotice.jsx b/tgui/packages/tgui/interfaces/common/TemporaryNotice.tsx
similarity index 77%
rename from tgui/packages/tgui/interfaces/common/TemporaryNotice.jsx
rename to tgui/packages/tgui/interfaces/common/TemporaryNotice.tsx
index e67e7dde61..a94816416b 100644
--- a/tgui/packages/tgui/interfaces/common/TemporaryNotice.jsx
+++ b/tgui/packages/tgui/interfaces/common/TemporaryNotice.tsx
@@ -3,6 +3,8 @@ import { decodeHtmlEntities } from 'common/string';
import { useBackend } from '../../backend';
import { Box, Button, NoticeBox } from '../../components';
+type Data = { temp: { style: string; text: string } };
+
/**
* Displays a notice box with text and style dictated by the
* `temp` data field if it exists.
@@ -17,7 +19,7 @@ import { Box, Button, NoticeBox } from '../../components';
*/
export const TemporaryNotice = (_properties) => {
const { decode } = _properties;
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { temp } = data;
if (!temp) {
return;
@@ -25,15 +27,10 @@ export const TemporaryNotice = (_properties) => {
const temporaryProperty = { [temp.style]: true };
return (
-
+
{decode ? decodeHtmlEntities(temp.text) : temp.text}
- act('cleartemp')}
- />
-
+ act('cleartemp')} />
);
};
diff --git a/tgui/packages/tgui/interfaces/pda/pda_atmos_scan.jsx b/tgui/packages/tgui/interfaces/pda/pda_atmos_scan.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/pda/pda_atmos_scan.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_atmos_scan.tsx
index 30bcafcfe1..4b37500468 100644
--- a/tgui/packages/tgui/interfaces/pda/pda_atmos_scan.jsx
+++ b/tgui/packages/tgui/interfaces/pda/pda_atmos_scan.tsx
@@ -4,6 +4,20 @@ import { decodeHtmlEntities } from 'common/string';
import { useBackend } from '../../backend';
import { Box, LabeledList } from '../../components';
+type Data = {
+ aircontents: aircontent[];
+};
+
+type aircontent = {
+ val: string;
+ units: string;
+ entry: string;
+ bad_low: number;
+ poor_low: number;
+ poor_high: number;
+ bad_high: number;
+};
+
const getItemColor = (value, min2, min1, max1, max2) => {
if (value < min2) {
return 'bad';
@@ -18,7 +32,7 @@ const getItemColor = (value, min2, min1, max1, max2) => {
};
export const pda_atmos_scan = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { aircontents } = data;
@@ -26,7 +40,7 @@ export const pda_atmos_scan = (props) => {
{filter(
- (i) =>
+ (i: aircontent) =>
i.val !== '0' ||
i.entry === 'Pressure' ||
i.entry === 'Temperature',
diff --git a/tgui/packages/tgui/interfaces/pda/pda_janitor.jsx b/tgui/packages/tgui/interfaces/pda/pda_janitor.tsx
similarity index 71%
rename from tgui/packages/tgui/interfaces/pda/pda_janitor.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_janitor.tsx
index 08411805d5..6edd4a70ef 100644
--- a/tgui/packages/tgui/interfaces/pda/pda_janitor.jsx
+++ b/tgui/packages/tgui/interfaces/pda/pda_janitor.tsx
@@ -1,8 +1,34 @@
import { useBackend } from '../../backend';
import { Box, LabeledList, Section } from '../../components';
+type Data = {
+ janitor: {
+ user_loc: { x: number; y: number };
+ mops: { x: number; y: number; dir: string; status: string }[] | null;
+ buckets:
+ | {
+ x: number;
+ y: number;
+ dir: string;
+ volume: number;
+ max_volume: number;
+ }[]
+ | null;
+ cleanbots: { x: number; y: number; dir: string; status: string }[] | null;
+ carts:
+ | {
+ x: number;
+ y: number;
+ dir: string;
+ volume: number;
+ max_volume: number;
+ }[]
+ | null;
+ };
+};
+
export const pda_janitor = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { janitor } = data;
@@ -17,7 +43,7 @@ export const pda_janitor = (props) => {
)}
-
+
{(janitor.mops && (
{janitor.mops.map((mop, i) => (
@@ -28,7 +54,7 @@ export const pda_janitor = (props) => {
)) || No mops detected nearby. }
-
+
{(janitor.buckets && (
{janitor.buckets.map((bucket, i) => (
@@ -40,7 +66,7 @@ export const pda_janitor = (props) => {
)) || No buckets detected nearby. }
-
+
{(janitor.cleanbots && (
{janitor.cleanbots.map((cleanbot, i) => (
@@ -52,7 +78,7 @@ export const pda_janitor = (props) => {
)) || No cleanbots detected nearby. }
-
+
{(janitor.carts && (
{janitor.carts.map((cart, i) => (
diff --git a/tgui/packages/tgui/interfaces/pda/pda_main_menu.jsx b/tgui/packages/tgui/interfaces/pda/pda_main_menu.tsx
similarity index 71%
rename from tgui/packages/tgui/interfaces/pda/pda_main_menu.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_main_menu.tsx
index 0453469638..ec02d4d5e7 100644
--- a/tgui/packages/tgui/interfaces/pda/pda_main_menu.jsx
+++ b/tgui/packages/tgui/interfaces/pda/pda_main_menu.tsx
@@ -1,10 +1,29 @@
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../../backend';
import { Box, Button, LabeledList, Section } from '../../components';
-export const pda_main_menu = (props) => {
- const { act, data } = useBackend();
+type Data = {
+ owner: string;
+ ownjob: string;
+ idInserted: boolean;
+ categories: string[];
+ apps: Record[];
+ pai: BooleanLike;
+ notifying: Record;
+};
- const { owner, ownjob, idInserted, categories, pai, notifying } = data;
+type category = {
+ name: string;
+ icon: string;
+ notify_icon: string;
+ ref: string;
+};
+
+export const pda_main_menu = (props) => {
+ const { act, data } = useBackend();
+
+ const { owner, ownjob, idInserted, categories, pai, notifying, apps } = data;
return (
<>
@@ -24,17 +43,17 @@ export const pda_main_menu = (props) => {
-
+
{categories.map((name) => {
- let apps = data.apps[name];
+ let valid_apps = apps[name];
- if (!apps || !apps.length) {
+ if (!valid_apps || !valid_apps.length) {
return null;
} else {
return (
- {apps.map((app) => (
+ {valid_apps.map((app: category) => (
{
{!!pai && (
-
+
act('pai', { option: 1 })}>
Configuration
diff --git a/tgui/packages/tgui/interfaces/pda/pda_manifest.jsx b/tgui/packages/tgui/interfaces/pda/pda_manifest.tsx
similarity index 100%
rename from tgui/packages/tgui/interfaces/pda/pda_manifest.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_manifest.tsx
diff --git a/tgui/packages/tgui/interfaces/pda/pda_medical.jsx b/tgui/packages/tgui/interfaces/pda/pda_medical.tsx
similarity index 79%
rename from tgui/packages/tgui/interfaces/pda/pda_medical.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_medical.tsx
index b7be5ca88e..97acc11040 100644
--- a/tgui/packages/tgui/interfaces/pda/pda_medical.jsx
+++ b/tgui/packages/tgui/interfaces/pda/pda_medical.tsx
@@ -1,8 +1,34 @@
import { useBackend } from '../../backend';
import { Box, Button, LabeledList, Section } from '../../components';
+import { GeneralRecord, RecordList } from './pda_types';
+
+type Data = {
+ records: {
+ general: GeneralRecord;
+ medical: {
+ id: string;
+ name: string;
+ species: string;
+ b_type: string;
+ b_dna: string;
+ id_gender: string;
+ brain_type: string;
+ mi_dis: string;
+ mi_dis_d: string;
+ ma_dis: string;
+ ma_dis_d: string;
+ alg: string;
+ alg_d: string;
+ cdi: string;
+ cdi_d: string;
+ notes: string;
+ };
+ };
+ recordsList: RecordList;
+};
export const pda_medical = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { recordsList, records } = data;
@@ -11,7 +37,7 @@ export const pda_medical = (props) => {
return (
-
+
{(general && (
{general.name}
@@ -33,7 +59,7 @@ export const pda_medical = (props) => {
)) || General record lost! }
-
+
{(medical && (
@@ -63,7 +89,7 @@ export const pda_medical = (props) => {
{medical.cdi_d}
-
+
{medical.notes}
@@ -74,7 +100,7 @@ export const pda_medical = (props) => {
}
return (
-
+
{recordsList.map((record) => (
{
- const { act, data } = useBackend();
+type Data = {
+ active_conversation: string;
+ convo_name: string;
+ convo_job: string;
+ messages: message[];
+ toff: BooleanLike;
+ silent: BooleanLike;
+ convopdas: pda[];
+ pdas: pda[];
+ charges: number;
+ plugins: { name: string; icon: string; ref: string }[];
+};
- const { auto_scroll, convo_name, convo_job, messages, active_conversation } =
- data;
+type pda = {
+ Name: string;
+ Reference: string;
+ Detonate: string;
+ inconvo: string;
+};
+
+type message = {
+ sent: BooleanLike;
+ owner: string;
+ job: string;
+ message: string;
+ target: string;
+};
+
+export const pda_messenger = (props) => {
+ const { act, data } = useBackend();
+
+ const { active_conversation } = data;
if (active_conversation) {
return ;
@@ -34,22 +62,14 @@ const findClassMessage = (im, lastIndex, filterArray) => {
};
const ActiveConversation = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const {
- auto_scroll,
- convo_name,
- convo_job,
- messages,
- active_conversation,
- useRetro,
- } = data;
+ const { convo_name, convo_job, messages, active_conversation } = data;
const [clipboardMode, setClipboardMode] = useState(false);
let body = (
{
- {filter((im) => im.target === active_conversation)(messages).map(
- (im, i, filterArr) => (
-
-
- {decodeHtmlEntities(im.message)}
-
+ {filter((im: message) => im.target === active_conversation)(
+ messages,
+ ).map((im, i, filterArr) => (
+
+
+ {decodeHtmlEntities(im.message)}
- ),
- )}
+
+ ))}
{
if (clipboardMode) {
body = (
{
- {filter((im) => im.target === active_conversation)(messages).map(
- (im, i) => (
-
- {im.sent ? 'You:' : 'Them:'} {decodeHtmlEntities(im.message)}
-
- ),
- )}
+ {filter((im: message) => im.target === active_conversation)(
+ messages,
+ ).map((im, i) => (
+
+ {im.sent ? 'You:' : 'Them:'} {decodeHtmlEntities(im.message)}
+
+ ))}
{
};
const MessengerList = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
- const { auto_scroll, convopdas, pdas, charges, plugins, silent, toff } = data;
+ const { convopdas, pdas, charges, silent, toff } = data;
return (
@@ -229,22 +248,18 @@ const MessengerList = (props) => {
};
const PDAList = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { pdas, title, msgAct } = props;
const { charges, plugins } = data;
if (!pdas || !pdas.length) {
- return (
-
- );
+ return ;
}
return (
-
+
{pdas.map((pda) => (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { feeds, target_feed } = data;
@@ -17,15 +50,17 @@ export const pda_news = (props) => {
Error: No newsfeeds available. Please try again later.
)) ||
- (target_feed && ) || }
+ (target_feed && ) || (
+
+ )}
);
};
-const NewsTargetFeed = (props) => {
- const { act, data } = useBackend();
+const NewsTargetFeed = (props: { target_feed: feed }) => {
+ const { act } = useBackend();
- const { target_feed } = data;
+ const { target_feed } = props;
return (
{
' by ' +
decodeHtmlEntities(target_feed.author)
}
- level={2}
buttons={
{
>
{(target_feed.messages.length &&
target_feed.messages.map((message) => (
-
+
- {decodeHtmlEntities(message.body)}
{!!message.img && (
@@ -65,13 +99,13 @@ const NewsTargetFeed = (props) => {
};
const NewsFeed = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { feeds, latest_news } = data;
return (
<>
-
+
{(latest_news.length && (
{latest_news.map((news) => (
@@ -87,7 +121,7 @@ const NewsFeed = (props) => {
- {decodeHtmlEntities(news.body)}
- {!!news.img && (
+ {!!news.has_image && (
[image omitted, view story for more details]
{news.caption || null}
@@ -105,7 +139,7 @@ const NewsFeed = (props) => {
)) || No recent stories found. }
-
+
{feeds.map((feed) => (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { note, notename } = data;
diff --git a/tgui/packages/tgui/interfaces/pda/pda_power.jsx b/tgui/packages/tgui/interfaces/pda/pda_power.tsx
similarity index 100%
rename from tgui/packages/tgui/interfaces/pda/pda_power.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_power.tsx
diff --git a/tgui/packages/tgui/interfaces/pda/pda_security.jsx b/tgui/packages/tgui/interfaces/pda/pda_security.tsx
similarity index 81%
rename from tgui/packages/tgui/interfaces/pda/pda_security.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_security.tsx
index 9e338f1ea8..041f84eb58 100644
--- a/tgui/packages/tgui/interfaces/pda/pda_security.jsx
+++ b/tgui/packages/tgui/interfaces/pda/pda_security.tsx
@@ -1,8 +1,28 @@
import { useBackend } from '../../backend';
import { Box, Button, LabeledList, Section } from '../../components';
+import { GeneralRecord, RecordList } from './pda_types';
+
+type Data = {
+ records: {
+ general: GeneralRecord;
+ security: {
+ name: string;
+ species: string;
+ id: string;
+ brain_type: string;
+ criminal: string;
+ mi_crim: string;
+ mi_crim_d: string;
+ ma_crim: string;
+ ma_crim_d: string;
+ notes: string;
+ };
+ };
+ recordsList: RecordList;
+};
export const pda_security = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { recordsList, records } = data;
@@ -11,7 +31,7 @@ export const pda_security = (props) => {
return (
-
+
{(general && (
{general.name}
@@ -33,7 +53,7 @@ export const pda_security = (props) => {
)) || General record lost! }
-
+
{(security && (
@@ -64,7 +84,7 @@ export const pda_security = (props) => {
}
return (
-
+
{recordsList.map((record) => (
{
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { records } = data;
@@ -44,7 +46,7 @@ export const pda_status_display = (props) => {
icon="pen"
onClick={() => act('Status', { statdisp: 'setmsg1' })}
>
- {records.message1 + ' (set)'}
+ {records && records.message1 + ' (set)'}
@@ -52,7 +54,7 @@ export const pda_status_display = (props) => {
icon="pen"
onClick={() => act('Status', { statdisp: 'setmsg2' })}
>
- {records.message2 + ' (set)'}
+ {records && records.message2 + ' (set)'}
diff --git a/tgui/packages/tgui/interfaces/pda/pda_supply.jsx b/tgui/packages/tgui/interfaces/pda/pda_supply.tsx
similarity index 76%
rename from tgui/packages/tgui/interfaces/pda/pda_supply.jsx
rename to tgui/packages/tgui/interfaces/pda/pda_supply.tsx
index 8a9876bc90..44a83561fa 100644
--- a/tgui/packages/tgui/interfaces/pda/pda_supply.jsx
+++ b/tgui/packages/tgui/interfaces/pda/pda_supply.tsx
@@ -1,8 +1,28 @@
import { useBackend } from '../../backend';
import { Box, LabeledList, Section } from '../../components';
+type Data = {
+ supply: {
+ shuttle_moving: number;
+ shuttle_eta: number;
+ shuttle_loc: string;
+ approved: {
+ Number: number;
+ Name: string;
+ ApprovedBy: string;
+ Comment: string;
+ }[];
+ requests: {
+ Number: string;
+ Name: string;
+ OrderedBy: string;
+ Comment: string;
+ }[];
+ };
+};
+
export const pda_supply = (props) => {
- const { act, data } = useBackend();
+ const { act, data } = useBackend();
const { supply } = data;
@@ -22,7 +42,7 @@ export const pda_supply = (props) => {
{(supply.approved.length &&
supply.approved.map((crate) => (
- #{crate.Number} - {crate.Name} approved by {crate.OrderedBy}
+ #{crate.Number} - {crate.Name} approved by {crate.ApprovedBy}
{crate.Comment}
diff --git a/tgui/packages/tgui/interfaces/pda/pda_types.ts b/tgui/packages/tgui/interfaces/pda/pda_types.ts
new file mode 100644
index 0000000000..f7a1bac39b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/pda/pda_types.ts
@@ -0,0 +1,30 @@
+import { IconProps } from '../../components/Icon';
+/**
+ * Gernal Record data
+ */
+export type GeneralRecord = {
+ name: string;
+ id: string;
+ real_rank: string;
+ rank: string;
+ age: number;
+ languages: string;
+ brain_type: string;
+ fingerprint: string;
+ p_stat: string;
+ m_stat: string;
+ sex: string;
+ species: string;
+ home_system: string;
+ birthplace: string;
+ citizenship: string;
+ faction: string;
+ religion: string;
+ photo_front: IconProps;
+ photo_side: IconProps;
+ 'photo-south': string;
+ 'photo-west': string;
+ notes: string;
+};
+
+export type RecordList = { Name: string; ref: string }[];
diff --git a/tgui/packages/tgui/layouts/Pane.jsx b/tgui/packages/tgui/layouts/Pane.tsx
similarity index 64%
rename from tgui/packages/tgui/layouts/Pane.jsx
rename to tgui/packages/tgui/layouts/Pane.tsx
index 1f38df5c99..f34205545f 100644
--- a/tgui/packages/tgui/layouts/Pane.jsx
+++ b/tgui/packages/tgui/layouts/Pane.tsx
@@ -8,15 +8,19 @@ import { classes } from 'common/react';
import { useBackend } from '../backend';
import { Box } from '../components';
+import { BoxProps } from '../components/Box';
+import { useDebug } from '../debug';
import { Layout } from './Layout';
-export const Pane = (props) => {
+type Props = Partial<{
+ theme: string;
+}> &
+ BoxProps;
+
+export function Pane(props: Props) {
const { theme, children, className, ...rest } = props;
- const { suspended, debug } = useBackend();
- let debugLayout = false;
- if (debug) {
- debugLayout = debug.debugLayout;
- }
+ const { suspended } = useBackend();
+ const { debugLayout = false } = useDebug();
return (
@@ -25,20 +29,29 @@ export const Pane = (props) => {
);
-};
+}
-const PaneContent = (props) => {
+type ContentProps = Partial<{
+ fitted: boolean;
+ scrollable: boolean;
+}> &
+ BoxProps;
+
+function PaneContent(props: ContentProps) {
const { className, fitted, children, ...rest } = props;
+
return (
- {(fitted && children) || (
+ {fitted ? (
+ children
+ ) : (
{children}
)}
);
-};
+}
Pane.Content = PaneContent;
diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css
index 76f44176aa..c692a18baf 100644
--- a/tgui/public/tgui-panel.bundle.css
+++ b/tgui/public/tgui-panel.bundle.css
@@ -1 +1 @@
-html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a!important}.color-white{color:#fff!important}.color-red{color:#df3e3e!important}.color-orange{color:#f37f33!important}.color-yellow{color:#fbda21!important}.color-olive{color:#cbe41c!important}.color-green{color:#25ca4c!important}.color-teal{color:#00d6cc!important}.color-blue{color:#2e93de!important}.color-violet{color:#7349cf!important}.color-purple{color:#ad45d0!important}.color-pink{color:#e34da1!important}.color-brown{color:#b97447!important}.color-grey{color:#848484!important}.color-light-grey{color:#b3b3b3!important}.color-good{color:#68c22d!important}.color-average{color:#f29a29!important}.color-bad{color:#df3e3e!important}.color-label{color:#8b9bb0!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-light-grey{background-color:#919191!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9)!important;background:rgba(0,0,0,0)!important;outline:1px solid rgba(255,255,255,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:.167rem solid #1a1a1a!important}.outline-color-white{outline:.167rem solid #fff!important}.outline-color-red{outline:.167rem solid #df3e3e!important}.outline-color-orange{outline:.167rem solid #f37f33!important}.outline-color-yellow{outline:.167rem solid #fbda21!important}.outline-color-olive{outline:.167rem solid #cbe41c!important}.outline-color-green{outline:.167rem solid #25ca4c!important}.outline-color-teal{outline:.167rem solid #00d6cc!important}.outline-color-blue{outline:.167rem solid #2e93de!important}.outline-color-violet{outline:.167rem solid #7349cf!important}.outline-color-purple{outline:.167rem solid #ad45d0!important}.outline-color-pink{outline:.167rem solid #e34da1!important}.outline-color-brown{outline:.167rem solid #b97447!important}.outline-color-grey{outline:.167rem solid #848484!important}.outline-color-light-grey{outline:.167rem solid #b3b3b3!important}.outline-color-good{outline:.167rem solid #68c22d!important}.outline-color-average{outline:.167rem solid #f29a29!important}.outline-color-bad{outline:.167rem solid #df3e3e!important}.outline-color-label{outline:.167rem solid #8b9bb0!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color .1s,background-color .1s}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color .1s,background-color .1s}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color .1s,background-color .1s}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color .1s,background-color .1s}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color .1s,background-color .1s}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color .1s,background-color .1s}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color .1s,background-color .1s}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color .1s,background-color .1s}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color .1s,background-color .1s}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color .1s,background-color .1s}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color .1s,background-color .1s}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color .1s,background-color .1s}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color .1s,background-color .1s}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color .1s,background-color .1s}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color .1s,background-color .1s}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color .1s,background-color .1s}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color .1s,background-color .1s}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color .1s,background-color .1s}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color .1s,background-color .1s}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color .1s,background-color .1s}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color .1s,background-color .1s}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color .1s,background-color .1s}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color .1s,background-color .1s}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999!important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color .1s,background-color .1s}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.Button__textMargin{margin-left:.4rem}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dropdown{display:flex;align-items:flex-start}.Dropdown__control{flex:1;font-family:Verdana,sans-serif;font-size:1em;overflow:hidden;-ms-user-select:none;user-select:none;width:8.3333333333em}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{overflow-y:auto;align-items:center;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-scroll{overflow-y:scroll}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color .1s ease-out}.Dropdown__menuentry.selected{background-color:rgba(255,255,255,.5)!important;transition:background-color 0ms}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-.25em -.5em 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border-color:#552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191!important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.Section{position:relative;margin-bottom:.5em;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.Section .Section:first-child{margin-top:-.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Section--flex{display:flex;flex-flow:column}.Section--flex .Section__content{overflow:auto;flex-grow:1}.Section__content--noTopPadding{padding-top:0}.Section__content--stretchContents{height:calc(100% - 3rem)}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--zebra>.Stack__item:nth-child(2n){background-color:#131313}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:700;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:rgba(0,0,0,0)}.Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:Consolas,monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity .15s ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:#dc143c;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Layout__content--flexRow{display:flex;flex-flow:row}.Layout__content--flexColumn{display:flex;flex-flow:column}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom,#202020,#202020)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited,a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:700}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:700}.ooc{color:#cca300;font-weight:700}.ooc .elevated{color:#2e78d9}.ooc .moderator{color:#184880}.ooc .developer{color:#1b521f}.ooc .admin{color:#b82e00}.ooc .event_manager{color:#603}.ooc .aooc{color:#960018}img.text_tag{width:32px;height:10px;min-height:10px}img.icon{vertical-align:middle;max-height:1em}img.icon.bigicon{max-height:32px}.looc{color:#3a9696;font-weight:700}.rlooc{color:#3abb96;font-weight:700}.adminobserverooc{color:#09c;font-weight:700}.adminooc{color:#3d5bc3;font-weight:700}.adminsay{color:#ff4500;font-weight:700}.admin{color:#5975da;font-weight:700}.mentor_channel{color:olive;font-weight:700}.mod_channel{color:#735638;font-weight:700}.admin_channel{color:#9611d4;font-weight:700}.event_channel{color:#c39;font-weight:700}.name{font-weight:700}.hivemind{font-style:italic}.psay,.pemote{color:#e300e4;font-style:italic}.deadsay{color:#e2c1ff}.binarysay{font-style:italic;color:#1e90ff}.binarysay a{color:#0f0}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#57b8f0}.secradio{color:#dd3535}.medradio{color:#57f09e}.engradio{color:#fcdf03}.supradio{color:#b88646}.srvradio{color:#6ca729}.expradio{color:#8a8a8a}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centradio{color:#2681a5}.airadio{color:#d65d95}.redteamradio{color:#f44!important}.blueteamradio{color:#3434fd!important}.greenteamradio{color:#34fd34!important}.yellowteamradio{color:#fdfd34!important}.yell{font-weight:700}.alert,.valert{color:#d82020}.userdanger{color:#c51e1e;font-weight:700;font-size:185%}.bolddanger{color:#c51e1e;font-weight:700}.danger,.vdanger{color:#c51e1e}.warning,.vwarning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:700}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.announce,.boldannounce{color:#c51e1e;font-weight:700}.minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.minoralert{color:#a4bad6;font-size:125%}.priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.priorityalert{color:#c51e1e;font-size:140%}.greenannounce{color:#059223;font-weight:700}.rose{color:#ff5050}.info{color:#9ab0ff}.notice,.vnotice{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.bolditalic{font-style:italic;font-weight:700}.boldnotice{color:#6685f5;font-weight:700}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:700}.log_message{color:#386aff;font-weight:700}.unconscious{color:#a4bad6;font-weight:700}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.crimson{color:#dc143c}.maroon{color:#c60000}.brown{color:#db733b}.blue{color:#4173fd}.black,.white{color:#fff}.darkgray{color:gray}.gray{color:#a9a9a9}.yellow{color:#fc0}.pink{color:pink}.cyan{color:#0ff}.orange{color:#ff8c00}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:700}.blob{color:#ee4000}.blobannounce{color:#556b2f;font-weight:700;font-size:185%}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:700}.cultboldtalic,.cultlarge{color:#973e3b;font-weight:700;font-size:185%}.narsie{color:#973e3b;font-weight:700;font-size:925%}.narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:700;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.lightpurple{color:#ad5aad}.darkpink{color:#e3209b}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:700}.revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:700;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:700}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:700}.changeling{color:#b000b1;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:700}.spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.spiderscout{color:#231d98;font-weight:700;font-size:120%}.interface{color:#961196}.sans{font-family:Comic Sans MS,cursive,sans-serif}.papyrus{font-family:Papyrus,cursive,sans-serif}.robot{font-family:Courier New,cursive,sans-serif}.tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.command_headset{font-weight:700;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}.phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.hugeicon{font-size:5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:700}.text-normal{font-weight:400;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.tooltip{font-style:italic;border-bottom:1px dashed #fff}.major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_default .major_announcement_title,.chat_alert_default .minor_announcement_title{color:#33d5ff}.chat_alert_default .subheader_announcement_text{color:#ff5297}.chat_alert_default .minor_announcement_text,.chat_alert_default .major_announcement_text{background-color:#001621}.chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_green .major_announcement_title,.chat_alert_green .minor_announcement_title{color:#00ff80}.chat_alert_green .subheader_announcement_text{color:#ff85b5}.chat_alert_green .minor_announcement_text,.chat_alert_green .major_announcement_text{background-color:#002400}.chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_blue .major_announcement_title,.chat_alert_blue .minor_announcement_title{color:#33d5ff}.chat_alert_blue .subheader_announcement_text{color:#ff5297}.chat_alert_blue .minor_announcement_text,.chat_alert_blue .major_announcement_text{background-color:#001621}.chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_pink .major_announcement_title,.chat_alert_pink .minor_announcement_title{color:#ff5297}.chat_alert_pink .subheader_announcement_text{color:#33d5ff}.chat_alert_pink .minor_announcement_text,.chat_alert_pink .major_announcement_text{background-color:#17000d}.chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_yellow .major_announcement_title,.chat_alert_yellow .minor_announcement_title{color:#fff4e0}.chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.chat_alert_yellow .minor_announcement_text,.chat_alert_yellow .major_announcement_text{background-color:#3e3400}.chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_orange .major_announcement_title,.chat_alert_orange .minor_announcement_title{color:#feefe7}.chat_alert_orange .subheader_announcement_text{color:#33d5ff}.chat_alert_orange .minor_announcement_text,.chat_alert_orange .major_announcement_text{background-color:#402500}.chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_red .major_announcement_title,.chat_alert_red .minor_announcement_title{color:#ff5297}.chat_alert_red .subheader_announcement_text{color:#33d5ff}.chat_alert_red .minor_announcement_text,.chat_alert_red .major_announcement_text{background-color:#290000}.chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_purple .major_announcement_title,.chat_alert_purple .minor_announcement_title{color:#c7a1f7}.chat_alert_purple .subheader_announcement_text{color:#33d5ff}.chat_alert_purple .minor_announcement_text,.chat_alert_purple .major_announcement_text{background-color:#150017}.chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_grey .major_announcement_title,.chat_alert_grey .minor_announcement_title{color:#ff5297}.chat_alert_grey .subheader_announcement_text{color:#33d5ff}.chat_alert_grey .minor_announcement_text,.chat_alert_grey .major_announcement_text{background-color:#181818}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.akhani{color:#ac398c}.skrell{color:#00b0b3}.skrellfar{color:#70fcff}.soghun{color:#50ba6c}.solcom{color:#6da6f0}.sergal{color:#07f}.birdsongc{color:#c90}.vulpkanin{color:#b97a57}.tavan{color:#f54298;font-family:Arial}.echosong{color:#826d8c}.enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.bug{color:#9e9e39}.vox{color:#a0a}.promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.zaddat{color:#941c1c}.rough{font-family:Trebuchet MS,cursive,sans-serif}.say_quote{font-family:Georgia,Verdana,sans-serif}.say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.terminus{font-family:Times New Roman,Times,serif,sans-serif}.spacer{color:#9c660b}.teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-light .color-black{color:#000!important}.theme-light .color-white{color:#e6e6e6!important}.theme-light .color-red{color:#c82121!important}.theme-light .color-orange{color:#e6630d!important}.theme-light .color-yellow{color:#e5c304!important}.theme-light .color-olive{color:#a3b816!important}.theme-light .color-green{color:#1d9f3b!important}.theme-light .color-teal{color:#00a39c!important}.theme-light .color-blue{color:#1e78bb!important}.theme-light .color-violet{color:#5a30b5!important}.theme-light .color-purple{color:#932eb4!important}.theme-light .color-pink{color:#db228a!important}.theme-light .color-brown{color:#955d39!important}.theme-light .color-grey{color:#e6e6e6!important}.theme-light .color-light-grey{color:#999!important}.theme-light .color-good{color:#529923!important}.theme-light .color-average{color:#da810e!important}.theme-light .color-bad{color:#c82121!important}.theme-light .color-label{color:#353535!important}.theme-light .color-bg-black{background-color:#000!important}.theme-light .color-bg-white{background-color:#bfbfbf!important}.theme-light .color-bg-red{background-color:#a61c1c!important}.theme-light .color-bg-orange{background-color:#c0530b!important}.theme-light .color-bg-yellow{background-color:#bfa303!important}.theme-light .color-bg-olive{background-color:#889912!important}.theme-light .color-bg-green{background-color:#188532!important}.theme-light .color-bg-teal{background-color:#008882!important}.theme-light .color-bg-blue{background-color:#19649c!important}.theme-light .color-bg-violet{background-color:#4b2897!important}.theme-light .color-bg-purple{background-color:#7a2696!important}.theme-light .color-bg-pink{background-color:#b61d73!important}.theme-light .color-bg-brown{background-color:#7c4d2f!important}.theme-light .color-bg-grey{background-color:#bfbfbf!important}.theme-light .color-bg-light-grey{background-color:gray!important}.theme-light .color-bg-good{background-color:#44801d!important}.theme-light .color-bg-average{background-color:#b56b0b!important}.theme-light .color-bg-bad{background-color:#a61c1c!important}.theme-light .color-bg-label{background-color:#2c2c2c!important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-light .Section .Section:first-child{margin-top:-.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Section--flex{display:flex;flex-flow:column}.theme-light .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-light .Section__content--noTopPadding{padding-top:0}.theme-light .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-light .Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-light .Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636!important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color .1s,background-color .1s}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Button__textMargin{margin-left:.4rem}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-light .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotate(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-light .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-light .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000!important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf!important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c!important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b!important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303!important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912!important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532!important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882!important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c!important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--violet{border-color:#4b2897!important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696!important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73!important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f!important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf!important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray!important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d!important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b!important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c!important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c!important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Layout__content--flexRow{display:flex;flex-flow:row}.theme-light .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee,#eee)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s ease-out,background-color .25s ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:#00f}.theme-light a.visited,.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:700}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:#00f;font-family:Georgia,Verdana,sans-serif}.theme-light em{font-style:normal;font-weight:700}.theme-light .ooc{color:#002eb8;font-weight:700}.theme-light .ooc .elevated{color:#2e78d9}.theme-light .ooc .moderator{color:#184880}.theme-light .ooc .developer{color:#1b521f}.theme-light .ooc .admin{color:#b82e00}.theme-light .ooc .event_manager{color:#603}.theme-light .ooc .aooc{color:#960018}.theme-light img.text_tag{width:32px;height:10px;min-height:10px}.theme-light img.icon{vertical-align:middle;max-height:1em}.theme-light img.icon.bigicon{max-height:32px}.theme-light .looc{color:#3a9696;font-weight:700}.theme-light .rlooc{color:#3abb96;font-weight:700}.theme-light .adminobserverooc{color:#09c;font-weight:700}.theme-light .adminooc{color:#700038;font-weight:700}.theme-light .adminsay{color:#ff4500;font-weight:700}.theme-light .admin{color:#4473ff;font-weight:700}.theme-light .mentor_channel{color:olive;font-weight:700}.theme-light .mod_channel{color:#735638;font-weight:700}.theme-light .admin_channel{color:#9611d4;font-weight:700}.theme-light .event_channel{color:#c39;font-weight:700}.theme-light .name{font-weight:700}.theme-light .hivemind{font-style:italic}.theme-light .psay,.theme-light .pemote{color:purple;font-style:italic}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{font-style:italic;color:#20c20e;background-color:#000;display:inline-block}.theme-light .binarysay a{color:#0f0}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#337296}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#339661}.theme-light .engradio{color:#948f02}.theme-light .supradio{color:#a8732b}.theme-light .srvradio{color:#6eaa2c}.theme-light .expradio{color:#555}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centradio{color:#686868}.theme-light .airadio{color:#f0f}.theme-light .redteamradio{color:red!important}.theme-light .blueteamradio{color:#00f!important}.theme-light .greenteamradio{color:#0f0!important}.theme-light .yellowteamradio{color:#d1ba22!important}.theme-light .yell{font-weight:700}.theme-light .alert,.theme-light .valert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:700;font-size:185%}.theme-light .bolddanger{color:red;font-weight:700}.theme-light .danger,.theme-light .vdanger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning,.theme-light .vwarning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:700}.theme-light .boldwarning{color:red;font-style:italic;font-weight:700}.theme-light .announce{color:#228b22;font-weight:700}.theme-light .boldannounce{color:red;font-weight:700}.theme-light .minorannounce{color:red;font-weight:700;font-size:185%}.theme-light .minoralert{color:#000;font-size:125%}.theme-light .priorityannounce{color:#000;font-weight:700;font-size:225%}.theme-light .prioritytitle{color:#00f;font-weight:700;font-size:185%}.theme-light .priorityalert{color:red;font-size:140%}.theme-light .greenannounce{color:#0f0;font-weight:700}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice,.theme-light .vnotice{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:700}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:#00f}.theme-light .adminhelp{color:red;font-weight:700}.theme-light .log_message{color:#386aff;font-weight:700}.theme-light .unconscious{color:#00f;font-weight:700}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .crimson{color:#dc143c}.theme-light .maroon{color:maroon}.theme-light .brown{color:#8d4925}.theme-light .blue{color:#00f}.theme-light .black,.theme-light .white{color:#000}.theme-light .darkgray{color:gray}.theme-light .gray{color:#a9a9a9}.theme-light .yellow{color:#fc0}.theme-light .pink{color:pink}.theme-light .cyan{color:#0ff}.theme-light .orange{color:#ff8c00}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:700}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-light .cultboldtalic,.theme-light .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-light .blob{color:#ee4000}.theme-light .blobannounce{color:#323f1c;font-weight:700;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:700;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .lightpurple{color:#ad5aad}.theme-light .darkpink{color:#e3209b}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:700}.theme-light .revenbignotice{color:#1d2953;font-weight:700;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:700}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:700}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-light .spiderbroodmother{color:#4d004d;font-weight:700;font-size:185%}.theme-light .spiderbreacher{color:#804b02;font-weight:700;font-size:140%}.theme-light .spiderscout{color:#0c0674;font-weight:700;font-size:120%}.theme-light .interface{color:#303}.theme-light .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-light .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-light .robot{font-family:Courier New,cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:Courier New,cursive,sans-serif}.theme-light .command_headset{font-weight:700;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:#0f0;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-light .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}.theme-light .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .hugeicon{font-size:5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:700;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:#00f;font-weight:700}.theme-light .text-normal{font-weight:400;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000}.theme-light .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-light .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-light .major_announcement_text{color:#131313;background-color:#eaeaea;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-light .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-light .minor_announcement_text{background-color:#eaeaea;color:#202020;padding:.5rem;text-align:left;font-size:100%}.theme-light .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-light .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_default .major_announcement_title,.theme-light .chat_alert_default .minor_announcement_title{color:#003061}.theme-light .chat_alert_default .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_default .minor_announcement_text,.theme-light .chat_alert_default .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdffbd,#bdffbd 10px,#adffad 10px,#adffad 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_green .major_announcement_title,.theme-light .chat_alert_green .minor_announcement_title{color:#005229}.theme-light .chat_alert_green .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_green .minor_announcement_text,.theme-light .chat_alert_green .major_announcement_text{background-color:#d7ffd7}.theme-light .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_blue .major_announcement_title,.theme-light .chat_alert_blue .minor_announcement_title{color:#003061}.theme-light .chat_alert_blue .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_blue .minor_announcement_text,.theme-light .chat_alert_blue .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2e5,#ffc2e5 10px,#ffb3df 10px,#ffb3df 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_pink .major_announcement_title,.theme-light .chat_alert_pink .minor_announcement_title{color:#800033}.theme-light .chat_alert_pink .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_pink .minor_announcement_text,.theme-light .chat_alert_pink .major_announcement_text{background-color:#ffdcf0}.theme-light .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fff5c2,#fff5c2 10px,#fff3b3 10px,#fff3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_yellow .major_announcement_title,.theme-light .chat_alert_yellow .minor_announcement_title{color:#754900}.theme-light .chat_alert_yellow .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_yellow .minor_announcement_text,.theme-light .chat_alert_yellow .major_announcement_text{background-color:#fff9dc}.theme-light .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffe8c2,#ffe8c2 10px,#ffe2b3 10px,#ffe2b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_orange .major_announcement_title,.theme-light .chat_alert_orange .minor_announcement_title{color:#823208}.theme-light .chat_alert_orange .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_orange .minor_announcement_text,.theme-light .chat_alert_orange .major_announcement_text{background-color:#fff2dc}.theme-light .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2c2,#ffc2c2 10px,#ffb3b3 10px,#ffb3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_red .major_announcement_title,.theme-light .chat_alert_red .minor_announcement_title{color:#800029}.theme-light .chat_alert_red .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_red .minor_announcement_text,.theme-light .chat_alert_red .major_announcement_text{background-color:#ffdcdc}.theme-light .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fbd1ff,#fbd1ff 10px,#fac2ff 10px,#fac2ff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_purple .major_announcement_title,.theme-light .chat_alert_purple .minor_announcement_title{color:#450d8c}.theme-light .chat_alert_purple .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_purple .minor_announcement_text,.theme-light .chat_alert_purple .major_announcement_text{background-color:#fdebff}.theme-light .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ebebeb,#ebebeb 10px,#e3e3e3 10px,#e3e3e3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_grey .major_announcement_title,.theme-light .chat_alert_grey .minor_announcement_title{color:#800033}.theme-light .chat_alert_grey .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_grey .minor_announcement_text,.theme-light .chat_alert_grey .major_announcement_text{background-color:#f8f8f8}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .akhani{color:#ac398c}.theme-light .skrell{color:#00b0b3}.theme-light .skrellfar{color:#70fcff}.theme-light .soghun{color:#50ba6c}.theme-light .solcom{color:#3333ce}.theme-light .sergal{color:#07f}.theme-light .birdsongc{color:#c90}.theme-light .vulpkanin{color:#b97a57}.theme-light .tavan{color:#f54298;font-family:Arial}.theme-light .echosong{color:#826d8c}.theme-light .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-light .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-light .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-light .bug{color:#9e9e39}.theme-light .vox{color:#a0a}.theme-light .promethean{color:#5a5a5a;font-family:Comic Sans MS,Comic Sans,cursive}.theme-light .zaddat{color:#941c1c}.theme-light .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-light .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-light .spacer{color:#9c660b}.theme-light .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-light .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-vchatlight .color-black{color:#000!important}.theme-vchatlight .color-white{color:#e6e6e6!important}.theme-vchatlight .color-red{color:#c82121!important}.theme-vchatlight .color-orange{color:#e6630d!important}.theme-vchatlight .color-yellow{color:#e5c304!important}.theme-vchatlight .color-olive{color:#a3b816!important}.theme-vchatlight .color-green{color:#1d9f3b!important}.theme-vchatlight .color-teal{color:#00a39c!important}.theme-vchatlight .color-blue{color:#1e78bb!important}.theme-vchatlight .color-violet{color:#5a30b5!important}.theme-vchatlight .color-purple{color:#932eb4!important}.theme-vchatlight .color-pink{color:#db228a!important}.theme-vchatlight .color-brown{color:#955d39!important}.theme-vchatlight .color-grey{color:#e6e6e6!important}.theme-vchatlight .color-light-grey{color:#999!important}.theme-vchatlight .color-good{color:#529923!important}.theme-vchatlight .color-average{color:#da810e!important}.theme-vchatlight .color-bad{color:#c82121!important}.theme-vchatlight .color-label{color:#353535!important}.theme-vchatlight .color-bg-black{background-color:#000!important}.theme-vchatlight .color-bg-white{background-color:#bfbfbf!important}.theme-vchatlight .color-bg-red{background-color:#a61c1c!important}.theme-vchatlight .color-bg-orange{background-color:#c0530b!important}.theme-vchatlight .color-bg-yellow{background-color:#bfa303!important}.theme-vchatlight .color-bg-olive{background-color:#889912!important}.theme-vchatlight .color-bg-green{background-color:#188532!important}.theme-vchatlight .color-bg-teal{background-color:#008882!important}.theme-vchatlight .color-bg-blue{background-color:#19649c!important}.theme-vchatlight .color-bg-violet{background-color:#4b2897!important}.theme-vchatlight .color-bg-purple{background-color:#7a2696!important}.theme-vchatlight .color-bg-pink{background-color:#b61d73!important}.theme-vchatlight .color-bg-brown{background-color:#7c4d2f!important}.theme-vchatlight .color-bg-grey{background-color:#bfbfbf!important}.theme-vchatlight .color-bg-light-grey{background-color:gray!important}.theme-vchatlight .color-bg-good{background-color:#44801d!important}.theme-vchatlight .color-bg-average{background-color:#b56b0b!important}.theme-vchatlight .color-bg-bad{background-color:#a61c1c!important}.theme-vchatlight .color-bg-label{background-color:#2c2c2c!important}.theme-vchatlight .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-vchatlight .Tabs--fill{height:100%}.theme-vchatlight .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-vchatlight .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-vchatlight .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-vchatlight .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-vchatlight .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-vchatlight .Tabs--horizontal:last-child{margin-bottom:0}.theme-vchatlight .Tabs__Tab{flex-grow:0}.theme-vchatlight .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-vchatlight .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-vchatlight .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-vchatlight .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-vchatlight .Tab__text{flex-grow:1;margin:0 .5em}.theme-vchatlight .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-vchatlight .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-vchatlight .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-vchatlight .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-vchatlight .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-vchatlight .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-vchatlight .Tab--selected.Tab--color--black{color:#404040}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-vchatlight .Tab--selected.Tab--color--white{color:#ececec}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-vchatlight .Tab--selected.Tab--color--red{color:#e14d4d}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-vchatlight .Tab--selected.Tab--color--orange{color:#f48942}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-vchatlight .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-vchatlight .Tab--selected.Tab--color--olive{color:#d0e732}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-vchatlight .Tab--selected.Tab--color--green{color:#33da5a}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-vchatlight .Tab--selected.Tab--color--teal{color:#00faef}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-vchatlight .Tab--selected.Tab--color--blue{color:#419ce1}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-vchatlight .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-vchatlight .Tab--selected.Tab--color--purple{color:#b455d4}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-vchatlight .Tab--selected.Tab--color--pink{color:#e558a7}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-vchatlight .Tab--selected.Tab--color--brown{color:#c0825a}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-vchatlight .Tab--selected.Tab--color--grey{color:#ececec}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-vchatlight .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-vchatlight .Tab--selected.Tab--color--good{color:#77d23b}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-vchatlight .Tab--selected.Tab--color--average{color:#f3a23a}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-vchatlight .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-vchatlight .Tab--selected.Tab--color--label{color:#686868}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-vchatlight .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-vchatlight .Section:last-child{margin-bottom:0}.theme-vchatlight .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-vchatlight .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-vchatlight .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-vchatlight .Section__rest{position:relative}.theme-vchatlight .Section__content{padding:.66em .5em}.theme-vchatlight .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-vchatlight .Section--fill{display:flex;flex-direction:column;height:100%}.theme-vchatlight .Section--fill>.Section__rest{flex-grow:1}.theme-vchatlight .Section--fill>.Section__rest>.Section__content{height:100%}.theme-vchatlight .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-vchatlight .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-vchatlight .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-vchatlight .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-vchatlight .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-vchatlight .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-vchatlight .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-vchatlight .Section .Section:first-child{margin-top:-.5em}.theme-vchatlight .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-vchatlight .Section .Section .Section .Section__titleText{font-size:1em}.theme-vchatlight .Section--flex{display:flex;flex-flow:column}.theme-vchatlight .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-vchatlight .Section__content--noTopPadding{padding-top:0}.theme-vchatlight .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-vchatlight .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-vchatlight .Button:last-child{margin-right:0;margin-bottom:0}.theme-vchatlight .Button .fa,.theme-vchatlight .Button .fas,.theme-vchatlight .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-vchatlight .Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.theme-vchatlight .Button--hasContent .fa,.theme-vchatlight .Button--hasContent .fas,.theme-vchatlight .Button--hasContent .far{margin-right:.25em}.theme-vchatlight .Button--hasContent.Button--iconPosition--right .fa,.theme-vchatlight .Button--hasContent.Button--iconPosition--right .fas,.theme-vchatlight .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-vchatlight .Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.theme-vchatlight .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-vchatlight .Button--circular{border-radius:50%}.theme-vchatlight .Button--compact{padding:0 .25em;line-height:1.333em}.theme-vchatlight .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-vchatlight .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--black:hover,.theme-vchatlight .Button--color--black:focus{background-color:#131313;color:#fff}.theme-vchatlight .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-vchatlight .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--white:hover,.theme-vchatlight .Button--color--white:focus{background-color:#efefef;color:#000}.theme-vchatlight .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-vchatlight .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--red:hover,.theme-vchatlight .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-vchatlight .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-vchatlight .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--orange:hover,.theme-vchatlight .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-vchatlight .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-vchatlight .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--yellow:hover,.theme-vchatlight .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-vchatlight .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-vchatlight .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--olive:hover,.theme-vchatlight .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-vchatlight .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-vchatlight .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--green:hover,.theme-vchatlight .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-vchatlight .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-vchatlight .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--teal:hover,.theme-vchatlight .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-vchatlight .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-vchatlight .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--blue:hover,.theme-vchatlight .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-vchatlight .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-vchatlight .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--violet:hover,.theme-vchatlight .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-vchatlight .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-vchatlight .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--purple:hover,.theme-vchatlight .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-vchatlight .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-vchatlight .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--pink:hover,.theme-vchatlight .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-vchatlight .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-vchatlight .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--brown:hover,.theme-vchatlight .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-vchatlight .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-vchatlight .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--grey:hover,.theme-vchatlight .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-vchatlight .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-vchatlight .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--light-grey:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--light-grey:hover,.theme-vchatlight .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-vchatlight .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-vchatlight .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--good:hover,.theme-vchatlight .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-vchatlight .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-vchatlight .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--average:hover,.theme-vchatlight .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-vchatlight .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-vchatlight .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--bad:hover,.theme-vchatlight .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-vchatlight .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-vchatlight .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--label:hover,.theme-vchatlight .Button--color--label:focus{background-color:#464646;color:#fff}.theme-vchatlight .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-vchatlight .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--default:hover,.theme-vchatlight .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-vchatlight .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-vchatlight .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--caution:hover,.theme-vchatlight .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-vchatlight .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-vchatlight .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--danger:hover,.theme-vchatlight .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-vchatlight .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-vchatlight .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--transparent:hover,.theme-vchatlight .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-vchatlight .Button--disabled{background-color:#363636!important}.theme-vchatlight .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-vchatlight .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--selected:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--selected:hover,.theme-vchatlight .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-vchatlight .Button--flex{display:inline-flex;flex-direction:column}.theme-vchatlight .Button--flex--fluid{width:100%}.theme-vchatlight .Button--verticalAlignContent--top{justify-content:flex-start}.theme-vchatlight .Button--verticalAlignContent--middle{justify-content:center}.theme-vchatlight .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-vchatlight .Button__content{display:block;align-self:stretch}.theme-vchatlight .Button__textMargin{margin-left:.4rem}.theme-vchatlight .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-vchatlight .NumberInput--fluid{display:block}.theme-vchatlight .NumberInput__content{margin-left:.5em}.theme-vchatlight .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-vchatlight .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-vchatlight .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-vchatlight .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-vchatlight .Input--fluid{display:block;width:auto}.theme-vchatlight .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-vchatlight .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-vchatlight .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatlight .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-vchatlight .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-vchatlight .TextArea--fluid{display:block;width:auto;height:auto}.theme-vchatlight .TextArea--noborder{border:0px}.theme-vchatlight .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-vchatlight .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-vchatlight .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatlight .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-vchatlight .TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.theme-vchatlight .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-vchatlight .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-vchatlight .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-vchatlight .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-vchatlight .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-vchatlight .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatlight .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-vchatlight .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-vchatlight .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-vchatlight .Knob__ringFillPivot{transform:rotate(135deg)}.theme-vchatlight .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-vchatlight .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-vchatlight .Knob--color--black .Knob__ringFill{stroke:#000}.theme-vchatlight .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-vchatlight .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-vchatlight .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-vchatlight .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-vchatlight .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-vchatlight .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-vchatlight .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-vchatlight .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-vchatlight .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-vchatlight .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-vchatlight .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-vchatlight .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-vchatlight .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-vchatlight .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-vchatlight .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-vchatlight .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-vchatlight .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-vchatlight .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-vchatlight .Slider{cursor:e-resize}.theme-vchatlight .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-vchatlight .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-vchatlight .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-vchatlight .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatlight .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-vchatlight .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-vchatlight .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-vchatlight .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-vchatlight .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-vchatlight .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-vchatlight .ProgressBar--color--black{border-color:#000!important}.theme-vchatlight .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-vchatlight .ProgressBar--color--white{border-color:#bfbfbf!important}.theme-vchatlight .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-vchatlight .ProgressBar--color--red{border-color:#a61c1c!important}.theme-vchatlight .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-vchatlight .ProgressBar--color--orange{border-color:#c0530b!important}.theme-vchatlight .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-vchatlight .ProgressBar--color--yellow{border-color:#bfa303!important}.theme-vchatlight .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-vchatlight .ProgressBar--color--olive{border-color:#889912!important}.theme-vchatlight .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-vchatlight .ProgressBar--color--green{border-color:#188532!important}.theme-vchatlight .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-vchatlight .ProgressBar--color--teal{border-color:#008882!important}.theme-vchatlight .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-vchatlight .ProgressBar--color--blue{border-color:#19649c!important}.theme-vchatlight .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-vchatlight .ProgressBar--color--violet{border-color:#4b2897!important}.theme-vchatlight .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-vchatlight .ProgressBar--color--purple{border-color:#7a2696!important}.theme-vchatlight .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-vchatlight .ProgressBar--color--pink{border-color:#b61d73!important}.theme-vchatlight .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-vchatlight .ProgressBar--color--brown{border-color:#7c4d2f!important}.theme-vchatlight .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-vchatlight .ProgressBar--color--grey{border-color:#bfbfbf!important}.theme-vchatlight .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-vchatlight .ProgressBar--color--light-grey{border-color:gray!important}.theme-vchatlight .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-vchatlight .ProgressBar--color--good{border-color:#44801d!important}.theme-vchatlight .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-vchatlight .ProgressBar--color--average{border-color:#b56b0b!important}.theme-vchatlight .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-vchatlight .ProgressBar--color--bad{border-color:#a61c1c!important}.theme-vchatlight .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-vchatlight .ProgressBar--color--label{border-color:#2c2c2c!important}.theme-vchatlight .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-vchatlight .Chat{color:#000}.theme-vchatlight .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-vchatlight .Chat__badge:before{content:"x"}.theme-vchatlight .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-vchatlight .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-vchatlight .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-vchatlight .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-vchatlight .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-vchatlight .Chat__highlight{color:#000}.theme-vchatlight .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-vchatlight .ChatMessage{word-wrap:break-word}.theme-vchatlight .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-vchatlight .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-vchatlight .Layout,.theme-vchatlight .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-vchatlight .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-vchatlight .Layout__content--flexRow{display:flex;flex-flow:row}.theme-vchatlight .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-vchatlight .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee,#eee)}.theme-vchatlight .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-vchatlight .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-vchatlight .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-vchatlight .Window__contentPadding:after{height:0}.theme-vchatlight .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-vchatlight .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-vchatlight .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-vchatlight .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-vchatlight .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-vchatlight .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-vchatlight .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s ease-out,background-color .25s ease-out}.theme-vchatlight .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-vchatlight .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-vchatlight .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-vchatlight .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-vchatlight .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-vchatlight .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-vchatlight .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-vchatlight html,.theme-vchatlight body{padding:0;margin:0;height:100%;color:#000}.theme-vchatlight body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-vchatlight img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-vchatlight img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-vchatlight a{color:#00f}.theme-vchatlight a.visited,.theme-vchatlight a:visited{color:#f0f}.theme-vchatlight a.popt{text-decoration:none}.theme-vchatlight .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-vchatlight .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-vchatlight .popup .close:hover{background:#999}.theme-vchatlight .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-vchatlight .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-vchatlight .popup input[type=text]:hover,.theme-vchatlight .popup input[type=text]:active,.theme-vchatlight .popup input[type=text]:focus{border-color:green}.theme-vchatlight .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-vchatlight .popup input[type=submit]:hover,.theme-vchatlight .popup input[type=submit]:focus,.theme-vchatlight .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-vchatlight .changeFont{padding:10px}.theme-vchatlight .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-vchatlight .changeFont a:hover{background:#ccc}.theme-vchatlight .highlightPopup{padding:10px;text-align:center}.theme-vchatlight .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-vchatlight .highlightPopup input.highlightColor{background-color:#ff0}.theme-vchatlight .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-vchatlight .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-vchatlight .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-vchatlight .contextMenu a:hover{background-color:#ccc}.theme-vchatlight .filterMessages{padding:5px}.theme-vchatlight .filterMessages div{padding:2px 0}.theme-vchatlight .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-vchatlight .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-vchatlight .motd h1,.theme-vchatlight .motd h2,.theme-vchatlight .motd h3,.theme-vchatlight .motd h4,.theme-vchatlight .motd h5,.theme-vchatlight .motd h6{color:#638500;text-decoration:underline}.theme-vchatlight .motd a,.theme-vchatlight .motd a:link,.theme-vchatlight .motd a:visited,.theme-vchatlight .motd a:active,.theme-vchatlight .motd a:hover{color:#638500}.theme-vchatlight .bold,.theme-vchatlight .name,.theme-vchatlight .prefix,.theme-vchatlight .ooc,.theme-vchatlight .looc,.theme-vchatlight .adminooc,.theme-vchatlight .admin,.theme-vchatlight .medal,.theme-vchatlight .yell{font-weight:700}.theme-vchatlight .italic,.theme-vchatlight .italics{font-style:italic}.theme-vchatlight .highlight{background:#ff0}.theme-vchatlight h1,.theme-vchatlight h2,.theme-vchatlight h3,.theme-vchatlight h4,.theme-vchatlight h5,.theme-vchatlight h6{color:#00f;font-family:Georgia,Verdana,sans-serif}.theme-vchatlight em{font-style:normal;font-weight:700}.theme-vchatlight .ooc{color:#002eb8;font-weight:700}.theme-vchatlight .ooc .elevated{color:#2e78d9}.theme-vchatlight .ooc .moderator{color:#184880}.theme-vchatlight .ooc .developer{color:#1b521f}.theme-vchatlight .ooc .admin{color:#b82e00}.theme-vchatlight .ooc .event_manager{color:#603}.theme-vchatlight .ooc .aooc{color:#960018}.theme-vchatlight img.text_tag{width:32px;height:10px;min-height:10px}.theme-vchatlight img.icon{vertical-align:middle;max-height:1em}.theme-vchatlight img.icon.bigicon{max-height:32px}.theme-vchatlight .looc{color:#3a9696;font-weight:700}.theme-vchatlight .rlooc{color:#3abb96;font-weight:700}.theme-vchatlight .adminobserverooc{color:#09c;font-weight:700}.theme-vchatlight .adminooc{color:#700038;font-weight:700}.theme-vchatlight .adminsay{color:#ff4500;font-weight:700}.theme-vchatlight .admin{color:#4473ff;font-weight:700}.theme-vchatlight .mentor_channel{color:olive;font-weight:700}.theme-vchatlight .mod_channel{color:#735638;font-weight:700}.theme-vchatlight .admin_channel{color:#9611d4;font-weight:700}.theme-vchatlight .event_channel{color:#c39;font-weight:700}.theme-vchatlight .name{font-weight:700}.theme-vchatlight .hivemind{font-style:italic}.theme-vchatlight .psay,.theme-vchatlight .pemote{color:purple;font-style:italic}.theme-vchatlight .deadsay{color:#530fad}.theme-vchatlight .binarysay{font-style:italic;color:#000}.theme-vchatlight .binarysay a{color:#0f0}.theme-vchatlight .binarysay a:active,.theme-vchatlight .binarysay a:visited{color:#8f8}.theme-vchatlight .radio{color:green}.theme-vchatlight .sciradio{color:#939}.theme-vchatlight .comradio{color:#193a7a}.theme-vchatlight .secradio{color:#a30000}.theme-vchatlight .medradio{color:#008160}.theme-vchatlight .engradio{color:#a66300}.theme-vchatlight .supradio{color:#5f4519}.theme-vchatlight .srvradio{color:#6eaa2c}.theme-vchatlight .expradio{color:#555}.theme-vchatlight .syndradio{color:#6d3f40}.theme-vchatlight .gangradio{color:#ac2ea1}.theme-vchatlight .centradio{color:#5c5c8a}.theme-vchatlight .airadio{color:#f0f}.theme-vchatlight .redteamradio{color:red!important}.theme-vchatlight .blueteamradio{color:#00f!important}.theme-vchatlight .greenteamradio{color:#0f0!important}.theme-vchatlight .yellowteamradio{color:#d1ba22!important}.theme-vchatlight .yell{font-weight:700}.theme-vchatlight .alert,.theme-vchatlight .valert{color:red}.theme-vchatlight h1.alert,.theme-vchatlight h2.alert{color:#000}.theme-vchatlight .userdanger{color:red;font-weight:700;font-size:185%}.theme-vchatlight .bolddanger{color:red;font-weight:700}.theme-vchatlight .danger,.theme-vchatlight .vdanger{color:red}.theme-vchatlight .tinydanger{color:red;font-size:85%}.theme-vchatlight .smalldanger{color:red;font-size:90%}.theme-vchatlight .warning,.theme-vchatlight .vwarning{color:red;font-style:italic}.theme-vchatlight .alertwarning{color:red;font-weight:700}.theme-vchatlight .boldwarning{color:red;font-style:italic;font-weight:700}.theme-vchatlight .announce{color:#228b22;font-weight:700}.theme-vchatlight .boldannounce{color:red;font-weight:700}.theme-vchatlight .minorannounce{color:red;font-weight:700;font-size:185%}.theme-vchatlight .minoralert{color:#000;font-size:125%}.theme-vchatlight .priorityannounce{color:#000;font-weight:700;font-size:225%}.theme-vchatlight .prioritytitle{color:#00f;font-weight:700;font-size:185%}.theme-vchatlight .priorityalert{color:red;font-size:140%}.theme-vchatlight .greenannounce{color:#0f0;font-weight:700}.theme-vchatlight .rose{color:#ff5050}.theme-vchatlight .info{color:#00c}.theme-vchatlight .notice,.theme-vchatlight .vnotice{color:#009}.theme-vchatlight .tinynotice{color:#009;font-size:85%}.theme-vchatlight .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-vchatlight .smallnotice{color:#009;font-size:90%}.theme-vchatlight .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-vchatlight .boldnotice{color:#009;font-weight:700}.theme-vchatlight .hear{color:#009;font-style:italic}.theme-vchatlight .adminnotice{color:#00f}.theme-vchatlight .adminhelp{color:red;font-weight:700}.theme-vchatlight .log_message{color:#386aff;font-weight:700}.theme-vchatlight .unconscious{color:#00f;font-weight:700}.theme-vchatlight .suicide{color:#ff5050;font-style:italic}.theme-vchatlight .green{color:#03ff39}.theme-vchatlight .grey{color:#838383}.theme-vchatlight .red{color:red}.theme-vchatlight .crimson{color:#dc143c}.theme-vchatlight .maroon{color:maroon}.theme-vchatlight .brown{color:#8d4925}.theme-vchatlight .blue{color:#00f}.theme-vchatlight .black,.theme-vchatlight .white{color:#000}.theme-vchatlight .darkgray{color:gray}.theme-vchatlight .gray{color:#a9a9a9}.theme-vchatlight .yellow{color:#fc0}.theme-vchatlight .pink{color:pink}.theme-vchatlight .cyan{color:#0ff}.theme-vchatlight .orange{color:#ff8c00}.theme-vchatlight .nicegreen{color:#14a833}.theme-vchatlight .boldnicegreen{color:#14a833;font-weight:700}.theme-vchatlight .cult{color:#973e3b}.theme-vchatlight .cultitalic{color:#973e3b;font-style:italic}.theme-vchatlight .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-vchatlight .cultboldtalic,.theme-vchatlight .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-vchatlight .blob{color:#ee4000}.theme-vchatlight .blobannounce{color:#323f1c;font-weight:700;font-size:185%}.theme-vchatlight .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-vchatlight .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-vchatlight .colossus{color:#7f282a;font-size:310%}.theme-vchatlight .hierophant{color:#609;font-weight:700;font-style:italic}.theme-vchatlight .hierophant_warning{color:#609;font-style:italic}.theme-vchatlight .purple{color:#5e2d79}.theme-vchatlight .lightpurple{color:#ad5aad}.theme-vchatlight .darkpink{color:#e3209b}.theme-vchatlight .holoparasite{color:#35333a}.theme-vchatlight .revennotice{color:#1d2953}.theme-vchatlight .revenboldnotice{color:#1d2953;font-weight:700}.theme-vchatlight .revenbignotice{color:#1d2953;font-weight:700;font-size:185%}.theme-vchatlight .revenminor{color:#823abb}.theme-vchatlight .revenwarning{color:#760fbb;font-style:italic}.theme-vchatlight .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-vchatlight .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-vchatlight .ghostalert{color:#5c00e6;font-style:italic;font-weight:700}.theme-vchatlight .alien{color:#543354}.theme-vchatlight .noticealien{color:#00c000}.theme-vchatlight .alertalien{color:#00c000;font-weight:700}.theme-vchatlight .changeling{color:purple;font-style:italic}.theme-vchatlight .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-vchatlight .spiderbroodmother{color:#4d004d;font-weight:700;font-size:185%}.theme-vchatlight .spiderbreacher{color:#804b02;font-weight:700;font-size:140%}.theme-vchatlight .spiderscout{color:#0c0674;font-weight:700;font-size:120%}.theme-vchatlight .interface{color:#303}.theme-vchatlight .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-vchatlight .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-vchatlight .robot{font-family:Courier New,cursive,sans-serif}.theme-vchatlight .tape_recorder{color:maroon;font-family:Courier New,cursive,sans-serif}.theme-vchatlight .command_headset{font-weight:700;font-size:160%}.theme-vchatlight .small{font-size:60%}.theme-vchatlight .big{font-size:185%}.theme-vchatlight .reallybig{font-size:245%}.theme-vchatlight .extremelybig{font-size:310%}.theme-vchatlight .greentext{color:#0f0;font-size:185%}.theme-vchatlight .redtext{color:red;font-size:185%}.theme-vchatlight .clown{color:#ff69bf;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-vchatlight .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-vchatlight .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-vchatlight .hypnophrase{color:#0d0d0d;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}to{color:#3bb5d3}}.theme-vchatlight .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}to{color:#0d0d0d}}.theme-vchatlight .icon{height:1em;width:auto}.theme-vchatlight .bigicon{font-size:2.5em}.theme-vchatlight .hugeicon{font-size:5em}.theme-vchatlight .memo{color:#638500;text-align:center}.theme-vchatlight .memoedit{text-align:center;font-size:125%}.theme-vchatlight .abductor{color:purple;font-style:italic}.theme-vchatlight .mind_control{color:#a00d6f;font-size:100%;font-weight:700;font-style:italic}.theme-vchatlight .slime{color:#00ced1}.theme-vchatlight .drone{color:#848482}.theme-vchatlight .monkey{color:#975032}.theme-vchatlight .swarmer{color:#2c75ff}.theme-vchatlight .resonate{color:#298f85}.theme-vchatlight .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-vchatlight .connectionClosed,.theme-vchatlight .fatalError{background:red;color:#fff;padding:5px}.theme-vchatlight .connectionClosed.restored{background:green}.theme-vchatlight .internal.boldnshit{color:#00f;font-weight:700}.theme-vchatlight .text-normal{font-weight:400;font-style:normal}.theme-vchatlight .hidden{display:none;visibility:hidden}.theme-vchatlight .ml-1{margin-left:1em}.theme-vchatlight .ml-2{margin-left:2em}.theme-vchatlight .ml-3{margin-left:3em}.theme-vchatlight .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-vchatlight .tooltip{font-style:italic;border-bottom:1px dashed #000}.theme-vchatlight .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-vchatlight .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-vchatlight .major_announcement_text{color:#131313;background-color:#eaeaea;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-vchatlight .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-vchatlight .minor_announcement_text{background-color:#eaeaea;color:#202020;padding:.5rem;text-align:left;font-size:100%}.theme-vchatlight .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-vchatlight .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_default .major_announcement_title,.theme-vchatlight .chat_alert_default .minor_announcement_title{color:#003061}.theme-vchatlight .chat_alert_default .subheader_announcement_text{color:#6b0020}.theme-vchatlight .chat_alert_default .minor_announcement_text,.theme-vchatlight .chat_alert_default .major_announcement_text{background-color:#d7ddff}.theme-vchatlight .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdffbd,#bdffbd 10px,#adffad 10px,#adffad 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_green .major_announcement_title,.theme-vchatlight .chat_alert_green .minor_announcement_title{color:#005229}.theme-vchatlight .chat_alert_green .subheader_announcement_text{color:#6b0020}.theme-vchatlight .chat_alert_green .minor_announcement_text,.theme-vchatlight .chat_alert_green .major_announcement_text{background-color:#d7ffd7}.theme-vchatlight .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_blue .major_announcement_title,.theme-vchatlight .chat_alert_blue .minor_announcement_title{color:#003061}.theme-vchatlight .chat_alert_blue .subheader_announcement_text{color:#6b0020}.theme-vchatlight .chat_alert_blue .minor_announcement_text,.theme-vchatlight .chat_alert_blue .major_announcement_text{background-color:#d7ddff}.theme-vchatlight .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2e5,#ffc2e5 10px,#ffb3df 10px,#ffb3df 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_pink .major_announcement_title,.theme-vchatlight .chat_alert_pink .minor_announcement_title{color:#800033}.theme-vchatlight .chat_alert_pink .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_pink .minor_announcement_text,.theme-vchatlight .chat_alert_pink .major_announcement_text{background-color:#ffdcf0}.theme-vchatlight .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fff5c2,#fff5c2 10px,#fff3b3 10px,#fff3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_yellow .major_announcement_title,.theme-vchatlight .chat_alert_yellow .minor_announcement_title{color:#754900}.theme-vchatlight .chat_alert_yellow .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_yellow .minor_announcement_text,.theme-vchatlight .chat_alert_yellow .major_announcement_text{background-color:#fff9dc}.theme-vchatlight .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffe8c2,#ffe8c2 10px,#ffe2b3 10px,#ffe2b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_orange .major_announcement_title,.theme-vchatlight .chat_alert_orange .minor_announcement_title{color:#823208}.theme-vchatlight .chat_alert_orange .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_orange .minor_announcement_text,.theme-vchatlight .chat_alert_orange .major_announcement_text{background-color:#fff2dc}.theme-vchatlight .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2c2,#ffc2c2 10px,#ffb3b3 10px,#ffb3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_red .major_announcement_title,.theme-vchatlight .chat_alert_red .minor_announcement_title{color:#800029}.theme-vchatlight .chat_alert_red .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_red .minor_announcement_text,.theme-vchatlight .chat_alert_red .major_announcement_text{background-color:#ffdcdc}.theme-vchatlight .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fbd1ff,#fbd1ff 10px,#fac2ff 10px,#fac2ff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_purple .major_announcement_title,.theme-vchatlight .chat_alert_purple .minor_announcement_title{color:#450d8c}.theme-vchatlight .chat_alert_purple .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_purple .minor_announcement_text,.theme-vchatlight .chat_alert_purple .major_announcement_text{background-color:#fdebff}.theme-vchatlight .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ebebeb,#ebebeb 10px,#e3e3e3 10px,#e3e3e3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_grey .major_announcement_title,.theme-vchatlight .chat_alert_grey .minor_announcement_title{color:#800033}.theme-vchatlight .chat_alert_grey .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_grey .minor_announcement_text,.theme-vchatlight .chat_alert_grey .major_announcement_text{background-color:#f8f8f8}.theme-vchatlight .tajaran{color:#803b56}.theme-vchatlight .tajaran_signlang{color:#941c1c}.theme-vchatlight .akhani{color:#ac398c}.theme-vchatlight .skrell{color:#00b0b3}.theme-vchatlight .skrellfar{color:#70fcff}.theme-vchatlight .soghun{color:#50ba6c}.theme-vchatlight .solcom{color:#3333ce}.theme-vchatlight .sergal{color:#07f}.theme-vchatlight .birdsongc{color:#c90}.theme-vchatlight .vulpkanin{color:#b97a57}.theme-vchatlight .tavan{color:#f54298;font-family:Arial}.theme-vchatlight .echosong{color:#826d8c}.theme-vchatlight .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-vchatlight .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-vchatlight .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-vchatlight .bug{color:#9e9e39}.theme-vchatlight .vox{color:#a0a}.theme-vchatlight .promethean{color:#5a5a5a;font-family:Comic Sans MS,Comic Sans,cursive}.theme-vchatlight .zaddat{color:#941c1c}.theme-vchatlight .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-vchatlight .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-vchatlight .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-vchatlight .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-vchatlight .spacer{color:#9c660b}.theme-vchatlight .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-vchatlight .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-vchatdark .color-black{color:#1a1a1a!important}.theme-vchatdark .color-white{color:#fff!important}.theme-vchatdark .color-red{color:#df3e3e!important}.theme-vchatdark .color-orange{color:#f37f33!important}.theme-vchatdark .color-yellow{color:#fbda21!important}.theme-vchatdark .color-olive{color:#cbe41c!important}.theme-vchatdark .color-green{color:#25ca4c!important}.theme-vchatdark .color-teal{color:#00d6cc!important}.theme-vchatdark .color-blue{color:#2e93de!important}.theme-vchatdark .color-violet{color:#7349cf!important}.theme-vchatdark .color-purple{color:#ad45d0!important}.theme-vchatdark .color-pink{color:#e34da1!important}.theme-vchatdark .color-brown{color:#b97447!important}.theme-vchatdark .color-grey{color:#848484!important}.theme-vchatdark .color-light-grey{color:#b3b3b3!important}.theme-vchatdark .color-good{color:#68c22d!important}.theme-vchatdark .color-average{color:#f29a29!important}.theme-vchatdark .color-bad{color:#df3e3e!important}.theme-vchatdark .color-label{color:#8b9bb0!important}.theme-vchatdark .color-bg-black{background-color:#000!important}.theme-vchatdark .color-bg-white{background-color:#d9d9d9!important}.theme-vchatdark .color-bg-red{background-color:#bd2020!important}.theme-vchatdark .color-bg-orange{background-color:#d95e0c!important}.theme-vchatdark .color-bg-yellow{background-color:#d9b804!important}.theme-vchatdark .color-bg-olive{background-color:#9aad14!important}.theme-vchatdark .color-bg-green{background-color:#1b9638!important}.theme-vchatdark .color-bg-teal{background-color:#009a93!important}.theme-vchatdark .color-bg-blue{background-color:#1c71b1!important}.theme-vchatdark .color-bg-violet{background-color:#552dab!important}.theme-vchatdark .color-bg-purple{background-color:#8b2baa!important}.theme-vchatdark .color-bg-pink{background-color:#cf2082!important}.theme-vchatdark .color-bg-brown{background-color:#8c5836!important}.theme-vchatdark .color-bg-grey{background-color:#646464!important}.theme-vchatdark .color-bg-light-grey{background-color:#919191!important}.theme-vchatdark .color-bg-good{background-color:#4d9121!important}.theme-vchatdark .color-bg-average{background-color:#cd7a0d!important}.theme-vchatdark .color-bg-bad{background-color:#bd2020!important}.theme-vchatdark .color-bg-label{background-color:#657a94!important}.theme-vchatdark .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Tabs--fill{height:100%}.theme-vchatdark .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-vchatdark .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-vchatdark .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-vchatdark .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-vchatdark .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-vchatdark .Tabs--horizontal:last-child{margin-bottom:0}.theme-vchatdark .Tabs__Tab{flex-grow:0}.theme-vchatdark .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-vchatdark .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.theme-vchatdark .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-vchatdark .Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.theme-vchatdark .Tab__text{flex-grow:1;margin:0 .5em}.theme-vchatdark .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-vchatdark .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-vchatdark .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-vchatdark .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.theme-vchatdark .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-vchatdark .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.theme-vchatdark .Tab--selected.Tab--color--black{color:#535353}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.theme-vchatdark .Tab--selected.Tab--color--white{color:#fff}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.theme-vchatdark .Tab--selected.Tab--color--red{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--orange{color:#f69f66}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.theme-vchatdark .Tab--selected.Tab--color--yellow{color:#fce358}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.theme-vchatdark .Tab--selected.Tab--color--olive{color:#d8eb55}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.theme-vchatdark .Tab--selected.Tab--color--green{color:#53e074}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.theme-vchatdark .Tab--selected.Tab--color--teal{color:#21fff5}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.theme-vchatdark .Tab--selected.Tab--color--blue{color:#62aee6}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.theme-vchatdark .Tab--selected.Tab--color--violet{color:#9676db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.theme-vchatdark .Tab--selected.Tab--color--purple{color:#c274db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.theme-vchatdark .Tab--selected.Tab--color--pink{color:#ea79b9}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.theme-vchatdark .Tab--selected.Tab--color--brown{color:#ca9775}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.theme-vchatdark .Tab--selected.Tab--color--grey{color:#a3a3a3}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.theme-vchatdark .Tab--selected.Tab--color--light-grey{color:#c6c6c6}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.theme-vchatdark .Tab--selected.Tab--color--good{color:#8cd95a}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.theme-vchatdark .Tab--selected.Tab--color--average{color:#f5b35e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.theme-vchatdark .Tab--selected.Tab--color--bad{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--label{color:#a8b4c4}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.theme-vchatdark .Section{position:relative;margin-bottom:.5em;background-color:#191919;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-vchatdark .Section:last-child{margin-bottom:0}.theme-vchatdark .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-vchatdark .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-vchatdark .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-vchatdark .Section__rest{position:relative}.theme-vchatdark .Section__content{padding:.66em .5em}.theme-vchatdark .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-vchatdark .Section--fill{display:flex;flex-direction:column;height:100%}.theme-vchatdark .Section--fill>.Section__rest{flex-grow:1}.theme-vchatdark .Section--fill>.Section__rest>.Section__content{height:100%}.theme-vchatdark .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-vchatdark .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-vchatdark .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-vchatdark .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-vchatdark .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-vchatdark .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-vchatdark .Section .Section:first-child{margin-top:-.5em}.theme-vchatdark .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-vchatdark .Section .Section .Section .Section__titleText{font-size:1em}.theme-vchatdark .Section--flex{display:flex;flex-flow:column}.theme-vchatdark .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-vchatdark .Section__content--noTopPadding{padding-top:0}.theme-vchatdark .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-vchatdark .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-vchatdark .Button:last-child{margin-right:0;margin-bottom:0}.theme-vchatdark .Button .fa,.theme-vchatdark .Button .fas,.theme-vchatdark .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-vchatdark .Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.theme-vchatdark .Button--hasContent .fa,.theme-vchatdark .Button--hasContent .fas,.theme-vchatdark .Button--hasContent .far{margin-right:.25em}.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fa,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fas,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-vchatdark .Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.theme-vchatdark .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-vchatdark .Button--circular{border-radius:50%}.theme-vchatdark .Button--compact{padding:0 .25em;line-height:1.333em}.theme-vchatdark .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-vchatdark .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--black:hover,.theme-vchatdark .Button--color--black:focus{background-color:#131313;color:#fff}.theme-vchatdark .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.theme-vchatdark .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--white:hover,.theme-vchatdark .Button--color--white:focus{background-color:#f8f8f8;color:#000}.theme-vchatdark .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--red:hover,.theme-vchatdark .Button--color--red:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.theme-vchatdark .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--orange:hover,.theme-vchatdark .Button--color--orange:focus{background-color:#f0853f;color:#fff}.theme-vchatdark .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--yellow:hover,.theme-vchatdark .Button--color--yellow:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.theme-vchatdark .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--olive:hover,.theme-vchatdark .Button--color--olive:focus{background-color:#c4da2b;color:#fff}.theme-vchatdark .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--green:hover,.theme-vchatdark .Button--color--green:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.theme-vchatdark .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--teal:hover,.theme-vchatdark .Button--color--teal:focus{background-color:#13c4bc;color:#fff}.theme-vchatdark .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.theme-vchatdark .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--blue:hover,.theme-vchatdark .Button--color--blue:focus{background-color:#3a95d9;color:#fff}.theme-vchatdark .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.theme-vchatdark .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--violet:hover,.theme-vchatdark .Button--color--violet:focus{background-color:#7953cc;color:#fff}.theme-vchatdark .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.theme-vchatdark .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--purple:hover,.theme-vchatdark .Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.theme-vchatdark .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.theme-vchatdark .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--pink:hover,.theme-vchatdark .Button--color--pink:focus{background-color:#e257a5;color:#fff}.theme-vchatdark .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.theme-vchatdark .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--brown:hover,.theme-vchatdark .Button--color--brown:focus{background-color:#b47851;color:#fff}.theme-vchatdark .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.theme-vchatdark .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--grey:hover,.theme-vchatdark .Button--color--grey:focus{background-color:#868686;color:#fff}.theme-vchatdark .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.theme-vchatdark .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--light-grey:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--light-grey:hover,.theme-vchatdark .Button--color--light-grey:focus{background-color:#bababa;color:#fff}.theme-vchatdark .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.theme-vchatdark .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--good:hover,.theme-vchatdark .Button--color--good:focus{background-color:#6cba39;color:#fff}.theme-vchatdark .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.theme-vchatdark .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--average:hover,.theme-vchatdark .Button--color--average:focus{background-color:#ed9d35;color:#fff}.theme-vchatdark .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--bad:hover,.theme-vchatdark .Button--color--bad:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.theme-vchatdark .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--label:hover,.theme-vchatdark .Button--color--label:focus{background-color:#91a1b3;color:#fff}.theme-vchatdark .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.theme-vchatdark .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--default:hover,.theme-vchatdark .Button--color--default:focus{background-color:#5c83b0;color:#fff}.theme-vchatdark .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--caution:hover,.theme-vchatdark .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--danger:hover,.theme-vchatdark .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.theme-vchatdark .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--transparent:hover,.theme-vchatdark .Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.theme-vchatdark .Button--disabled{background-color:#999!important}.theme-vchatdark .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--selected:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--selected:hover,.theme-vchatdark .Button--selected:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--flex{display:inline-flex;flex-direction:column}.theme-vchatdark .Button--flex--fluid{width:100%}.theme-vchatdark .Button--verticalAlignContent--top{justify-content:flex-start}.theme-vchatdark .Button--verticalAlignContent--middle{justify-content:center}.theme-vchatdark .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-vchatdark .Button__content{display:block;align-self:stretch}.theme-vchatdark .Button__textMargin{margin-left:.4rem}.theme-vchatdark .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-vchatdark .NumberInput--fluid{display:block}.theme-vchatdark .NumberInput__content{margin-left:.5em}.theme-vchatdark .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-vchatdark .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.theme-vchatdark .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-vchatdark .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-vchatdark .Input--fluid{display:block;width:auto}.theme-vchatdark .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-vchatdark .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-vchatdark .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-vchatdark .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-vchatdark .TextArea--fluid{display:block;width:auto;height:auto}.theme-vchatdark .TextArea--noborder{border:0px}.theme-vchatdark .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-vchatdark .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-vchatdark .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-vchatdark .TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.theme-vchatdark .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-vchatdark .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-vchatdark .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-vchatdark .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-vchatdark .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-vchatdark .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-vchatdark .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-vchatdark .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-vchatdark .Knob__ringFillPivot{transform:rotate(135deg)}.theme-vchatdark .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-vchatdark .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-vchatdark .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-vchatdark .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-vchatdark .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-vchatdark .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-vchatdark .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-vchatdark .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-vchatdark .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-vchatdark .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-vchatdark .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-vchatdark .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-vchatdark .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-vchatdark .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-vchatdark .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-vchatdark .Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.theme-vchatdark .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-vchatdark .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-vchatdark .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.theme-vchatdark .Slider{cursor:e-resize}.theme-vchatdark .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-vchatdark .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-vchatdark .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-vchatdark .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-vchatdark .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-vchatdark .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-vchatdark .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-vchatdark .ProgressBar--color--default{border:.0833333333em solid #3e6189}.theme-vchatdark .ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.theme-vchatdark .ProgressBar--color--black{border-color:#000!important}.theme-vchatdark .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-vchatdark .ProgressBar--color--white{border-color:#d9d9d9!important}.theme-vchatdark .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-vchatdark .ProgressBar--color--red{border-color:#bd2020!important}.theme-vchatdark .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--orange{border-color:#d95e0c!important}.theme-vchatdark .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-vchatdark .ProgressBar--color--yellow{border-color:#d9b804!important}.theme-vchatdark .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-vchatdark .ProgressBar--color--olive{border-color:#9aad14!important}.theme-vchatdark .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-vchatdark .ProgressBar--color--green{border-color:#1b9638!important}.theme-vchatdark .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-vchatdark .ProgressBar--color--teal{border-color:#009a93!important}.theme-vchatdark .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-vchatdark .ProgressBar--color--blue{border-color:#1c71b1!important}.theme-vchatdark .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-vchatdark .ProgressBar--color--violet{border-color:#552dab!important}.theme-vchatdark .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-vchatdark .ProgressBar--color--purple{border-color:#8b2baa!important}.theme-vchatdark .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-vchatdark .ProgressBar--color--pink{border-color:#cf2082!important}.theme-vchatdark .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-vchatdark .ProgressBar--color--brown{border-color:#8c5836!important}.theme-vchatdark .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-vchatdark .ProgressBar--color--grey{border-color:#646464!important}.theme-vchatdark .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-vchatdark .ProgressBar--color--light-grey{border-color:#919191!important}.theme-vchatdark .ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.theme-vchatdark .ProgressBar--color--good{border-color:#4d9121!important}.theme-vchatdark .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-vchatdark .ProgressBar--color--average{border-color:#cd7a0d!important}.theme-vchatdark .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-vchatdark .ProgressBar--color--bad{border-color:#bd2020!important}.theme-vchatdark .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--label{border-color:#657a94!important}.theme-vchatdark .ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.theme-vchatdark .Chat{color:#fff}.theme-vchatdark .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-vchatdark .Chat__badge:before{content:"x"}.theme-vchatdark .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-vchatdark .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-vchatdark .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-vchatdark .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-vchatdark .Chat__highlight{color:#000}.theme-vchatdark .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-vchatdark .ChatMessage{word-wrap:break-word}.theme-vchatdark .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-vchatdark .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-vchatdark .Layout,.theme-vchatdark .Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.theme-vchatdark .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-vchatdark .Layout__content--flexRow{display:flex;flex-flow:row}.theme-vchatdark .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-vchatdark .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(to bottom,#2a2a2a,#202020)}.theme-vchatdark .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-vchatdark .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-vchatdark .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-vchatdark .Window__contentPadding:after{height:0}.theme-vchatdark .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-vchatdark .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(62,62,62,.25);pointer-events:none}.theme-vchatdark .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-vchatdark .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-vchatdark .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-vchatdark .TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-vchatdark .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#363636;transition:color .25s ease-out,background-color .25s ease-out}.theme-vchatdark .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-vchatdark .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-vchatdark .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-vchatdark .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-vchatdark .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-vchatdark .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-vchatdark .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-vchatdark img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-vchatdark img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-vchatdark a{color:#397ea5}.theme-vchatdark a.visited,.theme-vchatdark a:visited{color:#7c00e6}.theme-vchatdark a.popt{text-decoration:none}.theme-vchatdark .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-vchatdark .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-vchatdark .popup .close:hover{background:#999}.theme-vchatdark .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-vchatdark .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-vchatdark .popup input[type=text]:hover,.theme-vchatdark .popup input[type=text]:active,.theme-vchatdark .popup input[type=text]:focus{border-color:green}.theme-vchatdark .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-vchatdark .popup input[type=submit]:hover,.theme-vchatdark .popup input[type=submit]:focus,.theme-vchatdark .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-vchatdark .changeFont{padding:10px}.theme-vchatdark .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-vchatdark .changeFont a:hover{background:#ccc}.theme-vchatdark .highlightPopup{padding:10px;text-align:center}.theme-vchatdark .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-vchatdark .highlightPopup input.highlightColor{background-color:#ff0}.theme-vchatdark .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-vchatdark .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-vchatdark .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-vchatdark .contextMenu a:hover{background-color:#ccc}.theme-vchatdark .filterMessages{padding:5px}.theme-vchatdark .filterMessages div{padding:2px 0}.theme-vchatdark .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-vchatdark .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-vchatdark .motd h1,.theme-vchatdark .motd h2,.theme-vchatdark .motd h3,.theme-vchatdark .motd h4,.theme-vchatdark .motd h5,.theme-vchatdark .motd h6{color:#638500;text-decoration:underline}.theme-vchatdark .motd a,.theme-vchatdark .motd a:link,.theme-vchatdark .motd a:visited,.theme-vchatdark .motd a:active,.theme-vchatdark .motd a:hover{color:#638500}.theme-vchatdark .bold,.theme-vchatdark .name,.theme-vchatdark .prefix,.theme-vchatdark .ooc,.theme-vchatdark .looc,.theme-vchatdark .adminooc,.theme-vchatdark .admin,.theme-vchatdark .medal,.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .italic,.theme-vchatdark .italics{font-style:italic}.theme-vchatdark .highlight{background:#ff0}.theme-vchatdark h1,.theme-vchatdark h2,.theme-vchatdark h3,.theme-vchatdark h4,.theme-vchatdark h5,.theme-vchatdark h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark h1.alert,.theme-vchatdark h2.alert{color:#a4bad6}.theme-vchatdark em{font-style:normal;font-weight:700}.theme-vchatdark .ooc{color:#004ed8;font-weight:700}.theme-vchatdark .ooc .elevated{color:#2e78d9}.theme-vchatdark .ooc .moderator{color:#184880}.theme-vchatdark .ooc .developer{color:#1b521f}.theme-vchatdark .ooc .admin{color:#b82e00}.theme-vchatdark .ooc .event_manager{color:#603}.theme-vchatdark .ooc .aooc{color:#960018}.theme-vchatdark img.text_tag{width:32px;height:10px;min-height:10px}.theme-vchatdark img.icon{vertical-align:middle;max-height:1em}.theme-vchatdark img.icon.bigicon{max-height:32px}.theme-vchatdark .looc{color:#3a9696;font-weight:700}.theme-vchatdark .rlooc{color:#3abb96;font-weight:700}.theme-vchatdark .adminobserverooc{color:#09c;font-weight:700}.theme-vchatdark .adminooc{color:#3d5bc3;font-weight:700}.theme-vchatdark .adminsay{color:#ff4500;font-weight:700}.theme-vchatdark .admin{color:#5975da;font-weight:700}.theme-vchatdark .mentor_channel{color:olive;font-weight:700}.theme-vchatdark .mod_channel{color:#735638;font-weight:700}.theme-vchatdark .admin_channel{color:#9611d4;font-weight:700}.theme-vchatdark .event_channel{color:#c39;font-weight:700}.theme-vchatdark .name{font-weight:700}.theme-vchatdark .hivemind{font-style:italic;color:#fff}.theme-vchatdark .psay,.theme-vchatdark .pemote{color:#e300e4;font-style:italic}.theme-vchatdark .deadsay{color:#732fcd}.theme-vchatdark .binarysay{font-style:italic;color:#fff}.theme-vchatdark .binarysay a{color:#0f0}.theme-vchatdark .binarysay a:active,.theme-vchatdark .binarysay a:visited{color:#8f8}.theme-vchatdark .radio{color:#00a800}.theme-vchatdark .sciradio{color:#939}.theme-vchatdark .comradio{color:#395a9a}.theme-vchatdark .secradio{color:#a30000}.theme-vchatdark .medradio{color:#008160}.theme-vchatdark .engradio{color:#a66300}.theme-vchatdark .supradio{color:#5f4519}.theme-vchatdark .srvradio{color:#6eaa2c}.theme-vchatdark .expradio{color:#555}.theme-vchatdark .syndradio{color:#6d3f40}.theme-vchatdark .gangradio{color:#ac2ea1}.theme-vchatdark .centradio{color:#5c5c8a}.theme-vchatdark .airadio{color:#f0f}.theme-vchatdark .redteamradio{color:#f44!important}.theme-vchatdark .blueteamradio{color:#3434fd!important}.theme-vchatdark .greenteamradio{color:#34fd34!important}.theme-vchatdark .yellowteamradio{color:#fdfd34!important}.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .alert{color:red}.theme-vchatdark .valert{color:#d82020}.theme-vchatdark .userdanger{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .bolddanger{color:#c51e1e;font-weight:700}.theme-vchatdark .danger,.theme-vchatdark .vdanger{color:#c51e1e}.theme-vchatdark .warning,.theme-vchatdark .vwarning{color:#c51e1e;font-style:italic}.theme-vchatdark .alertwarning{color:red;font-weight:700}.theme-vchatdark .boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.theme-vchatdark .announce,.theme-vchatdark .boldannounce{color:#c51e1e;font-weight:700}.theme-vchatdark .minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .minoralert{color:#a4bad6;font-size:125%}.theme-vchatdark .priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.theme-vchatdark .prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.theme-vchatdark .priorityalert{color:#c51e1e;font-size:140%}.theme-vchatdark .greenannounce{color:#059223;font-weight:700}.theme-vchatdark .rose{color:#ff5050}.theme-vchatdark .info,.theme-vchatdark .notice,.theme-vchatdark .vnotice{color:#6060c9}.theme-vchatdark .tinynotice{color:#6060c9;font-size:85%}.theme-vchatdark .tinynoticeital{color:#6060c9;font-style:italic;font-size:85%}.theme-vchatdark .smallnotice{color:#6060c9;font-size:90%}.theme-vchatdark .smallnoticeital{color:#6060c9;font-style:italic;font-size:90%}.theme-vchatdark .bolditalic{font-style:italic;font-weight:700}.theme-vchatdark .boldnotice{color:#6060c9;font-weight:700}.theme-vchatdark .hear{color:#6060c9;font-style:italic}.theme-vchatdark .adminnotice{color:#6060c9}.theme-vchatdark .adminhelp{color:red;font-weight:700}.theme-vchatdark .log_message{color:#386aff;font-weight:700}.theme-vchatdark .unconscious{color:#a4bad6;font-weight:700}.theme-vchatdark .suicide{color:#ff5050;font-style:italic}.theme-vchatdark .green{color:#4f4}.theme-vchatdark .grey{color:#a9a9a9}.theme-vchatdark .red{color:red}.theme-vchatdark .crimson{color:#dc143c}.theme-vchatdark .maroon{color:#c60000}.theme-vchatdark .brown{color:#db733b}.theme-vchatdark .blue{color:#66f}.theme-vchatdark .black,.theme-vchatdark .white{color:#fff}.theme-vchatdark .darkgray{color:gray}.theme-vchatdark .gray{color:#a9a9a9}.theme-vchatdark .yellow{color:#fc0}.theme-vchatdark .pink{color:pink}.theme-vchatdark .cyan{color:#0ff}.theme-vchatdark .orange{color:#ff8c00}.theme-vchatdark .nicegreen{color:#059223}.theme-vchatdark .boldnicegreen{color:#059223;font-weight:700}.theme-vchatdark .blob{color:#ee4000}.theme-vchatdark .blobannounce{color:#556b2f;font-weight:700;font-size:185%}.theme-vchatdark .cult{color:#973e3b}.theme-vchatdark .cultitalic{color:#973e3b;font-style:italic}.theme-vchatdark .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-vchatdark .cultboldtalic,.theme-vchatdark .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-vchatdark .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-vchatdark .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-vchatdark .colossus{color:#7f282a;font-size:310%}.theme-vchatdark .hierophant{color:#b441ee;font-weight:700;font-style:italic}.theme-vchatdark .hierophant_warning{color:#c56bf1;font-style:italic}.theme-vchatdark .purple{color:#9956d3}.theme-vchatdark .lightpurple{color:#ad5aad}.theme-vchatdark .darkpink{color:#e3209b}.theme-vchatdark .holoparasite{color:#88809c}.theme-vchatdark .revennotice{color:#c099e2}.theme-vchatdark .revenboldnotice{color:#c099e2;font-weight:700}.theme-vchatdark .revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.theme-vchatdark .revenminor{color:#823abb}.theme-vchatdark .revenwarning{color:#760fbb;font-style:italic}.theme-vchatdark .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-vchatdark .deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.theme-vchatdark .ghostalert{color:#60f;font-style:italic;font-weight:700}.theme-vchatdark .alien{color:#855d85}.theme-vchatdark .noticealien{color:#059223}.theme-vchatdark .alertalien{color:#059223;font-weight:700}.theme-vchatdark .changeling{color:#b000b1;font-style:italic}.theme-vchatdark .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-vchatdark .spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.theme-vchatdark .spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.theme-vchatdark .spiderscout{color:#231d98;font-weight:700;font-size:120%}.theme-vchatdark .interface{color:#750e75}.theme-vchatdark .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-vchatdark .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-vchatdark .robot{font-family:Courier New,cursive,sans-serif}.theme-vchatdark .tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.theme-vchatdark .command_headset{font-weight:700;font-size:160%}.theme-vchatdark .small{font-size:60%}.theme-vchatdark .big{font-size:185%}.theme-vchatdark .reallybig{font-size:245%}.theme-vchatdark .extremelybig{font-size:310%}.theme-vchatdark .greentext{color:#059223;font-size:185%}.theme-vchatdark .redtext{color:#c51e1e;font-size:185%}.theme-vchatdark .clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-vchatdark .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-vchatdark .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-vchatdark .hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}to{color:#7adbf3}}.theme-vchatdark .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}to{color:#f75a5a}}.theme-vchatdark .icon{height:1em;width:auto}.theme-vchatdark .bigicon{font-size:2.5em}.theme-vchatdark .hugeicon{font-size:5em}.theme-vchatdark .memo{color:#638500;text-align:center}.theme-vchatdark .memoedit{text-align:center;font-size:125%}.theme-vchatdark .abductor{color:#c204c2;font-style:italic}.theme-vchatdark .mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.theme-vchatdark .slime{color:#00ced1}.theme-vchatdark .drone{color:#848482}.theme-vchatdark .monkey{color:#975032}.theme-vchatdark .swarmer{color:#2c75ff}.theme-vchatdark .resonate{color:#298f85}.theme-vchatdark .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-vchatdark .connectionClosed,.theme-vchatdark .fatalError{background:red;color:#fff;padding:5px}.theme-vchatdark .connectionClosed.restored{background:green}.theme-vchatdark .internal.boldnshit{color:#3d5bc3;font-weight:700}.theme-vchatdark .text-normal{font-weight:400;font-style:normal}.theme-vchatdark .hidden{display:none;visibility:hidden}.theme-vchatdark .ml-1{margin-left:1em}.theme-vchatdark .ml-2{margin-left:2em}.theme-vchatdark .ml-3{margin-left:3em}.theme-vchatdark .examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.theme-vchatdark .tooltip{font-style:italic;border-bottom:1px dashed #fff}.theme-vchatdark .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-vchatdark .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-vchatdark .major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-vchatdark .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-vchatdark .minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.theme-vchatdark .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-vchatdark .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_default .major_announcement_title,.theme-vchatdark .chat_alert_default .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_default .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_default .minor_announcement_text,.theme-vchatdark .chat_alert_default .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_green .major_announcement_title,.theme-vchatdark .chat_alert_green .minor_announcement_title{color:#00ff80}.theme-vchatdark .chat_alert_green .subheader_announcement_text{color:#ff85b5}.theme-vchatdark .chat_alert_green .minor_announcement_text,.theme-vchatdark .chat_alert_green .major_announcement_text{background-color:#002400}.theme-vchatdark .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_blue .major_announcement_title,.theme-vchatdark .chat_alert_blue .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_blue .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_blue .minor_announcement_text,.theme-vchatdark .chat_alert_blue .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_pink .major_announcement_title,.theme-vchatdark .chat_alert_pink .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_pink .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_pink .minor_announcement_text,.theme-vchatdark .chat_alert_pink .major_announcement_text{background-color:#17000d}.theme-vchatdark .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_yellow .major_announcement_title,.theme-vchatdark .chat_alert_yellow .minor_announcement_title{color:#fff4e0}.theme-vchatdark .chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_yellow .minor_announcement_text,.theme-vchatdark .chat_alert_yellow .major_announcement_text{background-color:#3e3400}.theme-vchatdark .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_orange .major_announcement_title,.theme-vchatdark .chat_alert_orange .minor_announcement_title{color:#feefe7}.theme-vchatdark .chat_alert_orange .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_orange .minor_announcement_text,.theme-vchatdark .chat_alert_orange .major_announcement_text{background-color:#402500}.theme-vchatdark .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_red .major_announcement_title,.theme-vchatdark .chat_alert_red .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_red .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_red .minor_announcement_text,.theme-vchatdark .chat_alert_red .major_announcement_text{background-color:#290000}.theme-vchatdark .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_purple .major_announcement_title,.theme-vchatdark .chat_alert_purple .minor_announcement_title{color:#c7a1f7}.theme-vchatdark .chat_alert_purple .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_purple .minor_announcement_text,.theme-vchatdark .chat_alert_purple .major_announcement_text{background-color:#150017}.theme-vchatdark .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_grey .major_announcement_title,.theme-vchatdark .chat_alert_grey .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_grey .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_grey .minor_announcement_text,.theme-vchatdark .chat_alert_grey .major_announcement_text{background-color:#181818}.theme-vchatdark .tajaran{color:#803b56}.theme-vchatdark .tajaran_signlang{color:#941c1c}.theme-vchatdark .akhani{color:#ac398c}.theme-vchatdark .skrell{color:#00b0b3}.theme-vchatdark .skrellfar{color:#70fcff}.theme-vchatdark .soghun{color:#50ba6c}.theme-vchatdark .solcom{color:#6da6f0}.theme-vchatdark .sergal{color:#07f}.theme-vchatdark .birdsongc{color:#c90}.theme-vchatdark .vulpkanin{color:#b97a57}.theme-vchatdark .tavan{color:#f54298;font-family:Arial}.theme-vchatdark .echosong{color:#826d8c}.theme-vchatdark .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-vchatdark .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-vchatdark .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-vchatdark .bug{color:#9e9e39}.theme-vchatdark .vox{color:#a0a}.theme-vchatdark .promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.theme-vchatdark .zaddat{color:#941c1c}.theme-vchatdark .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-vchatdark .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-vchatdark .spacer{color:#9c660b}.theme-vchatdark .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-vchatdark .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}
+html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a!important}.color-white{color:#fff!important}.color-red{color:#df3e3e!important}.color-orange{color:#f37f33!important}.color-yellow{color:#fbda21!important}.color-olive{color:#cbe41c!important}.color-green{color:#25ca4c!important}.color-teal{color:#00d6cc!important}.color-blue{color:#2e93de!important}.color-violet{color:#7349cf!important}.color-purple{color:#ad45d0!important}.color-pink{color:#e34da1!important}.color-brown{color:#b97447!important}.color-grey{color:#848484!important}.color-light-grey{color:#b3b3b3!important}.color-good{color:#68c22d!important}.color-average{color:#f29a29!important}.color-bad{color:#df3e3e!important}.color-label{color:#8b9bb0!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-light-grey{background-color:#919191!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9)!important;background:rgba(0,0,0,0)!important;outline:1px solid rgba(255,255,255,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:.167rem solid #1a1a1a!important}.outline-color-white{outline:.167rem solid #fff!important}.outline-color-red{outline:.167rem solid #df3e3e!important}.outline-color-orange{outline:.167rem solid #f37f33!important}.outline-color-yellow{outline:.167rem solid #fbda21!important}.outline-color-olive{outline:.167rem solid #cbe41c!important}.outline-color-green{outline:.167rem solid #25ca4c!important}.outline-color-teal{outline:.167rem solid #00d6cc!important}.outline-color-blue{outline:.167rem solid #2e93de!important}.outline-color-violet{outline:.167rem solid #7349cf!important}.outline-color-purple{outline:.167rem solid #ad45d0!important}.outline-color-pink{outline:.167rem solid #e34da1!important}.outline-color-brown{outline:.167rem solid #b97447!important}.outline-color-grey{outline:.167rem solid #848484!important}.outline-color-light-grey{outline:.167rem solid #b3b3b3!important}.outline-color-good{outline:.167rem solid #68c22d!important}.outline-color-average{outline:.167rem solid #f29a29!important}.outline-color-bad{outline:.167rem solid #df3e3e!important}.outline-color-label{outline:.167rem solid #8b9bb0!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color .1s,background-color .1s}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color .1s,background-color .1s}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color .1s,background-color .1s}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color .1s,background-color .1s}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color .1s,background-color .1s}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color .1s,background-color .1s}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color .1s,background-color .1s}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color .1s,background-color .1s}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color .1s,background-color .1s}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color .1s,background-color .1s}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color .1s,background-color .1s}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color .1s,background-color .1s}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color .1s,background-color .1s}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color .1s,background-color .1s}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color .1s,background-color .1s}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color .1s,background-color .1s}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color .1s,background-color .1s}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color .1s,background-color .1s}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color .1s,background-color .1s}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color .1s,background-color .1s}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color .1s,background-color .1s}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color .1s,background-color .1s}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color .1s,background-color .1s}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999!important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color .1s,background-color .1s}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.Button__textMargin{margin-left:.4rem}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dropdown{display:flex;align-items:flex-start}.Dropdown__control{flex:1;font-family:Verdana,sans-serif;font-size:1em;overflow:hidden;-ms-user-select:none;user-select:none;width:8.3333333333em}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{overflow-y:auto;align-items:center;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-scroll{overflow-y:scroll}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color .1s ease-out}.Dropdown__menuentry.selected{background-color:rgba(255,255,255,.5)!important;transition:background-color 0ms}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-.25em -.5em 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border-color:#552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191!important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.Section{position:relative;margin-bottom:.5em;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.Section .Section:first-child{margin-top:-.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Section--flex{display:flex;flex-flow:column}.Section--flex .Section__content{overflow:auto;flex-grow:1}.Section__content--noTopPadding{padding-top:0}.Section__content--stretchContents{height:calc(100% - 3rem)}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--zebra>.Stack__item:nth-child(2n){background-color:#131313}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:700;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:rgba(0,0,0,0)}.Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:Consolas,monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity .15s ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:#dc143c;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Layout__content--flexRow{display:flex;flex-flow:row}.Layout__content--flexColumn{display:flex;flex-flow:column}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom,#202020,#202020)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited,a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:700}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:700}.ooc{color:#cca300;font-weight:700}.ooc .elevated{color:#2e78d9}.ooc .moderator{color:#184880}.ooc .developer{color:#1b521f}.ooc .admin{color:#b82e00}.ooc .event_manager{color:#603}.ooc .aooc{color:#960018}img.text_tag{width:32px;height:10px;min-height:10px}img.icon{vertical-align:middle;max-height:1em}img.icon.bigicon{max-height:32px}.looc{color:#3a9696;font-weight:700}.rlooc{color:#3abb96;font-weight:700}.adminobserverooc{color:#09c;font-weight:700}.adminooc{color:#3d5bc3;font-weight:700}.adminsay{color:#ff4500;font-weight:700}.admin{color:#5975da;font-weight:700}.mentor_channel{color:olive;font-weight:700}.mod_channel{color:#735638;font-weight:700}.admin_channel{color:#9611d4;font-weight:700}.event_channel{color:#c39;font-weight:700}.name{font-weight:700}.hivemind{font-style:italic}.psay,.pemote{color:#e300e4;font-style:italic}.deadsay{color:#e2c1ff}.binarysay{font-style:italic;color:#1e90ff}.binarysay a{color:#0f0}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#57b8f0}.secradio{color:#dd3535}.medradio{color:#57f09e}.engradio{color:#fcdf03}.supradio{color:#b88646}.srvradio{color:#6ca729}.expradio{color:#8a8a8a}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centradio{color:#2681a5}.airadio{color:#d65d95}.redteamradio{color:#f44!important}.blueteamradio{color:#3434fd!important}.greenteamradio{color:#34fd34!important}.yellowteamradio{color:#fdfd34!important}.yell{font-weight:700}.alert,.valert{color:#d82020}.userdanger{color:#c51e1e;font-weight:700;font-size:185%}.bolddanger{color:#c51e1e;font-weight:700}.danger,.vdanger{color:#c51e1e}.warning,.vwarning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:700}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.announce,.boldannounce{color:#c51e1e;font-weight:700}.minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.minoralert{color:#a4bad6;font-size:125%}.priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.priorityalert{color:#c51e1e;font-size:140%}.greenannounce{color:#059223;font-weight:700}.rose{color:#ff5050}.info{color:#9ab0ff}.notice,.vnotice{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.bolditalic{font-style:italic;font-weight:700}.boldnotice{color:#6685f5;font-weight:700}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:700}.log_message{color:#386aff;font-weight:700}.unconscious{color:#a4bad6;font-weight:700}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.crimson{color:#dc143c}.maroon{color:#c60000}.brown{color:#db733b}.blue{color:#4173fd}.black,.white{color:#fff}.darkgray{color:gray}.gray{color:#a9a9a9}.yellow{color:#fc0}.pink{color:pink}.cyan{color:#0ff}.orange{color:#ff8c00}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:700}.blob{color:#ee4000}.blobannounce{color:#556b2f;font-weight:700;font-size:185%}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:700}.cultboldtalic,.cultlarge{color:#973e3b;font-weight:700;font-size:185%}.narsie{color:#973e3b;font-weight:700;font-size:925%}.narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:700;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.lightpurple{color:#ad5aad}.darkpink{color:#e3209b}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:700}.revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:700;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:700}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:700}.changeling{color:#b000b1;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:700}.spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.spiderscout{color:#231d98;font-weight:700;font-size:120%}.interface{color:#961196}.sans{font-family:Comic Sans MS,cursive,sans-serif}.papyrus{font-family:Papyrus,cursive,sans-serif}.robot{font-family:Courier New,cursive,sans-serif}.tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.command_headset{font-weight:700;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}.phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.hugeicon{font-size:5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:700}.text-normal{font-weight:400;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.tooltip{font-style:italic;border-bottom:1px dashed #fff}.major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.ooc_alert{background:#4d4100;border:1px solid #cca300;margin:.5em;padding:.5em .5em .5em .2em;color:#fff;font-weight:700;display:flex;flex-direction:column}.ooc_announcement_text{color:#cca300;padding:.5em 0 0 .35em;display:flex;flex-direction:column}.chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_default .major_announcement_title,.chat_alert_default .minor_announcement_title{color:#33d5ff}.chat_alert_default .subheader_announcement_text{color:#ff5297}.chat_alert_default .minor_announcement_text,.chat_alert_default .major_announcement_text{background-color:#001621}.chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_green .major_announcement_title,.chat_alert_green .minor_announcement_title{color:#00ff80}.chat_alert_green .subheader_announcement_text{color:#ff85b5}.chat_alert_green .minor_announcement_text,.chat_alert_green .major_announcement_text{background-color:#002400}.chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_blue .major_announcement_title,.chat_alert_blue .minor_announcement_title{color:#33d5ff}.chat_alert_blue .subheader_announcement_text{color:#ff5297}.chat_alert_blue .minor_announcement_text,.chat_alert_blue .major_announcement_text{background-color:#001621}.chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_pink .major_announcement_title,.chat_alert_pink .minor_announcement_title{color:#ff5297}.chat_alert_pink .subheader_announcement_text{color:#33d5ff}.chat_alert_pink .minor_announcement_text,.chat_alert_pink .major_announcement_text{background-color:#17000d}.chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_yellow .major_announcement_title,.chat_alert_yellow .minor_announcement_title{color:#fff4e0}.chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.chat_alert_yellow .minor_announcement_text,.chat_alert_yellow .major_announcement_text{background-color:#3e3400}.chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_orange .major_announcement_title,.chat_alert_orange .minor_announcement_title{color:#feefe7}.chat_alert_orange .subheader_announcement_text{color:#33d5ff}.chat_alert_orange .minor_announcement_text,.chat_alert_orange .major_announcement_text{background-color:#402500}.chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_red .major_announcement_title,.chat_alert_red .minor_announcement_title{color:#ff5297}.chat_alert_red .subheader_announcement_text{color:#33d5ff}.chat_alert_red .minor_announcement_text,.chat_alert_red .major_announcement_text{background-color:#290000}.chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_purple .major_announcement_title,.chat_alert_purple .minor_announcement_title{color:#c7a1f7}.chat_alert_purple .subheader_announcement_text{color:#33d5ff}.chat_alert_purple .minor_announcement_text,.chat_alert_purple .major_announcement_text{background-color:#150017}.chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_grey .major_announcement_title,.chat_alert_grey .minor_announcement_title{color:#ff5297}.chat_alert_grey .subheader_announcement_text{color:#33d5ff}.chat_alert_grey .minor_announcement_text,.chat_alert_grey .major_announcement_text{background-color:#181818}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.akhani{color:#ac398c}.skrell{color:#00b0b3}.skrellfar{color:#70fcff}.soghun{color:#50ba6c}.solcom{color:#6da6f0}.sergal{color:#07f}.birdsongc{color:#c90}.vulpkanin{color:#b97a57}.tavan{color:#f54298;font-family:Arial}.echosong{color:#826d8c}.enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.bug{color:#9e9e39}.vox{color:#a0a}.promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.zaddat{color:#941c1c}.rough{font-family:Trebuchet MS,cursive,sans-serif}.say_quote{font-family:Georgia,Verdana,sans-serif}.say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.terminus{font-family:Times New Roman,Times,serif,sans-serif}.spacer{color:#9c660b}.teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif;line-height:.3}.theme-light .color-black{color:#000!important}.theme-light .color-white{color:#e6e6e6!important}.theme-light .color-red{color:#c82121!important}.theme-light .color-orange{color:#e6630d!important}.theme-light .color-yellow{color:#e5c304!important}.theme-light .color-olive{color:#a3b816!important}.theme-light .color-green{color:#1d9f3b!important}.theme-light .color-teal{color:#00a39c!important}.theme-light .color-blue{color:#1e78bb!important}.theme-light .color-violet{color:#5a30b5!important}.theme-light .color-purple{color:#932eb4!important}.theme-light .color-pink{color:#db228a!important}.theme-light .color-brown{color:#955d39!important}.theme-light .color-grey{color:#e6e6e6!important}.theme-light .color-light-grey{color:#999!important}.theme-light .color-good{color:#529923!important}.theme-light .color-average{color:#da810e!important}.theme-light .color-bad{color:#c82121!important}.theme-light .color-label{color:#353535!important}.theme-light .color-bg-black{background-color:#000!important}.theme-light .color-bg-white{background-color:#bfbfbf!important}.theme-light .color-bg-red{background-color:#a61c1c!important}.theme-light .color-bg-orange{background-color:#c0530b!important}.theme-light .color-bg-yellow{background-color:#bfa303!important}.theme-light .color-bg-olive{background-color:#889912!important}.theme-light .color-bg-green{background-color:#188532!important}.theme-light .color-bg-teal{background-color:#008882!important}.theme-light .color-bg-blue{background-color:#19649c!important}.theme-light .color-bg-violet{background-color:#4b2897!important}.theme-light .color-bg-purple{background-color:#7a2696!important}.theme-light .color-bg-pink{background-color:#b61d73!important}.theme-light .color-bg-brown{background-color:#7c4d2f!important}.theme-light .color-bg-grey{background-color:#bfbfbf!important}.theme-light .color-bg-light-grey{background-color:gray!important}.theme-light .color-bg-good{background-color:#44801d!important}.theme-light .color-bg-average{background-color:#b56b0b!important}.theme-light .color-bg-bad{background-color:#a61c1c!important}.theme-light .color-bg-label{background-color:#2c2c2c!important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-light .Section .Section:first-child{margin-top:-.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Section--flex{display:flex;flex-flow:column}.theme-light .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-light .Section__content--noTopPadding{padding-top:0}.theme-light .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-light .Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-light .Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636!important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color .1s,background-color .1s}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Button__textMargin{margin-left:.4rem}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-light .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotate(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-light .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-light .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000!important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf!important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c!important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b!important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303!important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912!important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532!important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882!important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c!important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--violet{border-color:#4b2897!important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696!important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73!important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f!important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf!important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray!important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d!important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b!important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c!important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c!important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Layout__content--flexRow{display:flex;flex-flow:row}.theme-light .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee,#eee)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s ease-out,background-color .25s ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:#00f}.theme-light a.visited,.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:700}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:#00f;font-family:Georgia,Verdana,sans-serif}.theme-light em{font-style:normal;font-weight:700}.theme-light .ooc{color:#002eb8;font-weight:700}.theme-light .ooc .elevated{color:#2e78d9}.theme-light .ooc .moderator{color:#184880}.theme-light .ooc .developer{color:#1b521f}.theme-light .ooc .admin{color:#b82e00}.theme-light .ooc .event_manager{color:#603}.theme-light .ooc .aooc{color:#960018}.theme-light img.text_tag{width:32px;height:10px;min-height:10px}.theme-light img.icon{vertical-align:middle;max-height:1em}.theme-light img.icon.bigicon{max-height:32px}.theme-light .looc{color:#3a9696;font-weight:700}.theme-light .rlooc{color:#3abb96;font-weight:700}.theme-light .adminobserverooc{color:#09c;font-weight:700}.theme-light .adminooc{color:#700038;font-weight:700}.theme-light .adminsay{color:#ff4500;font-weight:700}.theme-light .admin{color:#4473ff;font-weight:700}.theme-light .mentor_channel{color:olive;font-weight:700}.theme-light .mod_channel{color:#735638;font-weight:700}.theme-light .admin_channel{color:#9611d4;font-weight:700}.theme-light .event_channel{color:#c39;font-weight:700}.theme-light .name{font-weight:700}.theme-light .hivemind{font-style:italic}.theme-light .psay,.theme-light .pemote{color:purple;font-style:italic}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{font-style:italic;color:#20c20e;background-color:#000;display:inline-block}.theme-light .binarysay a{color:#0f0}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#337296}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#339661}.theme-light .engradio{color:#948f02}.theme-light .supradio{color:#a8732b}.theme-light .srvradio{color:#6eaa2c}.theme-light .expradio{color:#555}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centradio{color:#686868}.theme-light .airadio{color:#f0f}.theme-light .redteamradio{color:red!important}.theme-light .blueteamradio{color:#00f!important}.theme-light .greenteamradio{color:#0f0!important}.theme-light .yellowteamradio{color:#d1ba22!important}.theme-light .yell{font-weight:700}.theme-light .alert,.theme-light .valert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:700;font-size:185%}.theme-light .bolddanger{color:red;font-weight:700}.theme-light .danger,.theme-light .vdanger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning,.theme-light .vwarning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:700}.theme-light .boldwarning{color:red;font-style:italic;font-weight:700}.theme-light .announce{color:#228b22;font-weight:700}.theme-light .boldannounce{color:red;font-weight:700}.theme-light .minorannounce{color:red;font-weight:700;font-size:185%}.theme-light .minoralert{color:#000;font-size:125%}.theme-light .priorityannounce{color:#000;font-weight:700;font-size:225%}.theme-light .prioritytitle{color:#00f;font-weight:700;font-size:185%}.theme-light .priorityalert{color:red;font-size:140%}.theme-light .greenannounce{color:#0f0;font-weight:700}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice,.theme-light .vnotice{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:700}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:#00f}.theme-light .adminhelp{color:red;font-weight:700}.theme-light .log_message{color:#386aff;font-weight:700}.theme-light .unconscious{color:#00f;font-weight:700}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .crimson{color:#dc143c}.theme-light .maroon{color:maroon}.theme-light .brown{color:#8d4925}.theme-light .blue{color:#00f}.theme-light .black,.theme-light .white{color:#000}.theme-light .darkgray{color:gray}.theme-light .gray{color:#a9a9a9}.theme-light .yellow{color:#fc0}.theme-light .pink{color:pink}.theme-light .cyan{color:#0ff}.theme-light .orange{color:#ff8c00}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:700}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-light .cultboldtalic,.theme-light .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-light .blob{color:#ee4000}.theme-light .blobannounce{color:#323f1c;font-weight:700;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:700;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .lightpurple{color:#ad5aad}.theme-light .darkpink{color:#e3209b}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:700}.theme-light .revenbignotice{color:#1d2953;font-weight:700;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:700}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:700}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-light .spiderbroodmother{color:#4d004d;font-weight:700;font-size:185%}.theme-light .spiderbreacher{color:#804b02;font-weight:700;font-size:140%}.theme-light .spiderscout{color:#0c0674;font-weight:700;font-size:120%}.theme-light .interface{color:#303}.theme-light .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-light .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-light .robot{font-family:Courier New,cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:Courier New,cursive,sans-serif}.theme-light .command_headset{font-weight:700;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:#0f0;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-light .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}.theme-light .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .hugeicon{font-size:5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:700;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:#00f;font-weight:700}.theme-light .text-normal{font-weight:400;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000}.theme-light .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-light .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-light .major_announcement_text{color:#131313;background-color:#eaeaea;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-light .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-light .minor_announcement_text{background-color:#eaeaea;color:#202020;padding:.5rem;text-align:left;font-size:100%}.theme-light .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-light .ooc_alert{background:#bdc8ff;border:1px solid #002eb8;margin:.5em;padding:.5em .5em .5em .2em;color:#00283a;font-weight:700;display:flex;flex-direction:column}.theme-light .ooc_announcement_text{color:#002eb8;padding:.5em 0 0 .35em;display:flex;flex-direction:column}.theme-light .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_default .major_announcement_title,.theme-light .chat_alert_default .minor_announcement_title{color:#003061}.theme-light .chat_alert_default .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_default .minor_announcement_text,.theme-light .chat_alert_default .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdffbd,#bdffbd 10px,#adffad 10px,#adffad 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_green .major_announcement_title,.theme-light .chat_alert_green .minor_announcement_title{color:#005229}.theme-light .chat_alert_green .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_green .minor_announcement_text,.theme-light .chat_alert_green .major_announcement_text{background-color:#d7ffd7}.theme-light .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_blue .major_announcement_title,.theme-light .chat_alert_blue .minor_announcement_title{color:#003061}.theme-light .chat_alert_blue .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_blue .minor_announcement_text,.theme-light .chat_alert_blue .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2e5,#ffc2e5 10px,#ffb3df 10px,#ffb3df 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_pink .major_announcement_title,.theme-light .chat_alert_pink .minor_announcement_title{color:#800033}.theme-light .chat_alert_pink .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_pink .minor_announcement_text,.theme-light .chat_alert_pink .major_announcement_text{background-color:#ffdcf0}.theme-light .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fff5c2,#fff5c2 10px,#fff3b3 10px,#fff3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_yellow .major_announcement_title,.theme-light .chat_alert_yellow .minor_announcement_title{color:#754900}.theme-light .chat_alert_yellow .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_yellow .minor_announcement_text,.theme-light .chat_alert_yellow .major_announcement_text{background-color:#fff9dc}.theme-light .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffe8c2,#ffe8c2 10px,#ffe2b3 10px,#ffe2b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_orange .major_announcement_title,.theme-light .chat_alert_orange .minor_announcement_title{color:#823208}.theme-light .chat_alert_orange .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_orange .minor_announcement_text,.theme-light .chat_alert_orange .major_announcement_text{background-color:#fff2dc}.theme-light .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2c2,#ffc2c2 10px,#ffb3b3 10px,#ffb3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_red .major_announcement_title,.theme-light .chat_alert_red .minor_announcement_title{color:#800029}.theme-light .chat_alert_red .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_red .minor_announcement_text,.theme-light .chat_alert_red .major_announcement_text{background-color:#ffdcdc}.theme-light .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fbd1ff,#fbd1ff 10px,#fac2ff 10px,#fac2ff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_purple .major_announcement_title,.theme-light .chat_alert_purple .minor_announcement_title{color:#450d8c}.theme-light .chat_alert_purple .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_purple .minor_announcement_text,.theme-light .chat_alert_purple .major_announcement_text{background-color:#fdebff}.theme-light .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ebebeb,#ebebeb 10px,#e3e3e3 10px,#e3e3e3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_grey .major_announcement_title,.theme-light .chat_alert_grey .minor_announcement_title{color:#800033}.theme-light .chat_alert_grey .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_grey .minor_announcement_text,.theme-light .chat_alert_grey .major_announcement_text{background-color:#f8f8f8}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .akhani{color:#ac398c}.theme-light .skrell{color:#00b0b3}.theme-light .skrellfar{color:#70fcff}.theme-light .soghun{color:#50ba6c}.theme-light .solcom{color:#3333ce}.theme-light .sergal{color:#07f}.theme-light .birdsongc{color:#c90}.theme-light .vulpkanin{color:#b97a57}.theme-light .tavan{color:#f54298;font-family:Arial}.theme-light .echosong{color:#826d8c}.theme-light .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-light .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-light .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-light .bug{color:#9e9e39}.theme-light .vox{color:#a0a}.theme-light .promethean{color:#5a5a5a;font-family:Comic Sans MS,Comic Sans,cursive}.theme-light .zaddat{color:#941c1c}.theme-light .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-light .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-light .spacer{color:#9c660b}.theme-light .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-light .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif;line-height:.3}.theme-vchatlight .color-black{color:#000!important}.theme-vchatlight .color-white{color:#e6e6e6!important}.theme-vchatlight .color-red{color:#c82121!important}.theme-vchatlight .color-orange{color:#e6630d!important}.theme-vchatlight .color-yellow{color:#e5c304!important}.theme-vchatlight .color-olive{color:#a3b816!important}.theme-vchatlight .color-green{color:#1d9f3b!important}.theme-vchatlight .color-teal{color:#00a39c!important}.theme-vchatlight .color-blue{color:#1e78bb!important}.theme-vchatlight .color-violet{color:#5a30b5!important}.theme-vchatlight .color-purple{color:#932eb4!important}.theme-vchatlight .color-pink{color:#db228a!important}.theme-vchatlight .color-brown{color:#955d39!important}.theme-vchatlight .color-grey{color:#e6e6e6!important}.theme-vchatlight .color-light-grey{color:#999!important}.theme-vchatlight .color-good{color:#529923!important}.theme-vchatlight .color-average{color:#da810e!important}.theme-vchatlight .color-bad{color:#c82121!important}.theme-vchatlight .color-label{color:#353535!important}.theme-vchatlight .color-bg-black{background-color:#000!important}.theme-vchatlight .color-bg-white{background-color:#bfbfbf!important}.theme-vchatlight .color-bg-red{background-color:#a61c1c!important}.theme-vchatlight .color-bg-orange{background-color:#c0530b!important}.theme-vchatlight .color-bg-yellow{background-color:#bfa303!important}.theme-vchatlight .color-bg-olive{background-color:#889912!important}.theme-vchatlight .color-bg-green{background-color:#188532!important}.theme-vchatlight .color-bg-teal{background-color:#008882!important}.theme-vchatlight .color-bg-blue{background-color:#19649c!important}.theme-vchatlight .color-bg-violet{background-color:#4b2897!important}.theme-vchatlight .color-bg-purple{background-color:#7a2696!important}.theme-vchatlight .color-bg-pink{background-color:#b61d73!important}.theme-vchatlight .color-bg-brown{background-color:#7c4d2f!important}.theme-vchatlight .color-bg-grey{background-color:#bfbfbf!important}.theme-vchatlight .color-bg-light-grey{background-color:gray!important}.theme-vchatlight .color-bg-good{background-color:#44801d!important}.theme-vchatlight .color-bg-average{background-color:#b56b0b!important}.theme-vchatlight .color-bg-bad{background-color:#a61c1c!important}.theme-vchatlight .color-bg-label{background-color:#2c2c2c!important}.theme-vchatlight .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-vchatlight .Tabs--fill{height:100%}.theme-vchatlight .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-vchatlight .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-vchatlight .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-vchatlight .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-vchatlight .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-vchatlight .Tabs--horizontal:last-child{margin-bottom:0}.theme-vchatlight .Tabs__Tab{flex-grow:0}.theme-vchatlight .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-vchatlight .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-vchatlight .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-vchatlight .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-vchatlight .Tab__text{flex-grow:1;margin:0 .5em}.theme-vchatlight .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-vchatlight .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-vchatlight .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-vchatlight .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-vchatlight .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-vchatlight .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-vchatlight .Tab--selected.Tab--color--black{color:#404040}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-vchatlight .Tab--selected.Tab--color--white{color:#ececec}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-vchatlight .Tab--selected.Tab--color--red{color:#e14d4d}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-vchatlight .Tab--selected.Tab--color--orange{color:#f48942}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-vchatlight .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-vchatlight .Tab--selected.Tab--color--olive{color:#d0e732}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-vchatlight .Tab--selected.Tab--color--green{color:#33da5a}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-vchatlight .Tab--selected.Tab--color--teal{color:#00faef}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-vchatlight .Tab--selected.Tab--color--blue{color:#419ce1}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-vchatlight .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-vchatlight .Tab--selected.Tab--color--purple{color:#b455d4}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-vchatlight .Tab--selected.Tab--color--pink{color:#e558a7}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-vchatlight .Tab--selected.Tab--color--brown{color:#c0825a}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-vchatlight .Tab--selected.Tab--color--grey{color:#ececec}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-vchatlight .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-vchatlight .Tab--selected.Tab--color--good{color:#77d23b}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-vchatlight .Tab--selected.Tab--color--average{color:#f3a23a}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-vchatlight .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-vchatlight .Tab--selected.Tab--color--label{color:#686868}.theme-vchatlight .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-vchatlight .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-vchatlight .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-vchatlight .Section:last-child{margin-bottom:0}.theme-vchatlight .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-vchatlight .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-vchatlight .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-vchatlight .Section__rest{position:relative}.theme-vchatlight .Section__content{padding:.66em .5em}.theme-vchatlight .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-vchatlight .Section--fill{display:flex;flex-direction:column;height:100%}.theme-vchatlight .Section--fill>.Section__rest{flex-grow:1}.theme-vchatlight .Section--fill>.Section__rest>.Section__content{height:100%}.theme-vchatlight .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-vchatlight .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-vchatlight .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-vchatlight .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-vchatlight .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-vchatlight .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-vchatlight .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-vchatlight .Section .Section:first-child{margin-top:-.5em}.theme-vchatlight .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-vchatlight .Section .Section .Section .Section__titleText{font-size:1em}.theme-vchatlight .Section--flex{display:flex;flex-flow:column}.theme-vchatlight .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-vchatlight .Section__content--noTopPadding{padding-top:0}.theme-vchatlight .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-vchatlight .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-vchatlight .Button:last-child{margin-right:0;margin-bottom:0}.theme-vchatlight .Button .fa,.theme-vchatlight .Button .fas,.theme-vchatlight .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-vchatlight .Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.theme-vchatlight .Button--hasContent .fa,.theme-vchatlight .Button--hasContent .fas,.theme-vchatlight .Button--hasContent .far{margin-right:.25em}.theme-vchatlight .Button--hasContent.Button--iconPosition--right .fa,.theme-vchatlight .Button--hasContent.Button--iconPosition--right .fas,.theme-vchatlight .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-vchatlight .Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.theme-vchatlight .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-vchatlight .Button--circular{border-radius:50%}.theme-vchatlight .Button--compact{padding:0 .25em;line-height:1.333em}.theme-vchatlight .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-vchatlight .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--black:hover,.theme-vchatlight .Button--color--black:focus{background-color:#131313;color:#fff}.theme-vchatlight .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-vchatlight .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--white:hover,.theme-vchatlight .Button--color--white:focus{background-color:#efefef;color:#000}.theme-vchatlight .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-vchatlight .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--red:hover,.theme-vchatlight .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-vchatlight .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-vchatlight .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--orange:hover,.theme-vchatlight .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-vchatlight .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-vchatlight .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--yellow:hover,.theme-vchatlight .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-vchatlight .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-vchatlight .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--olive:hover,.theme-vchatlight .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-vchatlight .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-vchatlight .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--green:hover,.theme-vchatlight .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-vchatlight .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-vchatlight .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--teal:hover,.theme-vchatlight .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-vchatlight .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-vchatlight .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--blue:hover,.theme-vchatlight .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-vchatlight .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-vchatlight .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--violet:hover,.theme-vchatlight .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-vchatlight .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-vchatlight .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--purple:hover,.theme-vchatlight .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-vchatlight .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-vchatlight .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--pink:hover,.theme-vchatlight .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-vchatlight .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-vchatlight .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--brown:hover,.theme-vchatlight .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-vchatlight .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-vchatlight .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--grey:hover,.theme-vchatlight .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-vchatlight .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-vchatlight .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--light-grey:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--light-grey:hover,.theme-vchatlight .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-vchatlight .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-vchatlight .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--good:hover,.theme-vchatlight .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-vchatlight .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-vchatlight .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--average:hover,.theme-vchatlight .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-vchatlight .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-vchatlight .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--bad:hover,.theme-vchatlight .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-vchatlight .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-vchatlight .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--label:hover,.theme-vchatlight .Button--color--label:focus{background-color:#464646;color:#fff}.theme-vchatlight .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-vchatlight .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--default:hover,.theme-vchatlight .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-vchatlight .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-vchatlight .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--caution:hover,.theme-vchatlight .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-vchatlight .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-vchatlight .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--danger:hover,.theme-vchatlight .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-vchatlight .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-vchatlight .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--color--transparent:hover,.theme-vchatlight .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-vchatlight .Button--disabled{background-color:#363636!important}.theme-vchatlight .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-vchatlight .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-vchatlight .Button--selected:focus{transition:color .1s,background-color .1s}.theme-vchatlight .Button--selected:hover,.theme-vchatlight .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-vchatlight .Button--flex{display:inline-flex;flex-direction:column}.theme-vchatlight .Button--flex--fluid{width:100%}.theme-vchatlight .Button--verticalAlignContent--top{justify-content:flex-start}.theme-vchatlight .Button--verticalAlignContent--middle{justify-content:center}.theme-vchatlight .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-vchatlight .Button__content{display:block;align-self:stretch}.theme-vchatlight .Button__textMargin{margin-left:.4rem}.theme-vchatlight .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-vchatlight .NumberInput--fluid{display:block}.theme-vchatlight .NumberInput__content{margin-left:.5em}.theme-vchatlight .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-vchatlight .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-vchatlight .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-vchatlight .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-vchatlight .Input--fluid{display:block;width:auto}.theme-vchatlight .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-vchatlight .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-vchatlight .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatlight .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-vchatlight .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-vchatlight .TextArea--fluid{display:block;width:auto;height:auto}.theme-vchatlight .TextArea--noborder{border:0px}.theme-vchatlight .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-vchatlight .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-vchatlight .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatlight .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-vchatlight .TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.theme-vchatlight .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-vchatlight .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-vchatlight .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-vchatlight .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-vchatlight .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-vchatlight .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatlight .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-vchatlight .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-vchatlight .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-vchatlight .Knob__ringFillPivot{transform:rotate(135deg)}.theme-vchatlight .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-vchatlight .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-vchatlight .Knob--color--black .Knob__ringFill{stroke:#000}.theme-vchatlight .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-vchatlight .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-vchatlight .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-vchatlight .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-vchatlight .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-vchatlight .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-vchatlight .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-vchatlight .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-vchatlight .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-vchatlight .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-vchatlight .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-vchatlight .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-vchatlight .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-vchatlight .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-vchatlight .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-vchatlight .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-vchatlight .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-vchatlight .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-vchatlight .Slider{cursor:e-resize}.theme-vchatlight .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-vchatlight .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-vchatlight .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-vchatlight .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatlight .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-vchatlight .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-vchatlight .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-vchatlight .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-vchatlight .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-vchatlight .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-vchatlight .ProgressBar--color--black{border-color:#000!important}.theme-vchatlight .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-vchatlight .ProgressBar--color--white{border-color:#bfbfbf!important}.theme-vchatlight .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-vchatlight .ProgressBar--color--red{border-color:#a61c1c!important}.theme-vchatlight .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-vchatlight .ProgressBar--color--orange{border-color:#c0530b!important}.theme-vchatlight .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-vchatlight .ProgressBar--color--yellow{border-color:#bfa303!important}.theme-vchatlight .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-vchatlight .ProgressBar--color--olive{border-color:#889912!important}.theme-vchatlight .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-vchatlight .ProgressBar--color--green{border-color:#188532!important}.theme-vchatlight .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-vchatlight .ProgressBar--color--teal{border-color:#008882!important}.theme-vchatlight .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-vchatlight .ProgressBar--color--blue{border-color:#19649c!important}.theme-vchatlight .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-vchatlight .ProgressBar--color--violet{border-color:#4b2897!important}.theme-vchatlight .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-vchatlight .ProgressBar--color--purple{border-color:#7a2696!important}.theme-vchatlight .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-vchatlight .ProgressBar--color--pink{border-color:#b61d73!important}.theme-vchatlight .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-vchatlight .ProgressBar--color--brown{border-color:#7c4d2f!important}.theme-vchatlight .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-vchatlight .ProgressBar--color--grey{border-color:#bfbfbf!important}.theme-vchatlight .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-vchatlight .ProgressBar--color--light-grey{border-color:gray!important}.theme-vchatlight .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-vchatlight .ProgressBar--color--good{border-color:#44801d!important}.theme-vchatlight .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-vchatlight .ProgressBar--color--average{border-color:#b56b0b!important}.theme-vchatlight .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-vchatlight .ProgressBar--color--bad{border-color:#a61c1c!important}.theme-vchatlight .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-vchatlight .ProgressBar--color--label{border-color:#2c2c2c!important}.theme-vchatlight .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-vchatlight .Chat{color:#000}.theme-vchatlight .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-vchatlight .Chat__badge:before{content:"x"}.theme-vchatlight .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-vchatlight .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-vchatlight .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-vchatlight .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-vchatlight .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-vchatlight .Chat__highlight{color:#000}.theme-vchatlight .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-vchatlight .ChatMessage{word-wrap:break-word}.theme-vchatlight .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-vchatlight .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-vchatlight .Layout,.theme-vchatlight .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-vchatlight .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-vchatlight .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-vchatlight .Layout__content--flexRow{display:flex;flex-flow:row}.theme-vchatlight .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-vchatlight .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee,#eee)}.theme-vchatlight .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-vchatlight .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-vchatlight .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-vchatlight .Window__contentPadding:after{height:0}.theme-vchatlight .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-vchatlight .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-vchatlight .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-vchatlight .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-vchatlight .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-vchatlight .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-vchatlight .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s ease-out,background-color .25s ease-out}.theme-vchatlight .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-vchatlight .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-vchatlight .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-vchatlight .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-vchatlight .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-vchatlight .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-vchatlight .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-vchatlight html,.theme-vchatlight body{padding:0;margin:0;height:100%;color:#000}.theme-vchatlight body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-vchatlight img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-vchatlight img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-vchatlight a{color:#00f}.theme-vchatlight a.visited,.theme-vchatlight a:visited{color:#f0f}.theme-vchatlight a.popt{text-decoration:none}.theme-vchatlight .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-vchatlight .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-vchatlight .popup .close:hover{background:#999}.theme-vchatlight .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-vchatlight .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-vchatlight .popup input[type=text]:hover,.theme-vchatlight .popup input[type=text]:active,.theme-vchatlight .popup input[type=text]:focus{border-color:green}.theme-vchatlight .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-vchatlight .popup input[type=submit]:hover,.theme-vchatlight .popup input[type=submit]:focus,.theme-vchatlight .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-vchatlight .changeFont{padding:10px}.theme-vchatlight .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-vchatlight .changeFont a:hover{background:#ccc}.theme-vchatlight .highlightPopup{padding:10px;text-align:center}.theme-vchatlight .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-vchatlight .highlightPopup input.highlightColor{background-color:#ff0}.theme-vchatlight .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-vchatlight .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-vchatlight .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-vchatlight .contextMenu a:hover{background-color:#ccc}.theme-vchatlight .filterMessages{padding:5px}.theme-vchatlight .filterMessages div{padding:2px 0}.theme-vchatlight .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-vchatlight .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-vchatlight .motd h1,.theme-vchatlight .motd h2,.theme-vchatlight .motd h3,.theme-vchatlight .motd h4,.theme-vchatlight .motd h5,.theme-vchatlight .motd h6{color:#638500;text-decoration:underline}.theme-vchatlight .motd a,.theme-vchatlight .motd a:link,.theme-vchatlight .motd a:visited,.theme-vchatlight .motd a:active,.theme-vchatlight .motd a:hover{color:#638500}.theme-vchatlight .bold,.theme-vchatlight .name,.theme-vchatlight .prefix,.theme-vchatlight .ooc,.theme-vchatlight .looc,.theme-vchatlight .adminooc,.theme-vchatlight .admin,.theme-vchatlight .medal,.theme-vchatlight .yell{font-weight:700}.theme-vchatlight .italic,.theme-vchatlight .italics{font-style:italic}.theme-vchatlight .highlight{background:#ff0}.theme-vchatlight h1,.theme-vchatlight h2,.theme-vchatlight h3,.theme-vchatlight h4,.theme-vchatlight h5,.theme-vchatlight h6{color:#00f;font-family:Georgia,Verdana,sans-serif}.theme-vchatlight em{font-style:normal;font-weight:700}.theme-vchatlight .ooc{color:#002eb8;font-weight:700}.theme-vchatlight .ooc .elevated{color:#2e78d9}.theme-vchatlight .ooc .moderator{color:#184880}.theme-vchatlight .ooc .developer{color:#1b521f}.theme-vchatlight .ooc .admin{color:#b82e00}.theme-vchatlight .ooc .event_manager{color:#603}.theme-vchatlight .ooc .aooc{color:#960018}.theme-vchatlight img.text_tag{width:32px;height:10px;min-height:10px}.theme-vchatlight img.icon{vertical-align:middle;max-height:1em}.theme-vchatlight img.icon.bigicon{max-height:32px}.theme-vchatlight .looc{color:#3a9696;font-weight:700}.theme-vchatlight .rlooc{color:#3abb96;font-weight:700}.theme-vchatlight .adminobserverooc{color:#09c;font-weight:700}.theme-vchatlight .adminooc{color:#700038;font-weight:700}.theme-vchatlight .adminsay{color:#ff4500;font-weight:700}.theme-vchatlight .admin{color:#4473ff;font-weight:700}.theme-vchatlight .mentor_channel{color:olive;font-weight:700}.theme-vchatlight .mod_channel{color:#735638;font-weight:700}.theme-vchatlight .admin_channel{color:#9611d4;font-weight:700}.theme-vchatlight .event_channel{color:#c39;font-weight:700}.theme-vchatlight .name{font-weight:700}.theme-vchatlight .hivemind{font-style:italic}.theme-vchatlight .psay,.theme-vchatlight .pemote{color:purple;font-style:italic}.theme-vchatlight .deadsay{color:#530fad}.theme-vchatlight .binarysay{font-style:italic;color:#000}.theme-vchatlight .binarysay a{color:#0f0}.theme-vchatlight .binarysay a:active,.theme-vchatlight .binarysay a:visited{color:#8f8}.theme-vchatlight .radio{color:green}.theme-vchatlight .sciradio{color:#939}.theme-vchatlight .comradio{color:#193a7a}.theme-vchatlight .secradio{color:#a30000}.theme-vchatlight .medradio{color:#008160}.theme-vchatlight .engradio{color:#a66300}.theme-vchatlight .supradio{color:#5f4519}.theme-vchatlight .srvradio{color:#6eaa2c}.theme-vchatlight .expradio{color:#555}.theme-vchatlight .syndradio{color:#6d3f40}.theme-vchatlight .gangradio{color:#ac2ea1}.theme-vchatlight .centradio{color:#5c5c8a}.theme-vchatlight .airadio{color:#f0f}.theme-vchatlight .redteamradio{color:red!important}.theme-vchatlight .blueteamradio{color:#00f!important}.theme-vchatlight .greenteamradio{color:#0f0!important}.theme-vchatlight .yellowteamradio{color:#d1ba22!important}.theme-vchatlight .yell{font-weight:700}.theme-vchatlight .alert,.theme-vchatlight .valert{color:red}.theme-vchatlight h1.alert,.theme-vchatlight h2.alert{color:#000}.theme-vchatlight .userdanger{color:red;font-weight:700;font-size:185%}.theme-vchatlight .bolddanger{color:red;font-weight:700}.theme-vchatlight .danger,.theme-vchatlight .vdanger{color:red}.theme-vchatlight .tinydanger{color:red;font-size:85%}.theme-vchatlight .smalldanger{color:red;font-size:90%}.theme-vchatlight .warning,.theme-vchatlight .vwarning{color:red;font-style:italic}.theme-vchatlight .alertwarning{color:red;font-weight:700}.theme-vchatlight .boldwarning{color:red;font-style:italic;font-weight:700}.theme-vchatlight .announce{color:#228b22;font-weight:700}.theme-vchatlight .boldannounce{color:red;font-weight:700}.theme-vchatlight .minorannounce{color:red;font-weight:700;font-size:185%}.theme-vchatlight .minoralert{color:#000;font-size:125%}.theme-vchatlight .priorityannounce{color:#000;font-weight:700;font-size:225%}.theme-vchatlight .prioritytitle{color:#00f;font-weight:700;font-size:185%}.theme-vchatlight .priorityalert{color:red;font-size:140%}.theme-vchatlight .greenannounce{color:#0f0;font-weight:700}.theme-vchatlight .rose{color:#ff5050}.theme-vchatlight .info{color:#00c}.theme-vchatlight .notice,.theme-vchatlight .vnotice{color:#009}.theme-vchatlight .tinynotice{color:#009;font-size:85%}.theme-vchatlight .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-vchatlight .smallnotice{color:#009;font-size:90%}.theme-vchatlight .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-vchatlight .boldnotice{color:#009;font-weight:700}.theme-vchatlight .hear{color:#009;font-style:italic}.theme-vchatlight .adminnotice{color:#00f}.theme-vchatlight .adminhelp{color:red;font-weight:700}.theme-vchatlight .log_message{color:#386aff;font-weight:700}.theme-vchatlight .unconscious{color:#00f;font-weight:700}.theme-vchatlight .suicide{color:#ff5050;font-style:italic}.theme-vchatlight .green{color:#03ff39}.theme-vchatlight .grey{color:#838383}.theme-vchatlight .red{color:red}.theme-vchatlight .crimson{color:#dc143c}.theme-vchatlight .maroon{color:maroon}.theme-vchatlight .brown{color:#8d4925}.theme-vchatlight .blue{color:#00f}.theme-vchatlight .black,.theme-vchatlight .white{color:#000}.theme-vchatlight .darkgray{color:gray}.theme-vchatlight .gray{color:#a9a9a9}.theme-vchatlight .yellow{color:#fc0}.theme-vchatlight .pink{color:pink}.theme-vchatlight .cyan{color:#0ff}.theme-vchatlight .orange{color:#ff8c00}.theme-vchatlight .nicegreen{color:#14a833}.theme-vchatlight .boldnicegreen{color:#14a833;font-weight:700}.theme-vchatlight .cult{color:#973e3b}.theme-vchatlight .cultitalic{color:#973e3b;font-style:italic}.theme-vchatlight .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-vchatlight .cultboldtalic,.theme-vchatlight .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-vchatlight .blob{color:#ee4000}.theme-vchatlight .blobannounce{color:#323f1c;font-weight:700;font-size:185%}.theme-vchatlight .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-vchatlight .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-vchatlight .colossus{color:#7f282a;font-size:310%}.theme-vchatlight .hierophant{color:#609;font-weight:700;font-style:italic}.theme-vchatlight .hierophant_warning{color:#609;font-style:italic}.theme-vchatlight .purple{color:#5e2d79}.theme-vchatlight .lightpurple{color:#ad5aad}.theme-vchatlight .darkpink{color:#e3209b}.theme-vchatlight .holoparasite{color:#35333a}.theme-vchatlight .revennotice{color:#1d2953}.theme-vchatlight .revenboldnotice{color:#1d2953;font-weight:700}.theme-vchatlight .revenbignotice{color:#1d2953;font-weight:700;font-size:185%}.theme-vchatlight .revenminor{color:#823abb}.theme-vchatlight .revenwarning{color:#760fbb;font-style:italic}.theme-vchatlight .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-vchatlight .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-vchatlight .ghostalert{color:#5c00e6;font-style:italic;font-weight:700}.theme-vchatlight .alien{color:#543354}.theme-vchatlight .noticealien{color:#00c000}.theme-vchatlight .alertalien{color:#00c000;font-weight:700}.theme-vchatlight .changeling{color:purple;font-style:italic}.theme-vchatlight .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-vchatlight .spiderbroodmother{color:#4d004d;font-weight:700;font-size:185%}.theme-vchatlight .spiderbreacher{color:#804b02;font-weight:700;font-size:140%}.theme-vchatlight .spiderscout{color:#0c0674;font-weight:700;font-size:120%}.theme-vchatlight .interface{color:#303}.theme-vchatlight .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-vchatlight .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-vchatlight .robot{font-family:Courier New,cursive,sans-serif}.theme-vchatlight .tape_recorder{color:maroon;font-family:Courier New,cursive,sans-serif}.theme-vchatlight .command_headset{font-weight:700;font-size:160%}.theme-vchatlight .small{font-size:60%}.theme-vchatlight .big{font-size:185%}.theme-vchatlight .reallybig{font-size:245%}.theme-vchatlight .extremelybig{font-size:310%}.theme-vchatlight .greentext{color:#0f0;font-size:185%}.theme-vchatlight .redtext{color:red;font-size:185%}.theme-vchatlight .clown{color:#ff69bf;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-vchatlight .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-vchatlight .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-vchatlight .hypnophrase{color:#0d0d0d;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}to{color:#3bb5d3}}.theme-vchatlight .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}to{color:#0d0d0d}}.theme-vchatlight .icon{height:1em;width:auto}.theme-vchatlight .bigicon{font-size:2.5em}.theme-vchatlight .hugeicon{font-size:5em}.theme-vchatlight .memo{color:#638500;text-align:center}.theme-vchatlight .memoedit{text-align:center;font-size:125%}.theme-vchatlight .abductor{color:purple;font-style:italic}.theme-vchatlight .mind_control{color:#a00d6f;font-size:100%;font-weight:700;font-style:italic}.theme-vchatlight .slime{color:#00ced1}.theme-vchatlight .drone{color:#848482}.theme-vchatlight .monkey{color:#975032}.theme-vchatlight .swarmer{color:#2c75ff}.theme-vchatlight .resonate{color:#298f85}.theme-vchatlight .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-vchatlight .connectionClosed,.theme-vchatlight .fatalError{background:red;color:#fff;padding:5px}.theme-vchatlight .connectionClosed.restored{background:green}.theme-vchatlight .internal.boldnshit{color:#00f;font-weight:700}.theme-vchatlight .text-normal{font-weight:400;font-style:normal}.theme-vchatlight .hidden{display:none;visibility:hidden}.theme-vchatlight .ml-1{margin-left:1em}.theme-vchatlight .ml-2{margin-left:2em}.theme-vchatlight .ml-3{margin-left:3em}.theme-vchatlight .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-vchatlight .tooltip{font-style:italic;border-bottom:1px dashed #000}.theme-vchatlight .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-vchatlight .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-vchatlight .major_announcement_text{color:#131313;background-color:#eaeaea;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-vchatlight .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-vchatlight .minor_announcement_text{background-color:#eaeaea;color:#202020;padding:.5rem;text-align:left;font-size:100%}.theme-vchatlight .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-vchatlight .ooc_alert{background:#bdc8ff;border:1px solid #002eb8;margin:.5em;padding:.5em .5em .5em .2em;color:#00283a;font-weight:700;display:flex;flex-direction:column}.theme-vchatlight .ooc_announcement_text{color:#002eb8;padding:.5em 0 0 .35em;display:flex;flex-direction:column}.theme-vchatlight .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_default .major_announcement_title,.theme-vchatlight .chat_alert_default .minor_announcement_title{color:#003061}.theme-vchatlight .chat_alert_default .subheader_announcement_text{color:#6b0020}.theme-vchatlight .chat_alert_default .minor_announcement_text,.theme-vchatlight .chat_alert_default .major_announcement_text{background-color:#d7ddff}.theme-vchatlight .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdffbd,#bdffbd 10px,#adffad 10px,#adffad 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_green .major_announcement_title,.theme-vchatlight .chat_alert_green .minor_announcement_title{color:#005229}.theme-vchatlight .chat_alert_green .subheader_announcement_text{color:#6b0020}.theme-vchatlight .chat_alert_green .minor_announcement_text,.theme-vchatlight .chat_alert_green .major_announcement_text{background-color:#d7ffd7}.theme-vchatlight .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_blue .major_announcement_title,.theme-vchatlight .chat_alert_blue .minor_announcement_title{color:#003061}.theme-vchatlight .chat_alert_blue .subheader_announcement_text{color:#6b0020}.theme-vchatlight .chat_alert_blue .minor_announcement_text,.theme-vchatlight .chat_alert_blue .major_announcement_text{background-color:#d7ddff}.theme-vchatlight .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2e5,#ffc2e5 10px,#ffb3df 10px,#ffb3df 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_pink .major_announcement_title,.theme-vchatlight .chat_alert_pink .minor_announcement_title{color:#800033}.theme-vchatlight .chat_alert_pink .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_pink .minor_announcement_text,.theme-vchatlight .chat_alert_pink .major_announcement_text{background-color:#ffdcf0}.theme-vchatlight .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fff5c2,#fff5c2 10px,#fff3b3 10px,#fff3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_yellow .major_announcement_title,.theme-vchatlight .chat_alert_yellow .minor_announcement_title{color:#754900}.theme-vchatlight .chat_alert_yellow .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_yellow .minor_announcement_text,.theme-vchatlight .chat_alert_yellow .major_announcement_text{background-color:#fff9dc}.theme-vchatlight .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffe8c2,#ffe8c2 10px,#ffe2b3 10px,#ffe2b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_orange .major_announcement_title,.theme-vchatlight .chat_alert_orange .minor_announcement_title{color:#823208}.theme-vchatlight .chat_alert_orange .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_orange .minor_announcement_text,.theme-vchatlight .chat_alert_orange .major_announcement_text{background-color:#fff2dc}.theme-vchatlight .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2c2,#ffc2c2 10px,#ffb3b3 10px,#ffb3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_red .major_announcement_title,.theme-vchatlight .chat_alert_red .minor_announcement_title{color:#800029}.theme-vchatlight .chat_alert_red .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_red .minor_announcement_text,.theme-vchatlight .chat_alert_red .major_announcement_text{background-color:#ffdcdc}.theme-vchatlight .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fbd1ff,#fbd1ff 10px,#fac2ff 10px,#fac2ff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_purple .major_announcement_title,.theme-vchatlight .chat_alert_purple .minor_announcement_title{color:#450d8c}.theme-vchatlight .chat_alert_purple .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_purple .minor_announcement_text,.theme-vchatlight .chat_alert_purple .major_announcement_text{background-color:#fdebff}.theme-vchatlight .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ebebeb,#ebebeb 10px,#e3e3e3 10px,#e3e3e3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatlight .chat_alert_grey .major_announcement_title,.theme-vchatlight .chat_alert_grey .minor_announcement_title{color:#800033}.theme-vchatlight .chat_alert_grey .subheader_announcement_text{color:#002c85}.theme-vchatlight .chat_alert_grey .minor_announcement_text,.theme-vchatlight .chat_alert_grey .major_announcement_text{background-color:#f8f8f8}.theme-vchatlight .tajaran{color:#803b56}.theme-vchatlight .tajaran_signlang{color:#941c1c}.theme-vchatlight .akhani{color:#ac398c}.theme-vchatlight .skrell{color:#00b0b3}.theme-vchatlight .skrellfar{color:#70fcff}.theme-vchatlight .soghun{color:#50ba6c}.theme-vchatlight .solcom{color:#3333ce}.theme-vchatlight .sergal{color:#07f}.theme-vchatlight .birdsongc{color:#c90}.theme-vchatlight .vulpkanin{color:#b97a57}.theme-vchatlight .tavan{color:#f54298;font-family:Arial}.theme-vchatlight .echosong{color:#826d8c}.theme-vchatlight .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-vchatlight .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-vchatlight .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-vchatlight .bug{color:#9e9e39}.theme-vchatlight .vox{color:#a0a}.theme-vchatlight .promethean{color:#5a5a5a;font-family:Comic Sans MS,Comic Sans,cursive}.theme-vchatlight .zaddat{color:#941c1c}.theme-vchatlight .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-vchatlight .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-vchatlight .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-vchatlight .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-vchatlight .spacer{color:#9c660b}.theme-vchatlight .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-vchatlight .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif;line-height:.3}.theme-vchatdark .color-black{color:#1a1a1a!important}.theme-vchatdark .color-white{color:#fff!important}.theme-vchatdark .color-red{color:#df3e3e!important}.theme-vchatdark .color-orange{color:#f37f33!important}.theme-vchatdark .color-yellow{color:#fbda21!important}.theme-vchatdark .color-olive{color:#cbe41c!important}.theme-vchatdark .color-green{color:#25ca4c!important}.theme-vchatdark .color-teal{color:#00d6cc!important}.theme-vchatdark .color-blue{color:#2e93de!important}.theme-vchatdark .color-violet{color:#7349cf!important}.theme-vchatdark .color-purple{color:#ad45d0!important}.theme-vchatdark .color-pink{color:#e34da1!important}.theme-vchatdark .color-brown{color:#b97447!important}.theme-vchatdark .color-grey{color:#848484!important}.theme-vchatdark .color-light-grey{color:#b3b3b3!important}.theme-vchatdark .color-good{color:#68c22d!important}.theme-vchatdark .color-average{color:#f29a29!important}.theme-vchatdark .color-bad{color:#df3e3e!important}.theme-vchatdark .color-label{color:#8b9bb0!important}.theme-vchatdark .color-bg-black{background-color:#000!important}.theme-vchatdark .color-bg-white{background-color:#d9d9d9!important}.theme-vchatdark .color-bg-red{background-color:#bd2020!important}.theme-vchatdark .color-bg-orange{background-color:#d95e0c!important}.theme-vchatdark .color-bg-yellow{background-color:#d9b804!important}.theme-vchatdark .color-bg-olive{background-color:#9aad14!important}.theme-vchatdark .color-bg-green{background-color:#1b9638!important}.theme-vchatdark .color-bg-teal{background-color:#009a93!important}.theme-vchatdark .color-bg-blue{background-color:#1c71b1!important}.theme-vchatdark .color-bg-violet{background-color:#552dab!important}.theme-vchatdark .color-bg-purple{background-color:#8b2baa!important}.theme-vchatdark .color-bg-pink{background-color:#cf2082!important}.theme-vchatdark .color-bg-brown{background-color:#8c5836!important}.theme-vchatdark .color-bg-grey{background-color:#646464!important}.theme-vchatdark .color-bg-light-grey{background-color:#919191!important}.theme-vchatdark .color-bg-good{background-color:#4d9121!important}.theme-vchatdark .color-bg-average{background-color:#cd7a0d!important}.theme-vchatdark .color-bg-bad{background-color:#bd2020!important}.theme-vchatdark .color-bg-label{background-color:#657a94!important}.theme-vchatdark .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Tabs--fill{height:100%}.theme-vchatdark .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-vchatdark .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-vchatdark .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-vchatdark .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-vchatdark .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-vchatdark .Tabs--horizontal:last-child{margin-bottom:0}.theme-vchatdark .Tabs__Tab{flex-grow:0}.theme-vchatdark .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-vchatdark .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.theme-vchatdark .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-vchatdark .Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.theme-vchatdark .Tab__text{flex-grow:1;margin:0 .5em}.theme-vchatdark .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-vchatdark .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-vchatdark .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-vchatdark .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.theme-vchatdark .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-vchatdark .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.theme-vchatdark .Tab--selected.Tab--color--black{color:#535353}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.theme-vchatdark .Tab--selected.Tab--color--white{color:#fff}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.theme-vchatdark .Tab--selected.Tab--color--red{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--orange{color:#f69f66}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.theme-vchatdark .Tab--selected.Tab--color--yellow{color:#fce358}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.theme-vchatdark .Tab--selected.Tab--color--olive{color:#d8eb55}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.theme-vchatdark .Tab--selected.Tab--color--green{color:#53e074}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.theme-vchatdark .Tab--selected.Tab--color--teal{color:#21fff5}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.theme-vchatdark .Tab--selected.Tab--color--blue{color:#62aee6}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.theme-vchatdark .Tab--selected.Tab--color--violet{color:#9676db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.theme-vchatdark .Tab--selected.Tab--color--purple{color:#c274db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.theme-vchatdark .Tab--selected.Tab--color--pink{color:#ea79b9}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.theme-vchatdark .Tab--selected.Tab--color--brown{color:#ca9775}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.theme-vchatdark .Tab--selected.Tab--color--grey{color:#a3a3a3}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.theme-vchatdark .Tab--selected.Tab--color--light-grey{color:#c6c6c6}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.theme-vchatdark .Tab--selected.Tab--color--good{color:#8cd95a}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.theme-vchatdark .Tab--selected.Tab--color--average{color:#f5b35e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.theme-vchatdark .Tab--selected.Tab--color--bad{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--label{color:#a8b4c4}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.theme-vchatdark .Section{position:relative;margin-bottom:.5em;background-color:#191919;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-vchatdark .Section:last-child{margin-bottom:0}.theme-vchatdark .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-vchatdark .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-vchatdark .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-vchatdark .Section__rest{position:relative}.theme-vchatdark .Section__content{padding:.66em .5em}.theme-vchatdark .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-vchatdark .Section--fill{display:flex;flex-direction:column;height:100%}.theme-vchatdark .Section--fill>.Section__rest{flex-grow:1}.theme-vchatdark .Section--fill>.Section__rest>.Section__content{height:100%}.theme-vchatdark .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-vchatdark .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-vchatdark .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-vchatdark .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-vchatdark .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-vchatdark .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-vchatdark .Section .Section:first-child{margin-top:-.5em}.theme-vchatdark .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-vchatdark .Section .Section .Section .Section__titleText{font-size:1em}.theme-vchatdark .Section--flex{display:flex;flex-flow:column}.theme-vchatdark .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-vchatdark .Section__content--noTopPadding{padding-top:0}.theme-vchatdark .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-vchatdark .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-vchatdark .Button:last-child{margin-right:0;margin-bottom:0}.theme-vchatdark .Button .fa,.theme-vchatdark .Button .fas,.theme-vchatdark .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-vchatdark .Button--dropdown{line-height:1.3333333333em;height:1.8333333333em;padding:.2rem .5rem}.theme-vchatdark .Button--hasContent .fa,.theme-vchatdark .Button--hasContent .fas,.theme-vchatdark .Button--hasContent .far{margin-right:.25em}.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fa,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fas,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-vchatdark .Button--ellipsis{text-overflow:ellipsis;overflow:hidden}.theme-vchatdark .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-vchatdark .Button--circular{border-radius:50%}.theme-vchatdark .Button--compact{padding:0 .25em;line-height:1.333em}.theme-vchatdark .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-vchatdark .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--black:hover,.theme-vchatdark .Button--color--black:focus{background-color:#131313;color:#fff}.theme-vchatdark .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.theme-vchatdark .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--white:hover,.theme-vchatdark .Button--color--white:focus{background-color:#f8f8f8;color:#000}.theme-vchatdark .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--red:hover,.theme-vchatdark .Button--color--red:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.theme-vchatdark .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--orange:hover,.theme-vchatdark .Button--color--orange:focus{background-color:#f0853f;color:#fff}.theme-vchatdark .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--yellow:hover,.theme-vchatdark .Button--color--yellow:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.theme-vchatdark .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--olive:hover,.theme-vchatdark .Button--color--olive:focus{background-color:#c4da2b;color:#fff}.theme-vchatdark .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--green:hover,.theme-vchatdark .Button--color--green:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.theme-vchatdark .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--teal:hover,.theme-vchatdark .Button--color--teal:focus{background-color:#13c4bc;color:#fff}.theme-vchatdark .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.theme-vchatdark .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--blue:hover,.theme-vchatdark .Button--color--blue:focus{background-color:#3a95d9;color:#fff}.theme-vchatdark .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.theme-vchatdark .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--violet:hover,.theme-vchatdark .Button--color--violet:focus{background-color:#7953cc;color:#fff}.theme-vchatdark .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.theme-vchatdark .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--purple:hover,.theme-vchatdark .Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.theme-vchatdark .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.theme-vchatdark .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--pink:hover,.theme-vchatdark .Button--color--pink:focus{background-color:#e257a5;color:#fff}.theme-vchatdark .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.theme-vchatdark .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--brown:hover,.theme-vchatdark .Button--color--brown:focus{background-color:#b47851;color:#fff}.theme-vchatdark .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.theme-vchatdark .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--grey:hover,.theme-vchatdark .Button--color--grey:focus{background-color:#868686;color:#fff}.theme-vchatdark .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.theme-vchatdark .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--light-grey:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--light-grey:hover,.theme-vchatdark .Button--color--light-grey:focus{background-color:#bababa;color:#fff}.theme-vchatdark .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.theme-vchatdark .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--good:hover,.theme-vchatdark .Button--color--good:focus{background-color:#6cba39;color:#fff}.theme-vchatdark .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.theme-vchatdark .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--average:hover,.theme-vchatdark .Button--color--average:focus{background-color:#ed9d35;color:#fff}.theme-vchatdark .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--bad:hover,.theme-vchatdark .Button--color--bad:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.theme-vchatdark .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--label:hover,.theme-vchatdark .Button--color--label:focus{background-color:#91a1b3;color:#fff}.theme-vchatdark .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.theme-vchatdark .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--default:hover,.theme-vchatdark .Button--color--default:focus{background-color:#5c83b0;color:#fff}.theme-vchatdark .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--caution:hover,.theme-vchatdark .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--danger:hover,.theme-vchatdark .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.theme-vchatdark .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--transparent:hover,.theme-vchatdark .Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.theme-vchatdark .Button--disabled{background-color:#999!important}.theme-vchatdark .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--selected:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--selected:hover,.theme-vchatdark .Button--selected:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--flex{display:inline-flex;flex-direction:column}.theme-vchatdark .Button--flex--fluid{width:100%}.theme-vchatdark .Button--verticalAlignContent--top{justify-content:flex-start}.theme-vchatdark .Button--verticalAlignContent--middle{justify-content:center}.theme-vchatdark .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-vchatdark .Button__content{display:block;align-self:stretch}.theme-vchatdark .Button__textMargin{margin-left:.4rem}.theme-vchatdark .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-vchatdark .NumberInput--fluid{display:block}.theme-vchatdark .NumberInput__content{margin-left:.5em}.theme-vchatdark .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-vchatdark .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.theme-vchatdark .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-vchatdark .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-vchatdark .Input--fluid{display:block;width:auto}.theme-vchatdark .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-vchatdark .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-vchatdark .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-vchatdark .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-vchatdark .TextArea--fluid{display:block;width:auto;height:auto}.theme-vchatdark .TextArea--noborder{border:0px}.theme-vchatdark .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-vchatdark .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-vchatdark .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-vchatdark .TextArea__nowrap{white-space:nowrap;overflow-wrap:normal;overflow-x:scroll}.theme-vchatdark .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-vchatdark .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-vchatdark .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15),rgba(255,255,255,0));border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-vchatdark .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-vchatdark .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-vchatdark .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-vchatdark .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-vchatdark .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-vchatdark .Knob__ringFillPivot{transform:rotate(135deg)}.theme-vchatdark .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-vchatdark .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-vchatdark .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-vchatdark .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-vchatdark .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-vchatdark .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-vchatdark .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-vchatdark .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-vchatdark .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-vchatdark .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-vchatdark .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-vchatdark .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-vchatdark .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-vchatdark .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-vchatdark .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-vchatdark .Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.theme-vchatdark .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-vchatdark .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-vchatdark .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.theme-vchatdark .Slider{cursor:e-resize}.theme-vchatdark .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-vchatdark .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-vchatdark .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-vchatdark .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em!important;border-style:solid!important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-vchatdark .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-vchatdark .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-vchatdark .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-vchatdark .ProgressBar--color--default{border:.0833333333em solid #3e6189}.theme-vchatdark .ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.theme-vchatdark .ProgressBar--color--black{border-color:#000!important}.theme-vchatdark .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-vchatdark .ProgressBar--color--white{border-color:#d9d9d9!important}.theme-vchatdark .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-vchatdark .ProgressBar--color--red{border-color:#bd2020!important}.theme-vchatdark .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--orange{border-color:#d95e0c!important}.theme-vchatdark .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-vchatdark .ProgressBar--color--yellow{border-color:#d9b804!important}.theme-vchatdark .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-vchatdark .ProgressBar--color--olive{border-color:#9aad14!important}.theme-vchatdark .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-vchatdark .ProgressBar--color--green{border-color:#1b9638!important}.theme-vchatdark .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-vchatdark .ProgressBar--color--teal{border-color:#009a93!important}.theme-vchatdark .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-vchatdark .ProgressBar--color--blue{border-color:#1c71b1!important}.theme-vchatdark .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-vchatdark .ProgressBar--color--violet{border-color:#552dab!important}.theme-vchatdark .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-vchatdark .ProgressBar--color--purple{border-color:#8b2baa!important}.theme-vchatdark .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-vchatdark .ProgressBar--color--pink{border-color:#cf2082!important}.theme-vchatdark .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-vchatdark .ProgressBar--color--brown{border-color:#8c5836!important}.theme-vchatdark .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-vchatdark .ProgressBar--color--grey{border-color:#646464!important}.theme-vchatdark .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-vchatdark .ProgressBar--color--light-grey{border-color:#919191!important}.theme-vchatdark .ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.theme-vchatdark .ProgressBar--color--good{border-color:#4d9121!important}.theme-vchatdark .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-vchatdark .ProgressBar--color--average{border-color:#cd7a0d!important}.theme-vchatdark .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-vchatdark .ProgressBar--color--bad{border-color:#bd2020!important}.theme-vchatdark .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--label{border-color:#657a94!important}.theme-vchatdark .ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.theme-vchatdark .Chat{color:#fff}.theme-vchatdark .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-vchatdark .Chat__badge:before{content:"x"}.theme-vchatdark .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-vchatdark .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-vchatdark .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-vchatdark .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-vchatdark .Chat__highlight{color:#000}.theme-vchatdark .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-vchatdark .ChatMessage{word-wrap:break-word}.theme-vchatdark .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-vchatdark .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-vchatdark .Layout,.theme-vchatdark .Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.theme-vchatdark .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-vchatdark .Layout__content--flexRow{display:flex;flex-flow:row}.theme-vchatdark .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-vchatdark .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(to bottom,#2a2a2a,#202020)}.theme-vchatdark .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-vchatdark .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-vchatdark .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-vchatdark .Window__contentPadding:after{height:0}.theme-vchatdark .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-vchatdark .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(62,62,62,.25);pointer-events:none}.theme-vchatdark .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-vchatdark .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-vchatdark .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-vchatdark .TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-vchatdark .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#363636;transition:color .25s ease-out,background-color .25s ease-out}.theme-vchatdark .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-vchatdark .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-vchatdark .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-vchatdark .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-vchatdark .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-vchatdark .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-vchatdark .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-vchatdark img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-vchatdark img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-vchatdark a{color:#397ea5}.theme-vchatdark a.visited,.theme-vchatdark a:visited{color:#7c00e6}.theme-vchatdark a.popt{text-decoration:none}.theme-vchatdark .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-vchatdark .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-vchatdark .popup .close:hover{background:#999}.theme-vchatdark .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-vchatdark .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-vchatdark .popup input[type=text]:hover,.theme-vchatdark .popup input[type=text]:active,.theme-vchatdark .popup input[type=text]:focus{border-color:green}.theme-vchatdark .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-vchatdark .popup input[type=submit]:hover,.theme-vchatdark .popup input[type=submit]:focus,.theme-vchatdark .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-vchatdark .changeFont{padding:10px}.theme-vchatdark .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-vchatdark .changeFont a:hover{background:#ccc}.theme-vchatdark .highlightPopup{padding:10px;text-align:center}.theme-vchatdark .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-vchatdark .highlightPopup input.highlightColor{background-color:#ff0}.theme-vchatdark .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-vchatdark .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-vchatdark .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-vchatdark .contextMenu a:hover{background-color:#ccc}.theme-vchatdark .filterMessages{padding:5px}.theme-vchatdark .filterMessages div{padding:2px 0}.theme-vchatdark .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-vchatdark .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-vchatdark .motd h1,.theme-vchatdark .motd h2,.theme-vchatdark .motd h3,.theme-vchatdark .motd h4,.theme-vchatdark .motd h5,.theme-vchatdark .motd h6{color:#638500;text-decoration:underline}.theme-vchatdark .motd a,.theme-vchatdark .motd a:link,.theme-vchatdark .motd a:visited,.theme-vchatdark .motd a:active,.theme-vchatdark .motd a:hover{color:#638500}.theme-vchatdark .bold,.theme-vchatdark .name,.theme-vchatdark .prefix,.theme-vchatdark .ooc,.theme-vchatdark .looc,.theme-vchatdark .adminooc,.theme-vchatdark .admin,.theme-vchatdark .medal,.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .italic,.theme-vchatdark .italics{font-style:italic}.theme-vchatdark .highlight{background:#ff0}.theme-vchatdark h1,.theme-vchatdark h2,.theme-vchatdark h3,.theme-vchatdark h4,.theme-vchatdark h5,.theme-vchatdark h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark h1.alert,.theme-vchatdark h2.alert{color:#a4bad6}.theme-vchatdark em{font-style:normal;font-weight:700}.theme-vchatdark .ooc{color:#004ed8;font-weight:700}.theme-vchatdark .ooc .elevated{color:#2e78d9}.theme-vchatdark .ooc .moderator{color:#184880}.theme-vchatdark .ooc .developer{color:#1b521f}.theme-vchatdark .ooc .admin{color:#b82e00}.theme-vchatdark .ooc .event_manager{color:#603}.theme-vchatdark .ooc .aooc{color:#960018}.theme-vchatdark img.text_tag{width:32px;height:10px;min-height:10px}.theme-vchatdark img.icon{vertical-align:middle;max-height:1em}.theme-vchatdark img.icon.bigicon{max-height:32px}.theme-vchatdark .looc{color:#3a9696;font-weight:700}.theme-vchatdark .rlooc{color:#3abb96;font-weight:700}.theme-vchatdark .adminobserverooc{color:#09c;font-weight:700}.theme-vchatdark .adminooc{color:#3d5bc3;font-weight:700}.theme-vchatdark .adminsay{color:#ff4500;font-weight:700}.theme-vchatdark .admin{color:#5975da;font-weight:700}.theme-vchatdark .mentor_channel{color:olive;font-weight:700}.theme-vchatdark .mod_channel{color:#735638;font-weight:700}.theme-vchatdark .admin_channel{color:#9611d4;font-weight:700}.theme-vchatdark .event_channel{color:#c39;font-weight:700}.theme-vchatdark .name{font-weight:700}.theme-vchatdark .hivemind{font-style:italic;color:#fff}.theme-vchatdark .psay,.theme-vchatdark .pemote{color:#e300e4;font-style:italic}.theme-vchatdark .deadsay{color:#732fcd}.theme-vchatdark .binarysay{font-style:italic;color:#fff}.theme-vchatdark .binarysay a{color:#0f0}.theme-vchatdark .binarysay a:active,.theme-vchatdark .binarysay a:visited{color:#8f8}.theme-vchatdark .radio{color:#00a800}.theme-vchatdark .sciradio{color:#939}.theme-vchatdark .comradio{color:#395a9a}.theme-vchatdark .secradio{color:#a30000}.theme-vchatdark .medradio{color:#008160}.theme-vchatdark .engradio{color:#a66300}.theme-vchatdark .supradio{color:#5f4519}.theme-vchatdark .srvradio{color:#6eaa2c}.theme-vchatdark .expradio{color:#555}.theme-vchatdark .syndradio{color:#6d3f40}.theme-vchatdark .gangradio{color:#ac2ea1}.theme-vchatdark .centradio{color:#5c5c8a}.theme-vchatdark .airadio{color:#f0f}.theme-vchatdark .redteamradio{color:#f44!important}.theme-vchatdark .blueteamradio{color:#3434fd!important}.theme-vchatdark .greenteamradio{color:#34fd34!important}.theme-vchatdark .yellowteamradio{color:#fdfd34!important}.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .alert{color:red}.theme-vchatdark .valert{color:#d82020}.theme-vchatdark .userdanger{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .bolddanger{color:#c51e1e;font-weight:700}.theme-vchatdark .danger,.theme-vchatdark .vdanger{color:#c51e1e}.theme-vchatdark .warning,.theme-vchatdark .vwarning{color:#c51e1e;font-style:italic}.theme-vchatdark .alertwarning{color:red;font-weight:700}.theme-vchatdark .boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.theme-vchatdark .announce,.theme-vchatdark .boldannounce{color:#c51e1e;font-weight:700}.theme-vchatdark .minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .minoralert{color:#a4bad6;font-size:125%}.theme-vchatdark .priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.theme-vchatdark .prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.theme-vchatdark .priorityalert{color:#c51e1e;font-size:140%}.theme-vchatdark .greenannounce{color:#059223;font-weight:700}.theme-vchatdark .rose{color:#ff5050}.theme-vchatdark .info,.theme-vchatdark .notice,.theme-vchatdark .vnotice{color:#6060c9}.theme-vchatdark .tinynotice{color:#6060c9;font-size:85%}.theme-vchatdark .tinynoticeital{color:#6060c9;font-style:italic;font-size:85%}.theme-vchatdark .smallnotice{color:#6060c9;font-size:90%}.theme-vchatdark .smallnoticeital{color:#6060c9;font-style:italic;font-size:90%}.theme-vchatdark .bolditalic{font-style:italic;font-weight:700}.theme-vchatdark .boldnotice{color:#6060c9;font-weight:700}.theme-vchatdark .hear{color:#6060c9;font-style:italic}.theme-vchatdark .adminnotice{color:#6060c9}.theme-vchatdark .adminhelp{color:red;font-weight:700}.theme-vchatdark .log_message{color:#386aff;font-weight:700}.theme-vchatdark .unconscious{color:#a4bad6;font-weight:700}.theme-vchatdark .suicide{color:#ff5050;font-style:italic}.theme-vchatdark .green{color:#4f4}.theme-vchatdark .grey{color:#a9a9a9}.theme-vchatdark .red{color:red}.theme-vchatdark .crimson{color:#dc143c}.theme-vchatdark .maroon{color:#c60000}.theme-vchatdark .brown{color:#db733b}.theme-vchatdark .blue{color:#66f}.theme-vchatdark .black,.theme-vchatdark .white{color:#fff}.theme-vchatdark .darkgray{color:gray}.theme-vchatdark .gray{color:#a9a9a9}.theme-vchatdark .yellow{color:#fc0}.theme-vchatdark .pink{color:pink}.theme-vchatdark .cyan{color:#0ff}.theme-vchatdark .orange{color:#ff8c00}.theme-vchatdark .nicegreen{color:#059223}.theme-vchatdark .boldnicegreen{color:#059223;font-weight:700}.theme-vchatdark .blob{color:#ee4000}.theme-vchatdark .blobannounce{color:#556b2f;font-weight:700;font-size:185%}.theme-vchatdark .cult{color:#973e3b}.theme-vchatdark .cultitalic{color:#973e3b;font-style:italic}.theme-vchatdark .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-vchatdark .cultboldtalic,.theme-vchatdark .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-vchatdark .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-vchatdark .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-vchatdark .colossus{color:#7f282a;font-size:310%}.theme-vchatdark .hierophant{color:#b441ee;font-weight:700;font-style:italic}.theme-vchatdark .hierophant_warning{color:#c56bf1;font-style:italic}.theme-vchatdark .purple{color:#9956d3}.theme-vchatdark .lightpurple{color:#ad5aad}.theme-vchatdark .darkpink{color:#e3209b}.theme-vchatdark .holoparasite{color:#88809c}.theme-vchatdark .revennotice{color:#c099e2}.theme-vchatdark .revenboldnotice{color:#c099e2;font-weight:700}.theme-vchatdark .revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.theme-vchatdark .revenminor{color:#823abb}.theme-vchatdark .revenwarning{color:#760fbb;font-style:italic}.theme-vchatdark .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-vchatdark .deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.theme-vchatdark .ghostalert{color:#60f;font-style:italic;font-weight:700}.theme-vchatdark .alien{color:#855d85}.theme-vchatdark .noticealien{color:#059223}.theme-vchatdark .alertalien{color:#059223;font-weight:700}.theme-vchatdark .changeling{color:#b000b1;font-style:italic}.theme-vchatdark .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-vchatdark .spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.theme-vchatdark .spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.theme-vchatdark .spiderscout{color:#231d98;font-weight:700;font-size:120%}.theme-vchatdark .interface{color:#750e75}.theme-vchatdark .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-vchatdark .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-vchatdark .robot{font-family:Courier New,cursive,sans-serif}.theme-vchatdark .tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.theme-vchatdark .command_headset{font-weight:700;font-size:160%}.theme-vchatdark .small{font-size:60%}.theme-vchatdark .big{font-size:185%}.theme-vchatdark .reallybig{font-size:245%}.theme-vchatdark .extremelybig{font-size:310%}.theme-vchatdark .greentext{color:#059223;font-size:185%}.theme-vchatdark .redtext{color:#c51e1e;font-size:185%}.theme-vchatdark .clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-vchatdark .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-vchatdark .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-vchatdark .hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}to{color:#7adbf3}}.theme-vchatdark .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}to{color:#f75a5a}}.theme-vchatdark .icon{height:1em;width:auto}.theme-vchatdark .bigicon{font-size:2.5em}.theme-vchatdark .hugeicon{font-size:5em}.theme-vchatdark .memo{color:#638500;text-align:center}.theme-vchatdark .memoedit{text-align:center;font-size:125%}.theme-vchatdark .abductor{color:#c204c2;font-style:italic}.theme-vchatdark .mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.theme-vchatdark .slime{color:#00ced1}.theme-vchatdark .drone{color:#848482}.theme-vchatdark .monkey{color:#975032}.theme-vchatdark .swarmer{color:#2c75ff}.theme-vchatdark .resonate{color:#298f85}.theme-vchatdark .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-vchatdark .connectionClosed,.theme-vchatdark .fatalError{background:red;color:#fff;padding:5px}.theme-vchatdark .connectionClosed.restored{background:green}.theme-vchatdark .internal.boldnshit{color:#3d5bc3;font-weight:700}.theme-vchatdark .text-normal{font-weight:400;font-style:normal}.theme-vchatdark .hidden{display:none;visibility:hidden}.theme-vchatdark .ml-1{margin-left:1em}.theme-vchatdark .ml-2{margin-left:2em}.theme-vchatdark .ml-3{margin-left:3em}.theme-vchatdark .examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.theme-vchatdark .tooltip{font-style:italic;border-bottom:1px dashed #fff}.theme-vchatdark .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-vchatdark .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-vchatdark .major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-vchatdark .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-vchatdark .minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.theme-vchatdark .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-vchatdark .ooc_alert{background:#4d4100;border:1px solid #cca300;margin:.5em;padding:.5em .5em .5em .2em;color:#fff;font-weight:700;display:flex;flex-direction:column}.theme-vchatdark .ooc_announcement_text{color:#cca300;padding:.5em 0 0 .35em;display:flex;flex-direction:column}.theme-vchatdark .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_default .major_announcement_title,.theme-vchatdark .chat_alert_default .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_default .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_default .minor_announcement_text,.theme-vchatdark .chat_alert_default .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_green .major_announcement_title,.theme-vchatdark .chat_alert_green .minor_announcement_title{color:#00ff80}.theme-vchatdark .chat_alert_green .subheader_announcement_text{color:#ff85b5}.theme-vchatdark .chat_alert_green .minor_announcement_text,.theme-vchatdark .chat_alert_green .major_announcement_text{background-color:#002400}.theme-vchatdark .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_blue .major_announcement_title,.theme-vchatdark .chat_alert_blue .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_blue .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_blue .minor_announcement_text,.theme-vchatdark .chat_alert_blue .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_pink .major_announcement_title,.theme-vchatdark .chat_alert_pink .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_pink .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_pink .minor_announcement_text,.theme-vchatdark .chat_alert_pink .major_announcement_text{background-color:#17000d}.theme-vchatdark .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_yellow .major_announcement_title,.theme-vchatdark .chat_alert_yellow .minor_announcement_title{color:#fff4e0}.theme-vchatdark .chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_yellow .minor_announcement_text,.theme-vchatdark .chat_alert_yellow .major_announcement_text{background-color:#3e3400}.theme-vchatdark .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_orange .major_announcement_title,.theme-vchatdark .chat_alert_orange .minor_announcement_title{color:#feefe7}.theme-vchatdark .chat_alert_orange .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_orange .minor_announcement_text,.theme-vchatdark .chat_alert_orange .major_announcement_text{background-color:#402500}.theme-vchatdark .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_red .major_announcement_title,.theme-vchatdark .chat_alert_red .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_red .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_red .minor_announcement_text,.theme-vchatdark .chat_alert_red .major_announcement_text{background-color:#290000}.theme-vchatdark .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_purple .major_announcement_title,.theme-vchatdark .chat_alert_purple .minor_announcement_title{color:#c7a1f7}.theme-vchatdark .chat_alert_purple .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_purple .minor_announcement_text,.theme-vchatdark .chat_alert_purple .major_announcement_text{background-color:#150017}.theme-vchatdark .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_grey .major_announcement_title,.theme-vchatdark .chat_alert_grey .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_grey .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_grey .minor_announcement_text,.theme-vchatdark .chat_alert_grey .major_announcement_text{background-color:#181818}.theme-vchatdark .tajaran{color:#803b56}.theme-vchatdark .tajaran_signlang{color:#941c1c}.theme-vchatdark .akhani{color:#ac398c}.theme-vchatdark .skrell{color:#00b0b3}.theme-vchatdark .skrellfar{color:#70fcff}.theme-vchatdark .soghun{color:#50ba6c}.theme-vchatdark .solcom{color:#6da6f0}.theme-vchatdark .sergal{color:#07f}.theme-vchatdark .birdsongc{color:#c90}.theme-vchatdark .vulpkanin{color:#b97a57}.theme-vchatdark .tavan{color:#f54298;font-family:Arial}.theme-vchatdark .echosong{color:#826d8c}.theme-vchatdark .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-vchatdark .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-vchatdark .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-vchatdark .bug{color:#9e9e39}.theme-vchatdark .vox{color:#a0a}.theme-vchatdark .promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.theme-vchatdark .zaddat{color:#941c1c}.theme-vchatdark .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-vchatdark .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-vchatdark .spacer{color:#9c660b}.theme-vchatdark .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-vchatdark .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif;line-height:.3}
diff --git a/tgui/public/tgui-panel.bundle.js b/tgui/public/tgui-panel.bundle.js
index b06afb0e6c..f82b58f573 100644
--- a/tgui/public/tgui-panel.bundle.js
+++ b/tgui/public/tgui-panel.bundle.js
@@ -1,4 +1,4 @@
-(function(){(function(){var Fc={75614:function(d,h,t){"use strict";/**
+(function(){(function(){var gf={49055:function(m,y,n){"use strict";/**
* @license React
* react-dom.production.min.js
*
@@ -6,7 +6,15 @@
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */function r(e,n){return n!=null&&typeof Symbol!="undefined"&&n[Symbol.hasInstance]?!!n[Symbol.hasInstance](e):e instanceof n}function o(e){"@swc/helpers - typeof";return e&&typeof Symbol!="undefined"&&e.constructor===Symbol?"symbol":typeof e}var i=t(61358),s=t(20686);function u(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,a=1;an}return!1}function w(e,n,a,c,E,R,V){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=c,this.attributeNamespace=E,this.mustUseProperty=a,this.propertyName=e,this.type=n,this.sanitizeURL=R,this.removeEmptyString=V}var F={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){F[e]=new w(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];F[n]=new w(n,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){F[e]=new w(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){F[e]=new w(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){F[e]=new w(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){F[e]=new w(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){F[e]=new w(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){F[e]=new w(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){F[e]=new w(e,5,!1,e.toLowerCase(),null,!1,!1)});var $=/[\-:]([a-z])/g;function M(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace($,M);F[n]=new w(n,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace($,M);F[n]=new w(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace($,M);F[n]=new w(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){F[e]=new w(e,1,!1,e.toLowerCase(),null,!1,!1)}),F.xlinkHref=new w("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){F[e]=new w(e,1,!1,e.toLowerCase(),null,!0,!0)});function B(e,n,a,c){var E=F.hasOwnProperty(n)?F[n]:null;(E!==null?E.type!==0:c||!(2et||E[V]!==R[et]){var pt="\n"+E[V].replace(" at new "," at ");return e.displayName&&pt.includes("")&&(pt=pt.replace("",e.displayName)),pt}while(1<=V&&0<=et);break}}}finally{Ct=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?dt(e):""}function Gt(e){switch(e.tag){case 5:return dt(e.type);case 16:return dt("Lazy");case 13:return dt("Suspense");case 19:return dt("SuspenseList");case 0:case 2:case 15:return e=Lt(e.type,!1),e;case 11:return e=Lt(e.type.render,!1),e;case 1:return e=Lt(e.type,!0),e;default:return""}}function jt(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case K:return"Fragment";case W:return"Portal";case tt:return"Profiler";case G:return"StrictMode";case ut:return"Suspense";case k:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case q:return(e.displayName||"Context")+".Consumer";case H:return(e._context.displayName||"Context")+".Provider";case J:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case nt:return n=e.displayName||null,n!==null?n:jt(e.type)||"Memo";case L:n=e._payload,e=e._init;try{return jt(e(n))}catch(a){}}return null}function Pt(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return jt(n);case 8:return n===G?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function Yt(e){switch(typeof e=="undefined"?"undefined":o(e)){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function xe(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function Te(e){var n=xe(e)?"checked":"value",a=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),c=""+e[n];if(!e.hasOwnProperty(n)&&typeof a!="undefined"&&typeof a.get=="function"&&typeof a.set=="function"){var E=a.get,R=a.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return E.call(this)},set:function(et){c=""+et,R.call(this,et)}}),Object.defineProperty(e,n,{enumerable:a.enumerable}),{getValue:function(){return c},setValue:function(et){c=""+et},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function de(e){e._valueTracker||(e._valueTracker=Te(e))}function Rt(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var a=n.getValue(),c="";return e&&(c=xe(e)?e.checked?"true":"false":e.value),e=c,e!==a?(n.setValue(e),!0):!1}function Nt(e){if(e=e||(typeof document!="undefined"?document:void 0),typeof e=="undefined")return null;try{return e.activeElement||e.body}catch(n){return e.body}}function Vt(e,n){var a=n.checked;return _({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a!=null?a:e._wrapperState.initialChecked})}function kt(e,n){var a=n.defaultValue==null?"":n.defaultValue,c=n.checked!=null?n.checked:n.defaultChecked;a=Yt(n.value!=null?n.value:a),e._wrapperState={initialChecked:c,initialValue:a,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function ee(e,n){n=n.checked,n!=null&&B(e,"checked",n,!1)}function yt(e,n){ee(e,n);var a=Yt(n.value),c=n.type;if(a!=null)c==="number"?(a===0&&e.value===""||e.value!=a)&&(e.value=""+a):e.value!==""+a&&(e.value=""+a);else if(c==="submit"||c==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?mt(e,n.type,a):n.hasOwnProperty("defaultValue")&&mt(e,n.type,Yt(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function Ot(e,n,a){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var c=n.type;if(!(c!=="submit"&&c!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,a||n===e.value||(e.value=n),e.defaultValue=n}a=e.name,a!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,a!==""&&(e.name=a)}function mt(e,n,a){(n!=="number"||Nt(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var ft=Array.isArray;function xt(e,n,a,c){if(e=e.options,n){n={};for(var E=0;E"+n.valueOf().toString()+"",n=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function ue(e,n){if(n){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=n;return}}e.textContent=n}var $t={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Jt=["Webkit","ms","Moz","O"];Object.keys($t).forEach(function(e){Jt.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),$t[n]=$t[e]})});function he(e,n,a){return n==null||typeof n=="boolean"||n===""?"":a||typeof n!="number"||n===0||$t.hasOwnProperty(e)&&$t[e]?(""+n).trim():n+"px"}function be(e,n){e=e.style;for(var a in n)if(n.hasOwnProperty(a)){var c=a.indexOf("--")===0,E=he(a,n[a],c);a==="float"&&(a="cssFloat"),c?e.setProperty(a,E):e[a]=E}}var Ye=_({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function xn(e,n){if(n){if(Ye[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(u(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(u(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(u(61))}if(n.style!=null&&typeof n.style!="object")throw Error(u(62))}}function Rn(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var mn=null;function ot(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var St=null,st=null,gt=null;function Dt(e){if(e=di(e)){if(typeof St!="function")throw Error(u(280));var n=e.stateNode;n&&(n=la(n),St(e.stateNode,e.type,n))}}function zt(e){st?gt?gt.push(e):gt=[e]:st=e}function ie(){if(st){var e=st,n=gt;if(gt=st=null,Dt(e),n)for(e=0;e>>=0,e===0?32:31-(pr(e)/eo|0)|0}var cn=64,Ir=4194304;function Cn(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function hr(e,n){var a=e.pendingLanes;if(a===0)return 0;var c=0,E=e.suspendedLanes,R=e.pingedLanes,V=a&268435455;if(V!==0){var et=V&~E;et!==0?c=Cn(et):(R&=V,R!==0&&(c=Cn(R)))}else V=a&~E,V!==0?c=Cn(V):R!==0&&(c=Cn(R));if(c===0)return 0;if(n!==0&&n!==c&&!(n&E)&&(E=c&-c,R=n&-n,E>=R||E===16&&(R&4194240)!==0))return n;if(c&4&&(c|=a&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=c;0a;a++)n.push(e);return n}function Cr(e,n,a){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-On(n),e[n]=a}function Dr(e,n){var a=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var c=e.eventTimes;for(e=e.expirationTimes;0=Oo),hs=" ",vu=!1;function $i(e,n){switch(e){case"keyup":return du.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function pu(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var To=!1;function yl(e,n){switch(e){case"compositionend":return pu(n);case"keypress":return n.which!==32?null:(vu=!0,hs);case"textInput":return e=n.data,e===hs&&vu?null:e;default:return null}}function xl(e,n){if(To)return e==="compositionend"||!zi&&$i(e,n)?(e=Yn(),je=ae=Kt=null,To=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:a,offset:n-e};e=c}t:{for(;a;){if(a.nextSibling){a=a.nextSibling;break t}a=a.parentNode}a=void 0}a=ti(a)}}function ys(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?ys(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function xs(){for(var e=window,n=Nt();r(n,e.HTMLIFrameElement);){try{var a=typeof n.contentWindow.location.href=="string"}catch(c){a=!1}if(a)e=n.contentWindow;else break;n=Nt(e.document)}return n}function Ss(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function Es(e){var n=xs(),a=e.focusedElem,c=e.selectionRange;if(n!==a&&a&&a.ownerDocument&&ys(a.ownerDocument.documentElement,a)){if(c!==null&&Ss(a)){if(n=c.start,e=c.end,e===void 0&&(e=n),"selectionStart"in a)a.selectionStart=n,a.selectionEnd=Math.min(e,a.value.length);else if(e=(n=a.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var E=a.textContent.length,R=Math.min(c.start,E);c=c.end===void 0?R:Math.min(c.end,E),!e.extend&&R>c&&(E=c,c=R,R=E),E=ei(a,R);var V=ei(a,c);E&&V&&(e.rangeCount!==1||e.anchorNode!==E.node||e.anchorOffset!==E.offset||e.focusNode!==V.node||e.focusOffset!==V.offset)&&(n=n.createRange(),n.setStart(E.node,E.offset),e.removeAllRanges(),R>c?(e.addRange(n),e.extend(V.node,V.offset)):(n.setEnd(V.node,V.offset),e.addRange(n)))}}for(n=[],e=a;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof a.focus=="function"&&a.focus(),a=0;a=document.documentMode,Pa=null,wa=null,ni=null,Os=!1;function xu(e,n,a){var c=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;Os||Pa==null||Pa!==Nt(c)||(c=Pa,"selectionStart"in c&&Ss(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}),ni&&Gr(ni,c)||(ni=c,c=ii(wa,"onSelect"),0Ko||(e.current=vi[Ko],vi[Ko]=null,Ko--)}function on(e,n){Ko++,vi[Ko]=e.current,e.current=n}var Co={},Xn=Ho(Co),yr=Ho(!1),ca=Co;function Xr(e,n){var a=e.type.contextTypes;if(!a)return Co;var c=e.stateNode;if(c&&c.__reactInternalMemoizedUnmaskedChildContext===n)return c.__reactInternalMemoizedMaskedChildContext;var E={},R;for(R in a)E[R]=n[R];return c&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=E),E}function ir(e){return e=e.childContextTypes,e!=null}function Qi(){vn(yr),vn(Xn)}function Zi(e,n,a){if(Xn.current!==Co)throw Error(u(168));on(Xn,n),on(yr,a)}function pi(e,n,a){var c=e.stateNode;if(n=n.childContextTypes,typeof c.getChildContext!="function")return a;c=c.getChildContext();for(var E in c)if(!(E in n))throw Error(u(108,Pt(e)||"Unknown",E));return _({},a,c)}function hi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Co,ca=Xn.current,on(Xn,e),on(yr,yr.current),!0}function js(e,n,a){var c=e.stateNode;if(!c)throw Error(u(169));a?(e=pi(e,n,ca),c.__reactInternalMemoizedMergedChildContext=e,vn(yr),vn(Xn),on(Xn,e)):vn(yr),on(yr,a)}var Fr=null,mi=!1,gi=!1;function wu(e){Fr===null?Fr=[e]:Fr.push(e)}function yi(e){mi=!0,wu(e)}function so(){if(!gi&&Fr!==null){gi=!0;var e=0,n=ke;try{var a=Fr;for(ke=1;e>=V,E-=V,Po=1<<32-On(n)+E|a<ze?(_n=Ne,Ne=null):_n=Ne.sibling;var tn=Xt(It,Ne,wt[ze],oe);if(tn===null){Ne===null&&(Ne=_n);break}e&&Ne&&tn.alternate===null&&n(It,Ne),ht=R(tn,ht,ze),Me===null?Ce=tn:Me.sibling=tn,Me=tn,Ne=_n}if(ze===wt.length)return a(It,Ne),an&&uo(It,ze),Ce;if(Ne===null){for(;zeze?(_n=Ne,Ne=null):_n=Ne.sibling;var Ea=Xt(It,Ne,tn.value,oe);if(Ea===null){Ne===null&&(Ne=_n);break}e&&Ne&&Ea.alternate===null&&n(It,Ne),ht=R(Ea,ht,ze),Me===null?Ce=Ea:Me.sibling=Ea,Me=Ea,Ne=_n}if(tn.done)return a(It,Ne),an&&uo(It,ze),Ce;if(Ne===null){for(;!tn.done;ze++,tn=wt.next())tn=Zt(It,tn.value,oe),tn!==null&&(ht=R(tn,ht,ze),Me===null?Ce=tn:Me.sibling=tn,Me=tn);return an&&uo(It,ze),Ce}for(Ne=c(It,Ne);!tn.done;ze++,tn=wt.next())tn=fe(Ne,It,ze,tn.value,oe),tn!==null&&(e&&tn.alternate!==null&&Ne.delete(tn.key===null?ze:tn.key),ht=R(tn,ht,ze),Me===null?Ce=tn:Me.sibling=tn,Me=tn);return e&&Ne.forEach(function(mf){return n(It,mf)}),an&&uo(It,ze),Ce}function Bn(It,ht,wt,oe){if(typeof wt=="object"&&wt!==null&&wt.type===K&&wt.key===null&&(wt=wt.props.children),typeof wt=="object"&&wt!==null){switch(wt.$$typeof){case D:t:{for(var Ce=wt.key,Me=ht;Me!==null;){if(Me.key===Ce){if(Ce=wt.type,Ce===K){if(Me.tag===7){a(It,Me.sibling),ht=E(Me,wt.props.children),ht.return=It,It=ht;break t}}else if(Me.elementType===Ce||typeof Ce=="object"&&Ce!==null&&Ce.$$typeof===L&&Bt(Ce)===Me.type){a(It,Me.sibling),ht=E(Me,wt.props),ht.ref=rt(It,Me,wt),ht.return=It,It=ht;break t}a(It,Me);break}else n(It,Me);Me=Me.sibling}wt.type===K?(ht=Va(wt.props.children,It.mode,oe,wt.key),ht.return=It,It=ht):(oe=Js(wt.type,wt.key,wt.props,null,It.mode,oe),oe.ref=rt(It,ht,wt),oe.return=It,It=oe)}return V(It);case W:t:{for(Me=wt.key;ht!==null;){if(ht.key===Me)if(ht.tag===4&&ht.stateNode.containerInfo===wt.containerInfo&&ht.stateNode.implementation===wt.implementation){a(It,ht.sibling),ht=E(ht,wt.children||[]),ht.return=It,It=ht;break t}else{a(It,ht);break}else n(It,ht);ht=ht.sibling}ht=ul(wt,It.mode,oe),ht.return=It,It=ht}return V(It);case L:return Me=wt._init,Bn(It,ht,Me(wt._payload),oe)}if(ft(wt))return ye(It,ht,wt,oe);if(U(wt))return Ee(It,ht,wt,oe);it(It,wt)}return typeof wt=="string"&&wt!==""||typeof wt=="number"?(wt=""+wt,ht!==null&&ht.tag===6?(a(It,ht.sibling),ht=E(ht,wt),ht.return=It,It=ht):(a(It,ht),ht=sl(wt,It.mode,oe),ht.return=It,It=ht),V(It)):a(It,ht)}return Bn}var bt=Wt(!0),Ht=Wt(!1),Qt=Ho(null),te=null,re=null,le=null;function we(){le=re=te=null}function se(e){var n=Qt.current;vn(Qt),e._currentValue=n}function Ie(e,n,a){for(;e!==null;){var c=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,c!==null&&(c.childLanes|=n)):c!==null&&(c.childLanes&n)!==n&&(c.childLanes|=n),e===a)break;e=e.return}}function Oe(e,n){te=e,le=re=null,e=e.dependencies,e!==null&&e.firstContext!==null&&(e.lanes&n&&(jr=!0),e.firstContext=null)}function Se(e){var n=e._currentValue;if(le!==e)if(e={context:e,memoizedValue:n,next:null},re===null){if(te===null)throw Error(u(308));re=e,te.dependencies={lanes:0,firstContext:e}}else re=re.next=e;return n}var Pe=null;function We(e){Pe===null?Pe=[e]:Pe.push(e)}function Re(e,n,a,c){var E=n.interleaved;return E===null?(a.next=a,We(n)):(a.next=E.next,E.next=a),n.interleaved=a,Ae(e,c)}function Ae(e,n){e.lanes|=n;var a=e.alternate;for(a!==null&&(a.lanes|=n),a=e,e=e.return;e!==null;)e.childLanes|=n,a=e.alternate,a!==null&&(a.childLanes|=n),a=e,e=e.return;return a.tag===3?a.stateNode:null}var ge=!1;function sn(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Pn(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function nn(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function rn(e,n,a){var c=e.updateQueue;if(c===null)return null;if(c=c.shared,qe&2){var E=c.pending;return E===null?n.next=n:(n.next=E.next,E.next=n),c.pending=n,Ae(e,a)}return E=c.interleaved,E===null?(n.next=n,We(c)):(n.next=E.next,E.next=n),c.interleaved=n,Ae(e,a)}function zn(e,n,a){if(n=n.updateQueue,n!==null&&(n=n.shared,(a&4194240)!==0)){var c=n.lanes;c&=e.pendingLanes,a|=c,n.lanes=a,Gn(e,a)}}function Yo(e,n){var a=e.updateQueue,c=e.alternate;if(c!==null&&(c=c.updateQueue,a===c)){var E=null,R=null;if(a=a.firstBaseUpdate,a!==null){do{var V={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};R===null?E=R=V:R=R.next=V,a=a.next}while(a!==null);R===null?E=R=n:R=R.next=n}else E=R=n;a={baseState:c.baseState,firstBaseUpdate:E,lastBaseUpdate:R,shared:c.shared,effects:c.effects},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=n:e.next=n,a.lastBaseUpdate=n}function br(e,n,a,c){var E=e.updateQueue;ge=!1;var R=E.firstBaseUpdate,V=E.lastBaseUpdate,et=E.shared.pending;if(et!==null){E.shared.pending=null;var pt=et,Mt=pt.next;pt.next=null,V===null?R=Mt:V.next=Mt,V=pt;var Ft=e.alternate;Ft!==null&&(Ft=Ft.updateQueue,et=Ft.lastBaseUpdate,et!==V&&(et===null?Ft.firstBaseUpdate=Mt:et.next=Mt,Ft.lastBaseUpdate=pt))}if(R!==null){var Zt=E.baseState;V=0,Ft=Mt=pt=null,et=R;do{var Xt=et.lane,fe=et.eventTime;if((c&Xt)===Xt){Ft!==null&&(Ft=Ft.next={eventTime:fe,lane:0,tag:et.tag,payload:et.payload,callback:et.callback,next:null});t:{var ye=e,Ee=et;switch(Xt=n,fe=a,Ee.tag){case 1:if(ye=Ee.payload,typeof ye=="function"){Zt=ye.call(fe,Zt,Xt);break t}Zt=ye;break t;case 3:ye.flags=ye.flags&-65537|128;case 0:if(ye=Ee.payload,Xt=typeof ye=="function"?ye.call(fe,Zt,Xt):ye,Xt==null)break t;Zt=_({},Zt,Xt);break t;case 2:ge=!0}}et.callback!==null&&et.lane!==0&&(e.flags|=64,Xt=E.effects,Xt===null?E.effects=[et]:Xt.push(et))}else fe={eventTime:fe,lane:Xt,tag:et.tag,payload:et.payload,callback:et.callback,next:null},Ft===null?(Mt=Ft=fe,pt=Zt):Ft=Ft.next=fe,V|=Xt;if(et=et.next,et===null){if(et=E.shared.pending,et===null)break;Xt=et,et=Xt.next,Xt.next=null,E.lastBaseUpdate=Xt,E.shared.pending=null}}while(!0);if(Ft===null&&(pt=Zt),E.baseState=pt,E.firstBaseUpdate=Mt,E.lastBaseUpdate=Ft,n=E.shared.interleaved,n!==null){E=n;do V|=E.lane,E=E.next;while(E!==n)}else R===null&&(E.shared.lanes=0);Ua|=V,e.lanes=V,e.memoizedState=Zt}}function Ba(e,n,a){if(e=n.effects,n.effects=null,e!==null)for(n=0;na?a:4,e(!0);var c=qi.transition;qi.transition={};try{e(!1),n()}finally{ke=a,qi.transition=c}}function zl(){return qr().memoizedState}function zc(e,n,a){var c=ya(e);if(a={lane:c,action:a,hasEagerState:!1,eagerState:null,next:null},$l(e))Wl(n,a);else if(a=Re(e,n,a,c),a!==null){var E=Er();po(a,e,c,E),Vl(a,n,c)}}function $c(e,n,a){var c=ya(e),E={lane:c,action:a,hasEagerState:!1,eagerState:null,next:null};if($l(e))Wl(n,E);else{var R=e.alternate;if(e.lanes===0&&(R===null||R.lanes===0)&&(R=n.lastRenderedReducer,R!==null))try{var V=n.lastRenderedState,et=R(V,a);if(E.hasEagerState=!0,E.eagerState=et,Br(et,V)){var pt=n.interleaved;pt===null?(E.next=E,We(n)):(E.next=pt.next,pt.next=E),n.interleaved=E;return}}catch(Mt){}finally{}a=Re(e,n,E,c),a!==null&&(E=Er(),po(a,e,c,E),Vl(a,n,c))}}function $l(e){var n=e.alternate;return e===hn||n!==null&&n===hn}function Wl(e,n){Mo=Jr=!0;var a=e.pending;a===null?n.next=n:(n.next=a.next,a.next=n),e.pending=n}function Vl(e,n,a){if(a&4194240){var c=n.lanes;c&=e.pendingLanes,a|=c,n.lanes=a,Gn(e,a)}}var Fs={readContext:Se,useCallback:Wn,useContext:Wn,useEffect:Wn,useImperativeHandle:Wn,useInsertionEffect:Wn,useLayoutEffect:Wn,useMemo:Wn,useReducer:Wn,useRef:Wn,useState:Wn,useDebugValue:Wn,useDeferredValue:Wn,useTransition:Wn,useMutableSource:Wn,useSyncExternalStore:Wn,useId:Wn,unstable_isNewReconciler:!1},Wc={readContext:Se,useCallback:function(n,a){return Ur().memoizedState=[n,a===void 0?null:a],n},useContext:Se,useEffect:jl,useImperativeHandle:function(n,a,c){return c=c!=null?c.concat([n]):null,Ls(4194308,4,Dl.bind(null,a,n),c)},useLayoutEffect:function(n,a){return Ls(4194308,4,n,a)},useInsertionEffect:function(n,a){return Ls(4,2,n,a)},useMemo:function(n,a){var c=Ur();return a=a===void 0?null:a,n=n(),c.memoizedState=[n,a],n},useReducer:function(n,a,c){var E=Ur();return a=c!==void 0?c(a):a,E.memoizedState=E.baseState=a,n={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:n,lastRenderedState:a},E.queue=n,n=n.dispatch=zc.bind(null,hn,n),[E.memoizedState,n]},useRef:function(n){var a=Ur();return n={current:n},a.memoizedState=n},useState:Rl,useDebugValue:Du,useDeferredValue:function(n){return Ur().memoizedState=n},useTransition:function(){var n=Rl(!1),a=n[0];return n=Uc.bind(null,n[1]),Ur().memoizedState=n,[a,n]},useMutableSource:function(){},useSyncExternalStore:function(n,a,c){var E=hn,R=Ur();if(an){if(c===void 0)throw Error(u(407));c=c()}else{if(c=a(),qn===null)throw Error(u(349));jo&30||Il(E,a,c)}R.memoizedState=c;var V={value:c,getSnapshot:a};return R.queue=V,jl(Cl.bind(null,E,V,n),[n]),E.flags|=2048,ts(9,Al.bind(null,E,V,c,a),void 0,null),c},useId:function(){var n=Ur(),a=qn.identifierPrefix;if(an){var c=wo,E=Po;c=(E&~(1<<32-On(E)-1)).toString(32)+c,a=":"+a+"R"+c,c=pa++,0<\/script>",e=e.removeChild(e.firstChild)):typeof c.is=="string"?e=V.createElement(a,{is:c.is}):(e=V.createElement(a),a==="select"&&(V=e,c.multiple?V.multiple=!0:c.size&&(V.size=c.size))):e=V.createElementNS(e,a),e[Yr]=n,e[Vo]=c,uc(e,n,!1,!1),n.stateNode=e;t:{switch(V=Rn(a,c),a){case"dialog":dn("cancel",e),dn("close",e),E=c;break;case"iframe":case"object":case"embed":dn("load",e),E=c;break;case"video":case"audio":for(E=0;Ewi&&(n.flags|=128,c=!0,es(R,!1),n.lanes=4194304)}else{if(!c)if(e=va(V),e!==null){if(n.flags|=128,c=!0,a=e.updateQueue,a!==null&&(n.updateQueue=a,n.flags|=4),es(R,!0),R.tail===null&&R.tailMode==="hidden"&&!V.alternate&&!an)return cr(n),null}else 2*He()-R.renderingStartTime>wi&&a!==1073741824&&(n.flags|=128,c=!0,es(R,!1),n.lanes=4194304);R.isBackwards?(V.sibling=n.child,n.child=V):(a=R.last,a!==null?a.sibling=V:n.child=V,R.last=V)}return R.tail!==null?(n=R.tail,R.rendering=n,R.tail=n.sibling,R.renderingStartTime=He(),n.sibling=null,a=yn.current,on(yn,c?a&1|2:a&1),n):(cr(n),null);case 22:case 23:return ol(),c=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==c&&(n.flags|=8192),c&&n.mode&1?zr&1073741824&&(cr(n),n.subtreeFlags&6&&(n.flags|=8192)):cr(n),null;case 24:return null;case 25:return null}throw Error(u(156,n.tag))}function Qc(e,n){switch(Ns(n),n.tag){case 1:return ir(n.type)&&Qi(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return lo(),vn(yr),vn(Xn),Si(),e=n.flags,e&65536&&!(e&128)?(n.flags=e&-65537|128,n):null;case 5:return Fa(n),null;case 13:if(vn(yn),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(u(340));Z()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return vn(yn),null;case 4:return lo(),null;case 10:return se(n.type._context),null;case 22:case 23:return ol(),null;case 24:return null;default:return null}}var Ws=!1,fr=!1,Zc=typeof WeakSet=="function"?WeakSet:Set,ve=null;function Ci(e,n){var a=e.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(c){wn(e,n,c)}else a.current=null}function ku(e,n,a){try{a()}catch(c){wn(e,n,c)}}var fc=!1;function Jc(e,n){if(ws=_o,e=xs(),Ss(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else t:{a=(a=e.ownerDocument)&&a.defaultView||window;var c=a.getSelection&&a.getSelection();if(c&&c.rangeCount!==0){a=c.anchorNode;var E=c.anchorOffset,R=c.focusNode;c=c.focusOffset;try{a.nodeType,R.nodeType}catch(oe){a=null;break t}var V=0,et=-1,pt=-1,Mt=0,Ft=0,Zt=e,Xt=null;e:for(;;){for(var fe;Zt!==a||E!==0&&Zt.nodeType!==3||(et=V+E),Zt!==R||c!==0&&Zt.nodeType!==3||(pt=V+c),Zt.nodeType===3&&(V+=Zt.nodeValue.length),(fe=Zt.firstChild)!==null;)Xt=Zt,Zt=fe;for(;;){if(Zt===e)break e;if(Xt===a&&++Mt===E&&(et=V),Xt===R&&++Ft===c&&(pt=V),(fe=Zt.nextSibling)!==null)break;Zt=Xt,Xt=Zt.parentNode}Zt=fe}a=et===-1||pt===-1?null:{start:et,end:pt}}else a=null}a=a||{start:0,end:0}}else a=null;for(Yi={focusedElem:e,selectionRange:a},_o=!1,ve=n;ve!==null;)if(n=ve,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,ve=e;else for(;ve!==null;){n=ve;try{var ye=n.alternate;if(n.flags&1024)switch(n.tag){case 0:case 11:case 15:break;case 1:if(ye!==null){var Ee=ye.memoizedProps,Bn=ye.memoizedState,It=n.stateNode,ht=It.getSnapshotBeforeUpdate(n.elementType===n.type?Ee:co(n.type,Ee),Bn);It.__reactInternalSnapshotBeforeUpdate=ht}break;case 3:var wt=n.stateNode.containerInfo;wt.nodeType===1?wt.textContent="":wt.nodeType===9&&wt.documentElement&&wt.removeChild(wt.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(u(163))}}catch(oe){wn(n,n.return,oe)}if(e=n.sibling,e!==null){e.return=n.return,ve=e;break}ve=n.return}return ye=fc,fc=!1,ye}function ns(e,n,a){var c=n.updateQueue;if(c=c!==null?c.lastEffect:null,c!==null){var E=c=c.next;do{if((E.tag&e)===e){var R=E.destroy;E.destroy=void 0,R!==void 0&&ku(n,a,R)}E=E.next}while(E!==c)}}function Vs(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var a=n=n.next;do{if((a.tag&e)===e){var c=a.create;a.destroy=c()}a=a.next}while(a!==n)}}function Yu(e){var n=e.ref;if(n!==null){var a=e.stateNode;switch(e.tag){case 5:e=a;break;default:e=a}typeof n=="function"?n(e):n.current=e}}function dc(e){var n=e.alternate;n!==null&&(e.alternate=null,dc(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[Yr],delete n[Vo],delete n[Da],delete n[Pu],delete n[bs])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function vc(e){return e.tag===5||e.tag===3||e.tag===4}function pc(e){t:for(;;){for(;e.sibling===null;){if(e.return===null||vc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue t;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Xu(e,n,a){var c=e.tag;if(c===5||c===6)e=e.stateNode,n?a.nodeType===8?a.parentNode.insertBefore(e,n):a.insertBefore(e,n):(a.nodeType===8?(n=a.parentNode,n.insertBefore(e,a)):(n=a,n.appendChild(e)),a=a._reactRootContainer,a!=null||n.onclick!==null||(n.onclick=si));else if(c!==4&&(e=e.child,e!==null))for(Xu(e,n,a),e=e.sibling;e!==null;)Xu(e,n,a),e=e.sibling}function Qu(e,n,a){var c=e.tag;if(c===5||c===6)e=e.stateNode,n?a.insertBefore(e,n):a.appendChild(e);else if(c!==4&&(e=e.child,e!==null))for(Qu(e,n,a),e=e.sibling;e!==null;)Qu(e,n,a),e=e.sibling}var nr=null,fo=!1;function ha(e,n,a){for(a=a.child;a!==null;)hc(e,n,a),a=a.sibling}function hc(e,n,a){if(ln&&typeof ln.onCommitFiberUnmount=="function")try{ln.onCommitFiberUnmount(Tr,a)}catch(et){}switch(a.tag){case 5:fr||Ci(a,n);case 6:var c=nr,E=fo;nr=null,ha(e,n,a),nr=c,fo=E,nr!==null&&(fo?(e=nr,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):nr.removeChild(a.stateNode));break;case 18:nr!==null&&(fo?(e=nr,a=a.stateNode,e.nodeType===8?Xi(e.parentNode,a):e.nodeType===1&&Xi(e,a),Lr(e)):Xi(nr,a.stateNode));break;case 4:c=nr,E=fo,nr=a.stateNode.containerInfo,fo=!0,ha(e,n,a),nr=c,fo=E;break;case 0:case 11:case 14:case 15:if(!fr&&(c=a.updateQueue,c!==null&&(c=c.lastEffect,c!==null))){E=c=c.next;do{var R=E,V=R.destroy;R=R.tag,V!==void 0&&(R&2||R&4)&&ku(a,n,V),E=E.next}while(E!==c)}ha(e,n,a);break;case 1:if(!fr&&(Ci(a,n),c=a.stateNode,typeof c.componentWillUnmount=="function"))try{c.props=a.memoizedProps,c.state=a.memoizedState,c.componentWillUnmount()}catch(et){wn(a,n,et)}ha(e,n,a);break;case 21:ha(e,n,a);break;case 22:a.mode&1?(fr=(c=fr)||a.memoizedState!==null,ha(e,n,a),fr=c):ha(e,n,a);break;default:ha(e,n,a)}}function mc(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var a=e.stateNode;a===null&&(a=e.stateNode=new Zc),n.forEach(function(c){var E=sf.bind(null,e,c);a.has(c)||(a.add(c),c.then(E,E))})}}function vo(e,n){var a=n.deletions;if(a!==null)for(var c=0;cE&&(E=V),c&=~R}if(c=E,c=He()-c,c=(120>c?120:480>c?480:1080>c?1080:1920>c?1920:3e3>c?3e3:4320>c?4320:1960*_c(c/1960))-c,10e?16:e,ga===null)var c=!1;else{if(e=ga,ga=null,Ys=0,qe&6)throw Error(u(331));var E=qe;for(qe|=4,ve=e.current;ve!==null;){var R=ve,V=R.child;if(ve.flags&16){var et=R.deletions;if(et!==null){for(var pt=0;ptHe()-qu?$a(e,0):Ju|=a),Nr(e,n)}function Rc(e,n){n===0&&(e.mode&1?(n=Ir,Ir<<=1,!(Ir&130023424)&&(Ir=4194304)):n=1);var a=Er();e=Ae(e,n),e!==null&&(Cr(e,n,a),Nr(e,a))}function af(e){var n=e.memoizedState,a=0;n!==null&&(a=n.retryLane),Rc(e,a)}function sf(e,n){var a=0;switch(e.tag){case 13:var c=e.stateNode,E=e.memoizedState;E!==null&&(a=E.retryLane);break;case 19:c=e.stateNode;break;default:throw Error(u(314))}c!==null&&c.delete(n),Rc(e,a)}var bc;bc=function(n,a,c){if(n!==null)if(n.memoizedProps!==a.pendingProps||yr.current)jr=!0;else{if(!(n.lanes&c)&&!(a.flags&128))return jr=!1,Yc(n,a,c);jr=!!(n.flags&131072)}else jr=!1,an&&a.flags&1048576&&Ru(a,xi,a.index);switch(a.lanes=0,a.tag){case 2:var E=a.type;$s(n,a),n=a.pendingProps;var R=Xr(a,Xn.current);Oe(a,c),R=Ti(null,a,E,n,R,c);var V=Ii();return a.flags|=1,typeof R=="object"&&R!==null&&typeof R.render=="function"&&R.$$typeof===void 0?(a.tag=1,a.memoizedState=null,a.updateQueue=null,ir(E)?(V=!0,hi(a)):V=!1,a.memoizedState=R.state!==null&&R.state!==void 0?R.state:null,sn(a),R.updater=Us,a.stateNode=R,R._reactInternals=a,Bu(a,E,n,c),a=$u(null,a,E,!0,V,c)):(a.tag=0,an&&V&&Ms(a),Sr(null,a,R,c),a=a.child),a;case 16:E=a.elementType;t:{switch($s(n,a),n=a.pendingProps,R=E._init,E=R(E._payload),a.type=E,R=a.tag=lf(E),n=co(E,n),R){case 0:a=zu(null,a,E,n,c);break t;case 1:a=nc(null,a,E,n,c);break t;case 11:a=Jl(null,a,E,n,c);break t;case 14:a=ql(null,a,E,co(E.type,n),c);break t}throw Error(u(306,E,""))}return a;case 0:return E=a.type,R=a.pendingProps,R=a.elementType===E?R:co(E,R),zu(n,a,E,R,c);case 1:return E=a.type,R=a.pendingProps,R=a.elementType===E?R:co(E,R),nc(n,a,E,R,c);case 3:t:{if(rc(a),n===null)throw Error(u(387));E=a.pendingProps,V=a.memoizedState,R=V.element,Pn(n,a),br(a,E,null,c);var et=a.memoizedState;if(E=et.element,V.isDehydrated)if(V={element:E,isDehydrated:!1,cache:et.cache,pendingSuspenseBoundaries:et.pendingSuspenseBoundaries,transitions:et.transitions},a.updateQueue.baseState=V,a.memoizedState=V,a.flags&256){R=Ai(Error(u(423)),a),a=oc(n,a,E,c,R);break t}else if(E!==R){R=Ai(Error(u(424)),a),a=oc(n,a,E,c,R);break t}else for(Rr=ao(a.stateNode.containerInfo.firstChild),wr=a,an=!0,Qr=null,c=Ht(a,null,E,c),a.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{if(Z(),E===R){a=Zo(n,a,c);break t}Sr(n,a,E,c)}a=a.child}return a;case 5:return bo(a),n===null&&C(a),E=a.type,R=a.pendingProps,V=n!==null?n.memoizedProps:null,et=R.children,ui(E,R)?et=null:V!==null&&ui(E,V)&&(a.flags|=32),ec(n,a),Sr(n,a,et,c),a.child;case 6:return n===null&&C(a),null;case 13:return ac(n,a,c);case 4:return Qo(a,a.stateNode.containerInfo),E=a.pendingProps,n===null?a.child=bt(a,null,E,c):Sr(n,a,E,c),a.child;case 11:return E=a.type,R=a.pendingProps,R=a.elementType===E?R:co(E,R),Jl(n,a,E,R,c);case 7:return Sr(n,a,a.pendingProps,c),a.child;case 8:return Sr(n,a,a.pendingProps.children,c),a.child;case 12:return Sr(n,a,a.pendingProps.children,c),a.child;case 10:t:{if(E=a.type._context,R=a.pendingProps,V=a.memoizedProps,et=R.value,on(Qt,E._currentValue),E._currentValue=et,V!==null)if(Br(V.value,et)){if(V.children===R.children&&!yr.current){a=Zo(n,a,c);break t}}else for(V=a.child,V!==null&&(V.return=a);V!==null;){var pt=V.dependencies;if(pt!==null){et=V.child;for(var Mt=pt.firstContext;Mt!==null;){if(Mt.context===E){if(V.tag===1){Mt=nn(-1,c&-c),Mt.tag=2;var Ft=V.updateQueue;if(Ft!==null){Ft=Ft.shared;var Zt=Ft.pending;Zt===null?Mt.next=Mt:(Mt.next=Zt.next,Zt.next=Mt),Ft.pending=Mt}}V.lanes|=c,Mt=V.alternate,Mt!==null&&(Mt.lanes|=c),Ie(V.return,c,a),pt.lanes|=c;break}Mt=Mt.next}}else if(V.tag===10)et=V.type===a.type?null:V.child;else if(V.tag===18){if(et=V.return,et===null)throw Error(u(341));et.lanes|=c,pt=et.alternate,pt!==null&&(pt.lanes|=c),Ie(et,c,a),et=V.sibling}else et=V.child;if(et!==null)et.return=V;else for(et=V;et!==null;){if(et===a){et=null;break}if(V=et.sibling,V!==null){V.return=et.return,et=V;break}et=et.return}V=et}Sr(n,a,R.children,c),a=a.child}return a;case 9:return R=a.type,E=a.pendingProps.children,Oe(a,c),R=Se(R),E=E(R),a.flags|=1,Sr(n,a,E,c),a.child;case 14:return E=a.type,R=co(E,a.pendingProps),R=co(E.type,R),ql(n,a,E,R,c);case 15:return _l(n,a,a.type,a.pendingProps,c);case 17:return E=a.type,R=a.pendingProps,R=a.elementType===E?R:co(E,R),$s(n,a),a.tag=1,ir(E)?(n=!0,hi(a)):n=!1,Oe(a,c),Hl(a,E,R),Bu(a,E,R,c),$u(null,a,E,!0,n,c);case 19:return sc(n,a,c);case 22:return tc(n,a,c)}throw Error(u(156,a.tag))};function jc(e,n){return Qe(e,n)}function uf(e,n,a,c){this.tag=e,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=c,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function to(e,n,a,c){return new uf(e,n,a,c)}function il(e){return e=e.prototype,!(!e||!e.isReactComponent)}function lf(e){if(typeof e=="function")return il(e)?1:0;if(e!=null){if(e=e.$$typeof,e===J)return 11;if(e===nt)return 14}return 2}function Sa(e,n){var a=e.alternate;return a===null?(a=to(e.tag,n,e.key,e.mode),a.elementType=e.elementType,a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=n,a.type=e.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=e.flags&14680064,a.childLanes=e.childLanes,a.lanes=e.lanes,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,n=e.dependencies,a.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a}function Js(e,n,a,c,E,R){var V=2;if(c=e,typeof e=="function")il(e)&&(V=1);else if(typeof e=="string")V=5;else t:switch(e){case K:return Va(a.children,E,R,n);case G:V=8,E|=8;break;case tt:return e=to(12,a,n,E|2),e.elementType=tt,e.lanes=R,e;case ut:return e=to(13,a,n,E),e.elementType=ut,e.lanes=R,e;case k:return e=to(19,a,n,E),e.elementType=k,e.lanes=R,e;case Y:return qs(a,E,R,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case H:V=10;break t;case q:V=9;break t;case J:V=11;break t;case nt:V=14;break t;case L:V=16,c=null;break t}throw Error(u(130,e==null?e:typeof e=="undefined"?"undefined":o(e),""))}return n=to(V,a,n,E),n.elementType=e,n.type=c,n.lanes=R,n}function Va(e,n,a,c){return e=to(7,e,c,n),e.lanes=a,e}function qs(e,n,a,c){return e=to(22,e,c,n),e.elementType=Y,e.lanes=a,e.stateNode={isHidden:!1},e}function sl(e,n,a){return e=to(6,e,null,n),e.lanes=a,e}function ul(e,n,a){return n=to(4,e.children!==null?e.children:[],e.key,n),n.lanes=a,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function cf(e,n,a,c,E){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=tr(0),this.expirationTimes=tr(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=tr(0),this.identifierPrefix=c,this.onRecoverableError=E,this.mutableSourceEagerHydrationData=null}function ll(e,n,a,c,E,R,V,et,pt){return e=new cf(e,n,a,et,pt),n===1?(n=1,R===!0&&(n|=8)):n=0,R=to(3,null,null,n),e.current=R,R.stateNode=e,R.memoizedState={element:c,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},sn(R),e}function ff(e,n,a){var c=3vt.length)&&(Et=vt.length);for(var At=0,qt=new Array(Et);At1?At-1:0),ce=1;ce/gm),Rt=b(/\${[\w\W]*}/gm),Nt=b(/^data-[\-\w.\u00B7-\uFFFF]/),Vt=b(/^aria-[\-\w]+$/),kt=b(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ee=b(/^(?:\w+script|data):/i),yt=b(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Ot=b(/^html$/i),mt=b(/^[a-z][.\w]*(-[.\w]+)+$/i),ft=function(){return typeof window=="undefined"?null:window},xt=function(Et,At){if(t(Et)!=="object"||typeof Et.createPolicy!="function")return null;var qt=null,ce="data-tt-policy-suffix";At.currentScript&&At.currentScript.hasAttribute(ce)&&(qt=At.currentScript.getAttribute(ce));var Fe="dompurify"+(qt?"#"+qt:"");try{return Et.createPolicy(Fe,{createHTML:function($t){return $t},createScriptURL:function($t){return $t}})}catch(ue){return console.warn("TrustedTypes policy "+Fe+" could not be created."),null}};function Tt(){var vt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ft(),Et=function(ct){return Tt(ct)};if(Et.version="2.5.3",Et.removed=[],!vt||!vt.document||vt.document.nodeType!==9)return Et.isSupported=!1,Et;var At=vt.document,qt=vt.document,ce=vt.DocumentFragment,Fe=vt.HTMLTemplateElement,ue=vt.Node,$t=vt.Element,Jt=vt.NodeFilter,he=vt.NamedNodeMap,be=he===void 0?vt.NamedNodeMap||vt.MozNamedAttrMap:he,Ye=vt.HTMLFormElement,xn=vt.DOMParser,Rn=vt.trustedTypes,mn=$t.prototype,ot=X(mn,"cloneNode"),St=X(mn,"nextSibling"),st=X(mn,"childNodes"),gt=X(mn,"parentNode");if(typeof Fe=="function"){var Dt=qt.createElement("template");Dt.content&&Dt.content.ownerDocument&&(qt=Dt.content.ownerDocument)}var zt=xt(Rn,At),ie=zt?zt.createHTML(""):"",ne=qt,pe=ne.implementation,_t=ne.createNodeIterator,Ge=ne.createDocumentFragment,Le=ne.getElementsByTagName,Ve=At.importNode,Xe={};try{Xe=Y(qt).documentMode?qt.documentMode:{}}catch(me){}var Ue={};Et.isSupported=typeof gt=="function"&&pe&&pe.createHTMLDocument!==void 0&&Xe!==9;var Ke=Te,De=de,pn=Rt,un=Nt,bn=Vt,dr=ee,Be=yt,Sn=mt,vr=kt,Je=null,jn=L({},[].concat(s(U),s(_),s(lt),s(Ct),s(Gt))),Ze=null,or=L({},[].concat(s(jt),s(Pt),s(Yt),s(xe))),Qe=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Kn=null,Mn=null,Or=!0,He=!0,Nn=!1,Zn=!0,Hn=!1,Dn=!0,Fn=!1,en=!1,Tr=!1,ln=!1,An=!1,On=!1,pr=!0,eo=!1,ho="user-content-",cn=!0,Ir=!1,Cn={},hr=null,no=L({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),mo=null,Ar=L({},["audio","video","img","source","image","track"]),go=null,tr=L({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Cr="http://www.w3.org/1998/Math/MathML",Dr="http://www.w3.org/2000/svg",Gn="http://www.w3.org/1999/xhtml",ke=Gn,$r=!1,Do=null,qo=L({},[Cr,Dr,Gn],W),Wr,Ka=["application/xhtml+xml","text/html"],Ha="text/html",gn,mr=null,ar=255,Vr=qt.createElement("form"),gr=function(ct){return h(ct,RegExp)||h(ct,Function)},Kr=function(ct){mr&&mr===ct||((!ct||t(ct)!=="object")&&(ct={}),ct=Y(ct),Wr=Ka.indexOf(ct.PARSER_MEDIA_TYPE)===-1?Wr=Ha:Wr=ct.PARSER_MEDIA_TYPE,gn=Wr==="application/xhtml+xml"?W:D,Je="ALLOWED_TAGS"in ct?L({},ct.ALLOWED_TAGS,gn):jn,Ze="ALLOWED_ATTR"in ct?L({},ct.ALLOWED_ATTR,gn):or,Do="ALLOWED_NAMESPACES"in ct?L({},ct.ALLOWED_NAMESPACES,W):qo,go="ADD_URI_SAFE_ATTR"in ct?L(Y(tr),ct.ADD_URI_SAFE_ATTR,gn):tr,mo="ADD_DATA_URI_TAGS"in ct?L(Y(Ar),ct.ADD_DATA_URI_TAGS,gn):Ar,hr="FORBID_CONTENTS"in ct?L({},ct.FORBID_CONTENTS,gn):no,Kn="FORBID_TAGS"in ct?L({},ct.FORBID_TAGS,gn):{},Mn="FORBID_ATTR"in ct?L({},ct.FORBID_ATTR,gn):{},Cn="USE_PROFILES"in ct?ct.USE_PROFILES:!1,Or=ct.ALLOW_ARIA_ATTR!==!1,He=ct.ALLOW_DATA_ATTR!==!1,Nn=ct.ALLOW_UNKNOWN_PROTOCOLS||!1,Zn=ct.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Hn=ct.SAFE_FOR_TEMPLATES||!1,Dn=ct.SAFE_FOR_XML!==!1,Fn=ct.WHOLE_DOCUMENT||!1,ln=ct.RETURN_DOM||!1,An=ct.RETURN_DOM_FRAGMENT||!1,On=ct.RETURN_TRUSTED_TYPE||!1,Tr=ct.FORCE_BODY||!1,pr=ct.SANITIZE_DOM!==!1,eo=ct.SANITIZE_NAMED_PROPS||!1,cn=ct.KEEP_CONTENT!==!1,Ir=ct.IN_PLACE||!1,vr=ct.ALLOWED_URI_REGEXP||vr,ke=ct.NAMESPACE||Gn,Qe=ct.CUSTOM_ELEMENT_HANDLING||{},ct.CUSTOM_ELEMENT_HANDLING&&gr(ct.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Qe.tagNameCheck=ct.CUSTOM_ELEMENT_HANDLING.tagNameCheck),ct.CUSTOM_ELEMENT_HANDLING&&gr(ct.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Qe.attributeNameCheck=ct.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),ct.CUSTOM_ELEMENT_HANDLING&&typeof ct.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(Qe.allowCustomizedBuiltInElements=ct.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Hn&&(He=!1),An&&(ln=!0),Cn&&(Je=L({},s(Gt)),Ze=[],Cn.html===!0&&(L(Je,U),L(Ze,jt)),Cn.svg===!0&&(L(Je,_),L(Ze,Pt),L(Ze,xe)),Cn.svgFilters===!0&&(L(Je,lt),L(Ze,Pt),L(Ze,xe)),Cn.mathMl===!0&&(L(Je,Ct),L(Ze,Yt),L(Ze,xe))),ct.ADD_TAGS&&(Je===jn&&(Je=Y(Je)),L(Je,ct.ADD_TAGS,gn)),ct.ADD_ATTR&&(Ze===or&&(Ze=Y(Ze)),L(Ze,ct.ADD_ATTR,gn)),ct.ADD_URI_SAFE_ATTR&&L(go,ct.ADD_URI_SAFE_ATTR,gn),ct.FORBID_CONTENTS&&(hr===no&&(hr=Y(hr)),L(hr,ct.FORBID_CONTENTS,gn)),cn&&(Je["#text"]=!0),Fn&&L(Je,["html","head","body"]),Je.table&&(L(Je,["tbody"]),delete Kn.tbody),A&&A(ct),mr=ct)},yo=L({},["mi","mo","mn","ms","mtext"]),kn=L({},["foreignobject","annotation-xml"]),Ga=L({},["title","style","font","a","script"]),xo=L({},_);L(xo,lt),L(xo,dt);var er=L({},Ct);L(er,Lt);var Lo=function(ct){var Kt=gt(ct);(!Kt||!Kt.tagName)&&(Kt={namespaceURI:ke,tagName:"template"});var ae=D(ct.tagName),je=D(Kt.tagName);return Do[ct.namespaceURI]?ct.namespaceURI===Dr?Kt.namespaceURI===Gn?ae==="svg":Kt.namespaceURI===Cr?ae==="svg"&&(je==="annotation-xml"||yo[je]):!!xo[ae]:ct.namespaceURI===Cr?Kt.namespaceURI===Gn?ae==="math":Kt.namespaceURI===Dr?ae==="math"&&kn[je]:!!er[ae]:ct.namespaceURI===Gn?Kt.namespaceURI===Dr&&!kn[je]||Kt.namespaceURI===Cr&&!yo[je]?!1:!er[ae]&&(Ga[ae]||!xo[ae]):!!(Wr==="application/xhtml+xml"&&Do[ct.namespaceURI]):!1},Un=function(ct){j(Et.removed,{element:ct});try{ct.parentNode.removeChild(ct)}catch(Kt){try{ct.outerHTML=ie}catch(ae){ct.remove()}}},En=function(ct,Kt){try{j(Et.removed,{attribute:Kt.getAttributeNode(ct),from:Kt})}catch(ae){j(Et.removed,{attribute:null,from:Kt})}if(Kt.removeAttribute(ct),ct==="is"&&!Ze[ct])if(ln||An)try{Un(Kt)}catch(ae){}else try{Kt.setAttribute(ct,"")}catch(ae){}},Oa=function(ct){var Kt,ae;if(Tr)ct=" "+ct;else{var je=K(ct,/^[\r\n\t ]+/);ae=je&&je[0]}Wr==="application/xhtml+xml"&&ke===Gn&&(ct=''+ct+"");var Yn=zt?zt.createHTML(ct):ct;if(ke===Gn)try{Kt=new xn().parseFromString(Yn,Wr)}catch(fn){}if(!Kt||!Kt.documentElement){Kt=pe.createDocument(ke,"template",null);try{Kt.documentElement.innerHTML=$r?ie:Yn}catch(fn){}}var Tn=Kt.body||Kt.documentElement;return ct&&ae&&Tn.insertBefore(qt.createTextNode(ae),Tn.childNodes[0]||null),ke===Gn?Le.call(Kt,Fn?"html":"body")[0]:Fn?Kt.documentElement:Tn},ka=function(ct){return _t.call(ct.ownerDocument||ct,ct,Jt.SHOW_ELEMENT|Jt.SHOW_COMMENT|Jt.SHOW_TEXT|Jt.SHOW_PROCESSING_INSTRUCTION|Jt.SHOW_CDATA_SECTION,null,!1)},So=function(ct){return h(ct,Ye)&&(typeof ct.__depth!="undefined"&&typeof ct.__depth!="number"||typeof ct.__removalCount!="undefined"&&typeof ct.__removalCount!="number"||typeof ct.nodeName!="string"||typeof ct.textContent!="string"||typeof ct.removeChild!="function"||!h(ct.attributes,be)||typeof ct.removeAttribute!="function"||typeof ct.setAttribute!="function"||typeof ct.namespaceURI!="string"||typeof ct.insertBefore!="function"||typeof ct.hasChildNodes!="function")},Lr=function(ct){return t(ue)==="object"?h(ct,ue):ct&&t(ct)==="object"&&typeof ct.nodeType=="number"&&typeof ct.nodeName=="string"},Jn=function(ct,Kt,ae){Ue[ct]&&M(Ue[ct],function(je){je.call(Et,Kt,ae,mr)})},_o=function(ct){var Kt;if(Jn("beforeSanitizeElements",ct,null),So(ct)||q(/[\u0080-\uFFFF]/,ct.nodeName))return Un(ct),!0;var ae=gn(ct.nodeName);if(Jn("uponSanitizeElement",ct,{tagName:ae,allowedTags:Je}),ct.hasChildNodes()&&!Lr(ct.firstElementChild)&&(!Lr(ct.content)||!Lr(ct.content.firstElementChild))&&q(/<[/\w]/g,ct.innerHTML)&&q(/<[/\w]/g,ct.textContent)||ae==="select"&&q(/=0;--fn){var Hr=ot(Yn[fn],!0);Hr.__removalCount=(ct.__removalCount||0)+1,je.insertBefore(Hr,St(ct))}}return Un(ct),!0}return h(ct,$t)&&!Lo(ct)||(ae==="noscript"||ae==="noembed"||ae==="noframes")&&q(/<\/no(script|embed|frames)/i,ct.innerHTML)?(Un(ct),!0):(Hn&&ct.nodeType===3&&(Kt=ct.textContent,Kt=G(Kt,Ke," "),Kt=G(Kt,De," "),Kt=G(Kt,pn," "),ct.textContent!==Kt&&(j(Et.removed,{element:ct.cloneNode()}),ct.textContent=Kt)),Jn("afterSanitizeElements",ct,null),!1)},bi=function(ct,Kt,ae){if(pr&&(Kt==="id"||Kt==="name")&&(ae in qt||ae in Vr||ae==="__depth"||ae==="__removalCount"))return!1;if(!(He&&!Mn[Kt]&&q(un,Kt))){if(!(Or&&q(bn,Kt))){if(!Ze[Kt]||Mn[Kt]){if(!(Bo(ct)&&(h(Qe.tagNameCheck,RegExp)&&q(Qe.tagNameCheck,ct)||h(Qe.tagNameCheck,Function)&&Qe.tagNameCheck(ct))&&(h(Qe.attributeNameCheck,RegExp)&&q(Qe.attributeNameCheck,Kt)||h(Qe.attributeNameCheck,Function)&&Qe.attributeNameCheck(Kt))||Kt==="is"&&Qe.allowCustomizedBuiltInElements&&(h(Qe.tagNameCheck,RegExp)&&q(Qe.tagNameCheck,ae)||h(Qe.tagNameCheck,Function)&&Qe.tagNameCheck(ae))))return!1}else if(!go[Kt]){if(!q(vr,G(ae,Be,""))){if(!((Kt==="src"||Kt==="xlink:href"||Kt==="href")&&ct!=="script"&&tt(ae,"data:")===0&&mo[ct])){if(!(Nn&&!q(dr,G(ae,Be,"")))){if(ae)return!1}}}}}}return!0},Bo=function(ct){return ct!=="annotation-xml"&&K(ct,Sn)},ro=function(ct){var Kt,ae,je,Yn;Jn("beforeSanitizeAttributes",ct,null);var Tn=ct.attributes;if(Tn){var fn={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ze};for(Yn=Tn.length;Yn--;){Kt=Tn[Yn];var Hr=Kt,_e=Hr.name,In=Hr.namespaceURI;if(ae=_e==="value"?Kt.value:H(Kt.value),je=gn(_e),fn.attrName=je,fn.attrValue=ae,fn.keepAttr=!0,fn.forceKeepAttr=void 0,Jn("uponSanitizeAttribute",ct,fn),ae=fn.attrValue,!fn.forceKeepAttr&&(En(_e,ct),!!fn.keepAttr)){if(!Zn&&q(/\/>/i,ae)){En(_e,ct);continue}if(Dn&&q(/((--!?|])>)|<\/(style|title)/i,ae)){En(_e,ct);continue}Hn&&(ae=G(ae,Ke," "),ae=G(ae,De," "),ae=G(ae,pn," "));var ea=gn(ct.nodeName);if(bi(ea,je,ae)){if(eo&&(je==="id"||je==="name")&&(En(_e,ct),ae=ho+ae),zt&&t(Rn)==="object"&&typeof Rn.getAttributeType=="function"&&!In)switch(Rn.getAttributeType(ea,je)){case"TrustedHTML":{ae=zt.createHTML(ae);break}case"TrustedScriptURL":{ae=zt.createScriptURL(ae);break}}try{In?ct.setAttributeNS(In,_e,ae):ct.setAttribute(_e,ae),So(ct)?Un(ct):B(Et.removed)}catch(Eo){}}}}Jn("afterSanitizeAttributes",ct,null)}},ta=function me(ct){var Kt,ae=ka(ct);for(Jn("beforeSanitizeShadowDOM",ct,null);Kt=ae.nextNode();)if(Jn("uponSanitizeShadowNode",Kt,null),!_o(Kt)){var je=gt(Kt);Kt.nodeType===1&&(je&&je.__depth?Kt.__depth=(Kt.__removalCount||0)+je.__depth+1:Kt.__depth=1),(Kt.__depth>=ar||ut(Kt.__depth))&&Un(Kt),h(Kt.content,ce)&&(Kt.content.__depth=Kt.__depth,me(Kt.content)),ro(Kt)}Jn("afterSanitizeShadowDOM",ct,null)};return Et.sanitize=function(me){var ct=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Kt,ae,je,Yn,Tn;if($r=!me,$r&&(me=""),typeof me!="string"&&!Lr(me))if(typeof me.toString=="function"){if(me=me.toString(),typeof me!="string")throw J("dirty is not a string, aborting")}else throw J("toString is not a function");if(!Et.isSupported){if(t(vt.toStaticHTML)==="object"||typeof vt.toStaticHTML=="function"){if(typeof me=="string")return vt.toStaticHTML(me);if(Lr(me))return vt.toStaticHTML(me.outerHTML)}return me}if(en||Kr(ct),Et.removed=[],typeof me=="string"&&(Ir=!1),Ir){if(me.nodeName){var fn=gn(me.nodeName);if(!Je[fn]||Kn[fn])throw J("root node is forbidden and cannot be sanitized in-place")}}else if(h(me,ue))Kt=Oa(""),ae=Kt.ownerDocument.importNode(me,!0),ae.nodeType===1&&ae.nodeName==="BODY"||ae.nodeName==="HTML"?Kt=ae:Kt.appendChild(ae);else{if(!ln&&!Hn&&!Fn&&me.indexOf("<")===-1)return zt&&On?zt.createHTML(me):me;if(Kt=Oa(me),!Kt)return ln?null:On?ie:""}Kt&&Tr&&Un(Kt.firstChild);for(var Hr=ka(Ir?me:Kt);je=Hr.nextNode();)if(!(je.nodeType===3&&je===Yn)&&!_o(je)){var _e=gt(je);je.nodeType===1&&(_e&&_e.__depth?je.__depth=(je.__removalCount||0)+_e.__depth+1:je.__depth=1),(je.__depth>=ar||ut(je.__depth))&&Un(je),h(je.content,ce)&&(je.content.__depth=je.__depth,ta(je.content)),ro(je),Yn=je}if(Yn=null,Ir)return me;if(ln){if(An)for(Tn=Ge.call(Kt.ownerDocument);Kt.firstChild;)Tn.appendChild(Kt.firstChild);else Tn=Kt;return(Ze.shadowroot||Ze.shadowrootmod)&&(Tn=Ve.call(At,Tn,!0)),Tn}var In=Fn?Kt.outerHTML:Kt.innerHTML;return Fn&&Je["!doctype"]&&Kt.ownerDocument&&Kt.ownerDocument.doctype&&Kt.ownerDocument.doctype.name&&q(Ot,Kt.ownerDocument.doctype.name)&&(In="\n"+In),Hn&&(In=G(In,Ke," "),In=G(In,De," "),In=G(In,pn," ")),zt&&On?zt.createHTML(In):In},Et.setConfig=function(me){Kr(me),en=!0},Et.clearConfig=function(){mr=null,en=!1},Et.isValidAttribute=function(me,ct,Kt){mr||Kr({});var ae=gn(me),je=gn(ct);return bi(ae,je,Kt)},Et.addHook=function(me,ct){typeof ct=="function"&&(Ue[me]=Ue[me]||[],j(Ue[me],ct))},Et.removeHook=function(me){if(Ue[me])return B(Ue[me])},Et.removeHooks=function(me){Ue[me]&&(Ue[me]=[])},Et.removeAllHooks=function(){Ue={}},Et}var Ut=Tt();return Ut})},20878:function(d){function h(u,f){return f!=null&&typeof Symbol!="undefined"&&f[Symbol.hasInstance]?!!f[Symbol.hasInstance](u):u instanceof f}var t=typeof Element!="undefined",r=typeof Map=="function",o=typeof Set=="function",i=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function s(u,f){if(u===f)return!0;if(u&&f&&typeof u=="object"&&typeof f=="object"){if(u.constructor!==f.constructor)return!1;var m,p,g;if(Array.isArray(u)){if(m=u.length,m!=f.length)return!1;for(p=m;p--!==0;)if(!s(u[p],f[p]))return!1;return!0}var y;if(r&&h(u,Map)&&h(f,Map)){if(u.size!==f.size)return!1;for(y=u.entries();!(p=y.next()).done;)if(!f.has(p.value[0]))return!1;for(y=u.entries();!(p=y.next()).done;)if(!s(p.value[1],f.get(p.value[0])))return!1;return!0}if(o&&h(u,Set)&&h(f,Set)){if(u.size!==f.size)return!1;for(y=u.entries();!(p=y.next()).done;)if(!f.has(p.value[0]))return!1;return!0}if(i&&ArrayBuffer.isView(u)&&ArrayBuffer.isView(f)){if(m=u.length,m!=f.length)return!1;for(p=m;p--!==0;)if(u[p]!==f[p])return!1;return!0}if(u.constructor===RegExp)return u.source===f.source&&u.flags===f.flags;if(u.valueOf!==Object.prototype.valueOf&&typeof u.valueOf=="function"&&typeof f.valueOf=="function")return u.valueOf()===f.valueOf();if(u.toString!==Object.prototype.toString&&typeof u.toString=="function"&&typeof f.toString=="function")return u.toString()===f.toString();if(g=Object.keys(u),m=g.length,m!==Object.keys(f).length)return!1;for(p=m;p--!==0;)if(!Object.prototype.hasOwnProperty.call(f,g[p]))return!1;if(t&&h(u,Element))return!1;for(p=m;p--!==0;)if(!((g[p]==="_owner"||g[p]==="__v"||g[p]==="__o")&&u.$$typeof)&&!s(u[g[p]],f[g[p]]))return!1;return!0}return u!==u&&f!==f}d.exports=function(f,m){try{return s(f,m)}catch(p){if((p.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw p}}},32286:function(d,h,t){"use strict";/**
+ */function i(o,e){return e!=null&&typeof Symbol!="undefined"&&e[Symbol.hasInstance]?!!e[Symbol.hasInstance](o):o instanceof e}function u(o){"@swc/helpers - typeof";return o&&typeof Symbol!="undefined"&&o.constructor===Symbol?"symbol":typeof o}var s=n(28277),d=n(9359);function f(o){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+o,t=1;te}return!1}function M(o,e,t,r,a,l,v){this.acceptsBooleans=e===2||e===3||e===4,this.attributeName=r,this.attributeNamespace=a,this.mustUseProperty=t,this.propertyName=o,this.type=e,this.sanitizeURL=l,this.removeEmptyString=v}var U={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(o){U[o]=new M(o,0,!1,o,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(o){var e=o[0];U[e]=new M(e,1,!1,o[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(o){U[o]=new M(o,2,!1,o.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(o){U[o]=new M(o,2,!1,o,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(o){U[o]=new M(o,3,!1,o.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(o){U[o]=new M(o,3,!0,o,null,!1,!1)}),["capture","download"].forEach(function(o){U[o]=new M(o,4,!1,o,null,!1,!1)}),["cols","rows","size","span"].forEach(function(o){U[o]=new M(o,6,!1,o,null,!1,!1)}),["rowSpan","start"].forEach(function(o){U[o]=new M(o,5,!1,o.toLowerCase(),null,!1,!1)});var z=/[\-:]([a-z])/g;function D(o){return o[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(o){var e=o.replace(z,D);U[e]=new M(e,1,!1,o,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(o){var e=o.replace(z,D);U[e]=new M(e,1,!1,o,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(o){var e=o.replace(z,D);U[e]=new M(e,1,!1,o,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(o){U[o]=new M(o,1,!1,o.toLowerCase(),null,!1,!1)}),U.xlinkHref=new M("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(o){U[o]=new M(o,1,!1,o.toLowerCase(),null,!0,!0)});function b(o,e,t,r){var a=U.hasOwnProperty(e)?U[e]:null;(a!==null?a.type!==0:r||!(2P||a[v]!==l[P]){var k="\n"+a[v].replace(" at new "," at ");return o.displayName&&k.includes("")&&(k=k.replace("",o.displayName)),k}while(1<=v&&0<=P);break}}}finally{ye=!1,Error.prepareStackTrace=t}return(o=o?o.displayName||o.name:"")?Te(o):""}function Ae(o){switch(o.tag){case 5:return Te(o.type);case 16:return Te("Lazy");case 13:return Te("Suspense");case 19:return Te("SuspenseList");case 0:case 2:case 15:return o=xe(o.type,!1),o;case 11:return o=xe(o.type.render,!1),o;case 1:return o=xe(o.type,!0),o;default:return""}}function Pe(o){if(o==null)return null;if(typeof o=="function")return o.displayName||o.name||null;if(typeof o=="string")return o;switch(o){case G:return"Fragment";case V:return"Portal";case oe:return"Profiler";case J:return"StrictMode";case pe:return"Suspense";case ce:return"SuspenseList"}if(typeof o=="object")switch(o.$$typeof){case ne:return(o.displayName||"Context")+".Consumer";case Z:return(o._context.displayName||"Context")+".Provider";case te:var e=o.render;return o=o.displayName,o||(o=e.displayName||e.name||"",o=o!==""?"ForwardRef("+o+")":"ForwardRef"),o;case q:return e=o.displayName||null,e!==null?e:Pe(o.type)||"Memo";case K:e=o._payload,o=o._init;try{return Pe(o(e))}catch(t){}}return null}function me(o){var e=o.type;switch(o.tag){case 24:return"Cache";case 9:return(e.displayName||"Context")+".Consumer";case 10:return(e._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return o=e.render,o=o.displayName||o.name||"",e.displayName||(o!==""?"ForwardRef("+o+")":"ForwardRef");case 7:return"Fragment";case 5:return e;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Pe(e);case 8:return e===J?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e}return null}function Ye(o){switch(typeof o=="undefined"?"undefined":u(o)){case"boolean":case"number":case"string":case"undefined":return o;case"object":return o;default:return""}}function Qe(o){var e=o.type;return(o=o.nodeName)&&o.toLowerCase()==="input"&&(e==="checkbox"||e==="radio")}function yt(o){var e=Qe(o)?"checked":"value",t=Object.getOwnPropertyDescriptor(o.constructor.prototype,e),r=""+o[e];if(!o.hasOwnProperty(e)&&typeof t!="undefined"&&typeof t.get=="function"&&typeof t.set=="function"){var a=t.get,l=t.set;return Object.defineProperty(o,e,{configurable:!0,get:function(){return a.call(this)},set:function(P){r=""+P,l.call(this,P)}}),Object.defineProperty(o,e,{enumerable:t.enumerable}),{getValue:function(){return r},setValue:function(P){r=""+P},stopTracking:function(){o._valueTracker=null,delete o[e]}}}}function ut(o){o._valueTracker||(o._valueTracker=yt(o))}function Ie(o){if(!o)return!1;var e=o._valueTracker;if(!e)return!0;var t=e.getValue(),r="";return o&&(r=Qe(o)?o.checked?"true":"false":o.value),o=r,o!==t?(e.setValue(o),!0):!1}function De(o){if(o=o||(typeof document!="undefined"?document:void 0),typeof o=="undefined")return null;try{return o.activeElement||o.body}catch(e){return o.body}}function be(o,e){var t=e.checked;return ae({},e,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:t!=null?t:o._wrapperState.initialChecked})}function Xe(o,e){var t=e.defaultValue==null?"":e.defaultValue,r=e.checked!=null?e.checked:e.defaultChecked;t=Ye(e.value!=null?e.value:t),o._wrapperState={initialChecked:r,initialValue:t,controlled:e.type==="checkbox"||e.type==="radio"?e.checked!=null:e.value!=null}}function lt(o,e){e=e.checked,e!=null&&b(o,"checked",e,!1)}function tt(o,e){lt(o,e);var t=Ye(e.value),r=e.type;if(t!=null)r==="number"?(t===0&&o.value===""||o.value!=t)&&(o.value=""+t):o.value!==""+t&&(o.value=""+t);else if(r==="submit"||r==="reset"){o.removeAttribute("value");return}e.hasOwnProperty("value")?qe(o,e.type,t):e.hasOwnProperty("defaultValue")&&qe(o,e.type,Ye(e.defaultValue)),e.checked==null&&e.defaultChecked!=null&&(o.defaultChecked=!!e.defaultChecked)}function ct(o,e,t){if(e.hasOwnProperty("value")||e.hasOwnProperty("defaultValue")){var r=e.type;if(!(r!=="submit"&&r!=="reset"||e.value!==void 0&&e.value!==null))return;e=""+o._wrapperState.initialValue,t||e===o.value||(o.value=e),o.defaultValue=e}t=o.name,t!==""&&(o.name=""),o.defaultChecked=!!o._wrapperState.initialChecked,t!==""&&(o.name=t)}function qe(o,e,t){(e!=="number"||De(o.ownerDocument)!==o)&&(t==null?o.defaultValue=""+o._wrapperState.initialValue:o.defaultValue!==""+t&&(o.defaultValue=""+t))}var Ue=Array.isArray;function Ge(o,e,t,r){if(o=o.options,e){e={};for(var a=0;a"+e.valueOf().toString()+"",e=bt.firstChild;o.firstChild;)o.removeChild(o.firstChild);for(;e.firstChild;)o.appendChild(e.firstChild)}});function St(o,e){if(e){var t=o.firstChild;if(t&&t===o.lastChild&&t.nodeType===3){t.nodeValue=e;return}}o.textContent=e}var et={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},He=["Webkit","ms","Moz","O"];Object.keys(et).forEach(function(o){He.forEach(function(e){e=e+o.charAt(0).toUpperCase()+o.substring(1),et[e]=et[o]})});function Ft(o,e,t){return e==null||typeof e=="boolean"||e===""?"":t||typeof e!="number"||e===0||et.hasOwnProperty(o)&&et[o]?(""+e).trim():e+"px"}function Ut(o,e){o=o.style;for(var t in e)if(e.hasOwnProperty(t)){var r=t.indexOf("--")===0,a=Ft(t,e[t],r);t==="float"&&(t="cssFloat"),r?o.setProperty(t,a):o[t]=a}}var fn=ae({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function gn(o,e){if(e){if(fn[o]&&(e.children!=null||e.dangerouslySetInnerHTML!=null))throw Error(f(137,o));if(e.dangerouslySetInnerHTML!=null){if(e.children!=null)throw Error(f(60));if(typeof e.dangerouslySetInnerHTML!="object"||!("__html"in e.dangerouslySetInnerHTML))throw Error(f(61))}if(e.style!=null&&typeof e.style!="object")throw Error(f(62))}}function kn(o,e){if(o.indexOf("-")===-1)return typeof e.is=="string";switch(o){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Xn=null;function Lr(o){return o=o.target||o.srcElement||window,o.correspondingUseElement&&(o=o.correspondingUseElement),o.nodeType===3?o.parentNode:o}var le=null,we=null,ge=null;function Oe(o){if(o=ii(o)){if(typeof le!="function")throw Error(f(280));var e=o.stateNode;e&&(e=Go(e),le(o.stateNode,o.type,e))}}function Fe(o){we?ge?ge.push(o):ge=[o]:we=o}function Ve(){if(we){var o=we,e=ge;if(ge=we=null,Oe(o),e)for(o=0;o>>=0,o===0?32:31-(cr(o)/Co|0)|0}var Tr=64,wn=4194304;function Pr(o){switch(o&-o){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return o&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return o&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return o}}function mr(o,e){var t=o.pendingLanes;if(t===0)return 0;var r=0,a=o.suspendedLanes,l=o.pingedLanes,v=t&268435455;if(v!==0){var P=v&~a;P!==0?r=Pr(P):(l&=v,l!==0&&(r=Pr(l)))}else v=t&~a,v!==0?r=Pr(v):l!==0&&(r=Pr(l));if(r===0)return 0;if(e!==0&&e!==r&&!(e&a)&&(a=r&-r,l=e&-e,a>=l||a===16&&(l&4194240)!==0))return e;if(r&4&&(r|=t&16),e=o.entangledLanes,e!==0)for(o=o.entanglements,e&=r;0t;t++)e.push(o);return e}function tr(o,e,t){o.pendingLanes|=e,e!==536870912&&(o.suspendedLanes=0,o.pingedLanes=0),o=o.eventTimes,e=31-On(e),o[e]=t}function Ar(o,e){var t=o.pendingLanes&~e;o.pendingLanes=e,o.suspendedLanes=0,o.pingedLanes=0,o.expiredLanes&=e,o.mutableReadLanes&=e,o.entangledLanes&=e,e=o.entanglements;var r=o.eventTimes;for(o=o.expirationTimes;0=ni),hl=" ",ts=!1;function ju(o,e){switch(o){case"keyup":return Ys.indexOf(e.keyCode)!==-1;case"keydown":return e.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ns(o){return o=o.detail,typeof o=="object"&&"data"in o?o.data:null}var xi=!1;function iu(o,e){switch(o){case"compositionend":return ns(e);case"keypress":return e.which!==32?null:(ts=!0,hl);case"textInput":return o=e.data,o===hl&&ts?null:o;default:return null}}function $c(o,e){if(xi)return o==="compositionend"||!pl&&ju(o,e)?(o=Hn(),Kn=xn=Yt=null,xi=!1,o):null;switch(o){case"paste":return null;case"keypress":if(!(e.ctrlKey||e.altKey||e.metaKey)||e.ctrlKey&&e.altKey){if(e.char&&1=e)return{node:t,offset:e-o};o=r}e:{for(;t;){if(t.nextSibling){t=t.nextSibling;break e}t=t.parentNode}t=void 0}t=Bi(t)}}function gl(o,e){return o&&e?o===e?!0:o&&o.nodeType===3?!1:e&&e.nodeType===3?gl(o,e.parentNode):"contains"in o?o.contains(e):o.compareDocumentPosition?!!(o.compareDocumentPosition(e)&16):!1:!1}function yl(){for(var o=window,e=De();i(e,o.HTMLIFrameElement);){try{var t=typeof e.contentWindow.location.href=="string"}catch(r){t=!1}if(t)o=e.contentWindow;else break;e=De(o.document)}return e}function xl(o){var e=o&&o.nodeName&&o.nodeName.toLowerCase();return e&&(e==="input"&&(o.type==="text"||o.type==="search"||o.type==="tel"||o.type==="url"||o.type==="password")||e==="textarea"||o.contentEditable==="true")}function zu(o){var e=yl(),t=o.focusedElem,r=o.selectionRange;if(e!==t&&t&&t.ownerDocument&&gl(t.ownerDocument.documentElement,t)){if(r!==null&&xl(t)){if(e=r.start,o=r.end,o===void 0&&(o=e),"selectionStart"in t)t.selectionStart=e,t.selectionEnd=Math.min(o,t.value.length);else if(o=(e=t.ownerDocument||document)&&e.defaultView||window,o.getSelection){o=o.getSelection();var a=t.textContent.length,l=Math.min(r.start,a);r=r.end===void 0?l:Math.min(r.end,a),!o.extend&&l>r&&(a=r,r=l,l=a),a=uu(t,l);var v=uu(t,r);a&&v&&(o.rangeCount!==1||o.anchorNode!==a.node||o.anchorOffset!==a.offset||o.focusNode!==v.node||o.focusOffset!==v.offset)&&(e=e.createRange(),e.setStart(a.node,a.offset),o.removeAllRanges(),l>r?(o.addRange(e),o.extend(v.node,v.offset)):(e.setEnd(v.node,v.offset),o.addRange(e)))}}for(e=[],o=t;o=o.parentNode;)o.nodeType===1&&e.push({element:o,left:o.scrollLeft,top:o.scrollTop});for(typeof t.focus=="function"&&t.focus(),t=0;t=document.documentMode,lu=null,ri=null,Ba=null,ba=!1;function Sl(o,e,t){var r=t.window===t?t.document:t.nodeType===9?t:t.ownerDocument;ba||lu==null||lu!==De(r)||(r=lu,"selectionStart"in r&&xl(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Ba&&dr(Ba,r)||(Ba=r,r=$i(ri,"onSelect"),0Oi||(o.current=va[Oi],va[Oi]=null,Oi--)}function zt(o,e){Oi++,va[Oi]=o.current,o.current=e}var vn={},bn=No(vn),Tn=No(!1),xr=vn;function Ur(o,e){var t=o.type.contextTypes;if(!t)return vn;var r=o.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===e)return r.__reactInternalMemoizedMaskedChildContext;var a={},l;for(l in t)a[l]=e[l];return r&&(o=o.stateNode,o.__reactInternalMemoizedUnmaskedChildContext=e,o.__reactInternalMemoizedMaskedChildContext=a),a}function Sr(o){return o=o.childContextTypes,o!=null}function kr(){mn(Tn),mn(bn)}function Wa(o,e,t){if(bn.current!==vn)throw Error(f(168));zt(bn,e),zt(Tn,t)}function hu(o,e,t){var r=o.stateNode;if(e=e.childContextTypes,typeof r.getChildContext!="function")return t;r=r.getChildContext();for(var a in r)if(!(a in e))throw Error(f(108,me(o)||"Unknown",a));return ae({},t,r)}function mu(o){return o=(o=o.stateNode)&&o.__reactInternalMemoizedMergedChildContext||vn,xr=bn.current,zt(bn,o),zt(Tn,Tn.current),!0}function gu(o,e,t){var r=o.stateNode;if(!r)throw Error(f(169));t?(o=hu(o,e,xr),r.__reactInternalMemoizedMergedChildContext=o,mn(Tn),mn(bn),zt(bn,o)):mn(Tn),zt(Tn,t)}var Mo=null,jo=!1,pa=!1;function Cl(o){Mo===null?Mo=[o]:Mo.push(o)}function yu(o){jo=!0,Cl(o)}function Ti(){if(!pa&&Mo!==null){pa=!0;var o=0,e=tn;try{var t=Mo;for(tn=1;o>=v,a-=v,ro=1<<32-On(e)+a|t<it?(Nt=nt,nt=null):Nt=nt.sibling;var Ht=Se(Ce,nt,X[it],se);if(Ht===null){nt===null&&(nt=Nt);break}o&&nt&&Ht.alternate===null&&e(Ce,nt),Y=l(Ht,Y,it),Je===null?Le=Ht:Je.sibling=Ht,Je=Ht,nt=Nt}if(it===X.length)return t(Ce,nt),nn&&Nr(Ce,it),Le;if(nt===null){for(;itit?(Nt=nt,nt=null):Nt=nt.sibling;var on=Se(Ce,nt,Ht.value,se);if(on===null){nt===null&&(nt=Nt);break}o&&nt&&on.alternate===null&&e(Ce,nt),Y=l(on,Y,it),Je===null?Le=on:Je.sibling=on,Je=on,nt=Nt}if(Ht.done)return t(Ce,nt),nn&&Nr(Ce,it),Le;if(nt===null){for(;!Ht.done;it++,Ht=X.next())Ht=fe(Ce,Ht.value,se),Ht!==null&&(Y=l(Ht,Y,it),Je===null?Le=Ht:Je.sibling=Ht,Je=Ht);return nn&&Nr(Ce,it),Le}for(nt=r(Ce,nt);!Ht.done;it++,Ht=X.next())Ht=Re(nt,Ce,it,Ht.value,se),Ht!==null&&(o&&Ht.alternate!==null&&nt.delete(Ht.key===null?it:Ht.key),Y=l(Ht,Y,it),Je===null?Le=Ht:Je.sibling=Ht,Je=Ht);return o&&nt.forEach(function(eu){return e(Ce,eu)}),nn&&Nr(Ce,it),Le}function gt(Ce,Y,X,se){if(typeof X=="object"&&X!==null&&X.type===G&&X.key===null&&(X=X.props.children),typeof X=="object"&&X!==null){switch(X.$$typeof){case F:e:{for(var Le=X.key,Je=Y;Je!==null;){if(Je.key===Le){if(Le=X.type,Le===G){if(Je.tag===7){t(Ce,Je.sibling),Y=a(Je,X.props.children),Y.return=Ce,Ce=Y;break e}}else if(Je.elementType===Le||typeof Le=="object"&&Le!==null&&Le.$$typeof===K&&Lo(Le)===Je.type){t(Ce,Je.sibling),Y=a(Je,X.props),Y.ref=ai(Ce,Je,X),Y.return=Ce,Ce=Y;break e}t(Ce,Je);break}else e(Ce,Je);Je=Je.sibling}X.type===G?(Y=Ji(X.props.children,Ce.mode,se,X.key),Y.return=Ce,Ce=Y):(se=Mi(X.type,X.key,X.props,null,Ce.mode,se),se.ref=ai(Ce,Y,X),se.return=Ce,Ce=se)}return v(Ce);case V:e:{for(Je=X.key;Y!==null;){if(Y.key===Je)if(Y.tag===4&&Y.stateNode.containerInfo===X.containerInfo&&Y.stateNode.implementation===X.implementation){t(Ce,Y.sibling),Y=a(Y,X.children||[]),Y.return=Ce,Ce=Y;break e}else{t(Ce,Y);break}else e(Ce,Y);Y=Y.sibling}Y=$l(X,Ce.mode,se),Y.return=Ce,Ce=Y}return v(Ce);case K:return Je=X._init,gt(Ce,Y,Je(X._payload),se)}if(Ue(X))return ke(Ce,Y,X,se);if(H(X))return Ke(Ce,Y,X,se);To(Ce,X)}return typeof X=="string"&&X!==""||typeof X=="number"?(X=""+X,Y!==null&&Y.tag===6?(t(Ce,Y.sibling),Y=a(Y,X),Y.return=Ce,Ce=Y):(t(Ce,Y),Y=nl(X,Ce.mode,se),Y.return=Ce,Ce=Y),v(Ce)):t(Ce,Y)}return gt}var ui=ga(!0),Io=ga(!1),Ki={},io=No(Ki),Vr=No(Ki),Ii=No(Ki);function Do(o){if(o===Ki)throw Error(f(174));return o}function wi(o,e){switch(zt(Ii,e),zt(Vr,o),zt(io,Ki),o=e.nodeType,o){case 9:case 11:e=(e=e.documentElement)?e.namespaceURI:xt(null,"");break;default:o=o===8?e.parentNode:e,e=o.namespaceURI||null,o=o.tagName,e=xt(e,o)}mn(io),zt(io,e)}function Hi(){mn(io),mn(Vr),mn(Ii)}function Gi(o){Do(Ii.current);var e=Do(io.current),t=xt(e,o.type);e!==t&&(zt(Vr,o),zt(io,t))}function Su(o){Vr.current===o&&(mn(io),mn(Vr))}var Dn=No(0);function Nn(o){for(var e=o;e!==null;){if(e.tag===13){var t=e.memoizedState;if(t!==null&&(t=t.dehydrated,t===null||t.data==="$?"||t.data==="$!"))return e}else if(e.tag===19&&e.memoizedProps.revealOrder!==void 0){if(e.flags&128)return e}else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===o)break;for(;e.sibling===null;){if(e.return===null||e.return===o)return null;e=e.return}e.sibling.return=e.return,e=e.sibling}return null}var Fo=[];function Yi(){for(var o=0;ot?t:4,o(!0);var r=xa.transition;xa.transition={};try{o(!1),e()}finally{tn=t,xa.transition=r}}function Hc(){return Er().memoizedState}function Gc(o,e,t){var r=vr(o);if(t={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null},Yc(o))sc(e,t);else if(t=Lt(o,e,t,r),t!==null){var a=Xr();Qr(t,o,r,a),cc(t,e,r)}}function cf(o,e,t){var r=vr(o),a={lane:r,action:t,hasEagerState:!1,eagerState:null,next:null};if(Yc(o))sc(e,a);else{var l=o.alternate;if(o.lanes===0&&(l===null||l.lanes===0)&&(l=e.lastRenderedReducer,l!==null))try{var v=e.lastRenderedState,P=l(v,t);if(a.hasEagerState=!0,a.eagerState=P,Vo(P,v)){var k=e.interleaved;k===null?(a.next=a,ht(e)):(a.next=k.next,k.next=a),e.interleaved=a;return}}catch(Q){}finally{}t=Lt(o,e,a,r),t!==null&&(a=Xr(),Qr(t,o,r,a),cc(t,e,r))}}function Yc(o){var e=o.alternate;return o===Sn||e!==null&&e===Sn}function sc(o,e){Ka=Jn=!0;var t=o.pending;t===null?e.next=e:(e.next=t.next,t.next=e),o.pending=e}function cc(o,e,t){if(t&4194240){var r=e.lanes;r&=o.pendingLanes,t|=r,e.lanes=t,Jr(o,t)}}var Dl={readContext:vt,useCallback:ao,useContext:ao,useEffect:ao,useImperativeHandle:ao,useInsertionEffect:ao,useLayoutEffect:ao,useMemo:ao,useReducer:ao,useRef:ao,useState:ao,useDebugValue:ao,useDeferredValue:ao,useTransition:ao,useMutableSource:ao,useSyncExternalStore:ao,useId:ao,unstable_isNewReconciler:!1},ms={readContext:vt,useCallback:function(e,t){return li().memoizedState=[e,t===void 0?null:t],e},useContext:vt,useEffect:Ll,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,jl(4194308,4,ic.bind(null,t,e),r)},useLayoutEffect:function(e,t){return jl(4194308,4,e,t)},useInsertionEffect:function(e,t){return jl(4,2,e,t)},useMemo:function(e,t){var r=li();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var a=li();return t=r!==void 0?r(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=Gc.bind(null,Sn,e),[a.memoizedState,e]},useRef:function(e){var t=li();return e={current:e},t.memoizedState=e},useState:rc,useDebugValue:ps,useDeferredValue:function(e){return li().memoizedState=e},useTransition:function(){var e=rc(!1),t=e[0];return e=Kc.bind(null,e[1]),li().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var a=Sn,l=li();if(nn){if(r===void 0)throw Error(f(407));r=r()}else{if(r=t(),$t===null)throw Error(f(349));Jo&30||qs(a,t,r)}l.memoizedState=r;var v={value:r,getSnapshot:t};return l.queue=v,Ll(ec.bind(null,a,v,e),[e]),a.flags|=2048,Ku(9,_s.bind(null,a,v,r,t),void 0,null),r},useId:function(){var e=li(),t=$t.identifierPrefix;if(nn){var r=Wr,a=ro;r=(a&~(1<<32-On(a)-1)).toString(32)+r,t=":"+t+"R"+r,r=Sa++,0<\/script>",o=o.removeChild(o.firstChild)):typeof r.is=="string"?o=v.createElement(t,{is:r.is}):(o=v.createElement(t),t==="select"&&(v=o,r.multiple?v.multiple=!0:r.size&&(v.size=r.size))):o=v.createElementNS(o,t),o[_r]=e,o[zr]=r,Jc(o,e,!1,!1),e.stateNode=o;e:{switch(v=kn(t,r),t){case"dialog":Rn("cancel",o),Rn("close",o),a=r;break;case"iframe":case"object":case"embed":Rn("load",o),a=r;break;case"video":case"audio":for(a=0;aXa&&(e.flags|=128,r=!0,Xu(l,!1),e.lanes=4194304)}else{if(!r)if(o=Nn(v),o!==null){if(e.flags|=128,r=!0,t=o.updateQueue,t!==null&&(e.updateQueue=t,e.flags|=4),Xu(l,!0),l.tail===null&&l.tailMode==="hidden"&&!v.alternate&&!nn)return Cr(e),null}else 2*ln()-l.renderingStartTime>Xa&&t!==1073741824&&(e.flags|=128,r=!0,Xu(l,!1),e.lanes=4194304);l.isBackwards?(v.sibling=e.child,e.child=v):(t=l.last,t!==null?t.sibling=v:e.child=v,l.last=v)}return l.tail!==null?(e=l.tail,l.rendering=e,l.tail=e.sibling,l.renderingStartTime=ln(),e.sibling=null,t=Dn.current,zt(Dn,r?t&1|2:t&1),e):(Cr(e),null);case 22:case 23:return wa(),r=e.memoizedState!==null,o!==null&&o.memoizedState!==null!==r&&(e.flags|=8192),r&&e.mode&1?Pn&1073741824&&(Cr(e),e.subtreeFlags&6&&(e.flags|=8192)):Cr(e),null;case 24:return null;case 25:return null}throw Error(f(156,e.tag))}function vf(o,e){switch(Vu(e),e.tag){case 1:return Sr(e.type)&&kr(),o=e.flags,o&65536?(e.flags=o&-65537|128,e):null;case 3:return Hi(),mn(Tn),mn(bn),Yi(),o=e.flags,o&65536&&!(o&128)?(e.flags=o&-65537|128,e):null;case 5:return Su(e),null;case 13:if(mn(Dn),o=e.memoizedState,o!==null&&o.dehydrated!==null){if(e.alternate===null)throw Error(f(340));re()}return o=e.flags,o&65536?(e.flags=o&-65537|128,e):null;case 19:return mn(Dn),null;case 4:return Hi(),null;case 10:return ot(e.type._context),null;case 22:case 23:return wa(),null;case 24:return null;default:return null}}var Rs=!1,Mr=!1,co=typeof WeakSet=="function"?WeakSet:Set,Ct=null;function Et(o,e){var t=o.ref;if(t!==null)if(typeof t=="function")try{t(null)}catch(r){ir(o,e,r)}else t.current=null}function Ga(o,e,t){try{t()}catch(r){ir(o,e,r)}}var Ns=!1;function qc(o,e){if(du=Wo,o=yl(),xl(o)){if("selectionStart"in o)var t={start:o.selectionStart,end:o.selectionEnd};else e:{t=(t=o.ownerDocument)&&t.defaultView||window;var r=t.getSelection&&t.getSelection();if(r&&r.rangeCount!==0){t=r.anchorNode;var a=r.anchorOffset,l=r.focusNode;r=r.focusOffset;try{t.nodeType,l.nodeType}catch(se){t=null;break e}var v=0,P=-1,k=-1,Q=0,ie=0,fe=o,Se=null;t:for(;;){for(var Re;fe!==t||a!==0&&fe.nodeType!==3||(P=v+a),fe!==l||r!==0&&fe.nodeType!==3||(k=v+r),fe.nodeType===3&&(v+=fe.nodeValue.length),(Re=fe.firstChild)!==null;)Se=fe,fe=Re;for(;;){if(fe===o)break t;if(Se===t&&++Q===a&&(P=v),Se===l&&++ie===r&&(k=v),(Re=fe.nextSibling)!==null)break;fe=Se,Se=fe.parentNode}fe=Re}t=P===-1||k===-1?null:{start:P,end:k}}else t=null}t=t||{start:0,end:0}}else t=null;for(vu={focusedElem:o,selectionRange:t},Wo=!1,Ct=e;Ct!==null;)if(e=Ct,o=e.child,(e.subtreeFlags&1028)!==0&&o!==null)o.return=e,Ct=o;else for(;Ct!==null;){e=Ct;try{var ke=e.alternate;if(e.flags&1024)switch(e.tag){case 0:case 11:case 15:break;case 1:if(ke!==null){var Ke=ke.memoizedProps,gt=ke.memoizedState,Ce=e.stateNode,Y=Ce.getSnapshotBeforeUpdate(e.elementType===e.type?Ke:ue(e.type,Ke),gt);Ce.__reactInternalSnapshotBeforeUpdate=Y}break;case 3:var X=e.stateNode.containerInfo;X.nodeType===1?X.textContent="":X.nodeType===9&&X.documentElement&&X.removeChild(X.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(f(163))}}catch(se){ir(e,e.return,se)}if(o=e.sibling,o!==null){o.return=e.return,Ct=o;break}Ct=e.return}return ke=Ns,Ns=!1,ke}function zl(o,e,t){var r=e.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var a=r=r.next;do{if((a.tag&o)===o){var l=a.destroy;a.destroy=void 0,l!==void 0&&Ga(e,t,l)}a=a.next}while(a!==r)}}function Ya(o,e){if(e=e.updateQueue,e=e!==null?e.lastEffect:null,e!==null){var t=e=e.next;do{if((t.tag&o)===o){var r=t.create;t.destroy=r()}t=t.next}while(t!==e)}}function Qu(o){var e=o.ref;if(e!==null){var t=o.stateNode;switch(o.tag){case 5:o=t;break;default:o=t}typeof e=="function"?e(o):e.current=o}}function Ms(o){var e=o.alternate;e!==null&&(o.alternate=null,Ms(e)),o.child=null,o.deletions=null,o.sibling=null,o.tag===5&&(e=o.stateNode,e!==null&&(delete e[_r],delete e[zr],delete e[Eo],delete e[wl],delete e[cs])),o.stateNode=null,o.return=null,o.dependencies=null,o.memoizedProps=null,o.memoizedState=null,o.pendingProps=null,o.stateNode=null,o.updateQueue=null}function Oc(o){return o.tag===5||o.tag===3||o.tag===4}function Tc(o){e:for(;;){for(;o.sibling===null;){if(o.return===null||Oc(o.return))return null;o=o.return}for(o.sibling.return=o.return,o=o.sibling;o.tag!==5&&o.tag!==6&&o.tag!==18;){if(o.flags&2||o.child===null||o.tag===4)continue e;o.child.return=o,o=o.child}if(!(o.flags&2))return o.stateNode}}function js(o,e,t){var r=o.tag;if(r===5||r===6)o=o.stateNode,e?t.nodeType===8?t.parentNode.insertBefore(o,e):t.insertBefore(o,e):(t.nodeType===8?(e=t.parentNode,e.insertBefore(o,t)):(e=t,e.appendChild(o)),t=t._reactRootContainer,t!=null||e.onclick!==null||(e.onclick=ca));else if(r!==4&&(o=o.child,o!==null))for(js(o,e,t),o=o.sibling;o!==null;)js(o,e,t),o=o.sibling}function Ul(o,e,t){var r=o.tag;if(r===5||r===6)o=o.stateNode,e?t.insertBefore(o,e):t.appendChild(o);else if(r!==4&&(o=o.child,o!==null))for(Ul(o,e,t),o=o.sibling;o!==null;)Ul(o,e,t),o=o.sibling}var jr=null,Fn=!1;function Hr(o,e,t){for(t=t.child;t!==null;)Oa(o,e,t),t=t.sibling}function Oa(o,e,t){if(Wn&&typeof Wn.onCommitFiberUnmount=="function")try{Wn.onCommitFiberUnmount(hn,t)}catch(P){}switch(t.tag){case 5:Mr||Et(t,e);case 6:var r=jr,a=Fn;jr=null,Hr(o,e,t),jr=r,Fn=a,jr!==null&&(Fn?(o=jr,t=t.stateNode,o.nodeType===8?o.parentNode.removeChild(t):o.removeChild(t)):jr.removeChild(t.stateNode));break;case 18:jr!==null&&(Fn?(o=jr,t=t.stateNode,o.nodeType===8?Il(o.parentNode,t):o.nodeType===1&&Il(o,t),Ao(o)):Il(jr,t.stateNode));break;case 4:r=jr,a=Fn,jr=t.stateNode.containerInfo,Fn=!0,Hr(o,e,t),jr=r,Fn=a;break;case 0:case 11:case 14:case 15:if(!Mr&&(r=t.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){a=r=r.next;do{var l=a,v=l.destroy;l=l.tag,v!==void 0&&(l&2||l&4)&&Ga(t,e,v),a=a.next}while(a!==r)}Hr(o,e,t);break;case 1:if(!Mr&&(Et(t,e),r=t.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=t.memoizedProps,r.state=t.memoizedState,r.componentWillUnmount()}catch(P){ir(t,e,P)}Hr(o,e,t);break;case 21:Hr(o,e,t);break;case 22:t.mode&1?(Mr=(r=Mr)||t.memoizedState!==null,Hr(o,e,t),Mr=r):Hr(o,e,t);break;default:Hr(o,e,t)}}function Ic(o){var e=o.updateQueue;if(e!==null){o.updateQueue=null;var t=o.stateNode;t===null&&(t=o.stateNode=new co),e.forEach(function(r){var a=hf.bind(null,o,r);t.has(r)||(t.add(r),r.then(a,a))})}}function ci(o,e){var t=e.deletions;if(t!==null)for(var r=0;ra&&(a=v),r&=~l}if(r=a,r=ln()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*ef(r/1960))-r,10o?16:o,Ri===null)var r=!1;else{if(o=Ri,Ri=null,Ni=0,Zt&6)throw Error(f(331));var a=Zt;for(Zt|=4,Ct=o.current;Ct!==null;){var l=Ct,v=l.child;if(Ct.flags&16){var P=l.deletions;if(P!==null){for(var k=0;kln()-fo?Ca(o,0):Ju|=t),_n(o,e)}function nf(o,e){e===0&&(o.mode&1?(e=wn,wn<<=1,!(wn&130023424)&&(wn=4194304)):e=1);var t=Xr();o=At(o,e),o!==null&&(tr(o,e,t),_n(o,t))}function rf(o){var e=o.memoizedState,t=0;e!==null&&(t=e.retryLane),nf(o,t)}function hf(o,e){var t=0;switch(o.tag){case 13:var r=o.stateNode,a=o.memoizedState;a!==null&&(t=a.retryLane);break;case 19:r=o.stateNode;break;default:throw Error(f(314))}r!==null&&r.delete(e),nf(o,t)}var of;of=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||Tn.current)Bo=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return Bo=!1,Ea(e,t,r);Bo=!!(e.flags&131072)}else Bo=!1,nn&&t.flags&1048576&&ma(t,ha,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;bl(e,t),e=t.pendingProps;var l=Ur(t,bn.current);ft(t,r),l=Rl(null,t,a,e,l,r);var v=Nl();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Sr(a)?(v=!0,mu(t)):v=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Dt(t),l.updater=Zo,t.stateNode=l,l._reactInternals=t,Vi(t,a,e,r),t=xs(null,t,a,!0,v,r)):(t.tag=0,nn&&v&&Pl(t),Mn(null,t,l,r),t=t.child),t;case 16:a=t.elementType;e:{switch(bl(e,t),e=t.pendingProps,l=a._init,a=l(a._payload),t.type=a,l=t.tag=jc(a),e=ue(a,e),l){case 0:t=gs(null,t,a,e,r);break e;case 1:t=ys(null,t,a,e,r);break e;case 11:t=lo(null,t,a,e,r);break e;case 14:t=mc(null,t,a,ue(a.type,e),r);break e}throw Error(f(306,a,""))}return t;case 0:return a=t.type,l=t.pendingProps,l=t.elementType===a?l:ue(a,l),gs(e,t,a,l,r);case 1:return a=t.type,l=t.pendingProps,l=t.elementType===a?l:ue(a,l),ys(e,t,a,l,r);case 3:e:{if(Ss(t),e===null)throw Error(f(387));a=t.pendingProps,v=t.memoizedState,l=v.element,Xt(e,t),Gn(t,a,null,r);var P=t.memoizedState;if(a=P.element,v.isDehydrated)if(v={element:a,isDehydrated:!1,cache:P.cache,pendingSuspenseBoundaries:P.pendingSuspenseBoundaries,transitions:P.transitions},t.updateQueue.baseState=v,t.memoizedState=v,t.flags&256){l=Gu(Error(f(423)),t),t=Sc(e,t,a,r,l);break e}else if(a!==l){l=Gu(Error(f(424)),t),t=Sc(e,t,a,r,l);break e}else for(zn=Ko(t.stateNode.containerInfo.firstChild),oo=t,nn=!0,pn=null,r=Io(t,null,a,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(re(),a===l){t=si(e,t,r);break e}Mn(e,t,a,r)}t=t.child}return t;case 5:return Gi(t),e===null&&A(t),a=t.type,l=t.pendingProps,v=e!==null?e.memoizedProps:null,P=l.children,$a(a,l)?P=null:v!==null&&$a(a,v)&&(t.flags|=32),xc(e,t),Mn(e,t,P,r),t.child;case 6:return e===null&&A(t),null;case 13:return Os(e,t,r);case 4:return wi(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=ui(t,null,a,r):Mn(e,t,a,r),t.child;case 11:return a=t.type,l=t.pendingProps,l=t.elementType===a?l:ue(a,l),lo(e,t,a,l,r);case 7:return Mn(e,t,t.pendingProps,r),t.child;case 8:return Mn(e,t,t.pendingProps.children,r),t.child;case 12:return Mn(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(a=t.type._context,l=t.pendingProps,v=t.memoizedProps,P=l.value,zt(ve,a._currentValue),a._currentValue=P,v!==null)if(Vo(v.value,P)){if(v.children===l.children&&!Tn.current){t=si(e,t,r);break e}}else for(v=t.child,v!==null&&(v.return=t);v!==null;){var k=v.dependencies;if(k!==null){P=v.child;for(var Q=k.firstContext;Q!==null;){if(Q.context===a){if(v.tag===1){Q=Mt(-1,r&-r),Q.tag=2;var ie=v.updateQueue;if(ie!==null){ie=ie.shared;var fe=ie.pending;fe===null?Q.next=Q:(Q.next=fe.next,fe.next=Q),ie.pending=Q}}v.lanes|=r,Q=v.alternate,Q!==null&&(Q.lanes|=r),st(v.return,r,t),k.lanes|=r;break}Q=Q.next}}else if(v.tag===10)P=v.type===t.type?null:v.child;else if(v.tag===18){if(P=v.return,P===null)throw Error(f(341));P.lanes|=r,k=P.alternate,k!==null&&(k.lanes|=r),st(P,r,t),P=v.sibling}else P=v.child;if(P!==null)P.return=v;else for(P=v;P!==null;){if(P===t){P=null;break}if(v=P.sibling,v!==null){v.return=P.return,P=v;break}P=P.return}v=P}Mn(e,t,l.children,r),t=t.child}return t;case 9:return l=t.type,a=t.pendingProps.children,ft(t,r),l=vt(l),a=a(l),t.flags|=1,Mn(e,t,a,r),t.child;case 14:return a=t.type,l=ue(a,t.pendingProps),l=ue(a.type,l),mc(e,t,a,l,r);case 15:return gc(e,t,t.type,t.pendingProps,r);case 17:return a=t.type,l=t.pendingProps,l=t.elementType===a?l:ue(a,l),bl(e,t),t.tag=1,Sr(a)?(e=!0,mu(t)):e=!1,ft(t,r),Va(t,a,l),Vi(t,a,l,r),xs(null,t,a,!0,e,r);case 19:return Cs(e,t,r);case 22:return yc(e,t,r)}throw Error(f(156,t.tag))};function Mc(o,e){return Or(o,e)}function af(o,e,t,r){this.tag=o,this.key=t,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=e,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function vi(o,e,t,r){return new af(o,e,t,r)}function Uo(o){return o=o.prototype,!(!o||!o.isReactComponent)}function jc(o){if(typeof o=="function")return Uo(o)?1:0;if(o!=null){if(o=o.$$typeof,o===te)return 11;if(o===q)return 14}return 2}function _a(o,e){var t=o.alternate;return t===null?(t=vi(o.tag,e,o.key,o.mode),t.elementType=o.elementType,t.type=o.type,t.stateNode=o.stateNode,t.alternate=o,o.alternate=t):(t.pendingProps=e,t.type=o.type,t.flags=0,t.subtreeFlags=0,t.deletions=null),t.flags=o.flags&14680064,t.childLanes=o.childLanes,t.lanes=o.lanes,t.child=o.child,t.memoizedProps=o.memoizedProps,t.memoizedState=o.memoizedState,t.updateQueue=o.updateQueue,e=o.dependencies,t.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext},t.sibling=o.sibling,t.index=o.index,t.ref=o.ref,t}function Mi(o,e,t,r,a,l){var v=2;if(r=o,typeof o=="function")Uo(o)&&(v=1);else if(typeof o=="string")v=5;else e:switch(o){case G:return Ji(t.children,a,l,e);case J:v=8,a|=8;break;case oe:return o=vi(12,t,e,a|2),o.elementType=oe,o.lanes=l,o;case pe:return o=vi(13,t,e,a),o.elementType=pe,o.lanes=l,o;case ce:return o=vi(19,t,e,a),o.elementType=ce,o.lanes=l,o;case _:return qi(t,a,l,e);default:if(typeof o=="object"&&o!==null)switch(o.$$typeof){case Z:v=10;break e;case ne:v=9;break e;case te:v=11;break e;case q:v=14;break e;case K:v=16,r=null;break e}throw Error(f(130,o==null?o:typeof o=="undefined"?"undefined":u(o),""))}return e=vi(v,t,e,a),e.elementType=o,e.type=r,e.lanes=l,e}function Ji(o,e,t,r){return o=vi(7,o,r,e),o.lanes=t,o}function qi(o,e,t,r){return o=vi(22,o,r,e),o.elementType=_,o.lanes=t,o.stateNode={isHidden:!1},o}function nl(o,e,t){return o=vi(6,o,null,e),o.lanes=t,o}function $l(o,e,t){return e=vi(4,o.children!==null?o.children:[],o.key,e),e.lanes=t,e.stateNode={containerInfo:o.containerInfo,pendingChildren:null,implementation:o.implementation},e}function Lc(o,e,t,r,a){this.tag=e,this.containerInfo=o,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=ko(0),this.expirationTimes=ko(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=ko(0),this.identifierPrefix=r,this.onRecoverableError=a,this.mutableSourceEagerHydrationData=null}function Dc(o,e,t,r,a,l,v,P,k){return o=new Lc(o,e,t,P,k),e===1?(e=1,l===!0&&(e|=8)):e=0,l=vi(3,null,null,e),o.current=l,l.stateNode=o,l.memoizedState={element:r,isDehydrated:t,cache:null,transitions:null,pendingSuspenseBoundaries:null},Dt(l),o}function Fc(o,e,t){var r=3t}return!1}function U(e,t,r,a,l,v,P){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=l,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=v,this.removeEmptyString=P}var z={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){z[e]=new U(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];z[t]=new U(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){z[e]=new U(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){z[e]=new U(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){z[e]=new U(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){z[e]=new U(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){z[e]=new U(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){z[e]=new U(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){z[e]=new U(e,5,!1,e.toLowerCase(),null,!1,!1)});var D=/[\-:]([a-z])/g;function b(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(D,b);z[t]=new U(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(D,b);z[t]=new U(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(D,b);z[t]=new U(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){z[e]=new U(e,1,!1,e.toLowerCase(),null,!1,!1)}),z.xlinkHref=new U("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){z[e]=new U(e,1,!1,e.toLowerCase(),null,!0,!0)});function L(e,t,r,a){var l=z.hasOwnProperty(t)?z[t]:null;(l!==null?l.type!==0:a||!(2k||l[P]!==v[k]){var Q="\n"+l[P].replace(" at new "," at ");return e.displayName&&Q.includes("")&&(Q=Q.replace("",e.displayName)),Q}while(1<=P&&0<=k);break}}}finally{xe=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?ye(e):""}function Pe(e){switch(e.tag){case 5:return ye(e.type);case 16:return ye("Lazy");case 13:return ye("Suspense");case 19:return ye("SuspenseList");case 0:case 2:case 15:return e=Ae(e.type,!1),e;case 11:return e=Ae(e.type.render,!1),e;case 1:return e=Ae(e.type,!0),e;default:return""}}function me(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case J:return"Fragment";case G:return"Portal";case Z:return"Profiler";case oe:return"StrictMode";case ce:return"Suspense";case q:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case te:return(e.displayName||"Context")+".Consumer";case ne:return(e._context.displayName||"Context")+".Provider";case pe:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case K:return t=e.displayName||null,t!==null?t:me(e.type)||"Memo";case _:t=e._payload,e=e._init;try{return me(e(t))}catch(r){}}return null}function Ye(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return me(t);case 8:return t===oe?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Qe(e){switch(typeof e=="undefined"?"undefined":s(e)){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function yt(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ut(e){var t=yt(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof r!="undefined"&&typeof r.get=="function"&&typeof r.set=="function"){var l=r.get,v=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(k){a=""+k,v.call(this,k)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return a},setValue:function(k){a=""+k},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Ie(e){e._valueTracker||(e._valueTracker=ut(e))}function De(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),a="";return e&&(a=yt(e)?e.checked?"true":"false":e.value),e=a,e!==r?(t.setValue(e),!0):!1}function be(e){if(e=e||(typeof document!="undefined"?document:void 0),typeof e=="undefined")return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Xe(e,t){var r=t.checked;return he({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r!=null?r:e._wrapperState.initialChecked})}function lt(e,t){var r=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;r=Qe(t.value!=null?t.value:r),e._wrapperState={initialChecked:a,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function tt(e,t){t=t.checked,t!=null&&L(e,"checked",t,!1)}function ct(e,t){tt(e,t);var r=Qe(t.value),a=t.type;if(r!=null)a==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ue(e,t.type,r):t.hasOwnProperty("defaultValue")&&Ue(e,t.type,Qe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function qe(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function Ue(e,t,r){(t!=="number"||be(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Ge=Array.isArray;function $e(e,t,r,a){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Wt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function et(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var He={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ft=["Webkit","ms","Moz","O"];Object.keys(He).forEach(function(e){Ft.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),He[t]=He[e]})});function Ut(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||He.hasOwnProperty(e)&&He[e]?(""+t).trim():t+"px"}function fn(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var a=r.indexOf("--")===0,l=Ut(r,t[r],a);r==="float"&&(r="cssFloat"),a?e.setProperty(r,l):e[r]=l}}var gn=he({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function kn(e,t){if(t){if(gn[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(p(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(p(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(p(61))}if(t.style!=null&&typeof t.style!="object")throw Error(p(62))}}function Xn(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Lr=null;function le(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var we=null,ge=null,Oe=null;function Fe(e){if(e=Ei(e)){if(typeof we!="function")throw Error(p(280));var t=e.stateNode;t&&(t=va(t),we(e.stateNode,e.type,t))}}function Ve(e){ge?Oe?Oe.push(e):Oe=[e]:ge=e}function pt(){if(ge){var e=ge,t=Oe;if(Oe=ge=null,Fe(e),t)for(e=0;e>>=0,e===0?32:31-(Co(e)/qo|0)|0}var wn=64,Pr=4194304;function mr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pi(e,t){var r=e.pendingLanes;if(r===0)return 0;var a=0,l=e.suspendedLanes,v=e.pingedLanes,P=r&268435455;if(P!==0){var k=P&~l;k!==0?a=mr(k):(v&=P,v!==0&&(a=mr(v)))}else P=r&~l,P!==0?a=mr(P):v!==0&&(a=mr(v));if(a===0)return 0;if(t!==0&&t!==a&&!(t&l)&&(l=a&-a,v=t&-t,l>=v||l===16&&(v&4194240)!==0))return t;if(a&4&&(a|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0r;r++)t.push(e);return t}function Ar(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-cr(t),e[t]=r}function Jr(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var a=e.eventTimes;for(e=e.expirationTimes;0=ja),ts=" ",ju=!1;function ns(e,t){switch(e){case"keyup":return pl.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function xi(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var iu=!1;function $c(e,t){switch(e){case"compositionend":return xi(t);case"keypress":return t.which!==32?null:(ju=!0,ts);case"textInput":return e=t.data,e===ts&&ju?null:e;default:return null}}function Di(e,t){if(iu)return e==="compositionend"||!ni&&ns(e,t)?(e=ti(),Hn=Kn=xn=null,iu=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=a}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=uu(r)}}function yl(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?yl(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function xl(){for(var e=window,t=be();u(t,e.HTMLIFrameElement);){try{var r=typeof t.contentWindow.location.href=="string"}catch(a){r=!1}if(r)e=t.contentWindow;else break;t=be(e.document)}return t}function zu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Vc(e){var t=xl(),r=e.focusedElem,a=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&yl(r.ownerDocument.documentElement,r)){if(a!==null&&zu(r)){if(t=a.start,e=a.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=r.textContent.length,v=Math.min(a.start,l);a=a.end===void 0?v:Math.min(a.end,l),!e.extend&&v>a&&(l=a,a=v,v=l),l=gl(r,v);var P=gl(r,a);l&&P&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==P.node||e.focusOffset!==P.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),v>a?(e.addRange(t),e.extend(P.node,P.offset)):(t.setEnd(P.node,P.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,ri=null,Ba=null,ba=null,Sl=!1;function Uu(e,t,r){var a=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Sl||ri==null||ri!==be(a)||(a=ri,"selectionStart"in a&&zu(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),ba&&Bi(ba,a)||(ba=a,a=Ro(Ba,"onSelect"),0No||(e.current=Oi[No],Oi[No]=null,No--)}function vn(e,t){No++,Oi[No]=e.current,e.current=t}var bn={},Tn=mn(bn),xr=mn(!1),Ur=bn;function Sr(e,t){var r=e.type.contextTypes;if(!r)return bn;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var l={},v;for(v in r)l[v]=t[v];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function kr(e){return e=e.childContextTypes,e!=null}function Wa(){zt(xr),zt(Tn)}function hu(e,t,r){if(Tn.current!==bn)throw Error(p(168));vn(Tn,t),vn(xr,r)}function mu(e,t,r){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return r;a=a.getChildContext();for(var l in a)if(!(l in t))throw Error(p(108,Ye(e)||"Unknown",l));return he({},r,a)}function gu(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||bn,Ur=Tn.current,vn(Tn,e),vn(xr,xr.current),!0}function Mo(e,t,r){var a=e.stateNode;if(!a)throw Error(p(169));r?(e=mu(e,t,Ur),a.__reactInternalMemoizedMergedChildContext=e,zt(xr),zt(Tn),vn(Tn,e)):zt(xr),vn(xr,r)}var jo=null,pa=!1,Cl=!1;function yu(e){jo===null?jo=[e]:jo.push(e)}function Ti(e){pa=!0,yu(e)}function no(){if(!Cl&&jo!==null){Cl=!0;var e=0,t=un;try{var r=jo;for(un=1;e>=P,l-=P,Wr=1<<32-cr(t)+l|r<Nt?(Ht=it,it=null):Ht=it.sibling;var on=Re(Y,it,se[Nt],Le);if(on===null){it===null&&(it=Ht);break}e&&it&&on.alternate===null&&t(Y,it),X=v(on,X,Nt),nt===null?Je=on:nt.sibling=on,nt=on,it=Ht}if(Nt===se.length)return r(Y,it),pn&&ma(Y,Nt),Je;if(it===null){for(;NtNt?(Ht=it,it=null):Ht=it.sibling;var eu=Re(Y,it,on.value,Le);if(eu===null){it===null&&(it=Ht);break}e&&it&&eu.alternate===null&&t(Y,it),X=v(eu,X,Nt),nt===null?Je=eu:nt.sibling=eu,nt=eu,it=Ht}if(on.done)return r(Y,it),pn&&ma(Y,Nt),Je;if(it===null){for(;!on.done;Nt++,on=se.next())on=Se(Y,on.value,Le),on!==null&&(X=v(on,X,Nt),nt===null?Je=on:nt.sibling=on,nt=on);return pn&&ma(Y,Nt),Je}for(it=a(Y,it);!on.done;Nt++,on=se.next())on=ke(it,Y,Nt,on.value,Le),on!==null&&(e&&on.alternate!==null&&it.delete(on.key===null?Nt:on.key),X=v(on,X,Nt),nt===null?Je=on:nt.sibling=on,nt=on);return e&&it.forEach(function(yf){return t(Y,yf)}),pn&&ma(Y,Nt),Je}function Ce(Y,X,se,Le){if(typeof se=="object"&&se!==null&&se.type===J&&se.key===null&&(se=se.props.children),typeof se=="object"&&se!==null){switch(se.$$typeof){case V:e:{for(var Je=se.key,nt=X;nt!==null;){if(nt.key===Je){if(Je=se.type,Je===J){if(nt.tag===7){r(Y,nt.sibling),X=l(nt,se.props.children),X.return=Y,Y=X;break e}}else if(nt.elementType===Je||typeof Je=="object"&&Je!==null&&Je.$$typeof===_&&ga(Je)===nt.type){r(Y,nt.sibling),X=l(nt,se.props),X.ref=To(Y,nt,se),X.return=Y,Y=X;break e}r(Y,nt);break}else t(Y,nt);nt=nt.sibling}se.type===J?(X=qi(se.props.children,Y.mode,Le,se.key),X.return=Y,Y=X):(Le=Ji(se.type,se.key,se.props,null,Y.mode,Le),Le.ref=To(Y,X,se),Le.return=Y,Y=Le)}return P(Y);case G:e:{for(nt=se.key;X!==null;){if(X.key===nt)if(X.tag===4&&X.stateNode.containerInfo===se.containerInfo&&X.stateNode.implementation===se.implementation){r(Y,X.sibling),X=l(X,se.children||[]),X.return=Y,Y=X;break e}else{r(Y,X);break}else t(Y,X);X=X.sibling}X=Lc(se,Y.mode,Le),X.return=Y,Y=X}return P(Y);case _:return nt=se._init,Ce(Y,X,nt(se._payload),Le)}if(Ge(se))return Ke(Y,X,se,Le);if(ae(se))return gt(Y,X,se,Le);Lo(Y,se)}return typeof se=="string"&&se!==""||typeof se=="number"?(se=""+se,X!==null&&X.tag===6?(r(Y,X.sibling),X=l(X,se),X.return=Y,Y=X):(r(Y,X),X=$l(se,Y.mode,Le),X.return=Y,Y=X),P(Y)):r(Y,X)}return Ce}var Io=ui(!0),Ki=ui(!1),io={},Vr=mn(io),Ii=mn(io),Do=mn(io);function wi(e){if(e===io)throw Error(p(174));return e}function Hi(e,t){switch(vn(Do,t),vn(Ii,e),vn(Vr,io),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:bt(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=bt(t,e)}zt(Vr),vn(Vr,t)}function Gi(){zt(Vr),zt(Ii),zt(Do)}function Su(e){wi(Do.current);var t=wi(Vr.current),r=bt(t,e.type);t!==r&&(vn(Ii,e),vn(Vr,r))}function Dn(e){Ii.current===e&&(zt(Vr),zt(Ii))}var Nn=mn(0);function Fo(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||r.data==="$?"||r.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Yi=[];function ya(){for(var e=0;er?r:4,e(!0);var a=Jo.transition;Jo.transition={};try{e(!1),t()}finally{un=r,Jo.transition=a}}function Gc(){return uo().memoizedState}function cf(e,t,r){var a=Qr(e);if(r={lane:a,action:r,hasEagerState:!1,eagerState:null,next:null},sc(e))cc(t,r);else if(r=At(e,t,r,a),r!==null){var l=vr();_n(r,e,a,l),Dl(r,t,a)}}function Yc(e,t,r){var a=Qr(e),l={lane:a,action:r,hasEagerState:!1,eagerState:null,next:null};if(sc(e))cc(t,l);else{var v=e.alternate;if(e.lanes===0&&(v===null||v.lanes===0)&&(v=t.lastRenderedReducer,v!==null))try{var P=t.lastRenderedState,k=v(P,r);if(l.hasEagerState=!0,l.eagerState=k,dr(k,P)){var Q=t.interleaved;Q===null?(l.next=l,Lt(t)):(l.next=Q.next,Q.next=l),t.interleaved=l;return}}catch(ie){}finally{}r=At(e,t,l,a),r!==null&&(l=vr(),_n(r,e,a,l),Dl(r,t,a))}}function sc(e){var t=e.alternate;return e===Qt||t!==null&&t===Qt}function cc(e,t){Sa=Ka=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function Dl(e,t,r){if(r&4194240){var a=t.lanes;a&=e.pendingLanes,r|=a,t.lanes=r,tn(e,r)}}var ms={readContext:Ot,useCallback:Kr,useContext:Kr,useEffect:Kr,useImperativeHandle:Kr,useInsertionEffect:Kr,useLayoutEffect:Kr,useMemo:Kr,useReducer:Kr,useRef:Kr,useState:Kr,useDebugValue:Kr,useDeferredValue:Kr,useTransition:Kr,useMutableSource:Kr,useSyncExternalStore:Kr,useId:Kr,unstable_isNewReconciler:!1},ff={readContext:Ot,useCallback:function(t,r){return Er().memoizedState=[t,r===void 0?null:r],t},useContext:Ot,useEffect:ds,useImperativeHandle:function(t,r,a){return a=a!=null?a.concat([t]):null,Ou(4194308,4,ac.bind(null,r,t),a)},useLayoutEffect:function(t,r){return Ou(4194308,4,t,r)},useInsertionEffect:function(t,r){return Ou(4,2,t,r)},useMemo:function(t,r){var a=Er();return r=r===void 0?null:r,t=t(),a.memoizedState=[t,r],t},useReducer:function(t,r,a){var l=Er();return r=a!==void 0?a(r):r,l.memoizedState=l.baseState=r,t={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:t,lastRenderedState:r},l.queue=t,t=t.dispatch=cf.bind(null,Qt,t),[l.memoizedState,t]},useRef:function(t){var r=Er();return t={current:t},r.memoizedState=t},useState:Ku,useDebugValue:hs,useDeferredValue:function(t){return Er().memoizedState=t},useTransition:function(){var t=Ku(!1),r=t[0];return t=Hc.bind(null,t[1]),Er().memoizedState=t,[r,t]},useMutableSource:function(){},useSyncExternalStore:function(t,r,a){var l=Qt,v=Er();if(pn){if(a===void 0)throw Error(p(407));a=a()}else{if(a=r(),cn===null)throw Error(p(349));Sn&30||_s(l,r,a)}v.memoizedState=a;var P={value:a,getSnapshot:r};return v.queue=P,ds(tc.bind(null,l,P,t),[t]),l.flags|=2048,Hu(9,ec.bind(null,l,P,a,r),void 0,null),a},useId:function(){var t=Er(),r=cn.identifierPrefix;if(pn){var a=Nr,l=Wr;a=(l&~(1<<32-cr(l)-1)).toString(32)+a,r=":"+r+"R"+a,a=Al++,0<\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=P.createElement(r,{is:a.is}):(e=P.createElement(r),r==="select"&&(P=e,a.multiple?P.multiple=!0:a.size&&(P.size=a.size))):e=P.createElementNS(e,r),e[zr]=t,e[So]=a,Ps(e,t,!1,!1),t.stateNode=e;e:{switch(P=Xn(r,a),r){case"dialog":Cn("cancel",e),Cn("close",e),l=a;break;case"iframe":case"object":case"embed":Cn("load",e),l=a;break;case"video":case"audio":for(l=0;lzo&&(t.flags|=128,a=!0,Cr(v,!1),t.lanes=4194304)}else{if(!a)if(e=Fo(P),e!==null){if(t.flags|=128,a=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),Cr(v,!0),v.tail===null&&v.tailMode==="hidden"&&!P.alternate&&!pn)return so(t),null}else 2*sn()-v.renderingStartTime>zo&&r!==1073741824&&(t.flags|=128,a=!0,Cr(v,!1),t.lanes=4194304);v.isBackwards?(P.sibling=t.child,t.child=P):(r=v.last,r!==null?r.sibling=P:t.child=P,v.last=P)}return v.tail!==null?(t=v.tail,v.rendering=t,v.tail=t.sibling,v.renderingStartTime=sn(),t.sibling=null,r=Nn.current,vn(Nn,a?r&1|2:r&1),t):(so(t),null);case 22:case 23:return Ca(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&t.mode&1?Gr&1073741824&&(so(t),t.subtreeFlags&6&&(t.flags|=8192)):so(t),null;case 24:return null;case 25:return null}throw Error(p(156,t.tag))}function Rs(e,t){switch(oo(t),t.tag){case 1:return kr(t.type)&&Wa(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Gi(),zt(xr),zt(Tn),ya(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return Dn(t),null;case 13:if(zt(Nn),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(p(340));ee()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return zt(Nn),null;case 4:return Gi(),null;case 10:return st(t.type._context),null;case 22:case 23:return Ca(),null;case 24:return null;default:return null}}var Mr=!1,co=!1,Ct=typeof WeakSet=="function"?WeakSet:Set,Et=null;function Ga(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(a){pr(e,t,a)}else r.current=null}function Ns(e,t,r){try{r()}catch(a){pr(e,t,a)}}var qc=!1;function zl(e,t){if(vu=Ra,e=xl(),zu(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var a=r.getSelection&&r.getSelection();if(a&&a.rangeCount!==0){r=a.anchorNode;var l=a.anchorOffset,v=a.focusNode;a=a.focusOffset;try{r.nodeType,v.nodeType}catch(Le){r=null;break e}var P=0,k=-1,Q=-1,ie=0,fe=0,Se=e,Re=null;t:for(;;){for(var ke;Se!==r||l!==0&&Se.nodeType!==3||(k=P+l),Se!==v||a!==0&&Se.nodeType!==3||(Q=P+a),Se.nodeType===3&&(P+=Se.nodeValue.length),(ke=Se.firstChild)!==null;)Re=Se,Se=ke;for(;;){if(Se===e)break t;if(Re===r&&++ie===l&&(k=P),Re===v&&++fe===a&&(Q=P),(ke=Se.nextSibling)!==null)break;Se=Re,Re=Se.parentNode}Se=ke}r=k===-1||Q===-1?null:{start:k,end:Q}}else r=null}r=r||{start:0,end:0}}else r=null;for($a={focusedElem:e,selectionRange:r},Ra=!1,Et=t;Et!==null;)if(t=Et,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Et=e;else for(;Et!==null;){t=Et;try{var Ke=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(Ke!==null){var gt=Ke.memoizedProps,Ce=Ke.memoizedState,Y=t.stateNode,X=Y.getSnapshotBeforeUpdate(t.elementType===t.type?gt:ve(t.type,gt),Ce);Y.__reactInternalSnapshotBeforeUpdate=X}break;case 3:var se=t.stateNode.containerInfo;se.nodeType===1?se.textContent="":se.nodeType===9&&se.documentElement&&se.removeChild(se.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163))}}catch(Le){pr(t,t.return,Le)}if(e=t.sibling,e!==null){e.return=t.return,Et=e;break}Et=t.return}return Ke=qc,qc=!1,Ke}function Ya(e,t,r){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var l=a=a.next;do{if((l.tag&e)===e){var v=l.destroy;l.destroy=void 0,v!==void 0&&Ns(t,r,v)}l=l.next}while(l!==a)}}function Qu(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var a=r.create;r.destroy=a()}r=r.next}while(r!==t)}}function Ms(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function Oc(e){var t=e.alternate;t!==null&&(e.alternate=null,Oc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[zr],delete t[So],delete t[wl],delete t[cs],delete t[Wi])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Tc(e){return e.tag===5||e.tag===3||e.tag===4}function js(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Tc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ul(e,t,r){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=du));else if(a!==4&&(e=e.child,e!==null))for(Ul(e,t,r),e=e.sibling;e!==null;)Ul(e,t,r),e=e.sibling}function jr(e,t,r){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(jr(e,t,r),e=e.sibling;e!==null;)jr(e,t,r),e=e.sibling}var Fn=null,Hr=!1;function Oa(e,t,r){for(r=r.child;r!==null;)Ic(e,t,r),r=r.sibling}function Ic(e,t,r){if(Qn&&typeof Qn.onCommitFiberUnmount=="function")try{Qn.onCommitFiberUnmount(Wn,r)}catch(k){}switch(r.tag){case 5:co||Ga(r,t);case 6:var a=Fn,l=Hr;Fn=null,Oa(e,t,r),Fn=a,Hr=l,Fn!==null&&(Hr?(e=Fn,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Fn.removeChild(r.stateNode));break;case 18:Fn!==null&&(Hr?(e=Fn,r=r.stateNode,e.nodeType===8?Ko(e.parentNode,r):e.nodeType===1&&Ko(e,r),yo(e)):Ko(Fn,r.stateNode));break;case 4:a=Fn,l=Hr,Fn=r.stateNode.containerInfo,Hr=!0,Oa(e,t,r),Fn=a,Hr=l;break;case 0:case 11:case 14:case 15:if(!co&&(a=r.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){l=a=a.next;do{var v=l,P=v.destroy;v=v.tag,P!==void 0&&(v&2||v&4)&&Ns(r,t,P),l=l.next}while(l!==a)}Oa(e,t,r);break;case 1:if(!co&&(Ga(r,t),a=r.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=r.memoizedProps,a.state=r.memoizedState,a.componentWillUnmount()}catch(k){pr(r,t,k)}Oa(e,t,r);break;case 21:Oa(e,t,r);break;case 22:r.mode&1?(co=(a=co)||r.memoizedState!==null,Oa(e,t,r),co=a):Oa(e,t,r);break;default:Oa(e,t,r)}}function ci(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new Ct),t.forEach(function(a){var l=of.bind(null,e,a);r.has(a)||(r.add(a),a.then(l,l))})}}function fi(e,t){var r=t.deletions;if(r!==null)for(var a=0;al&&(l=P),a&=~v}if(a=l,a=sn()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*Ls(a/1960))-a,10e?16:e,Ni===null)var a=!1;else{if(e=Ni,Ni=null,Qa=0,$t&6)throw Error(p(331));var l=$t;for($t|=4,Et=e.current;Et!==null;){var v=Et,P=v.child;if(Et.flags&16){var k=v.deletions;if(k!==null){for(var Q=0;Qsn()-Xa?Ja(e,0):Tu|=r),wo(e,t)}function rf(e,t){t===0&&(e.mode&1?(t=Pr,Pr<<=1,!(Pr&130023424)&&(Pr=4194304)):t=1);var r=vr();e=Tt(e,t),e!==null&&(Ar(e,t,r),wo(e,r))}function hf(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),rf(e,r)}function of(e,t){var r=0;switch(e.tag){case 13:var a=e.stateNode,l=e.memoizedState;l!==null&&(r=l.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(p(314))}a!==null&&a.delete(t),rf(e,r)}var Mc;Mc=function(t,r,a){if(t!==null)if(t.memoizedProps!==r.pendingProps||xr.current)Mn=!0;else{if(!(t.lanes&a)&&!(r.flags&128))return Mn=!1,Jc(t,r,a);Mn=!!(t.flags&131072)}else Mn=!1,pn&&r.flags&1048576&&Pl(r,$r,r.index);switch(r.lanes=0,r.tag){case 2:var l=r.type;si(t,r),t=r.pendingProps;var v=Sr(r,Tn.current);vt(r,a),v=Nl(null,r,l,t,v,a);var P=li();return r.flags|=1,typeof v=="object"&&v!==null&&typeof v.render=="function"&&v.$$typeof===void 0?(r.tag=1,r.memoizedState=null,r.updateQueue=null,kr(l)?(P=!0,gu(r)):P=!1,r.memoizedState=v.state!==null&&v.state!==void 0?v.state:null,Xt(r),v.updater=Oo,r.stateNode=v,v._reactInternals=r,ai(r,l,t,a),r=Ss(null,r,l,!0,P,a)):(r.tag=0,pn&&P&&Vu(r),lo(null,r,v,a),r=r.child),r;case 16:l=r.elementType;e:{switch(si(t,r),t=r.pendingProps,v=l._init,l=v(l._payload),r.type=l,v=r.tag=_a(l),t=ve(l,t),v){case 0:r=ys(null,r,l,t,a);break e;case 1:r=xs(null,r,l,t,a);break e;case 11:r=mc(null,r,l,t,a);break e;case 14:r=gc(null,r,l,ve(l.type,t),a);break e}throw Error(p(306,l,""))}return r;case 0:return l=r.type,v=r.pendingProps,v=r.elementType===l?v:ve(l,v),ys(t,r,l,v,a);case 1:return l=r.type,v=r.pendingProps,v=r.elementType===l?v:ve(l,v),xs(t,r,l,v,a);case 3:e:{if(Sc(r),t===null)throw Error(p(387));l=r.pendingProps,P=r.memoizedState,v=P.element,Mt(t,r),Un(r,l,null,a);var k=r.memoizedState;if(l=k.element,P.isDehydrated)if(P={element:l,isDehydrated:!1,cache:k.cache,pendingSuspenseBoundaries:k.pendingSuspenseBoundaries,transitions:k.transitions},r.updateQueue.baseState=P,r.memoizedState=P,r.flags&256){v=Ha(Error(p(423)),r),r=Es(t,r,l,a,v);break e}else if(l!==v){v=Ha(Error(p(424)),r),r=Es(t,r,l,a,v);break e}else for(nn=Ho(r.stateNode.containerInfo.firstChild),zn=r,pn=!0,Qo=null,a=Ki(r,null,l,a),r.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(ee(),l===v){r=Ea(t,r,a);break e}lo(t,r,l,a)}r=r.child}return r;case 5:return Su(r),t===null&&N(r),l=r.type,v=r.pendingProps,P=t!==null?t.memoizedProps:null,k=v.children,fa(l,v)?k=null:P!==null&&fa(l,P)&&(r.flags|=32),gs(t,r),lo(t,r,k,a),r.child;case 6:return t===null&&N(r),null;case 13:return Ts(t,r,a);case 4:return Hi(r,r.stateNode.containerInfo),l=r.pendingProps,t===null?r.child=Io(r,null,l,a):lo(t,r,l,a),r.child;case 11:return l=r.type,v=r.pendingProps,v=r.elementType===l?v:ve(l,v),mc(t,r,l,v,a);case 7:return lo(t,r,r.pendingProps,a),r.child;case 8:return lo(t,r,r.pendingProps.children,a),r.child;case 12:return lo(t,r,r.pendingProps.children,a),r.child;case 10:e:{if(l=r.type._context,v=r.pendingProps,P=r.memoizedProps,k=v.value,vn(Be,l._currentValue),l._currentValue=k,P!==null)if(dr(P.value,k)){if(P.children===v.children&&!xr.current){r=Ea(t,r,a);break e}}else for(P=r.child,P!==null&&(P.return=r);P!==null;){var Q=P.dependencies;if(Q!==null){k=P.child;for(var ie=Q.firstContext;ie!==null;){if(ie.context===l){if(P.tag===1){ie=It(-1,a&-a),ie.tag=2;var fe=P.updateQueue;if(fe!==null){fe=fe.shared;var Se=fe.pending;Se===null?ie.next=ie:(ie.next=Se.next,Se.next=ie),fe.pending=ie}}P.lanes|=a,ie=P.alternate,ie!==null&&(ie.lanes|=a),ft(P.return,a,r),Q.lanes|=a;break}ie=ie.next}}else if(P.tag===10)k=P.type===r.type?null:P.child;else if(P.tag===18){if(k=P.return,k===null)throw Error(p(341));k.lanes|=a,Q=k.alternate,Q!==null&&(Q.lanes|=a),ft(k,a,r),k=P.sibling}else k=P.child;if(k!==null)k.return=P;else for(k=P;k!==null;){if(k===r){k=null;break}if(P=k.sibling,P!==null){P.return=k.return,k=P;break}k=k.return}P=k}lo(t,r,v.children,a),r=r.child}return r;case 9:return v=r.type,l=r.pendingProps.children,vt(r,a),v=Ot(v),l=l(v),r.flags|=1,lo(t,r,l,a),r.child;case 14:return l=r.type,v=ve(l,r.pendingProps),v=ve(l.type,v),gc(t,r,l,v,a);case 15:return yc(t,r,r.type,r.pendingProps,a);case 17:return l=r.type,v=r.pendingProps,v=r.elementType===l?v:ve(l,v),si(t,r),r.tag=1,kr(l)?(t=!0,gu(r)):t=!1,vt(r,a),xu(r,l,v),ai(r,l,v,a),Ss(null,r,l,!0,t,a);case 19:return bl(t,r,a);case 22:return xc(t,r,a)}throw Error(p(156,r.tag))};function af(e,t){return lr(e,t)}function vi(e,t,r,a){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Uo(e,t,r,a){return new vi(e,t,r,a)}function jc(e){return e=e.prototype,!(!e||!e.isReactComponent)}function _a(e){if(typeof e=="function")return jc(e)?1:0;if(e!=null){if(e=e.$$typeof,e===pe)return 11;if(e===K)return 14}return 2}function Mi(e,t){var r=e.alternate;return r===null?(r=Uo(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function Ji(e,t,r,a,l,v){var P=2;if(a=e,typeof e=="function")jc(e)&&(P=1);else if(typeof e=="string")P=5;else e:switch(e){case J:return qi(r.children,l,v,t);case oe:P=8,l|=8;break;case Z:return e=Uo(12,r,t,l|2),e.elementType=Z,e.lanes=v,e;case ce:return e=Uo(13,r,t,l),e.elementType=ce,e.lanes=v,e;case q:return e=Uo(19,r,t,l),e.elementType=q,e.lanes=v,e;case W:return nl(r,l,v,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ne:P=10;break e;case te:P=9;break e;case pe:P=11;break e;case K:P=14;break e;case _:P=16,a=null;break e}throw Error(p(130,e==null?e:typeof e=="undefined"?"undefined":s(e),""))}return t=Uo(P,r,t,l),t.elementType=e,t.type=a,t.lanes=v,t}function qi(e,t,r,a){return e=Uo(7,e,a,t),e.lanes=r,e}function nl(e,t,r,a){return e=Uo(22,e,a,t),e.elementType=W,e.lanes=r,e.stateNode={isHidden:!1},e}function $l(e,t,r){return e=Uo(6,e,null,t),e.lanes=r,e}function Lc(e,t,r){return t=Uo(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Dc(e,t,r,a,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=tr(0),this.expirationTimes=tr(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=tr(0),this.identifierPrefix=a,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Fc(e,t,r,a,l,v,P,k,Q){return e=new Dc(e,t,r,k,Q),t===1?(t=1,v===!0&&(t|=8)):t=0,v=Uo(3,null,null,t),e.current=v,v.stateNode=e,v.memoizedState={element:a,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},Xt(v),e}function uf(e,t,r){var a=3Me.length)&&(Ne=Me.length);for(var We=0,_e=new Array(Ne);We1?We-1:0),xt=1;xt/gm),ut=j(/\${[\w\W]*}/gm),Ie=j(/^data-[\-\w.\u00B7-\uFFFF]/),De=j(/^aria-[\-\w]+$/),be=j(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Xe=j(/^(?:\w+script|data):/i),lt=j(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),tt=j(/^html$/i),ct=j(/^[a-z][.\w]*(-[.\w]+)+$/i),qe=function(){return typeof window=="undefined"?null:window},Ue=function(Ne,We){if(n(Ne)!=="object"||typeof Ne.createPolicy!="function")return null;var _e=null,xt="data-tt-policy-suffix";We.currentScript&&We.currentScript.hasAttribute(xt)&&(_e=We.currentScript.getAttribute(xt));var bt="dompurify"+(_e?"#"+_e:"");try{return Ne.createPolicy(bt,{createHTML:function(St){return St},createScriptURL:function(St){return St}})}catch(Wt){return console.warn("TrustedTypes policy "+bt+" could not be created."),null}};function Ge(){var Me=arguments.length>0&&arguments[0]!==void 0?arguments[0]:qe(),Ne=function(Ee){return Ge(Ee)};if(Ne.version="2.5.0",Ne.removed=[],!Me||!Me.document||Me.document.nodeType!==9)return Ne.isSupported=!1,Ne;var We=Me.document,_e=Me.document,xt=Me.DocumentFragment,bt=Me.HTMLTemplateElement,Wt=Me.Node,St=Me.Element,et=Me.NodeFilter,He=Me.NamedNodeMap,Ft=He===void 0?Me.NamedNodeMap||Me.MozNamedAttrMap:He,Ut=Me.HTMLFormElement,fn=Me.DOMParser,gn=Me.trustedTypes,kn=St.prototype,Xn=_(kn,"cloneNode"),Lr=_(kn,"nextSibling"),le=_(kn,"childNodes"),we=_(kn,"parentNode");if(typeof bt=="function"){var ge=_e.createElement("template");ge.content&&ge.content.ownerDocument&&(_e=ge.content.ownerDocument)}var Oe=Ue(gn,We),Fe=Oe?Oe.createHTML(""):"",Ve=_e,pt=Ve.implementation,dt=Ve.createNodeIterator,Rt=Ve.createDocumentFragment,at=Ve.getElementsByTagName,Gt=We.importNode,Vt={};try{Vt=K(_e).documentMode?_e.documentMode:{}}catch(Pt){}var Bt={};Ne.isSupported=typeof we=="function"&&pt&&pt.createHTMLDocument!==void 0&&Vt!==9;var Kt=Qe,qt=yt,Jt=ut,kt=Ie,$n=De,jn=Xe,ar=lt,vo=ct,jt=be,_t=null,po=q({},[].concat(d(W),d(H),d(ae),d(Te),d(xe))),yn=null,ur=q({},[].concat(d(Ae),d(Pe),d(me),d(Ye))),en=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Or=null,lr=null,eo=!0,hr=!0,ln=!1,sn=!0,An=!1,Dr=!0,er=!1,sr=!1,Fr=!1,hn=!1,Wn=!1,Qn=!1,On=!0,cr=!1,Co="user-content-",qo=!0,Tr=!1,wn={},Pr=null,mr=q({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),pi=null,hi=q({},["audio","video","img","source","image","track"]),Zr=null,mi=q({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ko="http://www.w3.org/1998/Math/MathML",tr="http://www.w3.org/2000/svg",Ar="http://www.w3.org/1999/xhtml",Jr=Ar,tn=!1,un=null,_o=q({},[ko,tr,Ar],V),ho,Pa=["application/xhtml+xml","text/html"],tu="text/html",Zn,Po=null,ei=_e.createElement("form"),Rr=function(Ee){return y(Ee,RegExp)||y(Ee,Function)},gr=function(Ee){Po&&Po===Ee||((!Ee||n(Ee)!=="object")&&(Ee={}),Ee=K(Ee),ho=Pa.indexOf(Ee.PARSER_MEDIA_TYPE)===-1?ho=tu:ho=Ee.PARSER_MEDIA_TYPE,Zn=ho==="application/xhtml+xml"?V:F,_t="ALLOWED_TAGS"in Ee?q({},Ee.ALLOWED_TAGS,Zn):po,yn="ALLOWED_ATTR"in Ee?q({},Ee.ALLOWED_ATTR,Zn):ur,un="ALLOWED_NAMESPACES"in Ee?q({},Ee.ALLOWED_NAMESPACES,V):_o,Zr="ADD_URI_SAFE_ATTR"in Ee?q(K(mi),Ee.ADD_URI_SAFE_ATTR,Zn):mi,pi="ADD_DATA_URI_TAGS"in Ee?q(K(hi),Ee.ADD_DATA_URI_TAGS,Zn):hi,Pr="FORBID_CONTENTS"in Ee?q({},Ee.FORBID_CONTENTS,Zn):mr,Or="FORBID_TAGS"in Ee?q({},Ee.FORBID_TAGS,Zn):{},lr="FORBID_ATTR"in Ee?q({},Ee.FORBID_ATTR,Zn):{},wn="USE_PROFILES"in Ee?Ee.USE_PROFILES:!1,eo=Ee.ALLOW_ARIA_ATTR!==!1,hr=Ee.ALLOW_DATA_ATTR!==!1,ln=Ee.ALLOW_UNKNOWN_PROTOCOLS||!1,sn=Ee.ALLOW_SELF_CLOSE_IN_ATTR!==!1,An=Ee.SAFE_FOR_TEMPLATES||!1,Dr=Ee.SAFE_FOR_XML!==!1,er=Ee.WHOLE_DOCUMENT||!1,hn=Ee.RETURN_DOM||!1,Wn=Ee.RETURN_DOM_FRAGMENT||!1,Qn=Ee.RETURN_TRUSTED_TYPE||!1,Fr=Ee.FORCE_BODY||!1,On=Ee.SANITIZE_DOM!==!1,cr=Ee.SANITIZE_NAMED_PROPS||!1,qo=Ee.KEEP_CONTENT!==!1,Tr=Ee.IN_PLACE||!1,jt=Ee.ALLOWED_URI_REGEXP||jt,Jr=Ee.NAMESPACE||Ar,en=Ee.CUSTOM_ELEMENT_HANDLING||{},Ee.CUSTOM_ELEMENT_HANDLING&&Rr(Ee.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(en.tagNameCheck=Ee.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Ee.CUSTOM_ELEMENT_HANDLING&&Rr(Ee.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(en.attributeNameCheck=Ee.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Ee.CUSTOM_ELEMENT_HANDLING&&typeof Ee.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(en.allowCustomizedBuiltInElements=Ee.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),An&&(hr=!1),Wn&&(hn=!0),wn&&(_t=q({},d(xe)),yn=[],wn.html===!0&&(q(_t,W),q(yn,Ae)),wn.svg===!0&&(q(_t,H),q(yn,Pe),q(yn,Ye)),wn.svgFilters===!0&&(q(_t,ae),q(yn,Pe),q(yn,Ye)),wn.mathMl===!0&&(q(_t,Te),q(yn,me),q(yn,Ye))),Ee.ADD_TAGS&&(_t===po&&(_t=K(_t)),q(_t,Ee.ADD_TAGS,Zn)),Ee.ADD_ATTR&&(yn===ur&&(yn=K(yn)),q(yn,Ee.ADD_ATTR,Zn)),Ee.ADD_URI_SAFE_ATTR&&q(Zr,Ee.ADD_URI_SAFE_ATTR,Zn),Ee.FORBID_CONTENTS&&(Pr===mr&&(Pr=K(Pr)),q(Pr,Ee.FORBID_CONTENTS,Zn)),qo&&(_t["#text"]=!0),er&&q(_t,["html","head","body"]),_t.table&&(q(_t,["tbody"]),delete Or.tbody),R&&R(Ee),Po=Ee)},fr=q({},["mi","mo","mn","ms","mtext"]),Br=q({},["foreignobject","desc","title","annotation-xml"]),$o=q({},["title","style","font","a","script"]),Vn=q({},H);q(Vn,ae),q(Vn,he);var mo=q({},Te);q(mo,ye);var nu=function(Ee){var rt=we(Ee);(!rt||!rt.tagName)&&(rt={namespaceURI:Jr,tagName:"template"});var mt=F(Ee.tagName),Yt=F(rt.tagName);return un[Ee.namespaceURI]?Ee.namespaceURI===tr?rt.namespaceURI===Ar?mt==="svg":rt.namespaceURI===ko?mt==="svg"&&(Yt==="annotation-xml"||fr[Yt]):!!Vn[mt]:Ee.namespaceURI===ko?rt.namespaceURI===Ar?mt==="math":rt.namespaceURI===tr?mt==="math"&&Br[Yt]:!!mo[mt]:Ee.namespaceURI===Ar?rt.namespaceURI===tr&&!Br[Yt]||rt.namespaceURI===ko&&!fr[Yt]?!1:!mo[mt]&&($o[mt]||!Vn[mt]):!!(ho==="application/xhtml+xml"&&un[Ee.namespaceURI]):!1},Bn=function(Ee){L(Ne.removed,{element:Ee});try{Ee.parentNode.removeChild(Ee)}catch(rt){try{Ee.outerHTML=Fe}catch(mt){Ee.remove()}}},go=function(Ee,rt){try{L(Ne.removed,{attribute:rt.getAttributeNode(Ee),from:rt})}catch(mt){L(Ne.removed,{attribute:null,from:rt})}if(rt.removeAttribute(Ee),Ee==="is"&&!yn[Ee])if(hn||Wn)try{Bn(rt)}catch(mt){}else try{rt.setAttribute(Ee,"")}catch(mt){}},Aa=function(Ee){var rt,mt;if(Fr)Ee=" "+Ee;else{var Yt=G(Ee,/^[\r\n\t ]+/);mt=Yt&&Yt[0]}ho==="application/xhtml+xml"&&Jr===Ar&&(Ee=''+Ee+"");var xn=Oe?Oe.createHTML(Ee):Ee;if(Jr===Ar)try{rt=new fn().parseFromString(xn,ho)}catch(Hn){}if(!rt||!rt.documentElement){rt=pt.createDocument(Jr,"template",null);try{rt.documentElement.innerHTML=tn?Fe:xn}catch(Hn){}}var Kn=rt.body||rt.documentElement;return Ee&&mt&&Kn.insertBefore(_e.createTextNode(mt),Kn.childNodes[0]||null),Jr===Ar?at.call(rt,er?"html":"body")[0]:er?rt.documentElement:Kn},nr=function(Ee){return dt.call(Ee.ownerDocument||Ee,Ee,et.SHOW_ELEMENT|et.SHOW_COMMENT|et.SHOW_TEXT|et.SHOW_PROCESSING_INSTRUCTION|et.SHOW_CDATA_SECTION,null,!1)},_i=function(Ee){return y(Ee,Ut)&&(typeof Ee.nodeName!="string"||typeof Ee.textContent!="string"||typeof Ee.removeChild!="function"||!y(Ee.attributes,Ft)||typeof Ee.removeAttribute!="function"||typeof Ee.setAttribute!="function"||typeof Ee.namespaceURI!="string"||typeof Ee.insertBefore!="function"||typeof Ee.hasChildNodes!="function")},ji=function(Ee){return n(Wt)==="object"?y(Ee,Wt):Ee&&n(Ee)==="object"&&typeof Ee.nodeType=="number"&&typeof Ee.nodeName=="string"},qr=function(Ee,rt,mt){Bt[Ee]&&D(Bt[Ee],function(Yt){Yt.call(Ne,rt,mt,Po)})},Ao=function(Ee){var rt;if(qr("beforeSanitizeElements",Ee,null),_i(Ee)||ne(/[\u0080-\uFFFF]/,Ee.nodeName))return Bn(Ee),!0;var mt=Zn(Ee.nodeName);if(qr("uponSanitizeElement",Ee,{tagName:mt,allowedTags:_t}),Ee.hasChildNodes()&&!ji(Ee.firstElementChild)&&(!ji(Ee.content)||!ji(Ee.content.firstElementChild))&&ne(/<[/\w]/g,Ee.innerHTML)&&ne(/<[/\w]/g,Ee.textContent)||mt==="select"&&ne(/=0;--Hn)Yt.insertBefore(Xn(xn[Hn],!0),Lr(Ee))}return Bn(Ee),!0}return y(Ee,St)&&!nu(Ee)||(mt==="noscript"||mt==="noembed"||mt==="noframes")&&ne(/<\/no(script|embed|frames)/i,Ee.innerHTML)?(Bn(Ee),!0):(An&&Ee.nodeType===3&&(rt=Ee.textContent,rt=J(rt,Kt," "),rt=J(rt,qt," "),rt=J(rt,Jt," "),Ee.textContent!==rt&&(L(Ne.removed,{element:Ee.cloneNode()}),Ee.textContent=rt)),qr("afterSanitizeElements",Ee,null),!1)},yo=function(Ee,rt,mt){if(On&&(rt==="id"||rt==="name")&&(mt in _e||mt in ei))return!1;if(!(hr&&!lr[rt]&&ne(kt,rt))){if(!(eo&&ne($n,rt))){if(!yn[rt]||lr[rt]){if(!(Wo(Ee)&&(y(en.tagNameCheck,RegExp)&&ne(en.tagNameCheck,Ee)||y(en.tagNameCheck,Function)&&en.tagNameCheck(Ee))&&(y(en.attributeNameCheck,RegExp)&&ne(en.attributeNameCheck,rt)||y(en.attributeNameCheck,Function)&&en.attributeNameCheck(rt))||rt==="is"&&en.allowCustomizedBuiltInElements&&(y(en.tagNameCheck,RegExp)&&ne(en.tagNameCheck,mt)||y(en.tagNameCheck,Function)&&en.tagNameCheck(mt))))return!1}else if(!Zr[rt]){if(!ne(jt,J(mt,ar,""))){if(!((rt==="src"||rt==="xlink:href"||rt==="href")&&Ee!=="script"&&oe(mt,"data:")===0&&pi[Ee])){if(!(ln&&!ne(jn,J(mt,ar,"")))){if(mt)return!1}}}}}}return!0},Wo=function(Ee){return Ee!=="annotation-xml"&&G(Ee,vo)},Ra=function(Ee){var rt,mt,Yt,xn;qr("beforeSanitizeAttributes",Ee,null);var Kn=Ee.attributes;if(Kn){var Hn={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:yn};for(xn=Kn.length;xn--;){rt=Kn[xn];var ti=rt,En=ti.name,gi=ti.namespaceURI;if(mt=En==="value"?rt.value:Z(rt.value),Yt=Zn(En),Hn.attrName=Yt,Hn.attrValue=mt,Hn.keepAttr=!0,Hn.forceKeepAttr=void 0,qr("uponSanitizeAttribute",Ee,Hn),mt=Hn.attrValue,!Hn.forceKeepAttr&&(go(En,Ee),!!Hn.keepAttr)){if(!sn&&ne(/\/>/i,mt)){go(En,Ee);continue}An&&(mt=J(mt,Kt," "),mt=J(mt,qt," "),mt=J(mt,Jt," "));var rr=Zn(Ee.nodeName);if(yo(rr,Yt,mt)){if(cr&&(Yt==="id"||Yt==="name")&&(go(En,Ee),mt=Co+mt),Oe&&n(gn)==="object"&&typeof gn.getAttributeType=="function"&&!gi)switch(gn.getAttributeType(rr,Yt)){case"TrustedHTML":{mt=Oe.createHTML(mt);break}case"TrustedScriptURL":{mt=Oe.createScriptURL(mt);break}}try{gi?Ee.setAttributeNS(gi,En,mt):Ee.setAttribute(En,mt),b(Ne.removed)}catch(yr){}}}}qr("afterSanitizeAttributes",Ee,null)}},Na=function Pt(Ee){var rt,mt=nr(Ee);for(qr("beforeSanitizeShadowDOM",Ee,null);rt=mt.nextNode();)qr("uponSanitizeShadowNode",rt,null),!Ao(rt)&&(y(rt.content,xt)&&Pt(rt.content),Ra(rt));qr("afterSanitizeShadowDOM",Ee,null)};return Ne.sanitize=function(Pt){var Ee=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},rt,mt,Yt,xn,Kn;if(tn=!Pt,tn&&(Pt=""),typeof Pt!="string"&&!ji(Pt))if(typeof Pt.toString=="function"){if(Pt=Pt.toString(),typeof Pt!="string")throw te("dirty is not a string, aborting")}else throw te("toString is not a function");if(!Ne.isSupported){if(n(Me.toStaticHTML)==="object"||typeof Me.toStaticHTML=="function"){if(typeof Pt=="string")return Me.toStaticHTML(Pt);if(ji(Pt))return Me.toStaticHTML(Pt.outerHTML)}return Pt}if(sr||gr(Ee),Ne.removed=[],typeof Pt=="string"&&(Tr=!1),Tr){if(Pt.nodeName){var Hn=Zn(Pt.nodeName);if(!_t[Hn]||Or[Hn])throw te("root node is forbidden and cannot be sanitized in-place")}}else if(y(Pt,Wt))rt=Aa(""),mt=rt.ownerDocument.importNode(Pt,!0),mt.nodeType===1&&mt.nodeName==="BODY"||mt.nodeName==="HTML"?rt=mt:rt.appendChild(mt);else{if(!hn&&!An&&!er&&Pt.indexOf("<")===-1)return Oe&&Qn?Oe.createHTML(Pt):Pt;if(rt=Aa(Pt),!rt)return hn?null:Qn?Fe:""}rt&&Fr&&Bn(rt.firstChild);for(var ti=nr(Tr?Pt:rt);Yt=ti.nextNode();)Yt.nodeType===3&&Yt===xn||Ao(Yt)||(y(Yt.content,xt)&&Na(Yt.content),Ra(Yt),xn=Yt);if(xn=null,Tr)return Pt;if(hn){if(Wn)for(Kn=Rt.call(rt.ownerDocument);rt.firstChild;)Kn.appendChild(rt.firstChild);else Kn=rt;return(yn.shadowroot||yn.shadowrootmod)&&(Kn=Gt.call(We,Kn,!0)),Kn}var En=er?rt.outerHTML:rt.innerHTML;return er&&_t["!doctype"]&&rt.ownerDocument&&rt.ownerDocument.doctype&&rt.ownerDocument.doctype.name&&ne(tt,rt.ownerDocument.doctype.name)&&(En="\n"+En),An&&(En=J(En,Kt," "),En=J(En,qt," "),En=J(En,Jt," ")),Oe&&Qn?Oe.createHTML(En):En},Ne.setConfig=function(Pt){gr(Pt),sr=!0},Ne.clearConfig=function(){Po=null,sr=!1},Ne.isValidAttribute=function(Pt,Ee,rt){Po||gr({});var mt=Zn(Pt),Yt=Zn(Ee);return yo(mt,Yt,rt)},Ne.addHook=function(Pt,Ee){typeof Ee=="function"&&(Bt[Pt]=Bt[Pt]||[],L(Bt[Pt],Ee))},Ne.removeHook=function(Pt){if(Bt[Pt])return b(Bt[Pt])},Ne.removeHooks=function(Pt){Bt[Pt]&&(Bt[Pt]=[])},Ne.removeAllHooks=function(){Bt={}},Ne}var $e=Ge();return $e})},20878:function(m){function y(f,p){return p!=null&&typeof Symbol!="undefined"&&p[Symbol.hasInstance]?!!p[Symbol.hasInstance](f):f instanceof p}var n=typeof Element!="undefined",i=typeof Map=="function",u=typeof Set=="function",s=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function d(f,p){if(f===p)return!0;if(f&&p&&typeof f=="object"&&typeof p=="object"){if(f.constructor!==p.constructor)return!1;var x,g,S;if(Array.isArray(f)){if(x=f.length,x!=p.length)return!1;for(g=x;g--!==0;)if(!d(f[g],p[g]))return!1;return!0}var E;if(i&&y(f,Map)&&y(p,Map)){if(f.size!==p.size)return!1;for(E=f.entries();!(g=E.next()).done;)if(!p.has(g.value[0]))return!1;for(E=f.entries();!(g=E.next()).done;)if(!d(g.value[1],p.get(g.value[0])))return!1;return!0}if(u&&y(f,Set)&&y(p,Set)){if(f.size!==p.size)return!1;for(E=f.entries();!(g=E.next()).done;)if(!p.has(g.value[0]))return!1;return!0}if(s&&ArrayBuffer.isView(f)&&ArrayBuffer.isView(p)){if(x=f.length,x!=p.length)return!1;for(g=x;g--!==0;)if(f[g]!==p[g])return!1;return!0}if(f.constructor===RegExp)return f.source===p.source&&f.flags===p.flags;if(f.valueOf!==Object.prototype.valueOf&&typeof f.valueOf=="function"&&typeof p.valueOf=="function")return f.valueOf()===p.valueOf();if(f.toString!==Object.prototype.toString&&typeof f.toString=="function"&&typeof p.toString=="function")return f.toString()===p.toString();if(S=Object.keys(f),x=S.length,x!==Object.keys(p).length)return!1;for(g=x;g--!==0;)if(!Object.prototype.hasOwnProperty.call(p,S[g]))return!1;if(n&&y(f,Element))return!1;for(g=x;g--!==0;)if(!((S[g]==="_owner"||S[g]==="__v"||S[g]==="__o")&&f.$$typeof)&&!d(f[S[g]],p[S[g]]))return!1;return!0}return f!==f&&p!==p}m.exports=function(p,x){try{return d(p,x)}catch(g){if((g.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw g}}},5139:function(m,y,n){"use strict";/**
* @license React
* react-jsx-runtime.production.min.js
*
@@ -14,7 +22,7 @@
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */var r=t(61358),o=Symbol.for("react.element"),i=Symbol.for("react.fragment"),s=Object.prototype.hasOwnProperty,u=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,f={key:!0,ref:!0,__self:!0,__source:!0};function m(p,g,y){var S,I={},O=null,T=null;y!==void 0&&(O=""+y),g.key!==void 0&&(O=""+g.key),g.ref!==void 0&&(T=g.ref);for(S in g)s.call(g,S)&&!f.hasOwnProperty(S)&&(I[S]=g[S]);if(p&&p.defaultProps)for(S in g=p.defaultProps,g)I[S]===void 0&&(I[S]=g[S]);return{$$typeof:o,type:p,key:O,ref:T,props:I,_owner:u.current}}h.Fragment=i,h.jsx=m,h.jsxs=m},18689:function(d,h){"use strict";/**
+ */var i=n(28277),u=Symbol.for("react.element"),s=Symbol.for("react.fragment"),d=Object.prototype.hasOwnProperty,f=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function x(g,S,E){var T,C={},w=null,I=null;E!==void 0&&(w=""+E),S.key!==void 0&&(w=""+S.key),S.ref!==void 0&&(I=S.ref);for(T in S)d.call(S,T)&&!p.hasOwnProperty(T)&&(C[T]=S[T]);if(g&&g.defaultProps)for(T in S=g.defaultProps,S)C[T]===void 0&&(C[T]=S[T]);return{$$typeof:u,type:g,key:w,ref:I,props:C,_owner:f.current}}y.Fragment=s,y.jsx=x,y.jsxs=x},1444:function(m,y){"use strict";/**
* @license React
* react.production.min.js
*
@@ -22,7 +30,7 @@
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */function t(U){"@swc/helpers - typeof";return U&&typeof Symbol!="undefined"&&U.constructor===Symbol?"symbol":typeof U}var r=Symbol.for("react.element"),o=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),s=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),m=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),S=Symbol.for("react.lazy"),I=Symbol.iterator;function O(U){return U===null||typeof U!="object"?null:(U=I&&U[I]||U["@@iterator"],typeof U=="function"?U:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},A=Object.assign,b={};function N(U,_,lt){this.props=U,this.context=_,this.refs=b,this.updater=lt||T}N.prototype.isReactComponent={},N.prototype.setState=function(U,_){if(typeof U!="object"&&typeof U!="function"&&U!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,U,_,"setState")},N.prototype.forceUpdate=function(U){this.updater.enqueueForceUpdate(this,U,"forceUpdate")};function w(){}w.prototype=N.prototype;function F(U,_,lt){this.props=U,this.context=_,this.refs=b,this.updater=lt||T}var $=F.prototype=new w;$.constructor=F,A($,N.prototype),$.isPureReactComponent=!0;var M=Array.isArray,B=Object.prototype.hasOwnProperty,j={current:null},D={key:!0,ref:!0,__self:!0,__source:!0};function W(U,_,lt){var dt,Ct={},Lt=null,Gt=null;if(_!=null)for(dt in _.ref!==void 0&&(Gt=_.ref),_.key!==void 0&&(Lt=""+_.key),_)B.call(_,dt)&&!D.hasOwnProperty(dt)&&(Ct[dt]=_[dt]);var jt=arguments.length-2;if(jt===1)Ct.children=lt;else if(1=0;--_){var lt=this.tryEntries[_],dt=lt.completion;if(lt.tryLoc==="root")return U("end");if(lt.tryLoc<=this.prev){var Ct=s.call(lt,"catchLoc"),Lt=s.call(lt,"finallyLoc");if(Ct&&Lt){if(this.prev=0;--U){var _=this.tryEntries[U];if(_.tryLoc<=this.prev&&s.call(_,"finallyLoc")&&this.prev<_.finallyLoc){var lt=_;break}}lt&&(Y==="break"||Y==="continue")&<.tryLoc<=X&&X<=lt.finallyLoc&&(lt=null);var dt=lt?lt.completion:{};return dt.type=Y,dt.arg=X,lt?(this.method="next",this.next=lt.finallyLoc,w):this.complete(dt)},complete:function(Y,X){if(Y.type==="throw")throw Y.arg;return Y.type==="break"||Y.type==="continue"?this.next=Y.arg:Y.type==="return"?(this.rval=this.arg=Y.arg,this.method="return",this.next="end"):Y.type==="normal"&&X&&(this.next=X),w},finish:function(Y){for(var X=this.tryEntries.length-1;X>=0;--X){var U=this.tryEntries[X];if(U.finallyLoc===Y)return this.complete(U.completion,U.afterLoc),J(U),w}},catch:function(L){for(var Y=this.tryEntries.length-1;Y>=0;--Y){var X=this.tryEntries[Y];if(X.tryLoc===L){var U=X.completion;if(U.type==="throw"){var _=U.arg;J(X)}return _}}throw new Error("illegal catch attempt")},delegateYield:function(Y,X,U){return this.delegate={iterator:k(Y),resultName:X,nextLoc:U},this.method==="next"&&(this.arg=f),w}},o}(d.exports);try{regeneratorRuntime=r}catch(o){typeof globalThis=="object"?globalThis.regeneratorRuntime=r:Function("r","regeneratorRuntime = r")(r)}},82039:function(d,h){"use strict";/**
+ */function n(W){"@swc/helpers - typeof";return W&&typeof Symbol!="undefined"&&W.constructor===Symbol?"symbol":typeof W}var i=Symbol.for("react.element"),u=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),f=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),x=Symbol.for("react.context"),g=Symbol.for("react.forward_ref"),S=Symbol.for("react.suspense"),E=Symbol.for("react.memo"),T=Symbol.for("react.lazy"),C=Symbol.iterator;function w(W){return W===null||typeof W!="object"?null:(W=C&&W[C]||W["@@iterator"],typeof W=="function"?W:null)}var I={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},R=Object.assign,j={};function B(W,H,ae){this.props=W,this.context=H,this.refs=j,this.updater=ae||I}B.prototype.isReactComponent={},B.prototype.setState=function(W,H){if(typeof W!="object"&&typeof W!="function"&&W!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,W,H,"setState")},B.prototype.forceUpdate=function(W){this.updater.enqueueForceUpdate(this,W,"forceUpdate")};function M(){}M.prototype=B.prototype;function U(W,H,ae){this.props=W,this.context=H,this.refs=j,this.updater=ae||I}var z=U.prototype=new M;z.constructor=U,R(z,B.prototype),z.isPureReactComponent=!0;var D=Array.isArray,b=Object.prototype.hasOwnProperty,L={current:null},F={key:!0,ref:!0,__self:!0,__source:!0};function V(W,H,ae){var he,Te={},ye=null,xe=null;if(H!=null)for(he in H.ref!==void 0&&(xe=H.ref),H.key!==void 0&&(ye=""+H.key),H)b.call(H,he)&&!F.hasOwnProperty(he)&&(Te[he]=H[he]);var Ae=arguments.length-2;if(Ae===1)Te.children=ae;else if(1=0;--ae){var he=this.tryEntries[ae],Te=he.completion;if(he.tryLoc==="root")return H("end");if(he.tryLoc<=this.prev){var ye=d.call(he,"catchLoc"),xe=d.call(he,"finallyLoc");if(ye&&xe){if(this.prev=0;--H){var ae=this.tryEntries[H];if(ae.tryLoc<=this.prev&&d.call(ae,"finallyLoc")&&this.prev=0;--W){var H=this.tryEntries[W];if(H.finallyLoc===_)return this.complete(H.completion,H.afterLoc),te(H),M}},catch:function(K){for(var _=this.tryEntries.length-1;_>=0;--_){var W=this.tryEntries[_];if(W.tryLoc===K){var H=W.completion;if(H.type==="throw"){var ae=H.arg;te(W)}return ae}}throw new Error("illegal catch attempt")},delegateYield:function(_,W,H){return this.delegate={iterator:ce(_),resultName:W,nextLoc:H},this.method==="next"&&(this.arg=p),M}},u}(m.exports);try{regeneratorRuntime=i}catch(u){typeof globalThis=="object"?globalThis.regeneratorRuntime=i:Function("r","regeneratorRuntime = r")(i)}},65656:function(m,y){"use strict";/**
* @license React
* scheduler.production.min.js
*
@@ -30,25 +38,25 @@
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
- */function t(k,nt){var L=k.length;k.push(nt);t:for(;0>>1,X=k[Y];if(0>>1;Yi(lt,L))dti(Ct,lt)?(k[Y]=Ct,k[dt]=L,Y=dt):(k[Y]=lt,k[_]=L,Y=_);else if(dti(Ct,L))k[Y]=Ct,k[dt]=L,Y=dt;else break t}}return nt}function i(k,nt){var L=k.sortIndex-nt.sortIndex;return L!==0?L:k.id-nt.id}if(typeof performance=="object"&&typeof performance.now=="function"){var s=performance;h.unstable_now=function(){return s.now()}}else{var u=Date,f=u.now();h.unstable_now=function(){return u.now()-f}}var m=[],p=[],g=1,y=null,S=3,I=!1,O=!1,T=!1,A=typeof setTimeout=="function"?setTimeout:null,b=typeof clearTimeout=="function"?clearTimeout:null,N=typeof setImmediate!="undefined"?setImmediate:null;typeof navigator!="undefined"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function w(k){for(var nt=r(p);nt!==null;){if(nt.callback===null)o(p);else if(nt.startTime<=k)o(p),nt.sortIndex=nt.expirationTime,t(m,nt);else break;nt=r(p)}}function F(k){if(T=!1,w(k),!O)if(r(m)!==null)O=!0,J($);else{var nt=r(p);nt!==null&&ut(F,nt.startTime-k)}}function $(k,nt){O=!1,T&&(T=!1,b(j),j=-1),I=!0;var L=S;try{for(w(nt),y=r(m);y!==null&&(!(y.expirationTime>nt)||k&&!K());){var Y=y.callback;if(typeof Y=="function"){y.callback=null,S=y.priorityLevel;var X=Y(y.expirationTime<=nt);nt=h.unstable_now(),typeof X=="function"?y.callback=X:y===r(m)&&o(m),w(nt)}else o(m);y=r(m)}if(y!==null)var U=!0;else{var _=r(p);_!==null&&ut(F,_.startTime-nt),U=!1}return U}finally{y=null,S=L,I=!1}}var M=!1,B=null,j=-1,D=5,W=-1;function K(){return!(h.unstable_now()-Wk||125Y?(k.sortIndex=L,t(p,k),r(m)===null&&k===r(p)&&(T?(b(j),j=-1):T=!0,ut(F,L-Y))):(k.sortIndex=X,t(m,k),O||I||(O=!0,J($))),k},h.unstable_shouldYield=K,h.unstable_wrapCallback=function(k){var nt=S;return function(){var L=S;S=nt;try{return k.apply(this,arguments)}finally{S=L}}}},20686:function(d,h,t){"use strict";d.exports=t(82039)},73396:function(){self.fetch||(self.fetch=function(d,h){return h=h||{},new Promise(function(t,r){var o=new XMLHttpRequest,i=[],s={},u=function m(){return{ok:(o.status/100|0)==2,statusText:o.statusText,status:o.status,url:o.responseURL,text:function(){return Promise.resolve(o.responseText)},json:function(){return Promise.resolve(o.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([o.response]))},clone:m,headers:{keys:function(){return i},entries:function(){return i.map(function(g){return[g,o.getResponseHeader(g)]})},get:function(g){return o.getResponseHeader(g)},has:function(g){return o.getResponseHeader(g)!=null}}}};for(var f in o.open(h.method||"get",d,!0),o.onload=function(){o.getAllResponseHeaders().toLowerCase().replace(/^(.+?):/gm,function(m,p){s[p]||i.push(s[p]=p)}),t(u())},o.onerror=r,o.withCredentials=h.credentials=="include",h.headers)o.setRequestHeader(f,h.headers[f]);o.send(h.body||null)})})},7402:function(d,h,t){"use strict";t.d(h,{OY:function(){return N},TS:function(){return O},Tj:function(){return f}});/**
+ */function n(ce,q){var K=ce.length;ce.push(q);e:for(;0>>1,W=ce[_];if(0>>1;_s(he,K))Tes(ye,he)?(ce[_]=ye,ce[Te]=K,_=Te):(ce[_]=he,ce[ae]=K,_=ae);else if(Tes(ye,K))ce[_]=ye,ce[Te]=K,_=Te;else break e}}return q}function s(ce,q){var K=ce.sortIndex-q.sortIndex;return K!==0?K:ce.id-q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var d=performance;y.unstable_now=function(){return d.now()}}else{var f=Date,p=f.now();y.unstable_now=function(){return f.now()-p}}var x=[],g=[],S=1,E=null,T=3,C=!1,w=!1,I=!1,R=typeof setTimeout=="function"?setTimeout:null,j=typeof clearTimeout=="function"?clearTimeout:null,B=typeof setImmediate!="undefined"?setImmediate:null;typeof navigator!="undefined"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function M(ce){for(var q=i(g);q!==null;){if(q.callback===null)u(g);else if(q.startTime<=ce)u(g),q.sortIndex=q.expirationTime,n(x,q);else break;q=i(g)}}function U(ce){if(I=!1,M(ce),!w)if(i(x)!==null)w=!0,te(z);else{var q=i(g);q!==null&&pe(U,q.startTime-ce)}}function z(ce,q){w=!1,I&&(I=!1,j(L),L=-1),C=!0;var K=T;try{for(M(q),E=i(x);E!==null&&(!(E.expirationTime>q)||ce&&!G());){var _=E.callback;if(typeof _=="function"){E.callback=null,T=E.priorityLevel;var W=_(E.expirationTime<=q);q=y.unstable_now(),typeof W=="function"?E.callback=W:E===i(x)&&u(x),M(q)}else u(x);E=i(x)}if(E!==null)var H=!0;else{var ae=i(g);ae!==null&&pe(U,ae.startTime-q),H=!1}return H}finally{E=null,T=K,C=!1}}var D=!1,b=null,L=-1,F=5,V=-1;function G(){return!(y.unstable_now()-Vce||125_?(ce.sortIndex=K,n(g,ce),i(x)===null&&ce===i(g)&&(I?(j(L),L=-1):I=!0,pe(U,K-_))):(ce.sortIndex=W,n(x,ce),w||C||(w=!0,te(z))),ce},y.unstable_shouldYield=G,y.unstable_wrapCallback=function(ce){var q=T;return function(){var K=T;T=q;try{return ce.apply(this,arguments)}finally{T=K}}}},9359:function(m,y,n){"use strict";m.exports=n(65656)},73396:function(){self.fetch||(self.fetch=function(m,y){return y=y||{},new Promise(function(n,i){var u=new XMLHttpRequest,s=[],d={},f=function x(){return{ok:(u.status/100|0)==2,statusText:u.statusText,status:u.status,url:u.responseURL,text:function(){return Promise.resolve(u.responseText)},json:function(){return Promise.resolve(u.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([u.response]))},clone:x,headers:{keys:function(){return s},entries:function(){return s.map(function(S){return[S,u.getResponseHeader(S)]})},get:function(S){return u.getResponseHeader(S)},has:function(S){return u.getResponseHeader(S)!=null}}}};for(var p in u.open(y.method||"get",m,!0),u.onload=function(){u.getAllResponseHeaders().toLowerCase().replace(/^(.+?):/gm,function(x,g){d[g]||s.push(d[g]=g)}),n(f())},u.onerror=i,u.withCredentials=y.credentials=="include",y.headers)u.setRequestHeader(p,y.headers[p]);u.send(y.body||null)})})},7402:function(m,y,n){"use strict";n.d(y,{OY:function(){return B},TS:function(){return w},Tj:function(){return p}});/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */function r(j,D){(D==null||D>j.length)&&(D=j.length);for(var W=0,K=new Array(D);W=j.length?{done:!0}:{done:!1,value:j[K++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u=function(j){return function(D){if(D==null)return D;if(Array.isArray(D)){for(var W=[],K=0;Kq)return 1}return 0},g=function(){for(var j=arguments.length,D=new Array(j),W=0;W>1,q=j(D[J]),qK?J:J+1},F=function(j){return function(D,W){var K=[].concat(D);return K.splice(w(j,D,W),0,W),K}},$=function(j,D){for(var W=[],K=[],G=D,tt=s(j),H;!(H=tt()).done;){var q=H.value;K.push(q),G--,G||(G=D,W.push(K),K=[])}return K.length&&W.push(K),W},M=function(j){return typeof j=="object"&&j!==null},B=function(){for(var j=arguments.length,D=new Array(j),W=0;WL.length)&&(F=L.length);for(var V=0,G=new Array(F);V=L.length?{done:!0}:{done:!1,value:L[G++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var f=function(L){return function(F){if(F==null)return F;if(Array.isArray(F)){for(var V=[],G=0;Gne)return 1}return 0},S=function(){for(var L=arguments.length,F=new Array(L),V=0;V>1,ne=L(F[te]),neG?te:te+1},U=function(L){return function(F,V){var G=[].concat(F);return G.splice(M(L,F,V),0,V),G}},z=function(L,F){for(var V=[],G=[],J=F,oe=d(L),Z;!(Z=oe()).done;){var ne=Z.value;G.push(ne),J--,J||(J=F,V.push(G),G=[])}return G.length&&V.push(G),V},D=function(L){return typeof L=="object"&&L!==null},b=function(){for(var L=arguments.length,F=new Array(L),V=0;V1?f-1:0),p=1;p1?p-1:0),g=1;gI.length)&&(O=I.length);for(var T=0,A=new Array(O);T=I.length?{done:!0}:{done:!1,value:I[A++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s=function(I,O,T){return IT?T:I},u=function(I){return I<0?0:I>1?1:I},f=function(I,O,T){return(I-O)/(T-O)},m=function(I,O){if(!I||isNaN(I))return I;var T,A,b,N;return O|=0,T=Math.pow(10,O),I*=T,N=+(I>0)|-(I<0),b=Math.abs(I%1)>=.4999999999854481,A=Math.floor(I),b&&(I=A+(N>0)),(b?I:Math.round(I))/T},p=function(I,O){return O===void 0&&(O=0),Number(I).toFixed(Math.max(O,0))},g=function(I,O){return O&&I>=O[0]&&I<=O[1]},y=function(I,O){for(var T=i(Object.keys(O)),A;!(A=T()).done;){var b=A.value,N=O[b];if(g(I,N))return b}},S=function(I){return Math.floor(I)!==I&&I.toString().split(".")[1].length||0}},12450:function(d,h,t){"use strict";t.d(h,{k:function(){return y}});/**
+ */function i(C,w){(w==null||w>C.length)&&(w=C.length);for(var I=0,R=new Array(w);I=C.length?{done:!0}:{done:!1,value:C[R++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var d=function(C,w,I){return CI?I:C},f=function(C){return C<0?0:C>1?1:C},p=function(C,w,I){return(C-w)/(I-w)},x=function(C,w){if(!C||isNaN(C))return C;var I,R,j,B;return w|=0,I=Math.pow(10,w),C*=I,B=+(C>0)|-(C<0),j=Math.abs(C%1)>=.4999999999854481,R=Math.floor(C),j&&(C=R+(B>0)),(j?C:Math.round(C))/I},g=function(C,w){return w===void 0&&(w=0),Number(C).toFixed(Math.max(w,0))},S=function(C,w){return w&&C>=w[0]&&C<=w[1]},E=function(C,w){for(var I=s(Object.keys(w)),R;!(R=I()).done;){var j=R.value,B=w[j];if(S(C,B))return j}},T=function(C){return Math.floor(C)!==C&&C.toString().split(".")[1].length||0}},12450:function(m,y,n){"use strict";n.d(y,{k:function(){return E}});/**
* Ghetto performance measurement tools.
*
* Uses NODE_ENV to remove itself from production builds.
@@ -56,29 +64,29 @@
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var r,o=60,i=1e3/o,s=!!((r=window.performance)!=null&&r.now),u={},f={},m=function(S,I){},p=function(S,I){if(0)var O,T,A},g=function(S){var I=S/i;return S.toFixed(S<10?1:0)+"ms ("+I.toFixed(2)+" frames)"},y={mark:m,measure:p}},65380:function(d,h,t){"use strict";t.d(h,{Ly:function(){return r},a_:function(){return i},b5:function(){return s}});/**
+ */var i,u=60,s=1e3/u,d=!!((i=window.performance)!=null&&i.now),f={},p={},x=function(T,C){},g=function(T,C){if(0)var w,I,R},S=function(T){var C=T/s;return T.toFixed(T<10?1:0)+"ms ("+C.toFixed(2)+" frames)"},E={mark:x,measure:g}},65380:function(m,y,n){"use strict";n.d(y,{Ly:function(){return i},a_:function(){return s},b5:function(){return d}});/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var r=function(u){for(var f="",m=0;mg.length)&&(y=g.length);for(var S=0,I=new Array(y);S=g.length?{done:!0}:{done:!1,value:g[I++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var u=function(g,y){if(y)return y(u)(g);var S,I=[],O=function(){return S},T=function(b){I.push(b)},A=function(b){S=g(S,b);for(var N=0;N1?T-1:0),b=1;b1?B-1:0),D=1;D1?B-1:0),D=1;DS.length)&&(E=S.length);for(var T=0,C=new Array(E);T=S.length?{done:!0}:{done:!1,value:S[C++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var f=function(S,E){if(E)return E(f)(S);var T,C=[],w=function(){return T},I=function(j){C.push(j)},R=function(j){T=S(T,j);for(var B=0;B1?I-1:0),j=1;j1?b-1:0),F=1;F1?b-1:0),F=1;F0&&D[D.length-1])&&(H[0]===6||H[0]===2)){K=0;continue}if(H[0]===3&&(!D||H[1]>D[0]&&H[1]0&&F[F.length-1])&&(Z[0]===6||Z[0]===2)){G=0;continue}if(Z[0]===3&&(!F||Z[1]>F[0]&&Z[1]O.length)&&(T=O.length);for(var A=0,b=new Array(T);A=O.length?{done:!0}:{done:!1,value:O[b++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s=function(O){if(Array.isArray(O))return s(O.join(""));for(var T=O.split("\n"),A,b=i(T),N;!(N=b()).done;)for(var w=N.value,F=0;F",apos:"'"};return O.replace(/ /gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(T,function(b,N){return A[N]}).replace(/?([0-9]+);/gi,function(b,N){var w=parseInt(N,10);return String.fromCharCode(w)}).replace(/?([0-9a-f]+);/gi,function(b,N){var w=parseInt(N,16);return String.fromCharCode(w)})},I=function(O){return Object.keys(O).map(function(T){return encodeURIComponent(T)+"="+encodeURIComponent(O[T])}).join("&")}},38100:function(d,h,t){"use strict";t.d(h,{i:function(){return r}});/**
+ */function i(w,I){(I==null||I>w.length)&&(I=w.length);for(var R=0,j=new Array(I);R=w.length?{done:!0}:{done:!1,value:w[j++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var d=function(w){if(Array.isArray(w))return d(w.join(""));for(var I=w.split("\n"),R,j=s(I),B;!(B=j()).done;)for(var M=B.value,U=0;U",apos:"'"};return w.replace(/ /gi,"\n").replace(/<\/?[a-z0-9-_]+[^>]*>/gi,"").replace(I,function(j,B){return R[B]}).replace(/?([0-9]+);/gi,function(j,B){var M=parseInt(B,10);return String.fromCharCode(M)}).replace(/?([0-9a-f]+);/gi,function(j,B){var M=parseInt(B,16);return String.fromCharCode(M)})},C=function(w){return Object.keys(w).map(function(I){return encodeURIComponent(I)+"="+encodeURIComponent(w[I])}).join("&")}},38100:function(m,y,n){"use strict";n.d(y,{i:function(){return i}});/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var r=function(){var o=new Date().getTime();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(i){var s=(o+Math.random()*16)%16|0;return o=Math.floor(o/16),(i==="x"?s:s&3|8).toString(16)})}},32126:function(d,h,t){"use strict";t.d(h,{CO:function(){return f},Jk:function(){return I},Xd:function(){return y},Z4:function(){return m},tk:function(){return p}});var r=t(7402);/**
+ */var i=function(){var u=new Date().getTime();return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){var d=(u+Math.random()*16)%16|0;return u=Math.floor(u/16),(s==="x"?d:d&3|8).toString(16)})}},32126:function(m,y,n){"use strict";n.d(y,{CO:function(){return p},Jk:function(){return C},Xd:function(){return E},Z4:function(){return x},tk:function(){return g}});var i=n(7402);/**
* N-dimensional vector manipulation functions.
*
* Vectors are plain number arrays, i.e. [x, y, z].
@@ -86,191 +94,191 @@
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var o=function(T,A){return T+A},i=function(T,A){return T-A},s=function(T,A){return T*A},u=function(T,A){return T/A},f=function(){for(var T=arguments.length,A=new Array(T),b=0;bM.length)&&(B=M.length);for(var j=0,D=new Array(B);j=M.length?{done:!0}:{done:!1,value:M[D++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var g=(0,u.h)("AudioPlayer"),y=function(){"use strict";function M(){var j=this;this.node=document.createElement("audio"),this.node.style.setProperty("display","none"),document.body.appendChild(this.node),this.playing=!1,this.volume=1,this.options={},this.onPlaySubscribers=[],this.onStopSubscribers=[],this.node.addEventListener("canplaythrough",function(){g.log("canplaythrough"),j.playing=!0,j.node.playbackRate=j.options.pitch||1,j.node.currentTime=j.options.start||0,j.node.volume=j.volume,j.node.play();for(var D=p(j.onPlaySubscribers),W;!(W=D()).done;){var K=W.value;K()}}),this.node.addEventListener("ended",function(){g.log("ended"),j.stop()}),this.node.addEventListener("error",function(D){j.playing&&(g.log("playback error",D.error),j.stop())}),this.playbackInterval=setInterval(function(){if(j.playing){var D=j.options.end>0&&j.node.currentTime>=j.options.end;D&&j.stop()}},1e3)}var B=M.prototype;return B.destroy=function(){this.node&&(this.node.stop(),document.removeChild(this.node),clearInterval(this.playbackInterval))},B.play=function(D,W){W===void 0&&(W={}),this.node&&(g.log("playing",D,W),this.options=W,this.node.src=D)},B.stop=function(){if(this.node){if(this.playing)for(var D=p(this.onStopSubscribers),W;!(W=D()).done;){var K=W.value;K()}g.log("stopping"),this.playing=!1,this.node.src=""}},B.setVolume=function(D){this.node&&(this.volume=D,this.node.volume=D)},B.onPlay=function(D){this.node&&this.onPlaySubscribers.push(D)},B.onStop=function(D){this.node&&this.onStopSubscribers.push(D)},M}();/**
+ */function p(D,b){(b==null||b>D.length)&&(b=D.length);for(var L=0,F=new Array(b);L=D.length?{done:!0}:{done:!1,value:D[F++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var S=(0,f.h)("AudioPlayer"),E=function(){"use strict";function D(){var L=this;this.node=document.createElement("audio"),this.node.style.setProperty("display","none"),document.body.appendChild(this.node),this.playing=!1,this.volume=1,this.options={},this.onPlaySubscribers=[],this.onStopSubscribers=[],this.node.addEventListener("canplaythrough",function(){S.log("canplaythrough"),L.playing=!0,L.node.playbackRate=L.options.pitch||1,L.node.currentTime=L.options.start||0,L.node.volume=L.volume,L.node.play();for(var F=g(L.onPlaySubscribers),V;!(V=F()).done;){var G=V.value;G()}}),this.node.addEventListener("ended",function(){S.log("ended"),L.stop()}),this.node.addEventListener("error",function(F){L.playing&&(S.log("playback error",F.error),L.stop())}),this.playbackInterval=setInterval(function(){if(L.playing){var F=L.options.end>0&&L.node.currentTime>=L.options.end;F&&L.stop()}},1e3)}var b=D.prototype;return b.destroy=function(){this.node&&(this.node.stop(),document.removeChild(this.node),clearInterval(this.playbackInterval))},b.play=function(F,V){V===void 0&&(V={}),this.node&&(S.log("playing",F,V),this.options=V,this.node.src=F)},b.stop=function(){if(this.node){if(this.playing)for(var F=g(this.onStopSubscribers),V;!(V=F()).done;){var G=V.value;G()}S.log("stopping"),this.playing=!1,this.node.src=""}},b.setVolume=function(F){this.node&&(this.volume=F,this.node.volume=F)},b.onPlay=function(F){this.node&&this.onPlaySubscribers.push(F)},b.onStop=function(F){this.node&&this.onStopSubscribers.push(F)},D}();/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */function S(M,B){if(M==null)return{};var j={},D=Object.keys(M),W,K;for(K=0;K=0)&&(j[W]=M[W]);return j}var I=function(M){var B=new y;return B.onPlay(function(){M.dispatch({type:"audio/playing"})}),B.onStop(function(){M.dispatch({type:"audio/stopped"})}),function(j){return function(D){var W=D.type,K=D.payload;if(W==="audio/playMusic"){var G=K.url,tt=S(K,["url"]);return B.play(G,tt),j(D)}if(W==="audio/stopMusic")return B.stop(),j(D);if(W==="settings/update"||W==="settings/load"){var H=K==null?void 0:K.adminMusicVolume;return typeof H=="number"&&B.setVolume(H),j(D)}return j(D)}}},O=t(20462),T=t(4089),A=t(16754),b=t(92103);/**
+ */function T(D,b){if(D==null)return{};var L={},F=Object.keys(D),V,G;for(G=0;G=0)&&(L[V]=D[V]);return L}var C=function(D){var b=new E;return b.onPlay(function(){D.dispatch({type:"audio/playing"})}),b.onStop(function(){D.dispatch({type:"audio/stopped"})}),function(L){return function(F){var V=F.type,G=F.payload;if(V==="audio/playMusic"){var J=G.url,oe=T(G,["url"]);return b.play(J,oe),L(F)}if(V==="audio/stopMusic")return b.stop(),L(F);if(V==="settings/update"||V==="settings/load"){var Z=G==null?void 0:G.adminMusicVolume;return typeof Z=="number"&&b.setVolume(Z),L(F)}return L(F)}}},w=n(62161),I=n(4089),R=n(16754),j=n(92103);/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var N=function(M){var B,j,D,W,K,G,tt=(0,r.d4)(o),H=(0,r.wA)(),q=(0,b.t0)(),J=(B=tt.meta)==null?void 0:B.title,ut=(j=tt.meta)==null?void 0:j.link,k=((D=tt.meta)==null?void 0:D.artist)||"Unknown Artist",nt=((W=tt.meta)==null?void 0:W.upload_date)||"Unknown Date",L=((K=tt.meta)==null?void 0:K.album)||"Unknown Album",Y=(G=tt.meta)==null?void 0:G.duration,X=isNaN(nt)?nt:(nt==null?void 0:nt.substring(0,4))+"-"+(nt==null?void 0:nt.substring(4,6))+"-"+(nt==null?void 0:nt.substring(6,8));return(0,O.jsxs)(A.so,{align:"center",children:[tt.playing&&(0,O.jsx)(A.so.Item,{mx:.5,grow:1,style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:(0,O.jsx)(A.Nt,{title:J||"Unknown Track",color:"blue",children:(0,O.jsxs)(A.wn,{children:[ut!=="Song Link Hidden"&&(0,O.jsxs)(A.so.Item,{grow:1,color:"label",children:["URL: ",ut]}),(0,O.jsxs)(A.so.Item,{grow:1,color:"label",children:["Duration: ",Y]}),k!=="Song Artist Hidden"&&k!=="Unknown Artist"&&(0,O.jsxs)(A.so.Item,{grow:1,color:"label",children:["Artist: ",k]}),L!=="Song Album Hidden"&&L!=="Unknown Album"&&(0,O.jsxs)(A.so.Item,{grow:1,color:"label",children:["Album: ",L]}),nt!=="Song Upload Date Hidden"&&nt!=="Unknown Date"&&(0,O.jsxs)(A.so.Item,{grow:1,color:"label",children:["Uploaded: ",X]})]})})})||(0,O.jsx)(A.so.Item,{grow:1,color:"label",children:"Nothing to play."}),tt.playing&&(0,O.jsx)(A.so.Item,{mx:.5,fontSize:"0.9em",children:(0,O.jsx)(A.$n,{tooltip:"Stop",icon:"stop",onClick:function(){return H({type:"audio/stopMusic"})}})}),(0,O.jsx)(A.so.Item,{mx:.5,fontSize:"0.9em",children:(0,O.jsx)(A.N6,{minValue:0,maxValue:1,value:q.adminMusicVolume,step:.0025,stepPixelSize:1,format:function(U){return(0,T.Mg)(U*100)+"%"},onDrag:function(U,_){return q.update({adminMusicVolume:_})}})})]})};/**
+ */var B=function(D){var b,L,F,V,G,J,oe=(0,i.d4)(u),Z=(0,i.wA)(),ne=(0,j.t0)(),te=(b=oe.meta)==null?void 0:b.title,pe=(L=oe.meta)==null?void 0:L.link,ce=((F=oe.meta)==null?void 0:F.artist)||"Unknown Artist",q=((V=oe.meta)==null?void 0:V.upload_date)||"Unknown Date",K=((G=oe.meta)==null?void 0:G.album)||"Unknown Album",_=(J=oe.meta)==null?void 0:J.duration,W=isNaN(q)?q:(q==null?void 0:q.substring(0,4))+"-"+(q==null?void 0:q.substring(4,6))+"-"+(q==null?void 0:q.substring(6,8));return(0,w.jsxs)(R.so,{align:"center",children:[oe.playing&&(0,w.jsx)(R.so.Item,{mx:.5,grow:1,style:{whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:(0,w.jsx)(R.Nt,{title:te||"Unknown Track",color:"blue",children:(0,w.jsxs)(R.wn,{children:[pe!=="Song Link Hidden"&&(0,w.jsxs)(R.so.Item,{grow:1,color:"label",children:["URL: ",pe]}),(0,w.jsxs)(R.so.Item,{grow:1,color:"label",children:["Duration: ",_]}),ce!=="Song Artist Hidden"&&ce!=="Unknown Artist"&&(0,w.jsxs)(R.so.Item,{grow:1,color:"label",children:["Artist: ",ce]}),K!=="Song Album Hidden"&&K!=="Unknown Album"&&(0,w.jsxs)(R.so.Item,{grow:1,color:"label",children:["Album: ",K]}),q!=="Song Upload Date Hidden"&&q!=="Unknown Date"&&(0,w.jsxs)(R.so.Item,{grow:1,color:"label",children:["Uploaded: ",W]})]})})})||(0,w.jsx)(R.so.Item,{grow:1,color:"label",children:"Nothing to play."}),oe.playing&&(0,w.jsx)(R.so.Item,{mx:.5,fontSize:"0.9em",children:(0,w.jsx)(R.$n,{tooltip:"Stop",icon:"stop",onClick:function(){return Z({type:"audio/stopMusic"})}})}),(0,w.jsx)(R.so.Item,{mx:.5,fontSize:"0.9em",children:(0,w.jsx)(R.N6,{minValue:0,maxValue:1,value:ne.adminMusicVolume,step:.0025,stepPixelSize:1,format:function(H){return(0,I.Mg)(H*100)+"%"},onDrag:function(H,ae){return ne.update({adminMusicVolume:ae})}})})]})};/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */function w(){return w=Object.assign||function(M){for(var B=1;Bot.length)&&(St=ot.length);for(var st=0,gt=new Array(St);st=ot.length?{done:!0}:{done:!1,value:ot[gt++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var M=function(ot){for(var St=ot.node,st=ot.regex,gt=ot.createNode,Dt=ot.captureAdjust,zt=St.textContent,ie=zt.length,ne,pe,_t,Ge=0,Le,Ve=0,Xe=0;_t=st.exec(zt);){if(Ve+=1,++Xe>9999)return{};Le||(Le=document.createDocumentFragment()),ne||(ne=[]);var Ue=Dt?Dt(_t[0]):_t[0],Ke=Ue.length,De=_t.index+_t[0].indexOf(Ue);Gele.length)&&(we=le.length);for(var ge=0,Oe=new Array(we);ge=le.length?{done:!0}:{done:!1,value:le[Oe++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var D=function(le){for(var we=le.node,ge=le.regex,Oe=le.createNode,Fe=le.captureAdjust,Ve=we.textContent,pt=Ve.length,dt,Rt,at,Gt=0,Vt,Bt=0,Kt=0;at=ge.exec(Ve);){if(Bt+=1,++Kt>9999)return{};Vt||(Vt=document.createDocumentFragment()),dt||(dt=[]);var qt=Fe?Fe(at[0]):at[0],Jt=qt.length,kt=at.index+at[0].indexOf(qt);Gtot.length)&&(St=ot.length);for(var st=0,gt=new Array(St);st=ot.length?{done:!0}:{done:!1,value:ot[gt++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var ut=(0,b.h)("chatRenderer"),k=24,nt={Tooltip:i.m_},L={position:"position",content:"content"},Y=function(ot){for(var St=document.body,st=ot;st&&st!==St;){if(st.scrollWidth=u.HC){ut.error("failed to load an image after "+st+" attempts");return}var gt=St.src;St.src=null,St.src=gt+"#"+st,St.setAttribute("data-reload-n",st+1)},u.xr)},Lt=function(ot){var St=ot.node,st=ot.times;if(!(!St||!st)){var gt=St.querySelector(".Chat__badge"),Dt=gt||document.createElement("div");Dt.textContent=st,Dt.className=(0,I.Ly)(["Chat__badge","Chat__badge--animate"]),requestAnimationFrame(function(){Dt.className="Chat__badge"}),gt||St.appendChild(Dt)}},Gt=function(){"use strict";function ot(){var st=this;this.loaded=!1,this.rootNode=null,this.queue=[],this.messages=[],this.archivedMessages=[],this.visibleMessages=[],this.page=null,this.events=new T.b,this.prependTimestamps=!1,this.visibleMessageLimit=2500,this.combineMessageLimit=5,this.combineIntervalLimit=5,this.logLimit=0,this.logEnable=!0,this.roundId=null,this.storedTypes={},this.interleave=!1,this.interleaveEnabled=!1,this.interleaveColor="#909090",this.hideImportantInAdminTab=!1,this.scrollNode=null,this.scrollTracking=!0,this.handleScroll=function(gt){var Dt=st.scrollNode,zt=Dt.scrollHeight,ie=Dt.scrollTop+Dt.offsetHeight,ne=Math.abs(zt-ie)0&&(this.processBatch(this.queue,{doArchive:gt}),this.queue=[])},St.assignStyle=function(gt){gt===void 0&&(gt={});for(var Dt=J(Object.keys(gt)),zt;!(zt=Dt()).done;){var ie=zt.value;this.rootNode.style.setProperty(ie,gt[ie])}},St.setHighlight=function(gt,Dt){var zt=this;this.highlightParsers=null,gt&>.map(function(ie){var ne=Dt[ie],pe=ne.highlightText,_t=ne.blacklistText,Ge=ne.highlightColor,Le=ne.highlightBlacklist,Ve=ne.highlightWholeMessage,Xe=ne.matchWord,Ue=ne.matchCase,Ke=/^[a-z0-9_\-$/^[\s\]\\]+$/gi,De=/[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g,pn=String(pe).split(",").map(function(en){return en.trim()}).filter(function(en){return en&&en.length>1&&Ke.test(en)&&((Ke.lastIndex=0)||!0)}),un,bn;if(pn.length!==0){var dr=String(_t).split(",").map(function(en){return en.trim()}).filter(function(en){return en&&en.length>1&&Ke.test(en)&&((Ke.lastIndex=0)||!0)}),Be,Sn;if(Le&&dr.length>0){for(var vr=[],Je=J(dr),jn;!(jn=Je()).done;){var Ze=jn.value;if(Ze.charAt(0)==="/"&&Ze.charAt(Ze.length-1)==="/"){var or=Ze.substring(1,Ze.length-1);if(/^(\[.*\]|\\.|.)$/.test(or))continue;vr.push(or)}else Be||(Be=[]),Ze=Ze.replace(De,"\\$&"),Be.push("^\\s*"+Ze),Be.push("^\\[\\d+:\\d+\\]\\s*"+Ze)}var Qe=Be.join("|"),Kn="i";try{Sn=new RegExp("("+Qe+")",Kn)}catch(en){Sn=null}}for(var Mn=[],Or=J(pn),He;!(He=Or()).done;){var Nn=He.value;if(Nn.charAt(0)==="/"&&Nn.charAt(Nn.length-1)==="/"){var Zn=Nn.substring(1,Nn.length-1);if(/^(\[.*\]|\\.|.)$/.test(Zn))continue;Mn.push(Zn)}else un||(un=[]),Nn=Nn.replace(De,"\\$&"),un.push(Nn)}var Hn=Mn.join("|"),Dn="g"+(Ue?"":"i");try{if(Hn)bn=new RegExp("("+Hn+")",Dn);else{var Fn=(Xe?"\\b":"")+"("+un.join("|")+")"+(Xe?"\\b":"");bn=new RegExp(Fn,Dn)}}catch(en){bn=null}zt.highlightParsers||(zt.highlightParsers=[]),zt.highlightParsers.push({highlightWords:un,highlightRegex:bn,highlightColor:Ge,highlightWholeMessage:Ve,highlightBlacklist:Le,blacklistregex:Sn})}})},St.scrollToBottom=function(){this.scrollNode.scrollTop=this.scrollNode.scrollHeight},St.setVisualChatLimits=function(gt,Dt,zt,ie,ne,pe,_t,Ge,Le,Ve,Xe){this.visibleMessageLimit=gt,this.combineMessageLimit=Dt,this.combineIntervalLimit=zt,this.logEnable=ie,this.logLimit=ne,this.storedTypes=pe,this.roundId=_t,this.prependTimestamps=Ge,this.hideImportantInAdminTab=Le,this.interleaveEnabled=Ve,this.interleaveColor=Xe},St.changePage=function(gt){if(!this.isReady()){this.page=gt,this.tryFlushQueue();return}this.page=gt,this.rootNode.textContent="",this.visibleMessages=[];for(var Dt=document.createDocumentFragment(),zt,ie=J(this.messages),ne;!(ne=ie()).done;){var pe=ne.value;(0,N.CH)(gt,pe.type)&&!((0,N.Db)(gt)&&(0,N.Dx)(pe.type)&&this.hideImportantInAdminTab)&&(zt=pe.node,zt=_(zt,this.interleaveEnabled&&this.interleave,this.interleaveColor),this.interleave=!this.interleave,Dt.appendChild(zt),this.visibleMessages.push(pe))}zt&&(this.rootNode.appendChild(Dt),zt.scrollIntoView())},St.getCombinableMessage=function(gt){for(var Dt=Date.now(),zt=this.visibleMessages.length,ie=zt-1,ne=Math.max(0,zt-this.combineMessageLimit),pe=ie;pe>=ne;pe--){var _t=this.visibleMessages[pe],Ge=!_t.type.startsWith(u.PM)&&(0,N.mh)(_t,gt)&&Dt<_t.createdAt+this.combineIntervalLimit*1e3;if(Ge)return _t}return null},St.processBatch=function(gt,Dt){var zt,ie=function(){var dr=un.value,Be=(0,N.oH)(dr),Sn=zt.getCombinableMessage(Be);if(Sn)return Sn.times=(Sn.times||1)+1,Lt(Sn),"continue";if(Be.node)De=Be.node;else if(Be.type==="internal/reconnected")De=lt();else{De=U(),Be.text?De.textContent=zt.prependTimestamps?dt(Be)+Be.text:Be.text:Be.html?De.innerHTML=zt.prependTimestamps?dt(Be)+Be.html:Be.html:ut.error("Error: message is missing text payload",Be);for(var vr=De.querySelectorAll("[data-component]"),Je=0;Je0&&zt.archivedMessages.length>=zt.logLimit+1?zt.archivedMessages=zt.archivedMessages.slice(-(zt.logLimit-1)):zt.logLimit>0&&zt.archivedMessages.length>=zt.logLimit&&zt.archivedMessages.shift(),zt.archivedMessages.push((0,N.Ex)(Be,!0))),(0,N.CH)(zt.page,Be.type)&&!((0,N.Db)(zt.page)&&(0,N.Dx)(Be.type)&&zt.hideImportantInAdminTab)&&(De=_(De,zt.interleaveEnabled&&zt.interleave,zt.interleaveColor),zt.interleave=!zt.interleave,Ue.appendChild(De),zt.visibleMessages.push(Be))},ne=this;Dt===void 0&&(Dt={});var pe=Dt.prepend,_t=Dt.notifyListeners,Ge=_t===void 0?!0:_t,Le=Dt.doArchive,Ve=Le===void 0?!1:Le,Xe=Date.now();if(!this.isReady()){pe?this.queue=[].concat(gt,this.queue):this.queue=[].concat(this.queue,gt);return}for(var Ue=document.createDocumentFragment(),Ke={},De,pn=J(gt),un;!(un=pn()).done;)zt=this,ie();if(De){var bn=this.rootNode.childNodes[0];pe&&bn?this.rootNode.insertBefore(Ue,bn):this.rootNode.appendChild(Ue),this.scrollTracking&&setImmediate(function(){return ne.scrollToBottom()})}Ge&&this.events.emit("batchProcessed",Ke)},St.pruneMessages=function(){if(this.isReady()){if(!this.scrollTracking){ut.debug("pruning delayed");return}{var gt=this.visibleMessages,Dt=Math.max(0,gt.length-this.visibleMessageLimit);if(Dt>0){this.visibleMessages=gt.slice(Dt);for(var zt=0;zt0&&(this.messages=this.messages.slice(ne),ut.log("pruned "+ne+" stored messages"))}}},St.rebuildChat=function(gt){if(this.isReady()){for(var Dt=Math.max(0,this.messages.length-gt),zt=this.messages.slice(Dt),ie=J(zt),ne;!(ne=ie()).done;){var pe=ne.value;pe.node=void 0}this.rootNode.textContent="",this.messages=[],this.visibleMessages=[],this.processBatch(zt,{notifyListeners:!1})}},St.saveToDisk=function(gt,Dt,zt){if(Dt===void 0&&(Dt=0),zt===void 0&&(zt=0),!Byond.IS_LTE_IE10){for(var ie="",ne=document.styleSheets,pe=0;pe0&&(Xe=Xe.slice(-gt))):gt>0?Xe=this.archivedMessages.slice(-gt):Xe=this.archivedMessages;for(var Ue=J(Xe),Ke;!(Ke=Ue()).done;){var De=Ke.value;(0,N.CH)(this.page,De.type)&&(Ve+=De.html+"\n")}var pn="\n\n\nSS13 Chat Log \n\n\n\n\n'+Ve+"
\n\n\n",un=new Blob([pn]),bn=new Date().toISOString().substring(0,19).replace(/[-:]/g,"").replace("T","-");window.navigator.msSaveBlob(un,"ss13-chatlog-"+bn+".html")}},St.purgeMessageArchive=function(){this.archivedMessages=[]},St.getStoredMessages=function(){return this.archivedMessages.length},ot}();window.__chatRenderer__||(window.__chatRenderer__=new Gt);var jt=window.__chatRenderer__;/**
+ */function oe(le,we){(we==null||we>le.length)&&(we=le.length);for(var ge=0,Oe=new Array(we);ge=le.length?{done:!0}:{done:!1,value:le[Oe++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var pe=(0,j.h)("chatRenderer"),ce=24,q={Tooltip:s.m_},K={position:"position",content:"content"},_=function(le){for(var we=document.body,ge=le;ge&&ge!==we;){if(ge.scrollWidth=f.HC){pe.error("failed to load an image after "+ge+" attempts");return}var Oe=we.src;we.src=null,we.src=Oe+"#"+ge,we.setAttribute("data-reload-n",ge+1)},f.xr)},Ae=function(le){var we=le.node,ge=le.times;if(!(!we||!ge)){var Oe=we.querySelector(".Chat__badge"),Fe=Oe||document.createElement("div");Fe.textContent=ge,Fe.className=(0,C.Ly)(["Chat__badge","Chat__badge--animate"]),requestAnimationFrame(function(){Fe.className="Chat__badge"}),Oe||we.appendChild(Fe)}},Pe=function(){"use strict";function le(){var ge=this;this.loaded=!1,this.rootNode=null,this.queue=[],this.messages=[],this.archivedMessages=[],this.visibleMessages=[],this.page=null,this.events=new I.b,this.prependTimestamps=!1,this.visibleMessageLimit=2500,this.combineMessageLimit=5,this.combineIntervalLimit=5,this.logLimit=0,this.logEnable=!0,this.roundId=null,this.storedTypes={},this.interleave=!1,this.interleaveEnabled=!1,this.interleaveColor="#909090",this.hideImportantInAdminTab=!1,this.scrollNode=null,this.scrollTracking=!0,this.handleScroll=function(Oe){var Fe=ge.scrollNode,Ve=Fe.scrollHeight,pt=Fe.scrollTop+Fe.offsetHeight,dt=Math.abs(Ve-pt)0&&(this.processBatch(this.queue,{doArchive:Oe}),this.queue=[])},we.assignStyle=function(Oe){Oe===void 0&&(Oe={});for(var Fe=te(Object.keys(Oe)),Ve;!(Ve=Fe()).done;){var pt=Ve.value;this.rootNode.style.setProperty(pt,Oe[pt])}},we.setHighlight=function(Oe,Fe){var Ve=this;this.highlightParsers=null,Oe&&Oe.map(function(pt){var dt=Fe[pt],Rt=dt.highlightText,at=dt.blacklistText,Gt=dt.highlightColor,Vt=dt.highlightBlacklist,Bt=dt.highlightWholeMessage,Kt=dt.matchWord,qt=dt.matchCase,Jt=/^[a-z0-9_\-$/^[\s\]\\]+$/gi,kt=/[!#$%^&*)(+=.<>{}[\]:;'"|~`_\-\\/]/g,$n=String(Rt).split(",").map(function(hn){return hn.trim()}).filter(function(hn){return hn&&hn.length>1&&Jt.test(hn)&&((Jt.lastIndex=0)||!0)}),jn,ar;if($n.length!==0){var vo=String(at).split(",").map(function(hn){return hn.trim()}).filter(function(hn){return hn&&hn.length>1&&Jt.test(hn)&&((Jt.lastIndex=0)||!0)}),jt,_t;if(Vt&&vo.length>0){for(var po=[],yn=te(vo),ur;!(ur=yn()).done;){var en=ur.value;if(en.charAt(0)==="/"&&en.charAt(en.length-1)==="/"){var Or=en.substring(1,en.length-1);if(/^(\[.*\]|\\.|.)$/.test(Or))continue;po.push(Or)}else jt||(jt=[]),en=en.replace(kt,"\\$&"),jt.push("^\\s*"+en),jt.push("^\\[\\d+:\\d+\\]\\s*"+en)}var lr=jt.join("|"),eo="i";try{_t=new RegExp("("+lr+")",eo)}catch(hn){_t=null}}for(var hr=[],ln=te($n),sn;!(sn=ln()).done;){var An=sn.value;if(An.charAt(0)==="/"&&An.charAt(An.length-1)==="/"){var Dr=An.substring(1,An.length-1);if(/^(\[.*\]|\\.|.)$/.test(Dr))continue;hr.push(Dr)}else jn||(jn=[]),An=An.replace(kt,"\\$&"),jn.push(An)}var er=hr.join("|"),sr="g"+(qt?"":"i");try{if(er)ar=new RegExp("("+er+")",sr);else{var Fr=(Kt?"\\b":"")+"("+jn.join("|")+")"+(Kt?"\\b":"");ar=new RegExp(Fr,sr)}}catch(hn){ar=null}Ve.highlightParsers||(Ve.highlightParsers=[]),Ve.highlightParsers.push({highlightWords:jn,highlightRegex:ar,highlightColor:Gt,highlightWholeMessage:Bt,highlightBlacklist:Vt,blacklistregex:_t})}})},we.scrollToBottom=function(){this.scrollNode.scrollTop=this.scrollNode.scrollHeight},we.setVisualChatLimits=function(Oe,Fe,Ve,pt,dt,Rt,at,Gt,Vt,Bt,Kt){this.visibleMessageLimit=Oe,this.combineMessageLimit=Fe,this.combineIntervalLimit=Ve,this.logEnable=pt,this.logLimit=dt,this.storedTypes=Rt,this.roundId=at,this.prependTimestamps=Gt,this.hideImportantInAdminTab=Vt,this.interleaveEnabled=Bt,this.interleaveColor=Kt},we.changePage=function(Oe){if(!this.isReady()){this.page=Oe,this.tryFlushQueue();return}this.page=Oe,this.rootNode.textContent="",this.visibleMessages=[];for(var Fe=document.createDocumentFragment(),Ve,pt=te(this.messages),dt;!(dt=pt()).done;){var Rt=dt.value;(0,B.CH)(Oe,Rt.type)&&!((0,B.Db)(Oe)&&(0,B.Dx)(Rt.type)&&this.hideImportantInAdminTab)&&(Ve=Rt.node,Ve=ae(Ve,this.interleaveEnabled&&this.interleave,this.interleaveColor),this.interleave=!this.interleave,Fe.appendChild(Ve),this.visibleMessages.push(Rt))}Ve&&(this.rootNode.appendChild(Fe),Ve.scrollIntoView())},we.getCombinableMessage=function(Oe){for(var Fe=Date.now(),Ve=this.visibleMessages.length,pt=Ve-1,dt=Math.max(0,Ve-this.combineMessageLimit),Rt=pt;Rt>=dt;Rt--){var at=this.visibleMessages[Rt],Gt=!at.type.startsWith(f.PM)&&(0,B.mh)(at,Oe)&&Fe0&&Ve.archivedMessages.length>=Ve.logLimit+1?Ve.archivedMessages=Ve.archivedMessages.slice(-(Ve.logLimit-1)):Ve.logLimit>0&&Ve.archivedMessages.length>=Ve.logLimit&&Ve.archivedMessages.shift(),Ve.archivedMessages.push((0,B.Ex)(jt,!0))),(0,B.CH)(Ve.page,jt.type)&&!((0,B.Db)(Ve.page)&&(0,B.Dx)(jt.type)&&Ve.hideImportantInAdminTab)&&(kt=ae(kt,Ve.interleaveEnabled&&Ve.interleave,Ve.interleaveColor),Ve.interleave=!Ve.interleave,qt.appendChild(kt),Ve.visibleMessages.push(jt))},dt=this;Fe===void 0&&(Fe={});var Rt=Fe.prepend,at=Fe.notifyListeners,Gt=at===void 0?!0:at,Vt=Fe.doArchive,Bt=Vt===void 0?!1:Vt,Kt=Date.now();if(!this.isReady()){Rt?this.queue=[].concat(Oe,this.queue):this.queue=[].concat(this.queue,Oe);return}for(var qt=document.createDocumentFragment(),Jt={},kt,$n=te(Oe),jn;!(jn=$n()).done;)Ve=this,pt();if(kt){var ar=this.rootNode.childNodes[0];Rt&&ar?this.rootNode.insertBefore(qt,ar):this.rootNode.appendChild(qt),this.scrollTracking&&setImmediate(function(){return dt.scrollToBottom()})}Gt&&this.events.emit("batchProcessed",Jt)},we.pruneMessages=function(){if(this.isReady()){if(!this.scrollTracking){pe.debug("pruning delayed");return}{var Oe=this.visibleMessages,Fe=Math.max(0,Oe.length-this.visibleMessageLimit);if(Fe>0){this.visibleMessages=Oe.slice(Fe);for(var Ve=0;Ve0&&(this.messages=this.messages.slice(dt),pe.log("pruned "+dt+" stored messages"))}}},we.rebuildChat=function(Oe){if(this.isReady()){for(var Fe=Math.max(0,this.messages.length-Oe),Ve=this.messages.slice(Fe),pt=te(Ve),dt;!(dt=pt()).done;){var Rt=dt.value;Rt.node=void 0}this.rootNode.textContent="",this.messages=[],this.visibleMessages=[],this.processBatch(Ve,{notifyListeners:!1})}},we.saveToDisk=function(Oe,Fe,Ve){if(Fe===void 0&&(Fe=0),Ve===void 0&&(Ve=0),!Byond.IS_LTE_IE10){for(var pt="",dt=document.styleSheets,Rt=0;Rt0&&(Kt=Kt.slice(-Oe))):Oe>0?Kt=this.archivedMessages.slice(-Oe):Kt=this.archivedMessages;for(var qt=te(Kt),Jt;!(Jt=qt()).done;){var kt=Jt.value;(0,B.CH)(this.page,kt.type)&&(Bt+=kt.html+"\n")}var $n="\n\n\nSS13 Chat Log \n\n\n\n\n'+Bt+"
\n\n\n",jn=new Blob([$n]),ar=new Date().toISOString().substring(0,19).replace(/[-:]/g,"").replace("T","-");window.navigator.msSaveBlob(jn,"ss13-chatlog-"+ar+".html")}},we.purgeMessageArchive=function(){this.archivedMessages=[]},we.getStoredMessages=function(){return this.archivedMessages.length},le}();window.__chatRenderer__||(window.__chatRenderer__=new Pe);var me=window.__chatRenderer__;/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */function Pt(ot,St){if(typeof St!="function"&&St!==null)throw new TypeError("Super expression must either be null or a function");ot.prototype=Object.create(St&&St.prototype,{constructor:{value:ot,writable:!0,configurable:!0}}),St&&Yt(ot,St)}function Yt(ot,St){return Yt=Object.setPrototypeOf||function(gt,Dt){return gt.__proto__=Dt,gt},Yt(ot,St)}var xe=function(ot){"use strict";Pt(St,ot);function St(gt){var Dt;return Dt=ot.call(this,gt)||this,Dt.ref=(0,O.createRef)(),Dt.state={scrollTracking:!0},Dt.handleScrollTrackingChange=function(zt){return Dt.setState({scrollTracking:zt})},Dt}var st=St.prototype;return st.componentDidMount=function(){jt.mount(this.ref.current),jt.events.on("scrollTrackingChanged",this.handleScrollTrackingChange),this.componentDidUpdate()},st.componentWillUnmount=function(){jt.events.off("scrollTrackingChanged",this.handleScrollTrackingChange)},st.componentDidUpdate=function(Dt){requestAnimationFrame(function(){jt.ensureScrollTracking()});var zt=!Dt||(0,I.a_)(this.props,Dt);zt&&jt.assignStyle({width:"100%","white-space":"pre-wrap","font-size":this.props.fontSize,"line-height":this.props.lineHeight})},st.render=function(){var Dt=this.state.scrollTracking;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("div",{className:"Chat",ref:this.ref}),!Dt&&(0,r.jsx)(i.$n,{className:"Chat__scrollButton",icon:"arrow-down",onClick:function(){return jt.scrollToBottom()},children:"Scroll to bottom"})]})},St}(O.Component),Te=t(53529);/**
+ */function Ye(le,we){if(typeof we!="function"&&we!==null)throw new TypeError("Super expression must either be null or a function");le.prototype=Object.create(we&&we.prototype,{constructor:{value:le,writable:!0,configurable:!0}}),we&&Qe(le,we)}function Qe(le,we){return Qe=Object.setPrototypeOf||function(Oe,Fe){return Oe.__proto__=Fe,Oe},Qe(le,we)}var yt=function(le){"use strict";Ye(we,le);function we(Oe){var Fe;return Fe=le.call(this,Oe)||this,Fe.ref=(0,w.createRef)(),Fe.state={scrollTracking:!0},Fe.handleScrollTrackingChange=function(Ve){return Fe.setState({scrollTracking:Ve})},Fe}var ge=we.prototype;return ge.componentDidMount=function(){me.mount(this.ref.current),me.events.on("scrollTrackingChanged",this.handleScrollTrackingChange),this.componentDidUpdate()},ge.componentWillUnmount=function(){me.events.off("scrollTrackingChanged",this.handleScrollTrackingChange)},ge.componentDidUpdate=function(Fe){requestAnimationFrame(function(){me.ensureScrollTracking()});var Ve=!Fe||(0,C.a_)(this.props,Fe);Ve&&me.assignStyle({width:"100%","white-space":"pre-wrap","font-size":this.props.fontSize,"line-height":this.props.lineHeight})},ge.render=function(){var Fe=this.state.scrollTracking;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("div",{className:"Chat",ref:this.ref}),!Fe&&(0,i.jsx)(s.$n,{className:"Chat__scrollButton",icon:"arrow-down",onClick:function(){return me.scrollToBottom()},children:"Scroll to bottom"})]})},we}(w.Component),ut=n(53529);/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var de=function(ot){var St=ot.value;return(0,r.jsx)(i.az,{style:{fontSize:"0.7em",borderRadius:"0.25em",width:"1.7em",lineHeight:"1.55em",backgroundColor:"crimson",color:"#fff"},children:Math.min(St,99)})},Rt=function(ot){var St=(0,o.d4)(p),st=(0,o.d4)(g),gt=(0,o.wA)();return(0,r.jsxs)(i.so,{align:"center",children:[(0,r.jsx)(i.so.Item,{children:(0,r.jsx)(i.tU,{textAlign:"center",children:St.map(function(Dt){return(0,r.jsx)(i.tU.Tab,{selected:Dt===st,rightSlot:!Dt.hideUnreadCount&&Dt.unreadCount>0&&(0,r.jsx)(de,{value:Dt.unreadCount}),onClick:function(){return gt((0,s.Qn)({pageId:Dt.id}))},children:Dt.name},Dt.id)})})}),(0,r.jsx)(i.so.Item,{ml:1,children:(0,r.jsx)(i.$n,{color:"transparent",icon:"plus",onClick:function(){gt((0,s.Pd)()),gt((0,Te.oW)())}})})]})},Nt=t(9248),Vt=t(85003),kt=t.n(Vt),ee=t(2727),yt=t(69752);/**
+ */var Ie=function(le){var we=le.value;return(0,i.jsx)(s.az,{style:{fontSize:"0.7em",borderRadius:"0.25em",width:"1.7em",lineHeight:"1.55em",backgroundColor:"crimson",color:"#fff"},children:Math.min(we,99)})},De=function(le){var we=(0,u.d4)(g),ge=(0,u.d4)(S),Oe=(0,u.wA)();return(0,i.jsxs)(s.so,{align:"center",children:[(0,i.jsx)(s.so.Item,{children:(0,i.jsx)(s.tU,{textAlign:"center",children:we.map(function(Fe){return(0,i.jsx)(s.tU.Tab,{selected:Fe===ge,rightSlot:!Fe.hideUnreadCount&&Fe.unreadCount>0&&(0,i.jsx)(Ie,{value:Fe.unreadCount}),onClick:function(){return Oe((0,d.Qn)({pageId:Fe.id}))},children:Fe.name},Fe.id)})})}),(0,i.jsx)(s.so.Item,{ml:1,children:(0,i.jsx)(s.$n,{color:"transparent",icon:"plus",onClick:function(){Oe((0,d.Pd)()),Oe((0,ut.oW)())}})})]})},be=n(9248),Xe=n(20628),lt=n.n(Xe),tt=n(2727),ct=n(69752);/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */function Ot(ot,St){(St==null||St>ot.length)&&(St=ot.length);for(var st=0,gt=new Array(St);st=ot.length?{done:!0}:{done:!1,value:ot[gt++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function Ut(ot,St){var st,gt,Dt,zt,ie={label:0,sent:function(){if(Dt[0]&1)throw Dt[1];return Dt[1]},trys:[],ops:[]};return zt={next:ne(0),throw:ne(1),return:ne(2)},typeof Symbol=="function"&&(zt[Symbol.iterator]=function(){return this}),zt;function ne(_t){return function(Ge){return pe([_t,Ge])}}function pe(_t){if(st)throw new TypeError("Generator is already executing.");for(;ie;)try{if(st=1,gt&&(Dt=_t[0]&2?gt.return:_t[0]?gt.throw||((Dt=gt.return)&&Dt.call(gt),0):gt.next)&&!(Dt=Dt.call(gt,_t[1])).done)return Dt;switch(gt=0,Dt&&(_t=[_t[0]&2,Dt.value]),_t[0]){case 0:case 1:Dt=_t;break;case 4:return ie.label++,{value:_t[1],done:!1};case 5:ie.label++,gt=_t[1],_t=[0];continue;case 7:_t=ie.ops.pop(),ie.trys.pop();continue;default:if(Dt=ie.trys,!(Dt=Dt.length>0&&Dt[Dt.length-1])&&(_t[0]===6||_t[0]===2)){ie=0;continue}if(_t[0]===3&&(!Dt||_t[1]>Dt[0]&&_t[1]Ve.logRetainRounds?(jt.archivedMessages=Dt.slice(At[Et.length-Ve.logRetainRounds]),Ve.storedRounds=Ve.logRetainRounds):jt.archivedMessages=Dt,Ve.lastId=Xe}else jt.archivedMessages=Dt}return ot.dispatch((0,s.Hg)(st)),[2]}})}),Fe=function(ot){var St=!1,st=!1,gt=[],Dt=[];return jt.events.on("batchProcessed",function(zt){st&&ot.dispatch((0,s.Y_)(zt))}),jt.events.on("scrollTrackingChanged",function(zt){ot.dispatch((0,s.$l)(zt))}),function(zt){return function(ie){var ne=ie.type,pe=ie.payload,_t=(0,yt.i0)(ot.getState()),Ge=(0,ee.V)(ot.getState());if(_t.totalStoredMessages=jt.getStoredMessages(),_t.storedRounds=Et.length,jt.setVisualChatLimits(_t.visibleMessageLimit,_t.combineMessageLimit,_t.combineIntervalLimit,_t.logEnable,_t.logLimit,_t.storedTypes,Ge.roundId,_t.prependTimestamps,_t.hideImportantInAdminTab,_t.interleave,_t.interleaveColor),!St&&_t.initialized&&(St=!0,setInterval(function(){qt(ot)},_t.saveInterval*1e3),ce(ot)),ne==="chat/message"){var Le;try{Le=JSON.parse(pe)}catch(un){return}var Ve=Le.sequence;if(gt.includes(Ve))return;var Xe=gt.length;t:if(Xe>0){if(Dt.includes(Ve)){Dt.splice(Dt.indexOf(Ve),1);break t}var Ue=gt[Xe-1]+1;if(Ve!==Ue)for(var Ke=Ue;Kele.length)&&(we=le.length);for(var ge=0,Oe=new Array(we);ge=le.length?{done:!0}:{done:!1,value:le[Oe++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function Ne(le,we){var ge,Oe,Fe,Ve,pt={label:0,sent:function(){if(Fe[0]&1)throw Fe[1];return Fe[1]},trys:[],ops:[]};return Ve={next:dt(0),throw:dt(1),return:dt(2)},typeof Symbol=="function"&&(Ve[Symbol.iterator]=function(){return this}),Ve;function dt(at){return function(Gt){return Rt([at,Gt])}}function Rt(at){if(ge)throw new TypeError("Generator is already executing.");for(;pt;)try{if(ge=1,Oe&&(Fe=at[0]&2?Oe.return:at[0]?Oe.throw||((Fe=Oe.return)&&Fe.call(Oe),0):Oe.next)&&!(Fe=Fe.call(Oe,at[1])).done)return Fe;switch(Oe=0,Fe&&(at=[at[0]&2,Fe.value]),at[0]){case 0:case 1:Fe=at;break;case 4:return pt.label++,{value:at[1],done:!1};case 5:pt.label++,Oe=at[1],at=[0];continue;case 7:at=pt.ops.pop(),pt.trys.pop();continue;default:if(Fe=pt.trys,!(Fe=Fe.length>0&&Fe[Fe.length-1])&&(at[0]===6||at[0]===2)){pt=0;continue}if(at[0]===3&&(!Fe||at[1]>Fe[0]&&at[1]Bt.logRetainRounds?(me.archivedMessages=Fe.slice(xt[_e.length-Bt.logRetainRounds]),Bt.storedRounds=Bt.logRetainRounds):me.archivedMessages=Fe,Bt.lastId=Kt}else me.archivedMessages=Fe}return le.dispatch((0,d.Hg)(ge)),[2]}})}),St=function(le){var we=!1,ge=!1,Oe=[],Fe=[];return me.events.on("batchProcessed",function(Ve){ge&&le.dispatch((0,d.Y_)(Ve))}),me.events.on("scrollTrackingChanged",function(Ve){le.dispatch((0,d.$l)(Ve))}),function(Ve){return function(pt){var dt=pt.type,Rt=pt.payload,at=(0,ct.i0)(le.getState()),Gt=(0,tt.V)(le.getState());if(at.totalStoredMessages=me.getStoredMessages(),at.storedRounds=_e.length,me.setVisualChatLimits(at.visibleMessageLimit,at.combineMessageLimit,at.combineIntervalLimit,at.logEnable,at.logLimit,at.storedTypes,Gt.roundId,at.prependTimestamps,at.hideImportantInAdminTab,at.interleave,at.interleaveColor),!we&&(at.initialized||at.firstLoad)&&(we=!0,setInterval(function(){bt(le)},at.saveInterval*1e3),Wt(le)),dt==="chat/message"){var Vt;try{Vt=JSON.parse(Rt)}catch(jn){return}var Bt=Vt.sequence;if(Oe.includes(Bt))return;var Kt=Oe.length;e:if(Kt>0){if(Fe.includes(Bt)){Fe.splice(Fe.indexOf(Bt),1);break e}var qt=Oe[Kt-1]+1;if(Bt!==qt)for(var Jt=qt;Jtot.length)&&(St=ot.length);for(var st=0,gt=new Array(St);st=0)&&(st[Dt]=ot[Dt]);return st}function he(ot,St){if(ot){if(typeof ot=="string")return ue(ot,St);var st=Object.prototype.toString.call(ot).slice(8,-1);if(st==="Object"&&ot.constructor&&(st=ot.constructor.name),st==="Map"||st==="Set")return Array.from(st);if(st==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(st))return ue(ot,St)}}function be(ot,St){var st=typeof Symbol!="undefined"&&ot[Symbol.iterator]||ot["@@iterator"];if(st)return(st=st.call(ot)).next.bind(st);if(Array.isArray(ot)||(st=he(ot))||St&&ot&&typeof ot.length=="number"){st&&(ot=st);var gt=0;return function(){return gt>=ot.length?{done:!0}:{done:!1,value:ot[gt++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var Ye=(0,N.pJ)(),xn,Rn={version:5,currentPageId:Ye.id,scrollTracking:!0,pages:[Ye.id],pageById:(xn={},xn[Ye.id]=Ye,xn)},mn=function(ot,St){ot===void 0&&(ot=Rn);var st=St.type,gt=St.payload;if(st===s.Hg.type){if((gt==null?void 0:gt.version)!==ot.version)return ot;for(var Dt=be(Object.keys(gt.pageById)),zt;!(zt=Dt()).done;)for(var ie=zt.value,ne=gt.pageById[ie],pe=ne.acceptedTypes,_t=Ye.acceptedTypes,Ge=be(Object.keys(_t)),Le;!(Le=Ge()).done;){var Ve=Le.value;pe[Ve]===void 0&&(pe[Ve]=_t[Ve])}for(var Xe=be(Object.keys(gt.pageById)),Ue;!(Ue=Xe()).done;){var Ke=Ue.value,De=gt.pageById[Ke];De.unreadCount=0}return $t({},ot,gt)}if(st===s.$l.type){var pn=gt,un=$t({},ot,{scrollTracking:pn});if(pn){var bn=ot.currentPageId,dr=$t({},ot.pageById[bn],{unreadCount:0}),Be;un.pageById=$t({},ot.pageById,(Be={},Be[bn]=dr,Be))}return un}if(st===s.Y_.type){for(var Sn=gt,vr=ot.pages.map(function($r){return ot.pageById[$r]}),Je=ot.pageById[ot.currentPageId],jn=$t({},ot.pageById),Ze=be(vr),or;!(or=Ze()).done;){for(var Qe=or.value,Kn=0,Mn=be(Object.keys(Sn)),Or;!(Or=Mn()).done;){var He=Or.value;(0,N.CH)(Qe,He)&&(Qe===Je&&ot.scrollTracking||Qe!==Je&&(0,N.CH)(Je,He)||(Kn+=Sn[He]))}Kn>0&&(jn[Qe.id]=$t({},Qe,{unreadCount:Qe.unreadCount+Kn}))}return $t({},ot,{pageById:jn})}if(st===s.Pd.type){var Nn;return $t({},ot,{currentPageId:gt.id,pages:[].concat(ot.pages,[gt.id]),pageById:$t({},ot.pageById,(Nn={},Nn[gt.id]=gt,Nn))})}if(st===s.Qn.type){var Zn=gt.pageId,Hn=$t({},ot.pageById[Zn],{unreadCount:0}),Dn;return $t({},ot,{currentPageId:Zn,pageById:$t({},ot.pageById,(Dn={},Dn[Zn]=Hn,Dn))})}if(st===s.Hp.type){var Fn=gt.pageId,en=Jt(gt,["pageId"]),Tr=$t({},ot.pageById[Fn],en),ln;return $t({},ot,{pageById:$t({},ot.pageById,(ln={},ln[Fn]=Tr,ln))})}if(st===s._E.type){var An=gt.pageId,On=gt.type,pr=$t({},ot.pageById[An]);pr.acceptedTypes=$t({},pr.acceptedTypes),pr.acceptedTypes[On]=!pr.acceptedTypes[On];var eo;return $t({},ot,{pageById:$t({},ot.pageById,(eo={},eo[An]=pr,eo))})}if(st===s.YH.type){var ho=gt.pageId,cn=$t({},ot,{pages:[].concat(ot.pages),pageById:$t({},ot.pageById)});return delete cn.pageById[ho],cn.pages=cn.pages.filter(function($r){return $r!==ho}),cn.pages.length===0&&(cn.pages.push(Ye.id),cn.pageById[Ye.id]=Ye,cn.currentPageId=Ye.id),(!cn.currentPageId||cn.currentPageId===ho)&&(cn.currentPageId=cn.pages[0]),cn}if(st===s.AB.type){var Ir=gt.pageId,Cn=$t({},ot,{pages:[].concat(ot.pages),pageById:$t({},ot.pageById)}),hr=Cn.pageById[Ir],no=Cn.pages.indexOf(hr.id),mo=no-1;if(no>0&&mo>0){var Ar=Cn.pages[no];Cn.pages[no]=Cn.pages[mo],Cn.pages[mo]=Ar}return Cn}if(st===s.Xl.type){var go=gt.pageId,tr=$t({},ot,{pages:[].concat(ot.pages),pageById:$t({},ot.pageById)}),Cr=tr.pageById[go],Dr=tr.pages.indexOf(Cr.id),Gn=Dr+1;if(Dr>0&&Gnle.length)&&(we=le.length);for(var ge=0,Oe=new Array(we);ge=0)&&(ge[Fe]=le[Fe]);return ge}function Ut(le,we){if(le){if(typeof le=="string")return et(le,we);var ge=Object.prototype.toString.call(le).slice(8,-1);if(ge==="Object"&&le.constructor&&(ge=le.constructor.name),ge==="Map"||ge==="Set")return Array.from(ge);if(ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(ge))return et(le,we)}}function fn(le,we){var ge=typeof Symbol!="undefined"&&le[Symbol.iterator]||le["@@iterator"];if(ge)return(ge=ge.call(le)).next.bind(ge);if(Array.isArray(le)||(ge=Ut(le))||we&&le&&typeof le.length=="number"){ge&&(le=ge);var Oe=0;return function(){return Oe>=le.length?{done:!0}:{done:!1,value:le[Oe++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var gn=(0,B.pJ)(),kn,Xn={version:5,currentPageId:gn.id,scrollTracking:!0,pages:[gn.id],pageById:(kn={},kn[gn.id]=gn,kn)},Lr=function(le,we){le===void 0&&(le=Xn);var ge=we.type,Oe=we.payload;if(ge===d.Hg.type){if((Oe==null?void 0:Oe.version)!==le.version)return le;for(var Fe=fn(Object.keys(Oe.pageById)),Ve;!(Ve=Fe()).done;)for(var pt=Ve.value,dt=Oe.pageById[pt],Rt=dt.acceptedTypes,at=gn.acceptedTypes,Gt=fn(Object.keys(at)),Vt;!(Vt=Gt()).done;){var Bt=Vt.value;Rt[Bt]===void 0&&(Rt[Bt]=at[Bt])}for(var Kt=fn(Object.keys(Oe.pageById)),qt;!(qt=Kt()).done;){var Jt=qt.value,kt=Oe.pageById[Jt];kt.unreadCount=0}return He({},le,Oe)}if(ge===d.$l.type){var $n=Oe,jn=He({},le,{scrollTracking:$n});if($n){var ar=le.currentPageId,vo=He({},le.pageById[ar],{unreadCount:0}),jt;jn.pageById=He({},le.pageById,(jt={},jt[ar]=vo,jt))}return jn}if(ge===d.Y_.type){for(var _t=Oe,po=le.pages.map(function(_o){return le.pageById[_o]}),yn=le.pageById[le.currentPageId],ur=He({},le.pageById),en=fn(po),Or;!(Or=en()).done;){for(var lr=Or.value,eo=0,hr=fn(Object.keys(_t)),ln;!(ln=hr()).done;){var sn=ln.value;(0,B.CH)(lr,sn)&&(lr===yn&&le.scrollTracking||lr!==yn&&(0,B.CH)(yn,sn)||(eo+=_t[sn]))}eo>0&&(ur[lr.id]=He({},lr,{unreadCount:lr.unreadCount+eo}))}return He({},le,{pageById:ur})}if(ge===d.Pd.type){var An;return He({},le,{currentPageId:Oe.id,pages:[].concat(le.pages,[Oe.id]),pageById:He({},le.pageById,(An={},An[Oe.id]=Oe,An))})}if(ge===d.Qn.type){var Dr=Oe.pageId,er=He({},le.pageById[Dr],{unreadCount:0}),sr;return He({},le,{currentPageId:Dr,pageById:He({},le.pageById,(sr={},sr[Dr]=er,sr))})}if(ge===d.Hp.type){var Fr=Oe.pageId,hn=Ft(Oe,["pageId"]),Wn=He({},le.pageById[Fr],hn),Qn;return He({},le,{pageById:He({},le.pageById,(Qn={},Qn[Fr]=Wn,Qn))})}if(ge===d._E.type){var On=Oe.pageId,cr=Oe.type,Co=He({},le.pageById[On]);Co.acceptedTypes=He({},Co.acceptedTypes),Co.acceptedTypes[cr]=!Co.acceptedTypes[cr];var qo;return He({},le,{pageById:He({},le.pageById,(qo={},qo[On]=Co,qo))})}if(ge===d.YH.type){var Tr=Oe.pageId,wn=He({},le,{pages:[].concat(le.pages),pageById:He({},le.pageById)});return delete wn.pageById[Tr],wn.pages=wn.pages.filter(function(_o){return _o!==Tr}),wn.pages.length===0&&(wn.pages.push(gn.id),wn.pageById[gn.id]=gn,wn.currentPageId=gn.id),(!wn.currentPageId||wn.currentPageId===Tr)&&(wn.currentPageId=wn.pages[0]),wn}if(ge===d.AB.type){var Pr=Oe.pageId,mr=He({},le,{pages:[].concat(le.pages),pageById:He({},le.pageById)}),pi=mr.pageById[Pr],hi=mr.pages.indexOf(pi.id),Zr=hi-1;if(hi>0&&Zr>0){var mi=mr.pages[hi];mr.pages[hi]=mr.pages[Zr],mr.pages[Zr]=mi}return mr}if(ge===d.Xl.type){var ko=Oe.pageId,tr=He({},le,{pages:[].concat(le.pages),pageById:He({},le.pageById)}),Ar=tr.pageById[ko],Jr=tr.pages.indexOf(Ar.id),tn=Jr+1;if(Jr>0&&tnb.length)&&(N=b.length);for(var w=0,F=new Array(N);w=b.length?{done:!0}:{done:!1,value:b[F++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m=function(b,N){return N.startsWith(o.PM)||b.acceptedTypes[N]},p=function(b){for(var N=!1,w=f(o.Ol),F;!(F=w()).done;){var $=F.value;if($.type===b&&$.important){N=!0;break}}return N},g=function(b){for(var N=!0,w=0,F=f(o.Ol),$;!($=F()).done;){var M=$.value;if(b.acceptedTypes[M.type]&&!(M.important||M.admin)){N=!1;break}b.acceptedTypes[M.type]&&!M.important&&w++}return w>0&&N},y=function(b,N){return b[N]},S=function(b){for(var N={},w=f(o.Ol),F;!(F=w()).done;){var $=F.value;N[$.type]=!!$.important}return s({isMain:!1,id:(0,r.i)(),name:"New Tab",acceptedTypes:N,unreadCount:0,hideUnreadCount:!1,createdAt:Date.now()},b)},I=function(){for(var b={},N=f(o.Ol),w;!(w=N()).done;){var F=w.value;b[F.type]=!0}return S({isMain:!0,name:"Main",acceptedTypes:b})},O=function(b){return s({createdAt:Date.now(),roundId:null},b)},T=function(b,N){return N===void 0&&(N=!1),{type:b.type,text:b.text,html:N?b.node.outerHTML:b.html,times:b.times,createdAt:b.createdAt,roundId:b.roundId}},A=function(b,N){return typeof b.text=="string"&&b.text===N.text||typeof b.html=="string"&&b.html===N.html}},92606:function(d,h,t){"use strict";t.d(h,{Bx:function(){return i},Lg:function(){return o},nU:function(){return s},rv:function(){return u}});var r=t(74429);/**
+ */function s(j,B){(B==null||B>j.length)&&(B=j.length);for(var M=0,U=new Array(B);M=j.length?{done:!0}:{done:!1,value:j[U++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var x=function(j,B){return B.startsWith(u.PM)||j.acceptedTypes[B]},g=function(j){for(var B=!1,M=p(u.Ol),U;!(U=M()).done;){var z=U.value;if(z.type===j&&z.important){B=!0;break}}return B},S=function(j){for(var B=!0,M=0,U=p(u.Ol),z;!(z=U()).done;){var D=z.value;if(j.acceptedTypes[D.type]&&!(D.important||D.admin)){B=!1;break}j.acceptedTypes[D.type]&&!D.important&&M++}return M>0&&B},E=function(j,B){return j[B]},T=function(j){for(var B={},M=p(u.Ol),U;!(U=M()).done;){var z=U.value;B[z.type]=!!z.important}return d({isMain:!1,id:(0,i.i)(),name:"New Tab",acceptedTypes:B,unreadCount:0,hideUnreadCount:!1,createdAt:Date.now()},j)},C=function(){for(var j={},B=p(u.Ol),M;!(M=B()).done;){var U=M.value;j[U.type]=!0}return T({isMain:!0,name:"Main",acceptedTypes:j})},w=function(j){return d({createdAt:Date.now(),roundId:null},j)},I=function(j,B){return B===void 0&&(B=!1),{type:j.type,text:j.text,html:B?j.node.outerHTML:j.html,times:j.times,createdAt:j.createdAt,roundId:j.roundId}},R=function(j,B){return typeof j.text=="string"&&j.text===B.text||typeof j.html=="string"&&j.html===B.html}},92606:function(m,y,n){"use strict";n.d(y,{Bx:function(){return s},Lg:function(){return u},nU:function(){return d},rv:function(){return f}});var i=n(74429);/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var o=(0,r.VP)("roundrestart"),i=(0,r.VP)("game/connectionLost"),s=(0,r.VP)("game/connectionRestored"),u=(0,r.VP)("game/dismissWarning")},98937:function(d,h,t){"use strict";t.d(h,{tp:function(){return g},Be:function(){return I},Im:function(){return i}});var r=t(7081),o=t(2727);/**
+ */var u=(0,i.VP)("roundrestart"),s=(0,i.VP)("game/connectionLost"),d=(0,i.VP)("game/connectionRestored"),f=(0,i.VP)("game/dismissWarning")},98937:function(m,y,n){"use strict";n.d(y,{tp:function(){return S},Be:function(){return C},Im:function(){return s}});var i=n(7081),u=n(2727);/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var i=function(){return(0,r.d4)(o.V)},s=t(71196),u=t(92606);/**
+ */var s=function(){return(0,i.d4)(u.V)},d=n(71196),f=n(92606);/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */var f=2e4;/**
+ */var p=2e4;/**
* @file
* @copyright 2020 Aleksej Komarov
* @license MIT
- */function m(){return m=Object.assign||function(O){for(var T=1;T=T+f;!b.connectionLostAt&&N&&O.dispatch(p((0,u.Bx)())),b.connectionLostAt&&!N&&O.dispatch(p((0,u.nU)()))}},1e3),function(A){return function(b){var N=b.type;return N===s.Gg.type||N===s.LT.type?(T=Date.now(),A(b)):N===u.Lg.type?A(p(b)):A(b)}}};/**
+ */function x(){return x=Object.assign||function(w){for(var I=1;I